Flow Metrics

Shipcast

Forecast delivery dates with confidence. Make promises you can keep.

Shipcast is a self-hosted forecasting and analytics service that brings Monte Carlo simulations to your delivery pipeline. Stop guessing when work will be done. Start showing stakeholders probabilistic forecasts backed by your team’s actual performance data.

Deploying Shipcast for a team, on infrastructure you manage? The steps below set it up on one machine and are all most people need. If you are running it as a service for other people — your own PostgreSQL, a TLS proxy, a platform that provisions its own secrets — read ADMIN.md instead.


Setup

Before you start

You need Git and a container engine (Docker or Podman), and this repository cloned. If you do not have those yet, the installation guide is the fastest way to get them.

You also need the access token issued with your license — the configuration wizard asks for it.

Any recent laptop or desktop is enough: 2 CPU cores, 2 GB of free memory and 20 GB of disk handle plans of a few hundred deliverables. For larger plans, or a server shared by a team, see Sizing the server.

1. Go to the Shipcast directory

cd shipcast

2. Configure

./init_shipcast.sh      # Linux/macOS
.\init_shipcast.cmd     # Windows

The wizard asks for your access token, a database password (type generate for a secure random one), and the port to use. Press Enter to accept any value it offers. Re-run it any time to change something.

Prefer to edit by hand? Copy .env.example to .env instead.

3. Start

./run_shipcast.sh       # Linux/macOS
.\run_shipcast.cmd      # Windows

This signs in to the image registry, downloads the images, and starts everything. The first run takes a few minutes; later ones are quick.

4. Open Shipcast

Go to http://localhost:3456 — or whichever port you chose.

5. Create your account

The first time you open Shipcast there are no users yet, so it takes you straight to a setup page. Enter your name, email, and a password. That account is the administrator: it can add other users later, from Admin → Users.

If you are not redirected automatically, go to /setup directly — for example http://localhost:3456/setup.

6. Install your license

Shipcast runs without a license, but simulations will not run until one is installed — so this step is not optional in practice.

Your license may be tied to this specific installation, and the identifier it is tied to is created when Shipcast first starts. So the order matters:

  1. With Shipcast running, open Admin → License (/admin/license). It shows the deployment ID of this installation.
  2. Send that ID to your license provider.
  3. Upload the license file you receive back, on that same page.

The page then reports Valid, along with the expiry date and which features your license includes.


Everyday commands

Run these from the shipcast directory. On Windows, use .\run_shipcast.cmd in place of ./run_shipcast.sh — the commands themselves are identical.

Command What it does
./run_shipcast.sh Start Shipcast (or reload it if already running)
./run_shipcast.sh status Check whether it is running
./run_shipcast.sh logs Watch live logs — Ctrl+C to stop watching
./run_shipcast.sh stop Stop Shipcast (asks first)
./run_shipcast.sh pull Download the newest images without starting
./run_shipcast.sh tags List the versions available to you
./run_shipcast.sh clean Stop and delete all data (asks first)
./run_shipcast.sh help Show all commands

Three scripts ship with Shipcast:

Script Purpose
init_shipcast The configuration wizard — creates and updates .env
run_shipcast Everything above: start, stop, logs, status
run_shipcast_test The same, against the newest development build and a separate database

On Windows, use the .cmd files. Stock Windows refuses to run .ps1 scripts and opens them in Notepad instead; each .cmd hands the matching script to PowerShell with that restriction lifted for that one launch, changing no setting on your machine. One spelling differs: ask for help as run_shipcast.cmd help, because PowerShell rejects --help before the script sees it. Everything else is spelled the same on every platform.


Updating

Restarting picks up the newest images automatically:

./run_shipcast.sh

To see what is available, run ./run_shipcast.sh tags. To stay on a particular version, set IMAGE_TAG in .env (or re-run the wizard) and restart:

IMAGE_TAG You get Moves when
latest the newest release every release, including features
1.8 the newest patch of 1.8 — fixes, no features a 1.8.x patch ships
1.8.0 exactly that release, forever never
main the newest development build (no guarantees) every change merged upstream

latest is the default and right for most installations. Your data is upgraded automatically when Shipcast starts, so there is nothing else to do.

test still works and is identical to main, but it is deprecated — it was named after our test environment rather than after what it gives you. Switch to main at your convenience.


