Latest Posts (20 found)

PBS Black on Black

Disclaimer: While this post is about the “Black on Black” keycap set specifically, it is also a more general review of the PBS profile. In the Q3 2026 update I mentioned the set of PBS Black on Black, which has been on my Kunai ever since. I said back then that I might write a dedicated review once I could better judge it over a longer period of time. A year and a half earlier, in the Q1 2025 update , I had complained about the lack of textured PBT keycaps in the KAM profile and expressed my hope that PBS would eventually take that place. As far as the shape goes, PBS turned out to be pretty much what I was hoping for. Unfortunately, the same can’t be said about the texture, which is a lot smoother than I would like it to be. PBS is short for Penguin Belly Slide and it is a keycap profile designed by none other than Matteo Spinelli, better known as Matt3o, who is also the designer of the MT3 and MTNU profiles. According to Matt3o, the name comes from the hitting area , which is soft, round and oblong, and looks as if it was shaped over the belly of a penguin, while the slide is there because typing on the keys is fun. Unlike MT3 and MTNU, PBS is a uniform profile, meaning that every row has the same shape and height. Matt3o, whose first keycap set was in the DSA profile, calls PBS his tribute to flat, low-profile keycaps and an attempt at a uniform profile that is less boring than DSA. Matt3o began working on PBS in 2022, alongside MTNU, and initially planned to produce it with KBM, which had suggested increasing the wall thickness from 1.5mm to 1.7mm. The project eventually moved to Keyreative, the manufacturer behind the KAT and KAM profiles, with CannonKeys as the global distributor and with the walls back at 1.5mm. CannonKeys released the first PBS blanks in August 2024 and the Black on Black set in October 2024, as an in-stock product for $65, which was restocked several times over the following year. In 2026 a second round added a Modi kit with colored modifier legends. At first sight PBS looks like a cylindrical profile, with the rounded front and back edges and the straight left and right edges that Cherry and OEM keycaps have. The scoop of the hitting area, however, is not a cylinder but a sphere, which Matt3o cuts at the front and the back with a cylinder. The result is a hitting area that is as deep and round as the one of a spherical profile like MTNU, but without an obstacle at the front and the back, as the cylindrical cut lowers those edges. Matt3o describes it as the depth of a spherical top combined with the ergonomics of a cylindrical profile, and he estimates the hitting area to be about 20% larger than the one of MT3. The concave keys are 7.43mm tall at their highest point and the convex ones 7.91mm, which puts PBS slightly below DSA, at 7.84mm, and well below XDA and KAM, at 8.74mm and 9.05mm respectively. With a standard MX switch, the top of a PBS key ends up about 17.8mm above the PCB, compared to 20.5mm for Matt3o’s MTNU. I like the profile and its sculpt, especially the way the scoop hugs the fingertips. People who don’t usually like uniform profiles will likely find the scoop deep enough to keep the fingers from drifting onto neighboring keys, with edges that are soft enough to slide from one key to the next. PBS is a very comfortable uniform profile, more than DSA, XDA, KAM and uniform SA. Many profiles, like Cherry, MT3, KAT or SA, are sculpted , meaning that each row has its own height and angle, so that the upper rows face the typist and the lower rows face away. Sculpted sets need separate molds for every row, and each key only works as intended in the row that it was made for. A uniform profile like DSA, XDA, KAM or PBS uses the same shape for every row, so that any key fits any position of the same size, which, as Matt3o points out, makes every PBS set a free Colemak kit. It also keeps the cost down, as all 1u keys are identical, which was one of Matt3o’s goals with PBS. As I described in my Corne V3 build , the Corne only makes use of R2, R3 and R4 of a sculpted set, and every key has to come from the right row to keep the sculpt consistent. With PBS any cap fits on any position of the Kunai , as long as the size matches. This finally gives me proper legends, e.g. for my Control key, or my Return key. PBS is available with concave and convex keys, and it’s up to the designer of a set to choose which ones to use for the bottom row. Matt3o himself prefers concave keys for their flexibility on custom keyboards. The Black on Black base kit uses a concave bottom row, with convex spacebars and a handful of convex extras in sizes from 1u to 3u, which some owners use on thumb clusters. For homing , the kit includes F, J and numpad 5 keys with a bar as well as with a deeper scoop. Matt3o prefers the deep scoop, while, according to him, most people prefer the bars. On my Kunai I’m using the bars, and for the right thumb (space) I’m using a concave key. The heights are the highest point of a 1u key, as published by CannonKeys and Keyreative. Matt3o never published the row heights of MT3, so the MT3 numbers are my estimates, based on my own measurements. The Cherry profile goes back to the keycaps of Cherry’s own keyboards. GMK has been producing it in double-shot ABS since it took over Cherry’s double-shot tooling in 2011, and sells it as CYL these days. Cherry is a low, sculpted profile with four row shapes, namely R1 for the function and number rows, R2 for the top letter row, R3 for the home row and R4 for the bottom letter row and the modifiers. R1 is the tallest at 9.80mm and R3 the lowest at 7.30mm. According to Keyreative’s 3D models of its Cherry-profile caps, the lower a row is, the more its top is tilted away from the typist, from about 0 degrees on R1 to about 11 degrees on R4. The top of a Cherry key is a cylindrical cut that runs from the front to the back, so that it curves down in the middle when seen from the front, while it’s a straight line when seen from the side. Cherry-profile sets come as double-shot ABS from GMK, with 1.5mm walls and a fine texture that turns into a shine over time, or as dye-sublimated and double-shot PBT from manufacturers like EnjoyPBT and Keyreative. I’m not a big fan of the Cherry profile, although on the Corne, which only uses R2, R3 and R4, it felt more balanced to me than on any 60%+ keyboard. PBS shares the straight sides, the rounded front and back edges of the Cherry profile, but it replaces the cylindrical channel with a spherical scoop and the four rows with a single shape. At 7.43mm, PBS is about as tall as the Cherry home row and lower than its number row, and on the three rows of a Corne the two profiles are within about a millimeter of each other. MT3 is Matt3o’s first profile, which he began drafting in 2015 in a discussion on Deskthority, where the consensus was to create something that resembled the keycaps of IBM’s beam spring keyboards. Massdrop, later Drop, produced it, starting with /dev/tty, which shipped in January 2018 as dye-sublimated PBT with walls of around 1.8mm, while the double-shot ABS sets started with Susuwatari in 2020. MT3 is a tall, sculpted profile with a deep spherical scoop, which Matt3o designed for keyboards with an incline of 5 to 9 degrees, at which the home row ends up parallel to the desk. It adds a steep function row, R0, and offers the bottom row in two versions, an angled R4 and a flat R5. Matt3o’s own 3D files put R0 at 16.2mm, and the letter rows are roughly 11.4mm to 12.8mm tall, which makes MT3 the tallest profile in this comparison. Drop, which owned the MT3 molds, closed its store at the end of March 2026 and turned drop.com into a hub for the collaborations of Corsair, which had bought it in 2023. I favor MT3 for its sculpting, and it had been on the Kunai before PBS. PBS has a scoop that I would compare to the one of MT3 and a hitting area that Matt3o estimates to be about 20% larger, while it does away with the row sculpting and a lot of the height. PBS is quite significantly lower than MT3, making my Kunai a lot more portable. KAT, short for Keyreative All Touch, is the sculpted profile that Keyreative began designing in late 2016. Keyreative describes it as a MiniSA , with the slope design of the Cherry profile, taller rows, especially the function row, and a spherical scoop. Keyreative counts the rows from the bottom up, from R1 for the bottom rows to R5 for the function row. Its own chart puts the number row at 11.57mm and the home row at 9.03mm, while its 3D models put the function row at about 13.5mm. KAT is made of PBT, either dye-sublimated with 1.7mm walls or double-shot with 15% glass fiber and walls of 1.65mm, and Keyreative also lists double-shot ABS as an option. Its finish is the silky, satin-like smoothness that PBS has as well. KAT is one of the profiles that I generally prefer. On the three rows of a Corne, PBS is between 1.6mm and 3.2mm lower than KAT. KAM is Keyreative’s uniform profile, which the company developed from the home row of KAT, starting in February 2018. Every KAM key is based on the KAT home-row key, with a shallow spherical scoop and a height of 9.05mm, or 9.94mm for the convex keys. KAM is made of dye-sublimated PBT with walls of around 1.65mm, either matte or glossy, and Keyreative claims that its glossy KAM caps, like the black KAM Blanks that I had on the Kunai, were the first glossy PBT keycaps. Compared to KAM, PBS is about 1.6mm lower and has a wider and deeper scoop, or, as CannonKeys puts it, KAM is taller than PBS with a less pronounced scoop. Keyreative’s own 3D models put the center of the PBS scoop about 1.1mm below its rim, against about 0.7mm on KAM. The convex keys differ in the same way, as they rise 0.89mm above the concave keys on KAM, but only 0.48mm on PBS. PBS keycaps are made of PBT, while GMK and many of Drop’s MT3 sets use ABS. ABS is an amorphous plastic that softens at around 100°C, while PBT is semi-crystalline and keeps its shape up to about 220°C. PBT is also harder and denser, which makes a PBT cap about a quarter heavier than an ABS cap of the same shape, and it takes a lot longer to develop the shine that finger oils and wear eventually give to every keycap. ABS, on the other hand, yellows under UV light (shout out to GMK Bleached! #scnr ), but it is easier to mold precisely, while PBT shrinks more as it cools in the mold, which makes long keys like spacebars prone to warping. Keyreative itself writes that the PBT used for keycaps is usually PBT with added glass fiber, which reduces warping. In a stream about the PBS prototypes, Matt3o mentioned that Keyreative had added fiber to reduce shrinkage, which caused issues with the shift keys and the 2u keys that were to be fixed for the final release. Some buyers still report 2u to 2.25u caps that are tight on certain stabilizers, which however doesn’t affect the Kunai, as a Corne doesn’t use any stabilizers. At 1.5mm, the PBS walls are as thick as the ones of GMK’s ABS caps, but thinner than the 1.65mm to 1.7mm of Keyreative’s KAT and KAM, the roughly 1.8mm of the first dye-sublimated MT3 set, or the 1.7mm that Matt3o had initially planned for PBS. As for the legends, double-shot molding, which GMK and Drop use for their ABS sets, makes every cap out of two plastics, one for the legend and one for the body. The legends can’t wear off, and both colors can be as dark or as light as the plastics allow. Dye-sublimation instead prints the legends onto a film and uses heat to make the dye migrate into the surface of the cap. This works on PBT because it keeps its shape at the temperatures required, while an ABS cap would deform. The dye can, however, only add color, so the legends have to be darker than the cap. With dye-sublimation, light legends on dark caps require reverse dye-sublimation , which dyes the whole cap except for the legends. The process is difficult to get right, and Keyreative stated that it tried to avoid it because it was unstable, with a defect rate of over 40%. Laser etching, which is common on cheap OEM keyboards, burns the legends into the surface instead and usually leaves them lighter than the cap and noticeable to the touch. PBS uses dye-sublimation because Matt3o wanted the profile to be as affordable as possible. Dye-sublimation requires lower minimum order quantities than double-shot, and it doesn’t lock a set into a single typeface, as the legends are printed rather than molded. My gripe with PBS is the texture. I have long preferred thick PBT with a noticeable, rough texture, like the biip MT3 Extended 2048 that I mentioned in the Q1 2025 update, and compared to that the PBS caps are way too smooth for my taste. I had hoped that PBS would be the textured PBT in a KAM-like profile that I was missing, and in that regard it’s a bit of a bummer. The texture of a keycap is mostly a property of the mold rather than the plastic. GMK, for example, attributes the feel of its keycaps to the spark-eroded structure of its molds, and Keyreative even produces glossy PBT, like the black KAM Blanks that I had on the Kunai before and that turned out to be fingerprint magnets. The smooth finish of PBS is hence a choice, and as far as I can tell it is an intentional one. Matt3o designed PBS partially because of the rough texture of Signature Plastics’ DSA, and he described the surface of the PBS production prototypes as pretty smooth. Even his newer PFF profile for low-profile switches, which Keyreative manufactures as well, is only supposed to be one grade rougher than PBS, a difference that he himself calls hardly noticeable. Compared to what you typically find on the other profiles, PBS is among the smoothest. GMK’s ABS Cherry sets start out with a fine texture that wears into a shine over time, and Cherry-profile PBT from other manufacturers ranges from smooth to grainy, depending on the maker and even the production year. MT3 in PBT, like the biip set, has a pronounced, rough texture, while Drop’s double-shot ABS MT3 is smooth from the start. KAT and the matte KAM sets come from the same manufacturer as PBS and have a similar finish, which people describe as satin or silk for KAT and as velvet for KAM. PBS is at least as smooth as KAT, and it’s almost slippery. As a matter of fact, while removing the keycaps to replace switches I continuously drop every other PBS keycap because they are incredibly smooth, very flat and have rounded edges. On top of that PBS, just like KAM, shows oil and fingerprints a lot quicker than the textured DSA due to its choice of material and texture. Many like it that way, but I frankly don’t and it’s one of the most off-putting fact about the keycaps. I’m not alone with my complaint, however, as some in the PBS community have apparently been asking for a slightly rougher texture ever since the first blanks shipped in 2024. Despite its name, the PBS Black on Black isn’t black, but more of a dark gray. This is especially visible in bright daylight, and on the Kunai, which I painted in Tamiya TS-81, a light gray, it’s obvious that the caps aren’t black at all. If anything, it’s black legends on charcoal keycaps, so I would have rather picked something along the lines of Black on Charcoal as a name, because Black on Black is definitely misleading. The reason for this is, as I explained above, is most definitely the legend process. As dye-sublimation can only add color, you can’t sublimate black legends onto a black cap, because nothing is darker than black. This is why black-on-black sets with dye-sublimated legends, from PFU’s charcoal HHKB to Drop’s Artifact Bloom Black on Black, use a dark gray body with even darker legends. Even GMK’s double-shot Stealth set gets its contrast from an anthracite gray against black. Matt3o, who calls himself a PBT guy, wrote back in 2022 that the only downside of PBT is that you can’t do dark sets with it. In his stream about the PBS production prototypes, he also mentioned that he had wanted to make the black of the Black on Black lighter, but that everyone told him not to, and for good reason. To be completely honest, I don’t like the color at all. Unless I’m in almost complete darkness, the charcoal is noticable as such and really doesn’t go well with the rest of my specific board. As a matter of fact, even the (actually black) RAMA USB A-to-C keyboard cable is visibly different in color. Even worse, the two GMK Stealth RAMA artisans that I use as my upper left tab and my upper right backspace key are noticably darker than the keycaps. Hell, even the L-connectors of my TRRS cable are significantly more black than the keycaps. The PBS Black on Black sadly sort of ruins the aesthetics that I went for with my Kunai, making it look rather cheap. It reminds me a lot of KPrepublic’s $40 PBT Gentleman Black keycap set. Note: A matte surface scatters part of the incoming light back in all directions, which makes the color underneath appear lighter than it is. In a measurement by Konica Minolta of a dark plastic part with a matte and a glossy area, made from the same resin and color, the matte area came out noticeably lighter than the glossy one. Hence a dark, matte cap looks grayer the brighter and more diffuse the light is, as it is in daylight. The legends are slightly darker than the caps and, depending on the light, barely visible. Matt3o said that you could almost consider the set blanks, and I can confirm that legends are easy to read in direct sunlight but completely disappear in low light. Given that the legends therefore serve no practical and almost no aesthetical purpose, it makes me wonder even more why Matt3o went for this relatively cheap looking charcoal color for the keycaps to begin with, rather than making them slightly darker. PS: The modifiers use text legends throughout, with CODE instead of a Windows or Command key, which is what I prefer. One key benefit of PBS over MT3, which I also favor for its sculpting, is the height. On the three rows that a Corne uses, MT3 keys are roughly 11.4mm to 12.8mm tall, while every PBS key is 7.43mm, which makes the Kunai about 4mm to 5.5mm flatter with PBS than it was with MT3. When I built the Kunai I wrote that, without palm rests, the board is on the higher end, and that I could imagine MT3 or SA making it too tall, which turned out to be true. With PBS the Kunai is significantly flatter than it was with MT3, bringing it back down to a slightly more manageable height. In addition, it also makes it a lot more portable, as it takes up less room in the NuPhy NuPack that I carry it in. PBS has become one of my favorite keycap profiles , as it is pretty much what I was hoping for. Compared to MT3, which I like as well, PBS makes the Kunai a lot flatter and hence more portable. However, the caps are way too smooth for my taste, and the color of specifically the Black on Black set is pretty bad. They aren’t black but more of a dark gray, which in bright daylight and on the light gray Kunai looks rather unpleasant. If you like the silky surface of Keyreative’s KAT and KAM, and a charcoal instead of a true black doesn’t bother you then I guess PBS Black on Black can be for you. If, like me, you prefer a rough, grainy PBT, PBS will sadly feel too smooth. I’m not aware of any PBS set with a rougher finish and considering the author’s posts and preferences I’m doubtful that we will ever see one. For me, PBS Black on Black definitely is kind of a love-hate relationship.

0 views

The U.S. Census Bureau and “Super Intelligence”

I was reminded today of AI Adoption Rate Trending Down for Large Companies , a chart produced by Apollo Global Management in September 2025, which appeared to show a slowdown in U.S. corporate AI adoption based on numbers collected by the U.S. Census Bureau. At the time I used that chart to demonstrate GPT-5 data analysis , and then to experiment with Claude's new Code Interpreter . I decided to try running those numbers again to see what had changed over the past year, and in doing so learned that the Bureau has fallen foul of Executive Order 14434 , aka the asinine Super Intelligence one. Every two weeks the U.S. Census Bureau runs a survey called the Business Trends and Outlook Survey (aka BTOS). Each time it goes to 200,000 businesses out of 1.2 million total - the surveyed group (a "panel") cycles such that an individual business only completes the survey every twelve weeks. The latest data is published on alternating Thursdays at 10am. I used the most recent numbers (published October 22, 2026) to create a new version of the AI adoption chart, updated to reflect both the last twelve months and a change that was made to the survey question sent out by the Bureau: For comparison, here's that AI adoption chart from last year (my GPT-5 version): In September 2025 the largest (250+ employees) companies answered "yes" around 12% of the time to the question about whether they used AI in "producing goods or services". Under the new "any business function" wording, by February 2026, those same large companies answered "yes" around 30% of the time, and by October 2026 that had increased to around 40%. The data in the above chart comes from the "Employment size class" XLSX file, available from here . Here's a copy of the file I used. You can view the survey document that is sent out to businesses - here's my snapshot copy of that 346KB PDF. As the chart demonstrates, the question asked by the Bureau changed in a material way on November 17th, 2025. Prior to that date, the question they asked was this (emphasis mine): In the last two weeks, did this business use Artificial Intelligence (AI) in producing goods or services ? (Examples of AI: machine learning, natural language processing, virtual agents, voice recognition, etc.) On December 3rd, 2025, the Bureau announced a significant change to that question. Here's the replacement: In the last two weeks, did this business use Artificial Intelligence (AI) in any of its business functions ? (Examples of AI: machine learning, natural language processing, virtual agents, voice recognition, etc.) No more "producing goods or services" - now it's "in any of its business functions"! This means that the answers to the question before and after November 17th are not directly comparable. When I went looking for the updated question language in the latest XLSX file, I couldn't find it. I found this instead: In the last two weeks, did this business use Super Intelligence or SI (formerly referred to as Artificial Intelligence or AI) in any of its business functions? (Examples of SI use include: SI-powered data analysis; generative SI for marketing, product design, or coding; virtual SI agents for customer service; SI-powered forecasting or pricing; SI-driven computer vision for quality control, etc.) The BTOS about page explains what happened: Beginning with the October 19, 2026 collection, instrument wording was updated due to Executive Order 14434 . The current numbers reflect the old Artificial Intelligence survey wording - the first survey results reflecting the Super Intelligence wording are due for publication on Thursday. The obvious open question here is whether this wording change is going to affect the survey results. The businesses answering this survey will have last seen that question twelve weeks ago, when it was still called AI. Hopefully the new language isn't going to confuse them, especially since the survey helpfully spells out "formerly referred to as Artificial Intelligence or AI". I can't help but laugh at the absurdity of "SI-powered data analysis; generative SI for marketing, product design, or coding; virtual SI agents for customer service" though. You are only seeing the long-form articles from my blog. Subscribe to /atom/everything/ to get all of my posts, or take a look at my other subscription options .

0 views

Google Earnings, Facebook Déjà Vu, The Agent Play

Google's earnings miss looks a lot like Facebook's, and that's a credit to Google. The company is being more aggressive than they get credit for.

0 views

Getting back to Analogue

For the last few months I had not been writing at all by hand. My notebook has sat on my desk untouched without an entry for over 90 days. What was immediately apparent to me is that this hiatus coincided measurably with my creativity slipping, my writing slowed down and I haven’t released a (new) blog post in some time. Truly, I was struggling to connect ideas, and the generation of those ideas was essentially non-existent. While sleep deprivation (the sleep regression for babies is no joke and even less fun - I write this on about 4 hours last night) may have played a bit of a role, I found that as soon as I picked up my pen, I felt this undeniable flow of creativity coming back with the ink on the page. It may be that as a millennial, I hand-wrote nearly everything for the first decade and a half of my life, and so, it is ingrained that words flow from a pen rather than a keyboard far more easily. I had been discussing this with a friend recently in that nobody I knew had a laptop until university, and even then, notes were almost always by hand. The kids using a laptop in class were looking up memes and scrolling Facebook by and large. My entire scholastic career was analogue with the exception of computer class (Mavis Beacon anyone?). Nevertheless, I have always felt a sense of “connection” with the physical page. While I admittedly spend a ton of time on the computer, interestingly enough, the solution seems to be to defer to the analogue as the base of much of what I do, only moving to the digital when ready for execution. For me this means writing by hand whenever possible, and making it the baseline of my notetaking/idea/creative flow. Planning can be done in analogue, note taking that doesn’t need permanent grepping can be done in my Midori. I find I can easily draw connections and build diagrams of how I intend to build infrastructure, create lists, and begin longer form writing on the page. In fact, many of my blog posts are written by hand before final publishing so that the words flow from a pen and are refined by the keyboard in final revision. I am even experimenting with using OCR text recognition and Tessaract to translate much of my handwriting to a text buffer in emacs and then final editing it in the world’s greatest Operating system. Perhaps the issue of distraction on the machine is one that I also succumb to far too frequently. I don’t know how the average person has notifications enabled on their phones, they’re far too distracting, everything vying for your attention and sucking you into rabbit holes that I would prefer to not go down. Even on my main machines, with most notifications disabled, the internet itself is too much of a distraction - I have even started disconnecting from the internet at regular intervals, keeping as much of my work offline as possible. Even though I had a Supernote , I did not feel the writing was as solid as pen on paper, and I listed it for sale. There is something to writing by hand and not syncing everything, but to manually think through that which is going into my filesystem, that which I can permanently access. Sometimes rewriting notes also means they “stick” better in my mind, reinforcing the thoughts and expanding upon them in the digital format. The experiment I will run until the end of the year is simple: I will carry a notebook in my pocket, a pen, and have my A5 size notebook sitting on my desk at home. Whenever I have an idea, it will not be first instinct to reach for my phone in my right pocket, but to pull the notebook out of my left and scribble down that which my mind had received. As I have described in my post “ How I never forget things ”, I will then take my notes and review them at the end of the day, where I input them into my org-mode system for longterm capture, creating pieces of writing, videos, and such as I go. I have seen the recommendation to “dual wield” notebooks in many places , as you have one for “having thoughts” and “capture”, while the other “solidifies” information and offers more space for longform exploration. I think this is a wonderful idea: you carry around a cheap and easily obtained notebook and pen, and have your stationary at home that you enjoy long form writing on. The notebook in your pocket is for grabbing everything of interest that passes through your consciousness. The stationary is where ideas are honed and sharpened, built and hammered. You can sit with them there, building something you can reach out and touch with your hands from your mind. This is the draw of the computer, in that you can translate ideas from mind to world. I am not saying that you should not do this. What I am saying is that (at least for me) ideas need honing and crafting before they are put out, and the way to do this that seemingly works the best is on paper. I will report back at the end of the year how this is going for me, but I can already say I feel more creative, ideas are flowing better, and I’m forgetting a lot less (maybe it’s the sleep again…). Perhaps slowing down and feeling out ideas is what we were meant to always be doing. As always, God bless, and until next time. If you enjoyed this post, consider Supporting my work , Checking out my book , Working with me , or sending me an Email to tell me what you think.

0 views
Kev Quirk Yesterday

How I Customised Pure Blog for This Site

A few people have reached out to me to ask how I did X, or Y with my site, so I thought I'd talk about the customisations I've made to this site, and how they work. Firstly, this site runs on Pure Blog , a CMS that I've been building over the last year or so. As it's matured, I've added features that allow more advanced users to do clever things without having to fiddle with the core platform. This means that people generally shouldn't have to fork the project and should continue to get all the new goodness as I release it. This site is no different. I haven't done anything clever that Pure Blog can't do out of the box - everything is documented so by reading the docs and using a bit of creativity, you can do quite a lot with this plucky little CMS. I'll link out to the appropriate docs as we go through this post. Ok, so what customisations have I made? This is going to be a fairly long post, so I'll list them here with links to each header so you can jump around and read the parts that interest you. If you want to see specific code examples for any of these customisations, feel free to contact me . I have three custom post types on this site - notes , links , and books . Notes are used as short-form social media type posts, links are links to other blog posts that I've enjoyed, and books are short reviews of the books I read. Each has their own layout and in the case of notes, they have a different view on the homepage too. To do this I've created a custom partial, but we will come to that later. I could just use the default post type for all these posts, but I prefer to have a customised UI at the back-end for each. Here's what books and links look like in my editor: Notes are a little different as I use a custom page for them that only I can access. This looks more like a social media post window than a blog post window: Read the custom post layout docs ➡ I like to think of hooks as little tripwires that are set to go off when certain conditions are met. For example, something happens when an image is uploaded, or a new post is published. They're extremely useful and I have a number of them on this site: Read the hooks docs ➡ Beyond custom post types, Pure Blog lets you drop PHP files into . These can either override default pieces of the site (like navigation or post footers), or serve as entirely bespoke standalone pages, like my quick-publish notes screen, or the terminal 404 page . Here's a full list of the templates and partials used on this site: Read the layout partials docs ➡ I've replaced the default feed with one that allows for filtering on post type. So one feed file, 5 feeds - one for each post type, and a fifth for everything. My custom feed template allows you to visit for everything, or (e.g. ) for the posts of that particular type. This custom feed file lives in and I then used redirects to redirect the default URL to . All the feed URLs are available here . I use a self-hosted instance of Sendy to send out email "newsletters" whenever I publish a new post. These emails always contain the entire post, so people can read my content from their inbox if they wish. Because I write notes much more frequently than long-form posts, I let readers choose what they receive: everything, long-form content only, or notes only. To make that work without sending people through clunky third-party forms, I wrote a custom server-side handler ( ). When someone submits the form on the subscribe page , the handler: This not only helps segregate the emails people receive, but it has also had a dramatic effect on spammy sign ups. Which, if you've ever run a newsletter, you will know is a common problem. Pure Blog allows you to add your own PHP helper functions for all kinds of things. On my site, I only have 1 function defined: which transforms fractional score strings in my book posts (e.g. ) into accessible star glyph strings (e.g. ). I just think that looks far nicer in a post than . But how is this star rating accessible? Well, it's rendered on the front-end like this so screen readers can parse it: Read the custom functions docs ➡ I don't do anything magical with the design on this site. I use the Victor Mono font , and around 850 lines of CSS, which I've added to the custom CSS field within settings. Combined with the custom , and files above, it gives me everything I need to customise the site from the default look to what you see now. I have a custom theme palette that I've defined too, also in settings. The colours used can be found at the bottom of my colophon . Read the design customisation docs ➡ One of the most powerful things about using a static site generator is the ability to use data files. With data files you can have a structure data file, like YAML, that contains repeated data, which can then be looped through on the front-end to render content. I really wanted Pure Blog to be able to support data files, so I added support very early on. Personally, I use two data files on this site: Data files are fantastic as they reduce the amount of repetitive code you have to write. Instead of typing , after , after manually, you write your once, then loop through it with a data file and Pure Blog does the rest. Read the data files docs ➡ The final thing I customise is my file. There's a number of things I do to the standard Pure Blog file to either redirect URLs, or protect various locations: This ended up being an even longer post than I anticipated, but hopefully it shows just how much you can bend Pure Blog to your will, by design . None of this requires hacks to the core code, or maintaining your own fork. Everything you see here is achieved using Pure Blog as designed: settings, custom CSS, hooks, custom layouts, and partials. Because all these files live inside , , and , I can upgrade Pure Blog the moment a new release drops without worrying about overwriting my site's bespoke features. That was always my goal with Pure Blog - a super simple, distraction-free blogging platform out of the box, with enough flexibility under the hood for tinkerers (like me!) to build whatever they want. If you're running Pure Blog and have built your own customisations, or if this post inspired you to try something new with your setup, hit the reply button below, or find me on Mastodon. I'd love to see what you've done with it. Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️ You can reply to this post by email , or leave a comment . Post layouts Hooks and automations Templates and partials RSS feed enhancements Newsletter subscriptions Functions and helpers Design and typography Data driven pages .htaccess rules Final thoughts Email Obfuscation ( ) : Scans rendered content and encodes the site email address into hexadecimal HTML entities to protect against scrapers. This has been pretty effective at reducing spam - I wrote more about this feature in this post . Post Sanitisation & Metadata Preservation ( ) : Automatically generates date/time titles for new notes. Normalises layout values by stripping quotes (turning layout: "notes" into layout: notes), ensuring posts written in external editors like Obsidian don't break layout checks. Preserves in post frontmatter when saving via the admin interface so the Mastodon card at the bottom of every post continues to work. Image Optimisation ( ) : Automatically resizes images exceeding 2560px width whilst maintaining aspect ratio, also converts them to lossless WebP, and cleans up original unoptimised files. Mastodon Cross-Posting & Syndication ( ) : Automatically crossposts all published post types to Fosstodon via the Mastodon API. Notes posts are cross-posted with full body text and media attachments (uploaded to Mastodon's media endpoint). Articles, links, and books are crossposted with their description and permalink URL. Captures the returned Mastodon status URL and automatically persists into the post's frontmatter which is then used for the Mastodon card at the bottom of every post. Custom Font for Open Graph Images ( ) : Makes dynamic Open Graph image generation to use my custom font. (partial) : This replaces the default and adds post-type filter buttons, preserving query parameters across pagination. It also displays notes in full, while other post types show only the title and excerpt. (partial) : A customised version of the default file from Pure Blog. On top of the default tag list and post pagination, this version adds the obfuscated "Reply by email" button, a client-side Mastodon conversation card displaying live stats (favourites, boosts, replies) as well as a link to the post on Fosstodon, Pure Comments integration, and a subscription call-to-action. (template) : Dedicated discovery hub combining Pure Blog's full-text search with an alphabetical, weighted tag cloud showing post frequencies. (template) : An interactive metro map that lists all of the pages on this site. There's also an option to see the pages as a list. (template) : My quick-publish admin screen for composing and publishing short-form note posts. (template) : Dashboard for tracking the 100 Days to Offload challenge streaks in batches of 100 posts. (partial) : This replaces the default template in Pure Blog. It adds a custom layout, as well as 404 handoff ( ) to render the custom template without modifying core Pure Blog files. (template) : A fun interactive terminal-styled 404 page with custom commands that include goats! (template) : Endpoint that resolves and redirects visitors to a randomly chosen published post . Checks a simple verification question ("What is Kev's surname?") to keep bots at bay. Silently discards submissions that trigger a honeypot field, or exceed IP rate limits. Subscribes the user to the correct Sendy list(s) via Sendy's API in a single click. which is then used to render my blogroll page . which is used for my projects . Admin Access Restriction : I restricts access to specific allowed IP addresses. Legacy URL & Feed Redirects : 301 redirects mapping historical and URLs to clean root and routes that Pure Blog uses. Redirects for legacy feed and social endpoints ( , , , , , etc.) to or to make sure the feed URLs from various versions of this site don't break. Route Rewrites : clean URL routing for all my RSS feeds so they have simple to share URLs.

