Baselines
A baseline is a frozen snapshot of your project’s schedule at a point in time. Capture one when you commit a plan to stakeholders, then compare it against the live schedule to see exactly how far — and which tasks — have drifted.
Capturing and managing baselines in the app
Section titled “Capturing and managing baselines in the app”From the Schedule view, open the Actions (···) menu:
- Capture baseline takes a snapshot of every task’s current planned dates. It
requires the Project Manager role, auto-names the snapshot (
Baseline N), and makes it active. A short confirmation first explains what a baseline is and — if one is already active — reminds you that capturing a new one keeps the previous baseline in the project’s history rather than overwriting it. You can also capture from the Baseline section of a task’s detail drawer when no baseline exists yet. - Baselines… opens the baseline manager, where any project member can see every baseline (name, capture date, and task count) and which one is active. A Project Manager can Set active to switch the comparison baseline, and a Project Owner can Delete one.
The same operations are available through the REST API for automation. Baseline ghost bars drawn directly on the Gantt canvas and structured rebaseline reasons are planned for 0.5.
What a baseline captures
Section titled “What a baseline captures”Capturing a baseline records, for every task in the project at that moment:
- the task name (kept even if the task is later deleted),
- planned start and finish dates,
- duration, and any actual start/finish already recorded.
Snapshots are immutable — once written, a baseline’s task rows never change, so a baseline remains a faithful record of what the plan looked like when you took it. A baseline notes whether its tasks had computed CPM dates at capture time, so a comparison can flag a snapshot that was taken before the schedule was fully calculated.
Multiple baselines
Section titled “Multiple baselines”A project can hold many baselines — for example one per phase gate — but one is active at a time. The active baseline is the one used for comparison. Activating a different baseline automatically deactivates the previous one.
Capturing and managing baselines via the API
Section titled “Capturing and managing baselines via the API”All endpoints are project-scoped and authenticated with a bearer token ($JWT);
$PROJECT_ID is the project UUID.
# 1. Capture a baseline (name optional — auto-named "Baseline N" if omitted).# Requires the Project Manager role. Snapshots every task atomically.curl -X POST -H "Authorization: Bearer $JWT" -H "Content-Type: application/json" \ -d '{"name": "Phase 1 commit"}' \ https://trueppm.example.com/api/v1/projects/$PROJECT_ID/baselines/
# 2. List baselines for the project.curl -H "Authorization: Bearer $JWT" \ https://trueppm.example.com/api/v1/projects/$PROJECT_ID/baselines/
# 3. Activate a baseline (deactivates any other). Requires the Project Manager role.curl -X POST -H "Authorization: Bearer $JWT" \ https://trueppm.example.com/api/v1/projects/$PROJECT_ID/baselines/$BASELINE_ID/activate/
# 4. Delete a baseline. Requires the Project Admin (owner) role.curl -X DELETE -H "Authorization: Bearer $JWT" \ https://trueppm.example.com/api/v1/projects/$PROJECT_ID/baselines/$BASELINE_ID/| Method & path | Purpose | Permission |
|---|---|---|
GET /api/v1/projects/{id}/baselines/ | List baselines | Project member |
POST /api/v1/projects/{id}/baselines/ | Capture a baseline (auto-named if blank) | Project Manager (ADMIN) |
GET /api/v1/projects/{id}/baselines/{baselineId}/ | Retrieve (with task count) | Project member |
POST /api/v1/projects/{id}/baselines/{baselineId}/activate/ | Make active, deactivate others | Project Manager (ADMIN) |
DELETE /api/v1/projects/{id}/baselines/{baselineId}/ | Delete a baseline | Project Admin (OWNER) |
Comparing against the plan
Section titled “Comparing against the plan”Once a baseline is active, opening a task in the Schedule view shows a Baseline section in the task detail drawer with the planned-vs-current comparison for that task:
| Planned (baseline) | Current (live) | Delta |
|---|---|---|
| Start / finish at capture | Start / finish from the latest CPM run | Variance in days (e.g. +3 days) |
The same per-task comparison is available directly from the API:
# Active baseline vs current schedule for a single task.curl -H "Authorization: Bearer $JWT" \ https://trueppm.example.com/api/v1/projects/$PROJECT_ID/tasks/$TASK_ID/baseline/The response is discriminated by has_baseline / in_baseline: it reports no baseline,
a task added after the baseline was taken, or a full comparison row with
start_delta_days / finish_delta_days (positive = slipping later than planned).
current_start and start_delta_days compare against the task’s span
(scheduled_start — see the bar vs. the remaining-work
window), not the
narrower remaining-work window that early_start shrinks toward as an
in-progress task approaches completion. Comparing against the remaining-work
window would make start_delta_days grow purely from progress being
reported, not from any actual schedule slip.