🎱 Josh Branchaud ✨'s Avatar

🎱 Josh Branchaud ✨

@jbranchaud.bsky.social

Free-Range Software Dev and Consultant ✨ PostgreSQL β€’ Ruby on Rails β€’ TypeScript β€’ React ✨ πŸƒπŸˆπŸΉπŸŽ± (he/him) | Chicago | Work with me: visualmode.dev

1,176 Followers  |  366 Following  |  1,401 Posts  |  Joined: 24.04.2023  |  2.4854

Latest posts by jbranchaud.bsky.social on Bluesky

I use the equivalent of this syntax in Ruby all the time. It’s a nice pattern.

10.11.2025 18:55 β€” πŸ‘ 3    πŸ” 2    πŸ’¬ 0    πŸ“Œ 0
Preview
The Best Space Heaters Warm up a room and boost your home’s heating system with space heaters we’ve tested firsthand.

I’ve got to figure out a space heater for my office. HVAC isn’t pushing enough warm air into that room.

I like the idea of the oil-filled radiator style β€” slower but more energy efficient.

Their top pick (Vornado) sounds nice tho πŸ€”

www.nytimes.com/wirecutter/r...

10.11.2025 16:47 β€” πŸ‘ 0    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

Pretty cool that MacOS has a built-in command that you invoke. from the CLI to tell your display and system to not go to sleep β€” useful if you have stuff running and then go to grab some lunch.

github.com/jbranchaud/t...

10.11.2025 14:30 β€” πŸ‘ 0    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

Chicago Weather: always overpromising and underdelivering.

10.11.2025 14:22 β€” πŸ‘ 1    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0
Screenshot of an email from chess.com announcing their latest brand collaboration with RuneScape.

Screenshot of an email from chess.com announcing their latest brand collaboration with RuneScape.

Incredible β€” I would have never imagined @chess.com doing a brand collab with old school RuneScape.

10.11.2025 00:05 β€” πŸ‘ 0    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0
I want you to understand what it is like to live in Chicago during this time.

Every day my phone buzzes. It is a neighborhood group: four people were kidnapped at the corner drugstore. A friend a mile away sends a Slack message: she was at the scene when masked men assaulted and abducted two people on the street. A plumber working on my pipes is distraught, and I find out that two of his employees were kidnapped that morning. A week later it happens again.

An email arrives. Agents with guns have chased a teacher into the school where she works. They did not have a warrant. They dragged her away, ignoring her and her colleagues’ pleas to show proof of her documentation. That evening I stand a few feet from the parents of Rayito de Sol and listen to them describe, with anguish, how good Ms. Diana was to their children. What it is like to have strangers with guns traumatize your kids. For a teacher to hide a three-year-old child for fear they might be killed. How their relatives will no longer leave the house. I hear the pain and fury in their voices, and I wonder who will be next.

Understand what it is to pray in Chicago.

I want you to understand what it is like to live in Chicago during this time. Every day my phone buzzes. It is a neighborhood group: four people were kidnapped at the corner drugstore. A friend a mile away sends a Slack message: she was at the scene when masked men assaulted and abducted two people on the street. A plumber working on my pipes is distraught, and I find out that two of his employees were kidnapped that morning. A week later it happens again. An email arrives. Agents with guns have chased a teacher into the school where she works. They did not have a warrant. They dragged her away, ignoring her and her colleagues’ pleas to show proof of her documentation. That evening I stand a few feet from the parents of Rayito de Sol and listen to them describe, with anguish, how good Ms. Diana was to their children. What it is like to have strangers with guns traumatize your kids. For a teacher to hide a three-year-old child for fear they might be killed. How their relatives will no longer leave the house. I hear the pain and fury in their voices, and I wonder who will be next. Understand what it is to pray in Chicago.

β€œI want you to understand what it is like to live in Chicago during this time.”

aphyr.com/posts/397-i-...

09.11.2025 17:26 β€” πŸ‘ 14054    πŸ” 6802    πŸ’¬ 323    πŸ“Œ 386
Mural of Anthony Bourdain with the quote, β€œBarbecue may not be the road to world peace, but it’s a start.”

