Skip to content

Contributing

Contributions are welcome — code, hardware experience, or documentation. To get started, grab an issue on GitHub or drop by the weekly Discord meetup (Tuesdays, 7:30 PM CET).

DirectoryContents
locker-backend/Laravel API + Filament admin (event sourcing)
mobile-app/React Native app (Expo, TypeScript)
locker-client/IoT client for the Raspberry Pi
hardware/KiCad designs
website/This website including documentation (Astro + Starlight)
docs/Internal docs and architecture decision records (ADRs)
ComponentCommand
Backendcomposer quality (format + PHPStan + tests)
Mobile apppnpm check and pnpm test:ci
Locker clientpnpm check and pnpm test

The API contract is a real cross-component contract:

  1. The backend serves the OpenAPI specification live at /docs/api.json (Scramble, generated from the controllers).
  2. The mobile app generates its typed RTK Query client from it: pnpm generate:api (the backend must be running).

If you change an API response, you must regenerate the client — otherwise the types drift.

Architecture-significant changes (API contract, MQTT topics, Modbus, infrastructure, security) require an ADR under docs/adr/ — numbered, one decision per ADR; accepted ADRs are never rewritten but superseded by new ones.

This documentation lives in the monorepo under website/src/content/docs/ — German under dokumentation/, English under en/dokumentation/ (same filenames = paired pages). Add new pages as Markdown with frontmatter (title, description) and provide both languages. Local preview: pnpm dev in website/.