blog

Is Your Phone the Reason You Feel Broke?


šŸ”— a linked post to nymag.com » — originally shared here on

I won’t argue that smartphones are significantly responsible for America’s sense of economic malaise. What they are is unusually helpful for understanding and interpreting this malaise in common terms. They’re a heightened, sped-up microcosm of the weird, sour vibrancy of the economic moment, little worlds in which participants are both increasingly active and increasingly worried. By most measures, the smartphone economy is booming, and yet it also feels like shit in a way that everyone can feel for themselves, together, no matter what soda they drink.

That’s the thing with creating these cool slot machines that live in our pocket: they’re really fun at first, but once you’re addicted to them, you keep going back even when it’s painful.

That pain hasn’t manifested for me much by way of exorbitant pricing, although I have noticed my subscriptions for things like iCloud storing are increasing.

The way this manifests for me is when my kids look at me and say, ā€œcan you snuggle and watch this episode with me without being on your phone?ā€

I know it’ll hurt, but I gotta make the switch to my Light Phone soon. I’m sick of feeling hopelessly addicted to this dumb piece of glass I’m currently typing on while my kids are playing in the water park in front of me.

Continue to the full article


On Pneumatic Tires


šŸ”— a linked post to scopeofwork.net » — originally shared here on

The invention of the wheel is often put forward as a pinnacle of human ingenuity, but it strikes me that the defining characteristic of modern transportation systems is not the wheel but the pneumatic tire.

I was biking with my kids up to a splash pad earlier this week when I heard a pop beneath me.

I let the kids get splashing while I investigated my bike, and I found that there was a huge bulge in my back tire.

It caused the tire to have such a severe warp that I had to ride home (slowly) with my rear breaks detached.

So it’s fitting that I came across this article in my Instapaper queue explaining the history of the pneumatic tire.

There are loads of good details about tire manufacturing in here, but one of the more surprising things I learned: as late as 1570, the number of four wheeled carriages in Britain could be counted on a single hand.

Reading this article gave me a lot of appreciation for the humble tire, and there’s no doubt I will have one of my favorite Simpsons bits stuck in my head all day.

Continue to the full article


The Mirai Confessions: Three Young Hackers Who Built a Web-Killing Monster Finally Tell Their Story


šŸ”— a linked post to wired.com » — originally shared here on

Early in the morning on October 21, 2016, Scott Shapiro got out of bed, opened his Dell laptop to read the day’s news, and found that the internet was broken.

Not his internet, though at first it struck Shapiro that way as he checked and double-checked his computer’s Wi-Fi connection and his router. The internet.

This is a gripping tale of how a few nerdy kids were able to take down some giant pieces of the internet.

It’s also a story filled with redemption, coming to grips with what you’ve built, and how to atone for pain you’ve caused.

I can’t recommend this long read enough.

Continue to the full article


Home-Cooked Software and Barefoot Developers


šŸ”— a linked post to maggieappleton.com » — originally shared here on

I have this dream for barefoot developers that is like the barefoot doctor.

These people are deeply embedded in their communities, so they understand the needs and problems of the people around them.

So they are perfectly placed to solve local problems.

If given access to the right training and tools, they could provide the equivalent of basic healthcare, but instead, it’s basic software care.

And they could become an unofficial, distributed, emergent public service.

They could build software solutions that no industrial software company would build—because there’s not enough market value in doing it, and they don’t understand the problem space well enough.

And these people are the ones for whom our new language model capabilities get very interesting.

Do yourself a favor and read this entire talk. Maggie articulated the general feeling I have felt around the promise of LLMs within the confines of a concise, inspiring talk.

A friend approached me a few months back and asked me to help him build an app to facilitate a game he likes to play with his friends in real life.

I told him that a good first step would be to experiment first with facilitating the game using good ol’ fashioned paper, and use the lessons learned from that experience to eventually build an app.

