Storage and privacy #
Tabslip keeps records on your machine. By default these contain metadata and hashes, without prompt or answer text. There is no telemetry.
What is stored #
Receipts keep metadata about each call, including the model name and usage. They also keep SHA-256 hashes of the bodies. The receipt fields page lists what they contain. This metadata can reveal information about your work even without content. A hash can be compared with a known body; it is not encryption. Headers containing credentials never enter the database or logs. Provider error messages are excluded from receipt metadata; error types and codes can remain.
Optional content storage uses a separate local table. Enable it in Setup
for all calls or selected tags, or start with --keep-content. The header
shows "Content: not stored", "Content: stored for all calls", or the selected
tags. Changes apply to calls that start afterward. A startup flag locks its
corresponding page setting. Stored request and response content is capped
at 10 MiB per body and may include sensitive text, including provider errors.
Streaming response content is assembled answer text; JSON content is the raw body.
Receipt downloads, signed bundles, CSV, JSONL and HTML exports never contain stored prompt or answer text. Content is readable only through the local page.
Files and retention #
| OS | Default config | Default data directory |
|---|---|---|
| Linux | $XDG_CONFIG_HOME/tabslip/config.yaml, else ~/.config/tabslip/config.yaml |
$XDG_DATA_HOME/tabslip, else ~/.local/share/tabslip |
| macOS | ~/Library/Application Support/tabslip/config.yaml |
~/Library/Application Support/tabslip |
| Windows | %AppData%\tabslip\config.yaml |
%LocalAppData%\tabslip |
Config selection is --config, then TABSLIP_CONFIG, then the OS default. A
missing selected file uses defaults and produces a warning in serve or a
config warning in doctor. An absent OS-default file is normal on first run.
--data-dir overrides the data location. The database is tabslip.db; SQLite
also creates WAL files while running. The signing keys are key.ed25519 and
key.pub. Downloaded price snapshots are kept in the same directory. Keep the
private key and database together in backups. Read-only commands do not create
state or apply retention.
Retention defaults to 90 days. It deletes old receipts, supplements and
content at startup and daily. Saving retention in Setup applies it immediately;
retention_days: 0 keeps records indefinitely. Delete on a receipt page removes
that call and related rows from this instance, without affecting exported
copies. Database row deletion is not a secure disk erasure guarantee.
The demo uses a separate temporary directory and embedded prices. Ctrl+C removes temporary demo data; an explicit demo data directory remains.
Network contacts #
Calls contact the configured upstream with the client's credentials.
OpenRouter generation lookups use the same authorization in memory after
the call; disable them with enrich_openrouter: false. Doctor sends key-free
GETs to upstream roots, with five-second timeouts, and checks loopback health.
Any HTTP answer establishes reachability, without validating credentials.
tabslip prices update downloads LiteLLM's public price file explicitly.
Server startup and ordinary read commands do not download prices. The shell
installer downloads binaries and checksums from GitHub. The page has no CDN,
web fonts or external resource requests, and the demo makes no external requests.
Pages, downloads, events and settings accept loopback connections and local
Host headers only. State changes require a same-origin POST and page token.
Proxy routes follow --listen; they forward credentials without added
proxy authentication. See network access and the
command reference.