Skip to content
Lukas Sabaliauskas

Web Design / App Design / Interactive & Motion

Asteroids Neon Oblivion Game

Fair by design.

Motion & interactive · Interactive & Motion · 2026

10 min read

Year
2026
Role
Solo – UX/UI design and engineering
Context
A solo-built, browser-playable reimagining of the 1979 arcade classic, developed as a complete product and UX exercise.
Outcome
Shipped as a live, local-first arcade game with progression, accessibility controls, mobile support and room for continued growth.
Asteroids Neon Oblivion Game – project cover image

At a glance

Mobile gameplay – neon ship among asteroids near a large yellow planet, with HUD and touch controls
Mobile gameplay with the HUD and touch controls.

Overview

Asteroids Neon Oblivion is a solo-built, browser-playable reimagining of the 1979 arcade classic – designed, engineered, tuned and shipped by one person, and treated not as a hobby artifact but as a full product exercise: hypothesis-driven research, documented UX decisions, an explicit tradeoff ledger, a persistence architecture, an accessibility system, and a procedural audio engine that synthesizes its entire soundtrack in the browser without a single audio file.

The architecture is a deliberate hybrid: HTML5 Canvas owns the game, and React owns everything else. The game loop – physics, collisions, rendering – runs on canvas; menus, HUD, settings, stats and overlays are React components layered above it. That split is the project's central engineering decision: canvas for frame-rate-critical game reality, React for the interface state machine around it.

Role

Solo – UX/UI design and engineering

Platform

Web – single-page React 18 + TypeScript application, HTML5 Canvas renderer with React UI overlays

Scope

  • Game design and engineering – React + TypeScript, Canvas rendering, deliberately tuned physics
  • Procedural audio – a Web Audio synthesis engine with no audio files in the bundle
  • Local-first persistence – save/resume, stats, achievements, prestige and run history without a backend
  • Accessibility system spanning every rendering layer – CSS, UI animations and canvas effects
  • Status – live, complete, and architected for continued feature growth

The problem

The project opens with an honest diagnosis of its own genre. Classic Asteroids is instantly understandable – but two things tend to break fast.

  • Readability collapses as chaos increases. As asteroids multiply and threats accumulate, the player stops being able to parse the screen – and deaths start feeling surprising rather than fair.
  • Motivation fades after repeated runs. The original had no long-term goals, no personalization, no reason to return tomorrow.

The stated mission: keep the original's instantly-readable arcade feel, while adding save/resume, settings, accessibility and account-free progression. In other words – modern game UX without modern game bloat.

Research: hypothesis-driven, not persona-driven

For a solo build there are no stakeholders and no user research budget – so the project substituted a method: four testable assumptions, iterated against in playtesting.

  • Readability breaks first – players need help tracking threats, boosts and danger states.
  • Retention needs two loops – short-term "feel good now" and long-term goals.
  • Agency reduces frustration – motion, FX, audio and control schemes must be adjustable.
  • Web-first needs low friction – fast load, no backend dependency, mobile support.

Every feature that shipped maps to one of these four hypotheses – which is what turns a feature list into an argument.

Engineering detailsTechnical deep-dive

Architecture: canvas owns the game, React owns the interface

The codebase is organized as a main game-loop component surrounded by focused supporting modules – every concern with a proper home.

  • Main game loop component – the frame-by-frame engine (delta-time loop; the ~5,000-line core, a documented tradeoff).
  • Types and settings modules – the typed model of every entity, state and preference.
  • Achievements and progression module – unlocks, prestige, timestamps.
  • Audio synthesis module – the procedural engine behind the entire soundtrack.
  • Utilities – drawing, physics, theme, particles, hazards: game logic decomposed by concern.
  • UI helpers, a reduced-motion hook and an easter-eggs module – the interface layer and its secrets.

An entity taxonomy with a rule for everything

Primary entities: the ship; asteroids (variants including armored); player and UFO bullets; large and small UFOs; particles and debris; homing missiles; gravity wells; extra lives; rescue pods; solar flares; ship wreckage. Support entities: background stars and nebula, score popups, shockwaves, streak announcements, trails. Every object in the game has a type, a module and a rule.

Game-state flow

A clean state machine: menu, then countdown, then playing – with pause, dying and level-up branches – and game-over returning to the menu. The menu itself exposes the product: new game, continue, daily challenge, settings, stats, prestige, how-to-play. Game-over is a screen that earns a visit – detailed stats, unlocks review, prestige option.

The audio engine: synthesized, not shipped

