Library

Collections strategy — LOCKED 2026-05-04

7-stack hierarchy (after multi-session debate exploring PARA, Johnny.Decimal, BASB/CODE, LYT/MOC, Streams+Lenses). Final shape: hierarchy as spine + Mnemosyne tags as supplementary + PARA-lite Active/Reference/Archive state filter (UI toggle, not a stack).

Top-level stacks (sidebar order):

  1. Frameworks — your active methodology (what YOU/team do)
  2. Builds — in-flight apps + platform
  3. Houses (internal: Accounts) — entities you work with/for
  4. Lab — speculative + learning
  5. Streams — raw inflow
  6. Operations — running the business
  7. Reference — stable context, lookup

Sub-structure per stack:

FRAMEWORKS
├── Methodology  (season-framework, content-tree-concept, conceptual frameworks)
├── SOPs         (step-by-step procedures — onboarding, deep-dive call guide)
├── Playbooks    (channel-specific applied — IG playbooks)
└── Templates    (blank starting forms — brand-guide-template, plan-de-match-template)

BUILDS
├── Citadel · Library of Alexandria · Forge · Client System · Kamvas · Bema
└── (slots) Mouseion · Delphi · Gymnasio (cross-link to fitness-app/PROJECT_MEMORY)

HOUSES (internal: Accounts)
├── Prospects    (pitched, not signed yet — graduates to Clients on win)
├── Clients      (LDH · Cody · Wolf Pack · Nicolas · Kevin · spa-mobile legacy)
├── Collabs      (joint productions with non-clients)
├── Self  🔒     (Personal Brand · Personal Creative — FUTURE: password-protected)
├── Partners     (SpeakUp · Hoski · Argo — their own brand work, not their clients)
└── One-offs     (small jobs without full pipeline)

LAB
├── Experiments  (content/format trials, no destination yet)
├── Prototypes   (sandbox builds, pre-Build code)
├── Studies      (learning intake + accumulated knowledge — by topic)
│     ├── AI & Tooling · Marketing & Content · Business & Strategy
│     ├── Design & Aesthetics · Engineering · Psychology & Behavior
│     └── + open slot
└── Drafts       (writing in development)

STREAMS
├── Voice Notes · Journal · Swipe File · Observations

OPERATIONS
├── Admin     (contracts · invoicing · vendor research)
├── Stack     (tools · configs · API references)
└── Rituals   (weekly reviews · quarterly retros · annual planning)

REFERENCE
├── About Jason · Network · Vocabulary · Accumulated

Internal House sub-shape (applies uniformly to every House sub-type — Clients/Collabs/Self/Partners): Brand · Strategy · Research · Deliverables · Notes

Naming rationale:

Key distinctions resolved:

