{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":169961096,"defaultBranch":"main","name":"hypcast","ownerLogin":"ahamlinman","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2019-02-10T09:19:29.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/603974?v=4","public":true,"private":false,"isOrgOwned":false},"refInfo":{"name":"","listCacheKey":"v0:1725689835.0","currentOid":""},"activityList":{"items":[{"before":"68dd05ae27b92db6b7f685db9dde6dcceb418135","after":"f2dfcaacebcf77db3dba1fe29128905f121bfdde","ref":"refs/heads/main","pushedAt":"2024-09-25T00:51:00.000Z","pushType":"push","commitsCount":3,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"},"commit":{"message":"Bump Pion v3\n\nWhatever issue I had with this before seems to have been fixed. The only\nthing `go get -u all` wants to bump now is github.com/gorilla/websocket,\nwhich I'm not choosing to take on at this time.","shortMessageHtmlLink":"Bump Pion v3"}},{"before":"076c4bd34b8b30f5ba6a80be1741ed2330a0b2fb","after":"68dd05ae27b92db6b7f685db9dde6dcceb418135","ref":"refs/heads/main","pushedAt":"2024-09-08T23:37:20.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"},"commit":{"message":"Make the Node.js tsconfig.json more like the Vite starter\n\nThe way Vite loads TypeScript config files seems to work more like this\nthan like regular Node.js resolution. I'm not sure exactly what they do\nunder the hood, but this is how their starter template is configured,\nand in another project that uses Tailwind with a TypeScript config I had\nactual complaints from VS Code with the node16 settings (though no\ncomplaints from Vite).","shortMessageHtmlLink":"Make the Node.js tsconfig.json more like the Vite starter"}},{"before":"db25ac11f2f12c2c31ca74b11a6c0eca5b2c0a14","after":"076c4bd34b8b30f5ba6a80be1741ed2330a0b2fb","ref":"refs/heads/main","pushedAt":"2024-09-08T23:29:09.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"},"commit":{"message":"Use plain .js for the ESLint configuration\n\nSince we set \"type\": \"module\" in package.json, Node.js doesn't\nnecessarily need the .mjs extension to know this is a module. Let's go\nahead and assume we have no CommonJS modules anywhere in this project.","shortMessageHtmlLink":"Use plain .js for the ESLint configuration"}},{"before":"5816c2dbc37e6f34f0107dab98ba789614c32c4a","after":"db25ac11f2f12c2c31ca74b11a6c0eca5b2c0a14","ref":"refs/heads/main","pushedAt":"2024-09-07T19:50:45.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"},"commit":{"message":"Play with an iterator for channel names\n\nIf I were writing this today for the first time, this is probably how\nI'd do it.\n\nIn fact, this made me notice that I never updated my GitHub test\nworkflow to Go 1.23 (or Node.js 22 for that matter).","shortMessageHtmlLink":"Play with an iterator for channel names"}},{"before":"7b43ee3f65764c322ccbeadbfe48c1a515c4b90d","after":"5816c2dbc37e6f34f0107dab98ba789614c32c4a","ref":"refs/heads/main","pushedAt":"2024-09-07T18:48:37.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"},"commit":{"message":"Annihilate references to embedclientzip\n\nThis broken misfeature of Hypcast's asset embedding is now permanently\nremoved.","shortMessageHtmlLink":"Annihilate references to embedclientzip"}},{"before":"b234113db4e375b9ed41558ef92b3e053eea7581","after":"7b43ee3f65764c322ccbeadbfe48c1a515c4b90d","ref":"refs/heads/main","pushedAt":"2024-09-07T06:44:06.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"},"commit":{"message":"Print the addresses of clients who invoke RPC methods\n\nI have slightly mixed feelings about giving the raw request to the\nhandler like this. It makes the function signatures longer, but it's\nbetter than hiding this data in some backchannel.","shortMessageHtmlLink":"Print the addresses of clients who invoke RPC methods"}},{"before":"31ab17d2719353b36155e70bfe871418291df662","after":null,"ref":"refs/heads/x/slog","pushedAt":"2024-09-07T06:17:15.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"}},{"before":"3b669fd7e0f320be6fc5368d16f563546be90125","after":"b234113db4e375b9ed41558ef92b3e053eea7581","ref":"refs/heads/main","pushedAt":"2024-09-07T06:17:15.000Z","pushType":"push","commitsCount":4,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"},"commit":{"message":"Merge branch 'slog'\n\nI think this is a good starting point. It doesn't need to stay on a\nbranch forever.","shortMessageHtmlLink":"Merge branch 'slog'"}},{"before":"85bd85c99cae4218bc10953e1ff651ac176ae6f9","after":"31ab17d2719353b36155e70bfe871418291df662","ref":"refs/heads/x/slog","pushedAt":"2024-09-07T06:10:49.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"},"commit":{"message":"Use proper grouping for assets in the startup log","shortMessageHtmlLink":"Use proper grouping for assets in the startup log"}},{"before":"03390194d36965906f1e156d52499952d520b0df","after":"85bd85c99cae4218bc10953e1ff651ac176ae6f9","ref":"refs/heads/x/slog","pushedAt":"2024-09-07T06:00:59.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"},"commit":{"message":"Tweak some of the new log messages\n\nBasically, every message should start with a verb.\n\n\"Connected tuner status socket\" still feels slightly odd, but it's\nbetter than what I had before.","shortMessageHtmlLink":"Tweak some of the new log messages"}},{"before":null,"after":"03390194d36965906f1e156d52499952d520b0df","ref":"refs/heads/x/slog","pushedAt":"2024-09-07T04:53:10.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"},"commit":{"message":"Replace all existing logging with log/slog\n\nI might need to give this a try on my real Hypcast server to see what I\nthink about it.","shortMessageHtmlLink":"Replace all existing logging with log/slog"}},{"before":"3eb419d980fcbfe7cdec067850b309be6649835a","after":"3b669fd7e0f320be6fc5368d16f563546be90125","ref":"refs/heads/main","pushedAt":"2024-09-07T04:09:52.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"},"commit":{"message":"Introduce Tprintf to simplify the current log format\n\nHypcast previously had a bunch of individual \"logf\" methods to dump out\na log prefixed by a type name and pointer address. This change uses a\nbit of reflection and a bit of rework on the existing type names to\nextract that into one shared function.\n\nThere's an interesting mix of generics and reflection here. I'm using\nthe type parameter to enforce that src is a pointer, which guarantees\nthat \"%p\" will work right and simplifies getting the type name compared\nto digging through layers of Elem() that will panic with a wrong move.\n\nI'm considering moving Hypcast to log/slog. Even if I throw this away\nsoon, it's nice that I'll be able to search for \"log.\" across the whole\ncodebase to see what needs to change.","shortMessageHtmlLink":"Introduce Tprintf to simplify the current log format"}},{"before":"cc047714ce196c6d826025ead0419c9b0e6434c3","after":"3eb419d980fcbfe7cdec067850b309be6649835a","ref":"refs/heads/main","pushedAt":"2024-09-06T06:54:17.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"},"commit":{"message":"Use errors.Join to simplify codec registration","shortMessageHtmlLink":"Use errors.Join to simplify codec registration"}},{"before":"34b96de57bed8761172d694bd73a16d019d41d93","after":"cc047714ce196c6d826025ead0419c9b0e6434c3","ref":"refs/heads/main","pushedAt":"2024-09-02T21:57:20.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"},"commit":{"message":"Remove accidental duplication of React settings","shortMessageHtmlLink":"Remove accidental duplication of React settings"}},{"before":"673618d3775266aadcde7b03614ee7b76d0daf4e","after":"34b96de57bed8761172d694bd73a16d019d41d93","ref":"refs/heads/main","pushedAt":"2024-09-02T20:59:49.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"},"commit":{"message":"Migrate ESLint recommended rules to native flat config\n\nAgain, I have to assume that not failing means it works perfectly.","shortMessageHtmlLink":"Migrate ESLint recommended rules to native flat config"}},{"before":"e3763000037c58ab4e2072808f1ad9c4d50eab6e","after":"673618d3775266aadcde7b03614ee7b76d0daf4e","ref":"refs/heads/main","pushedAt":"2024-09-02T17:50:56.000Z","pushType":"push","commitsCount":3,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"},"commit":{"message":"Actually guarantee an Error type from the RPC handler\n\nThis shouldn't be an assertion when I can make it more robust with a\nlittle extra logic.","shortMessageHtmlLink":"Actually guarantee an Error type from the RPC handler"}},{"before":"dd64597b230f70ec244d9b12ae3c6933bb79886f","after":"e3763000037c58ab4e2072808f1ad9c4d50eab6e","ref":"refs/heads/main","pushedAt":"2024-09-01T23:31:14.000Z","pushType":"push","commitsCount":12,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"},"commit":{"message":"Switch from ESLint 8.x to 9.x\n\nWith ESLint 8.x being deprecated next month, and with the automatic\nmigration tool not having changed its output much in the 3 months it's\nbeen available, I think it's time to finish out this effort that I\nstarted back in June (and rebased onto main with just a few fixups).\n\nI'm still not convinced that I prefer the flat config to the original\nconfig, but I think I've put it into a state I can be happy with.","shortMessageHtmlLink":"Switch from ESLint 8.x to 9.x"}},{"before":"2e8d6807548c6a658898c3daa909ef6af0c2b955","after":"dd64597b230f70ec244d9b12ae3c6933bb79886f","ref":"refs/heads/main","pushedAt":"2024-09-01T19:06:38.000Z","pushType":"push","commitsCount":10,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"},"commit":{"message":"Introduce the formal model for watch.Value\n\nAs promised in the merge commit for the new watch implementation, here's\nthe formal Promela model that represents its behavior, along with a Go\ntest harness that automatically runs Spin to validate the model. I've\ntested the harness on both macOS and Debian systems, and cleaned up the\nmodel a bit from my original version, partly to make it easier to read\nand partly to make it a closer match for the current Go implementation.\n\nFor context: I first learned about Spin and Promela from Paul McKenney's\n\"Is Parallel Programming Hard, And, If So, What Can You Do About It?\",\nand thought it would be an interesting thing to try. I was also coming\nup with all kinds of weird ideas for the new watch implementation at\nfirst, involving things like atomic variables, that I was convinced were\nwrong even if I didn't care to find the litmus tests that would *prove*\nthem wrong. Now, I know how to do that automatically.","shortMessageHtmlLink":"Introduce the formal model for watch.Value"}},{"before":"bdc5e142fe1df696091be3a19cd72a2023956adc","after":"2e8d6807548c6a658898c3daa909ef6af0c2b955","ref":"refs/heads/main","pushedAt":"2024-08-31T07:07:22.000Z","pushType":"push","commitsCount":10,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"},"commit":{"message":"Reimplement watches without extraneous goroutines\n\nThe original implementation of Hypcast's watch.Value used a long-running\ngoroutine per watch, along with a second goroutine to protect against\nruntime.Goexit breaking the watch invariants. I wanted to challenge\nmyself to reimplement watches with one goroutine active only while\nexecuting a handler, while maintaining correct runtime.Goexit handling.\n\nThe core idea seems simple, at least to me: use a mutex-protected\n\"running\" flag to track whether there's a handler goroutine ready to\ndeal with new values, and simultaneously hand off those values without\ndata races. On runtime.Goexit, start up a new copy of the same goroutine\nto avoid missing any new values.\n\nThe WaitGroup handling might be the trickiest part, since it could be\nmarked done by either Cancel or the goroutine. But the invariant is that\nthe first party to see (w.running == false && w.cancel == true) is the\none responsible for marking it done.\n\nI brought back and cleaned up some old benchmarks to see how this\ncompared with the old implementation under load, and while it does\nbetter in a lot of cases it's not a *complete* win for every combination\nof watcher count and GOMAXPROCS. Or, my data is bad since I ran this on\ntoo noisy of a laptop and don't even have the raw data to tell whether\nthe differences are significant. I have to say that after using a Rust\nport of Haskell's Criterion in another project and seeing the level of\nstatistical analysis it does, I'm not impressed with the capabilities of\nthe Go test framework here. But I can confidently say this is nowhere\nclose to a net negative.\n\nI had to add a few new unit tests to restore 100% mutation testing\ncoverage (via go-mutesting), which was a good opportunity to clean up\nthe existing tests with newer patterns like range over int. One was an\nissue even in the original, where I didn't fully test that Cancel stops\nnew handler executions. Others were related to the new ability to safely\ndouble-Cancel a watch.\n\nFinally, I wrote a Promela model to validate the \"mutual exclusion of\nhandlers\" and \"handler executed for at least one value\" properties of\nthis approach, which I might document and commit here later.","shortMessageHtmlLink":"Reimplement watches without extraneous goroutines"}},{"before":"b17c91ebbfaf5a70fe3dcb4b72a7f7f0a9556c01","after":"bdc5e142fe1df696091be3a19cd72a2023956adc","ref":"refs/heads/main","pushedAt":"2024-08-28T03:05:26.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"},"commit":{"message":"Note caveats about the RPC framework\n\nI don't want to give the impression that this is the best example to\nbuild on. Hypcast has a whole thing in the README about not exposing it\nto the Internet, and how it's a personal project, so it should be well\nunderstood that design decisions here and elsewhere reflect that.","shortMessageHtmlLink":"Note caveats about the RPC framework"}},{"before":"770952314521b2751fb018f66120251b77dd1729","after":"b17c91ebbfaf5a70fe3dcb4b72a7f7f0a9556c01","ref":"refs/heads/main","pushedAt":"2024-08-28T02:35:21.000Z","pushType":"push","commitsCount":3,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"},"commit":{"message":"Resolve new Sass warnings about declaration order\n\nI don't *think* any of my rules would have been affected, but this at\nleast quiets things down.","shortMessageHtmlLink":"Resolve new Sass warnings about declaration order"}},{"before":"fb176b26cf7ba33cb758c11d4f0b3192f7e9ae9c","after":"770952314521b2751fb018f66120251b77dd1729","ref":"refs/heads/main","pushedAt":"2024-08-05T02:28:03.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"},"commit":{"message":"Bump a few select things\n\nGStreamer is always a big one. Also did types for Node.js since that's\nan easy one (still not taking ESLint 9 at this time). Also did Pion,\nhowever the latest github.com/pion/transport/v2 introduces a net new\ndependency that I want to make sure I understand better.","shortMessageHtmlLink":"Bump a few select things"}},{"before":"e81ffc69091936ea6380cbe4527e37eeb983c43b","after":null,"ref":"refs/heads/v1/main","pushedAt":"2024-06-29T01:43:50.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"}},{"before":"deec5da3202043b6bc3892bbdbbb90cbaa2638c3","after":"fb176b26cf7ba33cb758c11d4f0b3192f7e9ae9c","ref":"refs/heads/main","pushedAt":"2024-06-29T01:43:50.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"},"commit":{"message":"Move Hypcast v1 to a separate repo\n\nI'm tired of receiving Dependabot alerts for the v1/main branch of the\nregular Hypcast repo, which I assume gets special treatment due to its\nlack of shared history with the main branch.\n\nThis move also opens up the Hypcast v1 feature branches that I removed\nfrom the regular repo (or maybe never pushed there in the first place).","shortMessageHtmlLink":"Move Hypcast v1 to a separate repo"}},{"before":"274015861eaeb61db93e6ad16fcce8fc1f891a4e","after":"deec5da3202043b6bc3892bbdbbb90cbaa2638c3","ref":"refs/heads/main","pushedAt":"2024-06-22T05:07:21.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"},"commit":{"message":"Bump GStreamer to v1.24.5\n\nI guess there are things like memory leak fixes in here. Nothing too\nobvious in my specific plugins, but whatever.","shortMessageHtmlLink":"Bump GStreamer to v1.24.5"}},{"before":null,"after":"07c8648b1293345947ced91b9686c73f7cbc7fdc","ref":"refs/heads/x/watch-complications","pushedAt":"2024-06-22T03:54:30.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"},"commit":{"message":"Experiment with watches that don't pre-spawn goroutines\n\nWhat does it take to implement watches without long-running goroutines?\nThis is a first pass based on some work I did in another project, which\nitself is based on patterns from Bryan Mills' Gophercon 2018 concurrency\npatterns talk, particularly the idea of a 1-buffered channel acting like\na mutex over some data.\n\nThis pattern has its benefits, but it does feel awkward to be so careful\nabout sending the state back into the channel at the right times. In my\nother project this work had the benefit of eliminating the need for a\nClose()-type method, which was a welcome API simplification, but that\ndoesn't really apply here.\n\nThis might be more interesting if I loosen the requirement around Watch\ncalling the handler \"with the value stored in v upon creation of the\nwatch,\" and make it so the first value can come from a later call to\nSet. The idea, of course, is not to store copies of the value in each\nwatch. I'm still thinking through what this might entail.","shortMessageHtmlLink":"Experiment with watches that don't pre-spawn goroutines"}},{"before":null,"after":"5db852243e008fb7b0babf17874466fb1df85416","ref":"refs/heads/x/rpc-no-buffering","pushedAt":"2024-06-22T03:53:39.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"},"commit":{"message":"Decode RPC bodies without buffering up front\n\nThis has been in my git stash forever. It's an interesting experiment,\nbut not useful in practice with the tight limits on request sizes we\ncurrently implement.","shortMessageHtmlLink":"Decode RPC bodies without buffering up front"}},{"before":null,"after":"9b2e4b6b7b8a3c09da691c36eb817af3636db284","ref":"refs/heads/x/zipserve/v3","pushedAt":"2024-06-22T03:53:12.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"},"commit":{"message":"Return 404 for directories instead of serving them\n\nMight just want to squash this into the last commit.","shortMessageHtmlLink":"Return 404 for directories instead of serving them"}},{"before":null,"after":"cbf30859efa44638e0e8dda2410c9fa31f7132e4","ref":"refs/heads/x/zipserve/v4","pushedAt":"2024-06-22T03:53:12.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"},"commit":{"message":"Initial hacky integration of gzipped.FileServer\n\nWith this, I might have a path to do this weird thing I've wanted to try\nfor a long time: serve the DEFLATE stream *directly* out of the embedded\nclient .zip file.\n\nThis is a very weird idea, and not something I'd particularly recommend\nin production-grade code, but since this is a personal project I figure\nI can have a bit of leeway to try ridiculous things like this.\n\nIn unrelated news, it turns out that http.FileSystem requires all files\nto implement io.Seeker, and that I've been breaking this requirement for\na long time with the .zip embedding approach, since those files\nobviously don't support seeking.","shortMessageHtmlLink":"Initial hacky integration of gzipped.FileServer"}},{"before":"76fb33a8f3e6ed08d6a013ef92cb4871afc1119a","after":null,"ref":"refs/heads/go1.20-socket-cleanup","pushedAt":"2024-06-22T03:47:27.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"ahamlinman","name":"Alex Hamlin","path":"/ahamlinman","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/603974?s=80&v=4"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"startCursor":"Y3Vyc29yOnYyOpK7MjAyNC0wOS0yNVQwMDo1MTowMC4wMDAwMDBazwAAAAS_wFh-","endCursor":"Y3Vyc29yOnYyOpK7MjAyNC0wNi0yMlQwMzo0NzoyNy4wMDAwMDBazwAAAARsHaOG"}},"title":"Activity ยท ahamlinman/hypcast"}