A nightly crawl, a training run, a migration, a CI pipeline, an AI agent working through a long task — they all run for hours with nobody watching. Progress Watch gives them one place to report to, one place for you to look, and a push notification when they finish.
This repository is the server. The command line client is progresswatch-cli.
- CLI for shells and CI jobs
- MCP server and an agent skill for AI agents
- One HTTP request from anything else, no SDK needed
- Counts, not just percentages:
1200 / 50000 pages - Steps, one level deep
- Live dashboard in the browser
- Web Push when something finishes, with nothing to register with Apple or Google
- No accounts: a space UUID is the credential
- Progress stays out of the database, so it never grows
- SQLite or PostgreSQL
| Render | DigitalOcean | Railway |
|---|---|---|
docker run --name progresswatch -p 7979:3000 -v progresswatch:/data progresswatch/progresswatchThen open http://localhost:7979. It uses SQLite by default; set DATABASE_URL to use PostgreSQL.
services:
progresswatch:
image: progresswatch/progresswatch:latest
container_name: progresswatch
restart: unless-stopped
ports:
- 7979:3000
volumes:
- progresswatch:/data
volumes:
progresswatch:docker compose up -dEverything is configured with environment variables.
npm install -g progresswatch
progresswatch space new "My work"
TASK=$(progresswatch new "Crawl docs")
progresswatch update $TASK --current 1200 --end 50000 --values pages=1200
progresswatch done $TASKOr wrap a command you cannot change; that reports a start and a finish, not counts:
progresswatch run "python train.py"- Get started
- CLI · Agent skill · MCP · curl
- API Reference
- Self-hosting
- Notifications
- Environment variables
Ruby 4.0.5 (see .tool-versions), Node 22, and a local Redis.
bundle install
npm install
bin/rails db:prepare
bin/devSet PW_PORT to move the server, since foreman overrides PORT. docker compose up runs the published image, not your checkout.
bundle exec rspec
bundle exec rubocopRun ./bin/shakapacker once before the specs if bin/dev has not built the assets yet. Migrations have to run on both SQLite and PostgreSQL, and CI checks both.
Distributed under the AGPL-3.0 license.