ai-startup-skills
AI 제품을 만드는 스타트업을 위한 7단계 에이전트 스킬: 검증 → 비즈플랜 → 정책 → 로드쇼 → 고객 확보 → 가격 책정 → 등록
불법 주정차 신고: 사진 업로드 시 사진에서 장소·시간 자동 추출, 관할청에 바로 신고서 생성, 무료·몇 분 내 완료
Falschparker anzeigen: Fotos hochladen, Tatort und Zeit automatisch aus den Bildern, fertige Anzeige fürs zuständige Ordnungsamt – kostenlos und in wenigen Minuten. Gehweg, Radweg oder Feuerwehrzufahr
기타TypeScript · JavaScriptGitHub @Joshua2504온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Falschparker anzeigen: Fotos hochladen, Tatort und Zeit automatisch aus den Bildern, fertige Anzeige fürs zuständige Ordnungsamt – kostenlos und in wenigen Minuten. Gehweg, Radweg oder Feuerwehrzufahrt zugeparkt? Jetzt Ordnungswidrigkeit melden – in immer mehr Städten.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Web-Anwendung, mit der Bürger:innen Ordnungswidrigkeiten im ruhenden Verkehr (Falschparken, blockierte Rad-/Gehwege, Behindertenparkplätze usw.) rechtssicher beim zuständigen Ordnungsamt anzeigen können. Aus hochgeladenen Beweisfotos, GPS-/EXIF-Daten und einer Karten-Verortung entsteht eine vollständige Anzeige, die – je nach Stadt – über das Online-Portal der Stadt, als amtliches PDF-Formular oder als strukturierte E-Mail ans Ordnungsamt versendet wird.
Aktuell freigeschaltet: Frankfurt am Main, Wiesbaden, Hanau (alle Online-Portal ekom21), Mainz (civento-Formular RLP) und Hamburg (Online-Dienst im Serviceportal, IntelliForm) – jeweils live im Browser ausgefüllt, weil diese Städte keine Mail-Anzeigen mehr annehmen, ausdrücklich um den Online-Dienst bitten (Hamburg) bzw. das Portal der direkte Weg ist (Hanau) – sowie Bad Soden-Salmünster (E-Mail-Versand). Weitere Städte lassen sich über eine zentrale Registry ergänzen (siehe Neue Stadt freischalten).
/kamera ist der Start der installierbaren Web-App;
native Hüllen für Android/iOS unter mobile/ (docs/MOBILE-APPS.md)./versand
mit Versand-Takt.pdf-lib für Städte mit
pdfForm (derzeit keine aktiv: alle Formular-Städte laufen über ihr Portal)./sticker, Textvorlagen je Verstoß, Kontingent STICKER_MAX_SEITEN), verknüpfen einen
Code per Scanner oder Handy-Kamera mit der Anzeige; /S/<code> zeigt nur
die öffentlichen Angaben (services/stickers.ts, routes/sticker.ts)./statistik, /analyse (pseudonymisiert),
Übersichtskarte; Ratgeber-/Stadt-Landingpages für SEO.| Bereich | Verwendung |
|---|---|
| Laufzeit | Node.js + TypeScript, ausgeführt via tsx |
| Web-Framework | Fastify (Sessions, Rate-Limit, Helmet, Multipart) |
| Views | EJS, serverseitig gerendert |
| Frontend | Bootstrap 5, Leaflet (selbst gehostet, kein CDN) |
| Datenbank | MariaDB (mysql2) + SQL-Migrationen |
pdf-lib (AcroForm-Befüllung) | |
| Bilder | heic-convert, exifr, jpeg-js, pngjs (Pixelierung) |
nodemailer (Versand), imapflow + mailparser (Posteingang) | |
| Geodaten | Photon (Geocoding), basemap.de (Kacheln, via Proxy) |
| Kennzeichen | eigener ALPR-Dienst (YOLOv9 + fast-plate-ocr über ONNX, CPU-only) |
| Reverse-Proxy | Caddy (automatisches HTTPS via Let's Encrypt, nur Produktion) |
| Orchestrierung | Docker Compose |
src/db/schema.sqlVoraussetzung: Docker + Docker Compose.
Auf diesem Server ist /root/owia/owia-codebase die Entwicklungsbasis und
/root/owia/owia das Produktionsziel. Die folgenden Schritte beschreiben eine
neue Entwicklungsinstallation; vorhandene .env-Dateien nicht überschreiben.
Arbeitsregeln für Coding-Agenten (Claude Code, Codex): CLAUDE.md.
# 1. Konfiguration anlegen
cp .env.example .env
# In der .env für lokale Entwicklung mindestens setzen/prüfen:
# NODE_ENV=development
# [email protected] (sonst kann niemand Anzeigen freigeben)
# 2. Gemeinsames Proxy-Netz einmalig anlegen, falls noch nicht vorhanden
docker network inspect owia-proxy >/dev/null 2>&1 || docker network create owia-proxy
# 3. Stack starten
docker compose up -d --build
# 4. App öffnen
open http://localhost:3000
In der Entwicklung werden E-Mails nicht wirklich versendet, sondern landen in Mailpit: http://localhost:8025. Dort findet man auch den Magic-Link zum Anmelden.
COMPOSE_PROFILES=alpr und
ALPR_ENABLED=on in der .env, dann Stack neu starten.src/services/tiles.ts), ein
Import ist nicht nötig.curl -X POST http://localhost:3000/dev/inbound-mail \
-H 'Content-Type: message/rfc822' --data-binary @mail.eml
Lokal ohne Docker (nur die App, DB/Dienste müssen laufen):
npm install
npm run dev # tsx watch (Hot-Reload)
npm start # ohne Watch
Alle Einstellungen laufen über Umgebungsvariablen; .env.example ist die
maßgebliche, dokumentierte Referenz. Die wichtigsten Gruppen:
DB_HOST, DB_NAME, DB_USER, DB_PASSWORD, DB_ROOT_PASSWORDNODE_ENV, SESSION_SECRET, APP_URL, APP_BIND, TSX_WATCHCOMPOSE_PROFILES, APP_DOMAIN, ACME_EMAILPHOTON_URLALPR_URL, ALPR_ENABLED, ALPR_MIN_CONFIDENCEMAIL_DRIVER (mailpit | smtp), MAIL_HOST,
MAIL_PORT (587/STARTTLS oder 465/SMTPS), MAIL_USER, MAIL_PASS,
MAIL_FROM, MAIL_FROM_NAMEIMAP_HOST, IMAP_PORT, IMAP_USER,
IMAP_PASS, IMAP_POLL_SECONDS, REPLY_TRUSTED_DOMAINS, MAIL_AUTHSERV_IDADMIN_EMAILS (kommagetrennt; leer = niemand kann freigeben)⚠️ Produktion:
NODE_ENV=productionist Pflicht – sonst sind Dev-Endpoints offen und das Session-Cookie hat keinSecure-Flag. Die App verweigert den Start, wennSESSION_SECRETein Platzhalter ist oderAPP_URLnichthttps://ist.MAIL_DRIVERmuss exaktsmtplauten; außerdem müssenMAIL_HOSTundMAIL_FROMgesetzt sein. Sonst verweigert die Produktions-App den Start.
Die Go-Live-Checkliste, Pflichtwerte und der Smoke-Test stehen in DEPLOY.md.
resources/districts.csv
anhand der PLZ des Tatorts ermittelt.src/config/cities.ts. Ein erkannter Ort ohne Eintrag
dort wird als „noch nicht freigeschaltet" abgewiesen.portal (Frankfurt, Wiesbaden, Hanau, Mainz, Hamburg) werden über das Online-Formular der Stadt
versendet: der Container portal (docker/portal/, Playwright) füllt es aus,
der Admin sieht unter /versand live zu (ein Lauf gleichzeitig), greift bei
Bedarf per Klick ins Live-Bild ein und sendet ab; nächtlicher Selbsttest. Je Stadt
ein Adapter (src/services/portale.ts → portalFfm.ts, portalWi.ts,
portalMz.ts, portalHh.ts) und ein Formular-Profil im Dienst (docker/portal/ekom21.mjs,
mainz.mjs, Bausteine in lib.mjs; Hamburg ist kein civento, sondern IntelliForm
und fährt den Ablauf in hamburg.mjs selbst); Ablauf/Zustände: src/services/portalDispatch.ts.
Lücken im Frankfurter Formular (fehlende Tatbestände/Stufen):
docs/FRANKFURT-NOTIZEN.md.portal und mit pdfForm bekommen das amtliche Formular
als PDF-Anhang, Städte ohne beides eine strukturierte E-Mail mit
Beweisfotos (+ Tatort-Karte, sofern die mail-Regeln der Stadt in
cities.ts sie nicht ausschließen – z. B. Bad Soden-Salmünster: ohne Karte,
Anschrift im Mailtext).src/config/cities.ts ergänzen – Ortsname
exakt wie in districts.csv.resources/ ablegen und als
pdfForm referenzieren; AcroForm-Feldnamen mit
curl http://localhost:3000/debug/pdf-fields (nur Dev) auslesen und in
src/services/pdf.ts (fieldMap) eintragen.resources/boundaries/<id>.geojson ablegen (OSM-Verwaltungs-
grenze), damit die Karten den Umriss zeichnen.src/db/schema.sql und wird beim
ersten Start des DB-Containers eingespielt.migrations/ und werden beim App-Start vom Migrations-Runner
angewendet – keine inline-ALTERs.src/
server.ts Einstieg: Fastify-Setup, Sicherheits-Header, Hooks, Routen
config/ Städte-Registry, Verstoß-Katalog, Ratgeber/Stadtseiten, Admin
db/ Verbindung, Schema, Migrations-Runner, Session-Store
middleware/ Authentifizierung, View-Daten
routes/ HTTP-Routen (auth, reports/*, intake, admin, portal, …)
services/ Fachlogik (Jobs, Versand, Portale, ALPR, Bilder, Mail, …)
scripts/ Einmal-Skripte (Backfills, Aufräumen) – `npx tsx src/scripts/…`
views/ EJS-Templates
migrations/ Nummerierte SQL-Migrationen
resources/ districts.csv, Bußgeldkatalog, GeoJSON-Grenzen
public/ Statische Assets (CSS, buildloses JS, gevendorte Libs)
tests/ Regressionstests (node:test, laufen in compose.test.yml)
scripts/ Test- und Prüf-Skripte (test-integration.sh, check-syntax.cjs)
docker/ Dienste: node (App), alpr (Python), portal (Playwright), caddy
mobile/ Capacitor-Hülle für Android/iOS (eigenes package.json, nicht in Prod)
docs/ Betriebsdoku; abgeschlossene Pläne unter docs/archiv/
data/ Persistente Volumes (mysql, uploads, pdfs, photon) – nicht im Repo
Deploy läuft direkt auf dem Server: In der Dev-Arbeitskopie ./deploy.sh
ausführen — das überträgt den Stand ins Prod-Verzeichnis, baut/erstellt die
Container neu (den Portal-Dienst nicht während eines laufenden Versands) und
macht einen Health-Check.
data/ und .env in Prod bleiben unberührt. Der GitHub-Actions-Workflow
(.github/workflows/deploy.yml) ist nur noch
ein manueller Fallback (workflow_dispatch); gepusht wird trotzdem — als
Backup und Referenzstand.
Details, Pflichtwerte und der Smoke-Test nach jedem Deploy: DEPLOY.md.
Healthcheck für Monitoring: GET /health → {"ok":true}.
npm run check # TypeScript, Syntax (Browser-JS, Portal, EJS), Biome-Lint, Unit-Tests
npm test # Regressionstests mit eigener MariaDB und Mailpit (Docker nötig)
Die Testumgebung ist flüchtig, verwendet keine vorhandenen Daten oder .env und
hat keinen Internetzugang für Mailversand. Die CI unter
.github/workflows/check.yml führt dieselben Prüfungen aus.
Versandfehler und Wiederaufnahme: docs/VERSANDBETRIEB.md. Abgeschlossene Pläne und Protokolle: docs/archiv/.