0 views
Farid Zakaria Yesterday

A clock made of branches

What is time inside a machine you want to replay? 🧘 When building Rewind , a deterministic VM, you come face-to-face with the idea of how to represent time very quickly. You need a way to measure time inside the guest so that on subsequent replays, the guest sees the same time and makes the same decisions. Time is the ultimate variable. You can’t simply record the wall-clock time of the host because time spent between two interception points depends on things outside the guest, like host load, CPU frequency, caches and other processes. Therefore the same guest work can take a different amount of time on the host. In dafuq is a deterministic VM? I explained how the clock inside Rewind VM moves 5 microseconds per step. More specifically, that clock, exit time , moves only when the guest exits such as from a . It treats everything the program does between two exits as instant . Therefore a program that is CPU bound such as doing nothing but math for a full second between two system calls, sees only 5µs go by. 🤦🏻‍♂️ Rewind has a second clock mode as well, counter time , that tries to account for the work. The clock advances one nanosecond for every conditional branch the guest retired. 1 Aside: New to Rewind? Start with a flaky build you only catch once and dafuq is a deterministic VM? Still confused about what I mean by “free” and “branches”? Let’s look at a simple example to distinguish between the two clocks. The counter time tries to account for the work whereas the exit time only advanced the clock on exits. 2 Why branches, though? We already understand that we cannot rely on the wall-clock time of the host. We need something to measure that is the same for every run of the same program so that we can equate it to time spent. What is the same on every run? The guest’s instruction stream! The CPU is a deterministic machine: the same input, the same registers, the same memory, and the same instructions produce the same next state. We can measure time by measuring progress through the instruction stream. 💡 Turns out that CPU manufacturers even ship a hardware counter for exactly that. Is it reliable? Let’s see. 🧐 Let’s use this simple program: count down from a billion. The assembly equivalent contains a , a billion + (conditional branch) pairs, then three instructions to exit for a total of 2,000,000,004 instructions. Let’s run it on the CPU twice and count the instructions and conditional branches with : The same program and input gives the same conditional branch count, but the instruction count is off by a thousand or so. Why? Although this loop is CPU bound and only decrements a register, it is still not isolated from the effects of the outside world. Timers tick, network packets arrive, other cores send inter-processor interrupts (IPIs). The program can’t see any of that, but the instruction counter we are probing can. I pinned the loop to a single CPU 5 and counted how many interrupts that CPU took during each run, from . The dashed line is one extra count per interrupt , and the instruction counter is almost perfectly on it. 3 The conditional branch counter on the other hand, stays at zero no matter how many interrupts land. Interrupts from the outside-world are not the only thing that can skew the instruction count. The program can also page fault, which is an interrupt too. The instruction counter sees the kernel’s detour to handle the fault, but the program does not. Tip Out of the box, AMD Zen also overcounts conditional branches, a few in tens of millions, from a speculation optimization known as SpecLockMap. The fix is to set a particular bit in the PMU MSR, which Rewind does automatically as does rr#2034 . In order to rewind history, we need a measurement of time that is reliable and deterministic. Our traditional wall-clock time is unreliable due to the effects of the outside world but we do have a reliable measurement of progress through the instruction stream: the conditional branch counter. Using the conditional branch counter as a proxy for time turns out to be a relatively decent approximation. Why do we care about having a “realistic” representation of time? Plenty of programs read the clock and make decisions with it, so the guest’s clock has to be at least somewhat realistic. Under exit time, computing is “free”. A test that checks some work “finishes within 1 s” always passes. If the bug you’re chasing is a timeout, exit time will never reproduce it. 🙃 Races get skewed too with an unrealistic clock. With exit time, a whole burst of work lands in the same instant, which crowds the threads together, so a race can fire far more often in the VM than it ever would on real hardware. Some say time is an illusion. I say it’s a counter. This is the same approach popularized by the rr debugger. The rr paper calls it deterministic time .  ↩ The 5µs was my guess at a reasonable cost of a system call and context switch on current hardware. The 1ns is roughly what a conditional branch costs on a current core.  ↩ The fit is 0.94 rather than 1 because also catches the interrupts that land while and start up and tear down, before and after the loop runs.  ↩ exit time +5 µs +0 +5 µs +0, free! +5 µs +0 +5 µs 20 µs counter time +5 µs +2 µs +5 µs +1 s +5 µs +3 µs +5 µs 1.000025 s exit time: only exits move the clock. Work between two exits is instant. counter time: exits, plus 1 ns for every conditional branch of work. The counter time tries to account for the work whereas the exit time only advanced the clock on exits. 2 Why branches, though? What is time in a replayed machine? We already understand that we cannot rely on the wall-clock time of the host. We need something to measure that is the same for every run of the same program so that we can equate it to time spent. What is the same on every run? The guest’s instruction stream! The CPU is a deterministic machine: the same input, the same registers, the same memory, and the same instructions produce the same next state. We can measure time by measuring progress through the instruction stream. 💡 Turns out that CPU manufacturers even ship a hardware counter for exactly that. Is it reliable? Let’s see. 🧐 Let’s use this simple program: count down from a billion. The assembly equivalent contains a , a billion + (conditional branch) pairs, then three instructions to exit for a total of 2,000,000,004 instructions. Let’s run it on the CPU twice and count the instructions and conditional branches with : The same program and input gives the same conditional branch count, but the instruction count is off by a thousand or so. Why? Although this loop is CPU bound and only decrements a register, it is still not isolated from the effects of the outside world. Timers tick, network packets arrive, other cores send inter-processor interrupts (IPIs). The program can’t see any of that, but the instruction counter we are probing can. I pinned the loop to a single CPU 5 and counted how many interrupts that CPU took during each run, from . The dashed line is one extra count per interrupt , and the instruction counter is almost perfectly on it. 3 The conditional branch counter on the other hand, stays at zero no matter how many interrupts land. Interrupts from the outside-world are not the only thing that can skew the instruction count. The program can also page fault, which is an interrupt too. The instruction counter sees the kernel’s detour to handle the fault, but the program does not. Tip Out of the box, AMD Zen also overcounts conditional branches, a few in tens of millions, from a speculation optimization known as SpecLockMap. The fix is to set a particular bit in the PMU MSR, which Rewind does automatically as does rr#2034 . So, what time is it? In order to rewind history, we need a measurement of time that is reliable and deterministic. Our traditional wall-clock time is unreliable due to the effects of the outside world but we do have a reliable measurement of progress through the instruction stream: the conditional branch counter. Using the conditional branch counter as a proxy for time turns out to be a relatively decent approximation. Clock Time inside the VM Time on the host Exit time 2.1 s 15.7 s Counter time 11.7 s 14.2 s Why do we care about having a “realistic” representation of time? Plenty of programs read the clock and make decisions with it, so the guest’s clock has to be at least somewhat realistic. Under exit time, computing is “free”. A test that checks some work “finishes within 1 s” always passes. If the bug you’re chasing is a timeout, exit time will never reproduce it. 🙃 Races get skewed too with an unrealistic clock. With exit time, a whole burst of work lands in the same instant, which crowds the threads together, so a race can fire far more often in the VM than it ever would on real hardware. Some say time is an illusion. I say it’s a counter. This is the same approach popularized by the rr debugger. The rr paper calls it deterministic time .  ↩ The 5µs was my guess at a reasonable cost of a system call and context switch on current hardware. The 1ns is roughly what a conditional branch costs on a current core.  ↩ The fit is 0.94 rather than 1 because also catches the interrupts that land while and start up and tear down, before and after the loop runs.  ↩

