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
4
 follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/)
4
 follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/)
5
 conventions and [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
5
 conventions and [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
 
6
 
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
+
7
 ## [Unreleased]
11
 ## [Unreleased]
8
 
12
 
9
 (Empty — first post-launch entries land here.)
13
 (Empty — first post-launch entries land here.)
10
 
14
 
11
-## [1.0.0] — TBD (operator fills in cutover date)
15
+## [0.1.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).
44
 
16
 
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.
46
 
20
 
47
-The first stable release. Core forge loop:
21
+### Initial public surface
48
 
22
 
49
-- Identity: signup, email verification, password reset, TOTP 2FA
23
+- **Identity** — signup, email verification, password reset, TOTP
50
-  + recovery codes, SSH keys, scoped PATs, sessions with
24
+  2FA + recovery codes, SSH keys, scoped PATs, sessions with
51
   per-account epoch invalidation.
25
   per-account epoch invalidation.
52
-- Repositories: create, fork, archive, transfer, soft-delete with
26
+- **Repositories** — create, fork, archive, transfer, soft-delete
53
-  grace, rename with redirects, visibility toggles, branch
27
+  with grace, rename with redirects, visibility toggles, branch
54
-  protection (force-push / deletion / required reviews / required
28
+  protection, default-branch swap, topics, README/license/
55
-  status checks), default-branch swap, topics, README/license/
56
   .gitignore templates.
29
   .gitignore templates.
57
-- Git: bare repos on disk; HTTPS smart-HTTP push/pull; pre/post-
30
+- **Git** — bare repos on disk; HTTPS smart-HTTP push/pull;
58
-  receive hook integration for size accounting and event emission.
31
+  pre/post-receive hook integration.
59
-- Code browsing: tree, blob (chroma syntax highlighting with
32
+- **Code browsing** — tree, blob (chroma syntax highlighting),
60
-  light/dark themes), raw, blame, commit history, individual
33
+  raw, blame, commit history, individual commit views, branch/tag
61
-  commit views, branch/tag listings, compare views, file finder.
34
+  listings, compare views, file finder.
62
-- Issues + PRs: full CRUD; pull requests with diff rendering,
35
+- **Issues + PRs** — full CRUD; reviews; required-reviewer
63
-  file-by-file review, line comments, reviews, required-reviewer
36
+  enforcement; status-check gates; three merge methods.
64
-  enforcement, status-check gates, three merge methods.
37
+- **Social** — stars, watches, forks, `/explore`, stargazer/
65
-- Social: stars, watches with notification level, forks
38
+  watcher lists.
66
-  (clone-on-create), `/explore`, stargazer/watcher lists.
39
+- **Search** — code, repo, user, issue.
67
-- Search: code, repo, user.
40
+- **Notifications** — in-app inbox, email fan-out, one-click
68
-- Notifications: per-user inbox + email fan-out, watch-level
41
+  unsubscribe.
69
-  routing, one-click HMAC-signed unsubscribe.
42
+- **Orgs + teams** — roles, invitations, one-level nesting,
70
-- Organizations + teams: create, member roles, invitations,
71
-  one-level team nesting, team grants on repos with
72
   max-of-sources policy.
43
   max-of-sources policy.
73
-- Webhooks: outbound delivery with HMAC-SHA256 signing,
44
+- **Webhooks** — HMAC-signed delivery, exponential backoff,
74
-  exponential backoff with jitter, auto-disable on persistent
45
+  auto-disable, SSRF defense, redelivery UI.
75
-  failure, SSRF defense, redelivery UI, ping events.
46
+- **Observability** — structured logs, Prometheus metrics,
76
-- Observability: structured logs, Prometheus metrics, optional
47
+  optional OTel tracing, Sentry-protocol error reporting.
77
-  OTel tracing, Sentry-protocol error reporting.
48
+- **Operations** — Ansible playbook, systemd units, Caddy edge,
78
-- Security: AGPLv3, threat model + security checklist, package
79
-  boundary lints (markdown, policy, secret-logs, CSRF).
80
-- Operations: Ansible playbook, systemd units, Caddy edge,
81
   WireGuard mesh for monitoring, Postgres WAL archive + daily
49
   WireGuard mesh for monitoring, Postgres WAL archive + daily
82
   logical backups to Spaces, cross-region DR, restore drill.
50
   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.
83
 
71
 
84
-[Unreleased]: https://shithub.example/shithub/shithub/compare/v1.0.0...trunk
72
+[Unreleased]: https://shithub.sh/shithub/shithub/compare/v0.1.0...trunk
85
-[1.0.0]: https://shithub.example/shithub/shithub/releases/tag/v1.0.0
73
+[0.1.0]: https://shithub.sh/shithub/shithub/releases/tag/v0.1.0
CODE_OF_CONDUCT.mdmodified
@@ -60,7 +60,7 @@ public spaces.
60
 
60
 
61
 Instances of abusive, harassing, or otherwise unacceptable
61
 Instances of abusive, harassing, or otherwise unacceptable
62
 behavior may be reported to the project team at
62
 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
64
 and investigated promptly and fairly.
64
 and investigated promptly and fairly.
65
 
65
 
66
 All project maintainers are obligated to respect the privacy and
66
 All project maintainers are obligated to respect the privacy and
CONTRIBUTING.mdmodified
@@ -97,4 +97,4 @@ run the deploy.
97
   `proposal`.
97
   `proposal`.
98
 - **Day-to-day chat:** the project doesn't run a Slack/Discord
98
 - **Day-to-day chat:** the project doesn't run a Slack/Discord
99
   yet; PR comments and issues are the channel.
99
   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 @@
10
 
10
 
11
 ---
11
 ---
12
 
12
 
13
-**Status: v1.0.0 launched — early days. Honest about WIP areas.**
13
+**Status: v0.1.0 launched — early days. Honest about WIP areas.**
14
 
14
 
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.
16
 
16
 
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.
18
 
18
 
19
 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.
19
 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.
20
 
20
 
SECURITY.mdmodified
@@ -2,9 +2,9 @@
2
 
2
 
3
 ## Reporting a vulnerability
3
 ## Reporting a vulnerability
4
 
4
 
5
-Email **`security@shithub.example`**. PGP-encrypt the report
5
+Email **`security@shithub.sh`**. PGP-encrypt the report
6
 using the key fingerprint published at
6
 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
8
 is sensitive.
8
 is sensitive.
9
 
9
 
10
 The mailbox auto-acknowledges receipt within minutes. A human
10
 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.
19
 
19
 
20
 In scope:
20
 In scope:
21
 
21
 
22
-- The hosted shithub instance (`shithub.example`).
22
+- The hosted shithub instance (`shithub.sh`).
23
 - The shithub source as published on GitHub
23
 - The shithub source as published on GitHub
24
   (`github.com/tenseleyFlow/shithub`), exploited against any
24
   (`github.com/tenseleyFlow/shithub`), exploited against any
25
   reasonably-deployed self-hosted instance running an unmodified
25
   reasonably-deployed self-hosted instance running an unmodified
deploy/cutover/checklist.mdmodified
@@ -9,10 +9,10 @@ visual check.
9
 
9
 
10
 ## T-7 days
10
 ## T-7 days
11
 
11
 
12
-- [ ] DNS A/AAAA for `shithub.example` published with low TTL
12
+- [ ] DNS A/AAAA for `shithub.sh` published with low TTL
13
       (300s) so cutover-day changes propagate fast. Verify:
13
       (300s) so cutover-day changes propagate fast. Verify:
14
-      `dig +short A shithub.example`.
14
+      `dig +short A shithub.sh`.
15
-- [ ] DNS CNAME for `docs.shithub.example` published.
15
+- [ ] DNS CNAME for `docs.shithub.sh` published.
16
 - [ ] Postmark domain verified; SPF/DKIM/DMARC aligned. Verify:
16
 - [ ] Postmark domain verified; SPF/DKIM/DMARC aligned. Verify:
17
       Postmark dashboard → Domains → green.
17
       Postmark dashboard → Domains → green.
18
 - [ ] Signup-throttle config reviewed; per-IP and per-/24
18
 - [ ] Signup-throttle config reviewed; per-IP and per-/24
@@ -28,13 +28,13 @@ visual check.
28
 - [ ] Last DNS change committed. Cutover after 48h ensures no
28
 - [ ] Last DNS change committed. Cutover after 48h ensures no
29
       propagation lag.
29
       propagation lag.
30
 - [ ] S37 backup-restore drill green within last 7 days.
30
 - [ ] 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/`
32
       returns 200.
32
       returns 200.
33
 - [ ] S39 P0/P1 bugs closed.
33
 - [ ] S39 P0/P1 bugs closed.
34
 - [ ] Tag the release commit:
34
 - [ ] Tag the release commit:
35
       ```sh
35
       ```sh
36
-      git tag -a v1.0.0 -m "v1.0.0 — launch"
36
+      git tag -a v0.1.0 -m "v0.1.0 — launch"
37
-      git push origin v1.0.0
37
+      git push origin v0.1.0
38
       ```
38
       ```
39
 
39
 
40
 ## T-1 hour
40
 ## T-1 hour
@@ -49,9 +49,9 @@ visual check.
49
 ## T-0: cutover
49
 ## T-0: cutover
50
 
50
 
51
 ```sh
51
 ```sh
52
-# 1. Pull the v1.0.0 tag.
52
+# 1. Pull the v0.1.0 tag.
53
 git fetch --tags
53
 git fetch --tags
54
-git checkout v1.0.0
54
+git checkout v0.1.0
55
 
55
 
56
 # 2. Dry-run to confirm exactly what will change.
56
 # 2. Dry-run to confirm exactly what will change.
57
 make deploy-check ANSIBLE_INVENTORY=production
57
 make deploy-check ANSIBLE_INVENTORY=production
@@ -77,7 +77,7 @@ Run the smoke script as soon as the deploy reports `ok=N
77
 changed=N failed=0`:
77
 changed=N failed=0`:
78
 
78
 
79
 ```sh
79
 ```sh
80
-deploy/cutover/smoke.sh https://shithub.example
80
+deploy/cutover/smoke.sh https://shithub.sh
81
 ```
81
 ```
82
 
82
 
83
 The script exercises: home page, signup form, login form, health
83
 The script exercises: home page, signup form, login form, health
@@ -127,7 +127,7 @@ git remote add github https://github.com/tenseleyFlow/shithub.git
127
 Confirm a test push lands on both:
127
 Confirm a test push lands on both:
128
 
128
 
129
 ```sh
129
 ```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
131
 cd /tmp/test-clone
131
 cd /tmp/test-clone
132
 echo "launch test" >> .launch-test
132
 echo "launch test" >> .launch-test
133
 git add .launch-test
133
 git add .launch-test
@@ -164,7 +164,7 @@ For the first 24h:
164
 - Refresh Grafana every 30 min.
164
 - Refresh Grafana every 30 min.
165
 - Triage every alert immediately; nothing false-positive should
165
 - Triage every alert immediately; nothing false-positive should
166
   page in week 1 (we tuned for it).
166
   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`
168
   (the project's own self-hosted issues — drink your own
168
   (the project's own self-hosted issues — drink your own
169
   champagne).
169
   champagne).
170
 
170
 
@@ -184,6 +184,6 @@ fixed." Honesty wins trust; deadlines under stress lose it.
184
 
184
 
185
 ## Day-one retro
185
 ## Day-one retro
186
 
186
 
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`
188
 with: what worked, what surprised us, top 3 user-reported
188
 with: what worked, what surprised us, top 3 user-reported
189
 issues, and the next sprint's focus.
189
 issues, and the next sprint's focus.
deploy/cutover/rollback.shmodified
@@ -91,7 +91,7 @@ make deploy ANSIBLE_INVENTORY=production
91
 # file; falls back to asking.
91
 # file; falls back to asking.
92
 BASE="${SHITHUB_PROD_URL:-}"
92
 BASE="${SHITHUB_PROD_URL:-}"
93
 if [[ -z "$BASE" ]]; then
93
 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
95
 fi
95
 fi
96
 echo ""
96
 echo ""
97
 echo "running smoke against $BASE..."
97
 echo "running smoke against $BASE..."
deploy/cutover/smoke.shmodified
@@ -7,7 +7,7 @@
7
 # is reachable, the API authenticates a known PAT.
7
 # is reachable, the API authenticates a known PAT.
8
 #
8
 #
9
 # Usage:
9
 # Usage:
10
-#   deploy/cutover/smoke.sh https://shithub.example
10
+#   deploy/cutover/smoke.sh https://shithub.sh
11
 #
11
 #
12
 # Optional env (when set, the script also exercises the API):
12
 # Optional env (when set, the script also exercises the API):
13
 #   SHITHUB_SMOKE_PAT     — a valid shp_ token for `user:read`
13
 #   SHITHUB_SMOKE_PAT     — a valid shp_ token for `user:read`
deploy/docs-site/sync-to-spaces.shmodified
@@ -2,7 +2,7 @@
2
 # SPDX-License-Identifier: AGPL-3.0-or-later
2
 # SPDX-License-Identifier: AGPL-3.0-or-later
3
 #
3
 #
4
 # Build the public docs site and sync it to the Spaces bucket
4
 # 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.
6
 #
6
 #
7
 # Run from CI on every push to main, or from an operator's
7
 # Run from CI on every push to main, or from an operator's
8
 # workstation as a one-off. Idempotent: rclone sync only touches
8
 # 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
2
 
2
 
3
-shithub is now live at **shithub.example**.
3
+shithub is now live at **shithub.sh**.
4
 
4
 
5
 A self-hostable git forge that aims to look and feel like GitHub.
5
 A self-hostable git forge that aims to look and feel like GitHub.
6
 AGPL-licensed, written in Go, no AI training on your code, no
6
 AGPL-licensed, written in Go, no AI training on your code, no
7
 Copilot.
7
 Copilot.
8
 
8
 
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
10
 the hosted instance, or
10
 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)
12
 from the source.
12
 from the source.
13
 
13
 
14
 The project's own source is now hosted on shithub at
14
 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).
