Tap to talk
Describe it. Hand it off. It runs.Hand off Gmail.
You describe a recurring chore in a sentence. It becomes a scheduled workflow on the Strands Agents SDK that runs unattended and stops to ask you only about the things it genuinely cannot judge. Your answer becomes a rule, so it asks less next time.
Set up in one command.
Python 3.12 and a terminal. The whole loop runs offline first — no keys, no account — then you add one key and it thinks for real.
Clone and install
The extras add the Groq provider, the native window and a credential-free web-fetch server.
git clone https://github.com/LSUDOKO/Handoff && cd Handoffpython3.12 -m venv .venv && source .venv/bin/activatepip install -e ".[dev,groq,desktop,web]"Configure and check
The defaults run offline. Every line doctor prints is the result of a real call, with the fix beside any failure.
cp .env.example .envhandoff doctorRun it
The demo is the whole loop on a scripted model: it works the inbox, asks about three items, and on the second run asks about none.
make demohandoff serveThen open http://localhost:8000, press Run now, and watch the feed.
Install with the desktop extra
One Python environment, no Electron, no bundler.
pip install -e ".[groq,desktop,web]"Open the window
WebKitGTK on Linux, WebKit on macOS, WebView2 on Windows. It remembers its size and its page, and opens on Talk once onboarding is done.
handoff desktopTalk to it
Ctrl+Space starts listening from any page. The voice extra records natively when the webview refuses the microphone.
pip install -e ".[voice]"Build the image AgentCore runs
AgentCore Runtime requires linux/arm64. On an x86 machine, install QEMU once.
docker run --privileged --rm tonistiigi/binfmt --install arm64make dockerRun it locally
The container is the AgentCore Runtime entrypoint. It serves invocations on port 8080 and keeps its state in the container unless USE_DYNAMODB is on.
docker run --rm -p 8080:8080 --env-file .env handoff:latestOr push it
Builds, pushes to ECR and launches the runtime through the control-plane API, then smoke-tests it.
python infra/deploy_agentcore.pyPreflight
Names everything that is missing and stops. Set USE_DYNAMODB=true and USE_AGENTCORE_MEMORY=true in .env first — the runtime reads them at launch.
pip install -e ".[bedrock,agentcore]"python infra/deploy_agentcore.py --checkStorage, memory, runtime
One DynamoDB table partitioned by collection; an AgentCore Memory store for learned rules; the runtime itself, waited on until READY.
python infra/dynamodb_setup.pypython infra/memory_setup.pypython infra/deploy_agentcore.pyCron in the cloud
EventBridge Scheduler cannot target AgentCore directly, so a twelve-line Lambda forwards each tick. One schedule per active cron workflow.
python infra/iam_setup.pypython infra/lambda_setup.py --runtime-arn <runtime-arn>python infra/eventbridge_setup.py --target-arn <lambda-arn> --role-arn <role-arn>Handoff
for
-
Every weekday at eight: real asks from teammates become Linear tickets, newsletters get archived, your manager gets a draft reply. It asks about the one email it cannot place — and the next morning, it doesn't.
-
Open pull requests you were asked to review. Small, well-described ones from teammates get a first-pass comment drafted; anything touching auth, billing or migrations is flagged to you before a word is left.
-
Every Monday it reads the pricing page through a credential-free fetch server. Nothing moved, nothing said. Something moved, a summary lands in #competitive-intel — and it asks before posting anything that reads as a strategic call.
-
After a meeting ends: pull the commitments out of the notes, file yours as tickets, draft a short recap to attendees. Anything going to people outside the company waits for you.
-
Custom agents with allow-listed tools and skills, runnable from a workbench with a credential preflight. MCP servers you can probe and call live. A run inspector with every model turn, every tool call and its cost.
-
Describe the chore in a sentence. The trigger, the integrations and the line between what it may do alone and what it must ask about are written for you, as a config you can read and version.
A decision. Not a notification.
Unsure items are set aside, not interrupted on. When the pass is done it asks about all of them at once: the item, why it stopped, how sure it was against the threshold, and the options. Answer on the screen, in chat, out loud, or from a terminal — the run picks up where it left off.










Works with the tools you already have, over MCP where one exists.
Hand it off.
One sentence, one schedule, one screen when it needs you. Runs on your machine, in a desktop window, or on Amazon Bedrock AgentCore. Open source under Apache-2.0.