Advanced Guide
This guide is intended for users comfortable with the command line who want
to install ai-footprint manually or understand its internal workings. For
everyday use (skills, one-line installation), see the
user guide. For developing the project itself (code
architecture, database schema, tests), see CONTRIBUTING.md.
Manual installation
The one-line installer (see the user guide) remains the recommended method: it detects your installed tools and wires everything up automatically. The methods below only install the CLI, without automatic wiring into Claude Code, Opencode, or Pi.
Via Homebrew (macOS/Linux)
brew install hrenaud/tap/ai-footprint
Formula maintained on a personal tap (hrenaud/homebrew-tap) — equivalent
to brew tap hrenaud/tap && brew install ai-footprint. Update:
brew upgrade ai-footprint.
Via PyPI
pip install ai-footprint
The agent-footprint package (the project's former name) also redirects to
ai-footprint. Update: pip install --upgrade ai-footprint.
From source (dev)
git clone https://github.com/hrenaud/ai-footprint
cd ai-footprint
python -m venv .venv
source .venv/bin/activate
pip install -e .
Wiring manually after a brew/pip install
Without automatic wiring, it's up to you to trigger ingestion and display the status line:
ai-footprint ingest # run periodically (or via your own hook)
ai-footprint statusline # wire into your tool's config
The skills (/footprint-report, etc.) additionally require the skill files
from the repository — not installed by brew/pip.
Environment variables
Used by install.sh and uninstall.sh:
| Variable | Effect | Default |
|---|---|---|
AI_FOOTPRINT_DIR |
Installation directory (clone + venv). | ~/.ai-footprint/src |
AI_FOOTPRINT_DB |
Path to the SQLite database (impact history). | ~/.ai-footprint/ai-footprint.db |
AI_FOOTPRINT_REF |
Git branch or tag to install (useful for testing a branch). | main |
AI_FOOTPRINT_NO_CLAUDE |
=1 → does not modify ~/.claude/settings.json. |
not set |
AI_FOOTPRINT_NO_INGEST |
=1 → does not run the initial ingestion. |
not set |
AI_FOOTPRINT_PURGE_DB |
=1 (uninstall) → also deletes the SQLite database. |
not set |
Example: install a test branch in an isolated directory, without touching
the production install or settings.json:
curl -fsSL https://raw.githubusercontent.com/hrenaud/ai-footprint/main/install.sh | \
AI_FOOTPRINT_REF=my-branch AI_FOOTPRINT_DIR=/tmp/ai-footprint-test \
AI_FOOTPRINT_NO_CLAUDE=1 bash
Complete uninstallation
The uninstaller keeps the SQLite database by default. To delete it as well:
AI_FOOTPRINT_PURGE_DB=1 \
curl -fsSL https://raw.githubusercontent.com/hrenaud/ai-footprint/main/uninstall.sh | bash
Under the hood
The CLI
Skills are just a layer on top of the CLI: you can use it directly.
ai-footprint ingest # parse transcripts → SQLite database (~/.ai-footprint/ai-footprint.db)
ai-footprint report # multi-criteria report (--since, --detail, --all-projects)
ai-footprint card # shareable PNG card (--since, --theme, --lang, --out)
ai-footprint statusline # compact line for the current session
ai-footprint resolve --list # lists the uncovered models to resolve
ai-footprint resolve --set "provider/model=org/repo-hf" # applies a mapping and recalculates
ai-footprint resolve --forget "provider/model" # removes a mapping and recalculates
ai-footprint nudge --json # nudge status (unproposed models, update available)
ingest summarizes the coverage obtained, for example:
80 events ingested · 33639/33709 measured · 70 not covered (retained, impact not estimated)
The "uncovered" ones are models outside the EcoLogits scope: the event is
retained but excluded from the totals (showing a false number would be
worse than a coverage gap). Many are internal <synthetic> placeholders (0
tokens, no real impact); the real third-party or recent models are resolved
with ai-footprint resolve (or /footprint-resolve). Full details:
METHODOLOGY.md.
Multi-tool ingestion
ai-footprint ingest reads the session transcripts of each detected tool
(Claude Code, Opencode, Pi) and converts them into events in the SQLite
database. Ingestion is idempotent: replaying the same transcript
duplicates nothing. Each tool triggers ingestion its own way:
- Claude Code: a
Stophook ingests the transcript at the end of the session, and aSessionStarthook offers an update or the resolution of uncovered models at the start of the session, if relevant. - Opencode: a plugin triggers ingestion on the same session lifecycle events.
- Pi: an extension does the same on its own session events.
Claude Code statusline
Claude Code displays the impact in its statusline. The statusline displays the impact of the current session.
The tool passes the session ID to ai-footprint, which ingests the current transcript and filters the totals on it. Run manually outside a session, it falls back to the global total of the history:
~/.ai-footprint/src/scripts/statusline.sh
The installer never replaces a statusline already used by another tool — it then displays the command to switch manually.
OpenCode TUI statusline
OpenCode shows its session status in the sidebar. Its AI Footprint card is
expanded by default and can be collapsed with a click or, once focused, Enter
or Space. Its collapsed state persists between sessions. A click shows a
confirmation toast, while keyboard toggles remain silent. It shows the
installed version and one line per indicator; an extrapolated-model warning may
be shown. The warning names the recent model and its fallback version for any
provider, for example gpt-5.6-terra using gpt-5.5 parameters.
Uncovered models and resolution
See METHODOLOGY.md for details on what is measured and
why some models remain out of scope. ai-footprint resolve associates an
uncovered model with an equivalent Hugging Face repository, checks its
actual parameters, and recalculates the impacts.