5 years ago, I started a small project to host my blogs. Instead of using the available platforms, I decided to build my own, whose sole purpose would be to write blogs. Since the idea was relatively small, I built it within a few days and used it as my primary blog publishing project. After writing quite a few blogs, I decided to add some more features to extend its capability. What I didn't realize back then is that these ideas were just the beginning of something that I would maintain till today.
During that time, I was working full-time at a software company, and I would dedicate a part of my time to this project. It didn't have a name. I not only wanted to build something usable but also wanted to experiment with other technologies that would support what I was doing.
Experimental phase
When I shared this project with another friend of mine, he suggested that GraphQL would be a nice addition. I read about GraphQL and found interest in it. At the time, the question was not about whether GraphQL would be a good fit for this project but rather about trying it and discovering its capabilities. It took me a few weeks to change everything to GraphQL, and it was worth it. Managing the data was quite easy; however, it was a bit challenging to learn and implement initially. But once I got the hang of it, the benefits became apparent. It allowed me to easily fetch specific data without unnecessary overhead, enhancing the overall performance of my blog.
But then I quickly encountered another problem - the editor. I was using Quill editor and was not too happy with it. I wanted an editor that was closer to Medium and also with a few more features. After a few days, I decided to build my own. I used SlateJS as the base and started building plugins for all the features I wanted. During that time, SlateJS didn't have a major version, and they were making quite a lot of breaking changes, which was quite a lot of work for me to update. However, with all the effort I put in, it came to a state where it was not perfect but it would do the job. After a while, I moved this editor into a different repository, and it was also open source. This lasted for a year until SlateJS released another breaking change. I lost all motivation to upgrade it and started looking out for something new.
I found DraftJS. Since this was maintained by Facebook, I had a lot of hope about scalability. So I started developing plugins on top of this. After a few weeks, I was able to get it working with all the features that I had initially built for SlateJS. But then I ran into another problem. DraftJS is not very good with long documents and it would slow down. Even though I would not write super lengthy blogs, knowing the limitation was hard for me to live with.
By this time, I already knew that editors are really tricky to build. All editors are built on top of the browser API content-editable, which itself is problematic.
As my last resort, I chose TinyMCE. I didn't have to build many plugins; it came supercharged with features, and till today I am quite happy with it.
Also, somewhere between all these, it had gotten its name - Letterpad.
Contibutors
After posting in reddit about Letterpad, I created a slack channel, where contributors could join and collaborate. During that time, I had used styled-components but not all components were reusable. Other devs started reworking on them and we built a nice UI library for Letterpad. Testing letterpad was a problem, so few started QA'ing every single PR. And then we received some good designs, so we started working towards that. We wanted to ensure that Letterpad should be able to run smoothly with one click install. We fixed a lot of bugs and made it as smooth as possible. This went quite well for a year and a half until Covid hit. I stopped working and started to focus more on health and my social life.
Idea
After a year and a half...
I was using GCP earlier to host Letterpad and also other projects, but eventually, I moved to Digital Ocean. It was still expensive (around €90/month) as I was hosting 3 instances of Letterpad - my blog, a demo edition, and documentation. This means it was running 6 servers + 3 databases along with my other projects.
I thought, how about using one instance to power all three? That would reduce the hosting cost and also the hassle to update all three when I make a change. So I decided to make it a multi-tenant system and started working on it to solve this cost problem and after a few weeks, I was able to spin one instance to power all three. This brought down my cost to around (around €40/month).
This triggered the idea of making Letterpad a platform.
Growth
I started focusing on the bare minimum features that are needed to make it a platform and yet keep it free.
- User registrations
- Forgot password
- Email Subscriptions
- Domain mapping
- A decent homepage
After making these changes, I posted on Twitter and Reddit and Product Hunt. To my surprise, every day there were 3-4 user registrations. On a good day, this would even reach 7-8. Once it reached 1000 user registrations, I started monitoring user activity and focused more on analytics. There was something off. I could see users logging in but less than 20% would write a blog. I added a feedback feature so that users could find a way to interact with me. And with that, I started receiving a lot of feedback and feature requests.
Current state
Letterpad is a serious passion project for me. I still have my full-time job. Today it has features like Follows and Followers, Post likes, a much better interface, SSO, Generative AI, etc. And I am running it for free on Vercel. Now I am working towards the discoverability of authors and quality posts. It has been an awesome experience and also a good learning curve. Today Letterpad uses these major technologies/libraries:
- NextJS
- Cloudinary for image uploads
- Amazon SES for mails
- Unsplash for free images
- Tailwind
- Turborepo
- Bun (moved from npm and yarn)
- GraphQL & Dataloader
- Urql
- OpenAI
- MySQL and Sqlite3
- TinyMCE
- Typescript
- Prisma
Historical Screenshots
Summary
Letterpad has always been a passion project for me, driven not by expectations of gaining users or generating income, but by a desire to learn, grow, and enjoy the process. Along the journey, I've encountered numerous challenges, each serving as valuable discussion points with friends and fellow enthusiasts across various social platforms.
Today, my focus has shifted towards addressing user requests while continuing to nurture the platform's core principles. Letterpad remains committed to providing a distraction-free experience, free from intrusive ads. It's not about competing with others; rather, it's about cultivating an environment that champions quality and nurtures thought-provoking content.
As I continue to navigate this journey, I am reminded of the community that surrounds Letterpad—a community fueled by passion, creativity, and a shared commitment to promote open source.
If you want to write a blog, try out Letterpad - https://letterpad.app