Work gamingworld
service

Gaming World

An indie-only game platform — reviews, hosting, devlogs, no AAA noise.

Gaming World UK is a community-driven platform that promotes independent game developers — honest reviews, free hosting on `*.gamingworld.uk` subdomains, devlog publishing, and a small in-house studio shipping original projects. Built as a TypeScript SPA on top of a Go API + PostgreSQL, with a Python toolchain feeding the review queue.

Last updateApr 2, 2026 PrimaryTypeScript
  • TypeScript
  • React
  • Vite
  • Go
  • PostgreSQL
  • Python
  • Tailwind CSS
  • Apache
  • systemd
Gaming World — An indie-only game platform — reviews, hosting, devlogs, no AAA noise.
Gaming World media
Gaming World media
Gaming World media
Gaming World media

Gaming World is built on a single, opinionated thesis: independent games deserve a platform that only covers independent games. No AAA bleed-over, no franchise news, no engagement-bait listicles — just a curated feed of what actually-small studios are shipping right now, the people behind them, and a free runway to host their work.

What the platform does

  • Honest indie reviews — every game that ships on the platform gets a real write-up, not a syndicated press release. The review queue is fed by a Python pipeline that scrapes submissions, normalizes metadata, and pre-fills the editor's worksheet so the human can focus on the words.
  • Free subdomain hosting on *.gamingworld.uk for any submitted game's marketing site. Apache vhosts are templated, certificates auto-issue via Let's Encrypt, and the dev keeps full ownership of the content.
  • Devlog publishing with first-class long-form markdown — embedded screenshots, video, the lot — so a creator can write directly on the platform instead of dragging readers to yet another newsletter.
  • An in-house studio shipping original work (Tulpa, Revamp, and friends) under the same brand, to keep the platform honest about what "indie" actually means.

How it ships

The frontend is a React + Vite + Tailwind SPA — fast, static-deployable, and small enough that the entire bundle warms in a few hundred kilobytes. Behind it is a Go HTTP API backed by PostgreSQL (with a small library of PL/pgSQL functions for the heavier review-queue queries). A Python sidecar handles ingestion, image normalization, and OG-tag scraping for submitted games. Everything runs under systemd on a single VPS, fronted by Apache; deploys are a one-command just deploy.

Why we built it

The big games-coverage sites stopped covering independent work seriously a long time ago — small studios get one slot a quarter if they're lucky, buried under whatever publisher-funded preview is trending. Gaming World takes the opposite vow: AAA studios are explicitly out of scope. If a team of more than ten people is making it, it doesn't belong here. The platform is the editorial line.

Straight from the source

The project's own README.

Rendered in place — every link, image, and code block carried over from the repo. The page below is what a contributor would see opening the project for the first time.

Changelog

All notable changes to Gaming World are documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[0.1.9] - 2026-04-02

Added

  • External News API: POST /api/v1/news/external endpoint for external projects to publish news articles via API key auth (X-API-Key header)
  • SEO prerender: Server-side rendered meta tags (Open Graph, Twitter Card) for news articles, served to bots via nginx user-agent detection
  • Dynamic sitemap.xml: Auto-generated from published news articles with 15-minute cache
  • Client-side SEO: document.title and OG meta tag updates in NewsArticlePage for in-app navigation
  • source_project tracking: News articles record which external project posted them

Infrastructure

  • NEWS_API_KEY environment variable for external news API authentication
  • Migration 019: source_project column on news_articles table
  • Nginx map directive for bot detection with prerender proxy routing

[0.1.8] - 2026-03-21

Added

  • Emulator logo sync: 465 emulators now show real logos synced from disk into the database
  • AI fallback images: Category-specific AI-generated fallback images (via FLUX) for 420 emulators with no logo
  • Polymorf game card: New project card for the AI-powered dual-camera photo booth activation

