Baltic-first B2C/B2B2C marketplace (LT · LV · EE · EN): seller onboarding with KYC-lite/VIES validation, EU VAT OSS-aware checkout, parcel-locker shipping (DPD/Omniva), and AI-assisted catalog translation with strict PII guardrails.
Compliance targets: GDPR (incl. Art. 17 erasure, Art. 20 portability, RoPA), ISO 27001-aligned controls, SOC 2 Type II evidence readiness, PCI DSS SAQ-A (card data never touches our systems — Stripe is the only payment boundary).
Licensed AGPL-3.0 (see LICENSE). Network-use copyleft applies.
flowchart LR
FE[Next.js frontend<br/>lt/lv/et/en] -->|REST /api/v1| BE[Django + DRF]
BE --> PG[(PostGIS + pgcrypto<br/>+ pgvector)]
BE --> RD[(Redis)]
BE --> W[Celery workers<br/>queues: default email media ai compliance]
W --> MINIO[(MinIO/S3 media)]
PAY[payments_app] -->|only Stripe boundary| STRIPE[Stripe Connect + Tax]
TAX[tax_app] -->|via payments_app| STRIPE
SHIP[shipping_app] --> DPD[DPD]
SHIP --> OMNIVA[Omniva]
AI[ai_service_app] --> LLM[Local LLM pods → DeepL → commercial fallback]
CRM[bitrix24_integration_app] --> B24[Bitrix24 CRM]
COMP[compliance_app] -.erasure fan-out.-> BE
Design invariants (enforced in review, see docs/architecture/01-modular-breakdown.md):
payments_appis the only module importing the Stripe SDK.- Cross-app calls go through
services.py— never another app's models/views/tasks. - AI work runs only in Celery (
aiqueue), never in the request path. openapi.yamlandfrontend/src/generated/api.tsare CI artifacts — hand-edits fail CI (drift gate:npm run api:drift).- Fail-closed:
GDPR_PROCESSING_HALTED=1stops all mutating traffic (503).
cp .env.example .env # fill in values
make bootstrap && source scripts/activate.sh # venv + deps, then activate
make sysdeps # GDAL on the host (one-time, needs sudo)
make dev-up # full stack via docker-compose.dev.yml
make migrate && make seed
# Frontend: http://localhost:3000 · API schema: http://localhost:8010/api/schema/swagger/Full inventory, plus the authority map that names which document owns which topic:
docs/README.md. Every path in it is resolved against the working
tree by make check-docs, so the index cannot silently go stale.
- Contributors: CONTRIBUTING.md · QODER.md
- Reviewers and funders: docs/EXECUTIVE_SUMMARY.md · docs/GRANT_SUBMISSION.md
- Architecture and operations: docs/ARCHITECTURE.md · docs/DEPLOYMENT.md · docs/RUNBOOK.md
- Security: SECURITY.md (vulnerability disclosure) · docs/SECURITY_POSTURE.md (threat model and controls)
This section lists entry points only, on purpose: it previously carried a ten-row table
of documents that duplicated docs/, and two indexes drift — one of them always ends up
wrong, which is the mechanism recorded as QODER.md §8 G1 and G24.