halkyon/halkyon_learn_server/migrations
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Tizian 「ティツィアーン」 56c5b36084
feat(assistant): Claude reads studysets through a connector on the instance
A Claude plan can't drive a chat inside another app, but Claude's apps
(every plan, the phone apps too) can add a remote MCP server as a custom
connector. The instance now is one (ADR 0006): Serverpod's web server
serves the MCP endpoint (/mcp, Streamable HTTP, JSON answers, no
sessions) with five read-only tools over the person's own synced rows
(their studysets, a studyset's cards and notes a page at a time, a
search across cards, a note, their progress), and the OAuth the
specification asks for: protected resource and authorization server
metadata, dynamic client registration, authorization code with PKCE
(S256 only), tokens bound to the resource, iss in the response, refresh
tokens that rotate. Caddy forwards these paths alone to the web server,
which production now runs on 8082.

People connect with a code from the app (Settings › Assistant › Connect
Claude): eight Crockford characters, valid for ten minutes and once,
typed on the authorization page, which names where it returns to, loads
nothing from elsewhere and may not be framed. Anonymous people can
connect too. Codes and tokens are kept only as SHA-256 hashes; an access
token lives an hour, a refresh token 30 days. The app lists what is
connected and disconnects it, which ends its tokens at once; deleting
the account deletes it; a daily job forgets what expired and clients
nobody connected within a week. InstanceInfo says where the connector is
(additive); the migration only adds server-only tables, so devices and
older apps are untouched.

The handlers take plain requests, so the integration tests drive the
whole flow (registration, the code, tokens, refresh, the tools, another
person's content, disconnecting, expiry, pruning, account deletion)
without a web server.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-10 15:11:17 +02:00
..
20260916165410927 chore: scaffold the Serverpod 4 build 2026-09-24 15:32:29 +02:00
20260930094729362-studysets feat: step 7's migration, with an index on spaceId 2026-09-30 20:38:15 +02:00
20260930122235111-cards feat(server): cards and their append-only revisions, synced 2026-09-30 20:38:17 +02:00
20260930145136285-reviews feat(server): the review log, synced and append-only 2026-09-30 20:38:19 +02:00
20261001064926911-tree-tags-assets feat: studysets record when they last changed; the library lists them so 2026-10-01 09:59:46 +02:00
20261002035419149-file-allowance Limit how much room people's files take 2026-10-02 06:02:15 +02:00
20261002191122122-notes feat: notes in studysets, synced and merged as cards are, with tags 2026-10-02 21:53:56 +02:00
20261002211346701-learning-paths feat: learning paths in studysets, synced, with progress and tags 2026-10-02 23:31:20 +02:00
20261003110855698-pdf-sources feat: PDF sources: read, take notes and cards from pages, deadlines 2026-10-03 14:40:08 +02:00
20261007205440868-card-buried-at perf: keep a card's burial on its row rather than in the review log 2026-10-09 18:09:17 +02:00
20261008165051407-pdf-position feat: files in an order of one's own, with Reorder beside the tabs 2026-10-09 18:09:22 +02:00
20261008223835206-dictionaries feat(server): dictionaries, loaded from files and searched 2026-10-09 18:09:25 +02:00
20261009123850448-dictionary-kind feat: dictionaries hold words or characters, and are asked by their source 2026-10-09 18:09:32 +02:00
20261009145434785-dictionary-entry-version feat: a dictionary's corrections reach the cards made from it, by offer 2026-10-09 18:09:37 +02:00
20261009184924904-public-profiles feat: public profiles, a handle on the account domain with name, bio, links and picture 2026-10-10 09:46:37 +02:00
20261009195137836-published-studysets feat(publish): releases in git (public tier, stage 2) 2026-10-10 09:46:38 +02:00
20261009202105673-explore feat(explore): list published studysets, give out their releases, withdraw 2026-10-10 09:46:39 +02:00
20261009215552429-learner-count feat(explore): how many learn it here, opt-in; copies published within their licence 2026-10-10 09:46:41 +02:00
20261009220324372-based-on feat(explore): how many learn it here, opt-in; copies published within their licence 2026-10-10 09:46:41 +02:00
20261009224606274-feedback feat(feedback): reports and suggestions on published studysets, gathered by the instance 2026-10-10 09:46:42 +02:00
20261010095547719-assistant-connector feat(assistant): Claude reads studysets through a connector on the instance 2026-10-10 15:11:17 +02:00
migration_registry.txt feat(assistant): Claude reads studysets through a connector on the instance 2026-10-10 15:11:17 +02:00