Notechondria
Version: 0.1.17 Build Date: 2026-04-10T00:00
What's Changed
Splash Screen — Krebs cycle animation polish
- Removed the English metabolite names (Citrate, Isocitrate, α-Ketoglutarate, …) that previously floated next to each cycle node. The active metabolite's structural formula now carries all chemical information.
- Dropped the on-screen clamp on the active structural formula's position. The formula is now strictly anchored to its node with an outward offset, so it naturally travels off-screen (top / bottom / left) together with the orbiting node — matching how a real metabolite moves along the cycle.
- Rewrote particle effects: the background is now dotted with ~26 tiny, individually rotating structural formulas of small molecules that accompany the citric acid cycle (H₂O, CO₂, -COOH, pyruvate fragment, NAD⁺, Pᵢ, H⁺, acetyl-CoA fragment), replacing the previous plain circle particles. Each particle has its own orbit speed, drift, initial rotation and rotation rate, giving the background a "molecule soup" feel.
-
_Particleclass extended withrotation,rotationSpeed, andmoleculeTypefields;_drawParticleMoleculeadded to render the eight molecule sketches inside a translated+rotated canvas frame.
Login — OAuth bind no longer overwrites existing accounts
- Fixed a subtle bug where hitting the Google/GitHub Bind button from Settings while the app had just processed an OAuth redirect could silently log the user in as whoever owned the matching email, or create a brand-new account using the OAuth-provided username/email — effectively overwriting the original account from the user's point of view.
-
Frontend fix (root cause):
_bootstrapAppinapp_shell.dartnow restores the auth token from local storage before calling_handleOAuthCallback, so the bind branch (which requires an authenticated token) no longer falls through to the unauthenticated/auth/google/or/auth/github/endpoint. -
Backend fix (defense in depth):
GoogleOAuthApiView.postandGitHubOAuthApiView.postnow reject any request whoseintentfield is"bind"with HTTP 400 and adetailpointing the caller at the authenticated/api/v1/auth/bind/{provider}/endpoint. The guard runs before any OAuth token exchange, so no external calls are made for rejected requests. -
Added
OAuthBindRejectionTestsinbackend/creators/tests.pycovering both providers. Fullcreatorstest suite: 29 tests, all passing.
Settings — API key visibility and MCP endpoint helper
-
Added an
_ApiKeySectionsubsection directly above the "Connected accounts" section. It displays the masked key prefix (abcd1234••••…), a Rotate button that calls the new/auth/rotate-api-key/endpoint, and — on rotation — a one-time plaintext reveal panel with Copy / Dismiss controls. Previously the API key was not visible anywhere in the editor UI after login. -
Added helper text below the API key row showing the user's MCP endpoint URL (derived by parsing
api_base_urland replacing the path with/mcp/). A copy icon next to the URL lets users grab it without selecting text manually. -
New
CreatorClient.rotateApiKey(token)method infrontend/editor_app/lib/core/client.dartwraps the rotate endpoint. Wired throughapp_shell.dartvia a newonRotateApiKeycallback that updates the in-memory_settings['api_key_prefix']after a successful rotation.
Files Changed
frontend/editor_app/lib/components/splash_screen.dart— Label removal, formula anchoring, particle molecule renderingfrontend/planner_app/lib/components/splash_screen.dart— Kept in syncfrontend/portal_app/lib/components/splash_screen.dart— Kept in syncfrontend/editor_app/lib/app_shell.dart— Session restore moved before OAuth callback handling;onRotateApiKeywiringfrontend/editor_app/lib/core/client.dart— NewrotateApiKeymethod (interface + implementation)frontend/editor_app/lib/modules/settings.dart— New_ApiKeySectionwidget inserted above_ConnectedAccountsSectionbackend/creators/api.py—GoogleOAuthApiView/GitHubOAuthApiViewrejectintent="bind"backend/creators/tests.py— NewOAuthBindRejectionTestsclassdocs/TASKS.md— Marked urgent splash tasks and Login section items completedocs/versions/0.1.17.md— This version documentVERSION— Bumped from 0.1.16 to 0.1.17