Planning poker
A story queue with real ticket references. Four built-in decks —
Fibonacci, modified Fibonacci, T-shirt, powers of two — each carrying ?
and a coffee card, plus any deck a space saves of its own.




MIT licensedv0.10.0
Same link for planning poker and standup. Two commands and a .env file, no
platform team required:
git clone https://github.com/lets-parley/parley && cd parleycp .env.example .env # set POSTGRES_PASSWORD to anythingdocker compose up -dThat is the whole install, and it is on :8080. Compose binds to localhost
until you say otherwise. docker compose ps reports healthy once Parley can
reach Postgres.
Compose, a domain, and a reverse proxy in front — one box your whole team
points at, no cluster. Parley is one process and a database, so this is the
shape it is built for, and a small cloud instance carries a team of a few
dozen. Check it through the proxy your team will use:
curl -fsS https://parley.example.com/readyz.
One server
docker run -d --name parley -p 8080:8080 \ -e DATABASE_URL='postgres://parley:secret@db:5432/parley?sslmode=verify-full&sslrootcert=/etc/ssl/certs/ca.pem' \ -e BASE_URL='https://parley.example.com' \ ghcr.io/lets-parley/parley:0.10.0Multi-arch, amd64 and arm64. Bring your own Postgres. v0.10.0 is the current release, and v0.2.2 is the security floor: every earlier release can be crashed remotely by a disconnecting client, and v0.1.0 additionally has a room-code throttle bypass. None were retagged onto fixed code.
curl -fsS http://localhost:8080/readyz answers ok when it is ready. A 503
says which half is unhappy: database unreachable, or
not listening for session changes — this replica is serving, but has
stopped hearing the others.
The Helm chart, or the plain manifests in deploy/k8s/ — a Deployment,
a Service, and a commented Ingress carrying the ingress-nginx read-timeout
annotations WebSockets need — other controllers ignore those and need their
own setting. (No PodDisruptionBudget there; the chart adds one.) One
replica by default; scale up with --set replicaCount=2 on chart 0.4.1 or
newer — earlier charts refuse more than one replica at render time. The
readiness probe is /readyz, so a pod only goes Ready once it can reach
Postgres and hear the other replicas: kubectl rollout status deploy/parley.
Deploying to Kubernetes
kubectl create secret generic parley \ --from-literal=database-url='postgres://parley:secret@host:5432/parley'
helm install parley oci://ghcr.io/lets-parley/charts/parley --version 0.10.0 \ --set database.existingSecret=parley \ --set baseURL=https://parley.example.comPin --version. The chart refuses to render a release that cannot work —
a moving image tag, a fractional replica count, a missing database secret.
Watch it come up with kubectl rollout status deploy/parley.
The chart
The frontend ships inside the binary, so there is no second service, no Node runtime in production, and no way for the two halves to end up at different versions. Migrations run themselves at boot.
The things it does not do are on one page too, each with its workaround: known limitations.
There is no account step to show, because there isn’t one. Name a space and you are in it; everyone else follows the link you paste into chat.


Everyone votes at once, and nobody sees a number until the round opens. Your teammates don’t install anything and don’t sign up for anything — they open the link and type a name.




Planning poker
A story queue with real ticket references. Four built-in decks —
Fibonacci, modified Fibonacci, T-shirt, powers of two — each carrying ?
and a coffee card, plus any deck a space saves of its own.


Daily standup
Round-robin with a 90-second clock, so the quiet people get their turn. Whatever you wrote under “today” is waiting under “yesterday” tomorrow, and blockers collect into a list you can paste into a channel.


Spaces
One memorable link per team, /o/acme/s/platform-team, and a six-character room
code that throttles wrong guesses per address. The roster shows who is here
and which table they are sitting at.


Guest links
One URL that seats one person in one room, for 24 hours — no account, no space membership, and nothing else it can reach. Revoke it and whoever redeemed it is out of the room in seconds.


/readyz and take request metrics from your reverse proxy.
LOG_LEVEL=debug adds one line per request with the resolved client address
and forwarding chain, for diagnosing a proxy — it is not an access log and is
not retained. Releases do ship an SPDX SBOM and digest-bound build
provenance; see Supply chain.All of them are on one page, each with its workaround, because the gaps are the reason to believe the rest.
The official Parley project is letsparley.io. The MIT license covers the code, not the name.