0 views
David Bushell Yesterday

Tangled, hire a front-end accessibility expert

Not me, this is just friendly advice from a struggling user. Alongside Codeberg I’d consider Tangled to be a real GitHub replacement. We desperately need to leave GitHub behind. It’s difficult to recommend any tech these days. I used to spread the gospel of Proton and that backfired . From what I’ve seen, Tangled seem to be saying and doing the right things so far. I have trepidations about their venture capital funding (see Deno’s demise ) but pessimism is no fun. Tangled’s recent blog post on federated code forges piqued my interest. I self-host Forgejo and a big downside is that no one else can participate easily. Forgejo federation is under development. Maybe the two can co-exist? But that’s not what I’m here to discuss. In the same post Tangled revealed their new UI design. We’ve redone the UI on top of our new architecture (described further below), in Svelte. Things should now be quicker, visually consistent and prettier! The keen eyed of you might’ve also spotted that we’ve swapped out Inter for Timeless Sans. The federated code forge - Anirudh (Tangled CEO) I quiped on Bluesky: “keen eyed? eagle-eyed maybe!” — the new font size is exceedingly tiny. It’s coded as with line height. Tangled is practically unusable for me at this size. It was small before but I could zoom in. The way the new front-end is designed and built doesn’t leave much room for personal remedy. This is not just a subjective opinion there are real accessibility failures here. Below is a screenshot from Tangled’s new user interface design. Visit and experience the new UI yourself. 12 pixels is too small for any meaningful text (which is typically all text). Maybe you feel the size is totally fine? That’s fine for you. But it’s not fine for a significant number of people. You won’t find any accessibility expert happy with that size. (Low-DPI displays may even struggle to render the font legibly.) WCAG 2.2 accessibility guidelines don’t recommend a minimum font size. 1.4.4 Resize Text does require that text can be resized up to 200% “without loss of content or functionality”. Tangled uses pixel units in CSS for font size † . That means the UI won’t adapt to the browser default setting. I can force a minimum font size and look what happens. † Correction: I was wrong about pixel units everywhere (I misread the computed values), it’s on the element that blocks the relative units from scaling properly with browser settings (an easier fix) . Text lines get too close for comfort. Characters are starting to get clipped. See the “g” descender in “Tangled” for example. And if I force a 200% resize at this happens. Oh dear! Text that is “clipped, truncated or obscured” is a failure. Remember that the WCAG guidelines are a floor. Nothing can be perfectly accessible, but a font size and basic front-end failures are a concern. A proper audit would reveal other issues (e.g. with how media/container queries adapt to font size). I’m not posting this to seek employment myself or to provide answers. I want to remind readers that accessibility concerns affect everyone. Serious projects should seek professional expertise. It’s disappointing to see yet another tech start-up fail the basics. I’ll provide two suggestions for free though: (Edit: see correction above, the fix is even easier.) Frankly, what Tangled’s redesign suggests to me is that nobody involved with the process gave accessibility enough thought (if any) (edit: that part was unfair, there was some effort but far from adequate testing) . That may sound harsh but it’s usually the reality from my experience. Whatever the case, Tangled must do better in this area. If I may answer a few predictable but hypothetical comments. This is just v1. Things will improve. I’m sure they will and maybe even pushed by my criticism. The struggle is that accessibility concerns must be integral to design from day one, not an afterthought to patch. It’s open source, where’s your merge request? Sorry, once a project crosses the line into venture capital “open source” takes on a different meaning. If people want to contribute that’s their prerogative. Personally, I’m not in the habit of giving away professional expertise for free to a for-profit business. Such expectations are especially a problem for accessibility specialists (of which I am not). Aha! What about this accessibility failure on your website?! That’s a bit embarrassing, but thanks for the heads-up! It’s far easier to hire an accessibility expert before you ship but it’s never too late to retroactively make improvements. I’ve been making accessibility improvements on my own website for decades. I like Tangled and I want to see it do well. Maybe someone will share a milkshake duck or they donate to fascist Linux and I’ll eat my words. I really hope not! I hope Tangled improves so that those lingering in GitHub’s slop graveyard have fewer excuses to hang around. Thanks for reading! Follow me on Mastodon and Bluesky . Subscribe to my Blog and Notes or Combined feeds. Use relative units for font sizes Use unit-less numbers for line height

