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 · 24m ago
4b8c9e1d
| 1 | {{define "login"}} |
| 2 | {{template "header" .}} |
| 3 | {{if not .Enabled}} |
| 4 | <div class="auth"> |
| 5 | <div class="card"> |
| 6 | <h1>Sign in</h1> |
| 7 | <p class="muted">{{.Reason}}</p> |
| 8 | </div> |
| 9 | </div> |
| 10 | {{else}} |
| 11 | <form class="auth" data-auth="login" data-next="{{.Next}}"> |
| 12 | <div class="card form-card"> |
| 13 | <h1>Sign in</h1> |
| 14 | <label>Account name |
| 15 | <input type="text" name="username" autocomplete="username webauthn" required autofocus> |
| 16 | </label> |
| 17 | <p class="muted">Your browser can offer a saved passkey in this field; otherwise type your account name and continue.</p> |
| 18 | <p class="error" data-auth-error></p> |
| 19 | {{if .Registration}} |
| 20 | <p class="muted">No account yet? <a href="/-/register">Create one</a>.</p> |
| 21 | {{else}} |
| 22 | <p class="muted">No account yet? Ask an instance admin for a one-time enrollment link.</p> |
| 23 | {{end}} |
| 24 | </div> |
| 25 | <div class="form-actions"><button type="submit">Use a passkey</button></div> |
| 26 | </form> |
| 27 | {{end}} |
| 28 | {{template "footer" .}} |
| 29 | {{end}} |
| 30 | |
| 31 | {{define "register"}} |
| 32 | {{template "header" .}} |
| 33 | <form class="auth" data-auth="register"> |
| 34 | <div class="card form-card"> |
| 35 | <h1>Create an account</h1> |
| 36 | <p class="muted">Pick a name and register a passkey. You can add an SSH key after signing in.</p> |
| 37 | <label>Account name |
| 38 | <input type="text" name="username" pattern="[a-z0-9][a-z0-9_-]{1,31}" maxlength="32" autocomplete="username webauthn" required autofocus> |
| 39 | </label> |
| 40 | <p class="error" data-auth-error></p> |
| 41 | <p class="muted">Names are 2–32 characters: lowercase letters, digits, <code>-</code> and <code>_</code>. |
| 42 | The account name is permanent — it is the folder your branches live under and cannot be |
| 43 | changed later.</p> |
| 44 | </div> |
| 45 | <div class="form-actions"><button type="submit">Create account and passkey</button></div> |
| 46 | </form> |
| 47 | {{template "footer" .}} |
| 48 | {{end}} |
| 49 | |
| 50 | {{define "invite"}} |
| 51 | {{template "header" .}} |
| 52 | {{if .Enabled}} |
| 53 | <form class="auth" data-auth="invite"> |
| 54 | <div class="card form-card"> |
| 55 | <h1>Enrollment link</h1> |
| 56 | <p class="muted">Register this device as a passkey for the account this link belongs to. |
| 57 | The link works once. The account name appears once the passkey is created.</p> |
| 58 | <p class="error" data-auth-error></p> |
| 59 | </div> |
| 60 | <div class="form-actions"><button type="submit">Create a passkey</button></div> |
| 61 | </form> |
| 62 | {{else}} |
| 63 | <div class="auth"> |
| 64 | <div class="card"> |
| 65 | <h1>Enrollment link</h1> |
| 66 | <p class="muted">{{.Reason}}</p> |
| 67 | </div> |
| 68 | </div> |
| 69 | {{end}} |
| 70 | {{template "footer" .}} |
| 71 | {{end}} |
| 72 |