▍ humdrum codex / soft
5.1 KB raw

Personal Dashboard — Brief

One-page intent doc. Feeds app-kit:plan. Working name: Personal Dashboard (slug personal-dashboard) — rename freely.


1. One-liner

A local, techy personal dashboard that pulls weather, news, on-this-day history, sports scores, calendar, todos, recent Mastodon/Bluesky replies, GitHub/Vercel stats, and recent Obsidian note edits into one screen — and can generate a printable daily "newspaper" PDF edition. Inspired by cruftbox/firstlight, but a live dashboard first.


2. Tier

Deviation from kit: local-only. No Clerk, no Stripe, no Vercel, no Neon. Keep the kit's look + structure (themes, fonts, layout, PWA, eink, API-first Zod contract), swap the infra (local SQLite + local launcher).


3. Surfaces

Launch (no terminal command): double-click app — a .command/.app that boots the server and opens the browser. Server runs while launched.


4. Theme defaults

Newspaper/edition view uses a dedicated print stylesheet (serif-ish display via Awke, columns, monochrome) regardless of active theme. Eink theme already monochrome.


5. Users


6. Data model sketch

Source            a configured data source
  id: uuid
  kind: enum(weather|news|onthisday|sports|calendar|mastodon|bluesky|github|vercel|obsidian|todos)
  label: string
  enabled: boolean
  config: json            # feed URLs, teams, handles, vault path, etc.
  refreshSeconds: int
  position: int           # dashboard ordering

Snapshot          cached fetch result per source
  id: uuid
  sourceId: uuid -> Source
  payload: json
  fetchedAt: datetime
  ok: boolean
  error: string|null

Todo              local todos (own this app)
  id: uuid
  title: string
  done: boolean
  due: datetime|null
  createdAt: datetime

Edition           generated daily PDF newspaper
  id: uuid
  date: date
  pdfPath: string         # file on disk
  generatedAt: datetime

Setting           app config / layout / location / units
  key: string (pk)
  value: json

7. Must-have features (v0)

Everything else (sports, calendar, Mastodon, Bluesky, GitHub, Vercel) ships as the same pluggable source pattern, wired as credentials get added — stubbed/"needs config" when keys absent.


8. Non-goals


9. Integrations

Pluggable "source" modules. Each: a fetcher + a Zod-typed payload + a dashboard card + an edition section. Config + secrets live in .env.local and/or a settings page.


10. Open questions


Brief filled. Next: app-kit:planPLAN.md.