All projects
2025LiveSolo Fullstack - concept, build, deployment

Pokémon Seelenbund

Real-time Soullink/Nuzlocke challenge tracker for multiplayer Pokémon runs

A real-time web app for tracking Pokémon Soullink and Nuzlocke challenges with friends. Each player's encounters are linked by slot number into 'soul bonds' - when one Pokémon in a linked group dies, all partners die with it. The app enforces Nuzlocke rules (one encounter per route, dupes clause, level caps), keeps teams, boxes, deaths and fumbles in sync across all participants, and includes a built-in PokéWiki with catch-rate calculator, evolution chains, moves and type chart.

500+
German Pokémon entries
Real-time
Supabase sync
3
Pokémon games
1
Solo dev
01

Overview

Pokémon Seelenbund is a shared game-state tracker for Soullink and Nuzlocke challenges. In a Soullink run, several players play parallel games and every encounter slot is linked across participants - a death in one game propagates to all linked partners.

The app replaces spreadsheets and manual coordination with a live web interface. Every action - catching, killing, fumbling, moving between team and box - is synchronized instantly via Supabase Realtime so all players see the same state without reloading.

On top of the tracker sits a full PokéWiki: German Pokémon names, types, abilities, evolution chains, level-up and TM moves, item recommendations from competitive usage stats, a type-chart, level caps, and a catch-rate calculator that implements the real Gen 4/5 formula.

02

Architecture

React SPA → TanStack Query cache → Supabase (Postgres + Realtime) → PokeAPI / Smogon data → Netlify

React SPA
Vite · TypeScript · Tailwind · shadcn/ui
L1
Run overviewChallenge creationTeam / box gridShadow & fumble realmsPokéWiki lookupCatch-rate calculatorLeaderboard
State & cache
TanStack React Query
L2
Per-table query keysTargeted invalidationEvolution-line cacheSmogon stats cache
Supabase backend
Postgres · Realtime · Auth
L3
runsparticipantsteam_slotsbox_slotsshadowrealmfumbleRealmPostgres Changes subscriptions
External data
PokeAPI · Smogon usage stats
L4
Species & evolution dataMoves & abilitiesCompetitive item usageGerman localization
Deployment
Netlify
L5
Auto-deploy from mainSPA redirects
03

Tech stack

Frontend
React 18TypeScriptViteTailwind CSSshadcn/uiLucide icons
State & Routing
TanStack React QueryReact RouterZod
Backend
SupabasePostgreSQLRealtime subscriptionsRow Level Security
External APIs
PokeAPIdata.pkmn.cc (Smogon usage stats)
Deployment
NetlifyAuto-deploy from mainSPA redirect rules
05

MVP features

Run management

Create runs with any number of participants and support multiple parallel challenges. Each run tracks badges, active participants and the current game state.

Soul-bond team grid

Each player has 6 team slots and 12 box slots. Slots with the same number across participants form a linked group; kill, fumble and move actions apply consistently to the whole group.

Shadow & fumble realms

Dead Pokémon go to the Shadow Realm with metadata about who caused the death and where it was caught. Fumbled encounters are tracked separately in the Fumble Realm.

Orden tracking

Badge progress is stored per run so the group can see how far each player has advanced through the main story.

Catch-pace enforcement

The next linked slot only unlocks when all participants have caught up, preventing one player from racing ahead of the others.

Route locking

Each route or location can only be used once as a catch location per run, scoped to the current challenge.

Dupes clause with evolution lines

When a Pokémon is logged, its full evolution line is resolved via PokeAPI and checked against all used encounters. Conflicts block the entry with a clear message.

Blocked-encounters panel

A sidebar shows every consumed evolution line with sprites and highlights which members have already been used in the run.

Int Olympics leaderboard

Gamified scoring for accidental deaths: small kills, big kills and fumbles award points, with a podium and percentage breakdowns.

PokéWiki lookup

Search German Pokémon names and view types, weaknesses, resistances, immunities, base stats, abilities and evolution chains with sprites and conditions.

Catch-rate calculator

Implements the real Gen 4/5 catch formula with HP slider, status conditions, nine ball types and special logic for Timer, Nest and Quick balls.

Item recommendations

Suggests the most common competitive held items from Smogon usage stats, with tier fallback and German item-name localization.

Moves & type chart

Level-up and TM moves with German names, switchable between Platinum, HG/SS, Black/White and B2/W2. Full 18×18 type-effectiveness table with German type names.

Level caps

Chronological level-cap table for the main run so players can enforce Nuzlocke level limits at each gym.

Real-time collaboration

Supabase Postgres Changes subscriptions keep all clients in sync without polling; targeted query-key invalidation keeps the UI consistent.

06

Workflows

Starting a challenge

  1. 1

    A player creates a run, names it, and adds the other participants.

  2. 2

    Each participant gets a color-coded player slot in the shared team/box grid.

  3. 3

    The run link is shared; anyone with the link can open the live tracker without creating an account.

Catching a Pokémon

  1. 1

    A player enters the route/location and the Pokémon name in German.

  2. 2

    The app resolves the evolution line via PokeAPI and checks it against all already-used encounters across team, box and realms.

  3. 3

    If the route is already used or the evolution line is blocked, the entry is rejected with a reason.

  4. 4

    On success, the Pokémon appears in the linked slot group for all participants in real time.

Kill / fumble / move

  1. 1

    A player marks a slot as killed, big-killed, fumbled, or moves it between team and box.

  2. 2

    The mutation is applied as a group operation across all participants with the same slot number.

  3. 3

    Realtime subscriptions push the new state to every open client immediately.

  4. 4

    The Shadow Realm, Fumble Realm and leaderboard update automatically.

Lookup & catch-rate

  1. 1

    A player opens the PokéWiki search and types a German Pokémon name.

  2. 2

    The app shows types, stats, abilities and the full evolution chain with conditions.

  3. 3

    The catch-rate calculator lets the player set HP, status and ball type to see the real catch probability for Gen 4/5.

07

Security

  • All game data is scoped per run so separate challenges never interfere with each other.
  • Mutations run server-side against the live database, not the local cache, preventing race conditions between concurrent players.
  • Evolution-line lookups are cached in memory and localStorage to minimize external API calls and remain usable offline.
  • External data is fetched from public APIs only; no player account or personal information is required to use a run.
  • Row Level Security policies restrict reads and writes to the appropriate run context.