Three redundancies caught in audit + resolutions:

  1. project_ldh.md (auto-memory) folds into clients/les-dames-des-hypotheques/notes.md — single rolling log home.
  2. thumbnail_two_pass_process.md retyped from project to methodology (it's a Framework).
  3. Skill Dashboard's 4 specs (SPEC, MEMORY_TAB_SPEC, MEMORY_BRAIN_VIEW_SPEC, MOBILE_SPEC) stay separate for now — feature-scoped consolidation deferred.

Future flag — Self protected area: Houses > Self should eventually be password-protected. Personal brand + personal creative content (photography, music, bouldering, etc.) sits behind a gate. Design pass needed. Phase 3+.

Prospects sub-type (added 2026-05-04 wrap): Houses > Prospects is the home for pitched-but-not-signed entities. Same internal sub-shape as other Houses (Brand · Strategy · Research · Deliverables · Notes), though early-stage prospects often have only Deliverables (the pitch deck) until they sign. On win → folder migrates to Houses > Clients. On loss → archived (state filter). Resolves Pandora's Box 3300eed7-... (Bema deck save destinations) — Bema's provisional _pitches/{slug}/ becomes prospects/{slug}/ at workspace root, mirroring clients/ conventions. Migration is a one-shot when Bema next runs against any prospect deck saved under the old path.

Wiring tasks (2D) — SHIPPED 2026-05-04:

  1. library-sources.json classification rules → 7-stack mapping with subcategories + house_section (catch-all rules added so client files default to Houses/Clients without Mnemosyne fallback)
  2. src/mnemosyne/prompt.js — 7-name stacksCategories, subcategory in output schema, expanded workspace list (added library, kamvas, bema)
  3. ✅ Auto-memory visibility — project flipped from exclude_typesinclude_types, project_*.md now route to Builds with per-build subcategory
  4. ✅ Backend — ?sub= param on /stacks/:category (supports _unsorted literal). /stacks returns nested structure: each stack has subs[] array with name/count/lastAdded in registry order
  5. ✅ Frontend sidebar — top-7 with caret expand, indented sub-list with vertical rule, auto-expand on active stack, sub-row click navigates to ?sub=<name>. StackDetailView reads sub from URL and shows All / sub pills
  6. ✅ Re-bootstrap — 102 visible files indexed, 7 orphans cleaned (3 deleted voice notes + 4 newly-excluded routing logs). Distribution: Frameworks 25 · Builds 23 · Houses 42 · Lab 0 · Streams 6 · Operations 2 · Reference 3

Plus: DB schema added subcategory + house_section columns (idempotent ALTER), validation/indexer/bootstrap pass them through, /integrity/confirm accepts subcategory override, capture pipeline now writes library_category + subcategory to voice-note frontmatter on routing.

NEW PRIORITY — Studio Setups + Permissions (context drop 2026-05-04)

Context arrived from a separate strategy session and takes priority over the rest of the Phase 2 backlog. Original message: Studio Setup is a first-class entity in the Library, not a side doc. Categories: solo talking head · dual talking head · dual podcast · 3-person podcast (extensible). Each setup has variations + per-client color overrides. Shady (studio team alongside Jason and Charles) needs full Library access — read AND upload, ideally drag/drop into a setup template.

Resurfacing — proposal locked pending decisions:

Permissions — phased, deferred enforcement:

Decisions blocking next session start: see "Decisions for next session" at the bottom of this file.

Studio Setups + Phase 2 follow-on — SHIPPED 2026-05-05 (session 2)

All five must-do/stretch items from the pickup brief landed in one session.

  1. Studio Setups entity wired. _ops/studio-setups/ created with README + 4 stub files (solo-talking-head, dual-talking-head, dual-podcast, 3-person-podcast), each carrying the locked type: studio_setup frontmatter (slug, name, owner, variations, client_overrides, purpose_tags). Classification rule studio-setups/**/*.md → Frameworks > Setups added at top of the ops source's classification_rules in library-sources.json. Setups appended to the Frameworks subs registry. Bootstrap re-ran → 113 files indexed (was 102). API confirms Frameworks > Setups (5).
  2. Subcategories-as-folders. Backend /stacks endpoint now surfaces all declared subs (count 0 when empty), so Houses shows Prospects(0)/Clients(48)/Collabs(0)/Self(0)/Partners(0)/One-offs(0); Frameworks shows Methodology/SOPs/Playbooks/Templates/Setups; Lab/Operations/Reference all expose their declared sub shape. StackDetailView rewritten as a folder grid by default (each sub a .stack-card reusing existing CSS) with a Folders / See flat list toggle. Drill-down sets ?sub=<name>; breadcrumb back-link returns to the folder grid. Stacks with no declared subs (e.g. uncategorized) skip folder mode and render the flat list as before.
  3. Color palette restored. Explicit FIXED_COLORS map for all 7 stacks (sage / terracotta / slate-blue / plum / amber / slate-teal / wine — earthy hues spanning the wheel, all distinct from each other at the sidebar dot scale). hashCategoryColor hue range widened from 140-340 to 0-360 so warm tones return for any legacy or Mnemosyne-drift category that falls through to the hash.
  4. Permissions Phase 2 — convention documented; Tailscale-add deferred to admin action. _ops/studio-setups/README.md now spells out the owner convention (jason | shady | charles), a concrete scp-via-Tailscale upload path, and the Phase 3 spec for Tailscale-User-Login middleware enforcement. Inviting Shady + Charles to the tailnet is admin work that requires the Tailscale admin console — flagged for Jason. UI dropzone deferred to Phase 2.5.
  5. Brief cross-link rendered. ReadingView now reads fm.setup from frontmatter and renders an uppercase mono kicker above the title (USES SETUP: <Display Name> →). Click navigates to /file?id=ops:studio-setups/<slug>.md so the setup file opens in the same reading surface. Slug → display name is title-cased client-side. Reverse lookup (briefs-using-setup-X) still Phase 2.5.

Five scoped commits on library-app/main:

Server restarted via launchctl stop/start com.library.server so the registry edit + new /stacks shape are live.

Distribution after re-bootstrap: Frameworks 31 (Methodology 25 · SOPs 1 · Setups 5; Playbooks/Templates surfaced empty) · Builds 23 (LoA 7 · Forge 6 · Client System 6 · Kamvas 2 · Bema 1 · Workspace 1; Mouseion/Delphi/Gymnasio/Citadel surfaced empty) · Houses 48 (Clients 48; Prospects/Collabs/Self/Partners/One-offs surfaced empty) · Lab 0 · Streams 6 (Voice Notes 4 · Journal 2; Swipe File/Observations surfaced empty) · Operations 1 · Reference 3.

NEW backlog item — Provenance reroute UI (flagged 2026-05-05)

Surfaced near session end. The Provenance UI today only exposes skip/approve for pending routes and dismiss/confirm → <suggested> for classification review. The backend already supports modify/override — both api.modifyRoute(id, destination) (POST /pending-routes/:id/modify) and api.confirmClassification(docId, category, subcategory) accept overrides — but neither has a UI affordance. When Mnemosyne's suggested path is wrong, the user has no in-UI path to reroute; they have to skip then manually move.

Goal for next session: add a "reroute" or "modify destination" action to both the pending-route detail panel and the classification-review detail panel. Picker UX needs a quick way to choose stack + subcategory for library routes (typeahead or two-step picker). Mobile Provenance modal port (Phase 2 backlog item 3) becomes the natural moment to also redesign the action row.

Provenance reroute UI + mobile drawer + routing log polish — SHIPPED 2026-05-05 (session 3)

All four must-do/stretch items from this session's pickup brief landed in three scoped commits on library-app/main. Backend was extended first to make the override actually take effect, then the frontend grew the picker UI and the mobile drawer.

  1. Pending-route reroute picker. POST /pending-routes/:id/modify now accepts { library_category, subcategory } alongside { destination }. For library destinations it persists the override on the pending-route record AND patches the voice note's .md frontmatter (then invalidates the enriched-files cache) so the override propagates without waiting for re-bootstrap. api.modifyRoute(id, destination, { library_category, subcategory }) extended client-side. Pending-route detail panel renders a stack <select> + subcategory <select> for library routes (subs filtered to the chosen stack's declared list, pulled from /api/library/stacks) or a workspace <select> for forge_queue routes (eight workspace tags hardcoded — mirrors src/mnemosyne/prompt.js). Pre-filled from the suggestion. Approve button label flips to reroute & approve when values differ; otherwise plain approve.
  2. Classification-review reroute picker. Same shape — stack + sub <select> pre-filled from suggested_category / suggested_subcategory. Confirm button flips to reclassify & confirm when changed; calls confirmClassification(docId, category, subcategory) with overrides. The 42 leftover classification_needs_review rows (mostly Mnemosyne drift like "Notes" / "Strategy") are now triagable in-app.
  3. Mobile Provenance drawer. Detail panel rewritten as mobile-first: fixed bottom drawer with backdrop + close button, transforms up from below on selection, anchored to the safe-area-inset on iPhone. Desktop (≥768px) media query overrides back to a static right column. Resolves the "tapping does nothing on iPhone" gap — the panel was rendering below the list off-viewport.
  4. Dismiss flow settled. dismiss button renamed to skip on the integrity panel for consistency with pending-route side. The picker now provides the reroute-instead-of-dismiss path, so dismiss is no longer the only escape. Records still persist on disk: pending-routes.jsonl keeps status='skipped' entries, classification_needs_review keeps reviewed=1 rows. Soft archive by default — UI hides them but the data isn't deleted. A "review history" surface to browse them is Phase 2.5 polish, not blocking.
  5. Routing log destination granularity. Trail writer (src/mnemosyne/trail.js) now stamps library_category + subcategory into the routing log frontmatter; /routing-log endpoint surfaces them on each entry; formatRoutingLogDestination() helper renders → library : <stack> / <sub> for library entries and → forge / <workspace> for forge_queue. Existing trail files (pre-this-commit) lack the fields and gracefully fall back to → library — no migration needed.