A fully procedural Web Audio synthesis engine – no audio files in the bundle. For a portfolio, this is the detail that proves the point: the entire soundscape is authored in code, weightless, and infinitely tunable.

  • Separate SFX and music busses – dual-bus routing.
  • Gesture-activated audio context – browsers require a user gesture before audio; the engine handles it gracefully.
  • Ambient layers that adapt with intensity – the music reacts to what's happening in the game.
  • Pitch randomization to reduce fatigue – the same event never sounds exactly the same twice.

Persistence and data architecture

Fully local-first via localStorage, with a defined schema: settings, high score, mid-run save, stats, achievements, prestige, run history, secrets. The rules show product thinking.

  • Save/resume with a 24-hour expiry – continue today, not forever.
  • Run history capped at the last 20 runs – localStorage is finite and the app respects it.
  • Export/import backups – the player owns their data and can move it.
  • A "Danger Zone" with double confirmation – destructive actions fenced properly.
  • Storage try/catch, migrations, audio resume and DPR resize handling – private-mode failures, schema evolution and device-pixel-ratio changes handled rather than hoped away.

And the data is shown back to the player: a stats panel with career stats, a radar chart and key-stats grid, a run-history area chart, and an achievement grid with filters and timestamps – data visualization applied to personal play history.

Performance and resilience

Frame-rate independence and failure states designed for, not discovered.

  • Delta-time game loop – fast screens and slow screens get the same game.
  • Memoization and density toggles – React re-renders controlled, particle load player-adjustable, an FPS option for weak devices.
  • DPR resize handling – crisp on retina, correct on resize.
  • Storage try/catch and settings migrations – failure states designed for, not discovered.

Game design: the loop and its depth

Core gameplay: thrust, rotate and fire in wrap-around space; asteroids split by size; circle collisions; invulnerability after death; shields that absorb damage; scoring with a combo multiplier – all on deliberately tuned physics constants. A designer's phrase that deserves underlining: the feel of a game is a set of numbers.

Difficulty as tuning, not hand-waving

Five difficulties – Cozy to Brutal – each changing lives, speed multipliers and boost-drop multipliers. Level pacing scales by formula: asteroid count grows as 3 + level, with speed scaling by level and difficulty. The challenge curve is math, so it's consistent.

Combat variety – the anti-monotony layer

  • 5 boosts – Shield, Rapid Fire, Triple-Shot, Slow-Mo, Homing missiles – pickups with lifetime and bobbing, stackable with HUD timers and expiry warnings.
  • UFO enemies, large and small, with movement patterns, AI shooting, unique scoring, distinct sound effects and rescue-pod drops.
  • Environmental hazards – telegraphed solar flare sweeps, gravity wells and black holes, comets, armored asteroids and persistent wreckage.

Combo and kill streaks

Combos build from rapid kills and decay on a timeout, multiplying score; kill streaks track consecutive fast kills and trigger announcements and sounds. Both feed achievements and the flow-feedback layer – a scoring system designed to feel like momentum.

Progression without a backend

  • 99 achievements across 5 categories with category titles, unlocked via end-of-run processing and mid-game checks, timestamps stored.
  • 23 ship designs – each a unique canvas-drawn silhouette, unlocked by achievement count, plus a secret ship and custom image upload.
  • 6 skins (cosmetic palettes for ship, glow and trails) and 14 themes, unlocked via achievement thresholds.
  • Prestige system, unlocked at level 15+: resets run state, keeps achievements, stats and settings; prestige levels increase perk slots, and perks – extra life, starting shield, faster fire, more drops, magnetism – unlock across prestige levels. The idle-game meta-progression, transplanted into an arcade.

UX decisions, stated as decision and how

The project documents its UX reasoning explicitly – decision, then implementation – the format that separates designed products from assembled features.

Readability under chaos

Keep the HUD minimal but information-rich – score, level, lives, boost timers, combo indicator – with optional radar/minimap and edge warnings to kill off-screen surprise deaths, and consistent urgency patterns: boost expiry blinks the same way every time.

Onboarding without killing momentum

Teach in layers, not a lecture – a multi-step How to Play overlay, dismissible contextual first-run tips, and tutorial completion persisted between sessions.

Agency via settings, with sane defaults

Four settings tabs – General, Effects, Themes, Cosmetics – exposing particle density, shake, trails, flash, CRT overlay, FPS, autofire and control scheme, plus a cheat input and settings migration. Players tune comfort, performance and difficulty; the defaults stay sane.

Accessibility done properly

