Summary
Proposal to make Cerefox installable as a global cerefox command via a one-line installer (à la cfcf, uv, ruff), with an interactive cerefox init first-run flow, a cerefox doctor diagnostic, and cerefox self-update. Models the UX on cfcf, adapted for Cerefox's Python codebase (no full TS rewrite).
Design doc: docs/research/installer-design.md
Branch: research/installer-design
Status: Research / proposal — iterate on the doc in the branch before scheduling implementation.
What problem this solves
Today's install (clone repo → uv sync → edit .env → db_deploy.py → npm build → always uv run cerefox from the repo root) is fine for developers but a barrier for end users. Three structural awkwardnesses:
- Working-directory dependence —
Settings reads .env from CWD, so cerefox only works from the repo root.
- No global install path — every invocation needs
uv run. Claude Desktop / Path C agents need the absolute repo path spelled out.
- No interactive bootstrap — first successful search takes ~15 minutes of doc-reading and manual config.
What the proposal delivers (target UX)
# One-line install
curl -fsSL https://github.com/fstamatelopoulos/cerefox/releases/latest/download/install.sh | sh
# Interactive bootstrap — Supabase + OpenAI + schema deploy + MCP wiring
cerefox init
# Day-to-day from any directory
cerefox search "OAuth design"
cerefox ingest ~/notes/meeting.md --author "fotis" --author-type "user"
cerefox doctor
cerefox self-update
Claude Desktop MCP config collapses from uv --directory /Users/fotis/src/cerefox run cerefox mcp to cerefox mcp. Path C agent guidance no longer needs to spell out the cerefox checkout path.
Phased plan
| Phase |
Scope |
Effort |
Goal |
| Phase 0 |
Prerequisite refactors (config-dir resolution, importlib.resources for SQL files, hatch-vcs for version, wheel-includes for frontend/dist) |
Small |
Unblocks Phase 1. Backward-compatible — dev install path is unchanged. |
| Phase 1 |
PyPI publish, install.sh, cerefox init / doctor / self-update / configure-mcp. Doc rewrite for end-user vs dev install split. |
Medium |
90% of the UX win. |
| Phase 2 |
PyInstaller standalone binaries via GitHub Releases, Homebrew tap. macOS notarization decision. |
Medium |
Removes "must have Python" friction. Independent of Phase 1 — can defer indefinitely. |
| Phase 3 |
npm-native distribution. Not recommended without a real TS rewrite. |
High, low value |
Explicitly deferred. |
Phase 0 + Phase 1 each become their own iteration / GitHub issue when this is scheduled.
Decision points needing your input before this becomes an iteration
Listed in §13 of the doc:
- Phase 1 only, or Phase 1 + Phase 2 together? Phase 1 alone is the bigger UX win for less effort.
- PyPI name: is
cerefox available? Fallbacks: cerefox-cli, cerefox-knowledge.
~/.cerefox/ vs XDG-strict ~/.config/cerefox/ — recommend ~/.cerefox/ for consistency with Claude Code (~/.claude/), Codex (~/.codex/), cfcf (~/.cfcf/).
- macOS notarization budget ($99/year) — only matters for Phase 2.
cerefox init prompt defaults — "deploy schema?" / "wire up Claude Desktop?" default Yes or No?
Out of scope (called out explicitly in §12)
- Not a full Python-to-TypeScript rewrite. The existing Iteration 18 plan (narrow TS port of just
mcp_server.py for shared-code reasons — see docs/plan.md line 1626) remains a separate, independent decision and is not blocked by or blocking this proposal.
- Not a hosted-Cerefox SaaS — users still bring their own Supabase project.
- Not a change to agent protocols (MCP / Edge Functions / GPT Actions all continue working unchanged).
- Not a replacement for the dev install path — contributors keep cloning and using
uv sync.
Open questions
§10 of the doc lists 10 — most need investigation during implementation, not blocking discussion now.
How to pick this up later
- Read the doc end-to-end. Edit on the
research/installer-design branch. Push back on anything that doesn't fit how you'd want this to work.
- Resolve the §13 decision points. Those shape the implementation tickets.
- When the doc is locked, split into two new GitHub issues — "Phase 0: installer prerequisites" and "Phase 1: Cerefox installer + bootstrap UX" — and schedule as new iterations in
plan.md. Close this issue at that point.
Related work
Summary
Proposal to make Cerefox installable as a global
cerefoxcommand via a one-line installer (à la cfcf,uv,ruff), with an interactivecerefox initfirst-run flow, acerefox doctordiagnostic, andcerefox self-update. Models the UX on cfcf, adapted for Cerefox's Python codebase (no full TS rewrite).Design doc:
docs/research/installer-design.mdBranch:
research/installer-designStatus: Research / proposal — iterate on the doc in the branch before scheduling implementation.
What problem this solves
Today's install (clone repo →
uv sync→ edit.env→db_deploy.py→npm build→ alwaysuv run cerefoxfrom the repo root) is fine for developers but a barrier for end users. Three structural awkwardnesses:Settingsreads.envfrom CWD, socerefoxonly works from the repo root.uv run. Claude Desktop / Path C agents need the absolute repo path spelled out.What the proposal delivers (target UX)
Claude Desktop MCP config collapses from
uv --directory /Users/fotis/src/cerefox run cerefox mcptocerefox mcp. Path C agent guidance no longer needs to spell out the cerefox checkout path.Phased plan
importlib.resourcesfor SQL files,hatch-vcsfor version, wheel-includes forfrontend/dist)install.sh,cerefox init / doctor / self-update / configure-mcp. Doc rewrite for end-user vs dev install split.Phase 0 + Phase 1 each become their own iteration / GitHub issue when this is scheduled.
Decision points needing your input before this becomes an iteration
Listed in §13 of the doc:
cerefoxavailable? Fallbacks:cerefox-cli,cerefox-knowledge.~/.cerefox/vs XDG-strict~/.config/cerefox/— recommend~/.cerefox/for consistency with Claude Code (~/.claude/), Codex (~/.codex/), cfcf (~/.cfcf/).cerefox initprompt defaults — "deploy schema?" / "wire up Claude Desktop?" default Yes or No?Out of scope (called out explicitly in §12)
mcp_server.pyfor shared-code reasons — seedocs/plan.mdline 1626) remains a separate, independent decision and is not blocked by or blocking this proposal.uv sync.Open questions
§10 of the doc lists 10 — most need investigation during implementation, not blocking discussion now.
How to pick this up later
research/installer-designbranch. Push back on anything that doesn't fit how you'd want this to work.plan.md. Close this issue at that point.Related work
mcp_server.py) — also independent. If it lands first, this proposal just changes the implementation ofcerefox mcpfrom a Python process to a Node.js process; the installer story is unchanged.