No framework, no build server, no database. This is plain HTML, CSS and JavaScript on GitHub Pages — the same free static hosting anybody gets with a repository — and a pile of Python that writes the pages before they ship.
Every number below is counted from the repository when this page is built, not typed in. That is the rule the whole site runs on: if a figure is on a page, something measured it.
A post is a file. Everything a reader sees is built from it, which means the pages can always be thrown away and made again — and are, on every publish. Here is the whole trip a post takes, from the file to your screen.
The same trip, laid out at once: what is written by hand, what Python builds from it, what stands between the two, and what a reader finally opens. Every box names a real file in the repository — a check refuses this page if one of them stops existing.
Four kinds of post, and they do not take the same route. Three of them do work before a word is written that the architecture series never does — a roundup fetches a week of feeds and builds an inventory from them, a daily post ranks everything the cloud announced yesterday, and a lab post has to actually run the thing it is about. Two of them draw a diagram and two never do. From the sync onwards every post is treated identically, which is the last five stops on all four.
posts/arch-060-….htmlone hand-written file, with the vendor’s own docs quoted and every figure carrying a sourceblog/assets/diagrams/arch-060-….svgraw SVG, no tool — all 138 of the 138 architecture posts carry onebuild_arch_post.py138 post pages are built from the template and never regenerated; the other 137 come from sync_blogpublish.py → sync_blog.pyrewrites 19 shared files: the index, the paged archive, the feed, the sitemap, the offline workerprepublish.py21 checks on what was just written, then it prints Readylocal, reversiblenothing is public yet and nothing is claimedpreflight.py62 checks over all 275 posts, 35 of them driving a real browser. Ten to thirteen minutes, measured. A failure refuses the pushGitHub Pages, then the search index8 jobs on a clock keep the rest of the site current afterwardsnews.py → DAILY-BACKLOG.mdevery announcement from the day before is ranked and written down, not just the one that becomes a post — the feed only holds about a weekposts/daily-037-….htmlone item, in depth, with what the announcement left outblog/assets/diagrams/daily-….svgall 36 carry one, like the architecture seriessync_blog.pyno per-post builder here: the page comes out of the sync with the other 137publish.py → sync_blog.pyrewrites 19 shared files: the index, the paged archive, the feed, the sitemap, the offline workerprepublish.py21 checks on what was just written, then it prints Readylocal, reversiblenothing is public yet and nothing is claimedpreflight.py62 checks over all 275 posts, 35 of them driving a real browser. Ten to thirteen minutes, measured. A failure refuses the pushGitHub Pages, then the search index8 jobs on a clock keep the rest of the site current afterwardsfetch_week.py · fetch_week_gcp.py · fetch_azure_week.pyraw RSS from every feed, parsed rather than summarised. A model reading the feed missed 24 of 66 announcements oncebuild_weekly_inventory.pyone row per announcement, in the vendor’s own words, every link fetched — it exits non-zero if one failsposts/weekly-008-….htmlthe week in a paragraph, then what is worth acting onsync_blog.pyno diagram and no per-post builder: none of the 19 roundups carries eitherpublish.py → sync_blog.pyrewrites 19 shared files: the index, the paged archive, the feed, the sitemap, the offline workerprepublish.py21 checks on what was just written, then it prints Readylocal, reversiblenothing is public yet and nothing is claimedpreflight.py62 checks over all 275 posts, 35 of them driving a real browser. Ten to thirteen minutes, measured. A failure refuses the pushGitHub Pages, then the search index8 jobs on a clock keep the rest of the site current afterwardsa console, and a billa lab post’s whole claim is that the thing runs, so it goes out when it runs — these have no fixed publish dayposts/week-20-….htmlwhat was built, what it cost, and what brokesync_blog.pyno diagram and no per-post builder, the same path the roundups takepublish.py → sync_blog.pyrewrites 19 shared files: the index, the paged archive, the feed, the sitemap, the offline workerprepublish.py21 checks on what was just written, then it prints Readylocal, reversiblenothing is public yet and nothing is claimedpreflight.py62 checks over all 275 posts, 35 of them driving a real browser. Ten to thirteen minutes, measured. A failure refuses the pushGitHub Pages, then the search index8 jobs on a clock keep the rest of the site current afterwardsThe last five stops are the same on every path. 137 of the 275 post pages are built by sync_blog rather than by a builder of their own; only the three architecture series have one.
scroll the diagram sideways →
8 of those 14 run on a clock, on GitHub’s machines rather than mine. They fetch, rebuild and commit on their own — the cloud pages are current whether or not I have opened a laptop. The rest run when something is pushed.
| Job | Does | When |
|---|---|---|
| doc-freshness | flag documentation going stale | Tuesdays, 07:00 UTC |
| health | rebuild the health report | daily, 13:00 UTC |
| ingest-news | ingest announcements, rebuild What’s new | daily, 05:10 UTC |
| refresh-ai | scheduled maintenance | daily, 05:40 UTC |
| refresh-aws-services | refresh the AWS service catalogue | Mondays, 06:00 UTC |
| refresh-events | re-import events from the vendors | daily, 05:40 UTC |
| status | fetch every cloud's incidents, rebuild Live status | every hour |
| verify-events | open every event link, reconcile what is missing | daily, 06:20 UTC |
62 checks on every push, 35 of them in a real browser. They do not read the code — they open the pages and look: does the header hold still, does the music button actually play, does a filter filter, does every link still resolve, is each page asking for the current stylesheet. If one fails, the push is refused. It costs about twelve minutes, which is the price of not finding out from a reader.
The terminal on the portfolio answers questions over these posts rather than from a model’s memory: the question is matched against what is actually written here, and the answer cites the post it came from. If nothing here covers it, it says so instead of inventing something.
Static files cannot be hacked through a plugin, cost nothing to serve, and load on a bad connection. Nothing here needs a server to be running, a subscription to be paid or a database to be backed up. In ten years these pages will open the same way, because they are just files.
The whole thing is public: github.com/katta698/katta698.github.io