What's new

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

v5.2.29

Create resources where you assign them

  • New➕ New resource… in the assign dropdowns — both the Progress Spotlight card and the Detail Panel can now create a resource on the spot (name prompt, auto-initials) and assign it to the task immediately. No detour through resource management mid-meeting.
  • FixSpotlight's assign dropdown now shows even when the project has no resources yet — previously it was hidden, making the first resource impossible to add from there.
v5.2.28

The work front follows the meeting

  • NewWork-front Spotlight is live during the review — marking a task 100% with Save & Next immediately appends its newly unblocked successors to the same session, with a toast telling you how many joined. Finish A and B becomes the next task to review — no need to reopen Spotlight.
v5.2.27

Spotlight learns to focus: the 🎯 Work-front toggle

  • NewWork-front mode in Progress Spotlight — a toggle in the header switches between All due (every unfinished task that has started or is due soon) and 🎯 Work front (only tasks the team can act on now). In a dependency chain where one task slipped, the review shows that task — not the whole trail of successors that are late by inheritance. SS/SF successors unlock when their predecessor starts; FS/FF when it finishes. The choice is remembered.
v5.2.26

User Manual catches up with the app

  • NewFive new Help sections — 📊 Project Dashboard, 📊 Period Progress, 💰 Costs / EV, 🩺 Diagnostics and 📌 Action Items are now documented in the in-app User Manual.
  • FixUser Management help refreshed — covers granting/removing project access (📂+ / 📂−), the super-admin 🔑 Access overview and Plan column, and the roles-vs-membership distinction.
v5.2.25

Professional features stay unlocked after a page refresh

  • FixSubscription plan now loads on session restore. Refreshing the browser (or coming back within 48 h) silently dropped the plan back to Starter, locking Pro reports until the next full sign-in. The plan is now loaded on every app start, not just at login.
v5.2.24

The Recovery Brief becomes the Project Dashboard

  • New📊 Project Dashboard — the Recovery Brief is renamed and promoted to the first spot in Action & Analysis. It now opens with a full KPI row: overall progress (actual vs planned at the data date), schedule performance (SPI), projected finish vs baseline, driving-path float, late tasks, remaining work and milestone status — followed by the familiar milestone-slip table, driving chain, long-lead watchlist and recovery levers.
  • FixPrint/PDF output of the dashboard now carries the same KPI summary line.
v5.2.23

Project access at a glance (super admin)

  • New🔑 Access overview in User Management — super admins get a second view listing every project with its members, roles and join dates, filterable by project or username, with one-click removal.
  • NewRemove from the open project without leaving User Management — for super admins the 📂+ button turns into 📂− when the person is already a member of the open project.
v5.2.22

User Management fits the screen; account-migration repair

  • FixUser Management modal no longer clips the Actions column — the dialog is wider on large screens and the user table scrolls horizontally on small ones instead of cutting off buttons.
  • FixAccount migration to Supabase Auth works again. A database trigger was rolling back every migration attempt (and every admin-created auth account); it now links the existing account instead of trying to duplicate it. Newly signed-up accounts also default to the User role, not Admin.
v5.2.21

Actuals in Spotlight, mode toggle on the task card, finish-needs-start enforced

  • NewActual Start / Actual Finish are editable right in the Spotlight card (saved immediately). The finish field is locked until an actual start exists.
  • NewThe Gantt task card's scheduling mode is now clickable — switch Auto ⇄ Manual in place — and the card shows the actual dates when the task has started.
  • FixAn Actual Finish without an Actual Start is now impossible anywhere. If a finish arrives with no start on record, the start is auto-filled from the planned start (with a toast); a finish earlier than the start is rejected outright. Enforced in the core update path, so the detail panel, Spotlight, popup and progress statusing are all covered.
v5.2.20

Spotlight: WBS breadcrumbs, schedule-mode toggle, and per-task change history

  • FixNo more "duplicate" confusion. Each card now shows the task's WBS code and its full parent path (e.g. 1.1.3.7.9 · Projet K2 › Pre-Construction › …) — construction schedules reuse names like "Busway" across zones, and the breadcrumb tells the twins apart. Parent rows are also excluded from the sequence by actual parenthood, not just a flag.
  • NewSchedule mode on the card — each task shows 🔄 Auto or 📌 Manual, and one click switches it.
  • New🕔 Change History on the card — the task's recent changes (field, old → new, when, from which action) right in the statusing flow, so you can see what happened before you update it.
v5.2.19

Detail panel: breathing room at the right edge

  • FixValues, dates and buttons in the detail panel no longer touch the panel border — the content area keeps a comfortable inset on the right.
v5.2.18

Summaries made only of milestones now roll up their progress

  • FixA summary whose children are all milestones no longer sits at 0% forever. Summary progress is duration-weighted (the MS Project formula), which correctly gives milestones no weight — but a milestone-only group therefore had zero total weight and was hardcoded to 0%. Those groups now average their children equally: four completed milestones = 100%. Duration-bearing groups are unchanged.
v5.2.17

Detail panel fits its contents

  • FixNothing in the task detail panel clips at its right edge anymore. The panel is a little wider (340px), and every row inside wraps or shrinks instead of being cut off — dates, the Dep Viewer / Impact Chain buttons, the predecessor quick-add row, and the resource picker.
v5.2.16

Click the version for What's New — and get told when a new version ships

  • NewThe version badge in the header opens this changelog — and it now always shows the real current version, stamped automatically from the newest entry here at build time (it had been stuck at v5.1.24 since May).
  • New"New version available" banner. Running sessions check for new deploys every few minutes (and whenever you return to the tab). When one ships, a banner offers Refresh now and a link to What's New. Dismissing it silences that deploy only.
v5.2.15

Resource entry, redesigned: one-click toggles, copy/paste, drag-down fill

  • NewThe resource editor is now a checklist. Single click opens it (was double), every resource is one click to assign or unassign, and the panel stays open for rapid multi-assign. Typing filters the list; Enter toggles the match or creates a new resource.
  • NewCopy / Paste between tasks — 📋 Copy takes the task's resource set, 📌 Paste applies it to any other task (replacing what was there).
  • NewExcel-style fill handle. Hover the Resources cell, grab the small square in its corner, and drag down (or up) — every row you pass is highlighted and receives the same resource set on release. Summary rows are skipped automatically.
v5.2.14

Resource emails power Request Update

  • NewEach resource can carry an email address — editable inline in 👥 Manage Resources next to the hourly rate.
  • NewRequest Update pre-fills the recipient automatically. Picking a resource fills their saved email; the resource cards show the address (or an amber "no email" hint). If you type an address at send time, it's saved back onto the resource so next month's request remembers it.
v5.2.13

Spotlight: fits the screen, and completed tasks stay for review

  • FixThe Spotlight window no longer overflows the screen. The card scrolls inside a fixed-height window and the Previous / Skip / Save & Next buttons are pinned at the bottom, always reachable.
  • FixCompleting a task no longer ejects it from the session. The task list is frozen when Spotlight opens, so "Task 4 of 59" stays 59 tasks; a task you set to 100% shows "✓ Completed — kept in this session for review" and Previous returns exactly where you were. The next Spotlight session recomputes the list fresh.
v5.2.12

Safer roles, resources in Spotlight, and actuals that fill themselves in

  • FixSelf-signups are no longer administrators. New accounts register as User (full schedule editing, no user management or project deletion). Making anyone an Admin — on creation or via the role badge — now asks for explicit confirmation spelling out what Admin grants.
  • NewProgress Spotlight shows the task's resources — colored chips with one-click remove and an "+ Assign…" dropdown, right between Progress and Notes. Resource changes apply immediately.
  • FixCompleting a task fills its actual dates from the planned dates. Statusing to 100% (slider, Spotlight, or quick-progress buttons) sets Actual Start from the planned start and Actual Finish from the planned finish when they're empty — no more correcting "today" on every completed task. Explicit actual dates you set yourself are never overwritten.
