<feed xmlns='http://www.w3.org/2005/Atom'>
<title>cgithub.git/public/static/style.css, branch main</title>
<subtitle>GitHub alternative frontend</subtitle>
<id>http://git.mou.fo/2026/cgithub.git/atom/public/static/style.css?h=main</id>
<link rel='self' href='http://git.mou.fo/2026/cgithub.git/atom/public/static/style.css?h=main'/>
<link rel='alternate' type='text/html' href='http://git.mou.fo/2026/cgithub.git/'/>
<updated>2026-09-25T05:43:53Z</updated>
<entry>
<title>Style markdown alerts</title>
<updated>2026-09-25T05:43:53Z</updated>
<author>
<name>Joe Mou</name>
<email>dev@mou.fo</email>
</author>
<published>2026-09-24T07:17:26Z</published>
<link rel='alternate' type='text/html' href='http://git.mou.fo/2026/cgithub.git/commit/?id=181830285ac128ce0b5946b1c5d4e45fa51612ed'/>
<id>urn:sha1:181830285ac128ce0b5946b1c5d4e45fa51612ed</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>Easier clone command selection</title>
<updated>2026-09-21T21:40:15Z</updated>
<author>
<name>Joe Mou</name>
<email>dev@mou.fo</email>
</author>
<published>2026-09-21T20:11:31Z</published>
<link rel='alternate' type='text/html' href='http://git.mou.fo/2026/cgithub.git/commit/?id=16b4bc953f9822121b3257fc5f19df9dcfbdba27'/>
<id>urn:sha1:16b4bc953f9822121b3257fc5f19df9dcfbdba27</id>
<content type='text'>
</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>Render repository wikis</title>
<updated>2026-09-03T05:09:10Z</updated>
<author>
<name>Joe Mou</name>
<email>dev@mou.fo</email>
</author>
<published>2026-09-03T04:08:06Z</published>
<link rel='alternate' type='text/html' href='http://git.mou.fo/2026/cgithub.git/commit/?id=df2969f6ff3658d683ae1959a7e4dbdb25720e2e'/>
<id>urn:sha1:df2969f6ff3658d683ae1959a7e4dbdb25720e2e</id>
<content type='text'>
Wikis are one of the last parts of GitHub still served as plain Rails
HTML, with no embedded JSON to read, so this scrapes the markup: a page
and any older revision of it, the _Sidebar and _Footer a wiki can
define, and the page index. Every page is already in the sidebar of
every page, since the "Show N more pages" button only unhides the rest,
so linking the whole wiki costs no second request.

Routes mirror GitHub's and resolve in its order, so an underscore name
reserved for its own actions (_pages, _history, _new, _edit) can never
be mistaken for a page; the ones we don't serve fall through to the
usual redirect. A slug reaches us decoded and has to be encoded again
rather than interpolated the way a ref is, or a page named C# would
truncate at the fragment.

Co-Authored-By: Claude Opus 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_013rQG1io1i4GJQW5RFcXNGd
</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>Add language percentages to repo pages</title>
<updated>2026-08-11T12:13:58Z</updated>
<author>
<name>Joe Mou</name>
<email>dev@mou.fo</email>
</author>
<published>2026-08-11T12:09:47Z</published>
<link rel='alternate' type='text/html' href='http://git.mou.fo/2026/cgithub.git/commit/?id=b43ce92c7b16bdefedb7c4c2aef41f9417f1ddf6'/>
<id>urn:sha1:b43ce92c7b16bdefedb7c4c2aef41f9417f1ddf6</id>
<content type='text'>
GitHub no longer server-renders the repository sidebar; its React UI
lazily fetches /:owner/:repo/_sidebar as JSON, which carries the
language breakdown (name, percentage, color). getGitHubLanguages() uses
that endpoint, and a new /api/:owner/:repo/languages fragment route
renders the bar and legend the same way refs and latest-commit already
work, so repo page loads still cost a single scrape.

The latest-commit placeholder loader in refs.js is generalized over
.placeholder[data-src] so both placeholders share it.

Co-Authored-By: Claude Opus 5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Add async branch/tag dropdown and latest-commit bar</title>
<updated>2026-07-23T03:25:26Z</updated>
<author>
<name>Joe Mou</name>
<email>dev@mou.fo</email>
</author>
<published>2026-07-21T21:46:58Z</published>
<link rel='alternate' type='text/html' href='http://git.mou.fo/2026/cgithub.git/commit/?id=ecd01c4617ec0a6af05cfc4388bdc82986f25961'/>
<id>urn:sha1:ecd01c4617ec0a6af05cfc4388bdc82986f25961</id>
<content type='text'>
Adds two lazily-fetched UI pieces to match vanilla GitHub while keeping
initial page loads plain server-rendered HTML: a branch/tag selector
(native &lt;dialog&gt;, CSS anchor-positioned to its button, light-dismissed
via closedby="any") and a latest-commit bar above the file listing.
Both are populated by new /api/:owner/:repo/refs/:type and
/api/:owner/:repo/latest-commit/:branch/:path routes; the latter calls
GitHub's own /latest-commit JSON endpoint (the same one the React UI
uses) rather than scraping the full commit history page.
</content>
</entry>
</feed>
