Technikverleih — Ausleihplattform

Technikverleih — Ausleihplattform

Inventar, Reservierungen, Rechnungen und Ausleihhistorie für Theatertechnik und Equipment

📅 2025 - heute🔄 aktiv in Entwicklung📄 proprietär

Screenshots

Technikverleih — Ausleihplattform Screenshot 1
Technikverleih — Ausleihplattform Screenshot 2

Über das Projekt

Der Landesverband der Freien Theater in Sachsen e.V. (LFTS) verleiht seinen Mitgliedern und weiteren Kulturakteur:innen Audio-, Video- und Präsentationstechnik. Dafür habe ich eine Ausleihplattform gebaut: öffentlicher Technikpool, Mitglieder-Login, Reservierungen, Ausleihverwaltung, Rechnungen und ein Admin-Backend für die Geschäftsstelle.

Der LFTS wollte seinen Mitgliedern und der freien Kulturszene in Sachsen einen einfachen, transparenten Zugang zu Technik ermöglichen. Die Anschaffung des Equipments wurde im Rahmen des Förderprogramms »KulturErhalt — Investieren in die Kultur« des Sächsischen Staatsministeriums für Wissenschaft, Kultur und Tourismus gefördert. Technisch ist das Projekt ein Turborepo-Monorepo mit drei Anwendungen. Das öffentliche Website-Frontend (Vite + React 19, i18next, OIDC via Keycloak) zeigt das Inventar, nimmt Reservierungen an und listet eigene Ausleihen. Das Backend (ElysiaJS + Bun, Prisma ORM + PostgreSQL) stellt eine REST-API mit OpenAPI-Spezifikation und Eden Treaty für typsichere Clients bereit. Im Admin-Interface (Next.js) verwaltet die Geschäftsstelle Gegenstände, Ausleihen und Nutzer und erzeugt Rechnungen und Leihverträge. Das Datenmodell läuft über das Graviola-Framework: `@graviola/json-schema2prisma` übersetzt die JSON-Schema-Definitionen in Prisma-Schemas, `@graviola/prisma-db-impl` liefert die generische Datenbankschicht. Rechnungen und Leihverträge werden mit Typst und Pug als PDF erzeugt. Die Authentifizierung läuft über einen selbst gehosteten Keycloak mit eigenem LFTS-Theme.

Kernfunktionen

Öffentlicher Technikpool mit Suche und Filterung

Alle Geräte mit Kategorien (Audio-, Video-, Präsentationstechnik, Elektrozubehör), Verfügbarkeit, Mengen und Detailansicht.

Reservierungs- und Ausleihsystem

Mitglieder reservieren Geräte, sehen ihre Ausleihen und verwalten Rückgaben. Feiertage und Schließzeiten werden berücksichtigt.

Rechnungen und Leihverträge

PDF-Erzeugung mit Typst (Rechnungen) und Pug-Templates (Leihverträge). Die Preisberechnung liegt in einem eigenen `price-utils`-Paket.

Admin-Backend für die Geschäftsstelle

Inventar, Ausleihen, Nutzer, Reservierungen und Statistiken in einem Next.js-Admin-Interface.

Keycloak mit eigenem Theme

OIDC-Login über einen selbst gehosteten Keycloak mit LFTS-Theme (FreeMarker + CSS). Rollenbasierte Zugriffsrechte.

E-Mail-Benachrichtigungen

Mails bei Reservierungsbestätigung, Ausleihbeginn und Rückgabefälligkeit via nodemailer.

JSON-Schema-getriebenes Datenmodell

Das `data-model`-Paket definiert alle Entitäten als JSON Schema. Graviola-Tools erzeugen daraus Prisma-Schema und Datenbankschicht.

Mehrsprachigkeit

i18next im Website-Frontend mit Deutsch und Englisch. Übersetzungen werden per CLI verwaltet und typsicher generiert.

Technologien

frontend

ViteReact 19TypeScripti18next (Mehrsprachigkeit)TanStack Query (Server-State)OIDC Client TS (Keycloak-Auth)Framer MotionReact Router

backend

BunElysiaJSEden Treaty (typsichere API-Clients)OpenAPI-SpezifikationJWT / josenodemailersharp (Bildverarbeitung)

datenbank

Prisma ORMPostgreSQL@graviola/json-schema2prisma@graviola/prisma-db-impl

admin

Next.jsReact

auth

Keycloak (Self-hosted)OIDC / OAuth 2.0

