Architecture review: March 2026 · Infrastructure: Railway + Supabase + Cloudflare
This page documents Oyvoda's security architecture, compliance posture, and audit capabilities for operators conducting security reviews and external reviewers evaluating the platform.
Oyvoda's security is structural, not rule-based. Most AI platforms defend against attacks by filtering content. Oyvoda defends by making certain attack vectors architecturally impossible.
All 9 Model Context Protocol servers are registered at application startup from a static, code-defined list. No server can be added, removed, or modified at runtime — not by user input, not by AI inference, not by API call. This eliminates the entire class of prompt injection attacks that attempt to register malicious tools — by architectural constraint, not filtering.
Every guest message passes through sanitizer_mcp before reaching the LLM. It strips injection patterns, removes control characters, truncates to safe lengths, and validates encoding. Content that fails sanitization is logged and rejected — it never reaches inference.
Every proposed AI action passes through governance_mcp before execution. Checks: action is in the permitted set, operator has enabled it, parameters are within bounds, action is scoped to the correct operator. Actions that fail validation are blocked and logged — the AI cannot act outside its authorized scope.
Every AI response is compared against the retrieved source chunks using token-level Jaccard similarity. Responses that diverge significantly from source material are flagged or blocked before delivery. Number fabrication detection checks that specific values in responses (prices, codes, times) exist in the source context. Emergency-intent responses are held to stricter thresholds and automatically escalated if grounding fails.
Every database query is scoped by company_id at the query level. There is no mechanism by which one operator's data is accessible in another operator's context. This is enforced at the data access layer — a bug in the application cannot cross company boundaries.
PMS credentials are stored encrypted and never appear in logs, API responses, or error messages. Secrets are injected at runtime via environment variables — they are not stored in the codebase or version control.
All connections use TLS 1.2+. Cloudflare terminates TLS at the edge. Database connections use SSL with certificate verification. No unencrypted paths exist between any system components.
From the operator dashboard, operators can access and export:
Export formats: CSV and JSON. Date-range filtering supported. Access via the dashboard Audit tab or directly via the audit API.
For formal external reviews, Oyvoda can provide:
Request via security@oyvoda.com.
Vulnerability reports, security documentation requests, compliance discussions:
Critical vulnerabilities: 24-hour response. Responsible disclosure policy — good-faith researchers will not face legal action.