Reduced motion is the project's signature accessibility decision – a 3-state system applied across every rendering layer, described in its own chapter below.

Mobile as first-class

Buttons or virtual joystick with multitouch, hold-to-focus for triple-shot, safe-area-aware HUD and responsive touch-target sizing. Mobile is not the desktop game shrunk.

Flow feedback loops

Every action gets responsive, rewarding feedback – combo and streak announcements, score popups, non-blocking achievement toasts, and cohesive audio-visual reinforcement.

Visual and interaction design

The identity is neon glassmorphism: frosted panels, glowing borders and theme-driven accent colors – the React layer reads as holographic glass floating over the canvas battlefield.

  • Typography with two lanes – Orbitron for sci-fi display text, Exo 2 for readable UI text. Character and legibility given separate jurisdictions.
  • The theme system as mood, not skin – 14 themes recolor ships, bullets, explosions, UI panels and background gradients together, with background interpolation by level and a special theme carrying extra UI styling.
  • Arcade polish as a product feature – CountUp game-over stats, prismatic level-clear moments, an optional CRT overlay with scanlines, neon cursor and ripple interactions, parallax nebula, and a daily challenge designed as a "shared run" via seeded randomness.
  • A real CSS and styling layer – Tailwind tokens, reusable glass panel and button styles, keyframes, theme-driven colors, responsive breakpoints and desktop-only enhancements. An interface system, not ad-hoc styling.

Interface showcase

Menus, HUD, settings, stats and progression – the React layer around the game, on desktop and mobile. Click any thumbnail to open the gallery view.

Playable experiment

Launch Asteroids

Open the browser-based game and play the experiment.

Play the game

Accessibility: the signature system

The most instructive decision in the project. Most "reduced motion" toggles in commercial software stop CSS transitions and call it done – leaving canvas effects, particles and shake untouched. Here, accessibility was designed across every rendering layer.

  • A 3-state toggle – Off, System, On – respecting the OS preference by default while allowing explicit control.
  • Applied across CSS, UI animations and canvas effects: particles, shockwaves, shake, flash, cursor trails, warp and confetti are all gated.
  • While preserving informational feedback – damage and repair vignettes survive, because they tell the player something.

That distinction – disable the decorative, keep the informational – is the transferable principle, valid far beyond games.

The honesty ledger: documented tradeoffs

The project publishes what it chose not to do, with reasoning – the clearest signal of engineering maturity.

  • No online leaderboards – local-first reduces friction; the cost (manipulable high scores) accepted for single-player.
  • Customization increases UI complexity – contained via tab structure and strong defaults.
  • A large core component (~5,000+ lines) – faster solo iteration chosen over maintainability; documented as a known issue and refactor target rather than hidden.
  • localStorage limits – mitigated by capped run history and export/import backups.

Results

A modern, fully local-first arcade Asteroids – live, complete, and architected for continued feature growth.

  • Readable at high intensity – HUD clarity plus optional threat-awareness tools; fair deaths by design.
  • Motivating across sessions – achievements, unlocks, prestige, and a daily challenge designed as a "shared run": everyone playing the same day faces the same game, without a backend.
  • Comfortable across devices – dual mobile control schemes, 3-state reduced motion, adjustable FX and audio.
  • Fully local-first – save/resume and persistence with zero backend dependency.

Lessons and reflections

  • Fairness is a designable property. "Deaths feel surprising, not fair" is the sharpest diagnosis in this portfolio – and telegraphed hazards, edge warnings and consistent urgency grammar are how it gets designed out. Every UX discipline that makes software humane makes games fairer.
  • Hypotheses beat personas for solo work. Four testable assumptions, validated by playtesting, gave the project the rigor of a team process at one person's scale.
  • Retention is an architecture, not a feature. Short loop, long loop, daily shared seed, prestige – the motivation system was designed as structure first, content second.
  • Accessibility means auditing every rendering layer. A reduced-motion system that governs canvas effects, not just CSS, is the single most transferable idea here – for any product with dynamic visual content.
  • Ship the honesty ledger. Documenting tradeoffs – the 5,000-line component, the leaderboards decision – demonstrates more judgment than any list of features can.
  • Two-lane architecture, one product. Canvas for the game, React for the interface – knowing which layer owns what is what kept a solo project of this scale coherent.

Credits

  • Product, UX/UI design and engineering: Lukas Sabaliauskas – Graphic & Multimedia Designer, Vilnius, Lithuania
Play the game (opens in a new tab)

Have a project like this in mind?

Tell me what you are building and I will come back with an honest take on scope, timing and cost.

Start a conversation