Dev.to goes open source today! As befits the occasion, I've been reflecting on my own adventures in open source software.
I've had my GitHub account for a few years now, and in that time have written thousands of commits in various repositories, including a few small contributions to projects from Google, Bloomberg Media Group, and a couple of community-backed NPM packages. But the coolest code I've written has all been in my own repos. There are 16 source repositories in my GitHub account, of which only two are regularly updated. That means the other 14 were created in my spare time and died a quiet death somewhere along the way.
Side projects, although unnecessary to a great career as a coder, are a fun way to learn and exercise your creativity. I've learned awesome things from each of these and I wouldn't be the coder I am without them.
Feel free to check out any of the dead projects I mention here, fork them, or use them as a jumping-off point for your own adventure. I'll introduce each of them, and then, if you've got a minute, I'd love to hear about yours. And if you have any questions, you can comment on this post or message me directly. I'm always happy to share.
TonsilText
"An app to help the temporarily or permanently mute to communicate rapidly."
Background: I got my tonsils removed in December 2014. Anyone who's had a tonsillectomy knows that recovery is very painful, and for a couple of days around Christmas I couldn't speak because of how much my throat hurt. I knew the best way to distract myself was to dive into a coding project, so I decided to create a mobile app that would let me type any word or phrase, then auto-size it to fill my smartphone screen in landscape orientation so someone across the room could read it.
What I learned:
- Basic familiarity with Android Studio
- How Android apps are structured and built
Why it died: Once I recovered, I didn't feel motivated to keep building the project. There were also some big technical hurdles, as I never quite figured out the right algorithm to get the text to dynamically fill the screen, splitting onto multiple lines as needed, in order to maximize the font size without overflowing the screen.
ruffin
"Social app that helps you do stuff you like with new friends. No account, no commitment."
Background: Everyone's got an idea for a social network, right? My idea was a simple site where you would enter a zip code and a keyword (like your favorite hobby or restaurant) and you'd go to an instant chatroom specific to both. You could meet every biker or rock climber or Shake Shack enthusiast in your postal region. Chat rooms could also have events attached to them, with a basic RSVP so you could get groups together to go do stuff. Oh, and for some reason I didn't want to deal with passwords, so you'd just request a magic sign-in link in your email whenever you wanted to log in.
What I learned:
- MeteorJS, one of my favorite web frameworks to date
- MongoDB
- Reactivity on the web
- Full-stack development with a shared codebase
- A bunch of web development mainstays, like automated emails, cookies, and components
Why it died: I didn't do any planning or architectural work, so the codebase got really messy, really fast. I got bored of debugging it.
pooty.js
"A VMC framework that won't ruin your life."
Background: Everyone's got an idea for a front-end framework, right? ...um, at this point I'm starting to think it's just me. Anyway. I was frustrated by the complexity and overhead of AngularJS, and didn't like how opinionated and proprietary MeteorJS was, so I decided to roll my own framework. I called it a VMC because the Model would sit between the View and the Controller and mediate all their interactions. It was super-declarative and included some unit testing tools. I got a working prototype out (although I broke it later) and even put up a website for it. I may not have known much about frameworks, but you have to admit my emoji game was strong.
What I learned:
- Building a web framework is really hard
- Building a unit testing framework, on the other hand, is relatively simple
Why it died: Once again, I failed to plan. I ended up with a really heavy pile of code that was difficult to reason about. I still feel like there were a lot of good ideas in that framework, but as it turns out, execution matters more than concept.
Human Bingo (website)
"A live-action game for people bored at airport terminals."
Background: A friend told me about a people-watching game she and her husband play when they're bored. They drive to the parking lot of a movie theater or mall, fill out a bingo board with random human characteristics--long hair, big muscles, a sleeve tattoo--and cross each one off when they spot someone that has it. (I'm too awkward to know if this is creepy, please advise.) I thought this sounded like fun, so I built a quick web app in jQuery that generates the bingo board for you and lets multiple people play at once.
What I learned:
- For simple web tools, you don't need a framework
- How to simulate things I'd always taken for granted, like ng-repeat and ng-if, in jQuery
Why it died: I finished it. Sure, there's more I could do, but I think it's good like it is.
Human Bingo, the app
Background: A few people said they'd like to play Human Bingo if it was a mobile app. I'd heard that Phonegap could turn a website into an app pretty easily, so I gave it a shot. What I'd heard turned out to be wrong. Turning a website into a mobile app takes some real effort, even if the website is already responsive.
What I learned:
- How to set up and use Phonegap
- How Android packaging works
- All about Phonegap
Why it died: It turned out to be harder than I expected. I still think I'm going to finish it someday, I just may have to start from scratch.
writ
Background: I've been writing stories since I was a kid. I've always enjoyed writing, but trying to write long-form fiction in Microsoft Word is really hard because it doesn't have good tools for navigating or organizing your work. So I started exploring the idea of making a web app for fiction-writing.
What I learned:
- How to set up and bootstrap an AngularJS project from scratch
- Front-end routing
Why it died: I got bogged down really fast and realized I hadn't put enough thought into my data structures and app design. I also got frustrated with the amount of boilerplate AngularJS requires. However, I took a lot of the ideas from writ and implemented them in the webapp I'm currently building, Edward the App.
SuperTextAdventureMaker
"A super simple tool for creating text adventures on Windows."
Background: I had just started learning .NET and I wanted to make something cool with it. I had an idea for an interactive fiction engine that would consume text files with a straightforward domain-specific language. I also decided to find out if it was possible to create a C# application that was effectively stateless, using only POCOs and static classes.
What I learned:
- How to set up a console application in .NET
- User input/output in the console
- Text file parsing
Why it died: It's not super dead; it has a wiki and it works pretty well. However, before I started building lots of advanced features, I realized it was a bad idea to try to build a stateless app in C#. The way I was doing it would theoretically build up the call stack until it overflowed. Rather than undertake a complete rewrite, I abandoned the project.
SpitScript
"A rap vocabulary that transpiles to JavaScript."
Background: I had just read James Kyle's Super Tiny Compiler (which is amazing) and I wanted to build a compiler of my own. I decided to have it compile rap lyrics to JavaScript. A couple of weeks later, everything came together and SpitScript was born.
What I learned:
- How parsers, tokenizers, ASTs, and generators work
- Compiler design
Why it died: I finished it, albeit a year or two later. I ended up converting it to TypeScript (a great idea for finicky manual processes like this), fixing a ton of bugs, and releasing a completed version. It's not perfect--the vocabulary and syntax could definitely use some testing and tuning--but it works and it's kinda fun. Admittedly, I haven't worked on it for a while.
vue-custom-element-ts-example
"An example repository demonstrating how to use TypeScript with vue-custom-element."
Background: I was using a Vue community package called vue-custom-element and noticed it didn't have TypeScript support, so I wrote a TypeScript definition file and submitted a pull request. Once it was accepted, I got a lot of issues directed at me because people didn't understand how to use it and there were some use cases it didn't cover. In response, I created a small repo to demonstrate how it worked.
What I learned:
- How to create the simplest possible version of something for documentation
Why it died: It was a one-off and served its purpose.
vuex-autosaver
"An example repository demonstrating a content autosaver built with Vue.js and Vuex."
Background: I wrote about this on dev.to here.
blackswan-js
"A library for expressive music composition in JavaScript."
Background: I was playing with the Web Audio API and got frustrated with how complex it was. I didn't feel like I was writing music; I felt like a mathematician messing with audio waveforms. So I created a library for writing songs that would run on the Web Audio API without having to deal with the super-complicated stuff.
What I learned:
- Documentation-driven design--I wrote the documentation for this project before I wrote any code, and it kept things really simple and straightforward
- The Web Audio API
- Audio processing, including waveforms, clicking reduction, and precise timing
- That if you find an unlicensed library on GitHub, you can tweet at the author and they'll probably let you use it 😊
Why it died: I finished it. It isn't perfect, and I never nailed the "piano sound" I was hoping for, but it works pretty well for simple tunes.
array-filter-visual
"A vue-cli powered tool for filtering an array of words visually."
Background: My simplest project ever! About 100 lines of code, total. I was building a feature for Edward and needed a long list of random words. I grabbed some word lists online, but I needed a way to filter out words that were vulgar, duplicated, or overly technical. I spun up this component that runs on Vue CLI 3.0, displays all the words in a grid, lets you uncheck words you want to throw away, and generates a continuously-updated JSON list of the remaining words.
What I learned:
- Vue CLI 3.0 is super awesome, there's no faster way to build an interactive web component
Why it died: It served its purpose.
Viano
"A toy that lets you write songs using Vue components."
Background: I was thinking about Vue components (more or less the way middle-school kids think about their crush) and I wondered if it would be possible to implement a domain-specific language that only uses Vue components. So I put together a markup-based interface for blackswan.js and discovered that it was not only possible but also pretty fun. Then I used it to compose "La Cucaracha" in Vue. This is my most popular project on GitHub even though it's arguably one of the least useful.
What I learned:
- How to do provide/inject in Vue
- In theory, you could create a Turing-complete programming language that only uses Vue components
Why it died: I finished it. It could be a little easier to use, but it proved the concept I had in mind.
And that's all of them! I've had such a cool time and hope to be involved in many more projects like these in the future.
Top comments (25)
Reminds me of this
Regarding TonsilText, you might be interested to know that Android now has attributes that allow autosizing TextViews, where the font size is figured out based on the component bounds. Combined with the significantly better control over multi-lines, word break strategy and justification of text that we now have (compared to 4 years ago), it should simplify your troubles to a large extent, if you ever choose to pick it back up.
Wow, that's great to know! Thanks so much.
Whoo you bring everyone down memory lane.
I haven't such a huge graveyard as you, but here's some shit I've made with love :
AirPad
Allow you to control a web page using another device(s) (smart-phone for example). Using websocket to connect the screen and the device, it should have been able to make multiplayer game on one page.
I don't know why I never finished it.
Pimp-my-natives
Supercharging of natives prototypes. Same thing as underscore while keeping OOP syntaxe. I stated with
Array
, but never got any further.Secrets of Cydonia
My first "working" game (I had 2 or 3 failed attempts before). It was supposed to be a cute 2D exploration game. As I wrote everything from scratch, I quickly hit a performance hurdle. I loved coding it anyway.
gmartigny.github.io
Hosted by github set of experiments and random piece of code. That's a real mine, however I'm not sure you could dig out gold. x)
Draw
Easy to use 2D drawing library. I always enjoy drawing on HTML canvas, but it's a pain to use. So I seek out to build a drawing library. I made a few structure mistakes and it became a pain to maintain.
I consider further repos to be in "active" development, so not in graveyard
yet. It was fun going back to those old monsters.Please finish the Human Bingo app ;)
Since you said please: play.google.com/store/apps/details...
Thanks much...My daughter and I both downed it and will give it a try...We love people watching...
Personally, I like how ambitious I was early on:
github.com/MichaelZaporozhets/puddles
some of my more interesting projects over the years:
"History.JS Without the tears"
michaelzaporozhets.github.io/hisht...
github.com/MichaelZaporozhets/hish...
"Synergy.JS: Synergize text"
github.com/MichaelZaporozhets/Syne...
🤣
Thanks for sharing.
My dead dead repos I actually do delete, because they were of no help to anyone ever.
My graveyard, though, is full of code puzzles that I haven't had time for in years. I love code puzzles, but then life happens :(
Project Euler, Advent of Code (2015, 2016, 2017), Exercises for Programmers, and Screeps are the puzzles/repos. I recently bought a lifetime subscription for Screeps, despite not touching my scripts since April 2017, so now that I'm done with grad school I really want to get back into that.
Ruffin actually sounds pretty fun. Like Omegle meets Meetup. I'd be interested in trying to make something like that too kind of. Might blatantly steal your idea for my next side project. :P If that's cool and all.
I just MIT-licensed it for you. :) Steal away.
By the way, pro tip: I ended up dropping the last two digits of the zip code in order to get a more even geographic region. If you go with a zip-code strategy I recommend doing something like that.
Thanks, that was fast!
On the pro tip, I didn't even think about that, the first three digits of the zip being a more regional classifier makes sense but I never thought about it. I just liked the concept and didn't think of any implementation at all yet past the idea of sockets since there will be chat, and some kind of interaction with google maps will be needed.
This was fun to read. I have a lot of projects like this, although most of mine are half finished or at least will never see the light of day again. I think it's a great idea to reflect on the things you learned while working on the projects though. 😅
I love your graveyard, I have quite a graveyard too, but most of those projects aren't really meaningful or even complete I'm the half quarter side project done man.
I do agree that creating a graveyard helps you quite good to understand yourself and sometimes even reflect how you were when you did those projects and that they are not required to be a good guy at what you do.
I don't look back at my code and say "Woah that's just crap!" I mean some of it is, but I know I made that for a reason. As long as you have learned something I think a side project accomplished it's goal.
Not really. I'm sure Ionic is useful elsewhere, but I'd have to implement some kind of framework to use it for Human Bingo, and the main part of the game probably can't be built in a simple way with built-in Ionic components. When I pick it up again I'm planning to go with Phonegap (again), a native app, or Unity.