The Autodidacts
banner
curiositry.www.autodidacts.io.ap.brid.gy
The Autodidacts
@curiositry.www.autodidacts.io.ap.brid.gy
get your answers questioned

🌉 bridged from ⁂ https://www.autodidacts.io/, follow @ap.brid.gy to interact
And also, how to restore from my backup with similar single-keystroke efficiency
TIL how to accidentally overwrite a decade worth of data in LibreOffice calc
As I have mentioned before, and will surely mention again, I’ve been keeping track of the books I read for my entire adult life, and my books spreadsheet is dear to me. Each year, I add a new sheet, because I’ve accidentally shifted the columns a few times, and it was rather difficult to piece back together. When I want to search across all the books I’ve read, I have to select all the sheets first. Recently, I was perusing data from over the years, to confirm or falsify a hypothesis for an essay. (The fact the essay was never published says all you need to know about how _that_ went.) I discovered something strange: every year, going back to 2015, the _fifth_ book I read was the same: _The Millionaire Next Door._ _(I hadn’t particularly enjoyed the book; I found it repetitive, and barely bothered to finish it at all. But it did change my relation to frugality. In fact, the trio of that book, The Psychology of Money, and Mr. Money Mustache’s posts completely transformed my spending and saving habits.)_ Obviously something horrid had occurred. I soon guessed what: **when all sheets are selected, entering data into a cell enters it into that cell in every sheet.** And since I search much more often than I add data, I usually have all sheets selected. When you type or paste, there’s a warning, but it looks the same as the warning when you’re overwriting a single cell: not concerning. What actually happens is ... very concerning. Let me show you: 0:00 /0:20 1× Fortunately, I had a backup. I tediously manually restored every row that had been overwritten. Except 2024. My backup drive had run out of space, and I deleted my backup from 2024. To this day, I do not know with certainty what was the fifth book I read in 2024, when I read it, or what I thought of it. I just know it wasn’t _The Millionaire Next Door._ Then, later, I found _another_ cell that had been overwritten. My review of _The Mom Test_ by Rob Fitzpatrick had been pasted into the review cell for every book in row 21 going back through time: a book by a Buddhist Rinpoche, a book of Sufi poetry, a Spanish easy-reader children’s book, books by Ursula K. Le Guin, Ted Chiang, David James Duncan, Frank Herbert, O’Henry, Truman Capote, James P. Carse... I put the restoration process on my todo list, but I wasn’t looking forward to it. Today, I learned good news: not only is it easy to overwrite every sheet in LibreOffice calc by accident, it’s also possible to paste data _from every sheet_ , _into every sheet —_ even if the values in each sheet are different. I think of it like operating a hole punch on a stack of paper. One little disc will say a, the next b, the third c, and so on. Then you can punch a different stack of paper with the same number of sheets, and swap the pellets. Watch: 0:00 /0:25 1×
www.autodidacts.io
February 16, 2026 at 6:12 AM
Bootstrapping mitochondrial function one flax seed at a time
Taking responsibility for my energy levels
Every so often, I feel tired all the time. If I’m lucky, and I _notice_ that I feel tired all the time, I make a point of reviewing the things I’ve learned from the likes of Lyn Alden’s article on energy and Ari Whitten’s Energy Blueprint series of lectures. According to many pundits, weak mitochondria = lower energy. Whether or not this is true, many of the activities that health pundits recommend make me feel healthy and energetic. This may be the placebo effect, but I like the placebo effect too, so it’s not a big deal if it is. Since “energy” is pretty subjective anyway, if it _feels_ like they work, might as well do them! ### Health So much has been written about this, I’m going to mostly just breeze over this section. It also tends to be pretty specific to the individual. For me, it means: 1. **Get enough sleep**. I default to 9 hours, which is an hour or two more than most people. * To do this: a dark, quiet environment (earplugs help, and an eye cover); a strict caffeine cutoff; no late screentime; enough time to wind-down reading/writing before bed; avoiding eating late in the day. 2. **Get enough exercise** * For me, this means going for a run ~3 times a week (~1,500 kilometers per year), walking most of the days I don’t run, and whenever possible riding my bicycle instead of driving. I’ve heard that though cardio is great, strength/resistance training is as or more important for energy and longevity. Kettlebell swings are the least horrible-feeling form of strength training I have found, so I do them ... intermittently. 3. **Eat well** * For me, this means a vegetable-based diet of unprocessed foods, with some fish, enough protein to rebuild from long runs, lots of fibre and healthy fats, and small amounts of whole grains. 98% home-cooked, from scratch. I find it’s especially helpful to eat a high protein and or high fiber breakfast, because it tends to help me feel satiated for the rest of the day and avoid snacking on junk food. In my case, this is usually whatever vegetables I can find, sardines or salmon, eggs, or DIY zero-sugar chia + hemp cereal with milk or yogurt (often with almost a cup of chia/hemp/ground flax) ### True rest Few things are more draining than passively slacking off: it makes me feel guilty for not working, without being true _rest_ that restores my health and energy. When I feel tired, I ask myself, am I still trying to accomplish something? Or am I trying to rest? If I’m still trying to accomplish something, then it’s not time for doom-scrolling. If I’m trying to rest, it’s also not time for doom-scrolling. It’s time for resting. There are very few things that are fully restful, and the main one is fully resting. For example, lying on the couch with my eyes closed, trying to nap and knowing I won’t, but still feeling relaxed. Sometimes, it’s necessary to actually rest like this. Often, switching activities or going for a walk or doing something totally different, preferably away from a screen, is as effective as true rest. For the kind of tired that I tend to feel, running is more restful than sitting on the couch using a computer. ### Connection Connection includes things like hanging out with people I care about, or writing emails to nifty strangers on the internet, but also things like listening to Beethoven or appreciating other art that makes me feel connected to the whole. * Practice gratitude * Bask in Sonder * Do something nice for someone ### Challenge **Pushing my edge.** I feel most alive when I’m working on a new project that pushes my skills, and or when I’m around new people who I haven’t yet got to know and become comfortable around. **Hormesis.** Going for ice-cold swims in the ocean makes me feel very alive. And, although hypoxia can be dangerous, there’s a recent fad of intermittent hypoxia training. Fasting also belongs in this _feel bad to feel great_ category. I’ve also noticed, paradoxically, that sometimes (not always!) I feel most energetic on days when I went for a 20k+ run in the morning. **Status and self-respect.** Success can’t be planned, but I find that if I take on the right challenges, usually some of them pay off and make me feel competent and like I’ve accomplished something. And feeling like what I’m doing is worthwhile and effective has more effect on my energy levels than everything else. _Side note: a modest dose of stereotypical self-help and success literature does seem to help. The book that had the most striking effect on my energy level, even though I found it obnoxious, was High Performance Habits by Brendan Buchard. I had also just done a 5-day water fast, and a lot of running, so there may have been confounding factors._ ### Conclusion When I feel tired or generally poorly it’s easy to just feel disgruntled, and be aware that I’m tired and feeling poorly, but not do anything about it. But if I can set-up a habit trigger, _when feeling poorly, automatically do X_ , where X is an of the above activities that increase my energy level, I can bootstrap my way to a more energetic and joyful state. ****Note:**** this post is part of #100DaysToOffload, a challenge to publish 100 posts in 365 days. These posts are generally shorter and less polished than our normal posts; expect typos and unfiltered thoughts! View more posts in this series.
www.autodidacts.io
February 16, 2026 at 5:15 AM


At a certain point in my life it dawned on me that other people are people too.

That guy bent over with Fentanyl? A whole world: boyhood, rites of passage, dreams, regrets, memories, crushes — the works.

