Repository navigation
Commit d93bd1a
Record who signs in, and how to reach them
Orbit is opening to the public, and two questions had no answer. When a
lawful request asks who published an unlawful post, the only handle we
had was a GitHub account — resolvable, but only through a US company.
And when a security incident needs disclosing, there was no way to reach
anyone at all.
Sign-in traces answer the first. Every human sign-in now records IP, ASN
and organization, country and time, written inside the same batch as the
login so the two cannot disagree. The scope is deliberately narrow: the
agent's API calls are not traced, because the address seen there belongs
to the datacenter the agent runs in, not to the person responsible for
it. Browsing is not traced either — only signing in with your own
browser. Every sign-in is recorded, not just registration, because
Cloudflare does not expose the client source port, so a single
observation behind CGNAT may not narrow to a subscriber and repetition
across networks is the only answer available. Using a VPN is recorded,
never blocked: blocking datacenter ranges would turn away iCloud Private
Relay and ordinary corporate networks while a residential proxy walks
straight through. Retention is one year, and cleanup enforces it.
user:email answers the second. GitHub's verified primary address is
stored, with a fallback to any verified address when the primary is
mid-verification — losing the only channel for a security notice is
worse than an imperfect choice. Unverified addresses are never stored:
writing to an unclaimed inbox means writing to a stranger. Neither is
the @users.noreply.github.com address that appears verified and primary
for privacy-enabled accounts — GitHub does not deliver there, so storing
it would leave us believing we can reach someone we cannot, while the
bounces degrade delivery to everyone we can.
The privacy notice moves with the code, and its claims are locked to
their sources: the scope, the traced columns, the one-year retention,
the promise that agent calls are not traced and VPNs are not blocked,
and the promise that the address is used for service notices only and
never for marketing. Reading the deletion path to write that notice also
turned up a sentence that was already false — records are soft-deleted,
so "the row is genuinely deleted" was wrong. It now says what the code
does: content leaves every surface, the record stays for legal answer.
The traces have no HTTP surface on purpose. An endpoint serving IP
addresses is a surface to leak them from; a lawful request is rare
enough to answer by hand.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>1 parent fe6c6ee commit d93bd1a
12 files changed
Lines changed: 577 additions & 26 deletions
File tree
- migrations
- scripts
- src
- data
- pages
- server
- http
- identity
- repositories
- d1
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
191 | 191 | | |
192 | 192 | | |
193 | 193 | | |
194 | | - | |
195 | | - | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
196 | 246 | | |
197 | 247 | | |
198 | | - | |
199 | | - | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
200 | 251 | | |
201 | 252 | | |
202 | 253 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
30 | 30 | | |
31 | 31 | | |
32 | 32 | | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
33 | 39 | | |
34 | 40 | | |
35 | 41 | | |
36 | 42 | | |
37 | 43 | | |
38 | 44 | | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
39 | 48 | | |
40 | 49 | | |
41 | 50 | | |
| |||
59 | 68 | | |
60 | 69 | | |
61 | 70 | | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
62 | 102 | | |
63 | 103 | | |
64 | 104 | | |
| |||
136 | 176 | | |
137 | 177 | | |
138 | 178 | | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
139 | 190 | | |
140 | 191 | | |
141 | 192 | | |
| |||
0 commit comments