Skip to main content

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.

The ftask board: a task with three steps, a Copy button next to the value, and Mark done

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 a cursor: so the next wait misses nothing.
  • Human side: drop executables in on-done, on-note, on-upload or on-any in the hooks directory (below) to get a desktop notification, a message to a webhook, anything. A ready example for Linux notify-send and macOS is in docs/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)

Source distribution for ftask 0.1.0
File Size Uploaded Provenance
ftask-0.1.0.tar.gz 77.3 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for ftask 0.1.0
File Interpreter ABI Platform
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.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page