Late last year I came across a product called Inkdrop on Hacker News. There was just one person developing it and he developed it for himself.
Takuya Matsuyama and the story of Inkdrop inspired me. It turns out, lots of other people like what he has made, too. People are paying for Inkdrop because it works better than other solutions. I can say happily I’m now one of those subscribers as well.
After some introspection and an unreasonable amount of time spent lurking Indie Hackers, I decided that I wanted to build something that helped myself and others, too.
I thought about what I could do and stumbled upon the idea of an organiser for shell commands. It’s not something I’ve come across before, many developers like myself will use a combination of their memory, Google and generic note taking apps for storing commands.
I thought this is a simple app that I could feasibly build by myself. The core features would be easy to get up and running and there is plenty of potential to expand it into something more.
I was initially going to build the app in Swift as a native Mac App, but reconsidered and chose to build a web client first as it would provide access on multiple platforms. Not only that, but developers could access their Snippets from anywhere without having to install anything – including mobile.
Subscriptions
Since I wanted to be able to access Snippets on multiple machines and on the web there was a need for a server and an API. Because of this, I decided a small yearly subscription would be ideal to cover the costs and help support the development of more features.
To get something up and running as soon as possible I started implementing Paddle to handle subscriptions. Paddle would takes payments and send webhooks to my server to keep subscriptions in sync. With that in mind, I built the product API with Elixir/Phoenix and a frontend with EmberJS.
A few weeks down the line it became clear to me Paddle would not work out the way I wanted. There was no support for Elixir integration, and working around that with their support team was taking longer than I wished.
I decided to fall back to Laravel Spark, which meant hosting the account logic myself. I originally wanted to avoid this at the time for speed, however, I’m actually glad that I switched to Spark. It’s a great product and it meant I could do free trials with no credit card needed (Something Paddle could not do). It also meant I could check user subscription status a lot easier without having to handle Paddle’s webhooks.
I still use Elixir/Phoenix for the app API and I connect to Spark to check subscription status for users.
Frontend
While developing the web app in Ember I stumbled upon Ember Electron. I thought, wow, I can make the web version into a desktop app for the three most popular platforms with almost no extra code. What a happy surprise!
In truth, Ember Electron has been a little adventure of its own. It works very well, but finding configuration documentation often requires looking through documentation and examples for about 5 other projects (I.e. Electron, Electron Forge, Ghost Desktop, etc). Getting code signing working for automatic updates has been the trickiest part. I’m pleased to say MacOS works like a charm now. At the time of writing, I’m still testing Windows - but this is a story for another time!
Backend
Elixir/Phoenix has been great. I love building APIs with this stack, and using Distillery for zero downtime deployments is awesome. I’m really looking forward to seeing how well this scales and adding some real time features with it in the future.
Going forward
Now the core feature set is ready. I’ve been using Snipline daily along with some close friends who seem to like it, too.
I’m planning on adding many more features soon, including tags for filtering, dark mode, if statements, and much more. There’s also command line and mobile apps to look forward to as well.
I’m really excited to introduce this to the world, and I hope that other developers see the benefit of it and give it a try, too.
If you haven’t already – click here to go to the main website and check out Snipline