Improved

  • Ghost watermarks on all emulator cards including fallback images
  • Emulator detail modals show fallback images instead of emoji placeholders
  • New justfile recipes: gen-fallback-images and sync-emulator-images

Fixed

  • CORS blocking all requests via www: Added nginx redirect from www.gamingworld.uk to apex gamingworld.uk — previously both were served without redirect, causing CORS origin mismatch with the API

[0.1.7] - 2026-03-21

Added

  • Emulator system images: Real hardware photos for 40+ gaming systems across category, landing, and system browse cards
  • Process monitor: Admin analytics showing top 20 processes by memory usage
  • Image preview on submit: Thumbnail previews for uploaded images in the submission form

Fixed

  • HTML entities in submissions tab rendering as literal · text
  • SNES system image mismatch between API and frontend map

Improved

  • Category browse cards show real hardware images instead of emoji placeholders
  • Landing page browse cards use category/system images with ghost watermarks
  • System image map expanded from 32 to 90+ entries

[0.1.6] - 2026-03-20

Added

  • Emulators 3-tier browsing: Landing page with 3 browse options (By Category, By System, All Emulators)
  • Category browse view: Grid of 8 category cards (Home Console, Handheld, Computer, Arcade, Multi-system, Mobile, Calculator, Other) with AI-generated watermark images and emulator counts
  • System browse view: Grid of 60+ emulated system cards (NES, SNES, N64, PlayStation, etc.) with console images, search filter, and manufacturer-based colors
  • System filter API: New GET /emulators/systems endpoint returning distinct emulated systems with counts; system query param added to GET /emulators for JSONB array filtering
  • Category images: 8 generated images at /uploads/emulators/categories/
  • System images: 28 console/system images at /uploads/emulators/systems/
  • All emulator views use URL search params (?view=category&category=Home+Console) for proper back/forward/bookmark support
  • Breadcrumb navigation across all emulator views
  • Shared emulator constants/types extracted to emulatorConstants.ts

Fixed

  • Analytics page views always 0 (sequence permissions + empty IP inet cast)
  • Dark mode email body unreadable (hardcoded bg-white)
  • just migrate now auto-grants sequence permissions

[0.1.5] - 2026-03-20

Fixed

  • Postmark inbound emails broken: deploy.sh was not passing POSTMARK_TOKEN, POSTMARK_WEBHOOK_SECRET, MAIL_API_KEY, SUBSCRIBE_API_KEY, or ALERT_EMAIL env vars to the API process — webhook auth always failed and sync was silently disabled
  • Added missing Postmark env vars to .env.production and .env.example
  • Analytics page views always 0: page_views INSERT failed silently because www-data user lacked USAGE permission on page_views_id_seq; also fixed empty IP causing ::inet cast error
  • Dark mode email body unreadable: HTML email preview used hardcoded bg-white, now uses theme-aware bg-secondary with proper text color
  • just migrate now auto-grants table and sequence permissions to www-data

Added

  • Inbound email attachments saved to disk: Webhook decodes base64 attachment content and saves to /srv/uploads/mail/{id}/, downloadable via nginx
  • Attachment display in admin mail inbox: Inbound emails with attachments show paperclip icon in list; expanded view has clickable download links
  • Postmark sync fetches attachment metadata: Background sync calls Postmark message details API to capture attachment info for each new inbound message
  • Admin panel URL routing: Active tab is now reflected in the URL as ?tab=mail, ?tab=news, etc. — browser back/forward buttons work correctly, pages are bookmarkable and shareable

Removed

  • Admin mail tab 30-second auto-refresh: Removed wasteful polling interval; manual Refresh button remains

[0.1.4] - 2026-03-18

