📱⚡️

Vibe Coding
Hamburg

#14 — Full App in 90 Minuten

18. Mai 2026 · Locke, St. Pauli

Live-Build PWA Beginner-friendly Wir bauen DIE App

📋 Heute Abend

19:00Doors · Bier & Ankommen
19:30Willkommen + e.V.-Update
19:35KI-News der Woche
19:45Was wir bauen + der Plan
19:55🛠️ Live-Build: Vibe Coding Hamburg App — 5 Blöcke
21:25Deploy & Show: alle installieren die App aufs Handy
21:40+Open Coding · Open End

KI-News
KW 21 · Mitte Mai 2026

5 Sachen die diese Woche durch den Feed gerauscht sind →

🤖 Agentic Coding wird Standard

// Tooling

Die großen Labs liefern alle ihre Coding-Agents nach — autonome Mehr-Schritt-Sessions, die selbst Tests laufen lassen, Fehler fixen und PRs aufmachen. Claude Code, Codex, Gemini-CLI & Co. sind nicht mehr Autocomplete, sondern Pair-Partner.

Für uns heute: genau deshalb ist „Full App in 90 Min" kein Hype — sondern Montagabend.

🇪🇺 EU AI Act — die Uhr läuft

// Regulierung

Die Transparenz- und GPAI-Pflichten des AI Act greifen stufenweise. Wer KI in Produkte einbaut, muss zunehmend kennzeichnen, dokumentieren, Daten sauber halten.

Take: Datenschutz-by-Design ist kein Bonus mehr. Souveräne, nachvollziehbare Setups gewinnen — siehe unsere Satzung, §2.

🔓 Open-Weights holen auf

// Modelle

Offene Modelle (Mistral, Qwen, DeepSeek, Llama-Linie & Co.) sind beim Coding & Reasoning nah an den Closed-Frontier-Modellen — und laufen lokal auf einer guten GPU.

Für VCH: unser Bunker-Server fährt 18 Modelle selbst gehostet. Mitglieder kriegen API-Zugang — kein US-Cloud-Lock-in.

🧩 MCP ist überall

// Standards

Das Model Context Protocol ist von „nerdiges Anthropic-Ding" zum de-facto-Standard geworden, wie LLMs Tools & Daten anbinden. Editor, Terminal, Design-Tool — alles spricht MCP.

Rückblick: haben wir bei #13 gebaut. Heute nutzen wir's beiläufig mit.

📈 „Vibe Coding" im Mainstream

// Kultur

Der Begriff Vibe Coding ist endgültig angekommen — vom Insider-Witz zum Karriere-Skill. Die Diskussion verschiebt sich: nicht ob, sondern wie man es gut macht (Tests, Review, Architektur).

Unser Job: zeigen dass „schnell" und „solide" kein Widerspruch ist.

📱 Was wir heute bauen

Die Vibe Coding Hamburg App — eine echte, installierbare PWA fürs Handy.

📅 Events

Nächster Termin, RSVP „ich komme", Event-Liste.

🔑 Login

Magic-Link, kein Passwort. Mitglieds-Status.

💡 Ideen

Ideen-Board mit Voting — live, für alle Mitglieder.

Am Ende: aufs Handy installierbar, offline-fähig, deployed unter app.vibe-coding.hamburg.

⏱️ Warum 90 Minuten reichen

✅ Das Backend steht schon

Unsere PocketBase hat bereits alles: events, users (mit Magic-Link), ideas, idea_votes, event_attendances. API + Auth fertig.

🎯 Wir bauen nur das Frontend

Eine index.html. Kein Build-Step, kein npm-Install, kein Framework-Setup. Browser auf, los.

„Die halbe Miete jeder schnellen App: ein Backend das schon existiert. Heute ist das unsere — der Verein hat eins."

🧰 Der Stack — bewusst minimal

SchichtWomitWarum
BackendPocketBase (läuft schon)DB + Auth + REST in einem
Frontendindex.html + Alpine.jsReaktiv, 15 KB, kein Build
DatenPocketBase JS-SDKpb.collection('events').getList()
App-FeelingPWA: manifest.json + Service WorkerInstallierbar, offline, Icon
DeployStatisches HostingDatei hochladen, fertig