0 views
Evan Hahn Yesterday

A Mastodon bot powered by iOS Shortcuts

In short: I use iOS Shortcuts to run a Mastodon bot. I run a Mastodon bot that posts random quotes from The Legend of Zelda: Link’s Awakening . (The writing in that game is so charming!) I used to run it off a server, but for the past few days, it’s used an iOS Shortcut on my phone. The bot is called Ulrira, named after a beloved Link’s Awakening character . Ulrira (the bot, not the character) samples a line from the text dump, then makes an HTTP request to post it. Here’s a screenshot of the full thing: As you can see, everything here is hard-coded, from the server credentials to the file name. (It probably wouldn’t be hard to make this more generic, but I didn’t bother.) This used to be a short, hand-written Bash script. I used the new AI-powered Shortcut creator and prompted this into existence. I said something like, “Here’s a Bash script. Turn this into a Shortcut.” Like a lot of LLM output, it wasn’t quite right, but it was useful for getting started. Shortcuts doesn’t seem to have an elegant way to express something like “run this every 6 hours”, so I created four additional scheduler Shortcuts that call the main one. They run at 12am, 6am, 12pm, and 6pm. That means there are five shortcuts in total: one to actually make the post, and four to schedule the main Shortcut at different times. I didn’t want to pay for my server anymore, nor did I want to maintain it. When I went looking for alternatives, they either (1) cost money (2) had some significant limitation (for example, GitHub Actions requires me to update the repo every 60 days). This solution runs on a device with high uptime and is effectively free. If you’re a pro software genius, you might complain that this is not reliable! It doesn’t work if my phone is offline, for example. Or what if I change timezones? But in the words of Link’s Awakening : You’re good! You’re a pro, aren’t you? ………… Well, beat it! Pros aren’t allowed in here! Follow the bot here .

