Skip to main content

Latet

A local privacy firewall for AI agents.

AI agents read for you: your code and its .env, databases, logs, mailboxes, the web. Coding agents such as Claude Code and Codex do it at your request. Autonomous agents such as Hermes Agent, OpenClaw, Goose and OpenHands do it on their own, for hours, with no one reading each step. Everything they read is sent to a model in the cloud.

Latet stands between the agent and the model. It masks secrets and personal data before a request leaves your machine and restores them locally in the answer, so the agent keeps working normally and the provider never sees the real values.

The best models for your sensitive work too. Without it, work on customer data, health records or credentials stays away from cloud models, or goes to a weaker local one. With it, the cloud model gets the work, not the values.

At the office too. When your company reaches Claude or GPT through its own gateway, Amazon Bedrock, Google Vertex, Microsoft Foundry or Azure OpenAI, Latet reads that route from the agent's settings and goes in front of it: Company endpoints.

See it at work first. Once it is installed, latet tutorial opens a sandbox in your browser: a pretend agent sends requests full of invented secrets and personal data through the real Latet, and chapter by chapter the dashboard shows what Latet did with each value. Nothing leaves your computer, and none of your settings change: Tutorial.

CI License: Sustainable Use

Website: https://latet.ai/ · Documentation: https://docs.latet.ai/, also in Italiano, Deutsch, Français and Español

Latet's product video: an AI agent's request carries real values toward a cloud model; at the line between your machine and the cloud, Latet turns each one into a fake of the same shape, and puts the real values back when the answer returns

What it protects

Every request is checked before it leaves, whatever put the text in it: you, a file, a tool, the agent's own instructions.

What leaves your machine For example What Latet does
Your prompts "Send the IBAN GB82 WEST 1234 5698 7654 32 to Emily Carter" Each value becomes a fake of the same shape, the name with the optional local name model; the answer comes back with the real ones
Files the agent reads .env, config.yaml, test fixtures, a customer export Keys, passwords, connection strings and personal data are masked; files the agent writes get the real values back
Command output and logs docker logs, a stack trace, kubectl describe Tokens, email addresses, public IP addresses and ID numbers in them are masked
Database queries psql, or an MCP server answering SELECT * FROM customers Secret columns always; with strict data mode every value, with fakes that keep joins and counts working
API responses curl of an internal API, a webhook payload Masked by value, and by field: a password or token field always
Web pages An admin panel the agent opens with a browser tool The personal data in the page's text is masked
Instructions CLAUDE.md, AGENTS.md, the system prompt Your name, user name, host name and company domain are masked
History A session resumed ten days later The same value gets the same fake, every time
Screenshots A screenshot of an invoice With the optional text recognition, the text in it is read on your machine and each value is covered with its fake; PDFs are flagged, or not sent (images: block)
What no pattern finds "Mark from sales is quietly interviewing at a competitor" The optional local reviewer, a language model on your computer, finds it before it leaves, following Latet's instructions and your own guidance: what counts as sensitive in your work, everywhere or in one project

A key in .env, for example: the agent reads the file to learn the configuration, and the model receives pk_3a8d1f6b0e9c2a7d4b5e instead of pk_9f2c4e7a1b3d5f8e0a6c. It writes the code that reads the key from the environment, as it should; if a fake does come back, in a reply or in a command the agent runs, Latet puts the real key back on your machine. See How it works.

How it protects

  • Detects secrets (API keys, tokens, passwords, .env values, private keys, connection strings) and personal data (emails, phone numbers, IBANs, card numbers, VAT numbers of 30 European countries and national ID and tax numbers of 15 countries, each confirmed by its check digits or a nearby keyword, and names and street addresses with the optional local name model). Your own terms and formats too: a client's name, or every badge number written AB-123456 (custom recognizers, with a guide for AI agents to write them).
  • Replaces each value with a deterministic, format-preserving fake of the same shape, so code and configuration still make sense to the model.
  • Restores the originals locally, in responses, streaming output and tool-call arguments, so files written by the agent contain the real values.
  • Adapts to each project: a latet.yaml in a repository adds the project's own terms, formats and stricter rules, shared with everyone who works on it, and can never turn protection down; your own settings for a project may also loosen it, or turn Latet off there (projects).
  • Reads production data by its structure: the secret columns of a query result are always masked, and strict data mode masks every value of the tables, JSON and logs an agent reads; the dashboard proposes the columns that can stay in clear, such as ids, dates and states (production data).
  • Reviews, if you want, everything the model did not write before it leaves, with a language model on your own computer: the names, health details and secrets in prose that no pattern finds (below).
  • Asks you, if you want, before anything new leaves: every prompt, file and tool output waits in the dashboard until you approve it, mask more in it, or stop it (below).
  • Shows exactly what was sent upstream and how it was masked, in a local dashboard (latet dashboard).

