Survival LLM
A free AI assistant and survival library (1.5 million offline articles) that runs on your own computer, with no internet. Shows the source of every answer. Mac and Windows.
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
Translation pending
OtherTypeScript · JavaScriptGitHub @Joshua2504OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
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.
Translation pending
Taken from the repository README
Loading the full README.
Read the full 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/.