0.1.92 — shared CustomMetaListEditor in all three note-metadata dialogs + docs sync
Round 3 of the multi-app migration started in 0.1.90. Closes the
custom-meta UI carryover left after 0.1.91 by lifting the expandable
list into notechondria_shared and mounting it in editor / portal /
planner.
Shared widget extraction
- New
notechondria_shared/lib/src/components/custom_meta_list_editor.dartexportingCustomMetaController+CustomMetaListEditor. The controller parses the JSON object string fromnote.custom_metaon construction, exposesserialize()for the parent's save path, and notifies on add / remove / expand toggle. Malformed JSON is preserved in aninvalid_jsonrow so the user can fix it without losing data.
editor_app
_NoteMetadataDialogswitched from its private_CustomMetaRowlist to the shared controller. The custom-meta dispose loop, the_loadCustomMetaparser, and the inline expandable widget are all gone;_buildCustomMetaSectionnow just returnsCustomMetaListEditor(controller: _customMetaController)._serializeCustomMeta()removed; the two pop-with-result paths now read_customMetaController.serialize()directly.
portal_app
_NoteMetadataDialog(forked from editor for portal's learner flow) gained aCustomMetaController, mountsCustomMetaListEditorbetween the cover section and version history, and threadscustom_metathrough both pop maps.learner_note_editor.dartsave payload now sendscustom_metaout-of-band ofmetadata_jsonso the backend's dedicated column receives the user-defined keys without double-storing them.
planner_app
- Same migration as portal:
_NoteMetadataDialogmounts the shared editor;learner_note_editor.dartstripscustom_metafrom themetadata_jsonblob and sends it as its own field.
Docs sync (per AGENTS.md §2.6)
- Root
README.mdadds two sections:- "Per-app OAuth redirect URIs (since 0.1.90)" documenting the
new
GOOGLE_AUTHORIZED_REDIRECT_URIS/GITHUB_AUTHORIZED_REDIRECT_URISenv-var allow-lists. - "Experimental: GitHub data-sync (since 0.1.90)" pointing at
docs/integrations/github-sync.mdand listing theGITHUB_DATA_SYNC_APP_*env-var contract + the JWT-signing gap.
- "Per-app OAuth redirect URIs (since 0.1.90)" documenting the
new
docs/readme.mdadds parallel sections for the same two features plus a per-user MCP skill and custom-meta surface explanation.docs/deployment/deploy.mdenv-block extended with the new vars, with comments explaining the per-app allow-list semantics and the JWT-signing gate.docs/deployment/render_free_tier.mdanddocs/deployment/northflank.mdupdated with the same env-var guidance + the data-sync caveat.
Verification
flutter analyzeruns cleanly acrosseditor_app,portal_app, andplanner_app. No new warnings or errors introduced; only pre-existing unused-element / unused-import lints remain.
Carryover (still open)
- GitHub Sync — actual push pipeline. Add
pyjwt + cryptographytobackend/requirements.txt, finish_refresh_installation_token(JWT sign → POST/app/installations/<id>/access_tokens), build the repo-picker UI on top ofGET /installation/repositories, and ship a CLI restore script inbackend/scripts/. Tracked under "Experimental GitHub Sync" indocs/TODO.md. Suggest scheduling this as a separate round once the dependency bumps land.