Everything runs on your machine. There is no Latet cloud service, no telemetry and no analytics.

Beyond patterns: the local reviewer and the Live Reviewer

Detectors find what has a shape: a key, an email address, an IBAN, an ID number with its check digits. A good deal of what matters has none. "Mark from sales is quietly interviewing at a competitor", a client named in passing in a log, a password written in a sentence, the details of a contract in a customer's email: no pattern recognises them, and an agent that reads files and tools for you brings plenty of them along. Latet has two more layers for these, and each adds to what the one before masked; neither can take anything away.

flowchart LR
  T["A text about to leave:<br/>prompt, file, tool output"] --> D["Detectors<br/>secrets, personal data,<br/>your terms and formats"]
  D --> R["Local reviewer<br/>a language model<br/>on your own computer"]
  R --> L["Live Reviewer<br/>you, in the dashboard"]
  L --> M["The model"]

The local reviewer is a language model that runs on your own computer, or on a server of yours (llama.cpp, Ollama, LM Studio). Before a text leaves, it reads what the detectors left in clear, with their replacements shown as placeholders, and points out the names, health details, addresses and secrets in prose. Latet masks them like any other value, wherever they appear from then on.

  • Everything the model did not write is read before it leaves: your prompts and attachments, the agent's instructions, and above all what its tools fetch, the part nobody types.
  • Nothing leaves without its review. When the reviewer cannot answer, because its server is off or its answer is not to be trusted, the request is stopped. You can choose to send it masked by the detectors alone instead.
  • A text is read once, and its review is remembered across restarts: history the agent sends again with every turn costs nothing more.
  • Your guidance: Latet's own instructions to the reviewer are fixed, and shown in the dashboard as they are sent. After them you can add what only you know of your work (ward names are confidential, PRJ- codes are internal projects), for everything or for one project.
  • How much it finds: on 93 invented cases, counting only what the detectors missed, Qwen3.5-4B found 84% (a prompt in under a second on a graphics card) and Ternary-Bonsai-2-27B 97%. Which local model works best as a reviewer is still open, and measurements from the community are welcome: benchmarks/llm-review/README.md says how these were made, with scripts/llm_review_bench.py, and CONTRIBUTING.md how to send yours.
  • The original texts stay on your machines. The server is on this computer, or on another machine of yours once you confirm it, reached over https (a self-signed certificate is trusted by its fingerprint).

The Live Reviewer is you, as the last check. Turn it on in the dashboard, and every new text waits on the Approvals page before it leaves: the original next to what will be sent, with what the detectors and the local reviewer masked, and what the reviewer only suggested.

  • Approve it, mask more, or stop it. Select a value in the original and choose what it is; it leaves as a fake. A text you stop is never sent.
  • You can only add masking. A value already masked cannot be put back in clear, and a value you mask stays masked from then on, everywhere.
  • In Claude Code it waits inside the plugin, before Claude Code builds the request, piece by piece as prompts and tool outputs arrive; for the other agents, in the daemon, on the whole request. Nothing has a time limit unless you set one.
  • It suits the moments that matter: a session on a customer's data, an agent you leave alone on a production system, the first days with a new project. Approve all waiting and letting texts with nothing found go by themselves keep it quick.

Without the local reviewer, what has no shape is only as safe as the detectors and the local name model make it: turn the Live Reviewer on, or keep such text out of the agent's reach. See Local reviewer and Live Reviewer.

Agents and services

