While working past Saturday morning on an idea I had for a long time, I realized that while I wanted it to exist, it would add to my already depressingly long list of projects. Why make it bigger? What I’m trying to achieve? These questions made me step back and write this post listing all my active projects with a few words about each and some backstory. I thought it would give me perspective and help me find the answer, but after finishing the first draft, it confused me even more. Don’t be scared of the length of the post. It consists of two parts, and you can stop reading after the first, much shorter part, where I will ask you a question and will be grateful for your input. I think having fun programming is essential, as we developers often take ourselves too seriously and intentionally or unintentionally kill the joy. After all, starting and abandoning dozens of side projects during the beginning of my career gave me valuable and, most importantly, diverse experience and ultimately made me a better engineer. We have this skill to create and solve our problems, and realizing it feels like a duty. On the other hand, everything great I ever made took years and hundreds of hours to develop. And each hour invested into something new is an hour I didn’t spend improving on what I already have, thinning its chances of becoming great, which, in retrospect, gives me more joy than the process of creation itself. It’s the best feeling to see the result of many years of work and realize it was worth it. It’s even better when it’s valuable to others. Such an impressive list should make me proud, but I feel embarrassed. I feel tired and anxious remembering all those unanswered issues and support emails. Where do this ambition and unwavering conviction that my ideas are worth making come from? Why don’t I learn and keep creating new projects? Most importantly, what do I do? Should I embrace it and find ways to support my ever-growing list of projects with external help? Or maybe I can find another way to justify my numerous projects’ existence beyond being well-maintained, valuable, or even finished. Or should I deprecate, shut down, and leave behind, focusing on a selected few? But how do I choose, and what do I do with the urge to create? Can I find a way to scratch the itch the other way? While I’m the only one who can answer these questions, I will appreciate the external perspective, hence the question: what do you think? I don’t expect you to read further, as the post is way too long. I didn’t want to make it worse by dragging it as a series and publishing it as a single post. Feel free to drop it now. It still’s an interesting read and gives full context to answer my questions, but I’m publishing it primarily for myself so that one day, I can look back and appreciate the progress I made. Now, I said that, so let’s get to the list. Open-sourcedate-fns​date-fns is probably my best creation. At the moment, it has ~20 million npm downloads per week. Under the date-fns umbrella I also have UTCDate that makes it easy to work with UTC dates and has excellent integration with date-fns and a couple of WIP experiments Interim API (a minimal Temporal API classes subset) and timezone utils. It’s also worth mentioning date-fns.org that despite being “just a documentation website,” it requires a lot of ongoing effort to maintain and improve. date-fns has always been a massive source of stress and anxiety for me as I constantly fall behind on incoming issues and pull requests. I still struggle to balance and jump between being absent for months to weekly releases with new features and improvements. I tried many things, including hiring a part-time team, but the truth is that being a manager puts even more pressure on me than being a solo maintainer, so it all crumbled. In an attempt to achieve sustainability, I started JavaScript Jobs tightly integrated with the documentation website, but with everything else on my plate, it became virtually abandoned, and I stopped sending the weekly newsletter as it required manual work from me. I also have an early draft of Public Holidays API, arguably a fantastic idea for becoming a viable business that can make date-fns self-sustainable. Still, alas, I put too little effort into moving the needle. Everything I mentioned would be enough for one person to choke, but sadly, it is just the beginning. TypesaurusI used to use Firebase to power all my projects. I had a fantastic experience with the platform, became a huge fan, and started a few open-source projects, improving the experience. The next big open-source project (in terms of the effort I put into it) is Typesaurus, a type-safe ODM for Firestore, the flagship Firebase database. It took me years, a few iterations, and hundreds of hours to make it happen. I’m very proud of it. It’s a fantastic product, and its users love it. The problem, however, is that there are too few of them. Despite my ongoing efforts, I struggled to find support from Firebase, so I slowly lost motivation. It puzzles me how uninterested they are in Typesaurus. That nearly made me believe that it wasn’t worth the effort I put into it. It is heartbreaking to think how much love I put into it and how little the world seems to care. Along with the ODM, I have Typesaurus React (the React/Preact integration), Typesaurus Recovery (point-in-time recovery adapter), Typesaurus Security (type-safe security rules DSL) which is in prototype state and also there’s also a draft of Typesaurus Vector (Firestore vector search adapter). Smaller projectsThis year, I realized my dream and created a VS Code theme, Sophia. It’s still in progress, but I’m constantly improving it and adding more language support. It’s unique because it focuses on splitting code into distinct layers with their own palette, so you can always distinguish runtime code from types, types from data, and so on. Another project I made this year is Of Coerce!, a minimal type coercion library. Despite being tiny (just 362 B!), it contains an elegant solution never explored. While implementing metered billing on one of my products, I made TinyFloat, another tiny library (0.5 kB). It implements a decimal class using the built-in I challenged myself to write a fully type-safe state-machine API that is small but easy to grasp, resulting in Superstate. It’s feature-complete, but I still consider it an experiment, as I’m failing to find a fitting place to incorporate state machines in my production code. At the end of last year, I shipped Paddle Billing package, a comprehensive and fully type-safe wrapper around the new Paddle Billing API. To my disappointment, Paddle released its wrapper generated from internal source code a few weeks later instead of collaborating. There’s no way I could compete with a native wrapper despite its lower quality and API design. The constant struggles with TypeScript in a monorepo made me build tsrf, a dev tool that automatically maintains TypeScript Project References. It was instrumental in my work, but I struggled to improve it because of a few design mistakes. To manage complexity, I tried to adopt state machines (which made me work on Superstate). However, after building a prototype in Rust, I realized that Rust’s error handling and “fearless concurrency” make it a better tool for the job, so I started working on a new version but as a separate project. About that a bit later. WIP projectsI am getting back to Firebase. I have another project for the platform that I put too many hours into. Firemyna makes it easy to start a new Firebase project and seamlessly share code between the web app and Firebase Functions. It powers a few of my projects, but adopting monorepos and the consequential release of Firebase Next.js integration made me rethink the approach. After failing to get support from Firebase, I’m unsure if I want to continue sinking more hours into the platform. I still have a need, and my projects depend on it, but I think I have a better approach in mind. It leads me to Grazier. This generic monorepo dev tool complements monorepo builders like Turborepo and Nx. It watches the filesystem and maintains package representation in memory, making it possible to build (mentioned before) tsrf or Firemyna on top of it. This project prompted me to write this post, and it’s also my first public Rust open-source. Another open-source Rust project in progress is Genotype, a meta-type language that allows generating types for other languages, like TypeScript, Rust, etc. Right now, I’m in the exploration phase, but I have a YAML-based prototype that powers my main product, so Genotype is in a unique position to get my full attention—one day. Lodash is the dominant force in the JavaScript world, yet it’s bloated and reimplements many built-in functionality. I started js-fns to fix it but stopped after implementing most of the functions I needed for my projects. The project is not dead and, I think, still relevant as ever, but it’s not moving forward either. I have a type-safe React/Preact router Switcher. It powers a few of my projects, but I surrendered after realizing there’s no way to compete with Next.js or Remix. However, I don’t discard it completely, as it implements a unique approach to typing paths that I never saw anywhere else, so maybe one day I will switch the gears (pun intended) and do something with it. I have a few TypeScript generics packages, but they are too raw to be released or even shared. I still dream about turning them into a library or at least a blog post. I also maintain a few open-source projects for my products, but I have nothing to say about or plan to improve them, so I’ll skip them now. Desktop appsI built a tiny brownish noise app for macOS and Windows. It’s the first desktop app I built mainly to learn Swift and C#, and I even sold a few copies. However, I failed to publish it in the Windows Store, so it’s unfinished business. I have a few ideas for improvements, but it’s so far back in my queue that I almost get surprised when I remember it. After realizing that my once favorite TextExpander is now an Electron-based app that requires a subscription, I made TypeBloom, a native Windows alternative. I use it daily but can’t bring myself to release it publicly. A similar story I had with Loom. One day, after yet another it recorded a video without voice, I decided it’s enough, so instead of fixing expired credit card, I made my own shitty (but native) version of it that I call now Flex. I’m still unsure if I can pull it off and if it’s worth it, but I’m having fun, and that’s the most important. With my friend Alex, I started Furrfu, a native macOS/Windows app that uses a custom ML model to monitor user typing. When users use the wrong layout (e.g., Korean instead of English), Furrfu automatically translates what the user has written and switches the layout. We have reached the limits of our ML knowledge and experience and don’t know how or if it’s even possible to overcome the high failure rate. WebsitesAlong with multiple blogs and websites that I run for my open-source projects, I have a couple of content websites. First is Firebeast, an attempt to collect as many valuable tips and tricks about Firebase as possible. At this point, I abandoned it, but I can’t bring myself to shut it down. Another sad and lonely website is How to Open Source. It has a single article Open Source Etiquette. This article, however, was a big hit on Reddit and contains (controversial) wisdom about open-source etiquette. I have much to say as a maintainer, but if you’re so deep into the article, you must realize I have no time to do it. Although I get back to writing, maybe one day the website will see more content, or this poor article will find a new home. I also have a personal website that I plan to rebuild and finally start a blog like most of us. By the way, is this newsletter considered a project? Probably. So, that’s one more. ProductsWe finally got to the main occupation that takes most of my time. At least in this area, I have much better focus and don’t jump between projects back and forth. Still, I also have a long tail of products that I started during the last seven years of my software entrepreneur career, some of which are still bringing me money, and some are on life support, and I have no guts to pull the plug. My main focus right now is Mind Control, which was born from pivoting Daisy Chain into a more narrow-scoped product. I work on these with my partner, Josh, and we hope that while the former is more marketable, the latter will eventually become relevant as AI goes mainstream (yes, I think it’s too early for that, yet). We also have Chirr App, which is still a viable business. However, with all the Twitter shenanigans, its future is unclear. I’m not going to dive deep into details, even though these three are very important to me, as I talked about them in more detail in my previous post, “What you won’t see on GitHub”), so you can check it out if you’re interested. Yet another product that is making me money is Backup Fire, a very niche Firebase product that is slowly losing its relevance. I started it before I went all-in on Chirr App. Eventually, Firebase got a built-in backup feature, but I still think Backup Fire is a better product. The problem, however, is that competing with native solutions is a risky business, and I’m more inclined to keep the product on life support than to add more features and make it more relevant. You can see through my post that I really struggle with platforms. On one hand, it’s really easy to build on top of the existing user base and address needs that the platforms don’t cover. However, it’s tough to compete and survive all the turbulence of building for businesses that have their own agendas, and you will always be a few steps back. My current stance is don’t do it! Don’t build products or open-source around platforms. Especially the latter. If a platform-focused business might sometimes give you something back, open-source will almost always give you only disappointment. It’s a fascinating topic worth a dedicated post. At some point, I was convinced that giving a calm alternative to algorithm-driven Facebook is a good idea, so I built Diary Email, a private email-based service for your thoughts and news sharing with close friends and family. It even got to #1 spot on the Hacker News homepage, but funnily it didn’t convert into any sales. I think the project story is an interesting case study of what people think they want and what they actually want. I also run Birthdays Reminder, a tiny service that emails you about your friends and family’s birthdays. I built it as a side-project marketing project for Diary Email, but it has legs on its own. There’s also an exciting story with Facebook. I launched it on Product Hunt with the tagline “So now you can finally delete your Facebook account,” as its main feature was importing birthdays from Facebook via its then-present calendar feature. Birthdays Reminder is finished as the #2 product of the day, and soon after Facebook removed the feature. I don’t know for sure if it was because of my app, but it’s much of a coincidence. It has a happy user base, and I even raised a few dollars through donations, but it costs me much more every month to send all these emails. These two arguably bring enough value to the internet to justify keeping them alive, and I think about giving them a deserved refresh from time to time. They are also a complication, as they contain very sensitive data and also dare to the users, so I can’t sell them or shut them down. Besides these, I have a simple The Internet’s Textarea that is a place to jot down some text quickly. It’s hard to call it a product, but I still included it as it’s yet another domain to pay for and a thing I have in my mind, even though it’s probably the last thing there. However, when I need to run Grammarly on my long text, I use The Internet’s Textarea, just like now. I also run a small Telegram bot, Frienance, that allows groups of users to track expenses for trips or parties. It has saved me and my friends a lot of time on several occasions, but it uses pretty expensive APIs and is simultaneously very sensitive and niche, so I didn’t want to hurry to make it available to everyone—not until I figured out how to monetize it. Finally, I have Ask User, the first SaaS bet I built in 2017. I built it probably during the last years when widgets were still a thing. I also made a series of architectural mistakes that resulted in service-breaking bugs that I never noticed as I was busy with other projects. Who knows if it had any chance if I focused on it and addressed its problems? The only thing that stops me from shutting it down is the domain that funnily got some authority on search engines, and as with my projects, I still fantasize that one day I’ll invest a week and do something with it that will give it some life. GamedevThe list wouldn’t be complete without my game dev interest. Last year, I planned to participate in at least one game every year so that someday, I would have the experience of making a remarkable game. In January 2023, I participated in Ludum Dare 52 and made a simple platformer called Alien Fruit Harvest. I also made a prototype of Chess Rage, a chess-inspired arcade game. It’s worth mentioning, as game development also occasionally takes my attention. I started my career as a game dev and dream about retiring and making games for fun, but that’s for much later. But even now, I am considering participating in the Pirate Software game jam, which starts tomorrow. Should I do it? So what am I even doing?I’m not sure about you, but after listing all that, I feel tired. How can I ever rest having so much on my plate? However, I would like to end on a positive note. l have to say that I regret nothing. Unless I end my career here and now and start a farm, the experience I got from the projects and the growth I had as a professional will benefit me for years to come. But even if I do quit and start a farm, I know I had a lot of fun, brought a lot of value into this world, and, last but not least, met many interesting people, all thanks to these projects. Either way, it’s only up from here. Thank you for sticking with me. Until the next time! |
đź‘‹ Hey! My name is Sasha. I'm an indie maker. I live in Singapore with my wife and baby daughter.I'm an indie maker, and since 2017, I've been working full-time on open-source while bootstrapping my projects.
Even though I spend a significant chunk of my time working on open-source projects, that’s not everything I do. My work focus often dictates my open-source contributions, so today, I decided to touch on that and talk about what you won’t see on GitHub. In 2017, I left my last full-time employee position and started my journey as a software entrepreneur. It’s been a rocky seven years with many ups and even more downs. I unsuccessfully launched a series of products, failing to market each of...
Hey there! You have to start somewhere, right? And this post is precisely that. I love making stuff. I do it mainly because I want to, but once the thing I'm working on is coming together, it feels almost criminal not to share it with the world. Making brings me joy, but it's nothing compared to seeing others dig what you've built. I'm good at making but not so much at sharing, and I want to change that slowly. Here, I will share my progress on open source projects and bootstrapping a...