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.
- TypeScript
- React
- Vite
- Go
- PostgreSQL
- Python
- Tailwind CSS
- Apache
- systemd
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.ukfor 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/externalendpoint 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.titleand OG meta tag updates in NewsArticlePage for in-app navigation - source_project tracking: News articles record which external project posted them
Infrastructure
NEWS_API_KEYenvironment variable for external news API authentication- Migration 019:
source_projectcolumn onnews_articlestable - Nginx
mapdirective 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-imagesandsync-emulator-images
Fixed
- CORS blocking all requests via www: Added nginx redirect from
www.gamingworld.ukto apexgamingworld.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/systemsendpoint returning distinct emulated systems with counts;systemquery param added toGET /emulatorsfor 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 migratenow 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, orALERT_EMAILenv vars to the API process — webhook auth always failed and sync was silently disabled - Added missing Postmark env vars to
.env.productionand.env.example - Analytics page views always 0:
page_viewsINSERT failed silently becausewww-datauser lackedUSAGEpermission onpage_views_id_seq; also fixed empty IP causing::inetcast error - Dark mode email body unreadable: HTML email preview used hardcoded
bg-white, now uses theme-awarebg-secondarywith proper text color just migratenow auto-grants table and sequence permissions towww-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
/newswith search, individual article pages at/news/:slug - Review submission funnel: Comprehensive public form at
/submitfor 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
uploadEndpointprop 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_articlestable,review_submissionstable, permissions, GWUK user - Upload directories:
news/,news/inline/,submissions/
Changed
- ReviewRequestModal now redirects to
/submitpage 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½/5instead 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 includedsearch_vectorgenerated 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
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.