Claude Built Me a Markdown Reader

Core to my effort to improve this blog and my writing more generally is a better revision process. I now use tools to catch mechanical errors or to point out when I’ve slipped into passive voice accidentally, but that doesn’t address the flow of prose, the feel of the words washing over the reader. Reading out loud is a superb way to improve, but I’m not always in a position to do that.

So, last year, I built an Apple Shortcut that takes a Markdown file and converts it to an MP3 read by a premium Apple text-to-speech voice. This was fine, but clunky. I couldn’t easily adjust the reading speed, and finding the start of some paragraph to revisit meant scrubbing through an audio file. In short, I rarely used it.

After determining no simple app exists that had my basic criteria—Markdown editing and preview, ability to use built-in voice models, variable reading speed, and the ability to select a paragraph to read—I blindly threw the problem at Claude.

It did a fine job on the first try, generating an HTML file with an embedded script that, in total, was only around 15 kB. The only issue was that it couldn’t find the premium “Zoe” voice I knew was available when I opened the file in Safari—Claude’s recommendation. When I instead opened the file in Firefox, my browser of choice, everything clicked.

Then, we had ten minutes of quick iteration. I requested:

  • A way to start progress at a (somewhat) arbitrary point in the text file. Its solution was to allow each paragraph to be clicked, and the voice would begin reading that selected paragraph.
  • Simple menus to select the typeface and font size for the editor and preview windows.
  • A dark/light theme toggle.
  • A setting to adjust the paragraph highlight color in the preview window. It had defaulted to a rather aggressive yellow.

Here’s the final result.

A screenshot of a web application. The left panel is a Markdown editor; the right panel is a preview window. The text describes what this application does: You can insert Markdown in the left, and start a text-to-speech model reading the text. You can select a specific paragraph from the preview window to begin reading from that point. There are options for typeface, font size, highlight color, and dark or light theme.

Claude capably handled everything, and given my lack of large-scale programming knowledge, I was shocked it managed to build this using only the chat interface. I began this project assuming it would be my first opportunity to use Claude Code. I guess I’ll need to imagine something more ambitious.

You can access the Markdown Reader HTML file here, and follow instructions for getting the Zoe premium voice on macOS here.

State of the Blog 2025

Stephen Hackett briefly discussed some changes to 512 Pixels on last week’s episode of Connected. Some of those thoughts temporarily live on his Now page. Here’s the main thrust:

… my hope is to have fewer — but more meaningful — things in the RSS feed in 2026.

He also mentioned putting this on the Now page rather than in a separate post because he can’t bring himself to blog about his own blogging. Few people read my site, so I have no such reluctance.

Continue reading “State of the Blog 2025”

NaNoWriMo 2025 Recap

I thoroughly failed this year, but I learned two connected lessons:

  1. I will always have distractions from writing.
  2. Writing projects require consistency.

Distractions in life are a given. Friends and family visit us, we go visit family, people randomly invite us to some local event, and unexpected projects appear. My own hobbies distract me from my other hobbies. So much can demand my time and attention, and I have to prioritize where to place my effort.

This November, I consistently chose to spend more time with family. We either had family visiting us or were visiting family for half of the month. While I worked hard to keep my novel attempt relevant, it eventually became unsustainable to achieve the required average pace to “win” NaNoWriMo. Because it’s a goal-oriented project, there’s a tipping point at which inspiration to work harder becomes a sense of hopelessness. I quit my novel around November 20th.

“Quitting” is an awful mental frame, though. What I actually did was accept that there was no way to write fifty thousand words—an arbitrary goal to achieve in a month—without sacrificing sleep and mostly writing gobbledygook. Because I began All These Things Are True with no preparation and little intention of writing a novel this month at all, it was intrinsically linked to November and NaNoWriMo. When I accepted failure in NaNoWriMo, my first instinct was to quit the book altogether. But that’s not how writing works. It takes time and consistency. I can’t sustain the 1,700 words a day necessary to “win” NaNo while writing something I can iterate on and be proud of. While I’ve achieved those fifty thousand words a few times, I never felt my writing improved from the effort. If I’m going to put my head down and craft a new world, explore characters, I should come out the other side having accomplished something beyond hitting a word count.

One thousand words a day—thirty thousand words in a month—is achievable without dramatically sacrificing other parts of my life. When I choose to write a novel, not because it’s part of a month-long sprint but because I have a story I want to tell and characters that compel me, I will do so at an appropriate pace. Consistency is important, and the base idea of maintaining a floor of words per day is useful, but it must be realistic.

I don’t know whether I’ll continue the core plot of All These Things Are True, pivot the story elsewhere, or begin a new project the next time the novel-writing bug hits. That’s not important compared to refining the process that works for me and maintaining engagement with my writing. My blog requires the same attention. There’s a tangible quality difference between posts I write in an hour because I need to get something out the door this week, and those I noodle over for a while as I consider their structure and proofread the final result.

