A few years ago I sold all my stuff to explore the world, creating 12 startups in 12 months and building $1M+/y companies as an indie maker such as Nomad List and Remote OK. I'm also a big pusher of remote work and async and analyze the effects it has on society. Follow me on Twitter or see my list of posts. My first book MAKE is out now. Contact me
Subscribing you...
Subscribed! Check your inbox to confirm your email.
levels.io

Building a startup in public: from first line of code to frontpage of Reddit

Entrepreneurship, Stuff I made, Tech, Travel, Tutorials
Jul 26, 2017

I show how I built a mini startup called Hoodmaps in public from the first line of code to a functioning web app that I got to the frontpage of Reddit with over 300,000 people using it. While recording the entire process on Twitch and Twitter.

(This post is gigantic, click through to build, launch, post-launch and conclusion.)

We go from first line code:

…to a working app:

…to the front page of Reddit:

Process

I’ve always wanted to record the entire process from building a small side project that then turned into a successful launch and then potentially into an actual business. When you hear about a successful startup in the news, they’re probably already a few years in and you have no idea how it got started.

You might think “well, I could never do that”, but you forget that Uber, or Airbnb, or Google also started as tiny little apps one day. The first version of anything always sucks. It should. But then with iteration it becomes something. And in case of startups, that tiny little dysfunctional app might become a $120,000/year bootstrapped business. Or get acquired for a few million dollars by a big company. Or grow by itself to become a billion dollar IPO’ing company. Or nothing. You don’t knows what something can be come until you ship!

So let’s backtrack. Because for the first time ever, I have every single moment logged until launch.

Problem

The problem is that every time I travel to a new place it’s hard to figure out which parts of the city to go. I very often end up in the tourist center. I’m originally from Amsterdam and I know 90% of tourists will never get any idea about the “real” Amsterdam because they just stay in the tourist center. It’s a fake area that has nothing to do with Dutch culture.

So what do I want? I want to get a quick overview of what a city is about. What are the cool “hip” areas? Where’s the wealthier areas? What areas are more suburbian (and maybe boring for me?).

Solution

This problem has been going for years. When my friend Amy was visiting Amsterdam in 2015, she asked me where to stay. I drew her this map. This was basic but it gave the idea of at least to avoid the tourist areas:

I made a map for @genericdreams of Amsterdam, just a few parts of Amsterdam that are actually still authentic + fun pic.twitter.com/aZ6Zaw2ZVH

— Pieter Levels @ 🇺🇸 (@levelsio) September 4, 2015

But what if I could build this in a web app where I could draw over a map myself with different colors representing different categories. Every color people draw would represent a different category. I’d have hipster, tourist, wealthy, suburb, business and student area colors. What if I could average everybody’s drawings and show that? Like crowdsourced, would that work? So if 5 people draw over an area that it’s tourist, but 8 draw over it that it’s hipster, it’ll show up as hipster?

Let’s try.

Building

I decided to livestream my build process on Twitch. I was going to code it from the start while streaming.

Day 1 (2017-03-31)

📺 I'm live streaming on @twitch coding a new thing called Hood Maps from zero 👉 https://t.co/VNpJMQTuId pic.twitter.com/UpUKlFor2A

— Pieter Levels @ 🇺🇸 (@levelsio) March 31, 2017

On day 1, I’ll build the first prototype of Hoodmaps. My idea was to make a map anyone can draw on and categorize a city by colors which in turn reference to certain categories like “hipster” or “business”. This way, you can navigate a city better.

I start out with just plain HTML, CSS and JS and we see how far we get. At the end we have a functioning map that you can draw on with colors. We also put the page live in production (on Nomad List’s server but still):

First version of hoodmaps.io built on @twitch live in ⏰ 2 hours and 31 minutes 🌊 https://t.co/6AFA4Q96id

Use it: https://t.co/oblHoQCmgu pic.twitter.com/p8oTT8xt0N

— Pieter Levels @ 🇺🇸 (@levelsio) March 31, 2017

Day 1 music: Rinse FM Podcast – Swamp 81 w/ Loefah – 30th March 2017

Day 2 (2017-04-01)

(if video is blocked, use a VPN to USA, it’s cause of the music)

On day 2, we’re going to improve the colors, and send our drawing data to the server, so it’s saved and can be viewed by other users. On Day 2 and we got our first public drawings in:

✨ Day 2 of Building 🗺Hood Maps 🌊 live streamed
🔥 we have a proof of concept
📝 people drew this 😍

Watch the replay: https://t.co/Q2fmCtGQg3 pic.twitter.com/UHW8YuVyqI

— Pieter Levels @ 🇺🇸 (@levelsio) April 1, 2017

Day 2 music: Rinse FM Podcast – Norwood Soul Patrol – 26th March 2017

Day 3 (2017-04-02)

On day 3, I add normalization of the data. This means that we don’t want to have every specific GPS coordinate drawn, instead we want to have brush strokes referencing a bigger “area” (like 100 by 100 meters), instead of a specific GPS spot (1 by 1 meter). We do this by changing a GPS coordinate like (53.23437348, -4.2338447) to (53.234, -4.233) and (53.23, -4.233) and (53.2, -4.2) etc. Every decimal we removes, we get less specific data. By normalizing the specific data, we summarize the colors in an area, and only show the dominant value. So if most people say this neighborhood is tourist, we’ll show that. More on normalization later.

..and Part 2:

From here it starts getting difficult because we’re dealing with math and brush sizes and pure hell. This is where you regret starting a project. But we fight through!

Also I optimized the mobile version of the site:

Yay! 📲 Mobile version of 🗺Hood Maps works, streaming live still https://t.co/VNpJMQTuId pic.twitter.com/KmaEFp0VBM

— Pieter Levels @ 🇺🇸 (@levelsio) April 2, 2017

Day 3 music pt 1: Rinse FM Podcast – Redlight – 27th March 2017
Day 3 music pt 2: Rinse FM Podcast – Silencer – 1st April 2017

Day 4 (2014-04-04)

On day 4 we added a domain name (http://hoodmaps.io), NGINX configuration for the web server, SSL certificates from LetsEncrypt, we do more data normalization. It’s a slow day with lots of small final details to make the site live for users:

🏞 Live stream on @Twitch now

We're going to
– Add a domain
– Add SSL
to 🗺Hoodmapshttps://t.co/VNpJMQTuId pic.twitter.com/9N800Pr3ru

— Pieter Levels @ 🇺🇸 (@levelsio) April 3, 2017

This was the final video episode because we now had a working app. From here on, I discuss the details and incremental updates in this blog post.

Canvas

As seen in the video, I started with just a basic canvas. Canvas is a cool relatively new HTML tag that lets you make a square white box that you can draw in with JavaScript. You can literally do anything you can think off in Photoshop in HTML now with Canvas tags and some JS code. I never used it before, so I was a bit scared. But I tried:

It’s as basic as figuring out how to track the mouse cursor’s coordinates (x, y) in JavaScript when you press the mouse button. And then every time the mouse moves you draw on it. Canvas has a simple function called “fillRect”:

canvas.filLStyle=’red’;
canvas.fillRect(x,y,width,height);

That simply draws a red square. Why a square? Well you can make a “square” as small as you want. So you can use a square as a brush. Yes you can also go draw a circle, but that didn’t make sense since my data was kinda square (e.g. one latitude by one longitude point) by nature!

Saving drawings to the server

Every drawing is saved to an array:

This array contains ALL coordinates, including the ones already on the page when you loaded it. I slice off the new ones and send them to the server.

I do an AJAX call to a PHP script on the server (which is simply the same script but /index.php?action=draw behind it) with the drawings. I didn’t want to overload the server, so I buffer the drawings and then do a setTimeout() timer to send them to the server every 5 seconds:

The setTimeout() is reset every time you draw, so unless you stop with drawing I won’t send. If you stop drawing, I’ll send it in 5 seconds.

⌗ Database

Skip through if this stuff isn’t interesting but I’ll now talk about how I set up the database structure to save the coordinates from JavaScript sent to the server.

Each drawing on the map is saved to a SQLite database. I use SQLite cause it’s simple and fast, but definitely not optimal if you want to do many writes at the same time (we’ll find that out later during launch, read on).

Each coordinate on the map is read from the database and checked for entries. For example (this is pseudo-code):

[52.37029884,4.8930113243] : [‘hipsters’,’suits’,’normies’,’normies’,’normies’,’hipsters’,’uni’,’hipsters’,’uni’,’hipsters’]

With 4 entries, “hipsters” is the most dominant category on this geocoordinate. So we draw it yellow (the color of the hipster category).

I save the drawing with it’s exact latitude and longitude coordinates (e.g. 52.37029884,4.8930113243). You can see the problem coming up. If I save everyone’s coordinate so precise, it becomes a mess of dots:

It looks kinda cool if you have lots of data, but obviously not useful:

I thought for a while how to fix this. I could cover the earth in my own grid of dots that would specify areas. But all this stuff seemed way too hard and meanwhile there was 100 people watching on the stream waiting for me to fix this ASAP. So I thought of a super trick: I just remove some decimals from the coordinates. So (52.37029884,4.8930113243) became (52.370,4.893), even further (52.37,4.89) and then (52.3,4.8). With every decimal removed you have an area about 10x more that it covers, see:

The problem is you get a grid:

To fix that, I just increase the brush size until it covers the gaps:

The size of the brush is dependent on which zoom level you’re at. With a lot of playing around I came with this formula which generally makes each dot on the map big enough to cover any gaps:

brushSize = Math.pow(2,map.zoom)/125;

Where map.zoom is Google Maps’ zoom level, e.g. 14 is pretty deep, and 3 is seeing the globe.

Another trick I did is at zoom levels above 12, which is near street level, I’ll first draw the rough normalized data (e.g. 53.233,4.138):

…but then after it I’ll draw data that was drawn at zoom levels above 12 in a smaller brush over it:

That means you’ll see an entire area be yellow on zoom out, but when you zoom in, you’ll see it with a backdrop of yellow but specific detailed colors added. For example the area is yellow (hipster) but that one street is blue (business). This gives dynamic detail without messing up the big overview of the city when zoomed out!

If an area block is actually brushed at this zoom level with more people saying it’s blue (business), it WILL change the entire normalized block above it and the whole thing becomes blue.

Layout

I kept the layout pretty basic. The top has the legend, but the legend is also clickable and sticks out if it’s active:

If you click it you’re in brush mode. I added a Photoshop-style brush cursor because browsers don’t have one built in:

removed emoji, just a photoshop style circle now pic.twitter.com/Xvp7kznsaM

— Pieter Levels @ 🇺🇸 (@levelsio) April 6, 2017

The CSS for it was simply a div as a circle (border-radius:100%) with a border (0.5px solid rgb(0,0,0,0.35)) to emulate Photoshop’s brush cursor:

.brush {
display:block;
width:0.8em;
margin-left:-0.5em;
margin-top:-0.5em;
height:1.1em;
box-shadow:0px 0px 2px #fff;
border:0.5px solid rgba(0,0,0,0.35);
border-radius:100%;
}

If you click the drag (hand) button, you go back to drag mode.

There’s also a brush button to directly start brushing. It’s all really just remnants of Photoshop in my memory:

Blur

The pixel stuff looked cool but it didn’t make sense that one area had a sharp edge where it turned from “hipster” into “tourist”.

So a week before launch, I decided to try just adding a big blur to the drawings. To make it more gradual:

This had a big effect. It made it look less clean but it made it a lot more practical and valid in terms of data. Because the data ISN’T precise, so visually blurring is more honest. The drawing also became literally like a Photoshop soft brush. Overall, a better experience. Luckily, it’s just a CSS filter now:

.map-canvas {
-webkit-filter:blur(25px);
-moz-filter:blur(25px);
filter:blur(25px);
}

Pre-launch traction

With the basic app finished, it could now let you color any place in the world, save it and show you the crowdsourced results, I embedded it on my site Nomad List under each city’s page as “neighborhoods”:

This gave it some basic early traction, and more importantly would pre-fill the data over a few months. P.S. whenever you have a previous product WITH traction that you can use to give your new product traction, do it!

Adding tags

The site was now pre-launch but live. It was doing okay:

…but I needed some extra magic to make it get real traction by itself (not just through Nomad List’s embeds).

I accidentally found that magic in tags.

What are tags? Well, to give more information to the maps I wanted to add a tagging functionality. A tag can describe a location or area with someone’s opinion. Like “hipster student area with lots of coffee shops” or “dodgy area better to avoid at night”. I wasn’t sure, so I asked Twitter first:

Should I add text labels to https://t.co/idCjeBF2zG? Here's a mock up. It'd give some extra meta data context? pic.twitter.com/h8SP8qJggU

— Pieter Levels @ 🇺🇸 (@levelsio) July 3, 2017

Technically, it’s simply the same database entry with coordinates but with a text label included:

epoch,user_id,latitude,longitude,label,uid

Epoch is the timestamp of when the tag was made. User_id is a unique fingerprint hash of the user. Latitude, longitude is the location. Label is the text string. UID is a unique key in the db which combines the user_id, latitude, longitude and label.

I also added a tool to add them in the user interface. A simple [T] button and a text box when you click somewhere that opens up. You type in a text label and when you press enter, it sends it to the server and it puts it on the map:

✨ Coded this while drinking 🍺 and it helped cause this was really difficult: add opinionated text labels about areas https://t.co/idCjeBF2zG pic.twitter.com/3ABxYCTGK8

— Pieter Levels @ 🇺🇸 (@levelsio) July 3, 2017

Suddenly it started taking off

Without even doing anything that resembled a launch, Hoodmaps Los Angeles started taking off by itself:

🇺🇸Los Angeles' people have discovered Hoodmaps and started tagging like crazy pic.twitter.com/yfLympAoS5

— Pieter Levels @ 🇺🇸 (@levelsio) July 6, 2017

Someone had submitted it to Reddit apparently:

Spammers

Then I got my first batch of spammers, which would be many more later:

Getting weird automated spam now like "unscalably set", fucking scriptkiddies 🙄. Will see if I can make an auto ban thingy pic.twitter.com/ccBIH3xRzF

— Pieter Levels @ 🇺🇸 (@levelsio) July 6, 2017

all auto generated weird word spam, no idea why pic.twitter.com/uJOUg6Aodq

— Pieter Levels @ 🇺🇸 (@levelsio) July 6, 2017

It turns out they automatically submitted 205,603 tags like “brontometer unretractable Pharisaism”. Complete bullshit.

I tried reCAPTCHA, but it would clog up the interface too much. So I wrote my own cryptography magic in JS. It simply makes sure it’s actually a human who is writing it based on many human cues. It’d be hacked within minutes if I was Facebook, but since I’m just a small site nobody really cares.

I also added upvoting and downvoting of tags, hopefully people would downvote spammy tags:

✨Added @reddit-style upvoting for text labels, that means anyone can now add labels and others can upvote/remove 'm 😱https://t.co/idCjeBWDYg pic.twitter.com/J2LWVobtmc

— Pieter Levels @ 🇺🇸 (@levelsio) July 3, 2017

Spam solved! For now…

Domain name

I now had hoodmaps.io, hoodmaps.org, hoodmaps.net but not hoodmaps.com:

But they were asking $1,795 for it! INSANITY! I emailed them with an anonymous address and bid $1,000:

WHAT? $1,695? That’s only $100 lower. I was like, hell no.

But…AA(#@(#$&#($&($#&#(*$…I NEEDED THIS DOMAIN NAME. It’d immediately increase the reputable aspect of it. And if it would get traction on .net, obviously the .com price would be higher after launch.

When I launched Nomad List as nomadlist.io in 2014, I had to negotiate down nomadlist.com from $8,000 to $2,000! It took ages and was still a lot of money. So, whatever, I’ll pay. But meanwhile the $1,695 offer had expired. So whatever, I’ll pay $1,795. I could use Nomad List’s revenue to pay for it. It burned though, that’s a shitload of money for something merely digital. If Hoodmaps would make just $2,000 back though, I’d already be proftiable. So I did it:

Launch

Now it seemed ready for launch. But where do you start? I wanted to do it properly. The launch is THE most important thing. In some ways, it’s more important than the product. You can have an average product with a great launch and everyone will be talking about it. Most times I see excellent products with mediocre launches that simply die out (which is sad). Obviously, the best is to have a great product coupled with a great launch.

This launch, I’d focus on Product Hunt, Hacker News and Reddit. After showing up there, it’d be hopefully picked up by press (through its viral effect). If not, I’d do my own press outreach.

Very important: EVERY platform has its own type of language and vibe. This means adapting your style of posting to the platform. I’ll discuss each vibe.

Twitter promo

I did one new thing. I went around Los Angeles (where I am now for a month) and tested Hoodmaps in-real-life. I started in Fairfax, went to Hollywood Heights, then Koreatown and then Silver Lake and cross-referenced if the tags and categories were accurate. This was fun to do and gave some proof that it actually worked. And yes some promo:

🔥For the launch I'm live testing https://t.co/sdIVMcMNjE in 🇺🇸LA today, first spot: Fairfax in West Hollywood 1/478 pic.twitter.com/AFKTTM8bn1

— Pietz @ 🇺🇸 (@levelsio) July 9, 2017

Launch to Product Hunt

Product Hunt’s vibe is happy, positive, a bit marketing-y. So let’s adapt to that.

The slogan used emoji’s as they’re cute and increase engagement. There’s strong mental cues for PH’ers here: the process is reading “crowdsourced”, OK, “city maps”, OK how? “you can draw on”, oh cool I wanna try!

I submitted on Sunday at 1 minute past midnight. As that’s the best time to launch. The ranking is then refreshed and you have most odds to reach the top of the charts. Having a good start in the top of Product Hunt’s ranks is half the work, the other half is maintaining it for the next 23 hours. Yes, this means I didn’t sleep for about 36 hours. Sacrifice.

I tweeted it out with a link to Product Hunt (importantly):

💫 My new startup 🗺 Hoodmaps is now LIVE on @producthunt: Crowdsourced 🌇 city maps you can draw on 👉 https://t.co/0sQ2XdvCfN pic.twitter.com/Zt8ZH3jWPA

— Pietz @ 🇺🇸 (@levelsio) July 9, 2017

I quickly jumped into the comments section to introduce the product, tell its story and immediately answer any questions (and fix bugs) that people commented on.

It worked though. It went to #1 and stayed there for 24 hours.

Launch to Hacker News

Hacker News’ vibe is distinctly sceptical, intellectual and highly allergic to marketing and getting sold to. “These 10 Growth Hack Tips Will Change Your Life” will NEVER work on HN.

Instead of posting on the main board, which I could, I tried Show HN: which is like a showcase board for when you made something on Hacker News. Less competition and more odds to get on top. A highly upvoted Show HN: also has the chance to get to the frontpage.

I kept the slogan modest here, again “crowdsourced” but instead of maps I used “visualization” which is more data-oriented which HN engineers love. No emoji’s. No cute stuff. HN hates cutes stuff. HN kills kittens.

It had good traction on HN and stayed on top of Show HN: for about a day. In post-mortem, maybe I would have posted it to the main board for a bit more traction.

Launch to Reddit

Reddit’s vibe is like Hacker News but more mainstream and thus for any topic. Reddit also hates sales tactics and is highly critical of your product. If what you’re posting has ANY bugs or doesn’t work as expected, it will NOT get upvoted but instead get DESTROYED in the comments section. Reddit is a spoiled child, it gets the best content on the web, and it’s all competing for the frontpage.

Launching to Reddit is notoriously hard. It. Has. To. Be. Perfect.

Obviously, the goal was to get to the frontpage. But I never expected that would actually happen. I had it happen ONCE before submitting Nomad List to /r/dataisbeautiful: 2 years ago on /r/dataisbeautiful. The comments were quite critical but it reached the frontpage. With previous success, and Hoodmaps also being a relevant site for the subrreddit /r/dataisbeautiful since it’s also data based (and beautiful), I submitted it. I needed to be SPOT ON with the title here or it’d die.

“I made it” made it personal and “crowdsourced visualizations” worked with the data-oriented subreddit. It was descriptive, humble and simple.

Like with Product Hunt, I jumped straight into the comments and following the guidelines of the /r/dataisbeautiful subreddit, I explained the source of the data, the process and how I built it. This took considerable effort and probably helped a lot. Again, NO SALES-y shit:

It worked, it went straight to #1 and the comments were 90% positive this time:

Server crashed

Where Hacker News is the #3069 most popular website in the world and Product Hunt is #4271, Reddit is the #23 website in the entire world:

This means, if you get traction on Reddit, kiss your server goodbye.

Do you know the secret to getting to Reddit’s frontpage? Keeping your server up. 99% of sites can’t keep their server up when Reddit floods them. Redditors know this because they’ll see a site on top of a subreddit and then nothing happens when they click the link. They’ll just skip it (they’re used to sites crashing cause of the “Reddit effect”), and won’t upvote it. That means if you can’t keep your server up, it will simply stop rising to the top and die out. That’s literally why most sites (even if they’re great) don’t get on the frontpage.

You can see it in Google Analytics during a launch. You’ll see the real-time amount of people on your site get stuck to the number where your site will stop responding. That means unless you fix something that makes your site responsive again, you won’t raise that number.

I now had 500 people drawing on Hoodmaps per second and sending it to the server. PHP couldn’t take it. My inferior code couldn’t take it. The site stopped responding. And upvotes stopped.

I messaged my server guy Daniel Lockyer to stand by and help where he could. It’s always better to have someone else on the server because when Reddit floods your server you need ALL hands on deck and quickly iterate and test quick fixes to keep it up. You only have a short window of literally minutes to fix this stuff. If your site is gone for 15 minutes, it’ll probably have lost its ranking and is gone again.

Switch to static

The quickest, easiest, fastest way to fix scaling issues in launch is making your site static. What that means is simply not loading your server-side (PHP, JS, whatever) app to generate a page every time a user comes in. Instead, you just show them a static not-dynamic HTML file. This is what you do:

php ./app/index.php > ./app/index.html

In our case, we had to do this for EVERY city on Hoodmaps so I wrote a script for it quickly:

We now had 1,000 HTML files and changed the server config (NGINX) to load the HTML instead of the PHP. This has severe limitations because your content can’t be dynamic anymore. In my case, whatever people would draw on the maps now would be saved but not shown up on the city page as the page was static. But who cares. You can temporarily decrease functionality if it means keeping the page up!

Making city pages static wasn’t enough. The bottleneck that was killing the server was now the AJAX requests of drawing and tagging maps of 500 people at the same time. I went into the JS code and simply commented out any AJAX request to offload the server and disabled the PHP server-side code to not accept any requests either anymore.

Went fully static now, AJAX requests disabled, all writes disabled, to keep server up for awhile: https://t.co/DucBk1aERS pic.twitter.com/bfyG5I1D4q

— Pietz @ 🇺🇸 (@levelsio) July 9, 2017

That worked! Site is up again

That worked. We knew it worked because suddenly in Google Analytics we saw the real-time users rise:

We now had almost 795 people on the site. That’s a lot. Now static, the site was highly responsive. We now got closer, from page 3 to the top of page 2:

We were SO close. I was already happy with how far we got. It got silent in the chat between Daniel (my server guy) and me. We were both simply fixated on refreshing Reddit’s frontpage.

FRONTPAGE!!!

And then suddenly…we were on Reddit’s frontpage!

We did it. I was happy. Now I could finally shut my laptop and go to sleep.

Google shuts me down in the middle of launch

But I couldn’t sleep. Because the it just got bad again. Suddenly I got reports the map wasn’t loading anymore:

I ran out of my quota. Google Maps works with API keys and if you pass 100,000 loads (I think in a month), they shut you down. Simple as that. I was forwarded to their contact page:

I’d have to wait 3 to 5 working days to get a response to be able to pay them $10,000 to unlock the quota. That’s a terrible thing to do as a business to a potential customer who is in the middle of launching their product!

I made a new API key with my personal account and it worked again for now. I now really went to sleep.

Switch to Mapbox

Switch to @Mapbox ✌🏻

— Burak Aslan (@deadlocked_d) July 10, 2017

The next day I woke up and again for the last 2 hours, the map was out of quota and people couldn’t use it. Twitter people told me I should use Mapbox. They’d be more flexible with quotas and would let the map up at least. It took 2 hours to change all the JavaScript code. I didn’t want to use frameworks for it. So I just rewrote the code. Annoying stuff like Google using (latitude,longitude) and Mapbox using (longitude,latitude), but in the end it worked!

Even cooler, Mapbox has a 3d function which is literally 1 line to enable.

More importantly than fancy 3d though, this time the map stayed up!

4chan

Of course, any site you make where anyone can post anonymously, 4chan loves:

Luckily, my spam filters worked. But some racist stuff showed up. So I added this word list which instantly banned people who used them:

If you write racist stuff on https://t.co/WFo1SUwkzU, it's replaced by 🐱 Kittens and you're made to watch a video that brings you euphoria pic.twitter.com/ZQa0lGorHy

— Pietz @ 🇺🇸 (@levelsio) July 19, 2017

☺️ Post-launch

It was literally the best product launch day I’ve ever had in terms of success and traffic. It was bigger than Nomad List’s launch in 2014 because this launch was in sync all within 24 hours:

Over 200,000 people used Hoodmaps half a million times.

Of those 200,000 people, about 29,566 (or 7%) actually interacted and drew on the map. These people colored 6,823,865 points or about 230 points per user on the map. More importantly, they tagged 11,922 text labels on the map: from “Koreans that think they’re still in Korea” in Los Angeles to “Drink wine along the Seine” in Paris to “Gordon Gekko wannabes” in Manhattan.

With so much data I could do fun queries. Like where do the diaspora of Chinese, Korean, French and Dutch people live?

Where do 🇨🇳 Chinese, 🇰🇷 Korean, 🇫🇷 French and 🇳🇱 Dutch immigrants (and diaspora) have their own neighborhoods around the world? pic.twitter.com/8G5dgziile

— Pietz @ 🇺🇸 (@levelsio) July 15, 2017

With crowdsourced data, generally the more you have of it, the more accurate your interpretations of it become.

Monetization

A few ideas I have and tried. I wanted to sell posters:

But I didn’t sell a single one. I tried selling local business ads:

✨ Monetization: businesses can claim a city's Hoodmaps and add their text ad. Think car dealerships, restaurants etc. pic.twitter.com/yeSyPVsfku

— Pietz @ 🇺🇸 (@levelsio) July 7, 2017

But I didn’t sell a single ad.

I have one more idea to test. I want to sell laminated cardboard maps of a city that people can draw on after seeing this:

✏️ Found an IRL hoodmap in my Seoul guesthouse. Great possible market 📍https://t.co/ecFwXScPgv @levelsio pic.twitter.com/jb7fMn4jpm

— Shane Reustle (@reustle) July 20, 2017

Think Airbnb’s etc. You hang up a little map, and the host (or guest) can draw on it with a marker about the area:

I’m still not sure if I want to do that though as it’ll be somehwat physical. I’d prefer finding a business model that’s software-based here. Selling the data would be cool, but I have no idea where to even start. Let me know if you have a concrete idea.

Conclusion

Validated

It’s early to make any big conclusions. But I know that the problem is real. People want to know where to go in a city. And I validated that using collective knowledge for that in a visual way is a solution. The challenge now is how do you make this site as mainstream as, e.g. WikiVoyage? I’m not sure yet, but I’ll keep improving the app while monitoring traffic. For now it’s looking good. Generally there’s 25 to 75 people on the site at any moment and it’s been 2 weeks!

Building in public

This was my first time 100% building in public. It was stressful because everyone was watching and I was honestly quite convinced it wouldn’t even turn out to be anything people would use. But it went much better than expected. The fun part of building it in public was that with every point where I was stuck I had 100 people watching with me to help solve a problem. It also made me accountable, I couldn’t slack off, there was people watching me build. Even better, just the fact that I built it in public is unique and is marketing (it worked, because you’re reading until here!).

It hurts

All I’d like to say is, you can do it too. I have some unfair advantages now (like a big Twitter following), but don’t let that stop you. It takes sacrifice though: building in public on a livestream where you can fail in front of hundreds of people, I stayed up for 36 hours to keep the server up and organize the launch. I spent the last 2 weeks every day working to keep the app simply running. This isn’t a day job. It’s highly concentrated effort where every detail needs to be perfect.

After I click publish on this post, I’ll take a few weeks off to recover.

But it’s worth it!

I hope I didn’t bore you too much and inspired you a bit with this way too long blog post. Go ship today!

P.S. I'm on Twitter too if you'd like to follow more of my stories. And I wrote a book called MAKE about building startups without funding. See a list of my stories or contact me. To get an alert when I write a new blog post, you can subscribe below:

Subscribing you...
Subscribed! Check your inbox to confirm your email.

2022
18 Sep
This House Does Not Exist
2022
14 Jul
Sam Parr + Shaan Puri asked me about bootstrapping, open startups and lifestyle inflation (My First Million Podcast)
2022
16 May
Thinking and doing for yourself (Life Done Differently Podcast)
2022
10 May
Relocation of remote workers (Building Remotely Podcast)
2022
26 Jan
Money, happiness and productivity as a solo founder (Indiehackers Podcast)
2022
20 Jan
Bootstrapping, moving to Portugal and setting up Rebase (Wannabe Entrepreneur Podcast)
2021
25 Mar
Why I'm unreachable and maybe you should be too
2021
25 Mar
The next frontier after remote work is async
2021
19 Mar
List of all my projects ever
2021
08 Mar
Why coliving economics still don't make sense
2021
14 Feb
Inflation Chart: the stock market adjusted for the US-dollar money supply
2021
10 Jan
I did a live 4+ hour AMA on Twitch w/ @roxkstar74
2020
20 Dec
No one should ever work
2020
10 Dec
Normalization of non-deviance
2020
05 Dec
Copywriting for entrepreneurs: explain your product how you'd explain it to a friend
2020
30 Nov
Entrepreneurs are the heroes, not the villains
2020
12 Nov
The future of remote work: how the greatest human migration in history will happen in the next ten years
2020
05 Nov
Will millions of remote workers become location independent in 2021?
2020
11 Apr
5 years in startups with Abadesi
2020
11 Jan
Twitter giveaways can be hacked to win every time
2019
16 Oct
Lorn - The Slow Blade ✕ Hong Kong
2019
28 Sep
Most decaf coffee is made from paint stripper
2019
12 Sep
The odds of getting a remote job are less than 1% (because everyone wants one)
2019
08 Sep
In the future writing actual code will be like using a pro DSLR camera, and no code will be like using a smartphone camera
2019
29 Aug
Instead of hiring people, do things yourself to stay relevant
2019
28 Aug
Nobody cares about you after you're dead and the universe destroys itself
2019
28 Aug
The only real validation is people paying for your product
2019
05 Aug
Monitoring Bali's undersea internet cable
2019
29 Jul
Nomad List turns 5
2018
29 Jan
I'm Product Hunt's Maker of the Year again!
2018
28 Jan
Why Korean Jimjilbangs and Japanese Onsens are great
2018
24 Jan
Turning side projects into profitable startups
2018
03 Jan
What I learnt from 100 days of shipping
2017
28 Dec
As decentralized as cryptocurrency is: so will be the people working on it
2017
22 Oct
How to 3d scan any object with just your phone's camera
2017
09 Aug
In a world of outrage, mute words
2017
03 Aug
How to pack for world travel with just a carry-on bag
2017
26 Jul
Building a startup in public: from first line of code to frontpage of Reddit
2017
24 Jul
Facebook and Google are building their own cities: the inevitable future of private tech worker towns
2017
21 Jul
The TL;DR MBA
2017
12 Jul
We did it! Namecheap has introduced 2FA
2017
08 Jun
It's about time for a digital work permit for remote workers
2017
23 May
Using Uptime Robot to build unit tests for the web
2017
08 May
Namecheap still doesn't support 2FA in 2017 (update: they do now!)
2017
03 May
Taipei is boring, and maybe that's not such a bad thing
2017
16 Apr
What we can learn from Stormzy about transparency
2017
17 Feb
The ICANN mafia has taken my site hostage for 2 days now
2017
10 Feb
Most coworking spaces don't make money; here's how they can adapt to survive the future
2017
11 Jan
A society of total automation in which the need to work is replaced with a nomadic life of creative play
2017
07 Jan
Nomad List Founder
2016
12 Dec
Make your own Olark feedback form without Olark
2016
29 Oct
How to fix flying
2016
19 Oct
Robots make mistakes too: How to log your server with push notifications straight to your phone
2016
17 Oct
Hong Kong Express - 上海 (Shanghai)
2016
17 Oct
Choosing entrepreneurship over a corporate career
2016
13 Oct
"I can't buy happiness anymore. I've bought everything that I ever wanted. There's not really anything I want anymore."
2016
11 Oct
From web dev to VR: How to get started with VR development
2016
05 Oct
What I would do if I was 18 now
2016
22 Sep
Bootstrapping Side Projects into Profitable Startups
2016
27 Aug
Kids
2016
13 Aug
How I cured my anxiety (mostly)
2016
26 Jul
We have an epidemic of bad posture
2016
17 Jul
Fixing "Inf and NaN cannot be JSON encoded" in PHP the easy way
2016
26 Jun
My third time in a float tank and practicing visualizing the future
2016
15 Jun
How to add shareable pictures to your website with some PhantomJS magic
2016
29 May
My chatbot gets catcalled
2016
19 May
From web dev to 3d: Learning 3d modeling in a month
2016
09 Mar
My second time in a sensory deprivation chamber
2016
04 Mar
Day 30 of Learning 3d 🎮 Cloning objects 👾👾👾
2016
02 Mar
Day 29 of Learning 3d 🎮 Glass, reflectives, HD, coloring and more details
2016
29 Feb
Day 27 of Learning 3d 🎮 Details, details, DETAILS!
2016
25 Feb
Day 23 of Learning 3d 🎮 Filling up the street and adding shadows
2016
24 Feb
Day 22 of Learning 3d 🎮 Added rain, blinking lights, sound, textured menu sign and a VR web app
2016
23 Feb
Day 21 of Learning 3d 🎮 High res textures, physical rendering and ambient occlusion
2016
22 Feb
Day 20 of Learning 3d 🎮 Objects and camera perspectives 🙆
2016
19 Feb
My first time floating in a sensory deprivation tank ☺️
2016
12 Feb
Day 10 of Learning 3d 🎮 Making complex objects by combining shapes 🙆
2016
06 Feb
Day 4 of Learning 3d: @shoinwolfe visits the actual street I'm modeling 🏮😎🏮
2016
03 Feb
Day 1 of Learning 3d 🎮 I learnt how to make shapes, move, rotate and scale them + how to texturize, and add colored lights 💆
2016
02 Feb
I'm Learning 3d 🎮
2016
27 Jan
The things I have to do to read an email sent to me by my government
2016
12 Jan
How to use your iPhone as a better Apple TV alternative (with VPN)
2015
23 Dec
Here's a crazy idea: automatically pause recurring subscription of users when you detect they aren't actually using your app
2015
17 Dec
Stop calling night owls lazy, we're not
2015
16 Dec
We are the heroes of our own stories
2015
25 Oct
There will be 1 billion digital nomads by 2035
2015
21 Oct
Tobias van Schneider interviewed me about everything
2015
18 Oct
Why doesn't Twitter just asks its users to pay?
2015
17 Oct
Punk died the moment we learnt that the world WAS in fact getting better, not worse
2015
15 Oct
Stop being everyone's friend
2015
14 Oct
Vaporwave is the only music that fits the feeling futuristic Asian mega cities give me
2015
09 Sep
We live in a world built by dead people
2015
01 Sep
Why global roaming data solutions don't make any sense
2015
26 Aug
How to export your Slack's entire archive as HTML message logs
2015
24 Aug
How to play GTA V on your MacBook (and any other PC game)
2015
14 May
I uploaded 4 terabyte over Korea's 4G, and paid $48
2015
08 May
How I sped up Nomad List by 31% with SPDY, CloudFront and PageSpeed
2015
04 May
My weird code commenting style based on HTML tags
2015
01 May
Now is probably the time to make HTTPS the default on all your sites and apps
2015
17 Apr
Do the economics of remote work retreats make any sense?
2015
17 Apr
Don't grow up
2015
06 Apr
Calling people "expat" or "nomad" is just as irrelevant as calling internet users "netizens"
2015
02 Apr
How I built Remote | OK and launched it to #1 on Product Hunt
2015
29 Mar
Our society is not in line with our natural reward systems, and alcohol and drug abuse proves it
2015
28 Mar
Makers have become the invisible hand
2015
07 Mar
How technology is shaping our future: billions of self-employed makers and a few mega corporations
2015
22 Jan
We are the orcas at Sea World
2014
31 Dec
Love, Anxiety and Startups: My Year in 50 Tweets
2014
15 Dec
How to backup your Linode or Digital Ocean VPS to Amazon S3
2014
01 Dec
The total chaos that the dawn of the 21st century has become
2014
23 Nov
How I hacked Slack into a community platform with Typeform
2014
05 Nov
How to successfully build a community around your startup
2014
27 Oct
The ideal place to start a startup is not necessarily in Silicon Valley
2014
23 Oct
"If I had this, I would be happy"
2014
14 Oct
This is what happens when FlightFox copies your entire site without attribution
2014
02 Oct
GIFbook, the first animated GIF flipbook
2014
01 Oct
On Thailand's immigration police targeting digital nomads
2014
13 Sep
Why traveling makes you feel lost
2014
02 Sep
How I build my minimum viable products
2014
31 Aug
How I built Nomad Jobs, a remote job board for 100% distributed startups
2014
27 Aug
Danism & Rae - Sirens
2014
16 Aug
How I got my startup to #1 on both Product Hunt and Hacker News by accident
2014
15 Aug
Why does Generation Y feel so lost? And what's the cure?
2014
23 Jul
Bali is the magical voodoo spirit island of Asia
2014
05 Jul
Ideals, fears and the script of life
2014
22 Jun
How to access anyone's Telegram messages without unlocking their phone
2014
14 Jun
The achiever in crisis
2014
12 Jun
How I did not sell my startup today
2014
07 Jun
The free fall that is coming home after traveling the world
2014
02 Jun
Never dismiss your ideals as post-adolescent fantasy
2014
31 May
My 3rd startup: Tubelytics, the real-time dashboard for YouTube publishers
2014
29 May
How Go Fucking Do It raised $30,000+ in pledges in less than a month
2014
24 May
We have an ideologically broken and personally unfulfilling society
2014
24 May
On self-funding startups
2014
22 May
Run through ideas quickly
2014
11 May
If you can't express yourself by email, you're not worthy of anyone's time
2014
19 Apr
My 2nd startup: Go Fucking Do It, set a goal + deadline and if you fail, you pay
2014
18 Apr
Over 2,000 people played their inbox with Play My Inbox
2014
13 Apr
Celebrating my birthday North Korean style
2014
02 Apr
How Automation Left Us Feeling Empty
2014
09 Mar
Play My Inbox, collect music from your inbox and playlist them
2014
01 Mar
I'm Launching 12 Startups in 12 Months
2014
14 Feb
How to protect your backups from solar flares with a faraday cage
2014
06 Feb
Linkoban - Oh Oh
2014
05 Feb
Nationality is an accident of birth
2014
18 Jan
How I Went From 100 To 0 Things (Or How I Was Robbed of All My Stuff)
2014
04 Jan
All Watched Over by Machines of Living Grace
2013
31 Dec
Celebrating NYE 2014 in Hong Kong
2013
30 Dec
How I ended up in Hong Kong (or my adventures in the New York of the East)
2013
28 Nov
It's practically impossible for regular people to buy Bitcoin
2013
27 Nov
2014 is the year techstep drum and bass makes its comeback
2013
25 Nov
Rinse FM, here's your podcast feed we've always wanted
2013
23 Nov
How I travel the world with just a carry-on bag
2013
23 Nov
How I spent the night with Singapore's migrant workers
2013
22 Nov
Why I want to live in Singapore
2013
21 Nov
How I predict Bitcoin's price by tracking Twitter mentions
2013
04 Nov
James Blake & Chance The Rapper - Life Round Here
2013
03 Nov
Sasha Keable - Careless Over You
2013
30 Oct
My not so great time in Vietnam
2013
27 Oct
Wiley - And Again
2013
27 Oct
The myth of a globalized world
2013
19 Oct
Remote working is the future
2013
19 Oct
What happens when you're #1 on Hacker News for a day
2013
14 Oct
Steve Summers - New Surroundings
2013
12 Oct
What I learnt from bootstrapping my startup from Thailand in six months
2013
11 Oct
Palms Trax - Equation
2013
11 Oct
Cash means controlling your own destiny
2013
24 Sep
You're just a piece of a heartless shitty machine that makes money
2013
16 Sep
Automation Will Free Us From the Endless Consumption/Production Cycle We're In
2013
16 Sep
National Borders Have Become Irrelevant
2013
04 Sep
A Culture of Distraction is Not The Problem
2013
20 Aug
Governments are always ready to grab the greatest degree of power that the people will give them
2013
17 Aug
You constantly need to be painting or it looks like total crap
2013
09 Aug
Oversight: Thank You For Volunteering, Citizen
2013
07 Aug
Stripe launches beta in the Netherlands
2013
22 Jul
Google+ spamming people every 2 weeks to put up a profile photo
2013
20 Jul
The 100 Thing Challenge – From 200 to 20 things in 3 months
2013
17 Jul
Living in a Hotel
2013
16 Jul
The Story of my Visa Run to Tachileik in Myanmar
2013
16 Jul
This is what "acting professionally" results in
2013
08 Jul
Lockah - Sly Winking Usury
2013
30 Jun
Stand-up comedians on creativity
2013
24 Jun
With jobs gone, will robot owners pay people's income?
2013
24 Jun
Money as an enslavement method
2013
19 Jun
Make money where prices are high, spend it where prices are low. Does income arbitrage work?
2013
16 Jun
Finding an apartment in Chiang Mai
2013
13 Jun
Add HTTPS to NGINX for free and help make the world more secure
2013
11 Jun
Co-Working Spaces in Chiang Mai: PunSpace
2013
10 Jun
Moving to Chiang Mai
2013
04 Jun
My Bad Day At The Co-Working Space
2013
03 Jun
If it's in the news, don't worry about it
2013
29 May
The 24-Hour Coffee Place in Bangkok: Too Fast To Sleep
2013
28 May
Nosaj Thing x Chance the Rapper - Paranoia
2013
23 May
"There simply are no other fields in which I can spend $100 tomorrow and set up a new business..."
2013
21 May
"Speaking as a graduate of one, top schools teach you credentialing and ladder climbing..."
2013
17 May
Visiting Koh Samui, the island of paradise
2013
05 May
From dive bar to roof-top bar to roof-top pool in Bangkok
2013
02 May
"To awaken quite alone in a strange town..."
2013
01 May
Co-working spaces in Bangkok: Launchpad
2013
24 Apr
The 100 Thing Challenge
2013
24 Apr
"Do whatever you're drawn to"
2013
23 Apr
Co-working spaces in Bangkok: Hubba
2013
22 Apr
Reset your life
2013
09 Mar
OSX Terminal Tricks
2013
09 Mar
OSX for Windows users
2013
09 Mar
How I switched from PC to Mac in less than 7 days
2013
21 Feb
Black Mirror is the best TV series I have seen in years
2013
20 Feb
Why overnight success is a myth
2013
20 Feb
Constraints make people more creative
2013
13 Feb
Kitty Pryde & Riff Raff - Orion's Belt
2013
13 Feb
Dedicating our lives to what is essentially an organization to make money
2013
11 Feb
Watch The Pirate Bay: Away From the Keyboard
2013
16 Jan
My new music video for rap duo RASA
2013
14 Jan
What if money was no object in your life?
2013
03 Jan
Why attention to detail matters, even if no one notices the details
2013
03 Jan
In the 21st century, Maria Montessori shows to be more relevant than ever
2012
30 Dec
Unless the job itself is your dream, stay the fuck away from salaried jobs
2012
30 Nov
Success is One Big Hoax
2012
18 Oct
The death of the corporate drone
2012
13 Oct
The West's unemployment problem is permanent
2012
04 Oct
New Panda Mix Show branding and website
2012
29 Aug
Headhunterz - Power of Music
2012
21 Aug
Essendle interview on my music and my YouTube show
2012
07 Aug
The XX - Angels
2012
02 Aug
Spenzo - Ova
2012
02 Aug
Anna Lunoe & Diamond Lights - Stronger (Willy Joy Remix)
2012
10 Jul
Herve feat. Ronika - How Can I Live Without You (Make it Right) (Death Rose Cult Remix)
2012
09 Jul
Pheo - Nyquil
2012
05 Jul
I love minimalist living
2012
05 Jul
Why buying YouTube views is bad
2012
05 Jul
Citizen - Deep End
2012
03 Jul
D!RTY AUD!O intro
2012
01 Jul
Anybody can monetize their passion (now)
2012
28 Jun
Diplo - No Problem
2012
27 Jun
Skream - Thoughts of You
2012
21 Jun
TEED - Blood Pressure
2012
19 Jun
Today is the first day of the rest of your life
2012
17 Jun
Happiness maximization vs. profit maximization
2012
16 Jun
Music genres are dead
2012
15 Jun
Make a great product
2012
15 Jan
Rasa - Noem 't Wat Je Wilt
2011
23 Dec
Rasa - Hard & Soul
2011
15 Nov
Earth