CHIPSCollaborative Heuristic for Iterative Planning and Story-pointing · documentation for version 1.7.0

Installation guide

Choose one way to install. Each keeps its data in PostgreSQL and can be upgraded in place.

Method Best for Package
Debian / Ubuntu package Debian-family servers (x86_64) chips_1.7.0_amd64.deb
Installer script Any Linux with systemd (x86_64) chips-1.7.0-linux-x86_64.tar.gz
Docker Compose Hosts that run containers chips-1.7.0-linux-x86_64.tar.gz or chips-1.7.0-docker.tar.gz
Python package Your own process manager chips_estimation-1.7.0-cp310.cp311.cp312.cp313-none-linux_x86_64.whl

| Windows installer | Windows 11, Windows Server 2022 / 2025 | chips-1.7.0-windows-amd64.zip | | macOS installer script | macOS 12+ on Apple silicon or Intel | chips-1.7.0-macos-arm64.tar.gz, chips-1.7.0-macos-x86_64.tar.gz |

The packages contain CHIPS compiled for that operating system and processor, for Python 3.10–3.13 (see Protected builds); ARM64 Linux packages are named …-linux-aarch64 / …_arm64.deb.

Verify what you downloaded first: sha256sum -c SHA256SUMS.

By installing CHIPS you accept its license agreement; the first administrator accepts it again when setting CHIPS up.

Debian or Ubuntu package

sudo apt install ./chips_1.7.0_amd64.deb

The package installs its dependencies (Python, PostgreSQL), creates the database, the scrumpoker service user and the scrum-poker systemd service, and starts CHIPS on port 8080. Then open http://<server>:8080 and choose Set up CHIPS with the setup code the package printed (see First-time setup). Settings are in /etc/scrum-poker.env (see Configuration).

Installer script (Linux and macOS)

tar xzf chips-1.7.0-linux-x86_64.tar.gz && cd chips-1.7.0
sudo ./deploy/install.sh          # a macOS package: ./deploy/install.sh (no sudo)

The script supports Debian/Ubuntu (apt) and Fedora/RHEL-family (dnf) hosts with systemd.

sudo ./deploy/install.sh

It installs Python and PostgreSQL, creates a scrumpoker database and role with a random password, copies the app to /opt/scrum-poker, creates a virtualenv, writes /etc/scrum-poker.env and starts the scrum-poker service on port 8080.

At the end it prints a one-time setup code. Open http://<host>:8080, choose Set up CHIPS and enter it: the wizard creates the administrator and stores the installation options (see First-time setup). Then create a project and a room, and share the room's link.

Re-running the script upgrades in place, keeping the database and settings (it also removes the two services used by earlier versions of this project). Everything it adds to the machine is recorded in /var/lib/scrum-poker, so it can be removed cleanly later (see Uninstall).

sudo systemctl status scrum-poker
journalctl -u scrum-poker -f
sudo nano /etc/scrum-poker.env && sudo systemctl restart scrum-poker

Production notes * Set PUBLIC_URL in /etc/scrum-poker.env to the address people use: share links and OAuth redirect URIs are built from it. * STORAGE_SECRET signs browser sessions and also encrypts the Jira tokens and OAuth client secrets stored in the database. Keep it secret; if you change it, people sign in again and saved Jira connections and OAuth client secrets must be entered again. * Put it behind HTTPS when it is reachable beyond a trusted network: deploy/Caddyfile sets up Caddy with an automatic certificate. * Self-registration is off unless the setup wizard turned it on (Admin → Settings). Add people in Admin → Users, or let them sign in with your organisation's OAuth provider. * Behind a reverse proxy on another machine, set FORWARDED_ALLOW_IPS to its address so CHIPS sees the browsers' addresses (for the activity log and for blocking password guessing). * Command-line administration on the host (also a way back in if nobody can sign in): sudo -u scrumpoker bash -c 'set -a; . /etc/scrum-poker.env; cd /opt/scrum-poker; venv/bin/python -m scrumpoker.manage list-users' — commands: create-admin, create-user, set-role, reset-password, enable, disable, list-users, truncate-log, setup-code, unlock, reset-2fa, security-check, license. * GET /healthz returns 200 while the database answers (503 otherwise), for monitoring. * Run a single instance: live updates are delivered within the process.

