tenseleyflow/shithub / 6937b30

Browse files

Re-baseline launch version: v1.0.0 → v0.1.0; placeholder domain → shithub.sh

Authored by espadonne
SHA
6937b308d1d11d66afa2d3c763a328c7589801c9
Parents
3d303c4
Tree
5855073

25 changed files

StatusFile+-
M CHANGELOG.md 54 66
M CODE_OF_CONDUCT.md 1 1
M CONTRIBUTING.md 1 1
M README.md 3 3
M SECURITY.md 3 3
M deploy/cutover/checklist.md 12 12
M deploy/cutover/rollback.sh 1 1
M deploy/cutover/smoke.sh 1 1
M deploy/docs-site/sync-to-spaces.sh 1 1
R docs/blog/v1.0.0-launch.mddocs/blog/v0.1.0-launch.md 0 0
M docs/internal/bench.md 1 1
R docs/internal/retro/v1.0.0.mddocs/internal/retro/v0.1.0.md 0 0
M docs/internal/runbooks/day-one.md 4 4
M docs/internal/threat-model.md 1 1
M docs/public/security.md 1 1
M docs/public/self-host/deploy.md 3 3
M docs/public/self-host/prerequisites.md 3 3
M docs/public/self-host/troubleshooting.md 1 1
M docs/public/status.md 9 9
M docs/public/user/account.md 1 1
M docs/public/user/https.md 2 2
M docs/public/user/quickstart.md 1 1
M docs/public/user/ssh.md 2 2
M internal/web/templates/hello.html 3 3
M tests/load/README.md 1 1
CHANGELOG.mdmodified
@@ -4,82 +4,70 @@ All notable changes to shithub are documented here. This project
44
 follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/)
