Security Policy
August 24, 2026 · View on GitHub
Reporting a vulnerability
Please do not open a public issue for a security problem. Use GitHub's private vulnerability reporting — it goes only to the maintainers.
Please include what you were running (version, OS, Python), what you did, and what happened. You'll get a first response within a week, and credit in the release notes when a fix ships unless you'd rather stay anonymous.
Supported: the latest release on master. There are no backported security fixes for
older versions while the project is pre-1.0.
What Taskuary is, security-wise
Taskuary is a local-first, single-user application. It binds to 127.0.0.1 and has
no authentication by default, because it assumes the only person who can reach that port
is the person sitting at the machine. That assumption is the whole security model — the
notes below are what follows from it.
- Don't expose it to a network you don't trust. If you must reach it from elsewhere,
set
[server].tokenin~/.taskuary/config.toml(orTASKUARY_TOKENin Docker) and send it as theX-Taskuary-Tokenheader (and put it behind TLS you control). The token gate is a lock on a door, not a hardened perimeter./api/healthstays open on purpose so a container HEALTHCHECK can pulse the process without the token. - Docker still assumes localhost.
docker composepublishes127.0.0.1:7787; the process inside listens on0.0.0.0only so Docker can reach it. Changing the publish bind to0.0.0.0:7787(LAN) is the same as a local install with[server].host = "0.0.0.0"— set a token first. - The API executes things by design. Reports run SQL and PowerShell,
/api/tools/runruns a connector's query or script, agent dispatch runs your configured CLI, and the terminal opens a real shell — all with your credentials, on your machine. Anyone who can reach the API can do those things./api/tools/runstill refuses a catalog connection that is off or not marked tool (cards are seeded on first launch, so "never connected" is not the same as "no row"). - Credentials are stored locally in plaintext in
~/.taskuary/taskuary.dbandconfig.toml. They are write-only through the UI (never returned to the browser), but the files themselves are only as protected as your user account and disk encryption. - Agents act with your permissions. A CLI agent configured with an auto-approve flag will edit files, run commands, and push to repos without asking. Scope its PAT and working directories to what you actually want it to touch.
- AI triage sends message content to whichever AI you connect (an API provider, or your local CLI agent). Nothing leaves the machine until you connect one.
Good hygiene
- Give GitHub PATs the narrowest repository access and permission set that works.
- Keep
~/.taskuary/out of backups that sync somewhere you don't control. - Attachment URLs only serve files under
~/.taskuary/attachments/— aPaththat escaped that folder is a 404. SVG/HTML always download; they are not rendered as a document on the app origin. - Read
~/.taskuary/taskuary.logand the in-app audit log (Settings → Audit integrity — it's a hash chain) if you want to know what ran and when.