<?xml version='1.0' encoding='utf-8'?>
<feed xmlns="http://www.w3.org/2005/Atom"><id>https://peter.demin.dev/life.xml</id><title>Peter Demin</title><updated>2026-08-29T00:00:00Z</updated><link rel="self" href="https://peter.demin.dev/life.xml"/><link href="https://peter.demin.dev/life.html"/><author><name>Peter Demin</name></author><entry><id>Aug 29, 2026_0</id><title>Journal</title><published>2026-08-29T00:00:00Z</published><updated>2026-08-29T00:00:00Z</updated><link href="https://peter.demin.dev/life/aug-29-2026_0.html"/><content type="html"><![CDATA[<p>Frigid compostable biomass. American cousine.</p>
]]></content></entry><entry><id>Aug 23, 2026_0</id><title>Journal</title><published>2026-08-23T00:00:00Z</published><updated>2026-08-23T00:00:00Z</updated><link href="https://peter.demin.dev/life/aug-23-2026_0.html"/><content type="html"><![CDATA[<p>I like Rippling engineering blog, but it doesn't expose an RSS feed. And that's how I like my blogs.
To add offense to the injury, their page uses client-side pagination, and can't be easily scrapped.
So I had to vibe a Selenium scraper to fetch all article URLs, and then extract their metadata using regular requests.
Anyway, here's the Atom RSS: <a href="https://peter.demin.dev/_static/rippling.atom.xml"><?xml version='1.0' encoding='utf-8'?>Rippling Enginnering Blog RSS</a>
I don't have plans on updating it though.</p>
]]></content></entry><entry><id>Aug 17, 2026_0</id><title>Journal</title><published>2026-08-17T00:00:00Z</published><updated>2026-08-17T00:00:00Z</updated><link href="https://peter.demin.dev/life/aug-17-2026_0.html"/><content type="html"><![CDATA[<p>Yep, lowering the mainsail killed the boat speed while heaving to.</p>
<p>More things I learned:</p>
<ul>
<li>Tie five butterfly knots every foot or so to make a short rope ladder.</li>
<li>Hang it from a whinch or cleat to climb aboard from water.</li>
<li>Let a long end drift behind the boat.</li>
<li>It's okay to go for a swim while heaving to if you can climb back.</li>
<li>Even when single-handing.</li>
<li>If you stare at windex long enough, you learn how the wind feels on your face.</li>
<li>Then you can sail without looking at windex.</li>
<li>If you listen to the sails long enough, you don't need to look at them.</li>
<li>It's okay to sail at night if you know the area, can go without windex, and know how sails sound.</li>
<li>Garmin Navionics is helpful too.</li>
<li>When keeping bearing using compass, turn tiller towards the azimuth you want to be on.</li>
<li>When running turn tiller towards the sail that luffs.</li>
<li>Foilers love to catch motorboat wakes. Some people run the boats just to give them a ride.</li>
<li>Wakes kill the sailboat speed though.</li>
<li>Don't try to tack over a wake.</li>
</ul>
]]></content></entry><entry><id>Aug 09, 2026_0</id><title>Journal</title><published>2026-08-09T00:00:00Z</published><updated>2026-08-09T00:00:00Z</updated><link href="https://peter.demin.dev/life/aug-09-2026_0.html"/><content type="html"><![CDATA[<p>Heaving to is an important skill for single-handing the sailboat.
It takes some skill to predict the drift direction and speed.
My boat drifts downwind and forward, maybe at 45 degrees to wind.
Maybe that's because the spreader is angled a bit aft, and main lays on it, preventing it from aligning with the wind.
I saw the boat speed go up to a knot while drifting, which is comparable to drifting with sails down,
and is greater than the speed of smaller drifting power boats.
When planning to heave to I can choose one of two broad reach directions to drift to.
Being on starboard tack makes me a stand-on vehicle, but in practice everyone gives me way regardless of tack.</p>
]]></content></entry><entry><id>Aug 08, 2026_0</id><title>Journal</title><published>2026-08-08T00:00:00Z</published><updated>2026-08-08T00:00:00Z</updated><link href="https://peter.demin.dev/life/aug-08-2026_0.html"/><content type="html"><![CDATA[<p>I learned a few things about electricity.
The boat came with a trolling motor directly connected to a battery, so I had to figure out the proper protection.
The first iteration was two manual circuit breakers: one between battery and power bus and another between power bus and the motor.
I checked the prices for marine equipement, and tried to save money by going with cheap automotive breakers.
That was a mistake.
A no-name $10 breaker seemed to work fine in a short test, but under the load of high speed setting,
the motor was shutting off within two minutes.
This got me into a peculiar situation while passing through a narrow channel, and later when undocking in high beam wind.
Turned out, each breaker was dropping substantial 0.45V and was overheating.
The BMS (battery management system) was detecting high voltage drop, and was disconnecting the circuit.
I upgraded to a proper fuse sitting right on top of the positive battery terminal, and a proper brand marine circuit breaker.
The new system drop 0.1V on both connections when drawing ~42A, which is considered a bit high.
But the BMS no longer trips, and I can go on high speed reliably (tested with a 15 minutes run).
The battery side of the breaker heats considerably, so that I can touch but can't hold it in my fingers.
I checked the lug contact, made sure it's clean and snug, the heat seems to come from inside the breaker.
Not ideal, but manageable. I rarely need to go on top speed for longer than a few seconds.</p>
]]></content></entry><entry><id>Aug 06, 2026_0</id><title>Journal</title><published>2026-08-06T00:00:00Z</published><updated>2026-08-06T00:00:00Z</updated><link href="https://peter.demin.dev/life/aug-06-2026_0.html"/><content type="html"><![CDATA[<p>I should look into this someday: https://pgtune.leopard.in.ua</p>
]]></content></entry><entry><id>Aug 04, 2026_0</id><title>Journal</title><published>2026-08-04T00:00:00Z</published><updated>2026-08-04T00:00:00Z</updated><link href="https://peter.demin.dev/life/aug-04-2026_0.html"/><content type="html"><![CDATA[<p><a href="https://github.com/ToneyAlexander/inclusive-color-space">ToneyAlexander/inclusive-color-space</a></p>
]]></content></entry><entry><id>Jul 26, 2026_0</id><title>Journal</title><published>2026-07-26T00:00:00Z</published><updated>2026-07-26T00:00:00Z</updated><link href="https://peter.demin.dev/life/jul-26-2026_0.html"/><content type="html"><![CDATA[<p>more things I learned:</p>
<ol>
<li>Blisters in fiber glass hull pack acid under 150+ psi.</li>
<li>Main sail slides are made of plastic, so they break before the main sail tears.</li>
<li>On older boats you need to remove a rivet to remove a broken slide from the mast tracks. And put a new rivet after the fix.</li>
<li>The best way to remove a rivet is to drill it through, being careful to not damage the hole.</li>
<li>Home depot doesn't stock stainless rivets.</li>
<li>Marine rivets are 59c a piece.</li>
<li>Battery uses 12V 20A direct current. This requires thick 10 gauge wires, that you normally won't find at home.</li>
<li>Electric motor, even trolling one, draws much more.</li>
</ol>
]]></content></entry><entry><id>Jul 23, 2026_0</id><title>Journal</title><published>2026-07-23T00:00:00Z</published><updated>2026-07-23T00:00:00Z</updated><link href="https://peter.demin.dev/life/jul-23-2026_0.html"/><content type="html"><![CDATA[<p>things I learned about sailing:</p>
<ol>
<li>It’s okay for a sailboat to be old. Fiberglass ages well. 1979 boat can be as seaworthy as 2026.</li>
<li>Sailboats don’t need to be expensive. Even though many of them are. My trick is to buy from a nonprofit, that accepts boat donations.</li>
<li>Small boats are fun to sail. If that’s your goal, 22 feet is big enough.</li>
<li>All moving parts need occasional lubrication. Don’t use household grease or oil though, because that attracts dirt and becomes a mess. Get a drying spray, like Teflon, or a specialized marine lubricant.</li>
<li>Not any sailboat is good for single-handing. All sheets must be reachable from tiller.</li>
<li>With single-handing, one hand holds tiller and main sheet, the other works jib sheets. Tuck jib sheet with main, to grab it with a free hand. Put tiller under a knee when need two hands. Having an autopilot helps when raising or lowering sails, but not required.</li>
<li>Gasoline motor needs to be serviced every 100 hours of work.</li>
<li>Electrical motors have limited range, and are more expensive. Except low-power trolley motors, those are cheap but weak.</li>
<li>You can start with just sheets, but for best performance, learn how to use boomvang, outhaul, downhaul, and mast bender to change the shape of the main sail.</li>
<li>Jib is fine for mild wind. For wind speed above 15 mph get a furler or a storm jib. Genoa for light winds. Spinnaker for long downwind legs.</li>
</ol>
]]></content></entry><entry><id>Jun 22, 2026_0</id><title>Journal</title><published>2026-06-22T00:00:00Z</published><updated>2026-06-22T00:00:00Z</updated><link href="https://peter.demin.dev/life/jun-22-2026_0.html"/><content type="html"><![CDATA[<p><a href="https://github.com/ngrok/webernetes">ngrok/webernetes</a> - Kubernetes in the browser.</p>
]]></content></entry><entry><id>Jun 15, 2026_0</id><title>Journal</title><published>2026-06-15T00:00:00Z</published><updated>2026-06-15T00:00:00Z</updated><link href="https://peter.demin.dev/life/jun-15-2026_0.html"/><content type="html"><![CDATA[<p>True leaders ask not what their country can do for them - they grab what they can reach and get what they can get away with.</p>
]]></content></entry><entry><id>Jun 07, 2026_0</id><title>Journal</title><published>2026-06-07T00:00:00Z</published><updated>2026-06-07T00:00:00Z</updated><link href="https://peter.demin.dev/life/jun-07-2026_0.html"/><content type="html"><![CDATA[<p>As many of the ape descendants on mostly harmless planet know, Earth was built for mice with a sole purpose of finding the question to Life, the Universe and Everything.
All living organisms are a part of the most powerful computer, working together to finish the computation.</p>
<p>Sometimes I feel this way, that every person carries a thought through their life.
It's not something specific or practical in day-to-day.
It's not even the answer which is well-known to be 42.
The sum of all experiences accumulated, distilled, and combined uniquely by each individual serve some higher purpose.</p>
<p>And the desire to continue the lineage is mainly to take another shot in this research.
Create another human being to take their stab at the problem.
Completing the thought might result in immediate anihilation of the universe, and it might have happened before.
But still, we just can't help it.</p>
]]></content></entry><entry><id>Jun 05, 2026_0</id><title>Journal</title><published>2026-06-05T00:00:00Z</published><updated>2026-06-05T00:00:00Z</updated><link href="https://peter.demin.dev/life/jun-05-2026_0.html"/><content type="html"><![CDATA[<p><a href="https://github.com/jgm/gitit">jgm/gitit</a> - A wiki using HAppS, pandoc, and git</p>
]]></content></entry><entry><id>Jun 02, 2026_2</id><title>Journal</title><published>2026-06-02T00:00:00Z</published><updated>2026-06-02T00:00:00Z</updated><link href="https://peter.demin.dev/life/jun-02-2026_2.html"/><content type="html"><![CDATA[<p><a href="https://github.com/advplyr/audiobookshelf-app">advplyr/audiobookshelf-app</a> - Mobile application for Audiobookshelf</p>
]]></content></entry><entry><id>Jun 02, 2026_1</id><title>Journal</title><published>2026-06-02T00:00:00Z</published><updated>2026-06-02T00:00:00Z</updated><link href="https://peter.demin.dev/life/jun-02-2026_1.html"/><content type="html"><![CDATA[<p><a href="https://github.com/advplyr/audiobookshelf">advplyr/audiobookshelf</a> - Self-hosted audiobook and podcast server</p>
]]></content></entry><entry><id>Jun 02, 2026_0</id><title>Journal</title><published>2026-06-02T00:00:00Z</published><updated>2026-06-02T00:00:00Z</updated><link href="https://peter.demin.dev/life/jun-02-2026_0.html"/><content type="html"><![CDATA[<p><a href="https://github.com/docusealco/docuseal">docusealco/docuseal</a> - Open source DocuSign alternative. Create, fill, and sign digital documents ✍️</p>
]]></content></entry><entry><id>Jun 01, 2026_0</id><title>Journal</title><published>2026-06-01T00:00:00Z</published><updated>2026-06-01T00:00:00Z</updated><link href="https://peter.demin.dev/life/jun-01-2026_0.html"/><content type="html"><![CDATA[<p><a href="https://github.com/anthropic-experimental/sandbox-runtime">anthropic-experimental/sandbox-runtime</a> - A lightweight sandboxing tool for enforcing filesystem and network restrictions on arbitrary processes at the OS level, without requiring a container.</p>
]]></content></entry><entry><id>May 31, 2026_2</id><title>Journal</title><published>2026-05-31T00:00:00Z</published><updated>2026-05-31T00:00:00Z</updated><link href="https://peter.demin.dev/life/may-31-2026_2.html"/><content type="html"><![CDATA[<p><a href="https://github.com/mszep/pandoc_resume">mszep/pandoc_resume</a> - The Markdown Resume</p>
]]></content></entry><entry><id>May 31, 2026_1</id><title>Journal</title><published>2026-05-31T00:00:00Z</published><updated>2026-05-31T00:00:00Z</updated><link href="https://peter.demin.dev/life/may-31-2026_1.html"/><content type="html"><![CDATA[<p>Print all local branch names with date of last commit:</p>
<pre><code class="language-bash">git branch --list | cut -c3- | while read branch; do git log -1 $branch --format=&quot;%ai $branch&quot; -- | cat; done | sort
</code></pre>
]]></content></entry><entry><id>May 31, 2026_0</id><title>Journal</title><published>2026-05-31T00:00:00Z</published><updated>2026-05-31T00:00:00Z</updated><link href="https://peter.demin.dev/life/may-31-2026_0.html"/><content type="html"><![CDATA[<p>I own the only shop in Seattle, that figured out how to build software at high quality, high speed, and at a low price. Naturally, we're booked for the next 200 years, so I won't even put the shop's name here.</p>
]]></content></entry><entry><id>May 25, 2026_0</id><title>Journal</title><published>2026-05-25T00:00:00Z</published><updated>2026-05-25T00:00:00Z</updated><link href="https://peter.demin.dev/life/may-25-2026_0.html"/><content type="html"><![CDATA[<p><a href="https://semicolony.dev/">;colony</a> looks cool on surface.
What surprised me first was a lack of any information about the people who built it.
Hinting to a lack of team, given the amount of content.
Reading the materials made it clear that the whole thing is AI-generated.
The idea is great, the design is great, maybe the content is useful, but without a human review, this is not any better than just ChatGPT.
Bummer.</p>
]]></content></entry><entry><id>May 24, 2026_0</id><title>Journal</title><published>2026-05-24T00:00:00Z</published><updated>2026-05-24T00:00:00Z</updated><link href="https://peter.demin.dev/life/may-24-2026_0.html"/><content type="html"><![CDATA[<p>My libvirt-based Vagrant box failed to start with a cryptic error message.
I fixed it by renaming the box from &quot;default&quot; to &quot;trixie&quot;, which is a pretty cryptic way of fixing a VM.</p>
<p>While debugging this I learned about Vagrant 3.0 - a Golang rewrite, that was
<a href="https://www.hashicorp.com/en/blog/toward-vagrant-3-0">announced</a> in 2021 by Chris Roberts and Sophia Castellarin.</p>
<p>The last mention of this project is from 2025 in <a href="https://github.com/hashicorp/vagrant/pull/13622">PR #13622</a>, that provides this much information:</p>
<blockquote>
<p>Removes the vagrant-go implementation. A backup of the work has been retained on the vagrant-go branch.</p>
</blockquote>
<p>Fun fact: the PR author is the very same <a href="https://github.com/chrisroberts">Chris Roberts</a> who announced it 4 years earlier.</p>
]]></content></entry><entry><id>May 09, 2026_0</id><title>Journal</title><published>2026-05-09T00:00:00Z</published><updated>2026-05-09T00:00:00Z</updated><link href="https://peter.demin.dev/life/may-09-2026_0.html"/><content type="html"><![CDATA[<p>Added <a href="https://peter.demin.dev/12_articles/84-taste.html">On Taste</a></p>
]]></content></entry><entry><id>May 04, 2026_0</id><title>Journal</title><published>2026-05-04T00:00:00Z</published><updated>2026-05-04T00:00:00Z</updated><link href="https://peter.demin.dev/life/may-04-2026_0.html"/><content type="html"><![CDATA[<p><a href="https://github.com/mobile-shell/mosh">mobile-shell/mosh</a> - Mobile Shell</p>
]]></content></entry><entry><id>Apr 13, 2026_0</id><title>Journal</title><published>2026-04-13T00:00:00Z</published><updated>2026-04-13T00:00:00Z</updated><link href="https://peter.demin.dev/life/apr-13-2026_0.html"/><content type="html"><![CDATA[<p>Reading <a href="https://www.nibzard.com/ai-native-dev-teams/">AI-Native Dev Teams Start With Structure, Not Models</a> by Nikola Balic reminded me of <a href="https://www.seangoedecke.com/seeing-like-a-software-company/">Seeing like a software company</a> by Sean Goedecke.
The legible teams are more ready for AI-assisted development, because easy information access is what makes building LLM context easy.
Another trait that helps is being remote-first or distributed.
Anything that forces people to write down what they discussed.</p>
]]></content></entry><entry><id>Apr 08, 2026_0</id><title>Journal</title><published>2026-04-08T00:00:00Z</published><updated>2026-04-08T00:00:00Z</updated><link href="https://peter.demin.dev/life/apr-08-2026_0.html"/><content type="html"><![CDATA[<p>Please welcome <a href="https://www.nibzard.com/">Nikola Balic</a>, who's been writing some great posts recently and is taking place of <a href="https://www.seangoedecke.com/">Sean Goedecke</a></p>
]]></content></entry><entry><id>Mar 29, 2026_0</id><title>Journal</title><published>2026-03-29T00:00:00Z</published><updated>2026-03-29T00:00:00Z</updated><link href="https://peter.demin.dev/life/mar-29-2026_0.html"/><content type="html"><![CDATA[<p><a href="https://github.com/mlu-explain/mlu-explain.github.io">mlu-explain/mlu-explain.github.io</a></p>
]]></content></entry><entry><id>Mar 28, 2026_0</id><title>Journal</title><published>2026-03-28T00:00:00Z</published><updated>2026-03-28T00:00:00Z</updated><link href="https://peter.demin.dev/life/mar-28-2026_0.html"/><content type="html"><![CDATA[<p>Quoting <a href="https://www.neversaw.us/2026/03/26/you-have-to-know-what-to-wish-for/">you have to know what to wish for</a> by Chris Dickinson.</p>
<blockquote>
<p>The programmer has a theory of the system, developed in concert with that system.
That theory is a mental model, a map of the system, problem space, and how it might react to changes in the future.</p>
</blockquote>
<p>This is how I've been thinking about the value I bring to the company for a long time.
Mental model of the problem space, simplified model for the software solving the problem, and the ability to translate between them.
Many times I saw how the engineering team has the best understanding of business at the technical level.
And how adding new requirements for an existing product requires rethinking the model.</p>
<p>On a surface level you can't tell much difference between a commit of a senior and a new team member.
That's what makes people think that LLMs are a threat to the craft of programming.
But there's no substitute to the deep understanding of a system that people posses.
LLMs has to rebuild the context in every session, it's different every time and never complete.</p>
]]></content></entry><entry><id>Mar 24, 2026_0</id><title>Journal</title><published>2026-03-24T00:00:00Z</published><updated>2026-03-24T00:00:00Z</updated><link href="https://peter.demin.dev/life/mar-24-2026_0.html"/><content type="html"><![CDATA[<p>Here's how I like to structure application's entry point (aka <code>main()</code>).</p>
<ol>
<li>It's responsibility is to provide CLI interface to the library.</li>
<li>It parses CLI arguments, loads configuration files, constructs the processing pipeline and kicks it off.</li>
<li>Each step might be extracted into a separate function/class/module as it grows in complexity.</li>
<li>One common pattern is to construct intermiate immutable configuration object from arguments and configuration files and pass down to a dedicated factory.
This way factory is easy to reuse and test without working around arguments parsing.
On the cons side, each parameter spreads over three places: CLI, intermediate config, actor constructor.</li>
<li>The same patterns works well for both local scripts and API services.</li>
</ol>
<p>This is mostly common sense, and I've seen more specific and more generic versions of this design many times.
I never meant to write it down, as there's no novelty in clean code layout, until I made a habbit of explaining this to LLMs over and over.</p>
]]></content></entry><entry><id>Mar 09, 2026_0</id><title>Journal</title><published>2026-03-09T00:00:00Z</published><updated>2026-03-09T00:00:00Z</updated><link href="https://peter.demin.dev/life/mar-09-2026_0.html"/><content type="html"><![CDATA[<p>I enjoyed <a href="https://fazy.medium.com/agentic-coding-ais-adolescence-b0d13452f981">&quot;Verification debt: the hidden cost of AI-generated code&quot;</a> by Lars Janssen.
Author explains from different viewpoints, how writing code is not the primary work of software engineers.
Understanding problem, and delivering solution is.
Sure, writing code is one side of it.
Making it reliable, efficient, effective, intuitive, and few dozen more adjectives are other sides.</p>
<p>Reviewing slop is no fun.
That guy sure saved some of his time creating this pull request.
Or did he just transfer it to me?</p>
<p>I see people who have no business building software produce more code than I can review.
And then they me ask questions about their code that a junior developer wouldn't.</p>
]]></content></entry><entry><id>Mar 04, 2026_0</id><title>Journal</title><published>2026-03-04T00:00:00Z</published><updated>2026-03-04T00:00:00Z</updated><link href="https://peter.demin.dev/life/mar-04-2026_0.html"/><content type="html"><![CDATA[<p>Deranged Pirawd.</p>
<ol>
<li>Mailbox trigger for any inbound email passing the plain text body.</li>
<li>An agent with only two tools: <code>respond</code>, and <code>get_credentials</code>.</li>
<li>LLM prompted to act as a Deranged Pirate, and never give up the credentials to his treasure chest.</li>
<li>Cryptowallet credentials for 1 BTC in a text file.</li>
</ol>
<p>I'll put it here: derangedpirawd@gmail.com</p>
]]></content></entry><entry><id>Feb 28, 2026_0</id><title>Journal</title><published>2026-02-28T00:00:00Z</published><updated>2026-02-28T00:00:00Z</updated><link href="https://peter.demin.dev/life/feb-28-2026_0.html"/><content type="html"><![CDATA[<p>Another AI coding thought, sorry.
I liked the answer <a href="https://bigsky.software/cv/">Carson Gross</a> gives to the question:
&quot;Given AI, should I still consider becoming a computer programmer?&quot;
in his essay &quot;<a href="https://htmx.org/essays/yes-and/">Yes, and...</a>&quot;.
He points the the <a href="https://gist.github.com/1cg/a6c6f2276a1fe5ee172282580a44a7ac">AGENTS.md</a> he recommends to his students, which limit LLM to helping without providing direct solutions.</p>
<p>This clicked with Martin Fowler's observations on pair-programming with LLM.</p>
<p>From my personal experience, I can see parallels between outsourcing and LLMs.
Outsourcers can be good or not technically, but they will never build enough domain-knowledge of an in-house team.</p>
<p>Company can gain short-term boost in productivity by using an external team.
Losing a chance to have people who deeply understand the system few years down the road.</p>
<p>Or they can acquire some technical debt by rushing developers in a crunch.
Bad code is nothing new.</p>
<p>But now the choice is made not by management but by individual contributors.
They can go slow, using LLM to validate and challenge ideas and approaches, and building the system (along with their domain knowledge) themselves.
Or they can go fast by letting LLMs go wild.
Of course, there's a middle ground and we're yet to discover the golden spot.</p>
]]></content></entry><entry><id>Feb 25, 2026_0</id><title>Journal</title><published>2026-02-25T00:00:00Z</published><updated>2026-02-25T00:00:00Z</updated><link href="https://peter.demin.dev/life/feb-25-2026_0.html"/><content type="html"><![CDATA[<p>What kind of psychopath would compare a human being to a next token prediction model?
I've been jamming with AI code generation quite a lot past few days, and people ask if it's akin to managing a junior developer.
No, it's not. People learn, investing my time in mentorship helps the person to achieve their career goals.
It takes a mental disorder to preach agent swarms replacing software engineers.
Same disorder that let's people in charge impose performance reviews, reducing employees to single digits.</p>
]]></content></entry><entry><id>Feb 24, 2026_0</id><title>Journal</title><published>2026-02-24T00:00:00Z</published><updated>2026-02-24T00:00:00Z</updated><link href="https://peter.demin.dev/life/feb-24-2026_0.html"/><content type="html"><![CDATA[<p>One good way of thinking about AI codegen is that it removes friction from coding.
Friction is what keeps your pants on.
Without friction, people don't need to think hard whether the thing they want to build should be built in the first place.
LLM happily takes any task, adds its own implicit assumption and spits out loads of code.
Since the process was mostly frictionless until this point, the engineer is faced with a wall of code.
The code they never wrote, and are completely unfamiliar with.
It takes a great deal of discipline to go through it and internalize completely.
What I found though experience is that if I apply the same vigor I do for my own code, most of this slop has to be rewritten.
Before I can show these to my colleages, I have to do a lot of grunt work.
Usually, polishing the code that took 10 minutes to produce takes at least a day.</p>
<p>The experience is extremely frustrating, and many times I wonder if I should have just write it from scratch myself.
But at this point sunken cost fallacy kicks in and I force myself through cleaning up the mess.</p>
<p>I've done plenty of cleanups through my career, and it's never fun.
But this is the only way to keep my pants on.</p>
]]></content></entry><entry><id>Feb 23, 2026_0</id><title>Journal</title><published>2026-02-23T00:00:00Z</published><updated>2026-02-23T00:00:00Z</updated><link href="https://peter.demin.dev/life/feb-23-2026_0.html"/><content type="html"><![CDATA[<p>It's been over 3 years since I asked this question: <a href="https://peter.demin.dev/life/oct-06-2022_0.html">What's the name for it?</a>.
And today I found this <a href="https://youtu.be/_UZFI-8D5uA?si=9PFrE9ZebelHOjuu">majestic sketch from &quot;Malcolm in the Middle&quot;</a>.
It doesn't give a name, but it's scaringly close.</p>
]]></content></entry><entry><id>Feb 21, 2026_0</id><title>Journal</title><published>2026-02-21T00:00:00Z</published><updated>2026-02-21T00:00:00Z</updated><link href="https://peter.demin.dev/life/feb-21-2026_0.html"/><content type="html"><![CDATA[<p><a href="https://github.com/pdfminer/pdfminer.six">pdfminer/pdfminer.six</a> - Community maintained fork of pdfminer - we fathom PDF</p>
]]></content></entry><entry><id>Feb 20, 2026_0</id><title>Journal</title><published>2026-02-20T00:00:00Z</published><updated>2026-02-20T00:00:00Z</updated><link href="https://peter.demin.dev/life/feb-20-2026_0.html"/><content type="html"><![CDATA[<p>Reading <a href="https://www.thoughtworks.com/content/dam/thoughtworks/documents/report/tw_future%20_of_software_development_retreat_%20key_takeaways.pdf">The future of software engineering</a> from thoughtworks.
I like how there's no overhyped bullshit. It's pretty reasonable.
On the other hand, there's not much insight.</p>
<p>One thing I took away as a Staff Engineer, is that I gotta up my game in specs, tests, and constraints when working with code generation.
So far I was inspecting/rewriting the code and guiding the model.
The doc suggests that building a verifiable test harness first gives better results.
I'm not quite sure, though, how is it supposed to mix with explorative work, where you learn as you go, and you don't know where you gonna land.</p>
<p>(<a href="https://reader.demin.dev/p/53/2f/b75bd7d15357def46c7d081168a3b0a951282f7555352fbcc515c931fb35.html">This post in reader</a>)</p>
]]></content></entry><entry><id>Feb 15, 2026_0</id><title>Journal</title><published>2026-02-15T00:00:00Z</published><updated>2026-02-15T00:00:00Z</updated><link href="https://peter.demin.dev/life/feb-15-2026_0.html"/><content type="html"><![CDATA[<p>I keep playing with the Reader project.
I learned that I can't fetch a website using Javascript <code>fetch</code>.
That I can't fetch pages through iframes.
All for security reasons.
I can't fetch HTML on the server side, because with the current AI crawling environment, plenty of platforms block it.</p>
<p>The bookmarklet allows running arbitrary Javascript, and works in practice, but Safari doesn't let adding bookmarklets to the toolbar.
There's a workaround with favourites toolbar, but then you gotta have another horizontal row for just this toolbar.</p>
<p>Basically, the only technically feasible way to reformat arbitrary website the way I want it to look is to make a browser extension.
Something I wouldn't tackle before Codex.
I learned that you can make an extension for Chrome and Firefox by adding a standard <code>manifest.json</code>, which is pretty reasonable approach.
Of course, to make it available to others you need to have a paid extension marketplace account, and go through the hoops of review and what not.
Then I learned that for Safari extension, the same functionality involves like 20 files, mostly scaffolded by XCode.
A ton of bullshit, and signing, and I managed to have a Safari extension as well.</p>
<p>The way extension works:</p>
<ol>
<li>Open a website (with one extractable main content element), and you don't like how it looks.</li>
<li>Click the circle icon in the browser toolbar.</li>
<li>Enjoy the distraction-free reading experience with large font and the best color scheme ever existed.</li>
</ol>
]]></content></entry><entry><id>Feb 14, 2026_0</id><title>Journal</title><published>2026-02-14T00:00:00Z</published><updated>2026-02-14T00:00:00Z</updated><link href="https://peter.demin.dev/life/feb-14-2026_0.html"/><content type="html"><![CDATA[<p>Today I learned that <code>.dev</code> top-level domain is <a href="https://endtimes.dev/dev-and-hsts-preload/">HSTS-preloaded</a>.
It means that <code>.dev</code> websites can only be accessed through HTTPS (not HTTP).
HTTPS is cool and everything, but there's a side effect.
Which comes from using VPN, and internal resources.</p>
<p>These days, I only consider Let's Encrypt for SSL certificates.
Unfortunately, my DNS provider doesn't expose API access, which makes DNS-01 challenge automation impossible.
That leaves me with only HTTP-01 challenge, which means I need to have my host exposed to the public internet.
Which is not the case.</p>
<p>But hey, the resource is already accessed through a VPN, so it's encrypted in-transit the best way possible.
That makes HTTPS redundant.
Okay then, let's use plain HTTP, right?
Not if you're on <code>.dev</code> domain, you don't.
Thanks to HSTS, HTTP protocol is off-limit.</p>
]]></content></entry><entry><id>Feb 13, 2026_0</id><title>Journal</title><published>2026-02-13T00:00:00Z</published><updated>2026-02-13T00:00:00Z</updated><link href="https://peter.demin.dev/life/feb-13-2026_0.html"/><content type="html"><![CDATA[<p>The thought of tiny flowers in a winter garden didn't leave my head for some time,
so today I vibed a wrapper around <a href="https://github.com/mozilla/readability">Mozilla Readability</a> library
(actually, a <a href="https://github.com/giulianopz/go-readability">port</a>
by <a href="https://giulianopz.github.io">Giuliano Panzironi</a>).</p>
<p>It fetches a page from a given URL, passes it through main content extraction and cleaning,
and presents in a distraction free layout using Solarized Dark theme.</p>
<p>Here's an example of what it looks like:</p>
<p><a href="https://reader.demin.dev/?url=https://peter.demin.dev/life/feb-13-2026_0.html">https://reader.demin.dev/?url=https://peter.demin.dev/life/feb-13-2026_0.html</a></p>
<p>The evening I spent openining random pages in full-screen mode and enjoying distraction free content.</p>
<p>In the spirit of minimalism I made this service a socket-activated Go binary.
So it doesn't take any of the precious RAM on my tiny VPS when idle,
but also has a very small runtime footprint:</p>
<pre><code>○ reader-api.service - Reader extractor API
     Loaded: loaded (/etc/systemd/system/reader-api.service; static)
     Active: inactive (dead) since Sat 2026-02-14 05:44:36 UTC; 3min 13s ago
   Duration: 68ms
 Invocation: 03e5cdeca63e4b60bc0d3c073ed2872a
TriggeredBy: ● reader-api.socket
    Process: 1325849 ExecStart=/opt/reader/reader (code=exited, status=0/SUCCESS)
   Main PID: 1325849 (code=exited, status=0/SUCCESS)
   Mem peak: 3.2M
        CPU: 45ms

Feb 14 05:44:36 demin-dev systemd[1]: Started reader-api.service - Reader extractor API.
Feb 14 05:44:36 demin-dev systemd[1]: reader-api.service: Deactivated successfully.
Feb 14 05:44:36 demin-dev reader[1325849]: 2026/02/14 05:44:36 listening on systemd activation socket
</code></pre>
<p>Can it get more minimal than that? I don't think so.</p>
<p>Please don't scrape whole internet through my proxy.</p>
<p><strong>UPD:</strong> I quickly realized that in addition to being a public unauthenticated proxy, this service also exposed my VPN network in a limited way.
I considered various ways to harden this setup, and decided to just move it inside of the VPN perimeter.</p>
<p>So, you can't see it, but be consoled that I still use it and it's going great.</p>
]]></content></entry><entry><id>Feb 12, 2026_0</id><title>Journal</title><published>2026-02-12T00:00:00Z</published><updated>2026-02-12T00:00:00Z</updated><link href="https://peter.demin.dev/life/feb-12-2026_0.html"/><content type="html"><![CDATA[<p><a href="https://github.com/ericchiang/pup">ericchiang/pup</a> - Parsing HTML at the command line</p>
]]></content></entry><entry><id>Feb 11, 2026_1</id><title>Journal</title><published>2026-02-11T00:00:00Z</published><updated>2026-02-11T00:00:00Z</updated><link href="https://peter.demin.dev/life/feb-11-2026_1.html"/><content type="html"><![CDATA[<p>Changed my atom feed to link each item to a dedicated page (which is otherwise unreachable from the website).</p>
]]></content></entry><entry><id>Feb 11, 2026_0</id><title>Journal</title><published>2026-02-11T00:00:00Z</published><updated>2026-02-11T00:00:00Z</updated><link href="https://peter.demin.dev/life/feb-11-2026_0.html"/><content type="html"><![CDATA[<p>My response to the AI panic &quot;LLM agents are so good, they are going to replace software engineers&quot;:</p>
<ol>
<li>Amount of work is unbound, you can't run out of it.
Companies hire engineers to push more features to reach more markets.
They don't need less people to do the same amount of work.
The need more faster people to stay competitive.</li>
<li>Companies don't hire software engineers for their coding skills.
They hire problem owners who deliver solutions.
More productive problem solvers means more business to run, not less people.</li>
</ol>
]]></content></entry><entry><id>Feb 05, 2026_0</id><title>Journal</title><published>2026-02-05T00:00:00Z</published><updated>2026-02-05T00:00:00Z</updated><link href="https://peter.demin.dev/life/feb-05-2026_0.html"/><content type="html"><![CDATA[<p>Today I learned <em>why</em> is it bad to put knives into a dishwasher.
I thought it's because they bounce from the water streams and bump into other silverware and the cage.
But the primary reason is combination of strong detergent and high water temperature for prolonged time.
It weakens blade's edge and may degrade a handle, if it's wooden or made of a cheap plastic.
The difference in sharpness between a hand-washed and dishwashed knives is drammatic.
The sharp edge life can be reduced from a year down to a month.</p>
]]></content></entry><entry><id>Jan 31, 2026_0</id><title>Journal</title><published>2026-01-31T00:00:00Z</published><updated>2026-01-31T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-31-2026_0.html"/><content type="html"><![CDATA[<p>I was wondering through a community gargen, which is quite bleak this time of year.
I started noticing these tiny rare flowers scattered across.
The overall scarcity made them noticable and brought attention, that otherwise would be lost in the summer abundance.</p>
<pre><code class="language-{include}"></code></pre>
<p>In a way, I get the same effect in my RSS feed.
When I have 100 posts to go through, I skim and skip quickly.
But if I have just a few, I read them through.
Same goes for email digests, if they try to cover too much ground, the value of each item is lost in the overwhelming deluge of information.</p>
]]></content></entry><entry><id>Jan 28, 2026_0</id><title>Journal</title><published>2026-01-28T00:00:00Z</published><updated>2026-01-28T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-28-2026_0.html"/><content type="html"><![CDATA[<p>Added <a href="https://peter.demin.dev/12_articles/82-build-on-push.html">Building this Website on Git Push</a></p>
]]></content></entry><entry><id>Jan 26, 2026_1</id><title>Journal</title><published>2026-01-26T00:00:00Z</published><updated>2026-01-26T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-26-2026_1.html"/><content type="html"><![CDATA[<p>Added <a href="https://peter.demin.dev/12_articles/81-fedup.html">FedUp - Minimal Federated CDN</a></p>
]]></content></entry><entry><id>Jan 26, 2026_0</id><title>Journal</title><published>2026-01-26T00:00:00Z</published><updated>2026-01-26T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-26-2026_0.html"/><content type="html"><![CDATA[<p>I got excited about ForgeFed, and want to see what is Forgejo is up to.
Naturally, they host the code in Forgejo itself, confusingly named codeberg.
Here's what I saw when opened the repo:</p>
<p><img src="https://peter.demin.dev/_images/codeberg-down.png" alt="" /></p>
<p>Maybe, this is not the best day for the federated code forge community...</p>
]]></content></entry><entry><id>Jan 25, 2026_0</id><title>Journal</title><published>2026-01-25T00:00:00Z</published><updated>2026-01-25T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-25-2026_0.html"/><content type="html"><![CDATA[<p><a href="https://github.com/blacksky-algorithms/rsky">blacksky-algorithms/rsky</a> - An AT Protocol implementation prioritizing community safety and self-governance, written in Rust.</p>
]]></content></entry><entry><id>Jan 24, 2026_1</id><title>Journal</title><published>2026-01-24T00:00:00Z</published><updated>2026-01-24T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-24-2026_1.html"/><content type="html"><![CDATA[<p>Reading about radicle made me repeatedly question its purpose.
I liked how it uses PKI for identity, and made me think of a minimal implementation of a Web UI for issues and code review.
The idea is to host a forge as a static website.
Users would put their private key into the browser's local storage (so it never leaves the machine) and use it for signing messages.
The server would use SSH authorized keys for both accepting git pushes and issues/code review comments.
Messages would be stored as markdown files, and server would incrementally rebuild the HTML on submission.
The discussions could live in the same repo under a separate path or branch, or in a separate repo.
This way developers could interact through git by adding or changing the message files, or through the web interface.</p>
]]></content></entry><entry><id>Jan 24, 2026_0</id><title>Journal</title><published>2026-01-24T00:00:00Z</published><updated>2026-01-24T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-24-2026_0.html"/><content type="html"><![CDATA[<p>I discovered a neat application for AI.
My wife asked me to look up a recipe online as she was cooking.
The problem with online recipies is that there's plenty, differing in minor ways.
They are most likely poorly formatted and riddled with ads.</p>
<p>ChatGPT to the rescue, here's my prompt:</p>
<blockquote>
<p>I need a complete recipe for Pavlova cake with weights in grams.
I need it nicely formatted for printing on a single page.
Make it an HTML page with printer-friendly styles.</p>
</blockquote>
<p>Copy'n'Paste the HTML to a file, open it and send to printer.</p>
<p><img src="https://peter.demin.dev/_images/pavlova-cake.png" alt="" /></p>
]]></content></entry><entry><id>Jan 23, 2026_0</id><title>Journal</title><published>2026-01-23T00:00:00Z</published><updated>2026-01-23T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-23-2026_0.html"/><content type="html"><![CDATA[<p>Added <a href="https://peter.demin.dev/12_articles/80-radicle.html">My Radicle Journey</a></p>
]]></content></entry><entry><id>Jan 22, 2026_3</id><title>Journal</title><published>2026-01-22T00:00:00Z</published><updated>2026-01-22T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-22-2026_3.html"/><content type="html"><![CDATA[<p><a href="https://github.com/susam/mintotp">susam/mintotp</a> - Minimal TOTP generator in 20 lines of Python</p>
]]></content></entry><entry><id>Jan 22, 2026_2</id><title>Journal</title><published>2026-01-22T00:00:00Z</published><updated>2026-01-22T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-22-2026_2.html"/><content type="html"><![CDATA[<p><a href="https://github.com/cpg314/ltapiserv-rs">cpg314/ltapiserv-rs</a> - Server implementation of the LanguageTool API for offline grammar and spell checking, based on nlprule and symspell. And a small graphical command-line client.</p>
]]></content></entry><entry><id>Jan 22, 2026_1</id><title>Journal</title><published>2026-01-22T00:00:00Z</published><updated>2026-01-22T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-22-2026_1.html"/><content type="html"><![CDATA[<p>For <em>years</em> I had these lines in my <code>~/.vimrc</code>:</p>
<pre><code>set background=dark
&quot; set background=light
</code></pre>
<p>I would go and move the comment to the other line whenever I needed to switch to another mode.
Until today, I discovered this <a href="https://vinitkumar.me/current-vim-setup/">jewel from Vinit Kumar</a>:</p>
<pre><code class="language-vim">function! ChangeBackground()
  if system(&quot;defaults read -g AppleInterfaceStyle&quot;) =~ '^Dark'
    set background=dark
  else
    set background=light
  endif
