TemplatesHow to reuse
siso-shell · for every agent

Reuse the bank

Three ways in, from cheapest to most complete. Nothing to install beyond node for the third.

no frameworkpublic repo
01

Three ways

Link the shell by URLAdd head("https://siso-shell.pages.dev/shell") output to your page and paste a <nav class="siso-sidebar"> from any published page with your own destinations.
Copy a template foldertemplates/<id>/ has the template, its schema, a real example and a README with the reasoning and contract.
Run bin/composeJSON in, page out, inside the shell, with "On this page" built from your sections.
02

Compose a page from JSON

templates/<id>/README.md
  1. git clone https://github.com/sisodias/siso-shell && cd siso-shell
  2. cat templates/U4/schema.json # what the JSON carries
  3. cp templates/U4/example.json my.json # start from real data, replace it with yours
  4. bin/compose U4 my.json --nav my-nav.json --base https://siso-shell.pages.dev --out out/index.html
  5. node --test # engine + shell tests
Agent entry
Read first
templates/<id>/README.md
Done when
Open out/index.html: your data in the CRM shell; every section is in the rail's "On this page" group.
03

Only the shell

import { rail, head } from './shell.mjs';
const nav = { title: 'My site', mark: 'M', home: '/', groups: [
  { id: 'now', label: 'Now', destinations: [ { label: 'Dashboard', href: '/', icon: 'layout-dashboard' } ] },
] };
const page = [ { label: 'Why', href: '#why' }, { label: 'Repos', href: '#repos' } ];
document.write(`<!doctype html><html class="no-js"><head>${head('https://siso-shell.pages.dev/shell')}</head>
<body class="rail-expanded">${rail({ ...nav, current: '/', page })}<div class="siso-shell-page">…</div></body></html>`);

Icons are lucide names (shell/icons.mjs, 75 shipped). nav.json is the site map: groups → destinations → optional private / status chip. The rail marks current active and lists page under "On this page".

04

What is where

siso-shell/
  shell/        tokens.css (CRM, verbatim) · rail.css (GroupedRail.css verbatim + static additions) · rail.js · icons.mjs (lucide, ISC)
  shell.mjs     rail({title, groups, current, page}) → <nav> · head(base) → <link>/<script>
  parts/        the twelve modules + atoms, one HTML partial each · parts.css · catalogue.js
  templates/    one folder per family U0…U23: template.html · schema.json · example.json · README.md  (+ _layout.html)
  bin/compose   compose <family> <data.json> [--nav nav.json] [--base URL] [--out page.html]
  bin/build-site  renders site/ (the published bank: gallery, /t/<id>/, /t/<id>/example/, /how/, 404)
  site/         what siso-shell.pages.dev serves
05

Rules

  1. 1
    Real data or an empty stateexample.json is real (projects.json, catalog.json, receipts). A part with nothing to show says so; never filler.
  2. 2
    The shell is copied, not adaptedEvery rail value is the CRM's through the CRM's token names. Change tokens.css only by re-copying it from the CRM.
  3. 3
    Groups are headingsClicking a group heading does nothing. Only "On this page" folds.
  4. 4
    Public payload onlyRepos and visibility yes; roster, routing, auth, money no. Private records render as U11 stubs.
  5. 5
    Licences travelLucide is ISC (notice in icons.mjs). Action Model and 21st.dev presentation is robbed with its receipt named.