Notechondria

Version: 0.1.12 Build Date: 2026-04-08T00:00

What's Changed

Cloudflare R2 static/media storage

  • Rewired backend to use Cloudflare R2 (S3-compatible) for static and media files when CLOUDFLARE_R2_BUCKET_NAME is set. Falls back to local filesystem + nginx when unset (Docker Compose).
  • Added django-storages[s3] and boto3 to requirements.txt and requirements-render.txt.
  • Added conditional STORAGES configuration in settings.py with credential validation.
  • Added Cloudflare R2 environment variables to sample.render.env.
  • Added "Cloudflare R2 storage" setup section to docs/deployment/render_free_tier.md.

Splash animation improvements

  • Slowed Krebs cycle animation from 4s to 8s duration across all three apps.
  • Removed "Citric Acid Cycle" center title label.
  • Replaced English chemical names with structural formula representations drawn via Canvas (e.g. HOOC-CH2-C(OH)-CH2-COOH for Citrate, double-bond notation for Fumarate, S-CoA groups for Succinyl-CoA).
  • Changed Acetyl-CoA label to structural formula CH3-CO-S-CoA.

OAuth callback redirect

  • Added oauth_callback view in api_views.py that handles GET redirects from Google/GitHub OAuth providers.
  • On error: renders a styled static HTML page with failure icon and message.
  • On success: redirects to the frontend SPA with code and state query parameters.
  • Added /auth/google/callback and /auth/github/callback URL routes in urls.py.

OAuth bind feedback

  • Added SnackBar feedback in all three app shells (editor, planner, portal) for social account bind success/failure after OAuth callback.

Lazy loading for note list

  • Replaced "Load more" button in the learner note list with scroll-based lazy loading.
  • Added ScrollController with listener that triggers load when scrolled within 200px of the bottom.
  • Shows CircularProgressIndicator at list bottom while loading more notes.

Files Changed

  • backend/notechondria/settings.py -- Conditional Cloudflare R2 storage configuration
  • backend/notechondria/api_views.py -- OAuth callback view, error handler views
  • backend/notechondria/urls.py -- OAuth callback URL routes
  • backend/requirements.txt -- Added django-storages[s3], boto3
  • backend/requirements-render.txt -- Added django-storages[s3], boto3
  • frontend/editor_app/lib/components/splash_screen.dart -- Structural formulas, slower animation, removed title
  • frontend/planner_app/lib/components/splash_screen.dart -- Same splash changes
  • frontend/portal_app/lib/components/splash_screen.dart -- Same splash changes
  • frontend/editor_app/lib/app_shell.dart -- OAuth bind SnackBar feedback
  • frontend/planner_app/lib/app_shell.dart -- OAuth bind SnackBar feedback
  • frontend/portal_app/lib/app_shell.dart -- OAuth bind SnackBar feedback
  • frontend/editor_app/lib/modules/learner.dart -- Scroll-based lazy loading replacing load-more button
  • docs/deployment/render_free_tier.md -- Cloudflare R2 setup instructions
  • sample.render.env -- Cloudflare R2 environment variables
  • sample.env -- Updated image tags to v0.1.12.local
  • VERSION -- Bumped from 0.1.11 to 0.1.12
  • docs/versions/0.1.12.md -- This version document
  • docs/TASKS.md -- Marked completed items