A Year of Affirmations

One year ago today, I released Affirmations into the world.

Words cannot describe the effect that this app has had, and continues to have, on my life. The response has been more than I could have ever expected, as I wasn’t even expecting 30 people to download it, much less 100 times that. Almost every day, I get some form of feedback about how the app has made someone’s day better - be it a text from friends or family, an email, or a tweet. For me, these stories make the project completely worth it, and make me feel like I have made a positive impact on the world.

A lot has changed in this past year for me - I released Affirmations during my last semester of college, which is in itself a weird transitional time. At the end of 2021, after I graduated, I put out an outline on my theme for 2022: the Year of Stability. The point of this theme was to find structure, and ease into life as an adult. In that post, I shared three things I wanted to accomplish:

  1. Find a full-time software development job,
  2. Get into a regular development schedule, and
  3. Reduce the number of uncertainties about my future.

Well, I’m happy to say that I have achieved the first goal. I’ve been working full-time as a software engineer for a few months, and I’m absolutely loving the shift from indie development to a professional workspace. That being said, it has made me shift priorities in regards to my indie apps - in my typical fashion, I tried to do both my new job and my apps and fit both into my day. I quickly learned that it just isn’t feasible to try and squeeze everything into the same 24 hours and keep the same pace I had a while back. I’m just one person with a finite amount of energy, and if I kept trying to do this I would quickly get burnt out.

So over the past few months, I’ve been fighting the part of my brain that holds the impostor syndrome center, and trying to be fine with putting my apps on the backburner. This isn’t to say that I’m completely abandoning my apps (even though it may feel like that sometimes), I’m just taking my time and trying to find out where they fit into my new life. In my mind, my apps and projects have always been hobbies and school or work would always take precedence. But that doesn’t mean I don’t love indie development - I’m super proud of the work I’ve done over the past few years. I do have updates and projects planned, but I’m letting them take more time to come to fruition. And I’m learning to be okay with that. Ultimately, this shift is about taking care of myself, and that’s the most important thing to me. Hell, isn’t that the entire idea that Affirmations is built around?

So I just want to say thank you to everyone who has come along with me for this weird transition in my life, in addition to everyone who has downloaded Affirmations, supported me during its development, and kept using it. You mean more to me than you could ever know. I can’t wait to see what’s next.


Reverse Engineering Wordle

Alternate Title: “Sucking the Fun Out of Everyone’s Favorite Word Guessing Game”

Warning: This article contains Wordle spoilers for February 4th. Proceed at your own risk.

So, I found a tweet yesterday (sorry to whoever wrote it, but there is no way in hell I’ll ever find it in the endless sea of Wordle tweets) that basically said “hey, Wordle stores all its info locally! Check it out!”

This piqued my interest, and I started poking around. Lo and behold, everything was stored in window.localStorage. Some initial experimenting yielded some fun results:

Left: A screenshot of Wordle saying "Hi there, get affirmations!"; Right: A screenshot of Wordle with the green squares arranged to form a happy face

However, I wanted to see if I could put this to good use. I wanted to break Wordle¹. I present to you: the Wordle Solver bookmarklet.

A video of me pressing a button on iOS Safari, which fills in the Wordle board with the correct word.

There are five main parts to how this code works:

  1. Getting the game board object (where all the current game state stuff is stored)
  2. Getting the solution from the game board
  3. Input the solution into the game
  4. Telling the game you inputted 5 letters
  5. Submitting the word

I’ll walk you through these step-by-step, but all the code is right here.

First, a note on how Wordle is actually structured. The game itself is actually contained in a <game-app> tag, which contains all the game information.

There are 3 interesting things here:

  1. boardState, which contains the letters on the board
  2. evaluations, which contains each letter’s state of correctness (absent, present, or correct)
  3. solution, which (you guessed it) is the solution to the day’s board

Modifying the first 2 directly is what let me make the fun boards from above.

So first, I grab the <game-app> object (which I will refer to as game), so I can access all the game state information. Next, I use game.addLetter() to input game.solution into the board.

The thing with the addLetter() method is that it’s meant to only be called with one letter. So while I do call it with the full string and it adds all five letters to the board, the game still thinks you’ve only inputted one letter. So that’s why I manually set game.tileIndex to 5, which just tells the game that you actually inputted five letters. Lastly, I simply call game.submitGuess() which I doubt I need to explain.

When I originally tried to do this, I tried making an iOS Shortcut by using its “Run JavaScript on Web Page” action. However, it didn’t like me trying to access game’s custom properties, so I took a trip back to 2010 and settled on a bookmarklet.

