Agent skill

evlog Content Pass

by evloghq in evloghq/evlog

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.

MITAuto-check passedWriting & Content

Install evlog Content Pass

skills CLI
$ npx skills add evloghq/evlog --skill content-pass -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install evloghq/evlog content-pass --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ 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-src

Use ~/.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/

Facts

Skill name
content-pass
GitHub stars
1.9k
Token cost
~4k tokens
SKILL.md length
2,364 words
Files
1
Skills in repo
20
Repo updated
First seen
Licence
MIT

At a glance

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.

  • Works in 8 steps: Pick the targets → Branch → Apply the derivable fixes first → …
  • The scheduled daily content pass for evlog fires
  • SKILL.md covers The two halves, Rewrite, Enrich and Once a week, the corpus check, plus 1 more section
  • Calls git, node and pnpm

What it does

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.

When your agent uses it

  • 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

Example prompts

  • “Run the content pass on the docs surface and open the pull request.”
  • “Rewrite the worst-ranked package README and report what changed.”
  • “Nothing is ranked badly today. Pick something to enrich and tell me why.”

Requirements

  • The evlog repository with its `content-targets` scanner tool
  • The `write-evlog-content` skill

Workflow steps

8 steps, taken from the step headings in SKILL.md.

  1. Pick the targets
  2. Branch
  3. Apply the derivable fixes first
  4. Review, in parallel
  5. Rewrite, in parallel
  6. Verify
  7. Open the pull request
  8. Say it in one line

What it can do on your machine

Read from SKILL.md and the folder at commit 54dcc50. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Shell commands in SKILL.md call:

    • git
    • node
    • pnpm

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    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.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

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.

Always · name and description, kept in context so the agent knows when to use it
~179
When it runs · the whole SKILL.md, loaded when a task matches
~4k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from evloghq/evlog at commit 54dcc50, republished under its MIT licence (© evloghq). 2,364 words, ~4,037 tokens.