16
 A one-way mirror keeps pushing to the original GitHub repo for the
16
 A one-way mirror keeps pushing to the original GitHub repo for the
17
 first 90 days as a recovery surface; after that, the canonical home
17
 first 90 days as a recovery surface; after that, the canonical home
18
 is the self-hosted instance.
18
 is the self-hosted instance.
@@ -73,7 +73,7 @@ Honesty over hype:
73
   focus-state details — all still drifting.
73
   focus-state details — all still drifting.
74
 
74
 
75
 The full roadmap is in
75
 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)
77
 on the source repo.
77
 on the source repo.
78
 
78
 
79
 ## Why
79
 ## Why
@@ -92,7 +92,7 @@ of switching.
92
 ## Self-hosting
92
 ## Self-hosting
93
 
93
 
94
 If you'd rather run your own instance, the operator docs are at
94
 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).
96
 Reference target is one DigitalOcean droplet, Postgres on a
96
 Reference target is one DigitalOcean droplet, Postgres on a
97
 second, DigitalOcean Spaces for object storage, Caddy at the
97
 second, DigitalOcean Spaces for object storage, Caddy at the
98
 edge. The Ansible playbook in `deploy/ansible/` is the install
98
 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
102
 ## Security
102
 ## Security
103
 
103
 
104
 If you find a vulnerability, please email
