-
released this
2026-04-28 09:13:40 -04:00 | 303 commits to main since this releaseDay 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
#5B4A8Aaccent replaces indigo; warm parchment light mode (#F5F1E8page,#FBF8F0cards) 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/weathernow 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
NaNwhen a status bucket is empty (services/projects.pyinitialisestask_countswith 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_configfrom the prior release; today's changes only add UI for fields that already existed.Documentation
docs/design-system.mdupdated with the per-PR ship table and explicit "Out of scope — deferred indefinitely" subsectiondocs/architecture.md,docs/features.md,docs/api-reference.mdcleared 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
Downloads
- Design system applied across the whole app — dusty violet
-
released this
2026-04-27 08:12:56 -04:00 | 325 commits to main since this releaseA 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_momentextractions in the background. - RSS retired end-to-end (services, models, tools, NewsView, article-discuss flow, DB tables). The URL-generic
read_articletool survives. - Routing:
/now lands on/journal; Knowledge moved to/knowledgeas its own route. - Design system doc captures the FabledSword baseline + Scribe's iteration decisions. UI polish pass deferred.
Migrations (apply on container start)
0040— renameconversations.briefing_date→day_date; delete all briefing conversations +briefing_configsettings0041— addmoments+ 4 junction tables +moment_embeddings0042— drop RSS tables; clearrss_enabled/briefing_*_topicssettings
Breaking
- All prior briefing conversations and
briefing_configuser settings are deleted by migration0040. 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_prepto pick up the latest prompt-tuning - Flutter app's matching journal-replaces-briefing migration was pushed to
FabledAppdevand 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
-
released this
2026-04-22 15:11:24 -04:00 | 349 commits to main since this releaseHighlights
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 | Notesremain.
Chat widget
- Bottom-anchored dock, centered within
--page-max-width, rounded top corners. - Collapsed = input-only. Expanded = full
ChatPanelabove 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
streamingToolCallswatcher; emitsnote-changedandtask-changedevents to the view.
Notes panel polish
- Notes-picker rail widens from 155px → 200px and gains
--color-bg-cardso 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
-
released this
2026-04-17 23:34:20 -04:00 | 358 commits to main since this releaseHighlights
- Unified lookup tool —
lookupreplacessearch_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
libxml2double-free crash. - Several test-patching fixes.
Downloads
- Unified lookup tool —
-
released this
2026-04-17 07:16:41 -04:00 | 374 commits to main since this releaseAllow Fraunces Google Font by adding
fonts.googleapis.comto CSPstyle-srcandfonts.gstatic.comtofont-src.Downloads
-
released this
2026-04-16 20:24:07 -04:00 | 376 commits to main since this releaseHotfix: add
wasm-unsafe-evalto CSPscript-srcso onnxruntime-web can compile the Silero VAD WASM binary. Also surfaces VAD init errors as a UI toast.Downloads
-
released this
2026-04-16 19:37:14 -04:00 | 378 commits to main since this releaseHighlights
- 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
-
released this
2026-04-15 00:38:39 -04:00 | 404 commits to main since this releaseVoice
- 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
released this
2026-04-14 22:54:55 -04:00 | 406 commits to main since this releaseLive 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
released this
2026-04-14 21:45:58 -04:00 | 408 commits to main since this releaseDiscuss 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_discussionnow raises a newEmptyArticleErrorwhen the article body is empty or reduces to empty after prep. The/briefingand/newsdiscuss routes catch it and return 422 with a clean error. No more empty syntheticread_articletool results silently telling the model "the article has nothing in it" and watching it invent content to fill the void. The/newsroute 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_messagematchesARTICLE_DISCUSS_SEEDinsidebuild_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