%# Dashboard (todo §10): the gated post-login app home. The built-in default is a short instructional starter — what /dashboard is and how to replace it from a plugin. Composes the app shell (the one global menu via model.nav) around the prose. A plugin owns the real dashboard via a `dashboard` handler; this renders until then. Data: model { nav, shell }. %><% const nav = include("partials/nav-tree", { nodes: model.nav }); const body = `
This is the built-in /dashboard — the gated home shown to a signed-in user.
It's a placeholder so a fresh clone has something here; it holds no real data.
Replace it from a plugin: export a dashboard handler from your plugin's
manifest and it owns this page, rendered against your own views with the native app shell
(the same menu you see now) via ctx.chrome.
export default definePlugin({
apiVersion: "1.0.0",
// view names plugins/<id>/views/<view>.ejs, rendered in this same shell
dashboard: (ctx) => ({ view: "dashboard", data: { /* … */ } }),
});
See the plugin contract in docs/plugin-contract.md (the landing-pages section)
and the bundled plugins/scheduling/ reference.