104
 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
106
 within minutes; a human response within 72 hours. Full policy at
106
 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).
108
 
108
 
109
 ## On call
109
 ## On call
110
 
110
 
111
 The author is on call for the first month. Expect rough edges;
111
 The author is on call for the first month. Expect rough edges;
112
 we're triaging publicly. Issue tracker for shithub itself lives
112
 we're triaging publicly. Issue tracker for shithub itself lives
113
 on shithub itself:
113
 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).
115
 
115
 
116
 ## Thanks
116
 ## Thanks
117
 
117
 
docs/internal/bench.mdmodified
@@ -25,7 +25,7 @@ on the small dataset.
25
 make bench-small
25
 make bench-small
26
 
26
 
27
 # Pin a different target / iteration count.
27
 # 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
29
 ```
29
 ```
30
 
30
 
31
 Output is one JSON line per scenario:
31
 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
2
 
2
 
3
 **Cutover date:** TBD (filled in by the operator on launch day).
3
 **Cutover date:** TBD (filled in by the operator on launch day).
4
 
4
 
@@ -65,7 +65,7 @@ not rehash of every minor decision.)
65
 
65
 
66
 ## Closing
66
 ## Closing
67
 
67
 
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
69
 the project against; what we ship from here forward is judged in
69
 the project against; what we ship from here forward is judged in