Every method used in this solver is straight from the game itself, no hacks. If you want the fun sucked out of this worldwide phenomenon, add this link to your bookmarks:

Wordle Solver

Update Feb 27, 2022: After the New York Times bought Wordle, the URL for the page has changed. I updated the bookmarklet to reflect this, which is above. If you still want the old URL to work, use the one below.

Wordle Solver (Old)

You should be able to right-click and add it to your bookmarks, but if you can’t, you can copy that link and paste it into an existing bookmark. If you can’t copy the link, the minified code is here. Open it on the Wordle page, and it’ll solve it for you.

Enjoy!

  1. I don’t actually want to break Wordle. Love the game Josh <3

A Retrospective on Progress; A Foreword on Stability

So here we are, at the end of 2021. I always get a little sentimental around the new year, and since I now have an outlet for whatever the hell happens in my brain I figured I’d have a look back at the past year (and a look forward at the coming year while I’m at it).

Part 1: Progress

I was drawn to the idea of a Yearly Theme since I learned about it from Cortex. I’ve tried year after year to stick to a set of resolutions, but I’d always fail relatively quickly. So I spent a year or two trying to make a Yearly Theme fit in my life, but I feel that this year was the first time that it actually felt right. At the turn of 2021, we were in the thick of the COVID-19 pandemic, and the year prior had been… something, to say the least. In light of this, I wanted to go into 2021 with an optimistic view.

I knew that this was going to be a big year for me, specifically as I was set to graduate from college in 2021, so I designated this year as the Year of Progress. I wanted to make both personal and professional progress to help solidify things as I stepped into the post-grad chapter of my life. Now, as a college graduate with a Bachelor of Science degree, I confidently say that I have emerged on the positive side of progress.

In the past year, the two most important things I accomplished are:

  1. Graduate college (with two Dean’s List semesters in a row), and
  2. Launch Affirmations, my most successful app yet.

Now, the pessimist in me wants to say “but Justin, you dumb-dumb, that’s only 2 things. That’s not impressive.” And I would like to just indulge myself and say that these are two of the most intensive things I’ve ever done, and I am so goddamn proud of myself. I have never felt more optimistic about the future, which is something I never thought I’d say. I can confidently say that I have made a name for myself now, and there are people who know who I am solely from Affirmations. This has already opened up some opportunities that I will further explore in 2022.

So in terms of setting myself up for my post-grad life, I think I have sufficiently achieved that.

Part 2: Stability

If 2021 was mixing the concrete, my plan for 2022 is to lay the foundation. A lot of things are currently in flux, and I’d like to spend this year working on getting my life in order. You know, standard post-grad stuff like getting a job and becoming a full-fledged adult. I guess another part of this theme will be figuring out what that entails.

So I’m officially designating 2022 as the Year of Stability. I can’t really speak on how this will go, but I’m optimistic. In addition to having leads on jobs, not having to worry about classes anymore means I can spend the majority of my time on my apps. I understand that I’ve been neglecting them, and now is the time to fall into a more regular development schedule.

So here are the things I want to work toward in 2022:

  1. Find a full-time software development job,
  2. Get into a regular development schedule, and
  3. Reduce the number of uncertainties about my future.

(That last point is very vague, but that’s kind of the point.)

An added benefit of this theme is that I have a fantastic Death Cab for Cutie song to go along with it. I’d like to point out the first few lyrics of this song:

Time for the final bout,
Rows of deserted houses,
All our stable mates are highway bound.

I feel these also suit the theme really well. The feeling of moving on from a period of comfort and constants to embark on new adventures, as I plan to this year, comes through in them.

So that’s my theme for 2022, I’ll check in about this time next year. See you then.


Six Of My Favorite Records I've Bought This Year

Six records laid out on my bed

As you may or may not know, I’m an avid vinyl collector. As of writing, I have 290 records in my collection. Some may see it as an addiction, but I see it as… let’s say a very passionate hobby.

That being said, there are many albums I’ve spent months, even years trying to find for a reasonable price (I’m not about to drop $500 for a no-box copy of Drukqs). I spend a lot of time looking at different vinyl dealers, trying to find good deals on albums from artists I like. Sometimes, I get lucky; other times, not so much. So, in no particular order, here’s six of my favorite albums I’ve gotten my hands on this year.

Nine Inch Nails - The Fragile

Nine Inch Nails - The Fragile

