<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Blog - Wilkinson.Graphics</title><description>Thoughts, details, process improvements, and hopefully reasonable takes</description><link>https://wilkinson.graphics/</link><language>en-ca</language><item><title>I Like The WikiReader</title><link>https://wilkinson.graphics/blog/2025-12-20-wikireader/</link><guid isPermaLink="true">https://wilkinson.graphics/blog/2025-12-20-wikireader/</guid><description>What&apos;s 2010 is cool again!</description><pubDate>Sun, 21 Dec 2025 00:58:21 GMT</pubDate><content:encoded>&lt;p&gt;A little while ago my friend Max gave me his WikiReader to play around with. At the time I didn’t really know what to make of the little white square-ish device he handed me, but he said something along the lines of “It’s got all the top Wikipedia articles on it and some company made a dedicated electronic device for reading Wikipedia before that kind of thing was cool again. Just take it and play around with it, you’ll think it’s neat.” Turns out Max was right, I DO think it’s neat! The WikiReader isn’t the greatest way of reading Wikipedia — it’s not even the best way of reading Wikipedia offline — but it is a rare example of a now unsupported electronic device that has aged quite gracefully.&lt;/p&gt;
&lt;h2&gt;Wiki What Now?&lt;/h2&gt;
&lt;figure&gt;
  &lt;img src=&quot;/img/blog/wikireader/wikireader.avif&quot; class=&quot;border-2&quot; alt=&quot;A square-ish device with comfortably rounded corners, large black bezels, and a monochromatic screen displaying a Wikipedia article. Three buttons are on the front labeled search, history, and random.&quot;/&gt;
  &lt;figcaption&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Webrecorder&quot; target=&quot;_blank&quot;&gt;Webrecorder&apos;s Wikipedia page&lt;/a&gt; displayed on the WikiReader.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The WikiReader is a standalone gadget that lets you read Wikipedia articles. It has three buttons (pictured above) and a monochromatic LCD touch screen for keyboard entry, scrolling through pages, and navigating with links. It’s powered by two AAA batteries and loads data from a microSD card. It’s a pretty simple device, however you imagine it working based on the photo is probably mostly correct.&lt;/p&gt;
