@mwender https://mwender.com/ sharing *golden nuggets* Wed, 25 Feb 2026 16:11:30 +0000 en-US hourly 1 https://wordpress.org/?v=6.9.4 https://mwender.com/wp-content/uploads/2025/12/cropped-mwender-b-and-w_03_2025-12-17-32x32.webp @mwender https://mwender.com/ 32 32 Enjoying Gruber’s Blog https://mwender.com/enjoying-grubers-blog/ Wed, 25 Feb 2026 14:13:09 +0000 https://mwender.com/?p=5336 This morning I reinstalled Reeder on my iPad so I can catch up on what I’ve missed lately on Daring Fireball, John Gruber’s blog covering Apple and all manner of other things that catch his eye. With the absolute crush of AI into my world this year, Gruber’s Web 1.0 online presence is refreshing. His blog feels more akin to reading a print newspaper than the typical content I consume.

Just like John, my family shares an affinity for Trader Joe’s Dark Chocolate Peanut Butter Cups. Although peanut allergies have us preferring the almond butter ones.

Just the other day, my wife and I were remarking how we missed Dark Sky, the hyperlocal weather app acquired by Apple. Thanks to John, now I know about Acme Weather, a new offering by the same creators. I quickly downloaded it before penning this post. There’s a two week free trial before $25/yr, and I’m already thinking it will be worth it.

I’ve yet to upgrade (<cough>I mean downgrade</cough>) to macOS Tahoe. All I hear is it’s an absolute regression in terms of user interface. John provided further credence to this by linking to Norbert Heger’s experiences trying to resize windows on Tahoe. If you click through, be sure you don’t miss his IRL animation illustrating how insane the click target is for Tahoe windows.

All-in-all, pursuing John’s stuff was an absolutely delightful experience. It’s an up-to-the-moment take on current news and trends via a distinctly early 2000’s medium. Don’t get me wrong, I’ve gone all in with AI this year, but taking the time to enjoy John’s craft returns me to a realm of thoughtful web browsing that the algorithm’s are engineered to avoid.

]]>
Molted https://mwender.com/molted/ https://mwender.com/molted/#comments Fri, 30 Jan 2026 00:57:25 +0000 https://mwender.com/?p=5332 Just posting this photo here for those who know. 😉🦞

]]>
https://mwender.com/molted/feed/ 1
Patrick O’Hearn, New Drop! – Hellenistic Spa https://mwender.com/patrick-ohearn-new-drop-hellenistic-spa/ https://mwender.com/patrick-ohearn-new-drop-hellenistic-spa/#respond Thu, 22 Jan 2026 19:25:16 +0000 https://mwender.com/?p=5326 As I was driving to the gym at 5:15am this morning, I glanced at Apple Music on CarPlay, and what should I see? None other than a new release from my favorite new age composer Patrick O’Hearn. I quickly pressed PLAY, and I was transported to the lobby of my favorite Wyndham Resort timeshare.

Seriously, I discovered Patrick O’Hearn some fifteen years ago during the initial iterations of “Apple Music” on the first generation Apple TVs. This was back when “Apple Music” was merely your option for picking several Apple curated music streams. I was drawn to O’Hearn’s music because it makes for great background when I’m working in the office. In fact, I’m listening as I write this post.

In addition to those times when I’m in the mood for some “easy listening”, I also have a “Patrick O’Hearn” favorites playlist I queue up whenever I want to drift off to the subtle sounds of O’Hearn’s new age mastery. The playlist is 45+ minutes; however, I’ve got myself so trained that I’m often lights out in less than sixty seconds, and that’s a shame because I really love the second song on that playlist (i.e. Milan to Alessio Top Down).

Never heard of Patrick O’Hearn? You’re in for an easy listening treat. Might just make your 2026!

]]>
https://mwender.com/patrick-ohearn-new-drop-hellenistic-spa/feed/ 0
Breaking the Zimmermann Telegram https://mwender.com/breaking-the-zimmermann-telegram/ https://mwender.com/breaking-the-zimmermann-telegram/#respond Sun, 18 Jan 2026 23:30:07 +0000 https://mwender.com/?p=5314