When I say I spend months tracking down records, I’m not lying. By the time I decided to buy The Fragile, it had already been (to my knowledge) out of press for a few months. It’s still sold out everywhere, and scalpers are taking advantage of that. However, one day I just happened to look at the Barnes and Noble site and saw that a store nearby had one copy of it that they had just gotten in. So I immediately called and reserved it, and soon after it was mine for $10 less than MSRP.

Favorite Tracks: Somewhat Damaged, Just Like You Imagined, La Mer, The Great Below

The National - High Violet

The National - High Violet

This is another case where I was searching for a few weeks and ended up finding it at that same Barnes and Noble. Then a few weeks later when I went back to school, I went to another local record store and found out they and were selling a copy for $10 less than I paid for it. Ah well, such is life.

Favorite Tracks: Little Faith, Afraid of Everyone, Bloodbuzz Ohio, Vanderlyle Crybaby Geeks

Bonobo - Migration

Bonobo - Migration

Ever since I discovered this album in 2017, it has been one of my favorite albums ever. So of course, when I saw that one of my local record stores got a copy in stock, I had to have it. Problem was: the semester had just ended and I had to leave campus, so I missed it the first time. However, almost 6 months later (when I was back on campus), they got another single copy in, which I reserved and picked up a few days later. It’s now one of my favorites, and they’re selling another copy for $5 more than I paid.

Favorite Tracks: Migration, Second Sun, Bambro Koyo Ganda, Figures

Nine Inch Nails - The Downward Spiral

Nine Inch Nails - The Downward Spiral

This one had a similar situation to Migration, where I missed the first copy and got the next one a few months later. Nothing too impressive here, I’m just really happy I own it.

Favorite Tracks: March of the Pigs, Closer, Ruiner, Reptile

Halsey - If I Can’t Have Love, I Want Power

Halsey - If I Can't Have Love, I Want Power

I kinda slept on this album when it first came out, even though Trent Reznor and Atticus Ross are two of my favorite artists. I finally gave it a listen a few weeks after it was released, and immediately fell in love. So I went to my local record store and they had only one copy left (buried in the “Rock H” section no less), so it was meant to be. Now it’s one of the albums I play the most.

Favorite Tracks: Bells in Santa Fe, Easier than Lying, 1121, Ya’aburnee

Squarepusher - Feed Me Weird Things

Squarepusher - Feed Me Weird Things

This one had some weird circumstances around it. I was talking to some friends and mentioned in passing that I really wanted this on vinyl, not aware that it had just been reissued for its 25th anniversary. I was informed of this, and immediately pre-ordered, super excited to experience the remastered tracks firsthand. However, the pre-order delivery date came and went with no word from the distributer. I waited another day or so, then emailed when there were still no updates. It eventually arrived almost a month after the promised delivery date. They were very apologetic and I’m really glad it came in the end, but I probably won’t order from them again anytime soon.

Favorite Tracks: Tundra, Windscale 2, Theme from Ernest Borgnine, Kodack


Perfectionism, Impostor Syndrome, and Affirmations

Today, I released a new app called Affirmations. It’s a self-care tool I made that delivers compliments and positive reminders to you. I specifically designed the foundation of the app in a way that I can add or remove affirmations as I please, arrange them into groups that the user can enable or disable, and make them time sensitive (i.e. for holidays). Kinda like CARROT, but not homicidal.

Why did I make this? A year ago, shit was bleak. The election was in full swing, COVID was unleashing a full-on rampage, there was just… a lot happening. I thought “Well, what if there was a widget that could remind you that things are ok?” So I made it. I had a widget running with a few placeholder bits of text, and then expanded the text to be customizable server-side. Then I expanded the in-app interface, added notifications and breathing exercises, and then it was a full-fledged experience. One of the very last things I added was a list of global mental health resources, which I spent days compiling and sorting. It’s so much more than I thought it would be, and I’m so happy with how it came out.

Despite the nature of the app, being this feel-good self-care tool, I think I faced some of my biggest challenges as a developer while creating Affirmations. I was lucky enough to catch the attention of some high-profile people who signed on as beta testers, in addition to the 90 or so other testers at the time of writing who gave great feedback. However, by making an app like this, you assume a certain responsibility from your users. A responsibility to make a wholesome experience. A responsibility to make people happy. To help drive away sadness in the most frictionless way possible. Ok, I’m being a little facetious with that last point, but the sentiment stands: I have four other apps, and none of them have this much weight to carry.

