Security you can check, not just trust.
Employment certificates hold some of the most sensitive data a company keeps. This page shows how ZeugnyAI handles it, which controls are in place, which are planned, and where your team can verify each one.
Scope: ZeugnyAI Cloud (app.zeugny.com), the Self-Hosted edition and the Zeugny Engine. ZeugnyAI Chat and the free Certificate Checker are consumer products with their own privacy notices.
Every control, with its status
Each control states whether it is in place, partial or planned. Where it lives in the platform code, the source path is listed so Self-Hosted customers can check it.
Data protection & privacy
How personal data is pseudonymised, encrypted, kept and deleted.
Pseudonymisation before the engine
In placeInside the platform, the PII boundary replaces the names of employees, managers and signatories, employer and company names, dates, work e-mail addresses and employee IDs with consistent pseudonyms before a request reaches the engine, and restores them in the answer. It wraps the engine calls of the HR platform, the lifecycle worker, ZeugnyAI Chat (which reaches the engine only through the platform) and the Word gateway.
FADP Art. 7GDPR Art. 25ISO A.8.11SOC 2 C1.1Verify in source
- platform/packages/ports/src/pii-boundary.ts
- platform/packages/lifecycle/src/pii/wiring.ts
- platform/packages/ports/test/pii-boundary.test.ts
The boundary refuses rather than leaks
In placeA request is refused, not sent, when the encryption key or document scope is missing, a known person or employer has no pseudonym, a name part is ambiguous between two people, or the audit entry cannot be written.
FADP Art. 7GDPR Art. 25ISO A.8.11Verify in source
- platform/packages/ports/src/registry.ts
- platform/packages/ports/test/pii-boundary.test.ts
Free text and other details
PartialPlace of birth, nationality, job titles, departments, the company description and task text are sent as written; the text needs most of them. Names typed into free text are replaced only when they match a known person or employer. A stricter mode that holds unrecognised free text for human review is built; enabling it in the managed Cloud is planned.
FADP Art. 7GDPR Art. 25ISO A.8.11Verify in source
- platform/packages/lifecycle/src/collected-assembly.ts
Boundary inspector for every certificate
In placeFor each certificate, HR can open every crossing to and from the engine: time, direction, the number of replaced items per category, the SHA-256 of the payload and the pseudonyms used. Real values are never shown there. The view exports as CSV.
GDPR Art. 5(2)ISO A.8.15SOC 2 CC7.2AI Act Art. 12Verify in source
- platform/apps/cloud/app/lib/pii-report.server.ts
- platform/apps/cloud/app/routes/certificates.$id.pii-boundary.tsx
Data stored in Switzerland
In placeThe database, backups, file storage, key vault, logs and application servers of the managed Cloud run in Microsoft Azure Switzerland North (Zürich). Backups and file storage are replicated to a second Swiss region, Switzerland West. app.zeugny.com resolves directly to Zürich, with no content-delivery network in between. A signer's IP address is kept as signing evidence and is not sent to any third-party geolocation service; the country is read from a header set at the network edge.
FADP Art. 16GDPR Art. 44–45ISO A.5.34Encryption in transit
In placeAll apps accept HTTPS only, with TLS 1.2 as the minimum; TLS 1.3 is negotiated in practice. The database server accepts TLS connections only, with TLS 1.2 as the minimum, and the platform's database connections request TLS.
FADP Art. 8GDPR Art. 32ISO A.8.24SOC 2 CC6.7Encryption at rest
In placeAzure encrypts the database, backups and file storage at rest. On top of that, the platform encrypts pseudonym mappings and engine API keys with AES-256-GCM under master keys held in Azure Key Vault. Other records rely on Azure's encryption.
FADP Art. 8GDPR Art. 32ISO A.8.24SOC 2 CC6.1Verify in source
- platform/packages/lifecycle/src/crypto/gcm.ts
- platform/packages/lifecycle/src/pii/store.ts
- platform/packages/lifecycle/src/engine-config.ts
Retention and automatic deletion
PartialOnce the retention period has passed (10 years after the end of employment by default), an hourly job redacts a former employee's name, e-mail address, date and place of birth and nationality, erases drafts and deletes the pseudonym mappings. Job assignments, the audit trail and issued certificates are kept; issued certificates still contain the name. We set a different period for your company on request; self-service configuration is planned.
FADP Art. 6(4)GDPR Art. 5(1)(e)ISO A.8.10SOC 2 C1.2Verify in source
- platform/apps/cloud/app/lib/retention.server.ts
- platform/apps/worker/src/main.ts
Employee data requests
PartialEmployees file access and deletion requests themselves under My privacy, and HR tracks each one against a 30-day deadline. Erasure redacts the employee's records, removes vault entries and shares, and issues a receipt. An access request produces a summary; a downloadable copy of the data is planned.
FADP Art. 25GDPR Art. 15, 17ISO A.5.34SOC 2 P5.1Verify in source
- platform/apps/cloud/app/lib/dsar.server.ts
- platform/apps/cloud/app/routes/me.privacy.tsx
Legal holds and disputes
In placeHR partners can place a legal hold on an employment and all its certificates, which pauses deletion. Employees can dispute a certificate; an accepted dispute produces a new version, and the history stays in the audit trail.
FADP Art. 32GDPR Art. 16, 18ISO A.5.33Verify in source
- platform/apps/cloud/app/lib/retention.server.ts
- platform/apps/cloud/app/lib/disputes.server.ts
Crypto-shredding per company
PlannedThe platform can destroy a company's pseudonymisation key, which makes its stored mappings unreadable. The function is built and tested; making it available as an operator action is planned. Backup copies expire on the regular backup schedule.
GDPR Art. 17ISO A.8.10SOC 2 C1.2Verify in source
- platform/packages/lifecycle/src/pii/erasure.ts
AI governance
How the AI is constrained, supervised and kept away from identities.
People set the ratings
In placeManagers, or HR, rate each aspect of performance and conduct. The AI writes text that matches those ratings and cannot change them. The overall level is calculated from the ratings, not chosen by the model.
FADP Art. 21GDPR Art. 22AI Act Art. 14Verify in source
- platform/packages/lifecycle/src/stages/manager-eval.ts
- platform/packages/lifecycle/src/collected-assembly.ts
Every sentence names its source
In placeEach evaluative sentence records the aspect and rating it expresses, and HR sees this in the editor, so every sentence can be traced back to the rating behind it.
GDPR Art. 5(1)(a)AI Act Art. 13Verify in source
- platform/apps/cloud/app/components/sentence-provenance.tsx
- platform/packages/ports/src/engine.ts
Fairness and code check before issue
In placeBefore HR review, every AI draft goes through the engine's fairness analysis. A blocking finding holds the certificate until an edit clears it or an HR partner overrides it, and the override is recorded in the audit trail. Employment confirmations, which are built from a template without AI, skip this step.
GDPR Art. 5(1)(a)AI Act Art. 9, 14Verify in source
- platform/packages/lifecycle/src/stages/fairness-gate.ts
HR finalises every certificate
In placeNo certificate reaches an employee without review and finalisation by an HR partner or administrator. Automations can start requests but never finalise them.
FADP Art. 21GDPR Art. 22AI Act Art. 14Verify in source
- platform/packages/lifecycle/src/workflow.ts
- platform/apps/cloud/app/lib/automation.server.ts
No training on your data
In placeWe do not use customer data to train, fine-tune or evaluate models, and customer requests never enter our reference corpus.
FADP Art. 6(3)GDPR Art. 5(1)(b)AI Act Art. 10Country rules are explicit
In placeEach certificate names its jurisdiction, Switzerland, Germany or Austria, explicitly instead of guessing it from the text. Only the Swiss rules have been reviewed so far; assessments for Germany and Austria are marked as limited.
AI Act Art. 13, 15Verify in source
- platform/packages/ports/src/jurisdiction.ts
Model provider controls
PartialCertificate text is written by models on Microsoft Azure AI Foundry, on a resource in Switzerland North with an EU Data Zone Standard deployment, so requests are processed within the EU data zone. Decision, extraction and retrieval steps also use Microsoft Decision-1 (an Azure AI Foundry resource in Sweden Central with an EU Data Zone Standard deployment), OpenRouter and Voyage AI, and the platform uses OpenRouter directly to suggest job titles and tasks. Providers receive pseudonymised text only. Every request the engine sends to OpenRouter requires providers that do not collect user data, with no setting to switch this off. Zero-data-retention routing is planned.
FADP Art. 9, 16GDPR Art. 28, 44–46ISO A.5.19, A.5.23SOC 2 CC9.2
Identity & access
Who can sign in, and what each role can see and do.
Sign-in protection
In placePasswords are hashed with scrypt and need at least 8 characters. E-mail addresses are verified before the first password sign-in, and passwordless magic links expire after 5 minutes. Sign-in attempts are rate-limited per IP address.
FADP Art. 8GDPR Art. 32ISO A.8.5SOC 2 CC6.1Verify in source
- platform/packages/auth/src/better-auth/instance.server.ts
Sessions
In placeSessions are stored on the server and can be revoked. Session cookies are HttpOnly, Secure and SameSite=Lax and expire after 7 days. A deactivated account is refused on its next request.
ISO A.8.5SOC 2 CC6.1Verify in source
- platform/apps/cloud/app/lib/context.server.ts
Multi-factor authentication
PartialWith single sign-on, your identity provider's MFA applies to every sign-in. Staff accounts in our control plane need a second factor (an authenticator code or a backup code) for every session, and no engine operator login is issued without it. A built-in second factor for customer password sign-in is planned.
FADP Art. 8GDPR Art. 32ISO A.8.5SOC 2 CC6.1Verify in source
- platform/apps/control/app/lib/staff-mfa.server.ts
Single sign-on and SCIM
In placePer-company single sign-on with OIDC or SAML, DNS-verified domains, group-to-role mapping and an optional SSO-only mode. It is switched on in the managed Cloud, and we connect your identity provider on request. SCIM 2.0 creates and deactivates users and ends their sessions; a user provisioned without a role gets the least-privileged HR role (HR coordinator), and the SCIM endpoints are rate-limited. Self-Hosted connects any OIDC provider.
ISO A.5.16, A.5.18SOC 2 CC6.2Verify in source
- platform/apps/cloud/app/lib/sso-provisioning.server.ts
- platform/apps/cloud/app/lib/scim.server.ts
Roles and separation of duties
In placeEvery route checks relationship-based permissions. HR coordinators can draft but cannot finalise, override a finding, sign or download the official document. Works councils see aggregate figures only; managers see their own direct reports.
FADP Art. 8GDPR Art. 32ISO A.5.3, A.5.15, A.8.3SOC 2 CC6.3Verify in source
- platform/packages/authz/src/schema.ts
- platform/packages/authz/test/authz.test.ts
Company isolation
PartialIn the managed Cloud, companies share one Swiss database. The application confines every request to one company and checks permissions on each object. Self-Hosted gives each customer its own database. Row-level enforcement in the database is planned as a second layer.
FADP Art. 8GDPR Art. 32ISO A.8.3SOC 2 CC6.1Verify in source
- platform/apps/cloud/app/lib/tenant.server.ts
- platform/apps/cloud/app/lib/tenant.server.test.ts
Single-purpose links
In placePeople without an account, such as a rating manager, a draft reviewer or the employee collecting a certificate, get links that grant access to exactly one object, expire and can be revoked. The platform stores only a SHA-256 hash of each link token.
ISO A.8.3SOC 2 CC6.1Verify in source
- platform/apps/cloud/app/lib/capability.server.ts
- platform/packages/lifecycle/src/stages/deliver.ts
Staff access
In placeStaff accounts are created by invitation only and need an administrator role, and each action in the control plane requires its own permission. Every staff session must pass a second factor (an authenticator code or a backup code) before it can use the control plane, and no engine operator login is issued without it. Staff cannot impersonate users: the admin impersonation endpoints are disabled. Changes to companies, engine keys and staff are logged.
ISO A.8.2, A.5.18SOC 2 CC6.2, CC6.3Verify in source
- platform/apps/control/app/lib/staff-mfa.server.ts
Application security
How the application protects itself at its boundaries.
Cross-site request forgery protection
In placeSign-in and form submissions are checked against the request's origin, and session cookies are SameSite=Lax.
ISO A.8.26SOC 2 CC6.6Browser security headers
In placeThe four web apps (app, control, chat and the website) send HSTS, a Content-Security-Policy with a per-response nonce, frame protection (X-Frame-Options DENY and frame-ancestors none), X-Content-Type-Options nosniff and a referrer policy. Sensitive pages also send no-store and no-referrer headers.
ISO A.8.26SOC 2 CC6.6Verify in source
- platform/packages/ports/src/security-headers.ts
Rate limits on sign-in, public links and SCIM
In placeSign-in is rate-limited per IP address. Every public link page, including the verification pages behind the QR code, allows 60 requests per minute per client, and the SCIM endpoints allow 600 requests per minute per company and client.
ISO A.8.26SOC 2 CC6.6Verify in source
- platform/apps/cloud/app/lib/public-rate-limit.server.ts
- platform/apps/cloud/app/routes/_public.tsx
Engine API keys
In placeEach company has its own engine key with a request rate limit; it can be rotated and revoked. The engine stores only a SHA-256 hash of it, and the platform stores it encrypted with AES-256-GCM. Results are readable only by the key or company that created them.
ISO A.8.5, A.8.24SOC 2 CC6.1Verify in source
- platform/packages/lifecycle/src/engine-config.ts
File handling
In placeUploaded scans of signed paper certificates must be PDF, PNG or JPEG, up to 10 MB, and the file content must match the declared type.
ISO A.8.26SOC 2 CC6.8Verify in source
- platform/apps/cloud/app/lib/paper-completion.server.ts
- platform/packages/lifecycle/src/branding.ts
Secrets management
In placeProduction secrets live in Azure Key Vault with role-based access and soft delete, and reach the apps as Key Vault references. None are stored in source code, and production refuses to start without its keys.
ISO A.5.17, A.8.24SOC 2 CC6.1
Infrastructure & network
Where the service runs and how it is locked down.
Managed platform services
In placeProduction runs on managed services: Azure App Service containers and Azure Database for PostgreSQL for the platform, Cloudflare Workers for the engine. There are no virtual machines of our own to maintain.
ISO A.5.23, A.8.8SOC 2 CC7.1Network isolation
PartialThe apps reach the database through a private endpoint. The database also has a public endpoint. Its firewall allow-list holds Cloudflare's address ranges, so Cloudflare Workers, including the engine, can connect through Hyperdrive. During migrations, deployments and backups, a temporary rule admits the CI runner doing the work and is removed when the job ends. TLS and passwords protect every connection.
ISO A.8.20, A.8.22SOC 2 CC6.6Infrastructure as code
In placeAzure resources are defined in versioned templates, and app settings come from versioned files that reference Key Vault.
ISO A.8.9SOC 2 CC8.1E-mail security
In placeNotifications are sent from notifications.zeugny.com, which publishes a DMARC reject policy, and zeugny.com itself publishes a DMARC quarantine policy. Notifications contain the recipient's address, names and a link. security@, privacy@ and hello@zeugny.com are monitored mailboxes.
ISO A.5.14SOC 2 CC6.7
Logging, monitoring & incidents
What is recorded, what is watched, and what happens when something breaks.
Tamper-evident audit trail
In placeEvery lifecycle step and change is written to an audit log in which each entry carries the hash of the previous one, so an edited entry breaks the chain. The chain is checked when a dossier or verification page is opened, and each certificate's dossier can be downloaded with its audit entries.
FADP Art. 8GDPR Art. 5(2)ISO A.8.15SOC 2 CC7.2AI Act Art. 12Verify in source
- platform/packages/lifecycle/src/audit.ts
- platform/packages/lifecycle/test/audit-race.test.ts
Synthetic monitoring
In placeEvery five minutes, a separate monitor checks the health of the platform, worker and control plane. Once a day it runs a full analysis of a fictional certificate through the engine. Azure availability tests watch the monitor itself from three European locations, so an outage of either side raises an alert.
ISO A.8.16SOC 2 CC7.2, A1.2Central logging
In placeApplication, HTTP and database logs go to Azure Log Analytics in Switzerland North and are kept for 30 days. Engine request logs hold metadata only; the engine's runtime logs on Cloudflare can contain fragments of pseudonymised text.
ISO A.8.15SOC 2 CC7.2Incident response and notification
PartialIf an incident affects your data, we inform your named contact without undue delay after we confirm it, with what happened, which data is affected and what we are doing about it. A written incident response plan is drafted and is published after legal review; regular exercises are planned.
FADP Art. 24GDPR Art. 33ISO A.5.24, A.5.26SOC 2 CC7.3, CC7.4
Backup & continuity
How data is backed up and how releases are protected.
Backups
In placeThe database can be restored to any point in the last 35 days. In addition, a scheduled job dumps all databases every night. It runs on a ZeugnyAI-operated CI runner, which connects over TLS, writes each dump to a temporary file, uploads it to Azure Storage in Switzerland North and deletes the file. The last 30 dumps of each database are kept, and deleted dumps stay recoverable for 30 more days. The stored backups, point-in-time and dumps, are kept in Switzerland North and replicated to Switzerland West, a second Swiss region.
FADP Art. 8GDPR Art. 32ISO A.8.13SOC 2 A1.2Restore tests
PartialThe restore procedure is documented. Restore tested on 9 November 2026: a point-in-time restore of the production database to a temporary server completed in 7 minutes and its contents were checked. Further restore tests on a recurring schedule are planned.
ISO A.8.13, A.5.30SOC 2 A1.3Redundancy
PartialThe managed Cloud runs in Azure Switzerland North. Database backups and file storage are replicated to a second Swiss region, Switzerland West. A restore of the database backup into Switzerland West was tested on 10 November 2026. A standby database with automatic failover is planned.
ISO A.8.14SOC 2 A1.2Verify in source
- platform/infra/azure/main.bicep
Staged releases
In placeEvery change on the main branch that passes the checks is deployed to a separate staging environment. A production release requires a passing smoke test on staging for the same commit. The engine reaches production only from commits that passed the checks: a CI job moves the release branch to the tested commit, and Cloudflare deploys from that branch.
ISO A.8.32SOC 2 CC8.1
Secure development
How changes are built, tested and shipped.
Automated checks on every change
In placeType checks, unit and integration tests and production builds run for every change, and end-to-end tests run for changes that affect them. Dependencies install from a frozen lockfile.
ISO A.8.25, A.8.29SOC 2 CC8.1Separate environments
In placeDevelopment, staging and production use separate databases, keys and key vaults. Tests never use production data or credentials.
ISO A.8.31, A.8.33SOC 2 CC8.1Change review and release gates
PartialProduction releases pass automated gates. The engine's production pipeline deploys only from a release branch, which CI moves to a commit after the tests have passed for that commit on main. The platform's production pipeline runs only for commits on main with a successful CI run, and only after an acceptance run on the staging environment. Self-Hosted customers can review every change in their repository. Enforced independent review of every change is planned.
ISO A.8.25, A.8.32SOC 2 CC8.1Dependency and secret scanning
PartialCustomer source snapshots are checked for secret-shaped strings and forbidden paths before release. Dependency vulnerability alerts (Dependabot) are enabled on the platform and engine repositories. Code scanning and repository secret scanning are planned.
ISO A.8.8SOC 2 CC7.1Source delivery for Self-Hosted
In placeSelf-Hosted customers receive an allowlisted snapshot of the platform as a private repository and build the containers themselves. Internal tooling is excluded, and a release stops if forbidden paths or secret-shaped strings are found.
ISO A.8.4SOC 2 CC8.1Verify in source
- platform/scripts/bootstrap.mjs
- platform/docker-compose.selfhost.yml
Organisation & vendors
People, policies and the third parties we rely on.
Production access
PartialProduction access is limited to named administrators on a need-to-have basis. Formal separation of duties between development and operations is planned.
ISO A.5.2, A.5.3SOC 2 CC1.3Subprocessor list
In placeEvery provider that processes data for the Cloud is listed on this page with its purpose, the data it receives and its location.
FADP Art. 9GDPR Art. 28ISO A.5.19, A.5.21SOC 2 CC9.2Data processing agreement
PlannedA standard data processing agreement under the Swiss FADP and the GDPR is drafted and is published after legal review. Until then, we review and sign yours.
FADP Art. 9GDPR Art. 28ISO A.5.20Written security policies
PlannedFormal written policies for information security, access control, incident response and vendors are drafted and are published after legal review. This page describes current practice.
ISO A.5.1, A.5.37SOC 2 CC2.1, CC5.3Independent penetration test
PlannedAn external penetration test is planned. Self-Hosted customers are welcome to test their own installation at any time; for the managed Cloud we agree scope and timing with you.
ISO A.8.8SOC 2 CC4.1