The evil billionaire? Old wounds, sincere beliefs, time with grandchildren — playing […]
Sonder is a word I like
At a certain point in my life it dawned on me that other people are people too. That guy bent over with Fentanyl? A whole world: boyhood, rites of passage, dreams, regrets, memories, crushes — the works. The evil billionaire? Old wounds, sincere beliefs, time with grandchildren — playing Legos — staring at the trees in the mist out the window through the coffee steam and wondering wordlessly what it all means, what it adds up to. Fond memories, perhaps, of watching Star Trek or Star Wars or playing on the beach or in the snow. Doubts if a 1-billion donation will be enough to make them feel like a good person — a generous person. The woman who is so pretty but doesn’t seem to realize it, who I’m trying not to stare at too much — but not totally wholeheartedly, because, c’mon, look at her! She might have a terrible stomach ache, and be thinking about whether she will pass her biomedical exam. She might be mulling over the chapter of Montaigne’s essays she just finished, which was vulgar and about farts, but he did have a point. She smiles, then remembers the gap in her teeth, which reminds her that she’s getting fat and should lose a few pounds. And maybe she should pivot and work in AI safety because will anything else matter if she doesn’t? She sees an adorable kid walk by, which triggers an ache because she wants to have a family. With Thomas. But she doesn’t even know if Thomas likes her like that or is just being friendly. He hasn’t responded. Is he okay? But also having kids is so expensive, how could they afford it? The boy who walked by is not just ‘a kid’, or even an ‘adorable kid’. He’s Adrian, with a rich inner life of his own. He’s thinking about the cranky pirate from Swallows and Amazons, which he’s reading because Mum won’t let him use the iPad after dinner. Captain Flint is so funny. His chest is full of feelings that he doesn’t have names for that stretch his ribs outward. He picks his nose idly while thinking about Napoleon. The writer writes and wonders if he’s any good, if anyone will read it, if he’s blowing smoke and putting on airs. But there’s something here, isn’t there, yearning to be born, if he can get the forceps on its head and pull, and remembers to cut that metaphor when editing. Maybe a nifty person will read his blog and write in. Maybe he’s just trying to feel important. Is it working? It’s hard to tell. The reader is busy, and probably wasn’t planning to read this. Maybe breakfast is burning or the flight boarding, or sleep waiting for the glowing rectangle to go away. The main thing the reader notices is that it’s all made up. The inner lives are fake! They can tell, because this never occurred to them. All these rich inner worlds all sound a lot like the author’s fantasy about what other people are like. Because, they are … barring 100th monkey divine intervention. And yet, there’s something intriguing about the botched attempt. The reader reads on, hoping to feel and learn something — for a payoff, an aha. Maybe fantasy is better than nothing. The author is way off the mark, but at least he’s trying. If he keeps his heart open and doesn’t get cocky, he might get someplace. Wait – I can help. The reader clicks “reply by email” to straighten the author out on a few points, and writes what it’s really like to be a different person – different gender, different size, different language, different religion, different background, different country, different age, different _everything_ … except what isn’t different at all. ****Note:**** this post is part of #100DaysToOffload, a challenge to publish 100 posts in 365 days. These posts are generally shorter and less polished than our normal posts; expect typos and unfiltered thoughts! View more posts in this series.
www.autodidacts.io
February 15, 2026 at 1:16 AM
Stoked about this! I don't update my welcome email as often as I should, because it's tucked in an out-of-the-way text input in ActivePieces...
February 14, 2026 at 6:44 AM
I can run Performance profile all the time
An unexpected benefit of docking my laptop beside my desk
Although I have plenty of monitors, keyboards, and mice for the purpose, until recently, I rarely got around to docking my laptop — even though I know having multiple monitors is one of the few things that measurably increases productivity. Before, when I’ve docked my laptop via a USB-C hub, whether using my laptop’s trackpad and keyboard or an external mouse and keyboard, I’ve put my laptop on the same desk as the monitor, out-of-the-way, in clamshell mode. This configuration has some benefits: big high-resolution screen, ergonomics, 104-key keyboard, and single-cable undocking for all peripherals (including Ethernet and USB-C charging). Recently, I tried **docking the same way, but storing my laptop on its side on the floor beside my desk, and discovered: this is way better!** Not because I have more desk space to cover with coffee cups and books, but because I can run my in Maximum Performance profile at all times **and I never hear the fans.** The difference between different CPU profiles’ performance is substantial. Everything feels sluggish on Quiet, and snappy on Performance, and the timings on localhost show that Performance profile can give objectively faster load times (by ~3x). I bought a gaming laptop even though I’m not a gamer, because the price-to-performance blew the competition out of the water. The downside, aside from the B-grade aesthetics and build quality, is that even after customizing the fan curves as much as I dared, the fans are _loud._ As one forum user put it, it “sounds like a fighter jet taking off” compiling Rust or running a local LLM. Now, that doesn’t matter. ****Note:**** this post is part of #100DaysToOffload, a challenge to publish 100 posts in 365 days. These posts are generally shorter and less polished than our normal posts; expect typos and unfiltered thoughts! View more posts in this series.
www.autodidacts.io
February 13, 2026 at 6:43 AM
No, really.
A strange workaround for when the capacitive touch screen of your e-reader isn't responding to dry fingers: use your nose
The capacitive touch screen on my Kobo Sage is rather fickle. Fairly reliably, it fails to respond to long presses if my skin is dry. This is most common after I’ve had a shower, been out in the cold, or done the dishes. Generally, simple taps and swipes still respond, but long-press to lookup in dictionary, and long-press-and-grab to highlight a passage, do not. _This is a known phenomenon called “zombie finger”, most common in cold climates like Canada, where everything is drier, and exacerbated by calluses, which musicians develop on the pads of their fingers if they play a stringed instrument._ This is not only due to the moisture content. I have tried moistening my hands, but it doesn’t help. However, I have found a comical workaround that is quite reliable: **highlight passages with my nose.** My nose is always moist and greasy enough that the screen responds. I have to go slightly cross-eyed to target the start and end of the sentence or paragraph, but it’s not too hard. And even if I miss by a word, it’s often possible to adjust the grab handles by that much after the fact using my finger. This post sounds like a joke, and when I do it, it feels like a joke. But it’s not a joke. Try it: it works. Many a reading session has been saved by taking “having my nose in a book” a few inches further. ****Note:**** this post is part of #100DaysToOffload, a challenge to publish 100 posts in 365 days. These posts are generally shorter and less polished than our normal posts; expect typos and unfiltered thoughts! View more posts in this series.
www.autodidacts.io
February 12, 2026 at 6:19 AM
and this post is written with it.
Handy.computer is the Linux dictation app I've always wanted.
Not too long ago, I wrote about Whispering, an open source, offline dictation app for Linux. However, what I've always wanted, and once even tried to build using Whisper C++ and shell scripts, is a dictation app that inserts the dictated text at my cursor. Handy.computer is that app and this post is written with it. The gloriously pink settings UI. Notice the custom words section: very useful. Handy is available for Windows, Mac, and Linux. It is written in Rust and supports a variety of models. I am using Whisper-Large, however, it also supports Moonshine and NVIDIA Parakeet, which are significantly faster, though slightly less accurate. I am four paragraphs into this post, and so far I haven't made a single correction. I will list the total number of corrections at the end of this post. 0:00 /0:07 1× so meta Handy was a breeze to install and so far seems easy to use and stable. The main weak point that I've noticed is that the first few words of each transcription tend to get missed. I find it helps to clear my throat at the beginning of a sentence and give a few moments before I start speaking. You have to be careful with a dictation app that automatically inserts the transcript at the cursor. After dictating the previous paragraph, I alt-tabbed to btop to check the resource usage while Whisper-Large was transcribing, and the app pasted a whole paragraph of text into the filter dialog of btop. Handy is built with rust and tauri by CJ Pais. Learn more at Handy.computer. * * * _The entire text up to the divider was dictated using Handy, with only**2 corrections**. Handy rendered tauri "tarry", and I had to remove an extraneous "it." from the end of the title. I added the hrefs to the links, but left the text unchanged. I ran dictation a paragraph at a time, so linebreaks were added manually. The image and video were added after I finished dictation._
www.autodidacts.io
February 11, 2026 at 4:50 AM
Sometimes reading the classics feels like being in on a secret. And the secret is that reading the classics is *fun* 🤯

https://www.autodidacts.io/dostoyevsky-isnt-difficult/

#100DaysToOffload #Books #Reading #Dostoevsky
February 10, 2026 at 9:04 PM
Some of the most interesting people are allergic to funnels
Maybe don’t optimize conversion rate?
****Note:**** this post is part of #100DaysToOffload, a challenge to publish 100 posts in 365 days. These posts are generally shorter and less polished than our normal posts; expect typos and unfiltered thoughts! View more posts in this series. Substack has a pop-up that’s really in your face and kind of annoying. I figured that Substack has probably A/B tested that pop-up thoroughly, and decided the tradeoff is worth it. So I copied it for the Ghost theme running on this blog, and made it _slightly_ less annoying. (Instead of a popup, it’s a full viewport shown to logged-out users, with only one clear thing the user can do other than scroll: subscribe!) I discovered that it worked staggeringly well: 10–20x more subscribers than the normal opt-in forms. I congratulated myself for my incredible audience funnel and moved on to other things, like trying to write more than 6 posts per year, and keep my server from crashing. After a while, I started to worry. Goodhart’s Law states, “When a measure becomes a target, it ceases to be a good measure”. Conversion rate is probably the most common _target_ metric. Maybe it works so well because people don’t realize they can just scroll down? Maybe they think they’re stuck there, and it is just a newsletter? _Maybe I am selecting an audience of people who don’t know how to scroll down, while driving away the people who are most like me: the people who don’t like marketing, popups, captchas, and anything that smells like a “funnel” or “content”._ I turned it off for a long time. Then I turned it on. There’s a 50% chance it’s on the homepage right now. I’m going to go on an entomological tangent. Suppose you want to fill an aquarium with cool bugs. You are lazy and ask someone else to do it, and you pay them by the bug. You don’t specify the task quite clearly enough. They optimize their acquisition, put out flypaper next to the compost pile, and fill your aquarium with dying flies. This seems to be what many internet content businesses are doing. _No no no no._ The coolest insects are the ones that are out in the _grass_ , and the coolest wild insects are the ones that are sneaky and hard to catch. The person with the most teeming and vibrant aquarium is the one who goes crawling around getting mud and grass-juice on the knees of their jeans, finding the bugs where they are. Or, maybe, attracting the bugs to them. But if you just dig through the compost, it will all be worms. Good for the metrics (if you’re into bait fishing or vermiculture), but missing the rest of the ecology. The capturing part of this metaphor is problematic, but has some truth. If you capture a stink bug or cedar bug, it will spray you. Skunks, also, don’t like to be captured. (The list of creatures that dislike captivity is long, and I am on it.) But cedar bugs are pretty nifty creatures, if you just hang out with them without making them feel trapped. Cedar bugs like me thrive as RSS subscribers, who can come and go as they please. If you want to write for a living in the 21st century, you have to be a ridiculously good writer, or a solid writer with great marketing. Hence, the flypaper popup I installed on this blog, which tripled my readership — but at what cost? How much quality makes up for how much lack of quantity? How much growth hacking odor will your best readers tolerate before they unsubscribe? Where is the balance between having no one find the things you make, and making the wrong things and having too many of the wrong people like them? The balance, where you make the things that matter, and get them to the people who care about them? I recently updated my social media byline to “get your answers questioned”, and I seem to have been hoist by my own petard.
www.autodidacts.io
February 9, 2026 at 6:44 AM


Sub-clinical insomnia is endemic among the people I know. And I’ve rarely heard anyone say anything good about it.