&lt;p&gt;While any piece of hardware integration is an achievement, the &lt;em&gt;coolest&lt;/em&gt; part of the WikiReader is handing it to somebody else, telling them “this device from 2010 has the entirety of Wikipedia on it”, and watching them try to figure out how that works. In the age of ‘the cloud’, the inner workings of the web are quite abstract for most people: they ask for content from the void and it is returned on their screen. In our modern ‘frictionless’ world, one needn’t concern themselves with where the data actually comes from.&lt;/p&gt;
&lt;p&gt;The WikiReader reminds us that it is &lt;em&gt;also&lt;/em&gt; still possible to serve vast quantities of information directly from the device in your palm. There are no subscriptions required, it doesn’t need an internet connection, you don’t need to sign in with Google, WikiReader doesn’t collect cookies, there are no terms and conditions, there is no privacy policy. You just turn it on and it does the thing you want it to do.&lt;/p&gt;
&lt;h3&gt;So Where Can I Buy One?&lt;/h3&gt;
&lt;p&gt;Check Ebay maybe? Pandigital (the company that produced the device) went bankrupt in 2012, but still exists in some form selling printers today? Their previous work in the e-reader field seems to be missing from their website as of 2025.&lt;/p&gt;
&lt;p&gt;If you already have one though, you can bring it into the modern era!&lt;/p&gt;
&lt;h2&gt;Updating Your WikiReader in 2025&lt;/h2&gt;
&lt;p&gt;Before going under, Pandigital did the responsible thing and open sourced &lt;a href=&quot;https://github.com/wikireader/wikireader&quot;&gt;the entire codebase on GitHub&lt;/a&gt; which was an &lt;em&gt;excellent move&lt;/em&gt;! Developer Stephen Wood has &lt;a href=&quot;https://github.com/stephen-mw/wikireader&quot;&gt;forked the original repo&lt;/a&gt; and created an updated, Dockerized build script to take dumps directly from Wikipedia and convert them to WikiReader compatible text files. Reddit user /u/geoffwolf98 has a similar script and kindly converts Kiwix files to WikiReader-compatible data dumps, uploading the results to the Internet Archive for everyone to use (&lt;a href=&quot;https://archive.org/details/wikireader_zim_202508&quot;&gt;here’s one from August 2025&lt;/a&gt;). If you’re looking at this post in the future, check out the &lt;a href=&quot;https://reddit.com/r/wikireader&quot;&gt;WikiReader subreddit&lt;/a&gt;, there will probably be a more recent one there.&lt;/p&gt;
&lt;p&gt;As for how to &lt;em&gt;actually&lt;/em&gt; update your device: grab a 64GB microSD card and format it as FAT32. Download and copy &lt;a href=&quot;https://archive.org/download/wikireader_zim_root_image/ROOT_IMAGE.7z&quot;&gt;the latest dump of the filesystem from Internet Archive&lt;/a&gt; to the SD card. Finally, copy the &lt;code&gt;enpedia&lt;/code&gt; folder from the updated WikiReader download above to the root of the SD card, and get reading!&lt;/p&gt;
&lt;h2&gt;Offline Wikipedia in the Modern Age&lt;/h2&gt;
&lt;p&gt;Dedicated devices are charming, but if you’ve ever wanted to host an offline archive of cool openly available knowledge &lt;a href=&quot;https://kiwix.org&quot;&gt;Kiwix&lt;/a&gt; is likely the best way to do this today! Kiwix is a web archive player for their ZIM file format (which shares a lot of similarities with Webrecorder’s WACZ except for that it doesn’t rely on WARC records… but hey, sometimes being different is fun). More importantly however, they provide pre-packaged downloads of Wikipedia in multiple languages, various other Mediawiki sites, and many popular game wikis and open source software docs — handy for working while flying, though lots of airlines have wifi at this point. The future is now!&lt;/p&gt;
&lt;p&gt;It takes only a few minutes to &lt;a href=&quot;https://kiwix.org/en/applications/&quot;&gt;download the Kiwix Reader app&lt;/a&gt; for your platform of choice, torrent some ZIM files from &lt;a href=&quot;https://library.kiwix.org&quot;&gt;their library&lt;/a&gt;, and get reading! If you want to deploy this on a network you can also run Kiwix Server to run local copies of any ZIM packaged content for others.&lt;/p&gt;
&lt;p&gt;Personally I run &lt;a href=&quot;https://apps.truenas.com/catalog/kiwix-server/&quot;&gt;Kiwix Server on TrueNAS&lt;/a&gt; and keep a copy of English Wikipedia (with images) around because it makes me happy. Dedicating ~140GB of space on my server seems like a small price to pay for me to know that I’ll likely always be able to access some of the best free knowledge humanity has ever collected whenever I want.&lt;/p&gt;
&lt;h2&gt;Hardware Lessons from the WikiReader&lt;/h2&gt;
&lt;p&gt;There’s a few bits of product strategy that I wish hardware manufacturers would employ that are exemplified in this device.&lt;/p&gt;
&lt;h3&gt;1. Try to keep your device useful after you go bankrupt&lt;/h3&gt;
&lt;p&gt;Max’s WikiReader is working better today than it ever did at launch! Because it adheres to &lt;a href=&quot;https://www.inkandswitch.com/essay/local-first/&quot;&gt;local-first software principles&lt;/a&gt; and functions completely offline, there were no issues when the parent company went under. This is in stark contrast to Spotify’s ‘Car Thing’ which &lt;a href=&quot;https://support.spotify.com/us/article/car-thing-discontinued/&quot;&gt;Spotify recommends &lt;em&gt;throwing away&lt;/em&gt;&lt;/a&gt; or the Humane AI Pin (where customers were at least issued refunds before their devices were &lt;em&gt;purposefully bricked&lt;/em&gt; and the company’s IP was sold to Hewlett Packard).&lt;/p&gt;
&lt;p&gt;Don’t create manufactured garbage.&lt;/p&gt;
&lt;h3&gt;2. Make calculated bets on longevity when integrating tech&lt;/h3&gt;
&lt;p&gt;This device bet on user-replaceable AAA batteries instead of integrated cells and microSD cards over soldered flash. If the batteries degrade, it is usually &lt;em&gt;reasonably&lt;/em&gt; easy to clean off any corrosion or replace the pads. Meanwhile, microSD cards have only gotten larger and cheaper as time has gone on. It cost me 12 bucks to upgrade this one with a 64GB SD card!&lt;/p&gt;
&lt;p&gt;I’m not saying that you need to use swappable batteries for everything of course, but if you’re integrating rechargeable ones, try to ensure that replacing them won’t be a &lt;em&gt;complete&lt;/em&gt; pain in the ass for your customers — rechargeable batteries &lt;em&gt;are&lt;/em&gt; consumable components after all.&lt;/p&gt;
&lt;h3&gt;3. If you make money by selling hardware, consider open sourcing your software&lt;/h3&gt;
&lt;p&gt;The only reason I was able to do any of this is because there was a clear path for some well intentioned folks with the requisite skills to make their tech work for them. Could the devs I mentioned above have reverse engineered the file format? Probably! Is that more work? Absolutely!&lt;/p&gt;
&lt;p&gt;The latter is a troubling status quo in the smart home space. Companies will sell locked down hardware products and &lt;a href=&quot;https://jmswrnr.com/blog/hacking-a-smart-home-device&quot;&gt;some nerd will spend ungodly amounts of time reverse engineering Home Assistant compatible firmware for their air purifier because they just want it to talk to everything else without a dumb proprietary app&lt;/a&gt;.&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn1&quot; id=&quot;fnref1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; Proprietary software for your otherwise standalone hardware device signs its death warrant for the day you stop maintaining it.&lt;/p&gt;
&lt;p&gt;Give your customers the means to maintain to the thing they bought from you!&lt;/p&gt;
&lt;hr class=&quot;footnotes-sep&quot;&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Do you own a Car Thing? Don’t just throw it out! You can make it do cool stuff again with &lt;a href=&quot;https://deskthing.app/&quot;&gt;Desk Thing&lt;/a&gt;! &lt;a href=&quot;#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn2&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Regarding smart home stuff, I prefer to rely on “some nerd on the internet” over a large company &lt;em&gt;every time&lt;/em&gt;. The maintenance and longevity standards that the open source smart home community has are pretty much always higher than what corporate America is willing to provide. &lt;a href=&quot;#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded><author>Henry Wilkinson</author></item><item><title>Affinity is Free! ...But at What Cost?</title><link>https://wilkinson.graphics/blog/2025-11-01-affinity-is-free/</link><guid isPermaLink="true">https://wilkinson.graphics/blog/2025-11-01-affinity-is-free/</guid><description>My thoughts on the state of graphics software in 2025</description><pubDate>Mon, 03 Nov 2025 05:44:00 GMT</pubDate><content:encoded>&lt;p&gt;For the past four years, I’ve been using Serif’s Affinity suite as my primary tools for bitmap editing, vector graphics, and publication design. I own licenses for both V1 and V2 of the software and have paid Serif a total of $324.96 CAD — a HECK of a bargain considering that for the same period of time, at their current prices, Adobe Creative Cloud would cost $4,419.48 CAD at their annual prepaid rate! I think a lot of creative professionals (and amateurs) chose Affinity for these cost savings, but I was equally attracted to some of the ways it excels over Adobe’s offerings. Affinity’s 32-bit colour and OCIO support is unmatched in the vector editing space, and their non-destructive filters and effects are a big step up from Adobe’s tools. Perhaps most attractive though was the license itself, unlike Adobe’s rental model where one must pay on an ongoing basis (presumably forever) for the privilege of opening project files, Affinity’s traditional licensing model ensured that whatever you made with their suite would be yours: Openable forever… or at least until the software no longer runs on your updated machine.&lt;/p&gt;
&lt;p&gt;Recently however, the deal has been altered. After &lt;a href=&quot;https://www.canva.com/newsroom/news/affinity/&quot;&gt;Canva’s acquisition of Serif in 2024&lt;/a&gt;, the new V3 release of Affinity will be integrated into their existing offerings, and moving forward &lt;a href=&quot;https://www.youtube.com/watch?v=CzPzRxDoirM&quot;&gt;it’s going to be free&lt;/a&gt;! I’ve had quite a few people message me about this change knowing that I’m an Affinity user so here it is: My thoughts on the state of graphics software in 2025!&lt;/p&gt;
&lt;h2&gt;The Lead-up&lt;/h2&gt;
&lt;p&gt;On October 6th Canva announced that they’d be setting the Affinity forums to read-only and moving the community to Discord. The ability to purchase the V2 edition of the Affinity suite was also disabled and all users had to go off of was the following message on their site:&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;/img/blog/affinity-is-free/homepage.avif&quot; class=&quot;border-2&quot; alt=&quot;Screenshot of the Affinity website with text reading: Creative freedom is coming, Sign up to be the first to know. True creative freedom is just around the corner. October 30.&quot;/&gt;
  &lt;figcaption&gt;The &quot;see the future first&quot; button let you enter your name and email address. The last thing I want is more email so I opted to see the future at the same time as everyone else.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;My girlfriend also uses Affinity and had recently created some social media templates in Designer for a client. She was supposed to onboard that client to the software last month, but instead of being able to set her client up with a license or trial, she had to tell her client that they were just shit out of luck until the 30th when &lt;em&gt;something&lt;/em&gt; was supposed to happen. What a deeply unprofessional situation to be in!&lt;/p&gt;