As someone who struggles with depression and anxiety, any project I undertake obviously needs to be up to the highest standards and have no flaws whatsoever, or they’re trash and not good enough and invalidate my entire career. Or that’s what happens in my head at least. Every time I opened Xcode, I would face those feelings head on, shove them down, and just do the work. And in the end it may not be perfect, but it works. This is why the project has taken an entire year. (No, seriously: I started the project on September 30th of 2020, and launched on September 30th of 2021). I kept tweaking and testing and waiting for feedback, keeping the app in beta since I was scared of letting it run wild on the off chance it had any imperfections.

This is amplified even more by the fact that I still feel like this was all a fluke. That the App Store editors featured Femto on the Discover page last year. That the MacStories team promoted Femto and Dot in any way. That Menu Bar Splitter gained the popularity it has. I know those feelings will never go away and I’ll have to learn to live with them, but with a project like this they really do start to sting.

With help from some friends in the Relay FM members’ Discord server, I’ve started processing these feelings. The most important thing I learned was to live with the imperfections, and that 1.0 doesn’t mean it’ll never be touched again. I can always ship another update, or add another feature in 1.1. Everything doesn’t need to be done at once, and that took me the longest time to figure out. A few days ago, I found something I wanted to improve, but stopped myself, thought “Is this really something that absolutely needs to be fixed for 1.0?” and ultimately decided no. After my brain telling me to deal with every single piece of feedback immediately, and add every little idea that comes to mind, this felt nice.

However, I’m terrified. What if it breaks? What if there’s a fatal error on startup and no one can use it? What if a reviewer gets their hands on it and it’s essentially a digital paperweight? The past year of my life has culminated in this moment, and it could be invalidated with a single wrong line of code. I’ve tested every section of Affirmations multiple times, yet I still have this nagging thought in the back of my head (no matter that it went through the App Store review process). I want to make people happy, and I want Affirmations to live up to the hype. I can think of a million different things I could have improved for version 1.0, but I’m swallowing that fear and letting it exist in its current, fantastic, launch-complete form.

In the past few months, I have received numerous stories of how Affirmations has made people happy. Even just once. These anecdotes make me remember that it is, in fact, a good app, and that I made the right choice in persisting through the doubt. By giving a big “fuck you” to my impostor syndrome.

These are feelings that anyone who has worked on a project for this long has when releasing it to the public, right? So please, enjoy Affirmations. As narcissistic as it may sound, I’m so fucking proud of myself for creating it. There are times I’ve considered scrapping the project and questioning my entire iOS development career; however, I’m so glad that I, as a developer, and Affirmations are here today.

Affirmations is free. Give it a shot, won’t you?


A New Design

Hi, I redesigned my site a few weeks ago. I’m only writing about it now, because I just added a pretty big thing: iA Writer Mono.

The Font

I didn’t like how Courier looked after a while, so I wanted a cleaner and prettier monospace font. I started with JetBrains Mono, but something didn’t sit right for me. Then I experimented with San Francisco Mono (the font used in Xcode), and decided against it for fear of the wrath of Apple’s legal team. I then was reminded of iA Writer’s custom-made fonts that the wonderful folks at iA are letting anyone use.

So I snagged them, loaded the Mono variant into my CSS, and it looks beautiful. I love it. OK, font and all, I need to talk about this new design.

The Design

My old design was getting stale and convoluted. I wanted to keep the aesthetic of the old design, in a way, but wanted a nice refresh that presented only the information needed in a nice way. A few years ago, I designed my resume with a monospaced font, double-column layout, and a concise way to see my experience on one page. So I took inspiration from that, and out came this design.

I kept the same color scheme as the old design: light text on a dark background with blue link highlights that turn red on hover. I muted the colors a bit, which made them easier on the eyes and gives it a sort of retro vibe. (Fun fact, I was actually inspired by the Metal Gear Solid 3 UI color scheme in a way.)

My name is on its own line, on the left column, justified right. It immediately brings your attention to the fact that this is, indeed, my site. Below that is the same About section from the old design. Below that is my contact info, followed by a design and font credit. For the list of my projects, I used the format from my resume: Title, Link, Description. One sentence for the description, and the most concise title possible.

My apps are split into the same sections as on the old design, but I split the Miscellaneous page into a few different sections and kept a true Miscellaneous section at the very bottom.

The differentiation for each level of importance took a while to figure out. The main titles are standard h1 and h2s, the project titles are h3s, links are italicized ps, and the descriptions are standard ps. However, the more lengthy text such as the project descriptions and About section are slightly darker than the primary color. This helps draw your eye to the section markers instead of the long text, making the layout look less cluttered.

I also whipped up a quick favicon. It’s my initials in iA Writer Mono on a squircle with the same text and background colors as the site. It helps complete the look and makes the design appear finished.

The Blog

