Shellsharks Blogroll - BlogFlock2026-06-23T14:35:30.270ZBlogFlockAdepts of 0xCC, destructured, Aaron Parecki, Trail of Bits Blog, fLaMEd, Westenberg, James' Coffee Blog, gynvael.coldwind//vx.log (pl), joelchrono, Evan Boehs, cool-as-heck, Kev Quirk, Posts feed, Sophie Koonin, cmdr-nova@internet:~$, <span>Songs</span> on the Security of Networks, Werd I/O, Johnny.Decimal, Robb Knight, Molly White, Hey, it's Jason!, Terence Eden’s Blog📝 2026-06-23 12:58: Create one of those Uses pages. Still a work in progress, but there's a good... - Kev Quirkhttps://kevquirk.com/2026-06-23-12582026-06-23T11:58:00.000Z<p>Create one of those Uses pages. Still a work in progress, but there's a good chunk of the stuff I use on there now.</p>
<p><a href="https://kevquirk.com/uses">https://kevquirk.com/uses</a></p> <div class="email-hidden">
<hr />
<p>Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️</p>
<p>You can <a href="mailto:19gy@qrk.one?subject=%F0%9F%93%9D%202026-06-23%2012%3A58">reply to this post by email</a>, or <a href="https://kevquirk.com/2026-06-23-1258#comments">leave a comment</a>.</p>
</div>Wonders of Web Weaving, Episode 7 - James' Coffee Bloghttps://jamesg.blog/2026/06/23/wonders-of-web-weaving-episode-72026-06-23T00:00:00.000Z
<p><a href="https://web-weaving.jamesg.blog/7" rel="noreferrer">The seventh episode of Wonders of Web Weaving is out</a>:</p><blockquote>In Episode 7, I chat with <a href="https://ohhelloana.blog" rel="noreferrer">Ana</a>, the author of <a href="https://ohhelloana.blog" rel="noreferrer">ohhelloana.blog</a>. We talk about, among other things, the growth we see in our websites over time, finding an in-person indie web community, and connecting with people using personal websites.</blockquote><p>I hope you enjoy the episode!</p><p><a href="https://web-weaving.jamesg.blog/subscribe/" rel="noreferrer"><em>Wonders of Web Weaving has an RSS feed</em></a><em> you can use to follow along from wherever you get your podcasts.</em></p><script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a101c07d098af0a2',t:'MTc4MjE5OTQ1NA=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
<a class="tag" href="https://ohhelloana.blog">Ana</a>
<a class="tag" href="https://ohhelloana.blog">ohhelloana.blog</a>
<a class="tag" href="https://web-weaving.jamesg.blog/7">The seventh episode of Wonders of Web Weaving is out</a>
<a class="tag" href="https://web-weaving.jamesg.blog/subscribe/">Wonders of Web Weaving has an RSS feed</a>
Introducing Patch the Planet - Trail of Bits Bloghttps://blog.trailofbits.com/2026/06/22/introducing-patch-the-planet/2026-06-22T16:50:00.000Z<p>What happens when you clear dozens of Trail of Bits engineers’ schedules, pair them with every open-source maintainer they can contact, and unleash the latest frontier models like GPT-5.5-Cyber on critical open-source targets? Thanks to <a href="https://openai.com/index/daybreak-securing-the-world/">our partnership with OpenAI</a> and its Daybreak initiative, <a href="https://gist.github.com/patch-the-planet/69fd1aa925c8e73edea9e6e967043cbb">we can report</a> that the impact is hundreds of discovered bugs, 64 pull requests, and 51 issues filed across 19 projects (with many more still undergoing coordinated disclosure). That was just the first week of <a href="https://trailofbits.com/patch-the-planet">Patch the Planet</a>.</p>
<p>Frontier models like GPT-5.5-Cyber are producing a firehose of security findings, and already-stretched maintainers must sift through all of it to separate real vulnerabilities from plausible-sounding false positives. Patch the Planet is different: with our experts orchestrating and triaging findings, we handle the work of fixing and hardening the code alongside the people who maintain it.</p>
<p>The first week of Patch the Planet covered 19 projects across cryptography, networking, language infrastructure, and software supply chain. Among these 19 projects were cURL, NATS, pyca, Sigstore, aiohttp, the Go project, freenginx, Python and python.org, urllib3, PyPI, SimpleX, Valkey, and RustCrypto. Over 30 projects have joined the initiative so far, and we’re rapidly expanding it to include more; if you maintain an open-source project, <a href="https://trailofbits.com/patch-the-planet">apply to join</a>!</p>
<p>
<figure>
<img src="https://blog.trailofbits.com/2026/06/22/introducing-patch-the-planet/ptp-image-1.gif"
alt="&ldquo;Live look at the Trail of Bits engineering teams&rdquo;"
width="500"
height="221"
loading="lazy"
decoding="async" />
<figcaption>Live look at the Trail of Bits engineering teams</figcaption>
</figure>
</p>
<p>Anyone can file an issue, flex, and walk away. We showed up with the patches: 37 are already merged, and many more are in flight. These merges go beyond just fixing bugs: we’re adding new tests and fuzzing harnesses, CI security scanning, supply-chain tooling, correctness fixes, and features maintainers had been meaning to get to. The goal of Patch the Planet is to leave essential open-source projects measurably better off.</p>
<h2 id="we-brought-patches-not-just-bug-reports">We brought patches, not just bug reports</h2>
<p>We’re reporting public findings <a href="https://gist.github.com/patch-the-planet/69fd1aa925c8e73edea9e6e967043cbb">on GitHub</a>, including 64 total pull requests. We also filed 51 issues, 19 of which are already closed with a fix. This public tally undercounts the work, since several projects take reports through private channels like HackerOne, GitHub security advisories, mailing lists, and private forks, and most of these have not been released publicly yet.</p>
<p>What&rsquo;s in those pull requests matters more than the count. At python.org, we added a CI workflow built on <a href="https://github.com/zizmorcore/zizmor">zizmor</a>, our open-source GitHub Actions auditor, fixed all of the issues it flagged, and integrated it into their CI. In RustCrypto, we contributed correctness fixes to the big-integer library that higher-level cryptography is built on, alongside genuine feature work in review: serde encoding support and HPKE DHKEM suite IDs. Other patches were plain engineering help: storage-accounting and service-restart fixes in SimpleX, a clearer admin-quarantine confirmation in PyPI&rsquo;s Warehouse, and supply-chain improvements like SBOM sidecars for Python&rsquo;s Windows artifacts. We will also be upstreaming many testing improvements and new testing campaigns. Arguably, our best contributions are not even bug or security fixes.</p>
<p>Keeping track of all of this is a bot we call Patchy. Patchy monitors every project, posts each new finding and merged patch to our Slack, and, for reasons we consider scientifically sound, reintroduces the common use of <a href="https://openai.com/index/where-the-goblins-came-from/">goblins, gremlins, and assorted creatures</a>. Here&rsquo;s Patchy&rsquo;s description of <a href="https://github.com/pyca/cryptography/pull/14933">an issue that has been patched</a>:</p>
<p>
<figure>
<img src="https://blog.trailofbits.com/2026/06/22/introducing-patch-the-planet/ptp-image-2_hu_d772e23377508832.webp"
alt="&ldquo;Patchy’s description of an issue that has been patched&rdquo;"
width="1200"
height="329"
loading="lazy"
decoding="async" />
<figcaption>Patchy’s description of an issue that has been patched</figcaption>
</figure>
</p>
<p>When a patch lands, Patchy celebrates with a triumphant <code>PATCHY HAPPY</code>. Making Patchy happy is really what drives us.</p>
<p>
<figure>
<img src="https://blog.trailofbits.com/2026/06/22/introducing-patch-the-planet/ptp-image-3_hu_5af72ac2534386fd.webp"
alt="&ldquo;Bug patched, Patchy happy&rdquo;"
width="1200"
height="185"
loading="lazy"
decoding="async" />
<figcaption>Bug patched, Patchy happy</figcaption>
</figure>
</p>
<h2 id="a-few-highlights-from-the-week">A few highlights from the week</h2>
<p>The week produced more than we can fit in this post, but here are some quick highlights.</p>
<p><strong>A fuzzing lab built in a day.</strong> Given a narrow goal (find remotely exploitable bugs) and no instructions on how, GPT-5.5-Cyber decided that reading the source of one of the most-reviewed C libraries in existence was a poor use of tokens. Instead, it stood up a full fuzzing lab in under a day: sanitizer and variant builds, a seed corpus drawn from existing tests, and harnesses across a dozen entry points. Instead of simply fuzzing exposed APIs, it successfully built a harness that injected operating system backpressure to identify novel issues by reaching previously unexplored buggy states. We estimate all of that effort likely would’ve taken one of our fuzzing experts two to three weeks to do manually. Just as important, it showed judgment about what to test, what to report (and not report), and where to find higher-impact findings. We&rsquo;ll publish the full details in a standalone field report.</p>
<p><strong>A pipeline for variant testing historical CVEs built in a day</strong>. Codex was also adept at building simple but effective pipelines, such as the CVE variant analysis pipeline shown below. Codex’s <code>/goal</code> feature combined with frontier models like GPT-5.5-Cyber for this type of variant analysis produced novel issues with almost exclusively high-signal output.</p>
<p>
<figure>
<img src="https://blog.trailofbits.com/2026/06/22/introducing-patch-the-planet/ptp-image-4_hu_a106c2e464121abc.webp"
alt="&ldquo;Pipeline for historical CVE variant analysis&rdquo;"
width="1200"
height="617"
loading="lazy"
decoding="async" />
<figcaption>Pipeline for historical CVE variant analysis</figcaption>
</figure>
</p>
<p><strong>A release-pipeline improvement at python.org.</strong> We reported multiple security issues for <a href="http://python.org">python.org</a>, including some issues closing a legacy-API authorization gap. But we’re most proud of the work that produced long-term improvements to python.org&rsquo;s release infrastructure: the new zizmor CI scanning, tightened release-file and metadata validation, deletion scoping fixed so bulk operations can&rsquo;t reach beyond their target, and release-tooling patches in review that quote remote command arguments, fail safely on partial uploads, and add SBOM sidecars.</p>
<p><strong>The aiohttp maintainers fixed their issues almost immediately.</strong> We privately reported a cluster of issues across aiohttp&rsquo;s client and server paths, including cookies that could regain broader scope after a save and reload, digest credentials that could answer a challenge from the wrong origin, and resource limits that ran after attacker-controlled buffering rather than before. The maintainers authored and merged all eight fixes within hours, seven of them inside a single five-hour window. We were impressed and appreciate the maintainers’ prompt and collaborative work on these issues!</p>
<p><strong>Differentially testing major cryptographic libraries against each other.</strong> Many of our projects implement the same logic, protocols, and algorithms. In particular, multiple projects implement the same cryptographic algorithms and standards like X.509 certificates. Therefore, we used Codex to point these projects at each other, and identify any relevant behavioral differences. This proved to be a high-signal approach that uncovered several issues, including <a href="https://github.com/pyca/cryptography/pull/14933">this AES-GCM issue in PyCA</a> and several X.509 issues, which we plan to upstream to <a href="https://x509-limbo.com/"><code>x509-limbo</code></a>.</p>
<h2 id="finding-the-bugs-is-now-the-easy-part">Finding the bugs is now the easy part</h2>
<p>If it wasn’t already clear from the last several months of security news, this week makes one thing clear: the expensive part of security work has moved. Arming Codex with fuzzing campaigns, variant analysis, differential testing, agentic searching, and similar techniques produces real vulnerabilities and compresses weeks or months of manual effort into hours. The advantage is no longer in finding bugs, but everything after: confirming a finding, getting its severity right, writing a patch a maintainer will accept, hardening the surrounding code, making long-term improvements to prevent similar issues in the future, and coordinating a disclosure. That is the work that floods of AI-generated reports threaten to bury.</p>
<h2 id="guidance-for-maintainers">Guidance for maintainers</h2>
<p>If you’re a maintainer managing an unsustainable number of AI-generated bug reports, the core challenges you need to solve are deduplication, false-positive filtering, and severity correction.</p>
<p>Deduplication is the easiest problem to solve technically. Even simple AI-based tools that compare new reports against open issues perform well, especially when grounded in affected code lines. Automating this step eliminates most of the noise.</p>
<p>False-positive filtering and severity correction are harder, but they can be managed. Without explicit guidance, models default to rating everything as critical.</p>
<p>
<figure>
<img src="https://blog.trailofbits.com/2026/06/22/introducing-patch-the-planet/ptp-image-5_hu_1b13148a17364cf7.webp"
alt="&ldquo;Patchy without threat model and severity guidance&rdquo;"
width="1200"
height="1019"
loading="lazy"
decoding="async" />
<figcaption>Patchy without threat model and severity guidance</figcaption>
</figure>
</p>
<p>Generic approaches like our <a href="https://github.com/trailofbits/skills/tree/main/plugins/fp-check">fp-check</a> tool help, but only to a point. The best improvements require project-specific documentation, threat models, and severity criteria. <a href="https://cryptography.io/en/latest/security/">PyCA&rsquo;s security documentation</a>, for example, was dramatically effective at reducing false positives in our bug candidates. Files like <code>AGENTS.md</code> that explicitly tell models which documentation to consult produced the most consistent and effective results. If security researchers are armed with this documentation, especially <a href="http://AGENTS.md"><code>AGENTS.md</code></a> for AI-based research, more noise will be filtered out before reaching the maintainers.</p>
<h2 id="whats-next-and-how-to-get-involved">What&rsquo;s next and how to get involved</h2>
<p>This was just our first week. Over 30 projects have committed to join Patch the Planet, with a growing waitlist. As more findings clear coordinated disclosure, we&rsquo;ll publish more results and deeper field reports, including full fuzzing lab details, the variant-analysis and differential-testing pipelines, and the tooling we&rsquo;re building to help maintainers triage AI-generated reports themselves. Our <a href="https://gist.github.com/patch-the-planet/69fd1aa925c8e73edea9e6e967043cbb">Patch the Planet gist</a> contains the full public list of our week one output.</p>
<p>
<figure>
<img src="https://blog.trailofbits.com/2026/06/22/introducing-patch-the-planet/ptp-image-6.gif"
alt="&ldquo;Join Patch the Planet and spread the word&rdquo;"
width="480"
height="207"
loading="lazy"
decoding="async" />
<figcaption>Join Patch the Planet and spread the word</figcaption>
</figure>
</p>
<p>If you maintain a critical open-source project and want this kind of help, you can <a href="https://trailofbits.com/patch-the-planet">apply to join Patch the Planet</a>.</p>Cybersecurity for the paranoid business traveller - Terence Eden’s Bloghttps://shkspr.mobi/blog/?p=644192026-06-22T11:34:18.000Z<p>Over the years, I've worked for organisations with various levels of risk tolerance for business travellers. Some have been (rightly) paranoid and others have been (wrongly) placid about the threats their employees face.</p>
<p>The fact is, individuals are often targeted for espionage, blackmail, or other state-sponsored attacks.</p>
<p>Here's a list of some of the different advice I've received, roughly sorted into levels of suitability. Start at the top and work your way down until you reach a suitable level.</p>
<h2 id="usb-sticks-no-thanks"><a href="https://shkspr.mobi/blog/2026/06/cybersecurity-for-the-paranoid-business-traveller/#usb-sticks-no-thanks">USB sticks? No thanks!</a></h2>
<p>At some point, you'll be given a gift of a decorative USB pen drive. It'll either be part of a goodie-bag or you'll be told it has all of this quarter's TPS reports on it.</p>
<p>You should thank them for their kind gift. On your way back to the hotel, drop the stick in a bin.</p>
<p>There's just too much which can go wrong with a USB stick. Maybe it has a virus. Maybe it is an exfiltration device. Maybe it has extreme pornography and the police will catch you with it. Just chuck it. If anyone asks, say you couldn't get it to work and can they please email you the information.</p>
<h2 id="usb-power-play-it-safe"><a href="https://shkspr.mobi/blog/2026/06/cybersecurity-for-the-paranoid-business-traveller/#usb-power-play-it-safe">USB Power? Play it safe!</a></h2>
<p>USB powers everything from your phone and laptop, to your headphone and eReader. But USB cables also carry data. Some devices can be silently hacked by plugging them in to a dodgy power port.</p>
<p>Is it <em>likely</em> that the USB socket on the airport bus has been set up to exfiltrate travellers' data? Probably not - but why take the risk?</p>
<p>The best thing you can do is to always charge from your own device. Get a travel charger or, ideally, a portable battery and <em>only</em> use that for charging.</p>
<p>For extra paranoia, you can buy USB condoms and charging-only cables - but they tend to be slower at charging.</p>
<h2 id="reduce-your-app-attack-surface"><a href="https://shkspr.mobi/blog/2026/06/cybersecurity-for-the-paranoid-business-traveller/#reduce-your-app-attack-surface">Reduce Your App Attack Surface</a></h2>
<p>Do you <em>need</em> all those apps on your phone? Will you cope without your banking apps, dating apps, streaming apps? Each one is a potential vector for abuse.</p>
<p>Is it legal for you to date your preferred romantic partner in your intended destination? You shouldn't have to hide yourself, but having an illegal app on your phone is a great way to get picked up by the police.</p>
<p>Go through your phone and uninstall anything which isn't important to the trip.</p>
<h2 id="a-vpn-probably-draws-more-attention-than-it-is-worth-but-browse-cautiously"><a href="https://shkspr.mobi/blog/2026/06/cybersecurity-for-the-paranoid-business-traveller/#a-vpn-probably-draws-more-attention-than-it-is-worth-but-browse-cautiously">A VPN probably draws more attention than it is worth, but browse cautiously</a></h2>
<p>This is slightly counter-intuitive. Every important site on the web uses HTTPS. The really important ones <a href="https://hstspreload.org/">are on a special list</a> which means your browser will <em>only</em> use a secure connection. The chances of your data being intercepted is minimal.</p>
<p>But using a VPN immediately makes your traffic look suspicious and, in some countries, may be illegal.</p>
<p>That said, while the contents of your communications will be private, their destination is easy to figure out. Don't browse pornography or any other site which is liable to get you in trouble. This may include news sites from outside the country.</p>
<h2 id="what-passwords-do-you-need"><a href="https://shkspr.mobi/blog/2026/06/cybersecurity-for-the-paranoid-business-traveller/#what-passwords-do-you-need">What passwords do you need?</a></h2>
<p>Hopefully you use a password manager - and hopefully all your passwords are unique. But do you really need to carry around <em>all</em> of them? You password manager almost certainly allows you to create a sub-account into which you can deposit anything you need for your trip.</p>
<p>Similarly, you don't need <em>all</em> your MFA codes with you. If you <em>do</em> need MFA please make sure it isn't coming through SMS.</p>
<h2 id="theyre-not-flirting-with-you"><a href="https://shkspr.mobi/blog/2026/06/cybersecurity-for-the-paranoid-business-traveller/#theyre-not-flirting-with-you">They're not flirting with you.</a></h2>
<p>Mate, you're a middle-aged sales rep who scored a trip to a conference in an exotic country. Do you <em>really</em> think that pretty young thing is enthralled by your tales of middle-management?</p>
<p>No.</p>
<p>At best, the photos will be used to blackmail you. At worst the police will claim that they're under the age of consent and <em>that</em> will be used to blackmail you.</p>
<h2 id="laptops-and-liability"><a href="https://shkspr.mobi/blog/2026/06/cybersecurity-for-the-paranoid-business-traveller/#laptops-and-liability">Laptops and Liability</a></h2>
<p>Your IT team has provided you with a laptop which is encrypted and biometricly secured, right? But do you need that <em>specific</em> laptop?</p>
<p>Grab a cheap laptop. Fill it with only the documents you need. When you get back home, toss it.</p>
<p>I'm quite serious, a £200 Chromebook is a cheap price to pay to prevent your secrets getting stolen or your network being infiltrated.</p>
<h2 id="what-else"><a href="https://shkspr.mobi/blog/2026/06/cybersecurity-for-the-paranoid-business-traveller/#what-else">What Else?</a></h2>
<p>Possibly you think some of these are overkill. Perhaps you think I'm not being paranoid enough. What would you add to the list?</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=64419&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">Over/Under Interview - Robb Knight • Posts • Atom Feedhttps://rknight.me/blog/over-under-interview/2026-06-22T09:55:58.000Z<p><strong>Avengers</strong></p>
<p>The movies, overrated with the exception of Infinity War/Endgame which was some of the best movie experiences I've ever had.</p>
<p>The comics, underrated. The stories from the comics is where it's at but it's not a medium that everyone can enjoy. There are so many great Avengers and Avengers-adjacent stories available if you're willing to give it a try. My recommendation is <a href="https://www.marvel.com/comics/series/25575/west_coast_avengers_2018_2019">Kelly Thompson's West Coast Avengers run</a>.</p>
<p><strong>Weeknotes</strong></p>
<p>Underrated. I <em>love</em> reading people's weeknotes and I've found it a useful tool to get out random thoughts I've had as well as share fun things I've seen online that week. The pressure to do them every week though, massively overrated. You don't need to do that to yourself, post when you want.</p>
<p><strong>Stickers</strong></p>
<p>Underrated. What a fun item stickers are but you've <em>got to use them</em>. Stick them on anything. Maybe <a href="https://maique.eu/tag/stickerSpotter">Maique will spot one you stuck somewhere</a>. I love stickers.</p>
<p><strong>BuJo</strong></p>
<p>This is a tough one. Bullet Journal the <em>brand</em>? Overrated. Intentionally or not, one look at the website shows that it exists now to sell courses, books, and other related services.</p>
<p>Bullet Journal the <em>system</em> on the other hand has a lot of good ideas. I don't do all of them, nor do I follow it strictly but the things I did take from the (the bullet system itself, migrating tasks, monthly spreads) have been massively helpful. Slightly underrated if only because the website no longer reflects the system and rather serves as the business side.</p>
<p><strong>Tacos</strong></p>
<p>Underrated. I'm in the UK where we have a troubling lack of mexican-inspired food available but whats not to love? Meat, sauce, taco shell, lettuce, it's got it all.</p>
<p><strong>What are the two best books you couldn't live without and that you recommend?</strong></p>
<p><a href="https://en.wikipedia.org/wiki/How_to_Lie_with_Statistics">How to Lie with Statistics</a>. I read this when I was 17 or so and it blew my mind the way you can present data in different ways to elicit different reactions or prove your point. Fair warning this was written in 1954 so some of the language would not be appropriate in 2025, but the ideas are solid.</p>
<p><a href="https://en.wikipedia.org/wiki/So_You%27ve_Been_Publicly_Shamed">So You've Been Publicly Shamed</a>. This one serves have a warning both about what one might post online, as well as how wild online mobs can get.</p>People and Blogs Interview - Robb Knight • Posts • Atom Feedhttps://rknight.me/blog/people-and-blogs-interview/2026-06-22T09:48:50.000Z<p><strong>Let's start from the basics: can you introduce yourself?</strong></p>
<p>I'm a developer and dad to two girls living in Portsmouth on the south coast of the UK. By day I work for a SaaS company and in my own time I work on my <a href="https://rknight.me/projects">many side projects</a>. In a previous life I worked at a certain clown's restaurant which is where I met my wife some 15 years ago.</p>
<p>Although developer is what I get paid to do I'm trying to move towards more <em>making</em>; websites, <a href="https://rknight.me/blog/stickers-maths-and-postage/">stickers</a>, shirts, art, whatever. I have no idea what that looks like yet or how it's going to pay my bills. I have a whole host of <a href="https://rknight.me/projects">side projects</a> I've worked on over the years; they're not all winners but they all serve, or served, a purpose. If I get lucky, they resonate with other people which is always nice.</p>
<p><strong>What's the story behind your blog?</strong></p>
<p>I've had a lot of blogs over the years, most of which would get a handful of posts before being abandoned. There was a version that ran on Tumblr which I did do for at least a year or two — any interesting posts from that have been saved. The current iteration is by far the longest serving and will be the final version. There's no chance of me wiping it all and starting again.</p>
<p>This current version is part of my main website which is where I put <em>everything</em>. My toots on Mastodon start life as a <a href="https://rknight.me/notes">note post</a>, I post <a href="https://rknight.me/links/">interesting links I find</a>, and I log all the media I watch/play/whatever (I don't want to say consume, that's gross) in <a href="https://rknight.me/almanac/">Almanac</a>, which itself is on the third or fourth iteration.</p>
<p>As I said above, I had done a few posts on the Tumblr-powered blog but if I look at my stats for posts, it was around 2022 when Twitter started to fall apart that I started to blog more. I was moving away from posting things directly onto social media sites and getting it onto my own site.</p>
<p>I started writing more posts that just had a short idea or helpful tip because I realised not every post has to be some incredible think piece. My analytics show that these posts also tend to be the most popular which probably says more about the state of large, ad-riddled websites than it does about my writing. For example <a href="https://rknight.me/blog/convert-spotify-facebook-to-email-login/">this post about disconnecting Facebook from Spotify</a> is consistently in the top five posts on my site but you're never going to read that post unless you specifically need it. It's not a "good" post, it just exists.</p>
<p><strong>What does your creative process look like when it comes to blogging?</strong></p>
<p>To call what I have a process would be a very liberal use of the word "process". If I have nothing to write about I just won't write anything, I have no desire to keep to a schedule and write just for the sake of it. Usually, I'll get prompted by something someone asks like "How did you do X on your website?" or I feel like I have something to say that would be interesting other people.</p>
<p>I write my posts in Obsidian, then when they're ready to go I'll add them to my site. If I'm on my <s>proper computer</s> laptop I use <a href="https://rknight.me/blog/my-blogging-workflow/">my CLI tool</a> to add a new post. If I'm on mobile, I use the very <a href="https://github.com/rknightuk/knightcms">haphazard CMS</a> I built.</p>
<p>I'll proof read most things myself before posting and I rarely ask for anyone else's input but if I do want a second opinion it's going to be previous <a href="https://manuelmoreale.com/interview/keenan">P&B interviewee</a>, <a href="https://gkeenan.co">Keenan</a>. Usually I'm able to get out what I want to say fairly succinctly without too much editing.</p>
<p><strong>Do you have an ideal creative environment? Also do you believe the physical space influences your creativity?</strong></p>
<p>A proper keyboard and ideally a desk to sit at is what I prefer when I'm writing (or coding) but I can live with just the keyboard. My desk setup makes some people's skin crawl because there's so much going on but I like having all the trinkets and knick knacks around me.</p>
<figure><img src="https://cdn.rknight.me/site/desk-2025.jpg" alt="A desk surrounded by bookshelves and pegboard with various items hanging from them" /></figure>
<p>I deeply dislike using my phone for most things outside of scrolling lists, like social media so I rarely write long posts on it. The small form factor just doesn't work for me at all but I also kind of need it to exist in the world.</p>
<p><strong>A question for the techie readers: can you run us through your tech stack?</strong></p>
<p>All my domains are registered with <a href="https://porkbun.com">Porkbun</a> and I manage the DNS with <a href="https://dnscontrol.org/">DNSControl</a> - my main domain, <a href="http://rknight.me">rknight.me</a>, has nearly 50 records for subdomains so managing those without DNSControl would not be a fun activity. Speaking of DNS I use <a href="https://bunny.net">Bunny</a> for my DNS management and also use their CDN for images and other files I need to host.</p>
<p>The website itself is, as are many of my side projects, built with <a href="https://www.11ty.dev">Eleventy</a>. Eleventy gives me the flexibility to do some interesting things with the posts and other content on my site which would be much harder with some other systems.</p>
<p>The site gets built on <a href="https://forge.laravel.com/">Forge</a> to a <a href="https://www.hetzner.com/">Hetzner</a> server whenever I push an update to GitHub either via command line, or through the aforementioned CMS, and is also triggered at various points in the day to pull in my Mastodon posts.</p>
<p><strong>Given your experience, if you were to start a blog today, would you do anything differently?</strong></p>
<p>Assuming I actually had to the time to do it, I think I would start with the CMS first, before building anything of the actual site. It is a pain to update things when I'm not at my laptop but jamming features into my CMS is equally frustrating.</p>
<p>If I wanted something off the shelf and easier to maintain I suspect I would choose <a href="https://ghost.org/">Ghost</a> or <a href="https://pika.page/">Pika</a>.</p>
<p><strong>Financial question since the Web is obsessed with money: how much does it cost to run your blog? Is it just a cost, or does it generate some revenue? And what's your position on people monetising personal blogs?</strong></p>
<p>Many of these costs are part of my freelancing so are bundled with other sites I run and somewhat hidden but I'll do my best to outline what I do use.</p>
<p>I have a single server on Hetzner that serves my main site as well as another 30 or so side projects so the cost is negligible per-site but it costs about $5 a month. Forge costs $12 a month to deploy my site along with other sites. The domain is $20 a year I think but that's it.</p>
<p>I have a <a href="https://oneamonth.club/">One a Month Club</a> <a href="https://buymeacoffee.com/rknightuk/membership">here</a> and I have a handful of people supporting that way. I also use affiliate links for services I use and like which occasionally pays me a little bit.</p>
<p>I think monetising blogs is fine, if it's done in a tasteful way. Dumping Google ads all over your site is terrible for everyone but hand-picked sponsors or referrals is a good way to find new services. Just keep it classy.</p>
<p><strong>Time for some recommendations: any blog you think is worth checking out? And also, who do you think I should be interviewing next?</strong></p>
<p>I want to read sites that are about the person writing them. Photos of things people have done, blog posts about notebooks, wallpaper, food, everything. Things people enjoy.</p>
<p>This is the second time I'm going to mention <a href="https://gkeenan.co/avgb/">Keenan</a> here because they write so wonderfully. They also have a podcast with <a href="https://cygnoir.net/about">Halsted</a> called <a href="https://friendship-material.simplecast.com">Friendship Material</a> which is all kinds of lovely and joyful and everyone should listen.</p>
<p><a href="https://alexwlchan.net">Alex</a> writes some really interesting computing-related posts, like this one about using <a href="https://alexwlchan.net/2024/static-websites/">static websites as tiny archives</a>.</p>
<p><a href="https://anniemueller.com">Annie</a> is so smart and honest in her writing it brings me joy every time I see a new post from her. <a href="https://anniemueller.com/posts/how-i-a-non-developer-read-the-tutorial-you-a-developer-wrote-for-me-a-beginner">This post is a masterpiece</a>.</p>
<p><strong>Final question: is there anything you want to share with us?</strong></p>
<p>I'd be a terrible business boy if I didn't at least mention <a href="https://echofeed.app">EchoFeed</a>, an RSS cross posting service I run.</p>
<p>I also <a href="https://ruminatepodcast.com">have a podcast</a> that used to be about tech but is now about snacks.</p>I Am A Link Curator - The Weblog of fLaMEdhttps://flamedfury.com/posts/i-am-a-link-curator/2026-06-22T08:49:05.000Z<p>What’s going on, Internet? Friend of the site <a href="https://jamesg.blog/" rel="noopener">James</a> recently shared a new post <a href="https://jamesg.blog/blogger-archetypes" rel="noopener">Blogger Archetypes</a> which asks a series of questions to help you narrow down your character as a member of the blogging community. A bit of indie web fun.</p>
<p>Here are my results:</p>
<blockquote>
<p><strong>You are a Link curator</strong></p>
<p>The web is not just its pages, but the connections between pages. You have internalised this and love spending your time exploring the web and sharing what you find with the world.</p>
<p><strong>You are also a Culture maker</strong></p>
<p>You love to help push the blogging community forward by starting discussions, encouraging thought, and sharing what’s on your mind.</p>
</blockquote>
<p>And the other archetypes on offer:</p>
<blockquote>
<p><strong>Explorer:</strong> To you, the web feels like a library that’s open all hours and has everything you could ever imagine! You love reading others blogs, and know how important readers are to the whole of the indie web community!</p>
<p><strong>Community gardener:</strong> You love to help contribute to building the blogging community, either through your writing or how you share the spirit of writing on the web with friends.</p>
<p><strong>Author:</strong> You love writing and have a growing backlog of posts on your website! Words are your best friend and you’re always thinking about what to write next.</p>
</blockquote>
<p>Link curator feels about right. A lot of what I do here is exactly that. Surfing the web, finding the good stuff, and passing it along. The <a href="https://flamedfury.com/bookmarks">bookmarks</a>, the links back to other people’s writing (which I need to get back into doing regularly). That’s the fun part for me.</p>
<p>If you’ve got a blog, go and <a href="https://jamesg.blog/blogger-archetypes" rel="noopener">take the quiz</a> and write up what you got. Send it my way, I’d love to to see what you got. 🤙</p>
<p>Hey, thanks for reading this post in your feed reader! Want to chat? <a href="mailto:hello@flamedfury.com?subject=RE: I Am A Link Curator">Reply by email</a> or add me on <a href="xmpp:flamed@omg.lol">XMPP</a>, or send a <a href="https://flamedfury.com/posts/i-am-a-link-curator/#webmention">webmention</a>. Check out the <a href="https://flamedfury.com/posts/">posts archive</a> on the website.</p>
📝 2026-06-22 09:39: The fox continues to prowl around our chickens. This morning we caught it in the... - Kev Quirkhttps://kevquirk.com/2026-06-22-09392026-06-22T08:39:00.000Z<p>The fox continues to prowl around our chickens. This morning we caught it in the GARDEN a few feet from our favourite chicken. Luckily the magpies warned us and we were able to scare it away.</p>
<p>It's not nice keeping the little cluckers cooped up in this heat, but needs must unfortunately.</p> <div class="email-hidden">
<hr />
<p>Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️</p>
<p>You can <a href="mailto:19gy@qrk.one?subject=%F0%9F%93%9D%202026-06-22%2009%3A39">reply to this post by email</a>, or <a href="https://kevquirk.com/2026-06-22-0939#comments">leave a comment</a>.</p>
</div>No, I don't want you to summarise the page! - Kev Quirkhttps://kevquirk.com/no-i-dont-want-you-to-summarise-the-page2026-06-22T08:04:00.000Z<p>I've talked about LLMs a few times here - the TL;DR is that I find them useful <em>for certain use cases</em>.</p>
<p>Searching something complex? Great.</p>
<p>Checking my code, or helping me with a problem in said code? Count me in.</p>
<p>But summarising a page I'm reading? Absofuckinglutely not.</p>
<p>One of the things I really enjoy about the web is surfing it and <em>reading</em>. Reading is one of the great joys I get from the web, and <a href="https://kevquirk.com/?type=book">in general</a>. Why would I want a bastardised version of your words presented to me by a computer when I can read the actual words you took time to write?</p>
<p>LLMs have their place and are useful tools in my opinion, but I'm getting sick of them being crammed into every facet of computing.</p>
<p>Hopefully the bubble will burst soon and we can all enjoy an LLM <em>enriched</em> web, not an LLM <em>hijacked</em> web.</p> <div class="email-hidden">
<hr />
<p>Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️</p>
<p>You can <a href="mailto:19gy@qrk.one?subject=No%2C%20I%20don%27t%20want%20you%20to%20summarise%20the%20page%21">reply to this post by email</a>, or <a href="https://kevquirk.com/no-i-dont-want-you-to-summarise-the-page#comments">leave a comment</a>.</p>
</div>Registration review: Taiwan - Johnny.Decimalhttps://johnnydecimal.com/blog/0224-rego-review-taiwan/2026-06-22T06:53:29.000Z<p>Vehicle registration plates provide a ubiquitous numbering scheme that's easy to enjoy: just walk around the streets and pay attention. Each country offers its own variant of the form, so in this series I will review each country's registration plates as I encounter them.</p>
<blockquote>
<p>These reviews are not scientific and should not be quoted as authoritative.</p>
</blockquote>
<h2 id="introduction">Introduction</h2>
<p>Taiwan's scheme was refreshed in 2012. This review only considers the post-refresh scheme. Older plates are still very common.</p>
<h2 id="schema">Schema</h2>
<p>A simple, consistent scheme: <code>AAA-0000</code>. The usual suspects are omitted from the letter prefix – <code>O</code>, <code>I</code> – but <code>Q</code> remains, as we'll see below.</p>
<p>Absurdly, the number <code>4</code> is no longer used. I thought this was user preference, as I did see <em>one</em> in the wild. But it seems that the user preference was so strong, they elected to remove it. The plate I saw must have been from an older range.</p>
<p>This broad omission of <code>4</code> is common across Asia – it sounds like the word 'death' – as is the equally absurd omission of the West's superstition, <code>13</code>.<sup><a href="#user-content-fn-thirteen" id="user-content-fnref-thirteen" data-footnote-ref="" aria-describedby="footnote-label" class="footnote">1</a></sup> (Combined with the fact that the ground floor is represented as <code>1</code> means that a room on the 14th floor isn't quite as high as one might hope.)</p>
<p>The scheme allows a theoretical maximum of <code>24^3 × 9^4 = 90,699,264</code> plates. Given Taiwan's population of 23.5m people this is a touch under 4 cars each. This doesn't feel like enough, but the most recent plate I saw began <code>CCD</code> indicating that about 10% of plates have been issued in 14 years. So we don't need to worry about them running out.</p>
<h3 id="special-cases">Special cases</h3>
<p>There are special cases for electric vehicles <code>E__-____</code>, rentals <code>R__-____</code>, and so on. I appreciate this additional information being encoded in the plate.</p>
<p>They've also removed a whole bunch of three-letter words from the pool so bad luck if you wanted <code>GAY-0000</code>. Inexplicably, <code>ANT</code> is disallowed. Because that's … an ant?</p>
<h3 id="issue-date">Issue date</h3>
<p>The scheme encodes issue date gracefully: it's pretty obvious by looking at cars that they started at <code>AAA</code> and they're currently somewhere in the early-to-mid-<code>C__</code>s.</p>
<p>This avoids issues of specifically encoding a year into the plate, as we'll see the next time I visit the UK. It also provides a free street game: find the latest plate!</p>
<h3 id="region-awareness">Region awareness</h3>
<p>There appears to be no region encoding in the plate. Taiwan is a relatively small island so this probably isn't necessary, but I do like knowing where someone is from.</p>
<h3 id="schema-45">Schema: 4/5</h3>
<ul>
<li>Pro: simple, obvious, and consistent.</li>
<li>Con: no regional coding, the <code>4</code> thing, and it feels punitive to have excluded <code>ANT</code>.</li>
</ul>
<h2 id="design">Design</h2>
<p>A simple plate, stamped metal, black on white in its standard form. I prefer an embossing over a cheaper-looking laminate so top marks here.</p>
<p>The typeface is slightly condensed which looks nice on the plate. But I like a plate to fill the space given for it on the vehicle, and a narrow plate rarely does that.</p>
<figure class="figure jdimage jdimage--auto-dark"> <picture> <img class="figure__inner" alt="A close-up photo of a Taiwanese registration plate, BQD-2793. The Q has a strong diagonal line that cuts across the entire character, starting half way down the left side and clearly jutting out of the lower-right of the figure." height="326" loading="lazy" src="https://johnnydecimal.com/blog/0224A-Taiwan_rego_Q-798x326.png" width="798"> </picture> </figure>
<p>Theoretically that's a <code>-</code> dash separating the letters and numbers, but it's shown as a dot on most (all?) plates. I would have stretched that out a little, at least on cars where there's plenty of room.</p>
<h3 id="points-for-a-nice-q">Points for a nice <code>Q</code></h3>
<p>If you're going to use a <code>Q</code> you really have to make sure it looks like a <code>Q</code>. Taiwan is a clear pass in this category.</p>
<h3 id="markings-at-the-bottom">Markings at the bottom</h3>
<p>Apparently they moved the screw holes exclusively to the top to allow for those markings, barely visible, at the bottom. I wouldn't have bothered.</p>
<h3 id="design-35">Design: 3/5</h3>
<ul>
<li>Pro: stamped metal. A nice typeface.</li>
<li>Con: no other adornments. Kinda plain. Doesn't fill the space.</li>
</ul>
<h2 id="summary">Summary</h2>
<p>Overall Taiwan scores 7/10: not bad for our first entrant. It's an inoffensive plate that does the job without trying to get in your face. I just wish that they'd put a <em>touch</em> more into its design.</p>
<div data-footnotes="" class="footnotes"><h2 class="sr-only" id="footnote-label">Footnotes</h2>
<ol>
<li id="user-content-fn-thirteen">
<p><code>13</code> is <em>not</em> excluded from the registration scheme, to be clear. I refer to its common omission from building floor numbers. <a href="#user-content-fnref-thirteen" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref footnoteBackLink">↩</a></p>
</li>
</ol>
</div>Finished reading Book of the Dead - Molly White's activity feed6a39376f91f30f1ebedb9f5f2026-06-22T00:12:23.000Z<article class="entry h-entry hentry"><header><div class="description">Finished reading: </div></header><div class="content e-content"><div class="book h-entry hentry"><a class="book-cover-link" href="https://www.mollywhite.net/reading/books?search=Book%20of%20the%20Dead"><img class="u-photo book-cover" src="https://m.media-amazon.com/images/S/compressed.photo.goodreads.com/books/1442534083i/6526.jpg" alt="Cover image of Book of the Dead" style="max-width: 300px;"/></a><div class="book-details"><div class="top"><div class="series-info"><i>Kay Scarpetta</i> series, book <span class="series-number">15</span>. </div><div class="title-and-byline"><div class="title"><i class="p-name">Book of the Dead</i> </div><div class="byline">by <span class="p-author h-card">Patricia Cornwell</span>. </div></div><div class="book-info">Published <time class="dt-published published" datetime="2007">2007</time>. 511 pages. </div></div><div class="bottom"><div class="reading-info"><div class="reading-dates"> Started <time class="dt-accessed accessed" datetime="2026-06-20">June 20, 2026</time>; completed June 21, 2026. </div></div></div></div></div><img src="https://www.mollywhite.net/assets/images/placeholder_social.png" alt="Illustration of Molly White sitting and typing on a laptop, on a purple background with 'Molly White' in white serif." style="display: none;"/></div><footer class="footer"><div class="flex-row post-meta"><div class="timestamp">Posted: <time class="dt-published" datetime="2026-06-22T00:12:23+00:00" title="June 22, 2026 at 12:12 AM UTC">June 22, 2026 at 12:12 AM UTC</time>. </div></div><div class="bottomRow"><div class="tags">Tagged: <a class="tag p-category" href="https://www.mollywhite.net/reading/books?tags=crime" title="See all books tagged "crime"" rel="category tag">crime</a>, <a class="tag p-category" href="https://www.mollywhite.net/reading/books?tags=mystery" title="See all books tagged "mystery"" rel="category tag">mystery</a>, <a class="tag p-category" href="https://www.mollywhite.net/reading/books?tags=thriller" title="See all books tagged "thriller"" rel="category tag">thriller</a>. </div></div></footer></article>Removing prefixes and suffixes in Python - James' Coffee Bloghttps://jamesg.blog/2026/06/22/removing-prefixes-and-suffixes-in-python2026-06-22T00:00:00.000Z
<style media="(prefers-color-scheme: dark)">pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #49483e }
.highlight { background: #272822; color: #F8F8F2 }
.highlight .c { color: #959077 } /* Comment */
.highlight .err { color: #ED007E; background-color: #1E0010 } /* Error */
.highlight .esc { color: #F8F8F2 } /* Escape */
.highlight .g { color: #F8F8F2 } /* Generic */
.highlight .k { color: #66D9EF } /* Keyword */
.highlight .l { color: #AE81FF } /* Literal */
.highlight .n { color: #F8F8F2 } /* Name */
.highlight .o { color: #FF4689 } /* Operator */
.highlight .x { color: #F8F8F2 } /* Other */
.highlight .p { color: #F8F8F2 } /* Punctuation */
.highlight .ch { color: #959077 } /* Comment.Hashbang */
.highlight .cm { color: #959077 } /* Comment.Multiline */
.highlight .cp { color: #959077 } /* Comment.Preproc */
.highlight .cpf { color: #959077 } /* Comment.PreprocFile */
.highlight .c1 { color: #959077 } /* Comment.Single */
.highlight .cs { color: #959077 } /* Comment.Special */
.highlight .gd { color: #FF4689 } /* Generic.Deleted */
.highlight .ge { color: #F8F8F2; font-style: italic } /* Generic.Emph */
.highlight .ges { color: #F8F8F2; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #F8F8F2 } /* Generic.Error */
.highlight .gh { color: #F8F8F2 } /* Generic.Heading */
.highlight .gi { color: #A6E22E } /* Generic.Inserted */
.highlight .go { color: #66D9EF } /* Generic.Output */
.highlight .gp { color: #FF4689; font-weight: bold } /* Generic.Prompt */
.highlight .gs { color: #F8F8F2; font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #959077 } /* Generic.Subheading */
.highlight .gt { color: #F8F8F2 } /* Generic.Traceback */
.highlight .kc { color: #66D9EF } /* Keyword.Constant */
.highlight .kd { color: #66D9EF } /* Keyword.Declaration */
.highlight .kn { color: #FF4689 } /* Keyword.Namespace */
.highlight .kp { color: #66D9EF } /* Keyword.Pseudo */
.highlight .kr { color: #66D9EF } /* Keyword.Reserved */
.highlight .kt { color: #66D9EF } /* Keyword.Type */
.highlight .ld { color: #E6DB74 } /* Literal.Date */
.highlight .m { color: #AE81FF } /* Literal.Number */
.highlight .s { color: #E6DB74 } /* Literal.String */
.highlight .na { color: #A6E22E } /* Name.Attribute */
.highlight .nb { color: #F8F8F2 } /* Name.Builtin */
.highlight .nc { color: #A6E22E } /* Name.Class */
.highlight .no { color: #66D9EF } /* Name.Constant */
.highlight .nd { color: #A6E22E } /* Name.Decorator */
.highlight .ni { color: #F8F8F2 } /* Name.Entity */
.highlight .ne { color: #A6E22E } /* Name.Exception */
.highlight .nf { color: #A6E22E } /* Name.Function */
.highlight .nl { color: #F8F8F2 } /* Name.Label */
.highlight .nn { color: #F8F8F2 } /* Name.Namespace */
.highlight .nx { color: #A6E22E } /* Name.Other */
.highlight .py { color: #F8F8F2 } /* Name.Property */
.highlight .nt { color: #FF4689 } /* Name.Tag */
.highlight .nv { color: #F8F8F2 } /* Name.Variable */
.highlight .ow { color: #FF4689 } /* Operator.Word */
.highlight .pm { color: #F8F8F2 } /* Punctuation.Marker */
.highlight .w { color: #F8F8F2 } /* Text.Whitespace */
.highlight .mb { color: #AE81FF } /* Literal.Number.Bin */
.highlight .mf { color: #AE81FF } /* Literal.Number.Float */
.highlight .mh { color: #AE81FF } /* Literal.Number.Hex */
.highlight .mi { color: #AE81FF } /* Literal.Number.Integer */
.highlight .mo { color: #AE81FF } /* Literal.Number.Oct */
.highlight .sa { color: #E6DB74 } /* Literal.String.Affix */
.highlight .sb { color: #E6DB74 } /* Literal.String.Backtick */
.highlight .sc { color: #E6DB74 } /* Literal.String.Char */
.highlight .dl { color: #E6DB74 } /* Literal.String.Delimiter */
.highlight .sd { color: #E6DB74 } /* Literal.String.Doc */
.highlight .s2 { color: #E6DB74 } /* Literal.String.Double */
.highlight .se { color: #AE81FF } /* Literal.String.Escape */
.highlight .sh { color: #E6DB74 } /* Literal.String.Heredoc */
.highlight .si { color: #E6DB74 } /* Literal.String.Interpol */
.highlight .sx { color: #E6DB74 } /* Literal.String.Other */
.highlight .sr { color: #E6DB74 } /* Literal.String.Regex */
.highlight .s1 { color: #E6DB74 } /* Literal.String.Single */
.highlight .ss { color: #E6DB74 } /* Literal.String.Symbol */
.highlight .bp { color: #F8F8F2 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #A6E22E } /* Name.Function.Magic */
.highlight .vc { color: #F8F8F2 } /* Name.Variable.Class */
.highlight .vg { color: #F8F8F2 } /* Name.Variable.Global */
.highlight .vi { color: #F8F8F2 } /* Name.Variable.Instance */
.highlight .vm { color: #F8F8F2 } /* Name.Variable.Magic */
.highlight .il { color: #AE81FF } /* Literal.Number.Integer.Long */ .highlight .nn, .highlight .n{color: light-dark(black, var(--dark-foreground-color)) }</style><style media="(prefers-color-scheme: light)">pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight { background: #f8f8f8; }
.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */
.highlight .err { border: 1px solid #F00 } /* Error */
.highlight .k { color: #008000; font-weight: bold } /* Keyword */
.highlight .o { color: #666 } /* Operator */
.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */
.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #9C6500 } /* Comment.Preproc */
.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */
.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */
.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */
.highlight .gd { color: #A00000 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #E40000 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #008400 } /* Generic.Inserted */
.highlight .go { color: #717171 } /* Generic.Output */
.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.highlight .gt { color: #04D } /* Generic.Traceback */
.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008000 } /* Keyword.Pseudo */
.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #B00040 } /* Keyword.Type */
.highlight .m { color: #666 } /* Literal.Number */
.highlight .s { color: #BA2121 } /* Literal.String */
.highlight .na { color: #687822 } /* Name.Attribute */
.highlight .nb { color: #008000 } /* Name.Builtin */
.highlight .nc { color: #00F; font-weight: bold } /* Name.Class */
.highlight .no { color: #800 } /* Name.Constant */
.highlight .nd { color: #A2F } /* Name.Decorator */
.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */
.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #00F } /* Name.Function */
.highlight .nl { color: #767600 } /* Name.Label */
.highlight .nn { color: #00F; font-weight: bold } /* Name.Namespace */
.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #19177C } /* Name.Variable */
.highlight .ow { color: #A2F; font-weight: bold } /* Operator.Word */
.highlight .w { color: #BBB } /* Text.Whitespace */
.highlight .mb { color: #666 } /* Literal.Number.Bin */
.highlight .mf { color: #666 } /* Literal.Number.Float */
.highlight .mh { color: #666 } /* Literal.Number.Hex */
.highlight .mi { color: #666 } /* Literal.Number.Integer */
.highlight .mo { color: #666 } /* Literal.Number.Oct */
.highlight .sa { color: #BA2121 } /* Literal.String.Affix */
.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */
.highlight .sc { color: #BA2121 } /* Literal.String.Char */
.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */
.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
.highlight .s2 { color: #BA2121 } /* Literal.String.Double */
.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */
.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */
.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */
.highlight .sx { color: #008000 } /* Literal.String.Other */
.highlight .sr { color: #A45A77 } /* Literal.String.Regex */
.highlight .s1 { color: #BA2121 } /* Literal.String.Single */
.highlight .ss { color: #19177C } /* Literal.String.Symbol */
.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #00F } /* Name.Function.Magic */
.highlight .vc { color: #19177C } /* Name.Variable.Class */
.highlight .vg { color: #19177C } /* Name.Variable.Global */
.highlight .vi { color: #19177C } /* Name.Variable.Instance */
.highlight .vm { color: #19177C } /* Name.Variable.Magic */
.highlight .il { color: #666 } /* Literal.Number.Integer.Long */</style>
<style>
@font-face {
font-family: 'MonaspaceArgon';
src: url('/assets/fonts/MonaspaceArgon-Regular.woff2') format('woff2');
font-weight: 400;
font-style: normal;
}
pre, code {
font-family: 'MonaspaceArgon', ui-monospace, monospace;
}
</style>
<p>A few weeks ago, I learned about the <code>removeprefix</code> method in Python. It lets you remove a specific prefix from the beginning of a string. For example, I can use the following code to remove <code>www.</code> from the beginning of a domain name:</p><div class="highlight"><pre><span></span><span class="s2">"www.jamesg.blog"</span><span class="o">.</span><span class="n">removeprefix</span><span class="p">(</span><span class="s2">"www."</span><span class="p">)</span>
</pre></div>
<p>If the string doesn’t contain the prefix, nothing happens; if the string does contain the prefix, the prefix is removed.</p><p><em>Note: If you are parsing URLs in Python, you should use a library like </em><a href="https://docs.python.org/3/library/urllib.parse.html" rel="noreferrer"><em>urllib.parse</em></a><em> to extract parts of a URL.</em></p><p>I did some digging and, via <a href="https://stackoverflow.com/questions/16891340/remove-a-prefix-from-a-string">a mention of the method in Stack Overflow</a>, I learned that Python 3.9 added support for methods for <a href="https://docs.python.org/3/whatsnew/3.9.html">removing prefixes and suffixes from strings</a>: <code>removeprefix</code> and <code>removesuffix</code>.</p><p>When I learned about <code>removeprefix</code>, I felt a little bit of joy. I have been using Python for years and had no idea about this method.</p><p>Instead of doing the trick to measure the length of a string I want to remove, and then removing that number of characters from the beginning of a string using indexing if the string <code>startswith</code> the string I want to remove, I now can use a single method: <code>removeprefix</code> (and <code>removesuffix</code> to do the same at the end of a string).</p><h2 id="addendum:-lstrip-and-rstrip">Addendum: lstrip and rstrip</h2><p>While the <code>lstrip()</code> and <code>rstrip()</code> methods, which remove either whitespace or specified characters from the start or end of a string, may sound like they do the same thing, they remove all instances of the specified characters. For example, if I use this code:</p><div class="highlight"><pre><span></span><span class="s2">"www.w.jamesg.blog"</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="s2">"www."</span><span class="p">)</span>
</pre></div>
<p>The code returns:</p><pre><code>jamesg.blog</code></pre><p><code>lstrip()</code> has removed all <code>w</code> and <code>.</code> characters that would start the string.</p><p>I thought I would document this because for a while I wasn’t aware this was the behaviour of <code>lstrip</code> and <code>strip</code>.</p><script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a0f9ebd3aeafe718',t:'MTc4MjExNzM0Mw=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
<a class="tag" href="https://docs.python.org/3/library/urllib.parse.html">urllib.parse</a>
<a class="tag" href="https://docs.python.org/3/whatsnew/3.9.html">removing prefixes and suffixes from strings</a>
<a class="tag" href="https://stackoverflow.com/questions/16891340/remove-a-prefix-from-a-string">a mention of the method in Stack Overflow</a>
📝 2026-06-21 18:42: It's handy when your riding buddy is a photographer. You end up with some nice... - Kev Quirkhttps://kevquirk.com/2026-06-21-18422026-06-21T17:42:00.000Z<p>It's handy when your riding buddy is a photographer. You end up with some nice photos.</p>
<p><img src="https://kevquirk.com/content/images/2026-06-21-1842/1000009851.webp" alt="1000009851" /></p> <div class="email-hidden">
<hr />
<p>Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️</p>
<p>You can <a href="mailto:19gy@qrk.one?subject=%F0%9F%93%9D%202026-06-21%2018%3A42">reply to this post by email</a>, or <a href="https://kevquirk.com/2026-06-21-1842#comments">leave a comment</a>.</p>
</div>📝 2026-06-21 09:35: Some goats, just goating around, watching me mow the field. - Kev Quirkhttps://kevquirk.com/2026-06-21-09352026-06-21T08:35:00.000Z<p>Some goats, just goating around, watching me mow the field.</p>
<p><img src="https://kevquirk.com/content/images/2026-06-21-0935/1000009800.webp" alt="1000009800" /></p> <div class="email-hidden">
<hr />
<p>Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️</p>
<p>You can <a href="mailto:19gy@qrk.one?subject=%F0%9F%93%9D%202026-06-21%2009%3A35">reply to this post by email</a>, or <a href="https://kevquirk.com/2026-06-21-0935#comments">leave a comment</a>.</p>
</div>Finished reading Predator - Molly White's activity feed6a39374091f30f1ebedb9f2f2026-06-21T01:25:44.000Z<article class="entry h-entry hentry"><header><div class="description">Finished reading: </div></header><div class="content e-content"><div class="book h-entry hentry"><a class="book-cover-link" href="https://www.mollywhite.net/reading/books?search=Predator"><img class="u-photo book-cover" src="https://m.media-amazon.com/images/S/compressed.photo.goodreads.com/books/1310552145i/6528.jpg" alt="Cover image of Predator" style="max-width: 300px;"/></a><div class="book-details"><div class="top"><div class="series-info"><i>Kay Scarpetta</i> series, book <span class="series-number">14</span>. </div><div class="title-and-byline"><div class="title"><i class="p-name">Predator</i> </div><div class="byline">by <span class="p-author h-card">Patricia Cornwell</span>. </div></div><div class="book-info">Published <time class="dt-published published" datetime="2005">2005</time>. 453 pages. </div></div><div class="bottom"><div class="reading-info"><div class="reading-dates"> Started <time class="dt-accessed accessed" datetime="2026-06-19">June 19, 2026</time>; completed June 20, 2026. </div></div></div></div></div><img src="https://www.mollywhite.net/assets/images/placeholder_social.png" alt="Illustration of Molly White sitting and typing on a laptop, on a purple background with 'Molly White' in white serif." style="display: none;"/></div><footer class="footer"><div class="flex-row post-meta"><div class="timestamp">Posted: <time class="dt-published" datetime="2026-06-21T01:25:44+00:00" title="June 21, 2026 at 1:25 AM UTC">June 21, 2026 at 1:25 AM UTC</time>. </div></div><div class="bottomRow"><div class="tags">Tagged: <a class="tag p-category" href="https://www.mollywhite.net/reading/books?tags=crime" title="See all books tagged "crime"" rel="category tag">crime</a>, <a class="tag p-category" href="https://www.mollywhite.net/reading/books?tags=mystery" title="See all books tagged "mystery"" rel="category tag">mystery</a>, <a class="tag p-category" href="https://www.mollywhite.net/reading/books?tags=thriller" title="See all books tagged "thriller"" rel="category tag">thriller</a>. </div></div></footer></article>Little moments of joy - James' Coffee Bloghttps://jamesg.blog/2026/06/21/little-moments-of-joy-today2026-06-21T00:00:00.000Z
<p>As I write, the lowering sun is gently shining on the monstera plant in the living room, casting a shadow on the wall. I am enjoying the changes in light outside as the longest day draws to a close. The birds sing quietly outside.</p><p>Yesterday, the clouds started to move away for the first time in days, leaving a sky so clear at sunset I couldn’t see a cloud out the window. The clarity carried on to this day: for all the day there have been few clouds in the sky. I look out the window and see a few clouds. I briefly imagine what a city in the clouds would be like, but I can’t formulate a complete picture in my imagination. The clouds themselves say so much that I am preoccupied by studying what I see.</p><p>I write down little moments of joy as I go around the world: “the joy of watching the sun set under a clear sky,” “the joy of someone seeing you so clearly after only saying a few words,” “the joy of singing a song to yourself while waiting for the bus”. These moments come at random. That is what makes them so special.</p><p>Earlier today, after leaving a shop, a car parked nearby which had their windows down and was loudly playing Taylor Swift’s <em>Delicate</em>. I started to sing along. Was that their favourite song? I’ll never know, but it is fun to imagine. The moment was fleeting, but one I knew I had to write down – if a moment is fleeting, words can help it exist a little bit longer.</p><p>The light beaming onto my monstera is fading. The shadow cast by the two tallest leaves that are closely interspersed looks like a palm tree: a vision of the tropical in the Scottish summer. The contours of some of the shadows of leaves are still well defined, but others fade into a haze. Soon, the sun will set. I think about how special it is to watch this moment: to see the last slivers of sunlight peek through a low cloud on the horizon on the longest day of the year.</p><p>The colour from the lingering lavender cast onto the sparse clouds, possible only because the sun is where it now is in the sky, makes me smile; oh! how wonderful the changes in colours through Day and Night are.</p>
Small wishes - James' Coffee Bloghttps://jamesg.blog/2026/06/21/small-wishes2026-06-21T00:00:00.000Z
<p>I like to wish people a happy day, and so many of my conversations start with “Happy Sunday”, or similar. Today I was able to add an additional well-wish: “Happy Solstice!” As I write, it is 9pm and the sun is still radiating over the hills. Trees cast long shadows over the quiet fields. The pattern of branches at the top of a tree reminded me of a village Kirk I saw earlier today.</p><p>I started my morning with a long walk followed by a (decaf) coffee. I love when I can start the day with a walk: when I have time to watch the world go by, listen to some music, and notice the world around me. Within thirty minutes my environment can change from the plain walls of my bedroom to Nature in which, no matter how much I look around, there will always be a new detail to appreciate.</p><p>After my coffee, a thought came to mind: I hope that one day I can see the countryside from a double-decker bus. It’s a small wish. It may never happen but I hold onto the thought any way. The wish pops into my mind sometimes when I am travelling. Maybe I need to travel at a different time of day to have a higher likelihood of catching the double decker bus that sometimes runs. But then again I like the feeling of holding a tiny hope – something that makes me feel “what if?”</p><p>While at the bus station I skimmed through new blog posts. I opened one in which the author had shared a photo of a pancake with a face made of butter on top. It was a tiny moment, but one shared across continents through the medium that we call the web. I smiled, my heart already warm from the light of the day and the coffee and the tiny wish of seeing the countryside from a double-decker bus.</p><p>I looked up to the sky and saw blue wherever I looked. I thought about the contrast between the greens of Earth and the blues of the sky and let a few moments pass while I admired the contours of the trees in the middle distance.</p><p>On my journey, I saw the countryside with new clarity: the day is clearer than many I remember from recently. The trees and fields and valleys and peaks were all so vibrant, their colours illuminated by the warm sun: a warmth that will linger today longer than any other: therein, the joy of Solstice.</p><p>Travelling further through the fields and hills, I thought about how even a tree far away can have an impact on me. A tree may be a mile or two away by distance, but yet it can still feel close. Our hearts can interpret what we see no matter how far away what we are looking at may be.</p><script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a0f5d2f97dc957eb',t:'MTc4MjA3NDM4Mg=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
Which Copyleft Licence is Suitable for an SVG? - Terence Eden’s Bloghttps://shkspr.mobi/blog/?p=687412026-06-20T11:34:22.000Z<p>The Scalable Vector Graphics (SVG) format is amazing. It allows you to precisely define how an image should look. Written in XML, it uses various mathematical operations to display an image which looks crisp and clear at any size.</p>
<p>Here's a trivial example:</p>
<pre><code class="language-SVG"><svg height="100" viewBox="0 0 100 100" width="100" xmlns="http://www.w3.org/2000/svg">
<circle cx="50" cy="50" fill="#fff" r="100"/>
</svg>
</code></pre>
<p>That code produces this circle:</p>
<svg height="100" viewBox="0 0 100 100" width="100" xmlns="http://www.w3.org/2000/svg">
<circle cx="50" cy="50" fill="#f00" r="50"></circle>
</svg>
<p>You could print that out with a kilometre radius and it would still be a perfect circle - unlike a traditional raster image which is just a grid of blocky pixels.</p>
<p>But suppose you wanted to freely share your SVG with others - and ensure that they <em>also</em> freely share it. What sort of "Copyleft" licence would you give it?</p>
<h2 id="creative-commons"><a href="https://shkspr.mobi/blog/2026/06/which-copyleft-licence-is-suitable-for-an-svg/#creative-commons">Creative Commons</a></h2>
<p>The obvious choice seems to be a Creative Commons Share-Alike licence. SVGs are images. Images are creative works. Creative Commons is suitable for creative works. Job done!</p>
<p>But…</p>
<p>SVGs are <em>not</em> images. The are code which <em>produce</em> images. If we assume that an SVG is software, this entry in the FAQ becomes relevant:</p>
<blockquote><p><a href="https://creativecommons.org/faq/#can-i-apply-a-creative-commons-license-to-software"><strong>Can I apply a Creative Commons license to software?</strong></a></p>
<p>We recommend against using Creative Commons licenses for software.</p>
<p>[…]</p>
<p>Unlike software-specific licenses, CC licenses do not contain specific terms about the distribution of source code, which is often important to ensuring the free reuse and modifiability of software.</p>
<p>[…]</p>
<p>Additionally, our licenses are currently not compatible with the major software licenses, so it would be difficult to integrate CC-licensed work with other free software. Existing software licenses were designed specifically for use with software and offer a similar set of rights to the Creative Commons licenses.</p></blockquote>
<p>At the end of that FAQ, they also say:</p>
<blockquote><p>While we recommend against using a CC license on software itself, CC licenses may be used for software documentation, as well as for separate artistic elements such as game art or music.</p></blockquote>
<p>So, that's a <em>perhaps?</em></p>
<h2 id="gpl"><a href="https://shkspr.mobi/blog/2026/06/which-copyleft-licence-is-suitable-for-an-svg/#gpl">GPL</a></h2>
<p>But let us assume that an SVG is a piece of media rather than software. Would it be suitable to use a software licence for it?</p>
<p>The various Gnu Public Licences have this to say:</p>
<blockquote><p><a href="https://www.gnu.org/licenses/gpl-faq.en.html#GPLOtherThanSoftware"><strong>Can I use the GPL for something other than software?</strong></a></p>
<p>You can apply the GPL to any kind of work, as long as it is clear what constitutes the “source code” for the work. The GPL defines this as the preferred form of the work for making changes in it.</p></blockquote>
<p>A photo JPEG might be derived from the RAW image file. In which case, the RAW is suitable for being GPL'd, not the resultant JPEG.</p>
<p>Similarly, the Photoshop file of a complex and multi-layered illustration would suitable, but not the outputted PNG.</p>
<p>An SVG can straddle both worlds. It's possible to build an SVG with layers, groups, and transformations, and then simplify it for output. You <em>could</em> edit the optimised version, but it's hardly the preferred format.</p>
<p>I read <a href="https://www.gnu.org/licenses/gpl-3.0.en.html">the GPL</a> (so you don't have to) and right at the start it says:</p>
<blockquote><p>The GNU General Public License is a free, copyleft license for software and <strong>other kinds of works</strong>.</p></blockquote>
<p>(Emphasis added.)</p>
<p>But do they mean that?</p>
<blockquote><p><a href="https://www.gnu.org/licenses/licenses.en.html#OtherWorks"><strong>Licenses for Other Types of Works</strong></a></p>
<p>[…]</p>
<p>We don't take the position that artistic or entertainment works must be free, but if you want to make one free, we recommend the <a href="https://directory.fsf.org/wiki/License:LAL-1.3">Free Art License</a>.</p></blockquote>
<p>But, as delightful as the Free Art License is, the FSF say:</p>
<blockquote><p>Please don't use it for software or documentation, since it is incompatible with the GNU GPL and with the GNU FDL.</p></blockquote>
<h2 id="is-an-svg-software-or-not"><a href="https://shkspr.mobi/blog/2026/06/which-copyleft-licence-is-suitable-for-an-svg/#is-an-svg-software-or-not">Is an SVG software or not?</a></h2>
<p>I think so.</p>
<ul>
<li>It's written in plain text.</li>
<li>It contains definitions, variables, and instructions.</li>
<li>It can contain scripting.</li>
</ul>
<p>That sure looks like software to me!</p>
<p>But, at the same time, the user <em>experiences</em> it as a graphic. An animated GIF, for example, contains a small amount of code-like data to say how long each frame should last for and when to stop running. Is a GIF software? Is the basic circle above software? How much code do you need before something becomes software?</p>
<h2 id="are-svgs-libraries"><a href="https://shkspr.mobi/blog/2026/06/which-copyleft-licence-is-suitable-for-an-svg/#are-svgs-libraries">Are SVGs Libraries?</a></h2>
<p>Licences like the <a href="https://www.gnu.org/licenses/lgpl-3.0.en.html">LGPL</a> and <a href="https://www.mozilla.org/en-US/MPL/2.0/">MPL</a> allow copyleft libraries to be integrated into non-free software.</p>
<p>A proprietary application could treat an SVG as a library by asking the SVG to render the output and then displaying that. A bit of a reach, perhaps?</p>
<h2 id="what-about-embedded-raster-graphics"><a href="https://shkspr.mobi/blog/2026/06/which-copyleft-licence-is-suitable-for-an-svg/#what-about-embedded-raster-graphics">What about embedded raster graphics?</a></h2>
<p>Just to complicate things, an SVG can <em>also</em> contain raster graphics. That is, it is possible to embed a PNG, JPEG, or any other traditional image within an SVG.</p>
<p>In this case, the embedded image <em>can</em> be Creative Commons licenced because <a href="https://wiki.creativecommons.org/wiki/ShareAlike_compatibility:_GPLv3">CC BY-SA is compatible with GPLv3</a>.</p>
<blockquote><p>When someone creates an adaptation of a BY-SA licensed work and includes it in a GPLv3-licensed project, both licenses apply and downstream users must comply with both licenses. However, Section 2(a)(5)(B) of BY-SA 4.0 allows anyone who receives the adapted material downstream to satisfy the conditions of both BY-SA and GPLv3 (i.e. attribution and ShareAlike) <strong>in the manner dictated by the GPLv3</strong>.</p></blockquote>
<p>(Emphasis added.)</p>
<p>The barest of SVGs containing only an embedded image probably wouldn't count as software. But what if you started applying programmatic transformations to them? This SVG embeds an image and uses software to rotate it upside down.</p>
<pre><code class="language-svg"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64">
<image x="0" y="0" width="64" height="64"
transform="rotate(180)"
href="data:image/png;base64,iVB…" />
</svg>
</code></pre>
<p>Is that enough code to count as software?</p>
<h2 id="wisdom-of-the-crowds"><a href="https://shkspr.mobi/blog/2026/06/which-copyleft-licence-is-suitable-for-an-svg/#wisdom-of-the-crowds">Wisdom of the Crowds</a></h2>
<p>I conducted a rigorously accurate public survey. Here are the results:</p>
<blockquote class="mastodon-embed" data-embed-url="https://mastodon.social/@Edent/116221315864205051/embed" style="background: #FCF8FF; border-radius: 8px; border: 1px solid #C9C4DA; margin: 0; max-width: 540px; min-width: 270px; overflow: hidden; padding: 0;"> <a href="https://mastodon.social/@Edent/116221315864205051" target="_blank" style="align-items: center; color: #1C1A25; display: flex; flex-direction: column; font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', Roboto, sans-serif; font-size: 14px; justify-content: center; letter-spacing: 0.25px; line-height: 20px; padding: 24px; text-decoration: none;"> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 79 75"><path d="M63 45.3v-20c0-4.1-1-7.3-3.2-9.7-2.1-2.4-5-3.7-8.5-3.7-4.1 0-7.2 1.6-9.3 4.7l-2 3.3-2-3.3c-2-3.1-5.1-4.7-9.2-4.7-3.5 0-6.4 1.3-8.6 3.7-2.1 2.4-3.1 5.6-3.1 9.7v20h8V25.9c0-4.1 1.7-6.2 5.2-6.2 3.8 0 5.8 2.5 5.8 7.4V37.7H44V27.1c0-4.9 1.9-7.4 5.8-7.4 3.5 0 5.2 2.1 5.2 6.2V45.3h8ZM74.7 16.6c.6 6 .1 15.7.1 17.3 0 .5-.1 4.8-.1 5.3-.7 11.5-8 16-15.6 17.5-.1 0-.2 0-.3 0-4.9 1-10 1.2-14.9 1.4-1.2 0-2.4 0-3.6 0-4.8 0-9.7-.6-14.4-1.7-.1 0-.1 0-.1 0s-.1 0-.1 0 0 .1 0 .1 0 0 0 0c.1 1.6.4 3.1 1 4.5.6 1.7 2.9 5.7 11.4 5.7 5 0 9.9-.6 14.8-1.7 0 0 0 0 0 0 .1 0 .1 0 .1 0 0 .1 0 .1 0 .1.1 0 .1 0 .1.1v5.6s0 .1-.1.1c0 0 0 0 0 .1-1.6 1.1-3.7 1.7-5.6 2.3-.8.3-1.6.5-2.4.7-7.5 1.7-15.4 1.3-22.7-1.2-6.8-2.4-13.8-8.2-15.5-15.2-.9-3.8-1.6-7.6-1.9-11.5-.6-5.8-.6-11.7-.8-17.5C3.9 24.5 4 20 4.9 16 6.7 7.9 14.1 2.2 22.3 1c1.4-.2 4.1-1 16.5-1h.1C51.4 0 56.7.8 58.1 1c8.4 1.2 15.5 7.5 16.6 15.6Z" fill="currentColor"></path></svg> <div style="color: #787588; margin-top: 16px;">Post by @Edent@mastodon.social</div> <div style="font-weight: 500;">View on Mastodon</div> </a> </blockquote>
<script data-allowed-prefixes="https://mastodon.social/" async="" src="https://mastodon.social/embed.js"></script>
<h2 id="final-thoughts"><a href="https://shkspr.mobi/blog/2026/06/which-copyleft-licence-is-suitable-for-an-svg/#final-thoughts">Final Thoughts</a></h2>
<p>Personally, I think SVGs <em>are</em> software. I understand the argument that they're suitable for Creative Commons, but I disagree with it. Even the simplest SVG is distributed in a way that its contents are <em>executed</em> by the computer.</p>
<p>While SVGs may be minified and stripped of comments, they still retain the essence of source code. I suppose you could <em>try</em> to obfuscate them, or package them up in a quasi-binary form, but I maintain the source is still viewable and editable.</p>
<p>If you choose to use a Creative Commons Share-Alike licence, it probably won't cause any harm. But given CC's reluctance to endorse its use on software, it probably makes sense to use a copyleft source-code licence.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=68741&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">Day - James' Coffee Bloghttps://jamesg.blog/2026/06/20/day2026-06-20T00:00:00.000Z
<p>The warm glow at the door, intensified by the morning sun beaming and then reflecting on the blank walls of the hallway, is the first colour I notice when I wake. I then look around and see the blue around the blinds – colour from the evening before, but seen from a new perspective: the hybrid of restfulness and tiredness that occupies the first few moments of the day.</p><p>My eyes are heavy, lingering between the last moments of sleep and the beginning of the new day. When I close my eyes I dream of the day ahead. Idle thoughts come to mind: when will I get up? More serious thoughts arise, too: how can I comprehend the contradictions of modernity? Such thoughts pass. I haven’t had a cup of tea yet.</p><p>I hear the birds sing. When the bird song recedes, I notice breath – life – is the loudest sound I can hear.</p><p>I wake up to a bluer sky than I have seen in a week. I later hear that the weather for the next week is to be sunny. That reminds me: the solstice is coming soon: the longest day. We are always so close to Nature. Memories of music and tales of travel come to mind. Mornings feel like the space for reminiscing and dreaming and waking.</p><p>As I get ready to go on my morning walk – a walk to which I have been looking forward for days, with the sky now clear – I find in my pocket the five pence coin I found outside of a museum. I remember the phrase “Find a penny pick it up, and all day you’ll have good luck. If you pass it to a friend, then your luck will never end.” </p><p>Leaving the house, I sing the songs I played yesterday evening with the world waking up around me: the melody of day.</p><script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a0e9f28b4ca7f07d',t:'MTc4MTk0OTg0Ng=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
Search Is Broken - Kev Quirkhttps://kevquirk.com/search-is-broken2026-06-19T20:28:00.000Z<p>I was listening to <a href="https://latenightlinux.com/late-night-linux-episode-390/">Late Night Linux 390</a> during my evening walking with the pooches tonight, and they were talking about (among other things) <a href="https://kagi.com">Kagi search</a>.</p>
<p>I've tried Kagi myself, but ultimately <a href="https://kevquirk.com/note-20250615-1655">cancelled my subscription</a> as I didn't really see the point in paying for it when I could get similar results with <a href="https://duckduckgo.com">DuckDuckGo</a>.</p>
<p>This isn't because DDG or Kagi are inherently bad, it's because no matter which service you use, the web has been SEO'd to within an inch of its life, so we're fucked either way. That's why I stopped using Kagi as I didn't see the point in paying $10/month for a service that can't fix the web despite having some interesting options to help filter the noise.</p>
<h2>What I do instead</h2>
<p>What I've started doing instead is to use DDG for simple queries that I can quickly and easily get the answer to. For anything more complex, I go to my LLM of choice (currently Gemini) and I ask the question there.</p>
<p>This is because it saves me a tonne of time sifting through all the SEO crap, and I can ask follow up questions too. Win/win.</p> <div class="email-hidden">
<hr />
<p>Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️</p>
<p>You can <a href="mailto:19gy@qrk.one?subject=Search%20Is%20Broken">reply to this post by email</a>, or <a href="https://kevquirk.com/search-is-broken#comments">leave a comment</a>.</p>
</div>