···11-This is XeTeX, Version 3.141592653-2.6-0.999995 (TeX Live 2023) (preloaded format=xelatex 2026.3.17) 26 MAR 2026 12:00
11+This is XeTeX, Version 3.141592653-2.6-0.999995 (TeX Live 2023) (preloaded format=xelatex 2026.3.29) 1 APR 2026 21:14
22entering extended mode
33 restricted \write18 enabled.
44 %&-line parsing enabled.
55-**plork-cards.tex
55+**card.tex
6677! Emergency stop.
88-<*> plork-cards.tex
99-88+<*> card.tex
99+1010*** (job aborted, file error in nonstop mode)
111112121313Here is how much of TeX's memory you used:
1414 2 strings out of 478682
1515- 21 string characters out of 5849006
1515+ 14 string characters out of 5849006
1616 1842018 words of memory out of 6000000
1717 20219 multiletter control sequences out of 15000+600000
1818 512287 words of font info for 32 fonts, out of 8000000 for 9000
+136
vscode-extension/PLANS.md
···11+# VSCode Extension: Dashboard & AT Firehose
22+33+## Vision
44+55+Replace the current "Source Changes" welcome panel with a **live dashboard** that acts as a firehose for all Aesthetic Computer platform activity — git changes, AT Protocol events, and Tangled knot repo activity — all in one view.
66+77+## Current State
88+99+The welcome panel (`extension.ts:966-1100`) is a simple git status viewer:
1010+- Runs `git status --porcelain` + `git rev-parse --abbrev-ref HEAD` for the main repo + vault
1111+- Displays file list with status badges (M/A/D/?)
1212+- Click-to-open files in editor
1313+- Debounced refresh on file changes (300ms)
1414+1515+**Known bug:** `git rev-parse --abbrev-ref HEAD` fails on repos with no commits (e.g. freshly cloned submodules), showing a raw error in the UI instead of a graceful fallback.
1616+1717+---
1818+1919+## Phase 1: Fix the Git Error + Improve Layout
2020+2121+**Goal:** Make the existing git status panel work correctly and look better.
2222+2323+- [ ] Handle `rev-parse` failure gracefully — show `(no commits)` or `(init)` instead of the raw error
2424+- [ ] Improve the visual layout: tighter spacing, better typography, cleaner status badges
2525+- [ ] Add a collapsible section header for "Source Changes" (so it can coexist with new sections)
2626+- [ ] Add timestamp showing last refresh time
2727+2828+## Phase 2: Dashboard Shell
2929+3030+**Goal:** Transform the panel from a single-purpose git viewer into a multi-section dashboard.
3131+3232+- [ ] Redesign the HTML structure with distinct dashboard sections:
3333+ 1. **Source Changes** — the existing git status (cleaned up from Phase 1)
3434+ 2. **AT Firehose** — live AT Protocol events (Phase 3)
3535+ 3. **Tangled** — knot/repo activity (Phase 4)
3636+- [ ] Add a sticky nav/header with section toggles (show/hide each section)
3737+- [ ] Support auto-scroll vs. paused mode (like a terminal — new events stream in, but scrolling up pauses the feed)
3838+- [ ] Add theme-aware styling for all new sections (dark/light support already exists)
3939+- [ ] Consider making this a sidebar webview instead of (or in addition to) an editor panel
4040+4141+## Phase 3: AT Protocol Firehose
4242+4343+**Goal:** Show live AT Protocol activity happening on the Aesthetic Computer PDS.
4444+4545+The AC platform already has deep atproto integration:
4646+- PDS at `at.aesthetic.computer`
4747+- Lexicons: `computer.aesthetic.tape`, `computer.aesthetic.mood`, `computer.aesthetic.painting`, etc.
4848+- Existing scripts in `at/scripts/atproto/`
4949+- News posted to atproto via `system/backend/news-atproto.mjs`
5050+- Tapes synced to atproto via `system/backend/tape-atproto.mjs`
5151+5252+### What to show in the firehose:
5353+- [ ] **New tapes** — when users record/publish tapes (video content)
5454+- [ ] **Moods** — mood updates from users (`computer.aesthetic.mood`)
5555+- [ ] **Paintings** — shared paintings (`computer.aesthetic.painting`)
5656+- [ ] **News posts** — new news articles published
5757+- [ ] **Handle registrations/updates** — new users or handle changes
5858+- [ ] **Standard site updates** — page edits, new pages
5959+6060+### Implementation options:
6161+- **Option A: WebSocket relay** — Add a firehose WebSocket endpoint to the session server or a new lightweight service that subscribes to the PDS `com.atproto.sync.subscribeRepos` firehose and relays events to the extension.
6262+- **Option B: Polling** — Periodically query `com.atproto.repo.listRecords` for each collection on the PDS. Simpler but less real-time.
6363+- **Option C: Direct firehose** — Connect the extension directly to `wss://at.aesthetic.computer/xrpc/com.atproto.sync.subscribeRepos` and decode the CBOR/CAR stream in the extension itself. Most direct but complex.
6464+6565+### Recommended: Option A (WebSocket relay)
6666+The extension already has a WebSocket connection to the session server (`extension.ts:2132`). We can add a `firehose:event` message type that the session server relays from the PDS subscription. This keeps the extension lightweight and reuses existing infrastructure.
6767+6868+### Event display format:
6969+Each event in the feed should show:
7070+- Timestamp
7171+- Event type icon/badge (tape, mood, painting, news, etc.)
7272+- Actor handle (clickable — opens their AC profile)
7373+- Brief content preview (tape thumbnail, mood text, painting preview, etc.)
7474+- Link to view the full content on aesthetic.computer
7575+7676+## Phase 4: Tangled Knot Activity
7777+7878+**Goal:** Show activity from the Tangled knot (AT Protocol-native git hosting).
7979+8080+The AC repo is mirrored on Tangled at `tangled.org/aesthetic.computer/core`. The knot server runs on the same PDS droplet (`knot.aesthetic.computer`).
8181+8282+### What to show:
8383+- [ ] **Commits** — recent commits pushed to the Tangled knot
8484+- [ ] **Issues/PRs** — if Tangled supports these (check API)
8585+- [ ] **Stars/forks** — social activity on the repo
8686+- [ ] **Cross-reference with GitHub** — show if a commit exists on both GitHub and Tangled
8787+8888+### Implementation:
8989+- [ ] Research Tangled API (likely atproto-based — check `tangled.org` for API docs)
9090+- [ ] The knot server is at `knot.aesthetic.computer` — check what XRPC endpoints it exposes
9191+- [ ] Display as a feed of events similar to the AT firehose section
9292+- [ ] Include both the main `aesthetic-computer` repo and any other knot-hosted repos
9393+9494+## Phase 5: Polish & Interaction
9595+9696+- [ ] Add filtering — filter firehose by event type, user, time range
9797+- [ ] Add notification badges on the sidebar icon when new events arrive
9898+- [ ] Keyboard shortcuts for navigating the dashboard
9999+- [ ] Click-through actions: clicking a tape opens it, clicking a commit shows the diff, etc.
100100+- [ ] Sound/visual ping option for specific event types (e.g., new user signups)
101101+- [ ] Consider a compact "ticker" mode that shows a single scrolling line of recent events in the status bar
102102+103103+---
104104+105105+## Architecture Notes
106106+107107+### Data flow
108108+```
109109+PDS (at.aesthetic.computer)
110110+ └─ com.atproto.sync.subscribeRepos (firehose)
111111+ └─ Session Server (relay)
112112+ └─ WebSocket → VSCode Extension
113113+ └─ Dashboard Webview
114114+115115+Knot Server (knot.aesthetic.computer)
116116+ └─ XRPC / atproto API
117117+ └─ Session Server or direct polling
118118+ └─ WebSocket → VSCode Extension
119119+ └─ Dashboard Webview
120120+121121+Local Git Repos
122122+ └─ git status --porcelain (child_process)
123123+ └─ Extension host
124124+ └─ postMessage → Dashboard Webview
125125+```
126126+127127+### Key files to modify
128128+- `vscode-extension/extension.ts` — welcome panel HTML + git status logic
129129+- `session-server/session.mjs` — add firehose relay endpoint
130130+- `vscode-extension/embedded.js` — may need message bridging updates
131131+- `vscode-extension/package.json` — new commands, settings
132132+133133+### Dependencies to consider
134134+- `@atproto/api` — already in `system/package.json`
135135+- CBOR decoding for firehose (if doing direct connection)
136136+- The extension currently bundles with esbuild — any new deps need to be bundleable