Agent How it goes through Latet Signed in with
Claude Code: CLI, VS Code, JetBrains Client mode: the Latet plugin, and the daemon checking each request A Pro or Max subscription, or an API key
Claude Desktop's Code tab (local sessions) Client mode, plugin only: the app ignores ANTHROPIC_BASE_URL A subscription
Codex CLI and Codex Desktop Gateway: openai_base_url in ~/.codex/config.toml ChatGPT, or an API key
OpenCode Gateway: each provider's baseURL API keys (Anthropic, OpenAI, OpenRouter)
Gemini CLI Gateway: latet gemini sets GOOGLE_GEMINI_BASE_URL and GOOGLE_VERTEX_BASE_URL A Gemini API key, or Vertex AI
Hermes Agent, OpenClaw, Goose, OpenHands, and any agent that takes an OpenAI-compatible base URL Gateway: its base URL set to Latet (autonomous agents) An OpenAI or OpenRouter API key
Scripts and SDKs: the OpenAI, Anthropic and Google GenAI SDKs, LangChain, LangGraph, AutoGen, CrewAI, Aider, etc. Gateway: latet run <command> points OPENAI_BASE_URL, ANTHROPIC_BASE_URL and GOOGLE_GEMINI_BASE_URL at Latet API keys
GitHub Copilot (VS Code chat, Copilot CLI), JetBrains Junie CLI and AI Assistant, Zed, Cline, Kilo Code, Continue, Qwen Code, Crush Gateway: the tool's own base URL or custom endpoint set to Latet (other tools); Copilot's inline suggestions are not covered API keys

Through the gateway, requests reach OpenAI (and ChatGPT, for Codex), OpenRouter (Claude, Gemini and hundreds of other models), Anthropic's API, and Google's Gemini API and Vertex AI. Not covered: Claude Desktop's Chat and Cowork signed in to Claude, cloud sessions (they run on the provider's infrastructure), and Cursor, Windsurf, Antigravity, Jules, Kiro, Warp and the ChatGPT app, whose requests leave from the vendor's servers (what Latet cannot protect).

  • Client mode, for Claude Code: the plugin masks inside Claude Code, before the request is built. The daemon checks each request and forwards it unchanged; it stops one that would carry a sensitive value in clear.
  • Gateway mode, for every other agent: the daemon on 127.0.0.1:5283 masks the request and restores the answer, streams included (SSE and WebSocket).
flowchart LR
  subgraph machine["Your machine"]
    direction TB
    CC["Claude Code<br/>+ Latet plugin<br/>(masks inside Claude Code)"]
    GW["Codex, OpenCode, Gemini CLI,<br/>Hermes Agent, OpenClaw, Goose,<br/>OpenHands, scripts and SDKs"]
    D["Latet daemon<br/>127.0.0.1:5283"]
    V[("Vault<br/>original ↔ fake<br/>encrypted")]
    UI["Dashboard"]
    CC -- "already masked" --> D
    GW -- "real values" --> D
    D --- V
    D --- UI
  end
  D -- "Claude Code's requests:<br/>checked, forwarded unchanged" --> P["Anthropic, OpenAI / ChatGPT,<br/>OpenRouter, Google Gemini"]
  D -- "every other agent's:<br/>masked, answers restored" --> P

Tested for real. Each of these runs through a real Latet to a fake provider, set up as its guide says, and its test checks that the provider never sees the secrets and that the agent gets them back: Claude Code (on Bedrock and Vertex too), Codex, Gemini CLI, Hermes Agent, OpenClaw, Goose, OpenHands, Aider, Qwen Code, Crush, the GitHub Copilot CLI, Junie CLI, and the CLIs of Cline, Kilo Code and Continue; the OpenAI, Anthropic and Google GenAI SDKs, LangChain, LangGraph, AutoGen and CrewAI. Tested live with real providers: the Claude Code CLI with a subscription and the Codex CLI signed in with ChatGPT (WebSocket), with local name detection and the dashboard, and the local reviewer with a model served by llama.cpp. GitHub Copilot in VS Code was tried by hand; Copilot in JetBrains IDEs, JetBrains AI Assistant, Zed, Android Studio and Claude Desktop on a gateway are documented, not tested. Every wire format is also tested in CI against a fake upstream. If an agent does not work through Latet, please open an issue.

Claude Pro and Max subscriptions

