---
id: server-architecture/009
title: Android APK export & download link
epic: server-architecture
state: done
priority: 3
blocked_by: ["server-architecture/007"]
estimate: M
created: 2026-08-03
updated: 2026-08-04
claimed_by: null
claimed_at: null
delivers: [7]
review_artifact: null
---

## What to do

Package the unchanged Stage 3 client (`server-architecture/007`) as an installable Android APK, and host it with a download link from the deliverables page. This is an **export target, not new game code** — zero new gameplay or netcode is in scope here; if something about the client doesn't work correctly on Android, that's a bug to flag against Stage 3, not a feature to add in this task.

1. **Android export preset** in the Stage 3 Godot client project — same codebase, same `Entity`/`EntityNode` split, no gameplay changes.
2. **SDK/JDK/signing setup** needed for Godot's Android export (Android SDK, a JDK, a debug or release keystore — `lor.keystore` already exists at the workspace root per the top-level `CLAUDE.md` and may be reusable; confirm whether it's appropriate for this build or a separate key is warranted before reusing it, since it's currently described there as used for `lor-elementals` APKs).
3. **Build the APK** from the Stage 3 client, connecting to the same droplet-hosted world deliverable #6's web export connects to (same server, same protocol, same `ws://` constraint noted in task 007's step 8 — no TLS yet).
4. **Host the APK and link it** from this workspace's deliverables page (`site/`) as a tap-to-download link.
5. **Verification: two physical Android phones**, each with the APK installed, connected to the same live world, each seeing the other's player move — the concrete proof this task exists to deliver. Where a headless equivalent is feasible (e.g. confirming the exported build connects and moves correctly at the protocol level, independent of two real devices), add it as automated coverage alongside the human check, consistent with every other stage's "no listening port to click on" pattern — but the two-phone check itself is the actual bar, and Kris does it directly rather than an agent asserting it happened.
6. Handoff note: `land-of-lor/pocs/multiplayer-poc/handoff/task-009-android-export.md` — what was built, exact steps to reproduce the APK build, where it's hosted, and what Kris needs to check on the two phones.

## Definition of done

APK builds successfully from the unchanged Stage 3 client, is hosted with a working download link on the deliverables page, and installs on Android; the handoff note exists. Set `state: review`, not `done`. Per the `delivers: [7]` gate (see `epics/README.md`'s "Promised deliverables" section), this task cannot move to `done` until deliverable #7 is `delivered` with its live download link in place and the two-phone check has actually happened.

## Where the work lands

Android export/build config in `land-of-lor/pocs/multiplayer-poc/` (alongside the Stage 3 client); the hosted APK and its download link live in this workspace repo's `site/`.

## Docs to read first

`server-architecture/overview.md`'s "Runtime" section (single Godot codebase, client/server split). Task `007`'s handoff note and its step 8 (the web export this Android export is a sibling target to — same client, same connection constraints).

## Verified and closed (2026-08-04)

Kris confirmed it working the same day, using one Android phone (APK from deliverable #7's download button) plus the web client — cross-device multiplayer against the live commons world, which is the substance of the two-phone bar (two installed phones simply weren't both to hand; the install path and mutual visibility are both proven). Deliverable #7 is delivered; done.