<feed xmlns='http://www.w3.org/2005/Atom'>
<title>mono.git/cgithub/src/worker.ts, branch main</title>
<subtitle>Unnamed repository; edit this file 'description' to name the repository.</subtitle>
<id>http://git.mou.fo/2026/mono.git/atom/cgithub/src/worker.ts?h=main</id>
<link rel='self' href='http://git.mou.fo/2026/mono.git/atom/cgithub/src/worker.ts?h=main'/>
<link rel='alternate' type='text/html' href='http://git.mou.fo/2026/mono.git/'/>
<updated>2026-09-05T01:49:59Z</updated>
<entry>
<title>Split the page shell out of the repository layout</title>
<updated>2026-09-05T01:49:59Z</updated>
<author>
<name>Joe Mou</name>
<email>dev@mou.fo</email>
</author>
<published>2026-09-05T01:26:21Z</published>
<link rel='alternate' type='text/html' href='http://git.mou.fo/2026/mono.git/commit/?id=53ac3bc511a45e4e2e3f234a8b8dcf853b0c38d9'/>
<id>urn:sha1:53ac3bc511a45e4e2e3f234a8b8dcf853b0c38d9</id>
<content type='text'>
layout.eta was two things at once: the HTML shell every page needs and
the repository chrome around it. owner.eta, being the one page that is
not about a repository, could use neither and carried its own copy of
the shell, which had drifted -- its footer named no build commit and
did not link to the original page on GitHub.

The shell moves to views/layouts/base.eta, taking its title and any
deferred scripts as layout data, and the chrome to views/layouts/repo.eta,
a layout over it that adds the clone commands, nav, search box, and the
"/" shortcut that focuses it. Repository pages point at repo.eta and
render as before; owner.eta uses base.eta directly and so gains the
footer it was missing.

Templates now live in more than one directory, so scripts/build.ts walks
views/ recursively and keys each template by its path underneath it.
Names crossing a directory are written from the views root
("/layouts/base.eta"), the one form both Eta's filesystem resolver and
the precompiled resolver in worker.ts agree on; siblings stay relative.

Co-Authored-By: Claude Opus 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01Ba5p88cWtCq42vf3uweweL
</content>
</entry>
<entry>
<title>Show the build's commit in the page footer</title>
<updated>2026-08-11T12:38:30Z</updated>
<author>
<name>Joe Mou</name>
<email>dev@mou.fo</email>
</author>
<published>2026-08-11T12:37:25Z</published>
<link rel='alternate' type='text/html' href='http://git.mou.fo/2026/mono.git/commit/?id=ab52f48e50d0dd242ad5b0cfbee9c458946cd427'/>
<id>urn:sha1:ab52f48e50d0dd242ad5b0cfbee9c458946cd427</id>
<content type='text'>
Workers can't shell out at request time, so the commit has to be baked
in before wrangler bundles the sources. compile-views.ts grows a second
job and becomes scripts/build.ts: alongside the precompiled views it
writes src/commit.generated.ts with `git describe --tags --always
--dirty`, which yields a bare short hash until the repo is tagged and
marks builds made from an unclean working copy.

Co-Authored-By: Claude Opus 5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Add Cloudflare Workers deployment target</title>
<updated>2026-07-15T06:08:29Z</updated>
<author>
<name>Joe Mou</name>
<email>dev@mou.fo</email>
</author>
<published>2026-07-15T06:08:17Z</published>
<link rel='alternate' type='text/html' href='http://git.mou.fo/2026/mono.git/commit/?id=9b556ffe6c0c0528697e15f7f4f35107de212ce1'/>
<id>urn:sha1:9b556ffe6c0c0528697e15f7f4f35107de212ce1</id>
<content type='text'>
Split routes into a shared createApp() (src/app.ts) used by both the
Node entry (src/index.ts) and a new Workers entry (src/worker.ts).
Workers disallow runtime code generation, so scripts/compile-views.ts
precompiles the Eta templates into src/views.generated.ts and rendering
switches from renderAsync to the sync render. Static files move to
public/static so Workers Static Assets can serve them; the Node build
and serveStatic root are updated to match.

Deploy with pnpm run deploy:cf, local dev with pnpm run dev:cf.

Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
</feed>