v5.2.11

User Management: plan changes stick, and granting project access is one click

  • FixChanging a user's plan now applies the plan you picked. The dropdown read its value after the confirmation dialog, by which point the select had already snapped back — so confirming silently re-applied the old plan. The chosen value is now captured before asking.
  • New📂+ action per user — grants that user access to the currently open project (editor for admins/users, viewer for viewers). A new account sees an empty workspace until it's made a member of a project; the Role Permissions box now says so explicitly.
v5.2.10

Toolbar polish: every tab now speaks the Action & Analysis visual language

  • NewOne clear gradient primary per toolbar group, everywhere. General: green + New, cyan Recalc, amber Snapshot. Gantt: cyan Today. View: purple Save View. Edit: gradient Add Task and Export. Same pill treatment as the Action & Analysis tab, so primaries read at a glance on every tab.
  • FixToolbar group panels refined — slightly larger radius and padding, crisper group labels; gradient buttons share one reusable style with a subtle hover.
v5.2.9

Impact Chain: click a task name to jump to it

  • FixTask names and #id chips in the Impact Chain are now direct links — click to jump to the task in the Gantt (underline on hover). Clicking elsewhere on the row still opens inline edit, and the hover buttons are unchanged.
  • FixGo-to-task no longer fails silently when a column filter hides the target row — filters are cleared (with a toast) so the task can be revealed, and if it still can't be shown you're told instead of nothing happening.
v5.2.8

New report: Schedule Recovery Brief — slips vs baseline, driving chain, compression levers

  • NewAction & Analysis → 📐 Recovery Brief. An executive report computed live from your schedule: projected finish and milestone slips measured against the active baseline (P6 practice), the driving chain that sets the finish date (binding-predecessor walk, milestone diamonds, per-activity float), a long-lead watchlist sorted by total float, and suggested compression levers derived from the actual network — crash the longest driving activity, fast-track strict FS pairs, work through holiday blocks, protect near-critical procurement, phase the final handover.
  • NewPrint / PDF — one click opens a clean printable version for sharing with stakeholders.
  • NoteWithout a baseline the brief still runs (chain, float, watchlist) and tells you slips need a baseline — set one after each approved revision.
v5.2.7

Scheduling: actualized work is frozen (P6 convention)

  • FixThe scheduler no longer moves completed or started tasks. Tasks with progress or actual dates are history, not plan — P6 freezes them. Previously the engine treated them like any auto task and could pull a finished task months away from when it actually happened (e.g. an ASAP pull rescheduling a 100% task 3 months earlier, or a constraint pushing completed work into the future). Started tasks now keep their dates and only drive their successors.
v5.2.6

Link policy: auto-detected on import, asked on project creation

  • NewImport as New now detects how the source schedule was authored. If the MS Project XML contains links on summary tasks, the new project is created in MS Project link mode automatically so its logic imports verbatim (a toast tells you, and you can switch to P6 strict in Tools anytime). Files without summary links keep the P6-strict default.
  • NewCreating a project now asks which link policy to use — P6 strict (recommended) or MS Project. Escape keeps the safe P6 default.
v5.2.5

New: MS Project-style links on summary tasks (per-project setting)

  • NewLink policy selector in the Tools toolbar: "P6 strict" (default) or "MS Project". In MS Project mode you can draw dependencies to and from summary tasks, exactly like MSP. The scheduler expands them internally to the leaf activities that define the summary — a summary used as predecessor means "after the whole subtree finishes", a summary used as successor pushes the whole subtree — so dates, float, and the critical path stay correct.
  • NewImports respect the policy. Appending or comparing an XML into an MS Project-mode project keeps summary links verbatim; P6-mode projects keep today's behavior (links remapped to leaf activities, nothing lost either way). The P6 clean-up and indent auto-migration are disabled in MS Project mode.
  • NoteTwo rare link shapes are scheduled approximately in MS Project mode: SS/SF from a summary uses its earliest-starting activity, and FF/SF onto a summary uses its latest-finishing activity.
v5.2.4

