Sign in

Search issue titles and bodies, change requests and comments. Private repositories you cannot read are not included.

vole
Clone

Read only, no credentials:

https://rodent.software/git/vole.git

Write over SSH with a registered key:

git clone ssh://git@0.0.0.0:2222/vole.git

A free and open-source forge that lives in your Git repo.

Build out the forge web UI

f09ef39efe44de693748053a7b596ef328fcf06b · Keenan Nemetz · 15d ago · parent 70b70264

Build out the forge web UI

Turn the web surface into a compact, server-rendered forge with HTMX as the
progressive dynamic layer.

- Split templates and assets into embedded files; add a tokenised dark theme,
  Lucide icons, and vendored HTMX.
- Add the repository Overview page and a separate chronological Activity feed
  with type filters and HTMX fragment updates.
- Finish the issue and change workflows: create pages, comments, close/reopen,
  labels and assignees, approval, discussion, line-anchored review comments,
  and HTMX list filters.
- Add syntax-highlighted blobs, contributor/statistics derivation, branch-aware
  code browsing, and a repository Runs list.
- Add a loopback-only development login for local write testing, with explicit
  configuration and listener checks.
- Extend tests for the new pages, fragments, labels, assignees, anchors, and
  development login.

server/integration_test.go +2−2

@@ -417,7 +417,7 @@ func TestPushOverSSHThenReadOverBothTransports(t *testing.T) {
417 417
418 418 // The web shows it without any login.
419 419 if code, body := f.get("/r/" + f.repo); code != 200 || !strings.Contains(body, "readme.md") {
420 t.Fatalf("repo page: %d", code)
420 t.Fatalf("overview page: %d", code)
421 421 }
422 422 if code, body := f.get("/r/" + f.repo + "/blob/main/readme.md"); code != 200 || !strings.Contains(body, "hello from vole") {
423 423 t.Fatalf("blob page: %d", code)
@@ -1491,7 +1491,7 @@ func TestIssueFiltersAndSearch(t *testing.T) {
1491 1491 }
1492 1492
1493 1493 for _, c := range []struct{ query, want string }{
1494 {"", "Docs typo"},
1494 {"?state=all", "Docs typo"},
1495 1495 {"?label=bug", "Segfault on startup"},
1496 1496 {"?state=closed", "Docs typo"},
1497 1497 {"?q=parser", "Slow parser"},