0 views
Hugo Yesterday

PaaS, Coolify, Terraform and AI: How to Manage Your Infrastructure in 2026 When Launching a Startup

I created my first company which went well 14 years ago and I was able to grow that company from 0 to over 700 employees. You can imagine that the constraints when starting, the working methods, the tools, are very different from what you might encounter in most companies you know. You don't work the same way at 0 and at 700. You need to be fast, you need to build an application that people want to use without burning mountains of money you haven't earned yet and it's for all these reasons that I chose not to take care of the entire software infrastructure part at the beginning. What I call infrastructure is the servers, databases, backups, everything that's invisible to most people but essential for an application to function. It's essential, but overall everyone doesn't care about it. It's not that which allows you to sell a product. Good infrastructure but with a bad application doesn't work. And if you spend too much time on infrastructure, you don't make a good product. Obviously it still needs to work but you can delegate it, I would even say you should delegate it. Infrastructure should be a non-issue for several years when you start. So back then I chose to use a PAAS, a platform as a service, which precisely allows you to delegate all the infrastructure to people whose job it is. And whenever I saw people starting companies but starting to tell me about Kubernetes or Docker, I would systematically tell them it was far too early to talk about that. I always saw that as a bad signal whenever someone spent their time explaining to me how they were making their product, not what product they were making. The nuance is important. Now, I'm changing my mind. Except for Kube. I just launched a new product, Kula , the world has changed, company creation has changed and it might be time to reconsider some choices. So we're going to talk about PAAS, coolify, dokploy, easypanel, terraform, AI and how we can deploy applications in today's world. In 2014 I wrote an article on exactly this subject (in french). Because in 2014 we were leaving Heroku, our PAAS at the time to go to an OVH server. A PAAS is, in very simplified terms, an execution environment that allows you to run your applications. A PAAS manages for you web servers, databases, backups. It should allow you to collect and analyze errors that occur, alert you if you're running out of memory or CPU. We left Heroku because in 2014 we were starting to hit the limits of what PAAS could offer. Among the important limitations I could mention: In 2014 with Malt we needed precisely to be able to route Web requests to several different applications. For example the /search page was a separate application from the one that served the /profil page. Despite everything, in hindsight, it was a dangerous choice. The company was only 2 years old and I had to do a lot of ops to reproduce a satisfying developer experience on OVH. That's time I didn't spend elsewhere. Fortunately I already had experience on the subject and good mastery of certain automation tools like Ansible which limited the damage. But it was also an economic choice. A PAAS could quickly become expensive. Each resource (a database, a server, a process) is billed independently. And in 2014 at Malt, I can tell you we counted every euro spent very carefully. Okay, but I'm talking about Malt in 2014. Then the company grew well, we doubled in size every year. In 2017 we hired our first ops. We started doing OVH Cloud. In 2018 we went to GCP and we were no longer off by 100 euros. But that's not today's subject. What interests me is the startup phase. Since 2024 I left Malt and started creating products again. I love doing that. I find the first steps exciting. You have to know how to deal with constraints, be creative. I first launched Broadcast in 2024, a newsletter sending service for static blogs. Then Pulse in 2025 while I was living in Japan, an analytics service for blogs. Connect in 2026, a comment as a service (like Disqus). Writizzy in 2026 as well, a blogging and newsletter platform, a competitor to Substack or Beehiiv. Until now, it was the most ambitious and largest project. And for all these projects I used a new range of tools that I discovered in 2024, self hosted PAAS. They are PAAS, but they are PAAS that you can host yourself. I chose Coolify, which I already talked about in an old article . First of all, obviously, that changes the price. Today I run Coolify on two machines, with all my applications, all my databases. That represents more than thirty resources and it costs me 45 euros per month. Remember, I'm back in startup mode, so with very little money and it's therefore a heavyweight argument. No commercial PAAS can allow me to run all these resources for that amount. It would be at minimum between 300 and 1000 euros per month. I lose time on it, I have had some cold sweats with system updates, connection losses, machines that break down. But the fact of using a PAAS, so software that takes care of all deployment, monitoring, logs is a significant gain. Even if I need to understand how it works, I'm not obligated to spend as much time on it as if I had to manage everything manually and dive into the workings of Kubernetes for example. But, with more than 30 managed resources, I started to feel some limitations and especially, I realized that maybe, maybe I was going in the wrong direction. What if AI could become an excellent ops for me? I love Coolify, but there are still important limitations: This last point, if you have only one application, it's not very serious. But I already have too many applications. If I need to bring up an entire server, I'll have to reconfigure everything and I really don't want to. I'm exaggerating, Coolify's database itself is backed up in snapshot mode but it's a bit more painful and it doesn't allow me to easily migrate to another service, like Dokploy or EasyPanel. So I tested something else. I asked AI… Yes, ops takes time, it can be complex and you can't mess up. But writing code that allows you to automate your infrastructure, your network topology, your backups, your observability, that remains an excellent idea, much better than making dozens hundreds of clicks on an interface. Because code can be versioned. And I'm telling you that, I've already done Ansible, Capistrano and shell batches, so I'm not discovering that in 2026. But I also know that writing code is long and once again, it's time you don't spend on the product. Except… if AI writes it. In October 2026 I decided to take advantage of the experience I acquired on Writizzy and Broadcast around email sending to launch another product: Kula . Kula is a marketing and transactional email sending tool. I manage sequences, segmentation, analytics tracking, deliverability management and it's now the email sending backend for Writizzy and Broadcast. If you're already a customer of sendgrid, mailjet, brevo, or resend, don't hesitate to test. Plus I'm generally cheaper . Except this time I didn't want to use Coolify again for Kula. So I used AI to create Terraform scripts to control my infrastructure (at Hetzner, Bunny.net and AWS). I added continuous deployment, rolling upgrades with Caddy , incremental backups with WAL , logs collected in dozzle . And all that took me less than 1 hour to set up. I can bring up my entire infrastructure more easily, I manage and version my secrets with Sops, I lowered my RPO from several hours to 1 minute (RPO is the maximum possible data loss) and I can control everything from my code, by running scripts. Finally, my LLM can control everything. Now, if you didn't understand RPO, Sops, WAL, rolling upgrade and overall what I just said seems as clear as Chinese to you, it's because I may have misled you… In reality I haven't totally changed my mind. I still believe you should delay ops as late as possible but with much more nuance than before. You do ops anyway, even with a PAAS, but a large part is simplified, pre-digested for you. Except that precisely, you delegate choices to people who know how to do it without always understanding the compromises they made for you. You hadn't necessarily understood before now that your backups were imperfect. You hadn't perhaps realized that your secret management was a mess before I mentioned it to you. Creating IT projects is constantly making compromises between costs, risks and gains. And you can't maximize all three. Low risks and many gains requires a lot of budget. Low budget to get many gains, it's necessarily because you're taking risks. Etc… It's not a problem to solve, these are choices to make. So if you lack general knowledge, if you decide to do everything directly with AI, it might send you crashing into a wall because you won't understand the compromises that were made. It's true, there's no longer as much argument about loss of time as before. You can go very fast. But going fast into a wall isn't necessarily an advantage. In my case, I wasn't starting from scratch, far from it. So I knew where to go. I was already doing ops by choosing to use Coolify in self-hosted mode and then I had some experience, including in much larger companies. I understand the compromises I'm making. When I say that I launch a new company using terraform, I'm taking a shortcut. I've been launching products since 2011. And since leaving Malt, I have 2 years under my belt with Hakanai, Writizzy and Kula. When I say I took 1 hour to set everything up. It's true, but I took 25 years to learn to set it up in 1 hour. So let me rephrase. If you have no knowledge or experience of ops, infrastructure, take a PAAS. A very simple PAAS that you don't host yourself (Clever Cloud, Scalingo, Sevalla for example). The cost will remain acceptable and you'll have the opportunity to learn on a stack that's managed for you. (I came across koyeb too while writing the article but I'm having trouble positioning it between PAAS and IAAS, don't hesitate to give me info if you know) If you have knowledge but you're still in prototyping phase with still few applications to manage, choose a market PAAS or a self hosted PAAS, Coolify, Dokploy or EasyPanel. Here you'll prioritize cost and flexibility. If you're really knowledgeable, you can go to dedicated servers controlled with terraform. It's the advanced version of the previous option, focused on cost and flexibility. As soon as you have volume, and several applications, some architectural complexity and a budget to finance it, then you can start looking at IAAS (infrastructure as a service), DBAAS etc… I recommend Scaleway or Hetzner. In short, it's hard to launch a company. It's even harder to learn all the necessary trades at once. Even with AI. Don't waste time on what you don't yet know how to do. However, as soon as you've gained the experience, tell yourself that many things that were very time-consuming before is now much more accessible. Revisit your preconceived ideas on the subject and test. You might be surprised. There was no notion of private network. A private network is what allows your application to communicate with a database without going back through the internet. So the database is only accessible within your network. Most PAAS offerings didn't provide that. There was no notion of web frontend. A web frontend is a server that we place in front of one or more applications. This allows, among other things, to have different applications that are used for different parts of a website. Coolify doesn't allow multiple nodes of the same application There's no secret management. All environment variables are in plain text. You have to use a service like infisical . Monitoring exists but remains quite light. Backups are only in snapshot mode. That is to say you take photos of the database at regular intervals but in case of a crash, you lose all information since the last backup. it's clickodrome. You can hardly automate the fact of rebuilding resources, especially since the api is limited.

