KATFORGE Ecosystem

A shared platform for building game and analytics sites. One identity, one API, one set of composable packages.

How it works

Every site shares the same backend:

  • Identity: one players table across every site. Guests, OAuth (Discord, Google, Apple, Steam), and cross-domain SSO via passport tokens.
  • API: one Symfony backend at api.katforge.com. Per-game Postgres schemas, shared public.players and public.users.
  • Hearth: the orchestrator. One install, then every workflow — local dev stack, secrets, deploys — is hearth <command>. See Hearth docs.

On top of that, KATFORGE ships a set of composable packages. See Package composition.

Spinning up a new site

shell
npx create-katalyst my-gamecd my-gamenpm run dev

Katalyst scaffolds a Vue 3 + Tailwind + Capacitor project wired to the API through the SDK. Auth, leaderboards, and cross-domain SSO out of the box; bring your own game logic.

Package composition

The packages compose into a game development stack. Sites pick what they need:

LayerPackageRole
Transport@katforge/apiHTTP client, auth, pagination, error mapping
UI@katforge/sparkLogin modal, flash messages, theme CSS
Engine@katforge/forgeGame loop, input, renderer, Vue composables
ECS@katforge/anvilEntity-Component-System for game state
Data@katforge/codexTyped collections, i18n, loot tables, item forging
Combat@katforge/tacticianDeterministic encounter resolution
Scaffolding@katforge/katalystCLI that generates a new game project

An analytics site like wc3stats or DarkerDB only needs @katforge/api and @katforge/spark. A full game like Gear Goblins uses the entire stack.

Per-game schemas

Each game owns a Postgres schema. Doctrine migrations manage all schemas from one repo.

text
public.*           players, users, oauth, email subscriptionsstumper.*          lobbies, questions, answers, stats, favoriteslextris.*          results (daily + random leaderboards)gear_goblins.*     characters, equipment, spells, zones, currency

Game tables reference public.players.id as player_id. No game-specific user tables. One player, many games.