ftask
A human-in-the-loop task inbox for AI coding agents (Claude Code, Codex, Cursor, scripts, anything that can run a shell command).
Agents cannot pay, verify an ID, pass a CAPTCHA or click through a cloud console. When they hit one of those walls they usually write a paragraph in chat and stall. With ftask the agent instead drops a task in your inbox with the exact steps: the text to paste (with a Copy button), the exact link to open, files to download, files it needs back from you. You tick through it in a browser; the moment you press Done, the agent is woken up and carries on.
agent: ftask add --project Website --title "Renew the domain" --key website/renew-domain \
--step "Open the registrar" --link https://registrar.example.com/domains \
--step "Enter this coupon at checkout" --value "RENEW-2026"
agent: ftask wait website/renew-domain --for done # runs in the background; exits when you click Done
you: http://localhost:4747 -> copy, click, pay, "Mark done"
agent: wakes up, reads your note, continues
Local first: one SQLite file, Python standard library only (no dependencies), no account, no cloud, no telemetry.
60-second quickstart
pipx install ftask # or: uv tool install ftask
ftask serve --open # the board, at http://localhost:4747 (leave it running)
ftask snippet >> AGENTS.md # teach your agent to use it (use CLAUDE.md for Claude Code)
Try it without an agent:
ftask add --project Demo --title "Say hello" --minutes 1 --key demo/hello \
--step "Copy this" --value "hello from the human" --step "Press Mark done"
ftask wait demo/hello --for done # blocks here; now click "Mark done" in the browser
Requires Python 3.9+ on Linux or macOS. (Windows is not supported yet.)
What an agent can do
| Need | Command |
|---|---|
| Hand over a job with exact values and links | ftask add --step "..." --value "..." --link URL |
| Update the same task instead of duplicating it | re-run ftask add with the same --key |
| Give you a file (invoice, installer, export) | ftask attach KEY ./file.pdf (Download button plus the full path to paste into file pickers) |
| Ask you for a file (screen recording, CSV) | ftask add ... --step "Record it" --upload --accept "video/*", then ftask files KEY --json |
| Be told when you are done | ftask wait KEY --for done as a background command; --for any also reports notes, uploads and ticked steps |
| Read your reply | ftask notes --since 1d, ftask show KEY |
| Mark itself blocked on a third party | --waiting-on "App store review" |
Everything is also available as JSON (--json) and every command works from a script or cron job.
Set up your agent
ftask snippet prints ready-made instructions (also in ftask/AGENTS-SNIPPET.md). Append them to the
AGENTS.md (Codex and most other agents) or CLAUDE.md (Claude Code) of any project, or to your global
~/.claude/CLAUDE.md.
For Claude Code, let it run the CLI without asking each time, in .claude/settings.json:
{ "permissions": { "allow": ["Bash(ftask *)"] } }
The agent should start ftask wait with the Bash tool's run_in_background option; Claude Code then notifies the session
when the command exits, which is when you click Done.
Notifications
- Agent side:
ftask wait(above). Exit code 124 on--timeout; it prints acursor:so the next wait misses nothing. - Human side: drop executables in
on-done,on-note,on-uploadoron-anyin the hooks directory (below) to get a desktop notification, a message to a webhook, anything. A ready example for Linuxnotify-sendand macOS is indocs/hooks/on-any.example.
Keep it running
ftask serve is all you need. To start it at login:
ftask service install --print # show the systemd user unit (Linux) or launchd agent (macOS); change nothing
ftask service install # write it and start it
ftask service status
ftask service uninstall
Where things live
| Linux | macOS | |
|---|---|---|
| Database, uploaded and attached files, hook log | ~/.local/share/ftask/ ($XDG_DATA_HOME) |
~/Library/Application Support/ftask/ |
| Hooks | ~/.config/ftask/hooks/ ($XDG_CONFIG_HOME) |
~/Library/Application Support/ftask/hooks/ |
FTASK_DB=/path/tasks.db (or --db) points anywhere else. ftask path prints the database path; ftask backup DEST takes a
consistent copy.
Security
There is no login, so the board binds 127.0.0.1 only and refuses foreign Host headers (DNS rebinding), cross-origin or
token-less writes, and path traversal in uploads. Do not put it on a network. Tasks can only be created through the CLI, never
over HTTP. --notify-cmd and hooks run shell commands as your user, so only your own agents should set them. Details in
docs/REFERENCE.md.
More
- docs/REFERENCE.md: every command, the data model, files, hooks, the JSON API, backup.
ftask --help,ftask <command> --help: examples for each command.- Tests:
python3 -m unittest discover -s tests(about a minute; uses temporary databases only).
How it compares
ftask is a task list for a human, not an approval gate. If you only want "allow / deny this tool call" on your phone, Claude Code's own notification hooks, ntfy-based approvers or a phone app will do that with less setup. ftask is for the jobs that take several steps outside the terminal, with values to paste and files going each way, where the agent needs to know when you finished. It has no phone push yet.
Licence
MIT. Copyright TurboKast Ltd.
Metadata
Release files for ftask 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| ftask-0.1.0.tar.gz | 77.3 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ftask-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 138.2 kB
Release files / ftask-0.1.0.tar.gz
| Download URL | ftask-0.1.0.tar.gz |
|---|---|
| Size | 77.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e686434e49e25ed3a0c00d88417e64f344bb0bc91492548389d594ebcc37ae1b
|
|
BLAKE2b-256 checksum How to use checksums |
01c60ea42f8c0984c131fe158c8baa574aa63ac890616102cd1d9f79a19312aa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.25
|
Release files / ftask-0.1.0-py3-none-any.whl
| Download URL | ftask-0.1.0-py3-none-any.whl |
|---|---|
| Size | 60.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d61a250c6386e35470d877bbb82ad596e51535c8ea37562a6ca97f2e0335ddd1
|
|
BLAKE2b-256 checksum How to use checksums |
c361860c15303785bdfeb0540516ed06d6b54ab374e8367f4ee4451bcee23e29
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.25
|
Security for ftask 0.1.0
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
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.
To learn more about protecting yourself from malicious actors, visit our package security documentation.