Weekly development
What’s new in PLAYGRND
A public view of what we actually ship each week. Features are the primary signal, with technical versions kept as a verifiable trail.
Social Studio, clearer Sessions, and team management
Web v856–v913 · 58
versions API v470–v518 · 49
versions
- A team manager now gets access only to their own team profile, while a superadmin can add or remove multiple managers through a quick picker of linked team players or a global search of public profiles. Team profiles now use one responsive header for the crest, name, seasons, managers, Instagram, and sharing, and the full team photo is shown without unwanted cropping. Crests and photos can be replaced repeatedly without a stale cached image or a conflict on the next save, and an age group can be recorded for an independent team without creating a team family.
- Sessions now clearly distinguish a player response from a request awaiting approval, approved and rejected sign-ups, and a later organizer decision. The organizer and a global superadmin get one ordered approval queue, while a new direct decision automatically closes the older request so the public page cannot show stale status. The administration workspace is simpler, and newly enabled two-side sessions default to the clear names White and Black.
- The new Social Studio brings together artwork for match previews, schedules, results, and tournament editions. Organizers choose the competition, stage, day, venue, and matches in one workspace, while distinct templates preserve readable full team names, complete scorer lists, and the publication rules for official data.
- Match administration now provides one workspace for details, rosters, the result, and scorers, with one clear entry point from the match list. Role changes and other actions save in the background without reloading the page or losing position, scheduled matches are the default view, and changing status filters immediately. Match creation searches existing teams while still allowing a separate new team with an identical or similar name. Before kick-off, an entirely empty scheduled match can safely replace a team or be deleted; any existing result, event, or match sheet blocks that change.
- Superadmins can now search for two team profiles, preview every linked participation, identity, address, and Session, and merge only after explicitly confirming an unchanged preview. The merge runs in one transaction, leaves a redirect from the old address, and records an audit trail, while conflicts such as both teams appearing in the same edition or facing each other automatically block it.
- Sensitive public, WhatsApp, live, and mobile actions now have generous but bounded protection against automated abuse. Counters expire reliably, traffic accepts only verified network sources, and shared memory for temporary state is monitored under a hard limit, so normal users should not encounter unnecessary 429 responses.
- Adding people once again provides autocomplete, distinguishes multiple profiles with the same name using team context, and allows another real profile to be created without forced merging. New profiles enter given name or names and surname or surnames separately, so multi-part names no longer depend on guessing. Administrators can edit a team profile address with a permanent redirect from the old address, while the same team can use a separate display name only within a selected tournament edition.
- Sessions can now lock sign-ups once teams are selected, preserve the chosen lineups, and show comparable performance averages weighted by actual appearances. Completed Sessions retain linked players in their lineups and group aggregate scorers more clearly by team.
- Competition pages now show every known rule independently without hiding partially published information or filling gaps with default assumptions. Match cards consistently show formats such as 5+1, while an upcoming match page includes its own kick-off countdown without repeating “Soon”. The home page aligns spacing, the countdown strip, and recent-event height with the number of displayed matches across desktop and mobile.
- Venue administration now includes a dedicated Google Maps URL field. The saved link appears on the public venue profile, can be intentionally changed or cleared, and older admin clients can no longer erase it accidentally when saving other venue details.
More organizer control and more reliable views
Web v821–v855 · 35
versions API v429–v469 · 41
versions
- Authorized organizers can edit players and matches within their own scope, enter the official result, rosters, and scorers, and review and confirm a tournament match sheet. The same ownership and validation rules apply across web administration and bounded AI drafts.
- A match can now exist when its kick-off date or time is still unknown, without showing a fabricated schedule publicly. Tournament stages can also define when scorers are official and prevent a final draw where a winner must be known.
- Session organizers can recruit players for a specific side, while a completed or cancelled Session shows a more concise result and the actual cancellation reason. Invitations and changes remain limited to the team the organizer is allowed to manage.
- Home statistics and recent events load faster through parallel fetching and short-lived caching. When part of the system is unavailable, the home page, Sessions, authentication, and rankings now clearly distinguish unavailable data from a genuinely empty result.
New tournaments, richer Sessions, and clearer matches
Web v748–v820 · 73
versions API v382–v428 · 47
versions
- The home page now starts with three direct filters for organization, location, and format, followed by separate upcoming, previous, and personal match views. Opening one filter closes the previously open filter. Every match view arrives in the first page response and switches instantly without another load; Upcoming disappears entirely when there is no additional future pairing after the featured match, and Your matches is always the last view. Recognized options in every filter are ordered from the highest result count to the lowest, while the unknown format remains last. When a next match exists, the characterful black strip continues directly from the filters without an empty gap, prioritizes the signed-in player’s next fixture, then falls back to the next fixture in the active global filter. The strip counts down, opens the match, and shows the competition short name and logo, with the teams and kickoff on one baseline. The featured match is not repeated in its corresponding list, tabs do not show partial counts, and the latest recorded events with a pulsing signal sit to the right of matches on desktop and directly below them on mobile. Current competitions now include real active and upcoming league seasons and tournament editions, including 4v4 above 3v3, without stale finished cups. The full personal Your PLAYGRND summary is collapsed by default.
- PLAYGRND now covers MNT Oluja 95 Crivac 2026 in its confirmed 5+1 format, with confirmed teams, results, scorers, and fixtures published so far, plus the 13th Dani Spinuta tournament starting on 31 August. Complete scorer totals were published for three matches played on 12 August; they count toward statistics, while recent activity shows every goal separately at match kickoff without ×N grouping or invented intermediate scores, minutes, or order. Dani Spinuta includes its confirmed four-a-side format, registration until 20:00 on 28 August, a draw after registration closes, €70 entry fee, and announced prizes. Tournament information keeps the Map action in the venue row and shows a published contact name and phone number on separate lines. Unconfirmed kick-off times, lineups, and results remain unpublished.
- Matches and tournaments now have branded Instagram templates for 9:16 Stories and 4:5 posts. Match artwork adapts to a preview or result, uses a bolder black, white, and green system, and avoids an empty scorer area. Tournament artwork distinguishes registration that is upcoming or open, an approaching start, a tournament in progress, and a finished tournament; during the competition, the next scheduled match replaces the registration deadline. Tournaments can use either the clean PLAYGRND design or their official poster. Logos fit cleanly without a double white frame, and team fallbacks stay direct and uncluttered. Match artwork uses the published short competition name, while team names remain on one line with controlled shrinking or an ellipsis when space runs out. Scorers use a ball icon and goal count without redundant labels. The image can be shared or downloaded directly.
- Tournament editions now separate information, rules, matches, teams, scorers, and awards more clearly. When dates are known, status shows that registration is open, while the characterful bar below the main header counts down in sequence to registration opening or closing, tournament start, and the next scheduled match, down to the second when an exact time is confirmed. The next-match bar shows the pairing with a colon and opens the match itself. A start date without a confirmed time remains a day-based countdown without inventing a kick-off time. A published contact number offers a direct call and a generic WhatsApp message that remains suitable before, during, and after the tournament, locations open the map without repeating the city, and prizes use clean full-width rows with green amounts. Each team opens directly to its roster, record, and matches in the selected edition.
- Completed Sessions can show the score, confirmed lineups, and an ordered timeline of goals, own goals, injuries, and team switches, with links to known player profiles. Unresolved nicknames keep a green “This is me” chip after the Session ends, securely continuing the existing WhatsApp identity flow, while linked profiles never show it. A regular group can now retain the same players and nicknames across multiple weekly Sessions, while each weekday keeps its own schedule and private link. If part of an older timeline was approximately reconstructed from the confirmed aggregate result, it is clearly labelled. Multiple games use the same presentation without a separate aggregate card, while session rules now sit with the other key facts. Private links use secure random codes, while participants who have already responded receive schedule changes in the PLAYGRND notification center without enabling external push channels.
- Match cards can use compact tournament and venue names only where space is constrained, while preserving full official names on their own pages. Competition, a centered date or time, and location therefore remain visible together even on the narrowest supported screens. The tournament stage sits above the score, with formats such as 5+1 in a separate neutral badge below it. Unplayed pairings use a clean colon, the mobile tournament list no longer places rounded corners against the screen edge, and Crivac shows the confirmed concise MNK Svilaja name without changing the team identity.
- Moderators can now find and compare possible duplicate players more easily, see their teams within the same case, and handle cases with more than two candidates. Stronger nickname-claim protection also prevents an active Session member from taking over another unresolved identity.
- Ivan Jurčević is now correctly marked as a goalkeeper on his profile and in all 20 already recorded official appearances. Two existing confirmed goalkeeper appearances were preserved, while separate Session records remain unchanged.
Goalkeepers and faster player browsing
Web v676–v747 · 72
versions API v340–v381 · 42
versions
- Each tournament edition can now have its own poster, registration dates and link, public contact, team limit, and multiple entry-fee categories. Advertised prizes support placements, individual recognitions, and special categories, and can combine cash, a percentage of paid entry fees, a jersey, trophy, medals, voucher, roast lamb, or another described item. These details remain clearly separate from official recipients recorded after the tournament.
- Goalkeepers now have a profile view of appearances in goal, goals conceded, and their average, while player lists mark their names with a clear GK label. The Best goalkeepers ranking compares only confirmed appearances within one format and requires at least five recorded matches. On the main PLAYGRND app, it opens through a format choice so 3v3, 4+1, and 5+1 data stay separate. Players can immediately save their position from their own profile.
- The player directory now loads much faster for a selected organization, competition, or format while preserving the same totals, search results, and pagination.
Brda, the Sun City partner app, and a more personal PLAYGRND
Web v540–v675 · 136
versions API v255–v339 · 85
versions
- PLAYGRND Sessions connect public discovery and private links for real games. Players see the time, pitch, price, and available places and answer YES, NO, or I’LL LET YOU KNOW, while organizers get a separate player list and controls for each session. The Gusar pilot uses recurring private sessions with an independent roster for every game.
- PLAYGRND now preserves three Brda tournament editions: the 2025 and 2026 senior tournaments plus the 2026 veterans edition. The archive connects fixtures, teams, players, results, images, and source identities without forcing uncertain profile merges.
- Sun City Sport now has its own PLAYGRND app at suncity.playgrnd.app, with Sun City branding and content scoped to its competitions. Sign-in transfers safely from the main PLAYGRND app without sharing a broad session cookie.
- The short /p link now leads to the preferred player profile, while /u forms the basis of a general public identity for organizers, referees, delegates, and other roles. Verified players can show a nickname on their profile and change its address in a controlled way while old shared links remain valid.
- The home page gained Your PLAYGRND shortcuts for organizations, competitions, and teams, a dedicated organization rail, and a featured partner. Filters no longer hide activity, competitions follow organization priority, and the initial SSR response is approximately 76% smaller.
- The match timeline now combines goals, own goals, and cards whenever at least one event has a known minute, including the score after every goal. Events without a minute remain at the end, while the Brda record supports starters, substitutes, goalkeepers, accumulated fouls, preliminary rounds, extra time, and ordered shootouts.
- Organization admins and superadmins can review and edit every league or tournament edition in one place and add a new season. A league season can safely clone rules, clubs, and confirmed rosters without automatically creating matches, while connected senior and veteran teams remain separate divisions of the same family.
- The initial WhatsApp request now receives a short confirmation and sign-in link. The welcome message is sent only after a profile claim is approved, while identity verification remains a separate, clearly explained step.
- The secure foundation for dedicated PLAYGRND apps is prepared: a locally bundled client, match discovery and Search plus native match, team, and player details which reuse the same pure Svelte primitives, navigation icons, and public logic as the web, WhatsApp/PKCE sign-in, deep links, profile photo selection, direct push notifications, account deletion, and store-review access. The public mobile gateway and sensitive capabilities remain disabled until account verification, real-device testing, and beta gates are complete.
Liga Bez Briga, organizer control, and clearer profiles
Web v505–v539 · 35
versions API v243–v254 · 12
versions
- Liga Bez Briga joined PLAYGRND with all 612 Best Play matches in complete 1:1 source parity: 270 cageball matches in the 3v3 format and 342 futsal matches in the 4+1 format. Leagues, seasons, teams, players, results, and source identifiers remain connected in one permanent public record.
- Best Play identities are connected to existing profiles only when the sources confirm the same person, while contradictory records remain separate. All external IDs are preserved, and player profiles plus team-season pages use readable name-based URLs instead of technical identifiers.
- Superadmins can now review technically suffixed profiles beside their canonical version, with both sports histories and every source identity. The workflow warns about different teams in the same season, blocks shared matches and conflicting claim or identity data, requires an explicit photo choice, and remembers pairs confirmed as different people.
- An organization manager can now add a league with its format, venue, and default court, add venues and courts, and edit or remove existing courts from the same administration area. League order is adjusted directly beside each row, while competition rank separates first and second divisions without manual priority numbers.
- The superadmin gained a dedicated directory for every organization, with direct access to edit any organization, league, or venue. Global organization order remains a superadmin decision, while league order inside each organization follows its manager’s selection.
- League and tournament seasons for a team now share the same profile system, readable paths, and clearer hierarchy. A league shows position, matches, and points, while a cup immediately shows its achieved stage and trophies distinguish winners, finalists, and semifinalists.
- Competitions, matches, and profiles now consistently show formats such as 3v3, 4+1, or 5+1 with a fallback logo when an image is missing. The ALL filter reliably restores the complete directory, while the home overview groups formats and links directly to the selected competition.
- Selecting a player profile photo now opens a larger version in a focused desktop and mobile modal without leaving the profile.
- Organizations can securely keep their own private match-sheet template in the PLAYGRND asset system. Authorized administrators can view and download it from organization administration, while the document remains private.
- Team form in league standings now clearly separates wins, draws, and losses without using green for a result that is not a win. Liga Firmi rules also correctly state that the clock stops.
Sun City data, tournaments, identity, and trusted AI
Web v258–v504 · 247
versions API v96–v242 · 147
versions
- PLAYGRND now highlights a catalog of every shipped feature, generated directly from the changelog, plus a public community ideas ranking. Every completed profile can publish an idea with an initial vote and cast at most one private vote per suggestion, while the author, aggregate vote count, and status remain public.
- Every match can now be shared on WhatsApp or as a PLAYGRND Instagram Story. The Story PNG is generated on demand from the current result, scorers, venue, and logos, includes a QR link to the match, and offers native share, download, and copy-link fallbacks. WhatsApp and other link previews use a separate current OpenGraph card.
- Organization profiles gained separate tabs for competitions, statistics, locations, and information, with figures calculated only from their own leagues and tournaments. The global Stats page now presents activity, competition archive, community, and match rhythm.
- Profile claims and verified identity are now separate. Existing approved claims remain verified, new users request a separate check, and the superadmin records the decision and method in a dedicated identity queue. Identity documents are not uploaded or stored in this version.
- The League Republic API became the primary Sun City source. All 9 available endpoints were archived, and 33 league seasons were reconciled for teams, appearances, goals, cards, standings, and results.
- Cups and supercups are now first-class tournaments: 9 editions are grouped under 4 stable tournaments with a season dropdown, 372 matches, brackets, scorers, trophies, and honors. Historical team names and logos remain tied to the correct edition.
- Trophy cabinets now include official Sun City honors: 28 best players, 33 best goalkeepers, and 35 top scorers, including tied winners. The 2019/2020 records are marked as an unreliable reconstruction and do not alter match statistics.
- PLAYGRND AI now works on web, WhatsApp, and Telegram: it finds players from a name alone, builds an ideal six from a team’s latest season, ranks known goalkeepers and honored players, and safely compares seasons, competitions, and teams. It understands typos, while every tool uses a bounded JSON plan, fixed read-only query, permission checks, and cost controls.
- Signed-in users can reopen their saved web and messaging answers from the AI page. Repeated identical questions are grouped with a repeat count, and a saved result can immediately start a new question or be shared on WhatsApp.
- A profile can generate a one-time QR code for secure sign-in on another device. The superadmin WhatsApp inbox reconstructs new conversations, tracks delivery status, and supports manual replies inside Meta’s 24-hour window.
- AI match-sheet processing can identify a match and prepare a result from a photo, while an authorized organizer explicitly confirms the final score after review. Every change includes conflict checks and an audit trail.
- FC Greben is shown under its former name Svi nas se boje i lakovi in the first 2019/2020 Serie A and Teški Amaterizam seasons, winning Serie A under that name. CB Arka remains a separate team, with its sixth season carrying the historical name Restoran Kadena.
- Leagues and tournaments now share the competition directory, filters, search, match cards, and season selectors; profile histories and trophies are clearly separated by competition type.
- The competition directory and organization profiles now show leagues and tournaments with the newest played season or edition first, while obsolete competitions move to the bottom.
- Leagues and tournaments gained a final Rules tab with player format, referees, ball, match duration and clock mode, plus tracking for appearances, goals, goalkeepers, and goal minutes. League promotions and relegations appear only when officially entered.
- League pages gained an all-time team title ranking and separate season awards for the best player, best goalkeeper, and top scorer. Historical award teams are reconnected to their profile and logo.
- Match cards now present final scores, shootouts, regular-time scores, winners, finals, and administrative results more clearly, with team logos and competition links.
- Team and player match histories gained filters and progressive loading of older matches without loading the entire archive up front.
- Player profiles group appearances and goals by competition and then by season, with a clear separation between league and tournament records.
- Organizations, competitions, teams, and players can carry a city, with competitions inheriting the organization location. Public profiles and entities show management roles compactly without confusing a public role with PLAYGRND admin permissions.
- Known goalkeepers now carry a GK label in match lineups, while AI match sheets and administration are visible only to users with the required competition permissions.
- Recent activity now follows match kickoff and event minute, so historical backfills no longer appear as new activity.
- A profile view is counted on a real visit to the player, while switching between Competitions, Matches, and Trophies no longer increases the count.
- When the AI provider or available budget is unavailable, web and WhatsApp return a clear user-facing message without disrupting the rest of the app.
- Historical cups are protected from routine sync overwrites, while unreliable league round numbers stay hidden until each league season passes validation.
- Public profiles, player rankings, league and tournament pages, and the competition directory gained a more compact desktop and mobile experience with correct Croatian count forms.
- League Republic’s England subdivision flag is now read and displayed correctly as England, with the parser also fixed for standard player country flags.
- Global AI questions with an excluded nationality, such as players who are not Croatian across all competitions, are now supported without requiring a league or team.
Admin, design, pitch, and AI pilot
Web v149–v257 · 109
versions API v54–v95 · 42
versions
- New desktop and mobile navigation shell, redesigned home, and clearer public profiles.
- Scoped organization, league, venue, court, and team editing with R2 images and audit.
- Player view counts, Redis aggregation, and Most viewed ranking.
- First WhatsApp AI match-sheet pilot and public PLAYGRND pitch for organizers and investors.
Identity, claims, and organizer foundation
Web v50–v148 · 99
versions API v16–v53 · 38
versions
- WhatsApp passwordless login, profile completion, and existing-player claims.
- Superadmin and scoped roles, claim queue, session management, and audit log.
- Fast async WhatsApp webhook with Redis deduplication and no raw hot-path storage.
- Profile hub and foundations of the private organizer console.
Production stabilization
Web v11–v49 · 39
versions API v6–v15 · 10
versions
- Hetzner becomes the stable production origin while HP remains the local worker and control plane.
- Scrape and ingest flow is separated from production with verifiable archives and a private Go API.
- Deploy, Redis, health, and operational guardrails were hardened.
Current production counter begins
Web v1–v10 · 10
versions API v1–v5 · 5
versions
- Initial Hetzner release model established with separate API and web versions.
- Systemd, Caddy, PostgreSQL, Redis, and GitHub Actions form a reproducible production path.
Foundations before the current counter
Search and season views
- Unified SSR search across players, teams, leagues, and venues.
- Team tabs and team pages within a concrete league season.
Sun City history becomes product
- Matches, venues, players, identities, and historical seasons gain public SSR pages.
- Offline-first ingest, parity checks, stable users, and safe duplicate merging.
- Player statistics and team logos aligned with source data.
Seasons, standings, and split environments
- Separate dev/prod environments, R2 buckets, and safer deploy/sync flow.
- Season URLs, standings, scorers, and controlled data refresh.
Ingest and local production parity
- Idempotent Sun City ingest, deterministic JSON, and historical capture tooling.
- macOS blue/green local setup, sockets, Redis, and backup automation.
Football data model
- Organizations, leagues, teams, venues, courts, cups, and matches gain a stable model.
- R2 assets, presigned uploads, backups, CLI, and first public listing pages.
PLAYGRND foundation
- Repository, Go API, health, observability, and first deploy lifecycle.