What's new

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

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.