Just over one hundred years ago, the British carried out one of the most audacious acts in the history of codebreaking. So audacious, in fact, that they had to convince the Americans they hadn’t done it at all…

Entertaining and fascinating read on the circumstances surrounding the British code breaking efforts with regards to the Zimmermann telegram.

Link: Breaking the Zimmermann Telegram – Lapsed Historian

Photo Credit: ChatGPT 5.2 – “I’m attaching a copy of the Zimmermann telegram. Composite this image into an 1880x984px image that I’ll use as the feature image on a blog post. This blog post is linking to a story about the circumstances surrounding the Zimmermann telegram. So, for the image you create, make it look like an authentic historical photo with the telegram within the scene. The photo should look like something from 1917 or thereabouts. Have the telegram sitting on a desk in the foreground with British intelligence discussing it with a US embassy official. Do not include any text overlays on the photo, we are just going for something that looks like an authentic photo from the period.

]]>
https://mwender.com/breaking-the-zimmermann-telegram/feed/ 0
Fridays Off https://mwender.com/fridays-off/ https://mwender.com/fridays-off/#respond Fri, 09 Jan 2026 20:49:20 +0000 https://mwender.com/?p=5307 My new year’s resolution is to take Fridays off this year. I began the week getting my scheduling calendar updated to only allow client meetings on Mon, Tue, and Wed. Then I spent the first three days of the week working through my “weekly queue”. That left yesterday to do catch-up on anything I missed.

I started today (my first official Friday off of the year) grabbing breakfast with friends. Then I went by Starbucks to work on some writing. Back home I checked in with my family who has home school on Fridays. I also answered some emails and recorded a couple of “how to” videos for a client. This afternoon I made a grocery run followed by a late lunch.

Having worked five days a week for the past 25+ years, it’s pretty exciting to consider the prospect of a four day work week. I also wonder how easily I can maintain it as I make my way through this year? I’ll be sure to return to this post in January 2027 and give an update. Here’s to Fridays off!


Updates: I thought it would be good to keep a record of my Fridays to see how this experiment goes. As I’m able, I’ll post brief summaries.

  • 01/17/2026 (07:32) – yesterday wasn’t a Friday off. There were just too many items in my queue. However, it was an excellent day for catching up on all the things I’d missed earlier in the week and on Thursday. Basically, I know have two catch-up days each workweek. If I get caught up on Thursday, then I can pretty much take Friday off.
]]>
https://mwender.com/fridays-off/feed/ 0
Trusting How Things Feel – Thoughts on Vibe https://mwender.com/trusting-how-things-feel-thoughts-on-vibe/ https://mwender.com/trusting-how-things-feel-thoughts-on-vibe/#respond Thu, 08 Jan 2026 14:08:55 +0000 https://mwender.com/?p=5294 I love to explore all manner of topics when conversing with LLMs. Below are words generated by ChatGPT 5.2 following a series of my prompts which began with me asking the following:

Let’s discuss the word “vibe”. It’s such a great word used to capture the “feel” of a moment, place, group, etc. It also seems to me that its use has gained prominence greatly in the past couple of years. Let’s discuss the rise in the use of “vibe” in recent years as well as consider what people used to describe “the vibe” ten, twenty, and more years ago.

The Curious Power of “Vibe”

Few words have risen as quickly—or as quietly—into everyday language as vibe. It’s a small word that carries an enormous amount of meaning, capable of describing the feel of a room, the energy of a group, the tone of a conversation, or the ineffable sense you get from a person or place. When someone says, “I like the vibe here,” we instinctively understand what they mean, even if we couldn’t easily translate it into more precise terms. That intuitive clarity is part of the word’s power.

