I’m sitting in a room, holding my pen about to sign the biggest deal in my life. OMG! Just like in a movie.
But let’s start at the beginning and go back 3 months.
I quit my job in March 2018 to make apps. Most of the time I work from a coffee shop with my laptop, and from time to time I’ll go to the toilet. But whenever I go, I worry that someone might steal my laptop.
I tried to find an existing solution to protect my laptop, but nothing satisfied me. The existing apps are either too expensive (monthly subscription), not supported anymore or they don’t work the way that I want. For example, many of them don’t play the alarm sound when the display is closed, making it easy for the thief to run away.
So I decided to make my own perfect macOS security alarm app…
Pre-sales video demo
To make sure that I created something that people would want, I decided to make a funny video that demonstrated the app and tried to pre-sell it to validate the idea- like Dropbox did.
In the same cafe where I worked that day, I shot the video on my phone with my friends and a few random people. Thanks to Hagen von Tronje, Lera Zaitseva and Seno who helped me with the video.
I was so scared to publish this, because if I didn’t get many pre-sales then it would mean the people do not want this- or this is what I learned from Lean Startup methods, at least. I failed with pre-orders before with Push To Deploy so this was twice as scary for me.
But here is the key:
Think about pre-orders as a bonus rather than the main validation people need to purchase your product. Commit to building this product anyway even if it means getting zero pre-orders.
If you are a beginner, finished products are critically important. You will learn a lot each time you build a product from zero to the end. Most people give up. Train your “finishing muscle” and you will never know what could happen after the launch. Never!
Video went viral 10k views in 2 days
I published the video + Gumroad link on Twitter and shared it to my blog subscribers and users of my previous Mac apps.
I got 10k views in just a couple of days and 16 pre-orders. 16 people trusted me and gave me their money just because they believed in me and the idea.
Lean Startup would probably say that I should not continue building this app due to not enough interest.
But for me, 16 people was a huge win. I committed to finishing the app because people already trusted me, so there was no going back. I couldn’t let them down.
The logic was simple: if someone tried to steal my laptop (disconnect from the charger or close the display), the app detects it, sounds an alarm and sends a push notification to a phone so I can capture the bad guy!
I’m a beginner macOS developer with 6 months of experience and 2 simple apps made. I used Swift all the time, so I decided to use what I already know.
Where to send a notification?
I have 4 options:
Build my own iOS app
Telegram was the easiest option because they have great API and documentation. The downside is that not a lot of people are using it, but I decided to start with it and add in other messengers later.
I never built a server for the app before but to be able to send phone notifications I had to learn. Thanks to the help of my friend Max Rovensky, I was able to build a simple server on Node.js + Express hosted on Heroku. It was unexpected but it was easier than PHP which I had previous experience with.
The app is not working as expected
The main problem was that when the display was closed the alarm should continue playing, but the default macOS behavior put the laptop into sleep mode.
This means that a thief could just close a laptop to stop the alarm. This was critically important to fix.
I tried everything: I found a code example in Stack-overflow and Github, terminal command, asked all my friends, forums, and even dev chats but none of it worked.
First, I tried to fix it
I found the NoSleep app that was doing exactly what I needed and tried to run my app with it… It worked!
Obviously, this wasn’t a viable solution. No one wants to install a third-party app after they purchase a product. It should just work seamlessly, so I continued to search for a solution.
Of course, this only made things more complicated
The NoSleep app is fully open sourced. I thought “Oh cool, I will just use its code.” The problem was that this app is not a just simple app. This app is a kernel extension that modifies standard hardware behavior. The app consists of hundreds of code files, command line tools, interfaces written on C and Objective C++ Waaat? by a guy who works at Intel. The code is 100x more complicated than anything I had ever seen.
It took me a solid month just to compile this app on my computer. I even asked my friend Sergey (experienced macOS dev) for help with integrating it inside my app but still, we couldn’t make it work.
I felt that my brain was fried. I had panic attacks and anxiety. I almost gave up.
The mental pain was so high that I drank Cokes and ate Snickers almost every day to stop it.
After such a “healthy diet” skin started to peel on my fingertips. Maybe don’t try this at home :).
I was bitten by a scorpion
While sitting in a cafe drinking a coffee, I felt a pain in my hip like a bee sting. I ran to the toilet and shook this little guy pictured below out of my pants.
He was not poisonous so all was well.
Work Hard Party Hard :)
To take a break from coding and panic attacks, I went to a party in Bali but wasn’t so lucky. Some random guy ended up hitting me in the head with a beer bottle! Welcome to Bali :).
I was lucky and all went well at the hospital. I ended up with five stitches, $200 out of pocket and two weeks of dirty hair as I couldn’t wash my hair :). Maybe parties aren’t the best activity for me :).
Never give up!
I would give up but thanks to my spicy friends who supported me with jokes like you’ve got a nice Halloween costume :).
I took 1 day off to think about everything.
My gut feeling told me that I should try a much more simple solution to prevent MacBooks from sleeping when I close the display.
Maybe guys from Intel like to make things complicated?
In the middle of the night in Dojo Bali (a co-working space), and after countless tries, combinations, and asking so many people like Marc Köhlbrugge from WIP to send me some Stack-overflow links that I could try, still nothing worked. Most of the links sent to me I had already tried, but I decided to try again anyways and it still didn’t work…
I finally gave it another go and made some changes to the code and boom! It worked!!!
It was a hack that combined a couple of terminal commands and some code that executes it. That’s it! The laptop didn’t sleep and continued to play the alarm after it was closed.
I was so happy! The problem that I worked on every day for several months was at last solved with a simple solution! I was dancing in the room! Thanks to my friend Fyodor Ivanischev who test all my 100 versions of the app.
The last thing I needed to do was execute the code that allows users to bypass entering a password each time they activate the app. It wasn’t critical but very annoying. I wanted to make it perfect. Again, I tried to ask friends and a devs forum but everyone told me that this was impossible but I kept trying and told everyone that I knew this was a problem.
I met a guy in another co-working space, Matra, named Joel Dorne. He’s an experienced Linux user and terminal guru. As a last hope, I texted him.
23:01 Andrey: Yo! I’m having a problem with a terminal command. Can you please come to the co-working and take a look? Pizza on me.
23:02 Joel: Sure! I’m coming.
After a couple of hours of work, 2 cokes and 1 pizza we found a solution that worked perfectly!
Don’t listen to people who tell you that it’s impossible
Be prepared for your idea to be more complicated then you think. Be prepared for solutions to take some time. Keep trying. Consult everyone about your problem. Solutions could come from anywhere. Don’t listen to people who tell you that it’s impossible.
Website, icon, name, domain
I usually do all of the fancy stuff at the end when the main product is working.
I’m not the best with design, so I just used the emoji 🚨 for the icon.
I made a simple one-page website with a video and FAQ built with HTML + Bootstrap theme hosted on Netlify + payments via Gumroad.
MacBook Alarm was probably not the best name because in the search results we could see clock alarm instead of a security alarm. But I didn’t want to spend to much time on it so I decided to use MacBook Alarm as the name and bought the domain https://macbookalarm.com
On Sunday, October 28 the app was ready. It’s time!
Live on Twitch
During the entire 14 hours of launch, I was live on Twitch and revealed the finished product.
I launched it on Product Hunt and it became the #1 product of the day!
HN didn’t go well this time, maybe because tech people are not my target audience.
I made posts and crossposts in MacApps, MacBook, Apple, Oakland and it went pretty well. I got around 3k views of all of my posts.
Pro tip: Each subreddit has its own rules like self-promotion only on Saturday. Please read it carefully otherwise your post will be banned.
In the first week after the launch, I got ~5,000 unique visitors, mostly from Product Hunt and Reddit.
After the first week of launch, I gathered feedback from everywhere. I also asked people on Twitter why they didn’t buy MacBook Alarm.
After the prioritization, I had the following list of what users wanted:
To have different options to trigger the alarm because there was only one. If the charger was disconnected, the display was closed or both.
To be able to change the sound of the alarm or even mute it and just receive notifications. They don’t want to bother other people.
To make sure that a thief can’t mute the alarm when it will be played by hitting the mute key.
To not have to install Telegram, and to instead receive notifications through WhatsApp
To be able to prevent a thief from stealing the laptop. How can the app scare the thief away before he decides to take off with the laptop?
I predicted that users would ask for these features, but because I launched as fast as possible with core functionality only, I made sure that I asked users what they wanted so I could make updates.
I liked these signs. This building is under surveillance:
So I decided to make my own as a screensaver:
I recorded a new video to demonstrate exactly how all this worked because the previous video didn’t.
Total sales: 95
16 x $5 (pre-orders)
14 x $4.99
33 x $9.99
24 x 14.99
Gross Total Revenue: $834
Share your products for free to some people that you meet
I’d never sold a business before and I wasn’t planning on it.
When I worked with Pieter Levels in Dojo, I remember that he shared his products for free with some people that he met. He gave out free Nomad List memberships, Make Book copies, and code snippets. This is not common these days when everything is commercial but he did it and was very generous.
I also shared my previous apps for free a lot. People were always very appreciative of these small gifts. A lot of people I’ve met in my travels are using my apps.
All it took was sending out a promo code one night to a guy that I saw last a long time ago in Dojo and the next day I received the following message: “Can we meet? I want to discuss something…”
We met up and I received my first offer to buy the app.
I didn’t know what price I should accept so I took a couple of days to think about it. I sent them a price a bit more than I thought the app was valued at and they ended up coming back with a lower offer. We negotiated a fair price somewhere in the middle.
Always price it a bit more than you’re thinking because it’s easier to decrease the price.
We shook hands and I transferred everything that I had to them and received the biggest amount of money that I have ever received in my life.
I can’t disclose the sale price but it’s about 12–16 months of living expenses here in Bali.
I wish good luck to the new owner of the app and I know that it’s in good hands. The app has a new name, Beepify, and a lot of improvements.
As for me, there are 3 months left of Hardcore Year and I will focus on Sheet2Site, because MRR because that’s my initial goal: