Personal Dashboard — Brief
One-page intent doc. Feeds
app-kit:plan. Working name: Personal Dashboard (slugpersonal-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
- Personal — standalone, single user (just me), no Stripe, no auth (local-only).
- Humdrum One
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
- Web PWA — installable on desktop; runs at
localhost. Primary surface. - E-ink (Boox Palma Pro 2) — dashboard + edition legible in eink theme.
- Terminal CLI — defer to v1.
- API consumer — every card reads
/api/*; future widgets/shortcuts can too. - Scriptable widget — defer to v1.
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
- System preference (light → Flexoki, dark → Flexoki Dark)
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
- Who: me only. No sign-up, no login.
- Scale: 1.
- Auth surface: none. Bound to localhost.
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)
- Dashboard grid of cards, ordered/toggled via settings.
- Four keyless sources working end-to-end: weather (Open-Meteo), on-this-day (Wikipedia), news (RSS feeds), Obsidian recent edits (scan vault mtimes).
- Local todos — add, toggle done, list on the dashboard.
- Daily PDF edition — newspaper layout from the same source data, saved to a folder, dated, printable.
- Double-click launcher — boots server + opens browser, no terminal.
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
- No multi-user, no public sign-up, no remote deploy.
- No Stripe / billing.
- No native app — PWA only.
- No writing to the Obsidian vault except
Humdrum/Claude/(hook-enforced); Obsidian is a read-only source here. - No CLI/Scriptable surfaces in v0.
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.
- Weather — Open-Meteo (no key) + geocode. Config: location, units.
- News — RSS/Atom feeds (configurable list). No key.
- On this day — Wikipedia REST "on this day" API. No key.
- Sports — ESPN public JSON endpoints. Config: leagues/teams. No key.
- Calendar — read-only. ICS URL(s); Google Calendar later. Config: ICS urls.
- Todos — local (this app). Obsidian/Things import later.
- Mastodon — instance URL + access token → recent mentions/replies.
- Bluesky — handle + app password → recent replies/notifications.
- GitHub — PAT → commits, PRs, stars, recent activity.
- Vercel — token → recent deployments + usage.
- Obsidian — scan vault at
/Users/kortum/Humdrumfor recently edited notes (read-only; respects theHumdrum/Claude/write-scope rule). - Anthropic/OpenAI (optional) — daily summary / "editor's note" for the edition.
10. Open questions
- App display name + icon (placeholder: "Personal Dashboard").
- Port for the local server (default 3000? pick a stable one for the launcher + PWA).
- Edition cadence — manual button only in v0, or also a scheduled generate (launchd)?
- Where PDF editions get saved (default:
~/Documents/.../Personal-Dashboard/editions/?).
Brief filled. Next: app-kit:plan → PLAN.md.