Sijl
Sijl (سِجِلّ, Arabic for "a record, a register") — your work, on the record.
Sijl summarises your own git work for a review period — a quarter, a half year, the last six months — straight from the repositories already on your computer. It reads git history only: no accounts to connect, no tracker to fill in, nothing uploaded.
What it does
- Finds your repositories under the folders you name, and your commits in them — matched by your exact email addresses, pushed or not, copies (rebases, cherry-picks) counted once.
- Writes a review-ready Markdown report: a summary in sentences, highlights, per repository, per month, kinds of work, the merge requests and pull requests you delivered, Jira tickets, work not pushed yet, and Caveats saying what was left out and why. Every commit is linked to GitHub or GitLab.
- Lets you ask an AI about your period with evidence:
sijl digestwrites a compact file with ids to cite for Claude Code or any AI chat;sijl askasks Claude directly and checks every id the answer cites against your history. - Stays honest about its numbers: a fixed, stated rule for everything it picks, and the numbers are evidence of work, not a performance score.
A report starts like this (a made-up example):
# Work summary — Alex Example
**Period:** 1 April 2026 to 30 June 2026 (inclusive; by author date, in each commit's own timezone)
## Summary
Between 1 April 2026 and 30 June 2026 you authored **13 commits** on **13 active days** across
**3 repositories** — most in app (7), site (4), tools (2). Your longest streak was **3 weekdays**
in a row with commits, from 11 May 2026 to 13 May 2026 (…). 1 more commit is not pushed yet and
not in these numbers (see *Not pushed yet*). 5 merge requests and pull requests of yours were
merged, and you merged 1 for colleagues (see *Delivered*).
## Highlights
- **Busiest month:** April 2026 — 5 commits on 5 active days.
- **Largest merge requests and pull requests** (3 of 5, by commits of yours):
- #13 Search — 2 commits of yours, in site, merged 2026-04-22
- !42 Export the report (PROJ-12) — 2 commits of yours, in app, merged 2026-04-08
…
Requirements
- macOS or Linux. Windows is untested.
- git 2.36 or newer (
git --version). - uv, which installs Sijl and fetches Python 3.12 for it if
your computer does not have it:
brew install uv, orcurl -LsSf https://astral.sh/uv/install.sh | sh.
Install
uv tool install git+https://github.com/ibnelhithem/sijl@v1.0.0
sijl --version # sijl 1.0.0
If your shell says sijl: command not found, run uv tool update-shell once and open a new
terminal.
- Upgrade: run the install command again with the newer version (
…@v1.1.0). - Uninstall:
uv tool uninstall sijl(your config file and saved reports stay; delete them yourself if you want them gone).
More, including installing from a downloaded wheel: docs/install.md.
First run
-
See which config file Sijl reads:
sijl config show
The first line names it:
~/.config/sijl/config.toml, or$XDG_CONFIG_HOME/sijl/config.tomlwhen that variable is set. It does not exist yet — create it:[identity] emails = ["you@example.com"] # every address you commit with [scan] roots = ["~/code"] # folders that hold your repositories [window] last = "6m" # or quarter = "2026Q3", half = "2026H1", year = 2026
Not sure which addresses you commit with? Inside one of your repositories,
git log -5 --format=%aeshows them. Use exactly those, and list them all (a work address, a personal one, GitHub's…@users.noreply.github.com). Every setting: docs/configuration.md. -
Check what it will read:
sijl reposEvery repository it found, once each, and every folder it skipped, with the reason (docs/repos.md).
-
Write the report:
sijl report --out ~/review.md
Run it from outside your repositories (your home folder is fine): Sijl refuses to write a relative
--outpath into a repository it reads. Without--outthe report is printed instead. Any flag overrides the file for one run, for example--quarter 2026Q3or--root ~/code/work;sijl report --helplists them all. -
Read it, starting with Summary, Highlights and Caveats — the Caveats say what was not counted and why, before anyone else asks. What every section means: docs/report.md.
Asking AI — two tiers
Both tiers ask about the same evidence: your period's commits, merge requests, pull requests and tickets, each with an id the answer can cite.
Tier 1 — free, nothing sent by Sijl. Write the digest and give it to Claude Code (or attach it in any AI chat you use):
sijl digest --with-prompt --out digest.txt
claude 'Read digest.txt and answer: what did I deliver for ABC-123?'
Colleagues' names and email addresses are replaced by [person N] / [email N]; your own name
and addresses, commit subjects, merge request and pull request titles, repository names and
ticket keys are kept as written. Check your employer's policy on AI tools before you give the
file to one. More: docs/digest.md.
Tier 2 — sijl ask, billed to you. With an Anthropic API key (create one at
console.anthropic.com; usage is billed to your account):
export ANTHROPIC_API_KEY=…
sijl ai status # is AI on, and why
sijl ask "What did I deliver in Q3?" # one question
sijl ask -i # follow-up questions, one yes for all
Nothing is sent before Sijl shows you exactly what will be sent, with a cost estimate, and you say yes. As a rough guide for six months of work: about $0.40–0.80 for the first question and about $0.02 for each follow-up, which re-reads the evidence from Claude's cache. The answer is shown as an AI-written block; the Evidence section after it is what Sijl verified — each id the answer cited, with your history's own line for it. Ids that are not in your evidence are marked. More: docs/ai.md.
Troubleshooting
| You see | What it means |
|---|---|
no git repository found (exit 3) |
Nothing under your roots is a repository Sijl can read. Run sijl repos to see what it searched and why each folder was skipped; point roots at the folder that contains your repositories. |
| The report says "No commits by … were found" | Your emails do not match your commits exactly. Run git log -5 --format=%ae in a repository and copy those addresses into emails — all of them. |
--out … would write into the scanned repository … (exit 2) |
You ran it inside a repository with a relative path. Run it from your home folder, or give the full path the message suggests. |
sijl: command not found |
Run uv tool update-shell and open a new terminal. |
Exit codes: 0 done · 2 a usage or configuration error (the message names the flag or the setting) · 3 no repository found · 4 AI is off, failed or gave no complete answer · 5 an answer cites an id that is not in your evidence · 1 git is missing or failed.
Privacy
- Everything runs on your computer. Sijl only reads git history: it never writes into your repositories and never runs commands a repository's own settings name.
- No network — except
sijl askandsijl ai check, which send to Claude only after showing you what will be sent and getting your yes. - Reports and digests are files you choose to write; they contain your work history, so treat them like any other personal document.
Documentation
docs/ — install, configuration, the report, sijl repos, sijl digest,
sijl ask. Contributing: CONTRIBUTING.md. Changes: CHANGELOG.md.
Licence
MIT © 2026 ibnelhithem.
Metadata
Release files for sijl 1.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| sijl-1.0.1.tar.gz | 184.0 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sijl-1.0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 384.9 kB
Release files / sijl-1.0.1.tar.gz
| Download URL | sijl-1.0.1.tar.gz |
|---|---|
| Size | 184.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ba8d69d6f8074ab247779ccdf665904649cd45c7fdc800cab0f72944e4c1d07d
|
|
BLAKE2b-256 checksum How to use checksums |
5971f219bea565b888a96220cad58f37fa73bdf3935fd154f44ce7bb3ce857cb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.
Transparency logRelease files / sijl-1.0.1-py3-none-any.whl
| Download URL | sijl-1.0.1-py3-none-any.whl |
|---|---|
| Size | 201.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f3692f0d42f0cb2f409b491effc75789585fa54919fbc6aa7dcf73fa8efa2482
|
|
BLAKE2b-256 checksum How to use checksums |
e74a1d1b4b3264f66ac0cd0159020b50abdfc423bc592eb6464e9317f8609dce
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.
Transparency logSecurity for sijl 1.0.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for sijl-1.0.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 22, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.