• bvandeusen released this 2026-04-28 09:13:40 -04:00 | 303 commits to main since this release

    Day after the journal/Scribe rebrand, the design system shipped end-to-end and several adjacent issues surfaced during verification got resolved.

    Headline

    • Design system applied across the whole app — dusty violet #5B4A8A accent replaces indigo; warm parchment light mode (#F5F1E8 page, #FBF8F0 cards) replaces white-and-cool-blue; Obsidian/Iron/Pewter dark mode replaces cool grey; Inter loaded for body, JetBrains Mono for code, Fraunces still for headings ≥18px. The Hybrid accent rule is enforced — Save buttons are Moss green, Cancel is Bronze, Delete is Oxblood with a Trash icon, brand-moment CTAs (chat send, journal send, "Open Workspace") keep the dusty-violet gradient.
    • 60 hand-inlined SVGs replaced with Lucide across 15 files. Every chrome icon is now 16 or 24px. Emoji-as-icons (, , 🎤, 📎, , , ×, /) swept.
    • Journal config returned to Settings inside the Profile tab. Locations (home/work geocode), temperature unit, prep schedule (auto-generate toggle, prep time, day rollover hour) — the data the deleted Briefing tab used to set is editable again.
    • Weather + events fixes/api/journal/weather now serves cached weather regardless of age (matches the prep's behavior) and auto-refreshes stale rows in the background. Events window widened from "now → +14 days" to "today 00:00 → +14 days" so events earlier today still surface in the right rail.
    • Long-form reading line-height (1.7) on .prose — Note viewer, Task viewer, chat assistant bubbles, journal prep all read like considered prose instead of UI snippets.
    • Italic stripped from chrome — 42 declarations across 24 files. Italic now means "emphasis" only; markdown content emphasis (<em>/<i>) is preserved via browser default.

    Fixes

    • ProjectView Tasks tab counter no longer shows NaN when a status bucket is empty (services/projects.py initialises task_counts with all three lifecycle keys at 0)
    • TaskEditor preview body no longer overflows on top of the WorkLog section (preview pane + work log no longer flex-shrink in the column)
    • Calendar Month/Year title renders Inter, not Fraunces (FullCalendar uses an <h2> element which got caught by the global Fraunces rule)
    • Header status dots brightened so "Ready" reads as a vital green (#4ade80), not muted Moss
    • KnowledgeView filter labels and NoteEditor entity-field labels enlarged to readable size

    Migrations

    None required. Settings already had journal_config from the prior release; today's changes only add UI for fields that already existed.

    Documentation

    • docs/design-system.md updated with the per-PR ship table and explicit "Out of scope — deferred indefinitely" subsection
    • docs/architecture.md, docs/features.md, docs/api-reference.md cleared of stale briefing references; current state describes the journal system

    Deploy notes

    • Pull the new image; no manual migration step
    • After deploy, configure Settings → Profile → Locations to populate the journal's right-rail weather (the auto-refresh kicks in on the next page load once locations are set)

    What's deferred

    • Lucide stroke-weight overrides (1.5/1 vs current 2)
    • Filled-as-active icon state
    • New-user onboarding wizard (tracked as Fable task #155)
    • Flutter app surface phase (foundation port shipped today; surface phase tracked as #156)
    Downloads
  • bvandeusen released this 2026-04-27 08:12:56 -04:00 | 325 commits to main since this release

    A substantial release. Five days of work bundled together.

    Headline

    • Rebrand: Fabled Assistant → Fabled Scribe (user-visible strings, repo, image path; internal package + DB unchanged)
    • Briefing → Journal: day-anchored conversational surface where you record your day. Daily LLM-generated prep at the top, conversational chat below, silent record_moment extractions in the background.
    • RSS retired end-to-end (services, models, tools, NewsView, article-discuss flow, DB tables). The URL-generic read_article tool survives.
    • Routing: / now lands on /journal; Knowledge moved to /knowledge as its own route.
    • Design system doc captures the FabledSword baseline + Scribe's iteration decisions. UI polish pass deferred.

    Migrations (apply on container start)

    • 0040 — rename conversations.briefing_dateday_date; delete all briefing conversations + briefing_config settings
    • 0041 — add moments + 4 junction tables + moment_embeddings
    • 0042 — drop RSS tables; clear rss_enabled / briefing_*_topics settings

    Breaking

    • All prior briefing conversations and briefing_config user settings are deleted by migration 0040. By design, no recovery.
    • All RSS feeds, items, reactions, and embeddings are dropped by 0042. By design, no recovery.

    Deploy notes

    • Pull the new image; migrations run on startup
    • Force-regenerate today's prep via mcp__fable__fable_trigger_journal_prep to pick up the latest prompt-tuning
    • Flutter app's matching journal-replaces-briefing migration was pushed to FabledApp dev and will land in its next APK release

    What's deferred

    • Polish pass applying the design system to existing UI
    • End-of-day moment synthesis
    • Native Android journal UX (the Flutter app currently has the migrated screen but isn't yet the polished journal experience the web side is iterating toward)
    Downloads
  • bvandeusen released this 2026-04-22 15:11:24 -04:00 | 349 commits to main since this release

    Highlights

    Project workspace (/workspace/:projectId) redesigned around tasks + notes as the main surface. Chat is now a bottom-anchored floating widget modeled on the Knowledge view's mini-chat.

    Layout

    • Two-column grid: tasks (0.85fr) | notes (2.15fr) — down from three equal-ish columns.
    • Chat header toggle removed; only Tasks | Notes remain.

    Chat widget

    • Bottom-anchored dock, centered within --page-max-width, rounded top corners.
    • Collapsed = input-only. Expanded = full ChatPanel above the input (500px tall).
    • Pinned per-project conversation survives page reloads; delete-if-empty-and-new on unmount.
    • Restart ↻ — detaches current conversation and starts fresh; old conversation remains discoverable.
    • History ▾ — dropdown lists conversations where rag_project_id === projectId.
    • Widget owns the SSE streamingToolCalls watcher; emits note-changed and task-changed events to the view.

    Notes panel polish

    • Notes-picker rail widens from 155px → 200px and gains --color-bg-card so it no longer visually merges with the tasks panel.
    • Active-note indicator moved from the left edge to the right edge (pointing at the editor).
    • Dropped horizontal dividers between title / tags / toolbar / body — the chrome reads as one unified field.
    • Note title bumped to 1.4rem Fraunces serif with generous row padding.
    Downloads
  • bvandeusen released this 2026-04-17 23:34:20 -04:00 | 358 commits to main since this release

    Highlights

    • Unified lookup toollookup replaces search_web. Runs Wikipedia summary + SearXNG search in parallel. Current events no longer get masked by generic role articles.
    • Wikipedia thumbnails inline — when the summary includes an image, it's cached via the existing /api/images/ pipeline and embedded in the reply.
    • Wikipedia in research pipeline — added alongside SearXNG as a source for deep-research notes.
    • Weather card UX — hourly precipitation summaries, peak-hour column, manual refresh button.
    • Briefing events widget — next 2 weeks of events grouped by day below the weather card.

    Fixes

    • Article extraction in lookup serialized to avoid a libxml2 double-free crash.
    • Several test-patching fixes.
    Downloads
  • bvandeusen released this 2026-04-17 07:16:41 -04:00 | 374 commits to main since this release

    Allow Fraunces Google Font by adding fonts.googleapis.com to CSP style-src and fonts.gstatic.com to font-src.

    Downloads
  • bvandeusen released this 2026-04-16 20:24:07 -04:00 | 376 commits to main since this release

    Hotfix: add wasm-unsafe-eval to CSP script-src so onnxruntime-web can compile the Silero VAD WASM binary. Also surfaces VAD init errors as a UI toast.

    Downloads
  • bvandeusen released this 2026-04-16 19:37:14 -04:00 | 378 commits to main since this release

    Highlights

    • Silero VAD voice detection — Replace amplitude-based silence detection with Silero VAD v5 ONNX for robust speech-vs-noise classification on web
    • Briefing 2-column layout — Weather + news in a single sidebar with tabbed locations and table-based forecast
    • UI polish — Remove chat input bar border divider, container-query scaling for forecast icons
    • CI fix — Switch node_modules cache to npm download cache
    Downloads
  • bvandeusen released this 2026-04-15 00:38:39 -04:00 | 404 commits to main since this release

    Voice

    • Rewrote the silence detector to compute honest linear RMS → dBFS (the old path ran RMS over byte-scaled frequency data, producing meaningless dB numbers).
    • Silence threshold is now dynamic per session: arms at -25 dBFS peak, then stops when the current level drops ≥15 dB below peak. Static -45 dBFS fallback covers the pre-arm window. 1500 ms grace at the start.
    • Mic pulse redesigned as a filled red radial-gradient disc behind an unmoving mic icon — far more visible than the previous subtle scale.
    Downloads
  • v26.04.14.3 Stable

    bvandeusen released this 2026-04-14 22:54:55 -04:00 | 406 commits to main since this release

    Live amplitude mic pulse

    The chat input bar's mic button now scales and glows proportional to the silence detector's live RMS amplitude instead of sitting static. Obvious feedback that audio is actually being picked up — no more wondering whether the mic is hot. Silence still breathes via a 0.1 baseline floor, loud input caps at ~1.18x scale so it doesn't punch through the input bar. A 120ms CSS transition blends smoothly between the ~100ms amplitude samples so the pulse feels continuous rather than stepping.

    Downloads
  • v26.04.14.2 Stable

    bvandeusen released this 2026-04-14 21:45:58 -04:00 | 408 commits to main since this release

    Discuss failure mode fixes

    Fixes a hallucination path in the article-discuss flow. Previously, if article extraction returned empty or RAG pulled in unrelated orphan notes that looked more relevant than the generic seed prompt, the model would confabulate a response that had nothing to do with the article.

    Empty-article hard-fail. seed_article_discussion now raises a new EmptyArticleError when the article body is empty or reduces to empty after prep. The /briefing and /news discuss routes catch it and return 422 with a clean error. No more empty synthetic read_article tool results silently telling the model "the article has nothing in it" and watching it invent content to fill the void. The /news route also cleans up the empty conversation it had already created so the user doesn't end up with a phantom chat.

    Skip RAG on the seed turn. When user_message matches ARTICLE_DISCUSS_SEED inside build_context, both the semantic-search and keyword-search auto-injection paths short-circuit. The article IS the context on turn one — RAG was diluting it by feeding the model unrelated orphan notes ranked against the generic "I want to talk about this article" seed. Follow-up turns keep RAG on because by then the user's own messages drive the query.

    Downloads