Skip to content

Releases: Lets-Parley/Parley

v0.13.0

Choose a tag to compare

@jacorbello jacorbello released this 24 Sep 02:57
36cd5bf

Standups no longer need everyone in the room at once, and Parley can now run inside Google Meet.

Async standups

A standup can run as an async window instead of a live round. People post when they can, and posts that arrive after the close are still accepted and marked late (#624). A space owner can set a recurring schedule: weekdays, a local open time, a time zone and a window length. Every replica opens each slot on time, and clock changes are handled (#625). The create dialog has a cutoff picker and a schedule editor (#647).

Around the window:

  • A personal ICS feed puts each async window on your calendar (#642).
  • Commitment follow-through, and "needs you" mentions (#644).
  • Away days, and a participation trend for the team (#646).
  • A space webhook for standup events. It is API only for now, and destinations are limited to STANDUP_WEBHOOK_HOSTS (#630).
  • An async standup waits on the space's members, and it names authors who have left for guests (#648). There is also an accessibility and phone-width pass (#656).

Parley inside Google Meet

The Meet add-on puts a room in the side panel and on the main stage. Anyone can vote from the side panel, and the facilitator can put the room on the main stage for the whole call (#652, #664). It signs in through a new embedded session. That session is a way in, not new powers: membership, passcodes and redaction work exactly as before (#645). A one-click Cloud Shell script and a setup guide cover the Google Cloud side (#658, #663, #668).

It is off unless you turn it on. Set EMBED_PROVIDERS=meet and MEET_CLOUD_PROJECT_NUMBER, and BASE_URL must be https. See Google Meet add-on.

Also

  • A presenter view of a room (#638).
  • Pile-on emoji and the boot now play impact sounds when they land, if you have sounds on (#623).
  • A plugin frame is sent only the rooms its own install provides (#649). The plugin fetch guard now refuses NAT64 prefixes it cannot decode (#631).
  • The README, compose file, Kubernetes manifest and chart now point at the current release, and CI keeps them there (#670).

Upgrading

Nothing changes unless you opt in. The Meet add-on and standup webhooks both stay off until you set their variables.

Six migrations (0038 to 0043) run on boot. Take a backup first, as always.

ghcr.io/lets-parley/parley:0.13.0

Confirm the upgrade landed with curl -s https://your-parley/version.

Artifacts published and resolvable from the registry:

  • image ghcr.io/lets-parley/parley:0.13.0 @ sha256:68d69a0626b4a4a94b55ed9322e3e089bea574c33cf913d9d3322c53c73533de
  • image ghcr.io/lets-parley/parley:0.13.0-fips @ sha256:9bca6a77e8257900511549ec7875799a955e663ea84430f991bd1ca5aea308ad
  • chart oci://ghcr.io/lets-parley/charts/parley version 0.13.0
  • offline-verifiable Sigstore bundle parley-v0.13.0.sigstore.json attached to this release
  • offline-verifiable Sigstore bundle parley-v0.13.0-fips.sigstore.json attached to this release

Checked by resolving both from the registry, not by trusting the jobs that made them. If this block is absent from a release, do not deploy it without checking by hand — a red run means the artifacts may be missing, incomplete, or fine, and the badge alone does not say which.

v0.12.0

Choose a tag to compare

@jacorbello jacorbello released this 15 Sep 22:51
aee1259

Rooms can now make a sound when something happens, and each person decides whether they hear it.

  • Planning poker chimes when a round opens and when the cards are revealed; standup chimes at the start, on each turn change, and when the round finishes. Every cue is a short, quiet two- or three-note figure, not an alert tone
  • Sounds are off until you turn them on. The preference lives on your account (PATCH /api/me/settings), so it follows you between rooms and devices rather than living in one browser
  • A browser will not play audio in a tab you have not interacted with. When that happens the room offers an "Enable audio in this tab" button instead of failing silently, and a cue that was blocked is dropped rather than played late

Artifacts published and resolvable from the registry:

  • image ghcr.io/lets-parley/parley:0.12.0 @ sha256:a6ff9631e352025d1242c65a7e6246e548d9b43def9d83bbac7f29b9c44f373f
  • image ghcr.io/lets-parley/parley:0.12.0-fips @ sha256:4ea1a83a2fb7fc930a9a8058bc563e35475daabde0750aff40c5de7f7a68d9ec
  • chart oci://ghcr.io/lets-parley/charts/parley version 0.12.0
  • offline-verifiable Sigstore bundle parley-v0.12.0.sigstore.json attached to this release
  • offline-verifiable Sigstore bundle parley-v0.12.0-fips.sigstore.json attached to this release

Checked by resolving both from the registry, not by trusting the jobs that made them. If this block is absent from a release, do not deploy it without checking by hand — a red run means the artifacts may be missing, incomplete, or fine, and the badge alone does not say which.

v0.11.1

Choose a tag to compare

@jacorbello jacorbello released this 07 Sep 19:20
86b0ece

A room now seats the people who have actually turned up, not every member of its parent space.

  • Colleagues who had never opened a room are no longer seated at its table with a zzz "away" card. The roster is attendance — anyone who has attached — plus anyone the room holds a vote or standup entry for, plus the facilitator, so an export can never carry an estimate with no name against it
  • With absence no longer seated, the away state is gone: no zzz card, no dimmed placeholder, and a seat turns its card over like any other. Presence still decides the vote tally's denominator, so somebody who has left does not hold up a reveal
  • The room header's avatar strip shows the same attendance-scoped roster as the table, and labels a link guest sharing a member's display name. The space page still shows every member — that is the point there

Artifacts published and resolvable from the registry:

  • image ghcr.io/lets-parley/parley:0.11.1 @ sha256:fcf62ffda4214c2c81deef1cefcb5a32642a33ddedb7c3e3ca787daa90357b98
  • image ghcr.io/lets-parley/parley:0.11.1-fips @ sha256:03ce47ab558f6f1db05e8e76ea6159d74acf971efef2e61e32d0105bd513b49b
  • chart oci://ghcr.io/lets-parley/charts/parley version 0.11.1
  • offline-verifiable Sigstore bundle parley-v0.11.1.sigstore.json attached to this release
  • offline-verifiable Sigstore bundle parley-v0.11.1-fips.sigstore.json attached to this release

Checked by resolving both from the registry, not by trusting the jobs that made them. If this block is absent from a release, do not deploy it without checking by hand — a red run means the artifacts may be missing, incomplete, or fine, and the badge alone does not say which.

v0.11.0

Choose a tag to compare

@jacorbello jacorbello released this 06 Sep 19:17
08a8036

Parley grows a plugin system: a ceremony no longer has to live in the core to run in a room. Standups carry commitments forward, spaces have a kudos wall, and the self-hosting story gains a FIPS image, session expiry and a refusal to talk to Postgres in the clear.

This release will refuse to start if it cannot reach Postgres over TLS. See Upgrading.

A ceremony can be a plugin

Retrospective is the proof: it ships as a plugin rather than as core code, and CI enforces that it stays that way — a commit that adds a ceremony plugin and touches core in the same breath fails the build (#537, #527).

Underneath is an Extism host that runs a plugin as WebAssembly with explicit grants and a lifecycle, isolated from the process it extends (#513), an event bus with an outbox worker and a job queue (#512), and five-field cron for plugins that need to wake on a schedule (#564).

A plugin can declare its own session kind and have it rendered in the full-room slot, export its own CSV, and place UI in the toolbar, the nav and the export menu (#526, #535, #536, #565). Plugin UI runs in a sandboxed iframe behind an RPC bridge, so a plugin draws in the room without being given the room (#521).

Operators get an administration surface for installing and managing them (#514), and there is a published SDK and developer loop for writing one (#539).

Commitments and kudos

A standup commitment now carries until it is answered, instead of evaporating when the room closes. It survives the deletion of the room it was made in, and the UI says when one is stuck rather than quietly re-listing it (#485, #487, #502).

Kudos are a note from one member to another, given at the end of a standup and collected on a wall on the space (#517, #518, #522, #520). There is deliberately no leaderboard, and the docs say why (#524).

The room on a phone

The layout is responsive and the room takes touch (#475). Cards behave like cards and the type behaves like type (#489). Themes are JSON palettes, validated and contrast-gated so a theme cannot ship an unreadable pairing (#511).

Poker now lists what it did not estimate, so a session ends with the gaps named (#541). A facilitator can hand the role to a named participant (#477).

Self-hosting

  • Sessions expire. SESSION_IDLE_TTL and SESSION_MAX_TTL both default to 90 days, and expired session tokens are swept (#573, #598).
  • A FIPS image, with a cryptography inventory (#585).
  • Prometheus /metrics, off unless METRICS_ENABLED=true (#584).
  • BIND_ADDR binds the listener to one interface (#575).
  • Structured security-event lines, and X-Request-Id echoed back (#583).
  • Concurrent WebSockets are capped per session token (#576).
  • An optional egress NetworkPolicy in the chart (#569).
  • Air-gapped and private-CA install docs (#568, #592), and a rewritten backups page (#571).
  • Every release now carries an offline-verifiable Sigstore bundle (#572).

Fixes: a panic in a background goroutine no longer takes the process with it (#566); a rename racing a rotated session returns 401 instead of misbehaving (#600); a rename no longer restarts the session clock (#593); standup prefills yesterday only from an earlier session (#542).

Upgrading

Postgres must be reachable over TLS, or you must say otherwise. Parley now refuses to boot on a DATABASE_URL whose sslmode is absent, disable, allow or prefer (#567). Either add ?sslmode=verify-full&sslrootcert=/path/to/ca.pem to the connection string, or set DATABASE_ALLOW_PLAINTEXT=true if the database is only reachable over a link you already trust. The shipped docker-compose.yml sets it to true for you, so a stock compose install is unaffected; a hand-rolled DATABASE_URL is the case to check before you pull.

Everyone will be signed out within 90 days. Session tokens now have an idle and an absolute lifetime, both defaulting to 90 days, where previously they never expired. Set SESSION_IDLE_TTL and SESSION_MAX_TTL if that is not what you want.

Nine migrations (0028–0036) run on boot. Take a backup first, as always.

ghcr.io/lets-parley/parley:0.11.0

Confirm the upgrade landed with curl -s https://your-parley/version.

Artifacts published and resolvable from the registry:

  • image ghcr.io/lets-parley/parley:0.11.0 @ sha256:75b9166350245d11547e6cccd34ac6030008bb7deb42b2d9264f13c6c6b7d046
  • image ghcr.io/lets-parley/parley:0.11.0-fips @ sha256:14f0546fab4cdd08fe0f4d984660507c2fb3f1e63a83e11b553c65090dd4f27c
  • chart oci://ghcr.io/lets-parley/charts/parley version 0.11.0
  • offline-verifiable Sigstore bundle parley-v0.11.0.sigstore.json attached to this release
  • offline-verifiable Sigstore bundle parley-v0.11.0-fips.sigstore.json attached to this release

Checked by resolving both from the registry, not by trusting the jobs that made them. If this block is absent from a release, do not deploy it without checking by hand — a red run means the artifacts may be missing, incomplete, or fine, and the badge alone does not say which.

v0.10.0

Choose a tag to compare

@jacorbello jacorbello released this 01 Sep 01:24
54d2672

A facilitator can remove someone from a room, and seats stop blinking in and out. Most of this release is motion work; the one new capability is the removal.

A facilitator can remove a participant

Rooms had no way to deal with a duplicate tab, a stale session, or someone who should not be there — the roster only grew. A facilitator can now remove a participant, which ends their session membership, prunes their votes from every story in the room, and re-evaluates auto-reveal so a round no longer waits on someone who has gone (#465).

The removed person is told rather than dropped: their socket closes with 4001, a new close code that means removed from this session and is distinct from 1008, which has always meant removed from the space. They land on a screen that says what happened instead of a reconnect spinner (#469).

Removal is scoped to the session and applied in one transaction — the vote prune, the auto-reveal re-check, and the presence delete either all land or none do.

Seats stop blinking

A seat that appeared or left used to pop, and a burst of joins read as flicker rather than as people arriving. Joining seats now drop in under gravity and settle, staggered so a burst arrives as a group of arrivals rather than one mechanical beat (#468).

Reactions thrown at a seat follow a real ballistic arc, hit the avatar, bounce off it, and fall away off screen — solved rather than approximated, so the spin, the restitution, and the fall are the physics and not a tuned curve (#464, #467).

A removal gets a boot, which swings, connects, and withdraws while the seat leaves (#469).

All of it respects prefers-reduced-motion.

Upgrading

No migrations and no new settings. A drop-in replacement for 0.9.1.

ghcr.io/lets-parley/parley:0.10.0

Confirm the upgrade landed with curl -s https://your-parley/version.

Artifacts published and resolvable from the registry:

  • image ghcr.io/lets-parley/parley:0.10.0 @ sha256:fa4e330933f55903e3d610efe0136cd3c98ad95ec0bc9d960eb59f939f60df35
  • chart oci://ghcr.io/lets-parley/charts/parley version 0.10.0

Checked by resolving both from the registry, not by trusting the jobs that made them. If this block is absent from a release, do not deploy it without checking by hand — a red run means the artifacts may be missing, incomplete, or fine, and the badge alone does not say which.

v0.9.1 — Within Reach

Choose a tag to compare

@jacorbello jacorbello released this 31 Aug 18:10
39fe8c3

Open voting is reachable from the app. 0.9.0 shipped it as a configuration option with no way to turn it on short of the API; this release gives it a checkbox and a switch.

Open voting has a UI

Open voting sits beside auto-reveal on both surfaces: a checkbox in the create dialog — Open voting for people who are not in the room — and a switch in the room, next to the auto-reveal one, that only the facilitator sees.

Toggling it in the room takes effect for the round on the table without resetting it. Switching it on widens the round to people who are not in the room; switching it off narrows it back to whoever is present, which is how a round stalled on somebody who has gone home gets moving again.

The control says what it does: it changes who the round waits for, not whether the round reveals. That remains auto-reveal's question, and the two are independent switches (#457).

Upgrading

No migrations and no new settings. A drop-in replacement for 0.9.0.

ghcr.io/lets-parley/parley:0.9.1

Confirm the upgrade landed with curl -s https://your-parley/version.

Artifacts published and resolvable from the registry:

  • image ghcr.io/lets-parley/parley:0.9.1 @ sha256:d2a976c5c7772df688e5de10e8b8b065146212bbfa7e075c1011de730d8efd97
  • chart oci://ghcr.io/lets-parley/charts/parley version 0.9.1

Checked by resolving both from the registry, not by trusting the jobs that made them. If this block is absent from a release, do not deploy it without checking by hand — a red run means the artifacts may be missing, incomplete, or fine, and the badge alone does not say which.

v0.9.0 — Own Deck

Choose a tag to compare

@jacorbello jacorbello released this 31 Aug 17:05
865ba85

Planning poker stops assuming your team estimates the way Parley does. A space can save its own card decks, and a round can stay open so people estimate across timezones instead of all at once.

Custom decks

Decks are no longer four constants compiled into the server. A space saves its own, and picks one when creating a session — manage them in space settings.

A session stores a copy of the cards it was created with, so editing or deleting a deck never invalidates an estimate your team already agreed. Decks are either numeric, where every non-special card must parse and statistics work as usual, or ordinal like t-shirt sizes, where no arithmetic is attempted.

Built-in decks keep writing the old config shape byte-for-byte, so rolling back to 0.8.0 is clean unless you created a custom deck.

Open voting

A round can now stay open rather than completing only when everyone connected right now has voted. The set of expected estimators is snapshotted when the story is selected, so people can drift in and out and the round still closes correctly.

This release ships open voting as a configuration option — there is no in-room toggle yet (#443).

Fixes

  • Sitting out mid-round no longer prevents the round from completing (#438)
  • Story field limits count characters, not bytes, so non-Latin text is no longer truncated early (#436)
  • Display names have bidirectional-override characters stripped (#439)
  • The room stays mounted when a session refetch fails instead of blanking (#441)
  • The median maps to a real deck face for half-point cards (#440)
  • A round of all specials reads "no estimate" rather than as an ordinal result (#435)
  • Membership database errors surface as a logged 5xx instead of a silent denial (#437)
  • An expiring open-mode session says so instead of turning you into a stranger (#422)
  • Open-voting reveal no longer recomputes the eligible set on every vote, and the round roster is bounded (#452)
  • A transient database error during join no longer strands a connected participant outside the round (#455)

Upgrading

Two migrations run on first boot: 0026_decks.sql and 0027_round_roster.sql. Both are additive.

One new setting, optional:

DECK_LIMIT_PER_SPACE=20

How many decks a space may save. A session copies its cards at creation, so lowering this never affects sessions that already exist.

ghcr.io/lets-parley/parley:0.9.0

Confirm the upgrade landed with curl -s https://your-parley/version.

Artifacts published and resolvable from the registry:

  • image ghcr.io/lets-parley/parley:0.9.0 @ sha256:5554ae6f5e940fb319bdc330fe93a59837730a53a4f0c569a1cf8239e2e2b2df
  • chart oci://ghcr.io/lets-parley/charts/parley version 0.9.0

Checked by resolving both from the registry, not by trusting the jobs that made them. If this block is absent from a release, do not deploy it without checking by hand — a red run means the artifacts may be missing, incomplete, or fine, and the badge alone does not say which.

v0.8.0

Choose a tag to compare

@jacorbello jacorbello released this 29 Aug 00:21
faa9df5

What's Changed

  • feat(web): check accessibility with axe-core in the test suite by @jacorbello in #355
  • fix(web): only offer to save a median that is a card in the deck by @jacorbello in #362
  • fix(api): count name and title limits in characters, not bytes by @jacorbello in #368
  • fix(poker): report a failed spectator lookup as a server error by @jacorbello in #366
  • fix(auth): cap OIDC display names by rune, not byte by @jacorbello in #364
  • fix(poker): stop calling an all-specials round consensus by @jacorbello in #363
  • fix(web): give clickable controls a pointer cursor by @jacorbello in #354
  • fix(standup): measure entry limits in characters, not bytes by @jacorbello in #367
  • feat(db): orgs, org membership, and org-scoped space slugs by @jacorbello in #377
  • docs(roadmap): file the discovery items, then promote two of them to Next by @jacorbello in #390
  • docs(roadmap): promote responsive support and the Jira estimate write-back to Next by @jacorbello in #393
  • feat(auth): map OIDC claims to org membership by @jacorbello in #389
  • feat(api,web): org-scoped routes and the frontend cutover by @jacorbello in #394
  • feat(api): redirect legacy space links to their org by @jacorbello in #396
  • feat(api,web): space visibility and the org directory by @jacorbello in #397
  • feat(api): org custody routes and member revocation by @jacorbello in #398
  • chore(deps): Bump the actions group across 1 directory with 2 updates by @dependabot[bot] in #344
  • chore(deps): Bump the web-dependencies group across 1 directory with 5 updates by @dependabot[bot] in #375
  • chore(deps): Bump the container-images group with 2 updates by @dependabot[bot] in #340
  • chore(deps): Bump github.com/go-chi/chi/v5 from 5.3.1 to 5.3.2 in the go-dependencies group by @dependabot[bot] in #341
  • chore(deps): Bump astro from 7.2.2 to 7.2.4 in /site in the site-dependencies group by @dependabot[bot] in #342
  • docs: organizations, claim mapping, and what an org admin can see by @jacorbello in #400
  • docs: say private vulnerability reporting is enabled by @jacorbello in #401
  • docs(k8s): document extraEnv by @jacorbello in #410
  • fix(web): render signed-link rooms without org metadata by @jacorbello in #411
  • perf(core): collapse org authorization lookups by @jacorbello in #412
  • docs(security): reconcile ownership, custody, and audit claims by @jacorbello in #413
  • perf(db): index active org memberships by user by @jacorbello in #414
  • docs: use canonical org-scoped space URLs and surface org config by @jacorbello in #415
  • perf(custody): batch org-member revocation work by @jacorbello in #416
  • perf(api,web): paginate the org directory by @jacorbello in #417
  • feat(poker): optional auto-reveal when everyone has voted by @jacorbello in #419
  • chore: release hygiene for v0.8.0 by @jacorbello in #420

Full Changelog: v0.7.3...v0.8.0

Artifacts published and resolvable from the registry:

  • image ghcr.io/lets-parley/parley:0.8.0 @ sha256:5f5a3bcc82593d645d94623f15b27a3361dc0858fc400344df97aaa7079f7e69
  • chart oci://ghcr.io/lets-parley/charts/parley version 0.8.0

Checked by resolving both from the registry, not by trusting the jobs that made them. If this block is absent from a release, do not deploy it without checking by hand — a red run means the artifacts may be missing, incomplete, or fine, and the badge alone does not say which.

v0.7.3

Choose a tag to compare

@jacorbello jacorbello released this 26 Aug 13:42
1cb424b

What's Changed

  • refactor(web): split the space page into a table and a settings route by @jacorbello in #351
  • docs: re-shoot the space screenshots after the settings split by @jacorbello in #352
  • chore: release hygiene for v0.7.3 by @jacorbello in #353

Full Changelog: v0.7.2...v0.7.3

Artifacts published and resolvable from the registry:

  • image ghcr.io/lets-parley/parley:0.7.3 @ sha256:34a98955e0864109cff881ca33be0808e500f7a6dcb608036827480175a4bbbd
  • chart oci://ghcr.io/lets-parley/charts/parley version 0.7.3

Checked by resolving both from the registry, not by trusting the jobs that made them. If this block is absent from a release, do not deploy it without checking by hand — a red run means the artifacts may be missing, incomplete, or fine, and the badge alone does not say which.

v0.7.2

Choose a tag to compare

@jacorbello jacorbello released this 25 Aug 18:25
e1d18c8

What's Changed

  • ci: check pinned image digests still resolve, before a tag is cut by @jacorbello in #339
  • ci: pin skopeo to an immutable tag so the digest stops rotting by @jacorbello in #346
  • fix(web): give signed-out visitors a way to sign in by @jacorbello in #345
  • chore: release hygiene for v0.7.2 by @jacorbello in #347

Full Changelog: v0.7.1...v0.7.2

Artifacts published and resolvable from the registry:

  • image ghcr.io/lets-parley/parley:0.7.2 @ sha256:056e77d437796e47d40d9217afbe0c559df699f6dad56a94c2684c925b75907e
  • chart oci://ghcr.io/lets-parley/charts/parley version 0.7.2

Checked by resolving both from the registry, not by trusting the jobs that made them. If this block is absent from a release, do not deploy it without checking by hand — a red run means the artifacts may be missing, incomplete, or fine, and the badge alone does not say which.