Security and data
Security and data, as they are today.
What is in place, what is built but not yet enabled, and what must change before you send us a real document. Where something is not ready, this page says so.
In short
- Today. The demo runs on our own machine, with public and synthetic documents only. Nothing is hosted yet.
- Real documents. We do not accept confidential documents yet. That starts with a pilot, once the nine conditions at the end of this page are met.
- A confidential pilot. Documents and the database would stay in the EU, in Frankfurt and Nürnberg, with backups in Falkenstein, and the AI model would be called only through Google’s EU endpoint. Parts of this are built and tested; no server, database or storage for a pilot is provisioned yet. A separate pilot agreement would cover it.
The product is not hosted anywhere yet. If you have been shown a demonstration, it ran on our own machine, with public and synthetic documents only. The two configurations below are described as they are built to run.
Every line describes a mechanism that exists, or says Not yet. A Not yet is a commitment we have not earned yet, and we write it down here.
This page summarises a statement written to be checked. It is not a SOC 2 report and does not pretend to be one.
Two configurations
Two configurations, side by side.
ELARID runs in two configurations. From a security standpoint they are not the same product.
Demo today
On our own machine. The product is not hosted yet.
- Public and synthetic documents only. Each upload asks the person to confirm it, and the wording is recorded.In place
- Documents are encrypted before storage: AES-256-GCM, a new key for every write.In place
- The database, which holds the page text and the findings, is not encrypted at rest.Demo only
- Each time the product serves a document or what was read from it, the access is recorded first.In place
- No AI provider reads an organisation’s documents until it is authorised. There is no fallback provider.In place
- Model calls go to Google’s Gemini API, which is not pinned to the EU.Demo only
Confidential pilot architecture
Provisioned only for an agreed pilot.
- Managed PostgreSQL in Frankfurt (EU), with point-in-time recovery.Not yet enabled
- Documents in object storage in Nürnberg, separate from the server.Not yet enabled
- Model calls only through Google’s EU endpoint (Vertex AI), with no other provider to fall back on.Built · not yet enabled
- A daily encrypted backup to separate storage in Falkenstein (EU).Built · not yet enabled
- A restore performed on the pilot’s own infrastructure.Not yet enabled
- A whole engagement erased in one command, with a receipt.Built · not yet enabled
- In placeWorks in the product today, on our own machine.
- Demo onlyTrue of the demo. A pilot does not use it.
- Built · not yet enabledThe code exists and is tested. It does not run for a pilot yet.
- Not yet enabledNot provisioned, or not yet performed.
What each one holds. The demo holds public and synthetic documents only. A pilot would hold a scoped subset of your real project documents.
What “built” means. The code a pilot runs exists and is tested, on our own machine, against local stand-ins for each provider. The AI provider has also been called directly, through a test project, with public documents only. No server, database or storage for a pilot is provisioned, and no customer document has been accepted anywhere.
If you have been shown a demonstration, you have seen the Demo today panel. The demo asks every person, at the moment they upload, to confirm that the file is public or synthetic. The wording is recorded beside the document.
We are not asking you to send real documents into the demo, and the product asks you not to. The section Before real documents lists exactly what changes first. It is there so that you can hold us to that list. You do not have to take our word.
Where data would live
Where your data would live
The product is not hosted yet. This is where each part would run, as it is built.
- Demo, once hosted
One server in Nürnberg, Germany, operated by Hetzner Online GmbH, holding the application, the database and the documents. Today the demo runs on our own machine.
- Pilot: documents
Hetzner Object Storage in Nürnberg, a service separate from the server. Planned, not contracted.
- Pilot: database
Managed PostgreSQL with point-in-time recovery, from Neon, in AWS’s Frankfurt region. Planned, not contracted.
- Pilot: backup
A daily backup of the database and the documents to a Hetzner Storage Box in Falkenstein, Germany. Planned, not contracted.
- How documents are held
Documents are stored as objects, never inside the database, under a key namespace that begins with your organisation’s identifier. Once hosted, no document is stored on a laptop. Original files reach a browser only through the application, which checks your session first. Storage credentials never reach a browser.
What leaves our systems
What leaves our systems, and where it goes
These are the third parties that receive data from us. Malware scanning runs on our own server and is not one of them: uploaded bytes are scanned in place, before the document is accepted.
In the demo and in every pilot, once hosted
Nothing is deployed yet.
- Hetzner Online GmbH
- ReceivesThe demo: everything, meaning the application, the database and the documents. A pilot: the application’s server and the documents’ object storage.
- Processes inNürnberg, Germany (EU).
- NoteInfrastructure.
- Google, Gemini API
- ReceivesThe full text of each page of a document we read. For a document with scanned pages, the whole PDF, sent with each request to transcribe them.
- Processes inNot pinned to the EU. See Training and residency below.
- NoteThe demo only: a pilot refuses to start on it. It reaches an organisation’s documents only after an explicit, recorded authorisation.
- Resend Inc.
- ReceivesSign-in and invitation email: the recipient address and a single-use link. No document content, no findings, no project names.
- Processes inSent from Ireland (EU). Account data, email metadata and logs are stored in the United States.
- NoteTransfer basis: the EU Standard Contractual Clauses and the EU-U.S. Data Privacy Framework.
Planned for the pilot
Not contracted for a pilot. At Google there is only a test project, used with public documents.
- Databricks, Inc. (US)Neon is its product
- ReceivesThe database: page text, the sentences we quote, every finding, user email addresses and the audit trail.
- Processes inAWS, Frankfurt. The region is fixed by our configuration. We have not found it committed in the contract.
- NoteAWS is its subprocessor, and support access from Databricks affiliates outside the EU is possible. Transfer basis: the EU Standard Contractual Clauses in its data processing agreement.
- Hetzner Online GmbHAs above
- ReceivesAdditionally, the daily backup: the database and the already-encrypted documents, encrypted again before they leave the server.
- Processes inFalkenstein, Germany (EU).
- NoteA Storage Box, separate from the server and from the object storage.
- Google Cloud (Vertex AI)Documented by Google since April 2026 as the Gemini Enterprise Agent Platform
- ReceivesThe full text of each page of a document we read. For a document with scanned pages, the whole PDF, sent with each request to transcribe them.
- Processes inGoogle’s eu multi-region: machine-learning processing within EU member states, per Google’s pages as read on 20 October 2026.
- NoteThe pilot’s only AI provider, and a subprocessor separate from the Gemini API. Built in code. No customer document has been sent to it; in our own tests it has received public documents only.
No AI provider reads your documents by default.
A new organisation permits none. The first attempt to read a document fails, and names the organisation and the model. Authorisation is an operator command that records who decided, when, and on what stated basis. There is no fallback to a second provider if the first is refused, and a configuration that is merely absent never becomes consent. The Gemini API and Vertex AI are two subprocessors, and each is authorised separately.
Training and residency
Do your documents train a model?
We cannot state today that they do not, and we will not write a sentence we cannot support.
In the demo, document text is sent to Google’s Gemini API over HTTPS. Whether that traffic falls under terms that exclude training depends on which Google surface and contract the API credential belongs to. Nothing in our system establishes or enforces that. The demo has one credential and one endpoint.
This is a gap in our own diligence. It is no finding about Google. Closing it means obtaining the provider’s terms for the specific surface we use, recording them, and making the deployment prove it is on that surface. It is on the list of conditions below, and it is not optional before real documents.
Where the model runs
The Gemini API endpoint the demo uses offers no EU pin. A European inference region needs a different integration. For the pilot that integration is now built: a pilot’s API reads through Vertex AI’s EU endpoint and refuses to start on any other AI surface. No customer document has been sent to it; in our own tests it has received public documents only.
We will not claim that a customer’s documents are processed in the EU before any has been.
The stores we have chosen are all in the EU. The demo’s model inference is not pinned to the EU.
The pilot’s AI provider: Vertex AI in the EU, as verified on 20 October 2026
What this section says about Google is Google’s documentation as we read it on 20 October 2026. What it says about ELARID describes our code on that date. None of it is assumed to stay true: a page, a model’s status or the terms can change after that date.
- A subprocessor of its own. Vertex AI and the Gemini API serve the same Gemini models under different terms. The Gemini API sits under its own Additional Terms of Service. Vertex AI is a Google Cloud service under Google Cloud’s terms. ELARID lists them as two subprocessors and authorises each separately. Since 22 April 2026 Google documents Vertex AI under a new name, the Gemini Enterprise Agent Platform.
- The EU endpoint, never the global one. Every call goes to Google’s EU multi-region endpoint. It is the only Vertex AI address the integration can build, and no setting names another. Google’s documentation says that this endpoint strictly covers data residency within EU member states, and that a request to a global endpoint may be processed in any Google Cloud location around the world.
- The model, as verified. The integration names one model, gemini-3.7-flash, which Google lists as supported for machine-learning processing in the EU multi-region. Google lists its retirement date as 28 January 2027, with gemini-3.8-flash as the replacement, also listed for the EU multi-region. After the retirement date a call to the model fails. Moving to the replacement is a deliberate change in our code, never a silent one.
- What we do not use. Google guarantees EU processing only for what it lists. ELARID makes one kind of call: a prompt, with the whole PDF attached when a document has scanned pages, and the JSON shape the answer must take. It uses none of the capabilities, features or consumption options that Google’s page marks as not supported there. It uses no grounding, function calling, code execution, tuning, batch inference or Live API, and it creates no context cache of its own. Google’s console sits outside the jurisdictional boundary and is never used with client documents.
- What Google’s page does not settle. It lists capabilities, and says nothing about kinds of input. It is silent, either way, on a PDF sent with the request, which is how a scanned page is transcribed.
- What every call records. The record of each AI call names the provider, where processing was promised (EU, or unpinned for a surface that promises nothing), the model requested, and the model version that answered, recorded only when the response states it. The version is never inferred from the model’s name. The database refuses a row that claims EU for any provider but Vertex AI.
- Not here yet. What Google’s contract says about training and retention is recorded when the contract exists. It will not be taken from a web page alone, and it is not recorded before then.
Google’s pages behind this section
Each date is the one the page itself carries.
- Data residency. The EU multi-region, the models listed for EU processing, and the global endpoint. Dated 15 October 2026.
- Supported capabilities. What is and is not covered on the multi-region endpoints. Dated 15 October 2026.
- Locations. The EU endpoint and its location. Dated 19 October 2026.
- Model versions. Release, retirement and replacement. Dated 19 October 2026.
- Release notes. The new name, from 22 April 2026. Dated 15 October 2026.
- Gemini API Additional Terms of Service. The terms of the Gemini API. Dated 28 April 2026.
- Google Cloud Service Specific Terms. The terms for Vertex AI as a Google Cloud service. Dated 12 October 2026.
Who can read
Who can read your documents
Between customers
The database itself enforces the separation. Every table that holds customer data carries your organisation’s identifier and a row-level security policy that compares it to the organisation the current connection is acting for. Row-level security is forced, so it applies to the table’s owner too. A query that forgets to set the organisation returns nothing. It never returns everything. The database roles that sign in have distinct privileges, so that a compromise of the application’s credential is not a compromise of the credential that runs migrations.
Between you and ELARID
Be aware of the following. It is what a single-server demo means.
- One role reads every customer’s rows and can change none of them: the role that takes the daily backup of the pilot’s database. A backup has to read everything, so it bypasses row-level security. The role holds no right to write, to create anything that persists, or to become another role. Its credential is given to the backup job and to the one-shot jobs that set up and check the database. No service that answers a request holds it.
- The database role that runs schema migrations can assume the owning role, which reads every customer’s extracted facts and document metadata without scoping to a customer. That is deliberate: it is how backfills of existing data work. It means row-level security separates customers from each other. It does not separate you from ELARID.
- On the demo, object storage has one credential, and the application uses it. Whoever can read the deployment’s configuration can read any stored object directly. Isolation at that layer is a key-prefix convention. It is not a policy that would refuse.
Access to the server is limited to the people operating it, today one person. We will not dress that up. A small team’s honest answer is “few people, named”. “Nobody” would be untrue.
The pilot’s separation of managed storage from compute is what narrows it.
Records
What we record about who did what
Provenance is recorded on the data itself. It does not sit in a log that rotates.
Who provided it
Every document version records who provided it and the exact wording of the attestation they confirmed: that they have the right to give us the file. The wording is versioned, so we can show what a person was asked as well as the fact that they clicked.
Who corrected it
Every correction records who made it and when. The superseded value is kept and never overwritten. Findings are append-only: a reading is never silently replaced.
Where it was read
Every claim carries the document, page and quoted sentence it came from. A number we show you can be traced to the sentence that states it.
Reads are recorded, before they are answered
The product records every time it serves a person one of your documents, a quoted passage of one, or what was read from one: the findings, the evidence trace, the guarantee position, an evaluation, a document read again. The record says who, what, when and which request. It is written before the answer leaves. A read that cannot be recorded is not served.
If you ask who at ELARID looked at your file, we answer from that record. It sits in the audit trail, which the application can add to and cannot change or delete. It outlives an erasure, because that is when it is asked for.
It records what was served, which is more than what was looked at, and never less. The portfolio page reads every project’s findings to say what is waiting where, so opening it records each project as served. A page shown again or refreshed records again.
What it does not hold
Lists of your projects. Lists of the documents a project holds, with their names and the issuer, number and date read from each. Lists of a document’s processing stages. The answer to an upload, which reads the file back to the person who just provided it (who provided it is recorded on the file itself). A read made outside the product, by an operator at a database prompt or by the nightly backup, is not a person at a screen and is not in the record.
Encryption
Encryption: what it covers, and what it does not
Described as it is built to run once hosted.
- From your browser to us
HTTPS, with a certificate obtained and renewed automatically, and HSTS set.
- To subprocessors
HTTPS to Google, Resend and the object storage. TLS to the pilot’s database, with the server’s certificate verified. SSH to the pilot’s backup storage, with its published host key checked.
- Inside our server
Not encrypted. The database, object storage, queue and scanner speak plaintext over the host’s internal network. On a single-server demo those hops do not leave the machine. They are still plaintext, and we would rather you know that.
- At rest: your documents
Every document you upload, the page text we extract from it, the record of each model call, and any file the malware scanner refuses are encrypted by ELARID before they are written to object storage.
The cipher is AES-256-GCM, with a new key for every write. That key is wrapped by a master key kept outside the storage, the database and our code. A stored copy that does not open, from a wrong key or a damaged file, is reported as a fault. It is never reported as a file you did not send.
This is built and tested in the code every configuration runs (9 October 2026). No pilot environment exists yet.
- At rest: what that does not cover
The database holds the page text, the sentences we quote and every finding, readable to us and to whoever operates the database. On the demo it sits on the same server with no encryption at rest.
The model call: the provider receives page text and, for a document with scanned pages, the PDF itself.
Object names contain your organisation’s identifier and the SHA-256 fingerprint of each file, so someone who already held a file and our storage credentials could confirm that we store it. Object sizes are visible too.
- At rest: the pilot’s backups
The daily backup is encrypted by the backup tool, under a second secret, before it leaves the server. The documents inside it are the copies already sealed above. Built and tested against local stand-ins. No backup of a real document exists.
- Who holds the key
ELARID holds it. You do not. The encryption protects your documents from someone who obtains the storage, or a backup of it. It does not protect them from us.
The master key is kept in our password manager, in a separate recovery copy, and in the deployment’s settings file on the application server. So it is on that server’s disk, and in the application’s memory while it runs. The backup’s own secret is kept the same way.
Encryption at rest for the database is still on the list of conditions. We would rather have this section read badly now than have you discover it later.
Deletion and backup
Deletion, backup and the end of a pilot
Deletion
Deletion is an operator command. There is no background job and no self-service button. It runs under a database role that exists only to delete. That role can see and destroy customer data, and it holds no power to change the schema. Those are two different authorities, and we keep them apart.
The command takes the organisation identifier typed back by hand, removes stored objects first, and reads each key back to confirm it is gone. Only then does it record what it removed. If even one object survives, the run does not report success. Running it twice is safe. It refuses to start on a storage bucket that keeps earlier versions of an object, because there a key reads back as gone while a copy is still stored. Our buckets are to be created without versioning, and the command checks that before it starts.
What remains afterwards is a receipt: counts by table, who asked, who ran it, and when. It holds no content.
What survives an erasure today
- Stored files: nothing. Until 23 September 2026 the prompt sent to the model, which carries your document’s text, was stored as an object the erasure could not reach. We found it by checking, and it is fixed. The record of each model call now names the document version it read, so the erasure follows that link, removes the object and reads the key back like any other. A second such field was found by the check we built afterwards, before anything had written to it, and was closed the same way.
- Files rejected by the malware scanner. When a single project is erased, they are kept for the organisation and their content hash only, so they cannot be told apart per project. Ending the engagement erases them.
- The receipt and the audit record of the erasure itself. This is deliberate. Deleting the record of a deletion is how a deletion becomes unprovable.
The whole deletion window
We cannot yet state the whole deletion window in days. The honest sentence has four parts, and on a pilot the last three are planned and not yet running.
- Live systems
Removed when the command reports success: immediately.
- Database provider’s history
Kept for up to 7 days. That is a setting of ours, and the provider’s default is one day. Until then an erased row can still be restored, by us.
- Copies under our control
Deleted within 30 days. A pilot’s daily backup can be restored for 20 days, and every copy of it is gone within about 28, which is within 30 even when two nights’ backups fail.
The nightly backup is what deletes the old copies. If it stopped, nothing would delete them until it ran again, and its stopping is what the alert reports. The mechanism is built and has run only against local stand-ins. The backup storage’s own snapshot plan, which that number counts on, has not yet run.
A branch that a database restore leaves behind is deleted by hand once the restore is accepted. If we restore an earlier backup, the erasures recorded in the newest backup are listed and run again. An erasure made after the newest backup, if the live database is lost at the same moment, is in no copy. We keep the line that runs it again outside the server and run it by hand.
- Not yet stated
How long the database provider’s internal backups persist after its history window, where its own documents disagree. How long the AI provider keeps the page text we send it. We will put both questions in writing when the pilot’s contracts are signed, and publish the answers as the providers give them.
Backup and restore
Today nothing has been restored on real infrastructure, and the product is not hosted. Hosted, the demo’s backup would be a snapshot of the whole server. That is one failure domain: application, database, documents and queue together. The recovery point would be up to roughly a day. A snapshot of a running database is crash-consistent. It is not a clean backup.
Built for the pilot, and rehearsed only against local stand-ins on 11 October 2026: a daily backup of the database and the documents to a Storage Box in another city, encrypted, restorable for 20 days and deleted within 30.
While the server runs and reaches our mail provider, a failed or missing backup sends an alert to a person. Nothing checks from outside the server yet.
A scripted restore brings a backup back into a scratch database and scratch storage. It checks every table’s row count and every document’s size and checksum against what was backed up. It opens every document with the key and compares it with the SHA-256 fingerprint the database records. It lists the erasures to run again. On our machine, against the stand-ins, it took seconds. On real infrastructure it has not run.
We treat an untested restore as no backup at all.
Before any real document is accepted, the pilot brings four things: a managed database with point-in-time recovery, object storage in a separate failure domain, an automated backup of the database and the documents kept off the server, and a rehearsed restore. A rehearsed restore is one we have actually performed and timed. A configured restore does not count. A pilot instance refuses to start until the day of that rehearsal is recorded.
When a pilot ends
Your documents and everything derived from them are erased on request or at the end of the engagement, by one command that runs the erasure above for every project, and more. You receive the receipt.
What that leaves is stated here because you should not have to ask. Closing an engagement erases the data and revokes everyone’s access. Your organisation remains as an administrative record: an identifier, a name, a creation date, and nothing else.
It is kept because the erasure receipt and the audit trail both point at it, and a record that proves a deletion happened cannot outlive the thing it points at if that thing is removed. So the choice is between keeping a name and losing the proof, and we keep the proof. With it stay the records that point at it and hold none of your content: the memberships, marked revoked; the audit trail, reads included; our recorded decisions about which providers may process your data; and the receipts.
One command covers the whole engagement, with one receipt that says all three things: data gone, access revoked, administrative record remaining. Access ends first, so nothing can be uploaded while the files are deleted. Then everything stored under your organisation goes: the files of every project, files the scanner refused, and anything an interrupted upload left, each one read back to confirm it is gone. Then every project’s records go, in one transaction that checks nothing of your organisation is left behind before it commits.
Removing a person’s access takes effect on their next request. Membership is read from the database on every call, so a revocation does not wait for anything to expire. Membership is revoked and kept, so who had access, and until when, stays answerable afterwards.
That ends their access to your organisation. It does not end their session: they remain signed in, as a person who is now a member of nothing. Ending sessions outright is a separate operator action, and it exists. One person’s sessions, or every session in the deployment, can be ended at once, with a stated reason that is recorded and cannot be left blank. It is the answer to what we do if a token leaks. It does not disable the account. Stopping somebody from signing in again is a different authority, and we keep the two apart so that an incident response does not quietly lock a person out.
Before real documents
What must change before you send us real documents
This is the list. It is short on purpose, and none of it is aspiration: each line is a specific mechanism. Until all nine hold, the demo’s boundary stands: public and synthetic documents only.
A managed EU database with point-in-time recovery, and EU object storage in a separate failure domain from compute.
Not yetThe code is prepared and checked at start-up: a pilot refuses a database or a store that is not reached over verified TLS at a public address. Neither is provisioned.
A restore that has actually been performed.
Not yetScripted, and performed against local stand-ins. Not yet on the pilot’s own infrastructure, which is what this line asks.
Encryption at rest for the database and for stored objects.
PartlyStored objects: built and tested. The database: not by us. The provider planned for the pilot’s database states in its security overview, read on 9 October 2026, that it encrypts all customer data at rest. That would be the provider’s encryption, under the provider’s keys, and not ours.
The AI provider’s terms obtained, recorded and enforced by the deployment: which surface, which contract, and what it says about training and retention.
PartlyThe surface is chosen and enforced: a pilot starts only on Vertex AI’s EU endpoint, reached without a key file, as verified on 20 October 2026. Not yet: the contract, and what it says about training and retention.
A whole engagement erased in one command.
Built · not yet enabledOne command, one receipt: data gone, access revoked, administrative record remaining. Run against local stand-ins.
Reads are recorded, so that “who opened our document” has an answer.
In placeEvery read of content is written down before it is answered.
The deletion windows chosen and written down, every part.
PartlyOur part is chosen: every copy of a backup is deleted within 30 days. The database provider’s part is condition 9, and the AI provider’s is condition 4.
A data processing agreement naming the subprocessors above as they are actually deployed.
Not yetNo such agreement exists yet, and nothing is deployed for a pilot.
The database provider’s written answer on how long data persists after its history window.
Not yetWe will put the question in writing when the pilot’s database contract is signed, and publish the answer.
Security contact
If you find a vulnerability, tell us first.
If you believe you have found a vulnerability, please tell us before telling anyone else, and we will tell you what we have done about it.
[email protected]Questions about anything on this page are welcome, including the parts that read badly. A reviewer who asks us to prove one of these sentences is doing us a favour.
Contact
See ELARID on public Romanian project documents.
Founding pilot programme - limited availability.