Alles ohne Toolchain. Genau das macht es 90-Minuten-tauglich.

🎮 Vibe-Coding-Spielregeln

1 · Kleine Schritte

Immer ein Feature. Nach jedem Block läuft die App. Nie 5 Sachen gleichzeitig.

2 · Immer lauffähig

Lieber ein hässlicher Knopf der tut, als ein schönes Konzept das nicht lädt.

3 · Gute Prompts

Kontext + Ziel + Constraints. „Bau X mit Y, halte Z ein" schlägt „mach mal".

Wenn die KI Mist baut: nicht 10× nachfragen — zurückrollen, Prompt schärfer fassen, nochmal.

🗺️ Architektur in einem Bild

  ┌─────────────────────────────┐
  │   index.html  (die App)     │   Alpine.js · PWA
  │   ─────────────────────     │
  │   #events   #login   #ideas │
  └──────────────┬──────────────┘
                 │  PocketBase JS-SDK  (fetch über HTTPS)
                 ▼
  ┌─────────────────────────────┐
  │  api.vibe-coding.hamburg    │   PocketBase (läuft bereits)
  │  events · users · ideas     │
  │  idea_votes · attendances   │
  └─────────────────────────────┘

Ein File spricht mit einer API. Mehr ist es nicht.

19:55 · 15 MIN

Block 1 — Skeleton

Ziel: HTML-Gerüst steht, App verbindet sich zu PocketBase, lädt & zeigt Events.

<!DOCTYPE html>
<html lang="de"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Vibe Coding Hamburg</title>
<script defer src="https://cdn.jsdelivr.net/npm/pocketbase@0.26.0/dist/pocketbase.umd.js"></script>
<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.14.1/dist/cdn.min.js"></script>
</head><body>
<div x-data="app()">
  <h1>Vibe Coding Hamburg</h1>
  <template x-for="e in events">
    <p x-text="e.date + ' — ' + e.title"></p>
  </template>
</div>
<script>
function app() {
  return {
    events: [],
    async init() {
      const pb = new PocketBase('https://api.vibe-coding.hamburg');
      const r = await pb.collection('events').getList(1, 20,
        { filter: 'published = true', sort: 'date' });
      this.events = r.items;
    }
  };
}
</script></body></html>
✅ Checkpoint 1: Datei im Browser geöffnet → Event-Liste erscheint.
20:10 · 20 MIN

Block 2 — Nächstes Event + RSVP

Wir heben das nächste Event raus und bauen einen „Ich komme"-Knopf.

  • Filter date >= heute, sortiert, limit 1
  • Datum schön formatieren (Tag · Monat)
  • RSVP schreibt in event_attendances
  • Loading- & Leer-Zustand nicht vergessen
PROMPT → In meiner Alpine-App: zeig das nächste kommende Event groß als Karte (Datum, Titel, Ort). Darunter ein Button "Ich komme". Beim Klick: erstelle einen Record in event_attendances (user, event, ticket_type:'rsvp'). Wenn nicht eingeloggt → Hinweis "erst Login". Zeig Lade- und Leer-Zustand.
✅ Checkpoint 2: Nächstes Event als Karte, „Ich komme" reagiert (auch wenn Login noch fehlt).
20:30 · 20 MIN

Block 3 — Login (Magic-Link)

PocketBase kann OTP / Magic-Link out of the box. Drei Calls:

// 1 · Code anfordern  -> Mail geht raus
const { otpId } = await pb.collection('users').requestOTP(email);

// 2 · Code eintauschen -> eingeloggt, Token im pb.authStore
await pb.collection('users').authWithOTP(otpId, code);

// 3 · Status lesen
pb.authStore.isValid          // eingeloggt?
pb.authStore.record           // { email, is_member, ... }

Token bleibt im LocalStorage — App-Reload = immer noch eingeloggt.

