What's new: pass files between steps, and a new docs site
Here's what changed in Callables this week: multi-step processes got much easier to run, the docs have a new home, and a few problems with files on deployed functions are fixed. The new features are in version 0.2.0 of the Python SDK.
Pass files between steps
A lot of real work is a chain of spreadsheets. One step exports a list, the next cleans it, the next enriches it. Until now, the person running it had to download the file from each step and upload it to the next.
Now the file moves on its own. If a function returns a file and its next action takes one, Callables passes it along:
from typing import Annotated
from callables import File, accept, deploy
Sheet = Annotated[File, accept(".csv")]
@deploy(title="2. Verify websites")
def verify_websites(sheet: Sheet) -> File:
...
@deploy(title="1. Find prospects", next=[verify_websites])
def find_prospects(town: str) -> File:
...
return File("/tmp/prospects.csv", name="prospects.csv")There's nothing to map. Step 1 returns a file and step 2 takes one, so that's the connection. Your teammate runs step 1, clicks 2. Verify websites, and the form opens with prospects.csv already attached. If they need to edit the file first, they can download it and upload their own version instead.
It works the same in the terminal: call find_prospects --town Leeds offers the next step when it finishes, and passes the file along.
See passing a file to the next step for the details.
Next actions on every result
Next actions used to appear only on tables and single records. Now every result can offer them, including text and files, as Next buttons under the result. Tables and records still get a button on each row, with the row's values filled in.
So if a result says "now run step 2", make it a real button. Add next= and people can click it instead of going to find the step themselves.
A new docs site
The docs now live at callables.app/docs, with a quickstart, a reference for @deploy, inputs and results, and pages on secrets, schedules, sharing, builds and limits.
They're also written for coding agents. Add .md to any docs URL to get the page as Markdown, and /llms.txt lists every page. call init points your project's AGENTS.md at them, and call check now warns when a next action needs a file that nothing hands it. See coding agents for how to set up Claude Code, Cursor or Codex.
Fixes
- Saved files on deployed functions. Files a function saved could go missing after a run. They now appear in the run's Files section.
- Downloads. Download links now work, and files save straight to your computer.
- Bigger plans on smaller machines. Runs no longer fail with a sandbox error when a plan allows more CPUs than the machine has.
One new limit: a run is now stopped as soon as it saves more than 100 MB or 1,000 files and folders, so one run can't fill a machine's disk. See limits.
Upgrade
pip install -U callables
call initRunning call init again refreshes the instructions your coding agent reads. To use file hand-offs, return the file from your function and add next=. If you used to return a text summary, print() it instead: it shows in the run's logs.
The SDK is also now open source under the Apache-2.0 license.
Turn your scripts into tools your team can run
Add @deploy to a Python function and push. Your team gets a form, schedules and run history.
Keep reading
How to share a Python script that runs as each user
Some scripts should use a shared company key. Others should act as the person running them, on their own inbox or calendar. How to build and share the second kind without handling anyone's password or token.
GuidesHow to test OAuth connections locally
Sign in to Gmail, Slack or any OAuth service from your terminal with call connect, then run your functions against your own account before you push.
EngineeringStop paying for an idle server to run Python scripts
We moved a Python scraping pipeline off a VPS that sat idle most of the day. Now it runs only when someone starts a step, with no server, SSH or cron to look after.