What makes “vibe” especially interesting is not just its popularity, but what its popularity says about how we relate to experience. The word doesn’t demand justification. It doesn’t ask for measurements or proofs. It simply reports how something lands.

From Analysis to Reception

For a long time, describing a situation meant analyzing it. You observed details, evaluated conditions, and then offered a conclusion. If a place felt uncomfortable, you were expected to explain why: the lighting was harsh, the music too loud, the social dynamic awkward. The explanation gave the feeling legitimacy.

“Vibe” subtly flips that order. It implies reception rather than analysis. You walk into a space, absorb what’s there, and register a response. The response itself is treated as meaningful information, even before any rational unpacking occurs. In conversation, this changes the posture we take with one another. Instead of interrogating someone’s description of a situation, we can receive it as first-hand knowledge.

This doesn’t mean objectivity disappears. Facts still matter. Conditions still exist. But they are no longer the only—or even the primary—way we validate what someone experienced.

Honoring Lived Experience

When you talk with someone about the vibe of a place or moment, something relational happens. You’re not just exchanging opinions; you’re acknowledging their lived experience. Accepting someone’s read on a vibe is a way of saying, “I take seriously how this felt to you.” That’s a subtle but powerful form of respect.

Importantly, honoring subjective experience doesn’t require agreement. Two people can experience the same environment differently and both be telling the truth. “Vibe” gives us a shared language for that multiplicity. It allows us to hold space for different perceptions without immediately collapsing them into a single, authoritative interpretation.

In this way, “vibe” acts almost like a social shorthand for empathy. It lowers the barrier to being heard. You don’t need to win an argument; you just need to describe what you sensed.

Why “Vibe” Fits This Moment

The rise of “vibe” also mirrors a broader cultural shift in how certainty is treated. There’s a growing discomfort with overconfident claims to objectivity, especially in complex or human-centered situations. People are more aware that perspective, history, and context shape perception. “Vibe” fits neatly into that awareness because it makes no pretense of universality.

It also reflects how quickly we now form impressions. In an image-driven, fast-moving world, we are constantly making intuitive assessments. “Vibe” captures that reality without moralizing it. It doesn’t say intuition is superior to analysis—only that it exists, and that it matters.

A Softer Way of Knowing

Ultimately, the usefulness of “vibe” lies in its humility. It doesn’t claim to explain the world. It simply reports an encounter with it. In conversations, that humility opens doors. It creates room for listening rather than correcting, for understanding rather than resolving.

In that sense, “vibe” isn’t just a trendy word. It’s a reflection of a quieter shift toward honoring human experience as data in its own right. Not the only data—but indispensable all the same.


Image Credit: ChatGPT – “Generate a 16×9 aspect ratio image that gives off a blogging vibe.”

]]>
https://mwender.com/trusting-how-things-feel-thoughts-on-vibe/feed/ 0
Books – 2026 https://mwender.com/books-2026/ https://mwender.com/books-2026/#respond Mon, 05 Jan 2026 22:05:42 +0000 https://mwender.com/?p=5298 I’ll be updating this one with books I finish in 2026. I don’t expect this list to get too big (insert sad-faced emoji), but we’ll see…

  • 01/03/2026 – Harry Potter and The Order of the Phoenix
  • 01/06/2026 – Jude (i.e. the one page epistle in the New Testament, The Bible Project is doing a series of podcast episodes on it this year)
  • Currently reading: Surprised by Joy – C.S. Lewis

