# 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 - [x] **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 - [x] **Web PWA** — installable on desktop; runs at `localhost`. Primary surface. - [x] **E-ink (Boox Palma Pro 2)** — dashboard + edition legible in eink theme. - [ ] Terminal CLI — defer to v1. - [x] **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 - [x] 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/Humdrum` for recently edited notes (read-only; respects the `Humdrum/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`._