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/vole.git

Write over SSH with a registered key:

git clone ssh://git@rodent.software:2222/vole.git

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

Document the root-level URL layout

b7396a1155147a13c5595216f204a545e9f74202 · Keenan Nemetz · 9h ago · parent ed03b3d1

Document the root-level URL layout

The guides now say /<name> for a repository and /-/ for the forge's own pages,
including the clone examples, theme asset paths, profile and registration
URLs, robots.txt, and the deployment package URLs. docs/architecture.md gains
a short URL layout section: why the two spaces cannot collide, the four root
names the forge keeps, and why the transport carries .git.

docs/go-modules.md follows the layout: the module path is the repository page,
the clone URL is the same name with .git, discovery is answered before the
router, and a published module path is durable because renaming the repository
breaks it.

docs/architecture.md +19

@@ -116,6 +116,25 @@ Run records are not in Git. A runner sends its result over the authenticated SSH
116 116 channel that leased the job, and the server stores it in `data/runs.db`; a clone or
117 117 backup of a repository does not carry CI history.
118 118
119 ## URL layout
120
121 A repository owns the root of the URL space. `/<name>` is its summary page,
122 `/<name>/issues` and the rest are its tabs, and `/<name>.git` is the Git
123 transport a clone uses. There is no owner segment: repository names are unique
124 on the instance, so one name is enough.
125
126 Every page the forge itself serves is under `/-/`: `/-/admin`, `/-/u/<account>`,
127 `/-/activity`, `/-/login`, and so on. A repository name can never begin with `-`,
128 so the two spaces cannot collide and no route has to know the repository names.
129 The four names the forge keeps at the root are the ones a URL cannot move:
130 `static` for assets, and `robots.txt`, `sitemap.xml`, `sitemap-pages.xml` because
131 crawlers only look there. Repository creation refuses those names.
132
133 `/<name>.git` is recognized before the router, because a wildcard in a route
134 fills a whole path segment and cannot match `<name>.git`. Keeping the suffix on
135 the transport is what lets the page (`/<name>`, which is also the Go module path)
136 and the clone URL share a name.
137
119 138 ## Why these choices
120 139
121 140 | Choice | Reason |