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 | | |