Skip to content

Limits and defaults

Verified against v0.10.0 · internal/db/migrations, internal/hub/hub.go, internal/db/db.go, internal/api/passcode.go, internal/api/router.go, cmd/parley/main.go, internal/store/presence.go

Everything numeric, transcribed from source. None of these is configurable unless the page says so. The environment variables named below accept positive integers and are validated at boot.

User name1–64Characters, not bytes; also caps a name derived from an IdP claim
Space name1–64Characters, not bytes
Space slug1–64Lowercase, URL-safe pattern, unique
Passcode6Column allows 12; the generator makes 6
Session title1–200Characters, not bytes
Story title1–200
Story notes≤2000
Story reference≤40
Standup fields≤2000 eachyesterday, today, blockers; characters, not bytes
OIDC issuer / subject≤255 each
API request body64 KiBGlobal cap on every /api request
Optional-body endpoints4 KiBRoom-code join and passcode rotate
WebSocket frame read4096 bytes
ReadHeaderTimeout10sHTTP request headers
ReadTimeout / WriteTimeout30s / 30sOrdinary HTTP request and response deadlines
IdleTimeout120sHTTP keep-alive idle deadline
Shutdown grace10sWebSockets close first; in-flight HTTP receives the grace period
/readyz database ping3sReadiness also fails, with no timeout of its own, when this replica's notify listener is down
-healthcheck request3s
OIDC discovery15sLazy and cached after the first success
Database connect5sPer attempt
Startup attempts6Five doubling backoffs from 1s, plus a 5s timeout each — about a minute
Ping interval25s
Pong deadline50s
Write deadline5sPer frame
Send buffer16 framesFull means the connection is dropped, not the room blocked
Presence debounce1.5s
Session revalidation interval≤30sShared-store revocation and expiry; does not refresh activity. Logout is fanned out to every replica immediately, so this is the fallback rather than the mechanism
Session validation timeout≤30sFailure closes with policy code 1008
Sockets per session token8WS_MAX_PER_TOKEN; per replica. Past the cap the upgrade is refused with a 429 before a socket exists, and closing one frees the slot. Several tabs are ordinary use; a second device has its own token and its own budget
MaxConns10Not configurable
Usable for requests10Per replica. The fanout listener and the migration lock each dial outside the pool, so size max_connections for replicas x 11 — 12 per pod briefly at boot, while the migration lock is held
MinConns / lifetimespgx defaultsNot set by Parley
Statement timeoutnoneSet it on the database role if you want one
Session token32 random bytesSHA-256 at rest
Server-side token idle expiry90 daysSESSION_IDLE_TTL. Refreshed by any write or WebSocket connect; a GET never refreshes it
Server-side token absolute expiry90 daysSESSION_MAX_TTL, measured from issue. No activity extends it
Session cookie Max-Age90 daysThe smaller of the two lifetimes, so the cookie never outlives the token
Sign-in flow cookie600soidc mode only
Expired token cleanuphourlyA background pass deletes rows past either lifetime
Room-code attempts8 per 60sPer client address, per space; sliding window
Open identity creation10/address/hourIDENTITY_IP_HOURLY_LIMIT
Open identity creation, instance500/hourIDENTITY_GLOBAL_HOURLY_LIMIT
Link redemptions per address50/address/hourLINK_REDEMPTION_IP_HOURLY_LIMIT; its own bucket, still under the instance ceiling
Spaces per identity50SPACE_LIMIT_PER_IDENTITY
Sessions per space500SESSION_LIMIT_PER_SPACE
Saved decks per space20DECK_LIMIT_PER_SPACE; over the cap is a 409, and a deck is a template, never a reference a session holds
Kudos per space500KUDO_LIMIT_PER_SPACE; over the cap is a 409. The wall reads back the newest 100
Kudo length280 charactersCounted in runes, and checked again by the database
Stories per session500STORY_LIMIT_PER_SESSION
Session participants200Hard ceiling on who belongs to one session; attaching past the cap drops the oldest joiner but never the current facilitator. Open-voting snapshots copy at most this many eligible participants (facilitator preferred, then most recent) into the round's expected set
Live signed links per room20LINK_LIMIT_PER_SESSION
WebSockets per session token8WS_MAX_PER_TOKEN; counted per replica, refused with a 429 before the upgrade
Room-code alphabet25 charactersConfusable letters removed; ~244M combinations
Facilitator claim grace60sServer-measured; claim is one conditional UPDATE
Standup seconds per person90A session-config value, but no UI sets it
Poker decks4 + savedChosen at session creation from the four built-ins plus any deck the space has saved; fixed for that session's lifetime
Poker deck cards2-151-8 characters each, no duplicates, no `?` or `coffee`, and finite numbers unless the deck is ordinal; one rule, checked both at session creation and when a deck is saved