Skip to main content
zerologszerologs
Back home
CycloneDX 1.6

Service inventory

Everything this site is built from, and — the part that is hard to find elsewhere — what each third party actually receives. Generated from the real sources: the dependency files, and the Kubernetes manifests, which pin images by digest.

Zero Logs Reader 3.35.0 · 7 services · 79 components · names only

Third parties

None of these run on our hardware. Each row says what it receives, not what it could receive.

CloudflareCloudflare, Inc.Access

Public edge: TLS towards the visitor, WAF, rate limiting, and the tunnel through which traffic reaches the origin.

Sees every HTTP request, so IP address and user agent. It terminates the visitor's TLS: request contents pass through it in the clear.

receives personal databoth ways technical data
OVHcloud Object StorageOVH SASData

S3-compatible storage for uploaded log files, photographs and exports.

Holds the binary files exactly as the rider uploads them, VIN included. Region eu-west-par.

both ways personal dataauthenticated
DeepSeek APIDeepSeekApplication

Language model behind log analysis and the assistant.

Receives log excerpts and the rider's own notes. It never receives the `provider` field of a maintenance record, which is where a workshop address gets pasted.

sends personal dataauthenticated
ResendResend, Inc.Application

Transactional and newsletter email delivery.

Receives the email address and the message body.

sends personal dataauthenticated
Scaleway Object StorageScaleway SASPlatform

Off-site backup: a restic repository in it-mil, plus a monthly encrypted archive in nl-ams under Object Lock.

Receives the whole database and the stored objects, encrypted. The monthly archive is encrypted with age: without that private key it cannot be read even by someone holding the bucket credentials.

sends personal dataauthenticated
Grafana CloudGrafana LabsPlatform

Destination for operational logs and metrics.

Receives only what the collector lets through — 500s, warnings, slow requests, task lifecycle — after a redaction pass that masks IP addresses and tokens in URLs.

sends technical dataauthenticated
GitLab Container RegistryGitLab Inc.Platform

Distribution of the container images.

Sees no user data. It is listed because it is the supply chain the system takes its running code from.

receives technical dataauthenticated

Container images

The three images this runs as. They are pinned by digest in the deployment manifests, so what runs is always exactly identified — that digest just is not published here, for the reason below.

backend
embed
frontend

Python · 34

backend, workers, parser

fastapi
uvicorn[standard]
python-multipart
sqlalchemy[asyncio]
asyncpg
psycopg2-binary
alembic
greenlet
redis
celery
minio
PyJWT
passlib[bcrypt]
bcrypt
pydantic
pydantic-settings
email-validator
langfuse
wrapt
openai
python-dateutil
aiofiles
slowapi
python-json-logger
reportlab
matplotlib
Pillow
pytest
pytest-asyncio
pytest-cov
fitparse
pgvector
numpy
prometheus-client

npm · 42

frontend runtime only — build tooling is not shipped

@maplibre/maplibre-gl-leaflet
@radix-ui/react-accordion
@radix-ui/react-alert-dialog
@radix-ui/react-avatar
@radix-ui/react-checkbox
@radix-ui/react-collapsible
@radix-ui/react-dialog
@radix-ui/react-dropdown-menu
@radix-ui/react-icons
@radix-ui/react-label
@radix-ui/react-popover
@radix-ui/react-progress
@radix-ui/react-scroll-area
@radix-ui/react-select
@radix-ui/react-separator
@radix-ui/react-slot
@radix-ui/react-tabs
@radix-ui/react-toast
@radix-ui/react-tooltip
@tanstack/react-query
@tanstack/react-virtual
@types/leaflet
class-variance-authority
clsx
date-fns
framer-motion
leaflet
lucide-react
maplibre-gl
next
next-themes
react
react-dom
react-dropzone
react-google-recaptcha-v3
react-markdown
recharts
remark-breaks
remark-gfm
tailwind-merge
tailwindcss-animate
zustand

Why there are no version numbers. This is an inventory, not a bill of materials. Exact versions are what an SBOM exists to provide — so that components can be matched against vulnerability feeds — and publishing them to anonymous readers runs that machinery in reverse: it turns targeted reconnaissance into bulk scanning, and most of it is not otherwise discoverable from outside. A published version list is also a promise that it is current, and a stale one is worse than none.

This inventory is generated by backend/scripts/gen_sbom.py and a check in CI fails when it drifts from the sources — an inventory nobody regenerates is worse than none, because its readers believe it.

Download the CycloneDX document