Security
The mechanisms in shipped code, then a plain list of what does not exist yet.
In short
- Keys are sealed twice, bound to your workspace, and never read back out.
- Key values never cross the MCP link; Ahel attaches them on the server.
- Scripts in a pipeline you build run in single-use pods with no cluster access.
- Every call and every key decrypt leaves a receipt on your Activity page.
- Not yet: SSO, a live audit stream, and a cloud KMS for the master key.
Where your keys live
Every key you store in Ahel is yours. What you store is encrypted before it reaches the database. It is sealed under a data key minted fresh for that single write, and that data key is itself sealed under a master key held outside the database. Both layers are bound to your tenant and the key’s type, so a ciphertext moved into another row does not open. We store a four-character preview and a one-way fingerprint alongside it, which is what lets the keys page show you which key is stored without decrypting anything.
There is no endpoint that reads a key back out: you can store, replace, or delete, and the response carries a status, never a value. Every decrypt is written to an access log that records who asked and whether it opened, and never the value.
What is not true yet: the master key is an environment secret held in the cluster, not a key in a cloud KMS that our servers reach by federated identity. That is the next step, and until it ships, anyone who can read the cluster’s secrets can unwrap a stored key.
What travels over the link
The Ahel connector is an OAuth-authenticated MCP endpoint: every call answers as the account that signed in, and only for that account’s own workspace. There is no path from one tenant’s link to another tenant’s anything.
Key values never cross the link, in either direction. When a served tool needs a key, Ahel attaches it server-side: a bearer or declared header for a hosted server, an environment variable inside a single-use pod. The response that returns to your AI carries the tool’s answer, never the key. The link’s own tools can search the catalog and change what your workspace serves; not one of them can read, write, or reveal a stored key.
Scripts in single-use pods
Scripts in a pipeline you build run in single-use pods with no cluster access, and so do MCP servers that only run as local processes. The pod is the security boundary:
- Each pod runs one script or server for one account, as a non-root user, with no cluster keys mounted; it cannot see or speak to the platform it runs on.
- Its network egress reaches the public internet only; our databases and internal services are unreachable by network policy.
- Your keys enter it as environment variables of your pod alone, and the pod is destroyed after roughly thirty minutes idle.
- The set of servers eligible for this is a hand-curated allowlist, chosen by publisher trust, never scraped from the catalog.
Receipts, not stories
Two append-only ledgers record what actually happened: every call from your AI through the connector, and every touch of a stored key: who asked, whether it opened, never the value. Both are yours to read on the Activity page.
Failed calls are recorded the same way as successful ones. A call that errors leaves the same permanent receipt. It is not hidden.
What does not exist yet
Honesty cuts both ways, so here is the current list of things we do not have:
- No SSO. Sign-in is a magic link or Google. There is no SAML or enterprise single sign-on for teams.
- No audit stream. Owners and team leads can export the audit log as a CSV or JSON file, up to 90 days at a time. There is no live feed of it into your own tooling yet.
- Account deletion goes through email. You can remove items and delete keys yourself, and a deleted key is gone immediately, but full account deletion is a mail to karl@ahel.ai rather than a button.
When one of these ships, this page is updated to say so. Until then it stays on the list above.
Whether it is up
Your whole connector is one URL, so when it cannot be reached every tool in every AI client you use goes quiet at the same moment, and the first thing worth knowing is whether it is you or us.
There is no uptime number on this page, because nothing here measures or promises one. What there is: /api/health/live, public, which says whether the app is answering and which commit it is serving. It is the same endpoint our release job polls until it reports the commit it released, so a deploy that never landed turns a build red instead of staying invisible.
Checked when this page loaded: Ahel answered on build de26871e. That is a live read of the same endpoint the release job polls, not a stored number.
When something is wrong for longer than a moment, we write to the people it affects and answer on the contact page. There is no incident history here yet; when there is one, this section will say so.
Where the data sits
Ahel never trains models on your data. Application data is hosted on infrastructure in the European Union (Germany). How we handle personal data is in the privacy policy and terms; who we are is on the about page.
Questions about anything on this page? A person answers.
Ask on the contact page