Agent memory that never phones home.
Telys links into your process and answers queries from a local directory. There is no service to call, no daemon to trust, and no code path — in the SDK or the runtime — that transmits your data anywhere.
Everything executes where the data lives.
No network at query time
Import the SDK, unplug the network, and queries still answer. Retrieval is a function call against local segments — there is no endpoint to reach, and no failure mode that involves DNS.
Data stays in your process
No service, no daemon, no external API. The engine runs inside your Python process and reads a local directory. Vectors, metadata, queries, and results never cross a process boundary you did not create.
Zero model downloads
Bring your own vectors — the engine is embedding-agnostic — or use the on-device embedder: lexical, in-process, no model download, no third-party inference call.
from telys import Telys db = Telys("./memory") # a directory, not a connection string col = db.open_collection("docs") hits = col.search(qvec, where={"tenant_id": "acme"}, top_k=10) # no socket, no daemon, no DNS lookup — a function call in your process
One sign-in. Offline after.
telys login runs once: an OAuth device-code sign-in returns an RS256-signed device license and a runtime bundle whose artifacts verify against a SHA-256 manifest — locally, using public keys embedded in the SDK. After that, Telys is fully offline.
telys login # once: OAuth → RS256 device license + signed runtime telys runtime verify # offline: manifest signature + artifact SHA-256 + license
telys runtime install --file telys-runtime.bundle \
--license license.jwt
# verified locally against embedded public keys — no network at allIf you run local-first because you distrust vendors, this is the paragraph to audit: license checks never happen at query time. Verification is a local signature check at install — and on demand, via telys runtime verify — against embedded public keys, with no callback. And nothing about your data — vectors, metadata, queries, results — ever leaves the device: not on any tier.
Air-gapped activation is first-class, not a support ticket: install from a signed bundle file plus an offline license.jwt. That path never touches the network at all.
| Step | Network | What moves |
|---|---|---|
| telys login | Once | OAuth sign-in; a signed license and the runtime bundle come down. Nothing about your data goes up. |
| telys runtime install --file | Never | Offline install: a signed bundle plus license.jwt, verified locally against embedded public keys. |
| telys runtime verify | Never | Re-checks the manifest signature, per-artifact SHA-256, and the license — entirely offline. |
| add / search / every query | Never | License checks do not happen at query time. There is no code path from a query to a socket. |
The SDK is Apache-2.0 and on public PyPI (pip install telys). The signed runtime installs via telys login; offline bundles are available for air-gapped environments on request.
Deletion you can prove. Answers you can audit.
Trust is not only where the data sits — it is what the engine will admit about its own answers. Every mechanism below is shipped surface, not roadmap.
Every fact carries its origin
Metadata routes with every vector, and every hit returns it. A recalled memory arrives with the record of where it came from — not a bare ID you have to re-join against another store.
Never a silent overwrite
Updates supersede under MVCC: the new version wins, the prior version is marked superseded, and open snapshots keep reading a consistent view. History is a chain, not a mutation.
Tombstone, then gone
delete() writes a tombstone — the row disappears from every subsequent search. compact() rewrites the segment without it: after compaction, the bytes are physically gone, including from index sidecars — not merely hidden from queries. That is what a real erasure request needs.
A plan on every query
search(..., explain=True) names the physical path that produced each result — exact partition scan, IVF with exact rerank, or the scatter-gather fallback, which says so. No answer arrives without its reasoning.
col.delete(["doc-041"]) # tombstone — gone from every subsequent search col.compact() # segment rewrite — the bytes are physically gone col.save()
The claims, in writing.
| Surface | Status |
|---|---|
| License verification | Offline. RS256 manifest signature, per-artifact SHA-256, RS256 license token — all verified against public keys embedded in the SDK. No network at verify time; none at query time. |
| Network at query time | None. add, upsert, search, search_text, delete, compact, and save execute in-process against local segments. |
| Telemetry in the engine | None. The SDK and runtime transmit nothing off the device. Analytics on telys.ai stay on telys.ai — they have no path into your process. |
| Embedding | Bring your own vectors, or use the on-device embedder — no model downloads, no third-party inference. |
| SBOM & attestation | Software bill of materials and build attestation per release — under Enterprise licensing. |
| Certifications | No SOC 2 or ISO 27001 certification yet. The no-network design narrows the audit surface; formal certification tracks the Enterprise roadmap. |
| Platforms | macOS arm64 · Linux x86_64 / arm64 · Windows via WSL2. |
| Source model | SDK: Apache-2.0, contains no engine code. Runtime: closed, signed, on-device. |
Audit it yourself.
Install, unplug the network, and watch queries answer — then read the verification code, because it ships in the Apache-2.0 SDK.
Talk to us about Enterprise