diff --git a/modules/rsheet/mod.ts b/modules/rsheet/mod.ts
new file mode 100644
index 0000000..4700757
--- /dev/null
+++ b/modules/rsheet/mod.ts
@@ -0,0 +1,190 @@
+/**
+ * rSheet module — collaborative spreadsheets powered by dSheet.
+ *
+ * Embeds @fileverse-dev/dsheet as an external app within the rSpace shell.
+ */
+
+import { Hono } from "hono";
+import { renderExternalAppShell } from "../../server/shell";
+import { getModuleInfoList } from "../../shared/module";
+import type { RSpaceModule } from "../../shared/module";
+
+const routes = new Hono();
+
+// ── Routes ──
+
+routes.get("/", (c) => {
+ const space = c.req.param("space") || "demo";
+ return c.html(
+ renderExternalAppShell({
+ title: `Spreadsheets — rSheet | rSpace`,
+ moduleId: "rsheet",
+ spaceSlug: space,
+ modules: getModuleInfoList(),
+ appUrl: `/${space}/rsheet/app`,
+ appName: "dSheet",
+ theme: "dark",
+ })
+ );
+});
+
+routes.get("/app", (c) => {
+ const space = c.req.param("space") || "demo";
+ const collabWs = process.env.COLLAB_WS_URL || "wss://collab-ws.rnotes.online";
+
+ return c.html(`
+
+
+
+
+rSheet — ${space}
+
+
+
+Loading spreadsheet...
+
+
+
+`);
+});
+
+// ── Module definition ──
+
+export const sheetModule: RSpaceModule = {
+ id: "rsheet",
+ name: "rSheet",
+ icon: "\u{1F4CA}",
+ description: "Collaborative spreadsheets",
+ scoping: { defaultScope: "space", userConfigurable: false },
+ routes,
+ externalApp: {
+ url: "/modules/rsheet/app",
+ name: "dSheet",
+ },
+ outputPaths: [
+ {
+ path: "",
+ name: "Spreadsheets",
+ icon: "\u{1F4CA}",
+ description: "Collaborative spreadsheet workspace",
+ },
+ ],
+ onboardingActions: [
+ {
+ label: "Open Spreadsheet",
+ icon: "\u{1F4CA}",
+ description: "Create or edit a collaborative spreadsheet",
+ type: "navigate" as any,
+ href: "/{space}/rsheet",
+ },
+ ],
+};
diff --git a/server/index.ts b/server/index.ts
index 719a80a..9ee6844 100644
--- a/server/index.ts
+++ b/server/index.ts
@@ -83,6 +83,7 @@ import { bnbModule } from "../modules/rbnb/mod";
import { vnbModule } from "../modules/rvnb/mod";
import { crowdsurfModule } from "../modules/crowdsurf/mod";
import { timeModule } from "../modules/rtime/mod";
+import { sheetModule } from "../modules/rsheet/mod";
import { spaces, createSpace, resolveCallerRole, roleAtLeast } from "./spaces";
import type { SpaceRoleString } from "./spaces";
import { renderShell, renderSubPageInfo, renderModuleLanding, renderOnboarding, setFragmentMode } from "./shell";
@@ -134,6 +135,7 @@ registerModule(forumModule);
registerModule(tubeModule);
registerModule(tripsModule);
registerModule(booksModule);
+registerModule(sheetModule);
// registerModule(docsModule); // placeholder — not yet an rApp
// ── Config ──