A mobile top-down extraction shooter for Android and iOS, built in Unity 6 with URP.
Drop into a hostile zone with nothing. Crack open salvage crates while the heat climbs and the zone sends more at you. Reach an extraction pad and hold it to bank what you carry. Die, and you lose the run. The whole game is one question asked over and over: one more crate, or leave now?
Status: closed playtest, not a finished product. Ghost Relay is a real, playable game that has been through many instrumented playtest waves, but it is mid-development. Expect rough edges, in-flight experiments, and systems that exist mainly to answer a design question.
Beyond being a working Unity mobile game, two things here are unusual:
1. The full design history is public. DesignDocs/GhostRelay_Design_Log.md
is a build-measure-learn log where every gameplay change is a pre-registered experiment: a
hypothesis and a decision rule committed before the code, then a dated verdict measured against
the previous build's cohort. Ten experiments (EXP-001 to EXP-010) are recorded in order, including
the ones that failed and the ones that were killed before shipping. Most games never show this.
2. It was built with an AI agent driving the Unity Editor. The project is wired for
Loombridge, an MCP bridge that lets an agent open scenes,
place objects, enter play mode, drive input, and read runtime state back out. A large amount of the
level construction and verification in this repo happened through it. See LOOMBRIDGE.md.
| Beat | What it does |
|---|---|
| Deploy | Pick a zone from the map select, watch the deploy meter fill, land. |
| Loot | Hold on a salvage crate to open it. Higher tiers pay more and take longer. |
| Heat | A pressure curve that ramps with time and looting. More enemies, more often. |
| Extract | Reach a pad and hold it. The zone notices, and the exit gets loud. |
| Bank or bust | Extract and your salvage banks. Die and it is gone. |
Zones: a guided Tutorial, then Outskirts (clean introduction), Ruins, Meltdown, and Relay Zero (a boss zone built around the Weaver). Later zones add run variety: a marked opt-in elite ("HOT TARGET"), a roaming Warden, and a second, richer extraction pad that pays more to reach.
Verbs: twin-stick movement with auto-aim fire, a cooldown-burst flamethrower, and a lootable heal. Deliberately few. The design rule throughout has been to add decisions, not buttons.
- Unity 6000.5.3f1 (see
ProjectSettings/ProjectVersion.txt; install via Unity Hub) - Git LFS is required. All art, audio, and models are LFS objects.
- Android Build Support or iOS Build Support to deploy to a device
- Optional: Loombridge to drive the editor with an
AI agent. It is vendored as a local tarball in
Packages/tarballs/, so the project resolves without it installed globally, and it is editor-only (never in a player build).
git lfs install
git clone https://github.com/Loomtide/GhostRelay.git
cd GhostRelay
git lfs pullOpen the folder in Unity Hub with 6000.5.3f1. First import takes a while: it is a few thousand assets and shader variants.
If you see pink materials or missing meshes, git lfs pull did not complete. Files that are a
few hundred bytes of text starting with version https://git-lfs... are unfetched pointers.
Open Assets/_Project/Scenes/Splash.unity and press Play to get the real entry flow
(splash to home to map select to deploy). To iterate on a single zone, open that zone's scene
directly, for example Level_01_Ruins.unity.
The game is landscape-locked and designed for touch. In the editor, use the Game view at a phone aspect ratio; on-screen sticks and buttons respond to mouse input.
An Android dev build is one menu item: Ghost Relay → Build Android Dev APK. Related setup
lives under the same menu (Apply Android Build Settings, Apply App Icon).
Forking? Change applicationIdentifier in ProjectSettings/ProjectSettings.asset (currently
com.loomtide.ghostrelay) and the product/company name, or your build will collide with ours.
Assets/_Project/
Scripts/
Core/ GhostRelay.Core event channels, run state, combat, feedback, telemetry
Player/ GhostRelay.Player controller, camera, weapons, flamethrower
Enemies/ GhostRelay.Enemies chaser, shooter, elite/Warden, Weaver boss, rigs + death FX
Loot/ GhostRelay.Loot crates, tiers, hold-to-loot
Extraction/ GhostRelay.Extraction beacons, hold-to-extract, the loud exit
UI/ GhostRelay.UI HUD, map select, minimap, end screens
Bots/ GhostRelay.Bots scripted bot runs for perf and balance sweeps
Editor/ GhostRelay.Editor scene builders, installers, dev tools
Data/ ScriptableObject configs and event channels
Art/ Audio/ Prefabs/ Scenes/ Settings/ Resources/ Tests/
Two architectural rules run through all of it:
- Decouple via ScriptableObject event channels. Systems raise and listen on shared channel
assets (
OnLooted,OnPlayerDied,OnExtractStarted,OnHeatTick) instead of holding references to each other. - Data as assets. Every tuning dial is a serialized field on a
…ConfigScriptableObject, so balance changes are asset edits rather than code changes. This is what makes the experiment loop cheap enough to run weekly.
A third convention worth knowing: levels are built by editor scripts, not by hand. The
Ghost Relay/ menu is full of installers (Install Far Pad, Build Meltdown East Strip,
Install Warden, Build Tutorial Scene). Reproducible construction beats hand-placement when an
agent is doing the placing and when a feature has to land identically across five scenes.
Every run writes a JSON summary plus an optional event stream to PlaytestData/, which
tools/analysis/gate_metrics.py reads to produce the playtest gate numbers,
and viewer.html renders as heatmaps and funnels.
Nothing is uploaded anywhere by default. The committed TelemetryConfig.asset has a blank
endpoint, so a clone of this repo writes telemetry to local disk only and never phones home. The
optional upload path (a Cloudflare Worker plus R2, in tools/ingest/) requires you to stand up
your own endpoint and supply your own credentials through an untracked local file. See
TelemetryCredentials.cs.
If you want telemetry fully off, set enabled: 0 on Assets/_Project/Data/Config/TelemetryConfig.asset.
The code is MIT. The art and audio are not. You can freely read, fork, and build on the source under the MIT License. The models, textures, audio, and design documents are © 2026 Loomtide, all rights reserved: use them while working on this repository, but do not ship them in another product or publish a reskin. Full terms in ASSET-LICENSE.md, and bundled third-party components in THIRD-PARTY-NOTICES.md. The code is structured so swapping in your own art is practical if you want to build your own game on it.
See CONTRIBUTING.md. Short version: bug fixes, performance work, and platform compatibility are very welcome. Gameplay and balance changes are harder to accept, because they are governed by the experiment loop in the design log rather than by taste, so open an issue before building one.
DesignDocs/GhostRelay_Design_Log.md: every experiment, hypothesis, and verdictDesignDocs/GhostRelay_Human_Playtest_Gate_Plan.md: the pre-committed go/pivot/cut criteriaDesignDocs/GhostRelay_Performance_Plan.md: the mobile performance budget and how it is measuredDesignDocs/UI_StyleGuide.md: the salvagepunk visual languageLOOMBRIDGE.md: driving this project with an AI agent