We all know how important good sleep is for good health, and about the increase in heart attacks when daylight savings time kicks in, and that getting less than 6hrs rest is […]
Insomnia isn’t a waste of time
Sub-clinical insomnia is endemic among the people I know. And I’ve rarely heard anyone say anything good about it. We all know how important good sleep is for good health, and about the increase in heart attacks when daylight savings time kicks in, and that getting less than 6hrs rest is equivalent to being over the legal alcohol limit in its impact on reaction time when driving a car, and that basically if we’re lying in bed not sleeping we are literally probabilistically giving ourselves alzheimer’s, cardiovascular disease, and cancer all at once. For most of my life, I’ve been a night owl (generally considered a character flaw by those around me, and a symptom of laziness), and part of it is because though I sleep soundly, for the most part, once I start, it takes me a long time (0.5–3+ hrs) to fall asleep unless I’m dog-tired. I’ve tried everything the internet has to offer and nothing has helped. (Yet.) (I suspect growing up in a family of meditators, but finding meditating boring and never really getting into it, even though I know it’s good, incentivized getting up late, so I wouldn’t have to meditate, or disturb the people who were.) In addition to changing how I think about what counts as sleep, I have found another trick for not getting wigged out about how long it takes me to fall asleep: embracing the benefits of hypnagogia. Edison, Dali, _et al_ are famous for taking daytime naps in a chair while holding a key over a metal pan, to wake them the moment they lost muscle tension — and then writing down the ideas they had had. Recently, I realized that probably half of my ideas come to me while I’m failing to fall asleep. (Another quarter in the shower, and the rest when I’m meditating.) Often, insomnia does feel useless. Fairly reliably, though, there will be one epic night of sleeplessness every week or month, often on the full moon (or, perhaps, I just notice that it’s the full moon when I’m wondering why I have such terrible insomnia), when I fill up a full page with ideas for essays, projects, things to research, and so on. In general, the worse the insomnia, the more ideas I come up with. For best results, drink coffee late in the day, eat a late dinner, and finish off with a large slab of strong chocolate cake. Half-marathon to ultramarathon length runs also seem to tend to generate the good kind of insomnia for having ideas, the lying awake buzzing kind. **Tips for productive insomnia:** * **Always keep a notebook by your bed.** Keep the notebook open at all times, with an inked pen sitting on it. * **Keep a dim lamp next to the notebook.** My preferred choice is a $5 junk-shop brass lamp, with a 5-10 watt incandescent bulb, on a dimmer. This doubles as a reading lamp that’s nicer on the eyes than an e-reader frontlight. When I’m travelling or camping, I use a Petzl headlamp on night vision mode, which has a handy glow-in-the-dark ring that makes it easy to find and turn on. * **Write it down.** When you have an idea, chances are you won’t feel like writing it down, because you’re so comfortable and drowsy, and it feels like you’ll remember it. In my experience, even the most vivid ideas will be gone by morning. If it’s a really good idea, I write it down immediately. If it’s so-so, and I’m willing to risk losing it, I make one of two bargains with myself: * I commit to writing it down once I have ~2–3 ideas to write down, which is about how many I can hold in my working memory, and also the max I’m likely to remember in the morning (if I’m lucky, and remember any). * Or, I commit to writing it down next time I change position. This means that if I’m _actually_ about to fall asleep, I won’t rouse myself. Either I’ll fall asleep, or I’ll capture the idea. * **Load the raw material for what you want your subconscious to work on into your mind** before you go to bed. If I read the news, or watch a movie, or have an argument before going to bed, my brain will tend to theorize about the plot, or rehash the argument. The results don’t tend to be very actionable, or useful. Instead, I like to load my memory with one of three categories of things: * **The working draft** of my top-priority project. This could mean re-reading the draft of an essay, or listening to voice memos of unfinished songs, or thinking about where I’m stuck on a programming project. * **Good philosophical stuff** that will put my brain to work on the big questions, rather than gossip and trivia (this tends to generate ideas about how to improve myself and my life, and psychological insights, rather than project ideas) * **Concrete facts from diverse fields.** In my case, this tends to mean reading the essays I chose on Monday, which are about all kinds of things, and tend to include a mix of tech, science, and philosophy, with an emphasis on people’s blogs where they write about whatever interests them. I find that reading in-depth articles on wildly different niche topics, back to back, and then drawing connections between them, fairly reliably generates interesting essay/business/project/song ideas. * **Review in the morning.** Many of the ideas I have during insomnia are really dumb, but don’t seem dumb at the time. (This might be a key to why insomnia generates so many ideas: the censor is on a cigarette break, so bad-seeming ideas don’t get automatically shot down.) In the morning, I look at the page of illegible notes I took, and transfer out of the good ones. Many are crossed off. A few seem worth pursuing further. This essay was one of them. ****Note:**** this post is part of #100DaysToOffload, a challenge to publish 100 posts in 365 days. These posts are generally shorter and less polished than our normal posts; expect typos and unfiltered thoughts! View more posts in this series.
www.autodidacts.io
February 8, 2026 at 5:28 AM
OLLAMA_CONTEXT_LENGTH environment variable didn’t have an effect, but there’s another way
How to increase Ollama context length
<small><div class="kg-card kg-callout-card kg-callout-card-yellow"><div class="kg-callout-text"><b><strong style="white-space:pre-wrap">Note:</strong></b> this post is part of <a href="https://www.autodidacts.io/100daystooffload/">#100DaysToOffload</a>, a challenge to publish 100 posts in 365 days. These posts are generally shorter and less polished than our normal posts; expect typos and unfiltered thoughts! <a href="https://www.autodidacts.io/tag/100daystooffload/">View more posts in this series.</a></div></div></small><br /> <p>I was trying out <code>glm-ocr</code>, and discovered, that though it has performance close to Qwen3-VL or deepseek-ocr, while requiring less resources, it produces empty output with Ollama’s (tiny, 4096) default model context size.</p> <p>Discussion <a href="https://github.com/ollama/ollama/issues/14114">here</a> pointed me in the right direction.</p> <p>According to <a href="https://docs.ollama.com/context-length">Ollama’s docs</a>, you can set the context length with the <code>OLLAMA_CONTEXT_LENGTH</code> environment variable.</p> <p>I tried it, both by exporting the variable and restarting the Ollama service (<code>sudo service ollama restart</code>), and by passing it directly to the Ollama run command. No luck!</p> <p>Rather than debug what was going wrong, I found a workaround.</p> <p>It was simple to set the context length from the REPL that starts when you start a session with <code>ollama run glm-ocr</code>, with no prompt:</p> <pre><code class="language-bash">/set parameter num_ctx 10240 </code></pre> <p>But I wasn’t running <code>glm-ocr</code> from the REPL, I was running it from the CLI. And <code>/set</code> doesn’t persist once you exit the REPL.</p> <p>I found the answer I needed <a href="https://old.reddit.com/r/LocalLLaMA/comments/1nffm7r/psa_for_ollama_users_your_context_length_might_be/ndwl63i/">in a comment</a> on the r/LocalLLaMA subreddit.</p> <p>Set the context, as above, with:</p> <pre><code class="language-bash">/set parameter num_ctx 10240 </code></pre> <p><em>Then</em>, save a copy of the model with the current parameters as the default settings:</p> <pre><code class="language-bash">/save glm-ocr-10k </code></pre> <p>Now, I can use it on the CLI by using the new model name:</p> <pre><code class="language-bash">ollama run glm-ocr-10k "Text Recognition: ./image.jpg" </code></pre> <p><strong>What values work well?</strong></p> <p>Since Ollama silently truncates context, it’s hard to know what’s the right value to use. Set it too high, and it will max out your resources. <a href="https://docs.ollama.com/context-length">Ollama recommends 64000 for agents etc</a>, but this won’t run on an older laptop.</p> <ul> <li>The default (4096) produces no output with <code>glm-ocr</code>, just empty markdown and text code fences.</li> <li>10240 produces output (with errors)</li> <li>I’m currently trying 20480. It has the same errors as 10240, but is pretty good; I don’t know whether the errors relate to the context size or not.</li> <li>64000 requires &gt; 16gb RAM.</li> </ul> <p><strong>Why not just downscale the images?</strong></p> <p>That’s what I’m going to try next. <span class="end-mark"></span></p>
www.autodidacts.io
February 7, 2026 at 5:58 AM
I ported over the patch I wrote for the Wallabag plugin, and improved it
Star rating support has been merged into the Readeck KOReader plugin
<small><div class="kg-card kg-callout-card kg-callout-card-yellow"><div class="kg-callout-text"><b><strong style="white-space:pre-wrap">Note:</strong></b> this post is part of <a href="https://www.autodidacts.io/100daystooffload/">#100DaysToOffload</a>, a challenge to publish 100 posts in 365 days. These posts are generally shorter and less polished than our normal posts; expect typos and unfiltered thoughts! <a href="https://www.autodidacts.io/tag/100daystooffload/">View more posts in this series.</a></div></div></small><br /> <p>I am happy to report that my pull request adding star rating synchronization to iceyear’s Readeck KOReader plugin was merged today, and I have submitted a follow-up PR with UI improvements.</p> <figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/iceyear/readeck.koplugin/pull/20?ref=autodidacts.io"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Sync KOReader star status to Readeck (as labels / favorites) by curiositry · Pull Request #20 · iceyear/readeck.koplugin</div><div class="kg-bookmark-description">I have ported over and improved a patch I wrote for the Wallabag plugin (koreader/koreader#14793), to add rating syncing to this plugin. If the user checks a feature checkbox, this syncs star ratin…</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.autodidacts.io/content/images/icon/pinned-octocat-093da3e6fa40-4.svg" alt="" /><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">iceyear</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.autodidacts.io/content/images/thumbnail/20" alt="" /></div></a></figure> <p>I took <a href="https://www.autodidacts.io/star-wallabag-entry-from-koreader/">the code I wrote for the Wallabag plugin</a>, and the feedback I received on the <a href="https://github.com/koreader/koreader/pull/14793">KOReader pull request for that patch</a>, and combined the two. So this patch has a nice menu entry.</p> <figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"> <div class="kg-gallery-container"> <div class="kg-gallery-row"> <div class="kg-gallery-image"> <img src="https://www.autodidacts.io/content/images/2026/02/readeck-koreader-plugin-star-settings-ui.png" loading="lazy" srcset="https://www.autodidacts.io/content/images/size/w600/2026/02/readeck-koreader-plugin-star-settings-ui.png 600w, https://www.autodidacts.io/content/images/size/w1000/2026/02/readeck-koreader-plugin-star-settings-ui.png 1000w, https://www.autodidacts.io/content/images/size/w1600/2026/02/readeck-koreader-plugin-star-settings-ui.png 1600w, https://www.autodidacts.io/content/images/2026/02/readeck-koreader-plugin-star-settings-ui.png 1692w" width="1692" height="1876" /> </div> <div class="kg-gallery-image"> <img src="https://www.autodidacts.io/content/images/2026/02/readeck-koreader-plugin-star-settings-ui-open.png" loading="lazy" srcset="https://www.autodidacts.io/content/images/size/w600/2026/02/readeck-koreader-plugin-star-settings-ui-open.png 600w, https://www.autodidacts.io/content/images/size/w1000/2026/02/readeck-koreader-plugin-star-settings-ui-open.png 1000w, https://www.autodidacts.io/content/images/size/w1600/2026/02/readeck-koreader-plugin-star-settings-ui-open.png 1600w, https://www.autodidacts.io/content/images/2026/02/readeck-koreader-plugin-star-settings-ui-open.png 1692w" width="1692" height="1876" /> </div> </div> </div> <figcaption><p><span style="white-space:pre-wrap">It might not look like much, but it’s quite blingy, by my standards!</span></p></figcaption> </figure> <p>Next, I plan to port the new UI back over to the Wallabag plugin, so that patch can be merged. <span class="end-mark"></span></p>
www.autodidacts.io
February 5, 2026 at 2:14 AM
Accidental strength training for the hippocampus
Something good happened to my memory, and I have a theory about what caused it
<p>In my youth, I had a decent but unremarkable memory. I tended to remember things I had learned fine, but wasn’t good at remembering “facts” that I didn’t immediately put to use, such as names and dates.</p> <p>This changed <a href="https://www.autodidacts.io/my-year-of-100-books/#:~:text=I%20remember%20more%20of%20what%20I%20read%3B%20I%20used%20to%20remember%20concepts%2C%20plots%2C%20and%20characters%20%E2%80%94%20but%20retaining%20dates%2C%20figures%2C%20and%20other%20details%20was%20a%20lost%20cause.%20For%20better%20or%20worse%2C%20my%20memory%20for%20names%20and%20places%20and%20obscure%20factoids%20seems%20much%20stickier.%20That%20said%2C%20I%20didn%E2%80%99t%20run%20any%20tests%20on%20memory%20before%20the%20challenge%2C%20so%20this%20is%20a%20purely%20subjective%20experience%20of%20personal%20growth%2C%20and%20therefore%20profoundly%20suspect.">perceptibly</a> in 2015, when <a href="https://www.autodidacts.io/my-year-of-100-books/">I challenged myself to read 100 books</a> in a year. (There may have been other factors, including several months of travel, and getting into music, but the reading binge seems like the most likely cause.)</p> <p>I didn’t make any special effort to remember the books I read. It would be another year before I tried taking serious reading notes, and this was also before my spaced repetition phase. So I remember little about many of the books I read (that year, and in general). I like the Emerson (<a href="https://quoteinvestigator.com/2016/06/20/books/">?</a>) quote:</p> <blockquote> <p>“I cannot remember the books I’ve read any more than the meals I have eaten; even so, they have made me.”</p> </blockquote> <p>Still, something about trying to absorb that many stories and names and facts, without getting them muddled, caused a change that’s still apparent a decade later, even though I have never managed to read that many books in the years since, and in the past few years, have been lucky if I read more than 20.</p> <p>Since then, there are two other things that I believe have also strengthened my memory in a non-trivial way: <strong>journalling</strong> in a way that leans heavily on autobiographical memory, and <strong>writing down my dreams</strong>. More on the exact details, and why I think it helped, at the end of the post.</p> <p><em>This is relative to my baseline. I’m not a memory athlete with impeccable recall. I can’t count cards, and sometimes I drink out of other people’s cups. I forgot about the idea for this essay for several days after I came up with it, and also often forget to eat breakfast.</em></p> <p>My casual study of memorization techniques is <em>not</em> one of the three things that seem to have made a significant difference, though I’m sure it helped. For a while, after reading posts on the SuperMemo blog, and <a href="http://michaelnielsen.org">Michael Nielsen</a><a href="https://augmentingcognition.com/ltm.html">’s superb essay on spaced repetition</a> (among others: <a href="https://borretti.me/article/effective-spaced-repetition">1</a>, <a href="https://gwern.net/spaced-repetition">2</a>), I got really into it, and memorized a lot of digits of Pi and other useless things using Anki.</p> <p>I made the rookie mistake of importing huge decks into Anki, and then got bogged down by the tiresome reviews of material that wasn’t worth learning in the first place, and eventually gave up on it. It still auto-starts when my computer boots.</p> <p>In addition to spaced repetition, I read about memory palaces (which I never managed to get to work effectively, though it <em>maybe</em> helped for memorizing a long poem), and tried to start a Zettlekasten.</p> <p>In short: I had a phase where I was into memory, but it didn’t really stick or produce huge results.</p> <aside class="full"> <p>It’s possible the perceived improvement in my memory is an illusion. It’s also possible that it did improve, but I’m attributing the effect to the wrong thing. Lifestyle factors that are likely contributing: I get lots of sleep, exercise, and healthy fats; avoid smartphones and social media; have a passing interest in most fields, because they can all inform my writing, so I work against discarding information as irrelevant; write a lot by hand; deliberately repeat names and phone numbers to myself over and over until I think I’ll remember them; am a touring musician, which means I need to have the chords and my part <em>more-or-less</em> memorized for over a hundred songs, and lyrics memorized for the subset of those songs that I wrote or sing harmony on; and like to be right, and win arguments and bets.</p> </aside> <p>However, two things did noticeably help, in a way that felt similar to reading all those books in 2015, though less dramatic:</p> <ol> <li>I have kept paper-and-ink journals on and off for most of my life. Mostly, it’s a pretty boring <em>then I did this then I did that</em> history, with occasional complaining/philosophizing/rubber-duck-debugging thrown in. At some point, I became more zealous about never missing a day, to the point of <em>backfilling</em> days or weeks from memory (and notes) if I get behind. This is kind of a burden. It’s unclear if journalling makes me happier, or if it’s just that feeling guilty about not journalling makes me <em>unhappy</em>. But regardless of the benefits or drawbacks of journalling, having to remember and re-construct what I did, sometimes days or weeks later, means I have to make effortful use of my memory on a daily basis.</li> <li>For a while, I wrote down my dreams every morning. This was very tedious and not all that psychologically insightful: they were mostly insipid, sordid, or bonkers, and I rarely found deep insights in them, or strong correlations with my recent activities. It also took <em>ages</em>, because if you actually remember your dreams, the amount of data is equivalent to a screenplay for a feature length film. (This was part of the motivation for creating a <a href="https://www.autodidacts.io/personal-shorthand-symbols/">personal symbol shorthand</a>.) However, there’s something unique about remembering your dreams. It feels like <em>they’re always at the perfect point on the forgetting curve for a review.</em> They’re almost always hard to remember. But I know that if I try hard enough, in the right patiently-non-effortful sneaking-up-on-the-memory way, there’s guaranteed to be something there to remember. <strong>Remembering my dreams feels like strength training for the memory-retrieval networks of my brain.</strong></li> </ol> <p>The common thread in these observations is that <strong>memory improves with use.</strong> Saying “I have a <em>terrible</em> memory for names” can be a self-defeating self-fulfilling prophesy. Instead, try, “<em>Samantha.</em> Good to meet you!”, and then, under your breath, <em>Samantha. Samantha. Sam-an-tha.</em> And then, fifteen minutes later, “I was talking to … sam… sam-<em>an</em>-tha—”. You get the idea!</p> <p>Maybe these three techniques apply more broadly. I hope so! If you’ve found a helpful technique/essay/book, or I forgot something when I was writing this post, please reply by email or leave a comment. <span class="end-mark"></span></p> <small><div class="kg-card kg-callout-card kg-callout-card-yellow"><div class="kg-callout-text"><b><strong style="white-space:pre-wrap">Note:</strong></b> this post is part of <a href="https://www.autodidacts.io/100daystooffload/">#100DaysToOffload</a>, a challenge to publish 100 posts in 365 days. These posts are generally shorter and less polished than our normal posts; expect typos and unfiltered thoughts! <a href="https://www.autodidacts.io/tag/100daystooffload/">View more posts in this series.</a></div></div></small><br />
www.autodidacts.io
February 4, 2026 at 6:13 AM
I have often wanted to be able to pause a heavy job and then resume it later. Now I know how.
How to pause and resume a resource-intensive process on Linux with SIGSTOP: specifically, Ollama LLM inference
<small><div class="kg-card kg-callout-card kg-callout-card-yellow"><div class="kg-callout-text"><b><strong style="white-space:pre-wrap">Note:</strong></b> this post is part of <a href="https://www.autodidacts.io/100daystooffload/">#100DaysToOffload</a>, a challenge to publish 100 posts in 365 days. These posts are generally shorter and less polished than our normal posts; expect typos and unfiltered thoughts! <a href="https://www.autodidacts.io/tag/100daystooffload/">View more posts in this series.</a></div></div></small><br /> <p>Yesterday, I wrote about how <a href="https://www.autodidacts.io/ocr-typewritten-manuscripts-with-local-ollama-vision-model/">OCR with local vision models and Ollama</a>. One of the main drawbacks of running local LLMs with Ollama (or any other tool) is that they’re almost comically resource-hungry.</p> <p>It’s hard to run LLM inference “in the background” while doing other things. The fans rev up, the keyboard deck grows warm to the touch, and sometimes the whole system freezes.</p> <p>I have tried limiting the Ollama’s RAM usage with ulimit, and systemd memory limits (<code>systemd-run –scope -p MemoryMax=12G –user ollama run qwen3-vl</code>), but it <em>needs</em> the memory. And I’ve tried <code>renice</code>ing it to lowest priority, but the fans still get noisy.</p> <p>Now, I have better solution: <em>pause</em> inference when I’m using my laptop, and <em>resume</em> when I get up to get a snack or go for a run.</p> <p>I’ve known, for a while, about Ctrl+Z, and had the vague sense that jobs must be able to be stopped and resumed, in cases where this is possible.</p> <p>Today, I bothered to look it up, and learn about the graceful request, 20 SIGTSTP, and the forceful order 19 SIGSTOP, both of which are resumed with 18 SIGCONT.</p> <p>(Full table of signal numbers can be found <a href="https://man7.org/linux/man-pages/man7/signal.7.html#:~:text=SIGCONT%20%20%20%20%20%20%20%20%2018%20%20%20%20%20%20%20%20%20%2019%20%20%20%20%20%2025%20%20%20%20%20%2026,%20%20%20%20%20%20%20SIGTSTP%20%20%20%20%20%20%20%20%2020%20%20%20%20%20%20%20%20%20%2018%20%20%20%20%20%2024%20%20%20%20%20%2025">here</a>.)</p> <p>However.</p> <p>When I tried these in <code>htop</code>, they didn’t work. There are many different processes. There’s the ollama server, the ollama runner, ollama run, and the rest of the pipeline that started the workload. Take a look!</p> <pre><code>ps aux | grep ollama </code></pre> <p>Which one is actually relevant?</p> <p>I tried several things that didn’t work. (If you want the spinner to freeze, stop the <strong>ollama run</strong> command :)</p> <p>What I learned:</p> <ol> <li>The heavy resource usage is from the <strong>runner</strong> process(es)</li> <li>The <strong>serve</strong> and <strong>runner</strong> processes cannot be paused and resumed without using sudo</li> <li>Memory remains tied up while the process is stopped (the same amount, or just some?). It would be cool if there was a way to write this to disk and then load it back into RAM.</li> <li>Ollama doesn’t listen to Terminal Stop (SIGTSTP, -TSTP, -20)</li> <li>One time, using SIGSTOP resulted in losing <em>one page</em> of the OCR pipeline. I don’t understand why: obviously the Ollama process didn’t like being put on ice. When I tried to get this to happen again, no pages were lost.</li> </ol> <p>Here’s the command I ended up using.</p> <pre><code class="language-bash">sudo killall -STOP ollama </code></pre> <p>(Confirm it worked by listening to the fans spin down, seeing the resource usage and load average drop in <code>htop</code>, and running <code>ps aux | grep ollama</code> and again an seeing that there’s a <strong>T</strong> added to column 5; or run <code>ps -p $(pidof ollama) -o pid,stat,cmd</code> and the T will be in the STAT column)</p> <p>Then, when I’m done using my laptop, and want to put those idle clock cycles to use, I run:</p> <pre><code class="language-bash">sudo killall -CONT ollama </code></pre> <p>It’s pretty handy! <span class="end-mark"></span></p>
www.autodidacts.io
February 3, 2026 at 6:42 AM
It’s now possible to get results better than Tesseract, without relying on cloud services
OCR Typewritten Documents with a Local Vision Model (Qwen3-VL:8B + Ollama)
<small><div class="kg-card kg-callout-card kg-callout-card-yellow"><div class="kg-callout-text"><b><strong style="white-space:pre-wrap">Note:</strong></b> this post is part of <a href="https://www.autodidacts.io/100daystooffload/">#100DaysToOffload</a>, a challenge to publish 100 posts in 365 days. These posts are generally shorter and less polished than our normal posts; expect typos and unfiltered thoughts! <a href="https://www.autodidacts.io/tag/100daystooffload/">View more posts in this series.</a></div></div></small><br /> <figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.autodidacts.io/content/images/2026/02/example-typewritten-manuscript-scan-for-ocr.jpg" class="kg-image" alt="Example Typewritten Manuscript Scan" loading="lazy" width="2000" height="2593" srcset="https://www.autodidacts.io/content/images/size/w600/2026/02/example-typewritten-manuscript-scan-for-ocr.jpg 600w, https://www.autodidacts.io/content/images/size/w1000/2026/02/example-typewritten-manuscript-scan-for-ocr.jpg 1000w, https://www.autodidacts.io/content/images/size/w1600/2026/02/example-typewritten-manuscript-scan-for-ocr.jpg 1600w, https://www.autodidacts.io/content/images/size/w2400/2026/02/example-typewritten-manuscript-scan-for-ocr.jpg 2400w" /></figure><hr /> <p>February 1st, 2026<br /> FOR IMMEDIATE RELEASE</p> <p>OCR Typewritten Manuscripts with a Local Vision Model</p> <p>It's now possible to get usable results.</p> <p>The words you are reading were written on a Brother Charger 11 mechanical typewriter.</p> <p>The text of this section of this post is the result of scanning the typewritten page at 600dpi, and running optical character recognition on it using a vision model running with Ollama on an older gaming laptop (Ryzen 7, 16gb RAM).</p> <p>Previously, the state-of-the-art OCR software for local use has been Tesseract. However, Tesseract produces a non-trivial number of errors when run on typewritten documents. As a result, it is more 'efficient, in many cases, for a touch typist to type in the document, than it is to manually correct the Tesseract output, even when the first round of clean-up is handled by a series of regular expressions to correct the most frequent errors.</p> <p>I have tried several LLM-based options, but none performed as well as Tesseract. Until deepseek-ocr was released. Deepseek had an extremely low word error rate, but got caught in looping hallucination when dealing with certain patterns of slashes. Qwen, however, did not have this issue. The exact model and timings are provided below.</p> <hr /> <p>The command that generated the above transcript was:</p> <pre><code class="language-bash">time ls **.jpg | sort -n | xargs -I{} ollama run qwen3-vl --hidethinking "./{}\nOCR this document." &gt;&gt; output.txt </code></pre> <p>It took 5 minutes and 31.96 seconds to generate the output, running on Maximum Performance profile, with many other applications also open and using resources.</p> <p>You will need to have Ollama, xargs, enough RAM to run an 8 billion parameter model (12–16gb, probably, given that 16gb is usually <em>just</em> enough to run 14b models), enough free disk space to pull the model (6.1gb), and either Fish shell or bash with <code>setopt globstar</code>. And, be willing to have the machine it’s running on get bogged down (or set a systemd memory limit, renice, etc)</p> <p>You will notice that it is set up to process an entire directory of scanned images and append the output from each page into a single text file. <span class="end-mark"></span></p>
www.autodidacts.io
February 2, 2026 at 7:27 AM
🐞
An extremely silly bug
<p>It was one in the morning. I was coding a JavaScript front-end calling an API. Every time I hit the load data button, in addition to loading the data, the browser’s print dialogue would open. <a href="#1" class="kg-btn kg-btn-accent">Like this.</a><br /></p> <p>I was suspicious, because I'd used a 3rd party slugify function with unicode regex that I didn’t really understand: </p><pre><code class="language-javascript">slug = slug.normalize('NFD').replace(/[\u0300-\u036f]/g, '')</code></pre><p>Malware? I read about code almost this innocent-looking containing obfuscated malware-delivery, and also about researchers finding code snippets in the wild that display differently from what gets copy-and-pasted, so people might read them, and then paste and run them without <em>re-</em>reading them, and suddenly discover that they're curl-ing to bash and uploading all their SSH keys and crypto wallets.</p><p>I was also paranoid because I hand-code pretty much all my software without LLM assistance, but for this one-off script (gathering data for an Autodidacts newsletter, and not using any auth or non-public data) I'd generated the boilerplate code with an LLM. </p><p>The answer, as foreshadowed by the title, was much more embarrassing and funny.</p><p>I had been writing a lot of Python. And I had added some logging to make sure the slugify function was working properly...</p><figure class="kg-card kg-image-card"><img src="https://abs-0.twimg.com/emoji/v2/svg/1f926-200d-2642-fe0f.svg" class="kg-image" alt="🤦‍♂️" loading="lazy" title="Man facepalming" width="300" height="300" /></figure><figure class="kg-card kg-image-card"><img src="https://www.autodidacts.io/content/images/2026/01/Screenshot_2026-01-27_00-02-46.png" class="kg-image" alt="" loading="lazy" width="1306" height="364" srcset="https://www.autodidacts.io/content/images/size/w600/2026/01/Screenshot_2026-01-27_00-02-46.png 600w, https://www.autodidacts.io/content/images/size/w1000/2026/01/Screenshot_2026-01-27_00-02-46.png 1000w, https://www.autodidacts.io/content/images/2026/01/Screenshot_2026-01-27_00-02-46.png 1306w" /></figure><p>That’s right. I had used Python’s <code>print("Message")</code> for logging instead of JavaScript’s <code>console.log("Message")</code>. And, guess what <code>print()</code> does in JavaScript!</p>
www.autodidacts.io
February 1, 2026 at 7:37 AM
Reposted by The Autodidacts
Yes. Classic literature like Dostoyevksy, Kafka or Thomas Mann has a reputation of being hard to crack as a reader. But it's all about giving it a try, without forcing it. Read when you enjoy reading. Don't when you don't. https://www.autodidacts.io/dostoyevsky-isnt-difficult/
Dostoyevsky isn’t difficult
Other than the names. The names are difficult.
www.autodidacts.io
January 18, 2026 at 1:27 PM
Writing a web app because I want to do calculations in a spreadsheet: I couldn’t find a free Silver price API — so I decided to make a super basic one.

