<feed xmlns='http://www.w3.org/2005/Atom'>
<title>cgithub.git/src/app.test.ts, branch main</title>
<subtitle>GitHub alternative frontend</subtitle>
<id>http://git.mou.fo/2026/cgithub.git/atom/src/app.test.ts?h=main</id>
<link rel='self' href='http://git.mou.fo/2026/cgithub.git/atom/src/app.test.ts?h=main'/>
<link rel='alternate' type='text/html' href='http://git.mou.fo/2026/cgithub.git/'/>
<updated>2026-09-25T06:15:02Z</updated>
<entry>
<title>Show each repo nav item only if the GitHub page includes it</title>
<updated>2026-09-25T06:15:02Z</updated>
<author>
<name>Joe Mou</name>
<email>dev@mou.fo</email>
</author>
<published>2026-09-25T05:48:21Z</published>
<link rel='alternate' type='text/html' href='http://git.mou.fo/2026/cgithub.git/commit/?id=226984ad63b063c362e18260a591a3f9a035a8d3'/>
<id>urn:sha1:226984ad63b063c362e18260a591a3f9a035a8d3</id>
<content type='text'>
Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Show issue and pull request status and labels in their lists</title>
<updated>2026-09-25T05:43:53Z</updated>
<author>
<name>Joe Mou</name>
<email>dev@mou.fo</email>
</author>
<published>2026-09-22T02:15:24Z</published>
<link rel='alternate' type='text/html' href='http://git.mou.fo/2026/cgithub.git/commit/?id=1514865ec8911c26612e68048f84c6c8be92449d'/>
<id>urn:sha1:1514865ec8911c26612e68048f84c6c8be92449d</id>
<content type='text'>
Co-Authored-By: Claude Opus 5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Add issue details</title>
<updated>2026-09-25T05:43:53Z</updated>
<author>
<name>Joe Mou</name>
<email>dev@mou.fo</email>
</author>
<published>2026-09-21T22:08:48Z</published>
<link rel='alternate' type='text/html' href='http://git.mou.fo/2026/cgithub.git/commit/?id=fd1c054c3c10dceb1a8a355c74a0d9e9077aae19'/>
<id>urn:sha1:fd1c054c3c10dceb1a8a355c74a0d9e9077aae19</id>
<content type='text'>
Co-Authored-By: Claude Opus 5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Add discussions</title>
<updated>2026-09-25T05:43:53Z</updated>
<author>
<name>Joe Mou</name>
<email>dev@mou.fo</email>
</author>
<published>2026-09-21T21:55:06Z</published>
<link rel='alternate' type='text/html' href='http://git.mou.fo/2026/cgithub.git/commit/?id=499bba129c842c00c1a28d85bc044ab609aee44e'/>
<id>urn:sha1:499bba129c842c00c1a28d85bc044ab609aee44e</id>
<content type='text'>
Discussions are served from GitHub's older server-rendered HTML, with no
embeddedData JSON to read, so the scraper walks the DOM the way the pull
request and wiki code does. A discussion's timeline opens with its own
post and continues with its comments, each carrying its replies nested
inside it, which is where the recursion in _discussionComment.eta comes
from. Categories, upvotes, and the answer a Q&amp;A discussion is marked with
all come along.

Only what GitHub renders up front is shown: neither the next page of
discussions nor the replies it hides behind a "Show N previous replies"
button are fetched, so a comment says how many replies it is missing.

Co-Authored-By: Claude Opus 5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Render the error page in the shared page shell</title>
<updated>2026-09-10T18:58:18Z</updated>
<author>
<name>Joe Mou</name>
<email>dev@mou.fo</email>
</author>
<published>2026-09-10T18:57:44Z</published>
<link rel='alternate' type='text/html' href='http://git.mou.fo/2026/cgithub.git/commit/?id=8d6898a36e2879bc3e1aef95db2a44c10187169e'/>
<id>urn:sha1:8d6898a36e2879bc3e1aef95db2a44c10187169e</id>
<content type='text'>
error.eta carried its own copy of the HTML shell, so error pages missed the
viewport meta tag, the build-commit footer, and the link to the original
GitHub page. The renderer already passes githubUrl and buildCommit to every
template, so the layout needs nothing new from app.ts.

Co-Authored-By: Claude Opus 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01JZAT3YzYP85DihSvQbDKB6
</content>
</entry>
<entry>
<title>Redirect /notifications instead of scraping it as an owner</title>
<updated>2026-09-10T05:01:04Z</updated>
<author>
<name>Joe Mou</name>
<email>dev@mou.fo</email>
</author>
<published>2026-09-10T04:53:48Z</published>
<link rel='alternate' type='text/html' href='http://git.mou.fo/2026/cgithub.git/commit/?id=ca0291062362b3036077cb14bd8d13aca1cde62d'/>
<id>urn:sha1:ca0291062362b3036077cb14bd8d13aca1cde62d</id>
<content type='text'>
A signed-out request for github.com/notifications is bounced to a login
page, so the owner route followed that redirect and left the visitor on
/login. Hand the path over to GitHub before it reaches the route.
</content>
</entry>
<entry>
<title>Serve GitHub's global search when it names one repository</title>
<updated>2026-09-09T18:39:57Z</updated>
<author>
<name>Joe Mou</name>
<email>dev@mou.fo</email>
</author>
<published>2026-09-09T15:03:02Z</published>
<link rel='alternate' type='text/html' href='http://git.mou.fo/2026/cgithub.git/commit/?id=2788097c8df52b6fdc0775655c02138a824b979b'/>
<id>urn:sha1:2788097c8df52b6fdc0775655c02138a824b979b</id>
<content type='text'>
/search?q=repo:owner/name+...&amp;type=code matched the /:owner route and
rendered a profile page for an owner named "search", which GitHub 404s.
It is the URL GitHub's own search box produces, so it arrives whenever a
search is redirected here.

A /search route now takes it: when the query carries a repo: qualifier
and a type, it strips the qualifier and redirects to that repository's
search route, which already maps issues and pull requests to pages we
render and hands the rest to GitHub. Searches that name no single
repository -- bare queries, org:/user: scopes, a missing type -- keep
redirecting to github.com/search as they did before.

Co-Authored-By: Claude Opus 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01GkGX6puS45xD5KzdV9tHEA
</content>
</entry>
<entry>
<title>Clean up renderer, redirects, and build commit</title>
<updated>2026-09-04T03:05:33Z</updated>
<author>
<name>Joe Mou</name>
<email>dev@mou.fo</email>
</author>
<published>2026-09-03T19:07:25Z</published>
<link rel='alternate' type='text/html' href='http://git.mou.fo/2026/cgithub.git/commit/?id=b9fb8851bb869a27048e02a51b28ef3aaffdd471'/>
<id>urn:sha1:b9fb8851bb869a27048e02a51b28ef3aaffdd471</id>
<content type='text'>
</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>
</feed>