0 views
Sean Goedecke Yesterday

How to get assigned important work in big tech companies

To get a good reputation in tech companies, you need to work on important projects. However, you need a good reputation first in order to get assigned important projects. Doesn’t that make it impossible to get started? I get a lot of emails from engineers who are struggling with this problem. They go like this: I work with a strong senior engineer. I feel like my manager structures work so that strong engineer always gets the visible work, and the more they do, the more opportunities they get, while I sit on the sidelines. My manager agrees with me that it’s time for me to start leading work myself, but every time a new project appears it always goes to the strong engineer. What do I do? This is a good case study for what I think of as “tech company theory of mind”: understanding the actual incentives that motivate decisions in tech companies, instead of the formal process. According to the formal process, projects should probably be assigned round-robin to whoever has capacity and isn’t currently working on one. But (as my emails complain) this is almost never how it works in practice. Managers care about giving their employees chances to build a reputation, but they care more about developing their own reputation as someone who can deliver. High-profile projects are the best opportunity for new people to step forward and get known, but blowing up a project 1 like that is the easiest way for a manager to tank their own reputation. They will thus typically hand these projects to someone they know can deliver, while simultaneously promising (including to themselves) that next time they’ll take the risk of letting another person lead it. Of course it’s a vicious cycle. The more you rely on one person, the more reliable they become and the less reliable their colleagues become, since they aren’t getting the relevant experience. It’s not very sustainable. However, the average manager tenure in big tech is only a couple of years 2 . Given that, it’s rational for individual managers to take the long-term risk in exchange for mitigating the short-term risks of project failure. So what can you do about it? I wrote about the classic approach years ago in Ratchet effects determine engineer reputation at large companies : Note that this plan does not involve convincing 3 your manager that you need projects for your career development, or that it’s unfair for you to be overlooked, or that the formal process would mean you should get to lead projects. You are not going to be able to change your manager’s incentives, but you may be able to position yourself so that your manager believes their incentives line up with yours. The problem with this plan is that it’s slow . It takes months or even years to piece together a reputation like this. That’s slow enough for bad luck to intervene by handing you a failure you can’t avoid, or having your manager leave, or for the fundamental nature of software engineering to change . What can you do that’s faster? The fast path to getting assigned interesting work involves taking risks. This is all dangerous advice . Follow it at your own peril. One way is to build a relationship with your skip-level . If your manager’s manager thinks you’re a stone-cold killer, you are basically guaranteed to get assigned interesting projects. They will straight-up tell your manager “why not put X on this?”, and your manager will rationally decide (a) that it’s in their best interests to do it, and (b) that if you screw it up, it won’t be their responsibility. But it’s not so easy to build a relationship like this. Very senior managers are skilled political operators 4 who are good at identifying when people are trying to persuade them. If they think you’re coming on too strong, that will hurt you far more than it helps. Unfortunately, the most reliable technique for building a relationship with your skip-level is to just be reliably useful to them over a long period of time, which puts us back to the slow way. Another fast way is to make side bets . I wrote about that here , but the idea is simple: figure out and implement your own projects. Work that you decide to do is work that doesn’t have to be assigned to you, so if you independently identify something important that needs doing, then do it, you’ve manufactured your own project out of thin air. I think every senior engineer should be trying to do this all the time. The risk of making side bets is that if they don’t work, or turn out to be less important than you think, you’ve entirely wasted your time. Worse, many managers will get annoyed at engineers who try this, because it can make managers look in meetings like they don’t know what their team is working on. Finally, the best fast way is to impress your engineer colleagues . This only really works on a team with a healthy culture, but when it works it’s very smooth. Managers are slow to form opinions because they’re not close enough to the engineering coalface to know who’s doing quality work 5 . Engineers are informed enough to form opinions quickly. At least I am: it only takes a few “oh, you saw something I didn’t” moments for me to decide someone’s good. On a healthy team those engineers will tell their manager that, who will decide that you must be good, and will give you important work far earlier than if you’d had to prove yourself from scratch. On a kind of crappy team, engineers might not be good enough to recognize strong engineers, or they might not communicate freely enough to tell your manager about it. On a really unhealthy team, engineers will actively trash-talk competent colleagues because they (correctly) see them as the biggest threats. If you’re on a team where all the interesting work is going to someone else, you have a reputation problem. It’s probably not personal: your manager is simply incentivized to give new work to known reliable engineers, which is a vicious cycle that leaves you out in the cold. Fixing that can be a safe slow process or a risky fast process. Either way, I don’t recommend simply trying to convince your manager in 1:1s that it’s unfair to leave you out of projects. Tech companies are not supposed to be fair , they are supposed to make money. You’re better off finding a way to make it look like it’s in your manager’s best interests to assign you that work: either by appealing to your skip-level, finding projects of your own, or building a reputation with engineers your manager already trusts. One reason some people find this point tricky to grasp is that they underrate just how hard it is to ship anything . Projects fail all the time . No manager can afford to be sanguine about the risks. I linked the first crappy source I could find, but my main source for this is just noticing how long the managers in my workplaces stick around. You don’t even necessarily have to tell your manager you’re looking for bigger projects, though I think you probably should. Almost certainly more skilled than you, due to selection effects and the fact that they get way more practice. They typically have to rely on results, which is a slow proxy for technical ability. Focus on reliably shipping small, low-risk pieces of work Communicate to your manager and team that you’ve done that Use that reputation to get slightly higher-risk pieces of work Avoid any mistakes that will ratchet up the perception of you as unreliable Eventually you will be considered a safe prospect to handle important work One reason some people find this point tricky to grasp is that they underrate just how hard it is to ship anything . Projects fail all the time . No manager can afford to be sanguine about the risks. ↩ I linked the first crappy source I could find, but my main source for this is just noticing how long the managers in my workplaces stick around. ↩ You don’t even necessarily have to tell your manager you’re looking for bigger projects, though I think you probably should. ↩ Almost certainly more skilled than you, due to selection effects and the fact that they get way more practice. ↩ They typically have to rely on results, which is a slow proxy for technical ability. ↩

0 views
Unsung Yesterday

Pac-Man’s siren call