Latet works with Claude Code signed in with a Pro or Max subscription: no API key is needed. Anthropic allows a subscription in Claude Code and its own apps (Legal and compliance), and that is the only place Latet uses one:

  • Claude Code is not modified. Latet extends it with a plugin, through Claude Code's own plugin system, and points it at the local daemon with ANTHROPIC_BASE_URL, the setting Anthropic documents for gateways, a subscription login included.
  • Your sign-in stays Anthropic's. You log in with Claude Code's own login. Latet never asks for your credentials, never reads them for itself and never stores them.
  • Each request is the one Claude Code built. The plugin masks inside Claude Code, before the request is built. The daemon then forwards it byte for byte, headers included, as Anthropic's gateway guide asks a gateway to do: it inspects without modifying. Your token passes through it and is never saved or logged.
  • No one else uses your subscription. The other agents go through the gateway with their own API keys.

Latet takes no work away from your provider: it brings it the work you would otherwise keep from it.

This describes how Latet works; it is not legal advice.

Claude Code's auto mode: its reviewer is sent your OS user name and the paths of your home and working directories, which no plugin can mask. Latet blocks those reviews by default (auto mode then cannot approve actions by itself); auto_mode_review lets each detail through to the reviewer, or gives it a fake user name. See Claude Code.

Run your agent through Latet

The usual way is to start the agent through Latet, the session you want protected:

  • latet claude, latet codex or latet opencode runs that agent through Latet. It starts the daemon and gives the agent what it needs for that session only: none of the agent's settings change, and when the session ends the agent works as before. Every argument passes through: latet claude --resume.
  • claude started on its own does not go through Latet. That is the price of changing nothing.

For every session, once Latet fits your work: latet global-install points your agents at Latet for good, in the terminal and in the IDE, so no session can start without it. It is worth it once your terms, formats and projects are set and the false positives marked Not sensitive, and on a machine where a forgotten session would matter: a customer's data, an autonomous agent left alone. It shows everything it would change and asks once; it backs each agent's settings up first, and latet global-uninstall takes it all away, the settings restored byte for byte. latet agents apply routes one agent you install later.

Setting Latet up takes some time. The defaults protect at once what has a shape: keys, passwords, email addresses, IBANs, ID numbers. Making it fit you takes longer: your clients' names and internal codes as terms and recognizers (latet rules suggest finds the formats), the false positives marked Not sensitive from the dashboard, a project's own rules, and the local reviewer for what has no shape. The dashboard shows each request as it left, so you see what to add as you work.

latet run <command> is for scripts and SDKs: it runs the command with OPENAI_BASE_URL, ANTHROPIC_BASE_URL and GOOGLE_GEMINI_BASE_URL pointing at Latet, so a program that reads them goes through it (latet run python summarize.py). A program that does not read them runs as usual.

Install

Requirements: Windows, macOS or Linux. The installers set up uv, which also provides a Python Latet is tested on (3.12 or 3.13).

On macOS and Linux:

curl -LsSf https://raw.githubusercontent.com/Latet-AI/latet/main/scripts/install.sh | sh

On Windows (PowerShell):

irm https://raw.githubusercontent.com/Latet-AI/latet/main/scripts/install.ps1 | iex

Both install the latest release from GitHub with uv, local name detection and text in images included, and change nothing else: start your agent with latet claude as above, and run latet global-install when it fits your work. latet upgrade installs the next release the same way.

Recommended: names and images from day one. Patterns find what has a shape, such as a key, an email address or an IBAN. A name in a sentence has none (Emily Carter lives at 42 Mill Lane): the local name model finds it. The text in a screenshot needs text recognition, or the image leaves as it is. The installers install what both run on; download their models once:

latet ner install   # names and street addresses: about 1.6 GB
latet ocr install   # the text in images: about 31 MB

Both run on this computer only: the models come once from huggingface.co, checked against pinned hashes, and nothing is sent anywhere. latet global-install --ner --ocr downloads them with the rest of its setup.

With an AI agent: point it at llms-install.md. It installs Latet, which changes nothing on its own, then tells you how you can go on (try it one session at a time, have it on for every session, set up your other tools, download the local models) and waits for your choice: it runs latet global-install only if you choose every session. Later, llms-config.md lets it change Latet's settings for you: what adds protection applies, what lowers it waits for your approval in the dashboard. That is a guardrail against mistakes, not a lock: an agent runs as you, so it cannot hold against one misled by a prompt injection (Agents and your settings).

