Ana içeriğe geç

Borrowd — Engineering a Community Platform from Scratch

Hi, I'm Dominik. I designed, built, and operate Borrowd — a production-grade platform that lets neighbors share tools, equipment, and household items through map-based discovery and structured borrowing workflows.

This documentation is a technical deep-dive into how I built it. Not the "what," but the "why and how" — the architectural decisions, the trade-offs I weighed, and the engineering principles that hold the system together. Everything you see here runs in production on self-hosted infrastructure I operate myself.


What This Project Demonstrates​

Borrowd isn't a tutorial project or a weekend prototype. It's a vertically integrated system spanning:

  • A Full-Stack Kotlin application — one language from database queries through business logic to React UI components, with shared type-safe models across the entire stack.
  • A modular monolith backend — strict Gradle module boundaries enforcing domain-driven design, with explicit dependency injection and a role-based state machine governing the borrow lifecycle.
  • A map-centric geospatial frontend — MapLibre GL JS rendering self-hosted PMTiles vector maps, PostGIS-powered spatial queries, and client-side marker clustering.
  • Production-grade self-hosted infrastructure — a single-node k3s Kubernetes cluster with ArgoCD GitOps delivery, Traefik ingress, ForwardAuth zero-trust authentication, automated TLS, S3-compatible object storage, and a full Grafana observability stack (Prometheus, Alloy, Loki).
  • An AI pair-programming methodology — a persistent agent harness (Mnemo) with structured memory, journaling, and procedural skills that lets me ship at the pace of a small team.

System Architecture​


Reading Guide​

The documentation is organized around four areas, each exploring a different dimension of the system:

The Application​

The core of Borrowd — from engineering principles and the full-stack Kotlin frontend through modular backend architecture to the geospatial map stack. This section covers how I structure code, enforce domain boundaries, manage dependency injection without framework magic, and coordinate modules through explicit communication patterns. The borrow lifecycle state machine is a good example of how domain logic stays clean and auditable.

The Homepage​

The public landing site is a custom multilingual static site generator — Markdown content piped through a Node.js build into Nginx-served HTML, with ambient canvas particle animations and full GDPR-compliant legal content across six languages.

The Infrastructure​

Everything runs on a single-node k3s cluster managed through ArgoCD GitOps, with Traefik ingress and ForwardAuth for zero-trust edge security, Keycloak for centralized SSO across two realms, a full observability stack (Grafana, Prometheus, Alloy, Loki), and a fully self-hosted CI/CD pipeline with no third-party dependencies.

The Solo-Dev Methodology​

Building a system this broad alone requires a force multiplier. I work with an AI pair-programming workflow where architectural control stays with me while execution is shared with Mnemo, a persistent agent harness I co-created with structured memory and procedural skills.