diff --git a/modules/rtime/mod.ts b/modules/rtime/mod.ts
index a722f6dd..8530eadc 100644
--- a/modules/rtime/mod.ts
+++ b/modules/rtime/mod.ts
@@ -1175,6 +1175,36 @@ routes.post("/api/tasks/:id/export-to-backlog", async (c) => {
});
});
+routes.get("/canvas", (c) => {
+ const space = c.req.param("space") || "demo";
+
+ return c.html(renderShell({
+ title: `${space} โ Canvas | rTime | rSpace`,
+ moduleId: "rtime",
+ spaceSlug: space,
+ modules: getModuleInfoList(),
+ theme: "dark",
+ body: ``,
+ scripts: ``,
+ styles: ``,
+ }));
+});
+
+routes.get("/collaborate", (c) => {
+ const space = c.req.param("space") || "demo";
+
+ return c.html(renderShell({
+ title: `${space} โ Collaborate | rTime | rSpace`,
+ moduleId: "rtime",
+ spaceSlug: space,
+ modules: getModuleInfoList(),
+ theme: "dark",
+ body: ``,
+ scripts: ``,
+ styles: ``,
+ }));
+});
+
routes.get("/dashboard", (c) => {
const space = c.req.param("space") || "demo";
@@ -1226,11 +1256,8 @@ export const timeModule: RSpaceModule = {
filterable: true,
},
],
- outputPaths: [
- { path: "canvas", name: "Canvas", icon: "๐งบ", description: "Unified commitment pool & task weaving canvas" },
- { path: "collaborate", name: "Collaborate", icon: "๐ค", description: "Intent-routed collaboration matching" },
- { path: "dashboard", name: "Fulfillment", icon: "๐", description: "Personal commitment fulfillment tracking" },
- ],
+ // Views (Canvas, Collaborate, Fulfillment) are handled by the component's
+ // internal tab-bar โ no outputPaths needed to avoid duplicate navigation.
onboardingActions: [
{ label: "Pledge Hours", icon: "โณ", description: "Add a commitment to the pool", type: 'create', href: '/rtime' },
],