Last week, I launched the new Schedule timeline beta in Cushion for longtime users to test. The initial launch was a big accomplishment for me, as I worked on it a couple months to get it to where it is today. That one launch, however, was a single 7,000-line pull request that I’ve been sitting on for that entire time.

I’m not sure how other devs feel, but for me, it never feels great to have a pull request that keeps growing and growing—it makes the launch a significant event versus a manageable, no-big-deal release. Because of that, I’m always ecstatic when I successfully merge one of these giant pull requests because it means from here on out mosts releases are no-big-deal—I can launch one-line fixes or 5-line features without breaking a sweat. Overall, I think the theme here is that the shorter lived the pull request, the better I feel about it.

With the Schedule timeline beta launch, I released it as a timeline that can primarily 1) show projects, 2) scroll, and 3) zoom. As you can imagine, there’s a ton more in the backlog—even just to reach feature parity with the current schedule timeline—so I was raring to go with the post-launch “fast follows”. This past weekend alone, I already launched five improvements to the timeline. These were all to-do’s on my list that I felt comfortable saying, “Eh, it could wait until after launch”, which is a muscle that you definitely need to strengthen as you work on a product. Here’s a look at a few of the new additions:

First up is sticky rule labels. I had a significant breakthrough in recent weeks where I realized I could tie the rule labels to the zoom level for clearer context and more valuable indicators (e.g., the month zoom level will indicate month changes, etc.). Once I had the rule labels in place, they were just screaming for a sticky behavior. I found myself wanting to reference the current month, but it was offscreen already, so I would have to scroll back to see it. By making the labels sticky, they’re now always visible in all zoom levels.

This next update is definitely a nice-to-have, but I just had to (a common theme for me, but 100% allowed and encouraged for side projects). With the sticky rule labels, they would sometimes interfere with the “Today” label, so I redesigned it to hover above the timeline. Originally, the label included both “Today” and the current date, but it took up too much space. I decided to simplify this by only showing the date, assuming that most users would get it. Unfortunately, when I zoomed into the week view, which shows individual dates, the current date label felt immediately redundant. This is when the cartoon lightbulb ding’d above my head. I could take this opportunity to fade from the current date to the “Today” label when zooming into the week view. The outcome was infinitely better than I imagined, to the point where I caught myself giggling about it—a good sign as far as delightful details go.

The last notable post-launch update was proper touch support. Since I’m doing it right this time around, and supporting mobile with everything new I add to Cushion, I knew I would need to support touch. Luckily, with Vue hooks, this was as easy as writing a useTouchToPan hook alongside my existing useScrollbarToPan hook. I simply listened for touch events, then moved the timeline track based on the touch movement. Super easy, but super necessary.

Wrapping up, this kind of work is why I love coding so much. Even after 25 years of coding (!!), I still get excited to the point where I can’t stop smiling whenever I build a delightful little detail. And one of the best parts of these additions are that they were all nice and tiny pull requests that I didn’t need to think twice about when merging. Now that the brunt of the Schedule timeline beta is out there, I can keep chopping away at my roadmap, little by little. I’ll definitely have a few larger pull requests for to-do’s like creating and editing projects in the timeline, but at least I’m at the point where if someone finds a bug, I can smooth it out and deploy without breaking a sweat.