# TT-014 — Go APK-Serve-Binary **Type:** Story **Priority:** High **Labels:** go, tooling, server **Depends on:** — **Blocks:** TT-016 (serve_apk Make-Target) --- ## Summary Implementiere einen portablen HTTP-Server in Go der eine APK per WLAN bereitstellt. Kein Python, kein Flask, keine externen Abhängigkeiten — nur Go Standard-Library. Das kompilierte Binary `scripts/serve/serve` wird von `make serve_apk` gestartet. ## Funktionsumfang | Feature | Detail | |---------|--------| | Landingpage `/` | HTML-Template mit App-Name, Version, Größe, Build-Datum, SHA256 | | Download `/download` | APK als Streaming-Response mit Content-Disposition | | SHA256-Endpoint `/sha256` | JSON: `{"sha256":"…","filename":"…"}` | | No-Cache-Header | `Cache-Control: no-store` auf allen Responses | | QR-Code im Terminal | `qrencode -t UTF8 ` via `os/exec` | | Lokale IP | UDP-Trick: Verbindung zu 8.8.8.8:80, eigene IP ablesen | | CLI-Flags | `--dir build/apk` (default), `--port 8888`, `--debug` | | Versioninfo | APK-Dateiname parsen: `timetrack-0.1.0+3.apk` → Version + Build-Nummer | | SHA256 Sidecar | `.sha256`-Datei neben APK lesen (Format: ` `) | ## HTML-Template - Design: modernes Card-Layout, dunkles Theme (Timetrack-Blau `#2563EB`) - Felder: Version, Größe MB, Build-Datum, Plattform - Verifizierungs-Sektion: SHA256 anzeigen + JS-Datei-Hash-Prüfung (Web Crypto API) - Installationshinweis für Android (Sicherheitseinstellungen) ## Go-Modul ``` scripts/serve/ go.mod (module timetrack/serve, go 1.21, keine externen deps) main.go (alles in einem File — überschaubar) ``` ## Acceptance Criteria - [ ] `go build -o serve ./scripts/serve/` kompiliert ohne Fehler - [ ] `./serve --dir build/apk --port 8888` startet Server - [ ] Landingpage zeigt korrekte Metadaten wenn APK vorhanden - [ ] `/download` liefert APK mit korrektem MIME-Type - [ ] QR-Code erscheint im Terminal (falls `qrencode` verfügbar) - [ ] Server startet auch wenn kein `qrencode` vorhanden (graceful fallback) - [ ] Klarer Fehler wenn kein `.apk` im `--dir` gefunden ## Files to create - `scripts/serve/go.mod` - `scripts/serve/main.go`