Added

  • News system: Full CRUD for news articles with TipTap rich text editor, inline image drag-drop with live WebP conversion, splash images, publish/unpublish workflow
  • News banner on homepage: Most recent published news article displayed as a prominent banner at the top of the home page
  • News public pages: Browse all news at /news with search, individual article pages at /news/:slug
  • Review submission funnel: Comprehensive public form at /submit for indie devs to submit games for review — includes multi-file upload (screenshots, trailers, press kits) with 50MB cap, 10 file max
  • Submissions admin inbox: Unified admin tab showing all submissions (form + email) with expandable detail cards, media preview, notes, status filters (pending/reviewing/accepted/declined/completed)
  • GWUK system user: handle=GWUK, [email protected] — system/AI robot user with admin role for automated and editorial news posts
  • News full-text search with weighted tsvector (title A, synopsis B, content C)
  • ReviewEditor component now accepts uploadEndpoint prop for reuse across news and reviews
  • Navigation updated with "News" in Content dropdown and "Submit Game" link
  • Permissions: news.create, news.edit.any, news.delete.any, news.publish, submissions.view, submissions.manage
  • Migration 018: news_articles table, review_submissions table, permissions, GWUK user
  • Upload directories: news/, news/inline/, submissions/

Changed

  • ReviewRequestModal now redirects to /submit page instead of using mailto
  • Storage service extended to support video (mp4, webm) and PDF uploads for submissions

[0.1.3] - 2026-03-16

Added

  • Console system icons displayed throughout handhelds UI — filter pills, grade badges, and performance bar all use official console logos instead of text labels
  • 18 supplemental console hardware photos (Wikimedia Commons CC) stored in /uploads/handhelds/systems/supplemental/ — survive sheet re-syncs
  • Grade badges show console hardware image as subtle background with hover reveal
  • System icons auto-rotated from vertical spreadsheet orientation to horizontal and converted to WebP
  • Colored side tabs on handheld cards showing top emulation systems (blue=A, green=B, yellow=C)
  • 3D corner ribbons for Upcoming (purple), All A (gold), Budget (green), Premium (blue)
  • "Coming Soon" disclaimer in detail modal for upcoming/unreleased devices with expected release date
  • Performance rating parsed into clean badge (e.g. 🔥 4½/5 instead of raw emoji strings)
  • Accent-secondary color spread across hover effects, toggles, input focus, card shadows project-wide

Changed

  • Sync script now auto-rotates extracted system icons 90° and converts to WebP
  • System names only appear in hidden title/alt attributes for accessibility
  • Filter pill selection uses grayscale-to-color + checkmark instead of invert (fixes NES/GBA/Genesis readability)
  • Clear/Clear-all filter buttons are now compact X icons with badge counter
  • Max emulation box uses solid background instead of transparent accent tint

[0.1.2] - 2026-03-15

Fixed

  • Handhelds section showing 0 results: Google Sheets sync was using wrong tab gid (1→0), headers had multi-line names that didn't match column lookups
  • Avatar upload showing broken image: URL was pointing to api.gamingworld.uk but uploads are served from gamingworld.uk
  • Game cards not respecting admin sort order: frontend was grouping all hero/large/normal cards separately, now groups consecutive same-size cards to preserve sort_order
  • Handheld images broken: image URLs were using API domain instead of frontend domain
  • Price overflow causing horizontal scrollbar: prices now show first line only with full details in tooltip
  • Name overflow on long handheld names: dynamic font sizing based on name length

Added

  • 565 retro gaming handhelds syncing from Retro Handhelds community spreadsheet
  • 473 device images and 18 system console icons extracted from XLSX
  • 35 new handheld data columns: CPU/GPU details, screen specs, controls, audio, materials, performance data
  • Performance grades for 18 emulation systems (GB/GBC through PS3) with letter grades (A-F)
  • Performance-tier card borders: gold (S-tier), blue (A-tier), green (B-tier)
  • Ghost image watermark behind card content at 6% opacity
  • Corner ribbons: Upcoming (purple), All A (gold star), Budget ($), Premium (diamond)
  • Form factor emoji badges on each card
  • "Supports" multi-select filter: filter by system emulation capability
  • Enhanced performance heatmap bar with hover tooltips
  • Sync log capture for model and handheld sync services, displayed in admin Models tab
  • Weekly cron job for handheld image extraction from XLSX
  • Migration 015 (sync_log), Migration 016 (handhelds overhaul with 35 new columns)