(It’s the last day of Halloween Week on Unsung, where we’re sharing scary, spooky, and creepy stories. This is a story of how my bug scared others.) In 2010, Google’s homepage celebrated various occasions with reimaginings of its own logo called doodles, but we wanted to do something extra special for Pac-Man’s upcoming 30th anniversary – and through a set of circumstances that began with me randomly sitting in the cubicle right next to the doodle team, I was asked to write the code. It was, frankly, a terrifying proposition. The homepage was then a very important destination, and my job title was only adjacent to “software engineer.” But I started researching the game and recreating it all in HTML and CSS, not dissimilarly to the iPod Apple just put on their pages to celebrate a different anniversary . (The research was tricky because we didn’t want to reach out to Namco for help too soon, instead planning to wow them with a close-to-finished doodle. Luckily, some nerds on the internet researched Pac-Man intensely , so I could stand on their pixellated shoulders.) It was important for me to stay truthful to the original game, with only some very deliberate exceptions – the price of entry was the playfield having to resemble Google’s logo, and I also added a Ms. Pac-Man mode as an easter egg; the already-classic I’m Feeling Lucky button was reimagined as Insert Coin. I even added a few bugs that I learned existed in the original Pac-Man. But I also introduced at least one important bug of my own making, one that backfired on launch day. We wanted the game to have sound, because so many of Pac-Man’s sounds are beyond iconic: the starting melody, the waka-wakas, the death jingle. This presented a little technical challenge, since I hoped for the doodle to be a showcase of what pure HTML and CSS could do, but sound still needed quiet (huh) support from Flash. However, Flash was, by then, installed in a lot of browsers, so that worked out okay. The project was all was going really well. I had fun coding the game and we seemed to have fun playing it. Namco eventually got onboard, too, including greenlighting the Ms. Pac-Man addition that I only later learned had a pretty complex political story . We felt so happy about the progress, as a matter of fact, that the leadership wanted the doodle to feel even bigger. And at some point, we thought about the game autoplaying on the homepage after 10 seconds of inactivity – just to let you know that you could have some fun in a place you might not have expected it. I was happy with that – if there was anything scary about it at the time, it was only the thought of my code getting even more exposure – but I wasn’t worried about distraction, since the homepage was not a destination page you would ever linger on. As you can piece together, Pac-Man would also, as a consequence of all these decisions, autoplay with sound. We knew that, I think, and in that moment it felt like… it would probably be okay. In hindsight, it wasn’t okay, but it also was not okay in a way that none of us expected. = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/pac-mans-siren-call/2.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/pac-mans-siren-call/2.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/pac-mans-siren-call/3.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/pac-mans-siren-call/3.1600w.avif" type="image/avif"> The launch day came. A couple of people on the team and I pulled an all-nighter that included putting in some finishing touches, and preparing an internal tournament version of Pac-Man. Personally, I was petrified. I was but a designer on the user experience team. Sure, my code went through all the proper reviews – but I still couldn’t believe it would be allowed, verbatim, on one of Google’s most valuable properties. We toggled the switch at 9am San Francisco time. Within hours, the world once again went wild for Pac-Man. Soon, I watched feedback arrive in torrents too huge for me to ever catch up with. I was asked to do press interviews. I saw Twitter crash. Most importantly, I witnessed reports from all over the world of people playing Pac-Man in all sorts of circumstances, on all sorts of devices (HTML!). And indeed, we got a few reports of the “there is a really scary sound coming out of my computer” variety. But they didn’t come through the channels we expected. And when we suggested “the quick workaround is just to close the tab with Pac-Man,” invariably the answer would be: “What Pac-Man?” This is what we figured out over the next frantic few hours. Some people using the then-ultrapopular Firefox installed an extension called CoolPreviews, which allowed them to quickly preview pages by hovering over links. The extension would quietly start at the same time Firefox was opened. And it would immediately, in the background, invisibly and unbeknownst to the user, open a website. I am not sure if that decision was to prime the cache, or whether it was just a forgotten placeholder. That website was Google’s homepage. You probably already know what happened. On that particular Friday, google.com had an auto-playable Pac-Man doodle with the sound on. If you used Firefox with CoolPreviews installed, the plugin would quietly open Google’s homepage in the background whenever you launched the browser, and 10 seconds later… Imagine this for a second. You sit down Friday morning and power up your computer. For you, there’s nothing unusual about this Friday. You don’t have to use, or even know about Google. You might not know what browser you use — or what a browser is. As a matter of fact, you might not even be using your browser; perhaps it has been minimized and sits unobtrusively in the toolbar at the bottom of your screen. You might not know about CoolPreviews, or even the concept of plugins or extensions. Perhaps you’re just checking your mail or warming up for today’s first round of Solitaire. Then, out of a sudden, out of your speakers comes blasting a siren of an invisible Pac-Man game having infiltrated your computer in the most unusual manner. I know Google feels different now, 16 years after this story took place. I know we are all tired of websites that autoplay sound and that decision we’ve made feels uncomfortably close to “growth hacking.” But the story takes place in that slightly more naïve era of 2010. I pushed a patch within hours. It ended up being the same solution many browsers do by default today – we added a visible mute button, and you now had to first touch the game in some way (a keystroke, a click, multitouch, or the Insert Coin button) for the sound to activate. Since CoolPreviews didn’t do that, it fixed the “possessed computer” problem. Ironically, I don’t believe we ever heard of normal people being bothered by the autoplay – it seemed that indeed, few people stayed on the homepage for 10 seconds doing absolutely nothing. The funny thing is that emergency live-patching internet’s at the time most valuable homepage was perhaps the scariest part of that day for me, but that completely went over my sleep-deprived head. And eventually, my job title changed. How close it felt to a “software engineer” is up to you to decide: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/pac-mans-siren-call/5.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/pac-mans-siren-call/5.1600w.avif" type="image/avif"> (I wrote a story with the same title in 2015, but it got mangled online, and I’m unhappy with the writing now – so this is basically a complete rewrite of that essay. You can still play Google Pac-Man doodle , with the sound now reimplemented sans Flash.)

0 views
Unsung Yesterday

“This wasn’t a thoughtfully designed menu.”

(It’s the last day of Halloween Week on Unsung, where we’re sharing scary, spooky, and creepy stories.) On the morning of January 13, 2018, residents and tourists in Hawaii saw a frightening message on their phone screens: = 3x)" srcset="https://unsung.aresluna.org/_media/this-wasnt-a-thoughtfully-designed-menu/1-framed.1600w.avif" type="image/avif"> In addition to being sent to 1.4 million people, a version of the alert also interrupted local TV and radio programs. Quickly, the officials realized that something went wrong and seeked to undo what ended up being a false alarm. The siren warning system that would normally follow wasn’t activated, and various channels were used to inform people to ignore the alarming message – however, a second phone alert to follow the original one wasn’t sent out for 38 more minutes: = 3x)" srcset="https://unsung.aresluna.org/_media/this-wasnt-a-thoughtfully-designed-menu/2-framed.1600w.avif" type="image/avif"> In the meantime, many Hawaii residents sought shelter, flooded 911 lines, and called their families to say good-bye. What was the reason for the mistake? Industry veteran Jared Spool wrote a post explaining it in detail . We are not 100% sure, but the interface to deploy alerts likely looked like these two examples: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/this-wasnt-a-thoughtfully-designed-menu/3.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/this-wasnt-a-thoughtfully-designed-menu/3.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/this-wasnt-a-thoughtfully-designed-menu/4.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/this-wasnt-a-thoughtfully-designed-menu/4.1600w.avif" type="image/avif"> First, it seems like it was too easy to send a message that wasn’t a test. There was no friction for the consequence this heavy – not even a dialog box to click through, let alone something that more deliberately slows the user down, perhaps even spelling out the consequences (“you are about to send an all-caps message to 1.4 million people”), and generally feeling heavier and more cumbersome to complete than drills or local messages normally sent out. But the true root of the problem happened earlier than that. Spool: This wasn’t a thoughtfully designed menu, any more than any random collection of user-named objects are. In the menu, it wasn’t just that the ordering felt completely random and the capitalization and labelling inconsistent, so neither could be used to help guide the user (for example, by putting drills above real messages, or by using all caps only for most serious, non-test commands). It was also the fact that and were really hard to distinguish from one another. In the end, it wasn’t just about stress and panic that engulfed the Hawaii islands for a better part of a morning hour. It was also about undermining the trust in the entire system, as any “text message that cried wolf” will see people become desensitized, or even opt out . = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/this-wasnt-a-thoughtfully-designed-menu/5.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/this-wasnt-a-thoughtfully-designed-menu/5.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/this-wasnt-a-thoughtfully-designed-menu/6.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/this-wasnt-a-thoughtfully-designed-menu/6.1600w.avif" type="image/avif"> You might never be tasked with creating an interface to do this kind of stuff, but there are some universal lessons in here about information architecture, labelling, and friction. At some point when I was at Medium, I fought with this kind of a thing, where three similar words to popular destinations appeared in the menu right next to each other: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/this-wasnt-a-thoughtfully-designed-menu/7.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/this-wasnt-a-thoughtfully-designed-menu/7.1600w.avif" type="image/avif"> And today, the general industry flattening of visual style leads to an occasional conflation like this one : = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/this-wasnt-a-thoughtfully-designed-menu/8.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/this-wasnt-a-thoughtfully-designed-menu/8.1600w.avif" type="image/avif"> The consequences of this design doppelganging won’t be nearly as severe as in Hawaii, but if you’ve read Unsung even for just a bit, you will know what is my general point of view on this: we are better equipped to understand big events like the one in 2018, but it’s harder to see and impossible to tally up the frustrations of everyday small confusions and paper cuts adding up over the years.

0 views

Animals

“Dad was the first to say, ‘Something is killing animals.’ He was the first to say, ‘It could be that we’re the carriers. We’re the ones making them sick.’ He was the first to say, ‘Something is bringing them back.’” Teddy is fifty when he decides to tell the story of his childhood, both the terror and the grief and the brief moments of astonishing, incredible intermingling, as a pandemic rewrites animal and human DNA and gives children a glimpse of what might have been, just as it’s been forever lost. Part plague tale, part zombie lore, Animals is a story of what happens when humans wreck the animal kingdom and the animals fight back. View this post on the web , reply via email , or become a supporter .

0 views
Unsung 2 days ago

“In the middle of the game, slowly and surely wiggle the cartridge.”

(It’s the last day of Halloween Week on Unsung, where we’re sharing scary, spooky, and creepy stories.) Blowing onto a cartridge before inserting it into a game console has been a longstanding source of debate. It’s an image so iconic it could be juxtaposed with a pencil next to a cassette tape, or holding the TV aerial for better reception – yet modern understanding of the issue is that it actually makes things worse, as bits of your saliva on contacts make them corrode over time. But what if you ventured out to do the opposite? What if you wanted to intentionally mess up with the cartridge connection and see what happens? Well, this is apparently called cartridge tilting , and is a curious pastime: Cartridge tilting is not a glitch, but rather the process which creates glitches. This can only be done on any NES, SNES, Nintendo 64, Leapfrog LeapPad, Sega Genesis/​Mega Drive, Sega Master System, or Game Boy series console. Most other consoles either use CDs/​DVDs, or the design of the system doesn’t allow for cartridge tilting, and thus cannot perform these glitches. In the middle of the game, slowly and surely wiggle the cartridge and move it from side to side. If you do it too slow, nothing will happen, and doing it too fast will disconnect the game. Eventually, the cartridge will enter a state where it’s not fully connected to the console but not completely disconnected. Thus, enough information from the cartridge is blocked to glitch up the game, but not enough to make it freeze, crash, or otherwise error out. The page above lists a bunch of examples and there are tons of videos on YouTube. I’ll let you find them if you want, but I want to show you the most famous one. This is the regular opening of 1997’s GoldenEye game for Nintendo 64: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/in-the-middle-of-the-game-slowly-and-surely-wiggle-the-cartridge/yt1-play.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/in-the-middle-of-the-game-slowly-and-surely-wiggle-the-cartridge/yt1-play.1600w.avif" type="image/avif"> And this is what happens when you wiggle a cartridge as it’s playing . This results in music being garbled, and as for the visuals – well, see for yourself: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/in-the-middle-of-the-game-slowly-and-surely-wiggle-the-cartridge/yt2-play.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/in-the-middle-of-the-game-slowly-and-surely-wiggle-the-cartridge/yt2-play.1600w.avif" type="image/avif"> For some reason I find this so, so funny. Knowing everything you know about how games work, you definitely would not expect this to happen. Somehow, this glitch (which became a meme ) has a positively analogue quality : Doing this can cause some games to corrupt or erase their save data. Doing this can ruin your cartridge and possibly damage hardware. Doing this can freeze, hang (permanently freeze), or crash your game. This will also glitch your sounds and can even be loud. Doing this also can cause short circuits.

0 views
Unsung 2 days ago

“An unnamed arcade in some sleepy suburb of Portland”

