ppm CLI — your hosted project manager (Slack bot + daily digests)
Project description
ppm — your project manager
A hosted PM agent for your projects. It sweeps GitHub, Linear, and your coding sessions, measures activity against the goals you set per project, and:
- DMs you a daily digest every weekday morning — what moved, what's blocked, what needs your attention, what drifted
- keeps an always-current status rollup (Slack App Home,
ppm status) - triages anything unmapped — assigned issues and new-work candidates land in an inbox you resolve by adopt or ignore, never silently dropped
- lets you chat with it in Slack: "what needs my attention?", "put X on hold", "create a project for Y"
You own your projects' goals and lifecycle status; the agent only ever writes two
fields per project (focus, last-activity) and suggests everything else.
Getting started
-
DM the
ppmbot in Slack — it creates your account, matches your Linear by email, and verifies your GitHub handle against the org. -
Connect this machine when it offers (or any time — DM "add a device"). Install the CLI with uv (the published command is
ppm; the PyPI distribution isliquid-ppm):uv tool install liquid-ppm # from PyPI uv tool install git+https://github.com/Liquid4All/ppm.git # pre-publish, from git
Then enroll the device:
ppm login --code <code-from-slack>
loginenrolls the device, registers the Claude Code skill, and installs the session-pusher hooks. After that, each Claude Code session on this machine uploads a capped slice of its raw transcript (the most recent ~10 MiB, plus a short extract: first prompt + summaries) to your own scope in the hosted service over the authenticated API — no cloud credentials live on your machine, only the device token. That transcript text is what feeds your digest. The bot pings you in Slack the moment the device connects, with project suggestions drawn from your repos, Linear, and sessions. -
Confirm your projects in the DM (it proposes; you decide), give each a couple of sentences of goal — that's the yardstick the digest measures against — and ask for a test digest.
CLI
ppm status current rollup
ppm digest [YYYY-MM-DD] digest markdown
ppm projects list|show|set manage projects (set: --status, --watch)
ppm projects create --name X --repos org/a,org/b --linear "Team (owner)" --goal "..."
ppm projects note <name> <t> append a dated note to a goal body
ppm projects link <name> <mapping> [--owner]
ppm linear Linear teams/projects available for linking
ppm triage [adopt|ignore <id>]
ppm devices [add|revoke <id>]
ppm import <PROJECTS.md> [--commit] migrate a markdown project list
ppm review pull digest+status, open Claude Code over them
ppm update self-update (uv tool upgrade liquid-ppm)
ppm instructions full reference (agents: run this first)
login also registers a ppm skill in Claude Code, so any local Claude session
can read and act on your projects through the same API the Slack bot uses — one
write contract everywhere.
How it works
- Backend (Liquid4All/ppm-backend): FastAPI on Fly, Neon Postgres (identity, projects, runs), Tigris S3 (immutable activity snapshots, digests, transcripts). A daily pipeline fetches org activity once, then runs each user's digest agent (Claude, narrow buffered-write tools, validators before publish). Every agent action is audit-logged with a retained transcript.
- This repo: the zero-dependency Python CLI + session pusher (
uv tool install liquid-ppm). The full system design lives in HOSTED-DESIGN.md. - Trust model: your sessions and personal data stay in your own scope. The
session pusher uploads a capped slice of raw transcript to your scope (see
Getting started); the digest agent then references that work as project +
one-line topic, and what's shared with teammates is never raw excerpts. Uploads
go only to
https://ppm-backend.fly.devover HTTPS — the client refuses any other host unless you explicitly setPPM_ALLOW_INSECURE_API=1for local dev. Team features (channel digests, publish-up progress sharing) are designed in HOSTED-DESIGN.md §5 and arrive next.
Support
Questions, ideas, bugs — @jbuchananr on Slack.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file liquid_ppm-0.3.0.tar.gz.
File metadata
- Download URL: liquid_ppm-0.3.0.tar.gz
- Upload date:
- Size: 13.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.10 {"installer":{"name":"uv","version":"0.10.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a1725d91fc96718e89ee1fe34c98d1d5f6a2b2042dcc4e765beb37b8fa1b7cab
|
|
| MD5 |
5fccc8c45f6a0b9c4c5e5cd3ad5207db
|
|
| BLAKE2b-256 |
2e27690902cca54f9c2ead1393dbbeb5351a15f06696fd7f9dcc583cb49a03b5
|
File details
Details for the file liquid_ppm-0.3.0-py3-none-any.whl.
File metadata
- Download URL: liquid_ppm-0.3.0-py3-none-any.whl
- Upload date:
- Size: 15.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.10 {"installer":{"name":"uv","version":"0.10.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8d0827bcd247811ef36abfc034fb6d813845f695185277791bd97b8aefcb3172
|
|
| MD5 |
e6b58cd60913fb2caeaf94643291b461
|
|
| BLAKE2b-256 |
8a0d1eefa54e4d911fd0670900a932d2363e95c6f96cb3dd30de517c84cea02b
|