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.
Merge change request 01M70WES5ZZDJ6RP226WB11BBZ: Let people rename and remove their own passkeys
keenan · 2h ago
4b8c9e1d
| 1 | {{define "index"}} |
| 2 | {{template "header" .}} |
| 3 | <section class="hero"> |
| 4 | <div class="hero-main"> |
| 5 | <h1>{{.InstanceName}}</h1> |
| 6 | </div> |
| 7 | <div class="hero-actions"> |
| 8 | {{if and .InstanceAdmin .Cards}}<a class="button" href="/-/repos/new">{{icon "plus"}}New repository</a>{{end}} |
| 9 | {{if not .LoggedIn}} |
| 10 | <a class="button secondary" href="/-/login">{{icon "user"}}Sign in</a> |
| 11 | {{if .OpenRegistration}}<a class="button secondary" href="/-/register">{{icon "user"}}Create an account</a>{{end}} |
| 12 | {{end}} |
| 13 | </div> |
| 14 | </section> |
| 15 | |
| 16 | {{if and (not .Cards) (not .Query)}}{{template "home_readme" .}}{{end}} |
| 17 | |
| 18 | {{if .Cards}} |
| 19 | <div class="home-grid"> |
| 20 | <section class="home-main"> |
| 21 | {{if not .Query}}{{template "home_readme" .}}{{end}} |
| 22 | <div class="section-head"> |
| 23 | <h2>{{if .Query}}Results{{else}}Repositories{{end}}</h2> |
| 24 | {{if .Query}}<a class="more" href="/">clear search</a>{{end}} |
| 25 | </div> |
| 26 | <div class="repo-grid"> |
| 27 | {{range .Cards}}{{template "repo_card" .}}{{end}} |
| 28 | </div> |
| 29 | </section> |
| 30 | |
| 31 | {{if not .Query}} |
| 32 | <aside class="home-rail"> |
| 33 | <div class="section-head"> |
| 34 | <h2>Latest</h2> |
| 35 | <a class="more" href="/-/activity">all activity</a> |
| 36 | </div> |
| 37 | {{if .Events}} |
| 38 | {{template "activity_events" .}} |
| 39 | {{else}} |
| 40 | <p class="muted">Nothing has happened yet. Push a commit, open an issue, or queue a run.</p> |
| 41 | {{end}} |
| 42 | </aside> |
| 43 | {{end}} |
| 44 | </div> |
| 45 | {{else if .Query}} |
| 46 | <div class="empty-state"> |
| 47 | <p>No repositories match “{{.Query}}”.</p> |
| 48 | <p class="muted">Search looks at repository names and descriptions. Private repositories you cannot read are not included.</p> |
| 49 | <a href="/">Clear the search</a> |
| 50 | </div> |
| 51 | {{else if .InstanceAdmin}} |
| 52 | <div class="empty-state first-run"> |
| 53 | <span class="empty-icon" aria-hidden="true">{{icon "folder"}}</span> |
| 54 | <h2>No repositories yet</h2> |
| 55 | <p class="muted">A repository is where code, issues, changes, and runs live. Create the first one to get started.</p> |
| 56 | <p class="empty-actions"><a class="button" href="/-/repos/new">{{icon "plus"}}New repository</a></p> |
| 57 | <p class="empty-hint">Or from the instance directory: <code>vole admin repo create demo --owner {{if .User}}{{.User}}{{else}}you{{end}}</code></p> |
| 58 | </div> |
| 59 | {{else if .LoggedIn}} |
| 60 | <div class="empty-state"> |
| 61 | <p>You do not have access to any repositories yet.</p> |
| 62 | <p class="muted">An instance admin can grant your account a role on a repository. Once you have one, it appears here.</p> |
| 63 | </div> |
| 64 | {{else}} |
| 65 | <div class="empty-state"> |
| 66 | <p>Nothing here is readable without an account.</p> |
| 67 | <p class="muted">Sign in with a passkey to see the repositories you have access to. Read-only clones of public repositories need no account.</p> |
| 68 | </div> |
| 69 | {{end}} |
| 70 | {{template "footer" .}} |
| 71 | {{end}} |
| 72 | |
| 73 | {{define "home_readme"}} |
| 74 | {{if .Intro}} |
| 75 | <section class="panel readme-card" id="readme"> |
| 76 | <div class="md readme-body">{{.Intro}}</div> |
| 77 | </section> |
| 78 | {{else if and .InstanceAdmin (not .RepoReady)}} |
| 79 | <p class="readme-empty">This instance has no repository for customization yet. Create it on the |
| 80 | <a href="/-/admin?tab=configuration">Admin Configuration</a> page to customize this introduction, the styles, and the assets.</p> |
| 81 | {{end}} |
| 82 | {{end}} |
| 83 | |
| 84 | {{define "repo_card"}} |
| 85 | <article class="repo-card"> |
| 86 | <div class="repo-card-top"> |
| 87 | <span class="repo-vis" title="{{if .Private}}Private repository{{else}}Public repository{{end}}">{{if .Private}}{{icon "lock"}}{{else}}{{icon "globe"}}{{end}}</span> |
| 88 | <h3><a href="/{{.Name}}" title="{{if .Private}}Private repository{{else}}Public repository{{end}}">{{.Name}}</a></h3> |
| 89 | {{if .Language}}<span class="repo-lang"><span class="lang-dot {{.LangClass}}" aria-hidden="true"></span>{{.Language}}</span>{{end}} |
| 90 | {{if not .Updated.IsZero}}<span class="repo-updated" title="Last activity">{{since .Updated.Unix}}</span>{{end}} |
| 91 | </div> |
| 92 | {{if .Description}}<p class="repo-desc">{{.Description}}</p>{{end}} |
| 93 | {{if or .OpenIssues .OpenChanges .LastTag}} |
| 94 | <div class="repo-chips"> |
| 95 | {{if .OpenIssues}}<a class="chip" href="/{{.Name}}/issues">{{icon "circle-dot"}}{{.OpenIssues}} issue{{if ne .OpenIssues 1}}s{{end}}</a>{{end}} |
| 96 | {{if .OpenChanges}}<a class="chip" href="/{{.Name}}/changes">{{icon "git-pull-request"}}{{.OpenChanges}} change{{if ne .OpenChanges 1}}s{{end}}</a>{{end}} |
| 97 | {{if .LastTag}}<a class="chip" href="/{{.Name}}/releases/{{.LastTag.Name}}">{{icon "tag"}}{{.LastTag.Name}}</a>{{end}} |
| 98 | </div> |
| 99 | {{end}} |
| 100 | </article> |
| 101 | {{end}} |
| 102 |