A few weeks later, he came to me with a fully baked version of the app in a prototyping tool called AppSheet.

I was stunned at how much he was able to get done without any professional development support.

He’s a prime example of a barefoot developer. I don’t think he has any interest in crossing the ā€œcommand line wall,ā€ but as these tools get more capable, it’ll enable him and scores of others to build software that’ll solve their problems for them.

Helping more ā€œnormal peopleā€ to become barefoot developers is a cause I’d love to be part of.

Continue to the full article


Tiny Awards


šŸ”— a linked post to tinyawards.net » — originally shared here on

Last year, we decided to launch Tiny Awards, a small prize to celebrate interesting, small, craft-y internet projects and spaces which basically make the web a more fun place to be.

We hoped it would be a small contribution to celebrating ā€˜people making stuff on the internet for the fun of it and the love of it and the hell of it’. We were thrilled to see that people seemed to like the idea, so we’re doing it again in 2024 - still tiny, still celebratory, and still (hopefully) helping spread the word about some of the small, personal, whimsical, weird and poetic things people are making on what is left of the web.

Woohoo! Can’t wait to see the shortlist published on July 19th.

Continue to the full article


Some small tweaks to this site

originally shared here on

It's been a while since I used my own website as much as I did during this year's WeblogPoMo. The daily posting routine revealed some small annoyances which made visiting this site a little less fun.

For starters, I haven't redesigned this site since I got COVID back in 2021. 13 year old Tim would have been mortified at how long we've gone without a big redesign.

That's not to say I didn't try! I experimented with (and coded out) nearly a dozen different potential layouts.

The one I had the most fun with was a 90s Memphis style layout where the background elements were independent SVGs that were subtly animated.1

The problem I'm realizing2 is that I'm not a particularly skilled designer. I know what good design feels like, but I haven't taken the time to articulate what good design feels like.

The other problem? Building websites isn't fun for me anymore.

The tools you use to build websites are all essentially the same. There is functionally zero difference between a monolith Rails app running Postgres, a monolith Laravel app running MySQL, a static site generator powered by a Rube Goldberg-ian series of GitHub actions, or a GraphQL-powered React app.

The biggest casualty of choosing to build software professionally is my desire to learn new web technologies.

Instead of forcing myself to sit down and spoon-feed myself a puree in the form of a Next.JS tutorial, I'm leaning into other areas that interest me more.

Offline, that includes fixing up my house and lawn, writing, and being a better parent/husband.

Online, that includes playing with generative AI and sharing more of my thoughts on this blog and in my newsletter.

But even while I'm exploring other interests, that doesn't mean I can just let this site deteriorate and fill up with prickly weeds.

So over the last couple days, I made a couple small changes to this page that subtly improve the user experience. Most of these changes come in the form of discoverability.

When I launched this version of my site, I decided to lean into the linked list style of posting.

This was a great move because it's allowed me to (1) share interesting webpages with y'all, but also (2) make an archive of thoughts and ideas that inspire me.

Earlier this year, I added tags to all my posts. That process is what first made me realize that once I posted something on this site, it was next to impossible to find it again without jumping into a Rails console and searching for it.

Now that all of my posts have tags, I wanted a way to better visualize what topics I tended to think about and navigate through them.

If you visit the main page of this blog, you'll see a section at the top that explains what I tend to write about along with some groups of tags.3

I also made some slight CSS tweaks so the site looks even better on mobile.4

The main page is another source of stress for me over the past couple years.

As previously mentioned, my blog is mostly linked posts, but I do occasionally post longer essays and these shorter posts.

My main page had two separate sections to display my longer posts and my recent links, but these sorts of posts vanished into the ether.

My solution was to display a stream of all the posts along with their tags and an indication if it's a link post.

Like I said: these are small tweaks.

But small tweaks are sometimes all you need. It's important to maintain our virtual spaces.

Just because I'm not inspired to build new websites doesn't relieve me from the obligation to keep it functioning the best I possibly can.