Writing is tough. The older I get and the more experience I gain, the more I understand my own shortcomings as a writer and find new ways to improve. I’m not as fearless as I used to be, but the naivety of youth, while admirable, doesn’t yield better results on its own. It still requires the quiet, calm, consistent refining hand of experience. While I don’t literally subscribe to the adage of write drunk, edit sober, there’s something on the fringes of that idea I could take: write wildly, edit wisely.

Bird by Bird, by Anne Lamott

The secret to writing is never held in a book explicitly about writing. Rather, it’s in the collective hours and thousands of pages spent reading anything one can get their hands on. It’s in the act of noticing how an author’s actions work, of forming opinions about whether a bit of prose succeeded in accomplishing its goal, so one can determine whether it’s a new tool to emulate or an ineffective path to avoid. Then, it’s in the act of writing. Of joyously beginning with a clear approach, then hitting heads against walls, falling into despair, becoming convinced the whole effort is worthless, and coming out the other side with a workable bit of narration. Do that over and over, while also reading, while also exploring the world, and one may just become a writer.

Yet, books on writing are still good for greasing the skids, pointing writers in the right writing direction, and providing necessary inspiration. Bird by Bird is one such lovely option for receiving a dose of reality from a working writer who believes in straightforward hard work and consistent effort, while acknowledging how easy that is for her to say when we all know there are long, drawn-out moments where writing is a slog and the worst feeling in the world. Reading Anne Lamott’s evening writing course, consolidated into a snappy, humorous book, is why I decided to try NaNoWriMo this November. And while that hasn’t gone exactly as planned—stay tuned for more next week—I’m grateful that I came across a book that spoke to me, one that I can return to for a nudge or a slap on the back or a bit of commiseration.

Local LLM Thesaurus

It’s always more fun to work on something other than what I should explicitly be doing in the moment, so ideas and small projects naturally arise from procrastination. I was having trouble returning to my NaNoWriMo work after my sisters visited last weekend, and I took fifteen minutes to learn how to locally run an LLM.

My ninety percent use-case for LLMs is word refinement. While writing I will get a word stuck in my head, the wrong word for the exact feeling I’d like to describe. So, I tell some LLM (often Claude) to provide several more synonyms with varying connotations. This doesn’t rely on having up-to-date knowledge or internet access, so a nimble, offline, and local LLM would fit the task perfectly.

Somewhat ironically, I used an LLM to help me sort out what to do. It turns out this is a well-trod path. Here were my steps on my MacBook Air.

  1. Use Homebrew to install Ollama.
  2. Install my chosen model. I opted for mistral, so in a new window, I run ollama run mistral. Once it installs the first time, you can exit the instance.
  3. Run the Ollama server using ollama serve in my terminal. I leave this running.
  4. Install the app Enchanted from the Mac App Store. It’s a free project designed to provide a modern front-end to your local LLM instance. This just worked for me without any setup. It automatically detected my local Ollama instance.
  5. I used Enchanted to create a “Completion” in their app, allowing me to create a shortcut to run with a few key strokes. I select a word, and my completion appends that word to the query: “Give me some synonyms for this word with varrying connotations: text inserted here“.

That’s all it took. I had a local model running in fewer than fifteen minutes. I don’t need to pay for anything, and it perfectly fits what I need most of the time.

My 2025 NaNoWriMo Plan

NaNoWriMo, the organization, is on the ropes, or perhaps entirely dead, after a change in focus and an AI-related public relations snafu. None of that affects my plan for participating in the core of the event: writing at least 50,000 words in a month.

I initially wrote this post with the intention of delaying NaNoWriMo until February. This November will be hectic: I’m transitioning roles at work, we have visitors for two long weekends, followed immediately by a trip home for Thanksgiving. The likelihood that I will write 50,000 cohesive words in November is slim.

That’s not the point.

As I sit here on October 31, watching World Series Game 6, and coming across the NaNo 2.0 site, I’m inclined to go against my better judgment. NaNoWriMo is about the joy of creativity, about pushing oneself to find the thrill of a terrible first draft, of freely exploring a new world with a cast of characters that grow with you during a month of hectic composition.

A benefit of revisiting morning pages is that I already have a loose habit of writing in the morning. Sure, it’s a stream of consciousness, but I’ve made that time available.

And here’s the other thing: attempting it in November doesn’t stop me from focusing on writing again in February. Maybe I’ll start another new project—they’re fun and exciting and full of potential!—or maybe I’ll finally sit down and seriously tackle editing and rewriting my promising beginnings. This is a hobby; I do it for fun. None of this matters except insofar as I find it engaging and fulfilling.

So, let’s do NaNoWriMo again. You can find my progress on my NaNoWriMo page, per usual.