Success is no accident. It is hard work, perseverance, learning, studying, sacrifice and most of all, love of what you are doing or learning to do. - 🇧🇷 Pele
🎉 https://remoted.io is live. I first wrote the first lines of code during the Christmas of 2018, while visiting friends in the UK. Now, exactly 4 months later, it is live, and I did everything by myself 😌.
Remoted is a remote job aggregator for developers and IT professionals. I basically built a crawling engine on top of Puppeteer and wrote 3 crawlers, for starters: StackOverflow, WeWorkRemotely and AuthenticJobs. I plan to have more sources and expand the jobs to also include Design, Marketing, Product and Project Management, but I needed to release an MVP ASAP. Remoted is cool because it has better 🕵️♂️search options than the competition.
On this post, I will explain my motivation and the reasoning behind my choices on the technology stack.
Let’s start with the motivation. Why did I do it? The simplest answer: To satisfy my creativity, since I naturally feel like creating stuff is the best use of my time, and, at the same time, to buy a lottery ticket by building something that that has at least a tiny chance of ever generating passive income. I say lottery ticket because I’ve read https://indiehackers.com enough to know how hard it is for people to make money from side projects. But I think it’s worth a try.
How do you decide what to create? You need to find a product in the intersection of…
- Something you can complete alone, or with the resources you have, and release an MVP in 6 months.
- Something that you see yourself doing after 5 to 10 years.
- Something that has a proven, existing market, but you know you can make it a bit better than the competition.
- Something with a low risk of having a big company crushing you before you get traction.
🏃🏻♂️ Build something you can complete alone, or with the resources you have, and release an MVP in 6 months.
It is super easy to overestimate your own capacity to deliver, because you cannot anticipate all the tiny things you’ll have to deliver. For example, on Remoted, I was completely unaware Open Graph meta tags, and I completely forgot to set up the newsletter to capture the first wave of visitors from the original campaign. There were a lot of other small stuff I had to refactor based on feedback.
You want to select something that you would think ”😃 Pff, this will be pretty quick” to end up with a ”😅 Ok, that was hard but it’s done”.
On the flip side, sole developers don’t need approval or alignment meetings.
This one is special for me because I am a bit traumatized by the fact that, even though I have a very creative mindset and inspite the fact I have created multiple projects throughout my life, the only ones I have to show Remoted, which I just released, and React-Mde, my React Markdown Editor, which is now top Google result for React Markdown Editor. This may look like something but it is very little considering the fact the I’m 34 years old now and I’ve been creating stuff since I was 22. Where are these 12 years of projects? All dead/abandoned. I don’t want to repeat that. I want to create something that will grow over time and become my legacy. Success take a lot of time and it also took a long time for me to realize that.
My main key was to allow the project to take forever to grow. I said I’d be okay if it took 10 years and worked on it very gradually. I observed what worked and what did not and put myself into it. - Ben Halpern
In my case, it also helped to understand exactly motivation fo starting and stopping projects.
As I mentioned, buying a lottery ticket, that is, having that slight change of success is a big motivator, but this is not all. Honestly, at least for me, money is not the bigger motivator. I really like learning new technologies. The best way to learn is by doing, and side projects are a very good fit for it. While picking a stack, I try to combine things that I know already, that gives me a sense of speed since I know what I’m doing, with things that I want to learn, which gives me a sense of personal development and improvement. Even if the project fails, all the experience I gained throughout the process ended up making me a better professional.
One reason is very personal and it took me a lot of self-knowledge to get to this conclusion: I found I don’t enjoy having co-founders because I already have to report what/why I’m doing stuff on my fulltime job. I don’t want this commitment on my free time. I want to be creative, even if that means I will be wrong from time to time. I can fix stuff afterwards.
The second reason was, I have to admit, that I’m amazingly bad identifying market opportunities. I bet I wouldn’t beat random. Which takes us to:
💰 Build something that has a proven, existing market, but you know you can make it a bit better than the competition.
Based on my own experience and abilities, I decided that I will no longer try to be innovative on the stuff I build on my spare time, for a single reason: Innovation means a lot of risk and I’m no longer going to risk my precious limited time. Don’t get me wrong, I’m all for innovation, the problem is that, in order to successfully innovate, you need a lot of market knowledge, research and room for failure. Stablished companies can and should risk part of their income in R&D for this is what keeps them ahead of the competition. For solo makers, however, the safest strategy is to stick to markets that are proven to be profitable and invest on improvements and refining of existing ideas.
For Remoted, for example, I’m trying to explore what has been proven profitable already by other aggregators, especially https://remoteok.io. The current version of Remoted is heavily inspired by RemoteOK, to be honest. The distinguishing feature of Remoted now is better filters and, IMHO, better information being shown right away (like salary). My plan now is to make the filters even better. As a risk mitigation strategy, I’m building Remoted as a platform to make it easier to release other job boards in case this one fails.
If you need inspiration to identify markets that are known to be profitable, you can check the list of products on IndieHackers, sorted by revenue.
It is also important to have an idea of how to make stuff a bit better, and for this, being your own customer helps a lot. In this case, you would have already an idea of how existing solutions did not meet a particular need that you, personally, already had.
This is no news, but the best piece of advice I can give on this topic is: Go really, really niche. The more specific your product is, the least it makes sense for a big company to decide to target your market. Big companies tend to be broad because there is where the big money is. While working on your own side projects, focus on exploring the big tail of the market.
They say that, for the MVP, it doesn’t really matter what technology you use, just use whatever you are familiar with and adapt after your product gains traction.
In my opinion, yes, this is a sound advice, but technology stacks are not equally productive. I don’t have data to support that, but I believe that one of the reasons small startups sometimes are able to outperform giant market leaders is because they use modern technologies, which, besides the benefit of productivity, makes some developers more prone to invest their time and energy to make a great project. If technologies were equally productive, I don’t think there would be a lot of incentive for these new technologies to be created, in the first place.
One example of technology that makes me super-productive is TypeScript. Not everybody will agree, specially because there is, indeed, a productivity penalty for adding types to stuff and I agree. But it also helps you to catch bugs before running the code, and refactoring your code is times faster and more reliable using TypeScript. I would recommend TypeScript for absolutelly any size of project. Remoted is relatively small and still, I’ve made around 3 to 4 major refactoring throughout the development and it would have been much more painful with TypeScript.
Another example is Next.js. It’s amazing. It has:
- Out of the box Webpack setup. One of the push-backs for React adoption is how complicated it is to even get started. Next.js and Create-react-app solve this problem magnificently.
- Out of the box Hot Module Replacement. You see the result of your work without having to refresh the page.
- Out of the box Server Side Rendering. This is a huge plus for SEO. If you don’t need this, consider using Create-react-app.
- Nice way to handle server specific tags, like meta tags and title.
- Easy to support PWA and AMP. PWA is great for user retention and AMP helps a lot with SEO.
- A great community and ecosystem. For example, I problem I did not anticipate was the need for specific meta tags for handling text and images for different social media like Twitter and Facebook. Fortunately, there’s Next-seo that helps a lot.
- Support for basically any React State library you can imagine. Check out their examples.
I have to admit this stack is much more complex than it would be usually necessary, but please, take two things in to account: 1) I said that, for me, personally, learning new technologies is part of what motivates me work. For you, it might not be the case. 2) These technologies made me productive and it has been a pleasure to work with them all. Yes, it took me a while to learn them, but the effort paid off, both in terms of personal development, and in terms of productivity.
- Hosting: DigitalOcean. This one was hard, because I had zero previous experience with VPS management. I thought about releasing with Heroku, but because I plan to release multiple projects, it would be too expensive to go that way. It took me around 15 hours to learn and to to set up DigitalOcean, including Nginx and TLS. Now, to deploy a new website, it will be super easy.
- Database: Postgres. This one was also not obvious. For the majority of MVP projects, all you need is SqLite. A good reason to go Postgres is when you anticipate the need for full-text or spacial/geolocation search. Also, another question was whether to go managed or unmanaged. Again, because I needed to be able to deploy multiple projects, going managed would be too expensive. The feedback I received from a lot of indie hackers is that managing Postgres yourself is not as hard as it sounds. I’m having a good experience so far.
- App server: Node.js with TypeScript. Node is amazing for the ecosystem alone. You can basically find anything you need on NPM. For example: Sitemap and RSS feeds.
- Process management: PM2. This is only relevant for Node. Node runs only 1 thread per process. This causes the problem that you need a mini-load-balancer if you’re using multiple processes. PM2 does that, PM2 also does a very good job organizing your logs/errors.
- Web server: Nginx. Node developers often don’t understand why you would Need Nginx if you can use Express for everything. Three reasons I use it for: 1) TLS/SSL certificates from LetsEncrypt, including auto-renewing, was a breeze due awesome Certbot integration. 2) Node output cache and static resources cache is much better than anything you can do with Express. 3) Rate limit.
- UI: React with Next.js + Apollo. Next.js is basically a runtime that allows you to use React with SSR out of the box. It’s fantastic. Apollo made it super easy to set up my API.
- API: GraphQL. Not trying to predict anything, but there is a chance GraphQL will become the de facto standard for REST APIs because it is statically typed, self-documented and it enforces consistency.
- CI/CD: Codeship. One question I had in mind when I chose to run a VPS with DigitalOcean is how would I manage CI/CD, that comes out of the box with Heroku. The answer was Codeship. Basically, they will test your code and, if the code passes, they will deploy. They support deploying to all major cloud providers, but for a VPS, you just upload an SSH certificate and let them connect to your VPS, after a push and successful tests, and git pull.
- DNS and CDN: Cloudflare. Everybody uses Cloudflare. Most common use cases, not in a particular order: 1) Redirect www to non-wwww, 2) Basic DDoS protection. 3) Caching 4) TLS. Specifically for Remoted, I have the CloudFlare issued TLS certificate between the edge and my VPS, and a LetsEncrypt TLS on the
It’s been 4 months of a lot of learnings and I’m feeling happy and accomplished for being able to deliver Remoted. One of the things that make me feel good about myself is my ability to stick to the plan and to actually deliver everything I said I would. I’m happy that, this time, it was the case.