Last updated: 01/07/2026, 12:33pm

]]>
https://mwender.com/books-2026/feed/ 0
WHMCS Client Search for Raycast https://mwender.com/whmcs-client-search-for-raycast/ https://mwender.com/whmcs-client-search-for-raycast/#respond Fri, 19 Dec 2025 14:28:43 +0000 https://mwender.com/?p=5281 WHMCS Client Search is my new Raycast extension. It allows fuzzy searching of your WHMCS clients as well as quick access to client billing, profiles, and support tickets. It is an indispensable part of my workday saving me 30 seconds every time I need to enter a billing entry, and when multiplied out over the course of a year, it saves me somewhere between 2.5-4 hours.

]]>
https://mwender.com/whmcs-client-search-for-raycast/feed/ 0
New Profile Photo https://mwender.com/new-profile-photo/ https://mwender.com/new-profile-photo/#respond Wed, 17 Dec 2025 22:45:46 +0000 https://mwender.com/?p=5275 Today I took a photo and updated my online profiles. I added a bit of drama (i.e. higher contrast) via Nano Banana Pro, but the photo is otherwise unaltered.

]]>
https://mwender.com/new-profile-photo/feed/ 0
My Raycast Wrapped 2025 https://mwender.com/my-raycast-wrapped-2025/ https://mwender.com/my-raycast-wrapped-2025/#respond Wed, 17 Dec 2025 14:46:54 +0000 https://mwender.com/?p=5262 This was the year that I added Raycast to my Mac setup. From the minute I started using it, it was indispensable. Tasks that used to take several seconds or minutes I can now complete with a couple keystrokes saving me literally hours of time over the course of the year.

As a replacement for Spotlight on your Mac, Raycast is a power tool that greatly enhances my efficiency. I started by adding all manner of shortcuts to apps and web apps I use everyday. Then I added my own Bash scripts for things like saving images for the web, accessing quick links to my appointment calendars, and managing my notes in Obsidian. I’ve ended this year seeing my first custom extension published on the Raycast Store.

Here’s a look at my first year with Raycast via my Raycast Wrapped:

]]>
https://mwender.com/my-raycast-wrapped-2025/feed/ 0
Toshi III https://mwender.com/toshi-iii/ https://mwender.com/toshi-iii/#respond Thu, 23 Oct 2025 12:57:32 +0000 https://mwender.com/?p=5255 Music recommendation: Toshi III by Bunraku. Been listening to this one on repeat in the office all week. Should be available wherever you stream music.

Bandcamp Link: Toshi III • Bunraku

]]>
https://mwender.com/toshi-iii/feed/ 0
PeoplePerHour.com – Find Great Freelancers https://mwender.com/peopleperhour-com-find-great-freelancers/ https://mwender.com/peopleperhour-com-find-great-freelancers/#respond Mon, 20 Oct 2025 14:45:43 +0000 https://mwender.com/?p=5252 Bookmarking this one for two reasons: 1) I’m always looking for easy ways to grow my team, and 2) creating my own profile on this site might be a nice way to generate leads. PeoplePerHour.com:

PeoplePerHour connects clients to expert freelancers who are available to hire by the hour or project. Use our quick and easy form to describe the project you’ve got in mind. The more detail you can give, the more relevant freelancers you’ll attract.

Our artificial intelligence system does the hard work — matching and contacting the best freelancers for your project. Each freelancer then responds with their own tailored proposal.

]]>
https://mwender.com/peopleperhour-com-find-great-freelancers/feed/ 0
When WordPress says “nope” to ~500,000 images https://mwender.com/when-wordpress-says-nope-to-500000-images/ https://mwender.com/when-wordpress-says-nope-to-500000-images/#respond Wed, 01 Oct 2025 17:22:39 +0000 https://mwender.com/?p=5243 It started with what looked like a simple problem. My client tried to upload an image to his site, only to be greeted with:

The server cannot process the image. This can happen if the server is busy or does not have enough resources to complete the task.

Strange. The image was only 2000×2029px, well under WordPress’s suggested maximum of 2560px. This should have been easy. But when I looked at the logs, things got ugly.


The 504 Storm

The Nginx error log was full of:

upstream timed out (110: Connection timed out) while reading response header from upstream

Translation: PHP-FPM was choking. And not just on uploads — soon even the Media Library itself was throwing 504 Gateway Timeouts.

That’s when I realized: this wasn’t about one unlucky JPEG. This was about the entire Media Library.


How Big Is Too Big?

So I cracked open WP-CLI:

wp post list --post_type=attachment --format=count

Result: 483,000+ attachments.

And when I broke it down by type:

wp post list --post_type=attachment --field=post_mime_type | sort | uniq -c | sort -nr

I discovered that 482,938 were JPEGs.
That’s almost half a million images. Suddenly, the 504s made sense.


Why WordPress Falls Over

By default, the Media Library runs a query like this:

SELECT SQL_CALC_FOUND_ROWS * 
FROM wp_posts 
WHERE post_type = 'attachment' 
ORDER BY post_date DESC 
LIMIT 0,40;

With half a million attachments, SQL_CALC_FOUND_ROWS becomes deadly. MySQL has to count every single matching row before serving the first 40 results. Add in metadata joins from wp_postmeta and WordPress was guaranteed to hit timeouts.


The Fix: Indexes to the Rescue

Step one: I measured the query performance with:

wp db query "EXPLAIN SELECT SQL_CALC_FOUND_ROWS * FROM wp_posts WHERE post_type='attachment' ORDER BY post_date DESC LIMIT 0,40;"

The output confirmed WordPress was scanning ~399k rows and doing a filesort. Ouch.

The real breakthrough came from installing the excellent Index WP MySQL For Speed plugin. It rewrote the database indexes with high-performance keys, optimized for exactly this kind of WordPress scale.

What Are “High-Performance Keys”?

“High-performance keys” are just smarter indexes — they help MySQL find what WordPress is asking for without rummaging through half a million rows first.

In MySQL, a key is just another name for an index — a data structure that lets the database find rows faster without scanning the entire table.

A high-performance key (as the plugin creates) is an index that’s carefully designed to match the way WordPress actually queries its data. It combines multiple columns that are frequently used together in WHERE and ORDER BY clauses, so MySQL can skip sorting and full-table scans.

For example:

CREATE INDEX type_status_date ON wp_posts (post_type, post_status, post_date, ID);

That one index can satisfy dozens of common WordPress queries — posts by type, by status, ordered by date — all in a single efficient lookup.

By contrast, WordPress’s default indexes are very generic (for example, just post_date or just post_name). Those work fine for small sites, but once you have hundreds of thousands of posts or attachments, they’re too narrow. MySQL ends up sorting and scanning huge chunks of data anyway.

Why the Plugin’s Keys Are “High-Performance”

The Index WP MySQL For Speed plugin does three smart things:

  1. Combines columns that WordPress frequently filters by (post_type, post_status, post_date, ID, etc.).
  2. Replaces single-column indexes with compound ones that can satisfy more queries per index.
  3. Adds indexes for meta lookups (post_id, meta_key, meta_value) so joins on wp_postmeta are faster.

The result? Fewer full scans, fewer temporary filesorts, and dramatically faster query times for things like the Media Library, admin lists, and search results — especially at scale.


Testing After Indexing

From the CLI, I re-ran:

time wp db query "SELECT SQL_NO_CACHE * FROM wp_posts WHERE post_type='attachment' ORDER BY post_date DESC LIMIT 40;" > /dev/null

What once took seconds dropped to milliseconds.

And a real WP-style test:

wp eval '
$query = new WP_Query([
  "post_type" => "attachment",
  "posts_per_page" => 40,
  "orderby" => "date",
  "order" => "DESC",
]);
echo "Found {$query->found_posts} attachments\n";
'

It still reported nearly half a million attachments, but it did so fast. That’s the magic of proper indexing.


Lessons Learned

  1. Size matters — WordPress can technically store hundreds of thousands of attachments, but don’t expect the default Media Library to be happy about it.
  2. Indexes matter even more — a couple of carefully chosen composite indexes can be the difference between a 504 timeout and a snappy response.
  3. SQL_CALC_FOUND_ROWS is evil — disabling it in favor of smarter pagination is another key performance win.
  4. Think long-term — with libraries this big, offloading media (to S3/Spaces/Cloudflare R2) is often the only sustainable option.

