fcloud
Python SDK and CLI for the fcloud GPU compute platform: provision GPU or CPU hosts, run commands and scripts on them, keep a persistent workspace between runs, move files in and out, and drive long-running or batch jobs — from a terminal, from Python, or from an AI coding agent.
Requires Python 3.10+.
Install
pip install fcloud-sdk
Setup
Create an account on https://fcloud-home.vercel.app. Enter a credit card. and copy your API key.
fcloud setup # prompts for the key; optionally installs the agent skill
fcloud health # verify connectivity
fcloud setup --agents all also installs the fcloud skill file for supported
coding agents (Cursor, Claude Code, Codex) so an agent can drive fcloud for you.
Use --agents none to skip that.
Quick start
# Run a one-off command on a GPU
fcloud exec --sku gpu_1x_l4 nvidia-smi -L
# Upload a script and run it
fcloud run train.py --sku gpu_1x_l4
# Upload a project directory, run one script in it, pass arguments through
fcloud run . --script train.py --sku gpu_1x_l4 -- --epochs 50
# See what hardware is available
fcloud skus
fcloud run <dir> uploads the whole directory. Keep secrets, virtualenvs and
large data out of the tree you point it at.
How the pieces fit
- session — a persistent
/workspacefilesystem, not a held GPU. It costs nothing until used;exec/run/shell/uploadbring it online with its files intact, andfcloud stophalts spend but keeps the files. Address an existing one with--on <SID>. - volume — a named folder you mount into a session with
--volume; this is how data moves between sessions. Writes commit back as a new version when the session detaches or closes. - process — work running inside a session.
exec/runwait in the foreground;spawnreturns a process id you thenwait/logs/kill. - job — a run-to-completion session with no saved filesystem; its durable outputs are its volumes and its logs.
- sweep —
fcloud mapfans one command out over many argument bindings as a durable batch you inspect withfcloud sweep.
CLI
fcloud help prints the full grouped list; fcloud help <command> prints details.
Find hardware
fcloud skus List SKUs and prices
fcloud health Check API connectivity
Run code
fcloud exec [--sku SKU] [--on SID] <cmd...> Run a command on a host
fcloud run <file|dir> [--sku SKU] [--on SID] Upload and run a script
fcloud shell [--sku SKU] [--on SID] [--volume NAME] Interactive shell
fcloud ssh <SID> SSH into a session
fcloud tunnel <SID> [--port PORT] SSH ProxyCommand tunnel
Background processes (inside a session)
fcloud spawn --on SID <cmd...> Start a background process
fcloud wait <SID> <PID> [--timeout DUR] Wait for it; exit with its code
fcloud logs <SID> [PID] [--follow] Show process output
fcloud kill <SID> <PID> Kill it
Sessions (the persistent filesystem)
fcloud create [--sku SKU] [--min-disk-gb N] Create a session ($0 until used)
fcloud sessions [SID] [--all] [--limit N] List sessions
fcloud history <SID> [--limit N] Session event history
fcloud stop <SID> Stop now (files kept)
Files
fcloud upload [--on SID] <local> [remote] Upload files
fcloud download [--on SID] <remote> [local] Download a file
fcloud ls <SID> [path] List a session's files
fcloud mount <SID> <mountpoint> Mount session files read-only (needs rclone)
Volumes (data that outlives a session)
fcloud volume <create|list|files|download|cat|import|delete> ...
Batch
fcloud job <run|ls|logs|wait|kill> ... Run-to-completion jobs
fcloud map [--sku SKU] -- <cmd {}> ::: v1,v2... Fan a command out over bindings
fcloud sweeps / fcloud sweep <status|logs|retry|cancel|wait> <name>
Setup
fcloud setup [--token KEY] [--agents all|cursor|claude|codex|none]
fcloud set_token <api-key>
fcloud --version
All commands accept --json for machine-readable output.
fcloud exec returns bounded stdout by default. If --json reports
stdout_truncated: true, fetch the full log instead of rerunning:
fcloud logs <session-id> <process-id> --output all
fcloud logs <session-id> <process-id> --stream stderr --output all
Python SDK
import fcloud
client = fcloud.Client()
image = fcloud.Image.debian_slim().pip_install(["torch", "numpy"])
project = client.project("my-run", image=image)
with project.session(sku="gpu_1x_l4") as s:
s.upload("./data", "data/")
result = s.run(["python3", "/workspace/data/train.py"])
print(result.stdout)
if result.stdout_truncated:
print(s.logs(result.process_id, output_range="all").output)
weights = s.download("model.pt")
Errors raise fcloud.FcloudError (or a subclass such as PaymentOverdueError).
Configuration
API key, in order of precedence:
api_key=passed toClient()FCLOUD_API_KEYexported in the shell- Saved token in
~/.fcloud/token(fromfcloud setup/fcloud set_token) FCLOUD_API_KEYin the nearest.envfile (searched upward from the cwd)
API URL, in order of precedence:
url=passed toClient()FCLOUD_URLexported in the shell- Saved URL in
~/.fcloud/url FCLOUD_URLin the nearest.env— only honoured when that same.envis also supplying the API key, so a checked-out repo can't redirect a saved token elsewherehttps://fcloud-dispatcher.fly.dev
Other environment switches:
| Variable | Effect |
|---|---|
FCLOUD_QUIET=1 |
Suppress "still waiting" progress lines while a host is provisioned |
FCLOUD_QUEUE_TIMEOUT=<seconds> |
How long to wait for capacity before giving up (default 1200) |
FCLOUD_MIGRATE_RESTART=never |
Don't automatically re-run a command after a host rebuild (default auto) |
FCLOUD_INSECURE_HTTP=1 |
Allow a plaintext http:// API URL to a non-loopback host (refused by default — the API key would travel unencrypted). Loopback URLs never need this |
FCLOUD_TELEMETRY=0 |
Disable all client telemetry. When enabled (the default), the client reports failures the backend cannot otherwise see — an uncaught CLI error, a queue-wait timeout, exhausted connect retries — as a fixed-allowlist payload (session id, event type, error class, truncated message, SKU/timing fields); never file contents, paths from OS errors, or credentials |
A fcloud.json at the project root can set defaults (image build steps, default
volumes). Note that fcloud will run the build steps it finds there, so treat a
cloned repo's fcloud.json the way you would its Dockerfile.
Agent skill
fcloud setup --agents all installs SKILL.md for supported coding agents. It
is the long-form, agent-oriented guide: workflow patterns, monitoring loops,
and anti-patterns.
Development
pip install -e ".[dev]"
pytest
ruff check src tests
License
Apache License 2.0 — see LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fcloud_sdk-0.1.1.tar.gz.
File metadata
- Download URL: fcloud_sdk-0.1.1.tar.gz
- Upload date:
- Size: 314.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d1bcadb8c293e57923a2f6878ff564596c57667f9633ff2ce5a1b69fc128c368
|
|
| MD5 |
42fd724d4f3eedde5409c932664653ae
|
|
| BLAKE2b-256 |
c83c3454b99b649fc6d2629f59363b7c765d5555816748326a351698ca497b39
|
File details
Details for the file fcloud_sdk-0.1.1-py3-none-any.whl.
File metadata
- Download URL: fcloud_sdk-0.1.1-py3-none-any.whl
- Upload date:
- Size: 232.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
be324bde30c0baeb757c3a846f19740016d1623e46d05af016c702ce9750ffd4
|
|
| MD5 |
62c910f4d6e13e68d556a68d198ff6c7
|
|
| BLAKE2b-256 |
0293be7fc3809a7d14d9e8e8a9c0586c5ef8411d9a8e74d40d04def72a7de2ed
|