The landing page for github.com/gledach: free, installable tools that turn public data into information, insight and intelligence.
Static. No build step, no framework, no dependencies. Six pages, one stylesheet and one script.
| Path | File | What it is |
|---|---|---|
/ |
index.html |
signal, slot 01, and the shelf index at the foot |
/about |
about/index.html |
the organisation, previews, requests |
/signal-patterns |
signal-patterns/index.html |
slot 02, the written reasoning |
/whenrun |
whenrun/index.html |
slot 03 |
/phonehome |
phonehome/index.html |
slot 04 |
/recall |
recall/index.html |
slot 05 |
Satellite pages are directories, not whenrun.html. Cloudflare's
auto-trailing-slash would resolve either, but python -m http.server has no
extensionless handling and answers /whenrun with a 404. A directory gets a 301 to
/whenrun/ from both, so the same links work locally and in production. Do not flatten
them back.
CLAUDE.md is the source of truth for anything visual. It carries the ground, the type roles, the layout and motion rules, the accessibility bar, and every deviation.
Two rules break the page loudest when missed: no em dashes anywhere, and every claim shown as product UI or data rather than an icon with a blurb.
python -m http.server 8080 # http://127.0.0.1:8080
npx serve . # whatever port it printsAbsolute asset paths mean opening index.html from disk will not load the stylesheet. Use a
server.
Cloudflare Workers with static assets. wrangler.jsonc is the whole configuration and
there is no Worker script, because nothing here runs server side.
| Worker Builds setting | Value |
|---|---|
| Build command | (leave empty) |
| Deploy command | npx wrangler deploy |
| Root directory | / |
Nothing is compiled, so an empty build command is correct rather than lazy. Every file in the repository is already the artifact.
wrangler.jsonc sets not_found_handling to 404-page, so an unmatched path serves
404.html with a real 404 status. Do not change it to single-page-application: this is a
multi-page static site and that setting would answer every bad URL with a 200 and the
homepage.
.assetsignore keeps documentation out of the deployed site. It also excludes DESIGN.md,
which is gitignored but does sit in this directory on a maintainer's machine, so a local
wrangler deploy cannot publish it by accident.
The Worker name must match. wrangler.jsonc says gledach-de. If the Worker in your
Cloudflare dashboard is called something else, change the name here or wrangler will create
a second Worker next to the first.
Wrangler is not pinned. With no package.json, npx fetches whatever wrangler is
current at build time. That keeps the repository dependency-free, and accepts that a
wrangler release could change behaviour without a commit here. Add a package.json with
wrangler as a devDependency if you would rather have reproducible builds.
The site itself is host-agnostic: static files, absolute paths, no server. Any static host
serves the repository root unchanged, with 404.html as the not-found page.
wrangler.jsonc and .assetsignore are the only Cloudflare-specific files and they are
inert everywhere else.
Every page is hand-written HTML rather than rendered from a data file, so the content works with JavaScript off and a crawler sees it. Adding a tool is a copy-paste of an existing satellite page plus six edits elsewhere.
- Copy a satellite directory.
recall/is the fullest andwhenrun/the most typical. Rename it to the tool, and work through the page top to bottom. Slot 01 is the exception:signalis the index itself. Promoting a different tool to the index is a decision about what the whole site is for, not a step in this checklist. - Write the hero claim and the situation first. The
<h1>is what the tool does in one sentence, with the de-emphasised clause in<em class="quiet">. The section under it names the situation the reader is already in, before any sentence about mechanism. If you cannot write that without inventing a reader, the tool is not ready for a page. - Put real output beside the hero. A
<figure class="console">carrying terminal output, a product capture or an MCP response. Mark the bar with<span class="tag tag-quiet">real output</span>only if it is. An icon and a paragraph is not finished, and neither is invented output. - Every page ships its blind spots. A
<ul class="blind">section, in full, taken from the tool's own README. This is a house rule, not a nicety: the section is the reason the rest of the page can be believed. - Figures come from the tool's README. If the README says 128 tests, the page says
128. Where a figure does not exist yet, write a
[BRACKETED]placeholder rather than an estimate. - Add the card to the index. One more
<a class="card">in the#shelfsection ofindex.html, and one more entry in theElsewhere on the shelfblock on every other satellite page. Those blocks are the cross-links and they go stale silently. - Update the slot count in the
#shelfeyebrow ofindex.html, and the same count inindex.mdandllms.txt. It is stated in an eyebrow rather than a headline so it never has to be rewritten as prose. - Mirror into
index.mdandllms.txt.llms.txtcarries the full per-tool entry,index.mdcarries the shelf table at the foot. Both go stale silently. - JSON-LD, in two places. A
SoftwareApplicationblock in the new page's own head, and anOfferunder theOrganizationnode inindex.html. - Add the page to
sitemap.xml. - Re-render
assets/img/og-home.png. It carries the tool names and the slot count, so it goes stale the moment a tool ships. See "Social cards and icons" below.
Keep the empty-slot card last on the index, and keep it honest. It exists to say nothing is shipped there yet, which is the opposite of a roadmap.
gledach/requests is the public intake queue. The
empty slot card links at its issue form, which asks the three questions that decide whether
anything is watchable at all: what the reader checks by hand, where it is published, and
whether seeing it needs an account. There is deliberately no email fallback: a request sent
privately cannot be labelled, linked or seen by anyone else, so the open issues are the whole
list by construction. Do not reintroduce a mailto: anywhere on the site.
Do not point a request link at a tool's own repository. A request for a tool that does
not exist is not an issue in a tool that does. That was the wiring until requests existed,
and it sent new-tool requests into signal's tracker.
<tool>.gledach.de, one per tool, replaced in place by the next export.
signal.gledach.de is the first: a static export of a real Signal deployment, produced by
npm run demo:html in gledach/signals. Those are
separate deployments. This repository does not host them and knows nothing about them beyond
the links in the markup.
Two images in this repository are rendered, not drawn. Their sources are HTML in
assets/og/, which is excluded from deploy by .assetsignore, and the renders are
committed:
| Render | Source | Size |
|---|---|---|
assets/img/og-home.png |
assets/og/og-home.html |
1200x630 |
apple-touch-icon.png |
assets/og/apple-touch-icon.html |
180x180 |
To regenerate, serve the repository and screenshot each source at exactly its size. Any headless Chrome will do:
python -m http.server 8080
npx -y puppeteer-core screenshot ... # or DevTools, or PlaywrightThe only requirement is that the viewport matches the table above exactly and that
document.fonts.ready has resolved first, because both cards load their faces from
Google Fonts. Screenshot before the fonts land and you ship a card set in Georgia.
Both sources are still set in the pre-October-2026 faces (Bricolage Grotesque,
Instrument Serif, Geist Mono) and the oxblood accent, because the redesign to the
ledger system did not touch them. They need rewriting against the tokens at the top of
assets/site.css before the next render, or the card will not look like the site it
links to.
og-home.html deliberately copies its tokens instead of importing site.css. A
social card that silently restyles itself when the site does is worse than one that
holds still, and crawlers cache the render for weeks regardless.
The card carries the slot count. Adding a tool means re-rendering it, which is why that is in the checklist above.
The touch icon is square and full bleed. iOS applies its own corner mask, so an
icon that arrives pre-rounded is rounded twice. favicon.svg keeps its 9px radius
because nothing masks that one.
assets/og/linkedin-cover-{a,b,c}.html are three personal-profile banner variants,
rendered the same way at 1584x396. They are not site assets and nothing links to
them, so the renders go to .apsolut/07-files/exports/ rather than assets/img/,
and are listed in that folder's manifest. The sources live here so the banners stay
reproducible and on the same tokens as the site.
Append #guides to the URL to overlay the profile-photo circle and the unusable
regions. LinkedIn puts the avatar over the bottom left and clips the bottom strip
on mobile, so nothing readable may sit inside x 0-430 or the bottom 90px. All three
keep their content in x 470-1520, y 60-306, which is checked rather than assumed.
This matters more here than on most sites, because the tools on this shelf exist to be read by agents.
| File | Purpose |
|---|---|
llms.txt |
Every tool in full, plus the house rules, in plain text |
index.md |
Markdown twin of the landing page, with the shelf table at the foot |
JSON-LD in index.html |
WebSite, WebPage, SoftwareApplication for signal, Organization with an Offer per tool, Person |
| JSON-LD per satellite | One SoftwareApplication or TechArticle in each page's own head |
sitemap.xml |
Five pages plus the two agent-readable files |
All of them are maintained by hand and all of them go stale silently. Change a page, change its twins.
- There is no product screenshot anywhere on the site. The ledger redesign replaced the hero capture with the MCP response that proves the same claim, and every satellite proves itself with terminal output. That satisfies the proof rule, and it also means a visitor never sees the dashboard. Worth deciding on deliberately rather than leaving as a side effect.
assets/img/signal-compare.jpgandsignal-live-feed.jpgare both unreferenced. They were the hero captures before the redesign. Still in the tree, still deployed, and nothing links to either. Use them or delete them. Note that Compare's prose cells contain U+2014, so putting that one back puts em dashes on the page as pixels.- The social card and the touch icon are off brand. Both renders predate the redesign and carry the old faces, the oxblood accent and the headline "free tools that find things out". The sources need rewriting against the new tokens and both need re-rendering. This is the largest outstanding piece.
- Fonts load from Google Fonts. The design system asks for self-hosted woff2 with
font-display: swapand the display face preloaded. Until that is done, the page makes a third-party request on render. - The whenrun sparkline pins its own font stack. Block elements (U+2581 to U+2588)
only line up if every glyph comes from one font at one advance width, so any
precontaining them carriesclass="blocks". See the note inassets/site.css.
MIT. See LICENSE.