hzhang e8670ac590 feat: P5 — first widget on screen (clock via SDK)
The dashboard finally has live content. `runtime.ts` now imports
`defineWidget` from `@dashward/widget-sdk` (added as a workspace
dependency of the container), defines a tabular-numerals clock widget
inline, and mounts it onto the 12-column grid via a generic
`mountWidget` + `createContext` pair that produces the SDK's
config/system/lifecycle/shell APIs.

container/runtime/runtime.ts
  - mountWidget(def, parent, instanceId, size): creates a grid card,
    applies grid-column/row span, builds the widget context, calls
    def.mount; wraps in try/catch so a mount failure visibly degrades
    the card (red border + error label) instead of breaking the page.
  - createContext: localStorage-backed config (persists per
    instanceId), theme reads dataset.theme and subscribes to the
    dashward:ThemeChanged CustomEvent (DBus signal forwarded from
    shell), shell.call delegates to window.__dashShell__. onMount
    fires via microtask; onUnmount handlers stored; visibility is a
    no-op until P7 (edit mode / workspace tracking).
  - clockDef: defineWidget<ClockConfig>; shadow DOM root, large
    tabular-numerals time string, re-renders on tick + config.onChange.

container/runtime/styles.css
  - Real card style: half-transparent backdrop-filter blur with a
    light/dark variant, rounded 18px corners, subtle border and shadow.
  - .widget-error fallback for failed mount.
  - grid-auto-rows: minmax(120px, auto) so widgets have a sensible
    minimum row height.

container/package.json
  - `@dashward/widget-sdk` is now a runtime dependency. esbuild
    bundles it into runtime.js.

Verified on ubuntu2504-test VM: clock card renders top-left at 4-wide
× 2-tall, ticks every second, follows system theme live via the P4
bridge (light → glass-white card, dark → glass-black card).

Layout persistence, edit mode, dynamic disk loading of widget bundles,
and iframe crash isolation per design §11 / §14 land in P6+.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 01:00:49 +01:00
2026-05-22 23:00:02 +01:00
2026-05-22 23:00:02 +01:00
2026-05-22 23:00:02 +01:00
2026-05-22 23:00:02 +01:00
2026-05-22 23:00:02 +01:00
2026-05-22 23:00:02 +01:00
2026-05-22 23:00:02 +01:00
2026-05-22 23:00:02 +01:00
2026-05-22 23:00:02 +01:00
2026-05-22 23:00:02 +01:00
2026-05-22 23:00:02 +01:00

Dashward

A dedicated rightmost workspace for custom widgets on Ubuntu/GNOME, in the spirit of macOS Dashboard.

  • GNOME Shell extension (GJS) creates the dashboard workspace, defends it from regular window incursions, and supervises the container.
  • WebKitGTK container (separate process) renders an HTML page on that workspace.
  • Widget SDK (TypeScript) lets you write widgets as web components.

Status: P0 skeleton. Design lives in UBUNTU-DASHBOARD-SPACE.md (see also ~/arch/UBUNTU-DASHBOARD-SPACE.md locally).

Target

  • Ubuntu 25.04 / GNOME Shell 48 / Wayland.
  • Other distros & versions: post-v1.

Repo layout

sdk/                      TS widget SDK, published as @dashward/widget-sdk
extension/                GNOME Shell extension (GJS, TS-authored)
  src/                    Extension source
  widgets-builtin/        Builtin widgets shipped with the extension
container/                WebKit kiosk process
  src/                    GJS bootstrap
  runtime/                Page-side runtime (host grid, edit mode, widget loader)
widgets/                  Example / 3rd-party widget dev tree
proto/                    Shared DBus XML + TS types
scripts/                  Build & dev helpers

Dev setup

Requires Node ≥ 20 and pnpm ≥ 9. To install pnpm:

npm install -g pnpm

Then:

pnpm install
pnpm build

Testing discipline

All Shell-side iteration happens inside the ubuntu2504-test libvirt VM, never on the host GNOME session — a buggy extension can lock you out of the Wayland session. See the design doc §17 for the dev loop.

License

TBD.

Description
Ubuntu/GNOME dashboard workspace + TS widget SDK (macOS-Dashboard style).
Readme 117 KiB
Languages
TypeScript 90%
CSS 3.3%
JavaScript 2.9%
HTML 2.4%
Shell 1.4%