70
 the context of a public, dogfood-driven instance. That's the
70
 the context of a public, dogfood-driven instance. That's the
71
 forcing function we wanted.
71
 forcing function we wanted.
docs/internal/runbooks/day-one.mdmodified
@@ -26,7 +26,7 @@ Open three tabs and walk this list:
26
    - A flood of ERROR lines from the same handler is a bug —
26
    - A flood of ERROR lines from the same handler is a bug —
27
      bisect.
27
      bisect.
28
 
28
 
29
-3. **Status page on docs.shithub.example/status.html.**
29
+3. **Status page on docs.shithub.sh/status.html.**
30
    - Confirm "All systems normal." with a current timestamp.
30
    - Confirm "All systems normal." with a current timestamp.
31
    - If you've had any blip, even a 30-second one, log it under
31
    - If you've had any blip, even a 30-second one, log it under
32
      "Recent incidents" with what happened. Trust comes from
32
      "Recent incidents" with what happened. Trust comes from
@@ -58,7 +58,7 @@ if you haven't.
58
 3. **Mirror push to GitHub.** The mirror job runs hourly. Confirm:
58
 3. **Mirror push to GitHub.** The mirror job runs hourly. Confirm:
59
    ```sh
59
    ```sh
60
    git ls-remote https://github.com/tenseleyFlow/shithub.git trunk