dokumente

Typst (Rechnungen als PDF)Pug (Leihvertrag-Templates)

infrastruktur

Turborepo (Monorepo-Build)Docker / Docker ComposePostgreSQLMailHog (Entwicklung)

Architektur

Turborepo-Monorepo mit drei Anwendungen und mehreren gemeinsamen Paketen. JSON Schema ist die einzige Quelle der Wahrheit für alle Entitätsdefinitionen.

apps

  • • apps/website — öffentliche Ausleihplattform (Vite + React 19 + OIDC)
  • • apps/backend — REST-API (ElysiaJS + Bun + Prisma + PostgreSQL)
  • • apps/admin — Geschäftsstellen-Backend (Next.js)

packages

  • • packages/data-model — JSON-Schema-Definitionen aller Entitäten
  • • packages/price-utils — Preisberechnungslogik mit Tests
  • • packages/holidays — Feiertagskalender Sachsen
  • • packages/keycloak-lvfts-theme — eigenes Login-Theme

Was wir dabei gelernt haben

  • –Erst im Produktivbetrieb sind in den Graviola-Paketen für Prisma Lücken aufgefallen, die in Beispielanwendungen nie sichtbar geworden wären. Einiges davon ist direkt ins Framework zurückgeflossen.
  • –Der aufwändigste Teil war nicht die Technik, sondern die Regeln: Preisstaffeln, Feiertage, Schließzeiten, Ausnahmen. Diese Logik in eigene, getestete Pakete zu ziehen hat sich gelohnt.
  • –Für die Geschäftsstelle wurde das System mit den serverseitig erzeugten Rechnungen und Leihverträgen nützlich, nicht mit der Oberfläche.
  • –Typsichere API-Clients sparen viel Abstimmung zwischen Frontend und Backend. Dafür muss das Typmodell im Backend stimmen – Ungenauigkeiten dort tauchen an vielen Stellen gleichzeitig auf.
  • –Keycloak selbst zu betreiben ist überschaubar. Das eigene Login-Theme kostet bei jedem Upgrade Zeit; dem Verband war ein vertrautes Erscheinungsbild für die Mitglieder das wert.
  • –Ein zentral als JSON Schema geführtes Datenmodell zahlt sich bei Änderungen aus. Fehler im Modell landen dafür bis in der Datenbank.
  • –Mehrsprachigkeit von Anfang an einzuplanen war günstiger, als sie nachzurüsten – auch wenn im Verband fast nur auf Deutsch gearbeitet wird.
  • –Eine kleine, gut erreichbare Nutzergruppe gibt direktes Feedback. Falsche Annahmen fallen dadurch schnell auf.

Anwendungsfälle

  • •Ausleihverwaltung für Kulturorganisationen mit eigenem Gerätepool
  • •Reservierungssystem für zeitlich begrenzte Ressourcen
  • •Digitale Rechnungsstellung und Leihvertragsmanagement
  • •Mitglieder-Self-Service-Portale mit Rollenverwaltung
  • •Inventarsysteme mit Nutzungshistorie und Zustandsdokumentation

Besonderheiten

Schema-First-Datenmodell

JSON Schema definiert alle Entitäten zentral; Graviola-Tools erzeugen daraus Prisma-Schema und Datenbankschicht. Modelländerungen passieren an einer Stelle statt an vier.

Graviola im Produktivbetrieb

Das Ausleihsystem ist ein Produktiveinsatz des Graviola-Frameworks. json-schema2prisma und prisma-db-impl werden hier unter realen Bedingungen benutzt und weiterentwickelt.

Dokumente aus dem System

Rechnungen (Typst) und Leihverträge (Pug) entstehen serverseitig als PDF – ohne händisch gepflegte Vorlagen und ohne externen Dienst.

Eigenes Keycloak-Theme

Das Login sieht aus wie der Verband, nicht wie Keycloak. Kleiner Eingriff, aber die Mitglieder wissen, wo sie sich anmelden.

Projektpartner

Landesverband der Freien Theater in Sachsen e.V. (LFTS)

Auftraggeber, Betreiber und erster Nutzer der Plattform

2025–heute

Förderung

Die Anschaffung des Equipments für den Technikpool wurde im Rahmen des Förderprogramms »KulturErhalt — Investieren in die Kultur« gefördert.

Fördermittelgeber im Rahmen des KulturErhalt-Programms.

Einsatz

  • •Live-Instanz unter technikverleih.freie-theater-sachsen.de