Go engineer building telecom core networks and the cloud-native systems around them. I work primarily on 5G/EPC network functions, then take the production problems I find upstream to the Go and Kubernetes ecosystem.
- 5G Core, EPC interworking, Diameter, SBI, HTTP/2, and NETCONF
- Go services on Kubernetes, with Helm-based delivery and end-to-end testing
- Storage, observability, and performance work that makes production systems safer under load
A Go monorepo for a combined 5GC + EPC stack: UDM, AUSF, UDR, HSS, EIR, Diameter and HTTP/2 gateways, provisioning, and the test and profiling tools needed to operate them.
I contribute production-driven fixes to the infrastructure I use: Kubernetes tooling, storage, media, observability, stream processing, and 5G projects.
68 merged pull requests (1 later reverted) across 31 upstream projects totalling 443k stars · 25 in review
Browse every merged and open upstream pull request
| Project | ★ | PR | Contribution |
|---|---|---|---|
| caddyserver/caddy | 78.7k | #8063 | caddyauth: support third-party hash modules |
| rclone/rclone | 60.8k | #9693 | fserrors: make http2 "server sent GOAWAY" a retriable error - fixes #96… |
| rclone/rclone | 60.8k | #9751 | operations: check checksums in rcat with known size - fixes #6305 |
| rclone/rclone | 60.8k | #9868 | dropbox: fix shared folder mount for roots nested more than one level d… |
| rclone/rclone | 60.8k | #9869 | dropbox: match shared-folder and received-file names case-insensitively |
| rclone/rclone | 60.8k | #9870 | serve docker: fix volume path being lost when the plugin restarts |
| rclone/rclone | 60.8k | #9872 | fs/config: only run --password-command once when using --daemon |
| rclone/rclone | 60.8k | #9944 | operations: make --immutable work with copyto, moveto and single file c… |
| rclone/rclone | 60.8k | #9945 | smb: save the user name in the config even if it matches the current us… |
| rclone/rclone | 60.8k | #9947 | local: stop --copy-links following symlink loops - fixes #4402 |
| rclone/rclone | 60.8k | #9949 | vfs: fix AddVirtual ignoring isDir |
| rclone/rclone | 60.8k | #9950 | serve dlna: log unescaped paths - fixes #7370 |
| rclone/rclone | 60.8k | #9977 | docker: add mailcap for /etc/mime.types - fixes #6384 |
| rclone/rclone | 60.8k | #10057 | lib/batcher: log when committing uploads has finished - fixes #5564 |
| go-gitea/gitea | 58.9k | #38693 | fix(lfs): failed upload deletes a concurrent upload's meta object |
| alibaba/open-code-review | 49.4k | #501 | feat(allowlist): add Julia (.jl) support |
| nushell/nushell | 40.8k | #19092 | Clear sqlite history with SQL instead of deleting the file |
| seaweedfs/seaweedfs | 35.9k | #10656 | s3api: fix ListObjectsV2 dropping objects under a partial prefix |
| seaweedfs/seaweedfs | 35.9k | #11393 | fix(volume): return an error instead of panicking on a corrupt needle s… |
| seaweedfs/seaweedfs | 35.9k | #11397 | fix(volume): return an error instead of 201 when a write lands on no vo… |
| seaweedfs/seaweedfs | 35.9k | #11398 | fix(volume): stop ScanVolumeFileFrom at a header it cannot advance past |
| seaweedfs/seaweedfs | 35.9k | #11399 | fix(volume): validate sizes in ReadNeedleBlob and WriteNeedleBlob |
| seaweedfs/seaweedfs | 35.9k | #11483 | fix(volume-rust): reserve a disk before replacing a replica in VolumeCo… |
| seaweedfs/seaweedfs | 35.9k | #12269 | fix(volume): reject a negative suffix length in Range headers |
| seaweedfs/seaweedfs | 35.9k | #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… |
| velero-io/velero | 10.4k | #10212 | Fix Zip Slip path check accepting a sibling directory in archive extrac… |
| anchore/syft | 9.8k | #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 |
| 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… |
| vishvananda/netlink | 3.3k | #1225 | filter: use EncDestIPMask when encoding Flower EncDestIP |
| 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 | 648 | #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 |
| kerlenton/mcpsnoop | 366 | #212 | feat(check): emit SARIF 2.1.0 so findings land in the Security tab |
| kerlenton/mcpsnoop | 366 | #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 | #276 | diam: keep only the P flag of the request in Answer |
| pyhss/pyhss | 115 | #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.7k | #8062 | caddyhttp: Add status_code option to http_redirect listener wrapper |
| rclone/rclone | 60.8k | #9946 | serve sftp, serve webdav: fix stale hashes reported while a file is bei… |
| rclone/rclone | 60.8k | #10220 | serve sftp: fix rmdir deleting a file instead of returning an error |
| rclone/rclone | 60.8k | #10221 | serve dlna: fix crash on Browse with a negative StartingIndex or Reques… |
| bluenviron/mediamtx | 20.6k | #6195 | playback: cache segment headers to speed up /list (#5094) |
| 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 |
| 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 |
| redpanda-data/connect | 8.8k | #4656 | slack: only enforce token prefixes on literal values |
| 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 |
| prometheus-community/postgres_exporter | 3.6k | #1443 | stat_wal_receiver: export metrics when replicating without a slot |
| apache/iceberg-rust | 1.4k | #3284 | fix(spec): accept object-form partition-spec in manifest metadata |
| bluenviron/gortsplib | 944 | #1178 | format: support mismatched fmtp payload type |
| bluenviron/gortsplib | 944 | #1181 | client: support SETUP responses without Transport header |
| pion/stun | 864 | #301 | Restrict stun-client to IPv4 |
| 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… |
| pion/rtp | 479 | #372 | Drop H264 FU-A fragments without a start |
| fiorix/go-diameter | 298 | #275 | diam: match the Vendor-Id in FindAVP, FindAVPs and FindAVPsWithPath |
| pion/interceptor | 149 | #470 | Assign RTX sequence numbers at send time |
| pyhss/pyhss | 115 | #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 |
Regenerated nightly from the GitHub API by
scripts/build_stats.py. Own and private repositories
are excluded, so every row is a public upstream contribution.
Go · Kubernetes · Helm · Docker · gRPC / protobuf · Diameter ·
HTTP/2 · SBI · NETCONF · distributed SQL · observability


