DMN/Software

Webanwendungen vom Schema bis zum Server.

Leon, Full-Stack-Entwickler. Eigene Webanwendungen mit React, Node.js und TypeScript.

Offen für eine Festanstellung, remote oder hybrid in NRW.

Projekte ansehen Kontakt

Projekte

Fünf laufen live, vier davon ohne Registrierung.

Zeiterfassung

Arbeitszeit, Urlaub und Gleitzeit nach Arbeitszeitgesetz und Bundesurlaubsgesetz, dazu Projektzeit und Rechnungen nach § 14 UStG. Jede Zahl lässt sich aufklappen und zeigt, woraus sie besteht: welche Buchungen, welches Soll, aus welchem Vertrag.

  • NestJS
  • React
  • PostgreSQL mit Row Level Security
  • E-Rechnung

Quellen-Chat nach dem Vorbild von NotebookLM

Eigene Quellen hochladen, im Chat befragen und jede Aussage der Antwort bis zu der Textstelle zurückverfolgen, aus der sie stammt. Zitatnummern ohne passende Textstelle fallen weg, jede übrige führt zur Passage.

  • Next.js
  • NestJS
  • Postgres mit pgvector
  • hybride Suche

Statusdienst

Überwacht Websites und Server, zeigt die Verfügbarkeit öffentlich an und meldet Ausfall und Wiederkehr per Mail. Ein einzelner Aussetzer löst noch keinen Alarm aus, ein Ausfall beginnt erst nach mehreren Fehlschlägen in Folge.

  • Go
  • net/http
  • SQLite
  • Docker
Website
99,99 %
Bewerbungsportal
99,99 %
Bewerbungen-API
99,99 %
Quellen-Chat
100,00 %

Verfügbarkeit der letzten 30 Tage, Stand

Bewerbungsportal

Sucht weltweite Remote-Stellen, die von Deutschland aus antretbar sind, und verfolgt die eigenen Bewerbungen. Viele „Remote“-Anzeigen gelten nur für ein Land: Das Portal liest die Vorgabe aus jeder Anzeige und zeigt bei aussortierten Stellen den Satz, der sie ausschließt.

  • Next.js
  • Supabase
  • pgvector
  • pg-boss
  • Resend
  1. Bewertet3.389 Stellen
  2. Über der Punktschwelle370 Stellen
  3. Aus Deutschland antretbar175 Stellen

Stand

Minispiele

Zwölf Browserspiele mit Bestenliste. Der Server spielt jeden Lauf aus den Eingaben nach und rechnet die Punkte selbst, der Browser kann keine Punktzahl vorgeben.

  • Vite
  • React
  • TypeScript
  • Fastify
  • node:sqlite
  • Docker
  1. Browser schickt nur die Eingaben
  2. Server spielt den Lauf per Seed nach
  3. Server rechnet die Punkte selbst aus
  4. Bestenliste übernimmt das Ergebnis, mit Ratelimit pro gehashter IP

FRITZ!Box-Verlauf

Hält fest, wann welches Gerät im Heimnetz war, über Monate statt der paar hundert Zeilen, die die FRITZ!Box selbst behält. Ein Collector in Go liest die Box über TR-064 durch einen WireGuard-Tunnel, Postgres macht daraus Sitzungen je Gerät. Fehlen Daten, zeigt der Verlauf eine Lücke statt „offline“.

  • Go
  • TR-064
  • PostgreSQL
  • pgTAP
  • React
Details ansehen

Privat, nur im eigenen VPN erreichbar

So gebaut