Your data

Everything you create — users, simulations, forecasts, your license — lives in a database stored in a container volume named fmb-shipcast-db-data. It survives restarts, upgrades and reboots.

./run_shipcast.sh clean permanently deletes it. Two things do not come back afterwards:

So treat clean as a last resort, not as a way to restart something. To just restart, use stop then start again.

Changing DB_NAME after the first run has the same effect as a rename with no data: Shipcast stops with Database "…" does not exist and tells you the exact command that would create it. Change it only if you mean to start a second, empty Shipcast.


Configuration

The wizard writes these to .env. Re-run ./init_shipcast.sh any time to change them.

Variable Example Description
REGISTRY_URL registry.gitlab.com/tomasz-feliksik/flow-metrics-base Where the images come from — see Registries
REGISTRY_USER token Registry username — on GitHub, your GitHub username
ACCESS_TOKEN glpat-xxxxxxxxxxxx Registry access token (issued with your license)
IMAGE_TAG latest Which version to run — see Updating
DB_USER postgres Database username
DB_PASSWORD (generated) Database password — type generate in the wizard
DB_NAME shipcast Database name
FRONTEND_HOST 127.0.0.1 127.0.0.1 = this machine only; 0.0.0.0 = the network
FRONTEND_PORT 3456 Port to open in your browser
RUST_LOG info How much detail in the logs
SHIPCAST_SECRETS_KEY (generated) Encrypts your Jira/ADO credentials — see below
CONTAINER_RUNTIME docker docker or podman

Two of these are worth understanding before you change them:

Registries

The same images, byte for byte, are published to two registries. Use the one your access was issued for; switching is a matter of these three lines in .env (or re-running the wizard), followed by a restart:

GitLab GitHub
REGISTRY_URL registry.gitlab.com/tomasz-feliksik/flow-metrics-base ghcr.io/lean-agility
REGISTRY_USER token your GitHub username
ACCESS_TOKEN glpat-… with read_registry ghp_… — a classic token, read:packages

GitHub does not accept fine-grained tokens for its container registry; create a classic one at https://github.com/settings/tokens. Your data is not affected by switching: it lives in the database volume, not in the images.

Passwords you set by hand must use only letters, digits, and . _ ~ -. Other characters ($, `, /, @, :, ', ") break the connection string. Typing generate in the wizard always produces a safe one.


Troubleshooting

Problem What to do
Cannot download the images Check ACCESS_TOKEN and REGISTRY_USER in .env. Test with docker login <registry host> — see Registries
Nothing starts Check the engine is running (docker info), then ./run_shipcast.sh logs
Port already in use Change FRONTEND_PORT in .env and restart
The page loads but nothing works ./run_shipcast.sh status — the database container should be healthy
Database "…" does not exist You changed DB_NAME after the first run. See Your data
Simulations will not run Check Admin → License. Expired, missing, or WrongDeployment after a clean
Jira/ADO pages say “needs configuration” SHIPCAST_SECRETS_KEY is missing from .env. Re-run ./init_shipcast.sh
Nobody can sign in / password lost See Locked out below

Locked out

If the administrator password is lost, reset the accounts and create a new one. Your simulations and license are not touched:

docker exec -it fmb-shipcast-api api admin reset --force
./run_shipcast.sh

Then open Shipcast again and complete the setup page as in step 5 of Setup. Note this removes all administrator accounts, so whoever completes setup next becomes the administrator.

Podman network errors (WSL or corporate machines)

Errors like netavark: nftables error or Could not process rule: No such file or directory come from restricted network access, not from Shipcast. Switch Podman to a different networking mode:

mkdir -p ~/.config/containers
cat > ~/.config/containers/containers.conf << 'EOF'
[network]
default_rootless_network_cmd = "pasta"
EOF

podman system reset --force

If pasta is unavailable, use slirp4netns in its place. On Windows, Docker Desktop avoids this class of problem entirely.


Running Shipcast for a team

Everything above assumes one machine, set up by the person who uses it. If you are deploying Shipcast as a service — your own PostgreSQL server, HTTPS, secrets from a vault, Kubernetes, backups — ADMIN.md covers the deployment contract, the database requirements, TLS and reverse-proxy setup, backups, and upgrades.


Support

Contact your license provider for support, access tokens, and product inquiries.