KINDI — A bureau for handling sensitive language.

In-Kingdom PII masking for frontier LLMsRiyadh · Kingdom of Saudi Arabia
KINDI.me
30 May 2026 · 1447-12-13 HAPI live · --:-- AST
PL. 30 · SECURITYArchitecture statement

What we have built, what we have not yet been certified for, and who to write to when something is wrong.

Security at KINDI is a property of construction, not of policy. The mapping between a placeholder and the original text is encrypted under a key that only the API-key holder can derive. KINDI cannot decrypt what it issues. This page states the rest.الأمن في كندي خاصيّةُ بناءٍ، لا خاصيّةُ سياسة.

PL. 30 · § 01
§ I.

The threat modelنموذج التّهديد

KINDI’s threat model treats every HTTP endpoint as untrusted input, every customer-supplied byte as potentially adversarial, and every operator-side compromise as worth mitigating in advance. It assumes that a competent attacker may, at some point, gain access to a single component of the stack; it is designed so that even in that event, the body of customer requests cannot be recovered.

ML checkpoints and recogniser weights are operator-controlled only: KINDI never loads weights supplied by a customer or by an untrusted source.

PL. 30 · § 02
§ II.

Cryptographyالتّشفير

Every masking request produces a single-use data-encryption key (DEK). The DEK encrypts the placeholder-to-original mapping under AES-256-GCM. The DEK itself is then wrapped under a key-encryption key (KEK) derived from the requesting API key by HKDF-SHA-256. The wrapped DEK and the ciphertext travel together in the response envelope; the API key never leaves the customer.

The consequence: KINDI can produce an envelope, but it cannot read one. Only a holder of the API key can. When an API key is revoked, every envelope previously issued under it becomes structurally undecryptable. There is no operator override and no key-escrow path.

Transport is TLS 1.2 or later; we prefer TLS 1.3 where the client supports it. Internal service-to-service traffic is on a private network segment and additionally authenticated.

PL. 30 · § 03
§ III.

Data residencyموطن البيانات

Compute, primary database, Redis cache, backups, and operational logs all run on a single in-Kingdom virtual private server in the Riyadh region. Backups are encrypted at rest and held in the same region. KINDI does not move personal data outside the Kingdom in the course of normal operation. The two non-KSA sub-processors (DNS and transactional email) receive only what is described on the Subprocessor List.

PL. 30 · § 04
§ IV.

Access controlsصلاحيّات الوصول

Production administrative access requires a second factor (TOTP), is granted on a least-privilege basis, and is recorded in a centralised audit log. The admin console lives on its own subdomain under its own session cookie; the customer session cookie has no authority over any admin endpoint. Access reviews run quarterly.

PL. 30 · § 05
§ V.

Loggingالسّجلّات

Production logs never carry request bodies, response bodies, bearer tokens, password reset tokens, or email addresses at the INFO level or above. Only identifiers (account ID, key ID, request ID) travel up the log pipeline. This is enforced by code review and by the recogniser-side static checks the same masking recognisers apply to customer text.

PL. 30 · § 06
§ VI.

Vulnerability managementإدارة الثّغرات

Every pull request runs a HIGH-or-above dependency-audit gate (pip-audit on Python, pnpm audit on the frontend), and a weekly scheduled run repeats the check independent of merge activity. A pre-push git hook runs the same audit locally. Residual unfixed CVEs are tracked in a top-level SECURITY.md with a threat-model justification per entry. Dependabot opens pull requests on every upstream advisory; auto-merge is off, so every dependency change is reviewed by a human.

PL. 30 · § 07
§ VII.

Software bill of materialsقائمة المكوّنات البرمجيّة

KINDI emits three CycloneDX 1.5 SBOMs on every release: one for the Python service, one for the dashboard/admin workspace, and one for the marketing site. The SBOM generators are version-pinned for byte-reproducibility. SBOMs are attached to GitHub Releases and are available on request to customers conducting their own supply-chain review.

PL. 30 · § 08
§ VIII.

NCA controls alignmentالمواءمة مع ضوابط الهيئة الوطنيّة للأمن السّيبراني

KINDI’s security architecture is designed to align with the controls published by the National Cybersecurity Authority:

These are alignment statements. KINDI has not yet undergone a third-party attestation against any of the three frameworks. This page will be updated, and the corresponding statement on /trust will be updated, when an attestation is in hand.

PL. 30 · § 09
§ IX.

Incident responseالاستجابة للحوادث

On a confirmed material incident affecting customer data or service availability, KINDI will notify the registered account email within 72 hours of confirmation, will notify the SDAIA breach-notification service within the same window where personal data is affected, and will publish a running status update at status.kindi.me. A post-incident review is published within fourteen calendar days of resolution.

PL. 30 · § 10
§ X.

Responsible disclosureالإفصاح المسؤول

Security researchers may write to security@kindi.me with reproducible findings. KINDI acknowledges within one business day, gives an initial assessment within five business days, and works with the researcher on a coordinated disclosure timeline. A machine-readable contact is also published at /.well-known/security.txt.