Three scoped commits on library-app/main:

Server restarted via launchctl stop/start com.library.server. /api/library/stacks returns the 7-stack registry (Frameworks 31 · Builds 23 · Houses 48 · Lab 0 · Streams 6 · Operations 1 · Reference 3); /api/library/integrity returns 42 review rows (unchanged from session 2 wrap — triage UI now available, but actual triage is a Jason-at-keyboard task).

Backend gap closed: modify previously updated only the pending-route record; the voice note frontmatter retained the original Mnemosyne-suggested category. Now modify also patches the .md file, so the override propagates immediately.

Editing + collaboration architecture — LOCKED 2026-05-06 (Daedalus Learning session)

Full architecture locked in one Daedalus pass. Decision pad lives at _ops/library-of-alexandria/EDITING_AND_COLLABORATION_DECISIONS.md (replaces the question list in EDITING_AND_COLLABORATION_SCOPE.md). Highlights:

Phase A solo edit-in-place — SHIPPED 2026-05-07 (session 5)

Full Phase A scope landed in one session. All 8 build tasks completed.

Backend (library.js + db.js):

New packages: diff (server — unified diff generation), codemirror + @codemirror/lang-markdown (client — editor)

Frontend:

Actor identity in Phase A: Tailscale-User-Login header → env LIBRARY_ACTOR'jason'. Phase B replaces with real middleware (now done).