60
    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
62
    ```
62
    ```
63
    Both should report the same SHA (within an hour of the latest
63
    Both should report the same SHA (within an hour of the latest
64
    push to shithub).
64
    push to shithub).
@@ -71,7 +71,7 @@ if you haven't.
71
    - Suspended accounts: log who and why for the retro.
71
    - Suspended accounts: log who and why for the retro.
72
 
72
 
73
 5. **Issue tracker.** Open
73
 5. **Issue tracker.** Open
74
-   `https://shithub.example/shithub/shithub/issues`. Triage every
74
+   `https://shithub.sh/shithub/shithub/issues`. Triage every
75
    new issue:
75
    new issue:
76
    - **P0** — site down / data loss / security. Fix immediately.
76
    - **P0** — site down / data loss / security. Fix immediately.
77
    - **P1** — broken core flow (signup, push, merge). Fix this
77
    - **P1** — broken core flow (signup, push, merge). Fix this
@@ -81,7 +81,7 @@ if you haven't.
81
    - Reply on every issue within 24h, even if just "tracked, P2."
81
    - Reply on every issue within 24h, even if just "tracked, P2."
82
 
82
 
83
 6. **Retro.** Update
83
 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,
85
    the "What surprised us" section, the top-3 issues table.
85
    the "What surprised us" section, the top-3 issues table.
86
 
86
 
87
 ## "First incident?"
87
 ## "First incident?"
docs/internal/threat-model.mdmodified
@@ -178,7 +178,7 @@ keep an eye on them:
178
   is enforced; we don't yet do reproducible-build verification.
178
   is enforced; we don't yet do reproducible-build verification.
179
 - **The docs subdomain serving from Spaces.** A bucket
179
 - **The docs subdomain serving from Spaces.** A bucket
180
   policy mistake there could let an attacker stage a phishing
180
   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
182
   and the explicit reverse-proxy origin
182
   and the explicit reverse-proxy origin
183
   (`deploy/docs-site/Caddyfile.snippet`).
183
   (`deploy/docs-site/Caddyfile.snippet`).
