From 0a4ac439d30f4c1f9a8da820ccc0bc4bb3d76e49 Mon Sep 17 00:00:00 2001 From: ComputelessComputer Date: Mon, 16 Mar 2026 16:24:22 +0900 Subject: [PATCH 1/3] fix: prevent self-redirect loops in prerendered docs routes - Guard section default-page redirects so they only run when the target slug changes - Fix the /docs/cli/ self-redirect that was breaking web prerender and typecheck - Apply the same redirect safety check to company handbook routes --- apps/web/src/routes/_view/company-handbook/$.tsx | 5 +++-- apps/web/src/routes/_view/docs/$.tsx | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/web/src/routes/_view/company-handbook/$.tsx b/apps/web/src/routes/_view/company-handbook/$.tsx index 6dc57719eb..f34e5fc4ba 100644 --- a/apps/web/src/routes/_view/company-handbook/$.tsx +++ b/apps/web/src/routes/_view/company-handbook/$.tsx @@ -9,12 +9,13 @@ export const Route = createFileRoute("/_view/company-handbook/$")({ beforeLoad: ({ params }) => { const splat = params._splat || ""; const normalizedSplat = splat.replace(/\/$/, ""); + const defaultPage = handbookStructure.defaultPages[normalizedSplat]; - if (handbookStructure.defaultPages[normalizedSplat]) { + if (defaultPage && defaultPage !== normalizedSplat) { throw redirect({ to: "/company-handbook/$/", params: { - _splat: handbookStructure.defaultPages[normalizedSplat], + _splat: defaultPage, }, }); } diff --git a/apps/web/src/routes/_view/docs/$.tsx b/apps/web/src/routes/_view/docs/$.tsx index 36f89f1a3c..94c02f8898 100644 --- a/apps/web/src/routes/_view/docs/$.tsx +++ b/apps/web/src/routes/_view/docs/$.tsx @@ -9,11 +9,12 @@ export const Route = createFileRoute("/_view/docs/$")({ beforeLoad: ({ params }) => { const splat = params._splat || ""; const normalizedSplat = splat.replace(/\/$/, ""); + const defaultPage = docsStructure.defaultPages[normalizedSplat]; - if (docsStructure.defaultPages[normalizedSplat]) { + if (defaultPage && defaultPage !== normalizedSplat) { throw redirect({ to: "/docs/$/", - params: { _splat: docsStructure.defaultPages[normalizedSplat] }, + params: { _splat: defaultPage }, }); } From fc79c2e064a81cbc85a3fe04c43186406d22e6b8 Mon Sep 17 00:00:00 2001 From: ComputelessComputer Date: Mon, 16 Mar 2026 15:51:35 +0900 Subject: [PATCH 2/3] fix: align weekly updates with shipped stable releases - rewrite Feb-Mar weekly update posts to match stable release windows - remove nightly and internal work from public weekly summaries - correct version/date mismatches in the updates timeline --- apps/web/content/updates/2026-02-01.mdx | 30 ++++-------- apps/web/content/updates/2026-02-08.mdx | 38 +++++---------- apps/web/content/updates/2026-02-15.mdx | 53 +++++--------------- apps/web/content/updates/2026-02-22.mdx | 52 ++++---------------- apps/web/content/updates/2026-03-01.mdx | 65 +++++-------------------- apps/web/content/updates/2026-03-08.mdx | 61 ++++------------------- apps/web/content/updates/2026-03-15.mdx | 59 ++++------------------ 7 files changed, 73 insertions(+), 285 deletions(-) diff --git a/apps/web/content/updates/2026-02-01.mdx b/apps/web/content/updates/2026-02-01.mdx index 6415e4d66b..d9add1b3e6 100644 --- a/apps/web/content/updates/2026-02-01.mdx +++ b/apps/web/content/updates/2026-02-01.mdx @@ -3,38 +3,26 @@ title: "Char Weekly: February 1, 2026" date: "2026-02-01" --- -This was a big week for Char. We shipped our v1.0.2 stable release, introduced a new Git plugin, and made several quality-of-life improvements. +This week was centered on one stable release: v1.0.2. It brings a much better recording stack, table support in notes, PDF export, and a round of account and settings improvements. ## v1.0.2 stable release -The v1.0.2 stable release brings months of work from our nightly builds into a production-ready release. +v1.0.2 pulls a lot of recent nightly work into stable. The biggest change is **Acoustic Echo Cancellation (AEC)**, which removes the old mic-only tradeoff when recording both microphone and speaker audio. Recordings are also cleaner overall, with separate stereo channels, WAV output, sleep detection, and smoother audio visualization. -**Acoustic Echo Cancellation (AEC)** is the standout feature. Previously, we used heuristics-based mic-only mode to avoid feedback loops when recording both microphone and speaker audio. AEC eliminates that complexity. You can now record both audio sources simultaneously without echo or feedback. +## Notes and attachments -**PDF export** now includes a metadata cover page with the session title, date, and participants. PDFs save directly to your Downloads folder and open automatically. +The editor now supports **tables**, plus search and replace with case sensitivity. Attachments are also handled more cleanly: pasted images are saved as files inside the session folder instead of being embedded inline, and duplicate filenames are renamed automatically. -**Table support** landed in the editor. You can insert and edit tables directly in your notes, useful for meeting minutes with action items or comparison notes. +## Export and transcript tools -Other improvements in v1.0.2 include sleep detection that stops recording when you close your laptop lid, a redesigned settings panel, and improved authentication that persists across app updates. +**PDF export** now adds a metadata cover page with the session title, date, and participants. PDFs save directly to your Downloads folder and open automatically. We also added the ability to regenerate a transcript from an existing audio file, which makes recovery and cleanup easier when you already have a recording. -## Git plugin +## Settings and account improvements -We introduced a new Git plugin built on gix, a pure Rust implementation of Git. The plugin provides core Git operations with a modular architecture. It's not user-facing yet, but it sets up infrastructure for future version control and collaboration features. - -## Persistent pinned tabs - -Pinned tabs now persist across app restarts. If you pin a session tab, it stays pinned when you reopen the app. - -## Smarter notification filtering - -We centralized our notification policy with explicit skip conditions. Mic notification filtering now reduces noise by avoiding alerts when the app already knows what's happening. - -## Bug fixes - -We fixed a startup issue on macOS where a stale single-instance socket could prevent the app from launching. We also fixed timeline sorting to use event start time as a fallback, improved the feedback submission flow with direct log attachment, and made video chat link visibility adapt to editor width. +The settings screen was redesigned, auth now persists across app updates, and Char stays signed in more reliably when the app is backgrounded. There are also a number of quality-of-life fixes across the timeline, metadata panel, PDF export, calendar sync, and feedback flow. ## What's next -We're continuing to polish the experience and work on some features we're not ready to announce yet. If you're on the nightly channel, you'll see these improvements land incrementally. If you're on stable, v1.0.2 is available now. +We're continuing to ship smaller stable releases more frequently. If you're on stable, v1.0.2 is available now. You can download the latest version from our [changelog](/changelog) or let the app auto-update. diff --git a/apps/web/content/updates/2026-02-08.mdx b/apps/web/content/updates/2026-02-08.mdx index 544215e46e..3af80ebba2 100644 --- a/apps/web/content/updates/2026-02-08.mdx +++ b/apps/web/content/updates/2026-02-08.mdx @@ -3,45 +3,33 @@ title: "Char Weekly: February 8, 2026" date: "2026-02-08" --- -Two stable releases in one week. We shipped v1.0.4 and v1.0.5 back-to-back, bringing a redesigned calendar, backlink mentions, undo delete, and a bunch of quality-of-life improvements. +Three stable releases shipped this week: v1.0.3, v1.0.4, and v1.0.5. The headline items are note recovery, a redesigned calendar, better navigation, and a stronger round of performance fixes. -## Calendar redesign - -The calendar got a complete overhaul. There's now a full calendar interface with a week view, event popovers, and improved navigation controls. You can see your week at a glance and jump directly into upcoming sessions without scrolling through day view. - -We also added the ability to unignore calendar events directly from the sidebar timeline via context menu. If you previously dismissed an event and changed your mind, you can restore it without digging through settings. - -## Backlink mentions +## Notes and navigation -You can now mention notes, people, and companies inline using backlink mentions. Each mention displays a type badge--person, company, or note--so you can see what you're linking to at a glance. This creates a connected knowledge graph across your sessions. +This week added a lot of everyday note-management polish. You can now open notes from a dedicated `Cmd+O` command, keep pinned tabs across restarts, undo deletes with a five-second restore window, and jump back into recently opened notes from the same command palette. Backlink mentions for notes, people, and companies also landed in stable. -## Undo delete - -Deleted notes now show a dissolving animation with a 5-second countdown timer. Hover to pause the countdown and reveal a "Restore" button, or press Cmd+Z to instantly restore. You won't lose work to an accidental delete. - -## Hold-to-quit +## Calendar redesign -We redesigned the Cmd+Q behavior, inspired by Chrome. Instead of immediately hiding the app, you now hold Cmd+Q to quit with a visual overlay showing the progress. This replaces the previous Cmd+Shift+Q shortcut and prevents accidental quits. +The calendar got its biggest update of the week. There's now a full calendar view with a week layout, event popovers, improved navigation, and a context menu for unignoring events directly from the sidebar timeline. We also fixed recurring event duplication and added a manual timezone override for the timeline. -## In-meeting reminder +## Quit behavior and notifications -There's a new experimental notification that alerts you when another app has been using your microphone for 3+ minutes while Char isn't listening. If you forgot to start recording, this nudge will catch it. It's opt-in in the lab settings and still early, but we think it'll be useful. +We changed `Cmd+Q` to a hold-to-quit interaction so accidental quits are much less likely. On the notification side, the experimental in-meeting reminder is now available in lab settings and can alert you when another app has been using your microphone for a while but Char is not recording. ## Performance and stability -Under the hood, we fixed memory leaks from actor subscriptions and timer accumulation, and resolved high CPU usage caused by a MutationObserver watching the entire document tree. We also upgraded to Tauri 2.10.1 and updated several core dependencies including cpal 0.17 for audio handling. +We fixed memory leaks from actor subscriptions and timer cleanup, resolved high CPU usage caused by an overly broad DOM observer, and shipped a Tauri 2.10.1 upgrade. We also fixed duplicate tabs when reopening a note and cleaned up a few markdown and UI regressions. ## Other improvements -- Cmd+Shift+N hotkey to create a new note and start listening in one action -- Recently opened notes now appear in the Open Note dialog (Cmd+O) for quick access -- Manual timezone override in Settings for sidebar timeline display -- Fallback support for local AI models without tool calling (e.g., Gemma via LM Studio) -- Fix for "invalid Refresh Token: Already Used" authentication error -- Fix for opening a note now switching to an existing tab instead of creating a duplicate +- `Cmd+Shift+N` now creates a new note and starts listening in one action +- Dropdown keyboard navigation is better across settings and selectors +- LM Studio errors now point to setup docs instead of failing silently +- Shortcut and tooltip labeling are more consistent across the app ## What's next -We're working on the next round of features. If you're on the nightly channel, you'll see improvements landing daily. If you're on stable, v1.0.5 is available now. +We're continuing to tighten the core note-taking workflow and calendar experience. If you're on stable, v1.0.5 is available now. You can download the latest version from our [changelog](/changelog) or let the app auto-update. diff --git a/apps/web/content/updates/2026-02-15.mdx b/apps/web/content/updates/2026-02-15.mdx index 8f86735a42..af4856b56e 100644 --- a/apps/web/content/updates/2026-02-15.mdx +++ b/apps/web/content/updates/2026-02-15.mdx @@ -3,59 +3,28 @@ title: "Char Weekly: February 15, 2026" date: "2026-02-15" --- -This was a big week. Hyprnote is now Char. Alongside the rebrand, we shipped v1.0.6 and v1.0.7 stable with a completely new search engine, two new speech-to-text providers, and a revamped chat experience — plus a bunch of reliability improvements under the hood. +Two stable releases went out this week: v1.0.6 and v1.0.7. Search is faster, chat is back in experimental form, Mistral transcription support landed, and live transcription is much more resilient when providers fail. -## Hyprnote is now Char +## Search and chat -We've rebranded. All external-facing content, the website, GitHub repo links, and deeplink schemes have been updated to reflect the new Char name. The website banner now reads "Hyprnote is now Char", and char.com redirects are live. If you have existing bookmarks or links, they'll continue to work. You can read more about the reasoning in [our dedicated blog post](/blog/hyprnote-is-now-char). +Search now uses **Tantivy**, which makes indexing faster and results more accurate. The search bar also collapses to an icon by default and expands when you need it, and advanced filters now let you narrow by note type and date range. -## Search, powered by Tantivy +Chat also returned as an experimental feature. It now gets richer session context, and search results inside chat include the surrounding session context too, which makes the responses more useful. -We replaced our search infrastructure with Tantivy, a Rust-native full-text search engine. Indexing is noticeably faster and search results are more accurate when you're looking across your sessions. +## AI and transcription -The search UI also got a refresh. The search bar now collapses to an icon by default and expands on click, giving you more screen real estate. Advanced filters let you narrow results by meeting notes, people, and organizations. Date presets like "Today", "This week", and "This month" are available too. +`Mistral` is now available as a transcription provider, and summary generation can auto-run after transcript upload or batch transcription completes. We also made live transcription failures non-fatal, so the recorder keeps running and the session drops into a degraded mode instead of crashing outright. -## New transcription providers +## Notes, calendar, and onboarding -Two new speech-to-text providers landed this week. Mistral is now available as a transcription provider, and we added a DashScope adapter for Alibaba's Qwen3-ASR model with real-time speech recognition support. You can optimize for cost, quality, or language support depending on your needs. +You can now right-click in the main area to create notes and tabs, bulk-delete sessions from the timeline with undo, and see event descriptions in session metadata chips. The onboarding flow also moved into the main app window, which makes first-run setup feel much more integrated. -We also added a configurable mic active threshold for detection, so you can tune how long the microphone must be active before triggering notifications. +## Settings and fixes -## Chat gets a major overhaul - -Chat is back as an experimental feature, rebuilt from the ground up. The old feedback modal is gone. You now report bugs and suggest features directly through chat. Under the hood, chat uses MCP (Model Context Protocol) tools that can create GitHub issues, add comments, and search existing issues on your behalf. - -Chat can open as a full tab alongside your session tabs, and slash commands give you quick access to common actions. Chat now receives richer session context, so responses are more relevant to what you're working on. Search results within chat include full session context too. - -## Resilient transcription - -Live transcription failures are no longer fatal. If the transcription provider goes down mid-session, the recorder keeps running and the session enters a degraded mode instead of crashing. A visual indicator in the transcript view shows when transcription is operating in degraded mode. - -We also replaced the old ractor-based supervisor with a custom SessionActor that gives us finer-grained, per-actor-type supervision and better fault recovery. - -## Multi-session operations - -You can now select multiple sessions in the timeline and delete them in bulk. The familiar undo toast from single-session delete extends to multi-select as well — hover to pause the countdown, press Cmd+Z to restore. Cleaning up old sessions is much faster this way. - -## Calendar and events - -Calendar event sync is more reliable, especially for timeline and notification interactions. Event descriptions now show up in session metadata chips, so you can see the meeting agenda at a glance without opening the calendar. - -## UI and experience - -- Onboarding has been moved from a separate window into the main app flow, making it feel more integrated -- macOS dock right-click menu now shows "New Note" for quick access -- Context menus are available for creating new notes and tabs via right-click -- Tab bar blur visibility and width have been polished -- Settings UI has been simplified with cleaner labels, timezone selector, and week start configuration -- Auto-focus on the title input when no title is set, so you can start typing immediately - -## Documentation - -We published comprehensive data handling transparency documentation, giving you a clear picture of how Char processes and stores your data. We also added onboarding guides for Cursor and Claude Code in the developer handbook. +Settings got another pass with cleaner labels, better week-start and timezone controls, and a dynamic channel selector on the update download button. We also fixed a long list of stability issues around auth sessions, calendar timeline behavior, exports, and audio device handling. ## What's next -The Char rebrand is just the beginning. We're continuing to expand transcription provider support and polish the chat experience. If you're on the nightly channel, you'll see improvements landing daily. If you're on stable, v1.0.7 is available now. +We're continuing to improve search, transcription reliability, and the chat experience. If you're on stable, v1.0.7 is available now. As always, you can download the latest version from our [changelog](/changelog) or let the app auto-update. diff --git a/apps/web/content/updates/2026-02-22.mdx b/apps/web/content/updates/2026-02-22.mdx index 7897637266..2e0d0fd552 100644 --- a/apps/web/content/updates/2026-02-22.mdx +++ b/apps/web/content/updates/2026-02-22.mdx @@ -3,60 +3,28 @@ title: "Char Weekly: February 22, 2026" date: "2026-02-22" --- -Big week. v1.0.9 stable is out with local speech-to-text via our Cactus engine, keyboard-first navigation across settings, task-aware model routing on the server side, and a proper find-and-replace in the transcript view. A lot of internal plumbing was reworked too — the transcript accumulator was rebuilt, PostHog was migrated to the official client, and Restate was removed entirely. +v1.0.8 stable is out this week. The headline items are local speech-to-text in beta, much stronger transcript search, better AI defaults, and a round of polish across calendar, onboarding, and contacts. ## Cactus: local speech-to-text in beta -The headline feature this week is Cactus, our local inference engine for speech-to-text. Cactus runs Whisper small directly on your Mac — no network requests, no API keys, no data leaving your device. It's English-only for now and still in beta, but it works. +The headline feature this week is **Cactus**, our local speech-to-text engine. It runs Whisper small directly on your Mac, so English transcription can happen without sending audio to the cloud. We also added language-aware provider selection, so Char can choose the right transcription backend automatically based on the language you're working in. -The settings UI shows available Cactus models alongside cloud providers, with disabled models listed so you can see what's coming. Language-aware provider selection means Char automatically picks the best STT backend per language, falling back to cloud providers for non-English languages. Local provider status indicators show whether your engine is running, and model selection is disabled when it's not. +## AI and transcript search -Under the hood, this required significant work on the Cactus bindings — we enforced Sync invariants, guarded callback aliasing, and added proper locking in Drop for soundness. The cactus-model crate was expanded with model metadata and the build system was cleaned up for better upstream portability. We also added end-to-end local STT tests and a CI workflow to keep them passing. +Your default template in settings is now applied automatically to new AI-generated summaries, and summary section headings are produced in the correct language for non-English users. We also cleaned up the AI model lists so deprecated and hidden models are less confusing, and added a new **Memory** tab for custom vocabulary. -## Keyboard-first settings navigation +Transcript search also got a major upgrade. You can now replace text, match case, filter by whole word, and keep search results synchronized between the transcript and editor views. -Settings now supports full keyboard navigation. You can tab through every settings panel, use arrow keys to move between options, and press Enter to toggle or select. This applies across general settings, AI configuration, and lab toggles. It's the kind of thing that should have always been there — now it is. +## Calendar, notes, and onboarding -## Task-aware model routing +Calendar got a visual cleanup, onboarding now shows a proper loading state while fetching calendars, and participant email resolution for Apple Calendar events is more reliable. In notes, `Cmd+Click` now opens links in your default browser, and the session menu adds a quick **Reveal in Finder** action. -The LLM proxy now supports a `x-char-task` header that tells the server what the request is for — chat, enhance, title generation, etc. The server uses this to route requests to the most appropriate model for each task type. This means better results without users needing to manually pick different models for different operations. The API client was updated to pass this header from every call site in the desktop app. +## Smaller improvements -## Find and replace in transcripts - -Transcript search got a major upgrade. You can now replace text, toggle match case, and filter by whole word — all with keyboard shortcuts. Search auto-scrolls to the active result and stays in sync between the transcript and editor views. If you're cleaning up transcripts after a meeting, this makes the workflow significantly faster. - -## AI improvements - -Your selected default template in settings is now automatically applied to all new AI-generated summaries. No more picking the same template every time. We also added fuzzy matching for template headers to work around models with poor instruction following — if the model outputs a slightly different heading, Char still matches it to the right section. - -AI-generated summaries now produce section headings in the correct language for non-English users. The model selectors filter out deprecated and non-chat models, giving you a cleaner list. Gemini 2.0 and 2.5 models (Flash, Pro) were incorrectly hidden and are now visible again. Local provider status for Ollama and LM Studio shows visual indicators so you know if your local setup is actually running. - -A new Memory tab in AI settings lets you define custom vocabulary — useful if you have domain-specific terms that models consistently get wrong. - -## Calendar and contacts - -Calendar got visual polish — cleaner header spacing, improved typography, and better weekend styling. Calendar onboarding shows a proper loading state while fetching calendars. Participant email resolution for Apple Calendar events was improved with a better fallback chain. Long event descriptions no longer overflow in metadata chips and popovers. - -Contact avatars now show colored initials when no profile photo is set, making the contact list easier to scan at a glance. - -## Notes and editor - -`Cmd+Click` on links in the note editor now opens them in your default browser. \"Reveal in Finder\" was added to the session overflow menu for quick file access. The contacts permission request was removed from onboarding — it was unnecessary friction. - -## Onboarding refresh - -The onboarding flow was streamlined with clearer trial status after sign-in. The account step was split into distinct before-login, after-login, and trial components, making each step focused on one thing. The overall flow better guides users through getting started without unnecessary permission requests. - -## Infrastructure - -We migrated to the official posthog-rs 0.4 client, replacing our custom PostHog and feature flag crates. The telemetry opt-out toggle now properly disables usage analytics via PostHog's enable/disable side effect. - -All Restate-related code was removed — the app, crates, CI workflows, and data directories. This simplifies the codebase and removes infrastructure we were no longer using. - -The transcript crate got a full rebuild. A new `TranscriptAccumulator` handles word-level merging, channel splitting, and view generation. The replay example was expanded with cloud correction support and Cactus metrics. The `audio-mime` crate was extracted to deduplicate content type handling across transcribe-cactus and transcribe-proxy. +Contact avatars now fall back to colored initials, telemetry opt-out now properly disables analytics, and the remaining Hyprnote references in the UI were updated to Char. ## What's next -Cactus is English-only today. More languages and larger models are coming. We're also expanding the transcript accumulator to handle more edge cases in live transcription. If you're on the nightly channel, you'll see these improvements landing daily. +Cactus is still early and English-only for now, but it's a big step toward stronger on-device transcription. If you're on stable, v1.0.8 is available now. As always, grab the latest from our [changelog](/changelog) or let the app auto-update. diff --git a/apps/web/content/updates/2026-03-01.mdx b/apps/web/content/updates/2026-03-01.mdx index 532c6fa5f1..440ae6b636 100644 --- a/apps/web/content/updates/2026-03-01.mdx +++ b/apps/web/content/updates/2026-03-01.mdx @@ -3,11 +3,11 @@ title: "Char Weekly: March 1, 2026" date: "2026-03-01" --- -Two stable releases this week — v1.0.9 and v1.0.10 — plus a ton of architectural work underneath. The headline changes: pre-meeting notes now inform AI summaries, Azure LLM providers are supported, chat got UI and bug fix improvements, links behave properly in the editor, and there's a new CLI taking shape. Internally, the codebase went through a major restructuring — feature-based desktop layout, extracted core crates, a new plugin SDK, and a formatter migration from Prettier to oxfmt. +Two stable releases shipped this week: v1.0.9 and v1.0.10. The biggest changes are better AI context, Azure provider support, smarter chat and export flows, and more reliable recording and calendar behavior. ## Pre-meeting notes in AI summaries -If you write notes before a meeting starts, those notes are now passed to the AI as a separate section when generating summaries. This means the AI can distinguish between what you prepared beforehand and what actually came up during the meeting. The result is summaries that better reflect what changed, not just what was discussed. +If you write notes before a meeting starts, those notes are now passed to the AI as a separate section when generating summaries. That gives the model better context about what was planned versus what actually happened in the meeting. ## Azure LLM support @@ -15,69 +15,26 @@ Azure OpenAI and Azure AI Foundry are now supported as LLM providers (beta). If ## Chat refinements -Chat received a round of UI polish and minor bug fixes this week. The experience should feel tighter overall — cleaner layout, better edge case handling. Work is still ongoing to support multiple context sources in a single conversation, which will let you query across sessions rather than just the current one. +Chat now stays visible as a persistent panel instead of a floating overlay, so it remains in context while you work. We also tightened up summary generation and edge-case handling around tab switching. -## Link handling overhaul +## Notes and export -Links in the editor got a complete rework across several PRs. Links now open on hover instead of requiring Cmd+Click — just hover and click the URL to open it. Link text edits automatically update the underlying URL, so you don't end up with stale hrefs. Pressing Enter on an empty line clears active inline formatting (bold, italic, underline). Hover tooltips are correctly positioned for links near the top of the editor, and links no longer bleed into adjacent text when you type near a link boundary. +Links in the editor behave much better now. Link text edits update the underlying URL, hover-to-open replaces the old `Cmd+Click` flow, and inline formatting clears more predictably on empty lines. Session preview cards also got richer, showing note metadata and better snippets. -## Consolidated export +Export is now consolidated behind a single **Export** button where you pick the format and what to include. Playback speed is also configurable directly from the transcript view. -Export options are now behind a single Export button that opens a modal. You pick the format — PDF, TXT, or Markdown — and choose what to include: summary, memos, or transcript. Cleaner than the previous scattered export options. - -## Transcript improvements - -Transcript segmentation was rebuilt to fix incorrect splits between speakers. The underlying transcript crate was simplified significantly — the old accumulator, view, and ID modules were replaced with a cleaner `processor` and `words` module. On the TypeScript side, the transcript package was similarly simplified with better segment-building logic. - -Recordings are now saved as MP3 files instead of the previous format, and playback speed is configurable directly in the transcript view. - -## Calendar and integrations - -Session creation from a calendar event now correctly populates participants from event attendees. Calendar onboarding replaced the dead-end "No calendars found" message with a proper "Request Access to Calendar" button. A new unified calendar abstraction was introduced in the codebase, along with a calendar proxy API and Google Calendar plugin, laying groundwork for richer calendar integrations. - -Integration connections can now be triggered directly from the desktop app. The Nango webhook handling was improved with better support for connection health tracking and refresh failure recovery. - -## Smarter mic detection +## Calendar and recording improvements When mic usage is detected, the notification now lists nearby calendar events so you can jump straight into the right session. This makes the common flow — start a call, get prompted to record — much faster. -## Onboarding polish - -The onboarding flow got visual improvements with clearer step states, checkmark completion indicators, and auto-scroll navigation between steps. Button styles were refreshed across the app with improved visual depth and hover feedback. - -## Desktop restructuring - -The desktop app source was restructured from a type-based layout to a feature-based one. Instead of grouping all components together, all hooks together, etc., code is now organized by feature — session, chat, calendar, settings, search, and so on. This doesn't change anything for users, but it makes the codebase significantly easier to navigate and maintain. - -## New crates and architectural work - -Several internal crates were extracted to make the core logic reusable outside the desktop app: - -- **listener-core**: The audio session lifecycle and STT coordination logic was extracted from the Tauri plugin into a standalone crate, making it usable from the new CLI and future platforms. -- **model-downloader**: Model download management was extracted from the local-stt plugin and unified across both STT and LLM plugins, with a proper download registry and progress tracking. -- **local-model**: A unified type system for local models (both STT and LLM) across the codebase. -- **fs-format**: Defines the on-disk transcript format for plain file storage. -- **apple-calendar**: Extracted from the Apple Calendar plugin for reuse. -- **plugin-sdk**: A new TypeScript SDK for building Char plugins, with event delegation from core crates. - -The `pyannote-cloud` crate was rewritten using progenitor (auto-generated from OpenAPI), and the `cactus-sys` build dependency was removed in favor of the upstream cactus crate. - -## CLI and cross-platform groundwork - -A new CLI app is taking shape with TUI support, theme configuration, model management commands, and a batch transcription mode. The mobile bridge got updated with proper UniFFI best practices, and an `updater-core` crate was drafted for cross-platform update support. A Chrome extension scaffold was also added. - -## Formatter migration - -The codebase migrated from Prettier to oxfmt for TypeScript/JavaScript formatting. This touched hundreds of files but is a one-time change — oxfmt is faster and the formatting rules are configured in `.oxfmtrc.json`. +Session creation from calendar events now picks up participants more reliably, calendar onboarding shows a proper **Request Access to Calendar** button when permissions are missing, and recordings are now saved as MP3. ## Other fixes - Auth flow fixed when the user was already logged into char.com in their browser -- "Resume listening" now appears in the overflow menu when a transcript already exists -- AI generation is more resilient when output validation retries exhaust — gracefully yields instead of erroring - Detect notifications setting is now properly respected -- Remaining "Hyprnote" references renamed to "Char" across the UI and docs -- OpenRouter Zero Data Retention (ZDR) enforcement documented in FAQ and docs -- ONNX runtime returned to static linking for simpler distribution +- Integration connections can now be triggered directly from the desktop app +- Typing `@` with no query now shows default mention suggestions +- List and task items are handled more reliably in structured notes Full version details on the [changelog](/changelog). diff --git a/apps/web/content/updates/2026-03-08.mdx b/apps/web/content/updates/2026-03-08.mdx index 088af9cd7e..ab10183ecc 100644 --- a/apps/web/content/updates/2026-03-08.mdx +++ b/apps/web/content/updates/2026-03-08.mdx @@ -3,7 +3,7 @@ title: "Char Weekly: March 8, 2026" date: "2026-03-08" --- -Three releases this week — v1.0.11, v1.0.12, and v1.0.13-nightly.1 — covering Google Calendar sync, chat that can edit your notes, a rebuilt WebSocket client, custom storage locations, and a new speaker segmentation engine. Under the hood: major observability improvements, audio pipeline optimizations, and the CLI continues to take shape. +Two stable releases shipped this week: v1.0.11 and v1.0.12. Google Calendar sync is now in beta, chat can edit notes directly, and batch transcription is much more reliable. ## Google Calendar sync @@ -11,64 +11,21 @@ Google Calendar events now sync into Char alongside Apple Calendar. If your team ## Chat edits your notes directly -Chat can now edit your summaries in place. Ask it to revise a section, reformat bullet points, or expand on a topic, and it applies the changes directly to your notes. A new context indicator shows which session the chat is working with, so you always know what it has access to. Chat also suggests one-click starter prompts — summaries, action items, follow-up emails, key decisions — so you can get useful output without typing a prompt from scratch. +Chat can now edit your summaries in place. Ask it to revise a section, reformat bullets, or expand on a topic, and it applies the changes directly to your notes. A new context indicator shows which session chat is working with, and starter prompts make common actions one click away. -## Custom storage location +## Notes and export -You can now choose where Char stores your content. In Settings, pick any folder on your device — a synced drive, a NAS, wherever you want your files to live. When you move your content, Char copies existing sessions to the new location before restarting. This is a direct response to users who want their markdown files in a specific place — an Obsidian vault, a Dropbox folder, or a company-managed directory. - -## Search moves to the sidebar - -Search now lives in the left sidebar instead of opening as a separate view. You can switch between recent activity and search results without losing your place. It's a small layout change but makes the common flow — glance at timeline, search for something, go back — much smoother. +This week also added Org mode export, proper code block support in the editor, richer session preview cards, plain-text mention export for Markdown, and short tips while AI is generating summaries. ## Batch transcription reliability -Batch transcription got significant work this week across multiple PRs. Local model transcription (Cactus) is more reliable for multi-channel recordings, with better error handling for provider failures. Failed transcript runs now show clearer error messages when you retry, and re-running a transcript no longer clears the old one before the new run starts. The batch processing pipeline was restructured with a proper accumulator, dedicated actor, and bootstrap module. - -## Custom vocabulary for local models - -Cactus now supports custom vocabulary. If you have domain-specific terms — product names, technical jargon, acronyms — you can tell the local STT engine about them so it transcribes them correctly. This works for both batch and streaming transcription. - -## New export format: Org mode - -Org mode (`.org`) is now available as an export format alongside PDF, TXT, and Markdown. If you live in Emacs, your meeting notes can go straight into your org workflow. - -## Transcript post-processing with JSON Patch - -A new experimental feature uses AI to post-process transcripts via JSON Patch operations. Instead of regenerating the entire transcript, the AI suggests targeted corrections — fixing names, technical terms, or formatting — that are applied as patches. This keeps the original transcript intact while improving accuracy where it matters. - -## WebSocket client rebuild - -The WebSocket client used for cloud transcription providers was rebuilt with proper retry logic, structured error types, and configurable connection policies. Connections now recover gracefully from transient failures instead of dropping the session. Backpressure handling was added to the WebSocket utilities so audio streams don't overwhelm slower consumers. - -## Audio pipeline optimizations - -The audio capture pipeline got a performance pass. New async and real-time ring buffer implementations replace the previous approach, with dedicated optimizations for both microphone and speaker capture paths. The resampler was extracted into its own crate and upgraded to Rubato v1. These changes reduce latency and CPU usage during live transcription. - -## Speaker segmentation engine - -A new ONNX-based speaker segmentation crate landed. This is the foundation for improved speaker diarization — telling apart who said what in a multi-person conversation. The segmentation model runs locally and includes benchmarks and snapshot tests for English and Korean audio. An embedding crate was also added for speaker identification. - -## Observability across the stack - -OpenTelemetry instrumentation was added across the API server, desktop app, and web app. Every transcription request, LLM call, and API interaction now produces structured traces. This doesn't change anything for end users, but it means we can diagnose issues faster when something goes wrong with cloud transcription or AI generation. The desktop app sends trace context with AI requests so we can correlate frontend actions with backend processing. - -## Timeline timezone awareness - -The Today timeline now places the current-time marker more accurately, including during ongoing events. It also respects your selected timezone, so the "now" indicator is correct even if your system timezone differs from your calendar timezone. +Batch transcription is more reliable, especially when providers fail or you retry an existing run. Re-running a transcript no longer clears the old transcript before the new one actually starts, and Parakeet is now available as a local transcription model option in Cactus. ## Other improvements -- Session preview cards show richer previews with enhanced notes and Markdown formatting -- Hashtag parsing now correctly ignores URL fragments (no more false hashtags from links) -- Clickable links in calendar event descriptions -- Code blocks properly supported in the note editor -- Mentions exported as plain text in Markdown -- Short tips displayed while AI generates summaries -- Floating chat modal resize constraints removed for more flexible positioning -- Outlook Calendar plugin added (early stage) -- Chrome extension gained unit tests with DOM fixture generation for Google Meet -- Privacy FAQ updated to explain network activity more clearly -- Parakeet added as a new local transcription model option in Cactus +- Calendar event descriptions now render clickable links +- Search and replace behaves more reliably across notes and transcripts +- Folders get a cleaner placeholder state while we prepare a larger update +- Failed batch transcription no longer resets the in-progress work Full version details on the [changelog](/changelog). diff --git a/apps/web/content/updates/2026-03-15.mdx b/apps/web/content/updates/2026-03-15.mdx index 1bd42bbc1b..a4ff23abcd 100644 --- a/apps/web/content/updates/2026-03-15.mdx +++ b/apps/web/content/updates/2026-03-15.mdx @@ -3,74 +3,35 @@ title: "Char Weekly: March 15, 2026" date: "2026-03-15" --- -One stable release this week — v1.0.14 — alongside massive work on the transcript engine, the CLI, and audio infrastructure. The headline: the Hyprnote-to-Char rename is now handled automatically during updates, images in notes are resizable, you can connect multiple Google Calendar accounts, and the transcript view was rebuilt from the ground up. +Two stable releases shipped this week: v1.0.13 and v1.0.14. The biggest changes are custom storage locations, multiple Google Calendar accounts, resizable images in notes, and a stronger recording flow. -## Hyprnote is now Char — seamless migration +## Storage and navigation -v1.0.14 handles the app rename automatically. When you update, Char migrates the macOS app bundle from "Hyprnote" to "Char" behind the scenes — no manual steps, no data loss. The migration runs at startup and covers both stable and nightly update channels. If you're still on an older version, just update and everything carries over. +You can now choose a custom location for your Char content in Settings, and detected Obsidian vaults are offered as a quick destination. Search also moved into the left sidebar, which makes it much easier to jump between recent activity and search results without leaving your place. -## Resizable images in notes +Folder moves and renames are also more reliable now because filesystem changes are applied before app state updates. The Today timeline's current-time marker is more accurate as well, especially during ongoing events and in your selected timezone. -Images you paste or drag into the note editor can now be resized by dragging their edges. This works in both the desktop note editor and the blog editor on the web. Image metadata (alt text, dimensions) is stored alongside the content, so your layout is preserved when you reopen a session. +## Hyprnote is now Char -## Multiple Google Calendar accounts +This release also carries the Hyprnote-to-Char rename through the stable app. Existing users can update without changing how they work, and the app now consistently presents itself as Char. -You can now connect more than one Google Calendar account at the same time. If you use separate calendars for work and personal life — or manage multiple Google Workspace accounts — they all sync into the Char timeline. Connected account email addresses are now displayed in account settings so you can see exactly which accounts are linked. +## Calendar and notes -## Rebuilt transcript view +You can now connect multiple Google Calendar accounts at the same time, and account settings show which email address each connection belongs to. In notes, images are now resizable, underline exports correctly to Markdown, and note previews are cleaner. -The transcript UI was restructured significantly this week. The renderer, search, and editing logic were broken into smaller, focused modules — dedicated hooks for viewport tracking, segment rendering, and word-level selection. Search got its own context and matching engine, and editing uses a cleaner hook-based architecture. The result is a transcript view that's faster to render and easier to extend. For users, the visible change is smoother scrolling and more responsive search-and-replace in long transcripts. +## Recording and UI -## Folder operations are now filesystem-first - -Moving and renaming folders now writes to the filesystem before updating app state. Previously, the app state could update before the filesystem caught up, leading to brief inconsistencies. This also means folder renames are more reliable when your storage is on a slower drive or network mount. - -## Onboarding polish - -The onboarding flow got a visual refresh — clearer step states, a new video walkthrough, and improved Apple Calendar permission prompts. The calendar onboarding step now shows a proper loading state while fetching calendars, and the permission request is more explicit about what access Char needs. - -## Obsidian vault picker in settings - -The storage settings now list detected Obsidian vaults as quick-pick destinations. If you already use Obsidian, you can point Char at your vault with one click instead of manually navigating to the folder. This also works during onboarding. - -## Chat UI refinements - -Chat received another round of polish. Auto-scroll behavior is smarter — it tracks whether you've scrolled up and doesn't jump you back to the bottom mid-conversation. The chat header handles long titles without overflowing, the panel no longer expands off-screen when there isn't enough room, and various layout fixes across the chat body, context bar, and input area make the whole experience tighter. - -## Session preview images - -Note preview cards in the sidebar and tab bar now render images embedded in your notes. If you pasted a screenshot or diagram into a session, it shows up in the preview instead of just text. This makes it easier to visually distinguish sessions at a glance. - -## Transcript engine rewrite (Rust) - -Under the hood, the `transcript` crate was rewritten. Speaker labeling, segment collection, word stitching, and normalization each got their own module. The processor now handles multi-speaker conversations more accurately, with proper segment boundaries and speaker assignment. This is the foundation for better diarization and transcript accuracy going forward. - -## CLI overhaul - -The CLI saw a major overhaul this week. The `transcribe-cli` crate was merged into the main CLI app, a new `chat` command was added, and the `listen` command got a waveform visualizer and restructured TUI. Model management was simplified, debug commands were reorganized under a `debug` subcommand with dedicated audio and client tooling, and an npm distribution package was scaffolded for easier installation. The CLI also gained a session context runtime and dedicated Cactus runtime for local transcription. - -## Mock audio for testing - -A new `audio-mock` crate enables testing audio pipelines without real hardware. It plays back pre-recorded MP3 files through the same `AudioInput` interface that real microphones and speakers use, which means the listener plugin, CLI, and desktop app can all run integration tests with deterministic audio. Test fixtures with English audio and pyannote speaker annotations were added to the data crate. - -## Cactus v1.11 with timestamps - -The Cactus local STT engine was updated to v1.11, which adds word-level timestamp support. Live transcription sessions now get timing data from the local model, enabling synchronized playback highlighting and more accurate segment boundaries. A new live transcription example was added for testing the streaming path. +Creating a new note now automatically starts recording, audio can stay in memory with a disk fallback when needed, and on-device transcription now returns word-level timestamps. `App Settings` is also now the primary settings view, and several chat and header UI issues were cleaned up. ## Other improvements -- App Settings is now the primary settings view, with account settings integrated directly - Permission detection on macOS now uses an external binary, fixing edge cases where the in-process check could hang - Meeting countdown timer and autostart for upcoming calendar events -- Creating a new note now automatically starts recording -- In-memory audio recording with automatic disk fallback when a session degrades - Listen button styling blends with the background for a cleaner header look - AI button now has a visible label - Undo-delete toast positioning adjusted to avoid overlapping content -- Underline formatting now exports correctly to Markdown - Timeline sidebar items use clearer, more intuitive wording - Fixed duplicate calendar attendee when the organizer was also synced as a participant -- Vite upgraded to v8 across the monorepo - Changelog rendering migrated to Streamdown and shared between desktop and web Full version details on the [changelog](/changelog). From 5047a217f2983f95587c5dd20fcde62124f8f10c Mon Sep 17 00:00:00 2001 From: ComputelessComputer Date: Mon, 16 Mar 2026 16:30:10 +0900 Subject: [PATCH 3/3] fmt --- apps/cli/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/cli/Cargo.toml b/apps/cli/Cargo.toml index 158f11c979..9f617ecb3e 100644 --- a/apps/cli/Cargo.toml +++ b/apps/cli/Cargo.toml @@ -72,8 +72,8 @@ url = { workspace = true } uuid = { workspace = true, features = ["v4"] } [dev-dependencies] -cli-docs = { path = "../../crates/cli-docs" } clap_complete = { workspace = true } +cli-docs = { path = "../../crates/cli-docs" } clio = { version = "0.3", features = ["clap-parse"] } strum = { workspace = true, features = ["derive"] } url = { workspace = true }