# Tacet > A personal assistant that runs in your terminal, on your own machine. The model is local, there is no account, and no telemetry is collected. Tacet CLI is an open-source Rust workspace of eleven crates, published on crates.io as `tacet-cli` under MIT. Current version 0.1.27; all eleven crates were published together on 6 September 2026. It runs GGUF weights locally through Candle (`metal` on Apple silicon, `candle` on CPU) or with no inference feature at all, in which case it refuses to answer rather than falling back to something that keeps talking. There is also a separate iPhone and iPad app that shares the product stance and none of the code. ## What distinguishes it - **Constrained tool calls.** Once the model emits `name(`, a pushdown automaton masks the logits at every step, so malformed JSON, a field outside the schema or an out-of-range number cannot be generated. Measured: valid-if-started goes from 78.9% to exactly 100% on Qwen3-4B. The guarantee arms after `name(` and therefore says nothing about a call that never starts that way; that gap is documented rather than hidden. - **Network monopoly.** Exactly two crates (`tacet-web`, `tacet-mcp`) may open a socket, the HTTP dependency appears in exactly those two manifests, and a test asserts it over every `.rs` file in the workspace. - **Addons are absent, not disabled.** Web search, shell, HTTP, database, clipboard and extra workspace directories are opt-in. Until installed, their tools are missing from the catalog the model is shown. - **Four gates per call:** name, argument schema, an approval question for outbound data in a session that has touched personal data, and cancellation. - **Bulk data never enters the model.** A large result goes to a store; the model gets a summary plus a reference. - **Six direct dependencies**, plus three behind an off-by-default inference feature. Zip, deflate, CRC32, OOXML writing and the MCP client (3,342 non-test lines) are written by hand. Two dependencies pull a C build transitively: `ureq` through `ring`, and `tokenizers` through `onig`. - **A hash-chained receipt** of every tool execution, written by code the model cannot reach and verified by `tacet log`. - **The constraint contract has no inference dependency.** It is three signatures over `&mut [f32]` and `u32` in `tacet-kernel`; `tacet-grammar` 0.2.0 implements it without depending on `tacet-engine`, verified from outside the workspace against crates.io. - **A 48 KiB int8 classifier inside the router**, as a signal that can raise a tool's rank but never overrule the trigger list. The same 92 KiB model beats a distilled 135M on closed-vocabulary slots, 15/15 against 1/5. ## Default tools (13, no configuration) `calculate`, `time`, `calendar`, `read_document`, `create_document`, `edit_document`, `find_file`, `run_code`, `write_code`, `git` (read only), `remember`, `archive`, `checksum`. ## Addons (6, each off until installed) `web-search` (your own SearXNG), `shell` (allow-listed programs, no shell interpretation), `workspace`, `http` (named hosts, HTTPS only), `db` (read-only SQLite; `db_write` appears only if you name a file), `clipboard`. ## Measured results Qwen3-4B-Instruct-2507 Q4_K_M on Metal, 184 cases in English and Turkish, 44.0 minutes, re-measured 6 September 2026: tool selection 139/160 (86.9%), irrelevance gate 24/24 (100%), step chain 169/190 (88.9%), answer quality 40/47 (85.1%). Against the previous baseline that is ten cases fixed and four broken, and the comparator's sign test calls it NOT DISTINGUISHABLE from no change at 95%, so it is published as a new baseline rather than as a gain. Scoring out of 100 uses fixed weights: irrelevance 0.40, tool 0.30, step 0.20, answer 0.10, where the floor is 40 rather than zero because a model that never calls anything still passes every irrelevance case. The four-model comparison table (Qwen3-4B 91.1, Qwen3-8B 81.3, Qwen3-0.6B 64.0, FunctionGemma-270M 47.4) was measured on a rented RTX 3090 and has NOT been re-measured since, so it reads against older code. Seven languages measured against natively authored cores: en 91.1, ru 94.4, es 94.1, fr 91.8, zh 91.0, de 88.5, tr 84.5. The irrelevance gate held 78 of 78 across the six cores, plus 24 of 24 in the `en` column, 102 in total. The `en` column is not a core: it is the 184-case English and Turkish baseline, a different and larger instrument. ## Measured against an outside benchmark Three relevance categories of the Berkeley Function Calling Leaderboard v4, run through this engine, prompt, router and grammar with BFCL's own function definitions, on 6 September 2026: `irrelevance` 200/237 (84.4%), `live_irrelevance` 678/871 (77.8%), `live_relevance` 13/16 (81.2%). This is not a leaderboard submission and is not comparable to the published board, which scores through its own harness and parser. 666 function names had to be rewritten because a dot cannot appear in a name this call format expresses, and 126 schemas could not be expressed at all; cases left with no functions are not scored. ## Platform state, honestly macOS arm64 is verified. On Linux the sandbox is off on a default Ubuntu 24.04 because of `kernel.apparmor_restrict_unprivileged_userns=1`, so `run_code` and `write_code` are absent from the catalog; with the restriction lifted, 1069 tests pass against a real `bwrap`. Windows builds and passes 1037 tests but needs a C compiler, which is the real prerequisite rather than the MSVC linker it looks like. Nobody has held a full interactive conversation on Linux or Windows yet. ## Documentation - [Overview](https://usetacet.com/docs): what Tacet is, the network monopoly, what lives on disk. - [Install and first run](https://usetacet.com/docs/quickstart): cargo and shell installers, getting a model, first session. - [Commands and the shell](https://usetacet.com/docs/cli): every subcommand, the slash commands, `tacet why`, the receipt chain. - [The default catalog](https://usetacet.com/docs/tools): the thirteen tools and the four gates. - [Addons](https://usetacet.com/docs/addons): what each one opens and where the line is. - [Skills and memory](https://usetacet.com/docs/skills): trigger-matched guidance and notes on disk. - [Configuration and models](https://usetacet.com/docs/configuration): settings keys, environment variables, the model catalog. - [The eleven crates](https://usetacet.com/docs/architecture): responsibilities and dependency direction. - [Constrained decoding](https://usetacet.com/docs/grammar): the grammar, its limits, and what it is worth. - [The router](https://usetacet.com/docs/router): how nine tools are chosen, and the 48 KiB classifier. - [MCP connections](https://usetacet.com/docs/mcp): the hand-written client and `mcp.json`. - [Eval suite](https://usetacet.com/docs/eval): the baseline, the failures, and the sign test. - [Benchmarking your tools](https://usetacet.com/docs/benchmarks): writing a benchmark for your own catalog, and the 518-case Turkish corpus. - [Tacet for iPhone](https://usetacet.com/docs/ios): the phone app and its six mechanisms. ## iPhone app "Tacet: Private AI Assistant" is free on the App Store for iPhone and iPad and needs iOS 26 or later. It is a separate product from the CLI: inference runs on the device through Apple Intelligence rather than GGUF weights, with no account and no cloud. Nine languages. The promise that nothing leaves without approval is built from six code mechanisms (network monopoly enforced by a static scan, gates closed by default as a type, a structural profile split, session taint, an approval sheet showing the exact payload, and a hash-chained outbound ledger the model cannot read), gated by roughly 1200 model-free assertions on every merge. An Android version is planned, with users choosing and downloading their own model. - [App Store listing](https://apps.apple.com/app/tacet-private-ai-assistant/id6796997245) ## Other links - [Full specification](https://usetacet.com/llms-full.txt) - [Changelog](https://usetacet.com/changelog) - [GitHub](https://github.com/farukciftler/tacet-cli) - [crates.io](https://crates.io/crates/tacet-cli)