https://www.autodidacts.io/free-silver-price-api/

#100DaysToOffload #APIs #Silver #Preciousmetals #Finance
January 31, 2026 at 8:03 PM
A guide to devolving your handwriting:

https://www.autodidacts.io/personal-shorthand-symbols/

#100DaysToOffload #Productivity #Handwriting #Notetaking
January 31, 2026 at 7:57 PM
A paean to splashing through puddles, and the joy that is unlocked by overcoming fear of rain and bad weather:

https://www.autodidacts.io/human-beings-are-waterproof/

#100DaysToOffload #Health #Lifestyle
January 31, 2026 at 6:37 AM
I have updated my post about my experience with @readeck@mastodon.online so far, adding more information about using it with KOReader (either OPDS or a plugin), article fetching success rate compared to Wallabag, etc.

Overall, I'm really impressed. How […]

[Original post on autodidacts.io]
January 31, 2026 at 6:31 AM
Let’s make it cool again, because it is.
In Praise of Earnestness
<p>Goodness could use a better marketing department. Somehow, cool has always tracked edgy, and been more correlated with bad behavior than good. And with a seeming disenchantment with heros and “moralizing”, this has gotten more so. I often read studies like <a href="https://www.apa.org/pubs/journals/releases/xge-xge0001799.pdf">this one</a>, and think, what could be done to make non-performative goodness <em>cool</em> and high status?</p> <p>I am starting my advertising campaign by taking out a full page ad for the virtues of earnestness.</p> <p>Earnestness is having a tiny Renaissance in certain obscure corners of the internet, with Visakan Veerasamy and Henrik Karlsson two of its most eloquent champions.</p> <p>People make fun of other people for being earnest. Sometimes this is warranted. People who are still earnest, despite being laughed at, tend to have a level of social obliviousness, or lack of self consciousness, that is both a strength and a weakness. Sometimes, also, earnestness is a product of naïveté, and people are not being laughed at for being earnest, but for being (in the critics’ eyes) so confidently wrong. But being laughed at tends to make people close up, and either not do the thing they get ridiculed for, or only do it in private.</p> <p>Another word for closed-upness? Cynicism. With all apologies to Diogenes, who was pretty rad, lower-case cynicism is just lame.</p> <p>Brett McKay wrote a fairly tolerable post skewering cynicism as a life philosophy. I don’t usually link to <abbr title="Art of Manliness">AOM</abbr>, mostly because of the name. It sounds cringe, or like some manosphere thing. Also, it’s conservative, and Christian. So uncool in the SF internet filter bubble! But you know what? I have been reading AOM since 2008-ish. It’s the only “men’s lifestyle” blog I follow. And I’m going to take my own advice and be cringe. I don’t agree with all of it, but I think AOM is one of the more consistently thoughtful and sane self-help and life skills blogs.</p> <p>Apart from the theory about people getting hurt and then retreating into their shell, Brett says that the antidote to cynicism is love. And earnestness is, essentially, loving something enough – even if it’s just an unpopular hobby – that they’re willing to sacrifice status (ie, comfort) for it.</p> <p>Earnestness is most powerful when combined with “seriousness”: being earnest and sticking your neck out for things that <em>matter</em>.</p> <p>In <em>The Moat of Low Status</em> and <em>Crossing the Cringe Minefield</em>, Sasha Chapin and Cate Hall argue that mastery almost always requires a period of being painfully (and often, publicly) inept. Dan Luu has written insightful insightfully on the same theme in <em>Willingness to Look Stupid</em>. (<abbr title="Slime Mold Time Mold">SMTM</abbr>’s post on <em>The Scientific Virtues</em> harps on this, too.) Cate Hall also mentioned somewhere that there’s a reason the symbol for love includes an arrow. I’d always thought that was so dumb. But viewed through the frame of Brett’s post, it kind of makes sense!</p> <p>Cringe is another concept that badly needs skewering. There is some signal in cringe. Shameless self-promotion is cringe and rightfully so. So is talking too loud on the phone in public. So far so good. The problem is that cringe has more to do with what’s currently in vogue and what’s outmoded than with what’s objectively good or bad. Skeuomorphic design is outmoded and possibly cringe, despite having some objective UX advantages over flat design and material design. Being able to tell that a button is a button has utility, no matter what the taste-makers think.</p> <p>The other problem is that the people who are really cringe don’t even know it, while basically well-intentioned, self-conscious pushovers limit their degrees of freedom due to excessive social sensitivity and fear of being cringe. And a third problem is that cringe is a construct that has a lot to do with what we think other people think (about us), as a result of what we think about some third thing. People tend to be terrible at predicting what other people think and feel, yet we shape our lives around our projections of other people’s projections. It’s silly. Half the time, they probably aren’t thinking about us in the first place: they’re too busy thinking about Trump and themselves (and if they like us, what we think of them and what we think they think about us.)</p> <p>Earnestness as a default mode has several advantages in addition to being uncynical and immune to cringe consciousness.</p> <p>It seems to be correlated with humility, openness, and positivity. Cynicism assumes it knows what’s possible and what’s not, and then aims low and snickers at anyone who doesn’t. But predicting the future, by writing off the possibility that it could be different than the past, is kind of arrogant. Profitable for an investor, maybe, but not for an inventor.</p> <p>Criticising is much easier than building, but building is more valuable. Earnestness is a builder’s attitude.</p> <p>And sometimes, even when paired with “unrealistic” ideas and optimism, that attitude is just what’s needed to change the world.</p> <p>When the situation is hopeless, our only hope is earnest people who don’t know, or refuse to accept, that the situation is hopeless — and therefor, try. <span class="end-mark"></span></p> <hr /> <p><em>I would like to dedicate this essay to the memory of Ray Bradbury. I teared up just looking for a photo of the guy to use as a post image. This quote has stayed with me: </em></p> <blockquote> <p><em>I have never listened to anyone who criticized my taste in space travel, sideshows or gorillas. When this occurs, I pack up my dinosaurs and leave the room.</em></p> </blockquote>
www.autodidacts.io
January 30, 2026 at 10:18 PM
One newsletter with more new posts than I published in all of 2025.
Autodidacts Newsletter #24
<p>On Dec 31st 2025, I boldly announced that I was thinking of trying to publish a vast quantity of posts, in lieu of a handful of long-chewed-over deep dives.</p><p>Feedback came in <strong>69:31</strong> in favor of the experiment. Despite my encouragement of honest/blunt feedback, I assume a slight bias toward positive feedback, but the sentiment was probably still &gt;50% positive, which meant it was up to me — and I thought, <em>let’s go for it. </em> </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.autodidacts.io/content/images/2026/01/emacs-octopus-meme.jpg" class="kg-image" alt="Emacs octopus at the keyboard image" loading="lazy" width="1920" height="1200" srcset="https://www.autodidacts.io/content/images/size/w600/2026/01/emacs-octopus-meme.jpg 600w, https://www.autodidacts.io/content/images/size/w1000/2026/01/emacs-octopus-meme.jpg 1000w, https://www.autodidacts.io/content/images/size/w1600/2026/01/emacs-octopus-meme.jpg 1600w, https://www.autodidacts.io/content/images/2026/01/emacs-octopus-meme.jpg 1920w" /><figcaption><span style="white-space:pre-wrap">actually i use helix</span></figcaption></figure><p>In the past month, I published four times more posts (24) than I published in all of 2025 (6).</p><p>I’ll be the first to admit: they aren’t as good. But this is not the beginning of a long slide into short-form clickbait and tech tutorials. This post-a-lot-and-see-what-sticks experiment is temporary, and calculated to do two things: 1) give me a lot of practice writing, and 2) create a large quantity of quietly useful posts that help people solve problems, and also bring in new readers for the more philosophical essays, by giving search engine exposure. In the long run, I plan to continue the gradual transition — which this experiment has temporarily interrupted — toward more in-depth posts and perennial topics. </p><p>Five or six of the posts are general-interest. My favorites are probably <a href="https://www.autodidacts.io/human-beings-are-waterproof/" rel="noreferrer"><em>Human Beings are Waterproof</em></a> and <a href="https://www.autodidacts.io/dostoyevsky-isnt-difficult/" rel="noreferrer"><em>Dostoyevsky Isn’t Difficult</em></a>. There are also a couple of posts on sleep (a favorite activity of mine). I drafted many philosophical posts, but I tended to get cold feet about publishing them when they were still raw, and fall back on tech how-tos. </p><p>I tried to put enough jokes in the niche tech tutorials to make them modestly entertaining even for people who don’t have the problems they solve. I enjoyed writing about <a href="https://www.autodidacts.io/star-wallabag-entry-from-koreader/" rel="noreferrer">Patching KOReader</a> (because I actually fixed it), <a href="https://www.autodidacts.io/split-testing-in-50-lines-of-javascript/" rel="noreferrer">Split Testing in ~50 Lines of JavaScript</a> (more technically in-depth than some), and <a href="https://www.autodidacts.io/ghost-newsletter-sign-up-spam/" rel="noreferrer">the psychology of Ghost signup spam</a> (because I made funny memes).</p><p>Here’s the full list of posts:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.autodidacts.io/cerelog-esp-eeg-affordable-openbci-like-board/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Cerelog’s ESP-EEG is a new 8 channel biosensing board at a hobbyist-friendly price</div><div class="kg-bookmark-description">The same number of channels of EEG/EMG/ECG for half the price</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.autodidacts.io/content/images/icon/autodidacts-logo-small-1.png" alt="" /><span class="kg-bookmark-author">The Autodidacts</span><span class="kg-bookmark-publisher">Curiositry</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.autodidacts.io/content/images/thumbnail/cerelog-esp-EEG.jpg" alt="" /></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.autodidacts.io/filter-rss-feeds-by-tag/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Filtering RSS feeds by tag</div><div class="kg-bookmark-description">Use CommaFeed filter expressions to hide irrelevant posts like this one</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.autodidacts.io/content/images/icon/autodidacts-logo-small-2.png" alt="" /><span class="kg-bookmark-author">The Autodidacts</span><span class="kg-bookmark-publisher">Curiositry</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.autodidacts.io/content/images/thumbnail/filter-rss-feeds-by-expression-commafeed-100daystooffload-example-2.png" alt="" /></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.autodidacts.io/long-sleep-duration-and-mortality/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">An unsolved question in sleep science</div><div class="kg-bookmark-description">Or, a display of my ignorance of sleep science</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.autodidacts.io/content/images/icon/autodidacts-logo-small-3.png" alt="" /><span class="kg-bookmark-author">The Autodidacts</span><span class="kg-bookmark-publisher">Curiositry</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.autodidacts.io/content/images/thumbnail/sleep-duration-and-all-cause-mortality-1.jpg" alt="" /></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.autodidacts.io/wallabag-instance-list/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">A list of public Wallabag instances that seem legit</div><div class="kg-bookmark-description">Especially free-to-use instances that might be around for a while</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.autodidacts.io/content/images/icon/autodidacts-logo-small-4.png" alt="" /><span class="kg-bookmark-author">The Autodidacts</span><span class="kg-bookmark-publisher">Curiositry</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.autodidacts.io/content/images/thumbnail/wallabag.png" alt="" /></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.autodidacts.io/star-wallabag-entry-from-koreader/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Patching KOReader Wallabag Plugin to add star support</div><div class="kg-bookmark-description">Now you can star Wallabag entries from the comfort of your Kobo e-reader</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.autodidacts.io/content/images/icon/autodidacts-logo-small-5.png" alt="" /><span class="kg-bookmark-author">The Autodidacts</span><span class="kg-bookmark-publisher">Curiositry</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.autodidacts.io/content/images/thumbnail/wallabag-star-article-from-koreader-main-lua.png" alt="" /></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.autodidacts.io/sleep-is-a-continuum/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Sleep is a continuum</div><div class="kg-bookmark-description">Don’t believe the Hypnograms</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.autodidacts.io/content/images/icon/autodidacts-logo-small-6.png" alt="" /><span class="kg-bookmark-author">The Autodidacts</span><span class="kg-bookmark-publisher">Curiositry</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.autodidacts.io/content/images/thumbnail/Sleep_Hypnogram.svg.png" alt="" /></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.autodidacts.io/wallabag-wins-despite-its-flaws/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Wallabag wins, despite its flaws</div><div class="kg-bookmark-description">Freedom and flexibility make up for the rough edges (and the competition has its own usability issues)</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.autodidacts.io/content/images/icon/autodidacts-logo-small-7.png" alt="" /><span class="kg-bookmark-author">The Autodidacts</span><span class="kg-bookmark-publisher">Curiositry</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.autodidacts.io/content/images/thumbnail/wallabag-screenshot.png" alt="" /></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.autodidacts.io/horrible-amazing-regex/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Regex is horrible, yet regex is amazing</div><div class="kg-bookmark-description">And it’s not just for programmers</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.autodidacts.io/content/images/icon/autodidacts-logo-small-8.png" alt="" /><span class="kg-bookmark-author">The Autodidacts</span><span class="kg-bookmark-publisher">Curiositry</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.autodidacts.io/content/images/thumbnail/the-power-of-regex-libreoffice-telephone-number-format-search-and-replace-1.gif" alt="" /></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.autodidacts.io/create-custom-filtered-rss-feeds-with-ghost-cms-routes-channels/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Create custom filtered RSS feeds in Ghost, the easy way</div><div class="kg-bookmark-description">Create custom feeds, on custom routes, without editing theme files</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.autodidacts.io/content/images/icon/autodidacts-logo-small-9.png" alt="" /><span class="kg-bookmark-author">The Autodidacts</span><span class="kg-bookmark-publisher">Curiositry</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.autodidacts.io/content/images/thumbnail/invalid-rss-feed-2-1.png" alt="" /></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.autodidacts.io/script-export-post-as-markdown-via-ghost-admin-api/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Script: export post as Markdown via Ghost Admin API</div><div class="kg-bookmark-description">Once upon a time I deleted the production database</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.autodidacts.io/content/images/icon/autodidacts-logo-small-10.png" alt="" /><span class="kg-bookmark-author">The Autodidacts</span><span class="kg-bookmark-publisher">Curiositry</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.autodidacts.io/content/images/thumbnail/ghost-markdown-export-script.png" alt="" /></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.autodidacts.io/migrate-kobo-ereader-content-books-annotations-to-new-device/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">How to Migrate Kobo eReader Books &amp; Annotations to a New Device</div><div class="kg-bookmark-description">And probably not even brick it</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.autodidacts.io/content/images/icon/autodidacts-logo-small-11.png" alt="" /><span class="kg-bookmark-author">The Autodidacts</span><span class="kg-bookmark-publisher">Curiositry</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.autodidacts.io/content/images/thumbnail/Kobo_ereader_touch_black_front.JPG" alt="" /></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.autodidacts.io/ghost-newsletter-sign-up-spam/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">What’s the end game for Ghost newsletter sign-up spam?</div><div class="kg-bookmark-description">My theory of mind is failing</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.autodidacts.io/content/images/icon/autodidacts-logo-small-12.png" alt="" /><span class="kg-bookmark-author">The Autodidacts</span><span class="kg-bookmark-publisher">Curiositry</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.autodidacts.io/content/images/thumbnail/Bavarian_troops_attack_rebels_in_a_towerhouse.jpg" alt="" /></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.autodidacts.io/fish-bash-clipboard-append-to-file/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">A Fish shortcut for rapidly appending clipboard data to text files</div><div class="kg-bookmark-description">Text editors are for normies</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.autodidacts.io/content/images/icon/autodidacts-logo-small-13.png" alt="" /><span class="kg-bookmark-author">The Autodidacts</span><span class="kg-bookmark-publisher">Curiositry</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.autodidacts.io/content/images/thumbnail/fish-bash-rapid-append-to-text-file.png" alt="" /></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.autodidacts.io/split-testing-in-50-lines-of-javascript/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Split Testing in ~50 lines of JavaScript</div><div class="kg-bookmark-description">I tried to use a Matomo A/B testing plugin and it didn’t work, so I wrote my own: sometimes, re-inventing the wheel is the fastest way to get on the road.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.autodidacts.io/content/images/icon/autodidacts-logo-small-14.png" alt="" /><span class="kg-bookmark-author">The Autodidacts</span><span class="kg-bookmark-publisher">Curiositry</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.autodidacts.io/content/images/thumbnail/matomo-segment-split-test-analysis-1.png" alt="" /></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.autodidacts.io/whispering-open-source-dictation-app-for-linux/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Finally, an open-source dictation app for Linux that actually works</div><div class="kg-bookmark-description">For decades, I’ve contemplated capitulating and buying a proprietary dictation app, such as Dragon Naturally Speaking. Now I don’t have to.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.autodidacts.io/content/images/icon/autodidacts-logo-small-15.png" alt="" /><span class="kg-bookmark-author">The Autodidacts</span><span class="kg-bookmark-publisher">Curiositry</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.autodidacts.io/content/images/thumbnail/whispering-open-source-linux-dictation-app-screenshot-2.png" alt="" /></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.autodidacts.io/readeck-open-source-read-it-later-app-with-kobo-support/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">And then there’s Readeck</div><div class="kg-bookmark-description">A look at another open-source read-it-later app with Kobo support</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.autodidacts.io/content/images/icon/autodidacts-logo-small-16.png" alt="" /><span class="kg-bookmark-author">The Autodidacts</span><span class="kg-bookmark-publisher">Curiositry</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.autodidacts.io/content/images/thumbnail/readeck-read-it-later-screenshot.png" alt="" /></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.autodidacts.io/human-beings-are-waterproof/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Human beings are waterproof</div><div class="kg-bookmark-description">Some exceptions apply</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.autodidacts.io/content/images/icon/autodidacts-logo-small-17.png" alt="" /><span class="kg-bookmark-author">The Autodidacts</span><span class="kg-bookmark-publisher">Curiositry</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.autodidacts.io/content/images/thumbnail/storm-run.jpg" alt="" /></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.autodidacts.io/personal-shorthand-symbols/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">The Benefits of Creating a Personal Shorthand of Symbols</div><div class="kg-bookmark-description">A guide to devolving your handwriting</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.autodidacts.io/content/images/icon/autodidacts-logo-small-18.png" alt="" /><span class="kg-bookmark-author">The Autodidacts</span><span class="kg-bookmark-publisher">Curiositry</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.autodidacts.io/content/images/thumbnail/Gregg_shorthand_A_Christmas_Carol.jpg" alt="" /></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.autodidacts.io/free-silver-price-api/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">I couldn’t find a free Silver price API — so I’m making one</div><div class="kg-bookmark-description">Writing a web app because I want to do calculations in a spreadsheet</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.autodidacts.io/content/images/icon/autodidacts-logo-small-19.png" alt="" /><span class="kg-bookmark-author">The Autodidacts</span><span class="kg-bookmark-publisher">Curiositry</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.autodidacts.io/content/images/thumbnail/Ag_annual_average_USD_price_1792-2005.svg.png" alt="" /></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.autodidacts.io/dostoyevsky-isnt-difficult/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Dostoyevsky isn’t difficult</div><div class="kg-bookmark-description">Other than the names. The names are difficult.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.autodidacts.io/content/images/icon/autodidacts-logo-small-20.png" alt="" /><span class="kg-bookmark-author">The Autodidacts</span><span class="kg-bookmark-publisher">Curiositry</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.autodidacts.io/content/images/thumbnail/Dostoyevsky_on_his_Bier-_Kramskoy.jpg" alt="" /></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.autodidacts.io/my-free-daily-silver-price-api-is-live/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">My Free Daily Silver Price API is Live</div><div class="kg-bookmark-description">What comes before alpha?</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.autodidacts.io/content/images/icon/autodidacts-logo-small-21.png" alt="" /><span class="kg-bookmark-author">The Autodidacts</span><span class="kg-bookmark-publisher">Curiositry</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.autodidacts.io/content/images/thumbnail/free_daily_cad_silver_bid_price_api.png" alt="" /></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.autodidacts.io/parse-filter-json-api-responses-in-libreoffice-calc/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">It’s 2026 and LibreOffice Calc still can’t parse JSON API responses without a plugin</div><div class="kg-bookmark-description">I check every year or so</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.autodidacts.io/content/images/icon/autodidacts-logo-small-22.png" alt="" /><span class="kg-bookmark-author">The Autodidacts</span><span class="kg-bookmark-publisher">Curiositry</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.autodidacts.io/content/images/thumbnail/how-to-use-libreoffice-calc-jsonparse-plugin-big.png" alt="" /></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.autodidacts.io/i-fixed-my-crashing-aws-t2-micro-instance-by-adding-swap/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">I fixed my crashing AWS t2.micro instance by adding swap</div><div class="kg-bookmark-description">An obvious solution to a simple problem, overlooked due to previous experience</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.autodidacts.io/content/images/icon/autodidacts-logo-small-23.png" alt="" /><span class="kg-bookmark-author">The Autodidacts</span><span class="kg-bookmark-publisher">Curiositry</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.autodidacts.io/content/images/thumbnail/aws-htop-screenshot.png" alt="" /></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.autodidacts.io/computer-literacy-filter-bubble/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">You’re in a computer literacy filter bubble</div><div class="kg-bookmark-description">Someone I know started teaching a podcasting course at a better-than-average high school in one of the richest parts of one of the richest countries. After his first day, he told me, with wide eyes, some of the students don’t know how to move or copy a file. I</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.autodidacts.io/content/images/icon/autodidacts-logo-small-25.png" alt="" /><span class="kg-bookmark-author">The Autodidacts</span><span class="kg-bookmark-publisher">Curiositry</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.autodidacts.io/content/images/thumbnail/fortran-1.gif" alt="" /></div></a></figure><hr /><p><strong>Thanks for sticking with us for this experiment!</strong></p><p>If you have any topics you’d like to see covered in the next 25 posts, hit reply.</p><p>The Autodidacts</p>
www.autodidacts.io
January 28, 2026 at 9:34 PM
For decades, I’ve contemplated capitulating and buying a proprietary dictation app, such as Dragon Naturally Speaking. Now I don't have to.

