# Tapecast Pocket Recorder — Stufe 1 (Lokal-PWA)

Mobile-first Pocket-Recorder für Freestyle / Cyphern. Beat parallel, sofort teilen.
**Komplett lokal:** alle Aufnahmen leben im Browser (IndexedDB) — keine Cloud, kein Backend.

Design: TX-6 / TP-7-Symbiose mit Pioneer-Fadern, Dark Anodized Aluminium.

---

## Was drin ist (Stufe 1)

**Funktionalität:**
- Echter MediaRecorder (WebM/Opus, Fallback ogg/opus, mp4/aac auf Safari)
- Mikrofon-Permission-Flow mit ehrlichem Error-Handling
- 3 Beats laufen parallel via WebAudio (loop-perfekt)
  - MIDNIGHT TRAP · 140 BPM · Fm · 13.71 s
  - BOOM BAP · 92 BPM · Am · 20.87 s
  - LO-FI BOUNCE · 85 BPM · C · 22.59 s
- Echo-Cancellation an → Beat bleibt aus Vocal-Track raus (mit Kopfhörern sauber)
- Live VU-Meter (BEAT / VOC / MAST aus echten Peak-Werten)
- BEAT-Fader × MAST-Fader regelt Beat-Lautstärke
- **Lokale Speicherung:** Aufnahmen + Metadaten in IndexedDB des Browsers
- Library mit echtem Playback (Blob → Object-URL → `<audio>`)
- Native Web Share API (Android / iOS) — Aufnahme direkt in Signal/WhatsApp/Telegram
- Download Original (.webm / .m4a) + Download als MP3 (lamejs, 128 kbps, client-side)
- Echte Waveform aus PCM (120 Bars, resampled)
- PWA: Manifest, Service Worker (offline-fähig), Install-Prompt-Button

**Bewusst NICHT in Stufe 1 (für Stufe 2):**
- Live Pitch-Shift / Live Autotune (UI da, deaktiviert)
- Beat + Vocals zu einem Audio mischen (Mixdown)
- Audio-Trim (UI markiert nur, schneidet nicht wirklich)

---

## Self-Hosting — kein Server nötig

Das ist eine **reine statische SPA**. Du brauchst nur einen HTTPS-Webserver.
Kein Node, kein Backend, keine Datenbank.

### Build

```bash
npm ci
npm run build
# → fertige Files in ./dist/public/
```

### Auf den Server schieben

Inhalt von `dist/public/` in dein Webroot kopieren:

```bash
rsync -avz dist/public/ user@server:/var/www/tapecast/
```

### Nginx-Config (minimal)

```nginx
server {
    listen 443 ssl http2;
    server_name tapecast.example.de;
    root /var/www/tapecast;
    index index.html;

    # ...TLS-Setup...

    # SPA-Fallback: alle unbekannten Pfade auf index.html
    location / {
        try_files $uri $uri/ /index.html;
    }

    # Service Worker NIE cachen (sonst kriegt der User updates nicht)
    location = /sw.js {
        add_header Cache-Control "no-cache, no-store, must-revalidate";
        expires off;
    }

    # Manifest auch nicht aggressiv cachen
    location = /manifest.webmanifest {
        add_header Cache-Control "no-cache";
    }

    # Beats und Assets dürfen lange cachen
    location ~* \.(mp3|png|svg|ico|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}
```

**Wichtig:** ohne HTTPS geht weder Mikrofon noch PWA-Install. Localhost ist die Ausnahme für Tests.

### Apache / Caddy / GitHub Pages

Funktioniert genauso — alles statisch. Bei Caddy reicht:

```caddyfile
tapecast.example.de {
    root * /var/www/tapecast
    try_files {path} /index.html
    file_server
    encode zstd gzip
}
```

---

## Wo werden die Aufnahmen gespeichert?

Im Browser des Users, in IndexedDB unter dem Namen `tapecast`. Stores:
- `recordings`: Metadaten (id, title, duration, waveform, marker, …)
- `audio`: die rohen Audio-Blobs (key = recording id)
- `meta`: Settings + ID-Generator

**Backup für den User:** in der App auf Bibliothek → Aufnahme → Teilen → Download.
Es gibt keine Server-Datenbank zum Sichern.

**Quota:** Browser geben pro Origin meist mehrere GB her. Tapecast zeigt's nicht
explizit an, aber `navigator.storage.estimate()` ist verfügbar.

---

## Beats austauschen / ergänzen

Eigene Beats: `.mp3` in `client/public/beats/` legen, dann in
`client/src/lib/local-db.ts` ins `BEATS`-Array ergänzen
(slug, title, bpm, key, url, durationSec). Build neu, deploy neu.

Beats neu generieren (Python + ffmpeg nötig):

```bash
python3 scripts/generate_beats.py
```

---

## Stack

- **Frontend:** React 18 + Vite + Tailwind + wouter
- **Storage:** IndexedDB (vanilla, kein Wrapper)
- **Audio:** MediaRecorder + WebAudio API + @breezystack/lamejs (MP3)
- **PWA:** Manifest + Service Worker (vanilla, kein Workbox)

Das `server/`-Verzeichnis im Repo ist Legacy aus der Backend-Phase und wird
beim Build nicht mehr berührt — kann gelöscht werden, wenn du willst.

---

## Versionen

- **v1.1 · Stufe 1 lokal** — diese Version, lokal-only PWA, kein Backend
- v1.0 — vorherige Backend-Variante (Express + SQLite, jetzt obsolet)
- Stufe 2 (geplant): Live Pitch / Autotune / Mixdown / echter Trim