&lt;p&gt;I don’t know how I would have handled this better short of processing refunds for every customer that bought it that month (which is what I assume they were trying to avoid) and I can also understand wanting to avoid rug-pulling your customers who &lt;em&gt;just&lt;/em&gt; bought the software as you discontinue the release train to offer the next version for free. Every option has tradeoffs and I’m sure this was carefully considered, but if the announcement for your software licensing change announcement personally inconveniences my partner, its hard to be stoked about it.&lt;/p&gt;
&lt;h2&gt;The Actual Announcement&lt;/h2&gt;
&lt;p&gt;Alright, so we’ve waited a month! What’s the deal!?&lt;/p&gt;
&lt;p&gt;Well, Affinity is free now, or more accurately “freemium” — a pricing model where the core features of the software are offered for no charge with others available as paid add-ons. The paid add-ons today are (unsurprisingly for 2025) “AI” features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Generative fill, editing, and canvas expansion (Gen AI)&lt;/li&gt;
&lt;li&gt;“Super-resolution” image upscaling (ML)&lt;/li&gt;
&lt;li&gt;Photo colourization (ML)&lt;/li&gt;
&lt;li&gt;Background removal (ML)&lt;/li&gt;
&lt;li&gt;Portrait blur &amp;amp; depth-based selection tools (ML)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The term “AI” is so broadly scoped these days it’s almost meaningless. Canva has chosen to break down the complexity of the machine learning algorithms they’re using in the tooltips as “Gen AI” or “ML”. “Gen AI” features so far are processor intensive &lt;a href=&quot;https://en.wikipedia.org/wiki/Text-to-image_model&quot;&gt;text-to-image diffusion models&lt;/a&gt; that run in the cloud and are presumably trained off of a vast corpus of other people’s work, while their machine learning (ML) counterparts all use less complex and finely scoped individual models that run locally on your device. All of the features in the above list are paywalled behind a $19 CAD / month Canva Pro subscription. To really hammer this point home: Machine learning models (generative models included) are simply compute processes. It is not sustainable to give users free access to cloud computing resources, but there is no reason to charge users on an ongoing basis to run models locally other than “hey, that’s our business model and its how we make money so we can keep developing software”.&lt;/p&gt;
&lt;p&gt;Outside of these “AI” features though, the core tooling remains pretty much the same but all with the tools from all three apps integrated into one interface. There’s an image trace feature now which is nice, but still no blend tool. The new Live Glitch filter is neat and brings Affinity closer to replacing some of the things I use Nuke for today. I assume the built in Canva export feature will only get better over time and I’m excited to see what the future of that holds. Love it or hate it, lots of people use Canva’s primary product and if the company wants to try and gain some marketshare with creative professionals by offering them better ways of interfacing with their less-technical coworkers who are mostly template reliant, I’m all for it.&lt;/p&gt;
&lt;hr&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/v9YR9KeCJDY&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen class=&quot;w-full aspect-video border-2&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;One day after release, Canva’s Chief Product Officer Cameron Adams released a short two minute video attempting to answer some questions people understandably had about this change. He clarified some of the terms and conditions incongruities&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn1&quot; id=&quot;fnref1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; around using user-data to train generative models (he says they wont do that), and gave the following statement on &lt;em&gt;why&lt;/em&gt; Affinity is now free:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;So why make it free then?&lt;/p&gt;
&lt;p&gt;Because we believe that every designer deserves access to tools that respect their craft. Because the industry needs a shift from gatekeeping to generosity. And because we’ve built a sustainable business model at Canva that allows us to support this kind of access without compromising on product quality or user trust.&lt;/p&gt;
&lt;p&gt;This isn’t a marketing stunt, it is a long term bet on creative freedom.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Really? &lt;em&gt;From gatekeeping to generosity?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Lets be very clear: Canva is a business, not a charity. While the exact acquisition price was not disclosed, &lt;a href=&quot;https://www.forbes.com.au/news/innovation/canva-acquires-affinity-software/&quot;&gt;Forbes Australia reported the amount to be ~$516 million CAD&lt;/a&gt; at the time. If I was one of Canva’s investors and watched them throw around 500 million dollars on a lark with a plan that only amounted to “being generous and giving some stuff away because we’re good guys”, they’d be getting one hell of a phone call.&lt;/p&gt;
&lt;p&gt;Affinity’s new pricing model was announced on the final day of Adobe Max 2025&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn2&quot; id=&quot;fnref2&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; and Canva undoubtedly bought this software to expand their value offering into more professional tools that will allow them to compete directly with Adobe. This is good! Commendable even, but to take their statement — that they’re all about generosity and love you very much — &lt;em&gt;purely&lt;/em&gt; at face value is to be a massive chump. I find this language insulting.&lt;/p&gt;
&lt;p&gt;If Canva &lt;em&gt;actually&lt;/em&gt; wants to make a “shift to generosity”, they should make a &lt;a href=&quot;https://en.wikipedia.org/wiki/Ulysses_pact&quot;&gt;Ulysses pact&lt;/a&gt; and open source Affinity.&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn3&quot; id=&quot;fnref3&quot;&gt;3&lt;/a&gt;&lt;/sup&gt; The second they do it I’ll sing their praises till kingdom come.&lt;/p&gt;
&lt;h2&gt;Optimism&lt;/h2&gt;
&lt;p&gt;This might just be the kick in the pants Adobe needed to spur some real competition. Affinity Designer launched in 2014 with Photo in 2015 and Publisher in 2019, and in that time Adobe has continued to dominate the market with Photoshop, Illustrator, and InDesign. While I don’t believe in his flowery language, Adams’ principal statement of “we already make our money with our core business offering” rings true to me, and I think plenty of Canva’s customers will be better served by Affinity’s tooling, especially if they continue to improve the handoff between Affinity and Canva. Their thesis of making money by continuing to sell to marketing teams and solidifying Canva’s vendor lock-in by improving the pipeline between creative and marketing seems solid to me.&lt;/p&gt;
&lt;p&gt;I also remain hopeful that the larger pool of resources that Canva has access to can drive them closer to feature parity with other software packages. It’s a long uphill battle but they’ve been at it for a while and seem to have a really solid foundation to continue to build upon.&lt;/p&gt;
&lt;h2&gt;Pessimism&lt;/h2&gt;
&lt;p&gt;…But what happens once they become the dominant player in the market? Or leadership changes? Or a new product manager at Canva is tasked with &lt;em&gt;delivering more value&lt;/em&gt; for Canva Pro users? Only time will tell, but I suspect any truly negative repercussions of this move will only start to surface after a few years at least. The requirement to log into Canva for what is supposed to be a free local application is ridiculous. Prompt people to do that when &lt;em&gt;required&lt;/em&gt; to access payment-gated or collaborative features! This reeks of future enshitification plans and lets Canva shut down your access to their (currently) free software at any time on their terms. Currently the program appears to invalidate licenses if the date computer’s date is set to a year from now meaning that even if you log in today, you will need to do &lt;em&gt;something&lt;/em&gt; (update the app, log in, etc) in a year to validate your free “license”! This seems wholly unnecessary for a truly free piece of software and is a good example of the type of risk that you adopt by using this software as it stands today.&lt;/p&gt;
&lt;p&gt;What I think I’ll miss most in this shift is losing my license to the software. Under the previous agreement, I owned a thing! Now I no longer have the opportunity to own new versions, they are just provided to me by Canva on an ongoing basis (because they’re generous, or so I’m told). Because of this license, I get to continue to use my V2 Affinity apps until they shut down the license server which will inevitably be annoying. If Canva decides to push a final update to V2 that disables the activation requirement or adds local key-based licenses, they’d gain some goodwill here.&lt;/p&gt;
&lt;h2&gt;Future Plans&lt;/h2&gt;
&lt;p&gt;Despite all my grumbling, I’m going to keep using it! I continue to own my license for V2 and V3 changes so little that I might just keep using it until they come up with some compelling reasons for me to switch. I don’t plan on purchasing a Canva Pro subscription — I’ve found that generative AI isn’t all that useful for the visual work that I create and I’m wary of the currently untested copyright implications. All things considered, I think the future is still a pretty bright one here, but this change isn’t without its downsides.&lt;/p&gt;
&lt;p&gt;Specifically, I’m reminded of YouTube creator &lt;a href=&quot;https://www.youtube.com/watch?v=I4mdMMu-3fc&quot;&gt;EndVertex’s excellent video essay on for-profit creative software&lt;/a&gt;&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn4&quot; id=&quot;fnref4&quot;&gt;4&lt;/a&gt;&lt;/sup&gt; and the conclusion they arrived at. Creative software is complex: It is hard and time consuming to develop, and learning to use it is equally involved. These barriers to entry for developers and users alike create moats and disruptions in the market like this are rare.&lt;/p&gt;
&lt;p&gt;I want an escape hatch and because Canva doesn’t seem to want &lt;em&gt;my&lt;/em&gt; money anymore I’ve decided to give &lt;a href=&quot;https://graphite.rs/&quot;&gt;Graphite&lt;/a&gt; $140 CAD — the previous upgrade cost that I paid for V2 of the Affinity suite. Graphite is an open source, Rust-based 2D graphics package built with procedural workflows at its core. It’s still early days and far from ready to be my preferred design software but they’ve made great progress over the last three years and I’m excited to see their scrappy and driven team continue to knock features off their very ambitious roadmap.&lt;/p&gt;
&lt;p&gt;May the best graphics package win!&lt;/p&gt;
&lt;hr class=&quot;footnotes-sep&quot;&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Technically this would be $5,099.40 CAD because in order to get their best rate here you need to pay up front for the whole year and we’re four months over the 4 year mark. I’m trying to be charitable for the sake of comparing these expenses and dividing that rate by 12 to get the average monthly cost of that plan. Adobe’s pricing plans are so finely tuned to juice money out of people it makes Canadian telecom look tame by comparison :\ &lt;a href=&quot;#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn2&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;At release, Affinity requires users to sign in with a Canva account. Within Affinity, by default Canva opts-out their users from sharing interaction data. In Canva however, by default user data is opted-in for training. This (currently) explicitly covers data &lt;em&gt;uploaded to Canva&lt;/em&gt; and interaction usage &lt;em&gt;within Canva&lt;/em&gt; — Affinity continues to use local files and based on some cursory firewall analysis, doesn’t appear to be sending them anywhere, though I suspect the game changes if you use the generative cloud-based “AI” features within Affinity which are explicitly labeled as “Canva AI”. If you want to turn these permissions off, you can do so within &lt;a href=&quot;https://www.canva.com/account/privacy-preferences&quot;&gt;Canva’s privacy settings&lt;/a&gt;. &lt;a href=&quot;#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn3&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Cheeky, I like it. &lt;a href=&quot;#fnref3&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn4&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Start small, do the file format! Make something that lasts! &lt;em&gt;Change the industry forever!&lt;/em&gt; &lt;a href=&quot;#fnref4&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn5&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;I highly recommend giving this a look if you have an hour and really want an overview about how artists and creatives view the state of their professional tools. It might take a few minutes to get into, but stick with it, it’s a great watch. &lt;a href=&quot;#fnref5&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded><author>Henry Wilkinson</author></item><item><title>Mapping Underground Structures with 3D Scans</title><link>https://wilkinson.graphics/blog/2025-10-25-3d-mapping/</link><guid isPermaLink="true">https://wilkinson.graphics/blog/2025-10-25-3d-mapping/</guid><description>My recent dive into indoor mapping with OpenStreetMap using photogrammetric references.</description><pubDate>Sat, 25 Oct 2025 20:05:00 GMT</pubDate><content:encoded>&lt;p&gt;Despite having a passion for technology, I generally upgrade my phone every 6 years or so. One of the features I have been most excited about this time around is the LIDAR sensor on the iPhone 17 Pro. After some initial success using Niantic’s free &lt;a href=&quot;https://scaniverse.com/&quot;&gt;Scanniverse&lt;/a&gt; app to help make furniture decisions while apartment hunting, I decided to have a go at using it to capture some information to feed &lt;a href=&quot;https://www.openstreetmap.org/&quot;&gt;OpenStreetMap&lt;/a&gt;, my favourite open-data obsession.&lt;/p&gt;
&lt;h2&gt;Scanning&lt;/h2&gt;
&lt;p&gt;The scanning part is easy! Last week after side project night at &lt;a href=&quot;https://1rg.space/&quot;&gt;1RG&lt;/a&gt;, I fired up Scanniverse as I entered the subway and went to town walking around the concourse level with my phone trying to avoid anybody who might walk through the shot. The model is full of holes and far from perfect but the goal here isn’t a digi-double, I just need the dimensions of the structure. This part took about 5 minutes which included a few retries.&lt;/p&gt;
&lt;model-viewer src=&quot;/3d/blog/2025-10-23-dundas-west.glb&quot; ar ar-modes=&quot;webxr scene-viewer quick-look&quot; camera-controls tone-mapping=&quot;aces&quot; poster=&quot;../../assets/static-img/blog-thumbnails/3d-mapping.jpg&quot; shadow-intensity=&quot;1&quot; exposure=&quot;1&quot; shadow-softness=&quot;1&quot; camera-orbit=&quot;-62.67deg 70.12deg 68.61m&quot; field-of-view=&quot;20deg&quot; class=&quot;w-full h-128&quot; alt=&quot;3D model showing the interiour of Dundas West&apos;s concourse level below ground. The model has holes in it, but the main walls are visible.&quot;&gt;
    &lt;div class=&quot;progress-bar hide&quot; slot=&quot;progress-bar&quot;&gt;
        &lt;div class=&quot;update-bar&quot;&gt;&lt;/div&gt;
    &lt;/div&gt;
