Skip to content

ctx log

ctx log prints the server-side git log for your repo: one line per commit, newest first.

Use it to answer “has anything landed since I last looked?” and “who touched this repo recently?”. Beyond your config and credentials it reads nothing local — not your pages, not your sync state — so it’s also the quickest way to prove your credentials and repo_id actually reach a live repo.

It’s repo-wide and message-level. If you want to know how one page changed rather than that the repo changed, ctx history filters the same timeline to a single path and ctx evolution pairs each commit with its diff.

Terminal window
ctx log
ctx log --limit 100
FlagTypeDefaultDescription
--limitint20max commits to show

--limit is passed straight through to the server as ?limit=N. The server only honours values greater than zero, so --limit 0 (or a negative number) falls back to its own default of 50 — which is more commits than the CLI’s default of 20, not fewer.

ctx log also accepts the global flag:

FlagTypeDefaultDescription
--rootstringproject root directory (default: current directory)

The default, most recent 20 commits:

Terminal window
ctx log
ctx log
a4b2c1d3  2026-07-28 09:14  dev — ctx push (1 pages)

Each line is <short sha> <date> <time> <author> — <message>. Timestamps are UTC, not your local time. The author is the name recorded at login by whoever pushed, and the message is whatever ctx push -m supplied — or the generated ctx push (N pages) when it didn’t.

Reads repo_id from .contexo/config.json and the bearer token from .contexo/credentials.json (a server_url in credentials wins over the one in config), then issues GET /v1/repos/<repo>/timeline?limit=N. Server side that’s a git log over the whole repo, newest first, returning sha, author name, author email, commit time and subject line. Nothing is cached and nothing local is written.

The email in the response isn’t printed — ctx log shows the display name only. If two teammates share a display name, disambiguate with ctx activity, which reports the account behind each push or pull rather than the git author string.

An empty repo prints No commits yet and exits 0.

log: not authenticated (run 'ctx auth login') — no .contexo/credentials.json. Run ctx login.

log: server URL or repo_id not configured — one of the two is missing. ctx status will show you which; fix it with ctx remote set <url> or ctx remote set-repo <id>.

sync: timeline (403): {"error":"not a member of this repo"} — the token is valid but you’re not on this repo’s member list. Membership is checked before the repo is looked up, so a typo’d repo_id produces this rather than a 404. Get an invite key from an owner and run ctx join, or correct the id.

sync: timeline (404): {"error":"repo not found"} — you’re a member, but the server has no git repo under that id yet. Repos are created by their first push.

  • ctx history — the same timeline narrowed to one page
  • ctx evolution — every commit for a page with its section-level diff
  • ctx activity — pushes and pulls by account, including who pulled and with which client
  • ctx status — local-vs-server state, if the timeline surprises you