<feed xmlns='http://www.w3.org/2005/Atom'>
<title>cgithub.git/views/blob.eta, branch main</title>
<subtitle>GitHub alternative frontend</subtitle>
<id>http://git.mou.fo/2026/cgithub.git/atom/views/blob.eta?h=main</id>
<link rel='self' href='http://git.mou.fo/2026/cgithub.git/atom/views/blob.eta?h=main'/>
<link rel='alternate' type='text/html' href='http://git.mou.fo/2026/cgithub.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/cgithub.git/commit/?id=3fd91017f05714fb5c049d662ae00dc31203485b'/>
<id>urn:sha1:3fd91017f05714fb5c049d662ae00dc31203485b</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>Link blobs to their history and back</title>
<updated>2026-09-04T02:16:44Z</updated>
<author>
<name>Joe Mou</name>
<email>dev@mou.fo</email>
</author>
<published>2026-09-03T05:37:35Z</published>
<link rel='alternate' type='text/html' href='http://git.mou.fo/2026/cgithub.git/commit/?id=a52481a3884447f94aad2d97e0407112c818a32d'/>
<id>urn:sha1:a52481a3884447f94aad2d97e0407112c818a32d</id>
<content type='text'>
Nothing in a commits payload says whether the path it lists is a file or
a directory: currentBlobPath, despite the name, is only the path filter,
and is set for a directory just the same. GitHub's own UI cannot tell
either, and points its browse button at /blob/&lt;oid&gt;/&lt;path&gt; so that the
redirect resolves a file to its blob. We do the same, and the blob route
already turns that redirect into one of our own tree URLs.

Breadcrumbs now stay in the view they were clicked from, so walking up
from a history lands in the history of each parent directory rather than
in its listing. The last crumb remains the page you are already on.

A path with no commits now says so rather than rendering an empty page.

Co-Authored-By: Claude Opus 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01R7pRKdmTvNDgT4ZXrwkbH8
</content>
</entry>
<entry>
<title>Anchor blob lines so #L fragments work</title>
<updated>2026-09-03T05:27:35Z</updated>
<author>
<name>Joe Mou</name>
<email>dev@mou.fo</email>
</author>
<published>2026-09-03T05:26:44Z</published>
<link rel='alternate' type='text/html' href='http://git.mou.fo/2026/cgithub.git/commit/?id=80be2418ff2615b454c5edf2819861f58eecf271'/>
<id>urn:sha1:80be2418ff2615b454c5edf2819861f58eecf271</id>
<content type='text'>
Wrap each rendered line in a &lt;span id="Ln"&gt;, for both syntax-highlighted
and plain-text blobs, and shade the line a fragment targets.
</content>
</entry>
<entry>
<title>Display PDF blobs</title>
<updated>2026-08-27T18:53:38Z</updated>
<author>
<name>Joe Mou</name>
<email>dev@mou.fo</email>
</author>
<published>2026-08-27T18:08:06Z</published>
<link rel='alternate' type='text/html' href='http://git.mou.fo/2026/cgithub.git/commit/?id=4797a627f461204b289f95f61b64e3dab8bc00ff'/>
<id>urn:sha1:4797a627f461204b289f95f61b64e3dab8bc00ff</id>
<content type='text'>
GitHub renders a PDF with a viewer of its own and so ships no content for
one, leaving the blob view with nothing to show. Its raw bytes come as
application/octet-stream, which browsers download rather than display, so
serve them from a new embed route that retypes them and point an &lt;object&gt;
at that.

Co-Authored-By: Claude Opus 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01BErPR92xppzGFXkPqXPYj2
</content>
</entry>
<entry>
<title>Handle blobs GitHub cannot preview</title>
<updated>2026-08-12T05:42:59Z</updated>
<author>
<name>Joe Mou</name>
<email>dev@mou.fo</email>
</author>
<published>2026-08-12T05:38:24Z</published>
<link rel='alternate' type='text/html' href='http://git.mou.fo/2026/cgithub.git/commit/?id=ca23e43e0e95014ddd5f8d5e02e1118f5e2978f5'/>
<id>urn:sha1:ca23e43e0e95014ddd5f8d5e02e1118f5e2978f5</id>
<content type='text'>
Binary files with no preview (a .ttf, say) have no rawLines, no
colorizedLines and no richText, so the blob view's final branch threw on
a null textLines and the page 500ed. Offer the raw file instead.

Co-Authored-By: Claude Opus 5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Keep the ref picker on the current view and path</title>
<updated>2026-08-11T21:37:02Z</updated>
<author>
<name>Joe Mou</name>
<email>dev@mou.fo</email>
</author>
<published>2026-08-11T17:32:44Z</published>
<link rel='alternate' type='text/html' href='http://git.mou.fo/2026/cgithub.git/commit/?id=32ed69b43aeca42e88ab37187246e1035d4c933f'/>
<id>urn:sha1:32ed69b43aeca42e88ab37187246e1035d4c933f</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Add repo-scoped search support for issues and PRs</title>
<updated>2026-05-28T03:37:23Z</updated>
<author>
<name>Joe Mou</name>
<email>dev@mou.fo</email>
</author>
<published>2026-05-27T18:02:36Z</published>
<link rel='alternate' type='text/html' href='http://git.mou.fo/2026/cgithub.git/commit/?id=96396c4ed853652ea311d006b4ebe6af15b40684'/>
<id>urn:sha1:96396c4ed853652ea311d006b4ebe6af15b40684</id>
<content type='text'>
We do not support hybrid issue/PR search. Any searches on the issues
endpoint will redirect to an explicit issue-only search.
</content>
</entry>
<entry>
<title>Image support</title>
<updated>2026-01-28T20:32:53Z</updated>
<author>
<name>Joe Mou</name>
<email>dev@mou.fo</email>
</author>
<published>2026-01-28T20:10:00Z</published>
<link rel='alternate' type='text/html' href='http://git.mou.fo/2026/cgithub.git/commit/?id=8770424ae7a0affbb4b05903d355fe856f853797'/>
<id>urn:sha1:8770424ae7a0affbb4b05903d355fe856f853797</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Syntax highlighting</title>
<updated>2026-01-28T20:23:40Z</updated>
<author>
<name>Joe Mou</name>
<email>dev@mou.fo</email>
</author>
<published>2026-01-28T19:40:22Z</published>
<link rel='alternate' type='text/html' href='http://git.mou.fo/2026/cgithub.git/commit/?id=9c0a011974f1392110164052c3481509641d2f58'/>
<id>urn:sha1:9c0a011974f1392110164052c3481509641d2f58</id>
<content type='text'>
Sometimes GitHub returns colorizedLines and sometimes it returns a
terser stylingDirectives, which needs to be applied to rawLines.
</content>
</entry>
<entry>
<title>Render Markdown blobs</title>
<updated>2026-01-28T20:17:54Z</updated>
<author>
<name>Joe Mou</name>
<email>dev@mou.fo</email>
</author>
<published>2026-01-28T18:05:02Z</published>
<link rel='alternate' type='text/html' href='http://git.mou.fo/2026/cgithub.git/commit/?id=dd8d686c9eb9a68eb057aaf86206bc930e22d09a'/>
<id>urn:sha1:dd8d686c9eb9a68eb057aaf86206bc930e22d09a</id>
<content type='text'>
</content>
</entry>
</feed>
