madelogdocs

Page anatomy

Each section of the published page, top to bottom, with the events and config keys it is built from and the exact wording it uses when something is missing.

The page is rendered from one Tera template into a single HTML file, .madelog/site/index.html, with inline CSS and about 30 KB for a small project. Everything the template can show is first collected into one context from the log and config.toml; a private note or a redacted prompt is dropped there, once, so it cannot reach the page by accident. The template has a small inline script for click-to-expand and works without it.

Two things about the whole page: the <title> is <project.name> · how it came together, and a <meta name="robots" content="noindex"> tag asks search engines to stay out. Colour is not used to carry meaning; "verified", "generated" and "hidden" are words.

The project name from project.name (the repository directory name unless you changed it), and the date range of the record: the day of the first event to the day of the last, or one date when both fall on the same day. On a published page a "Verified record" link points at the badge; a local render has no link there.

1. Intent

ElementSource
Headlinewhat from the newest intent event. Empty: "How <name> came together"
Line under itfor_whom from the same event. Empty: omitted
"Built over N working days between <first> and <last>."Distinct local dates that carry a commit; first and last event timestamps
Four figuresCommits; public decisions (private ones are not counted); AI sessions, hidden ones included; days active
Deliveredproject.delivered_url, shown without its scheme. Unset: "not yet published" in muted type
Built withtools from the intent event, one tag each. Empty: "not recorded"
Screenshotproject.screenshot, as a link, only when set
Record"Hash-chained log of N events" where N is every event in the chain, the same number madelog verify prints — more than the timeline shows, because intents, patterns, summaries, hides and private decisions are chained but not drawn — followed by ", root confirmed by the server on <date>" or ", rendered on this machine", and a link to the badge

The sentence "Every commit, decision and AI session below was recorded as it happened; nothing was written after the fact." is fixed text.

2. Timeline

An inline SVG, 1000 units wide, with one axis and three lanes: decisions above the line, commits on it, AI sessions below. Each entry is placed by its timestamp between the first and last event of the whole log (0 to 1 along the axis, rounded to four decimals). Day ticks sit under the axis at every midnight, Mondays heavier and labelled with the month; past 24 ticks the axis is thinned to every second, third or more day.

Timeline entryBuilt fromPointRecord below
commitevery commit eventa circle on the axistimestamp, commit, short sha, subject line; opens to the diff excerpts, one block per file that has one, or "No diff excerpt recorded for this commit (ignored, binary or redacted paths)."
decisionevery decision event with private: falsea diamond abovetimestamp, decision, the sentence; no detail
AI sessionevery ai_session event that is not hiddena circle belowtimestamp, AI session, short sha, "<tool> session"; opens to the prompt in a quote block, or "No prompt was recorded for this session (not captured, or redacted)."
hidden sessionan ai_session named by a hide eventa dashed circle below"hidden session", "AI session hidden by the author"; opens to "The author hid this session before publishing. The event stays in the hash chain; only its contents are withheld."

intent, pattern, summary and hide events have no point of their own. Clicking a point opens its record in the "Every record (N)" list, which is collapsed by default. Without JavaScript the point is a plain link to the record's anchor.

Between the axis and the record list sit the weekly summaries: one block per week, headed "<d Mon><d Mon>", holding the newest summary event for that week and its marker. With no summaries: "No weekly summaries have been generated for this project yet."

3. Moments

Headed "One moment", "Two moments", up to "Five moments", from the candidates described in Concepts. Each is a title, a body of two to four sentences, and a row of links to the records it was built from, labelled by date and kind ("1 Sep commit · 1 Sep AI session · 1 Sep commit"). A moment with generated: true would carry a "generated" marker; in this version none does. With no candidates the section says: "Nothing in this record stood out as a moment worth retelling. The timeline above is the whole story."

4. Code attribution

Shown only when at least one ai_session event exists, hidden or not. Otherwise: "No AI attribution was recorded for this project. Without Git AI notes there is no per-line record of what a model proposed, so this page does not guess."

FigureComputed as
totalai_lines + human_lines
AI-proposed, accepted unchangedsum of ai_lines over every session and file, minus reworked
AI-proposed, reworked by handsum of ai_lines_modified_by_human, capped at ai_lines
written by handsum of added over every commit's files, minus ai_lines (never below zero)

The three percentages are rounded so they add up to 100. The bar is followed by a fixed note: "Lines are counted at commit time, so a line the AI proposed and the author rewrote in the same session counts as reworked. Deleted lines are not counted." With current Git AI notes the reworked figure is 0; AI sessions explains why.

5. Badge

Published:

Verified record. Records from 18 Sep 2026, 07:53 UTC to 18 Sep 2026, 07:53 UTC, root 6cc1406d8249, confirmed by the server on 18 Sep 2026, 07:53 UTC. Every event carries the SHA-256 of the one before it. Editing any record after the fact changes the root, and the root on the server would no longer match. Check the root

The full 64-character root follows on its own line, then the public address of the page. "Check the root" links to /v1/verify/<slug>.

Local render:

Not yet published. Records from <first> to <last>, root <12 characters>. This page was rendered locally with madelog publish --local. The root has not been confirmed by a server, so the record cannot be checked by a third party yet.

Either variant adds, when it applies: "N session(s) hidden by the author before publishing. Hiding is itself a recorded event; the chain stays whole."

Colophon

Three fixed lines close the page: "Generated by madelog from a local hash-chained log.", "Paragraphs marked generated were written by a model and reviewed by the author.", and "Raw prompts and full diffs never left the author's machine."

Where each word comes from

WordingCondition
"generated locally (<model>)"summary with generated_by: ollama:<model>
"generated from the log"summary with generated_by: heuristic
"summary generated by remote model (<model>)"summary with generated_by: remote:<model>; not produced in this version
", edited" appended to any of the abovesummary with edited: true and a generated generated_by; a summary rewritten by you has generated_by: user and no marker at all
"1 session hidden"one hide event for a distinct session; two hide events for the same session still count one
"not yet published" under Deliveredproject.delivered_url unset. The same words as the badge heading, but about the delivered thing, not the page

Printing

A print stylesheet sets white paper, black ink, 9.5 pt body text and keeps sections from breaking across pages, so the page can be saved as a PDF from the browser with the badge visible.