Merge branch 'dev'

This commit is contained in:
Jeff Emmett 2026-02-27 15:46:07 -08:00
commit ad5cfe4385
24 changed files with 145 additions and 3 deletions

View File

@ -14,6 +14,7 @@ export function renderLanding(): string {
<p class="rl-subtext"> <p class="rl-subtext">
Upload, share, and read PDFs together. A beautiful flipbook reader, Upload, share, and read PDFs together. A beautiful flipbook reader,
searchable catalog, and community contributions &mdash; all self-hosted. searchable catalog, and community contributions &mdash; all self-hosted.
(You)rBooks, your library.
</p> </p>
<div class="rl-cta-row"> <div class="rl-cta-row">
<a href="${demo}" class="rl-cta-primary" id="ml-primary">Start Your Library</a> <a href="${demo}" class="rl-cta-primary" id="ml-primary">Start Your Library</a>

View File

@ -10,6 +10,7 @@ export function renderLanding(): string {
<p class="rl-subtext"> <p class="rl-subtext">
A spatiotemporal calendar that couples where and when, supports natural cycles, A spatiotemporal calendar that couples where and when, supports natural cycles,
and zooms from 30-second moments to geological epochs. and zooms from 30-second moments to geological epochs.
(You)rCal, your rhythm.
</p> </p>
<div class="rl-cta-row"> <div class="rl-cta-row">
<a href="https://demo.rspace.online/rcal" class="rl-cta-primary" id="ml-primary">Try the Demo</a> <a href="https://demo.rspace.online/rcal" class="rl-cta-primary" id="ml-primary">Try the Demo</a>

View File

@ -10,6 +10,7 @@ export function renderLanding(): string {
<p class="rl-subtext"> <p class="rl-subtext">
A shared shopping cart for communities. Pool orders, unlock bulk pricing, A shared shopping cart for communities. Pool orders, unlock bulk pricing,
and fulfill locally through the cosmolocal provider network. and fulfill locally through the cosmolocal provider network.
(You)rCart, your market.
</p> </p>
<div class="rl-cta-row"> <div class="rl-cta-row">
<a href="https://demo.rspace.online/rcart" class="rl-cta-primary" id="ml-primary">Browse the Shop</a> <a href="https://demo.rspace.online/rcart" class="rl-cta-primary" id="ml-primary">Browse the Shop</a>

View File

@ -15,6 +15,7 @@ export function renderLanding(): string {
Quadratic voting, ranked choice, and multi-criteria scoring &mdash; all as Quadratic voting, ranked choice, and multi-criteria scoring &mdash; all as
interactive shapes on your canvas. Drop a choice, let members vote, interactive shapes on your canvas. Drop a choice, let members vote,
watch results emerge in real time. watch results emerge in real time.
(You)rChoices, your voice.
</p> </p>
<div class="rl-cta-row"> <div class="rl-cta-row">
<a href="${demo}" class="rl-cta-primary" id="ml-primary">Make Better Decisions</a> <a href="${demo}" class="rl-cta-primary" id="ml-primary">Make Better Decisions</a>

View File

@ -15,6 +15,7 @@ export function renderLanding(): string {
See how your community engages without tracking individuals. See how your community engages without tracking individuals.
No cookies, no consent banners, no third-party data &mdash; just No cookies, no consent banners, no third-party data &mdash; just
clean, real-time metrics from your own server. clean, real-time metrics from your own server.
(You)rData, your signal.
</p> </p>
<div class="rl-cta-row"> <div class="rl-cta-row">
<a href="${demo}" class="rl-cta-primary" id="ml-primary">View Analytics</a> <a href="${demo}" class="rl-cta-primary" id="ml-primary">View Analytics</a>

View File

@ -11,6 +11,7 @@ export function renderLanding(): string {
<p class="rl-subtext"> <p class="rl-subtext">
Upload, organize, and share with public links and memory cards. Upload, organize, and share with public links and memory cards.
Built for communities who want control over their shared files. Built for communities who want control over their shared files.
(You)rFiles, your way.
</p> </p>
<div class="rl-cta-row"> <div class="rl-cta-row">
<a href="https://demo.rspace.online/rfiles" class="rl-cta-primary" id="ml-primary">Start Sharing</a> <a href="https://demo.rspace.online/rfiles" class="rl-cta-primary" id="ml-primary">Start Sharing</a>

View File

@ -12,6 +12,7 @@ export function renderLanding(): string {
<p class="rl-subtext"> <p class="rl-subtext">
Automated cloud provisioning for self-hosted Discourse. Automated cloud provisioning for self-hosted Discourse.
No DevOps required. Choose your region, configure your settings, and go live. No DevOps required. Choose your region, configure your settings, and go live.
(You)rForum, your community.
</p> </p>
<div class="rl-cta-row"> <div class="rl-cta-row">
<a href="https://demo.rspace.online/rforum" class="rl-cta-primary" id="ml-primary" <a href="https://demo.rspace.online/rforum" class="rl-cta-primary" id="ml-primary"

View File

@ -11,6 +11,7 @@ export function renderLanding(): string {
<p class="rl-subtext"> <p class="rl-subtext">
Budget flows, river visualization, and conviction funding. Budget flows, river visualization, and conviction funding.
Watch resources move through your community in real time. Watch resources move through your community in real time.
(You)rFunds, your flow.
</p> </p>
<div class="rl-cta-row"> <div class="rl-cta-row">
<a href="https://demo.rspace.online/rfunds" class="rl-cta-primary" id="ml-primary">See Your Funds Flow</a> <a href="https://demo.rspace.online/rfunds" class="rl-cta-primary" id="ml-primary">See Your Funds Flow</a>

View File

@ -12,6 +12,7 @@ export function renderLanding(): string {
<p class="rl-subtext"> <p class="rl-subtext">
A shared email client where teams read, discuss, and approve messages A shared email client where teams read, discuss, and approve messages
together &mdash; with cryptographic multi-signature workflows before anything gets sent. together &mdash; with cryptographic multi-signature workflows before anything gets sent.
(You)rInbox, your team's voice.
</p> </p>
<div class="rl-cta-row"> <div class="rl-cta-row">
<a href="https://demo.rspace.online/rinbox" class="rl-cta-primary" id="ml-primary" <a href="https://demo.rspace.online/rinbox" class="rl-cta-primary" id="ml-primary"

View File

@ -12,6 +12,7 @@ export function renderLanding(): string {
<p class="rl-subtext"> <p class="rl-subtext">
Share live locations, navigate indoor and outdoor spaces, coordinate meetups Share live locations, navigate indoor and outdoor spaces, coordinate meetups
&mdash; all from the browser. No app install. No tracking. No data collection. &mdash; all from the browser. No app install. No tracking. No data collection.
(You)rMaps, your world to explore.
</p> </p>
<div class="rl-cta-row"> <div class="rl-cta-row">
<a href="https://demo.rspace.online/rmaps" class="rl-cta-primary" id="ml-primary" <a href="https://demo.rspace.online/rmaps" class="rl-cta-primary" id="ml-primary"

117
modules/network/landing.ts Normal file
View File

@ -0,0 +1,117 @@
/**
* rNetwork rich landing page body.
* Returned by landingPage() in the module export;
* the shell wraps it with header, CSS, and analytics.
*/
export function renderLanding(): string {
const demo = "https://demo.rspace.online/rnetwork";
return `
<!-- Hero -->
<section class="rl-hero">
<span class="rl-tagline">rNetwork</span>
<h1 class="rl-heading">See the web of trust</h1>
<p class="rl-subtext">
Map the relationships that matter. (You)rNetwork makes the invisible
connections visible &mdash; people, companies, and opportunities rendered
as a living, interactive graph.
</p>
<div class="rl-cta-row">
<a href="${demo}" class="rl-cta-primary" id="ml-primary">Explore Your Network</a>
<a href="/create-space" class="rl-cta-secondary">Create a Space</a>
</div>
</section>
<!-- How It Works -->
<section class="rl-section">
<div class="rl-container">
<h2 class="rl-heading" style="text-align:center">How It Works</h2>
<div class="rl-grid-3">
<div class="rl-step">
<div class="rl-step__num">1</div>
<h3>Connect CRM Data</h3>
<p>Link your Twenty CRM instance via GraphQL. People, companies, and opportunities sync automatically.</p>
</div>
<div class="rl-step">
<div class="rl-step__num">2</div>
<h3>Visualize the Graph</h3>
<p>Entities become nodes and relationships become edges in a force-directed layout you can explore in real time.</p>
</div>
<div class="rl-step">
<div class="rl-step__num">3</div>
<h3>Explore Relationships</h3>
<p>Click, drag, and zoom to discover hidden connections. Filter by entity type, search by name, and trace paths of trust.</p>
</div>
</div>
</div>
</section>
<!-- Features -->
<section class="rl-section rl-section--alt">
<div class="rl-container">
<h2 class="rl-heading" style="text-align:center">Features</h2>
<div class="rl-grid-4">
<div class="rl-card rl-card--center">
<div class="rl-icon-box">&#128752;</div>
<h3>Force-Directed Layout</h3>
<p>Interactive graph with physics simulation. Nodes attract and repel naturally, revealing organic clusters.</p>
</div>
<div class="rl-card rl-card--center">
<div class="rl-icon-box">&#128260;</div>
<h3>CRM Sync</h3>
<p>Twenty CRM integration via GraphQL. People, companies, and opportunities stay up to date automatically.</p>
</div>
<div class="rl-card rl-card--center">
<div class="rl-icon-box">&#129528;</div>
<h3>Entity Types</h3>
<p>People, companies, and opportunities rendered as distinct nodes. Visual encoding makes each type instantly recognizable.</p>
</div>
<div class="rl-card rl-card--center">
<div class="rl-icon-box">&#128279;</div>
<h3>Trust Feeds</h3>
<p>Relationship data flows to other rSpace modules. The trust graph powers governance, funding, and collaboration views.</p>
</div>
</div>
</div>
</section>
<!-- Use Cases -->
<section class="rl-section">
<div class="rl-container">
<h2 class="rl-heading" style="text-align:center">Use Cases</h2>
<div class="rl-grid-3">
<div class="rl-card rl-card--center">
<div class="rl-icon-box">&#127760;</div>
<h3>Community Mapping</h3>
<p>See who knows whom across your ecosystem. Identify bridges, hubs, and isolated clusters at a glance.</p>
</div>
<div class="rl-card rl-card--center">
<div class="rl-icon-box">&#128200;</div>
<h3>Stakeholder Analysis</h3>
<p>Trace influence paths between people and organizations. Understand power dynamics before critical decisions.</p>
</div>
<div class="rl-card rl-card--center">
<div class="rl-icon-box">&#127919;</div>
<h3>Opportunity Tracking</h3>
<p>Visualize pipeline deals alongside the people and companies involved. Spot warm introductions and shared connections.</p>
</div>
</div>
</div>
</section>
<!-- CTA -->
<section class="rl-section rl-section--alt">
<div class="rl-container" style="text-align:center">
<h2 class="rl-heading">Your Community, Connected</h2>
<p class="rl-subtext">
Stop guessing who knows whom. Start seeing the relationships that shape your community.
</p>
<div class="rl-cta-row">
<a href="${demo}" class="rl-cta-primary">Explore Your Network</a>
<a href="/create-space" class="rl-cta-secondary">Create a Space</a>
</div>
</div>
</section>
<div class="rl-back"><a href="/">&larr; Back to rSpace</a></div>`;
}

View File

@ -10,6 +10,7 @@ import { Hono } from "hono";
import { renderShell } from "../../server/shell"; import { renderShell } from "../../server/shell";
import { getModuleInfoList } from "../../shared/module"; import { getModuleInfoList } from "../../shared/module";
import type { RSpaceModule } from "../../shared/module"; import type { RSpaceModule } from "../../shared/module";
import { renderLanding } from "./landing";
const routes = new Hono(); const routes = new Hono();
@ -234,6 +235,7 @@ export const networkModule: RSpaceModule = {
icon: "\u{1F310}", icon: "\u{1F310}",
description: "Community relationship graph visualization with CRM sync", description: "Community relationship graph visualization with CRM sync",
routes, routes,
landingPage: renderLanding,
standaloneDomain: "rnetwork.online", standaloneDomain: "rnetwork.online",
feeds: [ feeds: [
{ {

View File

@ -12,6 +12,7 @@ export function renderLanding(): string {
<p class="rl-subtext"> <p class="rl-subtext">
Notes, clips, voice recordings, and live transcription &mdash; all in one place. Notes, clips, voice recordings, and live transcription &mdash; all in one place.
Speak and watch your words appear in real time, or drop in audio and video files to transcribe offline. Speak and watch your words appear in real time, or drop in audio and video files to transcribe offline.
(You)rNotes, your thoughts unbound.
</p> </p>
<div class="rl-cta-row"> <div class="rl-cta-row">
<a href="https://demo.rspace.online/rnotes" class="rl-cta-primary" id="ml-primary" <a href="https://demo.rspace.online/rnotes" class="rl-cta-primary" id="ml-primary"

View File

@ -11,6 +11,7 @@ export function renderLanding(): string {
<p class="rl-subtext"> <p class="rl-subtext">
Share memories with your community, powered by Immich. Share memories with your community, powered by Immich.
Self-hosted, AI-organized, and privacy-first. Self-hosted, AI-organized, and privacy-first.
(You)rPhotos, your moments.
</p> </p>
<div class="rl-cta-row"> <div class="rl-cta-row">
<a href="https://demo.rspace.online/rphotos" class="rl-cta-primary" id="ml-primary">Browse Gallery</a> <a href="https://demo.rspace.online/rphotos" class="rl-cta-primary" id="ml-primary">Browse Gallery</a>

View File

@ -10,6 +10,7 @@ export function renderLanding(): string {
<p class="rl-subtext"> <p class="rl-subtext">
Drop in a markdown document, pick a pocket format, and get a print-ready PDF in seconds. Drop in a markdown document, pick a pocket format, and get a print-ready PDF in seconds.
Group up with other authors to unlock bulk pricing through collaborative print runs. Group up with other authors to unlock bulk pricing through collaborative print runs.
(You)rPubs, your press.
</p> </p>
<div class="rl-cta-row"> <div class="rl-cta-row">
<a href="https://demo.rspace.online/rpubs" class="rl-cta-primary" id="ml-primary">Try the Press</a> <a href="https://demo.rspace.online/rpubs" class="rl-cta-primary" id="ml-primary">Try the Press</a>

View File

@ -15,6 +15,7 @@ export function renderLanding(): string {
Schedule, publish, and analyze across every major platform &mdash; all Schedule, publish, and analyze across every major platform &mdash; all
from your self-hosted rSpace instance. No per-seat pricing, no from your self-hosted rSpace instance. No per-seat pricing, no
third-party data mining. third-party data mining.
(You)rSocials, your narrative.
</p> </p>
<div class="rl-cta-row"> <div class="rl-cta-row">
<a href="${demo}" class="rl-cta-primary" id="ml-primary">Try Demo</a> <a href="${demo}" class="rl-cta-primary" id="ml-primary">Try Demo</a>

View File

@ -11,6 +11,7 @@ export function renderLanding(): string {
<p class="rl-subtext"> <p class="rl-subtext">
View, share, and gate 3D scenes captured with Gaussian splatting. View, share, and gate 3D scenes captured with Gaussian splatting.
Three.js-powered viewing with optional x402 micropayment gating. Three.js-powered viewing with optional x402 micropayment gating.
(You)rSplat, your dimension.
</p> </p>
<div class="rl-cta-row"> <div class="rl-cta-row">
<a href="https://demo.rspace.online/rsplat" class="rl-cta-primary" id="ml-primary">Explore Splats</a> <a href="https://demo.rspace.online/rsplat" class="rl-cta-primary" id="ml-primary">Explore Splats</a>

View File

@ -11,6 +11,7 @@ export function renderLanding(): string {
<p class="rl-subtext"> <p class="rl-subtext">
Stickers, posters, and tees from your browser. Stickers, posters, and tees from your browser.
Upload a design, pick a product, and get print-ready files instantly. Upload a design, pick a product, and get print-ready files instantly.
(You)rSwag, your brand.
</p> </p>
<div class="rl-cta-row"> <div class="rl-cta-row">
<a href="https://demo.rspace.online/rswag" class="rl-cta-primary" id="ml-primary">Start Designing</a> <a href="https://demo.rspace.online/rswag" class="rl-cta-primary" id="ml-primary">Start Designing</a>

View File

@ -11,6 +11,7 @@ export function renderLanding(): string {
Describe your dream trip in plain language. We'll structure it into Describe your dream trip in plain language. We'll structure it into
itineraries, budgets, and bookings &mdash; then give you a collaborative itineraries, budgets, and bookings &mdash; then give you a collaborative
canvas to plan together in real-time. canvas to plan together in real-time.
(You)rTrips, your horizon.
</p> </p>
<div class="rl-cta-row"> <div class="rl-cta-row">
<a href="https://demo.rspace.online/rtrips" class="rl-cta-primary" id="ml-primary">Try Demo</a> <a href="https://demo.rspace.online/rtrips" class="rl-cta-primary" id="ml-primary">Try Demo</a>

View File

@ -11,6 +11,7 @@ export function renderLanding(): string {
<p class="rl-subtext"> <p class="rl-subtext">
Host, stream, and share video without big tech. Host, stream, and share video without big tech.
Your community's video library with HLS streaming and RTMP ingest. Your community's video library with HLS streaming and RTMP ingest.
(You)rTube, your channel.
</p> </p>
<div class="rl-cta-row"> <div class="rl-cta-row">
<a href="https://demo.rspace.online/rtube" class="rl-cta-primary" id="ml-primary">Start Streaming</a> <a href="https://demo.rspace.online/rtube" class="rl-cta-primary" id="ml-primary">Start Streaming</a>

View File

@ -10,6 +10,7 @@ export function renderLanding(): string {
<p class="rl-subtext"> <p class="rl-subtext">
Quadratic conviction voting with time-decay. Surface the ideas your community actually cares about &mdash; Quadratic conviction voting with time-decay. Surface the ideas your community actually cares about &mdash;
not just the loudest voices. not just the loudest voices.
(You)rVote, your voice.
</p> </p>
<div class="rl-cta-row"> <div class="rl-cta-row">
<a href="https://demo.rspace.online/rvote" class="rl-cta-primary" id="ml-primary">Try the Demo</a> <a href="https://demo.rspace.online/rvote" class="rl-cta-primary" id="ml-primary">Try the Demo</a>

View File

@ -15,6 +15,7 @@ export function renderLanding(): string {
Visualize your Safe multisig across every chain &mdash; balances, Visualize your Safe multisig across every chain &mdash; balances,
transactions, and governance &mdash; all in one client-side dashboard. transactions, and governance &mdash; all in one client-side dashboard.
No backend database, no custody risk. No backend database, no custody risk.
(You)rWallet, your treasury laid bare.
</p> </p>
<div class="rl-cta-row"> <div class="rl-cta-row">
<a href="${demo}" class="rl-cta-primary" id="ml-primary">View Your Treasury</a> <a href="${demo}" class="rl-cta-primary" id="ml-primary">View Your Treasury</a>

View File

@ -10,6 +10,7 @@ export function renderLanding(): string {
<p class="rl-subtext"> <p class="rl-subtext">
Kanban boards, team spaces, and real-time collaboration &mdash; built for groups Kanban boards, team spaces, and real-time collaboration &mdash; built for groups
that share work, not just assign it. that share work, not just assign it.
(You)rWork, your flow.
</p> </p>
<div class="rl-cta-row"> <div class="rl-cta-row">
<a href="https://demo.rspace.online/rwork" class="rl-cta-primary" id="ml-primary">Try the Demo</a> <a href="https://demo.rspace.online/rwork" class="rl-cta-primary" id="ml-primary">Try the Demo</a>

View File

@ -468,10 +468,12 @@ export function renderModuleLanding(opts: ModuleLandingOptions): string {
<header class="rstack-header" data-theme="${theme}"> <header class="rstack-header" data-theme="${theme}">
<div class="rstack-header__left"> <div class="rstack-header__left">
<rstack-app-switcher current="${escapeAttr(mod.id)}"></rstack-app-switcher> <rstack-app-switcher current="${escapeAttr(mod.id)}"></rstack-app-switcher>
</div>
<div class="rstack-header__center"></div>
<div class="rstack-header__right">
<a class="rstack-header__demo-btn" href="${demoUrl}">Try Demo</a> <a class="rstack-header__demo-btn" href="${demoUrl}">Try Demo</a>
</div>
<div class="rstack-header__center">
<rstack-mi></rstack-mi>
</div>
<div class="rstack-header__right">
<rstack-identity></rstack-identity> <rstack-identity></rstack-identity>
</div> </div>
</header> </header>