5,555 karma · joined January 29, 2011
Made LiveJournal, OpenID, memcached, etc.
12+ years at Google (Social, Android performance, 10+ years on Go),
Now Tailscale since Jan 2020
But these are a separate fleet (https://tailcat.dev/derpmap.json) separate from our usual ones, and not using "tailscale.com" in DNS or SNI anywhere.
(just a cute demo, not intended for release or ongoing maintenance)
But Tailscale keeps sucking me in with new stuff to do. :(
Recently: https://github.com/golang/go/commit/128a36cf0367c46daff2528d...
https://github.com/golang/go/commit/3c0665e551be23e62167f625...
WireGuard doesn't do NAT traversal. That's the main thing this adds. And this also adds a CLI tool + library to do streams over WireGuard w/o installing kernel routings, requiring root, etc.
There's no vendor lock-in here and no payment or account required. If Tailscale as a company fails, tailcat keeps working if you run your own DERP server. It's just open source code, not a hosted service.
The DERP server is already open source and tailcat can use any DERP server you run: https://github.com/tailscale/tailscale/tree/main/cmd/derper#...
We just provide some default ones (https://tailcat.dev/derpmap.json) to get started if you're not bandwidth-sensitive. But you don't have to use them.
Update: I added more explicit docs about this to https://github.com/tailscale/tailcat#bring-your-own-derp-rel...
Typos like this (it's instead of possessive its) used to be bother me but now it's a hint that it might be human-authored, which is quaint, so it's stopped bothering me as much.
Seriously, that's all it was. Just Ian alone proposed and rejected a half dozen of his own different approaches to generics. Finally a language + implementation plan came together that people all liked.
Nobody was ever opposed to generics that I saw.
https://github.com/bradfitz/koffer#der-verloren-koffe
Play online at https://bradfitz.github.io/koffer/js/
So neat seeing ~30 year old code come back alive.
So in 2005 I didn't expect Postgres to do super well here, but it's 21 years later and we're still pgbouncin'. It's just kinda sad.
I find it ridiculous that PgBouncer even needs to exist. Postgres should be doing this.
I gather things haven't improved since?
We should probably blog about it.
My email search:
"Welcome to the "Roku-tech" mailing list" ... "Tue, Dec 2, 2003, 10:48 AM"
Not sure how I ended up on the mailing list a month before their product was released. There must've been buzz about it for a few months before release.
I then open sourced it in Jan 2013 in what was then named Camlistore (now Perkeep) in https://github.com/perkeep/perkeep/commit/6f9f0bdda9c9c1f147... d
And later I put it in https://pkg.go.dev/github.com/golang/groupcache/singleflight (groupcache was written for dl.google.com)
And a private copy in Go's net package in Jun 2013: https://github.com/golang/go/commit/61d3b2db6292581fc07a3767...
It later moved to golang.org/x/net, and later to the Go standard library (well, internal: https://pkg.go.dev/internal/singleflight)
We now even have a copy with generics in Tailscale's tree at https://pkg.go.dev/tailscale.com/util/singleflight
So many variants of that code :)
And when something gets too trick, ChatGPT is amazing at writing in it. Often it nails the whole design in the first try, like https://bsky.app/profile/bradfitz.com/post/3maelwomyw22n to mask off certain Raspberry Pi pins to make reassembly of projects easier later.