&lt;/model-viewer&gt;
&lt;p&gt;I’ve used &lt;a href=&quot;https://alicevision.org/#meshroom&quot;&gt;Meshroom&lt;/a&gt; in the past for scene reconstruction and 3D camera tracking, and &lt;a href=&quot;https://poly.cam/&quot;&gt;Polycam&lt;/a&gt; for quickly grabbing space dimensions and floor plans on a friend’s device. Meshroom is great and still my preferred choice for more advanced photogrammetry pipelines, but the fact that I can get dimensionally accurate models of spaces in 5 minutes by waving my phone around is kind of amazing. Scanniverse fits in this perfect spot of super basic and good enough output for 3D meshes, but it can also generate &lt;a href=&quot;https://en.wikipedia.org/wiki/Gaussian_splatting&quot;&gt;gaussian splats&lt;/a&gt; which are super cool… and perhaps a topic for the future.&lt;/p&gt;
&lt;img src=&quot;/img/blog/3d-mapping/blender-scan.avif&quot; class=&quot;border-2&quot; alt=&quot;Screenshot of the subway station loaded in Blender with extra walls placed in to fill in the holes.&quot;/&gt;
&lt;p&gt;After bringing my scan into Blender as a USDZ file, I deleted the poorly captured ceiling so none of the floor space was obscured, filled in some of the missing walls dimensions to help with tracing later, and rendered it out in with an orthographic camera. Because the scans are dimensionally accurate I also took note of the height (2.5m) to add as a property to the rooms later in OSM.&lt;/p&gt;
&lt;h2&gt;Mapping&lt;/h2&gt;
&lt;p&gt;Interior mapping has existed for a while in Google and Apple Maps, you’ll sometimes see interior maps available in airports or shopping centres. If you’ve never seen them before, here’s an example of Toronto’s Eaton Centre in Apple Maps.&lt;/p&gt;
&lt;img src=&quot;/img/blog/3d-mapping/eaton-centre.avif&quot; class=&quot;border-none&quot; alt=&quot;Screenshot of the eaton Centre in Apple Maps showing the inside of the shopping mall with store names and corridors.&quot;/&gt;
&lt;p&gt;On the OSM side of things, there are far fewer examples of great indoor maps. Today the user experience for surveying indoor spaces and bringing that data into editors isn’t nearly as polished as editing from satellite imagery is, but here’s how I went about it!&lt;/p&gt;
&lt;img src=&quot;/img/blog/3d-mapping/josm-image-editing.avif&quot; class=&quot;border-2&quot; alt=&quot;Screenshot of JOSM showing of the subway station overlaid atop satellite imagery. Basic room shapes have been traced overtop the 3D render.&quot;/&gt;
&lt;p&gt;First I had to get my rendered floor plan into an OSM editor to use as a reference. Normally I use the iD editor built into the OSM website but as of writing it doesn’t support importing and aligning arbitrary images&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn1&quot; id=&quot;fnref1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;. JOSM supports this with the &lt;a href=&quot;https://josm.openstreetmap.de/wiki/Help/Plugin/PicLayer&quot;&gt;PicLayer plugin&lt;/a&gt; and while I generally find JOSM pretty unintuitive to use, I was able to tough it out here. After aligning the image to the satellite imagery as best I could based on my knowledge of the space, I added shapes for the rooms, hallways, and elevators, and pushed up my changes for continued editing in iD.&lt;/p&gt;
&lt;img src=&quot;/img/blog/3d-mapping/id-final-result.avif&quot; class=&quot;border-2&quot; alt=&quot;Screenshot of the iD editor showing additional shapes of corridors and routing lines overlaid atop satellite imagery of the station.&quot;/&gt;
&lt;p&gt;If you’re unfamiliar with iD, this view probably doesn’t look any more intuitive than the last one… But I’ve been using this editor for more than 10 years now so I guess I like it. Here I added the stairwell rooms and paths for routing and adjusted the tracks and platforms based on the newly landmarked concourse level. One of the best parts of iD is the &lt;a href=&quot;https://github.com/openstreetmap/id-tagging-schema/&quot;&gt;iD tagging schema&lt;/a&gt; where developers have done a great job of formalizing OSM’s folksonomy of tags into a list of suggested fields for users. If you provide people with clear form fields to fill out, you’ll get better data!&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;If you want to see this work rendered, you can &lt;a href=&quot;https://openlevelup.net/?l=-1#21/43.65697/-79.45296&quot;&gt;check it out using OpenLevelUp!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Dundas West is nicer and more accurate now, but will anybody &lt;em&gt;actually&lt;/em&gt; use this data? As of today, &lt;a href=&quot;https://wiki.openstreetmap.org/wiki/Indoor_Mapping#Apps&quot;&gt;most popular OpenStreetMap clients don’t support indoor tagging&lt;/a&gt; and the ones that do have been built with pretty much the sole purpose of displaying indoor map data for editors. I think this is mostly a chicken and egg problem. While the &lt;a href=&quot;https://wiki.openstreetmap.org/wiki/Simple_Indoor_Tagging&quot;&gt;simple indoor tagging&lt;/a&gt; spec is reasonably complete and implemented both in iD and JOSM (with plugins), iD doesn’t have a great workflow for getting survey data into the program and doesn’t provide an interface for filtering data by &lt;code&gt;level&lt;/code&gt; values. You may also note that while rendering out to an image worked &lt;em&gt;okay&lt;/em&gt; in the end, I lost the model’s accurate scale information along the way.&lt;/p&gt;
&lt;p&gt;All of these are solvable problems and it’s important to remember that this is all open source software — most of it is developed on either a volunteer or grant-funded basis. My hope would be that the authoring tools can continue to improve leading to better data availability which should push more popular clients like &lt;a href=&quot;https://www.comaps.app/&quot;&gt;CoMaps&lt;/a&gt; to implement indoor rendering and keep pushing the navigation experience forward.&lt;/p&gt;
&lt;p&gt;As I think I’ve been able to show here though, the question of where to obtain good ground-truth data for mapping indoor spaces is pretty much answered, and it fits in your pocket!&lt;/p&gt;
&lt;hr class=&quot;footnotes-sep&quot;&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;If you’re the type of person that thinks this stuff is neat and in Toronto you should come hang! Check out the &lt;a href=&quot;https://luma.com/1rg-calendar&quot;&gt;1RG calendar on Luma&lt;/a&gt;. &lt;a href=&quot;#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn2&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;If you &lt;em&gt;must&lt;/em&gt; do this in iD today, you can use &lt;a href=&quot;https://mapwarper.net/&quot;&gt;Map Warper&lt;/a&gt; to align your image with a reference map. I personally find relying upon a 3rd party map alignment service to be a less-than-great user experience, but hey it’s there if you need it! &lt;a href=&quot;#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded><author>Henry Wilkinson</author></item><item><title>Obligatory Gen-AI Statement</title><link>https://wilkinson.graphics/blog/2025-08-11-gen-ai-usage/</link><guid isPermaLink="true">https://wilkinson.graphics/blog/2025-08-11-gen-ai-usage/</guid><description>I&apos;m (currently) not using generative writing tools on this site.</description><pubDate>Mon, 11 Aug 2025 23:46:32 GMT</pubDate><content:encoded>&lt;p&gt;It’s 2025 and the machines are spewing out written content quicker than we can consume it! Unsurprisingly, everyone has a take. This post will be light on opinions outside the scope of my own work. The intention here is to present some “nutrition facts” type information so you can understand what you’re consuming on this site.&lt;/p&gt;
&lt;p&gt;In short: My thoughts! They’re from me!&lt;/p&gt;
&lt;p&gt;While I have used and will likely continue to make use of LLMs — mostly for code debugging — I find when a machine starts doing the bulk of the writing for you it isn’t really &lt;em&gt;your&lt;/em&gt; writing anymore. The end result might convey the messages you had in mind, but it’s more akin to delegating the work and rubber-stamping it with your approval after review. I want my blog entries and project writeups to be valuable because they explain &lt;em&gt;my&lt;/em&gt; process and thoughts, as such, I am not using generative tools to write content for this site at this time. Should this no longer be the case, I’ll probably post about how and why while attempting to milk this change in approach for clout on LinkedIn.&lt;/p&gt;
&lt;p&gt;I admittedly find it slightly frustrating that em dashes, usage of lists, and generally “proper” markup and formatting have become associated by some with low-effort, LLM-generated content. I don’t use the proper dashes because I made a machine spit out my post, I use them because I learned about them in typography class and I like &apos;em!&lt;/p&gt;
&lt;h2&gt;But I Wanted Hot Takes!&lt;/h2&gt;
&lt;p&gt;I don’t really feel like I have much new critique regarding the various “AI” technologies of the present. My opinions are pretty much a mishmash of the following blog posts or articles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://steveklabnik.com/writing/i-am-disappointed-in-the-ai-discourse/&quot;&gt;I Am Disappointed in the AI Discourse&lt;/a&gt; by Steve Klabnik&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lithub.com/what-happened-when-i-tried-to-replace-myself-with-chatgpt-in-my-english-classroom/&quot;&gt;What Happened When I Tried to Replace Myself with ChatGPT in My English Classroom&lt;/a&gt; by Piers Gelly&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://distantprovince.by/posts/its-rude-to-show-ai-output-to-people/&quot;&gt;It’s Rude to Show AI Output to People&lt;/a&gt; by Alex Martsinovich&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thomashunter.name/posts/2025-03-19-ai-llms-will-change-the-world&quot;&gt;AI Will Change the World But Not in the Way You Think&lt;/a&gt; by Thomas Hunter II&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>Henry Wilkinson</author></item><item><title>You (Probably) Shouldn&apos;t Pay For QR Codes</title><link>https://wilkinson.graphics/blog/2025-07-15-qr-code-scam/</link><guid isPermaLink="true">https://wilkinson.graphics/blog/2025-07-15-qr-code-scam/</guid><description>A &quot;dynamic QR code&quot; is just a link shortener with extra steps.</description><pubDate>Tue, 15 Jul 2025 04:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Over the past year, I’ve born witness to a few of my less-computery friends getting duped by a nasty &lt;a href=&quot;https://www.deceptive.design&quot;&gt;deceptive pattern&lt;/a&gt;. The scheme works as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A designer needs to add a QR code to some work, but they don’t know how to make one!&lt;/li&gt;
&lt;li&gt;They Google “QR code generator” and are fed a bunch of websites that appear to solve their problem.&lt;/li&gt;
&lt;li&gt;These websites offer free trials of “dynamic QR codes”, the user signs up for the site, creates a QR code, and gets it printed.&lt;/li&gt;
&lt;li&gt;The free trial runs out! Their “dynamic QR code” has already gone to print and won’t work unless they pay for the site’s monthly subscription to make their links work again.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Unscrupulous business practices can either be curbed with legislation or consumer education, I’m not a government official so I’ll have to settle for the latter!&lt;/p&gt;
&lt;h2&gt;A Brief Intro to QR Codes&lt;/h2&gt;
&lt;p&gt;This video from YouTube creator Veritasium offers a great intro to the technical details of QR codes. TL;DW it’s just a bunch of squares a computer can decode into text! &lt;strong&gt;QR codes themselves aren’t “dynamic” and have no server-side requirements. All the decoding is done on the user’s device.&lt;/strong&gt; When a website references a “dynamic QR code” what they are &lt;em&gt;really&lt;/em&gt; talking about is a link shortener that redirects users to your desired link, usually tracking the number of visitors to the shortened link for analytics purposes.&lt;/p&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/w5ebcowAJD8?si=33Nr6Ga22HaGlAvn&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen class=&quot;w-full aspect-video border-2&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;If you’re looking for an in-depth text explanation, the &lt;a href=&quot;https://en.wikipedia.org/wiki/QR_code&quot;&gt;QR Code Wikipedia page&lt;/a&gt; probably has all the details you’d ever want. If you’re looking for &lt;em&gt;more&lt;/em&gt; than that, well, you probably know more about QR codes than I do. What are you even reading this for? Go decode some dots with your mind, magic man.&lt;/p&gt;
&lt;h2&gt;The Gambit&lt;/h2&gt;
&lt;p&gt;On a new private browsing tab with uBlock Origin disabled, I searched for “QR code generator” on Google and landed on &lt;a href=&quot;http://qr.io&quot;&gt;qr.io&lt;/a&gt;, the top sponsored result. The landing page helpfully delivers the user right into the editor where they can configure various aspects of the code’s look. If you scan the code, it decodes into exactly what is entered into the form, in this case: &lt;code&gt;https://wilkinson.graphics&lt;/code&gt;&lt;/p&gt;
&lt;img src=&quot;/img/blog/qr-codes/code-creation.avif&quot; class=&quot;border-2&quot;/&gt;
&lt;p&gt;The “Download QR code” button doesn’t do what it says… It asks you to enter your email instead! Of course I’ve already invested some time getting this code to look like I want, it’s got a branded orange border and everything! I’m happy with it so sure, if my email is what it takes, I’ll hand it over. Gimmie my code!&lt;/p&gt;
&lt;img src=&quot;/img/blog/qr-codes/email-collection.avif&quot; class=&quot;border-2&quot;/&gt;
&lt;p&gt;After forking over my contact info, I was presented with real download links — and they support all the filetypes you’d ever need!&lt;/p&gt;
&lt;img src=&quot;/img/blog/qr-codes/code-download.avif&quot; class=&quot;border-2&quot;/&gt;
&lt;p&gt;…But wait, the downloaded QR code does NOT link directly to my site! Instead, it decodes to &lt;code&gt;https://qr.link/h1WamE&lt;/code&gt;, a shortened link that (unless I continue pay for the service after my trial is up) will cease to function after 7 days. The price to keep your link functional after the trial period is $35 USD/month. Nowhere is the user informed that the code will stop working, heck &lt;a href=&quot;http://qr.io&quot;&gt;qr.io&lt;/a&gt;’s homepage doesn’t even mention that their service costs money!&lt;/p&gt;
&lt;p&gt;The dashboard &lt;em&gt;does&lt;/em&gt; have a prompt asking users to review the service on &lt;a href=&quot;https://www.trustpilot.com/review/qr.io&quot;&gt;their Trustpilot page&lt;/a&gt;. As of posting they have an average score of 4.4/5 with over 10,000 reviews, 81% of which are 5 stars and 11% of which are 1 star.&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn1&quot; id=&quot;fnref1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; Despite the deluge of 5 star one sentence reviews, it didn’t take me long to land upon a designer from New Zealand who had fallen into the &lt;em&gt;exact deceptive pattern&lt;/em&gt; above.&lt;/p&gt;
&lt;figure&gt;
  &lt;div class=&quot;w-full flex justify-center&quot;&gt;
    &lt;img src=&quot;/img/blog/qr-codes/review.avif&quot; class=&quot;max-w-128 w-full border-2&quot; alt=&quot;Joshua&apos;s review: Scummy practise - wording is misleading stating that &apos;static&apos; QR codes never expire. What they don&apos;t tell you: your QR codes you generate are by default their &apos;dynamic&apos; code with no option to switch to static or create as static from the start. You cannot use this service without paying. Free to use for seven days isn&apos;t explicitly stated and I bet many have fallen for this. Imagine printing what you think is a functional QR code and then only realising afterwords that it doesn&apos;t work on 500 flyers a week later (for example, luckily I caught this before it happened to me). Once your trial ends, bam, QR code stops functioning unless your fork over money. Would be a great paid service but don&apos;t weasel word your way into getting people on board, slimy practise. A company rep responds noting that they&apos;ve read Joshua&apos;s review and asks him to contact them via email to get things sorted out.&quot;/&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;
    Oh, good! They&apos;re aware of the issue. 🙃
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Other negative reviews allege their subscription &lt;a href=&quot;https://ca.trustpilot.com/reviews/685e918d78532dba61568895&quot;&gt;is particularly difficult to cancel&lt;/a&gt;. Some users have reported being &lt;a href=&quot;https://ca.trustpilot.com/reviews/685def60df54af9fbadd1528&quot;&gt;“locked out of their accounts”&lt;/a&gt; unable to change their billing settings while continuing to be charged.&lt;/p&gt;
&lt;p&gt;I reached out to &lt;a href=&quot;http://qr.io&quot;&gt;qr.io&lt;/a&gt; for comment but I have not received a response.&lt;/p&gt;
&lt;h2&gt;How SHOULD I Make QR Codes?&lt;/h2&gt;
&lt;p&gt;I’ve used &lt;a href=&quot;http://qr.io&quot;&gt;qr.io&lt;/a&gt; as an example here but they’re far from the only ones running this playbook. Be wary of any site that lets you create codes for “free” and asks for your email.&lt;/p&gt;
&lt;p&gt;If you &lt;em&gt;know&lt;/em&gt; you need the analytics and tracking afforded by a link shortener service that generates QR codes, you’re already doing great! No complaints from me, consider your choices validated.&lt;/p&gt;
&lt;p&gt;For the rest of everyone else, there are plenty of good, actually free QR code generators that will encode &lt;em&gt;exactly&lt;/em&gt; what you give them. Here’s a few choice options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;a href=&quot;https://affinity.serif.com&quot;&gt;Affinity Suite&lt;/a&gt; has a &lt;a href=&quot;https://affinity.help/designer2/en-US.lproj/index.html?page=pages/CurvesShapes/draw_qrCodes.html&amp;amp;title=QR%20codes&quot;&gt;QR code shape tool&lt;/a&gt;! You don’t even need to leave the program to use it.&lt;/li&gt;
&lt;li&gt;Canva has an &lt;a href=&quot;https://www.canva.com/qr-code-generator/&quot;&gt;official QR code creator app&lt;/a&gt;. It’s rather basic, but it works for links.
&lt;ul&gt;
&lt;li&gt;Canva also has loads of 3rd party QR code generator apps, some of which are likely good and others that try to pull a fast one on you.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Estee Tey’s &lt;a href=&quot;https://mini-qr-code-generator.vercel.app/&quot;&gt;Mini QR&lt;/a&gt; web app is a pretty great &lt;a href=&quot;https://github.com/lyqht/mini-qr&quot;&gt;open source&lt;/a&gt; web-based option! It also has lots of fun styling settings.
&lt;ul&gt;
&lt;li&gt;A lot of other developers have made similar open source projects! There is no shortage of QR code generators that do &lt;em&gt;exactly what they say&lt;/em&gt; available on GitHub.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://qrbtf.com/&quot;&gt;QRBTF&lt;/a&gt; is an &lt;a href=&quot;https://github.com/latentcat/qrbtf&quot;&gt;open source&lt;/a&gt; web app that transforms regular QR codes into scannable, full colour images using diffusion models. It’s not entirely free to use, and I have my gripes with diffusion models, but even I have to admit it’s a pretty cool use of them.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr class=&quot;footnotes-sep&quot;&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;And hey, fair enough, the form hasn’t been submitted yet so how could the site generate the shortened tracking link! That said, I still think this is a pretty dirty trick. The website is &lt;em&gt;not&lt;/em&gt; serving users with the same QR code they saw in the preview! The only way for them to know something is up is to test it &lt;em&gt;after downloading&lt;/em&gt; the code while paying real close attention to the redirect behaviour. &lt;a href=&quot;#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn2&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Curiously, on Slashdot (another review site) &lt;a href=&quot;https://slashdot.org/software/p/QR.io&quot;&gt;qr.io’s rating&lt;/a&gt; sits at a near consistent one star. I wonder what could possibly account for this discrepancy in ratings between websites? 🤔 &lt;a href=&quot;#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded><author>Henry Wilkinson</author></item><item><title>Clean Slate!</title><link>https://wilkinson.graphics/blog/2025-04-30-clean-slate/</link><guid isPermaLink="true">https://wilkinson.graphics/blog/2025-04-30-clean-slate/</guid><description>Goodbye Jekyll, hello Astro!</description><pubDate>Wed, 30 Apr 2025 04:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I have a new website!&lt;/p&gt;
&lt;p&gt;My previous Jekyll codebase was the first website I ever built with code, truthfully I’m still quite proud of it. Before this, I used Adobe’s &lt;em&gt;My Portfolio&lt;/em&gt; service, but my Design Placement course necessitated that students have a website to showcase their portfolio and I figured this was a good time to escape some vendor lock-in and put my new HTML and CSS skills to use. I had used Jekyll before to edit the &lt;a href=&quot;https://tomesh.net&quot;&gt;Toronto Mesh&lt;/a&gt; website but had never built anything from scratch before. I’m still very pleased with how long that site lasted, it was well worth the time investment — had I hosted something with Squarespace at their monthly rate, I’d be out ~$1,500 by now!&lt;/p&gt;
&lt;p&gt;I’ve also learned a few things over the years: It took me a long time to become a Tailwind person and despite some of the alluring features of SASS, I’ve pretty much become a convert. Jekyll uses Ruby and while managing one Ruby environment is okay when multiple sites use Jekyll you need to manage multiple of these. (&lt;a href=&quot;https://github.com/rbenv/rbenv&quot;&gt;Rbenv&lt;/a&gt; helps) but overall it’s kind of a pain in the ass, especially if you try to update gems. Static site generators have their own templating languages which are great, except when you need to do something they don’t natively support and then it’s a pile of hacks.&lt;/p&gt;
&lt;p&gt;Previously at Webrecorder, &lt;a href=&quot;https://emma.cafe/&quot;&gt;Emma&lt;/a&gt; introduced me to &lt;a href=&quot;https://astro.build/&quot;&gt;Astro&lt;/a&gt; when we were deciding how to build the new company website and despite not being the worlds most proficient JavaScript developer, its been a very nice change of pace. I wouldn’t recommend it as a &lt;em&gt;first&lt;/em&gt; website framework for those completely new to building websites — Zola’s reasonably easy to implement templating language and lack of dependencies earns it my current recommendation — but I like the freedom it offers… Hoping it lasts me another 5 years!&lt;/p&gt;
&lt;h2&gt;Process &amp;amp; Design Choices&lt;/h2&gt;
&lt;p&gt;I’ve kept things pretty minimal this time around, basic solid borders and fills make up most of the layout. I’ve opted not to animate anything up to now, the web can feel so snappy when everything is instant! A past version of myself might have felt the need to prove his web design abilities with flashier styling, now I can let the work speak for itself.&lt;/p&gt;
&lt;p&gt;Nearly all of my previous URL structure should be maintained and continue to work (a few pages will be relegated to web archives). The existing recipes and projects RSS feeds should still function, but now there’s a new one for the blog! If you don’t know what this means, you’re one of today’s lucky ten thousand and get to discover the magic of RSS readers! I like &lt;a href=&quot;https://netnewswire.com/&quot;&gt;NetNewswire&lt;/a&gt; for macOS and iOS, though I’ve heard good things about &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.nononsenseapps.feeder.play&quot;&gt;Feeder&lt;/a&gt; if you’re an Android person.&lt;/p&gt;
&lt;p&gt;Colour is used minimally, orange is a highlight and blue is used for things you can interact with. The text is set in &lt;a href=&quot;https://www.typejuice.com/product/unison&quot;&gt;Unison&lt;/a&gt; for titles and big flashy text, &lt;a href=&quot;https://usgraphics.com/products/berkeley-mono&quot;&gt;Berkeley Mono&lt;/a&gt; for fun monospaced accents, and &lt;a href=&quot;https://www.ibm.com/plex/&quot;&gt;Plex Sans&lt;/a&gt; for everything else. Berkeley Mono ain’t cheap, but it sure looks nice.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/tailwindlabs/tailwindcss-typography&quot;&gt;Tailwind Typography plugin&lt;/a&gt; is a helpful head-start for long-form text styling and can be easily overridden with &lt;code&gt;&amp;amp;&lt;/code&gt; nesting selectors. Because of the Tailwind 4 switch to using CSS as a config file there isn’t a lot of up to date information on how to do this, so here’s my edits as of publishing!&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-postcss&quot;&gt;@utility prose {
  @apply max-w-none;
  @apply text-pretty;
  /* font-size: 18px !important; */
  p,
  li,
  h1,
  h2,
  h3 {
    color: black;
  }

  img {
    border-color: black;
  }

  iframe {
    border-color: black;
  }

  a {
    color: var(--color-sky-700);
  }

  a:hover {
    color: var(--color-sky-600);
    text-underline-offset: 0.2rem;
  }

  blockquote {
    border-left-color: var(--color-orange-700);
  }

  figcaption {
    color: var(--color-slate-700);
    text-align: center;
  }

  hr {
    border-color: var(--color-slate-300);
    border-width: 1px;
  }

  li::marker {
    color: var(--color-orange-700);
  }

  code::after,
  code::before {
    content: &amp;quot;&amp;quot;;
  }

  pre {
    border-radius: 0;
    border-color: var(--color-slate-500);
    border-style: solid;
    border-width: 2px;
  }

  :not(pre) code {
    background-color: var(--color-slate-300);
    padding: 0.125rem 0.25rem;
    border-width: 1px;
    border-color: var(--color-slate-700);
    font-weight: normal;
  }

  section.footnotes {
    margin-top: 3rem;
    border-color: var(--color-slate-300);
    border-top: 2px;
    border-style: solid;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;The Future&lt;/h2&gt;
&lt;p&gt;I’m excited to finally have a place to publish longer-form written content. My friend &lt;a href=&quot;https://weakty.com/&quot;&gt;Ty&lt;/a&gt; has also been bugging me to get on this pretty much since I met him. A blog has been on my list of things to do ever since I built the first site, but it’s taken five years of excuses and procrastination to get around to it!&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn1&quot; id=&quot;fnref1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; It feels good to have a small space on the web where I am still in control.&lt;/p&gt;
&lt;p&gt;More blog posts will come… eventually. Ty might have to keep waiting a bit longer for anything substantial! :)&lt;/p&gt;
&lt;hr class=&quot;footnotes-sep&quot;&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;I’ve found Zola’s documentation leaves a lot to be desired. I had a hard time getting a collection of posts to render in a list recently when helping out a friend! Pretty much all static site generators are command-line programs and giving the “intro to command line” spiel in addition to “intro to HTML &amp;amp; CSS” is a &lt;em&gt;hard sell&lt;/em&gt; for new folks :\ &lt;a href=&quot;#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn2&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Mostly because by the time I was able to get to adding a blog the old site was looking a bit long in the tooth and due for a refresh. &lt;a href=&quot;#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded><author>Henry Wilkinson</author></item></channel></rss>