One scoped commit on library-app/main: Phase A solo edit-in-place — all 8 components.

Phase B Tailscale auth foundation — SHIPPED 2026-05-07 (session 6)

All 4 Phase B deliverables landed in one session. Commit 960376c on library-app/main.

New src/auth/permissions.js:

library-sources.jsondefault_collaborators_by_path added to:

src/routes/library.js:

client/src/views/ReadingView.jsx:

Smoke tests passed:

Phase 2 backlog — remaining (in priority order)

Items 1–5 from session 2 + session 3 shipped (Studio Setups + folder navigation + 7-stack palette + setup cross-link + Provenance reroute UI + mobile drawer + dismiss-as-skip + routing log granularity). Editing+collab architecture locked in session 4 (2026-05-06). What's left:

  1. Phase A — Solo edit-in-place — SHIPPED 2026-05-07. See "Phase A SHIPPED" section below for full detail.
  2. Phase B — Tailscale auth foundation — SHIPPED 2026-05-07. See "Phase B SHIPPED" section below.
  3. Phase C — Annotations + suggestions — COMPLETE 2026-05-08 (sessions 1-4). Thread replies + export-with-comments shipped in session 4. All Phase C deliverables done.
  4. Phase D — External sharing — SHIPPED 2026-05-08 (session 4). Share tokens table, /api/share/:token public endpoint, ShareView, share panel in ReadingView, Tailscale Funnel note. See "Phase C session 4 + Phase D" section.
  5. The big one — make Library the consultation surface. Real use case: working on the LDH brief in another Claude Code session, want to pull the brief from the Library directly instead of cat-ing the markdown. Today the Library has the file, but discovery friction is too high. Probable shape: a compact ?q= cross-session search URL surface (already exists at /api/library/search + /search view) — worth checking PWA performance on phone. Touches the same surface as project_library_html_rendering.md (HTML rendering in-app). Note: lander pattern canonization (previously a separate Phase 2 item) folds into Phase D scope per the decision pad. Public share links (previously a separate Phase 2 BUILD_PHASES item) also fold into Phase D.
  6. HTML file rendering. project_library_html_rendering.md Phase 2 — iframe-based rendering of .html files in-app. Same surface as item 5.
  7. Review history surface (Phase 2.5 polish). Browse skipped/dismissed Provenance rows. Records exist on disk (pending-routes.jsonl status='skipped'; classification_needs_review reviewed=1) — just no UI today. Low priority; the picker now removes most of the need.
  8. Reverse setup lookup (Phase 2.5). "Show all briefs using setup X" — Phase 2.5 follow-on to the brief→setup cross-link shipped in session 2.