Import: links on summary tasks are now migrated, never lost

  • FixMS Project links on summary tasks survive import correctly. MS Project allows dependencies on summary rows; P6 (and Spark²Plan) require them on leaf activities. The importer now remaps them at parse time — a summary used as predecessor becomes its latest-finishing leaf, a summary used as successor hands its links to its earliest-starting leaf — preserving the schedule meaning exactly. Previously these links could be silently dropped during the post-import cleanup, letting downstream milestones drift months earlier than the source schedule.
  • FixSummary-link cleanup hardened. The one-shot cleanup now descends to real leaf activities (a summary's first/last child can itself be a summary), inserts the replacement link before removing the old one, and stamps the correct project id — a stale project reference could previously strand migrated links in the wrong project.
v5.2.3

Invisible account-security upgrade begins

  • NewAccounts are migrating to Supabase Auth — invisibly. The next time each user signs in with their usual username and password, their account is upgraded behind the scenes to industry-standard authentication (server-side password storage, real sessions). Nothing changes in the sign-in screen, no email is sent, and if the upgrade service is ever unreachable, sign-in simply works the legacy way and upgrades next time.
  • NewNew signups get the upgraded authentication from day one.
  • FixSign Out now also ends the underlying session, not just the local one.
v5.2.2

Under-the-hood: modular codebase groundwork

  • PerfInternal modularization — the date/calendar utilities, the Critical Path (slack) engine and the MS Project XML import/export now live in dedicated modules, laying the groundwork for a leaner, more maintainable codebase. No behavior changes.
  • PerfUnified import pipeline — "Import as New" and "Append to Current" now share a single insert pipeline (resources → tasks → dependencies → assignments), so both import paths stay consistent by construction.
v5.2.1

Faster rendering on large plans

  • PerfExecutive Summary timeline — month gridlines are now drawn once as a single background layer instead of once per row (a 300-task, 36-month plan went from ~10,800 gridline elements to 36).
  • PerfGantt chart layers — task bars, dependency lines and bar labels are now memoized, so typing, tooltips and other unrelated UI updates no longer redraw every bar and link. Dependency-line lookups also switched from repeated scans to an index map.
  • PerfLook-Back report — task notes are parsed once per task instead of repeatedly during sorting.
  • PerfExperimental row windowing — very large plans can opt in to rendering only the visible rows of the table and chart (kept perfectly in sync) by setting pf_virtualize to 1 in browser storage. Off by default.
v5.2.0

P6-grade CPM engine: correct float, computed critical path, calendar-aware links

  • FixTotal & free float are now computed by a true two-pass CPM — forward pass (early dates) and backward pass (late dates from successors' late starts, per P6), honoring all four link types (FS/SS/FF/SF), lag, and the project working calendar. Float is reported in working days, not calendar days.
  • NewCritical path is derived, not imported — tasks are flagged critical when total float ≤ 0 and the flag updates automatically whenever the schedule changes (duration edits can shift criticality between parallel branches, as in P6).
  • FixFF/SF links and negative lag are calendar-aware — Finish-to-Finish and Start-to-Finish successors are back-scheduled in working days, and negative lag (e.g. FS-2) walks working days backwards over weekends and holidays instead of calendar days.
  • FixDeadline constraints behave like P6 — Start/Finish No Later Than never pull a task earlier than its logic-driven date; they flag a constraint violation instead. Must Finish On / Finish No Earlier Than now back-walk working days. As Late As Possible schedules at the latest date that keeps successors' dates.
  • PerfSchedule saves are debounced and batched — recalculation writes go to the database as one error-checked batch (with a toast on failure) instead of one silent request per task, so dragging a bar no longer fires a write storm mid-gesture.
  • FixSummary rollups and calendar changes persist fully — rolled-up start, finish, duration and % complete are saved for summary tasks, and “Save & Recalculate” on the calendar now stores recalculated finish dates too.
v5.1.80

Plan limits enforced on bulk paths, fair team-seat counting, dialog keyboard polish

  • FixPlan limits — XML import, append-import, templates and schedule-review "added tasks" now check your plan's per-project task limit before inserting anything; a clear upgrade message shows the exact counts
  • FixTeam seats — the team-member limit now counts only members across your own projects (Admin + seats), not every account in the system
  • A11yDialogs — Escape now always closes the topmost confirm/prompt dialog without also closing the window behind it; Tab cycles inside the dialog; single-letter shortcuts are ignored while a dialog is open
  • FixAI settings — the Anthropic API key prompt is now a masked password field, and AI features use current Claude models
v5.1.79

Data-safety hardening: subtree deletes, complete snapshots, no more lost edits after idle

  • FixDeleting a summary task now deletes its whole subtree properly. Previously only the selected task row was removed, leaving its subtasks orphaned in the database and corrupting the WBS tree. The confirm dialog now tells you exactly how many subtasks will go with it, and all dependencies, assignments, custom-field values and attachments of the entire subtree are cleaned up in batched, error-checked operations.
  • FixSnapshots now capture custom fields, custom-field values, and attachment records — restoring a snapshot brings them back (remapped to the restored tasks). Older snapshots restore exactly as before. Attachment files are not part of snapshots; they remain in cloud storage and their records reconnect on restore.
  • FixSnapshot storage is now capped at 5 snapshots per project (oldest is dropped on save) so local storage can't fill up silently. If a snapshot is still too large to store, it is downloaded as a file and clearly reported — it no longer appears in the list as if it had been saved.
  • FixThe 2-hour idle auto-refresh no longer discards an in-progress cell edit. If you left a cell open for editing, the refresh is skipped; if a field merely has focus, its value is committed first and the refresh waits for the save to complete.
v5.1.78

Data trust: undo now truly restores, and edits can't silently overwrite each other

  • FixUndo is now fully saved — and says so when it isn't. Ctrl+Z used to fire its database writes without waiting or checking; a failed write left the screen showing one schedule and the database another. Undo now waits for every write, and if anything fails it tells you (“Undo could not be fully saved”) and reloads the project so what you see is what's stored.
  • FixUndo now restores dependency links too. Undoing a change that added or removed links used to revert the tasks but leave the links in their new state (a task/link mismatch P6 would never allow). Undo now diffs the snapshot's links against the current ones and restores them in the same batch.
  • NewTwo tabs (or two people) can no longer silently overwrite each other's task edits. Every task save now checks the row hasn't changed since you loaded it; if a teammate got there first you see “This task was changed elsewhere — refreshed with the latest version” and the task refreshes with their edit instead of clobbering it.
v5.1.77

Real Privacy & Terms pages, landing fixes, and a small-screen floor for the app

  • NewPrivacy Policy and Terms of Service pages/privacy and /terms are now real pages (the footer links previously fell through to the landing page). Honest, product-specific terms: what data is stored (account, schedules, subscription status), the processors involved (Supabase, Stripe, Netlify, Anthropic for AI features), no ad tracking, deletion on request, 14-day Professional trial and cancel-at-period-end billing, Québec governing law.
  • FixLanding nav logo was a dead link (href="#") — it now goes home.
  • A11ySmall-screen floor for the app (≤820px) — the task table used to be pinned at 750px wide, making the grid unusable on phones and narrow windows. The table now stacks above the Gantt, each area keeps its own scrolling, and the header, search bar, side panels and toasts relax their fixed widths. Not a full mobile redesign — just usable, scrollable, nothing clipped off-canvas.
v5.1.76

Cost Dashboard: true EVM — Planned Value now measured against the baseline

  • FixSPI no longer hides schedule slippage. Planned Value (BCWS) was computed from the current schedule, so when dates slipped, PV slipped with them and SPI stayed near 1.0. PV is now anchored to the active baseline (the Performance Measurement Baseline, per PMI / P6), so slips show up as SPI < 1 and negative SV.
  • FixWorking-day math. Planned % now counts elapsed working days (project calendar, holidays excluded) against the working-day duration — the old formula mixed calendar days elapsed with working-day durations.
  • NewStatus-date & mode label. EVM is evaluated at the project Data Date (falls back to today), and the dashboard now states its measurement basis: "PV vs Baseline: …" when baselined, or a warning that SPI is measured against the current plan when no baseline is set.
v5.1.75

Rename-project dialog: no more Safari autofill popup or surprise closing

  • FixThe rename/prompt dialog no longer closes by accident. Selecting text with the mouse and releasing outside the box used to cancel the dialog (it closed on any outside click, including drag-release); it now only closes when you deliberately press outside it. Escape and Cancel unchanged.
  • FixSafari no longer offers contact AutoFill inside the rename field (same suppression as the action-item title fix), and the current name is pre-selected on open so you can type over it directly.
  • FixRenaming a project now updates the header title immediately, not just the project dropdown.
v5.1.74

Speed & reliability sweep: batched database writes, honest error reporting, smoother editing

  • PerfEvery bulk flow now batches its database writes — template projects, snapshot restore (previously one request per task), schedule-review apply, undo-append, What-If apply, Spotlight save-all, and the dependency editor. Project open also loads its five tables in parallel. Minutes-long silent stalls are gone across the board.
  • PerfInline editing no longer writes to the database on every keystroke. Task-name typing and the progress slider now update locally and save once when you finish — and one Ctrl+Z now reverts the whole edit instead of one character. Progress-slider changes are also recorded in the change log (they previously weren't).
  • FixFailed saves are no longer silent. Task updates, dependency add/remove, resource assign/unassign, custom fields, template creation, snapshot restore and the detail-panel Save Changes button all show an error toast when the database rejects a write — previously the UI pretended it saved. Save Changes also now persists constraint, deadline and cost fields, not just 5 basics.
  • FixStripe webhook now tells Stripe to retry when a database write fails, so a transient error can no longer silently desync a paid subscription.
  • FeatureImport modal shows live status (“Inserting 328 tasks…”) with a spinner, and the success summary stays on screen instead of flashing for 1.5 s.
  • FixRemoving a dependency link now asks for confirmation everywhere (detail panel × buttons included), matching P6 discipline — link logic drives the critical path. Icon-only buttons gained screen-reader labels.
v5.1.73

XML import: minutes-long freeze at 70% fixed — now a single bulk insert

  • PerfImport as New and Append to Current no longer stall at a frozen progress bar. Linking each imported task to its parent used to issue one database round-trip per task (a 328-task schedule meant ~327 sequential requests, 1–4 minutes with the bar stuck at 70%). Task ids are now generated client-side so the whole schedule — hierarchy included — lands in one bulk insert. The same import now completes in a few seconds.
  • FixImport errors are no longer silent. Failures inserting the project, resources, tasks, dependencies or assignments during Import as New were previously ignored, which could leave a half-imported project with no message. Every step now surfaces its error in the failure toast.
v5.1.72

New Task Above / Below / Sub-Task — right-click and Edit toolbar

  • FeatureRight-click on any task now offers three quick-insert actions at the top of the context menu: ↑ New Task Above, ↓ New Task Below, and ↳ New Sub-Task. The first two insert a 1-day placeholder as a sibling and immediately put you in name-edit mode. Sub-Task makes the clicked task a parent and inserts a child — if that task previously carried predecessors or successors, the P6 migration kicks in automatically and pushes those links onto the new sub-task (with a toast explaining what moved). Saves the dance of “create task, drag it, indent it, fix the link.”
  • FeatureSame three actions added to the Edit tab toolbar next to Add Task, so the buttons are reachable from keyboard/mouse without right-clicking. Disabled until a task is selected.
v5.1.71

Summary tasks: P6/PMI-strict link handling on indent & one-shot cleanup

  • FeatureIndenting a leaf task now migrates its links to its new children automatically. Before: if a task with predecessors/successors had two new sub-tasks indented under it, the task became a summary and its links were silently ignored by the scheduler (a summary’s dates roll up from its children, so any direct link is overwritten on every recalc). Now: at the moment of indent, the former-leaf’s predecessors move to the first child (by sort order) and any task that had it as a predecessor is re-pointed at the last child. The user sees a toast: “Moved N links from ‘X’ to its children (P6 convention — summaries don’t carry links).” Constraint on the new summary is cleared, since roll-up rows are by definition uncon­strained.
  • FeatureLinks can no longer be placed on summary tasks in either direction. Matches Primavera P6 and the PMI Practice Standard for Scheduling, which require relationships to live only between leaf activities. The Gantt bar connectors are now hidden on summary rows, the “Edit Predecessors/Successors” modal explains the rule instead of showing an Add picker, and addDependency() rejects both summary-as-predecessor and summary-as-successor with a clear toast.
  • FixOne-shot cleanup pass for legacy projects. On every project load, any summary that still carries predecessors[] or is referenced as a predecessor (because it was indented before this rule existed) gets its links automatically migrated down to first/last child, with a toast reporting how many were moved. Fixes existing schedules where the predecessor and successor arrows pointing to a now-summary row were doing nothing.
v5.1.70

Action Items: stop Safari from offering iCloud Keychain on the title field

  • FixNo more Keychain autofill prompt in the Action Items panel — Because the Todoist token input was type="password", Safari heuristically tagged the modal as a login form and offered to autofill the “New action item” title with a saved username. Added autoComplete="off" + data-form-type="other" + the 1Password/LastPass ignore hints on the title and per-row title inputs, and autoComplete="new-password" on the token field (the magic value that tells browsers “this is a credential being created, don’t offer to fill from saved passwords”).
v5.1.69

Action Items tab: per-project task manager with Todoist push

  • FeatureNew “📋 Action Items” panel — A lightweight task manager scoped to the currently-loaded gantt project, separate from the gantt’s scheduled tasks. Open it from the Analysis ribbon (Spotlight group) or by pressing T anywhere in the app (guarded against inputs & modals so it doesn’t fire mid-typing). Quick-add at the top: type a title, optionally pick a due date / assignee / priority, hit Enter. Each item is editable inline — title, due date, assignee, priority all save to Supabase on change. Items are sorted open-first, then by due date, then by priority. Items marked done collapse into a dimmed “Done” section.
  • FeaturePriority levels follow P1–P4 convention — P1 (urgent / red), P2 (high / amber), P3 (normal / gray, default), P4 (low / blue). Color-coded select chips in both the quick-add row and per-item editor.
  • FeatureAssignees pulled from app_users — Dropdown lists every registered Spark²Plan user so action items stay anchored to real login accounts. Unassigned is the default.
  • FeatureOne-way Todoist push (REST v2) — Each open item has a “📤 Push” button that creates the corresponding task in your own Todoist account via POST /rest/v2/tasks. Title, description, due date and priority are mapped over (our P1 → Todoist priority 4, etc.). Returned Todoist task ID is stored so the button switches to a “✓ Todoist” badge confirming the push. Personal API token is entered once at the bottom of the panel and stored in your user preferences (per-user, never shared across accounts). Test button validates the token by hitting /rest/v2/projects.
  • FeatureNew project_action_items Supabase table — Run scripts/migrations/2026-05-20_project_action_items.sql in the Supabase SQL editor before using the panel. Includes project FK with CASCADE delete, assignee/creator FKs to app_users, due_date, priority constraint, status enum, todoist_id, and an updated_at touch trigger. Index on (project_id, status, due_date). RLS open-policy to match the rest of the app (pre-Auth-migration state). If the table is missing the panel surfaces a clear toast explaining what to run.
v5.1.68

Progress Spotlight: N−3 / N+3 dependency tree with downstream date-shift impact

  • Feature3-level predecessor & successor view — The spotlight modal used to show only the direct predecessors and successors of the current task in a single inline row. It now renders a tree up to three levels back (N−1, N−2, N−3) and three levels forward (N+1, N+2, N+3), indented to make the chain readable. Each node lists the display ID, name, link type and lag.
  • FeatureImpact propagation on successors — When you edit the current task’s start date or duration, the spotlight now computes the calendar-day shift and walks the successor chain to project the new finish date for each downstream task. The shift is propagated correctly through FS / FF / SS / SF link types (FS & FF driven by the parent’s finish; SS & SF driven by the parent’s start). Slips (positive shift) render in red, pull-ins (negative shift) in green — so you can see at a glance which downstream tasks are about to move before you click Save.
  • FeaturePredecessor health context — Predecessor nodes now also surface status: “✓ done” for completed tasks, “&warning; LATE” for tasks behind schedule (with the late flag computed from the project’s slack data, same as the rest of the app), or the raw percent-complete. Quick answer to “is the work feeding me actually on track?” without leaving the spotlight.
v5.1.67

Tabloid PDF: “Single page (fit-to-page)” no longer spawns a blank page 2

  • FixFit-to-page now actually produces one page — The row-height calculation in fit mode sized each row to fill the body area exactly, which left no slack for autoTable’s cell-border line widths. On dense exports (~30+ tasks) those borders accumulated to ~3 mm of overshoot and pushed the last row past the bottom margin, so autoTable opened a fresh page that ended up empty. Reserved a 4 mm safety pad in the fit-mode row-height formula so the final row always clears the bottom margin and the PDF stays a true single page.
v5.1.66

Tabloid PDF: cap Pred / Succ / Resources lists at 3 items

  • PolishList columns no longer steal width from the Task column — A task with 13 successors (e.g. 197,202,207,212,217,222,227,233,238,243,249,254,259) was forcing the Succ column to ~155 mm, leaving almost nothing for Task names. The Predecessor, Successor, and Resource columns now cap at the first 3 entries with * appended when more existed. The legend gains a unified entry: “* = shortened to fit (long name or >3 list items)”.
v5.1.65

Tabloid PDF: every column auto-sized to its actual data

  • Fix“100%” was being ellipsized to “10…” — The progress column was uniformly scaled along with everything else and ended up too narrow for “100%”. Replaced the uniform-scale allocation with a per-column auto-fit: every non-Task column is measured against the widest text it actually has to render (header + every body cell, in both regular and bold), plus padding and a small safety margin. The Task column takes whatever’s left, so it grows or shrinks dynamically without ever squeezing a numeric / date / status column. If the Task column would drop below 30 mm, the other columns proportionally shrink to give it air.
v5.1.64

Tabloid PDF: shortener uses real text width

  • PolishLess aggressive name-shortening — The previous fixed 60-character threshold left visible whitespace on rows whose names would actually fit at full length. The shortener now measures real Helvetica width in millimetres via doc.getTextWidth() against the rendered column width (with a small safety margin for bold summary rows). Names that fit are kept verbatim; names that don’t are abbreviated one rule at a time and the function returns as soon as the result fits. Truncation also keeps adding words back until the column is full instead of cutting at a fixed character count.
v5.1.63

Tabloid PDF: smart task-name shortening + consistent task-column alignment

  • FixInconsistent left indent — autoTable was stripping the leading-space WBS indent on rows where the name overflowed (ellipsize collapses the visible portion), so long-and-truncated names appeared closer to the column edge than their siblings. Dropped the visible indent entirely; the bold styling on summary rows carries the WBS hierarchy without needing leading whitespace.
  • NewSmart task-name shortening — Names longer than ~60 characters are auto-abbreviated using a rule pass (strip parentheticals → apply common abbreviations like “Preparation”→“Prep”, “Coordination”→“Coord”, “Environmental”→“Env”, etc. → word-boundary truncation as a last resort) and tagged with a trailing *. The legend automatically adds “* = name shortened to fit” whenever at least one row was shortened. No LLM call or network round-trip — pure local rules.
v5.1.62

Tabloid PDF: row alignment, wider Task column, bold summaries

  • FixBars no longer drift out of alignment with the table — When a task name wrapped to two lines, the table row grew taller but the Gantt zebra / bar still used the original 5 mm row height; with multiple wrapped rows the drift accumulated to a full row by the bottom of a page. The Task column now uses ellipsize (overflow “…”) instead of linebreak, so every row keeps a uniform 5 mm height and the Gantt zebra + bars stay locked to the table rows.
  • PolishMore room for task names — The table-to-Gantt split shifts from 45/55 to 50/50, and the secondary columns (Dur, Start, Finish, %, Pred, Succ, Resources) tightened to the minimum they need at 7 pt. The Task column goes from ~60 mm to ~95 mm, so most names fit on one line without truncation.
  • PolishSummary rows in bold — Phase and section headers (any task with is_summary) are rendered bold across every column of the row so the WBS hierarchy reads at a glance.
v5.1.61

Tabloid PDF: new default columns

  • PolishDefault column set updated — The “Defaults” preset in the PDF export modal now selects: Task, Dur, Start, Finish, %, Pred, Succ, Resources. WBS is dropped (the WBS depth is implied by the indentation of the Task name), and Successors and Resources are added so dependency and assignment info appear in the printout without an extra click. You can still toggle any individual column or use the All / None presets.
v5.1.60

Tabloid PDF: real Spark²Plan logo, month labels on long projects, softer today-line

  • NewEmbedded Spark²Plan logo — The PDF now uses the actual Spark²Plan brand logo (lightning-bolt 2 mark + wordmark) at the top of every page on a clean white header. The previous programmatic swatch was a placeholder.
  • FixMonth labels were missing on multi-year projects — The adaptive axis threshold dropped month labels whenever there were < 3.2 mm of space per month, which hid them on any project longer than ~6 years. Lowered to 1.8 mm so single-letter month markers (J F M A …) stay visible up to ~10 years on tabloid; only beyond that does it fall back to year-only.
  • PolishSofter data-date line — The bright red “today” line is now a paler coral-red and stops at the bottom of the last task on each page instead of running to the page footer. Less visually loud, and visually anchors to the actual schedule.
v5.1.59

Tabloid PDF: zebra rows + unified header strip

  • NewAlternating row shading — Body rows alternate between white and a soft slate (#F1F5F9). The shading extends across the Gantt area too, so a row reads consistently from the Task name on the left to its bar on the right.
  • PolishHeader strip is now one continuous band — The time axis (year + month) and the table column-header now share the same horizontal strip. The first data row sits immediately under that strip, and the first Gantt bar lands on that same row instead of one row down.
v5.1.58

Tabloid PDF: bars now render, cleaner logo, centered headers

  • FixGantt bars were invisible in multi-page mode — The earlier fix that switched data.row.y/height to data.cell.y/height only patched the single-page branch; the multi-page branch was still reading the undefined data.row coordinates, so drawBar bailed out silently for every row. Rewrote both branches to use the same path: autoTable records each row’s position into a layout array; bars are drawn in a single second pass after the table finishes laying out. A deterministic fallback derives y from row index when the hook coords come back unusable.
  • PolishCleaner logo block — Dropped the cramped “S²P” lettering inside the swatch (the small superscript was colliding with both the wordmark and the “P” glyph). The logo is now an indigo / cyan rounded shape with a white diamond mark; the wordmark next to it is plain ASCII “Spark2Plan”.
  • PolishCentered column titles — The table’s header row is now horizontally centred and bolded. Cell content is centred for ID/date/numeric columns; the Task name column stays left-aligned so indentation conveys WBS depth.
v5.1.57

Tabloid PDF: legible time axis, ASCII-safe text, thicker bars

  • FixBroken Unicode glyphs — Helvetica in jsPDF doesn’t carry the diamond (◆), right-triangle (▸), arrow (→), or bullet (•) code points, so they were rendering as garbage (“%¸”, “%Æ”, “!’”). Replaced every Unicode glyph with either ASCII text (“to” instead of arrow, “|” instead of bullet) or drawn shapes (filled diamonds for milestones in the bars and legend).
  • FixTime-axis label overlap — On long projects the months collided into a single illegible string (“JulAugSepOctNovDec…”). The axis is now adaptive: 3-letter months at > 6 mm per band, single-letter at 3.2–6 mm, year-only below that. Each year band is shaded and labelled in the middle, with vertical separators at year boundaries.
  • PolishVisibly drawn Gantt bars — Minimum bar height bumped from 1.2 mm to 2 mm; max from 3 mm to 4 mm. Critical and summary bars get distinct outlines. The previous 0.6 mm minimum width was barely a line.
  • PolishCleaner header strip — Logo redesigned to fit horizontally with the wordmark beside it, a vertical separator splits it from the project title block, and a single render pass fills in the page count (no more white-rectangle re-stamping).
v5.1.56

Tabloid PDF: fix “Invalid arguments” crash + add Spark²Plan logo

  • Fix“Invalid arguments passed to jsPDF.rect” crash — The Gantt bar drawer was reading data.row.y / data.row.height from autoTable’s callback, which are not reliable on the bundled plugin version and were returning undefined, producing NaN row coordinates and crashing every render. Switched to the always-populated data.cell.y / data.cell.height and added defensive Number.isFinite guards so any task with bad dates is silently skipped rather than killing the export.
  • Fix“could not fit page” autoTable warning — Increased the side buffer the column-width scaler reserves so the cumulative column widths plus padding stay strictly inside the table area.
  • NewSpark²Plan branded header — The PDF now opens with a navy header strip carrying a rounded indigo→cyan logo mark, the Spark²Plan wordmark, the URL, the project title, the date range / task count / generated timestamp, and the page number. Replaces the plain dark bar.
v5.1.55

Tabloid (11×17) Gantt + Tasks PDF export

  • New📄 PDF button in the top toolbar opens an export dialog. Pick which columns to include (defaults: WBS, Task, Duration, Start, Finish, %, Predecessors), choose between multi-page (tasks flow across pages) or single-page fit-to-page, and toggle critical-path coloring, data-date marker, and legend.
  • NewAligned Gantt rendering — The PDF draws the task table on the left and the Gantt bars on the right of the same row, with year/month banded time axis at the top. Bars are colored: blue (regular), red (critical), dark gray (summary, with end caps), green (progress overlay), diamond (milestone). The data-date appears as a vertical red line.
  • NoteVisible tasks only — The export respects the current expand/collapse state of the table, so collapse a parent before exporting if you want a phase-level overview. Selected columns scale automatically to fill the left half of the page; the right half is reserved for the Gantt.
v5.1.54

Double-click to edit Act Start, Act Finish, Earliest Start, Latest Finish

  • FixInline editingAct Start and Act Finish columns were read-only because no click handler was wired on the cells. Added onDoubleClick on both, matching the existing convention for the planned Start column and the Duration/Progress cells. The date picker opens anchored to the cell; pick a date, or use the “Clear” button to remove the actual.
  • PolishConsistent interactionEarliest Start and Latest Finish (added yesterday) previously opened on single-click, which fought with row-selection. Switched to double-click so every date column in the table behaves the same way.
v5.1.53

Fix “Something went wrong” crash on date picker

  • FixReferenceError: dpUpdate — The date picker’s save and clear callbacks were calling a helper (dpUpdate) that only existed inside the detail-panel render scope. Earlier builds happened to hoist it; the latest one didn’t, which crashed the app to the “Something went wrong” fallback whenever you picked a date for Start On, Actual Start, Actual Finish, Deadline, or Constraint Date. Replaced every reference with the top-level updateTask, which is always in scope.
v5.1.52

Invite team members by email (copyable link)

  • NewEmail invitations — Project owners can now invite someone who doesn’t yet have an account. Type their email, pick a role, and the modal returns a one-click-copy URL. Paste the link into your own email or Slack; the recipient signs up (or signs in) via the link and is auto-added with the chosen role. No third-party email service required.
  • NewPending invitation list — Outstanding invitations stay visible in the Members modal until they’re accepted or revoked. Each row has a Copy-link and Revoke action.
  • NoteOne-time setup — Requires a new project_invitations table in Supabase. Until that table is created, the “Invite by Email” section is non-functional but the rest of the modal works normally.
v5.1.51

Project Members: live search for adding users

  • NewType-ahead user search — The “Add Member” input now searches your team as you type, matching on username, display name, or email. Pick a candidate with a click or hit Enter when there’s a single match. Already-listed members are filtered out automatically. The role dropdown is now a proper controlled component (no more imperative DOM lookups).
v5.1.50

Block links into summary tasks (DCMA-14 #14)

  • FixNo more silent no-op links — A summary task can’t be the successor of a link. The scheduler computes a summary’s dates from its children, which silently overwrote any predecessor-driven date. The link existed in the database but did nothing. addDependency now rejects this case with a toast, the left-side connector dot is hidden on summary bars, and the predecessors-edit modal shows a banner instead of an “Add” picker when opened on a summary.
  • NewLogic Audit: links touching summary tasks — Added DCMA-14 check #14 to the Logic Audit tab. Flags every link whose predecessor or successor is a summary — including legacy summary-as-successor links from before this release — with an explanation of the issue and the recommended fix (link the leaves directly, or use a phase-complete milestone).
v5.1.49

Column-picker no longer clips off-screen

  • FixShow/Hide Columns menu — The dropdown was anchored to the right edge of the “⚙️ Columns” button, so when the toolbar wrapped and the button ended up on the far left of a row, the 180 px menu extended off the left side of the screen and only the right half of each label was visible. Anchored it to the button’s left edge so it always opens rightward into available space.
v5.1.48

Earliest Start & Latest Finish columns

  • NewInline constraint shortcuts — Two new optional columns under the column-picker menu. Earliest Start sets a P6-style SNET (Start No Earlier Than) constraint in one click; Latest Finish sets an FNLT (Finish No Later Than). The scheduler already honoured these constraint types — the new columns just remove the detail-panel detour so you can apply them at scale from the table.
  • NoteSingle constraint slot — Like MS Project, a task carries one constraint at a time. Setting Earliest Start on a task that already has a Latest Finish (or vice-versa) overwrites the previous one. Clearing either reverts the task to ASAP. For Primavera-style primary+secondary constraints, keep using the dedicated Constraint column.
v5.1.47

Executive Summary now groups two-level projects

  • FixGrouping with no project-root wrapper — The Executive Summary was treating every top-level summary and its direct children as a flat list, sorted by Start, because the grouping logic assumed an MS Project-style root task above the sections. Projects that have sections at the top of the WBS (no wrapper) now collapse leaves under their section header correctly. Three-level projects are unchanged.
v5.1.46

Surface real error messages in crash screen

  • Fix“Script error.” replaced with real cause — CDN-loaded scripts (React, jsPDF, XLSX, Supabase) now load with crossorigin="anonymous", so browsers no longer strip error messages to the generic “Script error.” placeholder. The crash screen also now includes an expandable stack trace, making it much easier to report and pinpoint bugs.
v5.1.45

Change Tracking Report PDF — landscape layout, no more truncation

  • ImprovedTracking PDF readability — the Change Tracking Report PDF now exports in landscape with wider Task / Old / New columns and proper text wrapping. Task names like “Rédaction la demande de soumission” and date values like “Mon May 18, 2026” are no longer cut off mid-word. Timestamp is also compacted (seconds dropped) so the column doesn’t hog space.
v5.1.44

Fix — runaway auto-scheduler loop on imports with circular predecessors

  • FixAuto-scheduler bails on cycles — when an imported file contains circular predecessor chains, the recalculator now stops gracefully instead of looping. Previously it would re-fire on every render, mutating dates around the cycle on each pass and flooding the database with PATCH requests — on Safari this also tripped CORS preflight and caused the project to reload. Now: cycles are detected once, a single console warning surfaces the affected task IDs, and tasks keep the dates from the imported file. Use Schedule Diagnostics → Logic Audit to find and break the loops, after which auto-scheduling resumes normally.
v5.1.43

Schedule Diagnostics — new Logic Audit tab (DCMA-14 inspired)

  • New🔍 Logic Audit tab in Schedule Diagnostics — the third tab alongside Lateness Drivers and Driving Path. Runs ten DCMA-14-inspired schedule-quality checks that find structurally weak tasks at a glance. Each check shows pass/warn/fail status against an industry threshold, an explanation of why it matters, a how to fix tip, and an expandable list of every affected task (click to jump to it in the Gantt).
  • NewChecks included:
    • Orphan tasks — no predecessors AND no successors (dead-end islands)
    • Open starts — tasks with no predecessors that aren’t the project start anchor
    • Dangling ends — tasks with no successors that aren’t the project end
    • Manual mode without constraint — pinned with no recorded reason (silent risk)
    • Hard constraints — Must Start On / Must Finish On density (P6 wants < 5%)
    • Long durations — tasks > 44 working days (DCMA threshold for splitting)
    • Lag — positive lag links that may hide a real activity
    • Lead — negative lag links indicating overlap (often over-optimistic)
    • Negative float — mathematically impossible to complete on time
    • High float — > 44 days slack, often signals missing forward logic
v5.1.42

Start Task: Today / Custom date — toolbar + right-click

  • NewStart Task buttons in the Edit toolbar — new Start Task group with two buttons: ▶ Start Today sets Actual Start to today in one click; 📅 Start On… opens a date picker for a custom date. Effective status flips to In Progress automatically once Actual Start is set.
  • NewRight-click → Start Task — the task context menu now has ▶ Start Task: Today and 📅 Start Task: Custom date… at the top, before Mark Complete / Reset Progress. The custom-date option opens the date picker at the cursor position.
v5.1.41

New “Action & Analysis” tab — toolbar declutter

  • New🎯 Action & Analysis tab — new toolbar tab between View and Edit. Houses everything that opens a report or runs an action, freeing the View tab to focus on layout, filters and zoom. Four labelled groups inside:
    • Reports — Executive Summary, S-Curve, Period Progress, Costs / EV.
    • Diagnostics — Schedule Diagnostics, Look-Ahead, Look-Back, Resources histogram.
    • Spotlight — Progress Spotlight, By Resource.
    • Actions — Data Date, What-If, Request Update, Import Update.
  • CleanupView tab focused on view — the Reports & Analytics row that previously crowded the View tab is gone. View now holds only Filter / Outline / Row Height / Layout / Save View.
  • CleanupWhat-If moved out of General — What-If Analysis used to live on the General tab; it’s now in the Actions group of the new tab where it conceptually belongs.
v5.1.40

Executive Summary: date labels auto-flip + show/hide toggle

  • FixDate labels no longer get cut off at the right edge — bars whose right edge sits past 80% of the chart width (and milestones past 88%) now render their date label on the left side of the bar instead of the right, so the text always stays inside the visible area. Same auto-flip applies to milestones near the chart edge.
  • New📅 Dates checkbox in the header — toggle bar-side date labels on or off. Useful for executive presentations where you want the cleanest possible visual without per-bar dates. Choice persists per browser.
v5.1.39

Executive Summary: scope filter (Both / Milestones / Starred / None)

  • NewScope toggle in the Executive Summary header — mirrors the S-Curve’s milestone filter. Choose what the report shows:
    • Both (default) — milestones ∪ ⭐-starred items, deduplicated
    • ◆ MS — only milestones (zero-duration diamonds)
    • — only starred items (any task type)
    • None — empty, useful for starting a clean slate
    Choice persists per browser. Auto-suggest fallback (level 1 phases + first/last task) still kicks in when Both finds nothing flagged.
v5.1.38

Filter on every column in the Activity Table

  • NewFilter funnel on every column — every column header in the Activity Table now has a filter icon. Clicking it opens a value-list dropdown (search + checkboxes) so you can filter by any field: ID, WBS, Name, Duration, Start, Finish, Progress %, Slack, Predecessors, Successors, Resources, Fixed/Actual/Total Cost, Constraint, Deadline, Actual Start/Finish, Start/Finish Variance, Milestone status, ⭐ flag, and any custom field. Previously only Name, WBS, Start, Finish, Predecessors, Successors and Resources were filterable.
  • New🧹 Clear filters button — appears next to ⚙️ Columns whenever any column filter is active, showing a count and clearing them all in one click.
  • RefactorUnified filter helper — the dropdown’s value list and the filter application logic both go through a single getColumnFilterValues helper, so adding a future column makes it filterable automatically.
v5.1.37

Milestone column + S-Curve tracks union of milestones and starred items

  • NewMilestone column in the Activity Table — new optional column ◆ MS shows a filled orange diamond for milestones and a faint outline diamond for non-milestones. Click to flip a task between milestone (zero-duration diamond) and regular task. Toggle on via ⚙️ Columns. Lets you see at a glance which tasks are milestones without scanning the Task Name cell or duration.
  • ChangeS-Curve tracks union, not intersection — the “Tracked Items” section in the S-Curve now shows every milestone (any is_milestone) or any ⭐-starred task — deduplicated. Previously the section showed only the intersection (milestones that were also starred), which silently dropped non-milestone starred tasks from view.
  • NewThree-state filter — new toggle in the section header: All (N) (default, the union), ◆ Milestones, ⭐ Starred. Per-row badges show whether each item is a milestone, starred, or both.
v5.1.36

S-Curve milestone tracker — Key / All toggle

  • NewKey / All toggle — the S-Curve’s milestone tracker now has a switch in the section header: ⭐ Key (N) shows starred milestones (the previous behaviour), All (M) shows every milestone in the project. The chart caps markers at 12 to avoid clutter; the table below shows the full list when in All mode.
v5.1.35

Inline number-input backspace fix + Key Milestone forecast in S-Curve

  • FixInline numeric edits no longer fight backspace — editing Duration / Progress % / Fixed Cost / Actual Cost from the Gantt table now lets you clear the field naturally with backspace (it used to snap back to 0 mid-typing because the input was controlled and immediately re-wrote the state on every keystroke). Inputs are now uncontrolled with defaultValue — commits on blur/Enter, cancels on Esc.
  • NewS-Curve — Key Milestone forecast — the S-Curve now tracks your starred milestones (the ⭐ flag from the Activity Table). Each one renders as a diamond at its planned date on the chart axis; if the forecast has slipped, a dashed bridge connects the planned diamond to a translucent forecast diamond. Below the chart, a new section lists each tracked milestone with planned vs forecast/actual date, days variance, and status (Hit on plan / Hit late / Forecast late / Forecast ahead / Forecast on plan). Click a row to jump to the milestone, or click the ⭐ to toggle tracking.
  • NewSmart fallback — if you haven’t starred any milestones yet, the section auto-shows the next 3 upcoming milestones with a hint to star them.
v5.1.34

Schedule Diagnostics: Lateness Drivers + Driving Path

  • New🩺 Schedule Diagnostics modal — new button in the Reports toolbar opens a two-tab diagnostic view. Built specifically to answer “what’s making my project late, and what should I do about it?”
  • NewLateness Drivers tab — ranks every late or trending-late task by score = own delay × downstream impact × criticality. Each entry shows a delay breakdown (own days vs days inherited from predecessors) so you can tell symptoms from causes, the number of downstream tasks blocked, and a heuristic Suggested Action (Start now / Address driving predecessor / Crash or fast-track / Loosen constraint / Re-sequence successors / Compress duration). Click any row to jump to the task in the Gantt.
  • NewDriving Path tab — traces the longest chain through the project by walking driving predecessors (the predecessor whose finish + lag determines each task’s start). Like P6’s “Longest Path” view. Header KPIs: tasks on path, total duration, % complete, project end date. Each step is numbered and tagged (START / PROJECT END / CRIT / LATE / DONE), with the link type & lag from the upstream driver shown in-line. Compressing any task on this chain pulls the project end date in by the same amount.
v5.1.33

Impact Chain: anchor task is now editable

  • NewEdit the anchor task in Impact Chain — the task you opened the chain on now has an ✏️ Edit button in the top-right of its card. Click it to open the same inline edit panel (Start, Duration, Finish, Progress, Manage links) that the upstream / downstream rows use. No Go to task button on the anchor since you’re already viewing it.
v5.1.32

Period Progress: chart bars now align with the phase-table date columns

  • FixVertical alignment of chart and table — in Period Progress, every period column in the bottom phase table now sits directly under its corresponding bar group in the chart above. Previously the SVG used variable groupW while the table used fixed grid widths, so the months drifted apart at wide screens. Both sides now share the same per-period width (64 px), the same Activity/Series prefix (200 + 130 px), and a single horizontal-scroll wrapper, so they stay aligned at any zoom and scroll position.
  • PolishSynced horizontal scroll — chart and table now scroll together as one unit, so a horizontal eye-scan from any bar straight down lands on the precise cell value with no manual scrolling required.
v5.1.31

Period chart layout fix + cross-feature audit for new tracking fields

  • FixPeriod Progress — table layout — the Phase breakdown table was rendering with a date column wedged between Activity and Series in Safari (a known position: sticky + <td> rendering bug). Replaced sticky positioning with proper fixed widths and clean horizontal scroll. Activity column widened to 200 px (full project / phase names visible), Series to 130 px (no more Cum-… truncation). Modal now uses up to 1600 px / 98 vw instead of 1200, so more periods are visible without scrolling.
  • FixSnapshot/Undo coverage — the in-memory undo snapshot and its DB-sync now capture actual_start, actual_finish, actual_cost, status_override, fixed_cost, and baseline references. Previously these were silently dropped on undo, losing tracking data.
  • NewMS Project XML export — actuals included<ActualStart>, <ActualFinish>, <FixedCost> and <ActualCost> are now emitted per task, and project <FinishDate> reads from the new Must Finish By field.
  • FixPeriod Progress respects status_override — a task with status_override = completed now contributes 100% to actuals at every period (not just from the next status update onwards). not_started / on_hold override clamps actual % to 0.
  • FixLook-Ahead respects status_override — tasks marked completed via override no longer appear in the Starting / In Progress / Finishing sections.
  • FixMain Gantt bar honors status_override — bars render with the “completed” (green) style when status is overridden to Completed regardless of raw %.
  • FixEarned Value math respects status_override — BCWP per task uses effective % (override-aware), so CV / CPI / EAC reflect the same status the rest of the app shows.
v5.1.30

Request Update workflow synced with new tracking fields

  • NewActual Start & Actual Cost in the Update Form — the link your team-mates open from the Request Update email now lets them enter Actual Start (when work really began) and Actual Cost (ACWP so far) per task, alongside the existing progress / proposed dates / actual finish. Active tasks show both in a green “Actuals” group; completed tasks show Actual Start and Actual Finish side-by-side under the date-update toggle.
  • NewImport Update preview — the review-and-approve table now has dedicated Act Start and Act Cost columns with previous-value hints, plus summary counts of actual starts / cost updates received.
  • NewStatus mapping into status_override — when an assignee picks Blocked, the task’s status_override is set to on_hold; Completed sets status_override = completed and forces 100%. On-track / Delayed are still captured in the audit trail without overriding.
  • FixApply Update now writes via updateTask — previously the apply step called setTasks + a raw Supabase update with an incorrect column name (startDate vs DB’s start_date), so start-date changes from imported updates didn’t persist server-side. Now goes through updateTask, which uses the correct column mapping, fires auto-actuals capture on % transitions, and writes a task_status_updates log row for time-phased reports.
  • NoteWire format extended — the [SPARK2PLAN_UPDATE] pipe-delimited block now has two trailing fields: actualStart|actualCost. Backward-compatible: older emails still parse; the parser treats missing fields as “no change”.
v5.1.29

Polish round: resizable Exec Summary, project Must Finish By, auto-active status, Impact Chain inline edit

  • NewProject Bounds in General tab — new Start and Must Finish By date inputs (matching P6’s “Project Planned Start” / “Must Finish By” concepts). Shows a red “⚠ Nd over” badge inline when the project’s computed end is past the Must Finish By date.
  • NewAuto-active status with override — tasks now report as In Progress automatically once their start date is reached (even at 0%). The Status filter and Status row in the detail panel respect this. Manual override via a new Status dropdown in the detail panel: Auto (derived) / Not Started / In Progress / Completed / On Hold. Override persists per task; an OVR badge marks overridden tasks.
  • NewImpact Chain — inline edit + hover actions — clicking any row in the Impact Chain now opens an inline edit panel for Start, Duration, Finish, Progress, and a 🔗 Manage links button to open the Dep Viewer. Hover any row to reveal ✏️ Edit and 🔍 Go buttons in the top-right (Go jumps to the task in the Gantt as before).
  • NewExecutive Summary — resizable task panel — drag the splitter between the task list and the Gantt to widen the task column. Solves truncated names in Fit mode. Width persists per browser.
  • PolishExecutive Summary header — close × button is now pinned to the top-right so it’s always visible regardless of header wrap.
  • PolishPeriod Progress visuals — first two columns of the Phase breakdown table (Activity, Series) are now sticky on horizontal scroll and wide enough to show full labels (no more Proje… / Cum-… truncation). SPI line band at the top has more vertical room so values don’t collide with the “Optimal SPI = 1” label, which now sits at the right edge.
  • NoteMigration required — run supabase-project-end-and-status.sql in Supabase SQL editor for project Must Finish By and the Status override column.
v5.1.28

Year zoom + Executive Summary timeline density (horizontal scroll)

  • NewYear zoom level on the main Gantt — alongside Day / Week / Month, a new Year button shows one cell per year with decade groupings (e.g. “2020s”) at the top tier. Useful for multi-year programmes where Month view is still too narrow to fit the full timeline. Also wired into the Ctrl+wheel zoom progression.
  • NewExecutive Summary timeline density (Width) — new Width control in the header: Fit (default, current behaviour — squeezes the chart into the viewport), Compact / Normal / Wide (50/100/180 px per month, with horizontal scrolling). Solves the “dates don’t fit on screen” problem on multi-year projects: pick Normal or Wide and scroll horizontally to read every label clearly. Choice persists per browser. Vertical scroll continues to work as before.
v5.1.27

P6-style reporting suite: variance columns, period chart, EV dashboard, look-back upgrade

  • NewPeriod Progress report — new 📊 Period button in the Reports toolbar. Side-by-side weekly (or monthly) Cum-PLAN % vs Cum-ACT % bars, an SPI line over time, and a Cum-PLAN/Cum-ACT breakdown table by Phase (WBS Level 1). Reads from the new status-update log, with synthesis fallback when no history exists yet. Matches the P6 / Excel period-tracking chart format used in EVM reports.
  • NewEarned Value dashboard — the existing 💰 Costs dashboard now reports the full set of EVM metrics: BAC (Budget at Completion), BCWS (Planned Value), BCWP (Earned Value), ACWP (Actual Cost), CV (Cost Variance), SV (Schedule Variance), CPI, SPI ($), EAC (Estimate at Completion), VAC and ETC. New per-task EV table at the bottom shows BAC/BCWP/ACWP/CV/CPI per task, sorted by budget. Color-coded thresholds match P6 conventions (green ≥ 0.95, amber 0.80–0.94, red < 0.80).
  • NewActual Cost (ACWP) per task — new Actual Cost column (hidden by default; toggle in ⚙️ Columns) lets you enter real spend per task. Feeds the EV dashboard’s CPI and EAC. Note: requires the new supabase-earned-value.sql migration to persist.
  • NewVariance columns — four new optional columns: Act Start, Act Finish, Start Var (actual_start − baseline_start), Finish Var (actual_finish − baseline_finish). Color-coded: red for late, green for on-time/early. Behaves like P6’s Activity Table.
  • NewLook-Back — Variance vs Baseline section — the report now flags tasks finishing later than their frozen baseline_finish, sorted by days late. Distinguishes “already finished late” from “currently trending late”. New 5th stats card.
  • NoteMigration required for Actual Cost — run supabase-earned-value.sql in Supabase SQL editor. The other features work without it. Until applied, Actual Cost edits silently no-op.
v5.1.26

P6-style tracking primitives: actuals, data date, status update log

  • NewActual Start / Actual Finish per task — new fields shown in the task detail panel under Progress. Auto-captured on % transitions: when % goes 0 → >0 the project Data Date is recorded as Actual Start; when % reaches 100, it's recorded as Actual Finish. Either is overridable manually (click the field to pick a date, ✕ to clear). Distinguishes “when work was scheduled to happen” from “when it actually happened” — the foundation of any Earned Value / SPI tracking.
  • NewProject Data Date — new 📅 Data: … button in the Reports toolbar. The Data Date is the project's “as of” cutoff: everything left of it is actuals, everything right is forecast. Auto-captured actuals use this date. Matches Primavera P6's data-date concept.
  • NewStatus update log — every progress edit now writes an append-only row to a new task_status_updates table (task_id, status_date, %, actuals, who). This is the history needed for time-phased SPI lines, period progress bars, and a P6-style cumulative plan-vs-actual report (coming next). Provides a full audit trail of how progress evolved over time.
  • NoteMigration required — needs a one-time SQL migration in Supabase (supabase-tracking-actuals.sql in the repo). Until applied, the new fields and log insert silently no-op so the app keeps working.
v5.1.25

Impact Chain viewer + truthful S-Curve forecast

  • NewImpact Chain — a new 🌐 Impact Chain button in the task detail panel opens a modal that walks the dependency graph in both directions, level by level: every upstream task this one depends on, and every downstream task it impacts, however many steps deep. Header summary shows totals, depth, criticals in chain, and late tasks in chain. Click any row to recenter the chain on that task and jump the Gantt to it.
  • FixS-Curve forecast — the “Forecast End” KPI could read “On track” in green even when SPI was 0.90, schedule variance was negative, and the project was 36 days behind. Cause: a linear extrapolation from project start that ignored the S-shape of the planned curve, often projecting completion before the planned end on long projects. Replaced with the standard EVM formula forecastEnd = today + plannedRemainingDays / SPI, so the forecast badge now agrees with the SPI / variance / days-behind cards on the same screen. Also added an “Nd ahead” state for projects genuinely ahead of plan.
v5.1.24

Inline edits: false “modified by another user” error removed

  • FixTask editing — renaming a task or changing duration/dates could spuriously trigger a “This task was modified by another user” toast and discard the edit, even with no other user active. The optimistic-locking check compared a stale local updated_at against the server’s, but ~40 internal code paths (schedule recalcs, summary flags, drag/resize, sort reorders) bumped the server timestamp without refreshing the local one, so the next inline edit failed the check on a self-induced race. Removed the lock; last-write-wins for now. Proper concurrency will return with the Supabase Auth migration.
v5.1.23

Stripe webhook: subscription updates restored

  • FixBilling synccustomer.subscription.updated events were returning HTTP 500 because newer Stripe API versions moved current_period_start/current_period_end from the subscription onto its items. Webhook now reads from both locations, so subscription period and status changes flow through to the database again.
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.