Skip to content

fix(local): Mac freeze, Keychain boot, and 2.x update feed - #1812

Merged
CREDO23 merged 13 commits into
mainfrom
dev
Sep 18, 2026
Merged

CREDO23 merged 13 commits into
mainfrom
dev

Conversation

@CREDO23

@CREDO23 CREDO23 commented Sep 18, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • Freeze the desktop API on uv’s managed Python and fail CI if sqlite-vec cannot load, so Mac installs no longer die on enable_load_extension.
  • Keep the app booting when Keychain cannot decrypt secret.bin (reinstall / Keychain rotation); stored API keys must be pasted again.
  • Point the in-app updater at the GitHub releases feed (allowPrerelease) so it does not follow the pinned legacy Latest (v0.0.40).
  • Agent skills cleanup (PR refactor(skills): consolidate frontend skills into frontend-workflow + per-tree CLAUDE.md symlinks #1811) and a desktop release runbook (surfsense_local/RELEASE.md).

Test plan

  • Mac: packaged API starts and /health is ok (sqlite-vec loads).
  • Mac: undecryptable secret.bin no longer quits the app.
  • Packaged “Check for updates” does not 404 on stable-*.yml while Latest stays on v0.0.40.
  • Desktop Release dry run (publish=never) still builds; production tag path still signs.

High-level PR Summary

This PR fixes three critical Mac desktop issues: freezes from SQLite extension loading failures by pinning to uv's managed Python and adding CI checks, Keychain decryption failures that previously quit the app by recovering gracefully, and the in-app updater 404ing by pointing it at the GitHub releases feed instead of the pinned legacy Latest (v0.0.40). Additionally, it reorganizes agent skills by bundling frontend guidance under frontend-workflow (React performance, color system, UI polish, Apple-style motion) with routing to the standalone shadcn skill, adds a complete migrate-radix-to-base skill for Base UI migrations, and introduces a desktop release runbook at surfsense_local/RELEASE.md.

⏱️ Estimated Review Time: 1-3 hours

💡 Review Order Suggestion
Order File Path
1 surfsense_local/VERSION
2 surfsense_local/RELEASE.md
3 .github/workflows/release-local.yml
4 surfsense_local/backend/scripts/build_binaries.py
5 surfsense_local/backend/shared/db.py
6 surfsense_local/backend/shared/sqlite.py
7 surfsense_local/backend/tests/unit/shared/test_db.py
8 surfsense_local/backend/tests/unit/shared/test_sqlite.py
9 surfsense_local/electron/src/main/secret.ts
10 surfsense_local/electron/src/main/secret.test.ts
11 surfsense_local/electron/src/main/updater.ts
12 surfsense_local/electron/src/main/updater.test.ts
13 .agents/skills/frontend-workflow/SKILL.md
14 .agents/skills/frontend-workflow/color/PALETTE.css
15 .agents/skills/frontend-workflow/color/SKILL.md
16 .agents/skills/frontend-workflow/motion/apple-design.md
17 .agents/skills/frontend-workflow/polish/SKILL.md
18 .agents/skills/frontend-workflow/polish/animations.md
19 .agents/skills/frontend-workflow/polish/icons.md
20 .agents/skills/frontend-workflow/polish/performance.md
21 .agents/skills/frontend-workflow/polish/surfaces.md
22 .agents/skills/frontend-workflow/polish/typography.md
23 .agents/skills/frontend-workflow/react-performance/SKILL.md
24 .agents/skills/migrate-radix-to-base/SKILL.md
25 .agents/skills/migrate-radix-to-base/universal-patterns.md
26 .agents/skills/migrate-radix-to-base/overlays.md
27 .agents/skills/migrate-radix-to-base/menus.md
28 .agents/skills/migrate-radix-to-base/form-controls.md
29 .agents/skills/migrate-radix-to-base/disclosure.md
30 .agents/skills/migrate-radix-to-base/display-misc.md
31 .agents/skills/migrate-radix-to-base/consumer-props.md
32 .agents/skills/migrate-radix-to-base/class-mapping.md
33 .agents/skills/migrate-radix-to-base/wrapper-shapes.md
34 .agents/skills/shadcn/SKILL.md
35 AGENTS.md
36 surfsense_local/AGENTS.md
37 surfsense_backend/CLAUDE.md
38 surfsense_local/CLAUDE.md
39 surfsense_mcp/CLAUDE.md
40 surfsense_web/AGENTS.md
41 surfsense_web/CLAUDE.md
42 .gitignore

Need help? Join our Discord

Summary by CodeRabbit

  • Bug Fixes

    • Desktop updates now reliably detect eligible releases beyond the legacy latest-release marker.
    • Recoverable encrypted-storage errors now automatically generate and save a replacement secret.
    • SQLite compatibility issues are detected earlier with clearer corrective guidance.
  • Reliability

    • Release validation now includes an API health smoke check.
    • Added verification that vector search functionality loads successfully.
  • Documentation

    • Added guidance for frontend workflows, UI design standards, component migration, and desktop release procedures.

AnishSarkar22 and others added 13 commits September 18, 2026 15:47
Adds animation-vocabulary, apple-design, color-system, frontend-workflow,
make-interfaces-feel-better, and migrate-radix-to-base skill packages for
use during the base-ui migration and general frontend/design work.
…Python

actions/setup-python's macOS interpreter has SQLite extension loading
compiled out, so uv could grab it instead of its own capable managed
Python during `uv sync`. sqlite_vec needs enable_load_extension, so the
frozen api/worker binaries crashed on startup on every Mac. Drop the
redundant setup-python step and pin UV_PYTHON_PREFERENCE=only-managed
so uv never considers a PATH-found interpreter.
…kage

ci(release-local): stop macOS builds from picking up a broken system Python
python.org macOS Python omits enable_load_extension, so the packaged
API died on migrate. Freeze with uv's Python, refuse to ship without
the API, and smoke /health on the frozen binary.
Bundle color-system, make-interfaces-feel-better, apple-design and
vercel-react-best-practices under frontend-workflow as color/, polish/,
motion/ and react-performance/. Their icon, colour and motion rules
overlapped with no shared parent to say which wins; the router now does.

Keep shadcn top-level — its allowed-tools grant and live `info --json`
substitution only work in a discovered SKILL.md.

Drop disable-model-invocation from frontend-workflow, which had kept the
router and its precedence rules out of context entirely.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude Code reads CLAUDE.md, not AGENTS.md, and only the repo root had the
symlink — so the per-tree AGENTS.md files never loaded, making "nearest
AGENTS.md wins" false in practice.

Nested memory files load lazily when a file in that directory is read, so
each tree's rules now reach an agent working in it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
refactor(skills): consolidate frontend skills into frontend-workflow + per-tree CLAUDE.md symlinks
A leftover ciphertext from a previous install made safeStorage.decryptString throw and the app quit before the window. Mint a new secret instead so startup survives reinstall; stored API keys must be pasted again.
…st pin

electron-updater defaults to /releases/latest, which stays on the legacy app, then 404s looking for stable-*.yml. allowPrerelease walks the feed so 2.x updates still resolve.
One VERSION, bump script, draft GitHub Release with notes from the previous 2.x tag, then undraft after CI so Latest stays on 0.0.40.
@coderabbitai

coderabbitai Bot commented Sep 18, 2026

Copy link
Copy Markdown

Review Change StackReview Change Stack

Note

Currently processing new changes in this PR. This may take a few minutes, please wait...

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: 120585ec-dd0d-486d-ba0f-41d2bd5b0364

📥 Commits

Reviewing files that changed from the base of the PR and between a3c7822 and 186b5d7.

⛔ Files ignored due to path filters (2)
  • .agents/skills/shadcn/assets/shadcn-small.png is excluded by !**/*.png
  • .agents/skills/shadcn/assets/shadcn.png is excluded by !**/*.png
📒 Files selected for processing (117)
  • .agents/skills/frontend-workflow/SKILL.md
  • .agents/skills/frontend-workflow/color/PALETTE.css
  • .agents/skills/frontend-workflow/color/SKILL.md
  • .agents/skills/frontend-workflow/motion/apple-design.md
  • .agents/skills/frontend-workflow/polish/SKILL.md
  • .agents/skills/frontend-workflow/polish/agents/openai.yaml
  • .agents/skills/frontend-workflow/polish/animations.md
  • .agents/skills/frontend-workflow/polish/icons.md
  • .agents/skills/frontend-workflow/polish/performance.md
  • .agents/skills/frontend-workflow/polish/surfaces.md
  • .agents/skills/frontend-workflow/polish/typography.md
  • .agents/skills/frontend-workflow/react-performance/SKILL.md
  • .agents/skills/frontend-workflow/react-performance/rules-compiled.md
  • .agents/skills/frontend-workflow/react-performance/rules/_sections.md
  • .agents/skills/frontend-workflow/react-performance/rules/_template.md
  • .agents/skills/frontend-workflow/react-performance/rules/advanced-effect-event-deps.md
  • .agents/skills/frontend-workflow/react-performance/rules/advanced-event-handler-refs.md
  • .agents/skills/frontend-workflow/react-performance/rules/advanced-init-once.md
  • .agents/skills/frontend-workflow/react-performance/rules/advanced-use-latest.md
  • .agents/skills/frontend-workflow/react-performance/rules/async-api-routes.md
  • .agents/skills/frontend-workflow/react-performance/rules/async-cheap-condition-before-await.md
  • .agents/skills/frontend-workflow/react-performance/rules/async-defer-await.md
  • .agents/skills/frontend-workflow/react-performance/rules/async-dependencies.md
  • .agents/skills/frontend-workflow/react-performance/rules/async-parallel.md
  • .agents/skills/frontend-workflow/react-performance/rules/async-suspense-boundaries.md
  • .agents/skills/frontend-workflow/react-performance/rules/bundle-analyzable-paths.md
  • .agents/skills/frontend-workflow/react-performance/rules/bundle-barrel-imports.md
  • .agents/skills/frontend-workflow/react-performance/rules/bundle-conditional.md
  • .agents/skills/frontend-workflow/react-performance/rules/bundle-defer-third-party.md
  • .agents/skills/frontend-workflow/react-performance/rules/bundle-dynamic-imports.md
  • .agents/skills/frontend-workflow/react-performance/rules/bundle-preload.md
  • .agents/skills/frontend-workflow/react-performance/rules/client-event-listeners.md
  • .agents/skills/frontend-workflow/react-performance/rules/client-localstorage-schema.md
  • .agents/skills/frontend-workflow/react-performance/rules/client-passive-event-listeners.md
  • .agents/skills/frontend-workflow/react-performance/rules/client-swr-dedup.md
  • .agents/skills/frontend-workflow/react-performance/rules/js-batch-dom-css.md
  • .agents/skills/frontend-workflow/react-performance/rules/js-cache-function-results.md
  • .agents/skills/frontend-workflow/react-performance/rules/js-cache-property-access.md
  • .agents/skills/frontend-workflow/react-performance/rules/js-cache-storage.md
  • .agents/skills/frontend-workflow/react-performance/rules/js-combine-iterations.md
  • .agents/skills/frontend-workflow/react-performance/rules/js-early-exit.md
  • .agents/skills/frontend-workflow/react-performance/rules/js-flatmap-filter.md
  • .agents/skills/frontend-workflow/react-performance/rules/js-hoist-regexp.md
  • .agents/skills/frontend-workflow/react-performance/rules/js-index-maps.md
  • .agents/skills/frontend-workflow/react-performance/rules/js-length-check-first.md
  • .agents/skills/frontend-workflow/react-performance/rules/js-min-max-loop.md
  • .agents/skills/frontend-workflow/react-performance/rules/js-request-idle-callback.md
  • .agents/skills/frontend-workflow/react-performance/rules/js-set-map-lookups.md
  • .agents/skills/frontend-workflow/react-performance/rules/js-tosorted-immutable.md
  • .agents/skills/frontend-workflow/react-performance/rules/rendering-activity.md
  • .agents/skills/frontend-workflow/react-performance/rules/rendering-animate-svg-wrapper.md
  • .agents/skills/frontend-workflow/react-performance/rules/rendering-conditional-render.md
  • .agents/skills/frontend-workflow/react-performance/rules/rendering-content-visibility.md
  • .agents/skills/frontend-workflow/react-performance/rules/rendering-hoist-jsx.md
  • .agents/skills/frontend-workflow/react-performance/rules/rendering-hydration-no-flicker.md
  • .agents/skills/frontend-workflow/react-performance/rules/rendering-hydration-suppress-warning.md
  • .agents/skills/frontend-workflow/react-performance/rules/rendering-resource-hints.md
  • .agents/skills/frontend-workflow/react-performance/rules/rendering-script-defer-async.md
  • .agents/skills/frontend-workflow/react-performance/rules/rendering-svg-precision.md
  • .agents/skills/frontend-workflow/react-performance/rules/rendering-usetransition-loading.md
  • .agents/skills/frontend-workflow/react-performance/rules/rerender-defer-reads.md
  • .agents/skills/frontend-workflow/react-performance/rules/rerender-dependencies.md
  • .agents/skills/frontend-workflow/react-performance/rules/rerender-derived-state-no-effect.md
  • .agents/skills/frontend-workflow/react-performance/rules/rerender-derived-state.md
  • .agents/skills/frontend-workflow/react-performance/rules/rerender-functional-setstate.md
  • .agents/skills/frontend-workflow/react-performance/rules/rerender-lazy-state-init.md
  • .agents/skills/frontend-workflow/react-performance/rules/rerender-memo-with-default-value.md
  • .agents/skills/frontend-workflow/react-performance/rules/rerender-memo.md
  • .agents/skills/frontend-workflow/react-performance/rules/rerender-move-effect-to-event.md
  • .agents/skills/frontend-workflow/react-performance/rules/rerender-no-inline-components.md
  • .agents/skills/frontend-workflow/react-performance/rules/rerender-simple-expression-in-memo.md
  • .agents/skills/frontend-workflow/react-performance/rules/rerender-split-combined-hooks.md
  • .agents/skills/frontend-workflow/react-performance/rules/rerender-transitions.md
  • .agents/skills/frontend-workflow/react-performance/rules/rerender-use-deferred-value.md
  • .agents/skills/frontend-workflow/react-performance/rules/rerender-use-ref-transient-values.md
  • .agents/skills/frontend-workflow/react-performance/rules/server-after-nonblocking.md
  • .agents/skills/frontend-workflow/react-performance/rules/server-auth-actions.md
  • .agents/skills/frontend-workflow/react-performance/rules/server-cache-lru.md
  • .agents/skills/frontend-workflow/react-performance/rules/server-cache-react.md
  • .agents/skills/frontend-workflow/react-performance/rules/server-dedup-props.md
  • .agents/skills/frontend-workflow/react-performance/rules/server-hoist-static-io.md
  • .agents/skills/frontend-workflow/react-performance/rules/server-no-shared-module-state.md
  • .agents/skills/frontend-workflow/react-performance/rules/server-parallel-fetching.md
  • .agents/skills/frontend-workflow/react-performance/rules/server-parallel-nested-fetching.md
  • .agents/skills/frontend-workflow/react-performance/rules/server-serialization.md
  • .agents/skills/migrate-radix-to-base/SKILL.md
  • .agents/skills/migrate-radix-to-base/class-mapping.md
  • .agents/skills/migrate-radix-to-base/consumer-props.md
  • .agents/skills/migrate-radix-to-base/disclosure.md
  • .agents/skills/migrate-radix-to-base/display-misc.md
  • .agents/skills/migrate-radix-to-base/form-controls.md
  • .agents/skills/migrate-radix-to-base/menus.md
  • .agents/skills/migrate-radix-to-base/overlays.md
  • .agents/skills/migrate-radix-to-base/universal-patterns.md
  • .agents/skills/migrate-radix-to-base/wrapper-shapes.md
  • .agents/skills/shadcn/SKILL.md
  • .agents/skills/shadcn/agents/openai.yml
  • .agents/skills/vercel-react-best-practices/README.md
  • .github/workflows/release-local.yml
  • .gitignore
  • AGENTS.md
  • surfsense_backend/CLAUDE.md
  • surfsense_local/AGENTS.md
  • surfsense_local/CLAUDE.md
  • surfsense_local/RELEASE.md
  • surfsense_local/backend/scripts/build_binaries.py
  • surfsense_local/backend/shared/db.py
  • surfsense_local/backend/shared/sqlite.py
  • surfsense_local/backend/tests/unit/shared/test_db.py
  • surfsense_local/backend/tests/unit/shared/test_sqlite.py
  • surfsense_local/electron/src/main/secret.test.ts
  • surfsense_local/electron/src/main/secret.ts
  • surfsense_local/electron/src/main/updater.test.ts
  • surfsense_local/electron/src/main/updater.ts
  • surfsense_mcp/CLAUDE.md
  • surfsense_web/AGENTS.md
  • surfsense_web/CLAUDE.md
 _________________________________________________________________________________
< CodeRabbi is my uncle. He's a bit more orthodox. Feel lucky you got me instead. >
 ---------------------------------------------------------------------------------
  \
   \   \
        \ /\
        ( )
      .( o ).
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@CREDO23
CREDO23 merged commit fb12c23 into main Sep 18, 2026
6 of 12 checks passed
@vercel

vercel Bot commented Sep 18, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
surf-sense-frontend Building Building Preview Sep 18, 2026 9:52pm UTC

Request Review

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants