Quick start¶
No config files are hand-written. Onboarding a repository is five commands:
forest init # (1)!
forest checkout demo # (2)!
forest remote add origin s3://my-bucket/prefix # (3)!
forest add raw ./data/raw # (4)!
forest push # (5)!
- Creates only
.forest/config.yaml(version: 1,checkouts: {}) and a managed.gitignore. No root config, no checkout, no active pointer yet. - Switches to the checkout — creating, registering, and activating it
first (with
.forest/checkouts/demo/forest.yaml) since the name isn't registered yet.forest checkout create demois the explicit form. - Remotes can be added before any local binding — useful when your data is remote-only at first.
- Registers a new stage
rawand binds it to a local path in one step. Useforest bindto rebind an existing stage. - Syncs every bound stage to the active remote.
What just happened on disk¶
.forest/
config.yaml # workspace registry: version, checkouts{}
HEAD # active checkout name (gitignored)
checkouts/
demo/
forest.yaml # shared: stages, remotes, manifest
local.yaml # user-local: active_remote, stage_paths (gitignored)
sync_state.json # user-local push/pull state (gitignored)
Everything forest owns lives under .forest/; your data does not. Shared
metadata is committed to git so a fresh clone can bootstrap; user-local files
stay out of version control. Details in
configuration files.
Inspect and iterate¶
forest status # sync state of every bound stage (--checksum re-hashes contents)
forest diff # what would transfer
forest ls # list units the active remote knows about
forest flow # emit a Mermaid data-flow diagram of the checkout
Working from another directory
Every command accepts -C <path> to operate on another repo without
cd — same convention as git.
No bucket handy?
Any absolute path works as a remote —
forest remote add origin ~/forest-remote syncs to a plain local
directory. The tutorial runs entirely on one,
no credentials required.
Ready for the full walkthrough? Head to the tutorial.