184
 - **PAT prefix recognition by external secret scanners.**
184
 - **PAT prefix recognition by external secret scanners.**
docs/public/security.mdmodified
@@ -3,7 +3,7 @@
3
 This is a mirror of [`SECURITY.md`](https://github.com/tenseleyFlow/shithub/blob/main/SECURITY.md)
3
 This is a mirror of [`SECURITY.md`](https://github.com/tenseleyFlow/shithub/blob/main/SECURITY.md)
4
 in the source tree. The in-repo file is authoritative.
4
 in the source tree. The in-repo file is authoritative.
5
 
5
 
6
-To report a vulnerability, email **`security@shithub.example`**.
6
+To report a vulnerability, email **`security@shithub.sh`**.
7
 
7
 
8
 The mailbox auto-acknowledges within minutes; a human response
8
 The mailbox auto-acknowledges within minutes; a human response
9
 follows within **72 hours**. Please don't file public issues for
9
 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}`.
85
 
85
 
86
 ## 5. Smoke
86
 ## 5. Smoke
87
 
87
 
88
-- `https://shithub.example/` — Caddy serves the home page.
88
+- `https://shithub.sh/` — Caddy serves the home page.
89
-- `https://shithub.example/-/health` — returns `200 OK` with the
89
+- `https://shithub.sh/-/health` — returns `200 OK` with the
90
   build version.
90
   build version.
91
 - Sign in as the bootstrap admin. Create a test repo. Push to it.
91
 - 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.
93
 
93
 
94
 ## 6. Production
94
 ## 6. Production
95
 
95
 
docs/public/self-host/prerequisites.mdmodified
@@ -47,9 +47,9 @@ on top of that.
47
 
47
 
48
 You need:
48
 You need:
49
 
49
 
50
-- A domain you control (e.g. `shithub.example`).
50
+- A domain you control (e.g. `shithub.sh`).
51
-- DNS records for the app (`shithub.example`) and the docs
51
+- DNS records for the app (`shithub.sh`) and the docs
52
-  subdomain (`docs.shithub.example`).
52
+  subdomain (`docs.shithub.sh`).
53
 - A TLS certificate. Caddy obtains and renews via Let's Encrypt
53
 - A TLS certificate. Caddy obtains and renews via Let's Encrypt
54
   automatically — no manual cert management — but the DNS records
54
   automatically — no manual cert management — but the DNS records
55
   must point at your public IP first.
55
   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).
10
 Most often:
10
 Most often:
11
 
11
 
12
 - DNS doesn't yet point at the host. Verify with `dig +short
12
 - DNS doesn't yet point at the host. Verify with `dig +short
13
-  shithub.example`.
13
+  shithub.sh`.
14
 - Port 80 is blocked. Let's Encrypt's HTTP-01 challenge needs
14
 - Port 80 is blocked. Let's Encrypt's HTTP-01 challenge needs
15
   port 80 reachable from the public internet (Caddy redirects
15
   port 80 reachable from the public internet (Caddy redirects
16
   to 443 *after* obtaining the cert). UFW must allow 80.
16
   to 443 *after* obtaining the cert). UFW must allow 80.
docs/public/status.mdmodified
@@ -1,6 +1,6 @@
1
 # Status
1
 # Status
2
 
2
 
3
-Live status of `shithub.example` and the published mirrors.
3
+Live status of `shithub.sh` and the published mirrors.
4
 This page is hand-maintained by the operator on call; the
4
 This page is hand-maintained by the operator on call; the
5
 machine-readable health endpoints are linked under each section.
5
 machine-readable health endpoints are linked under each section.
6
 
6
 
@@ -18,18 +18,18 @@ Last updated: TBD (operator updates on each cutover or incident).
18
 
18
 
19
 These return immediately and reflect the running web process:
19
 These return immediately and reflect the running web process:
20
 
20
 