Mural of Anthony Bourdain with the quote, β€œBarbecue may not be the road to world peace, but it’s a start.”

β€œBarbecue may not be the road to world peace, but it’s a start”

06.11.2025 21:19 β€” πŸ‘ 3    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

The way this Hammerspoon automation works is that I manually trigger it with `Cmd+Opt+Ctrl-s` and it looks at the front Chrome window, goes through all the tabs not in the "keep list", writes them to a timestamped entry in a JSON file, and then closes all those tabs.

04.11.2025 16:42 β€” πŸ‘ 0    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0
VisualMode - Small-batch software development and consulting Your business is built on software. You need that software to run like a well-oiled machine so that you can keep moving forward. VisualMode can help. We bring cross-discipline, full-stack expertise to...

πŸŽ‰ Super proud to have hit the 5 year mark of VisualMode and being an independent software developer.

I continue to work with great clients on challenging projects. In particular I’m enjoying some recent modern Rails apps β€” this stack still has a big future.

www.visualmode.dev

03.11.2025 23:23 β€” πŸ‘ 7    πŸ” 0    πŸ’¬ 1    πŸ“Œ 0

One of my worst habits is feeling too precious about my Chrome tabs and never closing them until there are dozens or even 100+.

Wanting to give Hammerspoon (MacOS scripted automation tooling) a spin, I figured this would be a good task to take on.

Here's ChromeTabSaver!

github.com/jbranchaud/d...

03.11.2025 13:29 β€” πŸ‘ 0    πŸ” 0    πŸ’¬ 1    πŸ“Œ 0
Holding up the vinyl album for Daft Punk’s Alive 2007 β€” with a record player, old radio, and money tree in the background.

Holding up the vinyl album for Daft Punk’s Alive 2007 β€” with a record player, old radio, and money tree in the background.

One of my all-time favorite albums β€” Daft Punk’s Alive 2007

02.11.2025 22:43 β€” πŸ‘ 6    πŸ” 1    πŸ’¬ 0    πŸ“Œ 0

Intel MBP running Rails app unit test suite: 2min 23sec
M4 Max MBP running Rails app unit test suite: 12sec

Wowow 🀩🏎️

02.11.2025 20:35 β€” πŸ‘ 3    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0
Meme from Nightmare Before Christmas where the mayor says "There's only 365 days left til next Halloween!" and the wolf man corrects him, "364!"

Meme from Nightmare Before Christmas where the mayor says "There's only 365 days left til next Halloween!" and the wolf man corrects him, "364!"

01.11.2025 20:01 β€” πŸ‘ 0    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0
GitHub - ankane/strong_migrations: Catch unsafe migrations in development Catch unsafe migrations in development. Contribute to ankane/strong_migrations development by creating an account on GitHub.

The *checks* described in the `strong_migrations` README contains a lot of examples of when you may need to use that pattern. Reading through it is a great way to build up an intuition for these things.

github.com/ankane/stron...

31.10.2025 18:54 β€” πŸ‘ 1    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0
Using the expand and contract pattern | Prisma's Data Guide In this article, we introduce the expand and contract pattern to help migrate data and clients to a new schema.

If you want to do *online* database schema migrations without degrading the performance of your system, the Expand and Contract Pattern is a great approach. And generally a great pattern to know about.

www.prisma.io/dataguide/ty...

31.10.2025 18:52 β€” πŸ‘ 2    πŸ” 1    πŸ’¬ 2    πŸ“Œ 0

Extremely cool to hear that someone recommended it 😊

That's a great idea. I'll see if I can figure out how to add that to the search and/or just add additional links for those that go to the % page.

30.10.2025 22:59 β€” πŸ‘ 1    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0
Screenshot showing the Cursor "File Quick Finder" with the name of a non-existent file typed out. It says "No matching results" and then below that is an action to "Create File".

Screenshot showing the Cursor "File Quick Finder" with the name of a non-existent file typed out. It says "No matching results" and then below that is an action to "Create File".

I finally figured out that in VSCode/Cursor, if I hit cmd+p and type out the name of a file I want to create, I'll eventually filter everything else out and have a single option to create that file and the intervening directories if necessary.