macOS

Use the macOS package (chips-1.7.0-macos-arm64.tar.gz for Apple silicon, …-macos-x86_64 for Intel).

For macOS 12 or later, on Apple silicon or Intel. Run it as yourself, without sudo:

./deploy/install.sh

On a Mac the same command runs the macOS installer (deploy/macos/install.sh). It:

Homebrew (https://brew.sh) is needed only when PostgreSQL or a recent Python has to be installed. Like the Linux installer, it records what it adds, and re-running it upgrades in place.

Things to know when a Mac is the host:

Windows

For Windows 11 and Windows Server 2022 / 2025 (x64; Windows on ARM runs the x64 package). Windows 12 has not been released yet; the installer uses only standard Windows and PowerShell features. Unpack chips-<v>-windows-amd64.zip and double-click deploy\windows\install.cmd (it asks for administrator rights), or in an elevated PowerShell:

powershell -ExecutionPolicy Bypass -File deploy\windows\install.ps1      # options: -Port 8080 -DatabaseUrl … -NoFirewall

It:

Re-running it upgrades in place. Day to day:

Get-ScheduledTask CHIPS | Start-ScheduledTask            # or Stop-ScheduledTask
Get-Content C:\ProgramData\CHIPS\logs\chips.log -Tail 50 -Wait
notepad C:\ProgramData\CHIPS\chips.env                  # then stop and start the task
C:\"Program Files"\CHIPS\app\deploy\windows\setup-code.ps1     # a new setup code (before the first setup)

To remove it: deploy\windows\uninstall.cmd, or uninstall.ps1 -DryRun | -Backup chips.sql | -KeepData | -RemovePrerequisites | -Yes. It removes the task, the firewall rule, the program and (unless -KeepData) the database and C:\ProgramData\CHIPS; Python and PostgreSQL stay unless -RemovePrerequisites is given and the installer had added them.

Servers without internet access

Use chips-1.7.0-linux-x86_64-offline.tar.gz: it contains a wheelhouse/ with every Python package, and the installer uses it instead of downloading. PostgreSQL and Python come from your distribution's own repositories or mirror.

Docker

docker load < chips-1.7.0-docker.tar.gz        # or build it: docker build -t chips:1.7.0 .
docker compose up -d                                  # from the unpacked chips-1.7.0 folder, with .env

Works on Linux and on macOS with Docker Desktop:

printf 'STORAGE_SECRET=%s\nDB_PASSWORD=%s\nPUBLIC_URL=http://%s:8080\n' \
    "$(openssl rand -hex 32)" "$(openssl rand -hex 24)" "<this machine's address>" > .env
docker compose up -d
docker compose logs app | grep -A1 "setup code"      # then open the address and choose Set up CHIPS

Compose refuses to start without STORAGE_SECRET and DB_PASSWORD. The app container is read-only, drops all Linux capabilities and cannot gain privileges; its browser storage is in the storage volume. A new setup code: docker compose exec app python -m scrumpoker.manage setup-code.

Python package

python3 -m venv /opt/chips && /opt/chips/bin/pip install chips_estimation-1.7.0-*-linux_x86_64.whl
DATABASE_URL=postgresql://user:pass@db/chips STORAGE_SECRET=$(openssl rand -hex 32) \
  PUBLIC_URL=https://chips.example.com /opt/chips/bin/chips          # the setup code is in the output

chips starts the server; chips-manage is the administration command line; chips --version shows the version. Run it under systemd, supervisord or your platform's process manager.

Configuration

Environment variables (in /etc/scrum-poker.env for the installer and the package, .env for Docker):

Variable Meaning
DATABASE_URL PostgreSQL connection, e.g. postgresql://scrumpoker:…@localhost:5432/scrumpoker
STORAGE_SECRET required, at least 32 random characters: signs sessions and encrypts stored Jira tokens, OAuth secrets and two-factor keys. CHIPS does not start without it
PUBLIC_URL the address people use (share links, OAuth redirect URIs), e.g. https://chips.example.com
HOST, PORT where the server listens (default 0.0.0.0:8080)
FORWARDED_ALLOW_IPS address(es) of a reverse proxy in front of CHIPS whose X-Forwarded-* headers are trusted (default 127.0.0.1)
CHIPS_SECURE_COOKIES true / false: send cookies over HTTPS only (default: on when PUBLIC_URL is https://)
CHIPS_ALLOW_INSECURE development only: start even with a weak STORAGE_SECRET
CHIPS_PURCHASE_URL where the License page sends administrators to buy or renew

HTTPS

Put CHIPS behind a reverse proxy with a certificate. A ready Caddy configuration is in deploy/Caddyfile: replace the host name and run Caddy; it obtains a certificate automatically. WebSockets must be passed through (Caddy and recent nginx do this).

Upgrading

Install the new version the same way (re-run the installer, apt install the new package, or pull the new image). The database is upgraded automatically at start-up, in one transaction. Back up first:

sudo -u postgres pg_dump scrumpoker | gzip > chips-backup-$(date +%F).sql.gz

Re-run the installer (sudo ./deploy/install.sh, or ./deploy/install.sh on a Mac). The database is upgraded automatically at start-up, in one transaction:

Uninstalling

sudo ./deploy/uninstall.sh --dry-run          # see exactly what would be removed; changes nothing
sudo ./deploy/uninstall.sh --backup scrum-poker.sql.gz    # save the data, then remove everything

(On a Mac, run the same commands without sudo; see On macOS below.)

The script lists what it will remove — including how many rooms and stories the database holds — and asks before doing anything. (A copy is also installed at /opt/scrum-poker/deploy/uninstall.sh, so the project folder isn't needed.) It removes:

Option Effect
--backup FILE Save the database to FILE (.sql or .sql.gz) first; if that fails, nothing is removed
--keep-data Remove the application but keep the database and settings; reinstalling picks them up again
--remove-packages Also remove the system packages the installer added (e.g. rsync, PostgreSQL)
--dry-run Show what would happen, change nothing
-y, --yes Don't ask for confirmation (needed when not run from a terminal)
--docker Remove a Docker Compose installation instead (containers, built image, database volume)

It only removes what CHIPS's installer created. It leaves alone, and reports: * PostgreSQL, when it also holds other databases or roles, or when it was installed before CHIPS; * packages that other software on the machine still needs (their list is kept, so running uninstall.sh --remove-packages again later finishes the job once nothing needs them); * a scrumpoker user or database that existed before installation; * your Caddy configuration (it tells you if the CHIPS site block is still there) and past log entries in the system journal.

Without --remove-packages, packages are kept: they are common tools that other software may use.

Restoring a backup after reinstalling:

sudo ./deploy/install.sh
sudo systemctl stop scrum-poker
gunzip -c scrum-poker.sql.gz | sudo -u postgres psql -q -o /dev/null -d scrumpoker
sudo systemctl start scrum-poker

On macOS

./deploy/uninstall.sh (as yourself, no sudo) takes the same options and follows the same rules. A copy is kept at ~/Library/Application Support/ScrumPoker/app/deploy/uninstall.sh. It removes:

It never touches Postgres.app or a PostgreSQL that holds other databases, and it reports a macOS firewall rule for CHIPS's Python if one is left, so you can remove it in System Settings.

Restoring a backup on a Mac after reinstalling:

./deploy/install.sh
launchctl bootout gui/$(id -u)/local.scrumpoker
gunzip -c scrum-poker.sql.gz | psql -h localhost -q -o /dev/null -d scrumpoker
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/local.scrumpoker.plist

(With Homebrew's PostgreSQL, psql is in $(brew --prefix postgresql@16)/bin.)

Docker and development setups

Docker: ./deploy/uninstall.sh --docker (add --backup FILE or --keep-data as above), run from the project folder. The shared postgres:16 base image is left for other projects; remove it with docker image rm postgres:16 if nothing else uses it.

Development setup: delete the virtual environment and session data, and drop the databases: rm -rf venv .nicegui && dropdb scrumpoker && dropdb scrumpoker_test.