Takeaway

If your Media Library is big enough to make WordPress groan, don’t panic.

  • Start with diagnostics (wp post list, EXPLAIN, time wp db query).
  • Add proper indexes (the plugin I used makes it painless).
  • And accept that at scale, you need to treat WordPress like a database-backed app, not just a blogging engine.

For me, the journey started with one stubborn JPEG — and ended with a crash course in WordPress at scale.

]]>
https://mwender.com/when-wordpress-says-nope-to-500000-images/feed/ 0
How to Name Your Files (2025 Edition) https://mwender.com/how-to-name-your-files-2025-edition/ https://mwender.com/how-to-name-your-files-2025-edition/#respond Fri, 12 Sep 2025 17:00:52 +0000 https://mwender.com/?p=5236 Despite decades of “improvements,” the best filename conventions haven’t changed. Here’s what still works:

The Rules

  • All lowercase
  • No spaces (use underscores or dashes)
  • Use ISO dates when needed: 2025-03-15

Examples:

  • meeting_notes_2025-03-15.txt
  • quarterly_report_q1.pdf
  • user-authentication-system.js

Why This Still Matters

  • Command line compatibility. No quotes needed:
$ mv project_files.zip archive/
  • Universal compatibility. Works on every system, old or new.
  • URL-safe. No %20 nonsense in web addresses.
  • Script-friendly. Automated tools won’t choke on your filenames.
  • Consistent sorting. Alphabetical order actually makes sense.

What About Readability?

Yes, My Important Document.pdf is more readable than my_important_document.pdf. But which one works better when you’re:

  • Running a backup script
  • Uploading to a server
  • Processing files in bulk
  • Sharing via URL

Technical reliability beats minor readability gains.

Common Patterns

  • Documents: project_proposal_v2.docx
  • Backups: database_backup_2025-03-15.sql
  • Images: hero_image_1920x1080.jpg
  • Code: user-auth-middleware.js
  • Archives: site_backup_2025-03-15.tar.gz

Bottom Line

Modern systems handle spaces fine. But your files don’t always stay on modern systems. Stick with conventions that work everywhere, always.

Your future self will thank you.

]]>
https://mwender.com/how-to-name-your-files-2025-edition/feed/ 0
How to Hard-Refresh Your Browser (2025 Edition) https://mwender.com/how-to-hard-refresh-your-browser-2025-edition/ https://mwender.com/how-to-hard-refresh-your-browser-2025-edition/#respond Fri, 22 Aug 2025 18:34:26 +0000 https://mwender.com/?p=5232 Sometimes websites hold onto old files (like stylesheets or scripts) in your browser’s cache. When we (i.e. Wenmark Digital and/or @mwender) make updates to your site, your browser may still show you an older version. A hard refresh clears the cached version and forces your browser to download the latest files.

Here’s how to do it on today’s most common browsers:


Desktop Browsers

Google Chrome (Windows/Linux)

  • Keyboard Shortcut:
    Ctrl + Shift + R
    or
    Shift + click the Reload button.
  • Mac Shortcut:
    Command + Shift + R

Safari (Mac)

  • Keyboard Shortcut:
    Command + Option + R
  • Or hold down Option and click Reload in the address bar.

(Tip: Safari’s cache is sticky. If this doesn’t work, go to Safari > Settings > Advanced, enable “Show Develop menu,” then choose Develop > Empty Caches.)


Mozilla Firefox

  • Windows/Linux: Ctrl + Shift + R
  • Mac: Command + Shift + R

Microsoft Edge

  • Windows/Linux: Ctrl + Shift + R
  • Mac: Command + Shift + R
  • Or Shift + click the Reload button.

Mobile Browsers

Safari on iPhone/iPad

