Tracking Exactly What's Deployed: Git Commits and Deploy History

neo status <app> and neo deploys answer "which commit is running?" — a question image timestamps alone never could.

6 min read v0.26.0

The problem this solves

An image tag used to carry only a timestamp — neo-shop:20260818-045536. Two deploys of different commits looked identical; redeploying the same commit looked like a new version. There was no way to answer "which code is actually running?" short of guessing from a clock.

What gets captured

Every deploy now reads the local git commit, branch, tag, and whether the tree was dirty, and tags the image accordingly:

neo-shop:20260818-045536-a1b2c3d
neo list
NAME    DOMAIN              STATUS      VERSION
● shop  shop.example.com    running     v1.4.2 (a1b2c3d)

One app in full detail

neo status shop

Shows the commit, branch, image, who deployed it and when, plus its domains and containers — the one place that shows everything about a single app, where neo list truncates and plain neo status only covers the server.

The full history

neo deploys shop

Recorded server-side in /etc/neo/deploys/<app>.jsonl, append-only — so it's shared by every machine that deploys, including CI, and survives a fresh git clone. Entries whose image has since been pruned are marked, since those specific builds can no longer be restored.

Inside the container

neo run shop -- printenv | grep NEO_GIT
NEO_GIT_COMMIT=a1b2c3d4e5f6...
NEO_GIT_SHORT_COMMIT=a1b2c3d

These are injected before .neo.yml interpolation runs, so you can wire them anywhere without Neo knowing what tool you're feeding:

env:
  SENTRY_RELEASE: "${NEO_GIT_COMMIT}"

Checking a deploy actually landed, from CI

[ "$(neo status shop --json | jq -r .deployment.commit)" = "$GITHUB_SHA" ] || exit 1

Try it yourself — Neo is free, with every feature unlocked.

Get started free