55
 conventions and [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66
 
7
+Pre-1.0 versioning: minor versions may break the API. The
8
+stability contract begins at v1.0.0; until then, expect changes
9
+between minor releases.
10
+
711
 ## [Unreleased]
812
 
913
 (Empty — first post-launch entries land here.)
1014
 
11
-## [1.0.0] — TBD (operator fills in cutover date)
12
-
13
-The first stable release. **Stability contract:** every migration
14
-from this point on is backward-compatible from v1.0.0 — see
15
-`docs/internal/runbooks/upgrade.md`.
16
-
17
-### Added (since pre-launch)
18
-- Public landing page on `/` for anonymous viewers; signed-in
19
-  viewers get a quick-link dashboard.
20
-- Lightweight status page at `docs.shithub.example/status.html`.
21
-- Cutover artifacts under `deploy/cutover/` — checklist, smoke
22
-  script, rollback script.
23
-- Launch announcement copy at `docs/blog/v1.0.0-launch.md`.
24
-- Day-one operator runbook at `docs/internal/runbooks/day-one.md`.
25
-- Public docs site (`docs/public/`) built with mdBook.
26
-- Contributor + security disclosure docs finalized for post-launch
27
-  posture (DCO sign-off, `security@shithub.example` mailbox).
28
-- Architecture overview + internal docs index.
29
-- Operator runbooks: rotate-secrets, rotate-keys, regenerate-akc,
30
-  drain-workers, read-only-mode.
31
-- `THIRD_PARTY_NOTICES.md` with a CI-verified generator script.
32
-- a11y tooling (pa11y + axe) and k6 load-test scenarios under
33
-  `tests/`.
34
-
35
-### Changed
36
-- README pivoted to post-launch framing (still flags WIP areas
37
-  honestly).
38
-- Renderer (`internal/web/render/render.go`) walks `_*.html`
39
-  partials recursively and fails loud on undefined template refs
40
-  at startup.
41
-- Repo Code view restructured to GitHub's 2/3 + 1/3 layout with
42
-  an About sidebar (description, topics, license, language,
43
-  star/watch/fork counts).
15
+## [0.1.0] — TBD (operator fills in cutover date)
4416
 
45
-## [1.0.0] — core forge loop
17
+The first public release of shithub. Pre-1.0: there is no
18
+backward-compatibility promise yet. Migrations are forward-only;
19
+schema may change between minor versions.
4620
 
47
-The first stable release. Core forge loop:
21
+### Initial public surface
4822
 
49
-- Identity: signup, email verification, password reset, TOTP 2FA
50
-  + recovery codes, SSH keys, scoped PATs, sessions with
23
+- **Identity** — signup, email verification, password reset, TOTP
24
+  2FA + recovery codes, SSH keys, scoped PATs, sessions with
5125
   per-account epoch invalidation.
52
-- Repositories: create, fork, archive, transfer, soft-delete with
53
-  grace, rename with redirects, visibility toggles, branch
54
-  protection (force-push / deletion / required reviews / required
55
-  status checks), default-branch swap, topics, README/license/
26
+- **Repositories** — create, fork, archive, transfer, soft-delete
27
+  with grace, rename with redirects, visibility toggles, branch
28
+  protection, default-branch swap, topics, README/license/
5629
   .gitignore templates.
57
-- Git: bare repos on disk; HTTPS smart-HTTP push/pull; pre/post-
58
-  receive hook integration for size accounting and event emission.
59
-- Code browsing: tree, blob (chroma syntax highlighting with
60
-  light/dark themes), raw, blame, commit history, individual
61
-  commit views, branch/tag listings, compare views, file finder.
62
-- Issues + PRs: full CRUD; pull requests with diff rendering,
63
-  file-by-file review, line comments, reviews, required-reviewer
64
-  enforcement, status-check gates, three merge methods.
65
-- Social: stars, watches with notification level, forks
66
-  (clone-on-create), `/explore`, stargazer/watcher lists.
67
-- Search: code, repo, user.
68
-- Notifications: per-user inbox + email fan-out, watch-level
69
-  routing, one-click HMAC-signed unsubscribe.
70
-- Organizations + teams: create, member roles, invitations,
71
-  one-level team nesting, team grants on repos with
30
+- **Git** — bare repos on disk; HTTPS smart-HTTP push/pull;
31
+  pre/post-receive hook integration.
32
+- **Code browsing** — tree, blob (chroma syntax highlighting),
33
+  raw, blame, commit history, individual commit views, branch/tag
34
+  listings, compare views, file finder.
35
+- **Issues + PRs** — full CRUD; reviews; required-reviewer
36
+  enforcement; status-check gates; three merge methods.
37
+- **Social** — stars, watches, forks, `/explore`, stargazer/
38
+  watcher lists.
39
+- **Search** — code, repo, user, issue.
40
+- **Notifications** — in-app inbox, email fan-out, one-click
41
+  unsubscribe.
42
+- **Orgs + teams** — roles, invitations, one-level nesting,
7243
   max-of-sources policy.
73
-- Webhooks: outbound delivery with HMAC-SHA256 signing,
74
-  exponential backoff with jitter, auto-disable on persistent
75
-  failure, SSRF defense, redelivery UI, ping events.
76
-- Observability: structured logs, Prometheus metrics, optional
77
-  OTel tracing, Sentry-protocol error reporting.
78
-- Security: AGPLv3, threat model + security checklist, package
79
-  boundary lints (markdown, policy, secret-logs, CSRF).
80
-- Operations: Ansible playbook, systemd units, Caddy edge,
44
+- **Webhooks** — HMAC-signed delivery, exponential backoff,
45
+  auto-disable, SSRF defense, redelivery UI.
46
+- **Observability** — structured logs, Prometheus metrics,
47
+  optional OTel tracing, Sentry-protocol error reporting.
48
+- **Operations** — Ansible playbook, systemd units, Caddy edge,
8149
   WireGuard mesh for monitoring, Postgres WAL archive + daily
8250
   logical backups to Spaces, cross-region DR, restore drill.
51
+- **Public landing page** on `/` for anonymous viewers; signed-in
52
+  viewers get a quick-link dashboard.
53
+- **Lightweight status page** at `docs.<host>/status.html`.
54
+- **Cutover artifacts** under `deploy/cutover/`.
55
+- **Public docs site** built with mdBook.
56
+- **Operator runbooks** for incidents, backups, restore, upgrade,
57
+  rollback, rotate-secrets, rotate-keys, regenerate-akc,
58
+  drain-workers, read-only-mode, day-one.
59
+- **a11y tooling** (pa11y + axe) and **k6 load-test scenarios**.
60
+- **THIRD_PARTY_NOTICES.md** with a CI-verified generator.
61
+
62
+### Known gaps at v0.1.0
63
+
64
+- SSH git transport (HTTPS only)
65
+- Actions / CI runner
66
+- Packages, Releases, Pages, Projects, Gists
67
+- GraphQL API (only a small REST surface today)
68
+- Activity feed UI
69
+
70
+These are all on the post-MVP roadmap.
8371
 
84
-[Unreleased]: https://shithub.example/shithub/shithub/compare/v1.0.0...trunk
85
-[1.0.0]: https://shithub.example/shithub/shithub/releases/tag/v1.0.0
72
+[Unreleased]: https://shithub.sh/shithub/shithub/compare/v0.1.0...trunk
73
+[0.1.0]: https://shithub.sh/shithub/shithub/releases/tag/v0.1.0
CODE_OF_CONDUCT.mdmodified
@@ -60,7 +60,7 @@ public spaces.
6060
 
6161
 Instances of abusive, harassing, or otherwise unacceptable
6262
 behavior may be reported to the project team at
63
-**`conduct@shithub.example`**. All complaints will be reviewed
63
+**`conduct@shithub.sh`**. All complaints will be reviewed
6464
 and investigated promptly and fairly.
6565
 
6666
 All project maintainers are obligated to respect the privacy and
CONTRIBUTING.mdmodified
@@ -97,4 +97,4 @@ run the deploy.
9797
   `proposal`.
9898
 - **Day-to-day chat:** the project doesn't run a Slack/Discord
9999
   yet; PR comments and issues are the channel.
100
-- **Security:** `security@shithub.example` (see SECURITY.md).
100
+- **Security:** `security@shithub.sh` (see SECURITY.md).
README.mdmodified
@@ -10,11 +10,11 @@
1010
 
1111
 ---
1212
 
13
-**Status: v1.0.0 launched — early days. Honest about WIP areas.**
13
+**Status: v0.1.0 launched — early days. Honest about WIP areas.**
1414
 
15
-shithub is an attempt to recreate GitHub — the platform, the UI, the workflows — as faithfully as we can, as a self-hostable open-source forge. The goal is "you should barely notice you switched." We are not there yet. The core forge loop works end-to-end (see "What works today"); large surfaces (SSH transport, Actions/CI, GraphQL, Packages) are explicitly not shipped at v1.0.0.
15
+shithub is an attempt to recreate GitHub — the platform, the UI, the workflows — as faithfully as we can, as a self-hostable open-source forge. The goal is "you should barely notice you switched." We are not there yet. The core forge loop works end-to-end (see "What works today"); large surfaces (SSH transport, Actions/CI, GraphQL, Packages) are explicitly not shipped at v0.1.0.
1616
 
17
-The hosted instance is at **[shithub.example](https://shithub.example)**. The project's own source has migrated here from GitHub; this GitHub repo is a one-way mirror for the first 90 days post-launch as a recovery surface.
17
+The hosted instance is at **[shithub.sh](https://shithub.sh)**. The project's own source has migrated here from GitHub; this GitHub repo is a one-way mirror for the first 90 days post-launch as a recovery surface.
1818
 
1919
 If you came here expecting drop-in parity with everything GitHub does, you'll find specific gaps. If you came here for an honest, AI-free, self-hostable forge, this is for you.
2020
 
SECURITY.mdmodified
@@ -2,9 +2,9 @@
22
 
33
 ## Reporting a vulnerability
44
 
5
-Email **`security@shithub.example`**. PGP-encrypt the report
5
+Email **`security@shithub.sh`**. PGP-encrypt the report
66
 using the key fingerprint published at
7
-`https://shithub.example/.well-known/pgp-key.asc` if your finding
7
+`https://shithub.sh/.well-known/pgp-key.asc` if your finding
88
 is sensitive.
99
 
1010
 The mailbox auto-acknowledges receipt within minutes. A human
@@ -19,7 +19,7 @@ hall of fame on resolution unless you ask not to be named.
1919
 
2020
 In scope:
2121
 
22
-- The hosted shithub instance (`shithub.example`).
22
+- The hosted shithub instance (`shithub.sh`).
2323
 - The shithub source as published on GitHub
2424
   (`github.com/tenseleyFlow/shithub`), exploited against any
2525
   reasonably-deployed self-hosted instance running an unmodified
deploy/cutover/checklist.mdmodified
@@ -9,10 +9,10 @@ visual check.
99
 
1010
 ## T-7 days
1111
 
12
-- [ ] DNS A/AAAA for `shithub.example` published with low TTL
12
+- [ ] DNS A/AAAA for `shithub.sh` published with low TTL
1313
       (300s) so cutover-day changes propagate fast. Verify:
14
-      `dig +short A shithub.example`.
15
-- [ ] DNS CNAME for `docs.shithub.example` published.
14
+      `dig +short A shithub.sh`.
15
+- [ ] DNS CNAME for `docs.shithub.sh` published.
1616
 - [ ] Postmark domain verified; SPF/DKIM/DMARC aligned. Verify:
1717
       Postmark dashboard → Domains → green.
1818
 - [ ] Signup-throttle config reviewed; per-IP and per-/24
@@ -28,13 +28,13 @@ visual check.
2828
 - [ ] Last DNS change committed. Cutover after 48h ensures no
2929
       propagation lag.
3030
 - [ ] S37 backup-restore drill green within last 7 days.
31
-- [ ] S38 docs deploy verified; `https://docs.shithub.example/`
31
+- [ ] S38 docs deploy verified; `https://docs.shithub.sh/`
3232
       returns 200.
3333
 - [ ] S39 P0/P1 bugs closed.
3434
 - [ ] Tag the release commit:
3535
       ```sh
36
-      git tag -a v1.0.0 -m "v1.0.0 — launch"
37
-      git push origin v1.0.0
36
+      git tag -a v0.1.0 -m "v0.1.0 — launch"
37
+      git push origin v0.1.0
3838
       ```
3939
 
4040
 ## T-1 hour
@@ -49,9 +49,9 @@ visual check.
4949
 ## T-0: cutover
5050
 
5151
 ```sh
52
-# 1. Pull the v1.0.0 tag.
52
+# 1. Pull the v0.1.0 tag.
5353
 git fetch --tags
54
-git checkout v1.0.0
54
+git checkout v0.1.0
5555
 
5656
 # 2. Dry-run to confirm exactly what will change.
5757
 make deploy-check ANSIBLE_INVENTORY=production
@@ -77,7 +77,7 @@ Run the smoke script as soon as the deploy reports `ok=N
7777
 changed=N failed=0`:
7878
 
7979
 ```sh
80
-deploy/cutover/smoke.sh https://shithub.example
80
+deploy/cutover/smoke.sh https://shithub.sh
8181
 ```
8282
 
8383
 The script exercises: home page, signup form, login form, health
@@ -127,7 +127,7 @@ git remote add github https://github.com/tenseleyFlow/shithub.git
127127
 Confirm a test push lands on both:
128128
 
129129
 ```sh
130
-git clone https://shithub.example/shithub/shithub.git /tmp/test-clone
130
+git clone https://shithub.sh/shithub/shithub.git /tmp/test-clone
131131
 cd /tmp/test-clone
132132
 echo "launch test" >> .launch-test
133133
 git add .launch-test
@@ -164,7 +164,7 @@ For the first 24h:
164164
 - Refresh Grafana every 30 min.
165165
 - Triage every alert immediately; nothing false-positive should
166166
   page in week 1 (we tuned for it).
167
-- Bug reports go to `https://shithub.example/shithub/shithub/issues`
167
+- Bug reports go to `https://shithub.sh/shithub/shithub/issues`
168168
   (the project's own self-hosted issues — drink your own
169169
   champagne).
170170
 
@@ -184,6 +184,6 @@ fixed." Honesty wins trust; deadlines under stress lose it.
184184
 
185185
 ## Day-one retro
186186
 
187
-After the first 24h, fill in `docs/internal/retro/v1.0.0.md`
187
+After the first 24h, fill in `docs/internal/retro/v0.1.0.md`
188188
 with: what worked, what surprised us, top 3 user-reported
189189
 issues, and the next sprint's focus.
deploy/cutover/rollback.shmodified
@@ -91,7 +91,7 @@ make deploy ANSIBLE_INVENTORY=production
9191
 # file; falls back to asking.
9292
 BASE="${SHITHUB_PROD_URL:-}"
9393
 if [[ -z "$BASE" ]]; then
94
-  read -r -p "Smoke base URL (e.g. https://shithub.example): " BASE
94
+  read -r -p "Smoke base URL (e.g. https://shithub.sh): " BASE
9595
 fi
9696
 echo ""
9797
 echo "running smoke against $BASE..."
deploy/cutover/smoke.shmodified
@@ -7,7 +7,7 @@
77
 # is reachable, the API authenticates a known PAT.
88
 #
99
 # Usage:
10
-#   deploy/cutover/smoke.sh https://shithub.example
10
+#   deploy/cutover/smoke.sh https://shithub.sh
1111
 #
1212
 # Optional env (when set, the script also exercises the API):
1313
 #   SHITHUB_SMOKE_PAT     — a valid shp_ token for `user:read`
deploy/docs-site/sync-to-spaces.shmodified
@@ -2,7 +2,7 @@
22
 # SPDX-License-Identifier: AGPL-3.0-or-later
33
 #
44
 # Build the public docs site and sync it to the Spaces bucket
5
-# that Caddy serves docs.shithub.example from.
5
+# that Caddy serves docs.shithub.sh from.
66
 #
77
 # Run from CI on every push to main, or from an operator's
88
 # workstation as a one-off. Idempotent: rclone sync only touches
docs/blog/v1.0.0-launch.md → docs/blog/v0.1.0-launch.mdrenamed (86% similarity)
@@ -1,18 +1,18 @@
1
-# shithub v1.0.0
1
+# shithub v0.1.0
22
 
3
-shithub is now live at **shithub.example**.
3
+shithub is now live at **shithub.sh**.
44
 
55
 A self-hostable git forge that aims to look and feel like GitHub.
66
 AGPL-licensed, written in Go, no AI training on your code, no
77
 Copilot.
88
 
9
-You can [sign up](https://shithub.example/signup) to host code on
9
+You can [sign up](https://shithub.sh/signup) to host code on
1010
 the hosted instance, or
11
-[stand one up yourself](https://docs.shithub.example/self-host/deploy.html)
11
+[stand one up yourself](https://docs.shithub.sh/self-host/deploy.html)
1212
 from the source.
1313
 
1414
 The project's own source is now hosted on shithub at
15
-[shithub.example/shithub/shithub](https://shithub.example/shithub/shithub).
15
+[shithub.sh/shithub/shithub](https://shithub.sh/shithub/shithub).
1616
 A one-way mirror keeps pushing to the original GitHub repo for the
1717
 first 90 days as a recovery surface; after that, the canonical home
1818
 is the self-hosted instance.
@@ -73,7 +73,7 @@ Honesty over hype:
7373
   focus-state details — all still drifting.
7474
 
7575
 The full roadmap is in
76
-[`.docs/sprints/`](https://shithub.example/shithub/shithub/tree/trunk/.docs/sprints)
76
+[`.docs/sprints/`](https://shithub.sh/shithub/shithub/tree/trunk/.docs/sprints)
7777
 on the source repo.
7878
 
7979
 ## Why
@@ -92,7 +92,7 @@ of switching.
9292
 ## Self-hosting
9393
 
9494
 If you'd rather run your own instance, the operator docs are at
95
-[docs.shithub.example/self-host](https://docs.shithub.example/self-host/prerequisites.html).
95
+[docs.shithub.sh/self-host](https://docs.shithub.sh/self-host/prerequisites.html).
9696
 Reference target is one DigitalOcean droplet, Postgres on a
9797
 second, DigitalOcean Spaces for object storage, Caddy at the
9898
 edge. The Ansible playbook in `deploy/ansible/` is the install
@@ -102,16 +102,16 @@ path; expect ~45 min from a fresh Ubuntu 24.04 droplet to
102102
 ## Security
103103
 
104104
 If you find a vulnerability, please email
105
-**security@shithub.example** before disclosing publicly. Auto-ack
105
+**security@shithub.sh** before disclosing publicly. Auto-ack
106106
 within minutes; a human response within 72 hours. Full policy at
107
-[SECURITY.md](https://shithub.example/shithub/shithub/blob/trunk/SECURITY.md).
107
+[SECURITY.md](https://shithub.sh/shithub/shithub/blob/trunk/SECURITY.md).
108108
 
109109
 ## On call
110110
 
111111
 The author is on call for the first month. Expect rough edges;
112112
 we're triaging publicly. Issue tracker for shithub itself lives
113113
 on shithub itself:
114
-[shithub.example/shithub/shithub/issues](https://shithub.example/shithub/shithub/issues).
114
+[shithub.sh/shithub/shithub/issues](https://shithub.sh/shithub/shithub/issues).
115115
 
116116
 ## Thanks
117117
 
docs/internal/bench.mdmodified
@@ -25,7 +25,7 @@ on the small dataset.
2525
 make bench-small
2626
 
2727
 # Pin a different target / iteration count.
28
-BENCH_TARGET=http://staging.shithub.example BENCH_ITERS=100 make bench-small
28
+BENCH_TARGET=http://staging.shithub.sh BENCH_ITERS=100 make bench-small
2929
 ```
3030
 
3131
 Output is one JSON line per scenario:
docs/internal/retro/v1.0.0.md → docs/internal/retro/v0.1.0.mdrenamed (96% similarity)
@@ -1,4 +1,4 @@
1
-# v1.0.0 launch retro
1
+# v0.1.0 launch retro
22
 
33
 **Cutover date:** TBD (filled in by the operator on launch day).
44
 
@@ -65,7 +65,7 @@ not rehash of every minor decision.)
6565
 
6666
 ## Closing
6767
 
68
-shithub is now real. The v1.0.0 surface is what users will judge
68
+shithub is now real. The v0.1.0 surface is what users will judge
6969
 the project against; what we ship from here forward is judged in
7070
 the context of a public, dogfood-driven instance. That's the
7171
 forcing function we wanted.
docs/internal/runbooks/day-one.mdmodified
@@ -26,7 +26,7 @@ Open three tabs and walk this list:
2626
    - A flood of ERROR lines from the same handler is a bug —
2727
      bisect.
2828
 
29
-3. **Status page on docs.shithub.example/status.html.**
29
+3. **Status page on docs.shithub.sh/status.html.**
3030
    - Confirm "All systems normal." with a current timestamp.
3131
    - If you've had any blip, even a 30-second one, log it under
3232
      "Recent incidents" with what happened. Trust comes from
@@ -58,7 +58,7 @@ if you haven't.
5858
 3. **Mirror push to GitHub.** The mirror job runs hourly. Confirm:
5959
    ```sh
6060
    git ls-remote https://github.com/tenseleyFlow/shithub.git trunk
61
-   git ls-remote https://shithub.example/shithub/shithub.git trunk
61
+   git ls-remote https://shithub.sh/shithub/shithub.git trunk
6262
    ```
6363
    Both should report the same SHA (within an hour of the latest
6464
    push to shithub).
@@ -71,7 +71,7 @@ if you haven't.
7171
    - Suspended accounts: log who and why for the retro.
7272
 
7373
 5. **Issue tracker.** Open
74
-   `https://shithub.example/shithub/shithub/issues`. Triage every
74
+   `https://shithub.sh/shithub/shithub/issues`. Triage every
7575
    new issue:
7676
    - **P0** — site down / data loss / security. Fix immediately.
7777
    - **P1** — broken core flow (signup, push, merge). Fix this
@@ -81,7 +81,7 @@ if you haven't.
8181
    - Reply on every issue within 24h, even if just "tracked, P2."
8282
 
8383
 6. **Retro.** Update
84
-   `docs/internal/retro/v1.0.0.md` — fill the "Numbers" table,
84
+   `docs/internal/retro/v0.1.0.md` — fill the "Numbers" table,
8585
    the "What surprised us" section, the top-3 issues table.
8686
 
8787
 ## "First incident?"
docs/internal/threat-model.mdmodified
@@ -178,7 +178,7 @@ keep an eye on them:
178178
   is enforced; we don't yet do reproducible-build verification.
179179
 - **The docs subdomain serving from Spaces.** A bucket
180180
   policy mistake there could let an attacker stage a phishing
181
-  page on `docs.shithub.example`. Mitigated by Caddy's CSP
181
+  page on `docs.shithub.sh`. Mitigated by Caddy's CSP
182182
   and the explicit reverse-proxy origin
183183
   (`deploy/docs-site/Caddyfile.snippet`).
184184
 - **PAT prefix recognition by external secret scanners.**
docs/public/security.mdmodified
@@ -3,7 +3,7 @@
33
 This is a mirror of [`SECURITY.md`](https://github.com/tenseleyFlow/shithub/blob/main/SECURITY.md)
44
 in the source tree. The in-repo file is authoritative.
55
 
6
-To report a vulnerability, email **`security@shithub.example`**.
6
+To report a vulnerability, email **`security@shithub.sh`**.
77
 
88
 The mailbox auto-acknowledges within minutes; a human response
99
 follows within **72 hours**. Please don't file public issues for
docs/public/self-host/deploy.mdmodified
@@ -85,11 +85,11 @@ through `/admin/users/{id}`.
8585
 
8686
 ## 5. Smoke
8787
 
88
-- `https://shithub.example/` — Caddy serves the home page.
89
-- `https://shithub.example/-/health` — returns `200 OK` with the
88
+- `https://shithub.sh/` — Caddy serves the home page.
89
+- `https://shithub.sh/-/health` — returns `200 OK` with the
9090
   build version.
9191
 - Sign in as the bootstrap admin. Create a test repo. Push to it.
92
-- `https://shithub.example/admin/` — admin dashboard renders.
92
+- `https://shithub.sh/admin/` — admin dashboard renders.
9393
 
9494
 ## 6. Production
9595
 
docs/public/self-host/prerequisites.mdmodified
@@ -47,9 +47,9 @@ on top of that.
4747
 
4848
 You need:
4949
 
50
-- A domain you control (e.g. `shithub.example`).
51
-- DNS records for the app (`shithub.example`) and the docs
52
-  subdomain (`docs.shithub.example`).
50
+- A domain you control (e.g. `shithub.sh`).
51
+- DNS records for the app (`shithub.sh`) and the docs
52
+  subdomain (`docs.shithub.sh`).
5353
 - A TLS certificate. Caddy obtains and renews via Let's Encrypt
5454
   automatically — no manual cert management — but the DNS records
5555
   must point at your public IP first.
docs/public/self-host/troubleshooting.mdmodified
@@ -10,7 +10,7 @@ your domain; the site serves the staging cert (or no cert).
1010
 Most often:
1111
 
1212
 - DNS doesn't yet point at the host. Verify with `dig +short
13
-  shithub.example`.
13
+  shithub.sh`.
1414
 - Port 80 is blocked. Let's Encrypt's HTTP-01 challenge needs
1515
   port 80 reachable from the public internet (Caddy redirects
1616
   to 443 *after* obtaining the cert). UFW must allow 80.
docs/public/status.mdmodified
@@ -1,6 +1,6 @@
11
 # Status
22
 
3
-Live status of `shithub.example` and the published mirrors.
3
+Live status of `shithub.sh` and the published mirrors.
44
 This page is hand-maintained by the operator on call; the
55
 machine-readable health endpoints are linked under each section.
66
 
@@ -18,18 +18,18 @@ Last updated: TBD (operator updates on each cutover or incident).
1818
 
1919
 These return immediately and reflect the running web process:
2020
 
21
-- [`https://shithub.example/-/health`](https://shithub.example/-/health) —
21
+- [`https://shithub.sh/-/health`](https://shithub.sh/-/health) —
2222
   `200 OK` with version + commit + buildAt when the web service
2323
   is up.
24
-- [`https://shithub.example/healthz`](https://shithub.example/healthz) —
24
+- [`https://shithub.sh/healthz`](https://shithub.sh/healthz) —
2525
   liveness only; `200 OK` if the process is responding.
26
-- [`https://shithub.example/readyz`](https://shithub.example/readyz) —
26
+- [`https://shithub.sh/readyz`](https://shithub.sh/readyz) —
2727
   readiness; `200 OK` only when DB + storage are reachable.
2828
 
2929
 A scripted check from your machine:
3030
 
3131
 ```sh
32
-curl -fsS https://shithub.example/readyz
32
+curl -fsS https://shithub.sh/readyz
3333
 ```
3434
 
3535
 Non-200 means the web service is degraded or down. The operator's
@@ -39,8 +39,8 @@ monitoring also alerts on this; you don't need to poll it.
3939
 
4040
 | Subdomain                  | Purpose                | Health                                      |
4141
 |----------------------------|------------------------|---------------------------------------------|
42
-| `shithub.example`          | App                    | `/readyz`                                   |
43
-| `docs.shithub.example`     | Docs site (this site)  | Static; HTTP 200 on `/`                    |
42
+| `shithub.sh`          | App                    | `/readyz`                                   |
43
+| `docs.shithub.sh`     | Docs site (this site)  | Static; HTTP 200 on `/`                    |
4444
 
4545
 ## Backups
4646
 
@@ -51,7 +51,7 @@ log is archived to the backup bucket
5151
 
5252
 ## Mailbox availability
5353
 
54
-The disclosure mailbox `security@shithub.example` auto-acks within
54
+The disclosure mailbox `security@shithub.sh` auto-acks within
5555
 minutes. If you reported a vulnerability and didn't get an
5656
 auto-ack within 30 min, the inbound flow is broken — please email
5757
 the operator's GitHub-listed contact as a fallback.
@@ -64,5 +64,5 @@ the operator's GitHub-listed contact as a fallback.
6464
 
6565
 There's no email/RSS feed for status updates yet. Watch the
6666
 operator's announcements account (linked from the
67
-[homepage](https://shithub.example/)) or refresh this page during
67
+[homepage](https://shithub.sh/)) or refresh this page during
6868
 a known incident window.
docs/public/user/account.mdmodified
@@ -37,7 +37,7 @@ killed instantly. Use this if you suspect an unauthorized sign-in.
3737
 
3838
 ## SSH and GPG keys
3939
 
40
-- **SSH keys** authenticate `git@shithub.example:...` operations.
40
+- **SSH keys** authenticate `git@shithub.sh:...` operations.
4141
 - **GPG keys** verify signed commits — when a commit's signature
4242
   matches a registered GPG key, the commit shows a "Verified"
4343
   badge in history.
docs/public/user/https.mdmodified
@@ -24,7 +24,7 @@ into your password manager — we never display it again.
2424
 ## 2. Clone
2525
 
2626
 ```sh
27
-git clone https://shithub.example/<owner>/<repo>.git
27
+git clone https://shithub.sh/<owner>/<repo>.git
2828
 ```
2929
 
3030
 When git asks for credentials:
@@ -53,7 +53,7 @@ the URL or `~/.netrc`. Use a token with the narrowest scope the
5353
 job needs and a short expiration.
5454
 
5555
 ```sh
56
-git clone https://x-access-token:${SHITHUB_PAT}@shithub.example/owner/repo.git
56
+git clone https://x-access-token:${SHITHUB_PAT}@shithub.sh/owner/repo.git
5757
 ```
5858
 
5959
 Because the token is in the URL, make sure your CI doesn't echo
docs/public/user/quickstart.mdmodified
@@ -38,7 +38,7 @@ token](./personal-access-tokens.md) — your account password does
3838
 not work for git operations.
3939
 
4040
 ```sh
41
-git clone https://shithub.example/<your-username>/<repo>.git
41
+git clone https://shithub.sh/<your-username>/<repo>.git
4242
 cd <repo>
4343
 ```
4444
 
docs/public/user/ssh.mdmodified
@@ -43,7 +43,7 @@ what `ssh-keygen -l -f ~/.ssh/id_ed25519.pub` prints locally.
4343
 ## 4. Test the connection
4444
 
4545
 ```sh
46
-ssh -T git@shithub.example
46
+ssh -T git@shithub.sh
4747
 ```
4848
 
4949
 You'll see a confirmation message. The `-T` disables PTY allocation;
@@ -52,7 +52,7 @@ shithub's SSH service refuses TTYs anyway.
5252
 ## 5. Clone with SSH
5353
 
5454
 ```sh
55
-git clone git@shithub.example:<owner>/<repo>.git
55
+git clone git@shithub.sh:<owner>/<repo>.git
5656
 ```
5757
 
5858
 Subsequent pushes don't prompt — the agent presents the key, the
internal/web/templates/hello.htmlmodified
@@ -29,7 +29,7 @@
2929
       A self-hostable git forge that aims to look and feel like GitHub.
3030
       AGPL-licensed, written in Go, no AI training on your code, no
3131
       Copilot. <a href="/signup">Sign up</a> to host code here, or
32
-      <a href="https://docs.shithub.example/self-host/deploy.html">run
32
+      <a href="https://docs.shithub.sh/self-host/deploy.html">run
3333
       your own instance</a> from the source.
3434
     </p>
3535
   </section>
@@ -64,14 +64,14 @@
6464
   <nav class="shithub-landing-cta" aria-label="Primary actions">
6565
     <a class="shithub-landing-cta-primary" href="/signup">Create an account</a>
6666
     <a class="shithub-landing-cta-secondary" href="/login">Sign in</a>
67
-    <a class="shithub-landing-cta-secondary" href="https://docs.shithub.example/">Read the docs</a>
67
+    <a class="shithub-landing-cta-secondary" href="https://docs.shithub.sh/">Read the docs</a>
6868
     <a class="shithub-landing-cta-secondary" href="/shithub/shithub">Read the source</a>
6969
   </nav>
7070
 
7171
   <p class="shithub-landing-honest">
7272
     Newly launched. Some surfaces (SSH transport, Actions/CI, GraphQL,
7373
     packages, releases) are planned but not shipped yet. The
74
-    <a href="https://docs.shithub.example/">docs</a> are honest about
74
+    <a href="https://docs.shithub.sh/">docs</a> are honest about
7575
     what works and what's still in flight.
7676
   </p>
7777
   {{ end }}
tests/load/README.mdmodified
@@ -37,7 +37,7 @@ with `K6_SCENARIO=auth-mix make load-test` etc.
3737
 ## Running against staging
3838
 
3939
 ```sh
40
-export BASE=https://staging.shithub.example
40
+export BASE=https://staging.shithub.sh
4141
 export TOKEN=shp_<a-pat-on-a-test-account>
4242
 export REPO=loadtest/issue-storm  # for the comment-storm scenario
4343
 export FIRST_ISSUE=1