RSSAmplifier

Blog

Jason Scheirer on the Internet on Jason Scheirer

Recent content in Jason Scheirer on the Internet on Jason Scheirer

jasonscheirer.comRSS feed ↗81 posts

Latest posts

A Revival of Sorts: Getting my iPod Classic 7th Gen Working Again

I’ve been very happy with my Y1 MP3 player over the
past 9 or so months. I take it with me everywhere! It’s a companion on my
commute, it’s a focus tool in my open office, it’s a way to have a
single-purpose device that doesn’t have the distractions of my glass Everything
Rectangle and, as the phone ages, a way to mitigate its now-horrible…

xteSTINK: A command-line utility for doing things to the Xteink X4


 Top Matter :
 Codeberg for the library ,
 doc for the library . 
 
 I bought an Xteink X4 ! It’s small!
It’s cheap! It’s hackable! 
 I have an e-book collection, if you could call it that, but I always purchased
PDFs. This thing reads epubs by default, which I don’t have. I want to use this
to read my books! 
 So I’ve been…

Saddle Creek: Add Out-of-Band Metadata to PE Executables


 Top Matter :
 Codeberg for the library ,
 doc for the library . 
 
 I took the one part of the shuttered
 Omaha open source project by Google and I’m
making it a library I can consume elsewhere. That is all. 


Golang Webview Installer for Wails 3


 Top Matter :
 Codeberg for the library ,
 doc for the library . 
 
 I’ve forked
 Lea Anthony’s library that
eventually
 made its way into core Wails 
for two reasons: 
 
 I want it in Wails 3 and it’s not there 
 I want to shave a meg off the binary size by not providing the embedded
installer exe 
 
 So here we are.…

Eleven Years in the Bay Area

February 8th of 2026 marks the tenth anniversary of me moving to the Bay Area to
work for tech startups. I didn’t quite have much to say about the tenth year so
I held off. 
 I’ve been here long enough that it’s no longer a temporary sojourn. It’s not a
step. It’s a quarter of my life and even as I’ve stepped forward I’ve managed…

Steam on non-Conventional Desktops (Niri)

I’m trying out Niri ! You know how I
 encourage getting used to the defaults ?
Well
 I’m not following my own advice !
I’m using it with
 Dank Shell 
too,
 also ignoring my own advice ! 
 Anyhow! One liner! If Steam isn’t working do this: edit
 /usr/share/applications/steam.desktop and change the Exec= line to this: 
 Exec = bash -c…

Ollama on Fedora Linux on a Battlemage GPU

My motherboard was dying and the Nobara project 
hates old GPUs, so I recently upgraded my middle-tier mid-2020 Prebuilt Costco
Gaming PC for a middle-tier late-2025 Hand-Built Gaming PC! 
 I mostly went with a pre-picked set of options that Newegg had suggested,