Download SKILL.mdSave it as .claude/skills/content-pass/SKILL.md (or your agent's skills folder).
name
content-pass
description
The daily pass over evlog's written surfaces. Picks the files the scanner ranks worst across the docs, the landing, the package READMEs, the skills, and the AGENTS.md files, reviews them against the content doctrine, applies what holds, and opens one ready PR whose body is the report. Also covers the enrichment half, run when nothing scores badly enough to rewrite, such as the page an index promises and nobody wrote, the integration documented at half its contract, the correction that should have become a rule. Load this when the content-pass schedule fires, or when Hugo asks for a content pass, a docs review, a rewrite of a page, a README, a skill or an AGENTS.md, or what is worth writing next.

Content pass

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.

The two halves

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.

Rewrite

1. Pick the targets

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.

2. Branch

In /workspace/repo, from a fresh main:

git -C /workspace/repo checkout -B content/<group>-<slug> origin/main

Slugify the group: .agents/skills/create-adapter becomes skills-create-adapter.

3. Apply the derivable fixes first
node scripts/content-lint/index.mjs <each target> --fix

This 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.

4. Review, in parallel

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.

5. Rewrite, in parallel

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.

6. Verify

In the sandbox:

node scripts/content-lint/index.mjs <each changed file>
git -C /workspace/repo diff --stat

Then the checks the changed files actually need:

  • A docs page or the landing: run the docs lint and content tests, parse changed frontmatter with the actual content parser, and inspect the rendered title, description and changed MDC. Run changed executable examples against the relevant package and runtime. A passing prose scan does not verify metadata, APIs or rendered output.
  • A skill or an AGENTS.md: nothing builds these, so the check is the scanner plus reading the diff. Every relative link is resolved by 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:

  • Correctness is the blocking check. Send every freshly captured saved snapshot through 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.
  • Review new scanner candidates against their legitimate twins. Do not revert a factual correction solely because its style score fell. Explain a confirmed false positive in the PR and propose a narrow scanner correction; do not weaken thresholds or add filler to satisfy the score. A required CI failure blocks the PR: fix it or report the blocker.
  • The diff touches only the target files. A stray change to a component, a config, or a package is a bug in the pass, not a bonus.
  • Frontmatter and MDC structure survived. Read the diff, not just the score.

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.

Show full SKILL.md (1,017 more words)Show less
7. Open the pull request

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.
  • One docs page under 4.integrate/adapters/<name>/ or 4.integrate/frameworks/<name> takes that subsystem's scope: docs(posthog):, docs(hono):.
  • Several pages, or a page belonging to no subsystem: docs: with no scope.
  • The package READMEs: 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.
  • A changeset only when the diff leaves 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.
  • The body is the report:
markdown
## 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.

8. Say it in one line

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.

Enrich

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:

  • A promise with no page. A section index, a card group, or a 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.
  • An integration documented at half its contract. Every framework page owes 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.
  • Source that outran the docs. A recent export, option, or adapter in packages/evlog/src with no page. git log --since='30 days ago' -- packages/evlog/src against the content tree.
  • A skill that outran the repository. 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.
  • A dossier nobody refreshed. 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.
  • A correction that should be a rule. 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.
  • A blog post that has a reason. Only when something happened: a release with a real behavior change, a decision with a cost worth explaining, a measurement that surprised us. Read 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.

Once a week, the corpus check

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:

  • A term that split. 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.
  • A skill contradicting a docs page. Same subject, two procedures. The skill wins on repository workflow, the docs win on public API, and either way one of them is wrong today.

What this pass never does

  • Rewrite a file nothing was found on. No finding, no edit.
  • Dispatch a reviewer for something --fix already handles.
  • Run --fix over the corpus. It takes the targets of this pass and refuses a bare sweep for that reason.
  • Touch a file inside its cooldown, whoever changed it.
  • Edit the landing page for voice or rhythm.
  • Change a skill's procedure, bounds, or description. Those are proposals, in the PR body.
  • Rewrite 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.
  • Open more than one PR, or open one before the readiness gate is complete.
  • Add a changeset for a change confined to apps/*.
  • Widen its own scope because the group looked bad. The group will still be there tomorrow.

© evloghq, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in apps/evi/agent/skills/content-pass of evloghq/evlog.

Open the folder on GitHubat commit 54dcc50

Compare with similar skills

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.

evlog Content Pass compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
evlog Content Pass this skillevloghq/evlog1.9k—~4kAutomated safety check: PassMIT
Grammar Checkethereum/execution-specs1.2k—~424Automated safety check: PassCC0-1.0
Evidence-Backed Documentation Writerbgauryy/octocode949—~2kAutomated safety check: PassMIT
Not AIudaysharmadev/Not-Ai132—~4.7kAutomated safety check: PassMIT
Technical WriterOneWave-AI/claude-skills328—~1.2kAutomated safety check: NotesMIT
Dsh Web Documentationzhu1090093659/dsh-web8.5k—~479Automated safety check: PassApache-2.0

Similar skills

  • Grammar Check

    ethereum/execution-specs

    Audit grammar in documentation and code comments. An agent skill from ethereum/execution-specs.

    1.2k GitHub stars~424 tokensUpdated today
    Writing & ContentAuto-check passed
  • Writes, repairs and copyedits project docs against the Google developer documentation style guide, verifying claims in the repository before stating them.

    949 GitHub stars~2k tokensUpdated today
    DevelopmentAuto-check passed
  • Not AI

    udaysharmadev/Not-Ai

    Edit prose into a clear, specific, source-grounded version that preserves the author's meaning and voice.

    132 GitHub stars~4.7k tokensUpdated 4 days ago
    Writing & ContentAuto-check passed
  • Technical Writer

    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…

    328 GitHub stars~1.2k tokensUpdated 7 days ago
    DevelopmentAuto-check: notes
  • Dsh Web Documentation

    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.

    8.5k GitHub stars~479 tokensUpdated today
    Agent WorkflowsAuto-check passed
  • 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.

    6.1k GitHub stars~4k tokensUpdated 1 mo ago
    DevelopmentAuto-check passed

More from evloghq/evlog

All 20 skills in this repo
  • Walks through adding a new built-in evlog drain adapter for an observability platform: source, build config, exports, tests, docs and PR scope.

    1.9k GitHub stars~2.9k tokensUpdated today
    Auto-check passed
  • Guides adding a new built-in enricher to the evlog package, covering the source, tests, docs, README, a related skill and a changeset.

    1.9k GitHub stars~1.7k tokensUpdated today
    Auto-check passed
  • 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.

    1.9k GitHub stars~5k tokensUpdated today
    Auto-check: notes
  • 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.

    1.9k GitHub stars~2.9k tokensUpdated today
    Auto-check passed
  • 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.

    1.9k GitHub stars~2.9k tokensUpdated today
    Auto-check passed
  • Before After

    evloghq/evlog

    Produce a before/after visual comparison of an evlog surface (landing, docs, telemetry, playgrounds) and share it as public Blob URLs.

    1.9k GitHub stars~2.7k tokensUpdated today
    Auto-check passed

Questions about evlog Content Pass

What does evlog Content Pass do?

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.

When should I use evlog Content Pass?

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.

How do I install evlog Content Pass in Claude Code?

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.

How do I install evlog Content Pass in Codex?

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.

Can I use evlog Content Pass in Cursor, Gemini CLI or GitHub Copilot?

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.

What does evlog Content Pass need to run?

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.

Does evlog Content Pass access the network?

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.

Is evlog Content Pass safe to install?

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.

What licence does evlog Content Pass use?

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.

How many tokens does evlog Content Pass use?

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.

What are the alternatives to evlog Content Pass?

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.

Who maintains evlog Content Pass?

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.