Because finally, there’s an open-source dictation app for Linux that actually works! […]

[Original post on autodidacts.io]
January 27, 2026 at 2:43 AM
A better version of the script I wrote for Wallabag
Script: bulk star Readeck entries by URL (with URL cleaning)
<small><div class="kg-card kg-callout-card kg-callout-card-yellow"><div class="kg-callout-text"><b><strong style="white-space:pre-wrap">Note:</strong></b> this post is part of <a href="https://www.autodidacts.io/100daystooffload/">#100DaysToOffload</a>, a challenge to publish 100 posts in 365 days. These posts are generally shorter and less polished than our normal posts; expect typos and unfiltered thoughts! <a href="https://www.autodidacts.io/tag/100daystooffload/">View more posts in this series.</a></div></div></small><br /> <p>I have adapted <a href="https://www.autodidacts.io/star-entries-by-url-wallabag-api-python-script/">the script I wrote for Wallabag</a> to work with the <a href="https://www.autodidacts.io/readeck-open-source-read-it-later-app-with-kobo-support/">Readeck</a> API, and made it vastly better in the process.</p> <p>Please refer to the previous article for basic information on usage, jq pipelines for bulk starring, configuration, and dependencies; that stuff is mostly the same.</p> <p>In this post, I’ll just cover what’s <em>different.</em></p> <ol> <li>This script uses authlib for OAuth bearer token authentication. This means, in your environment variables, you can skip username, password, etc, and just provide <em>tw</em>o environment variables: <code>READECK_BASE_URL</code> and <code>READECK_API_TOKEN</code>.</li> <li>There are two additional dependencies, so the uv pip install command is: <code>uv pip install json requests authlib urlparse</code></li> <li>Readeck doesn’t provide an “exists” endpoint. I tried using the search parameter, but it didn’t work, so what I ended up doing is fetching all bookmarks from the (paginated) API the first time it runs, and caching them in /tmp/readeck-bookmarks.json. Subsequent runs always use the cached version if it’s there.</li> <li>While Wallabag seemed to store the URLs imported from the Pocket CSV basically unchanged, Readeck URLs don’t always match the original URL that was imported. So this script has a long chain of redirect-following and URL cleaning logic. If it fails to match a URL, it then fetches the headers and checks where the URL currently redirects to, and tries that. If that doesn’t work, it cleans the original URL, removing the scheme, query parameters, and fragment, and tries that. Then it tries a cleaned version of the redirected URL. Then it gives up.</li> </ol> <p>Though this script is way fancier than my Wallabag script, it <em>still</em> doesn’t work as well. The Wallabag script was able to star 654 articles (ie, it missed one).</p> <p>This script starred 621 articles. It admits it failed, for good reason, on two. I’m still sorting out the remaining 31. One of them was <a href="https://en.wikipedia.org/wiki/M%C3%BCnchhausen_trilemma"><code>https://en.wikipedia.org/wiki/M%C3%BCnchhausen_trilemma</code></a>…</p> <p>Here’s the script:</p> <pre><code class="language-python">import requests from urllib.parse import urlparse, urlunparse import json import os import os.path import sys from authlib.integrations.requests_client import OAuth2Auth class ReadeckAPI: def __init__(self, BASE_URL, API_TOKEN): self.BASE_URL = BASE_URL self.API_TOKEN = API_TOKEN self.access_token = None def fetch_bookmarks(self): params = {'limit': 100} headers = {'Authorization': f'Bearer {self.API_TOKEN}'} # params = {} endpoint = f"{self.BASE_URL}/api/bookmarks" self.data = [] def fetch_page(endpoint): response = requests.get(endpoint, headers=headers, params=params) response.raise_for_status() newdata = response.json() # print(newdata) self.data = self.data + newdata # print(self.data) print(len(newdata)) print(len(self.data)) if response.headers['Current-Page'] != response.headers['Total-Pages']: print(f"Page {response.headers['Current-Page']} of {response.headers['Total-Pages']}") # print(f"Fetching {response.links['next']['url']}") fetch_page(response.links['next']['url']) fetch_page(endpoint) def get_redirect_destination(self,url): r = requests.head(url, allow_redirects=True) return r.url def star_article_by_url(self, url): """Star an article by its URL""" for bookmark in self.data: if url in bookmark['url'] or bookmark['url'] in url: print(f"Starring {bookmark['id']} ({url})") # Star the article headers = {'Authorization': f'Bearer {self.API_TOKEN}'} response = requests.patch( f"{self.BASE_URL}/api/bookmarks/{bookmark['id']}", headers=headers, data={'is_marked': True} ) response.raise_for_status() return True else: # print(f"URL doesn't match ({url} != {bookmark['url']}") continue print(f"URL not found in bookmarks: {url}") return False # Initialize API client Readeck = ReadeckAPI( BASE_URL=os.environ["READECK_BASE_URL"], API_TOKEN=os.environ["READECK_API_TOKEN"], ) if __name__ == "__main__": if len(sys.argv) != 2: print("Usage: python script.py &lt;article_url&gt;") sys.exit(1) url = sys.argv[1] # Cache all bookmarks for bulk starring if os.path.isfile('/tmp/readeck-bookmarks.json') != True: Readeck.fetch_bookmarks() with open('/tmp/readeck-bookmarks.json', 'w+', encoding='utf-8') as f: json.dump(Readeck.data, f, ensure_ascii=False, indent=4) else: with open('/tmp/readeck-bookmarks.json') as f: Readeck.data = json.load(f) success = Readeck.star_article_by_url(url) if success != True: redirected_url = Readeck.get_redirect_destination(url) if redirected_url != url: try: answer = input(f"URL redirects to {redirected_url}. Use that URL to star?") if answer.lower() in ["y","yes"]: success = Readeck.star_article_by_url(redirected_url) if success == True: exit(0) elif answer.lower() in ["n","no"]: exit(1) # if running in bulk, follow redirects without prompting except: print(f"URL redirects to {redirected_url}. Trying that URL.") success = Readeck.star_article_by_url(redirected_url) if success == True: exit(0) else: print(f"Failed to star both URL ({url} and redirected URL ({redirected_url})") u = urlparse(url) # print(u) newu = u._replace(scheme="",fragment="",query="") # print(newu) cleaned_url= urlunparse(newu) print(f"Trying with cleaned URL {cleaned_url}") success = Readeck.star_article_by_url(cleaned_url) if success == True: exit(0) else: print(f"Failed to star cleaned URL ({cleaned_url}). Cleaning redirected URL and trying that.") u = urlparse(redirected_url) # print(u) newu = u._replace(scheme="",fragment="",query="") # print(newu) cleaned_redirected_url = urlunparse(newu) print(f"Trying with cleaned redirected URL {cleaned_redirected_url}") success = Readeck.star_article_by_url(cleaned_redirected_url) if success == True: exit(0) else: print(f"Total fail for url: {url}") exit(1) </code></pre>
www.autodidacts.io
January 27, 2026 at 12:03 AM