My Projects
Over the years I've built a lot of projects. Below is a selection. They are all free, and mostly open source. Several are unfinished, but I have ideas on the direction I'd like to go. I don't know if I will ever finish them, though.
Consumer products
- @this_vid. Probably my most widely used consumer tool.
- A Twitter bot that I built for myself, but which ended up exploding beyond my expectations, earning me a TechCrunch feature. It's now dead, but in its heydey, it was ubiquitous on Twitter threads.
- I've written some blog posts about learnings and experiments from this project.
- Stack: JS, AWS Lambda, Redis, Serverless framework
- @RemindMe_OfThis. After @this_vid, I made another Twitter bot to meet another personal use case, which also ended up going viral, being used by many high-profile celebrities.
- I sold it off some years back, so the current @RemindMe_OfThis is not affiliated to me.
- I've also written a bit about it.
- Stack: JS, AWS Lambda, Redis, Serverless framework
- oldtweets.today. This was my attempt to bring Facebook's "On This Day" feature for Twitter.
- Technically it's still "alive" (here), but much more watered down compared to the original version. I've got a few ideas to resurrect it someday, but I'm burnt out on building anything involving Twitter.
- My ideal vision is a feature within the Twitter app, but there's no easy way to achieve that, except perhaps via a browser extension.
- Stack: JS, Google Cloud Functions, Serverless Framework
- Tentacle: I made this because I wanted to subscribe to a lot of blogs, but I hated receiving different newsletters in my email at random times. Additionally, not all the blogs supported RSS. Tentacle solves this by aggregating new posts from all the blogs, RSS or otherwise, into a single weekly newsletter. I know I built it, but I truly love it. And it's got a decent amount of users!
- This is my only non-open source product thus far. I keep thinking of opening it, but I haven't decided yet.
- I've been tempted to rebuild it, but it's a very neat app. It just works, with very little maintenance. No need messing with a winning formula.
- Stack: Laravel, Node.js
- volgnie: I have no desire to have thousands of followers on Twitter; I made this so I (and anyone like-minded) could easily purge a lot of followers.
- The core idea: you specify a criteria (e.g. "people I haven't interacted with in the past 3 months"), and Volgnie fetches your followers in batches, filters by the criteria, then blocks and unblocks them (since Twitter did not provide a "remove follower" API).
- It worked, but I gave up on it because Twitter's rate limits were extremely restrictive, and I even got one account banned.
- Making it work without being excruciatingly slow would be a cool challenge! But I lost interest after a while.
- Stack: Ruby
Personal tools
- Uzo
- I made this so my girlfriend and I could have date night and play two-person quiz games while far apart.
- We had fun with it. I'd like to make it public, but it needs some polishing or perhaps even rebuilding.
- Stack: Laravel, Vue, Sqlite, Filament (admin panel)
- fun.shalvah.me
- Entirely vibe-coded static site (via GitHub Copilot) made for a game night/treasure hunt with our friends.
- I'd like to turn it into something bigger. I'd like to host more game nights, incorporating the physical and digital worlds. With an LLM, there's lots of potential here.
- control-playground
- Entirely vibe-coded static site for my Control Engineering course. AI was a godsend here, because I needed the tool (a simulator), but hadn't yet learnt enough to build one myself.
- play.shalvah.me: Custom playgrounds I made to allow people to interact with examples/experiments from my blog.
- I've used it on a few articles, but not much since then. Hope I get to make more experiments again! I also want to make something more like codapi.
- Osom:
- A personal "departures monitor". Osom shows tram departures from the nearest tram stop to my house, as well as the availability of rental bikes at the nearest rental stops. That way, when I'm leaving for somewhere, I can decide whether to wait for a tram or take a rental bike, without needing to do some complicated cross-referencing and calculations.
- My initial plan was to make this into a hardware device. I still might, but for now, it's a custom widget on my Home Assistant dashboard.
- Stack: Golang, MQTT
- Pepe Silvia
- A personal "food delivery monitor". The goal was to monitor my spending, track delivery times of each restaurant, and record my experience with each. When I launched this on my server, I found out my IP range was banned. I abandoned it, since I have been spending less on food delivery.
- Idea to rebuild this today: use an LLM backend.
- Stack: Ruby
Dev tools
- Scribe [PHP]. My most widely used package. It's become one of the most popular choices for generating API docs for Laravel apps.
- For a while, I made a JavaScript version, but that was painful, and I retired it after about a year.
- My learning: even though the same need might exist for multiple ecosystems, each ecosystem might need a different approach to address it.
- twittersignin [JS]: Library to fix "Sign In With Twitter". I made this while working on my bots because the existing libraries were all a pain to use.
- This is probably obsolete now, due to the changes in Twitter's API Platform, but it was very useful; it picked up a few contributions, garnered a few thousand downloads, and was directly mentioned on the Twitter Developers website.
- twitter-error-handler [JS]: Another Twitter API JavaScript library, specifically to make error handling less of a pain.
- vexor [JS]: Small frontend library for visualizing 2D vectors
- I made this primarily for this blog post, and I'm overall pleased with how it turned out.
- It's gotten over 5k NPM downloads since then, so I think people are finding it useful.
- upgrader [PHP]: A tool to let you easily add auto-upgrade functionality to your PHP libraries.
- I built this primarily for Scribe v3, but my ambitious goal was to make it easily extensible for other libraries. I gave up on achieving that, but it made me proud to see folks run a single command and have their whole config upgraded and ready to go.
- Strive [JS]: A simple package to try different strategies to extract some data from some content.
- I haven't promoted this a lot, but it's a key part of Tentacle, where I need to fetch posts from blogs of many different shapes and sizes; often RSS is not supported.
- faktory-php [PHP]: I was working on this PHP client for the Faktory job server.
- I'm really disappointed to not finish it, but I've got some other priorities now.
- aargh [JS]: Typed catch statements for Javascript
- I no longer use this, but every time I write JavaScript, I miss PHP's catch statements.
- ype [JS]: Runtime type assertions for JavaScript
- I made this because I like strong types, but I dislike extra build tools.
- If I were building this today, I would do it in TypeScript, so it offers runtime and static typing. But I think the library Zod offers something similar today.
- eka: Docker Compose file to run Elasticsearch, Kibana and APM Server. Probably would work today, but needs to be updated for newer versions.
- I made this when I used the Elastic Stack for everything observability. Nowadays I'm trying out more stacks.
- I also made an Elastic Stack Starter Kit, which was eka + some dummy apps. I built this as accompaniment for my observability book.
- Foister: An unfinished spec for a human-friendly file manipulation DSL, so you could write things like
move file 'help.txt' to '/tmp';in your terminal.- This was a speculative project; I knew I might not finish it, but I liked the exercise.
- In these times of LLMs, it might be less relevant or challenging, but I'd still like to build it.
- shalvah
- Yup, this is just an NPM package named after me, from when I turned my website into a CLI. I wrote about it, and it got really good reception.
Hardware
- I made a presence sensor setup to turn on the lights in my room when I walk in.
- Since I wrote that post, I've made a few upgrades, such as adding a manual (software) toggle. I may also refine it into a "production" version sometime, and perhaps make physical light buttons that talk to the software.
- I'm working on other hardware stuff nowadays! Really hoping I can make some cool stuff.
Non-code
- I've written a book on observability, aiming to introduce unfamiliar or junior developers to what it entails. I've heard many people tell me how useful the book was, and that warms my heart.
- I also made a course on API documentation. Documentation is something that I'm super passionate about, and I needed to scratch my itch and pour out my knowledge on it.
Older stuff
-
While in school, I built a couple of projects to solve problems around me or things I was learning:
- Lionet Watcher [Android]: This unfinished app was meant to crowdsource school WiFi hotspot strength.
- It was a neat idea, but I left school before I could finish it.
- Its main flaw is that telling people "X hotspot is the fastest!" would lead to congestion and make X much slower, but I chose to worry about that later.
- Unofficial UNNPortal API/SDK
- I made an unnoficial API and SDK for my school's student portal. Back then, there were several up-and-coming startups building stuff for the school environment; my goal was to provide a "Sign in with UNN" experience, so they could verify their users were actually students here. The school portal did not provide OAuth, so I went the hard way (web scraping).
- The project worked, and generated a ton of interest. But I never felt comfortable releasing it, as it would mean giving a third party your credentials. So I pulled it after a while.
- simple-db [Android/Java]: My very first library. I didn't know much about libraries, but while working on Android apps, I knew that setting up the SQLite database sucked, so I made this.
- Lionet Watcher [Android]: This unfinished app was meant to crowdsource school WiFi hotspot strength.
-
As I picked up more languages and tools, I also made a bunch of "simple" projects. Nothing particularly groundbreaking about them, but they were good for learning and expressing some ideas I had. I think this is an important rite of passage for any dev:
- ensure [PHP]: Syntax sugar for if-statements, in a "business-friendly" way. At the time, I was really into Laravel's declarative syntax sugar.
- monolog-pusher [PHP]: Monolog log handler that sends logs to Pusher Channels. Frankly, I'm not sure why you'd want to do that. I built it for a blog post, but it's garnered over 20,000 downloads since then, so who knows?
- pusher-chatkit-laravel [PHP]: Laravel library for Pusher ChatKit
- Burns [JS]: A basic event dispatcher for JavaScript, inspired by Laravel.
- laravel-jsend [Laravel]. When I was really into Laravel libraries and JSend. The me of today knows that this should just be a helper function in your codebase. But, hey, over a 100k installs.
Powered By Swish