(It’s the last day of Halloween Week on Unsung, where we’re sharing scary, spooky, and creepy stories.) A great video about Polybius from Ahoy/​Stuart Brown: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/an-unnamed-arcade-in-some-sleepy-suburb-of-portland/yt1-play.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/an-unnamed-arcade-in-some-sleepy-suburb-of-portland/yt1-play.1600w.avif" type="image/avif"> Polybius was a rumoured rare or secret 1981 arcade game published by Sinneslöschen that was addictive and had adverse effects on its players, causing hallucinations, amnesia, and seizures. In contrast with some of the August 32 videos which sport a certain “we know the authors denied this, but ” posture, this video doesn’t waste time pretending Polybius is anything more than an urban legend. Instead, it goes straight to investigating what happened and who might have started the rumour. It’s a really fun watch – and a really well-made mini-documentary, too – and ends up being a meditation on mythmaking in general.

0 views
Kev Quirk 2 days ago

Discoverability Is Only Solved If You Can Be Discovered

by Widdershins This is a follow up to my post where Widdershins talks about how they agree with certain parts of my argument, but that the discoverability piece is flawed. Read post ➡ Saw this in my RSS feed and thought it was an interesting take that's worth sharing - also Widdershins' blog is excellent. I'd recommend adding it to your feed reader. I think the argument around other people controlling the gate to discoverability is a sound one, generally, but sites like Bubbles tend to add most sites, unless they're somehow obnoxious. So inclusion (and therefore discoverability) is only an email away . Having said that, one person's obnoxious is another person's heaven, so it's all subjective. Either way, it's an interesting debate and I'm glad we're having it. Go check out Widdershins' blog too! Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️ You can reply to this post by email , or leave a comment .

0 views
fLaMEd fury 2 days ago

Open Tabs October 2026

What’s going on, Internet? If you don’t follow my Bookmarks through the feed , then here’s the bookmarks from October. Enjoy. Bit of a theme this month, the old web was messier and more fun, and running a site now keeps getting harder. For more, check out the bookmarks archive, and subscribe to the feeds if you want these as they happen. Hey, thanks for reading this post in your feed reader! Want to chat? Reply by email or add me on XMPP , or send a webmention . Check out the posts archive on the website. Jenny O’Connor on why the embarrassing internet was the good internet . My old fan pages agree. Winnie Lim on why running a personal website is not fun anymore . Rough read. Between AI bots scraping the fuck out of the open web and hackers using AI agents to find holes, no wonder. Aaron’s Early Web Links is a one-person directory of personal homepages, covering all types of personal websites. wulfpaper on why making websites shouldn’t seem so hard . Start with the writing, worry about code and design later. A big alphabetised list of old linkware webset graphics sites . Handy if you’re after that old-school look.

0 views
ava's blog 2 days ago

rose ▪ bud ▪ thorn - october 2026

Bear with Krobus, poor guy doesn't understand the game... Published 31 Oct, 2026 At the moment I have none for days like these, but I would love to have one so I am not bound to the home as much and my wife can at least push me on a walk or to the café, even when that is still exhausting; at least I could experience the outside without having to walk and having to sit down from exhaustion very soon. It would also save me from the barren wasteland that events and conventions usually are for seating. I'm aware that there is still a lot of stigma around using wheelchairs, walking sticks and the like, and there are still ignorant strangers out there who think you are faking it if you can get up from your wheelchair for a minute or so or don't need it literally all the time, but my comfort and mobility is honestly more important to me than the opinions of jackasses. I've wished for a wheelchair like that since I was just about 15 years old, for reference. Half my life. I just don't know where to get a lightweight, affordable, possibly secondhand one yet, because insurance wouldn't pay for that in this case. ↩ I had a great start studying for this semester :) I set up everything on the 4th: Downloaded all materials, signed up for all live sessions, put all dates in the calendar, ordered all books I need, and hit my reading goal all in one day, despite my struggles (aided by medication and lots of support from my wife). I was very consistent with it since! Went hard at the gym when I had painfree times in the middle of the month. Sent a care package filled with coffee, tea, baked cookies, and cat socks to a friend. I finally bought FFXIV and a subscription after spending ~330h in the Free Trial. Treated myself to nice stuff this month and going out more with my wife. I asked a matcha café in the city to please add allergen information to their order terminals and they did! I went to the Spiel convention in Essen. Got a good annual performance review, with lots to look forward to in the next few years, and applied for additional courses paid for by my employer. Learning how to deal with (or entirely avoid) food noise that has plagued me for years. It's going well. Working on a big blog post that still takes me a lot of time... it is draining... Planning a cool project with the Gazette people. The blog has been a bit quiet, but not forgotten. Most of the month, I suffered with extreme exhaustion, fatigue and pain. Sleep was great and plenty, but I was still soooo tired all the time and could barely do or think anything. Dealt with a lotttt of burning pain in my bones, muscle weakness and pain, and under my skin as well as in my hips and lower back; standing was hard. It brought back wishes for a foldable wheelchair 1 . These monthly posts made me realize there is always some short of illness stuff going on, and this month was especially bad, so next month I will switch medication. Goodbye, adalimumab. I made a mistake in my study plans and it affected my entire planning until the exams in March :/ I've been having issues with my main laptop and random restarts and kernel panics... may need to wipe and reinstall. My indoor spin bike broke and we haven't managed to fix it yet :( Time passed super fast. I blinked and it had been weeks between messages, emails, blog posts... I had to prioritize differently this month, but I hope I'm gonna be better next month. At the moment I have none for days like these, but I would love to have one so I am not bound to the home as much and my wife can at least push me on a walk or to the café, even when that is still exhausting; at least I could experience the outside without having to walk and having to sit down from exhaustion very soon. It would also save me from the barren wasteland that events and conventions usually are for seating. I'm aware that there is still a lot of stigma around using wheelchairs, walking sticks and the like, and there are still ignorant strangers out there who think you are faking it if you can get up from your wheelchair for a minute or so or don't need it literally all the time, but my comfort and mobility is honestly more important to me than the opinions of jackasses. I've wished for a wheelchair like that since I was just about 15 years old, for reference. Half my life. I just don't know where to get a lightweight, affordable, possibly secondhand one yet, because insurance wouldn't pay for that in this case. ↩

0 views
Evan Hahn 2 days ago

Notes from October 2026

Happy Halloween! Here’s a little of what I got up to in this spooky month. I moved this site from an Apache-powered VPS to CDN-frontend object storage. This means I pay less money, I do less maintenance, and my site loads faster in most parts of the world. Hopefully nobody noticed this change, except that things should be a little snappier! (Also, my old site had a small amount of PHP, which I’m happy to have removed given PHP’s remote code execution vulnerabilities this month.) In an effort to fill in the gaps of the internet , I published a short list of Vim forks . At Ghost, my team shipped two additions to our automations feature: analytics and more granular triggers . Both of these should help our independent publishers grow. More automations stuff on the way! Like every month, I wrote a few articles at Zelda Dungeon , including a debate over, perhaps, the most trivial disagreement possible . The surveillance state takes another step: pinpointing addresses based on interior photos . Thanks, AI! “How Technology Empowers—and Imperils—Dictators” is a reminder that technologists have a social duty. Two lists of tech fascists: “Fashware” and “Weird little guys of FOSS” . Continued to love David Rosenthal’s blog about the (seemingly unsustainable) economics of AI companies. “Keyboard differences between Windows and Macs” is a deep dive into Control and Command and Copilot keys. Data centers are unpopular, a problem Amazon is trying to spend its way out of . “Programming Isn’t Special” argues that programming is art, and that most art isn’t “mystical”, and that using AI to do art has disadvantages. “If we use AI to erase all the copy-writing, all the graphic design, all the boring mundane art, and yes, all the boring custom WordPress theme development, then we will be removing all the practical opportunities for the vast amounts of practice and contemplation required for people to elevate their craft to eventually achieve great things.” A fun AGENTS.md that says, “All LLM contributions are strictly forbidden.” Part biography, part memoir, part hopeful, part depressing… Why Fish Don’t Exist captivated me this month. I plan to consult The Ultimate List of DRM-free Bookshops next time I buy an ebook. Bookmarked this list of “every weird film ever (with a special emphasis on trash)”. As a lifelong Diddy Kong Racing fan, I felt personally insulted by “Bloke Who Preferred The Thinking Man’s Mario Kart Growing Up Also A Weird Contrarian In Other Aspects Of His Strange Life” . Hope you had a good October. I moved this site from an Apache-powered VPS to CDN-frontend object storage. This means I pay less money, I do less maintenance, and my site loads faster in most parts of the world. Hopefully nobody noticed this change, except that things should be a little snappier! (Also, my old site had a small amount of PHP, which I’m happy to have removed given PHP’s remote code execution vulnerabilities this month.) In an effort to fill in the gaps of the internet , I published a short list of Vim forks . At Ghost, my team shipped two additions to our automations feature: analytics and more granular triggers . Both of these should help our independent publishers grow. More automations stuff on the way! Like every month, I wrote a few articles at Zelda Dungeon , including a debate over, perhaps, the most trivial disagreement possible . The surveillance state takes another step: pinpointing addresses based on interior photos . Thanks, AI! “How Technology Empowers—and Imperils—Dictators” is a reminder that technologists have a social duty. Two lists of tech fascists: “Fashware” and “Weird little guys of FOSS” . Continued to love David Rosenthal’s blog about the (seemingly unsustainable) economics of AI companies. “Keyboard differences between Windows and Macs” is a deep dive into Control and Command and Copilot keys. Data centers are unpopular, a problem Amazon is trying to spend its way out of . “Programming Isn’t Special” argues that programming is art, and that most art isn’t “mystical”, and that using AI to do art has disadvantages. “If we use AI to erase all the copy-writing, all the graphic design, all the boring mundane art, and yes, all the boring custom WordPress theme development, then we will be removing all the practical opportunities for the vast amounts of practice and contemplation required for people to elevate their craft to eventually achieve great things.” A fun AGENTS.md that says, “All LLM contributions are strictly forbidden.” Part biography, part memoir, part hopeful, part depressing… Why Fish Don’t Exist captivated me this month. I plan to consult The Ultimate List of DRM-free Bookshops next time I buy an ebook. Bookmarked this list of “every weird film ever (with a special emphasis on trash)”. As a lifelong Diddy Kong Racing fan, I felt personally insulted by “Bloke Who Preferred The Thinking Man’s Mario Kart Growing Up Also A Weird Contrarian In Other Aspects Of His Strange Life” .

0 views
Ratfactor 2 days ago

Inktober 2026

Just finished Inktober 2026. Thought I should post it to my website. (I'm not sure why I don't post more art to my website?) Happy with a fair number of the drawings this month, especially the ones towards the end...

0 views