removing the storage and RAM (I had fortunately just bought 64 GB of DDR4 in
August and replaced my SSD in…

Learn To Live With The Defaults


 Every deviation from default is slowing you down from getting started and
making it harder to help others. 
 
 I use about 5 distinct laptops/desktops on an average day, not to mention the
VMs within them and other machines I shell into. Having a consistent experience
is useful, but equally important is my ability to roll with the punches and get
productive on a new…

If Your Electron App is "Just A Browser Wrapper" You're Doing It Wrong

Having spent the last 6 months working on
 an Electron app full-time , my Stockholm
Syndrome has kicked in and I’ve come around to it. 
 It’s easy to disparagingly refer to an Electron app as bloated, or a crappy
wrapper around a web app. This is lazy, reductive thinking that travels well in
short-form media like TikTok and Elon Musk’s 𝕏: The Everything App .…

A Series of Vignettes From My Childhood and Early Career

A short set of anecdotes, apropos of nothing. 
 The Death of Software Engineering as a Profession 
 When I was younger, I really liked programming! I loved the sense of
accomplishment, I loved the problem solving, I loved sharing what I made with
the people around me to both amuse and assist. 
 One particularly wise adult (somewhere around 1996) took me aside and said,…

The Innioasis Y1 Music Player

Introduction 
 I’ve been enjoying standalone MP3 players lately! The
 Innioasis Y1 kept coming across my
radar, I like the form factor, it was $50. 
 What the heck, why not. 
 And Then 
 The community for this thing is insane , it’s just as active as the people
doing weird things with my RG35XX . It’s really cool seeing so
many people doing neat…

The Shanling M0s Music Player

Introduction 
 My Shanling Q1 died after a couple of years of heavy use 
and I think it was probably fixable with some soldering but I don’t have time
for that. 
 In a rush, I bought an M0s not
reading the page and thinking it was the higher-end
 M0 Pro , but ultimately this was not a big
deal! 
 Usage 
 This still works like the Q1: it has a custom…

What You Do and Who You Are

Similar to The Wrong Conclusion is another cognitive
anti-pattern: in the pursuit of identity we see ourselves as being something
as an inherent quality of ourselves versus doing something as a role, a
quality being temporarily practiced. This can lead to bad behavior on our part
and it limits our ability to grow and engage in introspection. 
 I have this hard-won lesson over…

I Don't Like that I Like Starship


 I have
 my seed Starship config 
up as a Gist. 
 
 Starship is a tool that frustrates me because it seems
so bikesheddy and unneeded: a custom prompt manager. We already had shell prompt
customization! I blindly install oh-my-* on new machines for prompt
customization! And Starship is written in Rust. People just use Rust to be cute. 
 Then I realize that…

There and Back Again: My Journey Into (and out of) Tailwind

I’ve been using the Tailwind CSS Framework for about
two and a half years (as of July 2025) for my personal projects, and I used it
professionally in my time at unstructured as well.
In all, I think it’s a good thing. However, I don’t find myself thinking I’d use
it for new projects at this point: I believe I have outgrown it. Here is a short
story.…

Here's The Interesting Part


 For the 500 lines of boilerplate, what are the five truly interesting lines
that solve the problem ? 
 
 In the course of my problem solving, especially when I am solving a problem I
think shouldn’t be hard , I think back to the
essential core of the problem 
 Typically a fix is a couple of API calls or a single clever data structure. 
 As a consequence of…

This Shouldn't Be Hard


 As you are working your way to the goal, you should be able to be clearminded
about how you aim on getting there and when you are slowed down for silly
reasons do not accept them as excuses. Say to yourself, “I know what I need to
do, it shouldn’t be this hard.” 
 
 Overall, you should be working toward writing functional code that achieves a
goal.…

Chains: My Attempt at an Itertools for Go


 Top Matter :
 Codeberg for the library ,
 doc for the library . 
 
 It’s been six months since I’ve done this, but I’m finally writing about it! 
 Go recently added proper iterator support 
to the language, which is something of an improvement over the prior pattern of
spinning up a goroutine and communicating via a channel in a range to get…

Hate What You Know


 You should be familiar enough with your tools to be able list critical things
about them, even though they’re what you still choose to use every day. 
 
 The title Hate What You Know is admittedly vague, I know! There are a handful
of directions I’ll go with it, bear with me. And at least to some extent I don’t
mean “hate,” I just mean…

Kicking the Tires on Harper

I’m trying out the Harper tool
 in VS Code . 
 I’ve been aware of its existence for about 6 months and didn’t think much of it,
just another rehash of existing tools. 
 But I’ve come around to the idea that rewriting old tools isn’t a horrible
notion: the people who crafted them were no smarter or dumber than ourselves,
they were just before…

The Wrong Conclusion

A common pattern I have come to recognize everywhere as an anti-pattern: 
 
 Person starts a dialogue establishing a problem, upon which we all agree 
 Person continues on down the same line of conversation, outlining a solution 
 Person comes to a conclusion which is a call to action 
 
 I see this a lot because step 1 seems to short-circuit the thinking behind…

Throw your Team a Bone


 You like little treats , so do other people! Sometimes you
gotta give your peers something to make them feel good too. 
 
 Sometimes this is called
 the hairy arm technique ,
sometimes it’s a manifestation of
 Cunningham’s Law .
What you do is this: present something obviously wrong or easily correctable
when you make a presentation. This lets the…

Give Yourself Little Treats Sometimes


 Palate cleanser tasks are morale boosts 
 
 I’ve found that my productivity varies wildly based on the time of year, the
phase of the moon, my mental state, the quality of my morning shower thought
session, and how enthusiastic I am about what I’m working on . 
 I like to give myself “little treat” issues occasionally to keep my motivation
up:…

A Children's Treasury of Critiques and Concerns about the Current LLM Hype Cycle

We’re a couple of years into the LLM hype cycle and the volume at this point is
 deafening . I use LLMs, and I find them interesting, and they have played a
major part of my professional life for the past two and a half years. 
 That said, I can’t declare them an unqualified success or a miracle cure for
anything. I approach them with a combination of skepticism and…

You Need to Break the Rules


 Over the course of your job, you are going to need to operate outside of the
range of your defined permissions and responsibilities. 
 
 You should do this sparingly and secretly . You should be able to operate
outside of the system when you need to, and you need to know how to do it in
non-obvious ways so you don’t get your escape hatches taken away from you. 
…

Passively Transparent


 Nobody should have to ask what you’re working on. You should leave an
obvious, loud trail. Encourage this pattern in others. 
 
 One thing that is important to me as an engineer that I don’t think I’ve seen
put in writing is something I have distilled into the term passively
transparent . 
 It should be obvious to the people in leadership what is…

Be An Iceberg


 Be overprepared. 
 
 
 
 
 


 
 As the phrase goes, don’t let your mouth write checks your ass can’t cash .
Send along curated information that is a good summary of what you are doing, but
be able to support it with research, opinion, or buy-in when pushed. Reveal
enough to convey that you are a force, but do not reveal everything…

Tools I Use to Live My Glamorous Life

Development 
 Languages/Technologies 
 
 I do most of my personal dev projects in Go 
 Over the last 3-5 years, Typescript has become the dominant language I use at
work 
 I am primarily a Python expert (25 years!) 
 I am primarily a FastAPI user, and I am
better than average at doing async programming (which sucks and is bad, but
it’s fun to do bad…

Classicube at Work

Problem Space 
 At my new job , my new team engages in a team
activity: every other week we get together for 30 minutes to play a game
together online. We’re mixed hybrid, meaning about half of us work in office and
half of us are grandfathered/exceptioned in to working remotely. this means we
can’t play a board/card game in person, but has to be procurable over…

Trying out PaperWM

I’m an enthusiast of playing around with different window management schemes. I
like the idea of a tiling window manager, but I’m not smart enough to ever get
really productive in something like i3 or sway. 
 for the past few years
 I’ve been using Rectangle on MacOS as something
of a band-aid 
 I’ve been using
 the Tiling WM Extension ion Gnome…

A Practical Guide to Self-Hosting a RAG


 Post Contents 
 
 
 Introduction 
 
 Goals 
 Anti-Goals 
 First Things First 
 
 
 Retrieval-Augmented Generation 
 
 What The Hell is a RAG? 
 What does this mean? 
 
 
 Case Study: The Dumbest Possible Person in the Room 
 Getting the Data 
 
 A Eulogy for wget 
 Enter Playwright 
 Our Playwright Script…

Job #1 of Codebases is Onboardability

I got my first job as a software engineer in 2000, so in 2024 I’m pushing a
quarter century of being a developer. This is one of the topics I have begun to
hold near and dear to my heart. 
 Software engineering is a team sport. If you’re not setting new players up for
success, you’re not being the best teammate you could be. Supporting others is
just as…

Framework Syndrome: Solving Software Problems by Not Solving Them

A common antipattern I’ve been both perpetrator of and victim to is what I
describe as Framework Syndrome . This is the act of writing software that does
not solve the inherent problem at hand, but provides a poorly designed scaffold
in which one is expected to eventually “fill in the blanks.” That is, in the
absence of the ability or desire to make the code do…

I'm Not Participating in This Year's Advent of Code For Very Good Reasons

I’m exhausted. I’ve been guilted/peer pressured into participating in the AoC
for at least 5 years. I’m tired, I’m defeated, I’m unable to meet its weird
expectations consistently and still I remain a competent software engineer. 
 I’m not participating in his year’s Advent of Code. Every year I try and get
stymied by day 14 of so because…

Keeping Alive With Long-Running Sync Work in Python

In my previous post I wanted to run a
keepalive green thread on the wide while doing work to let the coordination
framework (in this case just a plain old Postgres database) which workers were
around and still processing work. 
 Now, I have a long-running block of synchronous code. 
 Herein lies the problem: synchronous code does not play nicely in the async
event loop. It…

Registering Signs of Life in Long-Running Async Jobs in Python

At work I’m currently working on a fairly large system in which we have a pool
of greedy workers, of unknown size, which can opt it at any time to the flow of
work. 
 A job is considered abandoned if it is marked as IN_PROGRESS but the worker
who has claimed it hasn’t phoned home in sone amount of time. 
 The project is async, which makes things bot more and less…

2023: Linux on the Desktop This Year

I have a Gaming PC I bought from Costco when my wife told me “I should maybe get
back into my old hobbies” in the summer of 2020. It came with Win10, which is
fine and it’s probably good to have at least one Windows machine in the house at
any given time. 
 The thing is: Windows is annoying . Every time Windows ran an update I had to
run
 a third-party…

Hardware review: Anbernic RG35XX

Wanting a small, pocketable handheld for bus rides, etc., I saw the
 Miyoo Mini and attempted to
purchase one. They are incredibly hard to acquire. 
 The Anbernic RG35XX presented itself as
an alternative, and it was actually possible to buy one. 
 I got one for about $60 on Amazon and was immediately in love. It had a decent
built in game library, decent battery life, and…

VS Code: Dark Terminal on a Light Theme

I’m a weirdo: on my IDEs I prefer a light theme, having used light themed IDEs
since time immemorial (still miss using Visual Studio regularly). But I prefer
white on black for my terminal emulators, as I have used that since time
immemorial and a black on white terminal window doesn’t feel like a serious
thing. 
 So here’s what I added to my settings.json to…

Hardware review: Devterm

I bought a Devterm a couple of years ago
and it’s mostly been sitting in a drawer. 
 The good 
 
 The thermal printer is novel 
 The form factor makes it super portable 
 
 The bad 
 
 OS support is not great, at one point I built my own Raspbian image because
the official one had drifted so far out of date that the apt repos stopped
working 
…

Hardware review: 1st Gen SteamDeck (512GB)

I bought a Steam Deck . I was on a waiting list
that said I wouldn’t get it until this year (2023), but it arrived in
October 2022. 
 This thing is so versatile thanks to its Desktop Mode. For games like the boomer
shooters I so love, I can dock the Deck and play with a mouse and keyboard and
nicer monitor. I can install Flatpaks. 
 The gaming experience is bar none…

Hardware review: AOKZOE A1

I kickstarted the
 AOKZOE A1 
when I was utterly convinced that I would never get a Steam Deck. 
 Joke’s on me; the Deck arrived before the A1. 
 I primarily use this system as my sole Win11 machine, so it does a lot of light
desktop work. It is also my “travel” laptop; when I’m travelling I take this and
not my Steam Deck. Everything is tunable, but…

Hardware review: iPhone 13 Mini

I’m not going into specs or specific details on this device. I was on an iPhone
XS, which has slowly been degrading over time. Battery was slowly dying,
replaced it at the Apple Store, the ribbon cable for the display was not
adequately clipped back into place. It was easier to just order a new phone than
to take the bus up to Emeryville again in the middle of the day for…

Mixed Async code in Sync Python: Disappointingly Simple

One thing I love about Python’s practical approach to type annotations and
enforcement is that it’s gradual: you can rapidly code a large ball of mud and
get it working, then refine it to make it safer with typing later on. 
 Chalk this up as another good idea (possibly by accident) for Python: you can do
the same with async. 
 At work, someone lamented that threads…

The Anime Watcher: Another Game

I wrote another game game for a
 Weekend Game Jam with an Anime theme . 
 A short bit of interactive fiction. 
 It’s Webassembly using ebitengine . 


 Play The Anime Watcher on itch.io 



Modern Python: New Features, Better Code


 I wrote a blog post
 that is now on my employer’s engineering blog 
(never mind, it’s gone). 
 Put the body here again since they clobbered the old blog with actual
engineering posts to AI garbage. 
 
 Introduction 
 In the time I’ve been at EasyPost, we’ve been putting continuous effort into
making sure our code stays up-to-date to…

A Case for Match

The Python 3.10 release includes the
 new match statement ,
which superficially looks like the case / switch statements in other languages
but semantically is closer to pattern matching in
 Haskell or
 Rust . 
 Like the
 walrus operator *,
I struggled to find a use case for this and it seemed like a feature that was
added just because the language is 30+ years…

Python as a Language is Inescabably Coupled with its Implementation Part 2: The Tracer

I was recently discussing some dumb Python tricks at work with some colleagues
and showed them
 this old Gist I wrote , which in
modern times I would rewrite to look like this: 
 import functools 
 import inspect 
 import sys 
 
 
 @functools.lru_cache 
 def getlines ( filename ): 
 with open ( filename , 'r' ) as file_handle : 
 return tuple (…

Trump Run: A Game

I wrote a game inspired by
 a tweet a coworker
shared on a work Slack channel a few weeks back. 
 It’s Webassembly using ebitengine . 

 Play Trump Run on itch.io 



Little Guys! A Puzzle Game Without Enough Levels

I wrote another small puzzle game for a
 Weekend Game Jam with the theme Colors . 
 It’s Webassembly using ebitengine . 

 Play Little Guys (A Puzzle Game) on itch.io