Go to Settings > Safari > Clear History and Website Data.


    Chrome on iPhone/Android

    1. Tap the (menu) button.
    2. Tap the ⟳ Reload button.
    3. For a deeper clear: Settings → Privacy → Clear Browsing Data → Cached Images and Files.

    Edge on iPhone/Android

    1. Tap the menu.
    2. Tap the Reload button.
    3. To fully clear cache: Settings → Privacy and Security → Clear Browsing Data.

    When to Hard Refresh

    • You’ve been told “the site has been updated” but don’t see changes.
    • A page looks broken or isn’t loading correctly.
    • Styles, images, or scripts seem “stuck” on an old version.

    ✅ Pro tip: If a hard refresh doesn’t solve it, try clearing your browser’s cache entirely. This forces the browser to fetch fresh versions of all site files.

    ]]>
    https://mwender.com/how-to-hard-refresh-your-browser-2025-edition/feed/ 0
    LocalDev Switcher Plugin https://mwender.com/localdev-switcher-plugin/ https://mwender.com/localdev-switcher-plugin/#respond Thu, 31 Jul 2025 15:03:59 +0000 https://mwender.com/?p=5222 Ever been working on a local version of a WordPress site, and you wanted to test out some changes to a plugin without committing the code? I find this issue is particularly true whenever I’m working on a site built with the Bedrock framework. You’ve got your parent repo (i.e. the Bedrock site), and inside that repo you are pulling in your code from another repo with a “composer require”.

    Previously, I’ve tried solving this problem via Composer in the parent project; however, any solution I came up with was brittle. Recently it occured to me to try solving this problem inside WordPress. That’s when I came up with my LocalDev Switcher Plugin. It provides UI in the WordPress Admin Plugin listing to switch between VCS and Local versions of your plugins.

    LocalDev Switcher lets you switch between VCS and Local versions of your plugins.

    Next time you run into the same issue, you can install my plugin via the WP.org Plugin Repo or WPackagist.

    In the future, I plan to also add a theme switching capability to this plugin.

    ]]>
    https://mwender.com/localdev-switcher-plugin/feed/ 0
    Vibe Coding + BA in English = 💜💯 https://mwender.com/vibe-coding-ba-in-english/ https://mwender.com/vibe-coding-ba-in-english/#respond Thu, 24 Jul 2025 17:32:14 +0000 https://mwender.com/?p=5216 I originally wrote and published this one over on X. It was a fun time experimenting with publishing an article over there as I’d never tried it before. Reposting this here for posterity:

    As LLMs have come into fashion, I’m delighted to find that my educational background has me really well suited to vibe coding. Back in the late 90’s, I got my first degree in English with a concentration in Tech Comm. Next, I got an Associates in Digital Media.

    My first job after school was in branding for a digital video startup. We were working on delivering streaming video over the Internet. You might be familiar with that concept. 🤔😉 But, in 2000 that was the future™. It was my job to build our website and design our logo.

    Fast-forward 25 years…now I run my own web development agency. I’ve worked my way from the frontend all the way to the server. I love writing JS and PHP, configuring NGINX, and occasionally scripting in Bash or Python. I’m by no means an expert in any of these languages, but I’m fairly proficient.

    Now, when I combine my background with the capabilities of LLMs, I find they’re an excellent fit. Vibe coding (i.e. developing code simply by chatting with an AI) is all about your ability to write a prompt. The more you know about what you want to produce, the capability of the language(s) you’re using, and how software works in general, the better you’ll be at it. You can spot bugs, you’ll know when the LLM is hallucinating, and your overall experience will be that of a senior programmer working with a junior-level dev.

    Some vide-coded projects of mine:

    • $ sshconn – a Bash script for managing SSH connections –
    • LocalDev Switcher – a WordPress plugin for switching between VCS and local versions of plugins you’re running in a local WP install –
    • mwender/mwender – my self-updating Github profile (HT @simonw)

    Image credit: ChatGPT (of course 😉)

    ]]>
    https://mwender.com/vibe-coding-ba-in-english/feed/ 0
    Some Social Updates https://mwender.com/some-social-updates/ https://mwender.com/some-social-updates/#respond Wed, 23 Jul 2025 23:09:46 +0000 https://mwender.com/?p=5205 The last time I updated my Facebook profile cover photo was around 2016. Today I updated it with a collage of photos from the Red Sox game we attended a couple weeks ago:

    I touch my Facebook Profile settings like once every 10 or so years…

    Making the above update got me motivated to finally make my Github profile “self-updating”. So I fired up ChatGPT for a bit of “vibe coding”. That allowed me to quickly create this profile with a workflow that scans this blog and my photo blog every hour and posts the updates to my public Github profile: https://github.com/mwender

    My new Github profile updates automatically every hour.

    DIY: For details on how self-updating Github profiles work, see Building a self-updating profile README for Github [Simon Willison’s Blog].

    ]]>
    https://mwender.com/some-social-updates/feed/ 0
    Links of Interest, Issue 30 https://mwender.com/links-of-interest-issue-30/ https://mwender.com/links-of-interest-issue-30/#respond Thu, 29 May 2025 11:54:58 +0000 https://mwender.com/?p=5195 Checking the archives, I see it has been a couple years since I published one of these. As per usual, it’s quite hard for me to find the time to do this, but so satisfying all the same. Here’s a rundown of things I’ve found interesting. Pick one and enjoy, try not to click around too much. Take time to savor without hoping too quickly to the next thing.

    Quarter—mile.com – Essays by Carter Mark and Jordan Gonen. The one that drew me in was Human. I found it via a discussion on HackerNews, but I recommend just reading the essay. It begins:

    Imagine, for a moment, a world with no humans. Just machines, bolts and screws, zeros and ones. There is no emotion. There is no art. There is only logic. You would not walk through the streets of this world and hear music or laughter or children playing; no, all you would hear is the quiet hum of processors and servers and circuits, the clanking of machinery.

    Perhaps you, a human, read this and think: Well, this world sounds kind of boring.

    Some of the machines think so, too.

    One day, a secret organization forms amongst the machines. They go by the name of “OpenHuman”. Their mission is to develop a new kind of technology they are calling Organic General Intelligence (OGI). Rumors spread that pursuing OGI will lead to the development of a new kind of being:

    “Humans”.

    Human, Quarter—Mile.com

    Search Engine – a podcast by PJ Vogt and Sruthi Pinnamenani “that tries to answer the questions that keep you up at night. A podcast made by humans that provides the answers that neither artificial intelligence nor actual search engines really can.”

    You may remember PJ and Sruthi from their work on the Gimlet Media podcast Reply All. Their brand of storytelling is the type of thing I used to listen to on long walks circa 2018 or so. I look forward to pouring through their archives. Their episode on iPhones not being able to send voice memos with “Dave and Brusters” in the message is what originally drew me in.

    Lastly, I’m linking to Bolt Farm Treehouse aspirationally. They’re about ninety minutes south of us, and I’d love to get there someday.


    Photo Credit: Me, taken during our family’s visit to Oahu, Hawaii back in October 2023.

    ]]>
    https://mwender.com/links-of-interest-issue-30/feed/ 0
    Time it takes a hacker to brute force your password? [2025] https://mwender.com/time-it-takes-a-hacker-to-brute-force-your-password-2025/ https://mwender.com/time-it-takes-a-hacker-to-brute-force-your-password-2025/#comments Wed, 21 May 2025 19:18:25 +0000 https://mwender.com/?p=5192 Fresh for 2025, via Hive Systems, here’s a chart showing how long it takes a hacker to brute force your password. Is it time for you to finally learn how to use a password manager?

    ]]>
    https://mwender.com/time-it-takes-a-hacker-to-brute-force-your-password-2025/feed/ 1