LimeWire started at a row of desks right in front of me in the spring of 2000 but at first I didn’t notice. I was busy dealing with the twilight days in the brief life of Lime Objects. My one critical success as the tech lead for Lime Objects was in stocking a pipeline of developer hires. Our intern from ColumbiaU had smartly been spending time helping and being mentored by the very smart MIT grad who was experimenting with the Gnutella protocol at Lime Group. That would prove to be the model for our future.
One day Lime Objects mercifully ended and we merged into this in-house Gnutella project. Our owner, Mark Gorton, had previously told me to look into Freenet so I was already fascinated by the whole p2p space. At that time, the idea was to improve the message routing of the Gnutella network without getting involved directly by building a client. Chris Rohrs had been building a prototype of a Gnutella message router in Java. This router would open multiple connections to Gnutella clients and route incoming pings and queries to outgoing connections. Pong and query reply responses for these incoming messages would be properly routed back.
Over that summer, I built an experimental frontend for a Gnutella client on top of this message router. At first this prototype client wasn’t to see the light of day and was just a prototype. Of course none of this code was ever scrapped. Our expanded plan was then to build a corporate server that would participate in the Gnutella network on behalf of companies that wished to take part. However, we eventually got our wish to build a full Gnutella client based on the fact that we wanted to enrich the network query capabilities with enhanced searches beyond just file names.
We all helped in building correct download and upload code. These Gnutella clients were fascinating in that they were both clients for download and servers for upload. They went beyond straight HTTP with the push message to firewalled hosts and the GIV response via HTTP. If a firewalled host could open a connection to you, you could download a file from it with the GIV response. This was just a taste of the cool things to come but we would have a lot to learn first.
While we had an alpha client ready by September of 2000, we waited much longer for an official public release. We had lots of catching up to do and the hit Gnutella client of the day was ToadNode. Interestingly, they were also a New York based company and we developed a good relationship with their developers. We were always waiting for the next killer ToadNode client but it never came. I found out much later it was due to legal threats.
We didn’t get our LimeWire name until the fall of 2000. We liked LimeNode a lot but that seemed a little too repetitive. Our slick corporate overlords actually split our company in two with the development team working for Lime Peer Technologies which consulted to the Lime Wire entity. But, eventually we rolled everything up into Lime Wire.
During this time, the Gnutella network had become so popular that it was killing itself. Nobody clearly articulated the problem at the time but the network was getting overwhelmed in multiple ways and searches wouldn’t get responses. Our first claim to fame was in somewhat accidentally solving this problem by adding a test of what we called a heartbeat ping and heartbeat pong response occasionally on all connections. If the connection didn’t respond, we dropped it. This simple algorithm allowed the network to reshape itself so that heavy traffic nodes would connect to other heavy traffic nodes and slower connection nodes would hang around on the periphery.
Having tested and improved things for months, we were finally allowed to release a LimeWire beta to the public in November. We had high hopes but we were quickly overshadowed by another new client released at the same time. Chris Rohrs had been receiving phone calls for a while from a colorful developer working in Florida. We thought it was somewhat amusing that this solo developer was building something and calling us. Little did we know he would turn out to be a formidable competitor and eventually an important partner in Gnutella network development with the BearShare client.
To say we had a slow start was an understatement. At the time, we celebrated every 100 downloads and then every thousand but that was just a drop in the bucket. Newer clients like LimeWire were definitely an improvement on the Gnutella network but we were still only a tiny fraction of the network. We soon realized there were many more problems to deal with.
In those early days, if you got to the point of actually downloading a file, 90% of download attempts would fail. This was a classic supply and demand problem. Supply was limited and demand was large. But, supply should increase as new people downloaded a copy of a file, right? That was only true at best if the downloader was using a true Gnutella client.
One interesting feature of Gnutella using HTTP was that a web crawler and a browser could also download files if they could get links to the clients. Web crawling websites proliferated with these links so that download demand was way out of line. LimeWire developed browser detection and redirected these requests to a web page from our client encouraging the download and use of a Gnutella app. We encouraged all other Gnutella developers to do the same but it wasn’t enough.
The original “Gnutella” client from nullsoft was still popular and still allowing downloads. We had to actively encourage people to stop using it and take down links to it. We then crafted marked pings and pongs and connection headers within the protocol advertising that you were a good client. Eventually only good clients were allowed to connect. This improved things a lot.
As always going forward, there was still much to learn and new ideas to try out or invent. If anything, we were too conservative in our early days but it gave us time to better understand the space and our competitors. It would take 4 years at least for this to really pay off. Hopefully, I’ll pick up from here in part two. Till then …