There isn’t too much here. In the recent posts page, I turn the projects list into the posts list. Clicking my name also brings you back to the main site. In the archive, the right column turns into a posts list organized by year and month, same as before. The left column is navigation.

The Mobile Layout

I never really used proportional text sizes before, so adapting this layout to work on mobile was a little tricky to get working. I found a good proportion of the viewport width to use for the text size, adjusted a few margins and stuff, and adapted the layout’s flexbox to be vertical instead of horizontal.

On the main site, having the About section and contact info on the bottom seems most logical. On the blog, I keep the navigation on the top and wrap the options if the screen is too thin. I think that’s a good compromise for a functional mobile layout, done only in pure CSS.

In Conclusion

I’m super happy with how this redesign came out. I’ve wanted to do something like this for a while, and I’m so glad I went through with it. It’s more concise, clean, and pretty. And most importantly, there’s still no JavaScript to weigh the site down. Thanks to everyone in the Relay FM Members’ Discord Server who gave feedback and suggestions for the layout.

Enjoy.


Ember Mug Hot Chocolate

This past Christmas, I was gifted a 10oz Ember Smart Mug by my wonderful brother. After running out of apple cider to drink late at night, I turned to my other favorite hot drink: hot chocolate. After seeing that the recipe on the back of the Hershey’s Cocoa Powder package would make waaaay too much for my needs, I scaled the recipe down to perfectly fit a 10oz mug like the Ember. You’re gonna need a scale for this.

Ingredients:

  • 1.25oz granulated sugar
  • 0.5oz cocoa powder
  • 0.75oz water
  • A pinch of kosher salt
  • 7.5oz milk (I just use 2%, you could probably use a dairy-free substitute here)
  • A few drops of vanilla extract

Directions:

  • Combine sugar, cocoa, water, and salt in a saucepan. Heat until it’s turned into a nice chocolatey paste, scraping down the sides and making sure it’s not burning.
  • Stir in milk and vanilla, and the heat to your desired temperature (I use an instant-read thermometer to make sure it’s at a nice 135ºF). Make sure the milk doesn’t boil. I don’t know why, but the Hershey’s recipe says to not do that.
  • Enjoy!

Fundraiser Results

Yesterday was the last day for the Femto fundraiser, and I just made the donation. The total came out to $74.59, which I just rounded up to an even $75. You can see the day-by-day breakdown on the spreadsheet, and the donation confirmation here.

Thank you so much to everyone who participated.


A New Fundraiser

I think everyone has at least some idea of the shit that’s happening in America right now, and it seriously pained me to just sit idly by while people were out there fighting against this oppression. I would attend a protest if I could, but sadly circumstances don’t allow. I’m still trying to help in any way I can, which is why I’m doing another fundraiser.

From tomorrow, June 3rd, to June 17th, 100% of all proceeds from Femto, my text editor (and the only paid app I make), will be donated to organizations that fight against racism and police brutality. I learned about this ActBlue page from Christian Selig, the developer of Apollo, who showed an incredible amount of his own generosity earlier today. You can learn more about this fundraiser on femtoeditor.com, and follow the running total for the next 2 weeks. Purchases from new users and tips from existing users will be counted toward this total.

Thank you so much for your support, and please encourage your friends and loved ones to donate in any form. Stay safe out there.


Celebrating Pride Month

If you visit my site, you may have noticed some color changes. For the entire duration of Pride Month, this site will show the colors of various Pride flags (the full list is here). If you’re interested in the code side of this, you can see the script here. I myself am bisexual, and I wear that proudly. I know this is a tiny way to celebrate on a site that gets little traffic, but this is my little corner of the Internet that I have full control over, and that’s honestly really comforting right now. And yes, I did wait until midnight today to post this. I’m excited.

So happy Pride Month to all the wonderful people who are out, in the closet, or figuring themselves out. Stay safe.


Updates Update

Alright, so I’m realizing that updating posts later doesn’t work. I use NetNewsWire as my RSS reader, and it doesn’t refresh with the updated section. I can’t say if this exists for other readers, but you can never be too safe. I’ll stop doing updates on posts in the future.


Hello!

Hello! I decided to make a blog. I’m not sure how often I’ll update here, but it’s nice to have. I built this Jekyll theme from scratch as well, so hopefully that holds up. I think there might be a few issues I have to fix, but we’ll get there when we get there. In the meantime, let’s see how this goes. I can already tell I need to find a better way to send posts to GitHub.

Update: I built an Automator Folder Action to rename and push any Markdown files that get added to a Send To Blog folder. So that’s definitely a lot easier.