@@ -166,6 +169,20 @@ function renderDemoFeedHTML(): string {
// ── Page route ──
routes.get("/", (c) => {
const space = c.req.param("space") || "demo";
+ const view = c.req.query("view");
+
+ if (view === "app") {
+ return c.html(renderExternalAppShell({
+ title: `${space} — Postiz | rSpace`,
+ moduleId: "rsocials",
+ spaceSlug: space,
+ modules: getModuleInfoList(),
+ appUrl: "https://social.jeffemmett.com",
+ appName: "Postiz",
+ theme: "dark",
+ }));
+ }
+
const isDemo = space === "demo";
const body = isDemo
@@ -310,6 +327,7 @@ export const socialsModule: RSpaceModule = {
routes,
standaloneDomain: "rsocials.online",
landingPage: renderLanding,
+ externalApp: { url: "https://social.jeffemmett.com", name: "Postiz" },
feeds: [
{
id: "social-feed",
diff --git a/modules/splat/components/folk-splat-viewer.ts b/modules/splat/components/folk-splat-viewer.ts
index 1fcd518..260a6b2 100644
--- a/modules/splat/components/folk-splat-viewer.ts
+++ b/modules/splat/components/folk-splat-viewer.ts
@@ -54,10 +54,22 @@ export class FolkSplatViewer extends HTMLElement {
if (this._mode === "viewer") {
this.renderViewer();
} else {
+ if (this._spaceSlug === "demo") this.loadDemoData();
this.renderGallery();
}
}
+ private loadDemoData() {
+ this._splats = [
+ { id: "s1", slug: "matterhorn-scan", title: "Matterhorn Summit", description: "Photogrammetry capture of the Matterhorn peak from drone footage, 42 source images.", file_format: "splat", file_size_bytes: 18_874_368, view_count: 284, contributor_name: "Alpine Explorer Team", processing_status: "ready", created_at: "2026-02-10" },
+ { id: "s2", slug: "community-garden", title: "Community Garden Plot", description: "3D scan of the shared garden space — beds, paths, tool shed.", file_format: "ply", file_size_bytes: 24_117_248, view_count: 156, contributor_name: "Garden Collective", processing_status: "ready", created_at: "2026-02-15" },
+ { id: "s3", slug: "print-shop-interior", title: "Print Shop Interior", description: "Interior scan of Druckwerkstatt Berlin — letterpress, risograph, binding station.", file_format: "spz", file_size_bytes: 31_457_280, view_count: 93, contributor_name: "Druckwerkstatt", processing_status: "ready", created_at: "2026-02-18" },
+ { id: "s4", slug: "chamonix-trailhead", title: "Chamonix Trailhead", description: "360° capture of the Lac Blanc trailhead parking area and signage.", file_format: "splat", file_size_bytes: 12_582_912, view_count: 67, processing_status: "ready", created_at: "2026-02-20" },
+ { id: "s5", slug: "zermatt-bridge", title: "Zermatt Suspension Bridge", description: "Charles Kuonen bridge scan from 18 photos. Processing complete.", file_format: "ply", file_size_bytes: 0, view_count: 0, source_file_count: 18, processing_status: "processing", created_at: "2026-02-25" },
+ { id: "s6", slug: "mycorrhiza-sculpture", title: "Mycorrhiza Sculpture", description: "Uploaded for 3D reconstruction from video. Queued.", file_format: "splat", file_size_bytes: 0, view_count: 0, source_file_count: 1, processing_status: "pending", created_at: "2026-02-27" },
+ ];
+ }
+
disconnectedCallback() {
if (this._viewer) {
try { this._viewer.dispose(); } catch {}
diff --git a/server/index.ts b/server/index.ts
index f7a2b90..c6e0f26 100644
--- a/server/index.ts
+++ b/server/index.ts
@@ -63,6 +63,8 @@ import { dataModule } from "../modules/data/mod";
import { splatModule } from "../modules/splat/mod";
import { photosModule } from "../modules/photos/mod";
import { socialsModule } from "../modules/rsocials/mod";
+import { docsModule } from "../modules/docs/mod";
+import { designModule } from "../modules/design/mod";
import { spaces } from "./spaces";
import { renderShell, renderModuleLanding } from "./shell";
import { renderMainLanding, renderSpaceDashboard } from "./landing";
@@ -94,6 +96,8 @@ registerModule(dataModule);
registerModule(splatModule);
registerModule(photosModule);
registerModule(socialsModule);
+registerModule(docsModule);
+registerModule(designModule);
// ── Config ──
const PORT = Number(process.env.PORT) || 3000;
diff --git a/server/shell.ts b/server/shell.ts
index 3ce98fa..2d1a32d 100644
--- a/server/shell.ts
+++ b/server/shell.ts
@@ -54,7 +54,7 @@ export function renderShell(opts: ShellOptions): string {
${escapeHtml(title)}
-
+
+
+
+
+
+
+
+
+
+
+
+
+