• v0.2.0 8bb8b6dd55

    v0.2.0
    Some checks failed
    check-secrets / Nosey parker (push) Successful in 3s
    Publish release artifacts / Build + publish lets-chat-desktop binaries (push) Failing after 3s
    check-secrets / Kingfisher (push) Successful in 9s
    check-secrets / TruffleHog (push) Successful in 16s
    Build desktop (Windows) / Build desktop (Windows x86_64) (release) Successful in 3m36s
    Build desktop (Linux) / Build desktop (Linux x86_64) (release) Successful in 4m55s
    Check / clippy + fmt + tests (push) Successful in 5m56s
    Build desktop (Windows) / Build desktop (Windows x86_64) (push) Successful in 8m36s
    Build OCI container / Build and push lets-chat (push) Successful in 12m5s
    Build desktop (Linux) / Build desktop (Linux x86_64) (push) Successful in 15m16s
    Stable

    David released this 2026-07-23 05:41:48 +02:00 | 190 commits to main since this release

    Changelog

    8bb8b6dd Merge pull request 'Release v0.2.0' (#581) from release/v0.2.0 into main
    aa755a55 Release v0.2.0
    db192d53 Merge pull request 'Reactions on thread replies, in their own id namespace (LC-595)' (#580) from feat/lc595-thread-reactions into main
    120c7096 feat(reactions): reactions on thread replies, in their own id namespace (LC-595)
    c0960d00 Merge pull request 'STT cost/load control: bounded concurrency, rate limits, scope gating (LC-592)' (#579) from feat/lc592-stt-load-control into main
    a4b430f6 feat(stt): bound STT concurrency, rate, and scope (LC-592)
    5ca2d38d Merge pull request 'STT reliability: timeout, retry, and surfaced failure state (LC-590)' (#578) from feat/lc590-stt-reliability into main
    57f5b364 feat(stt): timeout, retry, and surfaced transcription failures (LC-590)
    a456a957 Merge pull request 'STT provider seam with native Deepgram support (LC-593)' (#577) from feat/lc593-stt-providers into main
    f6207c32 feat(stt): provider seam with native Deepgram support (LC-593)
    31e3b434 Merge pull request 'STT language + prompt hinting and real segment timestamps (LC-591)' (#576) from feat/lc591-stt-accuracy into main
    c9d41fb0 feat(stt): language + prompt hinting and real segment timestamps (LC-591)
    299efaa5 Merge pull request 'Extract the shared bus-drain and control-dispatch machinery (LC-616)' (#575) from refactor/lc616-rtc-machinery into main
    5dfa68fa refactor(rtc): extract the shared bus-drain and control-dispatch machinery (LC-616)
    2b651922 Merge pull request 'Unify the call/huddle session lifecycle across the clients (LC-613)' (#574) from refactor/lc613-converge-rtc-clients into main
    2035f1b7 refactor(rtc): unify the call/huddle session lifecycle across the clients (LC-613)
    4788c6b0 Merge pull request 'Cover the 1:1 ring and huddle WS handlers (LC-614)' (#573) from test/lc614-call-huddle-coverage into main
    82b46e08 test(call): cover the 1:1 ring and huddle WS handlers (LC-614)
    b1181b7f Merge pull request 'Show an in-call indicator when a room has an active huddle (LC-612)' (#572) from feat/lc612-sidebar-incall into main
    47c40a40 feat(sidebar): show an in-call indicator when a room has an active huddle (LC-612)
    cb0a98e4 Merge pull request 'Carry huddle media over the SFU when LiveKit is configured (LC-610)' (#571) from feat/lc610-sfu-huddle-media into main
    efb81bff feat(huddle): carry huddle media over the SFU when LiveKit is configured (LC-610)
    2aa94c7c Merge pull request 'Ring room members when a huddle starts (LC-611)' (#570) from feat/lc611-huddle-ring into main
    396bee65 feat(huddle): ring room members when a huddle starts (LC-611)
    0694c301 Merge pull request 'Mint SFU tokens for huddles, and stop stages colliding with them (LC-596)' (#569) from feat/lc596-sfu-huddle-tokens into main
    ccd9649b feat(huddle): mint SFU tokens for huddles, and stop stages colliding with them (LC-596)
    aef25047 Merge pull request 'Transcribe a Stage, gated to whoever holds the floor (LC-597)' (#568) from feat/lc597-stage-transcription into main
    5a82f556 feat(stage): transcribe a Stage, gated to whoever holds the floor (LC-597)
    9e2f8b1d Merge pull request 'Tell an unkeyed build why it cannot self-update (LC-607)' (#567) from fix/lc607-updater-fails-before-network into main
    08b4f0e9 fix(desktop): tell an unkeyed build why it cannot self-update (LC-607)
    b2456479 Merge pull request 'Drop the DELETE FROM rooms crutch from the onboarding fixture (LC-603)' (#566) from test/lc603-onboarding-reachability into main
    ddec0a54 test(home): drop the DELETE FROM rooms crutch from the onboarding fixture (LC-603)
    81f651dd Merge pull request 'Make the login-approval attempt cap atomic (LC-608)' (#565) from fix/lc587-atomic-attempt-cap into main
    cc3f5835 fix(auth): make the login-approval attempt cap atomic (LC-608)
    3a050333 Merge pull request 'Fail fast on missing psa-systems org secrets, and stop shipping the old org's update URL (LC-594)' (#564) from chore/lc594-psa-systems-ci-secrets into main
    0abe6bbf fix(ci): correct the package owner to psa-systems-private
    ded73692 chore(ci): fail fast on missing psa-systems org secrets, fix stale update URL
    f602242e Merge pull request 'Gate DM Delete on the effective room role, not the org role (LC-599)' (#563) from fix/lc599-dm-delete-uses-effective-role into main
    fb812cff fix(dm): gate Delete on the effective room role, not the org role
    e612bb6c Merge pull request 'Scope the remaining room-visibility queries to the viewer's enclaves (LC-606)' (#562) from fix/lc606-scope-remaining-room-queries into main
    cc851be1 fix(db): scope the remaining room-visibility queries to the viewer's enclaves
    c4c64938 Merge pull request 'Run the integration tests in CI, and make the fixture check real (LC-605)' (#561) from fix/lc605-ci-runs-integration-tests into main
    b242f179 ci: run the integration tests, and make the fixture check real
    9590fcee Merge pull request 'Scope unread inbox + dashboard queries to the viewer's enclaves (LC-604)' (#560) from fix/lc604-inbox-enclave-scoping into main
    550069c2 fix(inbox): scope unread queries to the viewer's enclaves
    98a05c65 Merge pull request 'Cover both branches of / after the LC-575 dashboard (LC-600)' (#558) from fix/lc600-home-branch-tests into main
    9bbadc1c Merge pull request 'fix(auth): make login-approval consume atomic to close a TOCTOU (LC-601)' (#557) from fix/LC-601-login-approval-consume-toctou into main
    dfae0903 test(home): cover both branches of / after the LC-575 dashboard
    b1ce19e7 fix(auth): make login-approval consume atomic to close a TOCTOU (LC-601)
    28352522 Merge pull request 'Group the message overflow menu into scannable sections (LC-598)' (#556) from feat/lc-message-menu-grouping into main
    744bfc08 feat(room): group the message overflow menu into scannable sections
    4018da48 Merge pull request 'fix(ci): use the psa-systems package vars after the org move' (#554) from fix/ci-psa-systems-package-vars into main
    67d45da6 Merge pull request 'feat(auth): notify-and-approve gate for suspicious logins (LC-587)' (#555) from feat/LC-587-suspicious-login-approval into main
    add21bb0 feat(auth): notify-and-approve gate for suspicious logins (LC-587)
    770f3cbe fix(ci): use the psa-systems package vars after the org move
    526b6e49 Merge pull request 'Reactions that actually work, sidebar expand ribbon, huddle transcription' (#553) from feat/sidebar-collapse-ribbon into main
    15edf7d6 style(reactions): rustfmt the toggle_reaction insert
    0b05fbcc feat(transcription): support transcription in huddles
    03c8cd4f feat(sidebar): expand the collapsed sidebar from a ribbon on the rail seam
    0f34bf5c fix(reactions): atomic toggle + populate the one-tap quick-react bar
    0a153a1f feat(reactions): working emoji picker from the hover bar; conditional add-more
    1b61c3cc feat(settings): dismiss the settings page by clicking outside it or Escape
    e1c66b23 fix(thread): make typed text visible in the thread reply box
    25557987 Merge pull request 'Redesign chat UI to the prototype: rail, sidebar, panels, composer, settings' (#552) from fix/lc-576-active-row-invert into main
    3d57cb17 fix(composer): stop clipping the paperclip attachment icon
    a8a7db56 feat(thread): emoji picker for thread replies; fix attachment clipping
    28cdbe33 style(header): space between the # and the room name
    822ec4de style(timeline): merge adjacent mentioned messages into one accent block
    9b8c5044 style(composer): shrink the attachment icon so it doesn't clip
    06913c8f fix(sidebar): draft indicator is an SVG pencil, not a tofu dingbat
    963188bd style(settings): full-bleed palette preview cards
    1bc3da09 fix(rail): hide the profile hovercard while the account menu is open
    c59ee614 feat(room): close Details/Thread with an X; info toggles Details
    cab27504 style(composer): stopwatch glyph for the self-destruct timer
    54afdc4d feat(sidebar): render the @-mention badge on DM rows
    64e5662f style(composer): rework the self-destruct timer into a clock popover
    9624a579 feat(room): header member avatar stack and correct public-room member count
    49efc47e style(settings,sidebar): 4-up palette cards; shorter search placeholder
    c36ce47f feat(dev): mock OIDC can authenticate multiple identities
    5a0f29cc feat(room,sidebar): right-column collapse, platform-aware ⌘K, search icon
    df04002a style(settings): mini-window palette preview cards
    8d233a68 style(thread): accent-color the replied-to name in the thread header
    ed26a2fb feat(rail): curated settings dropdown and avatar hovercard
    8dd411eb style(details,rail): notifications dropdown chevron; accent unread badge
    99ae64c7 style(settings,timeline): comp-style Appearance controls; bare day divider
    fb72feb0 style(sidebar): add ⌘K search hint chip and focus binding
    4f8c5eff Merge remote-tracking branch 'origin/main' into fix/lc-576-active-row-invert
    06df7325 Merge pull request 'fix(auth): link bunyip_sub onto an existing verified-email account on SSO (LC-588)' (#551) from fix/LC-588-sso-email-link into main
    27b1df29 fix(auth): link bunyip_sub onto an existing verified-email account on SSO (LC-588)
    cf67ebcd Merge pull request 'feat(auth): alert users on a new-country login (LC-580)' (#550) from feat/lc580-login-location-alerts into main
    f4072213 fix(auth): show the full country name in the login-location alert (LC-580)
    11ee2e0a feat(auth): alert users on a new-country login (LC-580)
    d498e740 Merge pull request 'feat(dev): mock OIDC OP can authenticate for the local dev stack (LC-577)' (#549) from feat/lc577-mock-oidc-auth into main
    1135afd6 feat(dev): make the mock OIDC OP able to actually authenticate
    cb0080ec Merge pull request 'feat(enclave): surface configurable enclave icon on the settings page (LC-542)' (#548) from feat/lc542-enclave-icon-settings into main
    9b1b5344 feat(enclave): surface configurable enclave icon on the settings page (LC-542)
    fc3917cd Merge pull request 'fix(sidebar): invert glyph, draft pencil, and DM status on active row (LC-576)' (#547) from fix/lc576-active-row-invert into main
    d11c96b6 fix(sidebar): invert glyph, draft pencil, and DM status on active row (LC-576)
    a84a1481 Merge pull request 'feat(home): Home dashboard (catch-up) + "Open on" landing preference (LC-575)' (#546) from feat/lc575-home-dashboard into main
    359e8f73 feat(home): Home dashboard (catch-up) + "Open on" landing preference (LC-575)
    6db89f97 Merge pull request 'fix(i18n): correct Spanish room-details-pinned-yes to «Sí» (LC-579)' (#545) from fix/lc-579-es-pinned-yes-accent into main
    6839c2ec fix(i18n): correct Spanish room-details-pinned-yes to «Sí» (LC-579)
    689a055f Merge pull request 'chore(css): remove dead .lc-empty-wrap helper (LC-578)' (#544) from chore/lc-578-remove-dead-lc-empty-wrap into main
    5d470673 chore(css): remove dead .lc-empty-wrap helper (LC-578)
    bdee3bc3 feat(ui): one profile control in the rail, and rail ordering
    7a83cd96 feat(ui): one right column of subcards, and rail cleanup
    079ad180 feat(ui): restructure the sidebar and room header to the prototype
    8f736f21 feat(dev): make the mock OIDC OP able to actually authenticate
    a270f720 fix(ui): invert active-row glyphs and align thread/details/header to the prototype
    5e327d68 Merge pull request 'Apply the prototype new look across Let's Chat (phased)' (#539) from feat/lc-ui-port into main
    850a3f5d Merge branch 'main' into feat/lc-ui-port
    cee7ac0c Merge remote-tracking branch 'origin/main' into feat/lc-ui-port
    1b9c193e Merge pull request 'Rewrite Phase 3 plan with verified literal pixel-match gaps' (#538) from docs/pixel-match-phase3-literal-gaps into main
    0aec7dc4 test(chat): regenerate message fixtures for the new row geometry
    43eef075 Merge branch 'main' into docs/pixel-match-phase3-literal-gaps
    3bc4a417 style(room): give the room-info page the prototype hero
    03740847 test(dev): mirror the chat surface into the theme gallery
    5917e452 Merge pull request 'feat(composer): one-row restructure (LC-574)' (#543) from feat/lc574-composer-onerow into main
    3211d38f style(chat): reconcile the chat surface to the prototype
    d2204602 feat(composer): one-row restructure (LC-574)
    c8f075f9 feat(theme): server-persisted UI scaling (compact/default/large/xl)
    e7dddbff Merge pull request 'feat(timeline): polish room message hierarchy (LC-558)' (#542) from feat/lc558-timeline-polish into main
    33486fef feat(timeline): polish room message hierarchy (LC-558)
    b120661f Merge pull request 'fix(a11y): call-button 44x44 tap targets on touch (LC-573)' (#541) from feat/lc573-call-button-tap-targets into main
    a5f51a64 fix(a11y): call-button 44x44 tap targets on touch (LC-573)
    49acefb3 Merge pull request 'feat(admin): shared page-header component (LC-572)' (#540) from feat/lc572-admin-page-header into main
    385a81c2 feat(admin): shared page-header component (LC-572)
    07eeeb97 style(theme): contrast + surface-separation fixes across all palettes
    4da139ee docs(plan): rewrite Phase 3 with verified literal pixel-match gaps
    4bfca656 Merge pull request 'Mockup pixel-match: amethyst palette + room Details panel' (#537) from docs/lets-chat-mockup-pixel-match into main
    133e242e Merge branch 'main' into docs/lets-chat-mockup-pixel-match
    a770e987 Merge pull request 'docs: redesign completion roadmap + LC-UI tail reconcile' (#536) from docs/LC-553-redesign-tail-roadmap into main
    e6cb452f feat(dev): mock OIDC OP so dev-web-local boots without bunyip
    d2e30e67 docs(lets-chat): note SSO env requirement for local boot
    aeea958a docs(lets-chat): overnight progress log + morning screenshot checklist
    b6cc3b99 style(connection): theme the connection-status banner via tokens
    5d832fe7 feat(room): mount Details panel in the room right column
    88b81b9a feat(room): add Details panel partial
    510a3fd7 feat(room): add Details panel locale keys
    142c90ff refactor(room): expose member count and pinned flag to the room page view
    6ef017f1 fix(theme): render amethyst on load and tint its hc-dark accent surface
    9edd1d01 feat(theme): show amethyst in dev theme gallery
    bc94a7ff feat(theme): add amethyst swatch to settings picker
    682df62e feat(theme): allow amethyst palette in backend validation
    df605acc test(theme): cover amethyst palette in contrast checker
    2f0e88dd feat(theme): add amethyst violet palette tokens
    c54dba37 docs(lets-chat): plan the mockup pixel-match overhaul
    84cf107e docs(redesign): completion roadmap + tail reconcile
    14103395 Merge pull request '44px touch targets on the redesign icon controls (coarse pointer)' (#535) from feat/mobile-tap-targets into main
    b20f16f2 feat(a11y): 44px touch targets on the redesign icon controls (coarse pointer)
    a19f294b Merge pull request 'Migrate hand-rolled callout boxes to the .alert component (redesign follow-up)' (#534) from refactor/alert-component-migration into main
    1491843a refactor(ui): migrate hand-rolled callout boxes to the .alert component
    19e2f028 Merge pull request 'LC-565: a11y regression pass - composer focus ring + phantom danger token (redesign P5)' (#533) from fix/LC-565-a11y-regression-pass into main
    eda0b36f fix(a11y): composer focus ring + fix phantom danger-surface-content token (LC-565 / LC-UI-12)
    350966a2 Merge pull request 'LC-564: route login + welcome errors through the shared alert (redesign P5)' (#532) from feat/LC-564-entry-surface-alignment into main
    046fa0dc feat(entry): route login + welcome errors through the shared alert (LC-564 / LC-UI-11)
    79a5a4c2 Merge pull request 'LC-561: unify admin status indicators onto one chip vocabulary (redesign P3)' (#531) from feat/LC-561-admin-status-chips into main
    82b7251e feat(admin): unify status indicators onto one status-chip vocabulary (LC-561 / LC-UI-08)
    7b177512 Merge pull request 'LC-557: tokenize empty-state color residuals (redesign P3)' (#530) from fix/LC-557-empty-state-residuals into main
    bfbf2ebb fix(ui): tokenize empty-state color residuals (LC-557 / LC-UI-04)
    b860c6d9 Merge pull request 'LC-559: lift the composer onto an elevated card (redesign P2)' (#529) from feat/LC-559-composer-polish into main
    0e99d2b0 feat(composer): lift the composer onto an elevated card (LC-559 / LC-UI-06)
    9dd20357 Merge pull request 'LC-566: six-palette theme system foundation (redesign P1)' (#528) from docs/LC-541-redesign-p1-foundation into main
    e0fd465c fix(theme): persist palette on select; darkMode hc-dark
    8f5101a2 fix(theme): repoint JS data-theme reads to data-mode
    8641ce03 feat(theme): add .lc-table; retune radii/shadow
    b29d7d25 fix(theme): HC accent AAA + max-contrast ring
    1d1202d2 feat(theme): dev theme/component gallery
    388dcd63 fix(i18n): add es keys for palette picker
    b7e12fe4 feat(theme): appearance picker with palette swatches
    6c5f4cb9 feat(theme): two-axis no-flash bootstrap (palette + mode)
    ceff72f2 feat(theme): add 5 palettes across light/dark/hc
    fc0ee383 refactor(theme): split tokens into constant + palette layers
    8591825b feat(theme): key Tailwind dark: on data-mode
    4d6247d2 feat(theme): sync lc-mode + lc-palette cookies cross-device
    ad4ff3da feat(theme): persist palette; rename mode cookie to lc-mode
    142fefab feat(theme): db setters for mode + palette
    f8d78a35 feat(theme): mode + palette accessors on User
    c02de9d5 feat(theme): split theme pref into mode + palette
    39cb409f docs(redesign): P1 foundation implementation plan
    5c9c1b12 docs(redesign): P1 foundation design spec
    12da86bb Merge pull request 'fix(room): tokenize the inline edit form (LC-558)' (#527) from feat/LC-558-timeline-polish into main
    bb733f94 fix(room): tokenize the inline edit form so it themes correctly (LC-558 / LC-UI-05)
    183d9e81 Merge pull request 'feat(sidebar): dark-navy Blue Harbor sidebar + rail (LC-560)' (#526) from feat/LC-560-navy-sidebar into main
    9811b614 Merge pull request 'feat(css): add .alert* + layout-helper component classes (LC-555)' (#524) from feat/LC-555-alert-classes into main
    08b3718b Merge remote-tracking branch 'origin/feat/LC-555-alert-classes' into feat/LC-555-alert-classes
    a5ff2636 Merge remote-tracking branch 'origin/main' into feat/LC-555-alert-classes
    f604320e feat(sidebar): dark-navy Blue Harbor sidebar + rail in all themes (LC-560 / LC-UI-07)
    21e202b1 Merge pull request 'feat(css): add .lc-page-* width + layout utilities (LC-562)' (#525) from feat/LC-562-page-width-utils into main
    0ef4bb19 feat(css): add .lc-page-* width + layout utilities (LC-562 / LC-UI-09)
    1ee70a70 Merge branch 'main' into feat/LC-555-alert-classes
    4c65e961 feat(css): add .alert* + layout-helper component classes (LC-555 / LC-UI-02)
    e5a7dcb9 Merge pull request 'feat(css): add --sidebar-* chrome tokens (LC-554 phase 1b)' (#523) from feat/LC-554-sidebar-tokens into main
    73a15b8e feat(css): add --sidebar-* chrome tokens for all four themes (LC-554 phase 1b)
    c2d94d36 Merge pull request 'feat(css): Blue Harbor semantic-token retune (LC-554 phase 1a)' (#522) from feat/LC-554-blue-harbor-tokens into main
    ea4326f0 feat(css): retune semantic tokens to Blue Harbor (LC-554 phase 1a)
    8fcc6da4 Merge pull request 'feat(enclave): graduated member trust + posting gate (LC-551)' (#521) from feat/LC-551-trust-levels into main
    bb017eed test(routes): graduated member trust coverage (LC-551)
    1591c009 feat(enclave): trust pill + manual promote in the member list (LC-551)
    37014a60 feat(room): gate new-member posting rate and auto-graduate on send (LC-551)
    8a05b362 feat(db): enclave member trust column + graduation helpers (LC-551)
    dacdab02 Merge pull request 'feat(markdown): mermaid diagram rendering (LC-550)' (#520) from feat/LC-550-mermaid-diagrams into main
    e1269660 feat(assets): vendored mermaid + lazy-loading diagram enhancement (LC-550)
    0d28e860 feat(markdown): render ```mermaid fences as diagram containers (LC-550)
    209014bb Merge pull request 'feat(search): semantic / related-message search (LC-549)' (#519) from feat/LC-549-semantic-search into main
    0fdb724f test(routes): related + semantic search integration coverage (LC-549)
    cf447c29 i18n: related-search and semantic-toggle strings (LC-549)
    9baa892c feat(search): opt-in semantic search mode that degrades to FTS (LC-549)
    f0a8a4f8 feat(search): "Find related" messages backed by embeddings (LC-549)
    8533adb2 feat(state): wire embeddings client into AppState + config (LC-549)
    52135426 feat(db): message_embeddings sidecar table + storage and by-ids fetch (LC-549)
    de5254ac feat(embeddings): operator embeddings client with cosine + serde helpers (LC-549)
    d8afed98 Merge pull request 'feat(messages): AI suggested replies (LC-548)' (#518) from feat/LC-548-suggest-reply into main
    69142aa2 test(routes): integration coverage for suggested replies (LC-548)
    5edc37b5 i18n(room): suggested-reply menu label and panel heading (LC-548)
    0d7318d3 feat(ui): suggest-reply chips in the message menu, applied via the composer panel (LC-548)
    b8cc9c14 feat(routes): AI suggested-reply endpoint with chip parser (LC-548)
    5984b9a8 Merge pull request 'feat(error): friendlier generic error page (LC-552)' (#517) from feat/LC-552-friendly-error-page into main
    a89fc0c0 feat(error): redesign the generic error page, hide only internal detail (LC-552)
    2edec3c3 i18n(error): friendly per-status error-page descriptions (LC-552)
    2778e292 Merge pull request 'feat(messages): ephemeral / self-destruct messages (LC-547)' (#516) from feat/LC-547-ephemeral-messages into main
    e3f5e06f test(messages): sweep + composer coverage for ephemeral messages (LC-547)
    1361417b feat(composer): self-destruct timer select wired into post_message (LC-547)
    53bf6731 feat(messages): schedule the unconditional ephemeral sweeper (LC-547)
    61c3fb87 feat(retention): unconditional sweep for expired ephemeral messages (LC-547)
    fba7631c feat(messages): expires_at column + TTL parsing for self-destruct (LC-547)
    361ba0bc Merge pull request 'feat(threads): per-thread mute (LC-546)' (#515) from feat/LC-546-per-thread-mute into main
    48c10000 test(threads): db + route coverage for per-thread mute (LC-546)
    296e9102 feat(threads): mute toggle route, button, and thread-panel wiring (LC-546)
    ef610ee2 feat(threads): suppress muted followers from thread reply fan-out (LC-546)
    e9b81d91 feat(threads): thread_muters table + data layer (LC-546)
    e15e58b9 Merge pull request 'chore(repo): publish-readiness sanitization sweep (LC-521)' (#514) from chore/LC-521-publish-sanitization into main
    f009947c chore(ci): drop trufflehog --exclude-paths and the empty exclude file (LC-521)
    c2d89992 chore(repo): publish-readiness sanitization sweep (LC-521)
    0c607396 Merge pull request 'fix(enclave): friendly redirect for invalid/revoked invite code (LC-544)' (#513) from fix/LC-544-friendly-invalid-invite-code into main
    fa92f0ae test(enclave): assert discover renders the invalid-invite-code banner (LC-544)
    28ef74f6 fix(enclave): friendly redirect for invalid/revoked invite code (LC-544)
    627935c8 Merge pull request 'feat(uploads): accessible image alt text (LC-537)' (#512) from feat/LC-537-image-alt-text into main
    ab1090b6 test(uploads): alt-text round-trip + author-gated editor route (LC-537)
    31a0ce0c feat(uploads): author alt-text editor with live re-render (LC-537)
    4c12202b feat(uploads): store image alt text (LC-537)
    14772e09 Merge pull request 'feat(stats): personal member-stats recap page (LC-536)' (#511) from feat/LC-536-member-stats into main
    8a10f798 test(stats): member_stats aggregation + /stats page render (LC-536)
    2d747528 feat(stats): personal stats recap page at /stats (LC-536)
    6c7a0e5b feat(stats): personal member-stats aggregation (LC-536)
    ead0527d Merge pull request 'feat(profile): pronouns, links & local time on profiles (LC-533)' (#510) from feat/LC-533-profile-extras into main
    ff965166 test(profile): profile-extras round-trip + hovercard privacy gate (LC-533)
    7939228a feat(profile): show pronouns, links, local time on the hovercard (LC-533)
    61bff2c6 feat(profile): edit pronouns, links, timezone in settings (LC-533)
    b1e1315a feat(profile): pronouns, links, timezone columns + model plumbing (LC-533)
    2184b50a Merge pull request 'feat(mute): auto-expiring timed mutes (LC-535)' (#509) from feat/LC-535-timed-mutes into main
    f71dee54 test(mute): expiry sweep lifts past mutes, spares permanent and future (LC-535)
    d6492bbb feat(mute): timed-mute duration picker in the admin user table (LC-535)
    4e0c9d60 feat(mute): honour mute expiry at every posting gate (LC-535)
    0189ef34 feat(mute): auto-expiring timed-mute core (LC-535)
    7c46cabf Merge pull request 'feat(branding): standardize "Let's Chat" display name; guard tab title (LC-538)' (#508) from feat/LC-538-standardize-name-casing into main
    2de2c5d3 feat(branding): standardize "Let's Chat" display name; guard tab title (LC-538)
    e4e25189 Merge pull request 'feat(room): per-channel slowmode (LC-534)' (#507) from feat/LC-534-slowmode into main
    d6662ee9 test(slowmode): end-to-end enforcement, off, and mod-exempt (LC-534)
    8d3e2a64 feat(slowmode): room-manage control to set the cooldown (LC-534)
    0f11e577 feat(slowmode): enforce per-channel slowmode in post_message (LC-534)
    077ccbba feat(slowmode): rooms.slowmode_seconds column + cooldown limiter (LC-534)
    5629c7eb Merge pull request 'feat(compose): AI writing assistant in the composer (LC-532)' (#506) from feat/LC-532-composer-ai-assist into main
    07089ce9 test(compose): end-to-end AI-assist happy path + gates (LC-532)
    30f0e596 feat(compose): wire the AI-assist button, panel slot, and apply/dismiss (LC-532)
    168597f0 feat(compose): AI writing-assistant endpoint + result panel (LC-532)
    885c33e9 Merge pull request 'feat(kudos): per-user opt-out of the leaderboard (LC-526 follow-up)' (#505) from feat/LC-526-kudos-optout into main
    5fdc4387 test(kudos): cover leaderboard exclusion of opted-out users (LC-526)
    81f25c0a feat(kudos): settings toggle to opt out of the leaderboard (LC-526)
    844858f4 feat(kudos): exclude opted-out users from the leaderboard (LC-526)
    03d5d5f6 feat(kudos): users.kudos_leaderboard_opt_out column + accessors (LC-526)
    ab1df775 Merge pull request 'feat(kudos): /kudos recognition command + leaderboard (LC-526)' (#504) from feat/LC-526-kudos into main
    566f1aa9 test(kudos): cover leaderboard ranking, enclave scoping, window (LC-526)
    2702495a feat(kudos): leaderboard page + sidebar nav entry (LC-526)
    8372010c feat(kudos): /kudos slash command that records + posts recognition (LC-526)
    0f924184 feat(kudos): kudos table + leaderboard aggregate db layer (LC-526)
    dc46e5dc Merge pull request 'feat(search): has:file / has:link / in:thread operators (LC-530)' (#503) from feat/LC-530-search-filters into main
    aad0af9f test(search): cover has:file / has:link / in:thread filters (LC-530)
    3ae1ca4c feat(search): parse and wire has:file / has:link / in:thread operators (LC-530)
    24827e97 feat(search): add has:file / has:link / in:thread filter columns (LC-530)
    2719e326 Merge pull request 'feat(room): reaction highlights recap page (LC-529)' (#502) from longjacksonle/feat/LC-529-reaction-highlights into main
    748e74f1 feat(room): reaction highlights recap page (LC-529)
    966a8b61 Merge pull request 'feat(transcripts): trackable follow-up tasks from call action items (LC-527)' (#501) from longjacksonle/feat/LC-527-followup-tasks into main
    82c47fb4 feat(transcripts): trackable follow-up tasks from call action items (LC-527)
    1362110b Merge pull request 'feat(room): read a message aloud via browser speech synthesis (LC-528)' (#500) from longjacksonle/feat/LC-528-read-aloud-messages into main
    0189663c feat(room): read a message aloud via browser speech synthesis (LC-528)
    0d5ea0ba Merge pull request 'feat(enclave): remove default enclave, prompt to create when none (LC-516)' (#499) from feat/LC-516-remove-default-enclave into main
    7031e2ee fix(enclave): guard disabled bots, cap name, drop redundant home query
    630f4112 feat(enclave): remove default enclave, prompt to create when none
    369afb83 Merge pull request 'ci: guard migration immutability against sqlx checksum drift' (#498) from feat/LC-515-migration-immutability-guard into main
    d3705be8 ci: guard migration immutability against sqlx checksum drift
    44c766cd Merge pull request 'test(auth): reconcile db_sessions with LC-514 hashed session id' (#497) from fix/LC-520-db-sessions-hashed-id-tests into main
    5a6a8a04 test(auth): reconcile db_sessions with LC-514 hashed session id
    b271392d Merge pull request 'fix(auth): [operator-action] hash session tokens at rest' (#496) from fix/LC-514-sessions-hash-at-rest into main
    18967022 fix(auth): [operator-action] hash session tokens at rest
    79baa64f Merge pull request 'feat(wiki): live wiki-editing presence banner (LC-498)' (#495) from feat/LC-498-wiki-editing-presence into main
    fdf001fe feat(wiki): live "X is editing the wiki" banner on the About page (LC-498)
    4a66642c feat(wiki): WS frame + render fragments for editing presence (LC-498)
    5106f731 feat(wiki): ephemeral wiki-editing presence in the hub (LC-498)
    05969ccf Merge pull request 'feat(clips): async video clips with transcription [operator-action] (LC-496)' (#494) from feat/LC-496-video-clips into main
    7c045e95 test+docs(clips): clip transcription coverage + STT env note (LC-496)
    592e5eed i18n(clips): en + es strings for the clip recorder (LC-496)
    981364f5 feat(clips): in-composer camera/screen recorder (LC-496)
    68138e38 feat(clips): transcribe video clips via the STT endpoint [operator-action] (LC-496)
    804e6865 feat(clips): inline

    Downloads