What's New
The latest features and improvements shipped to Picklebeast.
May 2026
May 13, 2026
Tournaments
Rotating-Partner Tournaments — Solo Sign-Up Mixers
A tournament registration mode where players sign up alone instead of with a partner. The system generates a round-robin schedule that rotates partner pairings every round; per-player standings feed an automatic playoff bracket. Available on every plan.
- New Registration Mode row in the tournament wizard's Default Format step — Pre-formed Team / Rotating Partners
- Picking Rotating Partners auto-couples the bracket type to Round Robin (the only compatible format) and disables MLP / Team Captain
- Per-division override available — mix a Doubles + Rotating Partners division with a regular Doubles + Pre-formed Team division in the same event
- Player registration overlay (web + mobile) skips the partner-selection step entirely for individual_rotating divisions; backend forces registration_type='individual'
- Schedule generator runs the 1-factorization of K_n algorithm to maximize unique partnerships within the roster (8/16/24-player rosters ideal)
- Audit page surfaces conflicts (player in two simultaneous matches), partner duplications (same pair twice), and opponent-imbalance variance before publish
- Score submission uses a winning_side + points API — no team_one_id/team_two_id required because partnerships are dynamic per match
- Per-player standings (W / L / PF / PA / Differential / Rank) on the public division show page Standings tab; mobile parity
- One-click playoff generation pairs the top finishers (high-low default) into stable teams, builds a single-elim bracket, fans out push notifications
- Match-completion + court-assigned push notifications resolve recipients via tournament_match_participants — no team rows required
- Late registration blocked once the schedule generates (the rotation table can't be extended without regeneration); player sees a clear 'Registration closed' message
- Full E2E spec walks creation → 8 registrations → schedule → score every match → standings → playoff → champion. 155+ specs covering API, mailer, badge evaluation, Command Center rendering, and full integration paths
May 12, 2026
Mobile
Saved for Next Visit — Cart Auto-Resume on Reservation
Members can park a cart at your club. When they book their next reservation, a push notification surfaces it — confirm to charge, discard to clear. The order is queued for the start of their session, so the food is ready when they arrive.
- Cart 'Next reservation' chip — when no upcoming reservation, taps save the cart as a QueuedOrderIntent and clear the deferred lines from the live cart
- Reservation create hook — auto-fires a push when the booking member has an active saved cart at the same club
- Review screen — items, snapshot total, Confirm or Discard CTAs, with price-drift re-confirm if any line price changed since save
- 30-min cool-down per (member, club) — rapid back-to-back bookings only fire one push
- Status re-validation at fire time — cancelled reservations don't generate misleading pushes
- Club-local timezone in the push body — non-PT members see times in their club's timezone, not UTC
- 30-day saved-cart expiry with a 5-day-before reminder push (separately toggleable from the reservation-match push)
- Settings → Notifications → Mobile Ordering exposes all 5 SPO push keys for independent member control
- Strava/Apple chip aesthetic in the cart sheet — low-alpha brand tint on selected pickup chips, no more full-saturation 'blocked blue' fill
- BrandedLoader splash refresh — transparent claws-marks asset, 2× default size, no back chevron
May 12, 2026
Club Admin
Court Calendar Management — Edit Courts, Block Time, and Set Hours Without Leaving the Calendar
Manage every court from one screen. Click a court header to rename, recolor, or take it offline. Block off time for maintenance, events, lessons, or private rentals — one-time or weekly recurring. Set per-location operating hours inline. The calendar repaints in place; the front desk never sees stale state.
- Inline court edit modal — click any court header on the timeline or grid to rename, change number/display order, pick a color, change surface type, toggle indoor/outdoor + lighting + covered, mark unavailable with a public reason
- Block Court button — open a modal to block off time on any court for maintenance, event, lesson, tournament, private rental, closure, or other; one-time blocks support full date/time range with public reason + internal notes
- Repeat Weekly toggle — extend any block to a recurring weekly or biweekly pattern with day-of-week chip selector and optional end date; generates a full year of occurrences up front
- Hours button — inline modal to edit per-location operating hours; 4 quick presets (extended, standard, business, 24/7) plus per-day open/close/closed toggles
- Permission gating — Block Court requires can_manage_court_blocks; court editing requires can_manage_courts; hours requires can_manage_locations. Sidebar lock icons for lower-tier staff
- Live calendar repaint after every mutation — no manual reload, scroll position preserved (CLAUDE.md §3.8 compliant)
- Cancelled blocks no longer falsely subtract from cross-club marketplace availability counts or coach-slot conflict checks (3 .active scope fixes shipped)
- Hardened: overlap-on-update validation closed; DB-level exclusion constraint added for race-safe production; mass-assignment IDOR via club_location_id closed; XSS via JSONB hours key closed
May 12, 2026
Tournaments
Command Center at Scale — Run a 100-Division Tournament Without Drowning
A compact rail with smart presets (Live / Attention / Pinned / All) gives operators focus on tournaments with 50, 80, even 100 divisions. Pin up to 12 to follow live, view up to 4 in a 2×2 grid, share a focus URL with a scorer so they see only their divisions.
- Compact left rail — one row per division, with state dot + match-counter + live-count + attention badge + pin + view icons
- Smart presets — Live / Attention / Pinned / All. Smart fallback: 'Live' auto-promotes to 'All' if nothing is live yet so the rail never lands empty
- Pin up to 12 divisions, server-persisted so an operator can pin from desktop and pick up on iPad
- Share button copies a focus URL with ?pinned=12,15&preset=pinned. Recipient sees 'Save as my default' pill to persist
- View icon adds up to 4 divisions to a side-by-side 2×2 grid (hard-capped, never more); 1-col on narrow viewports
- Click any rail row to enter focus mode — only that division shows below, with a smooth scroll + highlight pulse
- Aggregate poll updates rail counters every 10s/30s focused/hidden. Deep poll only fires for pinned divisions
- Auto-collapses the club-admin sidebar so wide tournaments get maximum horizontal room
- First-visit coachmark on 20+ division tournaments (once per user)
- AI chat: query_command_center_state + query_command_center_attention tools surface tournament state in natural language
- Mobile + tablet parity — phone shows full-screen rail with stack-push detail; tablet shows rail + detail pane side-by-side
- Cross-repo parity tripwire spec — backend constants and mobile TypeScript types fail the suite if they drift
- Legacy 3-up grid stays as a safety fallback below the rail; flag-flip rollback with zero data migration risk
May 11, 2026
Mobile App
Scouting Report — Know Your Opponent Before the First Serve
A binoculars icon on every casual game, tournament pool, bracket, and league match opens a quick-glance intel panel about the opponent: DUPR + trend, recent form, hot/cold streak, head-to-head, mutual friends, common opponents. Built on data the opponent already exposes publicly. Minor-protected, block-honored, scout-views never surfaced to the scoutee.
- Contextual entry — the icon appears only on competitive contexts (casual games, tournament pools, brackets, league matches); not on Player Hubs or feeds
- Two visibility tiers — public stats (DUPR, form, streak, H2H, badges) visible to anyone; social-graph signals (mutual friends, top partners, top opponents, common opponents) visible only to confirmed friends
- Built on existing data — no new aggregation tables, no scout-view rows; aggregates PlayerStatsService + DuprRatingSnapshot + Friendship in a single cached read
- Per-context shapes — tap a player avatar for an individual report; tap a doubles team chip for a team report with combined DUPR, chemistry, and team H2H
- DUPR trend — 90-day delta vs the most recent snapshot, fires when the swing is ≥ 0.10
- Hot/cold streak — fires when last 3+ matches are all wins or all losses
- Reuses EventFollow polymorphic infrastructure — Follow button uses the existing 5/hour digest-capped notification; no new model, no new endpoints
- Minor-safe — minors are never scoutable; the icon renders a generic 'not available' shell
- Block-honored — blocking party gets the same shell as a minor account; block existence never leaked
- Scout-view privacy posture — analytics events are scrubbed of (scouter, target) joinability; the scoutee can never determine who scouted them
- AI integration — ask the in-app AI 'Scout Jamie' or 'Tell me about Jamie before my match' and get the same report card with deterministic narration
- Tier-aware from day 1 — `for_tier(:free | :premium)` filter built in; flipping the future paywall is a one-line tier-config change, no service code change required
May 11, 2026
Tournaments
Rating-Sync Registration Gates — DUPR & Club Rating Required
Hard-block registration unless the player has synced their DUPR or has a club-issued rating. Tournament/league-wide defaults cascade to every division; each division can override. Pre-flight badges on public event pages so players know the requirement BEFORE they click Register.
- Two gates: Require DUPR sync (every tier) and Require Club Rating (Pro+ tier)
- Parent-level defaults on the tournament/league create form cascade to every new division via the set_defaults / inherit_registration_gate_defaults callbacks
- Per-division override checkbox in compact + wizard forms, both web and mobile
- Public event pages show DUPR required / Club rating required pre-flight badges next to the capacity pill — players see the requirement BEFORE clicking Register
- Backend DivisionGateService enforces on every entry point — web, mobile API, AI chat — returning a 403 with division_gate_failed: true + remediation URL
- Platform-owner override — Scott can comp the Club Rating gate for any club regardless of subscription tier
- AI Schema Registry surfaces both gates on tournament, league, and tournament_division entries so AI prompts like 'make this DUPR-required' work
- Mobile parity — tournament + league division edit screens hydrate from the new club_rating_available API flag and grey out the Club Rating toggle for ineligible tiers
- Demo seed sets DUPR-sync default ON for the multi-division showcase tournament so a fresh demo reset surfaces the new badges
May 9, 2026
Tournaments
Team Cup — Captain-Driven Tournaments with Combine, Buffer Review & Captain-Pays Bundles
A new tournament format combining a DUPR-screened combine with invite-only Pro Team-Captain divisions and standard amateur divisions. Captains form rosters, share invite links with teammates, and pay for everyone in one Stripe charge. Built for the Washington Cup (Jun 26, 2026).
- Three division kinds in one tournament — Combine, Pro Team-Captain (invite-only), and standard amateur
- Captain-pays bundle — one Stripe Connect PaymentIntent for N teammates with reverse_transfer + refund_application_fee:false on per-line refunds
- Click-through legal acknowledgment — pre-beta legal review required; teammates ack non-refundability of platform fees + captain-card refund flow before chat access
- Atomic round publish — org draws bracket privately; click publish locks lineups + materializes per-seed pairings + fans out push, all in one transaction
- Pre-publish privacy invariant — pairings hidden until publish on every API endpoint (closed two parallel-controller leaks during hardening)
- Buffer-flag review queue — combined-DUPR over cap+buffer triggers org review (approve / reject-with-refund / allow-reform)
- Find-a-team discovery — players browse public-join teams whose MLP rules they fit
- Lineup deadline reminders — hourly Sidekiq job pushes captains who haven't submitted, with per-team dedup
- Hardened end-to-end — 5 audit pushes, 25 rounds, 42 production bugs found and fixed before launch
May 8, 2026
Mobile App
Player Hub — Your Pickleball Identity, Wherever You Play
A single shareable URL — your Player Hub — where fans, friends, and opponents can follow you, see your career stats and DUPR rating history, react to your wins, message you directly, and find you in club discovery. Visibility you control. Verified badges for elite players. Embed a follow widget on your club's website.
- One-URL identity — picklebeastpickleball.com/players/your-handle on web, deep-linked native screen on mobile
- Career stats — match count, win-rate, current streak, partner count, tournaments + leagues, member-since
- Activity feed — every match, badge, award, registration, streak milestone, club join with kudos reactions (🔥 👏 🏆 💎) and 1-level threaded comments
- Persisted DUPR rating-history — real chart of singles + doubles ratings over time, captured every time DUPR syncs
- Stats deep-dive — format breakdown, top partners, top opponents, day-of-week heat map, head-to-head record
- Three visibility levels — public / friends-only / private — applied across profile, activity, stats, comments, and discovery
- Block is a hard wall — 404 across blocks at every gate (profile, follow, DM, suggestions, search, leaderboard widgets)
- Direct messages with a Requests inbox — strangers' first DM lands in Requests, not your main inbox
- Verified-badge admin UI for elite/sponsored players, set by platform owners with audit trail
- Embed widget — drop a Follow Sarah card on any external site with one line of HTML; iframe-safe, public, anonymous
- Minor-safe by default — minors auto-private with first + last initial only on public surfaces
May 8, 2026
Club Admin
Kids Camps — Multi-Day Summer Programs
Run kids' summer camp programs end-to-end on Pro and Elite plans: registration, pickup PIN, daily check-in/out, encrypted medical profiles, photo consent, immutable waivers, daily challenges, badges, streaks, and a parent-side passport that carries across sessions.
- Three-level hierarchy — Camp (program template) → CampSession (specific week) → CampDay (auto-created daily curriculum)
- Two-actor model — parent is the user, camper is a sub-record (no kid login; COPPA-safe)
- Encrypted medical — Rails 7 native encryption on allergies/medications/conditions/physician info; AI surface excluded by forbidden_fields
- Photo consent triple-toggle — private recap (default ON), group share (default OFF), marketing (default OFF), filtered at recap publish time
- Pickup security — daily-rotating 4-digit PIN per registration plus a named-list of approved adults; brute-force rate-limited
- Late-pickup auto-detect — 15 min past daily_end_time in the club's local timezone fires a parent push automatically
- Per-camp refund policy — full → partial → none windows configurable in days; club-cancelled sessions always 100% refund
- Engagement loop — Khan/Duolingo-style: daily challenges, XP, level transitions (Beginner/Rookie/Pro/All-Star/MVP), streak counter, badges, virtual passport
May 3, 2026
Club Admin
Scheduled Pickup Orders — The Full POS Suite
Real-time kitchen display, walk-up POS at the bar, server mode at the courts, running tabs per reservation, and QR-code pickup verification. Mobile + web admin parity, with cross-tenant guards and idempotency keys built in.
- Kitchen Display (KDS) on web + mobile, updating in real-time via ActionCable when an order is placed, advanced, 86'd, or refunded
- Walk-up POS — bartender rings up a customer in seconds; optional member attach for member pricing; idempotency keys on every submit
- Server mode — roving server taps an active court, picks the player, rings up F&B without leaving the floor
- Running tabs — server-mode orders accumulate on a per-reservation tab; close at the end of the session via cash, check, or the customer's app
- QR pickup — when an order goes ready, the customer's app shows a QR; staff scans from the kitchen view to jump straight to the order
- Cross-tenant guards on every staff write path (member attachment, reservation lookup, scanner) — Club A staff can never bind to Club B data
- Forward state transitions wrapped in pessimistic locks — concurrent staff taps can't fire receipts or pushes twice
- Stripe refunds carry idempotency keys — a network blip doesn't double-refund on retry
- Demo seed creates 30+ multi-item orders, 3 queued intents, and 2 tabs (1 open, 1 closed) so demo clubs preview the full surface
- Demo seed refuses to run against non-demo clubs — production-safety guardrail prevents accidental real-customer receipt blasts