Privacy Policy
Last updated: 25 July 2026
1. The short version
- What leaves your machine is metadata, not terminal output: session, tab and pane names — or nothing, where you redacted them — plus change fingerprints.
- Redaction happens in the plugin, on your machine, before anything is sent. It fails closed.
- Pane contents are never stored. The optional peek is relayed through memory to your own screen and dropped.
- No history: the backend keeps the latest snapshot and the current attentions, nothing older.
- No analytics, no advertising, no third-party scripts, no payment data of any kind.
2. Who this covers
This policy covers the hosted instance at zantiflow.com, operated by Ioan Biticu, together with the notification bots run alongside it. For questions or requests, email ioanb7code@gmail.com.
zantiflow is open source and designed to be self-hosted. If you run your own instance, it is yours: you are the operator and the data controller for it, this policy does not apply to it, and no data from it reaches me.
3. What your machine sends
While the Zellij plugin is running it pushes a snapshot roughly once per second (less often on the free tier, when nothing is changing). Each snapshot contains:
- A machine identity — your real hostname only if you opted in, otherwise an alias you choose, or nothing at all.
- The session → tab → pane tree, with each name or
nullwhere you redacted it. Redacted names never leave the plugin; the dashboard renders<hidden>. - Per-pane change fingerprints — a salted hash of a bounded slice of the pane, used only to tell that something changed. The slice itself is not sent.
- A per-pane flag for whether it looks like a Claude Code session, so the dashboard can tell you when an agent is waiting on you.
Redaction is configured on your machine and fails closed: a setting the plugin cannot parse redacts more, never less. The privacy documentation describes the wire format field by field, and the source is public.
4. What never leaves your machine
Raw terminal output is not sent — with one deliberate, opt-in exception. Pane output is off by default. When you enable it and click a pane in the dashboard, the plugin captures the last ≤50 lines, scrubs known secret shapes locally, and sends only that.
Even then it is never written to the database: it is held in the backend’s memory just long enough for your own browser to read it once, then dropped. The dashboard escapes markup, so captured output can never execute as HTML.
5. What is stored, and for how long
- Your account
- From Google sign-in: your Google account id, email, display name and avatar URL, plus your tier. That is the entire profile — the scope requested is the minimum one (openid email profile).
- Ingest tokens
- Stored as a SHA-256 hash plus a short lookup prefix — the token itself is never stored, which is why it can only be shown to you once. Label, expiry and last-used time are kept so you can manage them.
- Machines and snapshots
- The latest snapshot per session, replaced on every push rather than appended, plus first/last-seen times. Sessions that stop reporting are excluded from reads and swept away. There is no history table.
- Attentions
- The current state of each detector (needs input, idle, stopped, offline) — current only, cleared when the condition ends.
- Notifications
- The text of a notification and one delivery row per channel, so a restart cannot lose one. A cron prunes them after a few hours (6 by default).
- Notification channels
- If you enable browser push: the push endpoint and its encryption keys. If you link Discord or Telegram: that platform user id and username. Linking codes are stored hashed.
- Pairing and promo codes
- A hashed pairing code while a device pairing is in flight, and a record that a promo code was redeemed by your account.
Retention is latest-only by design. There is no analytics store, no event log of your activity, and no archive of past sessions.
6. Cookies and browser storage
The site sets exactly one cookie, and only after you sign in:
- ztf_session
- A signed session cookie. httpOnly (page scripts cannot read it), SameSite=Lax, Secure in production, and valid for 14 days by default. Signing out everywhere invalidates every outstanding copy at once.
Your browser also keeps a few purely local preferences — the light/dark theme and your dashboard sort/filter choices. They never leave your device.
There are no advertising cookies, no analytics, and no third-party scripts: even the fonts are served from this origin, bundled at build time. That is why you are not being asked to accept cookies — there is nothing optional to accept.
7. Third parties
- Google — sign-in only. Google tells zantiflow your account id, email, name and avatar; zantiflow tells Google nothing about your machines.
- Your browser’s push service (Google, Mozilla or Apple, depending on the browser) — if you enable push notifications, it relays them to your device.
- Discord / Telegram — only if you link them, and only to send you the notifications you asked for as a direct message.
- Hosting infrastructure — the servers the service runs on.
Notification text can include a pane or session name, so a name you chose not to redact may reach the channel you linked. Redaction applies before that point, not after.
8. Logs and security
- Ordinary operational logs are kept to run and debug the service. The logger redacts authorization headers, cookies, tokens and secrets, so credentials do not land in them.
- Requests are rate-limited to keep a small deployment available, and every query is scoped to the signed-in account at the data layer so one account cannot read another’s machines.
- Ingest tokens are write-only: a token can push snapshots, and can never read your dashboard.
9. What you can do yourself
- Stop sending — quit the plugin, or redact anything you do not want transmitted. Nothing is collected while it is not running.
- Revoke an ingest token, which stops that machine pushing immediately.
- Delete a machine and the snapshots stored for it.
- Unlink Discord or Telegram, and turn browser push off.
- Sign out everywhere, invalidating every existing session.
Account deletion is by request — there is no self-serve button yet. Email ioanb7code@gmail.com and I will delete your account and its rows.
10. Your rights
Depending on where you live you may have rights to access, correct, export, or delete your personal data, or object to its processing. Most of what zantiflow holds is short-lived by construction — there is no history to retrieve — but for anything you believe is held, email ioanb7code@gmail.com and I will action it.
11. Children
zantiflow is a developer tool, is not directed at children, and I do not knowingly collect data from anyone under 16.
12. Changes
If zantiflow starts handling data differently, this page changes with it and the “Last updated” date moves. The project is open source, so every such change is visible in its history as well as here.