Go engineer working on telecom core networks (5G core and EPC) and the Kubernetes systems around them. I build network functions for a living and send the production bugs I hit upstream.
78 merged pull requests (1 later reverted) across 34 upstream projects totalling 453.1k stars · 49 in review
Browse every merged and open upstream pull request
| Project | ★ | PR | Contribution |
|---|---|---|---|
| caddyserver/caddy | 78.9k | #8063 | caddyauth: support third-party hash modules |
| rclone/rclone | 60.9k | #9693 | fserrors: make http2 "server sent GOAWAY" a retriable error - fixes #96… |
| rclone/rclone | 60.9k | #9751 | operations: check checksums in rcat with known size - fixes #6305 |
| rclone/rclone | 60.9k | #9868 | dropbox: fix shared folder mount for roots nested more than one level d… |
| rclone/rclone | 60.9k | #9869 | dropbox: match shared-folder and received-file names case-insensitively |
| rclone/rclone | 60.9k | #9870 | serve docker: fix volume path being lost when the plugin restarts |
| rclone/rclone | 60.9k | #9872 | fs/config: only run --password-command once when using --daemon |
| rclone/rclone | 60.9k | #9944 | operations: make --immutable work with copyto, moveto and single file c… |
| rclone/rclone | 60.9k | #9945 | smb: save the user name in the config even if it matches the current us… |
| rclone/rclone | 60.9k | #9947 | local: stop --copy-links following symlink loops - fixes #4402 |
| rclone/rclone | 60.9k | #9949 | vfs: fix AddVirtual ignoring isDir |
| rclone/rclone | 60.9k | #9950 | serve dlna: log unescaped paths - fixes #7370 |
| rclone/rclone | 60.9k | #9977 | docker: add mailcap for /etc/mime.types - fixes #6384 |
| rclone/rclone | 60.9k | #10057 | lib/batcher: log when committing uploads has finished - fixes #5564 |
| rclone/rclone | 60.9k | #10220 | serve sftp: fix rmdir deleting a file instead of returning an error |
| rclone/rclone | 60.9k | #10221 | serve dlna: fix crash on Browse with a negative StartingIndex or Reques… |
| go-gitea/gitea | 59k | #38693 | fix(lfs): failed upload deletes a concurrent upload's meta object |
| alibaba/open-code-review | 49.7k | #501 | feat(allowlist): add Julia (.jl) support |
| nushell/nushell | 41.1k | #19092 | Clear sqlite history with SQL instead of deleting the file |
| seaweedfs/seaweedfs | 36k | #10656 | s3api: fix ListObjectsV2 dropping objects under a partial prefix |
| seaweedfs/seaweedfs | 36k | #11393 | fix(volume): return an error instead of panicking on a corrupt needle s… |
| seaweedfs/seaweedfs | 36k | #11397 | fix(volume): return an error instead of 201 when a write lands on no vo… |
| seaweedfs/seaweedfs | 36k | #11398 | fix(volume): stop ScanVolumeFileFrom at a header it cannot advance past |
| seaweedfs/seaweedfs | 36k | #11399 | fix(volume): validate sizes in ReadNeedleBlob and WriteNeedleBlob |
| seaweedfs/seaweedfs | 36k | #11483 | fix(volume-rust): reserve a disk before replacing a replica in VolumeCo… |
| seaweedfs/seaweedfs | 36k | #12269 | fix(volume): reject a negative suffix length in Range headers |
| seaweedfs/seaweedfs | 36k | #12270 | fix(s3): reject non-integer max-parts, part-number-marker and max-uploa… |
| grpc-ecosystem/grpc-gateway | 20k | #7110 | docs: add runnable OpenTelemetry tracing example |
| grpc-ecosystem/grpc-gateway | 20k | #7207 | fix(openapiv2): omit oneof siblings of path parameters from query param… |
| argoproj/argo-workflows | 17.1k | #16602 | perf(executor): read resource once for outputs (fixes #5658) |
| IBM/sarama | 12.5k | #3752 | fix(client): only deregister the broker registered under that ID |
| IBM/sarama | 12.5k | #3852 | fix(protocol): don't send an unclean election as ElectLeaders v0 |
| kubeshark/kubeshark | 12.1k | #1956 | helm: use Recreate strategy for hub Deployment when local snapshots PVC… |
| shirou/gopsutil | 11.9k | #2143 | [docker][linux]: support cgroup v2 in Cgroup* functions |
| shirou/gopsutil | 11.9k | #2163 | [cpu][darwin]: don't crash in getFrequency when pmgr lacks voltage-stat… |
| shirou/gopsutil | 11.9k | #2190 | [disk][linux]: decode only \ooo escapes in mount points |
| shirou/gopsutil | 11.9k | #2191 | [net][linux]: fix IPv6 address decoding on big-endian hosts |
| velero-io/velero | 10.4k | #10212 | Fix Zip Slip path check accepting a sibling directory in archive extrac… |
| anchore/syft | 9.9k | #5121 | fix(binary): match istio snapshot and older pre-release versions |
| woodpecker-ci/woodpecker | 8.1k | #7189 | Release agents waiting on long polls during server shutdown |
| woodpecker-ci/woodpecker | 8.1k | #7192 | Fix race condition on concurrent pipeline config persist |
| woodpecker-ci/woodpecker | 8.1k | #7454 | Fix image tag detection for registries with a port |
| woodpecker-ci/woodpecker | 8.1k | #7501 | Return log store errors to the agent, except for duplicate entries |
| webrtc-rs/webrtc | 5.2k | #954 | fix(ice): use a random transaction ID for STUN Binding requests |
| uptrace/bun | 5k | #1414 | fix(bunotel): honor WithMeterProvider when reporting DB stats metrics |
| uptrace/bun | 5k | #1415 | fix(relation): do not duplicate joined models on a shared base model |
| uptrace/bun | 5k | #1435 | fix: resolve map column types before scanning rows |
| apache/arrow-rs | 3.7k | #11229 | fix(parquet): support non-primitive map keys in record reader |
| apache/arrow-rs | 3.7k | #12006 | fix(arrow-string): saturate the length in Utf8View/BinaryView substring |
| apache/arrow-rs | 3.7k | #12007 | fix(arrow-json): reject out-of-range float timestamps instead of satura… |
| apache/arrow-rs | 3.7k | #12108 | fix(parquet): return error on negative DELTA_BYTE_ARRAY lengths in arro… |
| vishvananda/netlink | 3.3k | #1225 | filter: use EncDestIPMask when encoding Flower EncDestIP |
| xerial/sqlite-jdbc | 3.3k | #1501 | feat: redact encryption key pragmas in trace logs |
| nginx/nginx-gateway-fabric | 1.2k | #5639 | fix: correct validation error diagnostics and add missing CRD schema co… |
| bluenviron/gortsplib | 944 | #1171 | sdp: support oversized numbers in origin (bluenviron/mediamtx#5949) |
| algesten/str0m | 652 | #1058 | Limit pacer burst size at high bitrates |
| ClickHouse/clickhouse-rs | 570 | #478 | fix(types): parse JSON type hints with parenthesized types |
| ClickHouse/clickhouse-rs | 570 | #481 | fix: use a derived query ID for insert schema lookups |
| jonas-grgt/ktea | 444 | #179 | feat: allow configuring the debug log location with --debug=PATH |
| kerlenton/mcpsnoop | 367 | #212 | feat(check): emit SARIF 2.1.0 so findings land in the Security tab |
| kerlenton/mcpsnoop | 367 | #213 | feat(cli): wrap and unwrap the Claude Desktop config for one server |
| gopacket/gopacket | 320 | #172 | Reverted after merge. packet: set zeroCopy in NewZeroCopyPacketSource |
| fiorix/go-diameter | 298 | #262 | diam: key the Unmarshal AVP index by {Code, VendorID} |
| fiorix/go-diameter | 298 | #275 | diam: match the Vendor-Id in FindAVP, FindAVPs and FindAVPsWithPath |
| fiorix/go-diameter | 298 | #276 | diam: keep only the P flag of the request in Answer |
| pyhss/pyhss | 114 | #337 | diameterService: iterate over a snapshot of activePeers |
| bluenviron/mediacommon | 105 | #368 | h265: fix DTS extraction of streams with temporal sub-layers |
| bluenviron/mediacommon | 105 | #373 | pmp4: support stsz with a constant sample size (bluenviron/mediamtx#580… |
| bluenviron/mediacommon | 105 | #375 | pmp4: support tracks without edts |
| bluenviron/mediacommon | 105 | #376 | pmp4: return seek errors from GetPayload |
| bluenviron/mediacommon | 105 | #377 | pmp4: support tracks longer than 2^32 ticks |
| bluenviron/mediacommon | 105 | #398 | h264: fix SPS width when ChromaArrayType is 0 |
| bluenviron/mediacommon | 105 | #399 | av1: support sequence headers with initial display delay |
| free5gc/amf | 23 | #232 | fix: guard non-string DNN type assertions in GMM handler |
| free5gc/udm | 9 | #96 | fix(udm): return ProblemDetails for unmatched resource URIs |
| free5gc/tngf | 5 | #47 | fix: prevent slice-bounds panic on malformed IKE SA proposal |
| free5gc/udr | 4 | #70 | fix: return ProblemDetails for unmatched resource URIs |
| free5gc/ike | 3 | #24 | fix: prevent slice-bounds panics from uint8 SPI offset overflow |
| Project | ★ | PR | Contribution |
|---|---|---|---|
| caddyserver/caddy | 78.9k | #8062 | caddyhttp: Add status_code option to http_redirect listener wrapper |
| rclone/rclone | 60.9k | #9946 | serve sftp, serve webdav: fix stale hashes reported while a file is bei… |
| rclone/rclone | 60.9k | #10271 | fs: add --max-errors flag - fixes #4670 |
| rclone/rclone | 60.9k | #10279 | ls, lsl, lsd, lsf, lsjson: add --output-file flag - fixes #8358 |
| wagoodman/dive | 54.7k | #735 | fix: drop lower dir contents when a layer replaces the dir with a symli… |
| bluenviron/mediamtx | 20.6k | #6447 | playback: limit parallel segment reads in /list (#6446) |
| influxdata/telegraf | 17.9k | #20081 | feat(inputs.statsd): Add unixgram support |
| influxdata/telegraf | 17.9k | #20085 | feat(inputs.jenkins): Add option to add build display name and descript… |
| influxdata/telegraf | 17.9k | #20086 | feat(outputs.postgresql): Allow setting schema from a tag |
| influxdata/telegraf | 17.9k | #20087 | feat(logging): Add syslog as log format |
| influxdata/telegraf | 17.9k | #20088 | fix(common.opcua): Handle LocalizedText node values |
| influxdata/telegraf | 17.9k | #20089 | feat(outputs.mqtt): Add last will and testament support |
| swaggo/swag | 13.1k | #2239 | fix(v3): support title struct tag in OpenAPI 3.1 field parser |
| IBM/sarama | 12.5k | #3753 | fix(offset): avoid deadlock when closing during a blocked commit |
| IBM/sarama | 12.5k | #3851 | fix(protocol): decode compressed batches with more records than bytes |
| redpanda-data/connect | 8.8k | #4656 | slack: only enforce token prefixes on literal values |
| webrtc-rs/webrtc | 5.2k | #955 | fix(ice): dial passive ICE-TCP candidates carried in the remote SDP |
| uptrace/bun | 5k | #1466 | fix: require primary keys for bulk UpdateQuery |
| uptrace/bun | 5k | #1467 | fix(pgdialect): scan int64 and float64 range bounds instead of panicking |
| apache/arrow-rs | 3.7k | #12102 | fix(arrow-cast): write timestamps whose zone offset has seconds in UTC |
| prometheus-community/postgres_exporter | 3.6k | #1443 | stat_wal_receiver: export metrics when replicating without a slot |
| pdeljanov/Symphonia | 3.5k | #608 | isomp4: Fix integer overflow in stts sample lookups. |
| pdeljanov/Symphonia | 3.5k | #609 | isomp4: Return an error instead of underflowing in MoofSegment sample l… |
| pdeljanov/Symphonia | 3.5k | #610 | isomp4: Return an error for a trun data offset outside the stream. |
| pdeljanov/Symphonia | 3.5k | #611 | ogg: Set packet DTS equal to PTS. |
| vishvananda/netlink | 3.3k | #1237 | netkit: add PeerAttrs getter |
| vishvananda/netlink | 3.3k | #1238 | Close subscribe sockets when the receive goroutine exits |
| pjsip/pjproject | 2.7k | #5384 | pjsua: make the maximum number of transports configurable |
| obi1kenobi/cargo-semver-checks | 1.7k | #1797 | Add exported_function_now_variadic and exported_function_no_longer_vari… |
| hyperium/h2 | 1.6k | #1002 | fix: requeue released credit on recv window shrink |
| apache/iceberg-rust | 1.4k | #3645 | fix(transform): avoid overflow in adjust_boundary at type extremes |
| pion/stun | 864 | #301 | Restrict stun-client to IPv4 |
| JFryy/qq | 740 | #108 | feat: add --indent flag to control output indentation |
| algesten/str0m | 652 | #1128 | Allow setting msid via DirectApi |
| algesten/str0m | 652 | #1129 | Remove native OpenSSL DTLS; use dimpl for the openssl backend |
| asticode/go-astits | 617 | #79 | Sync to the first packet when the stream doesn't start with a sync byte |
| ClickHouse/clickhouse-rs | 570 | #507 | feat: add Insert::set_buffer_size() |
| ClickHouse/clickhouse-rs | 570 | #508 | feat: support different column names for serialization and deserializat… |
| ClickHouse/clickhouse-rs | 570 | #511 | feat(serde): add ::vec helpers for temporal types |
| flock-php/flock | 491 | #116 | fix(cli): respect ZDOTDIR when adding Flock to the zsh PATH |
| pion/rtp | 479 | #372 | Drop H264 FU-A fragments without a start |
| gopacket/gopacket | 320 | #177 | packet: copy zero copy data on the Packets channel path |
| webrtc-rs/rtc | 167 | #314 | fix(rtc): count incoming RTCP in get_stats() |
| webrtc-rs/rtc | 167 | #315 | fix(ice): answer USE-CANDIDATE checks without ICE-CONTROLLING on the co… |
| webrtc-rs/rtc | 167 | #316 | fix(turn): track client permissions per peer IP, not per IP and port |
| webrtc-rs/rtc | 167 | #317 | fix(ice): re-check a Failed pair when the remote's Binding request arri… |
| pion/interceptor | 149 | #470 | Assign RTX sequence numbers at send time |
| pyhss/pyhss | 114 | #338 | diameter: answer with an error Result-Code when a handler raises |
| free5gc/smf | 26 | #244 | fix: release SMContext and reject when UDM token fetch fails |
Hand-picked from the list above: fixes that stopped data loss, crashes, or security problems in software a lot of people run.
| Project | Fix |
|---|---|
| gitea #38693 | LFS: a failed upload no longer deletes a concurrent upload's metadata |
| velero #10212 | Zip Slip check accepted a sibling directory during archive extraction |
| rclone #9947 | --copy-links no longer follows symlink loops |
| seaweedfs #11393 | Volume server returns an error instead of panicking on a corrupt needle |
| sarama #3752 | Client only deregisters the broker registered under that ID |
| argo-workflows #16602 | Executor reads the resource once when collecting outputs |
| woodpecker #7192 | Race on concurrent pipeline config persist |
| gopsutil #2143 | cgroup v2 support in the Cgroup* functions |
| webrtc-rs #954 | STUN Binding requests used an all-zero transaction ID |
| Repository | What it is |
|---|---|
| diam-gw | Diameter gateway: client library and code generator, with CI and a performance budget |
| go-eir | Equipment Identity Register (EIR) in Go, hexagonal architecture |
| gohss | HSS with S6a, Cx and Sh interfaces |
| telco | Shared telecom utilities: 3GPP types, encoders, and test helpers |
| go-project-dump | Dump a Go project into a single reviewable document |
| go-auth-middleware | JWT authentication and role-based authorization middleware for Gin |
The combined 5GC + EPC stack I work on day to day (UDM, AUSF, UDR, HSS, EIR, Diameter and HTTP/2 gateways) is private. The free5gc, go-diameter and PyHSS fixes above come out of it.
- 5G core and EPC interworking: SBI over HTTP/2, Diameter, NETCONF
- Go services on Kubernetes, delivered with Helm and end-to-end tests
- Storage, media and observability code paths that have to stay up under load
Go · Rust · Kubernetes · Helm · gRPC · Diameter · HTTP/2 · NETCONF · PostgreSQL · ClickHouse
The contribution block is regenerated nightly by
scripts/build_stats.py; own and private
repositories are excluded, so every row is a public upstream pull request.