30.10.2025 18:42 β€” πŸ‘ 3    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

*because of terrorism

30.10.2025 18:30 β€” πŸ‘ 51    πŸ” 11    πŸ’¬ 2    πŸ“Œ 1

No one should have to put up with this shit but in particular kids should not have to put up with this shit

30.10.2025 17:04 β€” πŸ‘ 3686    πŸ” 855    πŸ’¬ 26    πŸ“Œ 10

heartbreaking and infuriating

30.10.2025 14:14 β€” πŸ‘ 212    πŸ” 119    πŸ’¬ 2    πŸ“Œ 2
Post image Post image Post image Post image

Border Patrol officers stand outside their vehicles at a gas station near Bridgeport Tuesday in Chicago. Earlier in the day students from Little Village Lawndale High School held a walk out to protest recent immigration enforcement actions in the area.

28.10.2025 22:04 β€” πŸ‘ 1010    πŸ” 214    πŸ’¬ 25    πŸ“Œ 26

I'm finding I like my tooling way better when I make (Neo)Vim act more like an IDE than when I make an IDE act more like (Neo)Vim.

28.10.2025 22:28 β€” πŸ‘ 5    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0
fix: account for utf-8 multi-codepoint text by jbranchaud Β· Pull Request #81 Β· nebulab/erb-formatter This addresses the bug reported in Issue #80

And PR opened -- would ya look at me contributing to open-source πŸ˜…

github.com/nebulab/erb-...

27.10.2025 17:49 β€” πŸ‘ 0    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

I know a big part of this is probably due to not having 200 chrome tabs open (yet), but the difference in battery life between my 2020 Intel MBP and this new M4 MBP is astounding.

26.10.2025 23:04 β€” πŸ‘ 0    πŸ” 0    πŸ’¬ 1    πŸ“Œ 0
Preview
Examples :cherry_blossom: A command-line fuzzy finder. Contribute to junegunn/fzf development by creating an account on GitHub.

Always fun to browse this list of fzf utility functions, especially the ones for git.

`fbr` (for displaying a quick picker of recent git branches) is a favorite

github.com/junegunn/fzf...

26.10.2025 15:06 β€” πŸ‘ 0    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0
Sign on a cafe that says agents are not welcome and must show a valid warrant. Also includes a β€œKnow Your Rights” section.

Sign on a cafe that says agents are not welcome and must show a valid warrant. Also includes a β€œKnow Your Rights” section.

Saw this one today on the NW side of Chicago: β€œEveryone is welcome here *except ICE*”

26.10.2025 04:41 β€” πŸ‘ 19    πŸ” 2    πŸ’¬ 0    πŸ“Œ 0

It was likely this incident. bsky.app/profile/unra...

25.10.2025 17:38 β€” πŸ‘ 0    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

A friend and their 2y/o kid got hit with teargas while out for a walk in their neighborhood this morning.

How has it become so routine for these reckless ICE thugs to snatch our neighbors and lob chemical weapons onto residential streets while they do it.

This is everyday across Chicago right now.

25.10.2025 17:36 β€” πŸ‘ 4    πŸ” 2    πŸ’¬ 1    πŸ“Œ 0

I use cursor quite a bit. I was pairing recently with someone that uses VSCode and Copilot and they were *stunned* by the difference in quality of the tab-completions. Some of that might be model choice, but I also think Cursor is just doing a better job.

25.10.2025 05:13 β€” πŸ‘ 0    πŸ” 0    πŸ’¬ 1    πŸ“Œ 0
Preview
erb-format is deleting text from the copy of a template file Β· Issue #80 Β· nebulab/erb-formatter I ran into this in a codebase and was able to put together this reproduction. $ erb-format --version ERB::Formatter 0.7.3 Here is the repro template where Case 1 gets mangled by the formatter where...

Glad I was able to find a small repro like this so that I could share it with the project.

This is one of the weirdest bugs I've run into. Tempted to try to figure it out.

github.com/nebulab/erb-...

24.10.2025 21:02 β€” πŸ‘ 1    πŸ” 0    πŸ’¬ 1    πŸ“Œ 0

@jbranchaud is following 20 prominent accounts