[HN Gopher] Show HN: I wrote a BitTorrent Client from scratch
___________________________________________________________________
Show HN: I wrote a BitTorrent Client from scratch
I picked up programming in late 2023 and been enjoying it now.
Wanted to challenge myself and set a stretch goal, so set out to
build a bittorrent client.
Author : piyushgupta53
Score : 182 points
Date : 2025-06-13 05:08 UTC (17 hours ago)
(HTM) web link (github.com)
(TXT) w3m dump (github.com)
| throwaway894345 wrote:
| This is cool! I've been thinking about something like this as
| well. How hard was it, and do you have a sense for how "complete"
| it is? Does it handle DHT and Magnet and all the crazy NAT
| traversal stuff?
|
| I'm guessing the main obstacle for me has always been that I'm
| not sure what the complete list of features is to have a client
| that will just work for the majority of torrents in the wild. It
| seems like there are dozens of protocols associated with
| torrenting and I don't even know what the full list is much less
| what each does.
| piyushgupta53 wrote:
| it was challenging for sure. Took me almost a month to get
| acquainted with the protocol, how bencoding works etc, build a
| mental model and then eventually writing code.
|
| Magnet and DHT are yet to be added.
| Charon77 wrote:
| In my experience, magnet is pretty straightforward. Dht is
| quite the rabbit hole, and it might be difficult finding
| clients that support dht (not everyone does)
| NooneAtAll3 wrote:
| Do you support magnet links?
|
| Edit: ah, planned feature
| piyushgupta53 wrote:
| not yet. I'll be adding soon.
| vkaku wrote:
| Excellent, looks clean and simple.
|
| Suggestion: Add a simple usage one liner in the README on how to
| actually download a .torrent file with it. ./go-
| torrent My-Linux-Distro-Wink-ISO.torrent
|
| Suggestion: Bonus points if you add torrent.ParseFromUrl
|
| Everyone should do this for their own spiritual journey.
| piyushgupta53 wrote:
| thanks for the suggestion, appreciate it.
| OccamsMirror wrote:
| Could this be used as a library?
| jorkingit wrote:
| Great work! Just an FYI, you might want to limit the dynamic
| allocation size in the bencode decoder: since it's untrusted
| input (either from torrent or announce), a malicious input could
| DoS the client by requesting extremely large allocations during
| string parsing. A good upper bound could be the remaining length
| of the input, as a well formed torrent can't contain a string
| longer than the rest of the file.
| piyushgupta53 wrote:
| thanks for pointing this out. I've added this in my to-dos.
| indrora wrote:
| You might look into (if you only care about reading it)
| writing the bencode decoder using Kaitai Struct [0] to avoid
| some of the common pitfalls.
|
| [0]: kaitai.io
| agiron123 wrote:
| Very cool!
|
| This brings me back to college. We did this as our final project
| for our networking class at Georgia Tech.
|
| I've long lost the code for this, but the lessons learned have
| lived on :)
|
| Projects like these are great ways to learn new languages too!
| b0a04gl wrote:
| pretty solid attempt. but no mention of crash recovery, encrypted
| peer handshakes, or even basic uTP support. no idea how it
| behaves with NAT either. no memory guardrails during parsing,
| feels risky in real swarm. not production safe without those.
| would love to see it modular too, like usable as lib not just
| cli. tracking roadmap would've helped too.
| TheEdonian wrote:
| How hard would it be to add a GUI to this? I don't think I've
| seen a lot of GO Gui implementations in the past
| thegeekpirate wrote:
| There's a bunch https://github.com/go-graphics/go-gui-projects
|
| My personal favourite is an ImGui wrapper
| https://github.com/AllenDang/giu
|
| The most featureful is probably unison, although I'm uncertain
| if anyone uses it outside of their own project
| (https://gurpscharactersheet.com), meaning documentation will
| be sparse https://github.com/richardwilkes/unison
|
| Gio uses a different way of thinking about GUIs, used by
| Tailscale and gotraceui https://gioui.org
|
| Wails is great if you're familiar with development on the web
| https://wails.io
|
| The GTK4 bindings also look nice
| https://github.com/diamondburned/gotk4
|
| Cogent Core also looks neat, but I didn't have the time to play
| with it before I switched over to using the Odin programming
| language instead of Go https://www.cogentcore.org/core
|
| I personally had nothing but issues with Fyne (especially in
| regard to performance, across multiple computers and operating
| systems), but it's probably the most popular option
| https://fyne.io
| ashirviskas wrote:
| As a non go developer, may I ask why you're using older go
| version 1.21? Is there a reason to stay with older releases?
|
| EDIT: It seems like it was deprecated 10 months ago
| pidgeon_lover wrote:
| Windows 7 support is one reason to stick to older GoLang
| releases. A project in Go 1.21.4 or earlier will work on every
| Windows release and any computer made since 2009, whereas a
| version bump to v1.21.5 means it will only work on more recent
| computers and Win10 and 11 for no benefit.
|
| https://github.com/golang/go/issues/64622
| wongarsu wrote:
| I think this is a reasonable take. Yes, people shouldn't be
| running Windows 7 as their daily driver. But if you can
| support it at basically no effort and without sacrifices that
| is the right thing to do. Supporting more platforms is a
| _good_ thing, even if that platform is an old Windows version
| instead of an Amiga
| tomhow wrote:
| Stub for offtopicness
| startyz wrote:
| sounds very cool. Good luck!
| blibble wrote:
| [flagged]
| WhyIsItAlwaysHN wrote:
| Or like a go beginner, which is fine
| OtherShrezzing wrote:
| Scanning around their other repositories the persons been
| programming for a few years now. There are '.cursor/rules'
| directories in some recent repos.
|
| I think it's a reasonable hypothesis that "I wrote a
| BitTorrent client from scratch" may be "I produced a
| BitTorrent client from cursor".
| spuz wrote:
| Yes, very strange. There's no problem with using AI to build
| your first app and leaving the generated comments in the code
| is fine. But the number of comments on this thread that begin
| "This is so cool" is very suspicious.
| throwaway894345 wrote:
| It doesn't seem wild to me that people would post "This is
| cool" on a ShowHN post. I did
| [here](https://news.ycombinator.com/item?id=44265915), and
| as far as I'm aware, I'm not an AI.
|
| Would you like more information about how to identify AI
| comments? (kidding)
| diagraphic wrote:
| "convert length string into an integer" is a machine
| generated comment?
|
| I've been writing code for 15+ years, this made me laugh my
| ass off. Comments are great, I don't read comments but I
| write them for others, especially for open source code. Atoi
| may be something you and I and a whole bunch of others know
| but people who don't it's a fine comment. Relax! :)
| rvnx wrote:
| In the tests it more obvious:
|
| You can see here for example:
| https://github.com/piyushgupta53/go-torrent-
| client/commit/61...
|
| and some strings coming from crawled resources like:
| lengthi12345e4 but _slightly_ different tokens (like 25
| instead of 35 etc).
|
| Gemini Pro 2.5 even gave me the prompt:
|
| > If you asked me, "Generate Go unit tests for a Bencode
| decoder function called Decode that takes an io.Reader and
| returns an interface{} and an error. Cover strings,
| integers, lists, and dictionaries, including common error
| cases and nested structures" the output I would strive to
| produce would look very much like the code you've shown.
|
| > It's a good example of well-written Go tests, and that's
| the kind of pattern I've learned to recognize and
| replicate.
|
| and a lot actually matches when you ask from a fresh
| conversation.
|
| So most likely Cursor + Gemini 2.5 Pro, but I cannot blame,
| I spend 100% of my time with Claude, and I take ownership
| of the code.
| alexpadula wrote:
| "TODO: We'll develop the actual functionality as we
| develop each component" lool
|
| It's hard to say honestly. I don't call any project AI as
| it's just too hard to tell. I write lots of comments in
| my code too so it's hard to call anything AI without a
| person stating they used it.
|
| Claude is decent for sure, but I always say with AI,
| learn the math before jumping to a calculator.
| imiric wrote:
| That comment is a strong sign that this was AI-generated.
| LLMs have the tendency to leave superfluous comments even
| when the code is self-explanatory. In this case, strconv is
| a well-known stdlib package, and anyone reading this in
| their IDE would get the documentation for what it does. In
| fact, all of the comments in this function and in most of
| the file are redundant, and I would point this out in a
| code review.
|
| But, of course, this was vibe coded, so it's unlikely a
| human actually reviewed it.
| diagraphic wrote:
| Clean code! Very nice :)
| Moosdijk wrote:
| what's up with the amount of new accounts praising this
| project?
| ivanjermakov wrote:
| Seems like someone (OP or not) is testing how good they can
| use HN for free advertisement.
| diagraphic wrote:
| odd indeed
| throwaway894345 wrote:
| I only see two green usernames. Have others been deleted
| already?
| ivanjermakov wrote:
| No seeding, no DHT, no magnet links, no uTP, no extensions. At
| this stage it is BitTorrent downloader, not a client.
|
| Using P2P networks in download-only mode, so called leeching or
| free-riding, is discouraged.
| __jonas wrote:
| Neat! There is this challenge on codecrafters that guides you
| through the process a little, provides tests and such, I've
| played around with it a bit during a free month they had, was
| fun:
|
| https://app.codecrafters.io/courses/bittorrent/overview
| NoMoreNicksLeft wrote:
| Did you do v2 and mutable torrents? Please, for the love of all
| that is good and wholesome, someone do mutable torrents.
___________________________________________________________________
(page generated 2025-06-13 23:01 UTC)