What's new

Every update to Spark²Plan — from the big refactors to the little polish.

v5.1.22

Public changelog page

  • NewChangelog at /changelog — this page. Every future update will be documented here alongside the version and date. Accessible from the landing page nav.
v5.1.22

Build pipeline fix + minification restored

  • FixBuild systembuild.mjs was using String.replace() to inject compiled JS into the HTML template. When minification produced $& patterns in variable names, .replace() interpreted them as regex backreferences and silently corrupted the bundle. Switched to split().join().
  • PerfBundle size — minification now works correctly. JS bundle went from 1001 KB → 659 KB (34% smaller).
v5.1.22

Major improvements: performance, accessibility, reliability

  • NewToast notifications — replaced every native alert(), confirm(), and prompt() browser dialog with a custom non-blocking toast + modal system (88 dialog calls migrated). Errors, success messages, and confirmations now feel native to the app.
  • A11yKeyboard + screen reader support — added role="dialog", aria-modal, and aria-label to all modals and close buttons. Added a focus-trap hook.
  • A11yEscape key closes any modal — rewrote the global keyboard handler to close modals in priority order. Previously only 12 of ~30 modals responded to Escape; now all do.
  • PerfComponent extraction — extracted 5 large modals (Help, Executive Summary, S-Curve, Look-Ahead, Look-Back) as memoized React.memo components. ~1,800 lines moved out of the monolithic App — they no longer re-render when unrelated state changes.
  • NewOptimistic locking for task edits — the app now detects when two users edit the same task concurrently (via the new updated_at column). If a conflict is detected, your local change is reverted and you're notified to refresh and try again. Prevents silent data loss in collaborative editing.
v5.1.21

Dependency viewer reliability + API key persistence

  • FixDependency Viewer — the modal intermittently failed to show a task's predecessors because it depended on the filtered task tree. Now uses a dedicated task-ID state and looks up from the full task list, so it works regardless of active filters or collapsed groups.
  • FixAnthropic API key persistence — the key was being aggressively cleared from local storage and the database on any 401 response. Now, if auth fails, you're asked whether to re-enter or keep the current key. The key is also synced back to the DB on login if missing, so it persists across devices and browsers.
v5.1.21

Super admin tooling + per-user plan management

  • FixUpgrade badge — super admins no longer see the "Upgrade" prompt for plans they already have access to.
  • NewPlan management in the user panel — admins can now view and change a user's subscription plan directly from the user management screen.
v20

Proper user isolation + project membership

  • FixUser visibility — users were seeing every account on the platform in member pickers. Now users only see their teammates.
  • NewProject membership — projects can now have explicit members. Combined with share links, this enables per-project access control rather than everyone-sees-everything.
v19

iPad optimization

  • NewTouch-first Gantt — instant task selection on tap, proper touch targets for drag handles, optimized drag/resize gestures on iPad.
v17–v18

Cost columns, drag fixes, floating zoom

  • NewCost columns — track fixed cost and computed total cost per task, with rollups up the WBS.
  • NewFloating zoom controls — zoom the Gantt timeline without leaving the chart view.
  • FixDrag & drop — dragging or resizing a task now correctly forces it into manual schedule mode instead of silently losing the change on next recalculation.
  • NewDependency deletion — right-click a dependency line on the Gantt to delete it.
v16

What-If milestones + MS Project XML fixes

  • FixWhat-If propagation — milestones now propagate schedule changes correctly in what-if scenarios.
  • FixXML import — task names with special characters are now preserved from MS Project imports.
v14

Stripe upgrade flow + plan loading reliability

  • NewPost-upgrade redirect — after a successful Stripe checkout, the app reliably refreshes the user's plan and unlocks features without requiring a manual reload.
  • FixPlan loading — switched from a foreign-key join to two separate queries, fixing a race where the plan sometimes failed to load.