Changelog

1.12.0 — October 2026

  • Surf a Subway fixes: the ramp wedge of an upper deck was drawn one lane to the side and six units too far along the deck, so riders seemed to pass through it while the rules already lifted them; it now sits exactly where the rules apply it. Three signs across all lanes (slide required) only appear from the fourth difficulty tier, earlier chunks leave one lane free; three vents in a row start one tier later. After a crash the end screen names the move that would have saved the run (slide under signs, jump vents, jump gaps, change train early).
  • SEO for the German version: the remaining English meta descriptions (home, membership, community, player profiles, developer pages) now come from the language files; canonical and og:url name the page in the language it is shown in (?lang=de, or the locale's own domain once i18n.urls is set), hreflang alternates no longer append ?lang=en to the English address, every response carries Vary: Accept-Language, Cookie, the sitemap lists each page once per language with xhtml:link alternates, and on a non-default language without its own domain every internal link carries ?lang=xx so crawlers (which keep no cookie) stay inside the German pages.
  • Surf a Subway (games/surf-a-subway): single-player 3D endless runner built with Three.js (vendored r160, import map). The runner surfs on a hover board along the roofs of three trains that drive forward (wheels turn, wagons sway, lit end caps) while the city, stations with striped canopies, trees, lamps and tunnels rush past at full speed; roof items (vent boxes to jump, signs and gantries to slide under, tall cabinets that force a train change, gaps where a train ends, upper decks with a ramp) travel with the trains, so they approach at the surf speed (two-speed model: train-space items get the trains' travel added, fixed scenery keeps its birth offset). The coins are a Tripo model too (assets/models/coin.glb, about 4k triangles, one shared geometry and material for all coins, spinning on the vertical axis). The hover board is a Tripo model (assets/models/hoverboard.glb, laid flat and scaled at load time) with two rear thrusters: cone flames, additive glow and spark sprites that grow with the speed and flare up with the rocket board. On phones there are on-screen buttons (◀ ▶ ▼ ▲ and a shield button) as well as swipes; the play shell forwards key presses to the game when the focus sits outside the frame, so arrows work after clicking the play bar too. The track is an endless chain of seeded, hand-shaped chunk templates (assets/track.js) that are fair by construction; six tiers (by distance) narrow the gaps and unlock harder templates. Coins, a magnet, a rocket board (flies above everything), a ×2 score booster, shield-board charges (double-tap / E: one free hit) and rare keys (continue a run after a crash, twice at most) lie on the rails; close calls give bonus points. Score, coins, keys, the crew (twelve runners: three Tripo-generated, auto-rigged characters with four outfit hues each via a shader hue shift on saturated colours), five boards with perks, four power-up duration upgrades, three seeded daily missions, a weekly 15 km goal and lifetime stats are saved in slot 0; scores go to board main with the distance in the meta. Three districts (harbour, old-town sunset, neon night) rotate every 850 m with their own palette, sky, fog and Artlist panorama (mirrored-repeat backdrop). The characters are animated procedurally on their auto-rig (run cycle, jump tuck, slide crouch): bones are classified by geometry, not by their unreliable generated names. Portrait and landscape, phone swipes with an on-screen shield button, keyboard on desktop; fully translated (EN/DE).

1.11.1 — October 2026

  • Fix: the play shell no longer shows the "free 15 minutes used up" overlay when a play session was merely closed on the server (the cron closes sessions without a heartbeat after five minutes, which happens whenever a tab stays hidden or the computer sleeps while waiting for an opponent; opening the same game in a second tab ended the first one too). Unlimited members saw the overlay although nothing was used up, and because the overlay removes the game frame, the other player of an online match waited forever and the match looked out of sync. The shell now quietly opens a new session (POST /play/start with resume: 1, which counts no new play and leaves other tabs alone) and keeps the game running; the limit overlay appears only when the free minutes are really used up. A page restored from the back/forward cache (mobile app switch, back button) resumes its session the same way.
  • Header: the bar now spans the whole window (brand and menu on the left, search, language, Log in / Play free set apart on the right behind a thin divider) instead of sitting in the centred 1320 px container. Squeeze steps keep everything inside the bar on narrower desktops (search 150 px below 1440 px, hidden below 1300 px; logo text and language pill hidden below 1200 px; burger below 1060 px). German labels are wider, so for html[lang="de"] the steps come earlier (search below 1500 px, logo text/language below 1300 px, burger below 1180 px). Buttons never wrap onto two lines any more.
  • Home page pass card for guests: next to "15:00" it now reads "minutes a day / free, every day" ("Minuten täglich / kostenlos, jeden Tag") on two lines.
  • Fix: a new member who opens an invite link (or presses Play as a guest) and registers now lands in that game instead of on the welcome dashboard; the "return to the game after signing up" promise of the registration page is kept.

1.11.0 — October 2026

  • Chess Master in 3D (games/chess-master): the board can now be played in a real-time 3D scene (assets/board3d.js, Three.js 0.160 vendored under assets/vendor/three/, loaded on demand through an import map). The six piece types are Tripo 3D models (assets/models/*.glb, about 160 KB each, textures stripped; sources in ../design/chess-master-pieces/), tinted ivory and ebony at runtime with soft shadows on a wooden board with coordinates. Selection, legal targets, captures, last move and check are shown as highlights on the squares; moves, captures, castling and promotions are animated by diffing positions, so computer, online and resumed games all animate. Four camera presets (my side, low, side, top), drag to orbit, wheel or pinch to zoom, "Flip board" turns the camera to the other side. A "2D view" button switches back to the flat board; the choice is remembered per browser and the 2D board is used automatically where WebGL is unavailable. In 3D the board column grows to 900 px. A "Full screen" button lets the board fill the whole game area (status, players and controls float on top; on phones the board keeps clear of them) and, where the browser allows it, takes the game into real fullscreen; Esc or the button leaves it.

1.10.1 — October 2026

  • Turbo Horizon cars from 3D models: the code-drawn cars are replaced by sprite sheets rendered from three Tripo 3D models (coupe, muscle car, rally hatchback; sources in ../design/turbo-horizon-cars/). Each sheet (assets/cars/*.webp, about 40 KB) holds the rear view in five steering angles; race.js recolours the red paint per driver colour at load time (tyres, glass, chrome and stripes keep their colour), adds a ground shadow and uses half-size frames for the cars ahead. The body style follows the driver colour, so online players see each other in the same car. The old code-drawn car remains as a fallback while the sheets load.

1.10.0 — October 2026

  • Turbo Horizon (games/turbo-horizon): pseudo-3D arcade road racer in the OutRun tradition. The road is a list of projected segments with curves and hills (assets/track.js, seeded builder: the same stage + seed gives everyone the identical course); scenery and cars are code-drawn sprites, the six horizons are Artlist panoramas with parallax. Auto-throttle, steer with keys, mouse or touch zones, brake on demand; off-road drag, scenery crashes and car bumps cost speed. Six stages of about three minutes (alpine snow walls, coast, desert, autumn hills, neon city, volcano); seven AI drivers with lane avoidance and rubber banding; a live sports-style commentary ticker (overtakes, leader changes, halfway, final stretch, crashes, finishes; templates in lang/*.json). Career: win a stage to unlock the next, best times and unlocks saved via the SDK, points for position and time on board main. Online: server module (server/routes.php, tables turbo_horizon_races / turbo_horizon_players) with room codes, public rooms, Community invites, host settings (stage, AI cars), start, new round, close/delete; up to 4 drivers race the same seed at once, each client posts its position about once a second and renders the others as interpolated remote cars, the server ranks by finish time and distance, closes the race when everyone present is done (75 s grace after the first finisher) and submits points on board online. Fully translated (EN/DE, server sentences in lang/de/gameserver.php).

1.9.0 — October 2026

  • LUMORA (games/lumora): single-player block puzzle on an 8 × 8 board. Three stones from a catalogue of 29 fixed orientations (singles, bars 2–5, 2×2, 3×3, 2×3/3×2, small and big corners, T, S/Z), no rotation, no gravity, no timer. Full rows and columns are determined on the same board state and cleared together (an intersection cell counts once, the lines count twice); 5 points per placed cell plus a line bonus of 100/250/450/700 (+300 per further line) multiplied by a combo of consecutive clearing moves (×1…×5). The seeded generator (assets/rules.js, mulberry32 with the state stored in the save) weights small/medium/large stones by progress, redraws up to 30 times until at least one stone fits and falls back to a single stone. A game ends only when no remaining stone fits anywhere. Classic mode and Light mode (every cleared line charges one of eight segments; a full charge dissolves one chosen stone for no points, offered before the final game over); separate leaderboards classic and light. Drag-and-drop with the grabbed cell as anchor and a lift above the finger on touch, tap-to-place, full keyboard control (Tab, Enter, arrows, Esc), valid/invalid previews with a glow on lines about to complete, soft synth sounds, optional ambient pad, reduced-animation setting, three-step interactive tutorial on a prepared board, pause with settings, results screen with rank. The whole state (board, stones, score, combo, charge, seed, generator state) is saved after every move through the SDK and resumes from the title screen. Rules are covered by a Node test script that mirrors the acceptance criteria. Fully translated (EN/DE); Artlist cover.

1.8.0 — October 2026

  • Galaxy Vanguard (games/galaxy-vanguard): single-player retro pixel-art space shooter. The cruiser follows keyboard, mouse or finger and fires by itself; Space/B or the on-screen button drops a smart bomb. 100 generated levels in ten sectors (assets/levels.js: waves, formation shapes, enemy mix, fire rate, dive frequency, asteroid density and boss stats all grow with the level number, seeded so a level always plays the same). Galaga-style formations fly in along curves, sway, dive at the player and shoot (saucers, drones, wasps, armoured tanks); asteroids split into smaller rocks; power-ups for weapon level (five stages), rapid fire, shield, bombs, lives and bonus points; a boss ship with fan, aimed, ring/spiral and drone-call patterns every fifth level; kill combos raise a score multiplier up to ×5. Sprites are character maps drawn in code (assets/sprites.js), sounds are synthesised. The run (level, score, lives, bombs, weapon) is saved after every level and resumes from the title screen; scores go to the leaderboard after every level and on game over; an in-game leaderboard screen shows all-time and weekly ranks. Fully translated (EN/DE); Artlist cover and five sector backdrops.
  • Coco Dash / Galaxy Vanguard: the body marker class for touch devices is now is-touch; before, body.touch matched the .touch { display: none } rule for the on-screen controls container and hid the whole game on phones.

1.7.0 — October 2026

  • Coco Dash (games/coco-dash): single-player 2D jump-and-run. Coco the monkey runs, jumps (variable height, coyote time, jump buffering) and dashes through 20 levels in six biomes (beach, jungle, river, ruins, volcano, night) with parallax backdrops drawn in code. Levels come from a seeded generator (assets/levels.js tunes length, gap width, height variance, enemy mix and density; assets/game.js guarantees feasible gaps and steps), with palms as climbable platforms, coconuts, a golden coconut, bananas (hearts), crabs/snakes/parrots to stomp, tigers that charge and cannot be stomped, spikes, two checkpoints per level and a hut as the exit. Keyboard and on-screen touch buttons (landscape game). Progress (unlocked levels, stars, best scores) and the running level (checkpoint, hearts, collected coconuts) are saved via the SDK state, so a player can stop and continue; scores per level go to the leaderboard. Fully translated (EN/DE), Artlist cover.
  • Nine Mills: the computer's move is now unmistakable: a dashed ring marks where its piece came from, the moved piece pulses, a taken piece flashes red and leaves a cross for a moment, the status reads "Computer: 5 → 12 and takes 7" for two seconds, and the newest move-list entry is highlighted. A DOM/engine mismatch during an animation now rebuilds the board instead of dropping the move.

1.6.0 — October 2026

  • Multilingual portal and games (English source, German complete). App\Core\I18n with lang/{locale}/{group}.php, helpers __(), lang(), lang_url(), game_text(), category_label(), unit_label(); every view, controller message, validator message, flash, email and error page uses keys. Locale from ?lang=, the X-Locale SDK header, the agc_lang cookie, the member's saved language (new users.locale column, migration 2026_10_12_200000_user_locale, select in Account → Profile), the host (i18n.hosts, any .de domain), Accept-Language, then en. Language switcher in header, mobile menu, footer and auth pages; <html lang>, og:locale, hreflang + x-default links; optional per-locale domains via i18n.urls. Legal pages as German view copies (terms.de.php, privacy.de.php, imprint.de.php), studio content (team, FAQ, timeline, jobs) moved to lang/{locale}/content.php. Dates get translated month and weekday names. Emails render in the recipient's language.
  • Games: the SDK loads games/{slug}/lang/{locale}.json (English fallback) before init(), translates data-i18n* markup, offers ag.t(), AllGame.tr(), AllGame.i18n.get(), and sends X-Locale to the API; the play shell passes &lang=. All nine games ship lang/en.json + lang/de.json and an i18n.de block in game.json (name, tagline, description, controls); server-module messages are translated by exact lookup in lang/{locale}/gameserver.php; the fairground framework translates its UI and each game's config through kirmes.* / game.* keys. The module template and docs/i18n.md show the pattern for new games and languages.

1.5.0 — October 2026

  • Nine Mills (games/nine-mills): Nine Men's Morris on a walnut board. Place nine pieces, slide them along the lines, three in a row is a mill and takes an opponent's piece (pieces in a mill are protected unless every piece is), three pieces left may fly, two pieces or no legal move loses; 50 moves without a capture or a threefold repetition is a draw. Computer opponent on three levels (assets/mills.js: alpha-beta with iterative deepening, time-boxed), games against the computer are saved and resumable, online games against members on the Chess Master / Four in a Row pattern (table nine_mills_matches, server-side replay of the move list, invites, rematch, resign, creator-only delete). Moves travel as three-letter tokens (from, to, capture). Cover, board wood and tavern backdrop generated with Artlist.
  • Navigation: a "Home" item before "Games" (desktop and mobile menu, marked active on the start page). The search field hides below 1120 px and the menu collapses into the burger below 900 px so the wider menu never pushes the buttons off the bar.
  • Account: the country is picked from an alphabetical list of all 250 ISO countries and territories (App\Services\Countries, generated from ICU data) instead of a two-letter code; the server validates against the list; public profiles and the Community show the country name. The profile-picture form has a friendly "Choose a photo…" button that shows the chosen file name and size and enables "Upload" (.file-pick in app.js/app.css).
  • Play bar: pill-shaped Back button with a chevron, game name and a live status pill ("Playing" with a pulsing dot, amber for paused/limit states) on one line.
  • Online lobbies of Chess Master, Four in a Row and Nine Mills: the silent invite-link copy after creating a game no longer falls back to a prompt() dialog.
  • Mobile pass (phones get the complete experience, no redesign): every button is a pill (--r-btn: 999px, also in all game stylesheets, only sizes differ); on touch screens everything tappable is at least 44 px (buttons, menu, tabs, footer, checkboxes, radios, lobby options); no text under 12 px on phones; safe-area insets for notched phones (viewport-fit=cover in all layouts); the account tabs scroll sideways instead of wrapping; the play bar is one lean row (compact timer, no avatar, icon-only Back). Play shell: the Fullscreen button appears only where the browser supports it (Android, desktop) and locks the orientation of one-way games; games that are portrait- or landscape-only (per game.json) show a "Turn your phone" overlay on phone-sized screens when held the wrong way and are paused meanwhile (allgame:pause reason orientation). Chess Master, Four in a Row and Nine Mills get a layout for phones held sideways (board on the left sized by height, controls on the right) and single-line player bars on narrow screens. Fairground games stay portrait, Kick Duel and Photo Puzzle work both ways.
  • Avatars are circles everywhere: the generated placeholder is a disc, and all avatar images in the portal and the games use border-radius: 50%.
  • SDK fix (sdk/allgame.js): state.load() now resolves with the saved payload itself instead of the API record that wraps it, so the "Resume" boxes of Chess Master, Four in a Row and Nine Mills and the fairground records actually find their data (the record's slot/label/version are attached as a non-enumerable _meta).

1.4.0 — October 2026

  • Kick Duel (games/kick-duel): goal-wall shoot-out for 1 to 8 players. The game master opens a match room (room code, Community invites, optional public listing), sets 1–10 shots and the hole size, and starts; everyone shoots the same series of holes at their own pace, with a live scoreboard, ticker and final ranking. Every shot has its own hole (alternating low and high, wandering sideways, shrinking towards the end), generated from the match seed on the server (server/routes.php, tables kick_duel_matches / kick_duel_players).
  • Kick Duel engine (assets/kick.js): pseudo-3D camera, ball flight with gravity, drag, side-spin (Magnus) and ground bounces, wall/ring/hole collision, a procedurally drawn 32-panel ball that rolls and spins, an animated kicking leg, swipe input (direction, power from length and flick speed, loft from the contact point on the ball, curve from a bent swipe), aim preview, screen shake, mud marks and synthesised sounds.
  • Six rotating pitches generated with Artlist (assets/bg/), one per round, plus a key-art cover.
  • Kick Duel 1.1: turn-based. Players kick one after the other (fewest shots first, then join order), the sign above the wall shows "<name> · KICK NOW", and every kick is replayed live on the other players' screens (the kick parameters travel with the shot; the physics is deterministic with a fixed step). 45 seconds per shot, an overdue kick counts as a miss and the turn moves on; players gone for two minutes no longer hold up the result. Server columns turn_user_id / turn_since (install.sql upgrades existing tables).
  • Lobbies of Kick Duel, Photo Puzzle, Chess Master and Four in a Row: the player who opened a match/room gets a trash button with a confirmation; only the creator may delete (POST …/{code}/delete).
  • Fix: the game iframe (app/Views/games/play.php) now allows modal dialogs (allow-modals). Without it the browser silently returned false from every confirm() / prompt() inside a game, so the lobby trash buttons, "Resign", "Invite a member…" and the copy-link fallback did nothing.
  • Fix: joining a Kick Duel match bumps the match version, and the waiting room re-renders its player list on every poll, so the game master sees new players within a second instead of only after a reload.
  • Home page: the Highlights are a horizontal row like every other row (larger tiles) instead of a wrapping grid, and all rows get Netflix-style edge arrows that stay visible whenever the row can scroll in that direction, with a fade at the edge; one click moves one page and lands on a tile edge. Row blocks no longer stretch the page wider than the viewport.

1.3.1 — October 2026

  • Partridge Rush replaces the Target Rush sample (same folder games/sample-clicker): partridges run through a meadow in three rows, tip over when hit and stay down, the round counts the fallen birds; hares are decoys, a fox trots by and carries off fallen birds unless you shoo it. Runs on the Kirmes framework with three difficulties and a new cover.
  • Partridge Rush: shotgun barrel that follows the pointer, pellets with muzzle flash and recoil, wider hit tolerance, four rotating landscapes (summer, autumn, winter with snow, evening).
  • API rate limit removed for logged-in players (configurable), play shell tolerates transient heartbeat errors.
  • Kirmes framework: games receive hover events for mouse aiming.

1.3.0 — October 2026

  • Photo Puzzle (games/photo-puzzle): jigsaw port of the Family Photo Puzzle app with live co-op rooms. The host uploads a photo (or picks one from the gallery), chooses 6–120 pieces, rotation and table colour; everyone in the room sees pieces move live, snapping and merging are settled on the server with the original rules (server/PuzzleRules.php).
  • Admin game editor (/admin/games/{id}/edit, short URL /adm): edit name, tagline, description, category, tags, players, leaderboard, status, highlight flag, sort order and upload a 16:9 cover. Edits are stored as overrides and survive folder syncs.
  • Highlights section on the home page (three large tiles per row, admin-controlled) and sort order applied everywhere.
  • Multiplayer filter in the game catalogue and the API (GET /api/v1/games?multiplayer=1).
  • Deprecation notices no longer abort requests on newer PHP versions.

1.2.0 — October 2026

  • Dark arcade redesign: Netflix-style billboard hero with the featured game, horizontal game rows (continue playing, popular, play together, per category), 16:9 hover tiles with instant Play, game pages with full-bleed key art, search in the header.
  • Play first: guests who press Play land on the registration page with social login and return to the game after signing up.
  • Sign in with Google and Facebook (/auth/{provider}), account linking under Security, social_accounts table.
  • New 16:9 key-art covers for all games.

1.1.0 — October 2026

  • Multiplayer page (/multiplayer) and a highlighted Community page (/community): members online now, what they play, their best scores, invites between members (web + API), presence ping, privacy toggle Show me in the Community.
  • Game invites as a platform feature: game_invites table, /api/v1/invites…, email to offline recipients, ?invite={id} forwarded to the game by the play shell.
  • Chess Master: full rules engine and three computer levels in JavaScript, online turn-based matches via a server module (server/routes.php, server/install.sql), invite by username, open games by code or link, draw offers, resignation, leaderboard points.
  • Fairground games ported from the Kirmesspiele app on a shared Canvas/WebAudio framework (games/_kirmes): Ring Toss, Duck Fishing, Can Toss, Balloon Darts, each with three difficulties, records and leaderboard scores.
  • Play shell forwards extra query parameters to the game; registry runs per-game install.sql.

1.0.0 — October 2026

First public release of the platform.

  • Player accounts: registration with email verification, login, remember-me, password reset, email change, avatar upload, public profiles, data export, account deletion.
  • Daily play pass: 15 free minutes per day, server-side heartbeat, play shell with live countdown and Unlimited upsell.
  • Membership: monthly (€9.90) and yearly (€99) plans, sandbox checkout for development, Stripe Checkout + webhooks, cancel/resume, invoices list, admin grants.
  • Game modules: games/{slug}/game.json, registry sync, cover placeholders, file streaming with entitlement check, optional server routes.
  • SDK allgame.js 1.0.0: states, scores, leaderboards, pause/resume/limit events, shell messaging.
  • REST API v1: auth, players, games, states, scores, play sessions, developer keys. OpenAPI 3.0 document.
  • Admin: dashboard, users, games, subscriptions, messages, audit log.
  • Studio site: home, games, membership, about, team, careers, press, FAQ, contact, terms, privacy, imprint.

Last updated October 13, 2026.