Skip to content

7. Dogfood: this repo runs forest

The forest repository manages its own examples/ tree with forest — a live demonstration that .forest/ and .git/ coexist without overlapping. It was set up with the same commands you have been running since chapter 1:

forest init
forest checkout demo
forest remote add origin s3://forest-cli-test --region us-east-2
forest add examples ./examples
forest push

The only difference from your tutorial repo: the remote is an S3 bucket instead of a local directory — one line, same everything else.

Inspect the result

Clone tmsincomb/forest and compare what git sees with what stays local:

git ls-files .forest
.forest/checkouts/demo/forest.yaml
.forest/config.yaml

That is the shared half of the metadata — exactly the two committed files you built in chapters 1–4. The checkout's forest.yaml should look familiar too:

.forest/checkouts/demo/forest.yaml
project: demo
remotes:
  origin:
    url: s3://forest-cli-test
    region: us-east-2
stages:
  examples:
    remote_path: demo/examples
  data:
    remote_path: demo/data
    sync_by: directory
    direction: pull

Meanwhile the repo's .gitignore carries the managed patterns, so HEAD, local.yaml, and sync_state.json never leave each contributor's machine:

.gitignore (forest-managed patterns)
.forest/HEAD
.forest/checkouts/*/local.yaml
.forest/checkouts/*/sync_state.json
.forest/checkouts/*/sync_state.json.lock

Bootstrapping a fresh clone

A fresh clone has the shared metadata but no local half yet — no bindings, no active checkout. Two commands restore it, exactly the fresh-teammate flow from chapter 3's shared/local split:

forest checkout demo               # activate (auto-registers HEAD locally)
forest bind examples ./examples    # re-create the local stage↔path binding
forest pull                        # single configured remote is used automatically

Credentials

Pulling from the bucket needs AWS credentials; the layout is the demonstration. Even without credentials, git ls-files .forest and the managed .gitignore show the shared/local split working.

Why this matters

Dogfooding keeps the onboarding honest: if the quick start drifts from reality, the repo's own data breaks first. It is also the canonical example of the committed-vs-gitignored split described in the data model.


That's the tutorial. From here: the CLI reference for every command, or the design decisions for why it works this way.