Skip to content

Try TruePPM

TruePPM’s zero-config evaluation paths — a hosted read-only demo and a one-command local trial, both preloaded with the same Platform Migration hybrid sample project — arrive with the 0.4 beta. This page previews them.

Once 0.4 tags, nothing will be needed to install — you will open the hosted demo and click around a real, populated schedule:

try.trueppm.com (live at the 0.4 tag)

It will be served through TruePPM’s own tokenized, read-only share link (the same mechanism the product gives you for sharing a schedule or board). There is no login and no write path — you are looking at a live instance, not a screenshot tour, but nothing you do can change it. The demo is noindex, resource -capped, and reachable only at the share URL.

One command: run the demo locally (ships in 0.4)

Section titled “One command: run the demo locally (ships in 0.4)”

Once 0.4 tags and its release images are published (#939), one command will bring up the whole stack on your own machine with zero configuration and auto-seed the sample data:

Terminal window
git clone https://gitlab.com/trueppm/trueppm.git && cd trueppm
docker compose -f docker-compose.demo.yml up

That is the entire setup. The stack:

  • migrates the database and seeds the Platform Migration sample (no manual data entry);
  • mints the public read-only schedule share link and prints its URL in the demo-seed container logs;
  • serves the web UI on http://localhost with noindex headers and a Disallow: / robots.txt;
  • applies conservative per-container memory and CPU caps.

Read the printed share URL from the logs and open it:

Terminal window
docker compose -f docker-compose.demo.yml logs demo-seed | grep 'URL:'
# → http://localhost/share/schedule/<token>

The raw share token is stored only as a hash, so a randomly-minted link cannot be reprinted after the first run. To get a stable, reprintable URL that survives restarts, pin a token before the first up:

Terminal window
TRUEPPM_DEMO_SHARE_TOKEN=your-fixed-token \
docker compose -f docker-compose.demo.yml up

The URL is then http://localhost/share/schedule/your-fixed-token. The create_demo_share_link command that mints it is idempotent on the pinned token.

If you are serving this stack on a public origin rather than your own machine, set TRUEPPM_DEMO_BASE_URL too so the logged URL names that host — it defaults to http://localhost, which is right for a local trial and wrong for a hosted one:

Terminal window
TRUEPPM_DEMO_SHARE_TOKEN=your-fixed-token \
TRUEPPM_DEMO_BASE_URL=https://demo.example.com \
docker compose -f docker-compose.demo.yml up

“Load demo data” writes a whole program — projects, tasks, resources, baselines, a risk register — on one click. You do not have to take that on trust. Every bundled sample is a committed JSON file you can read first.

In the UI: Settings → System → Demo data lists each fixture with its entity counts, size and SHA-256, and a Download button. From the demo loader itself, the picker’s Inspect files ↗ link opens the same page in a new tab, so the program you were about to create is exactly where you left it.

From a terminal, the whole chain is four steps:

Terminal window
# 1. See what's bundled — sizes, digests, and how much each one will write.
curl -s -H "Authorization: Bearer $TOKEN" \
http://localhost:8000/api/v1/programs/samples/ | jq '.[] | {key, task_count, size_bytes, sha256}'
# 2. Download one. The bytes are exactly what the importer reads.
curl -s -H "Authorization: Bearer $TOKEN" -OJ \
http://localhost:8000/api/v1/programs/samples/atlas-platform-launch/download/
# 3. Verify you got the file the instance advertised, and read it.
sha256sum atlas-platform-launch.json
jq 'keys' atlas-platform-launch.json
# 4. Dry-run it — validates and reports, writes nothing.
curl -s -X POST -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
--data-binary @atlas-platform-launch.json \
http://localhost:8000/api/v1/programs/import/validate/ | jq

Only then POST the same file to /api/v1/programs/import/, or click Load. The dry run’s replaces key tells you up front whether that import would replace a program you already own — null means the slug is free. If it names one, the import returns 409 until you re-send with replace=true. The import itself answers 202 with a program_id and an import_request_id; poll /api/v1/programs/{program_id}/import/jobs/{import_request_id}/ until status is success.

You want to…UseAvailable
Evaluate a populated demo todayInstallationseed_demo_project --with-personasNow (0.3)
Learn the data model via the APIQuickstart, Route BNow (0.3)
Stand up a real instance for your teamInstallationNow (0.3)
Click around a live schedule with nothing to installtry.trueppm.comShips in 0.4
Run the read-only demo on your own machinedocker compose -f docker-compose.demo.yml upShips in 0.4