Was sich durch die Projekte oben zieht.

  1. Der ganze Stack selbst gebaut

    Datenbankschema, API, Oberfläche und Deployment entstehen zusammen, nicht als getrennte Teile.

    Echter Code aus den Minispielen

    api/src/db.ts

    CREATE TABLE scores (  id          INTEGER PRIMARY KEY AUTOINCREMENT,  game        TEXT    NOT NULL,  name        TEXT    NOT NULL,  score       INTEGER NOT NULL,  duration_ms INTEGER NOT NULL,  created_at  INTEGER NOT NULL,  ip_hash     TEXT    NOT NULL);

    api/src/routes.ts

    app.post<…>(  '/score', …  async (req, reply) => {    const { token, log } = req.body    …    const game = session.game as GameId    const result = replay(SIMS[game],      session.seed, log)    const score = result.score

    web/src/shell/Leaderboard.tsx

    <div className="board">  <h3>Bestenliste</h3>  …    <ol>      {top.map((row) => (        <li key={`${row.rank}-${row.name}`} …>          <em>{row.name}</em>          <b>{row.score}</b>        </li>

    deploy/README.md

    cd $ZIELgit pullcd deploydocker compose up -d --builddocker compose ps…curl -s \  https://minigames.dmn-software.com/api/v1/health
    Code aus dem Quellen-Chat ansehen
  2. Betrieb auf eigenem Server

    Die Anwendungen laufen in Containern mit Docker hinter Caddy auf einem angemieteten Server, selbst eingerichtet und betreut.

    Browser FiveM Client iframe HTTPS HTTPS nur 80 und 443 80 leitet auf 443 Caddy einziger Eingang · TLS Reverse Proxy · HTTPS mit Let's Encrypt HTTP intern dmn-software.com internes Netz Caddy statische Dateien Website API HTTPS API nur über die Website erreichbar minigames.dmn-software.com internes Netz Web · React API · Fastify SQL SQLite · Volume notebook.dmn-software.com internes Netz Web · Next.js Supabase Gateway SQL PostgreSQL pgvector API · NestJS HTTPS API bewerbungen.dmn-software.com internes Netz Web · Next.js Supabase Gateway Kong Auth · REST Storage Worker · pg-boss SQL PostgreSQL pgvector HTTPS API status.dmn-software.com internes Netz Statusdienst · Go SQL SQLite · Volume zeit.dmn-software.com Live und Demo getrennt Web · React PDF-Worker API · NestJS SQL PostgreSQL Row Level Security Mail nur aus Live FRITZ!Box-Verlauf nur aus dem VPN Web · React PostgREST GoTrue Collector · Go SQL PostgreSQL Logik in SQL TR-064 · WireGuard Außen Resend · Mail Cloudflare Email Routing Postfach KI-Anbieter Gemini, Claude Jobbörsen und ATS FRITZ!Box über WireGuard Browser FiveM Client iframe HTTPS HTTPS nur 80 und 443 80 leitet auf 443 Caddy einziger Eingang · TLS Reverse Proxy · HTTPS mit Let's Encrypt HTTP intern dmn-software.com internes Netz Caddy · statische Dateien Website API HTTPS API nur über die Website erreichbar minigames.dmn-software.com internes Netz Web · React API · Fastify SQL SQLite Volume notebook.dmn-software.com internes Netz Web · Next.js PostgreSQL pgvector API · NestJS Supabase Gateway HTTPS API bewerbungen.dmn-software.com internes Netz Web · Next.js Supabase Gateway, Kong PostgreSQL pgvector Auth · REST Storage SQL Worker · pg-boss HTTPS API status.dmn-software.com internes Netz Statusdienst · Go SQL SQLite Volume zeit.dmn-software.com Live und Demo getrennt Web · React PDF-Worker API · NestJS SQL PostgreSQL RLS Mail nur aus Live FRITZ!Box-Verlauf nur aus dem VPN Web · React PostgREST GoTrue Collector · Go SQL PostgreSQL SQL-Logik TR-064 · WireGuard Außen Cloudflare Email Routing Resend · Mail Postfach KI-Anbieter Gemini, Claude Jobbörsen und ATS FRITZ!Box über WireGuard
    • Kontaktformular: Browser schickt das Formular per HTTPS. Caddy terminiert TLS und leitet an die Website API. Website API prüft Eingaben und Limits. Resend verschickt die Mail. Cloudflare Email Routing leitet sie an das Postfach weiter.
    • Minispiel-Score: Client schickt nur Eingaben. Server spielt den Lauf per Seed nach. Punkte landen in SQLite.
    • Frage an den Quellen-Chat: Frage an die NestJS API. Hybride Suche in Postgres mit pgvector. Gemini formuliert die Antwort mit Zitaten.
    • Tägliche Mail: Worker plant die Zusammenfassung. Treffer aus Postgres. Resend verschickt die Mail.
    • Rechnung ausstellen: Browser schickt den Auftrag zum Ausstellen per HTTPS. Caddy leitet an die API der Zeiterfassung. Postgres vergibt die nächste Nummer, gesperrt bis zum Commit. Ein Worker-Thread rendert das PDF.
    • FRITZ!Box-Abruf: Der Collector fragt im Takt die Box ab. Hostliste und Protokoll kommen per TR-064 durch den WireGuard-Tunnel. Neue Ereignisse landen in Postgres, doppelte Zeilen fallen weg.
    Caddy ist der einzige Eingang von außen. Jede Anwendung läuft als eigener Docker-Stack in einem eigenen internen Netz, nur Caddy ist mit allen verbunden. Die Zeiterfassung läuft zweimal getrennt, als Live und als Demo. Der FRITZ!Box-Verlauf ist von außen nicht erreichbar, sein Collector liest die Box über einen WireGuard-Tunnel. Unter „Außen“ stehen die Dienste außerhalb des Servers, die Punkte zeigen, ob eine Anwendung gerade erreichbar ist.
  3. Was zählt, rechnet der Server

    Bei den Minispielen schickt der Browser nur Eingaben. Die Punkte rechnet der Server selbst aus, deshalb lässt sich die Bestenliste nicht mit erfundenen Werten füttern.

  4. Nachvollziehbar statt Blackbox

    Im Quellen-Chat führt jede Aussage einer Antwort zur Textstelle in der Quelle zurück, statt einfach geglaubt werden zu müssen.

Für FiveM-Server

Ressourcen für FiveM

Systeme und Werkzeuge für Rollenspielserver in GTA V, etwa Bank, Rechnungen und Charakterauswahl. Die meisten laufen auf der versionierten Bibliothek dmn_base mit Datenbankmigrationen und Adaptern für ESX, QBCore und Qbox.

Discord-Bot

Eigenständiger Bot für den Discord-Server zu den Ressourcen. Vorlagen aus einer Datei und Entwürfe eines Sprachmodells laufen durch dieselbe Schemaprüfung, bevor er Rollen und Kanäle anlegt.

Details ansehen

Nicht öffentlich erreichbar

dmn_banking: Kontoübersicht mit Kontostand, Eingängen, Ausgängen und Verlaufsdiagramm
dmn_carsteal: Auftragszentrale mit Rang Klasse 2, Fortschritt zur nächsten Klasse, abgeschlossenen Aufträgen und Gesamtverdienst
dmn_base: Minispiel Keypad mit Ziffernblock

Oberflächen im Browser mit Beispieldaten

Technik

Frontend
  • React
  • Next.js
  • SvelteKit
  • Svelte
  • Vue.js
  • Nuxt
  • TypeScript
  • JavaScript
  • HTML5
  • CSS3
  • Tailwind CSS
  • Bootstrap
Backend
  • Node.js
  • NestJS
  • PHP
  • Laravel
  • Java
  • Spring Boot
  • Go
  • Lua
  • REST-APIs
  • Supabase Edge Functions
Datenbanken
  • PostgreSQL
  • MySQL
  • MariaDB
  • MongoDB
  • Supabase
  • pgvector
  • SQL
  • Row Level Security
Mobile
  • Capacitor
  • Apps für iOS und Android
  • App Store
  • Google Play Store
DevOps und Infrastruktur
  • Docker
  • Git
  • GitLab CI/CD
  • AWS (EC2, S3, RDS)
  • Linux
  • Proxmox
  • Caddy
  • Nginx
  • Deployment
KI und Suche
  • RAG
  • Embeddings
  • Vektorsuche
  • LLM-Integration
  • Claude Code
Qualität und Methoden
  • Unit Tests
  • automatisierte Tests
  • Code-Reviews
  • Clean Code
  • technische Dokumentation
  • Scrum
  • Jira
  • Confluence

Kontakt

Stellenangebote, Rückfragen zu einem Projekt oder zum Code: per Mail oder über das Formular.