On Naming Startups (with Ruby)

by Danielle Fong

The name problem has been with our band of hackers for a while. At least we were not alone: judging by the perennial popularity of the topic on Hacker News, it would seem to stump many.

On such matters, an appeal to a higher power is appropriate. My friends use a variety of divination techniques, such as flipping a coin, tarot, or peyote. I, however, found myself reading an infrequently referenced blog post by Paul Graham (an orphan of the collapse of infogami).

“…as happened with lofts, the features that initially repelled people, like rough concrete walls, have now become a badge of coolness. Weird names are now cool, if they’re the right kind of weird. Nothing could be less cool, at this point, than calling a startup “cool.com.” A company with a name like that could not have arisen organically. “Cool.com” smells of a media conglomerate trying to create a web spinoff.”

and

“My favorite recent startup name is probably Writely. It looks so natural that even though it isn’t a word, you feel it should be. Anyone thoughtful enough to come up with a name like that is probably going to have good software.”

Even ordinary people have an extraordinary ability to glark meaning for a word newly encountered. A word that feels natural enough to exist in speech (‘I’m feeling ever so writely’) is quite a goal to aim for. People are sure to remember that.

I threw together a ruby script to create domain names from some simple rules and then check whois. I multithreaded it for throughput. (Ruby threads are easily invoked but apparently the threading system is not so powerful.)

My friend Nick pointed out that our startup targets the young, urban, and restless. I tried the suffix ‘libre’, meaning freedom, and slapped letters from A to Z and roots meaning city in front. Didn’t quite work. At some point, I ended up with collibre.com (it’s still available if you want it), though my partner in crime Alex said it was too much like collaboration, or a library. Finally, he said, ‘what about the root -opolis’. We plugged it in.

Hopolis.com wasn’t taken. We liked it. (don’t go there yet. It is only parked.) This name has only grown on us since then.

Anyway, yesterday I overheard some business types arguing over names. Someone mentioned capital. I thought to myself “hot diggity, let’s impress ‘em and get funded.” Alas, they were merely business students plotting a revolution in granola distribution (direct to the customer! Take that middle man!) Still, my script came up with better names than they did. Who’d have known so many things ending in ‘anola’ would be untaken?

So tonight I was hacking on hopolis, and six hours in, I started to shift into filling out the YC application. Now it’s almost done; only the questions I want to mull on and really ace are left. The sun’s rising — what’s there to do? Procrastinate, obviously. What better way to procrastinate but to update my neglected blog and save hackers from naming catastrophe?

I decided to post it here, and below. (the link goes to the Google Code project).

# Scans DNS for cool names, put together with prefixes,
# affixes, and middles.
# Usage: ruby DNSScan.rb
#
# Edit the domain composing code as you will. This is
# perhaps best used to make up words, eg. writely.
# Do not pass untrusted data to this program, whois
# has buffer overflows, so this may be insecure.

pre = ['Fox', 'Web', 'Net', 'Thought', 'Read', 'Work', 'Surf', 'Browse']
mid = ['']
suf = ['Stream','Flow','Link','Line','Focus','Scope','Glide','Fly',
       'Flight','Path','Wing','Eye','First','View', 'Sight','Vision',
       'Hunt','Wind']

# A single whois scan
def scan(x)
  found = system('whois ' + x.to_s + ' 2>1 | grep -E \
          'No match for|connect: no route to host' - \
          1>/dev/null 2>/dev/null')
  puts (found ? 'Free: ' : 'Parked: ') + x
end

# constructs domains (Note: It would be great if ruby had
# an outer join, so I could do (pre*mid*suf).each{...} )

domains = []
pre.map{|i| mid.map{|j| suf.map{|k| domains << i+j+k + '.com' }}}

# Makes threads (avoids blocking)

thrNum = 40
thrArr = (0..thrNum).map{
       Thread.new{ scan(domains.pop) while domains.any?}
}

while (thrArr.any?{|ta| ta.status})
  Thread.pass
end

Note: There are web services like this. They’re great, but they don’t seem to work fast enough, and I personally would rather have the name construction rules in code.