The hull
Built for teams that handle
sensitive regulatory data.
Landfall turns regulation into engineering work for public bodies, banks and product teams, and it is built with security at every layer from authentication to audit trails. A per-project data-residency policy governs the AI hop: when a project requires EU or local processing, Landfall refuses to run an AI feature rather than send that project's data to a provider outside the allowed region. Here's exactly what's in place.
Security principles
Defence in depth
Multiple independent security layers
Full transparency
Every AI decision auditable and traceable
Least privilege
Role-based access at every level
The audit log, writing itself.
chain · 4c19f2…8ab7 → verified
Immutable · append-onlyWhat's implemented
No aspirational claims — only what's shipping in the codebase today.
Authentication and access control
- •Bcrypt password hashing with cost factor 12
- •TOTP-based multi-factor authentication with backup codes (hashed, single use)
- •Role-based access: Analyst, Approver, Admin, Viewer
- •Concurrent session limiting (5 per user by default, configurable) with the oldest session revoked first
- •Session revocation: sign out one session, every other session, or all sessions for a user
- •JWT sessions with configurable expiry (8h default)
- •Account lockout after 5 failed attempts
API and transport security
- •HTTPS enforced via Strict-Transport-Security (1-year max-age)
- •CSRF protection via origin/referer verification on all state-changing requests
- •Tiered rate limiting by endpoint (auth: 10/min, AI: 20/min, default: 500/min)
- •Input validation via Zod schemas on every API endpoint
- •Webhook signature verification (HMAC-SHA256)
- •X-Frame-Options: DENY, X-Content-Type-Options: nosniff
Data protection
- •Encryption at rest for secrets: AES-256-GCM field-level encryption of API keys, access tokens and webhook secrets, with key rotation supported
- •The database layer refuses a plaintext write to an encrypted column rather than storing it
- •Guest share links: the token is shown once and stored only as a SHA-256 hash; each link is scope-exact and opens one artefact and nothing else
- •PostgreSQL with Prisma ORM: all queries parameterised (no raw SQL)
- •Sensitive fields (passwords, tokens, API keys) redacted from all logs
- •Security headers: clickjacking prevention, referrer policy, permissions policy
- •Non-root Docker execution for self-hosted deployments
- •Database SSL recommended and documented for production
Audit trail and traceability
- •Every action logged: entity, user, timestamp, before/after state
- •Hash-chained audit log: each entry stores the hash of the one before it, and an admin can verify the chain independently
- •7-year minimum retention for approved compliance decisions
- •Compliance contracts with SHA-256 integrity verification
- •Full decision chain: regulation, obligation, interpretation, work item
- •Audit logs indexed by user, entity, and timestamp for fast retrieval
- •Export audit bundles for external review
AI and data isolation
- •AI calls go to the provider you choose: Anthropic by default, or any OpenAI-compatible endpoint including EU-hosted and self-hosted models
- •A per-project data-residency policy blocks non-EU / non-local providers for projects that need it. AI features refuse to run rather than send the data elsewhere. The policy governs the AI hop; see “What leaves the deployment” below for every other outbound connection
- •The declared residency is checked against the provider it describes: an Anthropic endpoint cannot be saved as “local”, a public endpoint cannot be saved as “local”, and a claim that contradicts a documented provider is refused rather than stored
- •Bring your own provider and key, per project or per organisation
- •PII redaction before the prompt is sent (email, phone incl. Dutch national formats, card, IBAN, Dutch BSN incl. its dotted and spaced forms), on by default. Names, addresses and dates of birth are pattern-less and are NOT redacted
- •Full prompt logging with token tracking and cost attribution
- •Per-project AI configuration with owner-only access
- •Obligation mapping is rule-based; AI-written interpretation text is labelled and flagged for human review
Privacy and data rights
- •GDPR data export: download all your data in one click
- •Data deletion with configurable strategies (delete, archive, anonymise)
- •A daily retention job (/api/cron/retention) clears full prompts and access-log IP addresses after 90 days by default, and reports what your own retention policies say is due
- •Deletion requests audited with legal basis tracking
- •Password history enforcement prevents reuse
- •No cross-tenant data access: strict project-level isolation
- •Self-hosting option for teams with data residency requirements
What leaves your deployment, and how to stop it
Self-host or use our managed service. Either way, you own your data.
Self-hosted option
Docker deployment with non-root execution, health checks, and network isolation.
Choose your AI provider
Anthropic, an EU-hosted endpoint, or a model you run yourself, with a residency policy that fails closed.
Full prompt visibility
See exactly what gets sent to the AI model, with optional full prompt storage.
CI verification
Compliance contracts live in your repo with SHA-256 hashes, checked by the @reg-to-backlog/verify CLI.
What leaves the deployment
The data-residency policy governs the AI hop: where prompts containing your project's data may be sent. It does not govern the connections below, which are ordinary product features you configure. Each is off unless you turn it on, and each can be turned off again.
- ·Email notifications: recipient addresses, project and item names, notification text (not sent at all unless RESEND_API_KEY or SMTP_* is configured)
- ·Slack and generic webhooks: project name, finding titles, drift and verification detail (per-project, only to the URL you register; remove the webhook to stop it)
- ·Jira / Linear / GitHub issue push: backlog item titles and descriptions (only when you connect the integration, and only for items you push)
- ·In-app feedback: your message, your email, the page you sent it from (only what you type into the feedback form, when you submit it)
- ·Error monitoring (Sentry): exception messages and stack traces from the server (hosted deployments only; unset SENTRY_DSN to disable)
- ·Stripe (hosted plans): billing name and email (hosted billing only; self-hosted deployments never contact it)
Subprocessors and agreements
On the managed service these are the parties that can process your data. A self-hosted deployment uses none of the hosted rows and only the AI provider you configure, if any. A data processing agreement (DPA) is available on request for pilot partners.
- ·Vercel: Application hosting for the managed service
- ·Supabase: PostgreSQL for the managed service; region configured per deployment
- ·Your AI provider: Only when AI features are enabled, and only the one provider you select for the project: Anthropic by default, or any OpenAI-compatible endpoint including EU-hosted and self-hosted models
- ·Resend, or your own SMTP: Email transport for notifications; nothing is sent unless one is configured
- ·Sentry: Error monitoring on the managed service only; unset SENTRY_DSN to disable
- ·Stripe: Billing for hosted plans only; self-hosted deployments never contact it
What we don't have yet
We believe in transparency. These are areas we're actively working on but haven't shipped:
- —SOC 2 Type II certification (in progress)
- —Automated secrets rotation
- —Dedicated WAF (currently relies on platform provider)
- —Formal penetration testing report
Questions about security?
Book a demo and we will walk through the architecture in detail, or write to us from the contact page for a DPA or a security questionnaire.