Grammar Check
ethereum/execution-specs
Audit grammar in documentation and code comments. An agent skill from ethereum/execution-specs.
Runs the daily review of evlog's written material: picks the worst-scoring files in one group, rewrites what holds up, and opens a single pull request that reports the changes.
$ npx skills add evloghq/evlog --skill content-pass -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install evloghq/evlog content-pass --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/evloghq/evlog.git skills-src && mkdir -p .claude/skills && cp -r skills-src/apps/evi/agent/skills/content-pass .claude/skills/content-pass && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "content-pass" agent skill from https://github.com/evloghq/evlog/tree/main/apps/evi/agent/skills/content-pass into .claude/skills/content-pass/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "content-pass", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/evloghq/evlog/tree/main/apps/evi/agent/skills/content-passType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add evloghq/evlog --skill content-pass -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install evloghq/evlog content-pass --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/evloghq/evlog.git skills-src && mkdir -p .agents/skills && cp -r skills-src/apps/evi/agent/skills/content-pass .agents/skills/content-pass && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "content-pass" agent skill from https://github.com/evloghq/evlog/tree/main/apps/evi/agent/skills/content-pass into .agents/skills/content-pass/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "content-pass", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add evloghq/evlog --skill content-pass -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install evloghq/evlog content-pass --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/evloghq/evlog.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/apps/evi/agent/skills/content-pass .cursor/skills/content-pass && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "content-pass" agent skill from https://github.com/evloghq/evlog/tree/main/apps/evi/agent/skills/content-pass into .cursor/skills/content-pass/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "content-pass", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/evloghq/evlog.git --path apps/evi/agent/skills/content-pass--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add evloghq/evlog --skill content-pass -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install evloghq/evlog content-pass --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/evloghq/evlog.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/apps/evi/agent/skills/content-pass .gemini/skills/content-pass && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "content-pass" agent skill from https://github.com/evloghq/evlog/tree/main/apps/evi/agent/skills/content-pass into .gemini/skills/content-pass/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "content-pass", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install evloghq/evlog content-passInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add evloghq/evlog --skill content-pass -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/evloghq/evlog.git skills-src && mkdir -p .github/skills && cp -r skills-src/apps/evi/agent/skills/content-pass .github/skills/content-pass && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "content-pass" agent skill from https://github.com/evloghq/evlog/tree/main/apps/evi/agent/skills/content-pass into .github/skills/content-pass/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "content-pass", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add evloghq/evlog --skill content-pass -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install evloghq/evlog content-pass --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/evloghq/evlog.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/apps/evi/agent/skills/content-pass .opencode/skills/content-pass && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "content-pass" agent skill from https://github.com/evloghq/evlog/tree/main/apps/evi/agent/skills/content-pass into .opencode/skills/content-pass/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "content-pass", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
content-passRuns the daily review of evlog's written material: picks the worst-scoring files in one group, rewrites what holds up, and opens a single pull request that reports the changes.
A pass handles one group of files and ends in one pull request whose body is the report. The corpus is roughly 150 files across the docs, the landing page, package READMEs, skills and AGENTS.md files, and the scanner's own count wins if it differs. The `content-targets` tool runs the scanner, skips files changed inside a cooldown, and returns the top files from a single group. Its `eligible` count decides the path: zero means the enrich half, anything above means rewriting.
Skills and AGENTS.md files govern the agent itself, so the pass may only fix house-rule slips there, such as punctuation, dead links or wrong terms, and reports procedure or description changes as findings. The editing standard lives in a separate `write-evlog-content` skill and is never restated here. The enrich half runs when nothing scores badly enough, for example to write a page an index promises, finish an integration documented at half its contract, or turn a correction into a rule. Both halves never share one pass.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 54dcc50. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gitnodepnpmFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git and pnpm, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
evlog Content Pass loads about 4k tokens when it runs. Until then it costs about 179 tokens; SKILL.md has 2,364 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from evloghq/evlog at commit 54dcc50, republished under its MIT licence (© evloghq). 2,364 words, ~4,037 tokens.
.claude/skills/content-pass/SKILL.md (or your agent's skills folder).One pass, one group, one pull request. The corpus is roughly 150 files: the docs tree and the landing, the four package READMEs, the internal and published skills, and the three AGENTS.md files. When the scanner's own count differs, the scanner wins. None of that gets fixed in a day, and trying is how a rewriter starts rewriting for its own sake.
Half the corpus is read by people and half by agents, and the pass treats them differently. A skill or an AGENTS.md governs the agent running this pass, so it may fix a house rule there (punctuation, a dead link, a retired entry point, a wrong term) and nothing else. Procedure, bounds, and a skill's description come back as findings for Hugo. That is M-09 in the doctrine, and content-targets enforces it by returning those files with mode report.
The doctrine lives in the repository, at .agents/skills/write-evlog-content/. This file is the procedure; that skill is the standard. Never restate its rules here. Read them there, and when they are wrong, fix them there.
Rewrite is the default: the scanner ranks the corpus, the worst pages get reviewed, and what survives review gets applied.
Enrich is what runs when the rewrite half comes back empty, with no page above the bar or everything ranked inside its cooldown. That is a good day, not a wasted one. Switch to the second half rather than lowering the bar.
Never run both in one pass. A PR that rewrites two pages and adds a third is a PR nobody reviews properly.
Call content-targets. It runs the scanner over the whole corpus, drops files changed inside the cooldown, and returns the top files from a single group with their candidates. A group is one docs section, one skill's directory, or a flat surface (readme, agents, landing).
Pass surface when Hugo asked for one, or when the weekly corpus check found a surface drifting. Otherwise take what ranks.
Read eligible before deciding anything. It is the count of files with findings that are outside the cooldown, and it is the only number that says whether there is work. eligible: 0 sends you to Enrich. Anything above zero means the rewrite half has targets, and the pass rewrites.
Write the three numbers into the PR body verbatim: scanned, candidates, eligible. A pass that says the rewrite half was empty without them is asserting, not reporting, and a corpus of 120 files with 47 eligible pages has been called empty before.
In /workspace/repo, from a fresh main:
git -C /workspace/repo checkout -B content/<group>-<slug> origin/mainSlugify the group: .agents/skills/create-adapter becomes skills-create-adapter.
node scripts/content-lint/index.mjs <each target> --fixThis rewrites only what follows from the rule rather than from taste: a retired entry point, a term with one replacement, a link with a redirect behind it. Dashes are not mechanical and stay findings for the reviewer. It re-scans each file afterwards and reverts anything that scored worse or introduced a new id, so a reverted file is a bug to report, not a file to retry.
Keep these page edits uncommitted until verification. The content agents share the parent's actual workspace, including new pages and local edits. Source code changes must be committed before capturing an identity; a local commit is sufficient. Never change Git state or write files while a reviewer is reading them.
Then re-run content-targets. A file whose findings were all mechanical now comes back clean and is dropped from the pass. Never send a reviewer a finding a codemod already fixed: it costs a dispatch and it teaches the reviewer that findings are cheap.
Call content_snapshot for each target. Dispatch content_review once per target with the returned identity, its surface, candidates and modelChecks. Include factual sources and executed-check results, but not your interpretation or preferred verdict. Content agents explicitly share the parent sandbox and call content_load to check the digest and source revision before reading. A load failure blocks that page; capture it again rather than substituting another version.
The candidates are what tripped a counter. The modelChecks are what no counter reached on that page, and the reviewer answers every one of them. Pass them through as they came; they are chosen per surface and per page, and editing them is how a pass quietly stops checking something.
The reviewer returns a verdict. pass means that page is done for this run; do not rewrite it, do not ask again.
For every target whose snapshot loaded successfully, whose verdict is not pass and whose mode is rewrite, dispatch content_rewrite with the same snapshot and that page's findings. A blocked verdict from a failed snapshot load means the page was never reviewed: recapture it and send it back to review before rewriting. A verdict blocked on critical findings means the page was reviewed and refused: rewriting those findings is allowed.
The rewriter returns full replacement text and the original digest. Wait for all readers to finish. Before each edit, call content_snapshot again and compare both the revision and digest with the rewrite input. If either changed, capture and review the current page again. Otherwise, read the file and apply only the reviewed changes serially with the parent’s existing editing tools. Do not run other file writes or Git changes concurrently. This check is not an atomic write guard: if another writer is active, stop editing until access is coordinated. After saving, capture a fresh snapshot of the actual file for verification; the proposed text is not evidence of what was saved.
Targets with mode report skip this step: the landing page absent a critical finding, and any skill or AGENTS.md whose findings go past the house rules. Their findings go in the PR body for Hugo to decide on. Do not edit the landing page for voice or rhythm, and do not touch a procedure, a bound, or a description.
In the sandbox:
node scripts/content-lint/index.mjs <each changed file>
git -C /workspace/repo diff --statThen the checks the changed files actually need:
U-16, so a dead cross-reference shows up in the scan.packages/evlog/README.md: this one ships to npm. It needs a changeset (patch), and the automd blocks are regenerated rather than hand-edited. The other three package READMEs follow the same rule.What you are checking:
content_review again, with the previous critical findings and execution evidence. Confirm the reported revision and digest match the saved snapshot, and that critical findings are resolved. Missing evidence remains explicitly unverified.If verification finds a concrete new defect, send that finding back for a targeted correction and rerun affected checks. Do not retry for style variation alone. If the defect cannot be resolved, do not open the PR; report the blocker.
Before opening the PR, read the changed pages together: state the reader question each answers, remove duplicated explanations where a link suffices, and resolve contradictory promises. Record which checks ran on which revision. After further edits, rerun affected checks rather than carrying a stale pass forward.
Commit with a conventional subject naming the group, push with git__push, and open a normal, ready PR with github__createPullRequest. Read CI, fix required failures, then request hugorcd as reviewer. If the readiness gate cannot be completed, report the blocker instead of opening a draft.
The title is validated by CI and a wrong scope means the PR cannot merge. The accepted list is scopes: in .github/workflows/semantic-pull-request.yml. Read it rather than guessing, and note what is not in it:
evlog is never a scope. The whole monorepo is evlog, so a bare docs: already means evlog itself. docs(evlog): fails validation.4.integrate/adapters/<name>/ or 4.integrate/frameworks/<name> takes that subsystem's scope: docs(posthog):, docs(hono):.docs: with no scope.docs(core):. The skills and the AGENTS.md files: no scope.fix(docs): when the pass fixed a broken sample or a dead link, because that is what it was.apps/*. packages/evlog/README.md ships with the package, so it gets one; a docs page, a skill under .agents/, and an AGENTS.md do not.## Content pass: <group>
<one line: how many pages the scanner ranked, how many were fixed mechanically, how many were reviewed, how many changed>
### Fixed mechanically
- [id] <path>:<line>, what the codemod replaced. One line each, or `_None._`.
### <path>
Score <before> → <after>. Verdict: <verdict>.
- [id] what changed and why, one line.
### Not applied
- [id] <path>, the finding did not hold or the fix needs a decision.
### Reported, not changed
- [id] <path>, landing findings and anything else left for you.
### Checks
- [what ran, on which revision, result]. One line each; omit only when the diff is markdown-only prose.Facts only. No summary of what the pass is for, no closing note about improving the docs.
Report to the thread: what group, how many files, the PR link. Two lines maximum. The PR body is where the detail belongs, and chat is where it is least readable.
Run this when eligible is 0. It needs an observation, not an opinion: name the gap you found and where you found it, or drop it.
Whatever file you end up editing, run --fix on it first. A page you are already opening does not have "pre-existing" findings, it has findings, and the mechanical ones cost one command. Leaving a wrong term on a page you just edited, and writing that it was out of scope, is the pass explaining why it did less than the tool it was given.
Look, in this order, and stop at the first thing that holds:
links: block pointing at something thin or missing. The scanner's U-16 findings are the mechanical version; the interesting cases are pages that exist and do not deliver what the index said.evlog(), useLogger(), log.fork(), and the framework-native accessor. evlog/workers is the documented exception. A page missing half of that is a real gap in the docs, not a style problem.packages/evlog/src with no page. git log --since='30 days ago' -- packages/evlog/src against the content tree.AGENTS.md says a skill describing the old behavior is worse than no skill. Take one skill, check every path, command, and symbol in it against the checkout (M-03, M-07), and report what no longer exists. This is a finding for Hugo, not an edit.references/landscape/*.md carries a Checked: date. Older than six months and every U-12 review this quarter leaned on stale facts. Re-reading one tool's docs and updating its dossier is a better day's work than a rewrite.references/corrections.md with the same lesson written three times is a rule waiting to be added to references/rules/. That is a PR against the skill, and it is worth more than any single page.references/rules/blog.md and references/surfaces/blog.md first, and answer its four questions in the issue before drafting anything. A post with no event behind it does not get written.A new page or a post is a Linear issue, not a PR: what is missing, where the reader hits it, and the shape it should take. Drafting new content unattended is not this pass's job. A gap that is one paragraph inside an existing page can go straight into a PR, the same way a rewrite does.
On the first pass of the week, before picking targets, run the scanner over the whole corpus and look at what only shows up across files: the same sentence on two pages drafted together, the same worked example (checkout, userId: 42) recurring in unrelated sections, every page in a section opening on the same move. references/ai-tells.md closes on these. They read as one generated set even when every page passes alone, and no single-page review will ever catch them.
Two more, now that the corpus spans both audiences:
pnpm content:lint --top 30 and look at the U-15 findings together. One page calling a drain a sink is a slip. Four pages doing it means the docs and the skills taught different words, and the fix is a rule, not four rewrites.--fix already handles.--fix over the corpus. It takes the targets of this pass and refuses a bare sweep for that reason.description. Those are proposals, in the PR body.apps/evi/agent/skills/. The scanner reads those now, but they are this pass's own instructions: findings on them are reported for a person to judge, never applied.apps/*.© evloghq, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in apps/evi/agent/skills/content-pass of evloghq/evlog.
Open the folder on GitHubat commit 54dcc50
evlog Content Pass next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| evlog Content Pass this skillevloghq/evlog | 1.9k | — | ~4k | Automated safety check: Pass | MIT | |
| Grammar Checkethereum/execution-specs | 1.2k | — | ~424 | Automated safety check: Pass | CC0-1.0 | |
| Evidence-Backed Documentation Writerbgauryy/octocode | 949 | — | ~2k | Automated safety check: Pass | MIT | |
| Not AIudaysharmadev/Not-Ai | 132 | — | ~4.7k | Automated safety check: Pass | MIT | |
| Technical WriterOneWave-AI/claude-skills | 328 | — | ~1.2k | Automated safety check: Notes | MIT | |
| Dsh Web Documentationzhu1090093659/dsh-web | 8.5k | — | ~479 | Automated safety check: Pass | Apache-2.0 |
ethereum/execution-specs
Audit grammar in documentation and code comments. An agent skill from ethereum/execution-specs.
bgauryy/octocode
Writes, repairs and copyedits project docs against the Google developer documentation style guide, verifying claims in the repository before stating them.
udaysharmadev/Not-Ai
Edit prose into a clear, specific, source-grounded version that preserves the author's meaning and voice.
OneWave-AI/claude-skills
Writes and restructures technical documentation - READMEs, tutorials, how-to guides, user guides, architecture docs, onboarding guides, runbooks and SOPs, troubleshooting guides, release notes, and…
zhu1090093659/dsh-web
A skill your agent uses when adding or editing dsh-web README files, docs, AGENTS.md instructions, user-facing configuration text, or bilingual documentation pairs.
UfoMiao/zcf
Compares code changes since the last Git tag with the multilingual docs and CLAUDE.md, then updates them or only reports mismatches with --check-only.
evloghq/evlog
Walks through adding a new built-in evlog drain adapter for an observability platform: source, build config, exports, tests, docs and PR scope.
evloghq/evlog
Guides adding a new built-in enricher to the evlog package, covering the source, tests, docs, README, a related skill and a changeset.
evloghq/evlog
Walks a contributor through adding a new HTTP framework integration to the evlog logging package: middleware source, build entry, exports, tests, example app and docs.
evloghq/evlog
Walks through adding a new rule or framework adapter to `evlog map` in @evlog/cli, from the rule source and registry to types, tests, docs and the published skill.
evloghq/evlog
Rules for writing and reviewing evlog docs, blog posts, READMEs, skills and AGENTS.md files, with separate review and rewrite roles, a house voice and a catalog of AI-sounding tells.
evloghq/evlog
Produce a before/after visual comparison of an evlog surface (landing, docs, telemetry, playgrounds) and share it as public Blob URLs.
Categories
Runs the daily review of evlog's written material: picks the worst-scoring files in one group, rewrites what holds up, and opens a single pull request that reports the changes. A pass handles one group of files and ends in one pull request whose body is the report.md files, and the scanner's own count wins if it differs.
evlog Content Pass fits situations like: the scheduled daily content pass for evlog fires; reviewing and rewriting a docs page, README, skill or AGENTS.md against the content standard; deciding what is worth writing next when no page scores badly.
Run `npx skills add evloghq/evlog --skill content-pass -a claude-code`. Or copy the skill folder (apps/evi/agent/skills/content-pass in evloghq/evlog) into .claude/skills/content-pass in your project. Claude Code loads it when a task matches its description.
Run `npx skills add evloghq/evlog --skill content-pass -a codex`. Or copy the skill folder (apps/evi/agent/skills/content-pass in evloghq/evlog) into .agents/skills/content-pass in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add evloghq/evlog --skill content-pass -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/content-pass, .gemini/skills/content-pass, .github/skills/content-pass and .opencode/skills/content-pass in your project.
Going by SKILL.md and its folder, evlog Content Pass needs the command-line tools its instructions call (git, node and pnpm). Our summary lists: The evlog repository with its `content-targets` scanner tool; The `write-evlog-content` skill.
SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
evlog Content Pass is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4k tokens (SKILL.md is roughly 16k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with evlog Content Pass: Grammar Check (ethereum/execution-specs, 1.2k stars), Evidence-Backed Documentation Writer (bgauryy/octocode, 949 stars), Not AI (udaysharmadev/Not-Ai, 132 stars) and Technical Writer (OneWave-AI/claude-skills, 328 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
evloghq (a GitHub organization) maintains it in evloghq/evlog, which has 1,888 GitHub stars. The repository holds 20 skills in this directory. The repository was last updated on October 8, 2026.
Source: evloghq/evlog on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.