React/Vite study planner with semester planning, ECTS totals, independent module notes, JSON import/export and optional Supabase cloud storage.
Use Node 22.12+ (Node 20.19+ is also supported by this Vite version).
npm ci
npm run devOpen the URL printed by Vite. In development, /?demo=1 provides sample data with
separate browser storage and cloud sync disabled. Demo edits survive a reload.
The ordinary URL uses the regular local plan and optional cloud configuration.
To enable cloud login locally, copy .env.example to .env.local, fill in the
project's public Supabase URL/publishable key and Google client ID, then restart
Vite. Google login must allow the local origin. Never use a service-role key.
npm test
npm run buildWith Vite running, open /tests/browser/notes.html for the notes browser smoke
test. It checks adding, editing, independent toggles, restoration from persisted
JSON and deleting a single note. It uses its own temporary storage key and removes
that key afterward. The page reports PASS or FAIL.
If a restricted Windows environment prevents the Node test runner from spawning child processes, run the same tests directly:
node tests/plan-sync.test.mjs
node tests/planner-preferences.test.mjsThese checks do not validate production authentication or Supabase RLS.
See CLOUD-SYNC.md for the live-test procedure and sync limitations.
study-planer.jsx: page composition, authentication UI and drag/drop coordination.components/: notes, module cards/modal, semester columns, requirements, ECTS summary, appearance controls and shared inline editing.hooks/usePlanner.js: local plan state, persistence, edits, import/export and undo.hooks/useCloudSync.js: cloud loading/saving lifecycle and user-facing sync status.plan-sync.mjs: Supabase operations, revision conflicts and write serialization.planner-model.mjs: pure normalization, validation and ordering rules.planner-preferences.mjs: palettes, custom colors and legacy-note normalization.planner-config.mjs: browser storage keys and development demo data.supabase/schema.sql: database schema and access policies.
A push to main starts .github/workflows/deploy-pages.yml: install dependencies,
run tests, build, then deploy the generated dist artifact to GitHub Pages.
The workflow receives its public browser configuration from repository secrets.
Local builds without that configuration run in local-only mode.
Plans now store all degrees in one versioned JSON document. See
MULTI-DEGREE-IMPLEMENTATION.md for the data model, local migration, account
isolation, backup recovery, validation evidence and manual review steps.
In development, these additional pages use isolated in-memory data:
/tests/browser/multi-degree.html: planner/cloud hook integration checks./tests/browser/multi-degree-ui.html: sequential UI flows at 390, 768 and 1280 px.
Production release gate: supabase/multi-degree-guard.sql has been installed
and tested in the separate StudyPlanner Test project. The guard and RLS/revision
tests passed there. Review and install the guard separately in production before
rollout; the app/deployment workflow does not install it. Real Google sign-in and
end-to-end cross-device tests remain pending. See supabase/TEST-PROJECT.md.
Production publication was subsequently authorized on 2026-10-26. The tested
version guard is now installed in the application database. See
PRODUCTION-RELEASE.md for preparation, remaining live checks and rollback notes.