A self-hosted-style start page for your Solid pod. A gethomepage-flavoured dashboard — grouped service tiles, bookmarks, and live info widgets — but the whole board is one document on your pod, editable in place and synced across your devices.
🔗 Live demo: https://solid-apps.github.io/dash/
Open the page. Sign in from the estate's shared login (Solid OIDC or Nostr) and
your board loads from ‹pod›/public/dash/board.jsonld. Edit it in the browser
— add a service, drop a bookmark, pick a weather city — and it writes straight
back to the pod. Open dash on another device and it's already there; edits
appear live while you watch, over solid-0.1 Updates-Via.
Signed out, dash shows a real, clickable demo board so you can see the shape of it before you commit.
| Piece | What it does |
|---|---|
| Service groups | Named groups of tiles (icon, name, subtitle) in one or two columns — your apps, servers, and tools. |
| Bookmarks | Compact pill links, grouped — the stuff you open a dozen times a day. |
| Info widgets | A clock, a greeting, a web-search bar (DuckDuckGo / Google / Brave / Bing / Kagi), and live weather (via open-meteo — no key). |
| Status dots | Opt-in per service: a lightweight reachability ping from your browser. |
| Icons | Each service tile shows a real logo — di:<slug> for Dashboard Icons (full-colour self-hosted service logos, the gethomepage pack), si:<slug> for Simple Icons, an image URL, an emoji or letter, or blank for the site's own favicon. Packs are opt-in CDN SVGs — the app stays dependency-free unless a board uses one. |
| Appearance | A theme (auto / dark / light), an accent colour, a background, and group columns (auto / 1–3 board-wide, 1–4 per group) — all stored in the board so they travel with it via the pod and ?board=/?uri=. Open with the 🎨 button in edit mode. Each example layout ships tinted to match its subject; the Minimal board shows a photo background. |
| Backgrounds | Seven built-in gradient presets — Aurora, Nebula, Dusk, Ocean, Ember, Mono, and Accent (derived from your accent colour) — rich, layered meshes in the gethomepage vein. Or bring your own image URL (with blur + a dim scrim). Preset and image backgrounds switch the board to a legible light-on-dark palette automatically; a solid colour follows the theme. |
Real Homepage runs a server that proxies to your services, so API keys stay server-side and CORS is bypassed. dash is a static app served from your pod — there is no proxy — so it is deliberate about what it shows:
- ✅ Real: bookmarks, links, weather, clock, and web search all work for real, no keys, nothing faked.
⚠️ Reachability, not status: a service's status dot is an opaqueno-corsfetch with a timeout — it tells you the host answered, not its HTTP code. The dot's tooltip says exactly that.- ❌ Not here: the API-key service widgets (Sonarr/Radarr/etc.). Those need a server to hold the key and dodge CORS. When dash is served same-origin behind a pod server (e.g. jspod), that door opens — until then, dash stays honest.
One JSON-LD file, human-readable, at ‹pod›/public/dash/board.jsonld:
Edit it in-app, or edit the file directly — dash re-reads it live either way.
The board is also a structured-data island: the page ships an inline
<script type="application/ld+json" id="board"> holding a dash:Board. That
island is what powers the signed-out demo, and it seeds your pod the first
time you sign in — so you can author a whole board by editing HTML, sign in,
and it becomes yours.
dash reads its board in order of authority:
- your pod board (signed in) — writable, live-synced;
?board=<data>— the whole board carried inline in the URL, so one link is a complete self-contained dashboard (no host, no pod). The Share button copies exactly this. Accepts base64url-encoded JSON or raw JSON;?uri=<url>— fetch and render any publisheddash:Boardresource (read-only), so dash doubles as a viewer for boards hosted anywhere.?src=<url>is accepted as an alias. Because a link inside a board can itself point at?uri=of another board, directories nest — see the Classic Web Portal example, a Yahoo!-style directory whose categories drill down into sub-boards (and sub-sub-boards), each its owndash:Board;- the inline data island;
- a built-in sample.
Because a dash:Board is just a typed JSON-LD resource, a board saved on your
pod can also be opened by the estate's shells (glass, hub) and dispatched to a
dash pane by rdf:type — the same SLIP-48 flow the rest of the suite uses.
One index.html + style.css + app.js, no build step. Auth is the shared
xlogin widget; the hardened helpers (escaping, safe loads, honest toasts, and
the Updates-Via subscription manager) come from
SolidKit, vendored as kit.js + kit.css.
Dark-first, light-mode aware, keyboard-friendly.
{ "@context": { "dash": "https://solid-apps.github.io/dash/ns#" }, "@type": "dash:Board", "title": "Dashboard", "search": "duckduckgo", "weather": { "lat": 52.52, "lon": 13.41, "label": "Berlin, DE" }, "groups": [ { "name": "Media", "columns": 2, "services": [ { "name": "Jellyfin", "href": "https://jelly.example", "subtitle": "Movies & TV", "icon": "🎬", "ping": true } ]} ], "bookmarks": [ { "name": "Dev", "links": [ { "name": "GitHub", "href": "https://github.com" } ] } ] }