21
-- [`https://shithub.example/-/health`](https://shithub.example/-/health) —
21
+- [`https://shithub.sh/-/health`](https://shithub.sh/-/health) —
22
   `200 OK` with version + commit + buildAt when the web service
22
   `200 OK` with version + commit + buildAt when the web service
23
   is up.
23
   is up.
24
-- [`https://shithub.example/healthz`](https://shithub.example/healthz) —
24
+- [`https://shithub.sh/healthz`](https://shithub.sh/healthz) —
25
   liveness only; `200 OK` if the process is responding.
25
   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) —
27
   readiness; `200 OK` only when DB + storage are reachable.
27
   readiness; `200 OK` only when DB + storage are reachable.
28
 
28
 
29
 A scripted check from your machine:
29
 A scripted check from your machine:
30
 
30
 
31
 ```sh
31
 ```sh
32
-curl -fsS https://shithub.example/readyz
32
+curl -fsS https://shithub.sh/readyz
33
 ```
33
 ```
34
 
34
 
35
 Non-200 means the web service is degraded or down. The operator's
35
 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.
39
 
39
 
40
 | Subdomain                  | Purpose                | Health                                      |
40
 | Subdomain                  | Purpose                | Health                                      |
41
 |----------------------------|------------------------|---------------------------------------------|
41
 |----------------------------|------------------------|---------------------------------------------|
42
-| `shithub.example`          | App                    | `/readyz`                                   |
42
+| `shithub.sh`          | App                    | `/readyz`                                   |
43
-| `docs.shithub.example`     | Docs site (this site)  | Static; HTTP 200 on `/`                    |
43
+| `docs.shithub.sh`     | Docs site (this site)  | Static; HTTP 200 on `/`                    |
44
 
44
 
45
 ## Backups
45
 ## Backups
46
 
46
 
@@ -51,7 +51,7 @@ log is archived to the backup bucket
51
 
51
 
52
 ## Mailbox availability
52
 ## Mailbox availability
53
 
53
 
54
-The disclosure mailbox `security@shithub.example` auto-acks within
54
+The disclosure mailbox `security@shithub.sh` auto-acks within
55
 minutes. If you reported a vulnerability and didn't get an
55
 minutes. If you reported a vulnerability and didn't get an
56
 auto-ack within 30 min, the inbound flow is broken — please email
56
 auto-ack within 30 min, the inbound flow is broken — please email
57
 the operator's GitHub-listed contact as a fallback.
57
 the operator's GitHub-listed contact as a fallback.
@@ -64,5 +64,5 @@ the operator's GitHub-listed contact as a fallback.
64
 
64
 
65
 There's no email/RSS feed for status updates yet. Watch the
65
 There's no email/RSS feed for status updates yet. Watch the
66
 operator's announcements account (linked from the
66
 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
68
 a known incident window.
68
 a known incident window.
docs/public/user/account.mdmodified
@@ -37,7 +37,7 @@ killed instantly. Use this if you suspect an unauthorized sign-in.
37
 
37
 
38
 ## SSH and GPG keys
38
 ## SSH and GPG keys
39
 
39
 
40
-- **SSH keys** authenticate `git@shithub.example:...` operations.
40
+- **SSH keys** authenticate `git@shithub.sh:...` operations.
41
 - **GPG keys** verify signed commits — when a commit's signature
41
 - **GPG keys** verify signed commits — when a commit's signature
42
   matches a registered GPG key, the commit shows a "Verified"
42
   matches a registered GPG key, the commit shows a "Verified"
43
   badge in history.
43
   badge in history.
docs/public/user/https.mdmodified
@@ -24,7 +24,7 @@ into your password manager — we never display it again.
24
 ## 2. Clone
24
 ## 2. Clone
25
 
25
 
26
 ```sh
26
 ```sh
27
-git clone https://shithub.example/<owner>/<repo>.git
27
+git clone https://shithub.sh/<owner>/<repo>.git
28
 ```
28
 ```
29
 
29
 
30
 When git asks for credentials:
30
 When git asks for credentials:
@@ -53,7 +53,7 @@ the URL or `~/.netrc`. Use a token with the narrowest scope the
53
 job needs and a short expiration.
53
 job needs and a short expiration.
54
 
54
 
55
 ```sh
55
 ```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
57
 ```
57
 ```
58
 
58
 
59
 Because the token is in the URL, make sure your CI doesn't echo
59
 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
38
 not work for git operations.
38
 not work for git operations.
39
 
39
 
40
 ```sh
40
 ```sh
41
-git clone https://shithub.example/<your-username>/<repo>.git
41
+git clone https://shithub.sh/<your-username>/<repo>.git
42
 cd <repo>
42
 cd <repo>
43
 ```
43
 ```
44
 
44
 
docs/public/user/ssh.mdmodified
@@ -43,7 +43,7 @@ what `ssh-keygen -l -f ~/.ssh/id_ed25519.pub` prints locally.
43
 ## 4. Test the connection
43
 ## 4. Test the connection
44
 
44
 
45
 ```sh
45
 ```sh
46
-ssh -T git@shithub.example
46
+ssh -T git@shithub.sh
47
 ```
47
 ```
48
 
48
 
49
 You'll see a confirmation message. The `-T` disables PTY allocation;
49
 You'll see a confirmation message. The `-T` disables PTY allocation;
@@ -52,7 +52,7 @@ shithub's SSH service refuses TTYs anyway.
52
 ## 5. Clone with SSH
52
 ## 5. Clone with SSH
53
 
53
 
54
 ```sh
54
 ```sh
55
-git clone git@shithub.example:<owner>/<repo>.git
55
+git clone git@shithub.sh:<owner>/<repo>.git
56
 ```
56
 ```
57
 
57
 
58
 Subsequent pushes don't prompt — the agent presents the key, the
58
 Subsequent pushes don't prompt — the agent presents the key, the
internal/web/templates/hello.htmlmodified
@@ -29,7 +29,7 @@
29
       A self-hostable git forge that aims to look and feel like GitHub.
29
       A self-hostable git forge that aims to look and feel like GitHub.
30
       AGPL-licensed, written in Go, no AI training on your code, no
30
       AGPL-licensed, written in Go, no AI training on your code, no
31
       Copilot. <a href="/signup">Sign up</a> to host code here, or
31
       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
33
       your own instance</a> from the source.
33
       your own instance</a> from the source.
34
     </p>
34
     </p>
35
   </section>
35
   </section>
@@ -64,14 +64,14 @@
64
   <nav class="shithub-landing-cta" aria-label="Primary actions">
64
   <nav class="shithub-landing-cta" aria-label="Primary actions">
65
     <a class="shithub-landing-cta-primary" href="/signup">Create an account</a>
65
     <a class="shithub-landing-cta-primary" href="/signup">Create an account</a>
66
     <a class="shithub-landing-cta-secondary" href="/login">Sign in</a>
66
     <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>
68
     <a class="shithub-landing-cta-secondary" href="/shithub/shithub">Read the source</a>
68
     <a class="shithub-landing-cta-secondary" href="/shithub/shithub">Read the source</a>
69
   </nav>
69
   </nav>
70
 
70
 
71
   <p class="shithub-landing-honest">
71
   <p class="shithub-landing-honest">
72
     Newly launched. Some surfaces (SSH transport, Actions/CI, GraphQL,
72
     Newly launched. Some surfaces (SSH transport, Actions/CI, GraphQL,
73
     packages, releases) are planned but not shipped yet. The
73
     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
75
     what works and what's still in flight.
75
     what works and what's still in flight.
76
   </p>
76
   </p>
77
   {{ end }}
77
   {{ end }}
tests/load/README.mdmodified
@@ -37,7 +37,7 @@ with `K6_SCENARIO=auth-mix make load-test` etc.
37
 ## Running against staging
37
 ## Running against staging
38
 
38
 
39
 ```sh
39
 ```sh
40
-export BASE=https://staging.shithub.example
40
+export BASE=https://staging.shithub.sh
41
 export TOKEN=shp_<a-pat-on-a-test-account>
41
 export TOKEN=shp_<a-pat-on-a-test-account>
42
 export REPO=loadtest/issue-storm  # for the comment-storm scenario
42
 export REPO=loadtest/issue-storm  # for the comment-storm scenario
43
 export FIRST_ISSUE=1
43
 export FIRST_ISSUE=1