Skip to content

2. Constraints

Constraints are non-negotiable. They define the boundaries of the architectural design space. Where a constraint is technically negotiable but operationally costly to change, it is documented here with the cost in plain terms.

2.1 Technical Constraints

ID Constraint Source Notes
TC-1 PHP 8.3 or later (backend) ADR 0001 Required by Laravel 11.
TC-2 Laravel 11 framework ADR 0001 Sets routing, middleware, ORM, queue, and authentication conventions.
TC-3 Node.js 20 LTS (frontend tooling) ADR 0001 Vite, Vue 3, build pipeline.
TC-4 Vue 3 + TypeScript + Pinia + Vue Router (SPA) ADR 0001 Frontend stack; no Inertia, no server-rendered pages in v0.1 (decision: a clean SPA API client is needed for future ML and customer-portal integrations).
TC-5 PostgreSQL 14 or later ADR 0001, SRS IR-005 jsonb required from v0.2 for inbound XRechnung XML storage. Tested on 14, 15, 16.
TC-6 Redis 7 or later ADR 0001, SRS IR-006 Used for cache, session storage, queue backend.
TC-7 S3-compatible object storage ADR 0001, SRS IR-007 MinIO in dev; AWS S3, Hetzner Object Storage, or Backblaze B2 in production.
TC-8 Python 3.12 + FastAPI (ML service, v0.3+) ADR 0001, SRS IR-008 Optional service introduced in v0.3; absent from v0.1 and v0.2 deployments.
TC-9 Docker Engine 24+ and Docker Compose v2+ (deployment) ADR 0001, SRS NFR-036 No Kubernetes requirement for v0.1.
TC-10 Browser support: Chrome, Firefox, Safari, Edge (latest two stable) SRS IR-004 No IE11 support, no legacy browser polyfills.
TC-11 Responsive design from 375px viewport SRS NFR-022 iPhone 13 mini and equivalent. No native mobile apps.
TC-12 All monetary amounts stored as integer cents SRS FR-026 Floating-point arithmetic causes BR-CO-17 validation failures.
TC-13 Multi-tenancy via single-database tenant_id discriminator ADR 0002 Documented and recorded in ADR 0002.
TC-14 All API endpoints prefixed /api/v1 SRS IR-010 Versioning via URL prefix; breaking changes require major-version bump and ≥6 month deprecation window.
TC-15 Production HTTPS only; HSTS header with max-age 31556952 SRS IR-011, SRS NFR-012 Caddy or equivalent at edge.

2.2 Organizational Constraints

ID Constraint Source Notes
OC-1 MIT license LICENSE All contributions are MIT-licensed. No CLA required.
OC-2 Solo maintainer at v0.1, building part-time (~2 hours per day) V&S §3.1 maintainer stakeholder profile Architecture must be tractable for one person. No microservice sprawl.
OC-3 Operational budget ~€15 per month (production demo) V&S §1.6 R-6 Reference deployment fits on Hetzner CX22 (€5/month) plus storage and DNS.
OC-4 No paid certifications or compliance audits in budget V&S §2.3 limitations Skontro is and will remain a reference implementation, not certified accounting software.
OC-5 All work in public on GitHub from the first commit Project methodology Includes commit messages, PR discussions, issues. Build-in-public discipline.

2.3 Conventions

ID Convention Source Notes
CV-1 Conventional Commits 1.0.0 SRS NFR-033 Enforced via commitlint + husky commit-msg hook.
CV-2 arc42 template for architecture documentation This document 12 sections, populated incrementally as the build progresses.
CV-3 MkDocs Material theme, search lang en, de mkdocs.yml Docs site at docs.skontro.dev.
CV-4 draw.io (.drawio.svg) for high-fidelity architecture diagrams This document Saved as .drawio.svg so the diagram is both editable in draw.io and rendered directly by browsers.
CV-5 Mermaid for sequence, state, and ER diagrams inside Markdown mkdocs.yml mermaid2 plugin Code blocks tagged ```mermaid render inline.
CV-6 RFC 2119 keywords (SHALL / SHOULD / MAY) in requirements documents SRS §1.2 Applied in SRS; this arc42 document uses descriptive voice.
CV-7 LaTeX (Tectonic) for formal PDFs (SRS, SDD, future formal docs) SRS preamble Source .tex and compiled .pdf both committed.
CV-8 Architecture Decision Records (Michael Nygard format) SRS NFR-034 Stored in docs/adr/, numbered sequentially.
CV-9 German UI default, English fallback SRS IR-003, NFR-020 Compliance-relevant terminology (Rechnung, USt-ID, etc.) always in German regardless of UI locale.

2.4 Constraint Impact Notes

A few constraints meaningfully shape decisions in later sections and are worth calling out:

TC-12 (cents, not floats) is the reason the data model uses BIGINT columns for amounts and the application code uses the Brick/Money library throughout. This decision propagates into the JSON API contract, the ZUGFeRD XML output, the database schema, and the test corpus. See SRS FR-026 and FR-031.

TC-13 (single-DB multi-tenancy) is recorded as ADR 0002, alongside this milestone. The alternative — schema-per-tenant or database-per-tenant — was considered and rejected; reasoning is in the ADR.

OC-2 (solo, part-time) shapes Section 4 (Solution Strategy). The architecture deliberately avoids microservice sprawl. There is one backend (Laravel monolith), one frontend (Vue SPA), and from v0.3 one optional ML service (Python FastAPI). Three deployable units total — no more.