More from Liz Denys
While on a short road trip and then recovering from surgery, I hand quilted and hand embroidered a linen lilypad quilt. And yes, I did make this little quilt for my Frinos plush from Hades II to have a nice place to rest.
Like so many other hat knitters, I've knitted the classic WWII watch cap, which is also known as Beanie no. 212, more than a handful of times. (You can find it on Ravelry here and here, respectively.) It's a charming, quick knit that's easy to resize, but I've never really liked the crown shaping on the original. I've knit a lot of these hats, and only one's had the original crown shaping for the decreases. I'm sharing two crown shaping variations I keep going back to below. I always knit this hat in the round, and my crown shaping patterns assume you will be knitting in the round, too. Alternate crown shaping 1 This alternate crown shaping follows the 6x2 ribbing of the previous section for the bulk of each round so that the ribbing continues throughout the entire hat. Written out: Divide stitches on 3 double pointed needles with stitches evenly divided among the three needles or mark out even sections with stitch markers if decreasing across 2 circular needles or with magic loop. (k1, ssk or skp, k if previous row was knit or p if previous row was purl until 3 stitches are left on the needle/before the next marker, k2tog, k) x3. Repeat step 1 until 4 stitches remain on each needle/in each marked section. Cut and draw yarn through the remaining 12 stitches 2-3 times. Tie off and weave in the ends. Alternate crown shaping 2 This alternate shaping both maintains the ribbing throughout the crown shaping and accentuates it by creating a sort of three-pointed star with 3 of the 2-stitch-wide purl parts from the previous 6x2 ribbed section. This shaping really only makes sense when making a size hat where the number of stitches is evenly divisible by 24, so I typically only do it on size "small" hats (cast on 96 stitches). You could adjust the needle size and gauge for a yarn that works well at that gauge to make this work for different sizes. Written out: Stop the last 6x2 ribbed row 1 stitch early and divide stitches on 3 double pointed needles with stitches evenly divided among the three needles or mark out even sections with stitch markers if decreasing across 2 circular needles or with magic loop. Ensure that each needle transition or marker has a single purl stitch on each side. (p1, ssk or skp, k if previous row was knit or p if previous row was purl until 3 stitches are left on the needle/before the next marker, k2tog, p) x3. Repeat step 1 until 4 stitches remain on each needle/in each marked section. Cut and draw yarn through the remaining 12 stitches 2-3 times. Tie off and weave in the ends. Additional project notes Needle: US 7 - 4.5 mm Gauge: 19 stitches and 24 rows = 4 inches in stockinette Hats made for me should generally be a small (cast on 96 stitches), and hats made for my partner Matt should generally be a medium (cast on 104 stitches). Footnotes Either of these will create a left-leaning decrease, use whichever one you prefer.↩ Ibid.↩
After five different drivers, including a school bus driver, aggressively close-passed me in Midwood last night and two of them threatened me just for being on the street, I realized there's a huge gap in educational outreach about bike rules in NYC: drivers. I decided to make a mini-zine that demystifies the behavior of law-abiding bicyclists like myself and helps drivers better understand what to expect when sharing the road: All text and illustrations in the mini-zine are my own. Many thanks to Matt Denys for help proofreading! This zine is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License, so you can copy and distribute this zine for noncommercial purposes in unadapted form as long as you give credit to me. Gas stations, car dealerships, auto repair shops, rental car offices, parking lots, book shops, restaurants, coffee shops, and other commercial establishments are welcome to give out these zines, too - as long as the zine itself is free! Check out the NYC Bike Rules for Drivers mini-zine on the web or download the pdf to print here!
Here's how to fold a mini-zine, featuring my mini-zine So you want to make a public comment! Fold the printed mini-zine page in half, then half in again, and then in half again as shown. When you open the piece of paper, each of the pages should fit fully within a set of folds. With the mini-zine page completely open, fold it in half with short ends touching ("hamburger style") so the text is on the outside. Using scissors, cut a across the dotted line. When you reopen your paper, there will be a slit in the middle of the sheet. Fold the paper in half lengthwise with long ends touching ("hotdog style"), hold the paper at either end, and fold the sheet into itself to form an 8-page booklet. Make sure the cover is on the front!
More in programming
After a write-up in the New York Times, Mommy Bloggers had two options. Either lean in, or step back. Given how popular it became after that, it's not hard to guess which option they chose. The post Mommy bloggers react appeared first on The History of the Web.
I'm quite a bit late on this one, but Haunt version 0.4.0 was released released back in July. I haven't had much time for blogging, but I'm catching up now! This release contains a small set of improvements and bug fixes since the 0.3.0 release in 2024. About Haunt Haunt is a static site generator that uses the Guile Scheme as its configuration language. It aims to be simple, functional, and extensible. Features include: Easy blog and Atom/RSS feed generation Markdown post support Simple development server for viewing edits before publishing Purely functional build process User extensibility Notable changes Added support for HTML in Markdown documents. This was a long time coming because guile-markdown did not support it and the library was abandoned by the original maintainer. As part of my work at Spritely, we forked it, implemented the relevant portions of the CommonMark specification, and released it. Spritely's guile-commonmark fork is now considered to be the official upstream by Guix and others. A further consequence of this is that guile-lib is now a required dependency for building Haunt as we need the (htmlprag) module to parse Markdown documents with embedded HTML. html->shtml from guile-lib's (htmlprag) module is now used instead of xml->sxml in the HTML reader. It was silly of me to use xml->sxml for this purpose years ago, but at the time I wanted guile-lib to be an optional dependency. Added haunt new subcommand for creating a new site. Added default directory, template, and prefix arguments to flat-pages procedure. Added support for index metadata flag to flat pages for pretty URLs. Flat pages now receive all page metadata, not just the page title. This is a breaking change from 0.3.0. Added .scm as an additional extension for sxml-reader. make-file-extension-matcher now supports multiple extensions. Fixed emission of <script> and <style> elements. Fixed handling of no available reader in flat pages builder. Fixed unreachable error handling clause when a reader is not found for a post. Fixed default blog theme template missing an <html> tag. Fixed overloaded -h option in haunt serve. Deprecated post in Skribe reader in favor of document. Download Haunt 0.4.0 is already available in Guix: guix pull guix install haunt See the Haunt project page for information on how to build from source. Thank you to Camilo Rodrigues, Noé Lopez, jgart, Jakob L. Kreuze, and Daniel Meißner for their contributions to this release! Happy haunting!
The Tetris effect is one of psychology’s most easy to reproduce experiments. Simply spend a bit of time playing the eponymous game every day for a few weeks. After a little while, you’ll start recognizing familiar Tetromino shapes in clouds, buildings, and everyday objects. You might even see them appear before your eyes when you start falling asleep. Tom Tang Attention hijacking There’s one lesson the Tetris effect teaches us: whatever you focus on long enough will end up shaping your thoughts. This can be a good thing since it’s how we learn new skills and discover new ideas. Sadly, less and less of our attention is focused intentionally. Instead of picking what we want to see we let other people decide what is supposed to be good for us. Do you want to watch a video? YouTube knows you like cooking and art streams. But why not also recommend a few clips about the stock market bubble, global warming, and the war in Iran. Doomscrolling will make you stay longer and click on a few more ads. Do you want to listen to music? Just open a Spotify playlist and let the algorithm figure out what you like. Please ignore the AI slop they will insert in between real songs to avoid paying royalties to real artists. Do you want to know how your colleagues are doing? Too bad, LinkedIn will bury any relevant career news between the opinion of complete strangers. It is surely just a coincidence that those strangers happen to be shilling whatever Microsoft is invested in at the moment. Do you want the opinion of strangers on a product? Well those Redditors you wanted to ask are probably just a bunch of LLMs talking to a bunch of Russian trolls now. I hope you didn’t value their opinion too much. If, like me and most people, you spend the major part of your day focused on your device, there’s no doubt it’s affecting you. And when you let someone else dictate what appears on your screen, it’s the same as giving them the key to your brain. New York Said Back to an intentional internet The internet wasn’t always like that. Before recommendation algorithms where a thing, you had to decide what you would be doing on the computer. You didn’t really have one big app that you could open and order it to entertain you. Instead, you had a few dozen of bookmarks to websites, each with a specific idea in mind. A site for video game news, that one website with lots of tutorials, a blog about anime that didn’t update often enough, a wiki about a TV show from the 90s… Of course awful things existed on the web. We had Encyclopedia Dramatica and Rotten.com, but you actually had to put the effort to go there if you wanted. Nobody was going to put pictures of dead kids and far-right propaganda as a suggestion after a pancake recipe or a cat video. The good thing is that this intentional internet is still around. It has just been a bit buried below the corporate web, but it’s not very hard to find. After all you’re on this blog, so you probably already have a good idea about it. The main difference between this time and now is you. When you want to get back to reading blogs, RSS feeds, and finish that tutorial instead of doomscrolling shorts, you have to get used to a slower internet. One where content is not infinite and doesn’t get updated every click. But like every habit, the only thing you have to do is to keep at it. And if you pay enough attention to it, something will click in your brain.
One of the interesting challenges of the AI ecosystem in 2026 is that new, effective patterns emerge faster than I can adopt them. I’ll find a handful, get back to work, and realize a month later that I’d missed four or five more. The adoption cycle for Imprint this year has been something like: January: get every engineer onto Claude Code every single day March: ok, let’s also get everyone else onto Claude Code or Claude Cowork every single day April: local development is bottlenecked on checkout and worktree model, instead create ~10 local workspaces which each have an independent checkout of every repository, and operate at the workspace level, not at the repository level, so it can generate cross-repository pull requests across frontend, backend, infrastructure and data monorepos June: oh boy, agent-driven development is heavily constrained by lack of a common task management system with higher visibility and less permission complexity than Jira, so let’s migrate the entire company over to Linear and hard stop on Jira July: yikes, now we have visibility into all these tickets, many of them are trivial but managing them through local development isn’t scaling, let’s roll out an orchestrated harness which internally we call “Agent Fleet”, along the lines of Stripe’s Minions The most recent question for me has been figuring out how to adopt the software factory pattern. (After some light research, the specific AI-context origin of this term is slightly messy to attribute, but I think it might be Justin McCarthy in February 2026’s Software Factories And The Agentic Moment.) The software factory pattern is looping on a broad goal, and then relying on the harness to drive progress towards that goal. Our first pass at implementation is fairly basic: An agent skill /linear-project-loop which reads in a Linear project and starts by auditing that project’s goal definition on these dimensions: An RFC in Notion that describes the project’s goals, how those goals are measured, and the general approach A Datadog dashboard or Snowflake queries that measure progress against those goals If those are missing, or the Linear project is missing in its entirety, it iterates with you on creating those missing tools. Then it reviews the state of the metrics and issues for the project. If new work is identified, it adds those issues to the project. It updates the state of issues that have moved. It works on the non-blocked tasks based on the project’s current state. This is often writing a pull request, updating a pull request, pinging for review, asking a clarifying question, etc. When a task completes, if the project description is fresh, it takes on the next task. If the description hasn’t been updated in a while, it reruns the loop starting with the first step. Right now I am running this locally in a local harness, but it’s working well enough that I anticipate moving the behavior to be driven by the same orchestrated harness that we assign one-off tasks to. What I particularly like about the factory pattern is that it parallels very closely how I’ve been working locally, while forcing me to recognize the places where I was accidentally hording parts of the state for myself regarding the goals of the project. I was already asking agents to iterate on specific Linear projects, but they didn’t have the ability to evaluate if they were going in the right direction, or if it was missing necessary tasks. Now it does. The other place this has been extremely helpful for me is checking in on projects post release. For example, I shipped our passkeys implementation earlier this year, but some months go by without my checking in on how it’s going. If we saw adoption spike, or error rates start to turn, I might miss it, but running the factory in a less frequent post-release mode would catch it immediately. The final thought that’s been interesting to me is how much all of the pieces here compound only to the extent that you have the other pieces. For example, this factory pattern depends on having Datadog MCP and Snowflake access available to manage goal-tracking, but it also depends on Linear being the single source of state for the company’s work, and an orchestrated harness that can perform work independently from your laptop. Keeping up with this many migrations is a fascinating industry moment.