Phase C session 1 — annotations foundation — SHIPPED 2026-05-08

Commit 104e385 on library-app/main.

  1. annotations SQLite table — schema per §3.1 of decision doc. kind CHECK('comment','highlight','suggestion'). W3C anchor fields: anchor_quote, anchor_prefix, anchor_suffix, anchor_offset. Two indexes: by doc_id+resolved+created, by author+created. Idempotent CREATE TABLE IF NOT EXISTS in src/db.js.
  2. GET /api/library/file/:id/annotations — lists all unresolved annotations for a doc, ordered by created ASC.
  3. POST /api/library/file/:id/annotations — creates annotation; guarded by requireDocRole('comment'). Body: kind, body, anchor_quote (required), plus optional anchor fields.
  4. api.annotations(id) + api.createAnnotation(id, body) in client/src/lib/api.js.
  5. ReadingView gutter markers — loads annotations on mount; uses requestAnimationFrame + document.createTreeWalker + Range.getBoundingClientRect() to compute Y positions scroll-independently; renders .annot-gutter-mark dots absolutely positioned in .prose-annotated wrapper.
  6. Selection tooltipmouseup on prose container → floating fixed-position tooltip with textarea → POST → reload annotations → markers re-render. Dismissed on Escape or cancel.
  7. Smoke tests passedGET returns count:0 on fresh doc; POST persists row with correct author (jason); GET after POST returns the annotation.

Architectural notes:

Phase C session 2 — SHIPPED 2026-05-08, commit 919ab68:

Phase C session 3 — SHIPPED 2026-05-08, commit a8b5637:

Phase C session 4 + Phase D — SHIPPED 2026-05-08, commit 42ce7cb:

Smoke tests passed:

Session 5 polish + QOL — SHIPPED 2026-05-08 (commits 9d83240 → 9ce37c5)

Additional work this session after Phase C/D:

Phase 2.5 — status (2026-05-08 session 2 — consultation surface):

  1. Rendering architecture Daedalus pass — type registry + strategy pattern locked. See project_library_rendering_architecture.md.
  2. Rendering implementation — registry.js + MarkdownRenderer + VoiceNoteRenderer + DeepMapRenderer (Fireflies-style two-column, handles old + new formats) + HtmlPassthroughRenderer (sandboxed iframe, auto-sized). Commit d792eeb.
  3. Tailscale Funnel — live and confirmed. https://macbook-pro-3.tail4a07f5.ts.net responding. LIBRARY_PUBLIC_URL set in .env.
  4. Consultation surface — Commit 8a33db9. SearchView now reads ?q= on mount + syncs URL as user types. Copy-link button next to result count. PWA start_url/search. Also fixed a pre-existing bug: search result navigation was silently broken — API returns docId (camelCase), component was reading doc_id (snake_case), clicks went nowhere. Fixed.
  5. HTML renderer polishderiveTitle() strips .html extension (was: "Carousel Co3 Outreach Audit.Html", now: "Carousel C03 Outreach Audit"). Word count zeroed for html_file on server (parseFile) and client (ReadingView docType check). Commit 8a33db9.
  6. Publish to Vercel — SHIPPED 2026-05-09. Commit 2111211. See "Phase 3 — Publish to Vercel SHIPPED" section below.
  7. Review history surface — low priority polish.
  8. Reverse setup lookup — low priority polish.

