Any repo

Most of charter is not about an API. A repo with no Worker, no contract and no Fern folder takes these parts with one command: the docs site, the rules, the issue forms and labels, the repo on GitHub kept in shape, the upstream issues it works around, its jobs here and on GitHub. You need git, mise and gh signed in.

Keep a repo the charter way

In the repo, with a charter.toml at its top that says what it is:

[github]
description = "<what the repo is>"
mise use github:joeblew999/charter   # charter, pinned in the repo's mise.toml
charter init                         # charter's files, its mise tasks, a workflow per job
charter repo                         # the repo on GitHub: labels, description, homepage, topics, Pages, merged branches deleted
charter ci repo                      # what the check on GitHub runs

Then commit what it wrote. Run again, charter init changes nothing.

What What charter init does
charter’s files docs/charter/ (what to do and when, the rules, how to write a page), the site’s files (docs/_config.yml, docs/llms.txt, docs/_sass/), the issue forms and labels, the workflows charter-ci.yml and charter-repo.yml, renovate.json, AGENTS.md, CLAUDE.md
What it starts, then the repo’s docs/self/README.md and docs/self/rules.md (the repo’s own pages go in docs/self/), mise.toml (charter and the tools it runs), .gitattributes
Its commands as mise tasks .mise/tasks/charter.toml: mise run charter:<command>
A project’s own In a folder whose charter.toml names a Worker: its tasks, the agent skill (.claude/skills/charter), in Go .config/mise/conf.d/charter.toml (the TinyGo and wasm-opt its Worker builds with, the versions charter’s TinyGo patch is for; charter check refuses a tinygo or binaryen line in the repo’s own mise.toml)
A CLAUDE.md or AGENTS.md of its own Outside a project: moves what it says to the end of docs/self/rules.md, and writes charter’s in its place
.gitignore Adds node_modules/, in a repo with a package.json

It changes nothing on GitHub: charter repo does that, from charter.toml’s [github]: the labels (charter’s .github/charter-labels.tsv, GitHub’s unused defaults removed), the description, homepage and topics (and charter, so charter’s repos can be found), GitHub Pages for the docs folder, and a pull request’s branch deleted once it is merged (squash merges leave branches no merge reaches, so without it they pile up). A private repo’s docs are never published: its Pages stays off and its homepage is only what [github] says. charter repo -check changes nothing and fails on a difference.

What to do, and when

docs/charter/README.md lists charter’s commands, each with when to run it and what it does. charter init writes it.

Settings

Setting In charter.toml’s [github]
The repo’s description on GitHub description
Its topics topics
Its homepage homepage; by default its GitHub Pages site (a public repo’s)
The docs folder docs = "."; by default docs
No renovate.json, no workflows renovate = false, workflows = false

Tell what is charter’s

Mark in the first lines Whose What happens
Written by `charter <command>` … don't edit Charter’s charter init writes it again
Started by `charter <command>` … yours to edit The repo’s Written once, then left alone
None The repo’s Never written over, whatever its path

docs/charter/, and the charter-* forms and workflows, are charter’s whole: each version writes them as it has them and removes any other file in them. charter init -check fails when one of charter’s differs from what this version writes; so does charter check.

Checks on GitHub

Every repo gets charter’s job repo (.github/workflows/charter-repo.yml): init -check, docs, repo -check and upstream, on pull requests and pushes to main, with a token that may only read. A repo’s own jobs go in charter.toml, [ci.jobs.<name>] (every key: go doc github.com/joeblew999/charter/project), and charter init writes a workflow for each, .github/workflows/self-<job>.yml. Every workflow calls charter’s job runner (charter-ci.yml): mise installs the tools mise.toml pins, charter among them, npm the packages if the repo has any, then charter runs the job as charter ci <job> runs it here. charter ci <job> -remote starts one on GitHub from here. charter check at the repo’s top runs the jobs [ci] check lists.