API key auth — new api_keys table (migration 0027), _check_auth updated to accept Authorization: Bearer fmcp_* tokens before falling back to session. Read/write scope enforcement. Soft-delete via revoked_at, last_used_at tracking.
Settings UI — API Keys tab — generate, copy, revoke keys; one-time reveal with .env download and Claude config download buttons.
GET /api/search — semantic search endpoint wrapping semantic_search_notes(); supports content_type=note|task|all and limit.
conversation_type="mcp" — MCP conversations excluded from main chat list and retention cleanup.
fable-mcp/ package — standalone Python MCP server (mcp[cli], httpx); 20 tools across notes, tasks, projects, milestones, search, and chat (SSE); 34 tests passing.
fix: clipboard copy fallback — navigator.clipboard requires HTTPS; added execCommand fallback for http dev environments.
Test plan
Run migration: alembic upgrade head
Generate an API key in Settings → API Keys, verify copy/download buttons work
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
api_keystable (migration 0027),_check_authupdated to acceptAuthorization: Bearer fmcp_*tokens before falling back to session. Read/write scope enforcement. Soft-delete viarevoked_at,last_used_attracking..envdownload and Claude config download buttons.GET /api/search— semantic search endpoint wrappingsemantic_search_notes(); supportscontent_type=note|task|allandlimit.conversation_type="mcp"— MCP conversations excluded from main chat list and retention cleanup.fable-mcp/package — standalone Python MCP server (mcp[cli],httpx); 20 tools across notes, tasks, projects, milestones, search, and chat (SSE); 34 tests passing.navigator.clipboardrequires HTTPS; addedexecCommandfallback for http dev environments.Test plan
alembic upgrade headcurl -H "Authorization: Bearer fmcp_..." /api/notesGET /api/search?q=...