FifeRouter

Last updated 31 August 2026

Trust & security

What we store, who else touches it, how the system is built, and what we do not yet have. The last part is here because a security review that discovers it later is a worse conversation than one that starts with it.

What we hold, and what we deliberately do not

The single most important fact for a security review: we do not store prompts or model responses. Not as a retention policy — as a property of the schema.

Every request produces one decision record per model attempt. That record is a closed set of typed fields: the concept, classifier confidence and rung, which models were considered, which were eliminated and on what ground, which was chosen, token counts, computed cost, latency and outcome. There is no field that can hold content, and adding one is a schema change argued for in public in our product graph.

DataRetentionNotes
Account email, password hashLife of account + 30 daysArgon2id; not reversible
API keysLife of account + 30 daysHash + masked prefix only. The key itself is shown once and is not recoverable by us
Provider keys you supplyUntil you remove themEncrypted at rest, key held outside the database. Readable by the running service by necessity — see below
Decision records13 monthsRouting metadata only. No prompt or response content
Ledger & payment records7 yearsAccounting records; statutory
SessionsUntil expiry or sign-outServer-side row, revocable. Token stored hashed
Page counts26 monthsAggregate only — the table has no column for a person
Mailing listWhile subscribed; suppression list indefinitelyConsent timestamp retained as proof
Prompts & responsesNot storedPassed to the selected provider and not retained by us

Sub-processors

The complete list. Adding one is a change to this page and to the privacy policy.

ProviderPurposeDataLocation
Hetzner Online GmbHHostingAll application data at restGermany (EU)
Anthropic PBCModel inferencePrompt content for requests routed to a vendor modelUnited States
Stripe, Inc.PaymentsPayment details, entered on Stripe's own pagesUnited States / Ireland
Postmark (ActiveCampaign)Transactional emailEmail address, message content of the mail itselfUnited States
GitHub, Inc.Source, CI, container registryNo customer dataUnited States

Model providers are the only sub-processors that ever see prompt content, and which providers may receive which traffic is a routing constraint rather than a policy statement — see below.

Residency is enforced, not promised

Most data residency is handled by procurement: choose vendors whose terms say the right things, and audit annually. Nothing in the running software knows about it.

Here, residency is a property of each model and a gate the router runs before any preference is considered. A request marked critical is routed only to models whose weights run inside our infrastructure, and if none is available it is refused rather than downgraded to a vendor model.

To be exact about what that means today: it is opt-in per request, and no in-infrastructure backend is currently running — so a critical request is refused rather than served. That is the mechanism working, not a gap in it, and it is the honest state of things rather than a claim we would rather make. No concept pins residency by default; a caller who needs the boundary asks for it and gets either it or a straight refusal. You can see the decision for any request without it being served:

curl -X POST https://api.fiferouter.com/v1/explain \
  -H 'content-type: application/json' \
  -d '{"text":"can this retry double-charge the customer?","critical":true}'

The response names which models were eliminated and why. That endpoint is public, costs nothing, and is the same code path that serves real requests up to the point a provider would be called.

All of it is public

Everything on this page describes code you can read. The router, the control plane that holds accounts and money, the deployment manifests and the CI that gates them are at github.com/Tech-Res-Group/fiferouter, under the GNU AGPL v3. A commercial licence exists for anyone who cannot take those terms.

The control plane is published deliberately, and it is the half that matters here. Claims about residency and about what is not logged live in the code that holds the credentials and the ledger — so publishing only the router would have published the half nobody needed to audit.

Claim on this pageWhere to check it
No field can hold prompt or response contentsrc/fiferouter/decisionlog.py — the record is a frozen dataclass, and tests/router/test_decision_log.py asserts the field list
Residency gates before any preferencesrc/fiferouter/select/selector.py — ranking is handed the survivor set, never the pool
API keys are not recoverablesite/api/keys.py — only a hash and a masked prefix are stored
Secrets never live in the repository.github/workflows/security-gate.yml — a blocking scan on every merge
Every decision is logged, fallbacks includedsrc/fiferouter/router.py — one record per model attempt, on every exit path

The running service makes the same offer: GET https://api.fiferouter.com/ names its licence and the source of the build answering you.

Security practices

Data subject requests

Access, correction, deletion, restriction, objection and portability requests go to privacy@fiferouter.com and are answered within 30 days. Account deletion removes account, key and session records within 30 days; ledger entries are retained for the statutory period because they are accounting records.

Reporting a vulnerability

security@fiferouter.com. We will acknowledge within 2 working days and keep you informed until it is resolved. We will not pursue legal action against good-faith research that avoids privacy violations, service degradation and data destruction. There is no bug bounty.

What we do not have

Stated plainly, because a security review that discovers these later is a worse conversation than one that starts with them.

If any of these is a blocker, say so before evaluating further — it will save us both the exercise, and we would rather hear which one than discover it at the end.

Data processing agreement

A DPA covering the above is available on request from privacy@fiferouter.com, and we will sign a reasonable customer paper equivalent. Standard Contractual Clauses apply to transfers to sub-processors outside the UK/EEA.