fwd
Move your coding project and agent session to remote compute.
fwd provisions or connects to a remote target, synchronizes the current project, prepares its toolchain, and starts a persistent shell, command, Claude Code, or Codex session in tmux. Disconnect your laptop and return later: the session, durable tasks, and logs remain available.
laptop remote SSH / RunPod / Lambda / Slurm
project ───────────── sync ──────────▶ project checkout
agent context ──────── optional ──────▶ Claude or Codex state
tmux session + durable task manager
terminal ◀────────── attach / stream ── persistent work
Install
uv tool install fwdit
Or try it without installing:
uvx --from fwdit fwd --help
Requires Python 3.12+, ssh, and rsync locally. Run fwd doctor to check target-specific requirements.
Quick start
Run fwd from the project you want to move:
fwd # attach to this project's session, or create one interactively
fwd up runpod codex # launch Codex on RunPod; auto-attach in a human terminal
fwd up --detach runpod codex # launch Codex but stay in the local terminal
fwd up --target work # use a configured SSH/cloud/HPC target
fwd up -- python train.py # launch and stream a durable command
fwd ls # inspect sessions and live status
fwd attach SESSION # reconnect from a human terminal
Bare fwd is the interactive reuse workflow. Agent launches auto-attach in a human terminal; pass --detach to stay local. Scripts and coding-agent environments remain non-attaching. Detach from tmux with Ctrl-B D.
Need a saved target first?
fwd setup # interactive target setup
fwd setup ssh --host my-box --target-name work
fwd config --example runpod # current generated config reference
Read Getting started for the full first-session walkthrough.
Choose a target
- SSH: an existing host, direct address, or OpenSSH alias.
- RunPod: CPU or GPU Pods with per-session persistent network volumes by default.
- Lambda Cloud: GPU instances with persistent filesystems and local-only API credentials.
- Slurm: allocations launched through persistent login-node tmux on shared scratch.
See Configuration and backends for setup, storage, and lifecycle differences.
Common workflows
Run durable work
fwd send -- pytest -q
fwd send --detach -- python train.py
fwd send --ls --json
fwd send TASK_ID # reattach to its log
fwd send TASK_ID --stop # cancel the task, not the session
Every command runs in remote tmux with a durable ID and log. Streaming returns the remote exit code; Ctrl-C cancels and Ctrl-B backgrounds the viewer.
Synchronize results
fwd diff # compare without changing either side
fwd push # mirror local synchronized files to remote
fwd pull outputs/ # additive download; never deletes local files
Sync honors .gitignore, .fwdignore, and configured exclusions. Upload includes .git/ for remote agent continuity; pull and diff exclude Git metadata.
Forward a service
fwd ports 3000 # localhost:3000 to remote localhost:3000
fwd ports work 8080:3000
fwd ports --ls
fwd ports --close 3000
Forwards are loopback-only and persist through a managed SSH control connection.
Stop or destroy compute
fwd stop SESSION # stop compute and retain configured persistent storage
fwd rm SESSION # permanently destroy remote resources
Both commands protect a reachable dirty remote Git worktree. rm is irreversible; force flags explicitly accept possible loss. See Lifecycle safety before automating cleanup.
Coding-agent skill
fwd ships an Agent Skills-compatible workflow for Codex, Claude Code, and other supporting agents. The first interactive invocation offers to install the bundled skill. It can also be installed directly:
npx skills add Sid-MB/fwd --skill fwd -g -a codex -a claude-code
Invoke it as $fwd ... in Codex or /fwd ... in Claude Code. See Coding agents for behavior and credential guidance.
Documentation
User guide
- Getting started: installation, first launch, target setup, and the everyday workflow.
- Commands and lifecycle: durable tasks, synchronization, inspection, port forwarding, stopping, and removal.
- Configuration and backends: config layers, SSH, RunPod, Lambda Cloud, Slurm, toolchains, and defaults.
- Coding agents: Claude/Codex transfer, follow-up turns, credentials, runtime policy, and skill installation.
- Troubleshooting: diagnostics, launch recovery, dirty worktrees, sync limits, and destructive operations.
- User documentation index: the complete end-user map.
The installed CLI is the authoritative option reference:
fwd --help
fwd COMMAND --help
fwd config --example
fwd config --schema
Unix package builds can install the generated fwd(1) manual; visible subcommands have separate pages such as fwd-up(1). See manual-page generation and packaging.
The first invocation after uv tool install fwdit or an upgrade silently installs or updates these pages in the user-local man directory, so man fwd and man fwd-up work without sudo.
Developer guide
- Developer documentation index: architecture, provider notes, validation evidence, and repository map.
- Adding a target backend
- Adding a project toolchain
- Performance benchmarking
- Manual pages
- Contributing
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 fwdit-0.1.6.tar.gz.
File metadata
- Download URL: fwdit-0.1.6.tar.gz
- Upload date:
- Size: 363.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
15079291b0e9f44dac187f5a4d11900e26e929d7cf96019f8f5c4747ac596765
|
|
| MD5 |
26738f54faec1bb36118c9363c82e324
|
|
| BLAKE2b-256 |
26e95b48d014de370d63c0f2558f401a054e02b9bf4d08d5fe33f07fb4219585
|
Provenance
The following attestation bundles were made for fwdit-0.1.6.tar.gz:
Publisher:
publish.yml on Sid-MB/fwd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fwdit-0.1.6.tar.gz -
Subject digest:
15079291b0e9f44dac187f5a4d11900e26e929d7cf96019f8f5c4747ac596765 - Sigstore transparency entry: 2496092042
- Sigstore integration time:
-
Permalink:
Sid-MB/fwd@22d5ebca71de635d439a0dac82041000625efdad -
Branch / Tag:
refs/heads/main - Owner: https://github.com/Sid-MB
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@22d5ebca71de635d439a0dac82041000625efdad -
Trigger Event:
push
-
Statement type:
File details
Details for the file fwdit-0.1.6-py3-none-any.whl.
File metadata
- Download URL: fwdit-0.1.6-py3-none-any.whl
- Upload date:
- Size: 332.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c0e72092194383487895ac28a895028cd8f0b8ab1d9e4822546258ed9b7b550e
|
|
| MD5 |
2d4114162dab4872bc88ca4c3bc2a7a8
|
|
| BLAKE2b-256 |
2dc7f4548f8fbe9bb2ba9adfb8b24ddd50aaaa94cf9b67723cd24155a1a88b30
|
Provenance
The following attestation bundles were made for fwdit-0.1.6-py3-none-any.whl:
Publisher:
publish.yml on Sid-MB/fwd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fwdit-0.1.6-py3-none-any.whl -
Subject digest:
c0e72092194383487895ac28a895028cd8f0b8ab1d9e4822546258ed9b7b550e - Sigstore transparency entry: 2496092092
- Sigstore integration time:
-
Permalink:
Sid-MB/fwd@22d5ebca71de635d439a0dac82041000625efdad -
Branch / Tag:
refs/heads/main - Owner: https://github.com/Sid-MB
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@22d5ebca71de635d439a0dac82041000625efdad -
Trigger Event:
push
-
Statement type: