This is Part 3 of my 5 part series sharing my 24 hour #StartupThisSunday cross Asia adventure building the human powered website monitoring service wpFlight.

In Part 1 and Part 2 we got off to a great start creating wpFlight with working payment code, a partially working frontend interface and plan for website copy. We rejoin the story at Singapore's Changi Airport on the eastern tip of the small island nation.

June 15, 2015 - 12:20am: Hello Singapore!

We landed in Singapore on time around 12:20pm. I didn’t enable roaming on my phone because it’s expensive and slow with Hong Kong sim cards and Singapore’s Changi Airport has (usually) excellent free wifi. That meant I couldn’t get online for a 10 more minutes after landing.

Singapore doesn’t enjoy Internet freedom like we do in Hong Kong and the USA, so the airport requires you to provide a phone number to register for free wifi or register with your ID at an information desk.

12:30am: Stay in or go out?

Now that I was back online, I had to decide where and how I would spend the next 5.5 hours before my return flight to Hong Kong.

Singapore departures
My return flight to Hong Kong was UA896 and left in 5.5 hours.

I considered going through immigration and finding a place to work near the airport. However, I wasn’t familiar with the area outside the transit area. I didn’t know where or even if wifi was available or what was in or near arrivals or departures. From a previous trip, I recalled difficulty getting online in the arrivals section of the airport. On top of this, the flight connection monitor indicated that the check in desk for my return flight wouldn’t open until 3:30 am — another 3 hours! I checked with a woman at the information desk and she confirmed that I would be unable to re-enter the secure area of the airport until my flight’s checkin desk opened.

This meant if I left the transit area and couldn’t quickly find a suitable place to work, I’d potentially kill a lot of precious time.

Instead, I decided to channel my inner Tom Hanks[1] and spend the night in the international transit terminal. Next up was to find a place to work. I was hungry and had a craving for donuts which aren’t that readily available in Hong Kong, so the sitting area outside Changi Airport’s 24 hour Dunkin Donuts seemed like a good bet!

Singapore Dunkin Donuts
Need your morning donut fix? Changi Airport has got you covered.

12:50am: Craving for a charge

After I picked up a surprising inexpensive donut and some water, I set myself up at the bar-style seating area and plugged in my laptop, phone and headphones for a quick power injection.

The wife of a retired State Department official once offered me the following travel advice: “Never pass up the opportunity to eat, sleep or go to the bathroom, because you’ll never know when you’ll next have the opportunity.” In this day and age, I’d add never passing up the opportunity to charge your gadgets to that list. Electricity is more important than sleep!

Once I finished my donut surrounded by charging cables, I went about connecting my laptop to the airport’s privacy-unfriendly wifi. I expected the process to be as easy as getting my iPhone online, enter my phone number, receive a quick SMS confirmation code and off we’d go. Unfortunately, it was not meant to be.

Singapore wifi problems
Changi Airport's captive wifi fails with cryptic errors if you're not using their DNS servers.

I was seeing a “A problem has occurred” error messages whenever my computer tried to display the Changi Airport wifi sign in page. Well that’s (not) helpful. I tried turning wifi off and on and even restarting my computer to no avail. Then I thought, perhaps there’s something wrong with the wifi access point in this area. I packed up my spider web of equipment and charging cables and moved a few hundred meters down the transit hall and up to the second floor to a Disney-like cafeteria area.

Same problem. Shit. By now I’d already spent 15 minutes just trying to connect my laptop to wifi. Suddenly it occurred to me to check out my network settings. I, like many others, had my DNS server manually set to use Google’s DNS server, likely because I’d used a network recently that had a poorly functioning DNS server. After deleting the setting, I was able to get my laptop hooked up to the Internet.

The irony of being unable to work on my product that let’s people know when their product has a show stopper bug because some combination of Mac OS, the Singapore Airport Wifi and a DNS causes a show stopper bug was not lost on me. This type of frustration is something most people that have used any sort of technology, but happens very often to programmers who end up spending time that should be spent writing their code troubleshooting bugs in their tools.

Singapore Airport food court
I ended up working most of the night in Singapore Food Street.

After wasting almost an hour (not 30 minutes like I tweeted) solving travel and internet problems, I was ready to get back to work.

1:10am: Back to work!

My goal for this short stay in Singapore was to get the API deployed and hooked up to the front end. I started by recording the plans that I had come up on the flight over in a static hash in the api code.

Next, I worked more on coding the frontend code, adding in the parts I wasn’t able to do on the plane because of no internet.
First up was the Stripe Checkout-related code. Getting Stripe Checkout up and running is pretty easy. You need to include some Stripe-hosted Javascript, create a function that is called once the customer has entered her email and payment method and then open Stripe Checkout with your desired settings when it’s time to pay.

When the customer entered her payment information, Stripe Checkout securely processes and stores the info so that we don't ever have to handle sensitive credit card data. In place of the credit card, it gives us a code which we use as a token to respresent the card. This token gets sent to a function or method that we create that makes the request to the api we developed earlier in the Hong Kong Airport. In addition to the payment token, the function also is sent the selected plan, the customer's email and the customer's website.

2:30am: Deploying the API

Once the frontend purchase logic was working in my locally-hosted test environment, it was time to deploy the api code to our production server so that we can test in a live environment. Since I cheated a bit to save time and wrote the code in an existing project that has long had its devops bugs and deployment issues worked out, deployment was simple. It was just a matter of merging the wpFlight api code into the project’s stable git branch and running cap production deploy to deploy with Capistrano. Capistrano would automatically updated the server’s code and restart our unicorn application server.

My first attempt at deployment succeeded, but I immediately found a logical operator problem in the code I wrote to temporarily force the production server to use the Stripe test environment instead so that I could test without making live charges to a real credit card.

As physical fatigue began to set in, I had typed the logical OR operator || that means either this or that must be true instead of the logical AND operator && which means both this and that must be true. A quick fix, git commit, git merge, and cap production deploy and we were good to go.

3:30am: Immigration

I spent the next hour or so improving some of the front end logic and smoothing out the checkout process before I decided to take a break, enter Singapore and find some breakfast before check in for my return flight.

Singapore Immigration
ProTip: Singapore immigration at terminal has free candy.

On approaching the Singapore immigration counters, I found the agent I approached had dozed off. She was quite startled when I said “Hi!” - perhaps worried that I might be one of her supervisors. I handed her my passport and entry card upon which I had entered my address as “Airport” and length of stay 6 hours. She looked confused. “You’re stay is so short?” “Yes! I’m going back to Hong Kong in a couple hours! It’s fun!”, I said not wanting to explain that I was actually on a 24 hour product building journey. She asked to see my return ticket and spent some time filling in the address for the Changi Airport into my entry card and then stamped my passport with a permission to stay for 90 days entry stamp.

Singapore arrival stamp
90 days is a long time to visit a country less than four times the area of Washington, DC.

3:40am: Breakfast?

Next up was to survey the arrival area to see what my breakfast options are. There was a 24 hours McDonalds and a couple other shops open. I ended up picking a local shop that had amazing looking toast where I enjoyed an amazing traditional Singaporian breakfast of kaya butter toast, soft-boiled eggs and washed it down with a glass of cold milk tea. The breakfast amazing and only a few dollars…totally worth checking out next time you’re in Singapore’s Terminal 3 arrival area!

4:30am: Upstairs for check in

After breakfast, I headed upstairs to the departures level. I popped outside for a quick look around - it was past 4am and still dark out. I was halfway into 24 hour product building journey…over the halfway. As I walked around on the sideway, I thought about the progress I’d made over the past 12 hours. It certainly felt like things were going well and that I was more than 50% of the way to being able to launch wpFlight in 12 more hours. However, I’ve been around the block of few times though and know how easy it is for the small details at the end of a development cycles to consume a lot of time. On top of this, we were quickly approaching the 5am mark when I typically start feeling very tired if I’m still awake. I snapped a couple of pictures and headed inside to check in so I could get back inside the airport, back to work and maintain my lead in the race against the clock…no time to be a tourist!

Singapore departures level
Not much to see outside Changi Airport at 4:30am.

4:45am: Picking perfect colors

I flew through check in and departure immigration in about 10 minutes and found a seat in the lounge to continue working on the front end and copy.

I spent about 45 minutes selecting fonts and colors for the website. I tried playing around with my own color schemes but nothing looked good. I’m definitely not a designer and it shows. In the end, I decided to borrow the color scheme our designer selected for Pay4Bugs. I replaced the highlight colors in the theme - mostly blue - with Pay4Bugs orange and changed text font colors to match. In my experience, the best way for someone who doesn’t have a lot of artist talent to make a custom website is to start with something that looks good and make small adjustments to give you a look you desire.

By this time, it was closing in on 5am I had already been awake for almost 20 hours and working in overdrive for 13 of those hours. It was incredibly tempting to shut my eyes for a ten minute cat nap, but resisted knowing it was better to do that on the flight home rather than risk sleeping through boarding. The walk across the terminal to the gate really made my body’s fatigue apparently. My limbs felt weak and fragile while my light backpack started feeling like a rock. I found a small luggage cart, placed my bag into it and pushed it weakly in the direction of gate B2.

I was the last one to board the flight - apparently everyone else arrived early for this 6am flight to continue their interrupted sleep on the plane. I had almost all of the programming already completed for this MVP with 8 hours remaining in our journey. The website copy still needed a lot of work and we also needed a logo. These would be my projects for the flight UA896 back to Singapore.

If you made it this far, thanks so much for joining me on Part 3 of my 5 part series sharing my 24 hour #StartupThisSunday cross Asia adventure building the website monitoring service wpFlight. Something you'd do differently? Let me know in the comments or hit me up on Twitter!

Continue reading Part 4 - Hong Kong-bound

  1. Tom Hanks plays a traveler stranded in JFK's international arrivals terminal in the movie The Terminal ↩︎