[0.1.1] - 2026-03-13

Fixed

  • Review editing 404 error: SELECT * on reviews table included search_vector generated column, causing sqlx scan failure
  • TipTap duplicate extension warning: StarterKit v3 includes Link and Underline by default, now disabled in StarterKit config
  • Logo in navigation now links to home page
  • Empty reviews page now shows "Reviews coming soon!" instead of generic message

Added

  • Review unpublish support: admin can unpublish reviews from both editor and admin panel
  • Splash image removal button in review editor
  • Publish/unpublish toggle in admin reviews tab
  • Game cards "Import All" button always visible (not just when empty)
  • Hardcoded cards comparison view on Games page for verifying database card imports
  • Orphaned image cleanup script (scripts/cleanup-orphaned-images.sh)

Removed

  • Test review deleted from database

[0.1.0] - 2026-03-12

Added

  • Full game reviews system with TipTap rich text editor
  • Award templates with CSS-rendered shapes and AI image generation (ImageRouter)
  • AI sentiment analysis via OpenRouter + Steam/Itch.io scraping
  • Encrypted API key management (AES-256-GCM) with admin GUI
  • File upload infrastructure with nginx static serving (/srv/uploads/)
  • Review editor with drag & drop images, genre tags (max 3), rating slider, splash images
  • Public review pages with full-text search, genre filters, 3D card hover effects
  • Homepage "Latest Reviews" carousel
  • Award system with templates, AI-generated images, review attachment
  • Sentiment analysis with circular gauge visualization
  • 4 new admin tabs: API Keys, Award Templates, Awards, Reviews
  • Reviews CRUD, publish, search, genres, sentiment analysis API endpoints
  • Awards & templates CRUD, AI image generation API endpoints
  • Encrypted API key management with test endpoints
  • File upload endpoints with rate limiting
  • 4 database migrations (006-009): api_keys, award_templates, awards, reviews/genres
  • 10 new backend services, 5 handlers, 4 repositories, 4 models
  • Nginx configured to serve uploads with 30-day cache headers

[0.0.2] - 2025-09-23

Changed

  • 86% LOC reduction in main App.tsx through component extraction
  • Complete frontend refactoring with SOLID principles

Added

  • ESLint integration with TypeScript support
  • Glassy UI enhancements for light mode teaser images
  • Professional build pipeline with quality gates
  • Component-based architecture (7 focused components extracted)
  • Reusable UI components (Modal, Navigation, etc.)
  • Automated linting in build process

[0.0.1] - 2025-09-22

Added

  • React + TypeScript + Tailwind CSS SPA
  • WebAuthn/Passkey authentication system with passphrase fallback
  • User account management (add/remove passkeys)
  • Theme system (dark/light mode with customizable accent colors)
  • Settings persistence
  • Home and About pages with content
  • Go API backend with Fiber framework and JWT tokens
  • PostgreSQL database integration
  • Responsive design and mobile navigation
  • Hetzner server deployment with SSL certificates (Let's Encrypt)
  • Nginx reverse proxy and production build process

Roadmap

[0.2.0] - Community & Polish (Target: Q2 2026)

  • Comments system on reviews
  • Image WebP conversion and EXIF stripping
  • Backend HTML sanitization (bluemonday)
  • Review image gallery and auto-save drafts

[1.0.0] - Production Ready (Target: Q2 2026)

  • Comprehensive testing
  • Performance optimization
  • API documentation and stability

Gallery

The full set.

Build something like this

Want a tool like this for your shop?

We've shipped this kind of thing before. Twenty-minute intro call, no slides.