With Docker, if you prefer: docker compose up -d with compose.yaml, then docker exec latet latet agents print shows how to point each agent at the container. See Docker.

From a checkout (also needs Node.js 22.12 or newer, to build the dashboard; installed from the repository's address, git+https://..., Latet would come without it):

git clone https://github.com/Latet-AI/latet.git
cd latet
cd dashboard && npm ci && npm run build && cd ..   # the dashboard ships inside the package
uv tool install --force ".[ner,ocr]"               # or "." without names and images

To work on Latet itself, see CONTRIBUTING.md.

Quickstart

  1. See it at work. New to Latet? latet tutorial shows it at work in about 30 minutes, in your browser: a pretend agent and a pretend model, the real Latet between them, and invented data. Nothing leaves your computer, and none of your settings change. See Tutorial.
  2. Try it, changing nothing: in a scratch folder, put a made-up key in a .env file, start latet claude (or latet codex) there, and ask the agent to copy the key into another file. Then run latet dashboard: the request shows a fake, and the file on disk contains the original.
  3. Work with it: keep starting your agent with latet claude, and look at the dashboard now and then. Add your own terms, mark the false positives Not sensitive, and turn on the local reviewer if you have a graphics card, or the Live Reviewer when the data matters.
  4. Turn it on for good, once it fits: latet global-install detects your agents and shows what it would change: the Claude Code plugin in every session, each agent pointed at the local daemon, the daemon started at login, the profile (below). It asks once. Restart your agents afterwards.
Profile Masks
balanced (default) Secrets, personal data, your own terms and this machine's identity; names and street addresses in your prompts, with the optional local name model
max All of balanced, plus private IP addresses, names everywhere and every value of the tables and JSON a tool prints (strict data mode); requests carrying images or PDFs are not sent
secrets Secrets and your own terms only

Everyday commands

Command What it does
latet dashboard Open the dashboard: what was sent, and how it was masked
latet doctor Check the daemon, the plugin, masking and every agent integration
latet status, latet start, latet stop The background daemon
latet reload Apply edits to config.yaml without a restart
latet config get, set, add, remove Read and change a setting; what lowers protection waits for your approval
latet project show, init, off What applies in a project, a latet.yaml to start from, Latet off in one project
latet rules suggest, test, add Find formats no rule covers (shapes only), check your own recognizers, add them
latet rules export, import Your rules in a file for a colleague; what an import would lower is left out unless you ask
latet backup, latet restore Your installation in one encrypted file, the vault and its key with --vault, for another machine
latet llm status, test Check the local reviewer's server, review a text as Latet would
latet ner install Download the local name and address model (about 1.6 GB, once)
latet ocr install Download the text recognition models for images (about 31 MB, once)
latet tutorial See Latet at work in your browser, on a sandbox of its own with invented data (about 30 minutes)
latet claude, latet codex, latet opencode Run one agent through Latet for one session, without changing its settings
latet global-install Route your agents through Latet for good: it shows what it changes, and asks once
latet global-uninstall Take it all away: agent settings restored byte for byte, start at login removed, daemon stopped
latet connect, latet disconnect Connect this computer to a Latet server, or revoke its connection
latet server people, keys, config, status Administer a Latet server with an administration token

To uninstall: latet global-uninstall, then uv tool uninstall latet. Every command and option is in the CLI reference.

Latet on a server

For a team, one Latet can run on a server instead of on each computer: people's agents, and programs such as a CI pipeline, send their requests to it over HTTPS, and it masks them there. It runs on several instances, with PostgreSQL and Valkey behind them.

In practice:

  1. The administrator starts the server, with the server profile of compose.yaml (PostgreSQL, Valkey, two instances and Caddy) or as a systemd or Windows service (latet server service install shows its plan first), and adds each person, which prints a one-time code: latet server --server https://latet.acme.lan people add "Emily Carter".
  2. Emily installs Latet on her computer as usual and runs latet connect https://latet.acme.lan with that code. From then on her agents' requests go through the server, and latet dashboard opens her space there.
  3. A program gets an API key instead: latet server --server https://latet.acme.lan keys add "Billing CI" --out billing.key.

What is whose. Each person and each API key has a separate space, with its own vault, history, settings and rules. The server shares with every space only what it needs to run: its destinations, its local reviewer, text recognition and how long history is kept.

Sharing rules. A team shares its rules by hand: one person exports them to a file with latet rules export, and the others import it. Rules set once for everyone, which nobody can lower, are planned for the Enterprise Edition.

Administration. The administration commands add and remove people and API keys, set the rules of each API key and the shared settings, and show the administration log. Metrics have a listener of their own, which asks for a token.

Trust. Original data can reach the server and the dashboards people sign in to: trust its administrators, and any reviewer it uses, accordingly. Gateway requests are masked on the server; Claude Code masks with its plugin, and the server checks each of its requests (the connected helper runs in Windows terminals). The server is a company control point only when network rules stop direct access to the providers.

An administrator sets the server up in their own terminal: its administration and latet connect refuse to run inside an AI agent, since they hold the keys to everyone's space. An agent can still explain the steps and check the machine: point it at llms-server.md.

See server setup, connection and administration and server operations.

Privacy guarantees and limits

For Latet running locally on your computer, the intended guarantees are:

  • Values it detects are replaced before the request leaves your machine, and the mapping to the originals stays local.
  • In client mode, the daemon never modifies a request; it can only block one that carries a value the detectors find in clear.

What it cannot do:

  • Only what the detectors recognize is masked. Unusual formats, encoded values or personal data in free text can pass through. Names in free text need the optional local name model or the local reviewer, and both are best effort.
  • The text in images is masked only with the optional text recognition, and best effort: text it does not read leaves as it is. PDFs and other documents are not read: they are sent as they are and flagged, or not sent at all with the max profile or images: block.
  • claude.ai connectors (Gmail, Calendar, Slack...) run on Anthropic's servers, so Latet keeps the fakes in their arguments: a connector searching for a masked name searches for the fake one.
  • Uncovered surfaces (Claude Desktop Chat and Cowork, cloud sessions, Cursor) are out of reach.
  • Context still leaks: file names, code structure and the surrounding text are sent as they are, and fakes keep the shape of the original.
  • Latet is not a sandbox.

For a connected deployment, see the server trust boundary. See What is and isn't protected and the threat model.

Roadmap

What comes next is on the roadmap, and what changed in each version is in the changelog.

Latet Enterprise

Latet Enterprise is for a company whose security team sets the rules for everyone. On top of the Community Edition it adds rules for everyone that nobody can lower, central approvals of changes that lower protection, single sign-on, audit reports and events for a SIEM. It is coming: join the waitlist to hear when it is out.

Bugs and feature requests

Found a bug, or missing a feature? Open an issue: bugs and feature requests are tracked there, and that is where you get an answer.

  • A bug: what you did, what you expected and what happened instead, with the output of latet version and latet doctor, your agent and your operating system.
  • A feature: what you are trying to do, and what Latet does today. A concrete case (the value that should be masked, the agent you use) says more than a general description.

Use invented values in an issue, never a real key, password or someone's data. A security problem is not an issue: report it privately, as SECURITY.md explains.

Contributing and security

Pull requests are welcome: CONTRIBUTING.md explains the development setup and the checks CI runs. For a new feature, open an issue first, so that what it does is agreed before the code. Your first pull request accepts the contributor license agreement: you keep your copyright. To report a vulnerability, follow SECURITY.md; please do not open a public issue for it.

License

Latet is source-available under the Latet Sustainable Use License. The Community Edition is free for everyone, companies of any size included, for their own work, for personal use and for any non-commercial use. Selling Latet, offering it to others as a service, building it into a product you sell or making a commercial fork of it needs a commercial license: write to info@latet.ai. The files in ee directories are the Enterprise Edition, under the Latet Enterprise License. LICENSING.md explains it in plain words, and THIRD_PARTY_NOTICES.md lists the third-party components and their license texts (generated by scripts/gen_notices.py).

Acknowledgements

Latet stands on the work of these projects. Thank you to their authors and contributors.

Vendored or ported code

Project Used for License
gitleaks Default secret-detection ruleset, vendored and converted for RE2 MIT
Presidio (formerly Microsoft Presidio) PII recognizers ported (patterns, context words, checksum validation) MIT

Runtime dependencies

Project Used for License
phonenumbers Phone number parsing and validation Apache-2.0
google-re2 / RE2 Linear-time regular expressions BSD-3-Clause
Starlette ASGI framework for the daemon BSD-3-Clause
Uvicorn ASGI server BSD-3-Clause
HTTPX HTTP client for upstream requests BSD-3-Clause
websockets WebSocket relay BSD-3-Clause
Pydantic Data validation MIT
Typer Command-line interface MIT
python-zstandard Zstandard compression BSD-3-Clause
Brotli Brotli compression MIT
TOML Kit Style-preserving TOML reading and editing MIT
keyring Access to the operating system's credential store MIT
cryptography Cryptographic primitives Apache-2.0 OR BSD-3-Clause
truststore TLS verification with the operating system's certificate store MIT
platformdirs Per-platform data and configuration directories MIT
PyYAML YAML parsing MIT

Optional local name detection (latet[ner])

Project Used for License
Privacy Filter by OpenAI The name and address model, downloaded on request Apache-2.0
ONNX Runtime Local model inference MIT
Tokenizers Model tokenization Apache-2.0
NumPy Model inputs and outputs BSD-3-Clause

Optional text in images (latet[ocr])

Project Used for License
PaddleOCR PP-OCRv6 small, detection and recognition in ONNX The text recognition models, downloaded on request Apache-2.0
ONNX Runtime Local model inference MIT
Pillow Reading, painting and writing images MIT-CMU
IBM Plex Sans The font the fakes are written in, included unmodified OFL-1.1
NumPy Model inputs and outputs BSD-3-Clause

Optional Latet on a server (latet[server])

Project Used for License
psycopg PostgreSQL driver and connection pool, used as a separate, unmodified package LGPL-3.0-only
redis-py Client for Valkey and Redis MIT

Dashboard and documentation site

Project Used for License
React Dashboard UI MIT
React Router Dashboard navigation MIT
Vite Dashboard build MIT
Tailwind CSS Dashboard styling MIT
i18next and react-i18next Dashboard translations MIT
Astro and Starlight Documentation site MIT
Pagefind Local, static search for the documentation MIT

Development

Project Used for License
pytest Test runner MIT
pytest-asyncio Async tests Apache-2.0
pytest-socket Blocking network access in tests MIT
Hypothesis Property-based testing MPL-2.0
python-stdnum Reference validation of identifiers, in tests only (not distributed) LGPL-2.1-or-later
Ruff Linting and formatting MIT
Pyright (via pyright-python) Static type checking MIT
uv Python packaging and environments Apache-2.0 OR MIT
Hatchling Build backend MIT
TypeScript, ESLint and Vitest Dashboard type checking, linting and tests Apache-2.0, MIT, MIT
CycloneDX Python Release SBOM Apache-2.0

Prior art and inspiration

Latet learned from projects that explored the same space before it: Stacklok's CodeGate (now archived), a local gateway that redacted secrets for AI coding assistants; PasteGuard, a local-first privacy proxy; LiteLLM's Presidio guardrail for masking PII in LLM traffic; and two tools for looking at what Claude Code actually sends, claude-code-proxy by seifghazi and claude-trace by badlogic.

Metadata

Release files for latet 0.9.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for latet 0.9.1
File Size Uploaded Provenance
latet-0.9.1.tar.gz 41.9 MB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for latet 0.9.1
File Interpreter ABI Platform
latet-0.9.1-py3-none-any.whl Python 3 none any Details

Total release size: 57.6 MB

Release files / latet-0.9.1.tar.gz

Download URL latet-0.9.1.tar.gz
Size 41.9 MB
Tags Source
SHA-256 checksum
How to use checksums
4c4a6842f232d73ae002d4c302af54c2f4bceb6b010f7e29b9c67270ab7b2bbe
BLAKE2b-256 checksum
How to use checksums
2dfc55874d0a998552fd26a4aafaabba656cf354fe74023976df876b68421caf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

Release files / latet-0.9.1-py3-none-any.whl

Download URL latet-0.9.1-py3-none-any.whl
Size 15.7 MB
Tags Python 3
SHA-256 checksum
How to use checksums
6fc62e98228346f96fd09974c65171ed2e8d5b375bc39ac71e6371a0ef4dab56
BLAKE2b-256 checksum
How to use checksums
b1d9eee65d7d069def3f119e7e07e760089bdb830c3b8e809bc6a423bddd31d2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

Security for latet 0.9.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for latet-0.9.1.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page