✅ Checkpoint 3: Email rein → Code aus Mail → eingeloggt. RSVP aus Block 2 funktioniert jetzt echt.
20:50 · 20 MIN

Block 4 — Ideen-Board mit Voting

Das Herzstück: Mitglieder posten Ideen, jede:r hat 1 Vote pro Idee.

  • ideas lesen, sortiert nach Votes
  • idea_votes = Paar (user, idea), unique
  • Vote-Zahl client-seitig zählen
  • Neue Idee posten (nur Mitglieder)
PROMPT → Baue eine Ideen-Liste: lade ideas + idea_votes, zeig pro Idee Titel + Vote-Count. Ein Herz-Button toggelt meinen Vote (create/delete in idea_votes, unique user+idea). Eingeloggte Mitglieder können unten eine neue Idee anlegen. Sortiere nach Votes.
✅ Checkpoint 4: Ideen sichtbar, Voten funktioniert, neue Idee landet live in der Liste.
21:10 · 15 MIN

Block 5 — PWA & Deploy

Aus „Webseite" wird „App": 3 kleine Dateien.

// manifest.json — macht's installierbar
{ "name": "Vibe Coding Hamburg", "short_name": "VCH",
  "start_url": "/", "display": "standalone",
  "background_color": "#0a0a0f", "theme_color": "#00f0ff",
  "icons": [{ "src": "/icon-512.png", "sizes": "512x512", "type": "image/png" }] }
// sw.js — Service Worker: simpler Offline-Cache
self.addEventListener('fetch', e =>
  e.respondWith(caches.match(e.request).then(c => c || fetch(e.request))));
  • <link rel="manifest" href="/manifest.json"> + SW registrieren
  • Hochladen → app.vibe-coding.hamburg
  • Handy: „Zum Startbildschirm hinzufügen" → eigenes Icon 🎉
✅ Checkpoint 5: App ist live, alle im Raum installieren sie aufs Handy.

🆘 Wenn's hakt — Notfall-Toolkit

Häufige Stolpersteine

  • CORS-Fehler → PocketBase erlaubt unsere Domains; lokal via localhost testen
  • Leere Liste → Console öffnen, filter-Syntax prüfen
  • Alpine reagiert nichtx-data am Wurzel-Element gesetzt?

Goldene Regeln

  • Nach jedem Block speichern / committen
  • Console offen lassen — Fehler dort zuerst
  • Fehlermeldung komplett in den Prompt kopieren
  • Stuck > 5 Min? Nachbar:in oder @bash fragen

📝 Prompt-Cheatsheet

Ein guter Feature-Prompt hat vier Teile:

KONTEXT "Ich hab eine index.html mit Alpine.js, PocketBase-SDK ist geladen, die App-Funktion heisst app()." ZIEL "Ich will eine Ideen-Liste mit Voting." DATEN "Collection ideas (title, body), idea_votes (user, idea)." CONSTRAINTS "Kein Framework, kein Build. Zeig Lade- + Leer-Zustand. Halte den Stil der bestehenden Datei ein."

Je präziser der Kontext, desto weniger Runden. Die KI rät nicht — sie braucht Fakten.

🎒 Was du heute mitnimmst

Eine echte App

Auf deinem Handy installiert — selbst gebaut.

Das Muster

Backend + 1 HTML + SDK. Funktioniert für 100 andere Ideen.

Die Prompts

Kontext-Ziel-Daten-Constraints. Ab jetzt schneller.

„Du brauchst keine 6 Monate Bootcamp um was Echtes zu bauen. Du brauchst einen Abend, ein Backend und gute Fragen."

📅 NÄCHSTES MAL

Vibe Coding #15

Mo, 25. Mai 2026 · 19:00 · Locke St. Pauli

Computer Use & Browser Agents — die KI klickt selbst.

Ideen fürs Programm? → App öffnen, Idee posten, voten lassen. 😉

📱✨🚀

Lass uns bauen.

Fragen? Stuck? Bock auf mehr?

vibe-coding.hamburg chat.vibe-coding.hamburg @bash für Bot-Hilfe