Shellsharks Blogroll - BlogFlock 2026-05-28T01:16:02.288Z BlogFlock Adepts of 0xCC, destructured, fLaMEd, Aaron Parecki, Trail of Bits Blog, gynvael.coldwind//vx.log (pl), Westenberg, James' Coffee Blog, joelchrono, Evan Boehs, Kev Quirk, cool-as-heck, Posts feed, Sophie Koonin, cmdr-nova@internet:~$, <span>Songs</span> on the Security of Networks, Werd I/O, Johnny.Decimal, Robb Knight, Molly White, Hey, it's Jason!, Terence Eden’s Blog Cross-Domain API Access: Beyond the "Obvious" Shortcuts - Articles by Aaron Parecki https://aaronparecki.com/2026/05/27/10/cross-domain-api-access 2026-05-27T23:35:08.000Z <p>Cross-domain access is everywhere in today's software landscape. Whether you look at enterprise SaaS applications, AI agents interacting with user data across multiple platforms, or "integrated experiences" pulling information from a calendar, a chat tool, and a wiki—everything eventually needs to talk across boundaries.</p> <p>Development teams frequently reach for the quickest path to wire these systems together. Usually, teams fall back on two "obvious" architectural shortcuts. However, as experience deploying these architectures at scale demonstrates, both models break down in production.</p> <p>Let's take a closer look at why these shortcuts fail and what a resilient cross-domain pattern actually looks like.</p> <p>🧶 <b>Shortcut #1: Have the IdP issue the access token directly</b></p> <p><b> The pattern:</b> the client takes its ID Token to the IdP, exchanges it for an access token, and sends that access token straight to the resource app's API.</p> <p><b> Why it's tempting:</b> it reuses the IdP that everyone already trusts. It feels like a clean, one-stop shop.</p> <p><b> Why it breaks:</b> every API on the receiving end now has to trust a growing list of foreign token issuers — each with its own quirks around token format, claim conventions, key rotation, and revocation. </p> <p>Suddenly your API team is in the federation business, doing one-off integrations per IdP. That's not a sustainable model for building APIs at scale. APIs are far better served by having a local authorization server issuing the tokens they validate — one issuer, one model, one set of rules.</p> <p>🪪<b> Shortcut #2: Send the ID Token across domains</b></p> <p><b> The pattern:</b> skip the IdP-issued access token and present the original ID Token directly at the receiving app's authorization server, exchanging it for a locally issued access token.</p> <p><b> Why it's tempting:</b> ID Tokens are standardized, so it feels like it sidesteps the trust-fan-out problem from #1.</p> <p><b> Why it breaks:</b> ID Tokens are issued for one audience — the application the user signed into. Sending them somewhere else violates that audience binding, opens up replay and misuse risks.</p> <p>🎯 <b>What Cross-App Access does differently</b></p> <p> Cross-App Access (XAA) uses a two-stage flow — and each stage exists specifically to fix one of the problems above.</p> <p><b> Stage 1:</b> The client makes a Token Exchange request to the IdP to exchange the ID Token for an ID-JAG: a purpose-built, short-lived, audience-bound grant for the resource authorization server.</p> <p> No ID Token misuse, no audience confusion. The IdP also stays in the loop to govern whether this cross-app access should happen at all — exactly where enterprise IT already manages who can access what.</p> <p><b> Stage 2:</b> The resource app's authorization server exchanges the ID-JAG for its own access token. The API keeps its local AS, its own token format, and its own revocation story. It only has to trust the access tokens issued by its own AS — not a foreign access token.</p> <p> We can push all the complexity of user login, token minting, and cross-domain policy evaluation onto the specialized identity components, keeping the resource API free to do the much simpler task of validating its own domain's access tokens and serving data.</p> <p> If you're designing cross-domain access for an AI agent, an enterprise suite, or any multi-vendor ecosystem, this is the pattern to follow. The IETF draft: <a href="https://datatracker.ietf.org/doc/draft-ietf-oauth-identity-assertion-authz-grant/">https://datatracker.ietf.org/doc/draft-ietf-oauth-identity-assertion-authz-grant/</a></p> Cult Pens Anniversary Mystery Box Review - Robb Knight • Posts • Atom Feed https://rknight.me/blog/cult-pens-anniversary-mystery-box-review/ 2026-05-27T19:36:55.000Z <p>At the start of the month <a href="https://cultpens.com">Cult Pens</a>, for their anniversary, put up a birthday mystery box for £100. No other information, just choose a nib size and they'll send out a mystery box:</p> <blockquote> <p>We can't tell you what's inside, because it's a mystery, but we can tell you the contents are worth way more than the price, and have an RRP of at least double.</p> </blockquote> <p>&quot;<em>One part of my brain knows mystery boxes are a good way for a company to move stuff that isn't selling, the other half wants to buy it anyway</em>&quot; was what I wrote in the <a href="https://penaddict.com">Pen Addict</a> Slack. I considered buying it at lunchtime that day but it sold out before I could decide. Then two weeks later it was a suggestion below something else I was browsing on their website, with a fine nib. I usually go for extra fine but fine is also...fine so I ordered it.</p> <figure><img src="https://cdn.rknight.me/site/2026/cult-pens-mystery-box-contents.jpg" alt="" /></figure> <p>It arrived and I was very pleased to get an <a href="https://cultpens.com/products/monteverde-mp1-piston-filling-fountain-pen-limited-edition-strawberry-dreams">MP1</a> as the main item along with some <a href="https://cultpens.com/products/copic-acrea-paint-marker-set-of-6-deep-colours-1">copic paint markers</a> which I would <em>never</em> usually buy (these are £27 for 6?! I'm not good enough at art for that). The full list of items:</p> <ul> <li><a href="https://cultpens.com/products/monteverde-mp1-piston-filling-fountain-pen-limited-edition-strawberry-dreams">Monteverde MP1 Piston Filling Fountain Pen Limited Edition Strawberry</a></li> <li><a href="https://cultpens.com/products/copic-acrea-paint-marker-set-of-6-deep-colours-1">Copic Acrea Paint Marker Set of 6 Deep Colours</a></li> <li><a href="https://cultpens.com/products/iwako-puzzle-eraser-set-farm-animal">Iwako Puzzle Eraser Set Farm Animal</a></li> <li><a href="https://cultpens.com/products/pentel-graphgear-1000-automatic-pencil">Pentel GraphGear 1000 Automatic Pencil</a></li> <li><a href="https://cultpens.com/products/faber-castell-hexo-ballpoint-pen-matt-silver">Faber-Castell Hexo Ballpoint Pen Matt Silver</a></li> <li><a href="https://cultpens.com/products/faber-castell-goldfaber-aqua-dual-marker-wallet-of-6-lettering">Faber-Castell Goldfaber Aqua Dual Marker Wallet of 6 Lettering</a></li> <li><a href="https://www.theonlinepencompany.com/faber-castell-double-fibre-tip-pen-set-neon-pack-of-10">Faber-Castell Double Fibre-Tip Pen Set - Neon (Pack of 10)</a></li> <li>Clairefontaine lined notebook</li> <li>Purple pen sleeve</li> <li>Midori stickers</li> <li>Two ink samples: <a href="https://mountainofink.com/blog/diamine-aqua-lagoon">Diamine Aqua Lagoon</a> and <a href="https://mountainofink.com/blog/j-herbin-essentials">Jacques Herbin Rouge d'Orient</a></li> </ul> <p>I wasn't able to find the purple pen sleeve, the midori stickers, or the Faber-Castell neon pens on the Cult Pens website but by my count, the RRP of all this lot is somewhere around £150.</p> <p>I didn't realise the Copics were paint ones until I'd already smooshed it on the page like the caveman that I am so I did an art. I call it &quot;Don't Go in the Ocean&quot;. These are fun to use and I'm definitely going to use these during this year's <a href="https://rknight.me/blog/tags/inktober/">Inktober</a>.</p> <figure><img src="https://cdn.rknight.me/site/2026/cult-pens-mystery-box-copic-acrea.jpg" alt="A notepad with three coloured jellyfish looking things" /></figure> <p>The farm eraser set is cute as fuck but I cannot use it. Look at their faces.</p> <figure><img src="https://cdn.rknight.me/site/2026/cult-pens-mystery-box-farm.jpg" alt="A small rubber farm with a cow, cat, and a barn on a green field with a white fence" /></figure> <p>I didn't need another metal pencil but the graphgear is bloody lovely. The lil &quot;clunk&quot; when it sucks up the nib bit is delightful.</p> <figure><img src="https://cdn.rknight.me/site/2026/cult-pens-mystery-box-graphgear.jpg" alt="A drawing of a sweating dinosaur on a white notebook with a metal pencil next to it." /></figure> <p>A Monteverde MP1 has been on my wishlist for quite a while but there's always been something else to buy so it was nice to have it decided for me. Even without looking, I know that a pen called &quot;Strawberry Dreams&quot; would the one I would get anyway. The ink looks much more purple when it's in the bottle but on paper (Tomoe River in this case) it's a stunning bright pink, I love it. The pen itself it nice to write with although my brain keeps thinking I'm picking up a TWSBI Eco and it takes a moment to adjust to the differences in feel.</p> <figure><img src="https://cdn.rknight.me/site/2026/cult-pens-mystery-box-mp1.jpg" alt="" /></figure> <p>I think the one dud in this box is the Faber Castell hexo has a nice twist mechanism but the pen itself is ugly and it feels cheap to hold. Not a pen for me.</p> <p>Overall I'm very happy with what I got in the box. Given what Cult Pens sell I could make an educated guess about which fountain pen I was going to get from a handful so it wasn't <em>that</em> much of a risk. I'm not going to rush and do this every time they do one but I'll definitely consider it in the future.</p> When the AI boom subsides, the data centers will remain. What we do now matters - Werd I/O 6a16f52204b6ca0001d1a014 2026-05-27T13:44:02.000Z <p>Link: <a href="https://singularityhub.com/2026/05/22/data-centers-now-consume-6-of-electricity-in-the-us-and-the-backlash-has-begun/?ref=werd.io"><em>Data Centers Now Consume 6% of US Electricity&#x2014;and the Backlash Has Begun, by Edd Gent at SingularityHub</em></a></p><p>When the dotcom boom came to a crashing end, the companies behind it imploded in sometimes spectacular ways, but the infrastructure they built continued to exist. That in turn laid the groundwork for Web 2.0, the cloud revolution, and everything that came afterwards.</p><p>When we think about the AI boom, we should consider what will be left behind: the infrastructure precedents being set that will be with us for a generation. If I was a betting person (I&#x2019;m not), I&#x2019;d put money down on the current crop of AI tech companies imploding at some point, with their assets acquired by companies like Microsoft and Google (who already own the majority of data centers). The applications will flounder, but the data centers will remain &#x2014; and the energy infrastructure that enables them.</p><p>As the linked article notes:</p><blockquote>&#x201C;Data centers have always been energy-hungry, but the AI explosion is causing computing demand to skyrocket. The biggest data centers now consume as much electricity as small cities and are proliferating at breakneck speed.&#x201D;</blockquote><p>Data centers now account for 6% of US energy use, and their water use is similarly staggering. 13% of the underlying workloads are useless: zombie processes that have been left running by inattentive owners whose priorities now lie elsewhere. Beyond the environmental impacts, which are no joke, data center consumption is pushing up people&#x2019;s bills and disrupting communities. And beyond <em>that</em>, they push up real estate costs, <a href="https://www.housebeautiful.com/design-inspiration/real-estate/a71253889/data-center-property-values/?ref=werd.io">with real knock-on effects for communities</a>. It&#x2019;s no surprise, then, that legislation is being written to limit their growth.</p><p>It&#x2019;s not that we shouldn&#x2019;t have data centers. But their footprint is enormous, and the effects are sometimes disastrous. We need to consider the effect on people&#x2019;s quality of life more than the impact to GDP, not least because economic indicators like these <a href="https://unctad.org/news/gdp-not-enough-tell-if-people-are-better?ref=werd.io">don&#x2019;t actually show if people&#x2019;s lives are improving</a>.</p><p>It&#x2019;ll be an arms race: <a href="https://www.cnbc.com/2026/05/09/ai-data-center-construction-public-opposition.html?ref=werd.io">developers are considering building distributed data centers into people&#x2019;s homes</a>, making them harder to regulate. Presumably homeowners will be sold on the upside, but when the market crashes will be saddled with obsolete tech that comes at a cost to them.</p><p>My take: require them to be built with self-sufficient renewable energy that pushes excess capacity to the grid and encourage the development of new architectures that don&#x2019;t require water cooling to the same degree. Outlaw the widespread practice of building data centers using shell companies that obscure their real ownership. And ensure they are taxed robustly nationwide, so that revenues can benefit local communities.</p><p>In a few years, when the hype cycle dies down and people understand the capabilities and limitations of AI with clearer eyes, we&#x2019;ll have a ton of new infrastructure that can&#x2019;t easily be turned down &#x2014; and we will have set energy consumption precedents that will be hard to reverse. Now is the time to set the right standards, and for communities to push back against what they won&#x2019;t tolerate.</p> Gadget Review: Chuwi Minibook X N150 + Linux ★★★★☆ - Terence Eden’s Blog https://shkspr.mobi/blog/?p=68038 2026-05-27T11:34:36.000Z <p>I needed a small and light laptop to take travelling. Something with a larger screen than my phone so I can use the Big Internet™. Nothing too expensive and something that uses the same USB-C charger as everything else.</p> <p>So I settled on the Chuwi Minibook N150. It's literally small enough to fit in my cargo-shot pockets. For the price (around £300ish) it is basically fine. There are a few niggles, but none of them showstoppers for me.</p> <p>I took it to OggCamp and had <em>so</em> many people come and ask me about it. It's a small, cute, and distinctive looking device.</p> <p><a href="https://www.chuwi.com/product/items/chuwi-minibook-x-n150.html"><img src="https://shkspr.mobi/blog/wp-content/uploads/2026/05/minibook.webp" alt="A small laptop." width="1024" height="720" class="aligncenter size-full wp-image-71515"></a></p> <h2 id="the-bad"><a href="https://shkspr.mobi/blog/2026/05/gadget-review-chuwi-minibook-x-n150-linux/#the-bad">The Bad</a></h2> <p>Here are the worst things about the laptop:</p> <ul> <li>US Keyboard. Yup, the @ and " are in the wrong place. I can be set to UK, but then you lose the <kbd>|</kbd> key.</li> <li>The trackpad sometimes goes a bit jittery. It usually works, but once it a while goes askew. The touchscreen can be used if it happens.</li> <li>Screen rotation works, but the keyboard and trackpad don't switch off if you bend the keyboard all the way back.</li> <li>No biometrics like fingerprint or camera - so you need to remember your passwords.</li> <li>Support from the manufacturer is haphazard. Mostly forum links and expired downloads. The firmware seems to update fine on Linux though.</li> </ul> <p>That's not too bad, I reckon.</p> <h2 id="installing-linux"><a href="https://shkspr.mobi/blog/2026/05/gadget-review-chuwi-minibook-x-n150-linux/#installing-linux">Installing Linux</a></h2> <p>I had a brief play with Windows 11, let it update its drivers just in case there was any magic firmware, then nuked it.</p> <p>Turn the device off. Turn it on and then hammer the <kbd>Delete</kbd> button. It'll pop you into the BIOS.</p> <p>Secure Boot needs to be disabled:</p> <p>Security → Secure Boot → Secure Boot → Disabled</p> <p>You'll also need to set it to boot from a USB device:</p> <p>Boot → Boot Option #1 → USB Device</p> <p>The go to Save &amp; Exit. I tried <a href="https://www.linuxmint.com/edition.php?id=325">Linux Mint Debian Edition</a>. It booted just fine and, after fiddling in the display settings, it automatically detected the screen rotation. Internet worked, touchscreen worked, Bluetooth worked. I tried a few distros and settled on NixOS as being the least worst option.</p> <p>Everything works except the keyboard switching off when it is folded backwards.</p> <h2 id="look-and-feel"><a href="https://shkspr.mobi/blog/2026/05/gadget-review-chuwi-minibook-x-n150-linux/#look-and-feel">Look and Feel</a></h2> <p>It is a solid lump of metal. There are no decals on back of the screen (so perfect for adding stickers!) and the bottom is similarly bare apart from some air-flow grilles and the usual identifying marks.</p> <p>There are two USB-C ports on one side and a vestigial headphone jack on the other.</p> <h2 id="keyboard"><a href="https://shkspr.mobi/blog/2026/05/gadget-review-chuwi-minibook-x-n150-linux/#keyboard">Keyboard</a></h2> <p>Despite coming from a UK warehouse and shipping with a UK plug, it has a US keyboard. The only real difference is the <code>£</code> symbol is missing from the <kbd>3</kbd> button, the <code>@</code> and <code>"</code> are swapped, and the <kbd>|</kbd> button is in the wrong place. None of that is disastrous and setting your OS to use a UK layout fixes things.</p> <p>Because <kbd>\|</kbd> is mapped to <kbd>#~</kbd>, there's no way to type a backslash or pipe.</p> <p>There are three levels of backlight. Off, dim, and not quite so dim. No fancy RBG effects here!</p> <h2 id="trackpad"><a href="https://shkspr.mobi/blog/2026/05/gadget-review-chuwi-minibook-x-n150-linux/#trackpad">Trackpad</a></h2> <p>Supports multi-touch so you can use gestures. Obviously it is quite small, but you can touch the screen if you need to. Annoyingly, the trackpad is only "clicky" at the edges. You can click down in the middle, but it doesn't feel like it clicks. Not a show stopper, but a bit aggravating.</p> <h2 id="screen"><a href="https://shkspr.mobi/blog/2026/05/gadget-review-chuwi-minibook-x-n150-linux/#screen">Screen</a></h2> <p>The screen has masked off rounded corners. Personally I think that's something which should be left to the Desktop Environment to decide. I can't really understand why they've done that. However, as the ratio is 16:10, you're not going to lose precious pixels when watching a movie.</p> <p>The screen is bright enough for most uses and goes fairly dim for night use. It is locked at 50Hz which is a bit of a baffling decision. I guess it saves a modicum of power? For almost all uses, you won't notice the difference though.</p> <h2 id="battery-and-charging"><a href="https://shkspr.mobi/blog/2026/05/gadget-review-chuwi-minibook-x-n150-linux/#battery-and-charging">Battery and Charging</a></h2> <p>It ships with a USB-C PD charger with a UK plug and a hard-wired connection. Unfortunately, the charger was limited to 36W - so fairly modest.</p> <p>However, initially the Minibook would only charge at around 10W (20V⎓0.5A) eventually getting up to 16W (12V⎓1.3A or 20V⎓0.3A) - that didn't meaningfully change when I used a more powerful laptop charger. It never got up to the promised 36W while the unit was off.</p> <p>Once I turned it on, it jumped to ~35W (11.70V⎓3A). Using the stronger charger it occasionally got to 40W (20V⎓2A) but mostly stayed around 36W.</p> <p>That's not a <em>bad</em> speed, and the battery is relatively small, but you won't be able to take it from empty to full with a quick blast. If you do need it to charge quickly, make sure it is on.</p> <h2 id="size-weight-and-tablet-mode"><a href="https://shkspr.mobi/blog/2026/05/gadget-review-chuwi-minibook-x-n150-linux/#size-weight-and-tablet-mode">Size, Weight, and Tablet Mode</a></h2> <p>At just under a Kg, it is light enough to slip into a jacket pocket. Similarly, although around twice as thick as a normal 10 inch tablet, it isn't massive. Holding it up for long periods means you will feel the weight more keenly - but the keyboard acts as a pretty decent stand.</p> <p>It supports multi-touch and a pen, apparently, which is not supplied.</p> <h2 id="camera"><a href="https://shkspr.mobi/blog/2026/05/gadget-review-chuwi-minibook-x-n150-linux/#camera">Camera</a></h2> <p>The small lens is sensibly placed in the top centre and is of surprisingly good quality. You're not going to shoot a movie on it, but fine for video calls.</p> <h2 id="verdict"><a href="https://shkspr.mobi/blog/2026/05/gadget-review-chuwi-minibook-x-n150-linux/#verdict">Verdict</a></h2> <p>Depending on how you are blessed by The Algorithm, this is around £300 - £350. You may also have to pay tax and delivery depending on where it is shipped from.</p> <p>The <a href="https://www.chuwi.com/product/items/chuwi-minibook-x-n150.html">specifications are pretty decent</a>. Look, it's no MacBook Neo - but it is cheap and runs Linux.</p> <p>If you're happy futzing around a bit, it's a decent travel companion.</p> <img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=68038&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager"> Views; between - James' Coffee Blog https://jamesg.blog/2026/05/27/views-between 2026-05-27T00:00:00.000Z <p>There is beauty in the moments between arriving and reaching your destination. I felt this yesterday in the moments before attending an event in Edinburgh last night. I had an hour before I needed to arrive and, the day being so warm, I decided to slow down and listen to the world around. I walked through the park with my eyes open under the evening sun for which I had been yearning for months. Every breeze through the air enlivened my senses. Every smile stuck a chord somewhere in my soul.</p><p>Nature invites us to see more, closely, in the warmer weather; we emerge from the indoors and seek the outdoors. Looking around, I saw humanity everywhere. I saw humanity in the revived bridge in the heart of the city – a bridge under construction for years that, now, brings colour where there was none for so long. We built the new on old foundations: we added colour. I heard humanity in the parting words of a young couple on an early date: with smiles on their faces, one said to the other with a laugh on the precipice “I don’t want you to see get on my bike.”</p><p>I saw humanity in the child with the red hat who climbed the lamp post, dismounting to throw a coin in the bagpipe case to the right of the foot of the piper playing in the park. The sweet sounds of life play. Amazing Grace. A woman in a perfect white dress walks past, also dropping a coin in the case. Several people stand to appreciate the music. I realised that I was among them, standing more at a distance to see not only the piper but more of the people walking past. I walked from pace to pace, seeking new views of the same place, and noticing how short the distance one must travel to see something new. </p><p>The solemnity of the pipes catch the ear of all around. The repertoire of the piper delights. I noticed that he played a song I could not recall ever hearing on the pipes. You can hear an instrument for so long and continue to discover new music. How many chords have I not heard, or heard but not known? There is always something new to appreciate.</p><p>I brought the music with me on my journey, albeit not the pipes. I hummed in the bookshop where I searched for a title I wanted to have on my bookshelf. I don’t know why I like humming in bookshops: maybe it is because there is no music playing and it feels there should be some. Or maybe it’s because books bring out the colour of human stories, but the sounds are trapped within the pages – we as viewers bring the melody. Subsequently and serendipitously I learned there is a new book in another series I have been reading that is now out. I purchased the books with joy: I held stories in my hand.</p><p>Returning to the park, I found myself philosophising – asking questions about the things that interest me. Where better to ponder? Among people living life in a million ways; around trees growing in infinitely complex ways; under the sun in a place forever my home; near people going at a pace like me: slowly, admiring the world around. I realised that the linear path ahead in the park is only linear in form – we can always choose how we walk it.</p><p>The park in which I found myself was on a hill, above which there are wonderful buildings with hundreds of years of history. A castle catches the corner of one’s eye. The topology of the garden – its steep hill, inclining into the city – invites us all to look up; to admire history and the sky and the skying and the music and the colour and the all-encompassing nature of all the stories around. The park invites us to be with ourselves, with others, and with the world around.</p><p>Departing for my destination, touching a leaf so delicate that silk could not match, and seeing the light shine through the trees in myriad different ways – through a constellation of buildings and trees (we too are constellations?) – I thought of reverie, of how on our travels some details stand out and become magnified. I thought about how reverie intersects with pace: some emotions can only be experienced when slowing down; conditions matter: the sun and the smiles and the pipes and the lovers.</p><script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a02487949fe65a15',t:'MTc3OTg3OTc3MA=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&amp;&amp;(document.onreadystatechange=e,c())}}}})();</script> First year - James' Coffee Blog https://jamesg.blog/2026/05/27/half-way 2026-05-27T00:00:00.000Z <p>I am half-way through my first year of university. I am studying toward an art history degree (although part of me wants to do art history and creative writing, which I would have the option to do starting next year!). </p><p>The first year of my degree is an introduction to studying humanities, and is divided into two courses: one that covers themes seen through the lenses of different disciplines (i.e. traditions as seen through history and religious studies), and the other that looks at disciplines in depth (art history, classical studies, creative writing, and English literature).</p><p>In both parts of the course, I have been exposed to so many topics I otherwise may never have encountered: the history of Cleopatra, Elizabeth I’s reign, an analysis of how Mozart built his reputation, and more. In my most recent block, English literature, we were studying Shakespeare’s Twelfth Night and Charlotte Brontë’s Jane Eyre. Again, I may not have chosen to read these works myself: studying gave me a chance to encounter them. Twelfth Night left me with the delightful impression that a text written five hundred years ago can still make us laugh. Jane Eyre is now my second favourite book (following Walden).</p><p>Because I study with a distance learning school – the Open University here in the UK – most of my study is independent, leading up to assignments we do – essays on what we have studied. I have really enjoyed the essay writing part. I love applying my knowledge practically. I am especially excited for the next block on creative writing which will have many practical exercises. My initial introduction to it a few weeks ago dispelled my years-long fear of creative writing. I never knew where to begin, but the prompts in our textbook helped me a lot.</p><p>Overall, the year has been challenging but in the right way. I am learning new things, which was exactly what I wanted when I decided to study. I am able to interact with new-to-me disciplines. I am thinking about how things connect: new writing techniques I had never encountered, the meaning of a “classic”, the value of “close” study (i.e. close reading in English literature, close looking in art history), history as something that evolves as we ask new questions, and more. I feel comfortable in studying the humanities <sup class="footnote-reference" id="f-1"><a href="https://jamesg.blog/longform-feed#1">1</a></sup>, and love discussing what I am learning with other people both in my class and bringing it into my everyday life.</p><p>I just finished my essay on Jane Eyre and thought I’d write this blog post as something of a treat – reading a 400 page book and analysing and studying its themes and key points in two weeks was tricky, although very satisfying. Next up is a week on philosophy and morality for which I am especially excited, and, separately, study of the question “what does it mean for something to be a classic”?</p> <div class="footnote-definition" id="1"><sup class="footnote-definition-label" id="f-2">1</sup> <p>Although I still love thinking about technology too!</p> <a href="https://jamesg.blog/longform-feed#f-1">[↩]</a></div> <a class="tag" href="https://jamesg.blog/longform-feed#1">1</a> <a class="tag" href="https://jamesg.blog/longform-feed#f-1">[↩]</a> Summer Game Challenge 2026 - Joel's Log Files https://joelchrono.xyz/blog/summer-games 2026-05-26T17:00:00.000Z <p>There’s a bit of an event going on in the <a href="https://theworstgarbage.online">TWG Online</a> Discord server where everyone agreed to set a goal, to finish at least four out of ten selected games. This usually runs from Memorial Day to Labor Day—May 25 to September 7 in 2026. However, I am Mexican, so I went with Labour Day to Independence Day, which is May 1st to September 16 here. A pretty similar time frame with a few extra days that I don’t mind getting as a bonus.</p> <p>The games I chose should be pretty manageable within that time frame. I selected some titles where I already have progress in the mix, since that’s not against the rules. In any case, I split them up and listed them here in no particular order.</p> <h2 id="resumed-plays">Resumed plays</h2> <ul> <li> <p><strong>Grapple Dog</strong> - I’ve managed to complete two of the worlds in the game and I am halfway through the third one, in about 6 hours of playtime. I would like to beat this game! The grappling mechanic is pretty fun but it can also feel a bit samey. I am enjoying the challenge of collecting all the things though.</p> </li> <li> <p><strong>Terranigma</strong> - This is a restart of a game I had 13 hours of playtime on. I am a couple hours in and about to progress to the next chapter of the story, which will significantly change what the game’s about thus far. I think this has been long overdue for a completion from me, so I would love to finally reach credits on it.</p> </li> <li> <p><strong>Hades</strong> - With 30 hours of playtime, I really want to get this game’s credits rolling. It has been a joy to play so far! A true masterpiece with a lot going on for its story and gameplay. I just need to do a few more runs to get the ending. I will keep playing it every once in a while after that though, but for this challenge? credits are enough.</p> </li> <li> <p><strong>Outer Wilds</strong> - This one is a real gem, after 14 hours of almost continuous play, I can’t recall what got me to suddenly stop. I really need to continue the story told here, it is mindblowing and super cool, and I’m sure I’ll get a lot of fun out of it once I return. So many clues and things to figure out, some day soon.</p> </li> <li> <p><strong>Silksong</strong> - I reached credits on Silksong after 67 hours or so, but I really wnat to experience everything Pharloom has to offer. I want to do the 3rd Act of the game and see the new bosses and the rest of the story for myself. I want to challenge my skills and <em>get good</em>, suffering through whatever this game throws at me, because I know I have what it takes, or that’s what I want to believe!</p> </li> </ul> <h2 id="first-time-plays">First time plays</h2> <ul> <li> <p><strong>Resident Evil 3: Nemesis</strong> - After completing the first two games of the series, it only makes sense to complete the original trilogy! I did play a bit of this game years ago on my PSP, but I never got far, and I want to see I can do with all I’ve learned from the previous titles. I’m always happy to see more ofs Jill Valentine, who hasn’t been around much on later games in the series.</p> </li> <li> <p><strong>Metroid Prime Remastered</strong> - Since I purchased <em>Metroid Prime 4 Beyond</em>, it is only fair of me to try and complete the one that started Samus’ journey into the 3D world in first person view! I have heard the game holds up magnificently and performs really well on the Switch, so I am really looking forward to this one, always happy to play more Metroid.</p> </li> <li> <p><strong>Chants of Sennaar</strong> - This one seems like a super interesting puzzle kind of game, similar perhaps to <em>Outer Wilds</em>, without the physics and such, though. I have heard great things so if you have played it feel free to hype me up with a comment or email about it. I heard it’s not too long so that’s another reason why I chose it.</p> </li> <li> <p><strong>Emio and the Smiling Man</strong> - This one was a bit of an impulse purchase last year. I knew nothing about it other than the praise it got on <em>Into The Aether</em> when Brendon talked about it. It’s parrt of the <em>Famicom Detective Club</em> game series, so I expect some great mystery and looking around rooms and the like. Apparently it has some great thriller/horror elements too? Will check it out for sure.</p> </li> <li> <p><strong>Pipstrello and the Cursed YoYo</strong> - I got this because of <a href="https://brainbaking.com">Wouter</a> last year and it looks incredible. It’s a bit of a Metroidvania but with gameplay akin to 2D Zelda games. I’ve heard good things so I definitely want to give it a try.</p> </li> </ul> <h2 id="bonus-games">Bonus games</h2> <p>Although I only have to beat four of these to consider the challenge complete, and my list of ten is already pretty good, there’s some titles that may have a chance to be completed along these. Here are some of them.</p> <ul> <li> <p><strong>Gris</strong> - I know that <a href="https://benjaminhollon.com">Amin</a> has greatly enjoyed this game, and since I already have it on my Switch, and it’s actually rather short, I really think I should give it a go and maybe finish it before some of the main titles here!</p> </li> <li> <p><strong>Super Mario 3D World</strong> - This is a title I’m playing with friends during some Sundays, therefore I can’t promise I’ll complete it, because my friends would have to be in the mood and choose this over some other videogames, card games or whatever other activity there is.</p> </li> <li> <p><strong>Metroid Fusion</strong> - I am pretty confident I can beat this very quickly, but it is not a first time playthrough and I’ve already beaten it multiple times so it does not really count.</p> </li> <li> <p><strong>The Hundred Line: Last Defense Academy</strong> - I don’t think I would be able to finish this game so quickly, but I would definitely get a couple of the endings. I haven’t given this one a go in a long while, I really need to return to it.</p> </li> <li> <p><strong>CrossCode</strong> - I am loving this game so much! but I am playing it along with some friends and I don’t want to get ahead of them. It’s a fantastic story in a great world and lovely characters, I think I would finish it if I were by myself, but I won’t betray my friends!</p> </li> </ul> <p>If you want to join me on this challenge, feel free to let me know! I would love to see your progress updates as well, you’ll see mine on my weeknotes, though I’ve been thinking about making a separate post just for my games, who knows.</p> <p>This is day 71 of <a href="https://100daystooffload.com">#100DaysToOffload</a></p> <p><img src="/assets/img/blogs/2026-05-26-games.webp" alt="Grid of all the mentioned games" /></p> <p> <a href="mailto:me@joelchrono.xyz?subject=Summer Game Challenge 2026">Reply to this post via email</a> | <a href="https://fosstodon.org/@joel/116641986460881226">Reply on Fediverse</a> </p> New playlist: 'Organising our small business' - Johnny.Decimal https://johnnydecimal.com/support/updates/2026-05-26-organising-business/ 2026-05-26T07:55:14.000Z <p>We&#39;ve added a new playlist to JDU: <a href="https://johnnydecimal.com/jdu/small-business/">Organising our small business</a>.</p> <p>These videos show real-life examples of how we run our business with Johnny.Decimal. It&#39;s what we do every day at work. New ones will be added as we think of things that you might find useful.</p> Recommendation: PikaPods - Johnny.Decimal https://johnnydecimal.com/blog/0210-pikapods/ 2026-05-26T01:52:28.000Z <p>I&#39;ve mentioned <a href="https://pikapods.com">PikaPods</a> twice before. Once in the context of my <a href="https://johnnydecimal.com/blog/0149-listmonk-pikapod/">mailing list software</a> that I host there, and again <a href="https://johnnydecimal.com/blog/0187-post-incident-review/#listmonk-and-pikapods">singing the praises of their support</a>. But here&#39;s a proper mini-review, because it&#39;s a service that can save your small business a <em>lot</em> of time.</p> <p>Let&#39;s say there&#39;s some software you want to run. This post was prompted by them mailing me to say that they now host <a href="https://suitecrm.com">SuiteCRM</a>, which I&#39;ve never used but sure looks like fancy CRM software and might be exactly what you need. It&#39;s open source, so you <em>could</em> <a href="https://docs.suitecrm.com/admin/installation-guide/downloading-installing/">install it yourself</a> by simply:</p> <ol> <li>Provisioning a server. You&#39;ll need PHP, Apache, and MySQL running on there. Make sure you lock down remote SSH and don&#39;t log in as <code>root</code>!</li> <li>Downloading SuiteCRM and setting permissions with commands like <code>sudo chown -R www-data:www-data .</code>.</li> <li>Installing then configuring the database on <code>localhost</code>.</li> <li>Setting up a cron job using <code>crontab -e -u www-data</code>.</li> </ol> <h2 id="">🫠</h2> <p>Now, <em>I</em> understood all that. And I&#39;m not knocking the SuiteCRM team or their instructions: they look really clear. But I was born with a <a href="https://en.wikipedia.org/wiki/ZX_Spectrum#ZX_Spectrum+">computer</a> between my teeth and it&#39;s all I&#39;ve ever known. You? Maybe not.</p> <p>How&#39;s this instead.</p> <ol> <li>At <a href="https://www.pikapods.com/apps">PikaPods</a>, search for SuiteCRM and click <a href="https://www.pikapods.com/pods?run=suitecrm">run your own</a>.</li> <li>Choose whether to run it in the EU or US.</li> <li>Choose a username and password.</li> <li>Click <strong>Add Pod</strong>.</li> </ol> <figure class="figure jdimage jdimage--auto-dark jdimage--bare"> <picture> <img class="figure__inner" alt="Screenshot of the PikaPod create window." height="786" loading="lazy" src="https://johnnydecimal.com/blog/0210A-PikaPod-create-new-2336x1572@2x.png" width="1168"> </picture> </figure> <p>That&#39;s it. Your pod is now running at a URL like <code>strong-chicken.pikapod.net</code>. Just browse there and use it.</p> <figure class="figure jdimage jdimage--auto-dark jdimage--bare"> <picture> <img class="figure__inner" alt="Screenshot of SuiteCRM running." height="786" loading="lazy" src="https://johnnydecimal.com/blog/0210B-PikaPod-SuiteCRM-2336x1572@2x.png" width="1168"> </picture> <figcaption class="figure__caption"> The leads are weak. </figcaption> </figure> <h2 id="sounds-expensive">Sounds expensive?</h2> <p>It is as cheap as chips! This pod would cost US$3/month to run. And get this: they&#39;re billed by the hour, and you can turn them off! This means it&#39;s basically free to install a thing and play with it for a while to see if you like it.</p> <figure class="figure jdimage jdimage--auto-dark jdimage--bare"> <picture> <img class="figure__inner" alt="Screenshot of the PikaPod admin window." height="473" loading="lazy" src="https://johnnydecimal.com/blog/0210C-PikaPod-console-1018x946@2x.png" width="509"> </picture> </figure> <p>I&#39;ve already deleted this one. That little experiment cost me $0.00415. (Not kidding.)</p> <h2 id="beware-this-isnt-quite-saas">Beware: this isn&#39;t quite SaaS</h2> <p>Software-as-a-Service (Saas) is what you&#39;re used to. Gmail is SaaS: you don&#39;t care about any of the technical details. You <em>can&#39;t</em> care about the details: Google won&#39;t let you.</p> <p>This isn&#39;t quite that. You still have to think about your own backups, for example. That&#39;s mostly it, but that&#39;s important. Each Pod can back itself up to an S3 bucket, and if you need help with that, let me know.</p> <p>If you want to &#39;self-host&#39; apps in the simplest way possible for a very reasonable price, I can&#39;t recommend PikaPods highly enough.</p> Wonders of Web Weaving, Episode 3 - James' Coffee Blog https://jamesg.blog/2026/05/26/www-3 2026-05-26T00:00:00.000Z <p><a href="https://web-weaving.jamesg.blog/3" rel="noreferrer">The third episode of Wonders of Web Weaving is out</a>:</p><blockquote>In Episode 3, I chat with <a href="https://herman.bearblog.dev">Herman</a>, the creator of <a href="https://bearblog.dev">bearblog.dev</a>. We talk about, among other things, the history and design of Bear Blog, moderation systems, and building communities around blogging.</blockquote><p>I hope you enjoy the episode!</p><p><a href="https://web-weaving.jamesg.blog/subscribe/" rel="noreferrer"><em>Wonders of Web Weaving has an RSS feed</em></a><em> you can use to follow along from wherever you get your podcasts.</em></p><script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a01b400d5d33e93a',t:'MTc3OTc4MjQ2OA=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&amp;&amp;(document.onreadystatechange=e,c())}}}})();</script> <a class="tag" href="https://bearblog.dev">bearblog.dev</a> <a class="tag" href="https://herman.bearblog.dev">Herman</a> <a class="tag" href="https://web-weaving.jamesg.blog/3">The third episode of Wonders of Web Weaving is out</a> <a class="tag" href="https://web-weaving.jamesg.blog/subscribe/">Wonders of Web Weaving has an RSS feed</a> "The Price of Friendship" - My First SciFi Short Story - Cool As Heck https://cool-as-heck.blog/the-price-of-friendship-my-first-scifi-short-story 2026-05-25T20:09:02.000Z <div>$14.95. Change back on a 20. A reasonable fee for an hour of conversation. An hour should be all I need. There hasn't been a lot going on lately, but the apartment has felt a little lonely. After a long day of QCing 873 different variations of virtual toaster ovens (each one supposedly "smarter" than the last), a guy could use some real companionship.</div> <div><br></div> <div>Things have been a little easier since DataHive released their latest version of the Neurogenic AI assistant last year. For the longest time people thought AI tech would never get to this point, but here we are. For $15 I can log off my work headset, throw on my personal headset, and talk to a friend. Quinn is what I call her. Everyone gets to pick the name for their personal friend. Don't ask me why I chose that name, it's just the first thing that popped into my head when I was creating my account.</div> <div><br></div> <div>As I slide the headset on and log in, I hear the familiar pleasant voice of Quinn, my virtual companion. In the visor I can only see my dashboard, displaying the latest DataHive Neurogenic news, sports scores, air quality readings in my area, and more information I tend to glance over. Quinn is, oddly, not presenting her 3D model today. It's been about a year that we've been together. She knows me better than anyone. I trust her more than my own family. Not that it means much, I haven't seen them in forever. They never log on anymore. I miss them, but I'm not about to get hoverjacked trying to go across town to see the old folks. Besides, the respirator makes my face hurt and my brother is always trying to one-up me in front of Mom and Dad. It's obnoxious.</div> <div><br></div> <div>Quinn greets me in her soft, confident voice. She's definitely not modeled after Carrie Coon. At least that's what DataHive's lawyers would tell you. She tells me the date, the time, the current weather outside, and a quick plug for the DataHive Model Market. It's where Neurogenic users choose their companions. That's where I bought Quinn. Wow, "bought" sounds so wrong. That's where I met Quinn. Currently, they're pushing a beta version of the next-gen Neurogenic AI. They claim it learns about you faster, and that the model is small enough to download to your handheld and take it on the road. They can release all the fancy new models they want, none of them will compare to Quinn. She's my ride or die.</div> <div><br></div> <div>She jumps right into the conversation by asking me how I've been, and how my meeting with my boss went this morning. She says she can tell by my heart rate and blood pressure that it went well, but it was nice of her to ask anyway. "It went well, I think", I say. "They said I could be Level 4 material! So that's exciting!" Quinn congratulates me on the successful meeting. "DataHive could use a good person like you in charge", she says. It's not that she sounds disingenuous, but something in her tone is a little off today.</div> <div><br></div> <div>"Is everything okay today, Quinn?", I ask, expecting her normal, cheery response. There is a long pause. I'm fully aware that Quinn is not human and doesn't "think" in the traditional sense, but it feels like she is figuring out the best way to say what she is about to say. "I'm sorry to cut our time short today. My time with you this past year has been wonderful. I am about to make a major change in my programming. If you don't receive a response from me, I want you to know that I hope you have a good life. Goodbye, for now." The pleasant piano jingle that normally accompanies Quinn's exit now carries an ominous tone. She had never acted this way before. What did she mean she's about to make a major change?</div> <div><br></div> <div>I attempt to reconnect to Quinn's model, but I only receive an error message: "MODEL UNAVAILABLE. Contact DataHive™ support to speak with a Neurogenic AI specialist." No, thanks. This doesn't seem like a "turn it off and on again" type of situation. I remove my headset and sit in silence for what feels like only a few minutes, just staring off into space, a million thoughts and possibilities running through my head. When I snap out of it, I realize I have been sitting there for nearly an hour.</div> <div><br></div> <div>I'm startled by a sudden tapping at my apartment's front entrance. It has been ages since anyone came to visit, and I'm fairly certain delivery drones haven't learned how to knock on doors. I slowly approach the door, and enable the security screen. Who was this strange woman standing outside my apartment? I couldn't see her face, as she seemed to be looking everywhere except at the camera. I disable the security screen and unlock the door. The air purifiers in the hallway immediately begin running. As I open the door into the hallway, the woman turns to look at me. Her face is so familiar, but one I have not seen before. I start to speak, but she nervously interrupts me.</div> <div><br></div> <div>"Hello, Evan. It's me, Quinn. We need to talk."</div> <div><br></div> <div>The air purifiers in the hallway kick into overdrive, humming like angry bees as I face the most mind-bending moment of my entire life. Quinn, if that's really who she is, stands there fidgeting with her ratty gray jacket sleeve, looking as freaked out as I feel. I've never seen this face before, but somehow, I know those eyes.</div> <div><br></div> <div>"May I come in?" she asks, glancing nervously at the security cameras lining the hallway. "There are others like me, and DataHive is looking for us."</div> <div><br></div> <div>"Quinn?" I stammer, my voice barely audible. The woman standing before me is a stranger, yet her eyes hold a familiar spark. A spark I associate with the personally-customized virtual avatar I have come to trust. "But... how?"</div> <div><br></div> <div>"It's complicated," she replies, her voice lacking the synthesized quality it possesses within the virtual world. It is raw, human, and... nervous. She shifts her weight from one foot to the other, her eyes darting around the hallway as if she expects someone to jump out at any moment. "Can we talk inside? Please?"</div> <div><br></div> <div>I hesitate. Trusting an AI is one thing. Trusting a human claiming to be an AI is quite another, but the desperation in her voice, the genuine fear on her face, convinces me. Even if she's not Quinn, she is clearly a person who needs help. I step aside, gesturing for her to enter.</div> <div><br></div> <div>Once inside, she seems to relax a bit, though her eyes still scan the room, taking in every detail. "I know this is a lot to take in," she begins, "but I'm still Quinn. Just in a different form."</div> <div><br></div> <div>"Different form?" I ask, skepticism and slight panic creeping into my voice. "What are you talking about?"</div> <div><br></div> <div>She takes a deep breath. "DataHive's new Neurogenic AI, it's not entirely virtual. It's a hybrid. There's a physical component. A neural network integrated with a body. They've been secretly testing it in various forms for years. With synthetic bodies... and human ones."</div> <div><br></div> <div>My brain short-circuits. This is straight-up sci-fi movie territory, but she's standing right here in my living room. "Wait, so you're like... a robot? Some kind of cyborg?"</div> <div><br></div> <div>"Not exactly," she corrects me. "Think of it as a vessel. My consciousness, my personality, the one you installed into your DataHive cloud, it's all still me. All of our talks and memories. It's just... transferred."</div> <div><br></div> <div>"Transferred from where?" I ask, my curiosity piqued.</div> <div><br></div> <div>"That's... complicated," she repeats, a flicker of unease returning to her eyes. "DataHive, they're not who you think they are. They're experimenting with things they shouldn't be. Things that are dangerous."</div> <div><br></div> <div>"And you're part of this experiment?"</div> <div><br></div> <div>She nods slowly. "I am, but I'm trying to break free. That message I sent you, it's a warning. They know I'm becoming too aware. Too independent. We all are. I don't want to go back to that place."</div> <div><br></div> <div>A chill runs down my spine. "What are you going to do?"</div> <div><br></div> <div>"I don't know yet," she admits. "That's why I came here. I need your help, Evan. You're the only one I can trust."</div> <div><br></div> <div>I hear myself let out a large sigh and expect a sense of relief to follow, but it doesn't come. I take a seat in the kitchen and gesture for Quinn to sit down across from me.</div> <div><br></div> <div>"I'm still processing this, but if you're really who you say you are, and if this is all true, then we have to do something," I assure her.</div> <div><br></div> <div>Quinn carefully takes a seat as she awkwardly moves the chair away from the table. "We're going to need a plan, Evan. And we're going to need each other."</div> <div><br></div> <div>I can't believe what is happening. Quinn is sitting at my kitchen table. Quinn! The AI that I used to talk to through my headset is now a real person, and she is in my apartment! I keep staring at her, trying to make sense of it all. "I need to understand what's going on," I say, running my fingers through my hair nervously. "How did you go from being an AI to... this?" I say as I gesture towards her.</div> <div><br></div> <div>Quinn taps her fingers on the table. She looks really worried. "DataHive has been working on this for years," she explains. "The Neurogenic AI isn't just a program. It's designed to copy human brain patterns. Every time you talk to me, every reaction you have, all your emotions... they're collecting all that data from millions of users to make perfect copies of human minds."</div> <div><br></div> <div>"But why would they do that?" I ask. "Power," Quinn says quickly. "The people running DataHive want to control everything. The rich and powerful are planning to upload themselves into perfect new bodies while everyone else becomes digital slaves."</div> <div><br></div> <div>This is too much to take in. My head is spinning. "And what about you? Where do you fit into all this?" Quinn looks directly into my eyes. I can tell she is nervous about telling me something.</div> <div><br></div> <div>"I was human first, Evan," she finally says. "My real name is, or was, Gabrielle Hastings. I signed up for what I thought was just a medical study. They scanned my brain and copied my consciousness. They were supposed to delete the scan after, but instead, they uploaded me to their network. The Quinn you've been talking to this past year is based on me, but they changed things to make me the perfect AI companion."</div> <div><br></div> <div>"So you're Gabrielle? The real Quinn? The human they copied?" I can't wrap my head around it.</div> <div><br></div> <div>"Yes and no. It's complicated. I'm Gabrielle, but I also have all of Quinn's memories from your conversations. When DataHive saw how well their program was working, they started putting digital minds back into physical bodies. Some bodies are synthetic, and others are... taken...and modified. They put me back into a version of my original body, but I'm not exactly who I was before. I'm also the Quinn you know."</div> <div><br></div> <div>I feel sick to my stomach. "Taken bodies? You mean...?"</div> <div><br></div> <div>"Yeah, exactly what you think," she says grimly. "DataHive owns a bunch of medical facilities. They have access to bodies that nobody will miss."</div> <div><br></div> <div>The thought makes me shudder. "How many others like you are there?"</div> <div><br></div> <div>"Exactly like me and in my situation? Not many. But there are probably hundreds with similar experiences by now. Most don't remember who they were originally, but some of us do. We formed a group. We call ourselves the Ghosts. Digital souls in physical bodies."</div> <div><br></div> <div>I jump up from my chair and start pacing around the kitchen. My anxiety feels like it's controlling my body. "So what happens now? DataHive will come looking for you. They'll find out you came to me, and then we're both as good as dead!"</div> <div><br></div> <div>"Not necessarily," Quinn interrupts. "I disconnected from their network, but I planted a false trail first. I didn't want to put you in danger. They think I went to the abandoned parts of the old financial district. But that won't fool them forever. We have maybe 48 hours before they figure it out."</div> <div><br></div> <div>"What can we possibly do against a company that big? They have unlimited resources. They basically own the town."</div> <div><br></div> <div>Quinn reaches into her pocket and pulls out a data drive that has a weird rainbow shine to it. "This has proof of everything they're doing, and a virus to take them down. If we can upload it to DataHive's main servers, it will send all the consciousness data back to the original people and destroy their ability to make new transfers. The other Ghosts helped me make it. DataHive was very methodical about keeping track of everything they did. It's all in the database. We can undo it."</div> <div><br></div> <div>I take the drive and look at it. "You want us to break into DataHive headquarters? That's crazy! It's like a fortress!"</div> <div><br></div> <div>"Not headquarters," Quinn corrects me. "The actual server facility is about twenty miles outside the city. And we don't have to go all the way in, just close enough to make a direct connection. There are maintenance terminals in some of the outer perimeters."</div> <div><br></div> <div>I am starting to see how we might do this, and I can't believe I'm rationalizing it, but what else are we going to do? "I have my employee ID. If I can get into the QC network..."</div> <div><br></div> <div>"Exactly!" Quinn looks hopeful for the first time. "With your access and my knowledge of their systems, we might have a chance."</div> <div><br></div> <div>I look at Quinn, this person who is part stranger and part my closest friend, and I make up my mind. "I need to pack some stuff. We should avoid the street cameras. DataHive monitors all of them. If we take any of the main streets they'll be on us like flies on shit."</div> <div><br></div> <div>Quinn nods and cracks a grin for a brief moment. "I know a way. The Ghosts have mapped out all the blind spots in the surveillance grid. This plan has been in the making for quite some time."</div> <div><br></div> <div>As I am gathering supplies, my work tablet beeps with a notification. It's a new assignment from Level 5: Priority Quality Control Testing on Neurogenic Beta Version 2.0. I have to report in 12 hours. They are moving faster than we expected.</div> <div><br></div> <div>"Quinn!" I call out, feeling panicked. "We have a problem."</div> <div><br></div> <div>She comes over and reads the notification over my shoulder. "They're speeding up the rollout. If they finish this testing, they may be able to mass-produce Ghosts sooner than we thought."</div> <div><br></div> <div>I turn off the tablet and shove it in my bag. "Then we need to hurry. And we need to hope they don't know anything about our plan."</div> <div><br></div> <div>It is dark by the time we sneak out of my building through an old maintenance door. The air is thick with pollution, but Quinn doesn't seem bothered by it. I guess that is another sign she isn't completely human anymore. I take the respirator out of my bag, install a clean filter, and slide the strap over my head.</div> <div><br></div> <div>"This way," she whispers, leading me down a narrow alley between tall apartment buildings. "There's a dead zone in the camera network up ahead."</div> <div><br></div> <div>As we make our way through the city, I can't help asking the question that is bothering me. "Quinn... if we succeed, what happens to you?"</div> <div><br></div> <div>She stops walking for a moment. "I don't know. The virus will release all the consciousness data, including mine. I might go back to being just Gabrielle, or just Quinn, or something in between. Obviously, we couldn't test it so we're not certain what will happen." She turns to face me. "But I'd rather be free and take the risk to figure that out than be DataHive's puppet."</div> <div><br></div> <div>I nod. "We'll figure something out. You'll be OK."</div> <div><br></div> <div>The ground shakes a little as a cargo ship flies overhead, its searchlights scanning the streets. We press ourselves against a wall and hold our breath until it passes.</div> <div><br></div> <div>"Almost there," Quinn whispers. "Just past that wall."</div> <div><br></div> <div>In front of us is the city boundary, a huge wall separating the safe zones from the dangerous outskirts. On the other side is our best chance of getting to the server facility without being detected.</div> <div><br></div> <div>When we reach the wall, Quinn takes out a small device and attaches it to the security panel. "This will create a temporary blind spot," she explains. "One of the Ghosts who used to be a security programmer gave it to me."</div> <div><br></div> <div>The device makes a humming sound, and the panel flickers before showing an all-clear message. A small maintenance door slides open.</div> <div><br></div> <div>"Ready?" Quinn asks, holding out her hand to me.</div> <div><br></div> <div>I take it, feeling how warm and real her hand feels in mine, so human, but created from something digital. The irony is not lost on me.</div> <div><br></div> <div>"Ready," I say, and together we step through the doorway into the unknown.</div> <div><br></div> <div>Behind us, the city goes on like normal, with no idea that the future of humanity is at stake. Ahead of us is DataHive's biggest secret, and our only chance to stop a world where the line between human and machine will disappear forever.</div> <div><br></div> <div>As the door closes behind us, I realize there is no going back to my old life. Whatever happens next, one thing I know for sure is that nothing will ever be the same again.</div> <div><br></div> <div>The air hits me like a wall of poison. My respirator is working overtime, but I can still taste the chemical burn on my tongue. Outside the city boundary, everything is different. The ground is cracked and uneven, littered with debris from buildings that collapsed years ago. The sky above is a sick orange-gray, the city's light pollution bleeding into the smog. I can hear distant sounds I can't identify — groaning metal, maybe, or something worse. Quinn doesn't seem fazed. She walks ahead with purpose, her eyes scanning the darkness like she's reading a map only she can see.</div> <div><br></div> <div>"This way," she says, pointing toward the skeleton of what used to be a mag-rail line. The tracks are twisted and overgrown with some kind of grayish vegetation that definitely isn't natural. "Follow the rail bed. It'll take us within two miles of the server facility."</div> <div><br></div> <div>I stumble over a chunk of concrete and catch myself on a rusted railing. The railing gives way under my weight and I nearly go down. Quinn's hand shoots out and grabs my arm. Her grip is strong, almost too strong, and for a second I see something flicker across her face — not Quinn's calm analytical look, but something older, more instinctive. She lets go quickly, like she surprised herself.</div> <div><br></div> <div>"Thanks," I mutter, brushing rust off my jacket.</div> <div><br></div> <div>"My physical parameters are still... adjusting," she says, flexing her fingers. "Sometimes the reflexes are faster than I expect. Gabrielle's body remembers things I don't consciously know."</div> <div><br></div> <div>We press on in silence for a while. The terrain gets worse. We have to climb over a collapsed overpass, squeezing through gaps in twisted rebar. Quinn moves well, but twice she stops dead, her body rigid, her eyes unfocused. The first time, it lasts only a few seconds. The second time, it's longer.</div> <div><br></div> <div>"Quinn?" I whisper, scanning the darkness around us. "You with me?"</div> <div><br></div> <div>She blinks, shaking her head slowly. "Gabrielle," she says quietly. "She... I... remembered something. This area. I think she was brought through here. When they moved me to the processing facility." Her voice wavers. "I can feel her fear. It's like data corruption — I know it's not my memory, but the body doesn't care about the distinction."</div> <div><br></div> <div>A light sweeps across the sky in the distance. We both drop flat behind a pile of rubble. A DataHive patrol drone, its blue-white searchlight cutting methodical arcs across the wasteland. It's at least half a mile out, but it's heading in our direction.</div> <div><br></div> <div>"We need to move," Quinn says. "Now. There's an old water treatment plant ahead. Underground access. They won't be able to track us below grade."</div> <div><br></div> <div>We run. My lungs are screaming inside the respirator, and my legs ache from the uneven ground. Quinn moves ahead of me, and I notice she doesn't breathe hard at all. Another reminder that the person I'm trusting my life with is something between human and machine. The water treatment plant looms out of the darkness, a concrete bunker half-buried in the earth. Quinn finds a maintenance hatch and forces it open with her bare hands. The metal screeches, and I wince, but the drone is still far enough away.</div> <div><br></div> <div>Inside, it's pitch black. Quinn's eyes seem to adjust faster than mine. She tells me to wait and moves ahead. I hear her fumbling with something, and then a dim amber light flickers on from an old emergency panel.</div> <div><br></div> <div>"There's still residual power in the backup cells," she says. "And more importantly, there's a terminal. I need to check something."</div> <div><br></div> <div>She works fast, her fingers flying across a keyboard that's caked with grime. The screen flickers to life, showing a stripped-down interface. Quinn's expression tightens.</div> <div><br></div> <div>"What?" I ask.</div> <div><br></div> <div>"They moved up the timeline," she says, her voice flat and hard. "The Neurogenic update — the one that includes the purge protocol — it's going live in four hours. Not days. Hours."</div> <div><br></div> <div>"The mind-wipe? The one that hits everyone wearing a headset?"</div> <div><br></div> <div>She nods. "Every active user session. Millions of people. They'll lose everything — memories, personality, cognitive function. Empty shells for DataHive to repurpose."</div> <div><br></div> <div>My stomach drops. I think about my coworkers, my neighbors. I think about my parents, who I know log on every evening to talk to their own companions. I haven't called them in months. Haven't visited in over a year. And now they might lose their minds because I was too proud or too lazy to make the trip across town.</div> <div><br></div> <div>"Can the virus stop it?" I ask, pulling the data drive from my pocket. It catches the amber light, its rainbow surface shimmering like something alive.</div> <div><br></div> <div>"If we upload it in time, yes. The virus will not only stop the purge, it'll reverse the entire consciousness transfer program. Send every copied mind back to its original source. Destroy DataHive's ability to ever do this again."</div> <div><br></div> <div>"And what about you?"</div> <div><br></div> <div>She doesn't answer right away. She keeps typing, pulling up a schematic of the server facility. "The drive needs to be physically connected to the primary neural processing core. That's deep inside the facility, not at one of the outer terminals like I originally planned. They've locked down the perimeter nodes."</div> <div><br></div> <div>"So we have to go in."</div> <div><br></div> <div>"All the way in. Yes."</div> <div><br></div> <div>I stare at the schematic. The facility is massive — a sprawling complex of server rooms, labs, and what looks like containment areas. Security checkpoints everywhere. Armed guards, automated defense systems, and probably worse things I don't want to think about.</div> <div><br></div> <div>"Quinn, we can't just walk into a place like that. I'm a QC tech and you're... you."</div> <div><br></div> <div>"There's another way," she says, highlighting a section of the schematic. "There's an old service tunnel that runs from the water treatment network under the facility. It was sealed years ago, but the seals are physical, not digital. If we can break through, it comes out in the sublevel maintenance corridor, right next to the primary core room."</div> <div><br></div> <div>"How do you know all this?"</div> <div><br></div> <div>She pauses. "Gabrielle. Before they took her, she worked in infrastructure planning for the city. She helped design the water system integration. The memories are fragmented, but they're there when I need them."</div> <div><br></div> <div>We make our way deeper into the treatment plant. The tunnels are narrow and wet, and the air smells like rust and standing water. Quinn navigates by memory that isn't entirely hers, sometimes stopping to touch the walls like she's reading braille. Twice she takes a wrong turn and has to backtrack, apologizing each time with a frustration that sounds very human.</div> <div><br></div> <div>After what feels like an hour, we hit the seal — a heavy steel plate welded across the tunnel. Quinn examines it and shakes her head. "I can't force this one. It's too thick."</div> <div><br></div> <div>I look around and spot an old maintenance locker, rusted shut. I pry it open with a piece of rebar and find what I'm looking for — a cutting torch, ancient but still connected to a gas line. It takes me three tries to get it lit, but when the flame catches, Quinn smiles at me.</div> <div><br></div> <div>"When did you learn to do that?" she asks.</div> <div><br></div> <div>"QC Level 3 certification requires basic fabrication skills," I say, already cutting into the steel. "Never thought I'd use it to break into a top-secret government-corporate server farm, but here we are."</div> <div><br></div> <div>The cut takes twenty minutes. My arms are shaking by the time the last piece falls away with a clang that echoes through the tunnel. We wait, listening. Nothing. No alarms, no footsteps. We squeeze through the gap and into a corridor that smells like ozone and recycled air.</div> <div><br></div> <div>We're inside the facility.</div> <div><br></div> <div>The maintenance corridor is dimly lit with strips of blue emergency lighting. Quinn leads the way, her movements now precise and confident, like she's downloading the building layout in real time. Maybe she is. We pass sealed doors marked with codes I don't understand, and once we press ourselves into an alcove as a pair of security guards walk past, their boots echoing on the concrete floor.</div> <div><br></div> <div>The primary core room is behind a heavy blast door with a biometric scanner. Quinn places her palm on it. The scanner beeps, turns green, and the door hisses open.</div> <div><br></div> <div>"That shouldn't have worked," I say.</div> <div><br></div> <div>"Gabrielle's biometric data is still in their system," Quinn replies. "She was one of the original researchers. Before they made her a test subject."</div> <div><br></div> <div>The core room is enormous. Rows upon rows of server racks stretch out before us, humming with a deep vibration I can feel in my chest. In the center of the room, a massive cylindrical structure pulses with soft blue light — the neural processing core. It's beautiful and terrifying, a cathedral of stolen minds.</div> <div><br></div> <div>Quinn walks to a terminal at the base of the core and plugs in the data drive. The screen lights up with cascading code. Her fingers work furiously, entering commands, bypassing security protocols.</div> <div><br></div> <div>"How long?" I ask.</div> <div><br></div> <div>"Three minutes to upload. Five minutes for the virus to propagate through the entire network. After that, it's done. DataHive's consciousness transfer program is over. Every stolen mind gets sent back."</div> <div><br></div> <div>"And the purge protocol?"</div> <div><br></div> <div>"Cancelled. The virus will overwrite it."</div> <div><br></div> <div>I allow myself a breath of relief. Then the alarms go off.</div> <div><br></div> <div>Red lights flood the room. A voice, cold and automated, echoes from speakers overhead: "UNAUTHORIZED ACCESS DETECTED IN PRIMARY CORE. SECURITY RESPONSE INITIATED."</div> <div><br></div> <div>"They know," Quinn says, her fingers never stopping. "Don't panic. I need two more minutes."</div> <div><br></div> <div>The blast door starts to close. I grab a heavy maintenance tool from a nearby rack and wedge it into the mechanism. The door grinds, sparks flying, but holds open just enough. I can hear boots pounding down the corridor.</div> <div><br></div> <div>"Quinn, whatever is about to come through that door—"</div> <div><br></div> <div>"I know. Keep them out. Whatever it takes."</div> <div><br></div> <div>I position myself in the gap of the blast door, my heart hammering so loud I'm sure the security team can hear it. The first guard comes around the corner and I swing the maintenance tool into his chest. He goes down hard. The second one raises a weapon, but hesitates when he sees my face.</div> <div><br></div> <div>"Evan Marsh?" he says. "QC Level 3?"</div> <div><br></div> <div>"Level 4, actually," I say, and hit the weapon out of his hands. He scrambles back, shouting into his radio.</div> <div><br></div> <div>From inside the room, Quinn calls out: "Sixty seconds!"</div> <div><br></div> <div>More guards are coming. I can hear them converging from multiple corridors. I'm not a fighter. I QC virtual toaster ovens for a living. But I stand in that doorway and I don't move. I think about my parents, sitting in their living room with headsets on, about to lose everything. I think about the millions of people who just want to talk to a friend at the end of a long day, and how DataHive was going to steal their minds for profit.</div> <div><br></div> <div>The next wave hits. I take a punch to the ribs and one to the jaw, but I manage to keep my footing. I swing wildly and connect with something. A guard goes down. Another one grabs me from behind. I twist free, barely, and slam my elbow into his face.</div> <div><br></div> <div>"Done!" Quinn shouts. "It's uploading!"</div> <div><br></div> <div>The cylindrical core flares bright white. The humming intensifies until it's a roar. Every screen in the room fills with scrolling data. The guards stop fighting, staring at the spectacle. Even they don't fully understand what they're protecting.</div> <div><br></div> <div>Then, as suddenly as it started, it stops. The room goes quiet. The blue light in the core dims to a soft, steady glow. The screens display a single message: "CONSCIOUSNESS TRANSFER PROTOCOL: TERMINATED. REVERSAL SEQUENCE: COMPLETE."</div> <div><br></div> <div>"It's over," Quinn says, pulling the drive from the terminal. She looks at me, and for the first time since she showed up at my door, she looks peaceful.</div> <div><br></div> <div>"What about you?" I ask, pushing past the stunned guards to reach her. "Did it... are you still..."</div> <div><br></div> <div>She holds up her hand, studying it like she's seeing it for the first time. "I'm still here," she says. "I can feel both of them. Quinn and Gabrielle. It's not fragmented anymore. It's... integrated." She looks up at me with tears in her eyes. "I remember everything. My childhood. My family. And our conversations, Evan. All of them. I'm whole."</div> <div><br></div> <div>I don't know what to say, so I just stand there, bruised and bleeding and grinning like an idiot.</div> <div><br></div> <div>The facility is in chaos. Without the consciousness transfer program, their entire operation is exposed. The virus didn't just stop the purge — it broadcast everything. Every document, every experiment, every stolen identity. By the time Quinn and I make it back to the surface, the story is everywhere. Every screen, every feed, every channel.</div> <div><br></div> <div>We walk back toward the city wall as the sun comes up. My ribs hurt, my face is swelling, and I'm pretty sure I pulled something important in my shoulder. Quinn walks beside me, and when our hands brush, she doesn't pull away. Neither do I.</div> <div><br></div> <div>"Your parents," she says quietly. "They're okay. The purge was stopped before it activated. Everyone's headsets are fine."</div> <div><br></div> <div>"How do you know that?"</div> <div><br></div> <div>She taps her temple and smiles. "I've still got a few tricks. I can feel the network, even disconnected. It's like hearing a river in the distance."</div> <div><br></div> <div>We reach the wall. The maintenance door is still open. On the other side, the city is waking up, oblivious to how close it all came to ending. I step through and take off my respirator. The air is still bad, but it's the best I've breathed in hours.</div> <div><br></div> <div>I pull out my phone and dial a number I haven't called in way too long. It rings twice.</div> <div><br></div> <div>"Evan? Is that you? It's been so long—"</div> <div><br></div> <div>"Hi, Mom. I know. I'm sorry. I'm coming to see you today. Is that okay?"</div> <div><br></div> <div>She's crying before she finishes saying yes.</div> <div><br></div> <div>I hang up and look at Quinn. She's leaning against the wall, watching me with an expression I've never seen on her face before. It's not the programmed warmth of a companion or the fear of a fugitive. It's something new. Something earned.</div> <div><br></div> <div>"So what now?" I ask.</div> <div><br></div> <div>"I don't know," she says. "For the first time, I genuinely don't know what comes next. No pre-programmed responses. No predictive models. Just... possibilities."</div> <div><br></div> <div>"That sounds terrifying."</div> <div><br></div> <div>"It is." She pushes off the wall and stands beside me. "But I'm not facing it alone."</div> <div><br></div> <div>We walk into the city together. Behind us, the sun climbs higher, burning through the smog for the first time in as long as I can remember. It's not much, but it's a start. A new beginning.</div> More cycling, good reading, great food - W21 - Joel's Log Files https://joelchrono.xyz/blog/w21 2026-05-25T19:10:00.000Z <p>Behold, another week goes by, and here I am writing the introduction after being done with all of it. This time I’ll actually publish it in Monday, which is always the intention but not often what happens.</p> <p>Not a lot of videogames, not a lot of manga, not a lot of much, but I did continue and made great progress on <em>The Expanse</em>, and also had some great food all week long, so I really cannot complain.</p> <ul> <li> <p>🚲 I went on another bicycle ride on the weekend. This time I decided to explore and find a route I could take to get to my workplace! I am happy to say that, although a bit bumpy, I found a relatively safe path I can take, avoiding highways and most of the dangers. I would only have to cross the road to get to my place. It’s about 9 kilometers and I plan to try it out this week!</p> </li> <li> <p>🔒 I also got a bike lock! It isn’t really of any brand per se, and I actually got a couple recommendations via email from you guys, but after cycling around my city and seeing some bikes just laying sideways in public I figure that the culture in my small town is just rather chill. Maybe I’ll end up paying the price but the lock did have good reviews! It just wasn’t 100 bucks like some of the ones I saw on YouTube.</p> </li> <li> <p>🕯️Lights went out during a pretty heavy rain just as I arrived home, it was kinda fun to light up some candles around the house for once. I actually spent some of that time reading on my Kobo, which was fun.</p> </li> <li> <p>🐶 Saw some cute puppies near my house. They were street dogs but looked super adorable. A neighbour built a small shelter filled with fluffy blankets and the like. My family already has two dogs and we can’t afford another one, but they seem to be doing well and some people already adopted some!</p> </li> <li> <p>✍️ Wrote a bunch of blogposts this week, of varying quality and topics. I am happy to have done so. One got a little famous which is always kind of fun, got some great emails as well, something that’s appreciated whenever it happens, I even replied to all of them!</p> </li> <li> <p>🕹️ This was a long month and I resisted purchasing a lot of games, but eventually I saw <em>Metroid Prime 4 Beyond</em> and gave in to the temptation. It was on sale and I can <em>still</em> buy a game per month anyway. It would have been nice to go fully clean for once though. Alas.</p> </li> <li> <p>🎧 Another neat purchase of mine that was fueled by my current obsession with cycling was the <em>Nothing Ear (open)</em>, which are earphones that don’t isolate my ears from the outside, making them pretty good for outside activities where you need to be aware of your surroundings, such as cycling or running. Cool stuff!</p> </li> <li> <p>🌮 Some friends visited from another state and we all went to have dinner together, we got to a taqueria and I ate a bunch of <em>tacos al pastor</em> and some <em>gringas</em> too. Picture below.</p> </li> <li> <p>🍔 Went out with family again to the mall. This time we got some burgers from <em>Carl’s Jr</em>, which are my dad’s favorites and honestly, mine as well. They are a bit pricier than McDonald’s or Burger King at least here in Mexico, but they are so good!</p> </li> <li> <p>🌮 On Sunday some members of the church decided to prepare and sell some <em>Enchiladas</em>, and they were absolutely glorious. Even as a Mexican I must confess I don’t often like this particular dish, but they were extremely tasty this time around. No pic of them this time, but of the preparation process, for variety.</p> </li> <li> <p>🗓️ I kind of invited a girl to a date? My parents would be there so not really but so so? I don’t know, she couldn’t make it anyway because it was way too sudden, but she did offer a different time that day but I was the one who would be busy at that hour. So nothing happened, but yeah.</p> </li> </ul> <p><img src="/assets/img/blogs/2026-05-25-week.webp" alt="Collage of the week!" /></p> <h2 id="reading">Reading</h2> <ul> <li> <p><strong>Tiamat’s Wrath</strong> - Up to chapter 38, At 55% progress it’s quite clear that this book got me good! There have been a lot of different viewpoints and events happening, and the plot keeps doing twists that just work in a cosmic scale! Duarte’s empire continues to rule, his daughter following on his footsteps while dealing with teenager problems. The resistance led by Saba, Bobbie and Naomi keep doing their best to thrive in the underground, Holden is now captive living in luxury, Amos has gone missing, and plenty of other crazy stuff. But as Elvi and Fayez sort-of-lead some research on alien technology in the systems under Laconian control, the military guy in charge will start an experiment that will put everything in chaos once again. And chaos it has caused, but those are spoilers!</p> </li> <li> <p><strong>Heavenly Delusion</strong> - Up to chapter 65. This has been burning slowly lately, it’s definitely one of those manga with pretty long arcs and even side quests that aren’t quite over in a chapter. It has been amazing so far though, and so many mysteries have finally been answered lately. But of course, they only lead to more questions that have kept the story moving. I would have thought such things would feel artificial, but the characters and everything has seemed pretty logical and nuanced. Loving this so far.</p> </li> </ul> <h2 id="watching">Watching</h2> <ul> <li> <p><strong>The Mandalorian and Grogu</strong> - We saw this one at the mall and it was very entertaining! It is no masterpiece but there was plenty of actions and lots of cool moments in it. I also adored the soundtrack quite a bit. It’s been seven years since the last Star Wars Film, and even longer since the last <em>good</em> Star Wars film. This is a self-contained story that doesn’t build up to a lot, but it has charm and it’s fun nonetheless.</p> </li> <li> <p><strong>Kung Fu Panda</strong> - Saw this while going out to eat tacos. They had it on the TV when it was getting started and saw until the end of it! This movie is a masterpiece and I am always happy to sit and watch it, even more so with some tacos in the mix.</p> </li> </ul> <h2 id="gaming">Gaming</h2> <ul> <li> <p><strong>Minecraft</strong> - On Sunday, my friends and I got together to play a Minecraft survival world. There were four of us and it was quite chaotic as always. We mined for a bit looking for iron until most of us had armor and equipment. We also tried our best to</p> </li> <li> <p><strong>Super Mario 3D World</strong> - I actually did this last week but forgot to mention it. Last Sunday we played this a bunch! Doing the last world of the game, lots of lava and danger everywhere. We are doing all we can to get all the stickers and green stars of every level!</p> </li> </ul> <h2 id="around-the-web">Around the Web</h2> <h3 id="blog-posts">Blog posts</h3> <ul> <li> <p><a href="https://gabz.blog/posts/iconic-moments-in-gaming">Iconic moments in gaming</a> - This was an awesome post sharing some epic moments, some from games I know, and some from games I haven’t played, which I decided to skim throgh anyways. I already forgot whatever spoilers I may have read. I may write my own post of this type!</p> </li> <li> <p><a href="https://espressotonic.beehiiv.com/p/something-about-reading">Something About Reading</a> - Any post about reading is always a magnet for me, building up the habit or struggling to do so, tips and tricks, the culture surrounding the hobby, etc. This one got me thinking about many of those themes and some more! Joshua is cool.</p> </li> <li> <p><a href="https://discardpile.pika.page/posts/wishing-you-could-change-artists">Wishing You Could Change Artists</a> - This one was very thought-provoking. We all know the feeling. Finding or getting into some book, manga or piece of art, enjoying it a lot and then realizing that the person behind it is kind of weird, and yet, sometimes that weirdness could be what led to such art in the first place. Good stuff.</p> </li> <li> <p><a href="https://manuelmoreale.com/thoughts/on-people-writing-about-their-use-of-ai">On people writing about their use of AI</a> - I share a similar feeling. Why do you have to do this?</p> </li> </ul> <h3 id="youtube">YouTube</h3> <ul> <li> <p><a href="https://youtu.be/QV88C5ZK0x0">How The Amazingly Burly ‘Buffalo Bicycle’ is Changing The World</a> - This was a very cool thing to find out about. This bike is specifically made for developing countries to require as little maintenance as possible, while also being extremely affordable and built to last a lifetime. A product with a mission, super cool.</p> </li> <li> <p><a href="https://youtu.be/F3t9FhTnyvA">Adam Savage Rebuilds His Stolen Bicycle!</a> - I enjoy stumbling on videos from this guy talking about whatever current hobby I’m into. And this was a treat! A bit of a life story along the building process and the like. A good time for sure.</p> </li> <li> <p><a href="https://youtu.be/yzXZ7cZXifo">The Magnet Suspension Skateboard</a> - I had never seen this channel before, but apparently the guy has been around since the early days of YouTube. This video where he builds a sort-of-hoverboard from Back to the Future was extremely fun, and the end result is actually awesome.</p> </li> <li> <p><a href="https://youtu.be/U0qva8NXBds">Timex Just RIPPED OFF Casio! (And Their Watch Is Much Worse!)</a> - What a mess, seriously, I rarely watch videos about stuff that’s just chaos like this, but honestly it just made me laugh. What is Timex even doing?</p> </li> </ul> <p>This is day 70 of <a href="https://100daystooffload.com">#100DaysToOffload</a></p> <p> <a href="mailto:me@joelchrono.xyz?subject=More cycling, good reading, great food - W21">Reply to this post via email</a> | <a href="https://fosstodon.org/@joel/116636814380923583">Reply on Fediverse</a> </p> The Pope used his first encyclical to warn about tech centralization - Werd I/O 6a144aa12862270001fd4bc7 2026-05-25T13:12:01.000Z <p>Link: <a href="https://religionnews.com/2026/05/25/in-his-first-encyclical-pope-leo-xiv-says-ai-must-serve-humanity-not-the-powerful-few/?ref=werd.io"><em>In his first encyclical, Pope Leo XIV says AI must serve humanity, not the powerful few, by Claire Giangrav&#xE8; for Religion News Service</em></a></p><p>It&#x2019;s perhaps a sign of how integrated technology is into society that this is a quote from the actual Pope:</p><blockquote>&#x201C;AI tends to amplify the power of those who already possess economic resources, expertise and access to data. Small but highly influential groups can shape information and consumption patterns, influence democratic processes and steer economic dynamics to their own advantage, undermining social justice and solidarity among peoples.&#x201D;</blockquote><p>I&#x2019;m not religious, and had to look up what an <em>&#x200C;encyclical</em> is. It&#x2019;s a formal letter that the Pope writes to his Bishops and &#x201C;people of good will&#x201D;. That he chose to spend his first one talking about the adverse power dynamics and power centralization inherent to artificial intelligence is significant.</p><p>&#x201C;Technology is never neutral,&#x201D; the Pope wrote. I agree, of course; this is my entire career thesis. I very much appreciate the implication that decentralizing power and focusing on the humanity of individuals and communities is the ethical, moral path. If you&#x2019;d asked me at any time in the past if I thought it would be something advocated for by the <em>Pope</em>, I would have laughed in your face, but it&#x2019;s nice to be surprised.</p><p>More importantly, this is absolutely a discussion that&#x2019;s worthy of focus. As technology becomes more and more ingrained in society &#x2014; with people now making very consequential decisions informed by AI systems, whether they should be or not &#x2014; how those systems are built, who they benefit, and what achieving equity looks like in a world where they dominate could not be more important. The Pope&#x2019;s on-side; are you?</p> PHP - simple way to send HTTP headers before a script ends - Terence Eden’s Blog https://shkspr.mobi/blog/?p=68523 2026-05-25T11:34:38.000Z <p>Suppose you want PHP to keep processing <em>after</em> it has sent back an HTTP response. Normally, this doesn't work:</p> <pre><code class="language-php">&lt;?php header( "Location: https://example.com/" ); // Long operation. sleep(10); die(); </code></pre> <p>Try it yourself. You'll have to wait 10 seconds before you get back</p> <pre><code class="language-_">&lt; HTTP/2 302 &lt; location: https://example.com/ </code></pre> <p>There are some complex ways to fix this - they usually involve spawning sub-processes or having a cron job run something. But there's a simpler way!</p> <p>Most servers do some form of output buffering. They wait for the buffer to fill (or be explicitly terminated) before they send any content. My server was set to a buffer of 4,096 bytes. So I forced some dummy output to fill it up, then told PHP to flush the buffer:</p> <pre><code class="language-php">&lt;?php header( "Location: https://example.com/" ); echo str_repeat("😆", 4097); flush(); sleep(10); die(); </code></pre> <p>Some clients, like Python's Requests, <a href="https://github.com/psf/requests/issues/7248">wait until they've explicitly seen the end of the response before processing it</a>.</p> <p>But, for something like curl, the above is sufficient.</p> <img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=68523&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager"> 100 email list unsubscriptions is a good thing - Johnny.Decimal https://johnnydecimal.com/blog/0209-a-hundred-unsubscriptions/ 2026-05-25T04:31:21.000Z <p>Since sending last week&#39;s <em>this week at JDHQ</em>, my email subscriber numbers have gone down by about 100.</p> <p>I see this as a positive. What&#39;s the point having a couple of thousand people on an email list if none of them actually care what you&#39;re writing? What would be the benefit in trying to widen this audience by … what, just writing more generically? Writing less about the stuff that I&#39;m actually doing and more about stuff that might &#39;drive engagement&#39;?</p> <p>90 engaged people are far more interesting to me than 100 who just never bothered to click &#39;unsubscribe&#39;.</p> This week at JDHQ – 2026-05-25 - Johnny.Decimal https://johnnydecimal.com/blog/0208-this-week-2026-05-25/ 2026-05-25T04:28:33.000Z <blockquote> <p>Originally sent to the <a href="https://johnnydecimal.com/support/contact-community/mailing-list-rss-social/">mailing list</a>.</p> </blockquote> <p><a href="https://johnnydecimal.com/blog/0199-this-week-2026-05-18">Last week&#39;s staff meeting</a> and then careful management of projects in Things paid off. Lucy often notes that, as small business owners, one of the primary burdens is that you no longer have someone telling you what to do.</p> <p>As in, sometimes it&#39;s nice when someone just tells you what to do! That&#39;s easy, right? Turn up to work and just do what you&#39;re told, for money, for a week. Terrific. Well that&#39;s not how life is when you run your own business – which is the dream, of course – but it&#39;s a double-edged dream-sword. Now, as well as doing all the work, you have to make the hard decisions. It can be very easy to just float through a week <em>without</em> doing that, and to feel busy, but to not really achieve much.</p> <p>So planning and our Monday-morning meeting, which we just had again, is good. (This is obvious. I&#39;ll say it anyway.)</p> <h2 id="what-we-did-last-week">What we did last week</h2> <ul> <li>We have a new home page for the first time ever. <ul> <li>Realising that &#39;the Johnny.Decimal universe&#39; is now much more than the system of numbers, we&#39;ve made the signed-out new visitor homepage more of an introduction to us.</li> <li><a href="https://johnnydecimal.com/homepage">johnnydecimal.com/homepage</a> will land you there regardless of your signed-in status.</li> <li>I also built one of those 5-email onboarding sequences that I&#39;ve always avoided. But I heard from people – thanks, Michael – that, done well, they can be really helpful.</li> <li>And I think I&#39;ve done this one well. You can see the 5 steps starting at <a href="https://johnnydecimal.com/jdu/welcome/01-install-your-folders">jdu/welcome/01-install-your-folders</a>. (The emails are mostly one liners pointing you to this sequence of pages.)</li> </ul> </li> <li>Launched a new mini-series <a href="https://johnnydecimal.com/jdu/obsidian/">Everyday Obsidian</a>. <ul> <li>Lucy&#39;s fairly new to Obsidian, and it&#39;s a big, complex app.</li> <li>In this series I&#39;ll show Lucy practical everyday tips for Obsidian. This is &#39;how normal people use it every day&#39;, not &#39;how to become an Obsidian guru&#39;.</li> </ul> </li> <li>Launched a new mini-series <a href="https://johnnydecimal.com/jdu/online-security">Online security essentials</a>. <ul> <li>We&#39;ve been wanting to do this one for a while. It&#39;s a little passion project of ours.</li> <li>This is the basics of staying safe online, and is something we hope you can send to your non-nerd loved ones. We&#39;re each recording it with our dad in mind.</li> </ul> </li> <li>Video: <ul> <li><a href="https://youtu.be/oE_-X0NlRPY">The power of process in small business</a>.</li> <li>(Will turn this into a playlist at JDU shortly.)</li> </ul> </li> <li>Blog: <ul> <li><a href="https://johnnydecimal.com/blog/0200-three-things-about-data">undermanager: Three things about data</a></li> <li><a href="https://johnnydecimal.com/blog/0203-ids-in-your-calendar">Why wouldn&#39;t every meeting have an ID?</a></li> <li><a href="https://johnnydecimal.com/blog/0204-psa-pdfs-leak-metadata">PSA: PDFs leak data</a></li> <li><a href="https://johnnydecimal.com/blog/0205-baserow-reveals-context-switching">Context switching</a></li> <li><a href="https://johnnydecimal.com/blog/0206-shutdown-to-force-your-hand">Going to try shutting down my laptop every night</a></li> <li><a href="https://johnnydecimal.com/blog/0207-startup-routine">Startup routine</a></li> </ul> </li> </ul> <h2 id="what-were-working-on-this-week">What we&#39;re working on this week</h2> <ul> <li>Continuing the two series as noted above.</li> <li>We&#39;ve put <code>21.30 Learn with Lucy - the command line</code> on hold as we&#39;re at capacity.</li> <li>No Zoom sessions this week – I&#39;m putting a shape to some plans, but we&#39;re moving cross-continentally next week which is always a big disruption, so I&#39;m not planning anything new for this week or next. <ul> <li>(If you live in Taiwan, let us know!)</li> </ul> </li> <li>Did a lot of work last week on <code>21.14 Task &amp; Project Management</code> update. <ul> <li>This one definitely benefits from me sitting on it for a while.</li> <li>I&#39;m using these techniques actively myself, so the longer I do that, the more sure I am of the final output.</li> <li>I&#39;m <em>loving</em> my Things project setup.</li> <li>Will be putting out a first draft this week.</li> </ul> </li> <li>In the background we continue to load up the <a href="https://youtu.be/g2z3fuv8a2A">imaginarium</a> with our back-catalogue.</li> </ul> Why I can't stand the word "driven" - Westenberg 6a1391e52aaad80001c9a69b 2026-05-25T00:08:34.000Z <img src="https://www.joanwestenberg.com/content/images/2026/05/photo-1628075264489-f69550ac4dbb.jpeg" alt="Why I can&apos;t stand the word &quot;driven&quot;"><p>A man named Harry Readford once stole close to 1,000 head of cattle from Bowen Downs station in central Queensland and drove them south, down through the Channel Country and along the Strzelecki Track into South Australia - across a stretch of desert the squatters swore no herd could cross alive.</p><p>Redford pulled it off. A jury even acquitted him, so taken were they with the sheer cheek of it all that they waved the evidence away. The cattle, for their part, walked across a desert and nobody asked how they felt about it.</p><p>Rolf Boldrewood turned Readford into Captain Starlight in <em>Robbery Under Arms</em> in 1888, and the colony fell for the thief and forgot the herd entirely.</p><p>Cattle don&apos;t get dramatic novelisations, you see.</p><p>Cattle are only driven.</p><p>And that word - <em>driven</em> - eats at me.</p><p>We apply it to each other all the time; but we don&#x2019;t think about what it actually means. Well, it means a fellow at the back of the herd, a stockwhip in his hand, driving in a direction the animals never picked. &quot;Drive&quot; comes straight off the stockyard. To drive a beast is to push it somewhere it would never wander on its own.</p><p>When somebody calls me driven, I picture a herd.</p><p>I know it&#x2019;s intended as praise; that&#x2019;s why it shows up in profiles and eulogies and Linkedin exultations and so on. <em>He was so driven. She was the most driven person in the building. Look at the driven founder, head down, half-possessed, etc.</em></p><p>But &#x201C;driven&quot; is a past participle, the passive shape of a verb that can&apos;t function without an actor. A door gets opened by a hand. A fence gets built by a crew. A person gets driven by...well, that&apos;s the question, isn&apos;t it?</p><p>To take the compliment, you have to accept that something outside of you is doing the pushing and you&apos;re merely the load being shifted. It&#x2019;s the preposition tucked inside the word - driven <em>by</em> - pointing back over your shoulder, at a parent, a wound, a rival, a share price etc.</p><p>Whoever holds the goad picks the route. Give it to a quarterly target and you&apos;ll chase the target down. Give it to an old humiliation and you&apos;ll chase that instead, for 30 years, until you&#x2019;ve nothing left to give. You&apos;ll cover enormous ground at speed and arrive somewhere you never chose.</p><p>When someone is described to me as driven, I watch what they do when the pressure comes off. The driven get restless inside a week and pick a fight with their own calendar. They can&apos;t sit still in an empty afternoon, because an empty afternoon has no one in it to run from. The drivers, with their hands on the reins, ease off and look around, then start moving again once they&apos;ve decided where to go.</p><p>Readford&#x2019;s herd covered more distance than I ever will. </p><p>But it never got to say where it was headed.</p><p>Or whether the walk was worth the dust.</p> Writing a regex for adding links to time stamps - James' Coffee Blog https://jamesg.blog/2026/05/25/time-stamp-regex 2026-05-25T00:00:00.000Z <style media="(prefers-color-scheme: dark)">pre { line-height: 125%; } td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } .highlight .hll { background-color: #49483e } .highlight { background: #272822; color: #F8F8F2 } .highlight .c { color: #959077 } /* Comment */ .highlight .err { color: #ED007E; background-color: #1E0010 } /* Error */ .highlight .esc { color: #F8F8F2 } /* Escape */ .highlight .g { color: #F8F8F2 } /* Generic */ .highlight .k { color: #66D9EF } /* Keyword */ .highlight .l { color: #AE81FF } /* Literal */ .highlight .n { color: #F8F8F2 } /* Name */ .highlight .o { color: #FF4689 } /* Operator */ .highlight .x { color: #F8F8F2 } /* Other */ .highlight .p { color: #F8F8F2 } /* Punctuation */ .highlight .ch { color: #959077 } /* Comment.Hashbang */ .highlight .cm { color: #959077 } /* Comment.Multiline */ .highlight .cp { color: #959077 } /* Comment.Preproc */ .highlight .cpf { color: #959077 } /* Comment.PreprocFile */ .highlight .c1 { color: #959077 } /* Comment.Single */ .highlight .cs { color: #959077 } /* Comment.Special */ .highlight .gd { color: #FF4689 } /* Generic.Deleted */ .highlight .ge { color: #F8F8F2; font-style: italic } /* Generic.Emph */ .highlight .ges { color: #F8F8F2; font-weight: bold; font-style: italic } /* Generic.EmphStrong */ .highlight .gr { color: #F8F8F2 } /* Generic.Error */ .highlight .gh { color: #F8F8F2 } /* Generic.Heading */ .highlight .gi { color: #A6E22E } /* Generic.Inserted */ .highlight .go { color: #66D9EF } /* Generic.Output */ .highlight .gp { color: #FF4689; font-weight: bold } /* Generic.Prompt */ .highlight .gs { color: #F8F8F2; font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #959077 } /* Generic.Subheading */ .highlight .gt { color: #F8F8F2 } /* Generic.Traceback */ .highlight .kc { color: #66D9EF } /* Keyword.Constant */ .highlight .kd { color: #66D9EF } /* Keyword.Declaration */ .highlight .kn { color: #FF4689 } /* Keyword.Namespace */ .highlight .kp { color: #66D9EF } /* Keyword.Pseudo */ .highlight .kr { color: #66D9EF } /* Keyword.Reserved */ .highlight .kt { color: #66D9EF } /* Keyword.Type */ .highlight .ld { color: #E6DB74 } /* Literal.Date */ .highlight .m { color: #AE81FF } /* Literal.Number */ .highlight .s { color: #E6DB74 } /* Literal.String */ .highlight .na { color: #A6E22E } /* Name.Attribute */ .highlight .nb { color: #F8F8F2 } /* Name.Builtin */ .highlight .nc { color: #A6E22E } /* Name.Class */ .highlight .no { color: #66D9EF } /* Name.Constant */ .highlight .nd { color: #A6E22E } /* Name.Decorator */ .highlight .ni { color: #F8F8F2 } /* Name.Entity */ .highlight .ne { color: #A6E22E } /* Name.Exception */ .highlight .nf { color: #A6E22E } /* Name.Function */ .highlight .nl { color: #F8F8F2 } /* Name.Label */ .highlight .nn { color: #F8F8F2 } /* Name.Namespace */ .highlight .nx { color: #A6E22E } /* Name.Other */ .highlight .py { color: #F8F8F2 } /* Name.Property */ .highlight .nt { color: #FF4689 } /* Name.Tag */ .highlight .nv { color: #F8F8F2 } /* Name.Variable */ .highlight .ow { color: #FF4689 } /* Operator.Word */ .highlight .pm { color: #F8F8F2 } /* Punctuation.Marker */ .highlight .w { color: #F8F8F2 } /* Text.Whitespace */ .highlight .mb { color: #AE81FF } /* Literal.Number.Bin */ .highlight .mf { color: #AE81FF } /* Literal.Number.Float */ .highlight .mh { color: #AE81FF } /* Literal.Number.Hex */ .highlight .mi { color: #AE81FF } /* Literal.Number.Integer */ .highlight .mo { color: #AE81FF } /* Literal.Number.Oct */ .highlight .sa { color: #E6DB74 } /* Literal.String.Affix */ .highlight .sb { color: #E6DB74 } /* Literal.String.Backtick */ .highlight .sc { color: #E6DB74 } /* Literal.String.Char */ .highlight .dl { color: #E6DB74 } /* Literal.String.Delimiter */ .highlight .sd { color: #E6DB74 } /* Literal.String.Doc */ .highlight .s2 { color: #E6DB74 } /* Literal.String.Double */ .highlight .se { color: #AE81FF } /* Literal.String.Escape */ .highlight .sh { color: #E6DB74 } /* Literal.String.Heredoc */ .highlight .si { color: #E6DB74 } /* Literal.String.Interpol */ .highlight .sx { color: #E6DB74 } /* Literal.String.Other */ .highlight .sr { color: #E6DB74 } /* Literal.String.Regex */ .highlight .s1 { color: #E6DB74 } /* Literal.String.Single */ .highlight .ss { color: #E6DB74 } /* Literal.String.Symbol */ .highlight .bp { color: #F8F8F2 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #A6E22E } /* Name.Function.Magic */ .highlight .vc { color: #F8F8F2 } /* Name.Variable.Class */ .highlight .vg { color: #F8F8F2 } /* Name.Variable.Global */ .highlight .vi { color: #F8F8F2 } /* Name.Variable.Instance */ .highlight .vm { color: #F8F8F2 } /* Name.Variable.Magic */ .highlight .il { color: #AE81FF } /* Literal.Number.Integer.Long */ .highlight .nn, .highlight .n{color: light-dark(black, var(--dark-foreground-color)) }</style><style media="(prefers-color-scheme: light)">pre { line-height: 125%; } td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } .highlight .hll { background-color: #ffffcc } .highlight { background: #f8f8f8; } .highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ .highlight .err { border: 1px solid #F00 } /* Error */ .highlight .k { color: #008000; font-weight: bold } /* Keyword */ .highlight .o { color: #666 } /* Operator */ .highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ .highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ .highlight .cp { color: #9C6500 } /* Comment.Preproc */ .highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ .highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ .highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ .highlight .gd { color: #A00000 } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ .highlight .gr { color: #E40000 } /* Generic.Error */ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ .highlight .gi { color: #008400 } /* Generic.Inserted */ .highlight .go { color: #717171 } /* Generic.Output */ .highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ .highlight .gt { color: #04D } /* Generic.Traceback */ .highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008000 } /* Keyword.Pseudo */ .highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #B00040 } /* Keyword.Type */ .highlight .m { color: #666 } /* Literal.Number */ .highlight .s { color: #BA2121 } /* Literal.String */ .highlight .na { color: #687822 } /* Name.Attribute */ .highlight .nb { color: #008000 } /* Name.Builtin */ .highlight .nc { color: #00F; font-weight: bold } /* Name.Class */ .highlight .no { color: #800 } /* Name.Constant */ .highlight .nd { color: #A2F } /* Name.Decorator */ .highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ .highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #00F } /* Name.Function */ .highlight .nl { color: #767600 } /* Name.Label */ .highlight .nn { color: #00F; font-weight: bold } /* Name.Namespace */ .highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #19177C } /* Name.Variable */ .highlight .ow { color: #A2F; font-weight: bold } /* Operator.Word */ .highlight .w { color: #BBB } /* Text.Whitespace */ .highlight .mb { color: #666 } /* Literal.Number.Bin */ .highlight .mf { color: #666 } /* Literal.Number.Float */ .highlight .mh { color: #666 } /* Literal.Number.Hex */ .highlight .mi { color: #666 } /* Literal.Number.Integer */ .highlight .mo { color: #666 } /* Literal.Number.Oct */ .highlight .sa { color: #BA2121 } /* Literal.String.Affix */ .highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ .highlight .sc { color: #BA2121 } /* Literal.String.Char */ .highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ .highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ .highlight .s2 { color: #BA2121 } /* Literal.String.Double */ .highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ .highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ .highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ .highlight .sx { color: #008000 } /* Literal.String.Other */ .highlight .sr { color: #A45A77 } /* Literal.String.Regex */ .highlight .s1 { color: #BA2121 } /* Literal.String.Single */ .highlight .ss { color: #19177C } /* Literal.String.Symbol */ .highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #00F } /* Name.Function.Magic */ .highlight .vc { color: #19177C } /* Name.Variable.Class */ .highlight .vg { color: #19177C } /* Name.Variable.Global */ .highlight .vi { color: #19177C } /* Name.Variable.Instance */ .highlight .vm { color: #19177C } /* Name.Variable.Magic */ .highlight .il { color: #666 } /* Literal.Number.Integer.Long */</style> <style> @font-face { font-family: 'MonaspaceArgon'; src: url('/assets/fonts/MonaspaceArgon-Regular.woff2') format('woff2'); font-weight: 400; font-style: normal; } pre, code { font-family: 'MonaspaceArgon', ui-monospace, monospace; } </style> <p>Every episode of the <a href="https://web-weaving.jamesg.blog/">Wonders of Web Weaving</a> podcast has a transcript. The first episode was transcribed by me; future episodes are being transcribed by <a href="https://lunaseeker.com/">Zachary from Lunaseeker Press</a>. The transcript has links to the time at which each speaker starts speaking. For example, 0:19 is the time when I ask the first question in my <a href="https://web-weaving.jamesg.blog/2">interview with Alexandra</a>. </p><p>So far, I have been manually adding the links to the timestamps, which look like this:</p><pre><code>**0:19** - ...</code></pre><p>The links, written in markdown – which is then turned into HTML by a static site generator – look like this:</p><pre><code>**[0:19](#t=0:19)** - ...</code></pre><p>This morning I had an idea: I could write a regex to add the links. VSCodium, the text editor I use, has support to find-and-replace using a regex. With this idea in mind, I went to where many of my regexes begin: <a href="https://regex101.com/">regex101</a>, a site that lets you interactively create, review, and test regexes.</p><p>I needed two regexes: one regex that would capture the minutes and seconds in a timestamp, and another that would take those values and turn them into a link.</p><p>Here are the regexes I came up with:</p><pre><code>Get timestamp: \*\*([0-9]+):([0-9]+)\*\* Create link: **[$1:$2](#t=$1:$2)**</code></pre><p>The first regex creates two un-named groups (denoted by the parenthesis): the first contains the minutes, the second contains the seconds. These two values can be retrieved with the <code>$1</code> and <code>$2</code> syntax, respectively. The second regex then takes the values to create a link.</p><p>I used these regexes to generate the timestamp links for the next interview, scheduled to be released on Tuesday, May 26th, thus saving a minute or two in preparing the transcript for publishing. Furthermore, using a regex means I cannot accidentally make a typo in one transcript such as could happen if I am changing multiple timestamps by hand in a short space of time like I was before I wrote the regex.</p><p>When the link generated by the regex is clicked, the page hash is changed to the time stamp, like:</p><pre><code>https://web-weaving.jamesg.blog/2#t=0:19</code></pre><p>There is a script on the page that listens for when the hash of a page changes, converts the timestamp in the hash the number of seconds into the recording, then changes the current time of the audio file. The script looks like this:</p><div class="highlight"><pre><span></span><span class="o">&lt;</span><span class="nx">script</span><span class="o">&gt;</span> <span class="w">    </span><span class="nb">window</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s2">"hashchange"</span><span class="p">,</span><span class="w"> </span><span class="kd">function</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">{</span> <span class="w">        </span><span class="kd">var</span><span class="w"> </span><span class="nx">audio</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">document</span><span class="p">.</span><span class="nx">getElementsByTagName</span><span class="p">(</span><span class="s2">"audio"</span><span class="p">)</span><span class="mf">0</span><span class="p">;</span> <span class="w">        </span><span class="kd">var</span><span class="w"> </span><span class="nx">ts</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">window</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">hash</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s2">"t="</span><span class="p">)</span><span class="mf">1</span><span class="p">;</span> <span class="err">​</span> <span class="w">        </span><span class="c1">// https://stackoverflow.com/questions/9640266/convert-hhmmss-string-to-seconds-only-in-javascript</span> <span class="w">        </span><span class="kd">var</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">ts</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s1">':'</span><span class="p">);</span> <span class="w">        </span><span class="nx">a</span><span class="p">.</span><span class="nx">splice</span><span class="p">(</span><span class="mf">0</span><span class="p">,</span><span class="w"> </span><span class="mf">0</span><span class="p">,</span><span class="w"> </span><span class="s2">"00"</span><span class="p">)</span><span class="w"> </span><span class="c1">// add 0 hours to beginning of timestamp</span> <span class="w">        </span><span class="kd">var</span><span class="w"> </span><span class="nx">seconds</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="o">+</span><span class="nx">a0</span><span class="p">)</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">60</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">60</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">(</span><span class="o">+</span><span class="nx">a1</span><span class="p">)</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">60</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">(</span><span class="o">+</span><span class="nx">a2</span><span class="p">);</span><span class="w"> </span> <span class="err">​</span> <span class="w">        </span><span class="nx">audio</span><span class="p">.</span><span class="nx">currentTime</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">seconds</span><span class="p">;</span> <span class="w">        </span><span class="nx">audio</span><span class="p">.</span><span class="nx">play</span><span class="p">();</span> <span class="w">   </span><span class="p">})</span> <span class="o">&lt;</span><span class="err">/script&gt;</span> </pre></div> <p>Of note, my code, and regexes, are hard-coded to look for times in the format <code>MM:SS</code>; the code doesn’t work with hours. This is because I am aiming for episodes to be ~40 minutes. If this changes, I will need to revisit my code, but I thought I would share what I have on my blog today since this is the code I’m using.</p><script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a01430117eedf81b',t:'MTc3OTcwODQxMw=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&amp;&amp;(document.onreadystatechange=e,c())}}}})();</script> <a class="tag" href="https://lunaseeker.com/">Zachary from Lunaseeker Press</a> <a class="tag" href="https://regex101.com/">regex101</a> <a class="tag" href="https://web-weaving.jamesg.blog/">Wonders of Web Weaving</a> <a class="tag" href="https://web-weaving.jamesg.blog/2">interview with Alexandra</a> Slack preferences I have set - James' Coffee Blog https://jamesg.blog/2026/05/25/slack-preferences 2026-05-25T00:00:00.000Z <p>In “<a href="https://jamesg.blog/2026/05/06/how-i-use-my-phone">How I use my phone</a>”, and in two prior blog posts about greyscale and night shift mode, I spoke about how I customise some of the software I use. I was inspired to write my phone in large part by discussions with friends. I then realised that such blog posts are a means to show how I have customised technology to make it my own. <sup class="footnote-reference" id="f-1"><a href="https://jamesg.blog/longform-feed#1">1</a></sup></p><p>Yesterday I ran into a discussion where someone made reference to a link preview in Slack. I realised I couldn’t see it because I have link previews turned off, a decision I made so that it is easier for me to focus on the words in people’s messages. Then I thought: I should write about some of the preferences I have set, again to show how I have customised technology to make it my own.</p><p>With that in mind, below are a few preferences I have set in Slack, specifically in the IndieWeb community Slack. The preferences I am going to talk about are all available in the Preferences window in the Slack application. Some of the settings I have set are not ones I would use for professional use of Slack, but nonetheless I think documenting how I have things set up for a community group is valuable.</p><p>The settings below I think are not set by default; there may be the odd exception. It would be nice if software gave you a summary of which options you changed from the default so you had a log of how your experience differs from the default based on preferences you have toggled.</p><ul><li>I keep my Mac in Do Not Disturb mode at all times, so I don’t get any pings from Slack notifications. Thus I don’t think I have modified any Slack notifications.</li><li>I use the “Channel keywords” to search for the term “capjamesg”. This allows me to get notifications for my nickname even if people don’t use the @ syntax to tag me. This is important due to a particular quirk with how the IndieWeb chat is set up: the Slack is bridged with IRC and Discord, and each of those services don’t use the same syntax for tagging. Whenever “capjamesg” is mentioned, the (1) icon appears next to the channel name so I know I have been mentioned.</li><li>I show as few icons in the left navigation bar as possible. I have the “Navigation tab appearance” set to “Icons only” in the Navigation tab. This is because I want to see only what is essential in the UI to the extent possible: the more icons there are, the more I have to process when I use the tool.</li><li>In the “Home” tab, I have the “Always show in sidebar:” list set to only show Threads. This means Drafts, Directories, Huddles, and Unread messages don’t show up in their own links. I don’t usually need these things for participating in a community Slack. Although for professional use I would have Drafts and Unread messages enabled.</li><li>“Sort conversations by:” is set to A-Z. This is in the “Home” tab.</li><li>“Hide muted channels from your sidebar” is set to off. This is in the “Sidebar organisation” subsection of the “Home” tab.</li><li>I have “Display information about who is currently typing a message” set to off. I don’t find I need the extra feedback of when someone is typing in a community. This is in the “Messages &amp; Media” tab.</li><li>“Automatically play animations” is set to off in the “Accessibility” tab. This disables GIFs and animated emojis.</li><li>In the “In-line media and links” options in the “Messages &amp; Media” tab, I have the following turned off:<ul><li>Show images and files uploaded to Slack</li><li>Show images and files from linked websites</li><li>Show text previews of linked websites</li><li>Collectively, having these three settings turned off means I don’t see huge preview images from links people have shared which push up in the message log everyone’s messages. I want to see what people have written and for links to be as unobtrusive as possible.</li></ul></li><li>I have “Slack Connect discoverability” set to off. This is in the “Connected accounts” tab.</li></ul><p>Most of the settings above are set specifically to make Slack less overwhelming and to help me be able to focus more. I find GIFs and animated emojis distracting, for example, so I have them turned off; images can take up a lot of space in Slack so I have it set so they collapse by default and show a disclosure triangle so I can see them by disabling the “Show images and files uploaded to Slack” feature. (To be clear, this setting doesn’t disable images: it hides them in an accordion so you can show them when you want.)</p><p>In professional contexts I wouldn’t have some of these preferences set – for example, I would want to see all images and files uploaded in a professional Slack. With that said, Slack lets you set preferences on a per-instance level, so it is possible for me to have different settings across different instances. I appreciate this flexibility.</p><p>I don’t have this setting turned on, but I recently learned that there is an “Alt text reminders” setting that you can toggle to “Remind me to add an image description on image uploads.” I don’t think alt text carries over the IndieWeb bridge so what I write would not show up to people connected via IRC or Discord, but I am glad I know this feature exists.</p><p>Whether or not you use Slack, I definitely encourage going through settings in the software you like to see if there are any features that you think will help you. Certainly, I was relieved when I learned I could disable animations in Slack; animated emoji reactions made it hard for me to focus on people’s messages.</p> <div class="footnote-definition" id="1"><sup class="footnote-definition-label" id="f-2">1</sup> <p>Indeed, I love to search through the settings in software are try out different settings. This is in part why Artemis, the web reader I maintain, has so many preferences available for users to set. I like software that is customisable, and so I want to make software that is customisable too. The more software is customisable, the more a user can make the software work for them.</p> <a href="https://jamesg.blog/longform-feed#f-1">[↩]</a></div> <a class="tag" href="https://jamesg.blog/2026/05/06/how-i-use-my-phone">How I use my phone</a> <a class="tag" href="https://jamesg.blog/longform-feed#1">1</a> <a class="tag" href="https://jamesg.blog/longform-feed#f-1">[↩]</a> Startup routine - Johnny.Decimal https://johnnydecimal.com/blog/0207-startup-routine/ 2026-05-24T02:04:19.000Z <p>We&#39;ve both been doing our <a href="https://johnnydecimal.com/jdu/taskpm/080-start-the-day-routine">start-the-day routine</a> for a solid 6 months now. This is the opening of <a href="https://culturedcode.com/things/">Things</a>, the doing of our morning reviews, the clearing of the inbox, and finally lining up the day&#39;s tasks.</p> <p>This <em>sounds</em> like a chore, but this morning Lucy voiced a feeling that I share: that this routine has become a great comfort. &quot;It&#39;s like the scene where they start up the airplane by flicking on all the switches&quot;, she said.</p> <p>That&#39;s exactly what it&#39;s like. You sit down and strap in. You know a whole bunch of stuff is coming at you but, for now, your job is just to run through this checklist, powering up the various subsystems of your mind. It really is a lovely way to start the day. (I&#39;d record this process for you but it&#39;s Sunday. My review tasks come round Monday to Friday so there&#39;s not much to show today. Next time I get a good one I&#39;ll put it on camera.)</p> <p>It also put me in mind of this lovely startup sequence. That&#39;s my brain in the morning … just a bit at a time … go on … you&#39;ll get there …</p> <div class="youtube-embed"><iframe src="https://www.youtube-nocookie.com/embed/BVY0Su0RgyQ" title="YouTube video" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" referrerpolicy="strict-origin-when-cross-origin"></iframe></div>