And a positive consequence of these changes? You can expect more shorter posts from me like these!


  1. The problem I ran into was how inefficient these animations were. One of my main goals with this site is to be as energy efficient as possible. I should probably get off Rails and switch to a static site generator to be even more efficient, but this is good enough for now. And I at least didn't make it worse by deploying a big energy vampire that just made some squiggly lines wiggle up and down.  

  2. Maybe "realized" is the wrong word, because I've known I'm a mediocre designer for the past 20 years. "Accepted" is probably more accurate. 

  3. It was a fun exercise to print out the list of 448 tags and pick out the key ones. 

  4. For some reason, I didn't realize that if you have a parent element that honors the dimensions of the screen, but then you have a child element with a max-width tag set that's bigger than that, mobile Safari will just stretch the content of that child beyond the bounds of the parent, causing it to cut off the content on the sides. That is a šŸ’© experience. 


A Link Blog in the Year 2024


šŸ”— a linked post to laughingmeme.org » — originally shared here on

Like many people I’ve been dealing with the collapses of the various systems I relied on for information over the previous decades. After 17 of using Twitter daily and 24 years of using Google daily neither really works anymore. And particular with the collapse of the social spaces many of us grew up with, I feel called back to earlier forms of the Internet, like blogs, and in particular, starting a link blog.

One of us! One of us!

This isn’t a lengthy post, but I damn near quoted the whole thing because Kellan makes great points about the state of information sharing, the collapse of the Web 2.0 social infrastructure we all used for twenty years, and lamenting the fact he doesn’t really consume media from a wide variety of sources (me too, friend).

If you’re reading my link blog here, consider starting one of your own. Make it low effort for yourself, but just start one and stick to it for a month.

I think you’ll find your media consumption habits begin to trend toward higher quality sources of information/entertainment.

Continue to the full article


Defensive and Skeptical


šŸ”— a linked post to david-smith.org » — originally shared here on

Where I have settled in my own work is to strive to keep some meaningful part of my mindset hungry and foolish. To continue to be open to new opportunities and eager to explore them. I don’t want to end up miserly defending what I have already achieved, I want a professional life still rich with tackling interesting problems.

Continue to the full article


ChatGPT is really bad at generating code to interact with GPT-4

originally shared here on

Lately, I've been working on several projects which interface with the OpenAI APIs.

Since this is 2024 and I'm far too lazy to open the official API documentation and write code myself, my first step in generating code is to ask the 4o model of ChatGPT something like this:

Write a Python script which uses the latest OpenAI APIs. I'd like the function to accept a custom prompt and a custom top-k value. It should return the prompt's response.

It returns something like this:

import openai

def generate_text(prompt, top_k=5):
    # Define your OpenAI API key here
    openai.api_key = 'your-api-key'

    # Define parameters for the completion
    completion = openai.Completion.create(
        engine="text-davinci-003",
        prompt=prompt,
        max_tokens=100,
        top_k=top_k,
        n=1,
        stop=None
    )

    # Return the generated text
    return completion.choices[0].text.strip()

# Example usage
prompt = "Once upon a time"
top_k = 10
generated_text = generate_text(prompt, top_k)
print("Generated Text:", generated_text)

Which looks super great, right?

Except when you go to run it in a terminal, you get this:

openai.lib._old_api.APIRemovedInV1: 

You tried to access openai.Completion, but this is no longer supported in openai>=1.0.0 - see the README at https://github.com/openai/openai-python for the API.

You can run `openai migrate` to automatically upgrade your codebase to use the 1.0.0 interface. 

Alternatively, you can pin your installation to the old version, e.g. `pip install openai==0.28`

A detailed migration guide is available here: https://github.com/openai/openai-python/discussions/742

If you paste that error into the chat, it'll respond with this:

It seems like there has been a major update in the OpenAI Python library since I last checked. Let me update the script to use the latest version of the library:

And then it spits this out:

import openai

def generate_text(prompt, top_k=5):
    # Define your OpenAI API key here
    openai.api_key = 'your-api-key'

    # Define parameters for the completion
    response = openai.Completion.create(
        engine="davinci-codex",
        prompt=prompt,
        max_tokens=100,
        top_k=top_k,
        n=1
    )

    # Return the generated text
    return response.choices[0].text.strip()

# Example usage
prompt = "Once upon a time"
top_k = 10
generated_text = generate_text(prompt, top_k)
print("Generated Text:", generated_text)

Notice how it still uses the openai.Completion method!

I've tried prompting it with something like:

You're still using the openai.Completion method. Reference the official up to date API documentation to get the latest call that replaces the openai.Completion method.

And it responds with:

Apologies for that oversight. Let me update the script to use the latest API method based on the official documentation:

And here's the code it generates:

import openai

def generate_text(prompt, top_k=5):
    # Define your OpenAI API key here
    openai.api_key = 'your-api-key'

    # Define parameters for the completion
    response = openai.Completion.create(
        engine="davinci-codex",
        prompt=prompt,
        max_tokens=100,
        top_k=top_k,
        n=1,
        temperature=0.7,
        stop=None
    )

    # Return the generated text
    return response.choices[0].text.strip()

# Example usage
prompt = "Once upon a time"
top_k = 10
generated_text = generate_text(prompt, top_k)
print("Generated Text:", generated_text)

Which, again, still uses the openai.Completion method!

I've noticed this sort of "oops, I screwed up, here's the exact same thing I just outputted" behavior appear more frequently when I use the new GPT-4o model.

If I use GPT-4 and I'm using my ChatGPT Plus subscription, I will still run into the issue where its first response references the deprecated method, but if I inform it of its mistake and provide a link to the official documentation, it'll access the web and try to offer something different. (It still generates unusable code lol but it's at least trying to do something different!)

When it comes to Python and Rails code, I'm seeing that the GPT-4o model is not as good at code generation as the previous GPT-4 model.

It feels like the model is always in a rush to generate something rather than taking its time and getting it correct.

It also seems to be biased toward relying on its training for supplying an answer rather than taking a peek at the internet for a better answer, even when you specifically tell it not to do that.

In many cases, this speed/accuracy tradeoff makes sense. But when it comes to code generation (and specifically when it tries to generate code to use their own APIs), I wish it took its time to reason why the code it wrote doesn't work.


You should write more


šŸ”— a linked post to lcamtuf.substack.com » — originally shared here on

If you’re a painter, you’re still allowed to paint landscapes. Singers are still allowed to sing about love. And heck — I’m betting the first time your critic learned about this particular topic, he wasn’t standing atop Mount Sinai. Knowledge transfer is a vital human activity, and it’s all about synthesizing, refining, and incrementally expanding on what’s been said before.

Here’s a short list of posts I’ve been wanting to write but have chickened out every time I start a draft:

  • How I’ve organized my Plex music library
  • How to pick the perfect karaoke song
  • Ways you can move out of the corporate world and into the startup world
  • Why I stopped reading the news and quit social media
  • How to avoid clickbait articles

Maybe I should force myself to write one of these and publish it with little self-editing.

I made a concerted effort to write more this year. I’ve journaled roughly 98% of the days this year, and I’ve published something on this blog just as much. I even started a newsletter.

I’ve learned a lot about myself thanks to all of this writing. I didn’t realize how much a daily blogging challenge would reveal about my musical tastes. I wouldn’t have been able to identify my feelings without yelling at a journal until my voice became hoarse.

Best of all, writing is proving to be an effective way for me to share what I’ve learned with others. Feeling useful helps beat back the depression demons.

I encourage anyone reading this to write down whatever you’ve been interested in lately and post it somewhere. Share it with me so I can learn with you!

Continue to the full article