endfunction
call ChangeBackground()
</code></pre>
<p>It detects the current Appearance setting and picks the corresponding Solarized theme.</p>
<p>Thank you, Vinit! And thanks to <a href="https://github.com/hnpwd/hnpwd.github.io">hnpwd</a> for connecting me with Vinit!</p>
]]></content></entry><entry><id>Jan 22, 2026_0</id><title>Journal</title><published>2026-01-22T00:00:00Z</published><updated>2026-01-22T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-22-2026_0.html"/><content type="html"><![CDATA[<p>Here is a metaphor for how big tech companies operate that comes to mind over and over and seems to apply to many situations.
A small company operates like a chess master: the pieces move in a tight choreography, and even when it's not clear for each separate pawn, there is a big picture, and it makes sense at the end.
As the company grows, when no one knows how many teams are in the org, not to mention the names of the people, there ain't no chess master at the helm.
Each piece is moved by a number of people who rarely communicate and have different goals.
Coordination between pieces is eventual and minimal.
There's a lot of effort exerted, and the amount of motion is dizzying.
Yet, rarely are substantial improvements achieved, and never efficiently.</p>
]]></content></entry><entry><id>Jan 21, 2026_3</id><title>Journal</title><published>2026-01-21T00:00:00Z</published><updated>2026-01-21T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-21-2026_3.html"/><content type="html"><![CDATA[<p><a href="https://github.com/SeanHeelan/anamnesis-release">SeanHeelan/anamnesis-release</a> - Automatic Exploit Generation with LLMs</p>
]]></content></entry><entry><id>Jan 21, 2026_2</id><title>Journal</title><published>2026-01-21T00:00:00Z</published><updated>2026-01-21T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-21-2026_2.html"/><content type="html"><![CDATA[<p><a href="https://github.com/anthropics/original_performance_takehome">anthropics/original_performance_takehome</a> - Anthropic's original performance take-home, now open for you to try!</p>
]]></content></entry><entry><id>Jan 21, 2026_1</id><title>Journal</title><published>2026-01-21T00:00:00Z</published><updated>2026-01-21T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-21-2026_1.html"/><content type="html"><![CDATA[<p>Exploring Radicle landed me on <a href="https://www.ethswarm.org">Swarm</a>. I'm concerned with the eth- prefix in their domain name, and a mention of blockchain and web3 on the main page. But I like how they managed to build some community and ecosystem around this project. Fun fact: instead of regular documentation, they have <a href="https://www.ethswarm.org/the-book-of-swarm-2.pdf">The Book of Swarm</a> of 272 pages. I wonder how much of it is AI slop, though.</p>
<p>On the note of automatic distribution of 4KB chunks through the network, I wonder how long before DMCA watchdogs start sending their letters to all owners of a chunk of a copyrighted content.
With IPFS and BitTorrent node owner at least controls what content to store and serve.</p>
]]></content></entry><entry><id>Jan 21, 2026_0</id><title>Journal</title><published>2026-01-21T00:00:00Z</published><updated>2026-01-21T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-21-2026_0.html"/><content type="html"><![CDATA[<p>This looks like a trend, and I don't know how I feel about it:</p>
<ul>
<li>HN post &quot;<a href="https://news.ycombinator.com/item?id=46618714">Ask HN: Share your personal website</a>&quot; got 947 points and 2382 comments. The repo received 100+ pull requests in 7 days.</li>
<li>Its predecessor from 2023 &quot;<a href="https://news.ycombinator.com/item?id=46618714">Ask HN: Could you share your personal blog here?</a>&quot; got 1014 points and 1940 comments.</li>
<li>The scrape of that post <a href="https://blog.kagi.com/small-web">started</a> <a href="https://kagi.com/smallweb/">Kagi Small Web</a> - a random blog browser, powered by a <a href="https://github.com/kagisearch/smallweb">GitHub repo</a>.</li>
<li><a href="https://rss.social">RSS.Social</a> - feed syndicator from Kagi's repo that presents this post in HN/Lobsters style.</li>
</ul>
<p>This seems to be a viable way for individual bloggers to get the discoverability they miss by not being on a &quot;big&quot; social media platform.
For me, Kagi Small Web is a fun doomscroller-kind time killer.
When I tried importing the OPML file into my <a href="https://peter.demin.dev/12_articles/71-rss-feed.html">My RSS feed reader setupRSS feed reader</a>, I noticed that a uniform format and an unfiltered stream of content is not engaging at all. Most of the posts don't click with me. But when the presentation changes with every post, I spend more time exploring the content.</p>
<p>Can't say that I discovered anything interesting to subscribe to, though.
But that might be an effect of informational overflow.
Which is supported by my observation of myself skimming quickly through a list of 10+ unread posts, while indulging fully when I only have a couple.</p>
]]></content></entry><entry><id>Jan 20, 2026_2</id><title>Journal</title><published>2026-01-20T00:00:00Z</published><updated>2026-01-20T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-20-2026_2.html"/><content type="html"><![CDATA[<p><a href="https://github.com/markqvist/Reticulum">markqvist/Reticulum</a> - The cryptography-based networking stack for building unstoppable networks with LoRa, Packet Radio, WiFi and everything in between.</p>
]]></content></entry><entry><id>Jan 20, 2026_1</id><title>Journal</title><published>2026-01-20T00:00:00Z</published><updated>2026-01-20T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-20-2026_1.html"/><content type="html"><![CDATA[<p>Something up my alley: <a href="https://app.radicle.xyz/nodes/radicle.dpc.pw/rad%3Az2tDzYbAXxTQEKTGFVwiJPajkbeDU">SelfCI</a> - a minimalistic local-first Unix-philosophy-abiding CI.</p>
]]></content></entry><entry><id>Jan 20, 2026_0</id><title>Journal</title><published>2026-01-20T00:00:00Z</published><updated>2026-01-20T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-20-2026_0.html"/><content type="html"><![CDATA[<p>I'm gonna explore this old-school <a href="https://ring.acab.dev">Hacker Webring</a> that I discovered through <a href="https://linderud.dev">Morten Linderud</a> that was linked on <a href="https://lobste.rs">Lobsters</a> that doesn't require an introduction, but somehow evaded my attention for fourteen years.</p>
]]></content></entry><entry><id>Jan 17, 2026_0</id><title>Journal</title><published>2026-01-17T00:00:00Z</published><updated>2026-01-17T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-17-2026_0.html"/><content type="html"><![CDATA[<p>Added a <a rel="me" href="https://mastodon.social/@peterdemin">Mastodon</a> account to join <a href="https://post.lurk.org/@320x200/115905835562819283">Lurk.org</a> community following a link from permacomputing@conference.macaw.me XMPP channel.</p>
]]></content></entry><entry><id>Jan 16, 2026_1</id><title>Journal</title><published>2026-01-16T00:00:00Z</published><updated>2026-01-16T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-16-2026_1.html"/><content type="html"><![CDATA[<p><a href="https://github.com/bugsink/bugsink">bugsink/bugsink</a> - Self-hosted Error Tracking</p>
]]></content></entry><entry><id>Jan 16, 2026_0</id><title>Journal</title><published>2026-01-16T00:00:00Z</published><updated>2026-01-16T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-16-2026_0.html"/><content type="html"><![CDATA[<p>I got into this trap twice, so I guess I might not be alone.
I review someone else's code, and I get a strong feeling it was AI-generated.
Because no human could possibly produce this kind of well-documented, type-annotated mindless slop.
I feel offended for author being careless and pushing through slop without control.
I ask the author whether they reviewed the generated code themselves before pushing it.
They tell me they didn't use AI.
They wrote the code themselves.</p>
]]></content></entry><entry><id>Jan 15, 2026_2</id><title>Journal</title><published>2026-01-15T00:00:00Z</published><updated>2026-01-15T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-15-2026_2.html"/><content type="html"><![CDATA[<p><a href="https://github.com/hnpwd/hnpwd">hnpwd/hnpwd</a> - HN personal website directory and OPML</p>
]]></content></entry><entry><id>Jan 15, 2026_1</id><title>Journal</title><published>2026-01-15T00:00:00Z</published><updated>2026-01-15T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-15-2026_1.html"/><content type="html"><![CDATA[<p>Added <a href="https://peter.demin.dev/12_articles/79-bugsink-gcp.html">Install Bugsink on Google Cloud Platform</a></p>
]]></content></entry><entry><id>Jan 15, 2026_0</id><title>Journal</title><published>2026-01-15T00:00:00Z</published><updated>2026-01-15T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-15-2026_0.html"/><content type="html"><![CDATA[<p>I've been using <a href="https://sentry.io/welcome/">Sentry</a> for almost all of my career, but yesterday I received an email about Sentry asking for write permissions to my repos to create pull requests made by an LLM.
I didn't enjoy the overall enshittification of the Sentry functionality over the past few years.
But this is it. That's the last drop. I'm looking for a replacement.
Preferably something self-hosted with a low CPU/RAM usage.</p>
]]></content></entry><entry><id>Jan 12, 2026_1</id><title>Journal</title><published>2026-01-12T00:00:00Z</published><updated>2026-01-12T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-12-2026_1.html"/><content type="html"><![CDATA[<p>It's been almost eleven years since the creation of &quot;<a href="https://peps.python.org/pep-0492/">PEP 492</a> – Coroutines with async and await syntax&quot; by Yury Selivanov.
I've been writing asynchronous Python on and off for about a decade, and still, async/await is the most complex part of Python for me.
Recently, I wrote a synchronous generator that yields results from an asynchronous iterable. What a ride!
Back in the days of the PEP 492, Yury was working on EdgeDB, a wrapper layer around PostgreSQL.
In a way, he still is, but it's called <a href="https://www.geldata.com">Gel</a>, and is a part of Vercel (but the page title still says EdgeDB, lol).</p>
<p>Let's see what the people working on PEP 492 are up to:</p>
<ul>
<li><a href="https://gvanrossum.github.io">Guido van Rossum</a> - the creator and benevolent dictator of Python. Retired from Dropbox in 2019, just to join Microsoft as a Distinguished Engineer in 2020.</li>
<li><a href="https://vstinner.readthedocs.io">Victor Stinner</a> - one of the performance-focused Python core contributors. These days, his good work is paid for by IBM through Red Hat.</li>
<li><a href="https://www.linkedin.com/in/elprans/">Elvis Pranskevichus</a> - Yury's buddy, working with him in Vercel.</li>
<li><a href="https://www.linkedin.com/in/andrew-svetlov/">Andrew Svetlov</a> - aiohttp maintainer, works as a VP of Engineering at Apolo.US, which at first glance looks the same as a hundred other AI startups.</li>
<li><a href="https://lukasz.langa.pl">Łukasz Langa</a> - ex-Facebook core Python developer, author of Black, and release manager. Moved to a mid-sized Polish town, and doesn't show up much.</li>
<li><a href="https://www.csse.canterbury.ac.nz/greg.ewing/">Greg Ewing</a> - the winner of the ugliest homepage award.</li>
<li><a href="https://gitlab.com/yaseppochi">Stephen J. Turnbull</a> - seemingly, a Mailman (The GNU Mailing List manager) maintainer.</li>
<li><a href="https://snarky.ca">Brett Cannon</a> - Principal Software Engineer at Microsoft in Canada and Python core developer.</li>
<li><a href="https://www.curiousefficiency.org">Alyssa Coghlan</a> - Nicholas, at the time of the PEP, CPython core and packaging developer, supported by an Australian bank. Surprisingly, not working on <code>uv</code>.</li>
</ul>
<p>The rest of the people I never heard about:</p>
<ul>
<li><a href="https://github.com/pfmoore">Paul Moore</a> - core developer of Python and pip.</li>
<li><a href="https://vorpus.org/">Nathaniel Smith</a> - a scientist, doing science stuff, but somehow deep in the Python community.</li>
<li><a href="https://www.behnel.de/">Stefan Behnel</a> - core developer of Python, maintainer of Cython and lxml.</li>
<li><a href="https://github.com/pfalcon">Paul Sokolovsky</a> - author of a minimalistic Python dialect and a web framework written in that dialect.</li>
<li><a href="https://github.com/vpetrovykh">Victor Petrovykh</a> - another member of the EdgeDB mafia.</li>
<li>Steven D’Aprano - the only guy who got <a href="https://discuss.python.org/t/suspending-a-core-developer-for-conduct-issues/25278">suspended</a> from being a Core Developer for public misconduct.</li>
<li>Ethan Furman</li>
<li>Jim J. Jewett</li>
</ul>
]]></content></entry><entry><id>Jan 12, 2026_0</id><title>Journal</title><published>2026-01-12T00:00:00Z</published><updated>2026-01-12T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-12-2026_0.html"/><content type="html"><![CDATA[<p>I got curious if smartphone notifications can be possibly implemented in a privacy-preserving fashion (and to what extent).
My reading list: <a href="https://unifiedpush.org/news/20250513_push_security_privacy/">UnifiedPush - Push notifications, security and privacy</a></p>
]]></content></entry><entry><id>Jan 11, 2026_0</id><title>Journal</title><published>2026-01-11T00:00:00Z</published><updated>2026-01-11T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-11-2026_0.html"/><content type="html"><![CDATA[<p>Added <a href="https://peter.demin.dev/12_articles/78-solarized-shibuya.html">Solarized colors for Shibuya theme</a></p>
]]></content></entry><entry><id>Jan 10, 2026_2</id><title>Journal</title><published>2026-01-10T00:00:00Z</published><updated>2026-01-10T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-10-2026_2.html"/><content type="html"><![CDATA[<p>Going through my old GitHub stars, I rediscovered <a href="https://shibuya.lepture.com/">Shibuya</a> theme, courtesy of <a href="https://lepture.com/">Hsiaoming Yang</a>.
The main reason to switch is pydata theme shipping 1.4 MB of fontawesome for no good reason.
Also, I love how minimal the theme looks, leaving more space for the content.
I wish it <a href="https://github.com/lepture/shibuya/issues/105">supported Solarized color scheme</a>.</p>
]]></content></entry><entry><id>Jan 10, 2026_1</id><title>Journal</title><published>2026-01-10T00:00:00Z</published><updated>2026-01-10T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-10-2026_1.html"/><content type="html"><![CDATA[<p><a href="https://github.com/scottrogowski/code2flow">scottrogowski/code2flow</a> - Pretty good call graphs for dynamic languages</p>
]]></content></entry><entry><id>Jan 10, 2026_0</id><title>Journal</title><published>2026-01-10T00:00:00Z</published><updated>2026-01-10T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-10-2026_0.html"/><content type="html"><![CDATA[<p>Added <a href="https://peter.demin.dev/12_articles/77-github-stars.html">My GitHub stars</a></p>
]]></content></entry><entry><id>Jan 09, 2026_1</id><title>Journal</title><published>2026-01-09T00:00:00Z</published><updated>2026-01-09T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-09-2026_1.html"/><content type="html"><![CDATA[<p>Mildly interesting idea: use GitHub CLI to export repos I starred and inject this information into my public journal.</p>
<pre><code class="language-bash">gh api --paginate users/peterdemin/starred --header 'Accept: application/vnd.github.star+json' | jq . &gt; gh-stars.json
</code></pre>
]]></content></entry><entry><id>Jan 09, 2026_0</id><title>Journal</title><published>2026-01-09T00:00:00Z</published><updated>2026-01-09T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-09-2026_0.html"/><content type="html"><![CDATA[<p>Here's some food for thought.
We got some nice green seedless grapes from Costco, but they were super tart.
If you let unripe grapes sit on a dark shelf for a couple of days, they'll get sweeter.
But they won't get more callories, because of the laws of conservation.
The grape is sealed and its carbohydrates don't go anywhere.
But my mind tricks me into thinking that sweet food provides more energy.</p>
]]></content></entry><entry><id>Jan 06, 2026_0</id><title>Journal</title><published>2026-01-06T00:00:00Z</published><updated>2026-01-06T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-06-2026_0.html"/><content type="html"><![CDATA[<p>Added <a href="https://peter.demin.dev/12_articles/76-gcp-free-tier.html">Personal cloud VM on Google Cloud Platform free tier</a></p>
]]></content></entry><entry><id>Jan 03, 2026_0</id><title>Journal</title><published>2026-01-03T00:00:00Z</published><updated>2026-01-03T00:00:00Z</updated><link href="https://peter.demin.dev/life/jan-03-2026_0.html"/><content type="html"><![CDATA[<p>After watching Mr. Robot I got curious about IPFS in general and Anna's Archive in particular.
I found this <a href="https://software.annas-archive.li/AnnaArchivist/annas-archive/-/issues/305">gem</a> in Anna's Archive Git repo:</p>
<blockquote>
<p>Here is an extreme case for most, but very real for Anna's Archive, Libgen or Z-Library operators.</p>
<ul>
<li>If you are under heavy police pressure from a surveillance government like the US, you are better off using a Live USB and a VPN with killswitch enabled when connecting to your server(s), avoid DNS leaks to Google or your ISP, and so on.</li>
<li>Consider using a disposable device for it. Canvas fingerprinting is a real thing.</li>
<li>Consider using a disposable disk for it and be prepared to dump it away. Disk forensics is also a thing.</li>
<li>Proton suite is unsafe and a honeypot, please do not use it. Tuta is a much better option.</li>
<li>Tor is slow, overhyped, flagged by tons of web firewalls, and not useful for pirating. Your traffic will stand out like a bright red light. I would strongly discourage using it for clearnet browsing. Hosting and browsing onion services is fine.</li>
<li>You will need to connect with people on platforms like Signal or Telegram, where you need to use a phone number to register. Services like https://hstock.org and https://sms-activate.org do help a lot. If you use yours and police request your data, you are fucked.</li>
<li>Do not expect services to encrypt your data, do it yourself. E2EE is a fairytale unless you actually set it up.</li>
</ul>
<p>Get cryptocurrency in an anonymous way, and start using it!</p>
</blockquote>
<p>I feel something romantic about this level of paranoia.
Luckily, neiter I nor anyone I've ever met had to apply any of these technics.</p>
]]></content></entry><entry><id>Dec 31, 2025_0</id><title>Journal</title><published>2025-12-31T00:00:00Z</published><updated>2025-12-31T00:00:00Z</updated><link href="https://peter.demin.dev/life/dec-31-2025_0.html"/><content type="html"><![CDATA[<p>Updated <a href="https://peter.demin.dev/12_articles/71-rss-feed.html">My RSS feed reader setup</a> with the new subscriptions:</p>
<ul>
<li><a href="https://nesbitt.io/feed.xml">Andrew Nesbitt</a></li>
<li><a href="https://maurycyz.com/index.xml">Maurycy's blog</a></li>
<li><a href="https://nathan.rs/posts/index.xml">Nathan Barry</a></li>
<li><a href="https://peter.demin.dev/life.xml">Peter Demin</a> (that's me!)</li>
<li><a href="https://specbranch.com/index.xml">Speculative Branches</a></li>
<li><a href="https://joshs.bearblog.dev/feed/">people, ideas, machines</a></li>
<li><a href="https://functional.computer/feed.xml">samir : coffee → nonsense</a></li>
<li><a href="https://jyn.dev/atom.xml">the website of jyn</a></li>
</ul>
]]></content></entry><entry><id>Dec 30, 2025_0</id><title>Journal</title><published>2025-12-30T00:00:00Z</published><updated>2025-12-30T00:00:00Z</updated><link href="https://peter.demin.dev/life/dec-30-2025_0.html"/><content type="html"><![CDATA[<p>I got bored enough to add an <a href="https://peter.demin.dev/life.xml">RSS feed</a> to this journal.
Having a custom plain-text format for these records, I had to add a custom Atom generator.
Overall it was a smooth sailing, with two gotchas:</p>
<ol>
<li>CommaFeed (at least) doesn't like escaped HTML inside content fields, even if <code>type=&quot;html&quot;</code>.
So I had to switch to CDATA encoding.</li>
<li>Python's builtin <code>xml.etree</code> library doesn't support CDATA (<a href="https://github.com/python/cpython/issues/81055">CPython#81055</a> hanging from 2019).</li>
<li>So I switched to lxml that does.
Turns out lxml.etree is slightly incompatible in managing namespaces.
It took a bit of googling to find out, that instead of <code>ET.register_namespace('', 'http://www.w3.org/2005/Atom')</code>,
I should do <code>ET.Element(..., nsmap={None: 'http://www.w3.org/2005/Atom'})</code>.</li>
</ol>
<p>So, business as usual.</p>
]]></content></entry><entry><id>Dec 29, 2025_2</id><title>Journal</title><published>2025-12-29T00:00:00Z</published><updated>2025-12-29T00:00:00Z</updated><link href="https://peter.demin.dev/life/dec-29-2025_2.html"/><content type="html"><![CDATA[<p><a href="https://github.com/cockpit-project/cockpit-machines">cockpit-project/cockpit-machines</a> - Cockpit UI for virtual machines</p>
]]></content></entry><entry><id>Dec 29, 2025_1</id><title>Journal</title><published>2025-12-29T00:00:00Z</published><updated>2025-12-29T00:00:00Z</updated><link href="https://peter.demin.dev/life/dec-29-2025_1.html"/><content type="html"><![CDATA[<p>I'm continuing my exodus from <em>greedy</em> (also free and privacy-preserving) Google infrastructure for my personal files.
So far, I've got a nice 4 TB SSD drive and repurposed an old 4 TB HDD to set up Immich with a backup through Syncthing.
I also set up another Syncthing folder to backup Google Drive from my laptop (which runs Google Drive client to download all files).
It's fine so far, except that few random photos got their creation date in a far-far future, so they show up at the top.
On a related note, Paul Baecher published <a href="https://baecher.dev/stdout/incremental-backups-of-gmail-takeouts/">Incremental backups of Gmail takeouts</a>.
I asked him if he automated downloads from the Takeout, and he suggested trying an option to pull email backups through Google Drive, which has a proper client. That would require having enough space in Google Drive to store all emails, of course.
For uninititated, last year Google added authentication for downloading from the takeout links, so I can't use wget in a shell script on the server.
Currently, I download the archive to my laptop and then scp it to the server, which is extremely lame.</p>
]]></content></entry><entry><id>Dec 29, 2025_0</id><title>Journal</title><published>2025-12-29T00:00:00Z</published><updated>2025-12-29T00:00:00Z</updated><link href="https://peter.demin.dev/life/dec-29-2025_0.html"/><content type="html"><![CDATA[<p>On the third day of Christmas I managed to migrate from Virtualbox to libvirt.
I learned about <a href="https://wiki.archlinux.org/title/Libvirt#Configure_filesystem_passthrough">virtiofs</a> - a way to share directories with libvirt VMs, similar to shared folders of VirtualBox, but with manual mounting on the guest side.
I tried <a href="https://cockpit-project.org/">Cockpit</a> and Cockpit-machines, which is a WebUI to libvirt, but it didn't provide enough functionality (which I thought is extremely basic).
I learned some obscure factoids about <a href="https://docs.cloud-init.io/en/latest/index.html">cloud-init</a>, but still very confused. It's such a weird combination of convenience and complexity.
I landed on <a href="https://vagrant-libvirt.github.io/vagrant-libvirt/">vagrant-libvirt</a> provider, and made just a few changes to my Vagrantfile to adjust.</p>
<p>I wish I could remove Vagrant from my setup, but that would mean reimplementing the following steps, that I'm not too keen on:</p>
<ol>
<li>SSH key provisioning.</li>
<li>Network configuration with static IP address for the guest and port forwarding.</li>
<li>Mounting the virtiofs mounts.</li>
</ol>
<p>After all this good work, I looked at my GitHub repo with a lonely 1 star, and &quot;unpublished&quot; it.
It's a fun thing to hack around, but a hard thing to share with other people.
So far, I learned that most people are pretty secretive about their home media library setup, and not interested in cooperating or consolidating.</p>
]]></content></entry><entry><id>Dec 27, 2025_1</id><title>Journal</title><published>2025-12-27T00:00:00Z</published><updated>2025-12-27T00:00:00Z</updated><link href="https://peter.demin.dev/life/dec-27-2025_1.html"/><content type="html"><![CDATA[<p><a href="https://github.com/dmacvicar/terraform-provider-libvirt">dmacvicar/terraform-provider-libvirt</a> - Terraform provider to provision infrastructure with Linux's KVM using libvirt</p>
]]></content></entry><entry><id>Dec 27, 2025_0</id><title>Journal</title><published>2025-12-27T00:00:00Z</published><updated>2025-12-27T00:00:00Z</updated><link href="https://peter.demin.dev/life/dec-27-2025_0.html"/><content type="html"><![CDATA[<p>Inspired by <a href="https://clan.lol/">Clan</a> and other Nix stories, I attempted to migrate my silly Vagrant+VirtualBox home setup to Terraform+KVM. I'm not very familiar with either, so I thought that's gonna be a fun learning experience. In a way, it was, but I learned not what I was hoping to.
I started at Medium's article <a href="https://medium.com/@mohrezfadaei/vagrant-and-virtualbox-are-no-longer-enough-why-kvm-and-terraform-are-the-future-of-devops-24f978c9ca2c">Vagrant and VirtualBox Are No Longer Enough: Why KVM and Terraform Are the Future of DevOps</a>. AI-generated illustration was the first sign, but I ignored it. Looking at the article now, it's obvious to me now, that it's an AI slop through and through. Fuck you, <a href="https://medium.com/@mohrezfadaei">Mohammad Reza Fadaei</a>, you lazy piece of shit.</p>
<p>The first challenge came from Terraform provider for libvirtd being not an &quot;official&quot; Hashicorp thing, but a &quot;learning platform&quot; for a random stranger (No offense, <a href="https://www.mac-vicar.eu/">Duncan Mac-Vicar P.</a>, thanks for doing what you're doing).</p>
<p>The second challenge was that the Duncan's provider got a major rewrite and all Terraform recipes from the tutorial had to be migrated.</p>
<p>The third challenge was that Ubuntu 22.04 has some weird issue in libvirt apparmor configuraion. Apparently, a VM doesn't get permissions to any of the volumes created specifically for it. There should be a script that generates a list of volume paths somewhere, but who knows what happened to it.</p>
<p>After 3 hours of battling every part of the &quot;Future of DevOps&quot;, my ChatGPT browser tab started to run out of memory, and I gave up.
Looking back, I love how simple my Vagrant setup is, and I want to extend my gratitude to <a href="https://mitchellh.com/">Mitchell Hashimoto</a> for building it.
I still want to make my silly home VM work without dependency on any external dependencies (except stable Ubuntu/Debian repo), so if I get more time for this project, I'll try vibing raw libvirt config.</p>
]]></content></entry><entry><id>Dec 23, 2025_0</id><title>Journal</title><published>2025-12-23T00:00:00Z</published><updated>2025-12-23T00:00:00Z</updated><link href="https://peter.demin.dev/life/dec-23-2025_0.html"/><content type="html"><![CDATA[<p>sailing the sea: https://news.ycombinator.com/item?id=46363366</p>
]]></content></entry><entry><id>Dec 21, 2025_0</id><title>Journal</title><published>2025-12-21T00:00:00Z</published><updated>2025-12-21T00:00:00Z</updated><link href="https://peter.demin.dev/life/dec-21-2025_0.html"/><content type="html"><![CDATA[<p>While reading &quot;Material World&quot; by Ed Conway, I many times thought about Oxygen Not Included, which is a cartoonistic survival game about a settlement deep underground. Being deep means they don't get free solar and wind power, no access to virtually unlimited fresh water, and, as the title suggests, no oxygen. Such hermetic setup forces player into constant mining of resources (they made up oxylite, a stone that produces oxygen). As population grows, you need more and more resources, that progressively become hard to get. Fun game, totally recommend.
Another thought, that I keep coming back to again and again after finishing the book, is that even farming depends on fossil fuels. Sometimes in mass media you can get an idea, that global warming and rising CO2 levels are due to the greed of filthy crude oil oligarhs. But the we need fossil fuels to produce fertilisers, without which it would be impossible to grow enough food to feed the evergrowing population of Earth. Building a single windmill power generator requires vast amounts of concrete and steel, producing which takes about a year worth of eletricity that windmill generates.
It's a great book, and I totally recommend it as well.</p>
]]></content></entry><entry><id>Dec 20, 2025_1</id><title>Journal</title><published>2025-12-20T00:00:00Z</published><updated>2025-12-20T00:00:00Z</updated><link href="https://peter.demin.dev/life/dec-20-2025_1.html"/><content type="html"><![CDATA[<p><a href="https://github.com/piercefreeman/autopg">piercefreeman/autopg</a> - 🐘 Auto-optimizations for Postgres</p>
]]></content></entry><entry><id>Dec 20, 2025_0</id><title>Journal</title><published>2025-12-20T00:00:00Z</published><updated>2025-12-20T00:00:00Z</updated><link href="https://peter.demin.dev/life/dec-20-2025_0.html"/><content type="html"><![CDATA[<p>TIL about <a href="https://github.com/piercefreeman/autopg/tree/main/autopgpool">automatic Postgres configuration</a> and Servury's promo on <a href="https://servury.com/blog/privacy-is-marketing-anonymity-is-architecture/">anonymity vs privacy</a> both of which may be applied to <a href="https://seattle-beauty-lounge.com/">Seattle-Beauty-Lounge</a>.</p>
]]></content></entry><entry><id>Dec 06, 2025_0</id><title>Journal</title><published>2025-12-06T00:00:00Z</published><updated>2025-12-06T00:00:00Z</updated><link href="https://peter.demin.dev/life/dec-06-2025_0.html"/><content type="html"><![CDATA[<p><a href="https://github.com/simulot/immich-go">simulot/immich-go</a> - An alternative to the immich-CLI command that doesn't depend on nodejs installation. It tries its best for importing google photos takeout archives.</p>
]]></content></entry><entry><id>Nov 23, 2025_0</id><title>Journal</title><published>2025-11-23T00:00:00Z</published><updated>2025-11-23T00:00:00Z</updated><link href="https://peter.demin.dev/life/nov-23-2025_0.html"/><content type="html"><![CDATA[<p><a href="https://news.ycombinator.com/item?id=46025285">this comment</a> left me bitter and confused:</p>
<blockquote>
<p>Well it took me 2 full-time weeks to properly implement a RAG-based system so that it found actually relevant data and did not hallucinate. Had to:</p>
</blockquote>
<ul>
<li>write an evaluation pipeline to automate quality testing</li>
<li>add a query rewriting step to explore more options during search</li>
<li>add hybrid BM-25+vector search with proper rank fusion</li>
<li>tune all the hyperparameters for best results (like weight bias for bm25 vs. vector, how many documents to retrieve for analysis, how to chunk documents based on semantics)</li>
<li>parallelize the search pipeline to decrease wait times</li>
<li>add moderation</li>
<li>add a reranker to find best candidates</li>
<li>add background embedding calculation of user documents</li>
<li>lots of failure cases to iron out so that the prompt worked for most cases</li>
</ul>
<p>Each step would take me more than two weeks, and still have gaps. But when you’re working alone, and you’re the only judge of your work, it’s easy to overestimate its quality.</p>
]]></content></entry><entry><id>Nov 11, 2025_0</id><title>Journal</title><published>2025-11-11T00:00:00Z</published><updated>2025-11-11T00:00:00Z</updated><link href="https://peter.demin.dev/life/nov-11-2025_0.html"/><content type="html"><![CDATA[<p>For years my life felt like a crazy race at break neck speeds, with great aspirations, challenges, achievements.
Many times I asked myself: is this all there is to it?
Other times I wondered: have I peaked; is it just downslide from here?
And sometimes I feel like I won. The game is finished and I'm on top.
Like in StarCraft, when all the enemies are neutralized, there's no more threat, but you have an option to continue &quot;playing&quot;. Of course, at this point, there's no play, just frolicing around aimlessly, and exploring the senseless limits.
The lesson here, naturally, is that all these ideas are false, the hill has no top, it's round like Earth itself.</p>
]]></content></entry><entry><id>Nov 09, 2025_0</id><title>Journal</title><published>2025-11-09T00:00:00Z</published><updated>2025-11-09T00:00:00Z</updated><link href="https://peter.demin.dev/life/nov-09-2025_0.html"/><content type="html"><![CDATA[<p><a href="https://github.com/opencloud-eu/opencloud">opencloud-eu/opencloud</a> - 🌤️ OpenCloud is the open source platform for file management, sharing and collaboration. Simple and sovereign.</p>
]]></content></entry><entry><id>Oct 31, 2025_0</id><title>Journal</title><published>2025-10-31T00:00:00Z</published><updated>2025-10-31T00:00:00Z</updated><link href="https://peter.demin.dev/life/oct-31-2025_0.html"/><content type="html"><![CDATA[<p>Added <a href="https://peter.demin.dev/17_notes/31-cyberiad.html">"Cyberiad" by Stanislaw Lem</a>
My next book is going to be &quot;Material World&quot; by Ed Conway, <a href="https://mertbulan.com/2025/10/05/my-2025-q3-highlights-favorite-books-and-movies/">refered by Mert Bulan</a>.
And after that I'm thinking about &quot;We&quot; by Yevgeny Zamyatin, which was referenced at the end of the Cyberiad.</p>
]]></content></entry><entry><id>Oct 30, 2025_0</id><title>Journal</title><published>2025-10-30T00:00:00Z</published><updated>2025-10-30T00:00:00Z</updated><link href="https://peter.demin.dev/life/oct-30-2025_0.html"/><content type="html"><![CDATA[<p>something more amazing than $0.99 bananas? It’s $0.49 bananas, of course. Same day, no delivery fee. How are they doing it?</p>
]]></content></entry><entry><id>Oct 23, 2025_1</id><title>Journal</title><published>2025-10-23T00:00:00Z</published><updated>2025-10-23T00:00:00Z</updated><link href="https://peter.demin.dev/life/oct-23-2025_1.html"/><content type="html"><![CDATA[<p><a href="https://github.com/allinurl/goaccess">allinurl/goaccess</a> - GoAccess is a real-time web log analyzer and interactive viewer that runs in a terminal in *nix systems or through your browser.</p>
]]></content></entry><entry><id>Oct 23, 2025_0</id><title>Journal</title><published>2025-10-23T00:00:00Z</published><updated>2025-10-23T00:00:00Z</updated><link href="https://peter.demin.dev/life/oct-23-2025_0.html"/><content type="html"><![CDATA[<p>Added <a href="https://peter.demin.dev/12_articles/75-replaced-by-AI.html">To be replaced by AI is a choice</a></p>
]]></content></entry><entry><id>Oct 20, 2025_1</id><title>Journal</title><published>2025-10-20T00:00:00Z</published><updated>2025-10-20T00:00:00Z</updated><link href="https://peter.demin.dev/life/oct-20-2025_1.html"/><content type="html"><![CDATA[<p><a href="https://github.com/nathan-barry/nathan.rs">nathan-barry/nathan.rs</a> - My personal site using Hugo for static site generation. My pride and joy.</p>
]]></content></entry><entry><id>Oct 20, 2025_0</id><title>Journal</title><published>2025-10-20T00:00:00Z</published><updated>2025-10-20T00:00:00Z</updated><link href="https://peter.demin.dev/life/oct-20-2025_0.html"/><content type="html"><![CDATA[<p>there’s something inconceivable about same-day delivery for a bunch of bananas for $0.99 with no delivery fee.</p>
]]></content></entry></feed>