How to use the consultation surface (cross-session brief lookup):

Open Jason admin actions (not code work):

Phase 3 — Publish to Vercel SHIPPED + locked on thecitadel.tools (2026-05-09 → 2026-05-10)

Three commits on library-app/main: 2111211 (feature), f98bc9b (auto-disable Deployment Protection), b9eb037 (clean-URL aliasing on thecitadel.tools).

End-to-end working:

Domain — locked decisions:

Backend architecture:

Env vars in .env:

Frontend:

Verified gotchas (logged for posterity):

  1. Vercel enables SSO + password Deployment Protection by default on new projects → disableProjectProtection PATCH after each deploy strips both. Idempotent, best-effort.
  2. Aliases fail with 400 "deployment readyState is not READY" → must poll deployment status first (waitForDeploymentReady).
  3. New domains need SSL cert provisioning (~10-60s via Let's Encrypt) → alias retry loop handles cert-pending errors transparently.
  4. DNS propagation (registry → public resolvers) takes ~15-45 min for .tools TLD. Publishing during that window falls back to random Vercel URL gracefully.

NEW backlog item — render parity gap (flagged 2026-05-10)

Problem: Library has TWO render pipelines that have already drifted:

  1. In-app (browser): React MarkdownRenderer + normalizeDeepMapContent pre-processor + global app.css table/heading styles
  2. Vercel-published HTML (server): renderHtml() in src/routes/library.js (line 266) — raw marked.parse() with inline <style> block, untouched since Phase 1

User noticed when comparing local doc render to published library-memory.thecitadel.tools — table polish, deep-map pre-processor, and any future MarkdownRenderer improvements don't reach the published version.

Decision (2026-05-10): DON'T do a quick CSS port. Bundle into the Daedalus rendering pass. Why: a quick port duplicates CSS in two places, and we'd redo it when the Daedalus pass converges everything onto a single render pipeline anyway. Acceptable to live with the gap for 1-2 sessions.

The right fix (proper SSR): use react-dom/server.renderToStaticMarkup() to render the same React components server-side. Rendering becomes a pure function (doc) → HTML. In-app wraps in a React component; renderHtml() calls it directly. Single source of truth — every future improvement automatically reaches Vercel. Aligns with the Google-Docs "one engine, every consumer" principle locked earlier this session.

This adds a fourth scoped item to the queued Daedalus rendering pass:

  1. Audit pass — every doc type, specialization-vs-markdown classification
  2. MarkdownRenderer hardening — top-tier tables/code/lists/blockquotes/anchors/internal-links
  3. Frontmatter strip system — composable header that auto-styles common frontmatter shapes (phase pills, dates, brand swatches, setup variations)
  4. Server-side render parityreact-dom/server.renderToStaticMarkup() so Vercel publish uses the same engine. Touch points: renderHtml() in src/routes/library.js, MarkdownRenderer in client.

In-flight (carry into next Library session)

Out of scope for next Library session (separate threads):

Decisions confirmed 2026-05-05

  1. Frameworks > Setups — confirmed (preserves 7-stack lock)
  2. _ops/studio-setups/ on disk — confirmed
  3. Phase 2 = entity wiring + Tailscale-add Shady & Charles + frontmatter owner as convention. Phase 3 = real auth.
  4. scp-via-Tailscale acceptable for Phase 2 upload path. Drag/drop UI deferred. BUT user flagged a related pattern that needs canonizing — see below.

Shareable views — canonization needed (flagged 2026-05-05)

User flagged during decision #4 review: the multi-tab deliverable lander pattern (Skawanotti interview shape, recently extended to an LDH next-month brief output) hasn't been canonized but is in active use. Pattern: a markdown source becomes a 4-tab HTML lander (overview / scripts / carousels / notes) when shared with the team or external collaborators.

Adjacent to but distinct from project_library_html_rendering.md (Phase 2 HTML iframe rendering) and Phase 2 backlog item 6 (Library as consultation surface). Both touch "how rendered views of canonical markdown reach humans." Worth tackling as one cohesive design pass when those land.

Specific questions to answer when canonizing:

NOT blocking for next session. File the design pass for the consultation-surface session.


Status

Phase 0: complete. Phase 1: COMPLETE (2026-04-30). All 10 sub-systems (1A–1J) shipped. Phase 1.5: COMPLETE (2026-04-30). UI polish pass shipped same session. Bootstrap + infra: COMPLETE (2026-04-30 session 2). 86 files indexed, 8 collections active. GitHub remote live. PWA manifest added.

Next session: Collections organizational strategy (2C) + Phase 2 feature build.


App structure

Dev workflow:

launchd services (auto-start on login):

Bootstrap command: npm run bootstrap (or npm run bootstrap:force to reindex everything)

GitHub remote: https://github.com/jasonlucas4/library-alexandria.git — hourly launchd backup auto-pushes the data corpus (library/). .search/ DB excluded (regenerated by bootstrap).

App code git (added 2026-05-05): library-app/ is now its own local git repo. Initial commit 63994e7 on main captures Phase 1+1.5+2D shipped state. No remote yet — separate decision for whenever offsite backup is wanted. .gitignore covers .env, node_modules/, library/, .DS_Store, Icon. Commit at end of each Library session per session-hygiene ritual.

Key env vars in library-app/.env: ANTHROPIC_API_KEY, GEMINI_API_KEY, GROQ_API_KEY. All confirmed working.


Phase 1.5 — UI polish shipped 2026-04-30

Navigation:

Hall view:

Collections (Stacks):

Reading view:

Provenance:

Forge Queue view:


Backend API routes (all live)

Route Purpose
GET /api/library/recent?limit=N All visible .md files sorted by mtime, enriched metadata, 30s cache
GET /api/library/stacks Category counts, uncategorized always last
GET /api/library/stacks/:category Items in a category
GET /api/library/file/:id Single file with derived title + sourceHint
GET /api/library/search FTS5 + semantic search
GET /api/library/pending-routes?status= Staged routing decisions
`POST /api/library/pending-routes/:id/approve modify
GET /api/library/routing-log?limit=N ALL routing decisions from library/logs/routing/
GET /api/library/forge-queue?limit=N Items Mnemosyne sent to Forge
GET /api/library/export/:id?format=md|html File export (1F render pipeline)
GET /api/library/integrity Classification needs review
POST /api/library/capture Voice note upload (202 fire-and-forget)

Transcript Summary skill — shipped 2026-04-30

Location: skills/transcript-summary/

Cost benchmark: ~$0.13–0.15 per ~46-min interview (2 passes, Sonnet). Much cheaper than Fireflies ($10–19/month). Break-even at ~65–125 transcripts/month.


Next session — pick up here

Completed this session (2026-04-30 session 2)

  1. Bootstrap run — 86 files indexed, 46 classified by Mnemosyne into 8 collections. Gemini embeds hit rate limit (non-fatal). Fixed two bugs: (a) bootstrap needs npm run bootstrap not bare node — added npm script; (b) getEnrichedFiles() in library.js wasn't reading DB-stored Mnemosyne categories — fixed by loading from source_index table and merging.
  2. GitHub remote — already existed at https://github.com/jasonlucas4/library-alexandria.git. Pushed 5 pending commits. Fixed .gitignore to exclude .search/ DB files.
  3. PWA manifest — added manifest.json + 192/512 PNG icons (gold columns on dark bg). apple-mobile-web-app-title = "Library". Status bar style set to black-translucent. Files live in client/public/ (survive Vite builds). iPhone: open http://100.72.220.52:5175 in Safari, tap Share → Add to Home Screen.

Phase 2 — next major build

Priority order (not all same session):

2A — Hall usability:

2B — Provenance:

2C — Collections organizational strategy:

2D — Content enrichment:

2E — Export quality:

2F — Transcript Summary → Library tab:


Architectural decisions locked

Watch list