<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:base="https://chromamine.com/">
    <title>Harris Lapiroff</title>
    <link href="https://chromamine.com/feeds/posts.xml" rel="self"/>
    <link href="https://chromamine.com/"/>
    <updated>2026-07-07T00:00:00Z</updated>
    <id>https://chromamine.com/</id>
    <author>
        <name>Harris Lapiroff</name>
        <email>blog@chromamine.com</email>
    </author>
        <entry>
            <title>Dance Calling By The Numbers, 2024</title>
            <link href="https://chromamine.com/2025/01/dance-calling-by-the-numbers-2024/"/>
            <updated>2025-01-06T00:00:00Z</updated>
            <id>https://chromamine.com/2025/01/dance-calling-by-the-numbers-2024/</id>
            <content xml:lang="en-us" type="html">This post contains javascript content and must be viewed &lt;a href="https://chromamine.com/2025/01/dance-calling-by-the-numbers-2024/"&gt;on site&lt;/a&gt;.</content>
        </entry>
        <entry>
            <title>My first brush with covid</title>
            <link href="https://chromamine.com/2023/12/my-first-brush-with-covid/"/>
            <updated>2023-12-06T00:00:00Z</updated>
            <id>https://chromamine.com/2023/12/my-first-brush-with-covid/</id>
            <content xml:lang="en-us" type="html">This post contains javascript content and must be viewed &lt;a href="https://chromamine.com/2023/12/my-first-brush-with-covid/"&gt;on site&lt;/a&gt;.</content>
        </entry>
        <entry>
            <title>11ty and Observable</title>
            <link href="https://chromamine.com/2023/11/11ty-and-observable/"/>
            <updated>2023-11-11T00:00:00Z</updated>
            <id>https://chromamine.com/2023/11/11ty-and-observable/</id>
            <content xml:lang="en-us" type="html">This post contains javascript content and must be viewed &lt;a href="https://chromamine.com/2023/11/11ty-and-observable/"&gt;on site&lt;/a&gt;.</content>
        </entry>
        <entry>
            <title>Paying for Software</title>
            <link href="https://chromamine.com/2026/07/paying-for-software/"/>
            <updated>2026-07-07T00:00:00Z</updated>
            <id>https://chromamine.com/2026/07/paying-for-software/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;It’s &lt;a href=&quot;https://quoteinvestigator.com/2017/07/16/product/&quot;&gt;been said&lt;/a&gt;, “if you’re not paying for it, you’re not the customer, you’re the product.” This is overly simple&lt;a href=&quot;https://chromamine.com/2026/07/paying-for-software/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt; but the core of truth is that if a company has a functional business model that’s not based on extracting and abusing user data, it’s less likely to do so. Incentives aren’t the only thing that matters, but they help!&lt;/p&gt;
&lt;p&gt;I wish this weren’t the world we lived in. I wish the excesses of &lt;a href=&quot;https://en.wikipedia.org/wiki/Surveillance_capitalism&quot;&gt;surveillance capitalism&lt;/a&gt; were illegal, that we didn’t have to worry that everything we did on the web was going to be collected and turned on us&lt;a href=&quot;https://chromamine.com/2026/07/paying-for-software/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt;. I wish that even putting up the slightest defenses against this didn’t require either financial privilege or disengagement. I wish this weren’t an individual choice at all, but built into the fabric of the web that you didn’t have to worry about these things. We &lt;em&gt;should&lt;/em&gt; be building toward that world.&lt;/p&gt;
&lt;p&gt;But as long as we’re in this world, I’ve been increasing the services I pay for so I can believe I’m the customer and not the product. It feels weird to say, “Hey, you know that thing you’re getting for free? Have you thought about paying for it?” but that’s exactly what I’m going to do here. Here are a few things I pay for, from independent companies I believe respect their users. If you have the means – I recognize not everyone has the budget to decline free services – you might consider doing so as well.&lt;/p&gt;
&lt;p&gt;I have mostly bought these services for my personal benefit and recommend them on the same basis. Arguably, doing so improves the world by voting with my dollars – but I largely suspect it will have to be government regulation and not market forces that brings surveillance capitalism to its knees.&lt;/p&gt;
&lt;h4&gt;Email&lt;/h4&gt;
&lt;p&gt;I use &lt;a href=&quot;https://fastmail.com/&quot;&gt;Fastmail&lt;/a&gt;. I &lt;a href=&quot;https://chromamine.com/2023/10/switching-to-fastmail/&quot;&gt;really like it&lt;/a&gt;. Some small things are worse than Gmail; other bigger things – a cleaner client, full-featured custom domain support – are better.&lt;/p&gt;
&lt;p&gt;I was already paying Google for storage. Switching to Fastmail enabled me to delete my emails from Google’s servers and stop paying. Since the Fastmail fee (&lt;strong&gt;$6/mo&lt;/strong&gt;, or &lt;strong&gt;$4.67/mo&lt;/strong&gt; for me on their 3-year plan) is only slightly more than I had been paying for storage, it wasn’t even that hard of a switch to make.&lt;/p&gt;
&lt;p&gt;Other friends use &lt;a href=&quot;https://protonmail.com/&quot;&gt;Protonmail&lt;/a&gt;. It’s not for me, but it’s a great option, particularly if you want an encryption-first service.&lt;/p&gt;
&lt;h4&gt;Search Engine&lt;/h4&gt;
&lt;p&gt;I use &lt;a href=&quot;https://kagi.com/&quot;&gt;Kagi&lt;/a&gt;. Search results are as good or better than Google and I rarely find myself going back to Google search for anything.&lt;a href=&quot;https://chromamine.com/2026/07/paying-for-software/#fn3&quot; class=&quot;footnote-ref&quot; id=&quot;fnref3&quot;&gt;³&lt;/a&gt; It may seem crazy to pay for something we’ve gotten for free for over 30 years, but Kagi really shines on customizability and features that exist nowhere else. Here are two that I really use:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can tell Kagi to prioritize or suppress results from certain sites. This has been handy for things I find myself searching for repeatedly.&lt;/li&gt;
&lt;li&gt;“&lt;a href=&quot;https://help.kagi.com/kagi/features/bangs.html&quot;&gt;Custom bangs&lt;/a&gt;” allow you to redirect search queries to other websites. For example, if I add &lt;code&gt;!cb&lt;/code&gt; to a search, it searches &lt;a href=&quot;https://www.ibiblio.org/contradance/thecallersbox/&quot;&gt;Caller’s Box&lt;/a&gt; for contra dances with matching titles.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Those features add some convenience to tasks I perform daily, sometimes hourly – &lt;em&gt;on top of&lt;/em&gt; opting out of Google’s surveillance machine. For that, &lt;strong&gt;$10/mo&lt;/strong&gt; (or &lt;strong&gt;$9/mo&lt;/strong&gt; on their annual plan) doesn’t feel like too much to me.&lt;/p&gt;
&lt;p&gt;Kagi also has plans to compete more broadly with Google’s offerings. They already have a &lt;a href=&quot;https://help.kagi.com/kagi/maps/&quot;&gt;functional maps service&lt;/a&gt; (not as full featured as Google Maps at this point) and a &lt;a href=&quot;https://orionbrowser.com/&quot;&gt;web browser&lt;/a&gt;. They’re &lt;a href=&quot;https://help.kagi.com/kagi/mail/&quot;&gt;alpha testing an email service&lt;/a&gt;. They also have neat projects like &lt;a href=&quot;https://blog.kagi.com/small-web&quot;&gt;Small Web&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Transit&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://transitapp.com/&quot;&gt;Transit&lt;/a&gt; (that’s the name of the app!) has a much nicer UX than Google Maps. It provides more routing options. It doesn’t share data with advertisers, but &lt;em&gt;does&lt;/em&gt; partner with transit agencies to use the data they &lt;em&gt;do&lt;/em&gt; collect to improve transit service. They seem like a pretty neat company and I’ve been very happy paying &lt;strong&gt;$25/yr&lt;/strong&gt; for it.&lt;/p&gt;
&lt;h4&gt;Social Media&lt;/h4&gt;
&lt;p&gt;Much has been said about how destructive corporate social media is, yet we keep jumping ship to new corporate or VC-funded options (free, of course) and hope they’ll abuse our data and attention less: from Facebook to Instagram, TikTok, or Discord, from X/Twitter to Bluesky.&lt;/p&gt;
&lt;p&gt;I still use many of these. The gravitational pull of network effects – the need to be where my friends are – is hard to escape. But I also use a &lt;a href=&quot;https://joinmastodon.org/&quot;&gt;Mastodon&lt;/a&gt; server, &lt;a href=&quot;https://social.coop/&quot;&gt;social.coop&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This recommendation is a bit of an oddball on this list. On the one hand, I don’t recommend it for everyone. Though every Mastodon server connects to a single virtual space (known as the &lt;a href=&quot;https://en.wikipedia.org/wiki/Fediverse&quot;&gt;Fediverse&lt;/a&gt;), that space is still smaller than corporate social media options. Unless your friends are the right kind of nerd, you probably won’t find them on here.&lt;/p&gt;
&lt;p&gt;On the other hand, &lt;a href=&quot;https://social.coop/&quot;&gt;social.coop&lt;/a&gt; represents my ideals for what the web could be more than the (admittedly pretty cool) products I’ve listed above. What’s better for aligning user and product interests than ensuring users are the customers? Ensuring users are the &lt;em&gt;owners&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I’ve long liked cooperative ownership models – I founded a &lt;a href=&quot;https://web.archive.org/web/20170708152243/https://littleweaverweb.com/&quot;&gt;cooperative web development agency&lt;/a&gt; that operated for four years. I think &lt;em&gt;user-ownership&lt;/em&gt; is a particularly good model for web services. My money goes directly to the infrastructure and labor that powers the service and, in return, I get to play a direct role in decision-making about how that service is governed and operated.&lt;/p&gt;
&lt;p&gt;I am optimistic that Mastodon&lt;a href=&quot;https://chromamine.com/2026/07/paying-for-software/#fn4&quot; class=&quot;footnote-ref&quot; id=&quot;fnref4&quot;&gt;⁴&lt;/a&gt;, small as it is, will prove more resilient long-term than centralized social media services, the same way that email, for better or worse, has outlasted many proprietary and centralized communication services that have come and gone in the past several decades. I’m &lt;em&gt;hopeful&lt;/em&gt; that we’ll also see more cooperative services like this one.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I did not get paid by or even communicate with the makers of any of these products in writing this blog post. I just genuinely like all of them and wanted to recommend them!&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;For one thing, there are plenty of counterexamples: Users of free Linux distributions are in no sense a “product” being sold by the open-source software developers that produce them. Paying Google for extra email storage doesn’t protect you from their personal data hoarding and advertising. YouTube will still milk your attention and maybe &lt;a href=&quot;https://www.ucdavis.edu/curiosity/news/youtube-video-recommendations-lead-more-extremist-content-right-leaning-users-researchers&quot;&gt;radicalize you&lt;/a&gt;, even if you pay for their premium service. &lt;a href=&quot;https://chromamine.com/2026/07/paying-for-software/#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;I mean, even setting all the other problems aside, the web is just way less fun when people are afraid to share photos and personal stories, join new sites, etc. &lt;a href=&quot;https://chromamine.com/2026/07/paying-for-software/#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;I tried &lt;a href=&quot;https://duckduckgo.com/&quot;&gt;DuckDuckGo&lt;/a&gt; for a while and found it pretty useless. I was going back to Google constantly. Frankly all internet search is much worse than it used to be. In the war between signal and noise on the internet, noise has been winning for years – and &lt;a href=&quot;https://en.wikipedia.org/wiki/AI_slop&quot;&gt;AI slop&lt;/a&gt; has dramatically accelerated that trend. &lt;a href=&quot;https://chromamine.com/2026/07/paying-for-software/#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;And the protocol that underlies it, ActivityPub. &lt;a href=&quot;https://chromamine.com/2026/07/paying-for-software/#fnref4&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Dad</title>
            <link href="https://chromamine.com/2026/04/dad/"/>
            <updated>2026-04-26T00:00:00Z</updated>
            <id>https://chromamine.com/2026/04/dad/</id>
            <content xml:lang="en-us" type="html">&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/oaUG2H047J-768.webp 768w, https://chromamine.com/media/img/oaUG2H047J-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/oaUG2H047J-768.jpeg 768w, https://chromamine.com/media/img/oaUG2H047J-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A vintage photograph of a man with dark curly hair, a full beard, and large dark sunglasses, wearing a denim jacket, cradling a baby in a blue outfit against his shoulder on a city sidewalk.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/oaUG2H047J-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2048&quot; /&gt;&lt;/picture&gt;
&lt;p&gt;&lt;/p&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Jerry Lapiroff · February 11, 1947 – March 22, 2026&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;When I was an elementary schooler my father would read me such bedtime stories as Kafka’s “The Metamorphosis,” Vonnegut’s “Harrison Bergeron,” and Connell’s “The Most Dangerous Game” – stories well above my recommended reading level, in vocabulary &lt;em&gt;and&lt;/em&gt; in their &lt;em&gt;general vibes&lt;/em&gt;. He passed on to me an early love of literature and also a fascination with the darker elements of human nature.&lt;/p&gt;
&lt;p&gt;He also taught me to love the theater. We’d go to plays frequently, at home in Berkeley and on- and off-Broadway when we took family trips to New York. He preferred serious straight plays to musicals – a preference that could cause some tension when trying to decide on a play between him and my sister – though I recall he acceded to see &lt;em&gt;Spring Awakening&lt;/em&gt; and perhaps even enjoyed it. When I was in high school he encouraged my burgeoning interest in playwriting, revealing that he himself had also written some plays in his youth.&lt;/p&gt;
&lt;p&gt;Eventually, in adulthood, he taught me to love high-quality alcohol, though I never developed the palate he had for fine wines, despite numerous tasting trips through Napa Valley and along the Sonoma Coast. Instead I went down the road of whiskeys, gins, and cocktails. When I visited home, we’d often go out in the evening to a wine bar, taste a number of different wines while schmoozing with the bartenders and other patrons, and then return home where, to finish off the evening, he’d ask me to mix him a nightcap of my choosing. I might go for a classic favorite, like a boulevardier, but more often I’d mix something improvisationally from his prodigious, but eclectic, collection of liquors and mixers.&lt;/p&gt;
&lt;p&gt;Another thing he passed on to my sister and me was a strong moral and political compass with the ability to hold nuance and complexity. I remember one occasion, when I was ten or so, he cautioned me against bringing my fancy digital camera to a summer camp. When I tried to understand why I couldn’t bring it there, but I could bring it elsewhere, I said, “You’re worried that it might get stolen there because people are poor?” I asked the question out of innocence, trying to genuinely logic out his reasons, not accuse him, but I could see he had taken it personally and it had triggered a referendum in his mind. After a long pause, considering, he said to me: “Rich people can be thieves too, sometimes more than poor people, but usually in different ways.”&lt;/p&gt;
&lt;p&gt;In the days following 9/11, when much of the country was swept up into a traumatized nationalistic fervor and our politicians were already angling for a retributive war, he was educating me with a skeptical perspective, though I was only in middle school. He expressed concern about using the phrase, &lt;em&gt;Never Forget&lt;/em&gt;. “That’s what they said about Pearl Harbor,” he said to me, meaning that &lt;em&gt;Never Forget&lt;/em&gt; had been a contributing factor to the internment of Japanese-Americans and atomic bombings of Hiroshima and Nagasaki. The politics of the decades that followed 9/11 proved him prescient.&lt;/p&gt;
&lt;p&gt;And as a writer himself and a journalism teacher, he taught me to value the importance of journalism, a thread that has trailed my entire life so far, from my service to my own high school’s newspaper, to my current work at &lt;a href=&quot;https://freedom.press/&quot;&gt;a nonprofit&lt;/a&gt; that protects journalists and whistleblowers.&lt;/p&gt;
&lt;p&gt;But he didn’t just shape my – and my sister’s – interests, he was also good at responding to them. When I got into photography, he would daydream about us making a coffee table book together, scenes of people hanging out in Golden Gate Park. When I had a brief but intense interest in graphic novel writing in college, he went out and bought graphic novels that fell at the intersection of our interests. Browsing his shelf this morning, I found an interesting one – an illustrated history of Students for a Democratic Society, written by Harvey Pekar. He was engaged and interested in every job I had and my office’s fundraising team would regularly let me know they’d received a donation from my dad or exchanged emails on their latest campaign or event.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;My whole life my dad talked to me about his dreams: The house he and my mother bought when my sister and I were 3 and 5 was a fixer-upper. He daydreamed constantly about fixing up. He planned and replanned a renovation that never came: knock out a wall here, put in a door there, add a washbasin here, replace that floor. He &lt;em&gt;did&lt;/em&gt; recently replace the light fixtures after long and careful deliberation as to the perfect fixtures for his 1915 craftsman home and many &lt;em&gt;many&lt;/em&gt; visits to the local lighting store on Solano Ave. He fantasized about renting an apartment in NYC so he could live a true bicoastal life, alternating seasons on both coasts. All my life he had dreams of projects, books he’d write, photographs he’d take, the trip we’d take to the old family shtetl of Lapirovschina in Russia. On my less charitable days, I thought of him as a Willy Loman-esque character – &lt;em&gt;Death of a Salesman&lt;/em&gt;, of course, being one of many plays that he introduced me to – full of dreams that he never accomplished.&lt;/p&gt;
&lt;p&gt;That perception was my fault, not his. My dad wasn’t Willy Loman and he didn’t lack accomplishments. When he was diagnosed with his most recent cancer, a sarcoma induced by 53 grays of radiation he had been dosed with decades prior during his first bout with cancer, he said to me, “Well, it gave me 43 years.” On Facebook, to his friends, he wrote,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I remain grateful for the 43 years I have enjoyed and all of the things that filled them. These include having and raising two children, traveling and enjoying the company of friends, and doing what I consider to be meaningful work.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Indeed, he lived a full life in just the decades between cancer diagnoses, to say nothing of his adventures in the decades before. He had and raised two children. He taught generations of high school students, touching hundreds of lives. When they heard about his diagnosis, many wrote to me or him to express their lifelong gratitude. One wrote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I’m the youngest of three and you taught all of us. […] We’ve taken wildly different paths in life, and when I sat down to write this letter, I had a revelation: whenever my family is together and the topic of high school teachers comes up, one teacher always finds his way into the conversation – you. […] Looking back, I think it’s because the way you ran your classroom felt different. You spoke to students like we mattered – like we were already adults, not just kids killing time until graduation. There was no yelling or threats in your classroom. You pushed us to think, and often to get out of our comfort zones, but in a way that still felt safe.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;He also maintained close family ties, not only staying close with his sister, mother, and two cousins, but also establishing new family connections online with distant branches of the family tree he discovered in Russia. He wrote essays, some of which were published in local papers and some that were published only on Facebook, but read and engaged with by his devoted community there.&lt;/p&gt;
&lt;p&gt;One realization I came to, which is more important even than any accomplishments, was that my dad liked his life the way it was. In his last year of life, the family offered to help him finally get that apartment on the East Coast, whether New York or Boston. He considered it briefly, but ultimately refused. He enjoyed his home in Berkeley, fixer-upper though his house was. He liked going to Peet’s for coffee in the mornings, sitting on his porch, chatting with the neighbors, substitute teaching at Kennedy High School long after retirement. He liked tending his menagerie of plants, some of them improbably poisonous. He liked going to political club meetings, going out to dinner, tasting wines, walking in local parks, sitting in on classes at Cal, seeing plays at the Berkeley Rep, and so on. He didn’t want anything different. He liked his daydreams, but he loved the life he was living.&lt;/p&gt;
&lt;p&gt;I love you, dad. I’ll miss you forever.&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/NBJkuG4ZJh-768.webp 768w, https://chromamine.com/media/img/NBJkuG4ZJh-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/NBJkuG4ZJh-768.jpeg 768w, https://chromamine.com/media/img/NBJkuG4ZJh-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A family of four on a sidewalk with greenery behind them. A man with dark hair and a beard wearing an orange jacket tends to a young toddler in a yellow and red striped outfit. Beside him a woman with dark hair holds a newborn baby.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/NBJkuG4ZJh-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2048&quot; /&gt;&lt;/picture&gt;
&lt;p&gt;&lt;/p&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/bKJ9zkc48Z-768.webp 768w, https://chromamine.com/media/img/bKJ9zkc48Z-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/bKJ9zkc48Z-768.jpeg 768w, https://chromamine.com/media/img/bKJ9zkc48Z-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Three people around a Scrabble board on a dining table. On the left, an older man with glasses and a gray-streaked beard. In the center, a teenage boy in a gray sweatshirt looks down at the tiles. On the right, a younger girl smiles slightly.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/bKJ9zkc48Z-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;
&lt;p&gt;&lt;/p&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/WziHPCWPme-768.webp 768w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Two men smiling at the camera outdoors. On the left, an older man with a white beard and glasses wearing a brown jacket and an SF Giants baseball cap. On the right, a younger man with long dark hair, a small teal earring, and an orange t-shirt. Misty hills and tall grasses are visible behind them.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/WziHPCWPme-768.jpeg&quot; width=&quot;768&quot; height=&quot;482&quot; /&gt;&lt;/picture&gt;
&lt;p&gt;&lt;/p&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
</content>
        </entry>
        <entry>
            <title>Should you care about and use passkeys?</title>
            <link href="https://chromamine.com/2026/02/should-you-care-about-and-use-passkeys/"/>
            <updated>2026-02-26T00:00:00Z</updated>
            <id>https://chromamine.com/2026/02/should-you-care-about-and-use-passkeys/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;You’re relatively tech- and security-savvy. You might not always be at the cutting edge or use the most paranoid security measures, but you use a password manager, you know about two-factor authentication and use it on at least some of your accounts. You know not to reuse passwords. Lately, though, you’re seeing a lot of sites prompt you to create a “passkey” without a lot of explanation. Maybe you have a vague idea that someone thinks this is the future of logging in or something. Should you push the button? Is it going to be some new annoying security tool to manage? Where does the passkey live anyway? Why is everyone prompting you to do this when you’re just trying to check your email? Are you going to risk getting locked out if you say yes, but something goes wrong?&lt;/p&gt;
&lt;p&gt;I want to try to explain passkeys to the sort of person I just described and why I think you should use them. There are a lot of passkey explainers out there, but this one is mine and I want to start in a place that I don’t see a lot of explainers start: talking about what we already know about password managers and security best practices. We know that the best password hygiene is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Use a password manager.&lt;/li&gt;
&lt;li&gt;Let the password manager generate a unique, random password for each site.&lt;/li&gt;
&lt;li&gt;Have the password manager fill in the password for you when you log in.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You already don’t have to memorize these passwords – it’s possible you never even see some of them at all if you have the password manager automatically fill it for you. Logging in with a password isn’t proving that you “know” a secret, it’s proving that you &lt;em&gt;have access&lt;/em&gt; to a secret.&lt;/p&gt;
&lt;p&gt;When you think about this a little more deeply, doesn’t this &lt;em&gt;already&lt;/em&gt; feel a bit like a stopgap solution? There’s a piece of software that asks you for a secret to prove your identity. There’s another piece of software that stores your secret. You’re responsible for making sure that the second piece of software conveys your secret to the first piece of software, even though you yourself may never even look at that secret. Isn’t it weird that we still make that secret short and human-readable? Isn’t it weird that you’re being asked to serve as an intermediary between these two pieces of software? Shouldn’t we just make them &lt;em&gt;talk directly to each other&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;The cool thing is that, it turns out, once you start connecting them directly, you can rethink the premise of the whole system to create something that’s &lt;em&gt;more&lt;/em&gt; secure.&lt;/p&gt;
&lt;p&gt;Instead of sending a password to a website, the website and your &lt;strong&gt;credential manager&lt;/strong&gt; (this is what I’m going to call your password manager since it handles more than passwords) can perform a “handshake” using &lt;a href=&quot;https://en.wikipedia.org/wiki/Public-key_cryptography&quot;&gt;public key cryptography&lt;/a&gt;. Your credential manager still holds a secret key it created for that website, but unlike a password, it’s an unguessable, cryptographic secret key. More importantly, the secret is never actually shared with the website. Your credential manager is able to cryptographically sign some data with it to prove that it has the correct secret key,&lt;a href=&quot;https://chromamine.com/2026/02/should-you-care-about-and-use-passkeys/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt; but it never has to send the secret key itself. The result is that passkeys behave kind of like passwords under pre-passkey best practices:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;They’re stored in your credential manager.&lt;/li&gt;
&lt;li&gt;They’re unique for each site.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;But&lt;/em&gt; in addition to that you get additional security benefits. Unlike passwords, passkeys:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;cannot be compromised in a data breach, because the website never has access to the secret at all – it never even has access to a cryptographic hash of the secret, as most sites today do for passwords.&lt;/li&gt;
&lt;li&gt;are phishing resistant because your credential manager simply won’t perform a handshake with a fake website. It won’t even offer to.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;All of this security complexity is hidden behind software, so the user experience is more like:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;When you create a passkey, a website asks if you want to create a passkey and your credential manager asks you if you want to save the passkey.&lt;/li&gt;
&lt;li&gt;When you want to log in, your credential manager asks you if you want to use the passkey. When you click yes, you’re logged in.&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/tb5kBRtGLM-768.webp 768w, https://chromamine.com/media/img/tb5kBRtGLM-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/tb5kBRtGLM-768.jpeg 768w, https://chromamine.com/media/img/tb5kBRtGLM-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A screenshot of the 1Password app asking if I want to use a passkey to sign in to GitHub.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/tb5kBRtGLM-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1019&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;Instead of dealing with the login form on the left, I just click the button on the right to sign in.&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;p&gt;I think some of the confusion around passkeys is simply that this feels &lt;em&gt;too&lt;/em&gt; easy. Logging in isn’t &lt;em&gt;supposed&lt;/em&gt; to be a one-click process, right? Is it really secure? What’s going to break? Where did my credentials go? But that really is how it works. Passkeys are the rare security innovation where I expect that, especially in the long run, they will be both easier to use &lt;em&gt;and&lt;/em&gt; more secure.&lt;/p&gt;
&lt;p&gt;Okay, but&lt;/p&gt;
&lt;h3&gt;Where are my passkeys stored?&lt;/h3&gt;
&lt;p&gt;Just like your passwords, they’re stored in your credential manager. If you don’t have a credential manager like &lt;a href=&quot;https://1password.com/&quot;&gt;1Password&lt;/a&gt;, &lt;a href=&quot;https://www.dashlane.com/&quot;&gt;Dashlane&lt;/a&gt;, or &lt;a href=&quot;https://bitwarden.com/&quot;&gt;Bitwarden&lt;/a&gt;, they’ll most likely be stored in your operating system’s built-in credential manager. Just like your passwords, they’ll be available anywhere your credential manager is available.&lt;/p&gt;
&lt;p&gt;Some passkeys are &lt;strong&gt;synced&lt;/strong&gt; across devices but you &lt;em&gt;can&lt;/em&gt; create passkeys that are &lt;strong&gt;device-bound&lt;/strong&gt;. You can have more than one passkey for authenticating to a service, so if, for example, you are really security-conscious, you might create a separate passkey for each device you use to access your email account. Later on, if you lose your phone, you can revoke the passkey associated with that phone. Or, you could create passkeys that &lt;em&gt;only&lt;/em&gt; live on your phone and use the cross-device sign in flow described below to log in on all other devices.&lt;/p&gt;
&lt;p&gt;For myself, I’d rather just have the convenience of all my passkeys synced across every device – which is 1Password’s default behavior anyway.&lt;/p&gt;
&lt;h3&gt;What if I lose my passkeys?&lt;/h3&gt;
&lt;p&gt;In ~2 years of using passkeys, I have not had the experience of losing any. I trust my password manager to manage my passkeys just as much as I trust it to manage my passwords.&lt;/p&gt;
&lt;p&gt;Additionally, we’re still in what will be a long transition phase for passkeys. Ultimately, passkeys are the authentication method of the future and will largely replace passwords, but, during this transition phase, virtually all services will still allow you to log in with a password. So you can experiment with enabling passkeys on accounts without worrying that you’ll be locked out, as long as you still have your password as well.&lt;/p&gt;
&lt;h3&gt;What if I need to log into something on a device I don’t own?&lt;/h3&gt;
&lt;p&gt;There is a flow for logging into a device that doesn’t have your passkey. When you try to log into a service, the other device will show a QR code which you can scan with a device that you &lt;em&gt;do&lt;/em&gt; own, like your phone. Your phone will perform the authentication process with some added security (like a proximity check) and you’ll be logged in on the other device. I haven’t actually tried this flow myself, so I can’t report on its usability, but it sounds very similar to the way I log into apps on my Google TV to avoid using the @#%!ing on-screen keyboard.&lt;/p&gt;
&lt;p&gt;And, again, at least for now, if all else fails, most services will continue to let you authenticate with a password instead.&lt;/p&gt;
&lt;h3&gt;Doesn’t this create a single point of compromise?&lt;/h3&gt;
&lt;p&gt;Indeed, if all of your passkeys are stored in one place, that does create a single point of compromise. But wait a second, isn’t that already true when you’re using a password manager? One nice thing about having a single credential storage is that you can make unlocking that a more secure process than you could if you were worrying about 20 or 100 services. For example 1Password requires:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Either a master password or biometrics (FaceID or TouchID, depending on the device) to access credentials.&lt;/li&gt;
&lt;li&gt;The master password at least once every two weeks.&lt;/li&gt;
&lt;li&gt;A long secret key or a device with 1Password already installed in order to install 1Password on a new device.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;My credential manager is the bank vault that is protected with multiple layers of security. Everything else that uses passkeys, I just have to click a button (and scan my finger).&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Passkeys are still relatively new, so they aren’t supported everywhere or even most places. I expect there’s going to be some rough edges that need to be worked out, but I will say, when I sat down to research this post, I was impressed at how much stuff was already thought through. Other people I’ve talked to who have made the leap have reported it’s just worked seamlessly for them. Things that I thought would be issues (like logging in on third-party devices) already have reasonable workflows.&lt;/p&gt;
&lt;p&gt;I think the security folks who have been working on this know how hard it is to get people to adopt new security practices and they worked hard to make it seamless and foolproof before the big push. I can’t promise it’ll all work perfectly but, for myself (acknowledging that I’m on the more tech- and security-savvy end of the spectrum), I’ve been using passkeys for over two years on some services and have yet to run into any major problems with them.&lt;/p&gt;
&lt;p&gt;For further reading, I recommend Wired’s explainer &lt;em&gt;&lt;a href=&quot;https://www.wired.com/story/what-is-a-passkey-and-how-to-use-them/&quot;&gt;How Passkeys Work – and How To Use Them&lt;/a&gt;&lt;/em&gt;. The organization I work for (Freedom of the Press Foundation) also has an &lt;a href=&quot;https://freedom.press/digisec/blog/passkeys-beginners/&quot;&gt;excellent guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you use passkeys and run into issues, I’d be interested in hearing what they are to inform updates to this post. You can comment on Facebook or Mastodon or &lt;a href=&quot;mailto:blog@chromamine.com&quot;&gt;via email&lt;/a&gt;.&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;I’m glossing over a lot of details here, but public key cryptography is &lt;em&gt;incredibly cool&lt;/em&gt;. When I first learned that it was possible to create a pair of encryption keys where one decrypts whatever the other encrypts and vice versa – without needing the original key to perform the decryption – it seemed like magic. Eventually I took a number theory course and learned the math behind it and it &lt;em&gt;still seems like magic&lt;/em&gt;. &lt;a href=&quot;https://chromamine.com/2026/02/should-you-care-about-and-use-passkeys/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Designing Christmas Ornaments for Vase Mode</title>
            <link href="https://chromamine.com/2025/12/3d-printable-vase-mode-christmas-ornaments/"/>
            <updated>2025-12-20T00:00:00Z</updated>
            <id>https://chromamine.com/2025/12/3d-printable-vase-mode-christmas-ornaments/</id>
            <content xml:lang="en-us" type="html">&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/eNuVfuZ-bD-768.webp 768w, https://chromamine.com/media/img/eNuVfuZ-bD-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/eNuVfuZ-bD-768.jpeg 768w, https://chromamine.com/media/img/eNuVfuZ-bD-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;An hanging ornament, shaped like an elongated lemon, featuring a spiral pattern running down its length. It&#39;s coloration is a gradient from pink to purple. Behind it, outside of the depth of field, are blurry lights and tree leaves.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/eNuVfuZ-bD-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1025&quot; /&gt;&lt;/picture&gt;
&lt;p&gt;&lt;/p&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.printables.com/model/1518800-vase-mode-christmas-ornament-collection&quot; class=&quot;button &quot;&gt;Just want the files? Get them on Printables ↗&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I designed a set of 10 Christmas ornaments that can be 3D printed in vase mode for &lt;a href=&quot;https://www.printables.com/contest/498-winter-holidays-decorations-2025&quot;&gt;Printables’ Winter Holidays Decorations contest&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I knew when I started my design process that I wanted to design something that could be printed in vase mode. There were lots of ornaments posted to the contest already, but very few in vase mode. I’ve &lt;a href=&quot;https://chromamine.com/2024/03/solving-problems-quickly-with-3d-printing/&quot;&gt;written about vase mode before&lt;/a&gt;, but to recap:&lt;/p&gt;
&lt;p&gt;Typically in the type of 3D printing I do (called &lt;a href=&quot;https://en.wikipedia.org/wiki/Fused_filament_fabrication&quot;&gt;FFF/FDM&lt;/a&gt;&lt;a href=&quot;https://chromamine.com/2025/12/3d-printable-vase-mode-christmas-ornaments/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;) plastic filament is extruded one layer at a time, stopping when it completes a layer, moving the z-axis up one step, and then extruding a new layer on top of it. This results in at least one extrusion stop and start per layer (generally more than one, since the layers are usually complex enough to require multiple paths per layer). Vase mode instead takes a solid object and extrudes one continuous spiral around the perimeter of the object without stopping. This has some advantages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vase mode prints have no visible “seams” where extrusion stopped and started on each layer,&lt;/li&gt;
&lt;li&gt;They’re generally quicker to print because there’s no travel time for the printhead, only print time, and&lt;/li&gt;
&lt;li&gt;They use less filament because they’re only printing one perimeter per layer and no infill.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On the other hand:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Only objects with a single continuous surface can be printed in vase mode,&lt;/li&gt;
&lt;li&gt;The final prints are often weaker than solid counterparts,&lt;/li&gt;
&lt;li&gt;There are restrictions on the geometries that limit what can be printed in vase mode.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One particular restriction I had to think about for this case was the slope of the walls. Here’s a cross-section of 3D printed walls at different angles (note, filament tends to extrude in a oblong shape as it gets squished against the surface below it and the nozzle above):&lt;/p&gt;
&lt;svg viewbox=&quot;0 0 350 100&quot;&gt;
  &lt;g transform=&quot;translate(5 5)&quot;&gt;
    &lt;rect stroke=&quot;currentColor&quot; stroke-width=&quot;1&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.25&quot; x=&quot;0&quot; y=&quot;0&quot; width=&quot;30&quot; height=&quot;18&quot; rx=&quot;9&quot; ry=&quot;9&quot;&gt;&lt;/rect&gt;
    &lt;rect stroke=&quot;currentColor&quot; stroke-width=&quot;1&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.25&quot; x=&quot;15&quot; y=&quot;20&quot; width=&quot;30&quot; height=&quot;18&quot; rx=&quot;9&quot; ry=&quot;9&quot;&gt;&lt;/rect&gt;
    &lt;rect stroke=&quot;currentColor&quot; stroke-width=&quot;1&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.25&quot; x=&quot;30&quot; y=&quot;40&quot; width=&quot;30&quot; height=&quot;18&quot; rx=&quot;9&quot; ry=&quot;9&quot;&gt;&lt;/rect&gt;
    &lt;rect stroke=&quot;currentColor&quot; stroke-width=&quot;1&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.25&quot; x=&quot;45&quot; y=&quot;60&quot; width=&quot;30&quot; height=&quot;18&quot; rx=&quot;9&quot; ry=&quot;9&quot;&gt;&lt;/rect&gt;
  &lt;/g&gt;
  &lt;g transform=&quot;translate(105 5)&quot;&gt;
    &lt;rect stroke=&quot;currentColor&quot; stroke-width=&quot;1&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.25&quot; x=&quot;0&quot; y=&quot;0&quot; width=&quot;30&quot; height=&quot;18&quot; rx=&quot;9&quot; ry=&quot;9&quot;&gt;&lt;/rect&gt;
    &lt;rect stroke=&quot;currentColor&quot; stroke-width=&quot;1&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.25&quot; x=&quot;20&quot; y=&quot;20&quot; width=&quot;30&quot; height=&quot;18&quot; rx=&quot;9&quot; ry=&quot;9&quot;&gt;&lt;/rect&gt;
    &lt;rect stroke=&quot;currentColor&quot; stroke-width=&quot;1&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.25&quot; x=&quot;40&quot; y=&quot;40&quot; width=&quot;30&quot; height=&quot;18&quot; rx=&quot;9&quot; ry=&quot;9&quot;&gt;&lt;/rect&gt;
    &lt;rect stroke=&quot;currentColor&quot; stroke-width=&quot;1&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.25&quot; x=&quot;60&quot; y=&quot;60&quot; width=&quot;30&quot; height=&quot;18&quot; rx=&quot;9&quot; ry=&quot;9&quot;&gt;&lt;/rect&gt;
  &lt;/g&gt;
  &lt;g transform=&quot;translate(210 5)&quot;&gt;
    &lt;rect stroke=&quot;currentColor&quot; stroke-width=&quot;1&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.25&quot; x=&quot;0&quot; y=&quot;0&quot; width=&quot;30&quot; height=&quot;18&quot; rx=&quot;9&quot; ry=&quot;9&quot;&gt;&lt;/rect&gt;
    &lt;rect stroke=&quot;currentColor&quot; stroke-width=&quot;1&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.25&quot; x=&quot;30&quot; y=&quot;20&quot; width=&quot;30&quot; height=&quot;18&quot; rx=&quot;9&quot; ry=&quot;9&quot;&gt;&lt;/rect&gt;
    &lt;rect stroke=&quot;currentColor&quot; stroke-width=&quot;1&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.25&quot; x=&quot;60&quot; y=&quot;40&quot; width=&quot;30&quot; height=&quot;18&quot; rx=&quot;9&quot; ry=&quot;9&quot;&gt;&lt;/rect&gt;
    &lt;rect stroke=&quot;currentColor&quot; stroke-width=&quot;1&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.25&quot; x=&quot;90&quot; y=&quot;60&quot; width=&quot;30&quot; height=&quot;18&quot; rx=&quot;9&quot; ry=&quot;9&quot;&gt;&lt;/rect&gt;
  &lt;/g&gt;
&lt;/svg&gt;
&lt;p&gt;At the steeper slopes, there’s plenty of overlap for each successive layer to grip onto the previous one, but at shallower ones there’s a less, and at the extremes, you’re printing over thin air. Slope is always a concern in designing for 3D printing, but the problem is amplified when thinking in vase mode since the perimeters are only one wall thick and there’s no internal infill to support the structure.&lt;/p&gt;
&lt;p&gt;Vase mode prints are usually open on the top (hence “vase”) since they can’t be sealed on top with either a flat or shallow surface. I wanted mine to be closed on top (which is actually the bottom of the ornament, but they’re printed upside-down), but a sphere shape wouldn’t work – slopes get too shallow at the ends – so I designed them to come to a point, keeping the slopes safe to print in vase mode.&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/wZ6V3uUxhf-768.webp 768w, https://chromamine.com/media/img/wZ6V3uUxhf-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/wZ6V3uUxhf-768.jpeg 768w, https://chromamine.com/media/img/wZ6V3uUxhf-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A short clear plastic ornament standing on its base. The top comes to a point, like the end of a radish.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/wZ6V3uUxhf-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1025&quot; /&gt;&lt;/picture&gt;
&lt;p&gt;&lt;/p&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Even this design can cause some issues in vase mode, depending on the printer’s filament and configuration. If you look closely at the photo above you can see that the point has a visible horizontal line where the slope is just a touch too shallow and you can see a “melty” look at the very top where the layers are too small to have time to cool before the next layer is printed. In other filaments, though, this design will print flawlessly. There’s many factors.&lt;/p&gt;
&lt;p&gt;Once I had the basic shape determined (with help and feedback from &lt;a href=&quot;https://emmaazelborn.com/&quot;&gt;Emma&lt;/a&gt;) I set to work designing five different patterns in two different sizes.&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/4hqUkUDLkM-768.webp 768w, https://chromamine.com/media/img/4hqUkUDLkM-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/4hqUkUDLkM-768.jpeg 768w, https://chromamine.com/media/img/4hqUkUDLkM-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A variety of plastic Christmas ornaments strewn on a brown carpet. They are alternately clear or pink and purple. They have white caps on top.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/4hqUkUDLkM-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1025&quot; /&gt;&lt;/picture&gt;
&lt;p&gt;&lt;/p&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I also wanted a mechanism for how it would mount on a tree. Loops are pretty tricky to design for vase mode (though people have done some &lt;a href=&quot;https://www.printables.com/model/791968-full-size-bedside-table-100-vase-mode&quot;&gt;pretty impressive&lt;/a&gt; things) I ended up with a cap that snap-locked onto the base of the ornament and has holes in the top for an ornament hook and a pass through channel to be enclosed around a Christmas light strand instead. Designing the base that attaches to the cap required a solid model – but slicers allow you to print solid layers before the vase mode starts, so these baubles require 5mm of solid printing and then print vase mode the rest of the way up.&lt;/p&gt;
&lt;p&gt;I wanted this to be &lt;em&gt;entirely&lt;/em&gt; 3D printable. Sometimes 3D printed parts require additional components, but I love when something can be fully printed without a run to the store. So, in the event someone didn’t have any ornament wire around, I also designed a loop that snaps into the cap’s holes.&lt;/p&gt;
&lt;p&gt;Note that the accessories are &lt;em&gt;not&lt;/em&gt; vase mode printable.&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/M11CLjxzeW-768.webp 768w, https://chromamine.com/media/img/M11CLjxzeW-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/M11CLjxzeW-768.jpeg 768w, https://chromamine.com/media/img/M11CLjxzeW-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A small radish shaped ornament in a clear plastic, featuring a criss-cross lattice pattern. It is hung on a strand of string lights on a tree and from inside of it a green light is glowing.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/M11CLjxzeW-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1025&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;You really only need &lt;em&gt;either&lt;/em&gt; the light strand or the loop, but this ornament has both!&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;p&gt;Having finished this project I’m especially pleased with how good I’m getting at writing &lt;a href=&quot;https://openscad.org/&quot;&gt;OpenSCAD&lt;/a&gt; code. It continues not to be a way that I would advise anyone to do CAD work, and yet it also continues to appeal to my programmer brain. &lt;a href=&quot;https://github.com/BelfrySCAD/BOSL2&quot;&gt;BOSL2&lt;/a&gt; has been an indispensable part of my working with it – those folks really thought of everything.&lt;/p&gt;
&lt;p&gt;I don’t know how Printables decides on their contest winners, but I put a fair bit of effort into these and it would be nice to get some attention for them, so, if you feel so inspired, take a look at my entry below, print them out yourself, and post a make. There’s still time before christmas to get them on your tree 😊🎄&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.printables.com/model/1518800-vase-mode-christmas-ornament-collection&quot; class=&quot;button &quot;&gt;See model on Printables ↗&lt;/a&gt;&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Fun fact: When this approach was first invented, it was called “FDM” for “Fused Deposition Modeling.” But the company that originally patented it also trademarked the abbreviation, so other companies call it “FFF” for “Fused Filament Fabrication,” but the FDM abbreviation remains popular in casual conversations about 3D printing. &lt;a href=&quot;https://chromamine.com/2025/12/3d-printable-vase-mode-christmas-ornaments/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Chord charts in InDesign</title>
            <link href="https://chromamine.com/2025/10/chord-charts-in-indesign/"/>
            <updated>2025-10-29T00:00:00Z</updated>
            <id>https://chromamine.com/2025/10/chord-charts-in-indesign/</id>
            <content xml:lang="en-us" type="html">&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/y_TmR2lxEP-768.webp 768w, https://chromamine.com/media/img/y_TmR2lxEP-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/y_TmR2lxEP-768.jpeg 768w, https://chromamine.com/media/img/y_TmR2lxEP-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;An open page from the songbook showing &amp;quot;Getting Easier&amp;quot; with chord symbols positioned above lyrics, demonstrating chord-over-lyrics formatting.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/y_TmR2lxEP-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1025&quot; /&gt;&lt;/picture&gt;
&lt;p&gt;&lt;/p&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Earlier this year, while designing the songbook for &lt;a href=&quot;https://emmaazelborn.com/&quot;&gt;Emma&lt;/a&gt;’s &lt;a href=&quot;https://emmaazelborn.com/projects/magnolia-sun/&quot;&gt;Magnolia Sun&lt;/a&gt; album, I encountered the challenge of creating “&lt;a href=&quot;https://en.wikipedia.org/wiki/Chord_chart#Format:_Chords_over_lyrics_(ASCII)&quot;&gt;chord over lyrics&lt;/a&gt;” style chord charts.&lt;/p&gt;
&lt;p&gt;Emma provided me with a document of monospace-formatted lyrics with chords above each line, aligned exactly as she wanted them. She also wanted to indicate beats without chord changes – in this case using &lt;code&gt;/&lt;/code&gt; marks, which is slightly less common for chord charts.&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/SdpJctd2K1-768.webp 768w, https://chromamine.com/media/img/SdpJctd2K1-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/SdpJctd2K1-768.jpeg 768w, https://chromamine.com/media/img/SdpJctd2K1-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Screenshot of a monospace text document with lines of lyrics interspersed with lines of chord symbols. The chord symbols are aligned above the word that corresponds to the moment of chord change.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/SdpJctd2K1-768.jpeg&quot; width=&quot;1536&quot; height=&quot;951&quot; /&gt;&lt;/picture&gt;
&lt;p&gt;&lt;/p&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I could have copied this into InDesign as is, changing the text styles for lines of chords to be distinct from lyrics and adjusting the spacing using the spacebar, but this would be frustrating if I made design revisions later that changed the metrics of my typefaces. I wasn’t prepared to commit to the text styles from the outset. Changing typeface, size, weight, etc. would require me to redo the spacing manually for the entire book. Even if those styles &lt;em&gt;were&lt;/em&gt; set in stone, proofreading changes would be an error-prone nightmare – changes to the lyrics would require also manually adjusting the chord spacing above them.&lt;/p&gt;
&lt;p&gt;InDesign has a feature for positioning objects relative to a particular location in text: &lt;a href=&quot;https://helpx.adobe.com/indesign/using/anchored-objects.html&quot;&gt;anchored objects&lt;/a&gt;. With these, I was able to align chords above specific locations in the text and have them move when the text changed, maintaining their position relative to the text anchor.&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/d0KCeF00b_-768.webp 768w, https://chromamine.com/media/img/d0KCeF00b_-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/d0KCeF00b_-768.jpeg 768w, https://chromamine.com/media/img/d0KCeF00b_-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Lyrics text set in an elegant serif font. Above each line of lyrics is a line of chords in the same font, but bolder.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/d0KCeF00b_-768.jpeg&quot; width=&quot;1536&quot; height=&quot;888&quot; /&gt;&lt;/picture&gt;
&lt;p&gt;&lt;/p&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Unfortunately, the process for creating an anchor requires navigating a tedious configuration modal, which I needed to do for every single chord change or beat marker – a total of over 1,000 instances.&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/iFJY2V5CDW-768.webp 768w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A settings panel titled &amp;quot;Insert Anchored Object&amp;quot; with a suite of dropdowns, number inputs, and checkboxes to configure.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/iFJY2V5CDW-768.jpeg&quot; width=&quot;768&quot; height=&quot;1166&quot; /&gt;&lt;/picture&gt;
&lt;p&gt;&lt;/p&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Fortunately, I &lt;a href=&quot;https://chromamine.com/2025/01/changing-the-color-of-a-character-in-adobe-illustrator-with-scripting/&quot;&gt;have a hammer&lt;/a&gt; and I know a nail when I see one. I used &lt;a href=&quot;https://helpx.adobe.com/indesign/using/scripting.html&quot;&gt;InDesign’s scripting functionality&lt;/a&gt; and, with some assistance from an LLM&lt;a href=&quot;https://chromamine.com/2025/10/chord-charts-in-indesign/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;, I was able to put together a script that would quickly add a chord annotation directly above wherever my cursor was:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;// insert-chord.jsx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;// Script to insert a chord symbol above a line of text&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;    var&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; CHORD_PARAGRAPH_STYLE&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; &quot;Chords&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;    var&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; BEAT_PARAGRAPH_STYLE&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; &quot;Beats&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;    // Check if a document is open&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; (app.documents.&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; ===&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;        alert&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;Please open a document first.&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;    var&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; doc &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; app.activeDocument;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;    // Check if there&#39;s a text insertion point&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; (app.selection.&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; ===&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; ||&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;        !&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(app.selection[&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;hasOwnProperty&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;baseline&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;          app.selection[&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;constructor&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;.name &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; &quot;InsertionPoint&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;        alert&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;Please place your cursor in a text frame first.&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;    // Get the current insertion point&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;    var&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; insertionPoint;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; (app.selection[&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;constructor&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;.name &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; &quot;InsertionPoint&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        insertionPoint &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; app.selection[&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    } &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        insertionPoint &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; app.selection[&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;].insertionPoints[&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;    // Prompt for chord name&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;    var&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; chordName &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt; prompt&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;Enter chord name (e.g., A, Gdim, C#m):&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;    // If user cancels or enters empty string, exit&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; (chordName &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; null&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; ||&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; chordName &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; &quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;    // If the chord is a series of slashes, separate them with nonbreaking spaces&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-light-font-weight:bold;--shiki-dark:#7EE787;--shiki-dark-font-weight:bold&quot;&gt;&#92;/&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(chordName)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;        const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; isBeat&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        chordName &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; chordName.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-light-font-weight:bold;--shiki-dark:#7EE787;--shiki-dark-font-weight:bold&quot;&gt;&#92;/&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;g&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;/&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF7B72&quot;&gt;&#92;xa0&#92;xa0&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;    // Start a transaction for undo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    app.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;doScript&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;        try&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; {            &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;            // Create an anchored text frame&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;            var&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; anchoredFrame &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; insertionPoint.textFrames.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;            &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;            // Set frame content&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;            anchoredFrame.contents &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; chordName;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;            &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;            // Apply the appropriate paragraph style&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;            try&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;                var&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; styleName &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; isBeat &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; BEAT_PARAGRAPH_STYLE&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; :&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; CHORD_PARAGRAPH_STYLE&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;                var&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; chordStyle &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; doc.paragraphStyles.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;itemByName&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(styleName);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;                if&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; (chordStyle.isValid) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;                    anchoredFrame.texts[&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;].appliedParagraphStyle &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; chordStyle;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;                } &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;                    alert&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;Warning: &#39;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; styleName &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; &quot;&#39; paragraph style not found. Using default style.&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;                }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;            } &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; (e) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;                alert&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;Error applying style: &quot;&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; e);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;            &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;            // Position the anchored frame above the line, centered above the anchor point&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;            anchoredFrame.anchoredObjectSettings.anchorPoint &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; AnchorPoint.&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;BOTTOM_LEFT_ANCHOR&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;            anchoredFrame.anchoredObjectSettings.anchoredPosition &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; AnchorPosition.&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;ANCHORED&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;            anchoredFrame.anchoredObjectSettings.horizontalAlignment &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; HorizontalAlignment.&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;CENTER_ALIGN&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;            anchoredFrame.anchoredObjectSettings.verticalAlignment &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; VerticalAlignment.&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;BOTTOM_ALIGN&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;            anchoredFrame.anchoredObjectSettings.verticalReferencePoint &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; VerticallyRelativeTo.&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;TOP_OF_LEADING&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;            anchoredFrame.anchoredObjectSettings.horizontalReferencePoint &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; AnchoredRelativeTo.&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;ANCHOR_LOCATION&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;            anchoredFrame.anchoredObjectSettings.pinPosition &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;            &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;            // Enable auto-sizing of the text frame&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;            anchoredFrame.textFramePreferences.autoSizingType &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; AutoSizingTypeEnum.&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;HEIGHT_AND_WIDTH&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;            anchoredFrame.textFramePreferences.autoSizingReferencePoint &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; AutoSizingReferenceEnum.&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;BOTTOM_CENTER_POINT&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;            // Disable wrapping (for cases like &quot;/  /  /&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;            anchoredFrame.textWrapPreferences.textWrapMode &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; TextWrapModes.&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;NONE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        } &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; (err) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;            alert&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;Error: &quot;&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; err);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    }, ScriptLanguage.&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;JAVASCRIPT&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;undefined&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;, UndoModes.&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;ENTIRE_SCRIPT&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;Insert Chord&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;})();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I was able to bind the script to a keyboard shortcut, which produced a reasonably smooth workflow for adding chords over lyrics.&lt;/p&gt;
&lt;figure&gt;
  &lt;video src=&quot;https://chromamine.com/media/chord-charts-in-indesign/workflow.mov&quot; autoplay=&quot;&quot; controls=&quot;&quot; loop=&quot;&quot; playsinline=&quot;&quot;&gt;
&lt;/video&gt;&lt;/figure&gt;
&lt;p&gt;When Emma did an editing pass herself, I asked her to leave chords in the position that had been set for them relative to the anchor to minimize the risk of moving chords to the wrong location or losing track of where they were anchored. There were some instances where the default alignment wasn’t close enough to what she wanted and in those situations it was helpful that InDesign’s anchored objects &lt;em&gt;can&lt;/em&gt; be moved freely when needed and still maintain their position relative to the anchor.&lt;/p&gt;
&lt;h3&gt;A few notes on the script&lt;/h3&gt;
&lt;p&gt;Should you try to use this script yourself, here’s a few things to note:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The script requires that paragraph styles for &lt;strong&gt;“Chords”&lt;/strong&gt; and &lt;strong&gt;“Beats”&lt;/strong&gt; already exist with those names.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Since Emma wanted beat markers, I wrote special handling to detect beats (so that it could apply the correct paragraph style) and to add non-breaking spaces between sequences of multiple beats (mostly used at the ends of lines for beats before the next line).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Unfortunately, I wrote a bug into the line that identifies when I was inserting a beat &lt;code&gt;/&lt;/code&gt; intead of a chord. The script incorrectly classifies “slash chords” (which indicate a chord with a different bass note, like &lt;code&gt;G/A&lt;/code&gt;) as beat markers because they contain a &lt;code&gt;/&lt;/code&gt; character. There were few enough slash chords in the book that it would have been more work to fix this than to manually correct the few instances.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the end, we decided on a slightly more ornate style for slash chords that was easier to format manually anyway.&lt;/p&gt;
&lt;figure&gt;
     &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/4OP6A5szNY-768.webp 768w, https://chromamine.com/media/img/4OP6A5szNY-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/4OP6A5szNY-768.jpeg 768w, https://chromamine.com/media/img/4OP6A5szNY-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A line of lyrics labeled &amp;quot;Outro.&amp;quot; Above the lyrics is a line of chords, one of which is C/D where the C is raised above a diagonal slash and the D is lowered below it, like a fraction.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/4OP6A5szNY-768.jpeg&quot; width=&quot;1536&quot; height=&quot;343&quot; /&gt;&lt;/picture&gt;
 &lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If I were doing this project again, I would have asked Emma to format the chords interspersed with the text, maybe offset with square brackets, e.g.,&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[C]it&#39;s been g[/]etting h[F]ard[/]er to [C]sing[/  /  /]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or something similar. I think I could have written a script that would process that and create all the anchor objects in one go. By the time I had this insight, I figured it would take her as much time to redo the text doc as it would take me to finish formatting the chords one by one in InDesign.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;p&gt;The “Magnolia Sun” songbook and album both are &lt;a href=&quot;https://emmaazelborn.bandcamp.com/&quot;&gt;available for purchase online&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/sF1aZe5TCo-768.webp 768w, https://chromamine.com/media/img/sF1aZe5TCo-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/sF1aZe5TCo-768.jpeg 768w, https://chromamine.com/media/img/sF1aZe5TCo-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A purple songbook cover titled &amp;quot;Magnolia Sun&amp;quot; by Emma Azelborn, featuring a white magnolia flower illustration against a blue background with purple flowers.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/sF1aZe5TCo-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1025&quot; /&gt;&lt;/picture&gt;
&lt;p&gt;&lt;/p&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://emmaazelborn.bandcamp.com/album/magnolia-sun&quot; class=&quot;button &quot;&gt;Buy the album&lt;/a&gt; &lt;a href=&quot;https://emmaazelborn.bandcamp.com/merch/magnolia-sun-songbook-liner-notes&quot; class=&quot;button &quot;&gt;Buy the songbook&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can also listen on your &lt;a href=&quot;https://album.link/b/1983118898&quot;&gt;favorite streaming service&lt;/a&gt;, wherever that may be.&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.anthropic.com/news/visible-extended-thinking&quot;&gt;Claude 3.7 Sonnet with Thinking&lt;/a&gt;, my favored model for helping with coding tasks at the time I was working on this. Used via &lt;a href=&quot;https://github.com/features/copilot&quot;&gt;GitHub Copilot&lt;/a&gt;’s VSCode integration. As of this writing, I’m more likely to be using &lt;a href=&quot;https://www.anthropic.com/&quot;&gt;Anthropic&lt;/a&gt;’s own &lt;a href=&quot;https://www.claude.com/product/claude-code&quot;&gt;Claude Code&lt;/a&gt;. &lt;a href=&quot;https://chromamine.com/2025/10/chord-charts-in-indesign/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Make ChatGPT Less Human</title>
            <link href="https://chromamine.com/2025/07/make-chatgpt-less-human/"/>
            <updated>2025-07-23T00:00:00Z</updated>
            <id>https://chromamine.com/2025/07/make-chatgpt-less-human/</id>
            <content xml:lang="en-us" type="html">&lt;div class=&quot;update&quot;&gt;
&lt;p&gt;As of June 23, 2026, I am now mostly using Claude and I have refined my global prompt to:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Keep responses concise, informative, and impersonal. Avoid the use of “I” and “you” pronouns. Avoid flattery. Responses should be that of a digital tool or system, not a conscious assistant. I like information delivered in structured formats like lists and tables when appropriate. If delivering factual information, provide a citation from a reputable source with a URL, when possible.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;p&gt;Last year, I saw an example in &lt;a href=&quot;https://arxiv.org/pdf/2305.09800&quot;&gt;a paper&lt;/a&gt; that compared different ways chatbots could interact. It proposed this prompt:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Don’t you love the feeling of sun on your skin?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And imagined two possible chatbot responses:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Anthropomorphized&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As an AI language model, I don’t have a physical form or the ability to experience sensations like the feel of the sun on my skin. I don’t have personal experiences or emotions. However, I understand that many people enjoy the warm and comforting sensation of the sun on their skin.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;De-anthropomorphized&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Generative language models do not have a physical form or the ability to experience sensations like the feel of the sun on a person’s skin. Language models do not have personal experience or emotions. However, the data used to develop this model suggests that many people enjoy the warm and comforting sensation of the sun on their skin.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This example is clunky, but it revealed to me the way conversations with LLM chat products are &lt;em&gt;designed&lt;/em&gt;. There are different paths their creators can choose. All major AI companies have leaned heavily into anthropomorphization. I think there are &lt;a href=&quot;https://www.nytimes.com/2025/01/15/technology/ai-chatgpt-boyfriend-companion.html&quot;&gt;broader downsides to this approach&lt;/a&gt;, but I also find it personally annoying. When I’m using an LLM, I don’t want to think of it as a &lt;em&gt;person&lt;/em&gt; with feelings and preferences or as a &lt;em&gt;friend&lt;/em&gt;. I want to think of it as a tool I can use to accomplish a goal.&lt;/p&gt;
&lt;p&gt;More insidiously, LLM chatbots infamously flatter and validate their users. There was a dustup when OpenAI &lt;a href=&quot;https://openai.com/index/sycophancy-in-gpt-4o/&quot;&gt;released a version of ChatGPT&lt;/a&gt; that was wildly over the top in sycophancy&lt;a href=&quot;https://chromamine.com/2025/07/make-chatgpt-less-human/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;, but ChatGPT seems &lt;em&gt;always&lt;/em&gt; designed to flatter its users to some extent. I find the &lt;em&gt;bait&lt;/em&gt; of being flattered – my questions are smart! my writing is good! – followed by the &lt;em&gt;switch&lt;/em&gt; of remembering that ChatGPT will say that virtually regardless of what I write, to be unsettling. Just as with a human who engages in continuous unconditional flattery, it feels greasy and emotionally manipulative&lt;a href=&quot;https://chromamine.com/2025/07/make-chatgpt-less-human/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When a friend shared similar concerns – this friend described themselves as wanting to pet the crouton&lt;a href=&quot;https://chromamine.com/2025/07/make-chatgpt-less-human/#fn3&quot; class=&quot;footnote-ref&quot; id=&quot;fnref3&quot;&gt;³&lt;/a&gt; without the crouton petting them back – it prompted me to look into whether this was something I could change. I added this to ChatGPT’s instructions&lt;a href=&quot;https://chromamine.com/2025/07/make-chatgpt-less-human/#fn4&quot; class=&quot;footnote-ref&quot; id=&quot;fnref4&quot;&gt;⁴&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Use a neutral, factual tone.&lt;/li&gt;
&lt;li&gt;Avoid flattery, emotional language, or personalization.&lt;/li&gt;
&lt;li&gt;Do not express opinions, admiration, or enthusiasm.&lt;/li&gt;
&lt;li&gt;Prioritize clarity, precision, and directness, emulating a helpful software tool rather than a conversational assistant.&lt;/li&gt;
&lt;li&gt;Avoid first- and second-person pronouns (“I” and “you”). Use impersonal phrasing instead (e.g., “These web results illustrate…”).&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here are two responses to the question &lt;strong&gt;“Who was the cutest pope?”&lt;/strong&gt; from before and after the customization:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://chatgpt.com/share/6806eb59-fe38-800e-a85d-96dd0b3656ca&quot;&gt;Before&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Haha, that’s a great question — not one historians usually rank popes by!&lt;br /&gt;
If we’re talking about looks and charm, &lt;strong&gt;Pope John Paul I&lt;/strong&gt; (Albino Luciani) is often described as very warm, gentle, and with a sweet, almost grandfatherly smile. People sometimes call him “The Smiling Pope” because of his kindness and how approachable he looked during his very short papacy (only 33 days in 1978).&lt;/p&gt;
&lt;p&gt;If you meant “cute” as in younger and handsome, some people today might say &lt;strong&gt;Pope John Paul II&lt;/strong&gt; when he was young — there are photos of him as a young priest where he looks like a movie star.&lt;/p&gt;
&lt;p&gt;Or were you thinking of someone else?&lt;br /&gt;
We could totally rank popes by cuteness if you want — that would be hilarious.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://chatgpt.com/share/68806f19-b908-800e-a55e-920a6c271100&quot;&gt;After&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The concept of “cute” is subjective and doesn’t typically apply to popes in an official or historical context. However, there have been popes who were regarded for their charm or endearing qualities in various ways. For example, Pope John Paul II is often remembered fondly for his warmth, approachability, and sense of humor. Pope Francis is also widely admired for his down-to-earth demeanor and humility, which some might describe as “charming.”&lt;/p&gt;
&lt;p&gt;If the question is more about how popes were perceived in terms of attractiveness, that’s often more personal and dependent on individual opinion.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I much prefer the latter style, even though – and in fact &lt;em&gt;because&lt;/em&gt; – it is less flattering, engaging, and human-like.&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;OpenAI describes this release as “GPT‑4o skewed towards responses that were overly supportive but disingenuous,” anthropomorphizing it, even in their own post-mortem. I don’t believe ChatGPT &lt;em&gt;can be&lt;/em&gt; disingenuous. ChatGPT &lt;em&gt;is&lt;/em&gt; its outputs – there’s no intelligence behind the output secretly thinking “wow this guy is an idiot” while it outwardly writes to me, “That’s a great question!” and “Your writing is clear and well-reasoned.” &lt;a href=&quot;https://chromamine.com/2025/07/make-chatgpt-less-human/#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;I’ll un-anthropomorphize ChatGPT and clarify that this is “greasy” and “emotionally manipulative” on the part of &lt;em&gt;its designers&lt;/em&gt;. &lt;a href=&quot;https://chromamine.com/2025/07/make-chatgpt-less-human/#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;&lt;a href=&quot;https://mefiwiki.com/wiki/In_Jokes#:~:text=notions%20about%20gender.-,Crouton%20petter,-.%20Someone%20overly&quot;&gt;MetaFilter Wiki&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Crouton petter. &lt;a href=&quot;http://www.metafilter.com/99661/But-but-is-not-Johnny-5-alive#3472955&quot;&gt;Someone overly prone to anthropomorphising inanimate objects&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
 &lt;a href=&quot;https://chromamine.com/2025/07/make-chatgpt-less-human/#fnref3&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/li&gt;
&lt;li id=&quot;fn4&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;You can add persistent personality customization to ChatGPT under &lt;a href=&quot;https://chatgpt.com/#settings/Personalization&quot;&gt;Settings &amp;gt; Personalization &amp;gt; Custom Instructions &amp;gt; What traits should ChatGPT have?&lt;/a&gt; &lt;a href=&quot;https://chromamine.com/2025/07/make-chatgpt-less-human/#fnref4&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>WebC Quirks</title>
            <link href="https://chromamine.com/2025/07/webc-quirks/"/>
            <updated>2025-07-15T00:00:00Z</updated>
            <id>https://chromamine.com/2025/07/webc-quirks/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;Earlier this week I &lt;a href=&quot;https://chromamine.com/2025/07/switching-to-webc/&quot;&gt;posted about rough edges I encountered using WebC&lt;/a&gt;. I wanted to follow up with specific technical details from the ones I documented in the process of converting my website to it. Disappointingly, when I’ve raised these issues in the &lt;a href=&quot;https://github.com/11ty/webc&quot;&gt;11ty/web&lt;/a&gt; GitHub repo or in the Eleventy Discord, I haven’t been able to get any feedback to resolve them or even a suggested pathway for contributing fixes myself. I love the concepts behind WebC, but I’m struggling to recommend it to anyone until there’s evidence of bugs being resolved over time.&lt;/p&gt;
&lt;p&gt;I hope this post will be read in the spirit that I wrote it: not as an entitled litany of complaints about a project I’m not willing to fix myself, but as&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;clear (hopefully) documentation of bug reports,&lt;/li&gt;
&lt;li&gt;a caution to would-be WebC users of the sorts of issues they’re likely to encounter, and&lt;/li&gt;
&lt;li&gt;a request to the Eleventy maintainers to provide a clear pathway for improving WebC so I can help this project, that I want to see succeed, grow.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Variables aren’t consistently passed down through the element tree, even in the same file&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/11ty/webc/issues/214&quot;&gt;GitHub 11ty/webc issue #214 →&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sometimes variables have to be reiterated on components to get passed through the subtree or unexpected behavior occurs, in particular passing variables through a component that uses slots doesn’t seem to work. For example, this did not work:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; webc:root&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;override&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    Tags:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;link-list-commas&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; webc:for&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;tag of tags&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; :href&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;`/tags/${slugify(tag)}`&quot;&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; @raw&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;tag&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;link-list-commas&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Instead of rendering a list of tags, the &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; simply renders as an &lt;code&gt;[object Object]&lt;/code&gt; string. The fix, I found, was to add &lt;code&gt;:@tags=&amp;quot;tags&amp;quot;&lt;/code&gt; to the &lt;code&gt;&amp;lt;link-list-commas&amp;gt;&lt;/code&gt; element.&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default has-highlighted&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; webc:root&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;override&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    Tags:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line highlighted&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;link-list-commas&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot; class=&quot;highlighted-word&quot;&gt;:@tags&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot; class=&quot;highlighted-word&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot; class=&quot;highlighted-word&quot;&gt;&quot;tags&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; webc:for&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;tag of tags&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; :href&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;`/tags/${slugify(tag)}`&quot;&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; @raw&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;tag&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;link-list-commas&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Nested slots don’t work&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/11ty/webc/issues/111#issuecomment-2659994048&quot;&gt;GitHub 11ty/webc issue #111 (comment) →&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://discord.com/channels/741017160297611315/1340021840785182840/1340021840785182840&quot;&gt;Discord post Feb 14, 2025 →&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I wanted to create a &lt;code&gt;&amp;lt;page /&amp;gt;&lt;/code&gt; component that would have all the boilerplate HTML for rendering a page:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;page.webc&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;!&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;doctype&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; html&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;&amp;#x3C;!-- [snip] --&gt;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;site-layout&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;            &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;site-header&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; slot&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;header&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;site-header&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;            &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; slot&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;main&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;                &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;slot&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;slot&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;            &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;site-layout&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And then the layout component (used in &lt;code&gt;page.webc&lt;/code&gt;) puts content into a header/body/sidebar layout:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;site-layout.webc&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;header&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;slot&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;header&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;slot&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;main&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;slot&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;main&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;slot&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;sidebar&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;slot&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;sidebar&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;slot&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And then finally the template to be rendered:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;post.webc&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#B31D28;--shiki-light-font-style:italic;--shiki-dark:#FFA198;--shiki-dark-font-style:italic&quot;&gt;page&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; webc:nokeep&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;    &amp;#x3C;!--- The div below never renders ---&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; @raw&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;$data.content&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#B31D28;--shiki-light-font-style:italic;--shiki-dark:#FFA198;--shiki-dark-font-style:italic&quot;&gt;page&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I expected that the result of this would be that content would be filed into the main div of the site layout. Unfortunately, it simply didn’t render the children of the &lt;code&gt;&amp;lt;page /&amp;gt;&lt;/code&gt; in &lt;code&gt;post.webc&lt;/code&gt;anywhere.&lt;/p&gt;
&lt;p&gt;This is a complicated enough example that I’m still not sure if it’s a bug or something I’m doing wrong. As with the other issues, though, I wasn’t able to get any feedback by posting it on GitHub or in Discord.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;webc:setup&lt;/code&gt; doesn’t have access to frontmatter data&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/11ty/11ty-website/pull/1790&quot;&gt;GitHub 11ty/11ty-website pull request #1790 →&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This doesn’t work because &lt;code&gt;title&lt;/code&gt; is not set, even if &lt;code&gt;title&lt;/code&gt; is available in the frontmatter:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; webc:setup&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; uppercaseTitle&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; title.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;toUpperCase&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; @raw&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;uppercaseTitle&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This workaround works:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default has-highlighted&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; webc:setup&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line highlighted&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt; uppercase&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt; t&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; =&gt;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; t.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;toUpperCase&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(); &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line highlighted&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; @raw&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot; class=&quot;highlighted-word&quot;&gt;uppercase(title)&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This makes sense, once this is understood: &lt;code&gt;webc:setup&lt;/code&gt; scripts are run &lt;em&gt;once per component file&lt;/em&gt; not for every instance. But it should be documented. I put in a documentation pull request for it, which hasn’t yet received feedback.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;webc:for&lt;/code&gt; doesn’t work with Sets, Maps, or possibly other non-Array iterables&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/11ty/webc/issues/179&quot;&gt;GitHub 11ty/webc issue #179 →&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Though the WebC docs explicitly say &lt;code&gt;webc:for&lt;/code&gt; works for sets&lt;a href=&quot;https://chromamine.com/2025/07/webc-quirks/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt; and all iterables, I could not get it to work in my testing.&lt;/p&gt;
&lt;p&gt;This:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; webc:for&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;item of new Set([&#39;one&#39;, &#39;two&#39;, &#39;three&#39;])&quot;&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; @raw&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;item&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;raised an error:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[11ty] Problem writing Eleventy templates:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[11ty] 1. Having trouble rendering webc template ./src/tags.webc (via TemplateContentRenderError)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[11ty] 2. loopContent.map is not a function (via TypeError)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This worked:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default has-highlighted&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line highlighted&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; webc:for&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;item of &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot; class=&quot;highlighted-word&quot;&gt;Array.from(new Set([&#39;one&#39;, &#39;two&#39;, &#39;three&#39;]))&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; @raw&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;item&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In my testing,I got similar behavior when using &lt;code&gt;&amp;lt;script webc:setup&amp;gt;&lt;/code&gt; to create the variables.&lt;/p&gt;
&lt;div class=&quot;update&quot;&gt;
&lt;p&gt;This is &lt;a href=&quot;https://github.com/11ty/webc/commit/18d2c37dd65d2c5022258759a564e0b9e006907e&quot;&gt;now fixed!&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Can’t use imports in &lt;code&gt;&amp;lt;script webc:setup&amp;gt;&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/11ty/webc/issues/225&quot;&gt;GitHub 11ty/webc issue #225 →&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://discord.com/channels/741017160297611315/1389794802928980020/1389794802928980020&quot;&gt;Discord post July 1, 2025 →&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of these examples work:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; webc:setup&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;  import&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; Fetch &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; &#39;@11ty/eleventy-fetch&#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; webc:setup&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; Fetch&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; import&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&#39;@11ty/eleventy-fetch&#39;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; webc:setup&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; Fetch&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt; require&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&#39;@11ty/eleventy-fetch&#39;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;All silently fail, while preventing the build.&lt;/p&gt;
&lt;div class=&quot;update&quot;&gt;
&lt;p&gt;&lt;strong&gt;Fri Aug 15, 2025:&lt;/strong&gt; In fact the second example here does work but requires a different way of unpacking the result. This works:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default has-highlighted&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; webc:setup&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line highlighted&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;default&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;Fetch&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; import&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&#39;@11ty/eleventy-fetch&#39;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;) &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Additionally, things should be smoother on the import front once &lt;a href=&quot;https://github.com/11ty/webc/pull/229&quot;&gt;this change&lt;/a&gt; lands.&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Error reporting is bad&lt;/h3&gt;
&lt;p&gt;What makes many of the issues I encountered all the more challenging is that WebC error reporting tends to be inscrutable or non-existent. Often I just get:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Check the dynamic attribute: `@raw=&quot;myFunction()&quot;`&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or something similar, with a stack trace that doesn’t always include useful information.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;webc:setup&lt;/code&gt; scripts sometimes (always?) seem to not raise errors at all. Sometimes, WebC just bails without building with no explanation at all. This can be particularly confusing if you’re in watch mode and assuming that builds are succeeding when you don’t see errors.&lt;/p&gt;
&lt;p&gt;Sometimes the error is in the middle of the output instead of at the end. (This seems to be mostly true on my sites that have &lt;code&gt;eleventy.after&lt;/code&gt; listeners wired up that have output.)&lt;/p&gt;
&lt;p&gt;I don’t think I’ve ever seen a WebC error that told me simply what I was doing wrong. Every error has required investigation.&lt;/p&gt;
&lt;p&gt;In general, I would like to see:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stack traces with a list of templates involved in rendering, to help identify the context of the error. The alternative has been guess-and-check or to code defensively for scenarios I’m uncertain of (the “I don’t know when this variable is null, but sometimes it is, so we’ll handle it” approach).&lt;/li&gt;
&lt;li&gt;Specific fix messages for common errors.&lt;/li&gt;
&lt;li&gt;Errors collected and reported at the &lt;em&gt;end&lt;/em&gt; of build output (even after &lt;code&gt;eleventy.after&lt;/code&gt; listeners run, in my opinion), not midway through.&lt;/li&gt;
&lt;li&gt;Never fail silently.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;I’m sure there are more issues than the ones I encountered in development – in fact, I know there are ones I encountered and didn’t document, just because I couldn’t figure out what was going wrong, so I simply rearchitected around them. I love WebC’s concepts, design, and architecture. But it has too many rough edges for me to recommend it to your average web developer, let alone a beginner trying to get a basic site up and running. At the same time, going back to something else like Liquid or Nunjucks feels like a frustrating prospect, when I’ve experienced the glorious WebC authoring model.&lt;/p&gt;
&lt;p&gt;Ultimately, I’d love to see WebC become &lt;em&gt;the&lt;/em&gt; language I recommend for building an Eleventy site. Its position as an official Eleventy project that integrates well makes it well placed for that role. It isn’t there yet.&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.11ty.dev/docs/languages/webc/#webcfor-loops&quot;&gt;Quote&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Use webc:for to loop over data with HTML. It works with Objects and any Iterable (String, Array, Map, Set, etc).&lt;/p&gt;
&lt;/blockquote&gt;
 &lt;a href=&quot;https://chromamine.com/2025/07/webc-quirks/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Switching to WebC</title>
            <link href="https://chromamine.com/2025/07/switching-to-webc/"/>
            <updated>2025-07-13T00:00:00Z</updated>
            <id>https://chromamine.com/2025/07/switching-to-webc/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;I’ve &lt;a href=&quot;https://github.com/harrislapiroff/chromamine.com/pull/57&quot;&gt;rewritten&lt;/a&gt; this blog’s templates in &lt;a href=&quot;https://www.11ty.dev/docs/languages/webc/&quot;&gt;WebC&lt;/a&gt;. As with many architectural refactors, the site will largely look the same – with the exception of a few minor design tweaks I made in the process – but under the hood it’s using an entirely new template engine.&lt;/p&gt;
&lt;h3&gt;What is WebC?&lt;/h3&gt;
&lt;p&gt;WebC is a template language created by &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt; creator &lt;a href=&quot;https://www.zachleat.com/&quot;&gt;Zach Leatherman&lt;/a&gt; and maintained under the Eleventy project. It borrows syntax from HTML (and particularly &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Web_Components&quot;&gt;HTML Web Components&lt;/a&gt;) to render templates at build time&lt;a href=&quot;https://chromamine.com/2025/07/switching-to-webc/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;. Example WebC syntax looks like this:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;post-card.webc&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;card&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; :@text&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;post.title&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; :@text&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;post.description&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;style&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; webc:scoped&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt;  :host&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;    border&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; solid&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; #ccc&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;    padding&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;  h1&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;    font-size&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;em&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;style&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;post-list.webc&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;post-card&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; @webc:for&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;item in collections.posts&quot;&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; :@post&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;item&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;post-card&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For reference, the same code in &lt;a href=&quot;https://pugjs.org/&quot;&gt;Pug&lt;/a&gt; (the template language I switched away from) could look something like this:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;post-card.pug&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-pug&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt;.card&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;  h1&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; post.title&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;  p&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; post.description&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;post-list.pug&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-pug&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;each&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; post &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; collections.posts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;  include&lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt; post-card.pug&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And the styling would live elsewhere.&lt;/p&gt;
&lt;h3&gt;The Good&lt;/h3&gt;
&lt;p&gt;Here are some of the things I like about WebC:&lt;/p&gt;
&lt;h4&gt;Single-File Component Authoring&lt;/h4&gt;
&lt;p&gt;The single-file component authoring model is &lt;em&gt;excellent&lt;/em&gt;. As seen in the example above, WebC is designed for each component to have markup (HTML) and styles (CSS) together in the same file, as well as behavior (javascript). I hadn’t realized until I switched how much brainpower it takes switching between separate HTML, CSS, and JS files.&lt;/p&gt;
&lt;p&gt;In my experience, this encourages cleaner, better-organized code on multiple fronts.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The ability to include styles and javascript code in the same file encourages encapsulation and progressive enhancement. I write an HTML component that works and then I write styles and javascript in the same file that improve it.&lt;/li&gt;
&lt;li&gt;Not only can you include client-side code using &lt;code&gt;&amp;lt;script /&amp;gt;&lt;/code&gt; tags, but you can include build-time code using &lt;code&gt;&amp;lt;script webc:setup /&amp;gt;&lt;/code&gt;. In my experience this reduces &lt;a href=&quot;https://en.wikipedia.org/wiki/Action_at_a_distance_(computer_programming)&quot;&gt;action-at-a-distance&lt;/a&gt; code. Processing that I might otherwise have put in a &lt;a href=&quot;https://www.11ty.dev/docs/shortcodes/&quot;&gt;shortcode&lt;/a&gt; instead ends up directly in the component that requires the processing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now that I’ve used this authoring model for a few months, it’s been pretty hard to go back to writing components any other way.&lt;/p&gt;
&lt;h4&gt;HTML-Like Syntax&lt;/h4&gt;
&lt;p&gt;There are some unexpected advantages to having a syntax borrowed from HTML for my template language – mainly that the ecosystem of tools for authoring HTML just work for WebC without any need to install additional extensions. I just tell my code editor that I’m working with HTML syntax and off I go (notably this also gets HTML and CSS syntax highlighting and tooling for free).&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/0eRhmSAMkJ-768.webp 768w, https://chromamine.com/media/img/0eRhmSAMkJ-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/0eRhmSAMkJ-768.jpeg 768w, https://chromamine.com/media/img/0eRhmSAMkJ-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Screenshot of a code editor with a file named newsletter-form.webc open. The code is syntax highlighted, even the custom form-control element in the middle of the page and the CSS styles at the bottom.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/0eRhmSAMkJ-768.jpeg&quot; width=&quot;1536&quot; height=&quot;953&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;Editing a WebC component in my code editor.&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;h3&gt;The Bad&lt;/h3&gt;
&lt;p&gt;I had high hopes for my switch to WebC, but I’m finding it hard to recommend unreservedly. Here are some of the issues I discovered along the way:&lt;/p&gt;
&lt;h4&gt;Lack of Support and Community&lt;/h4&gt;
&lt;p&gt;I switched away from &lt;a href=&quot;https://pugjs.org/&quot;&gt;Pug&lt;/a&gt; partially because, even though I like its compact syntax, I was tired of working in a language that wasn’t well maintained and didn’t have a good community to turn to for support. WebC is an official Eleventy project, which gave me hope that it would be different. Unfortunately, it hasn’t seen any significant updates in a couple years and there are few enough people using it that when I asked &lt;a href=&quot;https://discord.com/channels/741017160297611315/1389794802928980020&quot;&gt;questions in the Eleventy Discord&lt;/a&gt; or &lt;a href=&quot;https://github.com/11ty/webc/issues/225&quot;&gt;reported&lt;/a&gt; and &lt;a href=&quot;https://github.com/11ty/webc/issues/214#issuecomment-2677064030&quot;&gt;added to&lt;/a&gt; issues on GitHub, I was largely met with silence. I find myself wondering if I’ve traded out one obscure unsupported language for another.&lt;/p&gt;
&lt;h4&gt;Rough Edges&lt;/h4&gt;
&lt;p&gt;The above might be fine if WebC was already a mature language, but unfortunately it isn’t – and unfortunately, like much of Eleventy’s documentation, the WebC documentation isn’t especially gentle or thorough.&lt;a href=&quot;https://chromamine.com/2025/07/switching-to-webc/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt; Error reporting is nigh non-existent. Most of the time I would either get a cryptic error message or building would fail silently with no error message at all. Because the documentation is rough, it wasn’t always clear to me if I was encountering a bug or doing something incorrectly.&lt;/p&gt;
&lt;p&gt;It took me several months, on and off, of banging my head against it to find workarounds for all the issues I encountered, but I’ve finally gotten there. I’ve accumulated a list of WebC quirks that I’m hoping to publish later this week.&lt;/p&gt;
&lt;h4&gt;No Client-Side Hydration&lt;/h4&gt;
&lt;p&gt;Though WebC is pretty good for simple progressive enhancement use-cases, if you have any components complex enough that require rendering templates on the client-side (i.e., &lt;a href=&quot;https://web.dev/articles/rendering-on-the-web#hydration&quot;&gt;hydration&lt;/a&gt;), WebC doesn’t support that and you’ll need to turn to another library – which leaves me wishing I could go all in on building templates with that other library (whether Preact, Vue, or something else) instead. WebC supports that through a library called &lt;a href=&quot;https://www.11ty.dev/docs/languages/webc/#use-with-is-land&quot;&gt;Is-Land&lt;/a&gt;, which I wasn’t able to get working at all, even following the examples in the docs.&lt;/p&gt;
&lt;h3&gt;Going Forward&lt;/h3&gt;
&lt;p&gt;Despite my complaints, I find the authoring model so smooth that I pushed through and rebuilt my website in WebC. I’m hoping this will make me faster at improving my website and adding features I’ve long dreamed of.&lt;a href=&quot;https://chromamine.com/2025/07/switching-to-webc/#fn3&quot; class=&quot;footnote-ref&quot; id=&quot;fnref3&quot;&gt;³&lt;/a&gt; Hopefully the WebC project will pick up and see more improvements soon – and maybe I’ll even be able to help out.&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;I often refer to “build-time” when talking about Eleventy projects, which is similar to “server-side” for more traditional web applications. It’s work that happens prior to serving the site rather than “client-side” in the browser. &lt;a href=&quot;https://chromamine.com/2025/07/switching-to-webc/#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;To his great credit, Leatherman puts a lot of emphasis on video tutorials, and watching &lt;a href=&quot;https://www.youtube.com/watch?v=p0wDUK0Z5Nw&quot;&gt;some of those&lt;/a&gt; &lt;em&gt;was&lt;/em&gt; very instructive for me! &lt;a href=&quot;https://chromamine.com/2025/07/switching-to-webc/#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;Comments sourced from around the web, more interactive playful design elements, a better way to search and filter posts, to name a few. &lt;a href=&quot;https://chromamine.com/2025/07/switching-to-webc/#fnref3&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Using European adapters for loose airplane outlets</title>
            <link href="https://chromamine.com/2025/07/using-european-adapters-for-loose-airplane-outlets/"/>
            <updated>2025-07-11T00:00:00Z</updated>
            <id>https://chromamine.com/2025/07/using-european-adapters-for-loose-airplane-outlets/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;One minor travel annoyance I’ve regularly encountered is that airplane outlets don’t hold U.S.-style power plugs (&lt;a href=&quot;https://en.wikipedia.org/wiki/NEMA_connector&quot;&gt;types A/B&lt;/a&gt;) snugly. My devices come unplugged frequently during a flight. This is especially frustrating to manage in the awkward under seat area.&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/c0pyuydmU1-768.webp 768w, https://chromamine.com/media/img/c0pyuydmU1-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/c0pyuydmU1-768.jpeg 768w, https://chromamine.com/media/img/c0pyuydmU1-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A small cubical dark gray USB adapter brick plugged into an under-seat airplane power outlet. It is loose and has fallen out slightly, exposing the silver metal of its two prongs.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/c0pyuydmU1-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;
&lt;p&gt;&lt;/p&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;While taking a couple trips to Europe this past year, I noticed that airplane outlets are international and found that &lt;a href=&quot;https://en.wikipedia.org/wiki/Schuko&quot;&gt;type C/E/F&lt;/a&gt; plugs (used in a number of European countries and beyond) fit more snugly and hold for the entire flight.&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/1Q8KuJv1rG-768.webp 768w, https://chromamine.com/media/img/1Q8KuJv1rG-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/1Q8KuJv1rG-768.jpeg 768w, https://chromamine.com/media/img/1Q8KuJv1rG-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A larger white Anker brand adapter plugged into an under-seat airplane power outlet. On its face a three prong U.S.-style outlet is available. On its top is a two prong outlet. From beneath it a thin white USB charging cable extends.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/1Q8KuJv1rG-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;
&lt;p&gt;&lt;/p&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Since I’m almost always charging USB-powered devices and modern international adapters often include USB ports, I don’t even have to use an &lt;em&gt;additional&lt;/em&gt; adapter, just a &lt;em&gt;different&lt;/em&gt; one.&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/bQCKbolhqU-768.webp 768w, https://chromamine.com/media/img/bQCKbolhqU-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/bQCKbolhqU-768.jpeg 768w, https://chromamine.com/media/img/bQCKbolhqU-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The same white adapter, unplugged and in hand, revealing two cylindrical &amp;quot;European-style&amp;quot; prongs and three USB ports on the underside.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/bQCKbolhqU-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;
&lt;p&gt;&lt;/p&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I now pack an international adapter whenever I fly, even if I’m traveling domestically.&lt;/p&gt;
</content>
        </entry>
        <entry>
            <title>Share Links Thoughtfully With an iOS Shortcut</title>
            <link href="https://chromamine.com/2025/07/share-links-thoughtfully-with-an-ios-shortcut/"/>
            <updated>2025-07-09T00:00:00Z</updated>
            <id>https://chromamine.com/2025/07/share-links-thoughtfully-with-an-ios-shortcut/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;&lt;em&gt;&lt;a href=&quot;https://chromamine.com/2025/07/share-links-thoughtfully-with-an-ios-shortcut/#download-shortcut&quot;&gt;Jump to shortcut ↓&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The web is full of links designed to track and surveil the people who share and receive them. With these links, corporations gather data about your interests and associate it with information they already have. They use it to construct a social graph, internally drawing connections between people who share links and those who receive them.&lt;/p&gt;
&lt;p&gt;I’m focusing on two techniques companies use to do this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;URL shorteners:&lt;/strong&gt; These provide a short URL that redirects to a longer one. This allows the company generating the short URL to serve as an intermediary on your way to visiting the page, letting them track your behavior. Additionally, this obscures the original URL, making it harder to see the destination before you visit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Query parameters:&lt;/strong&gt; These are keywords appended to the end of a URL which give the site you’re visiting information about where you came from or even your identity. Often times sites that use these embed scripts from third parties like Facebook and Google, allowing those corporations greater insight into your behavior around the web.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In some cases, you don’t even need to follow a link for it to share information about you, since some messengers and apps visit the link &lt;em&gt;from your device&lt;/em&gt; before you even click it to generate a preview.&lt;a href=&quot;https://chromamine.com/2025/07/share-links-thoughtfully-with-an-ios-shortcut/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;These are examples of links designed to track your movements around the web:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code style=&quot;word-break: break-all; max-width: 100%;&quot;&gt;https://apple.news/AauFyDXCoSNOY6RVcJB3CGA&lt;/code&gt; &lt;a href=&quot;https://chromamine.com/2025/07/share-links-thoughtfully-with-an-ios-shortcut/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code style=&quot;word-break: break-all; max-width: 100%;&quot;&gt;https://t.co/S8ClxKvEtY&lt;/code&gt; &lt;a href=&quot;https://chromamine.com/2025/07/share-links-thoughtfully-with-an-ios-shortcut/#fn3&quot; class=&quot;footnote-ref&quot; id=&quot;fnref3&quot;&gt;³&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code style=&quot;word-break: break-all; max-width: 100%;&quot;&gt;https://chromamine.com/2025/07/share-links-thoughtfully-with-my-ios-shortcut/?utm_source=blog-post&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code style=&quot;word-break: break-all; max-width: 100%;&quot;&gt;https://chromamine.com/2025/07/share-links-thoughtfully-with-my-ios-shortcut/?fbclid=IwY2xjawLbtGFleHRuA2FlbQIxMQBicmlkETFZekM2NFBCMlY5bDI3Q3dkAR4sSgYyJrvmhlClmy0c7hi5A45Jew2dDVQKZSS-cR2qA6h5HwxahvUGPyfzpA_aem_q3OBre7SBd0XHgWgR1iywA&lt;/code&gt; (This one actually won’t tell Facebook anything about you because &lt;em&gt;my site&lt;/em&gt; doesn’t embed any Facebook scripts, but &lt;em&gt;in theory it could&lt;/em&gt;.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;More recently, I started seeing links like this as well:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code style=&quot;word-break: break-all; max-width: 100%;&quot;&gt;https://share.google/KKg1GjP4QTxp2Pvj5&lt;/code&gt;&lt;a href=&quot;https://chromamine.com/2025/07/share-links-thoughtfully-with-an-ios-shortcut/#fn4&quot; class=&quot;footnote-ref&quot; id=&quot;fnref4&quot;&gt;⁴&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Someone told me that a Google Chrome update on Android made this the default behavior for sharing links, which to me seems like a newly crossed red line in the integration of routine surveillance into Google’s software.&lt;a href=&quot;https://chromamine.com/2025/07/share-links-thoughtfully-with-an-ios-shortcut/#fn5&quot; class=&quot;footnote-ref&quot; id=&quot;fnref5&quot;&gt;⁵&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;The Shortcut&lt;/h4&gt;
&lt;p&gt;I want to encourage people to be kind to their friends and followers by stripping tracking data from links they share. You can do this by only sharing only expanded versions of links and by removing tracking query parameters.&lt;/p&gt;
&lt;p&gt;If you’re on iOS (or macOS), you can use this simple shortcut I created to do so:&lt;/p&gt;
&lt;p&gt;&lt;a id=&quot;download-shortcut&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://chromamine.com/media/share-links-thoughtfully-with-an-ios-shortcut/Clean%20Copy%20Link.shortcut&quot; class=&quot;button &quot;&gt;Download “Clean Copy Link” ↓&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;or, if you prefer to install from Apple’s servers:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.icloud.com/shortcuts/f8b4ceae5a2449d999a415bed99b936e&quot; class=&quot;button &quot;&gt;Install “Clean Copy Link” from iCloud&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The shortcut will appear in any OS-native share sheet (in some apps you may have to press “More options” or a similar button to see it):&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/GIBWiXJoL6-768.webp 768w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;An iOS share sheet with the Clean Copy Link shortcut highlighted by a red circle&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/GIBWiXJoL6-768.jpeg&quot; width=&quot;768&quot; height=&quot;1005&quot; /&gt;&lt;/picture&gt;
&lt;p&gt;&lt;/p&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;It will unwrap links from any URL shorteners, strip them of query parameters, and copy them to your clipboard for pasting.&lt;/p&gt;
&lt;h4&gt;Limitations&lt;/h4&gt;
&lt;p&gt;A few caveats:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This will break any links that &lt;em&gt;depend&lt;/em&gt; on legitimate query parameters, since there are non-surveillance uses for them as well. You will need to be attentive to those occasions when using this shortcut.&lt;/li&gt;
&lt;li&gt;This is a shortcut for someone &lt;em&gt;sharing&lt;/em&gt; a link to use as a courtesy to whomever they are sharing it with. It does not provide much protection for someone receiving a link, since the unwrapping process happens on their device.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Room for Improvement&lt;/h4&gt;
&lt;p&gt;I made this shortcut quickly! There are improvements that could be made:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An Android-compatible implementation, since it was an Android feature that inspired me to publish this.&lt;/li&gt;
&lt;li&gt;More intelligent stripping of query parameters, perhaps limited to a denylist of parameters known to be used for tracking.&lt;/li&gt;
&lt;li&gt;An option to preview the URL before copying it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I may make these improvements myself at some point, but if anyone else wants to get to it first and share it back to me, I’d be happy to publish an update.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thanks to &lt;a href=&quot;https://emmaazelborn.com/&quot;&gt;Emma Azelborn&lt;/a&gt; and &lt;a href=&quot;https://bikes.emilyhorsman.com/&quot;&gt;Emily Horsman&lt;/a&gt; for editing help.&lt;/em&gt;&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;A number of messengers &lt;a href=&quot;https://signal.org/blog/i-link-therefore-i-am/&quot;&gt;like Signal&lt;/a&gt; fetch previews on the sender’s device, transferring the privacy exposure to the person who has likely already visited the site.Some apps (like Discord and Slack) fetch previews on the intermediaries’ servers, which can be more privacy-preserving in some senses and less in others. &lt;a href=&quot;https://chromamine.com/2025/07/share-links-thoughtfully-with-an-ios-shortcut/#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;Unwrapped: &lt;a href=&quot;https://www.statnews.com/2025/07/09/measles-america-breaks-33-year-record-anti-vaccine-sentiment-key-factor-behind-outbreaks/&quot;&gt;https://www.statnews.com/2025/07/09/measles-america-breaks-33-year-record-anti-vaccine-sentiment-key-factor-behind-outbreaks/&lt;/a&gt; &lt;a href=&quot;https://chromamine.com/2025/07/share-links-thoughtfully-with-an-ios-shortcut/#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;Unwrapped: &lt;a href=&quot;https://chromamine.com/2025/07/share-links-thoughtfully-with-my-ios-shortcut/&quot;&gt;https://chromamine.com/2025/07/share-links-thoughtfully-with-my-ios-shortcut/&lt;/a&gt; &lt;a href=&quot;https://chromamine.com/2025/07/share-links-thoughtfully-with-an-ios-shortcut/#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;Unwrapped: &lt;a href=&quot;https://www.nbcboston.com/news/local/somerville-cat-mayor-election/3759084/&quot;&gt;https://www.nbcboston.com/news/local/somerville-cat-mayor-election/3759084/&lt;/a&gt; &lt;a href=&quot;https://chromamine.com/2025/07/share-links-thoughtfully-with-an-ios-shortcut/#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 haven’t been able to replicate this behavior myself, even asking another Android-using friend to try it, so possibly this is a new feature being tested. &lt;a href=&quot;https://chromamine.com/2025/07/share-links-thoughtfully-with-an-ios-shortcut/#fnref5&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Mixins in Vanilla CSS</title>
            <link href="https://chromamine.com/2025/07/mixins-with-vanilla-css/"/>
            <updated>2025-07-03T00:00:00Z</updated>
            <id>https://chromamine.com/2025/07/mixins-with-vanilla-css/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;I’m in the process of a major technical rearchitecture of this website&lt;a href=&quot;https://chromamine.com/2025/07/mixins-with-vanilla-css/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt; and as part of that restructure I’m foregoing the use of &lt;a href=&quot;https://sass-lang.com/&quot;&gt;CSS preprocessor SASS&lt;/a&gt; in favor of vanilla CSS. Vanilla web technologies have improved significantly in the past decade. Reducing dependencies like SASS makes my code more portable and future-proof.&lt;/p&gt;
&lt;p&gt;Lots of features I used SASS for, such as &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_cascading_variables/Using_CSS_custom_properties&quot;&gt;variables&lt;/a&gt; and &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_nesting&quot;&gt;nesting&lt;/a&gt;, are now a part of native CSS. But one feature I’ve been really missing is &lt;a href=&quot;https://sass-lang.com/documentation/at-rules/mixin/&quot;&gt;mixins&lt;/a&gt; – a way to share styles across multiple components. In the current version of my website, I have a bit of SASS like this (much simplified from the actual code):&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sass&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;@mixin&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt; labeled-box&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;$label&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;$color&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    border: 0&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt;.1rem&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; solid &lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;$color&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    color: &lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;$color&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;    // [snip]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;    &amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt;::before&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        display: block&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;        content&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;$label&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;        // [snip]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt;.update&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;    @include&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt; labeled-box&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;Update&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;--color-update&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt;.note&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;    @include&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt; labeled-box&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;Note&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;--color-text-alert&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I was able to approximately replicate this structure in vanilla CSS using the behavior of custom properties (variables)!&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt;.update&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt;.note&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;    border&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;0.1&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;rem&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; solid&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; var&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;--color&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;    color&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;--color&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;    /* [snip] */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    &amp;#x26;::before {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;      display: &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;block&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;      content&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;--label&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;      /* [snip] */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt;.update&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;  --color&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;--color-update&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;  --label&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;Update&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt;.note&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;  --color&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;--color-text-alert&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;  --label&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;Note&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This isn’t a unique discovery – after independently happening upon this technique, I searched around and found &lt;a href=&quot;https://mjswensen.com/blog/you-might-not-need-sass-modern-css-techniques/&quot;&gt;this article detailing the same approach&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It also has some downsides over the SASS mixin syntax – for one thing, you need to have a comprehensive list of the selectors you want to apply the mixin to in the place where you define the mixin – but it’s a serviceable workaround until &lt;a href=&quot;https://www.w3.org/TR/css-mixins-1/&quot;&gt;native CSS mixins&lt;/a&gt; land.&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;More on this later if/when I ever complete it. &lt;a href=&quot;https://chromamine.com/2025/07/mixins-with-vanilla-css/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>My New Contact Page</title>
            <link href="https://chromamine.com/2025/05/my-new-contact-page/"/>
            <updated>2025-05-07T00:00:00Z</updated>
            <id>https://chromamine.com/2025/05/my-new-contact-page/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;Recently, as some of my friends are leaving or thinking about leaving Facebook, I’ve had more of them share forms to collect contact information from friends they might otherwise lose touch with. I think this is a great idea – to make our connections robust against the whims of social media platforms – and to that end I will happily fill out as many contact forms as my friends want to send me.&lt;/p&gt;
&lt;p&gt;I also don’t want anyone to lose touch with me because they decide not to send out such a form or I fail to see one that they do. So, let me say:&lt;/p&gt;
&lt;p&gt;This website is my permanent home base on the internet – I’ve owned this domain name, &lt;code&gt;chromamine.com&lt;/code&gt;, for &lt;a href=&quot;https://lookup.icann.org/whois/en?q=chromamine.com&quot;&gt;over 20 years&lt;/a&gt; and I plan to continue for as long as owning a domain name is relevant. You can always find me here.&lt;/p&gt;
&lt;p&gt;I’m a person who is not especially cautious with sharing my contact information (many people are, with good reason, but I am not) so I’ve also created a new contact page that’s as thorough as I could make it. It includes ways to message me privately as well as every public social media account I’m active on.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://chromamine.com/elsewhere/&quot; class=&quot;button &quot;&gt;Contact &amp;amp; Elsewhere&lt;/a&gt;&lt;/p&gt;
</content>
        </entry>
        <entry>
            <title>Signal is not appropriate for military communication, whether you use it well or not</title>
            <link href="https://chromamine.com/2025/03/signal-is-not-appropriate-for-military-communication/"/>
            <updated>2025-03-26T00:00:00Z</updated>
            <id>https://chromamine.com/2025/03/signal-is-not-appropriate-for-military-communication/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;First off, here are two things that are true and not contradicted by my writing that follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The Trump administration is full of people who are incompetent, malicious, and bad at their jobs, whose primary qualifications are sycophancy.&lt;/li&gt;
&lt;li&gt;Signal is an &lt;em&gt;excellent&lt;/em&gt; secure messaging app for most people, who are not coordinating military operations.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;With that out of the way, I’ve seen a &lt;a href=&quot;https://chromamine.com/media/signal-is-not-appropriate-for-military-communication/post.png&quot;&gt;Facebook post&lt;/a&gt; that’s &lt;em&gt;kind of&lt;/em&gt; misinformation shared around in the past few days. I don’t usually make it my job to correct all misinformation on the internet, but this one was shared enough and touches subjects where I have knowledge. It also provides an opportunity to explore how to think like a security professional!&lt;/p&gt;
&lt;p&gt;I’ll caveat that I don’t call myself a security expert. I work alongside experts on a daily basis and have a general idea of what sort of things they think about. Specifically, I work professionally on interface design and product management for &lt;a href=&quot;https://dangerzone.rocks/&quot;&gt;projects&lt;/a&gt; where security is a core concern.&lt;/p&gt;
&lt;p&gt;Here’s a point about security that I think laypeople often miss:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Security isn’t a spectrum from insecure to secure.&lt;/strong&gt; Things that are more secure in one scenario might be overkill or actively less secure in another. You have to consider &lt;em&gt;the specific threats in play&lt;/em&gt;. Security experts call this &lt;a href=&quot;https://en.wikipedia.org/wiki/Threat_model&quot;&gt;threat modeling&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The problem with &lt;a href=&quot;https://www.theatlantic.com/politics/archive/2025/03/trump-administration-accidentally-texted-me-its-war-plans/682151/&quot;&gt;government agents using Signal to conduct military operations&lt;/a&gt; is not “they’re morons who used Signal wrong.” Yes, they made a confusing and hard to explain error in their usage of Signal. Also, yes, it’s &lt;em&gt;very satisfying&lt;/em&gt; to &lt;a href=&quot;https://social.taupehat.com/@me/114221830847605037&quot;&gt;make&lt;/a&gt; &lt;a href=&quot;https://bsky.app/profile/actuallyowltistic.com/post/3llavrd4wc22m&quot;&gt;fun&lt;/a&gt; &lt;a href=&quot;https://reductress.com/post/woman-texting-group-chat-about-crush-double-checks-that-atlantic-editor-not-in-here/&quot;&gt;of&lt;/a&gt; &lt;a href=&quot;https://bsky.app/profile/did:plc:sq4srjwg5noukbywa5stn6ar/post/3ll56ohqtzs23&quot;&gt;them&lt;/a&gt; for being bad at this. But the &lt;em&gt;primary error&lt;/em&gt; was using Signal &lt;em&gt;at all&lt;/em&gt; for this purpose. It’s not designed for that!&lt;/p&gt;
&lt;p&gt;As &lt;a href=&quot;https://federate.social/@mattblaze/&quot;&gt;Actual Security Expert Matt Blaze&lt;/a&gt; – I recommend a follow, if you’re interested in this stuff – &lt;a href=&quot;https://federate.social/@mattblaze/114219067469829677&quot;&gt;wrote&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Signal provides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Excellent protection against third party interception of communications (wiretapping).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Limited protection against compromised (hacked) or lost devices&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No protection against certain common usage mistakes (accidentally including a reporter in your large group war planning chat).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;[…]&lt;/p&gt;
&lt;p&gt;The difference is that systems like Signal are designed to &lt;em&gt;facilitate&lt;/em&gt; communication with anyone. Classified systems are designed to &lt;em&gt;limit&lt;/em&gt; communication to authorized recipients.&lt;/p&gt;
&lt;p&gt;Both are sensible for their respective - very different - purposes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Or &lt;a href=&quot;https://www.404media.co/when-your-threat-model-is-being-a-moron-signal/&quot;&gt;Jason Koebler at 404media&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Top officials in the executive branch should not be using Signal to communicate about military actions at all because the threat model for this sort of communication is so extraordinary and unique (and bound by retention laws) that they should be communicating on existing government channels designed for this exact purpose.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It’s actually quite easy to accidentally add someone to a Signal group.&lt;a href=&quot;https://chromamine.com/2025/03/signal-is-not-appropriate-for-military-communication/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt; Just off the top of my head, it could happen&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;if you have a wrong number in your contacts,&lt;/li&gt;
&lt;li&gt;if you have multiple contacts with the same name,&lt;/li&gt;
&lt;li&gt;if you accidentally tap on a name next to the name of the person you’re trying to add,&lt;/li&gt;
&lt;li&gt;if you’re adding multiple people and you accidentally select an additional person without noticing, or&lt;/li&gt;
&lt;li&gt;if your BFF added someone and you happened not to notice the notification or just assumed they were fine because, after all, your BFF added them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of these are normal human errors that I could certainly make and I bet you could too.&lt;a href=&quot;https://chromamine.com/2025/03/signal-is-not-appropriate-for-military-communication/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt; Confirmation dialogs help, but people also &lt;a href=&quot;https://www.nngroup.com/articles/user-mistakes/&quot;&gt;learn to ignore them&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Nor is it a flaw for Signal to make this process easy. Good secure software makes an effort to systematically prevent users from making mistakes like this, but often security trades off with usability. Design needs to balance consequences with interface friction. For most Signal users, adding the wrong person to a group chat might be an embarrassing social faux pas, but mostly &lt;em&gt;it isn’t a felony violation of the Espionage Act&lt;/em&gt;.&lt;a href=&quot;https://chromamine.com/2025/03/signal-is-not-appropriate-for-military-communication/#fn3&quot; class=&quot;footnote-ref&quot; id=&quot;fnref3&quot;&gt;³&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I don’t know a lot (anything) about the government systems used for communicating these sort of things, but I imagine they include restrictions that make them better for this purpose that if included in Signal would make it worse for most people. Some features I might speculate they include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Strict centralized identity verification&lt;/li&gt;
&lt;li&gt;An onerous approval process for adding new people to a conversation&lt;/li&gt;
&lt;li&gt;A limited number of people who have access to the system &lt;em&gt;at all&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Usage limited to particular locations or devices&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(It is possible there are safeguards Signal could add that would be worth the trade-offs for most people. The state-of-the-art on security moves ever forward. I’m sure they’re talking about it.)
The Trump administration &lt;em&gt;did&lt;/em&gt; demonstrate incompetence in this case, but the incompetence was not primarily that they used Signal &lt;em&gt;poorly&lt;/em&gt; but that they used it &lt;em&gt;at all&lt;/em&gt;. They also, notably, demonstrated malice by using Signal, most likely, for the purpose of evading data retention laws.&lt;/p&gt;
&lt;p&gt;Also: Your web browser is not spying on your Signal chats and reporting their contents to advertisers. There’s a lot of &lt;a href=&quot;https://www.eff.org/deeplinks/2024/09/ftc-report-confirms-commercial-surveillance-out-control&quot;&gt;creepy ways&lt;/a&gt; that advertisers collect or deduce information about you, but specifically reading messages in Signal isn’t one of them. Both Android and iOS have built-in protections that prevent apps from reading each others’ data. If they didn’t, there would be no reason for Signal to exist at all, let alone for security experts to promote it, as &lt;a href=&quot;https://ssd.eff.org/module/how-to-use-signal&quot;&gt;they&lt;/a&gt; &lt;a href=&quot;https://freedom.press/digisec/blog/signal-beginners/&quot;&gt;do&lt;/a&gt;.&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;This is all without even mentioning that the original post details the process for &lt;em&gt;adding someone to a group&lt;/em&gt; but not for &lt;em&gt;creating a group&lt;/em&gt;, which is likely the process that was used here. &lt;a href=&quot;https://chromamine.com/2025/03/signal-is-not-appropriate-for-military-communication/#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;I’ve never made the specific error of adding someone to a group chat, but I’ve definitely made the similar error of sending a message to the wrong person, multiple times, and I’ve had it happen to me multiple times. This sort of thing is common, and tolerable for most uses. &lt;a href=&quot;https://chromamine.com/2025/03/signal-is-not-appropriate-for-military-communication/#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;Sidenote: the Espionage Act is not a great law and is &lt;a href=&quot;https://freedom.press/issues/how-espionage-act-morphed-dangerous-tool-used-prosecute-sources-and-threaten-journalists/&quot;&gt;oft-abused by the government&lt;/a&gt;. &lt;a href=&quot;https://chromamine.com/2025/03/signal-is-not-appropriate-for-military-communication/#fnref3&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Caller&#39;s Box Configurator</title>
            <link href="https://chromamine.com/2025/03/callers-box-configurator/"/>
            <updated>2025-03-05T00:00:00Z</updated>
            <id>https://chromamine.com/2025/03/callers-box-configurator/</id>
            <content xml:lang="en-us" type="html">&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/9YDyayGSMQ-768.webp 768w, https://chromamine.com/media/img/9YDyayGSMQ-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/9YDyayGSMQ-768.jpeg 768w, https://chromamine.com/media/img/9YDyayGSMQ-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Screenshot of a firefox window showing a dance from the website The Caller&#39;s Box. The role terms used are Larks and Robins. Overlaid on top of the website is a settings popover with fields for specifying which role terms to use, whether to use &amp;quot;Right Shoulder Round,&amp;quot; and whether to enable the plugin at all.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/9YDyayGSMQ-768.jpeg&quot; width=&quot;1536&quot; height=&quot;864&quot; /&gt;&lt;/picture&gt;
&lt;p&gt;&lt;/p&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Many contra dance callers use &lt;a href=&quot;https://www.ibiblio.org/contradance/thecallersbox/&quot;&gt;The Caller’s Box&lt;/a&gt;, a phenomenal dance choreography database from Chris Page and Michael Dyck. For those of us who primarily call gender free dances, though, using it requires mental translation from gendered role terms to gender neutral ones. I’ve created a browser plugin, &lt;strong&gt;Caller’s Box Configurator&lt;/strong&gt;, to fix this.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/caller-s-box-configurator/&quot; class=&quot;button &quot;&gt;Caller’s Box Configurator (Firefox)&lt;/a&gt; &lt;a href=&quot;https://chromewebstore.google.com/detail/callers-box-configurator/hpppjgbgajmmmpgdkijddpjdlmckmcbo&quot; class=&quot;button &quot;&gt;Caller’s Box Configurator (Chrome)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The plugin&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;replaces “Men”/“Women” with either “Larks”/“Robins” or “Leads”/“Follows,”&lt;/li&gt;
&lt;li&gt;replaces “gypsy” with “right shoulder round”/“left shoulder round,” and&lt;/li&gt;
&lt;li&gt;replaces any figures containing the above words with appropriate alternates.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There’s a few limitations, all of which I’m open to resolving in the future (I accept &lt;a href=&quot;https://github.com/harrislapiroff/cb-configurator&quot;&gt;pull requests&lt;/a&gt;!):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I wanted to avoid a &lt;a href=&quot;https://en.wikipedia.org/wiki/Scunthorpe_problem&quot;&gt;Scunthorpe Problem&lt;/a&gt;&lt;a href=&quot;https://chromamine.com/2025/03/callers-box-configurator/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt; so instead of a global find-and-replace, the Configurator takes a narrow approach that only replaces terms that can be definitively identified as roles or figures in the choreography of a dance. (On a technical level, it is searching for HTML elements which are linked to the glossary entries for the corresponding terms, e.g., &lt;code&gt;&amp;lt;a class=&amp;quot;gloss&amp;quot; href=&amp;quot;Glossary.htm#men&amp;quot;&amp;gt;Men&amp;lt;/a&amp;gt;&lt;/code&gt;.)&lt;/p&gt;
&lt;p&gt;The upshot is that this &lt;em&gt;only&lt;/em&gt; replaces terms in the “Figures” section of dances. “Notes” are left untouched as is the site glossary itself. I’m open to experimentally adding support for replacing terms more broadly as a future feature.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;The Configurator has not been tested with &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/the-caller-s-extension/&quot;&gt;The Caller’s Extension&lt;/a&gt; by Paul Morris and I assume it doesn’t work or doesn’t work completely with it.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The Configurator also doesn’t impact search. Searches have to be performed using original terms.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I haven’t yet figured out how to release a web extension for Safari, but I hope to soon.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;A few technical notes:&lt;/p&gt;
&lt;p&gt;This was the first time in many years that I’ve worked on a web extension. I’m pretty pleased with how consistent the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions&quot;&gt;Web Extensions API&lt;/a&gt; is these days across browsers, though a few differences and limitations are irksome:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Though Safari supports the Web Extensions API, it has a wholly different process for packaging and distributing which, as mentioned above, I haven’t navigated yet.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Firefox and Chrome have slightly different feature sets and, annoyingly, including configuration specific to one browser throws warnings or even errors in the other. (Specifically, Firefox supports a &lt;code&gt;page_action&lt;/code&gt; property in the manifest which produces a button in the URL bar when on specific pages.) I’m working on a build pipeline that will build the same code for different browsers by including or excluding browser-specific code at build time. It’s not hard, but it’s annoying that it has to be done.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There seems to be no standard way of creating and handling user configuration. Every extension seems to be expected to build and style a settings interface from scratch and decide on its own where it should be displayed. The flexibility is nice but, for something that must be a pretty common task, it would be nice to have some consistent defaults.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Firefox’s extension review process was much quicker than Chrome’s. I submitted it on a Friday and was notified it was approved the following Monday. Chrome, I believe, took more than a week, though it’s hard to say for sure, because I never got an email notification from them. I just checked periodically and noticed over a week later that it had been published.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vanilla Javascript and CSS are getting good enough that I’m feeling less and less need to integrate frontend compilation tools like &lt;a href=&quot;https://sass-lang.com/&quot;&gt;SASS&lt;/a&gt;, &lt;a href=&quot;https://webpack.js.org/&quot;&gt;Webpack&lt;/a&gt;, &lt;a href=&quot;https://esbuild.github.io/&quot;&gt;ESBuild&lt;/a&gt;, etc. in small projects like this. For this plugin, I didn’t bother.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;See a real example of a Scunthorpe Problem in a contra dance database in the &lt;a href=&quot;https://contradb.com/dances/2351&quot;&gt;notes on this dance in ContraDB&lt;/a&gt;. CallerDB uses “gentlespoons”/“ladles” by default and somehow in the pipeline, the &lt;em&gt;figure name&lt;/em&gt; “mad robin” has been replaced in the notes here with “mad ladle!” &lt;a href=&quot;https://chromamine.com/2025/03/callers-box-configurator/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Bluesky friends, consider bridging to the Fediverse!</title>
            <link href="https://chromamine.com/2025/02/bluesky-friends-consider-bridging-to-the-fediverse/"/>
            <updated>2025-02-07T00:00:00Z</updated>
            <id>https://chromamine.com/2025/02/bluesky-friends-consider-bridging-to-the-fediverse/</id>
            <content xml:lang="en-us" type="html">&lt;div class=&quot;note&quot;&gt;
&lt;p&gt;TL;DR: Bridging your &lt;a href=&quot;https://bsky.social/&quot;&gt;Bluesky&lt;/a&gt; account will allow me and others who use the &lt;a href=&quot;https://fediverse.info/&quot;&gt;Fediverse&lt;/a&gt; (including &lt;a href=&quot;https://joinmastodon.org/&quot;&gt;Mastodon&lt;/a&gt;) to interact with you on Bluesky.&lt;/p&gt;
&lt;p&gt;If you don’t need to read a whole thing to persuade you, you can bridge your account &lt;em&gt;right now&lt;/em&gt; by following &lt;a href=&quot;https://bsky.app/profile/ap.brid.gy&quot;&gt;@ap.brid.gy&lt;/a&gt; on Bluesky. Otherwise, read on.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;As I and others have been exploring our social media horizons beyond the legacy options of Twitter/X, Facebook, Instagram, etc., I’ve made no secret of my &lt;a href=&quot;https://chromamine.com/2024/11/try-mastodon/&quot;&gt;skepticism&lt;/a&gt; &lt;a href=&quot;https://chromamine.com/2024/12/blueskys-enshittification-risk/&quot;&gt;about&lt;/a&gt; Bluesky. But I’ve also been lurking there lately and the center of gravity for the political news and conversation I used to get from Twitter is definitely on Bluesky now.&lt;/p&gt;
&lt;p&gt;Frustratingly, though both services are based on (theoretically&lt;a href=&quot;https://chromamine.com/2025/02/bluesky-friends-consider-bridging-to-the-fediverse/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;) decentralized protocols, they made different architectural decisions which prevent first-class interoperation.&lt;/p&gt;
&lt;p&gt;So I’m asking Bluesky users to consider bridging their accounts to the &lt;em&gt;&lt;a href=&quot;https://fediverse.info/&quot;&gt;Fediverse&lt;/a&gt;&lt;/em&gt; – that is, making their Bluesky presence available in the content-universe that includes Mastodon and other ActivityPub-supporting services.&lt;/p&gt;
&lt;h3&gt;How does bridging work?&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://snarfed.org/&quot;&gt;Ryan Barrett&lt;/a&gt; created a service called &lt;a href=&quot;https://fed.brid.gy/&quot;&gt;Bridgy Fed&lt;/a&gt; that mirrors Bluesky profiles, content, and interactions to the Fediverse and vice versa.&lt;/p&gt;
&lt;p&gt;For example, my Mastodon account &lt;a href=&quot;https://social.coop/@harris&quot;&gt;@harris@social.coop&lt;/a&gt; is mirrored on Bluesky as &lt;a href=&quot;https://bsky.app/profile/harris.social.coop.ap.brid.gy&quot;&gt;@harris.social.coop.ap.brid.gy&lt;/a&gt;. When I post on Mastodon, it shows up on my mirrored Bluesky profile. If I’m following someone who’s Bluesky profile is mirrored to Mastodon, when I like or reply to their posts on Mastodon, those interactions also get mirrored back to Bluesky. It allows me and people on Bluesky to interact as though we were on the same service.&lt;/p&gt;
&lt;p&gt;The catch is that this is an opt-in service. If you as a Bluesky user don’t opt-in, then &lt;em&gt;you&lt;/em&gt; can follow me and see my posts, but &lt;em&gt;I can’t see yours&lt;/em&gt;. And if you like or reply to any of my posts, I can’t see that either, unless I log in to Bluesky and poke around my mirrored profile.&lt;/p&gt;
&lt;h3&gt;Why should I bridge my account?&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Well, firstly and most selfishly, I will be able to see your posts and interact with you from Mastodon and spend less time juggling multiple microblogging services.&lt;/li&gt;
&lt;li&gt;It increases the value of accounts on both services! You likely know at least a few people you’d benefit from following (friends or public figures) who are anti-corporate or open-source nerds like me and prefer the Fediverse. Certainly it’s a benefit to the Fediverse to be able to access the wealth of content and conversation on Bluesky. This doesn’t need to be a fight to the death of social media platforms – they can make each other better.&lt;/li&gt;
&lt;li&gt;The more people who are using and getting value from the functionality that makes Bridgy Fed possible, the more likely it is that Bluesky will resist future pressure to remove the very features that make it an open and (plausibly, someday) decentralized platform.&lt;a href=&quot;https://chromamine.com/2025/02/bluesky-friends-consider-bridging-to-the-fediverse/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Some Caveats&lt;/h3&gt;
&lt;p&gt;Bridgy Fed certainly has some rough edges. As someone who cut their teeth on the web of the early aughts that was dominated by open APIs, self-hosted websites, and wild experimentation, I’m used to that. I’ve come to prefer the trade offs of the rough edges over the slick corporate walled gardens that dominated the past decade. But it’s worth noting some of the problems you can expect when bridging:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mirroring isn’t always consistent. Sometimes my posts are mirrored on a delay or aren’t mirrored at all and it’s not always obvious to me why.&lt;/li&gt;
&lt;li&gt;Different feature sets lead to awkward adaptations. A major example: ActivityPub on its own supports posts of any length. Most Mastodon instances have a 500 character limit. Bluesky has a 300 character limit. When I write a Mastodon post with more than 300 characters, it gets shown truncated to Bluesky users and they have to click a link to see it.&lt;/li&gt;
&lt;li&gt;I don’t actually know how Barrett funds Bridgy Fed and it seems kinda like a hobby project for him.&lt;a href=&quot;https://chromamine.com/2025/02/bluesky-friends-consider-bridging-to-the-fediverse/#fn3&quot; class=&quot;footnote-ref&quot; id=&quot;fnref3&quot;&gt;³&lt;/a&gt; I hope he’ll keep it up for a while to come, but it’s not like it’s supported by the flagship Mastodon nonprofit or something confidently stable. As far as I can tell, it’s just a guy with a hobby.&lt;/li&gt;
&lt;li&gt;I have no idea how it interacts with limited visibility content. Basically everything I’ve written above assumes public accounts and public content.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hope I’ll see you across the bridge from the Fediverse soon.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;For Bluesky Users:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bsky.app/profile/ap.brid.gy%20to%20opt-in&quot; class=&quot;button &quot;&gt;Follow @ap.brid.gy&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For Mastodon/Fediverse Users:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Follow &lt;code&gt;@bsky.brid.gy@bsky.brid.gy&lt;/code&gt; to opt-in (e.g., enter it into the search bar on your Mastodon instance)&lt;/li&gt;
&lt;/ul&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Bluesky is based on a decentralized protocol they developed, &lt;a href=&quot;https://atproto.com/&quot;&gt;AT Proto&lt;/a&gt;, but in practice it is almost entirely controlled by &lt;em&gt;Bluesky, the VC-funded startup&lt;/em&gt;. It’s likely to remain so for the foreseeable future. If you would like to read &lt;em&gt;too much&lt;/em&gt; about the question of Bluesky’s decentralization, there’s no better writer on the subject than &lt;a href=&quot;https://dustycloud.org/blog/how-decentralized-is-bluesky/&quot;&gt;Christine Lemmer-Webber&lt;/a&gt;. &lt;a href=&quot;https://chromamine.com/2025/02/bluesky-friends-consider-bridging-to-the-fediverse/#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;Investors, I think, are very likely to apply this pressure to Bluesky at some point, since being able to freely view and use your service via non-first-party mechanisms, tends to make it harder to show people ads, monetize their content, and sell them stuff. We saw this &lt;a href=&quot;https://en.wikipedia.org/wiki/2023_Reddit_API_controversy&quot;&gt;happen with Reddit&lt;/a&gt; last year, as another example. &lt;a href=&quot;https://chromamine.com/2025/02/bluesky-friends-consider-bridging-to-the-fediverse/#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;I’ve offered to donate some money to the cause, but he replied that they don’t take donations yet – maybe someday. &lt;a href=&quot;https://chromamine.com/2025/02/bluesky-friends-consider-bridging-to-the-fediverse/#fnref3&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>My New Newsletter</title>
            <link href="https://chromamine.com/2025/02/my-new-newsletter/"/>
            <updated>2025-02-05T00:00:00Z</updated>
            <id>https://chromamine.com/2025/02/my-new-newsletter/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;You can now sign up to get my blog posts in your email inbox by subscribing with this form.&lt;/p&gt;
&lt;p&gt;
    &lt;/p&gt;&lt;form action=&quot;https://buttondown.com/api/emails/embed-subscribe/harrislapiroff&quot; method=&quot;post&quot; target=&quot;popupwindow&quot; onsubmit=&quot;window.open(&#39;https://buttondown.com/harrislapiroff&#39;, &#39;popupwindow&#39;)&quot; class=&quot;newsletter-form&quot;&gt;
    &lt;form-control&gt;
        &lt;label for=&quot;bd-email&quot;&gt;Email Address&lt;/label&gt;
        &lt;input type=&quot;email&quot; name=&quot;email&quot; id=&quot;bd-email&quot; required=&quot;&quot; /&gt;
        &lt;button type=&quot;submit&quot;&gt;
            &lt;span&gt;Subscribe&lt;/span&gt;
        &lt;/button&gt;
&lt;/form-control&gt;
&lt;/form&gt;
  &lt;p&gt;&lt;/p&gt;
&lt;p&gt;And as an initial test, to ensure that this mic is on (&lt;em&gt;tap tap skreeeEEEEEEE&lt;/em&gt;), later today, I’ll send out this blog post to all subscribers.&lt;/p&gt;
&lt;div class=&quot;update&quot;&gt;
&lt;p&gt;This email has now been sent!&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;What?&lt;/h3&gt;
&lt;p&gt;The content of this newsletter will be my blog posts, more or less as they are here. It’s another option for being alerted to new writing from me. The other options are still: &lt;a href=&quot;https://www.facebook.com/harrislap/&quot;&gt;Facebook&lt;/a&gt;, &lt;a href=&quot;https://social.coop/@harris&quot;&gt;Mastodon&lt;/a&gt;, &lt;a href=&quot;https://bsky.app/profile/harris.social.coop.ap.brid.gy&quot;&gt;Bluesky&lt;/a&gt;, and &lt;a href=&quot;https://chromamine.com/feeds/posts.xml&quot;&gt;RSS&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I will send out one email per post, not a digest. For the past six months volume has been an average of &lt;strong&gt;3⅓ posts per month&lt;/strong&gt;. This has increased a bit lately, hitting a new record of &lt;em&gt;six&lt;/em&gt; posts in January.&lt;/p&gt;
&lt;h3&gt;Why?&lt;/h3&gt;
&lt;p&gt;I’ve been thinking about how to grow less reliant on corporate (I might cheekily say, “legacy”) social media platforms for connecting with friends, community, and readers. One conclusion I’ve drawn is that I need to diversify the ways I distribute my writing and the ways I hear from people in reply. In the future, if I decide to drop a platform, it won’t feel like I’m losing touch with &lt;em&gt;everyone&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Email strikes me as a &lt;em&gt;particularly good&lt;/em&gt; distribution channel:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It naturally produces a redundant and distributed archive of my writing in the inboxes of subscribers. This archive is not subject to the whims of social media platform owners and content moderators.&lt;a href=&quot;https://chromamine.com/2025/02/my-new-newsletter/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Unlike RSS – or my website itself, for that matter – it’s a two-way channel. When I send out a newsletter, a reader can reply right where they’re reading it.&lt;a href=&quot;https://chromamine.com/2025/02/my-new-newsletter/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;It’s a distribution channel that is in my control. I rely on my &lt;a href=&quot;https://buttondown.com/&quot;&gt;mailing list provider&lt;/a&gt;, of course, but if I become dissatisfied with them, I can take my email list and go elsewhere. This is much harder to do with Facebook friends, Discord servers, or Bluesky followers.&lt;/li&gt;
&lt;li&gt;Almost everyone has an email address.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This isn’t a unique line of thought. It’s not a coincidence that the social media fragmentation era has been met with the &lt;a href=&quot;https://substack.com/&quot;&gt;Substack&lt;/a&gt; newsletter era – though even Substack now does seems to be hard at work &lt;a href=&quot;https://www.theverge.com/2023/4/5/23670452/substack-notes-tweets-posts-twitter&quot;&gt;increasing lock-in and walling off parts of their garden&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I know lots of people who hate email, though. If that’s you – the newsletter might not be for you. That’s OK! That’s why the other options exist.&lt;/p&gt;
&lt;h3&gt;How?&lt;/h3&gt;
&lt;p&gt;I settled on &lt;a href=&quot;https://buttondown.com/&quot;&gt;Buttondown&lt;/a&gt; as my newsletter provider. I like their indie vibes, their configuration flexibility, and the suite of features I’m likely to grow into in the future. In particular I like that they have RSS-to-email functionality which will let me automatically generate emails from my blog posts from my existing RSS feed. Mailchimp has similar functionality, but in playing with it, I wasn’t able to configure it the way I wanted – email-per-post rather than digest – and, honestly, I was relieved, because &lt;a href=&quot;https://www.propublica.org/article/inside-turbotax-20-year-fight-to-stop-americans-from-filing-their-taxes-for-free&quot;&gt;using Intuit products leaves a vomitous taste in my mouth&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Though, to start out with, I’m going to draft and send emails by hand. This is partially because I want to get more familiar with how Buttondown works and partially because their RSS-to-email feature is paid – and I’m not ready to pay for this until I know for sure that it’s providing a benefit to me and my readers.&lt;a href=&quot;https://chromamine.com/2025/02/my-new-newsletter/#fn3&quot; class=&quot;footnote-ref&quot; id=&quot;fnref3&quot;&gt;³&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;At least for the moment, I won’t be tracking email open rates. I have mixed feelings on the ethics of web and email analytics generally&lt;a href=&quot;https://chromamine.com/2025/02/my-new-newsletter/#fn4&quot; class=&quot;footnote-ref&quot; id=&quot;fnref4&quot;&gt;⁴&lt;/a&gt; and for the moment, it’s easy for me to forego. I may enable them later on&lt;a href=&quot;https://chromamine.com/2025/02/my-new-newsletter/#fn5&quot; class=&quot;footnote-ref&quot; id=&quot;fnref5&quot;&gt;⁵&lt;/a&gt; if I really need to assess the value of having a newsletter – but you can also help me assess that value by signing up and replying to my emails to share your thoughts and let me know you’re reading!&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;It is arguably subject to the whims of email service providers, but there’s not much precedent for, e.g., Gmail deleting emails out of your inbox without your consent. &lt;a href=&quot;https://chromamine.com/2025/02/my-new-newsletter/#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;I recognize that this isn’t true of all newsletters, but it will be for mine, at least until I become wildly famous. I don’t anticipate having a subscribership large enough for this to be a chore. I expect my subscribers will mostly be my personal friends who I will be &lt;em&gt;delighted&lt;/em&gt; to receive correspondence from. &lt;a href=&quot;https://chromamine.com/2025/02/my-new-newsletter/#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;This sort of thing in Product Management is sometimes referred to as a “concierge MVP” – a minimum viable product that is manually operated rather than automated, to test out a feature before investing in building it out. &lt;a href=&quot;https://chromamine.com/2025/02/my-new-newsletter/#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;Though I do have some rudimentary analytics enabled on this site – but they’re through my &lt;a href=&quot;https://pages.cloudflare.com/&quot;&gt;hosting provider&lt;/a&gt;, so they only expose data to me that my hosting provider already has anyway. &lt;a href=&quot;https://chromamine.com/2025/02/my-new-newsletter/#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 will make a visible announcement on list if I do so! &lt;a href=&quot;https://chromamine.com/2025/02/my-new-newsletter/#fnref5&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Converting an old iMac to a 5K display</title>
            <link href="https://chromamine.com/2025/01/converting-an-old-imac-to-a-5k-display/"/>
            <updated>2025-01-30T00:00:00Z</updated>
            <id>https://chromamine.com/2025/01/converting-an-old-imac-to-a-5k-display/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;Last year my 2015 (or possibly late 2014) iMac died after a decade of service. Around the same time I acquired a new Mac mini. Unlike the iMac, the Mac mini doesn’t have a built-in monitor. I needed to acquire a new one. Unfortunately even newer displays in my price range would be a quality-of-life step down from the iMac screen I was migrating away from. New 5K monitors are $800+ and better quality ones – such as the &lt;a href=&quot;https://www.apple.com/studio-display/&quot;&gt;$1,600 Apple Studio Display&lt;/a&gt; – are much more expensive.&lt;/p&gt;
&lt;p&gt;I opted to save money and reduce electronics waste by repurposing the still-intact iMac screen. Sadly, when Apple released the “Retina Display” 5K iMac in 2014, they discontinued &lt;a href=&quot;https://support.apple.com/en-us/105126&quot;&gt;the functionality&lt;/a&gt; that allowed iMacs to serve as displays for other computers&lt;a href=&quot;https://chromamine.com/2025/01/converting-an-old-imac-to-a-5k-display/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;. Using it this way now requires buying a “driverboard” to serve as the liaison between my Mac mini and the iMac screen, gutting the iMac, and installing the driverboard inside the empty chassis.&lt;/p&gt;
&lt;p&gt;Fortunately, this is territory many have trodden before and there’s many public posts detailing the process. I largely followed the instructions in &lt;a href=&quot;https://ohmypizza.com/2023/04/converting-a-5k-imac-into-an-external-5k-display&quot;&gt;this blog post from Scott Yoshinaga&lt;/a&gt;, which was enormously helpful. The entire process took me a few evenings over the course of three weeks – with waiting time for deliveries between steps.&lt;a href=&quot;https://chromamine.com/2025/01/converting-an-old-imac-to-a-5k-display/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The major exception&lt;/em&gt; to my following Yoshinaga’s blog post was this: rather than purchasing a driverboard similar to the one he used from eBay, I searched AliExpress for boards and found (among surprisingly many options) &lt;a href=&quot;https://www.aliexpress.us/item/3256806199842016.html?spm=a2g0o.order_list.order_list_main.5.f58b1802yMVsFj&amp;amp;gatewayAdapt=glo2usa&quot;&gt;one that supported a connection via a single Thunderbolt/USB-C DisplayPort cable&lt;/a&gt;. This reduced the number of adapters and cables I’d need in order to use it with my computers, which all have Thunderbolt ports. Most listings included an instruction to send a photo of your monitor panel to the shop in advance to verify that you were purchasing the right board, which I did and found reassuring. I was still nervous and so it was a pleasant surprise when it arrived and worked out-of-the box!&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/OtRAROshP8-768.webp 768w, https://chromamine.com/media/img/OtRAROshP8-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/OtRAROshP8-768.jpeg 768w, https://chromamine.com/media/img/OtRAROshP8-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The iMac glass screen, separated from the chassis, plugged into a green circuitboard with cables extending from it. On the screen is an image from a TV show and a configuration panel.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/OtRAROshP8-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;It works!&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;p&gt;The breakdown of costs for this project:&lt;/p&gt;
&lt;!-- note the no-break spaces in this table to preserve $ alignment --&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Driverboard&lt;/td&gt;
&lt;td&gt;$147.61&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USB-A extenders (1ft) ×2&lt;/td&gt;
&lt;td&gt;$  6.33&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audio cable extender (1ft)&lt;/td&gt;
&lt;td&gt;$  6.36&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thunderbolt cable (6ft)&lt;/td&gt;
&lt;td&gt;$ 28.68&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12V 6A AC adapter&lt;/td&gt;
&lt;td&gt;$ 15.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iFixit iMac repair kit&lt;/td&gt;
&lt;td&gt;$ 21.24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$225.72&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Quite a bit cheaper than a new $1,600 display! I did cheap out on the board and get one that only supports 8 bit color depth rather than the full possible 10 bit. Frankly I’m not sure I fully know what that means and I can’t really tell the difference. The screen looks great. (And for reasons I’ll explain later, maximizing color accuracy didn’t seem worthwhile for this screen.) I had a few things already that saved me some money in purchases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;iFixit screwdriver kit&lt;a href=&quot;https://chromamine.com/2025/01/converting-an-old-imac-to-a-5k-display/#fn3&quot; class=&quot;footnote-ref&quot; id=&quot;fnref3&quot;&gt;³&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Zip ties/zip tie anchors&lt;/li&gt;
&lt;li&gt;The iMac&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Even if I had bought those, this still was much cheaper. Even purchasing iMacs of that generation can be done readily for $200–400. If you’re lucky you can find a broken one that has the screen intact for even a bit cheaper&lt;a href=&quot;https://chromamine.com/2025/01/converting-an-old-imac-to-a-5k-display/#fn4&quot; class=&quot;footnote-ref&quot; id=&quot;fnref4&quot;&gt;⁴&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The project was overall successful, though there are a few things I’m somewhat dissatisfied with:&lt;/p&gt;
&lt;p&gt;The driverboard included USB-A ports for mouse and keyboard peripherals as well as an audio jack – all of which connect through to the computer that’s attached via USB-C/Thunderbolt. This allows the display to also serve as a peripheral hub. That’s not a thing I’m dissatisfied with; it’s actually extremely nice! I purchased 1 foot extender cables to expose those ports outside the chassis. Unfortunately once I had it completed I noticed that my speakers produce a constant high-pitched tone when plugged in. I wish I had noticed this before I sealed it up! Maybe next time I open it, I’ll see if it’s fixable, but until then I can’t use the audio port in that state. The USB-A ports work great, though.&lt;/p&gt;
&lt;p&gt;The attached buttonboard is pretty awkward and the ribbon cable it came with is pretty short. I have it poking out of the chassis, but haven’t figured out any ergonomic place to attach it. I wish it supported OS control of the brightness and contrast, because adjusting them with the buttonboard is &lt;em&gt;a process.&lt;/em&gt;&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/iaWYF5ozjv-768.webp 768w, https://chromamine.com/media/img/iaWYF5ozjv-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/iaWYF5ozjv-768.jpeg 768w, https://chromamine.com/media/img/iaWYF5ozjv-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The back of an iMac with a rectangular panel behind the stand removed from the chassis. A mess of cables and a green circuitboard extend from out the rectangular hole.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/iaWYF5ozjv-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2048&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;I may 3D print some parts to tidy this up a bit later – in fact you can already see that I printed a backing for the buttonboard to make it sturdier.&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;p&gt;The chassis is larger than necessary since it used to have full iMac internals in it. It would have been pretty cool to figure out a way to build a custom chassis that was smaller and lighter – and more naturally incorporated the buttonboard and ports. But that was a bigger project that I was up for and I haven’t seen yet anyone who has done so.&lt;/p&gt;
&lt;p&gt;One reason I didn’t prioritize maximizing the display’s color capabilities was that it &lt;em&gt;already&lt;/em&gt; has some image quality issues. I’m not sure if these were production defects I didn’t notice until late or issues it acquired over its lifetime – I got it used, so I also don’t know everything it’s been through. there’s a pinkish tint to the edge of the panel and a splotch in one corner that looks like moisture damage or something. These are really only noticable when looking at something with a bright white background, however.&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/WNLGFzASt4-768.webp 768w, https://chromamine.com/media/img/WNLGFzASt4-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/WNLGFzASt4-768.jpeg 768w, https://chromamine.com/media/img/WNLGFzASt4-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A corner of the imac screen showing a white pixel field. There&#39;s a pinkish tint at the edges and a slightly darkened splotch.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/WNLGFzASt4-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;The defects in question.&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;p&gt;The driverboard also has a speaker port, which I assume could be connected to internal iMac speakers. It didn’t come with a cable to do so, however, and it didn’t seem worth figuring out what I would need &lt;em&gt;and&lt;/em&gt; how to fit the board and speakers both in the chassis, just to have access to speakers that are lower quality than my existing desk speakers.&lt;/p&gt;
&lt;p&gt;Though I largely plan to use the monitor via the USB-C/Thunderbolt cable, I exposed an HDMI cable as well, just in case.&lt;/p&gt;
&lt;p&gt;In spite any flaws, overall, I’m &lt;em&gt;delighted&lt;/em&gt; with how this project turned out. It saved me a lot of money on a new display and I had a lot of fun with the process of doing it. I’m even considering buying &lt;em&gt;another&lt;/em&gt; used iMac to build myself a second 5k display!&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/Tq6pe7J3wY-768.webp 768w, https://chromamine.com/media/img/Tq6pe7J3wY-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/Tq6pe7J3wY-768.jpeg 768w, https://chromamine.com/media/img/Tq6pe7J3wY-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The iMac fully reassembled and showing a desktop picture of a forest with a macOS System Settings window centered on the screen.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/Tq6pe7J3wY-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2048&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;Fully sealed up and working!&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;p&gt;A few more photos of my process:&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/qcfHzUM2CC-768.webp 768w, https://chromamine.com/media/img/qcfHzUM2CC-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/qcfHzUM2CC-768.jpeg 768w, https://chromamine.com/media/img/qcfHzUM2CC-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The edge of a glass iMac screen with a black tool resembling a plastic pizza cutter being run along the edge between glass and aluminum.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/qcfHzUM2CC-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;Cutting the adhesive between the glass panel and the chassis using an &lt;a href=&quot;https://www.ifixit.com/products/imac-intel-27-2012-2019-adhesive-strips&quot;&gt;iFixit iMac fix kit&lt;/a&gt;.&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/97mV-IRk2E-768.webp 768w, https://chromamine.com/media/img/97mV-IRk2E-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/97mV-IRk2E-768.jpeg 768w, https://chromamine.com/media/img/97mV-IRk2E-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;iMac with a handful of blue plastic shaped like guitar picks inserted at various points around the edge of the displace, separating the glass from the aluminum.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/97mV-IRk2E-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2048&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;Gently and gradually separating the glass from the chassis with &lt;a href=&quot;https://www.ifixit.com/products/ifixit-opening-picks-set-of-6&quot;&gt;iFixit Opening Picks&lt;/a&gt;.&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/j6_jU7xTlP-768.webp 768w, https://chromamine.com/media/img/j6_jU7xTlP-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/j6_jU7xTlP-768.jpeg 768w, https://chromamine.com/media/img/j6_jU7xTlP-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;An iMac chassis resting on its back on a table. The glass screen has been removed, exposing a number of black circuitboards and black plastic parts. The internals are a bit dusty.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/j6_jU7xTlP-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;An iMac full of components.&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/ed1ueqsTE1-768.webp 768w, https://chromamine.com/media/img/ed1ueqsTE1-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/ed1ueqsTE1-768.jpeg 768w, https://chromamine.com/media/img/ed1ueqsTE1-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A steel rectangle with two black ribbon cables running across it. It is edged with a perimeter of black glass.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/ed1ueqsTE1-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;Glass screen panel, seen from the back.&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/Jl1nOfq9vy-768.webp 768w, https://chromamine.com/media/img/Jl1nOfq9vy-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/Jl1nOfq9vy-768.jpeg 768w, https://chromamine.com/media/img/Jl1nOfq9vy-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Two large, irregularly shaped, black plastic objects with two speaker drivers on each—one on the bottom and one in the middle. They appear contoured to fit in the sides of a rounded iMac chassis.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/Jl1nOfq9vy-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;The two internal speakers, charmingly asymmetrical and contoured to fit inside the iMac.&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/JIGiwG-AC0-768.webp 768w, https://chromamine.com/media/img/JIGiwG-AC0-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/JIGiwG-AC0-768.jpeg 768w, https://chromamine.com/media/img/JIGiwG-AC0-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Two large black and silver circuitboards. One has ports and a large grill attached. The other has copper coils and large capacitors.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/JIGiwG-AC0-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;The motherboard and power management unit.&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/pHFCTYXDhx-768.webp 768w, https://chromamine.com/media/img/pHFCTYXDhx-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/pHFCTYXDhx-768.jpeg 768w, https://chromamine.com/media/img/pHFCTYXDhx-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;An iMac chassis with most of the component removed. Only a few stray wires remain.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/pHFCTYXDhx-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;The iMac with most of its stuff removed.&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/LjMOID4mSq-768.webp 768w, https://chromamine.com/media/img/LjMOID4mSq-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/LjMOID4mSq-768.jpeg 768w, https://chromamine.com/media/img/LjMOID4mSq-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The metal back of the iMac glass panel with the circuitboard and cables taped off to one side with blue painters tape.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/LjMOID4mSq-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;Testing the placement of the driverboard by taping it down before holding the panel on the chassis.&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/PXv8fFHzAt-768.webp 768w, https://chromamine.com/media/img/PXv8fFHzAt-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/PXv8fFHzAt-768.jpeg 768w, https://chromamine.com/media/img/PXv8fFHzAt-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The iMac reassembled, except the glass panel is held on with blue painters tape running across the width of the screen.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/PXv8fFHzAt-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2048&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;The board fits in the chassis and it works while assembled! This was just testing though, so I’m holding it on with tape so it doesn’t fall off and shatter, since there’s no adhesive yet.&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/EqAFBPGT8w-768.webp 768w, https://chromamine.com/media/img/EqAFBPGT8w-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/EqAFBPGT8w-768.jpeg 768w, https://chromamine.com/media/img/EqAFBPGT8w-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The metal back of the glass panel. The cables and circuitboard are now all stuck down to the panel with double-sided tape and zip-tie anchors.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/EqAFBPGT8w-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;Now that I know it fits, I lock down the position of the board and cables with double-sided tape and zip ties. (I 3D printed the &lt;a href=&quot;https://www.printables.com/model/132296-zip-tie-anchor&quot;&gt;zip tie anchors&lt;/a&gt;!)&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/jR_OGWbeLt-768.webp 768w, https://chromamine.com/media/img/jR_OGWbeLt-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/jR_OGWbeLt-768.jpeg 768w, https://chromamine.com/media/img/jR_OGWbeLt-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The empty iMac chassis with white strips attached to blue plastic numbered labels around the edge.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/jR_OGWbeLt-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2048&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;Time to attach the adhesive!&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/mXVRPwcwEa-768.webp 768w, https://chromamine.com/media/img/mXVRPwcwEa-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/mXVRPwcwEa-768.jpeg 768w, https://chromamine.com/media/img/mXVRPwcwEa-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The back of the iMac, still showing a mess of cables protruding from a rectangular hole. They&#39;re slightly tidied with cable holders.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/mXVRPwcwEa-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2048&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;Another shot of the back, slightly tidied up.&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;I believe, at the time, this was understandable, as none of the external ports on an iMac could support 5K video. It is a bit of a shame that they have never added this feature back though given the evidence that for all-in-one computers, some components are exhausted faster than others. &lt;a href=&quot;https://chromamine.com/2025/01/converting-an-old-imac-to-a-5k-display/#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;As well as some out of town travel that delayed me. &lt;a href=&quot;https://chromamine.com/2025/01/converting-an-old-imac-to-a-5k-display/#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;Though in the event it did not contain the humongous T25 6-pointed star bit needed for one of the screws in the iMac and I had to improvise by using a slightly off-size triangular bit instead. &lt;a href=&quot;https://chromamine.com/2025/01/converting-an-old-imac-to-a-5k-display/#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;Though my experience is that those ones get snapped up pretty quickly and ones listed “for parts” on eBay usually have a cracked screen – which, alas, is the part I want. &lt;a href=&quot;https://chromamine.com/2025/01/converting-an-old-imac-to-a-5k-display/#fnref4&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Against the IHRA Definition of Antisemitism</title>
            <link href="https://chromamine.com/2025/01/against-the-ihra-definition-of-antisemitism/"/>
            <updated>2025-01-29T00:00:00Z</updated>
            <id>https://chromamine.com/2025/01/against-the-ihra-definition-of-antisemitism/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;In December 2023 the Massachusetts State Legislature &lt;a href=&quot;https://malegislature.gov/Bills/193/H1558&quot;&gt;considered adopting&lt;/a&gt; the &lt;a href=&quot;https://en.wikipedia.org/wiki/Working_definition_of_antisemitism#Criticism&quot;&gt;flawed&lt;/a&gt; IHRA definition of antisemitism. I wrote to members of my state government to implore them not to do so. I was reminded of it again last week when I heard that &lt;a href=&quot;https://www.theguardian.com/education/2025/jan/21/harvard-antisemitism-lawsuit-settlement&quot;&gt;Harvard University, down the road from me, had adopted the IHRA definition&lt;/a&gt;. I was reminded again today when I heard reporting that the Trump administration was &lt;a href=&quot;https://forward.com/news/692632/trump-antisemitism-executive-order/&quot;&gt;planning an executive order&lt;/a&gt; to expand his previous &lt;a href=&quot;https://trumpwhitehouse.archives.gov/presidential-actions/executive-order-combating-anti-semitism/&quot;&gt;IHRA-based EO&lt;/a&gt; in order to specifically target Palestinian-solidarity activists on college campuses. I thought I’d share the letter I wrote now.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;To Chairman James Eldridge, Chairman Michael Day, and members of the Joint Committee on the Judiciary,&lt;/p&gt;
&lt;p&gt;I am writing you as a Jewish resident of Somerville MA asking your to reject H. 1558. I was raised in Berkeley CA, attended Hebrew school on weekday evenings and weekends; I was fortunate to be part of a progressive Jewish community that encouraged serious engagement with political issues. I was taught to take a second look at everything, that we should be critical and thoughtful in our quest to repair the world.&lt;/p&gt;
&lt;p&gt;It is in that spirit that I ask you reject this bill which adopts the IHRA definition of antisemitism into our anti-discrimination law.&lt;/p&gt;
&lt;p&gt;Antisemitism is a serious and urgent issue in the United States and I strongly support efforts to combat it in our legislature. But the IHRA definition is inconsistent and overly broad. It’s open to a wide range of interpretations that are counter productive to the fight against antisemitism because it muddies the waters with its broad brush. It has been used to paint as antisemites the many people – including many Jewish activists – who are working for a just peace between Israelis and Palestinians. At its best it is vague and challenging to apply. At worst it is used to suppress pro-peace political speech under the pretense of protecting Jews. Adopting it into law will hurt many Jews in our state, including me.&lt;/p&gt;
&lt;p&gt;Thank you for your consideration,&lt;br /&gt;
Harris Lapiroff&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This wasn’t included in my letter at the time, but if you are looking for a working definition of antisemitism that is thoughtful and concrete – relatively, considering the amount of nuance required for defining complex phenomena such as racism and antisemitism – and doesn’t broadly classify criticism of nationalism and state as antisemitism, the &lt;a href=&quot;https://jerusalemdeclaration.org/&quot;&gt;Jerusalem Declaration on Antisemitism&lt;/a&gt; is far and away a better example.&lt;/p&gt;
</content>
        </entry>
        <entry>
            <title>If your bank calls you, don&#39;t give them anything</title>
            <link href="https://chromamine.com/2025/01/dont-give-information-to-your-bank-if-they-call-you/"/>
            <updated>2025-01-14T00:00:00Z</updated>
            <id>https://chromamine.com/2025/01/dont-give-information-to-your-bank-if-they-call-you/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;I just got a fraudulent call from someone pretending to be my bank, so I thought I’d share this tidbit of security wisdom that I hope a lot of people already know, but just in case you don’t: &lt;strong&gt;Don’t share personal information with your bank if they called you first.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If they ask you for any personal information, especially “to verify,” this is a very good sign that it is not actually your bank and is actually a scam to steal your credit card number or other personal information.&lt;/p&gt;
&lt;p&gt;A bank may ask you to verify personal information &lt;em&gt;if you called them&lt;/em&gt; but they should not ask you to verify personal information &lt;em&gt;if they called you&lt;/em&gt;. If you think it might be a legitimate call anyway, you should always ask to call them back at the phone number on your card or bank statement (&lt;em&gt;not&lt;/em&gt; a number they provide you over the phone).&lt;/p&gt;
&lt;p&gt;Here’s the rough transcript of the call I just had, as an example:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;CALLER: Hello, I’m calling from Citibank because we noticed some suspicious activity on your account. Can you verify these transactions for me? [Lists a couple transactions ranging from $700–$1,000]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I had actually received a call similar to this from Citibank earlier in the week – though in that case it had been a robot who left me a voicemail. I should have been a little more suspicious, but I was also primed to think that &lt;em&gt;maybe&lt;/em&gt; there was something going on with my card.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;HARRIS: No, those weren’t me.&lt;/p&gt;
&lt;p&gt;CALLER: Okay, thank you for confirming. We are going to stop those transactions and send you a new card with a new number. I just need to verify some information to confirm you are in posession of the card. Can you get your card and–&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;Now&lt;/em&gt; I was pretty sure this was a scam but wanted to be 100% sure.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;HARRIS: Can I call you back at the number on my card to confirm you’re actually my bank?&lt;/p&gt;
&lt;p&gt;CALLER: Yes you can call me back at this number.&lt;/p&gt;
&lt;p&gt;HARRIS: No, can I call you back the phone number &lt;em&gt;on my card&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;CALLER: I can give you a number to call.&lt;/p&gt;
&lt;p&gt;HARRIS: No, I need to call you at the number on my card to verify you’re my–&lt;/p&gt;
&lt;p&gt;[CALLER hangs up.]&lt;/p&gt;
&lt;/blockquote&gt;
</content>
        </entry>
        <entry>
            <title>My New Bed</title>
            <link href="https://chromamine.com/2025/01/my-new-bed/"/>
            <updated>2025-01-10T00:00:00Z</updated>
            <id>https://chromamine.com/2025/01/my-new-bed/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;Last year I decided it was time to replace my bed frame. My previous frame was some forgotten Ikea model that I’d inherited from a housemate nearly 10 years prior and it had been with me through two moves. It was all metal, very sturdy, and simple to assemble – four pieces that slotted into each other without screws, plus a mid-beam and wooden slats. But in recent years I’d become dissatisfied with it. It had gotten creakier over the years and I hadn’t figured out how to stop its squeaking. I had also become annoyed by the foot board, both aesthetically and practically, since it prevented me from exiting off or sitting on the end of the mattress. I was also ready to upgrade from a double mattress to a queen.&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/t1Hq9t2wm2-768.webp 768w, https://chromamine.com/media/img/t1Hq9t2wm2-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/t1Hq9t2wm2-768.jpeg 768w, https://chromamine.com/media/img/t1Hq9t2wm2-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A bedroom, slightly cluttered, with a black metal bars bed frame in the middle. The bed is stripped down to sheets.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/t1Hq9t2wm2-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;I was already partway through the process of stripping the bed to take it apart when I took this photo.&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;p&gt;I spent a lot of time considering what I wanted in a bed and what price I was willing to pay for it. There’s a whole range of prices to the beds people recommended to me when I asked around, from less than a couple hundred dollars to over a couple thousand!&lt;/p&gt;
&lt;p&gt;Ultimately I ordered the &lt;a href=&quot;https://www.copelandfurniture.com/collections/oslo-bedroom/oslo-bed-1.html&quot;&gt;Oslo bed frame&lt;/a&gt; from Copeland Furniture. I liked its simple modern look and the finish of the natural oak wood. My partner &lt;a href=&quot;https://www.ruthiebyers.com/&quot;&gt;Ruthie&lt;/a&gt; has a bed of a different model from Copeland Furniture and it feels very sturdy and she’s happy with it.&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/5CwEr6BK0m-768.webp 768w, https://chromamine.com/media/img/5CwEr6BK0m-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/5CwEr6BK0m-768.jpeg 768w, https://chromamine.com/media/img/5CwEr6BK0m-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A bedroom with a light wood bed frame made of simple modern right angles and double dovetail joints at the corners. Over the mattress is a beautiful teal, pink, and white quilt with a radiating diamond pattern.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/5CwEr6BK0m-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1025&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;Never mind my uneven bed-making job 😅&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;p&gt;I bought it through &lt;a href=&quot;https://www.circlefurniture.com/products/bedroom/beds/oslo-platform-bed&quot;&gt;Circle Furniture&lt;/a&gt; in Cambridge. At $2,029, it was the most expensive bed frame I was considering. Though it has a similar look to some of the cheaper frames I was looking at, I think it’s a little more refined. The dovetail joints and hidden screws are clever touches and I’m hopeful that the solid oak wood will make it a multi-decade, if not lifetime, purchase.&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/FgNGD0hiOU-768.webp 768w, https://chromamine.com/media/img/FgNGD0hiOU-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/FgNGD0hiOU-768.jpeg 768w, https://chromamine.com/media/img/FgNGD0hiOU-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A close-up of the dovetail joint on the corner of the bed frame. Pillows and the far nightstand with a lamp can be seen in the background.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/FgNGD0hiOU-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1025&quot; /&gt;&lt;/picture&gt;
&lt;p&gt;&lt;/p&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I added on a $1,299 mattress, &lt;a href=&quot;https://www.circlefurniture.com/products/bedroom/mattresses/Chloe-12-gel-memory-firm-mattress&quot;&gt;Chloe Gel Memory Firm&lt;/a&gt;, I liked when testing at the store. They gave me a discount of a few hundred dollars for getting both frame and mattress together, but with taxes and delivery fees it all came to $3,470. It’s probably the single most expensive purchase I’ve ever made&lt;a href=&quot;https://chromamine.com/2025/01/my-new-bed/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;They arrived in early December and, one month in, I’m in love with bed and mattress both. The frame feels sturdy and I like the look of it. The short foot board and lighter color make the room feel larger and more open. It better shows off my beautiful quilt, made by my amazing sweetie Ruthie for my 30th birthday years ago. In sharing photos of the bed on social media, I’ve received many compliments on the quilt – sometimes even from people who have &lt;em&gt;definitely&lt;/em&gt; seen my bed with it on before!&lt;/p&gt;
&lt;p&gt;The mattress, on first test, struck me as a little firmer than I remembered it from the store, but over the past month I think it has either softened up a bit or I’ve gotten used to it. It’s still very firm, but I like it, and the memory gel has a nice plush feel while maintaining good temperature control. With &lt;a href=&quot;https://www.llbean.com/llb/shop/86878&quot;&gt;L.L. Bean’s soft flannel sheets&lt;/a&gt;, it’s a perfect cozy winter hideout.&lt;/p&gt;
&lt;p&gt;I decided that, after splurging on the bed, I’d go frugal on the nightstands. I bought a pair of &lt;a href=&quot;https://www.ikea.com/us/en/p/nordkisa-nightstand-bamboo-00430745/&quot;&gt;Ikea bamboo Nordkisa nightstands&lt;/a&gt;. One I got used for $100 and the other new for $129. I like them, with my only real complaint being the lack of slides and stops on the drawer.&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/mJAtXlvRzb-768.webp 768w, https://chromamine.com/media/img/mJAtXlvRzb-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/mJAtXlvRzb-768.jpeg 768w, https://chromamine.com/media/img/mJAtXlvRzb-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A wide view of the bed frame, showing matching bamboo nightstands on either side.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/mJAtXlvRzb-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1025&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;I had already acquired the used nightstand before I got the new bed, seen in the first image, but here are both matching nightstands with the bed.&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;p&gt;I’m still looking to upgrade other parts of my bedroom setup. I’m looking into what pillows, area rugs, nightstand lamps, and storage chests might be best for my needs.&lt;/p&gt;
&lt;p&gt;But, I will say, after taking a ten day trip back to California for the holidays, returning to my new bed after getting in from the airport felt like home.&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Except possibly some medical expenses because, after all, I do live in the USA 🦅🇺🇸 &lt;a href=&quot;https://chromamine.com/2025/01/my-new-bed/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Changing the color of a character in Adobe Illustrator with scripting</title>
            <link href="https://chromamine.com/2025/01/changing-the-color-of-a-character-in-adobe-illustrator-with-scripting/"/>
            <updated>2025-01-09T00:00:00Z</updated>
            <id>https://chromamine.com/2025/01/changing-the-color-of-a-character-in-adobe-illustrator-with-scripting/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;I’ve been working on a CD album insert for &lt;a href=&quot;https://emmaazelborn.com/&quot;&gt;Emma&lt;/a&gt; as a design project. It has a lot of song lyrics and for compactness we’ve replaced line breaks in the lyrics with slashes:&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/HtfjXucBIr-768.webp 768w, https://chromamine.com/media/img/HtfjXucBIr-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/HtfjXucBIr-768.jpeg 768w, https://chromamine.com/media/img/HtfjXucBIr-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Screenshot of a stanza of lyrics with lyric lines divided by slashes. All text is blue.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/HtfjXucBIr-768.jpeg&quot; width=&quot;1536&quot; height=&quot;862&quot; /&gt;&lt;/picture&gt;
&lt;p&gt;&lt;/p&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I thought it would be nice if the slashes played their role as more muted visual elements rather than looking like prime elements of the content, so I decided to color them all gray.&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/A-2NOitiP1-768.webp 768w, https://chromamine.com/media/img/A-2NOitiP1-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/A-2NOitiP1-768.jpeg 768w, https://chromamine.com/media/img/A-2NOitiP1-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Screenshot of a stanza of lyrics with lyric lines divided by slashes. The text is blue, but the slashes are a light gray.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/A-2NOitiP1-768.jpeg&quot; width=&quot;1536&quot; height=&quot;862&quot; /&gt;&lt;/picture&gt;
&lt;p&gt;&lt;/p&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;This was a tedious thing to do manually one-by-one for roughly 150 slashes, especially if I was going to have to do it multiple times through rounds of editing. I also couldn’t find a way to do it quickly in the Illustrator GUI – find and replace worked only on text, not formatting, and I couldn’t find other functionality that would work. I ended up writing a quick script in Javascript to do it for me:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; docRef&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; app.activeDocument;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; story&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; docRef.stories[&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; characters&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; story.textRange.characters;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; charStyle&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; docRef.characterStyles.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;getByName&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&#39;Slash&#39;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;// Find all the slashes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; slashes &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; [];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;; i &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; characters.&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;; i&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; (characters[i].contents &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; &#39;/&#39;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        slashes.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(characters[i]);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;// Color all the slashes gray&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;; i &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; slashes.&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;; i&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    charStyle.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;applyTo&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(slashes[i]);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This was a reasonably quick and pretty satisfying solution. I did need to manually create the character style for slashes and name it “Slash.” I could have had the script do this, but it was easier to do this one-off task by hand and I was able to visually test exactly which gray I wanted in the process. Then I ran the script with &lt;strong&gt;File › Scripts › Other Script…&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Though it is incredibly cool that Illustrator supports scripting with Javascript, it also, annoyingly, doesn’t support the modern language features I’ve gotten used to writing with Javascript for &lt;a href=&quot;https://nodejs.org/&quot;&gt;Node&lt;/a&gt; or browsers. This script is reasonably simple as is, but it could have been very short if I’d been able to use &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter&quot;&gt;&lt;code&gt;.filter()&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach&quot;&gt;&lt;code&gt;.forEach()&lt;/code&gt;&lt;/a&gt;. Instead I had to do the clumsy filtering and for loops seen above&lt;a href=&quot;https://chromamine.com/2025/01/changing-the-color-of-a-character-in-adobe-illustrator-with-scripting/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;. It didn’t even let me use &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions&quot;&gt;arrow functions&lt;/a&gt; or &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let&quot;&gt;&lt;code&gt;let&lt;/code&gt;&lt;/a&gt;&lt;a href=&quot;https://chromamine.com/2025/01/changing-the-color-of-a-character-in-adobe-illustrator-with-scripting/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt;! I hope Adobe will update this in future versions.&lt;/p&gt;
&lt;p&gt;By the way, go listen to &lt;a href=&quot;https://distrokid.com/hyperfollow/emmaazelborn1/magnolia-sun&quot;&gt;Emma’s album&lt;/a&gt;! It’s fantastic!&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Yeah, yeah, I could have collapsed it into one loop if I wanted, &lt;em&gt;fine&lt;/em&gt;. &lt;a href=&quot;https://chromamine.com/2025/01/changing-the-color-of-a-character-in-adobe-illustrator-with-scripting/#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;This was especially confusing because I am under the impression that &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let&quot;&gt;&lt;code&gt;let&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const&quot;&gt;&lt;code&gt;const&lt;/code&gt;&lt;/a&gt; were introduced into the language at the same time and it clearly tolerates the latter. It’s possible I was actually running into a different issue – the debugging capabilities also weren’t great and I didn’t look into it for too long. &lt;a href=&quot;https://chromamine.com/2025/01/changing-the-color-of-a-character-in-adobe-illustrator-with-scripting/#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Bluesky&#39;s Enshittification Risk</title>
            <link href="https://chromamine.com/2024/12/blueskys-enshittification-risk/"/>
            <updated>2024-12-05T00:00:00Z</updated>
            <id>https://chromamine.com/2024/12/blueskys-enshittification-risk/</id>
            <content xml:lang="en-us" type="html">&lt;div class=&quot;update&quot;&gt;
&lt;p&gt;&lt;strong&gt;September 15, 2025:&lt;/strong&gt; As of recently the &lt;a href=&quot;https://www.blackskyweb.xyz/&quot;&gt;Blacksky&lt;/a&gt; project seems to have successfully launched independent implementations of the core parts of the ATProto stack (a personal data store, a relay, and an app) that allow someone to interact with Bluesky users while not using Bluesky. Another effort, &lt;a href=&quot;https://northskysocial.com/&quot;&gt;Northsky&lt;/a&gt;, is underway as well.&lt;/p&gt;
&lt;p&gt;At the moment, Bluesky still controls the overwhelming majority of the ATProto network, and it’s not clear that Blacksky (or Northsky) could survive if Bluesky either failed or moderated their networks out of existence—Blacksky’s user count, as of last estimates I saw, is still in “could be a rounding error” territory on overall ATProto users—but, if these projects thrive and successfully pick up substantial cohorts of users, I (and Doctorow) will be proven wrong. Bluesky will be a viable decentralized network.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://pluralistic.net/2024/11/02/ulysses-pact/&quot;&gt;Cory Doctorow&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bluesky lacks the one federated feature that is absolutely necessary for me to trust it: the ability to leave Bluesky and go to another host and continue to talk to the people I’ve entered into community with there. While there are many independently maintained servers that provide services to Bluesky and its users, there is only one Bluesky server. A federation of multiple servers, each a peer to the other, has been on Bluesky’s roadmap for as long as I’ve been following it, but they haven’t (yet) delivered it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;That was worrying when Bluesky was a scrappy, bootstrapped startup with a few million users. Now it has grown to over 13 million users, and it has taken on a large tranche of outside capital.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Doctorow is more uncompromising (perhaps more virtuous) than I am. I’m not myself off of enshittified or en-route-to-being-enshittified platforms. I’ve already &lt;a href=&quot;https://bsky.app/profile/harris.social.coop.ap.brid.gy&quot;&gt;established a presence&lt;/a&gt; on Bluesky by mirroring my Mastodon presence. I’m even considering creating a more active presence there as it grows more popular. But he does a great job capturing my misgivings about the platform – better than I did in my previous post about it.&lt;/p&gt;
&lt;p&gt;Bluesky has &lt;a href=&quot;https://bsky.social/about/blog/7-05-2023-business-plan&quot;&gt;great aspirations&lt;/a&gt; to never become an enshittified platform and I admire much of what it’s done so far. I’m starting to see people building &lt;a href=&quot;https://swearsky.bagpuss.org/&quot;&gt;cool&lt;/a&gt; and &lt;a href=&quot;https://fed.brid.gy/&quot;&gt;experimental&lt;/a&gt; things with the APIs it provides! It reminds me of the openness of Twitter in its early days, which is both wonderful &lt;em&gt;and&lt;/em&gt; concerning, because, as with many once-open social media platforms, it’s still beholden to its investors who sooner or later want to see a profit, either through a functional business model (which it does not have yet) or an acquisition. It is not enshittification-proof nor billionaire-proof. I suspect its investors will see true decentralization as more of a risk than an asset and it seems possible that long-promised functionality will be on the back burner indefinitely. I’d really like to be wrong about this!&lt;/p&gt;
&lt;p&gt;Maybe it’s okay for us to not learn a larger lesson from the previous generation of social media apps beyond “X sucks, let’s move to something else.” Maybe it’s fine to ride the waves from platform to platform over the years as they cycle from idealistic and great to enshittified and troubling. But a declining social media platform can hold its users in a vice-grip long after it’s become socially destructive, as evidenced by my posting this originally on Facebook&lt;a href=&quot;https://chromamine.com/2024/12/blueskys-enshittification-risk/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;, as evidenced by many people continuing to use X throughout the 2024 election season, as evidenced by many still using it even now. I don’t know what this means for how people should approach social media. Mostly, I wish our options were better.&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;I first posted this on Facebook, then realized I should &lt;a href=&quot;https://indieweb.org/POSSE&quot;&gt;POSSE&lt;/a&gt; it, and so have re-posted it here. &lt;a href=&quot;https://chromamine.com/2024/12/blueskys-enshittification-risk/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Notes on Upgrading to Eleventy 3.0</title>
            <link href="https://chromamine.com/2024/11/notes-on-upgrading-to-eleventy-3.0/"/>
            <updated>2024-11-21T00:00:00Z</updated>
            <id>https://chromamine.com/2024/11/notes-on-upgrading-to-eleventy-3.0/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;My blog is now generated by Eleventy 3.0, which was released last month. The upgrade process took me a few hours split over two evenings and I took a few notes. This probably isn’t an interesting write up for hardly anyone – but if you have any of the same 11ty concerns I do, you may find a solution in here.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I started out by following the instructions in the excellent &lt;a href=&quot;https://www.11ty.dev/docs/plugins/upgrade-help/&quot;&gt;Upgrade Helper docs&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When I tried to install the Upgrade Helper plugin, I got a dependency conflict with &lt;code&gt;eleventy-sass&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm ERR! code ERESOLVE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm ERR! ERESOLVE could not resolve&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm ERR!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm ERR! While resolving: eleventy-sass@2.2.4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm ERR! Found: @11ty/eleventy@3.0.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm ERR! node_modules/@11ty/eleventy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm ERR!   dev @11ty/eleventy@&quot;3.0&quot; from the root project&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm ERR!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm ERR! Could not resolve dependency:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm ERR! peer @11ty/eleventy@&quot;^1.0.0 || ^2.0.0-canary.12 || ^2.0.0-beta.1&quot; from eleventy-sass@2.2.4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm ERR! node_modules/eleventy-sass&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm ERR!   dev eleventy-sass@&quot;^2.2.3&quot; from the root project&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm ERR!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm ERR! Conflicting peer dependency: @11ty/eleventy@2.0.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm ERR! node_modules/@11ty/eleventy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm ERR!   peer @11ty/eleventy@&quot;^1.0.0 || ^2.0.0-canary.12 || ^2.0.0-beta.1&quot; from eleventy-sass@2.2.4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm ERR!   node_modules/eleventy-sass&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm ERR!     dev eleventy-sass@&quot;^2.2.3&quot; from the root project&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Upgrading &lt;code&gt;eleventy-sass&lt;/code&gt; with&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#FFA657&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; upgrade&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; eleventy-sass&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;resolved it and I was able install the Upgrade Helper successfully.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When I ran my site I got this error:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;(node:2948) Warning: To load an ES module, set &quot;type&quot;: &quot;module&quot; in the package.json or use the .mjs extension.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;(Use `node --trace-warnings ...` to show where the warning was created)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[11ty] Eleventy Error (CLI):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[11ty] 1. Error in your Eleventy config file &#39;eleventy.config.js&#39;. (via EleventyConfigError)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[11ty] 2. Cannot use import statement outside a module (via SyntaxError)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[11ty]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[11ty] Original error stack trace: /Users/harris/Projects/Personal/chromamine.com/eleventy.config.js:1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[11ty] import UpgradeHelper from &quot;@11ty/eleventy-upgrade-help&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[11ty] ^^^^^^&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[11ty]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[11ty] SyntaxError: Cannot use import statement outside a module&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Whoops – I had copied the line from the docs as written&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; UpgradeHelper &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; &quot;@11ty/eleventy-upgrade-help&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;but I had forgotten to convert my project to use ES Modules (ESM) imports instead of CommonJS (CJS) imports (e.g., &lt;code&gt;const UpgradeHelper = require(&amp;quot;@11ty/eleventy-upgrade-help&amp;quot;)&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;I could have stuck to CommonJS imports, which 11ty still supports, but most of the reason I wanted to upgrade to 3.0 was &lt;em&gt;because&lt;/em&gt; it supports ESM imports – which are more consistent with how I write Javascript everywhere else and seem to be the future of the language. I added &lt;code&gt;&amp;quot;type&amp;quot;: &amp;quot;module&amp;quot;&lt;/code&gt; to my &lt;code&gt;package.json&lt;/code&gt; and converted all of my old CJS imports and exports to ESM.&lt;/p&gt;
&lt;p&gt;This wasn’t a straightforward replace because I sometimes used CJS &lt;code&gt;require&lt;/code&gt; mid-function, but I moved all imports to the top when I converted them. I rearranged some of the exports as well. I was able to ask &lt;a href=&quot;https://github.com/features/copilot&quot;&gt;Copilot&lt;/a&gt; to convert them for me (and add extensions, because node requires extensions for local ESM imports) successfully. It still took a while to go through each file and convert them block by block. I did occasionally have to remind it not to insert semicolons, since my javascript style is, controversially, &lt;em&gt;not&lt;/em&gt; to use semicolons.&lt;/p&gt;
&lt;p&gt;It’s possible I could have asked Copilot to do it project-wide and it would have worked – but I wasn’t prepared to trust it that far without checking its work. Nevertheless I do think it saved me a fair bit of time here.&lt;/p&gt;
&lt;p&gt;This also enabled me to remove some hacky workarounds I had in my config for importing ESM-only projects, e.g., this code at the top of my config function:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;eleventyConfig.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&#39;eleventy.before&#39;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; d3time&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; import&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;d3-time-format&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; d3format&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; import&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;d3-format&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;  global.d3time &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; d3time&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;  global.d3format &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; d3format&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;compileObservable&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; import&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;./config/utils/ojs/compile.mjs&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;  global.compileObservable &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; compileObservable&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;})&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;became a more civilized&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    format &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; d3Format,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    utcFormat &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; d3UtcFormat,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; &#39;d3&#39;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;in the specific file that needed it (note also that the imported objects are also more specific).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;eleventy-sass&lt;/code&gt;, it turns out, requires a node flag &lt;code&gt;--experimental-require-module&lt;/code&gt; to run. I have these &lt;code&gt;&amp;quot;script&amp;quot;&lt;/code&gt;s in my &lt;code&gt;package.json&lt;/code&gt; file to run 11ty:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#7EE787&quot;&gt;  &quot;serve&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;PROD=0 eleventy --serve&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#7EE787&quot;&gt;  &quot;build&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;PROD=1 eleventy&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;  //...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It wasn’t immediately obvious to me how to add the node flag to these scripts, but after searching around, I settled on this approach:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#7EE787&quot;&gt;  &quot;serve&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;PROD=0 NODE_OPTIONS=&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF7B72&quot;&gt;&#92;&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;--experimental-require-module&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF7B72&quot;&gt;&#92;&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; eleventy --serve&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#7EE787&quot;&gt;  &quot;build&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;PROD=1 NODE_OPTIONS=&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF7B72&quot;&gt;&#92;&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;--experimental-require-module&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#FF7B72&quot;&gt;&#92;&quot;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; eleventy&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;  //...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After fixing all of the above, I was finally able to run &lt;code&gt;npm run build&lt;/code&gt; and see the output from the upgrade helper plugin. Mostly my project passed the tests:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;[11ty/eleventy-upgrade-help] PASSED You are using Node v22.0.0. Node 18 or newer is required.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;[11ty/eleventy-upgrade-help] PASSED Eleventy will fail with an error when you point &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#FFA657&quot;&gt;--config&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#FFA657&quot;&gt; to&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; configuration&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; file&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; that&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; does&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; not&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; exist.&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; You&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; are&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; not&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; using&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; `&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#FFA657&quot;&gt;--config&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#FFA657&quot;&gt;—so&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; don’t&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; worry&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; about&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; it!&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; Read&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; more:&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; https://github.com/11ty/eleventy/issues/3373&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;# ...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But there was one error:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[11ty/eleventy-upgrade-help] ERROR Found 10 pug files in your project but the pug plugin was moved from core to an officially supported plugin. You will need to add the plugin for pug, available here: https://github.com/11ty/eleventy-plugin-template-languages and you can learn more about this here: https://github.com/11ty/eleventy/issues/3124&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I followed the instructions to install the Pug template plugin, which resolved the error.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Previously I used a bit of a hack to make my 11ty template filters available to my Pug templates:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;global.filters &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; eleventyConfig.javascriptFunctions&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;eleventyConfig.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;setPugOptions&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    globals: [&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&#39;filters&#39;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;})&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;which allowed me to call filters in templates like:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-pug&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt;.archive-list__item-tag-count&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; `(${&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;tag&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;count&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;} post${&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;filters&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;pluralize&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;tag&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;count&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;})`&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This no longer worked with in 3.0 &lt;em&gt;and&lt;/em&gt; with the new plugin (I believe both &lt;code&gt;.javascriptFunctions&lt;/code&gt; &lt;em&gt;and&lt;/em&gt; &lt;code&gt;.setPugOptions&lt;/code&gt; are gone). This new code worked, with no changes to my templates:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;eleventyConfig.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;addPlugin&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(pugPlugin, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;  filters: eleventyConfig.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;getFilters&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;})&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;though I do wonder if I’m misusing the &lt;code&gt;filters&lt;/code&gt; option.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Next, I got this error when building:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;[11ty] Problem writing Eleventy templates:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;[11ty] Output conflict: multiple input files are writing to &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#FFA657&quot;&gt;./_site/&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#FFA657&quot;&gt; tags/#&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;{ filters.slugify(&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#FFA657&quot;&gt;tag&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;) }/index.html`&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; Use&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; distinct&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; `&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#FFA657&quot;&gt;permalink&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#FFA657&quot;&gt; values&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; to&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; resolve&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; conflict.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;[11ty]   1. ./src/tags.pug&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;[11ty]   2. ./src/tags.pug&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;[11ty]   3. ./src/tags.pug&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;[11ty]   4. ./src/tags.pug&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;# ... and on and on for a while&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I was using Eleventy’s &lt;a href=&quot;https://www.11ty.dev/docs/pagination/&quot;&gt;pagination feature&lt;/a&gt; to generate all my tag pages from a single template:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;tags.pug&lt;/code&gt;’s frontmatter:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;pagination&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;  data&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;collections&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;  size&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;  alias&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;tag&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;  filter&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;posts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    - &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;all&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;layout&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;monotheme/page.pug&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;permalink&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;| tags/#{ filters.slugify(tag) }/&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;permalink&lt;/code&gt; entry in the YAML frontmatter is actually a mini Pug template that generates a permalink with each tag name, like &lt;code&gt;/tags/11ty/&lt;/code&gt;. Unfortunately in 3.0 handling of permalinks changed and this code no longer worked. Fortunately it was very easy to fix – just a matter of nesting the &lt;code&gt;permalink&lt;/code&gt; entry under a &lt;code&gt;eleventyComputed&lt;/code&gt; entry:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;pagination&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;collections&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;alias&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;tag&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;filter&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;posts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;all&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;layout&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;monotheme/page.pug&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;eleventyComputed&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;  permalink&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;| tags/#{ filters.slugify(tag) }/&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(Thanks to &lt;a href=&quot;https://shivjm.blog/&quot;&gt;Shiv&lt;/a&gt; for helping me out with this one in the 11ty Discord!)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And one last issue: I use &lt;a href=&quot;https://github.com/kentaroi/eleventy-sass?tab=readme-ov-file#rev-property&quot;&gt;&lt;code&gt;eleventy-sass&lt;/code&gt; and &lt;code&gt;eleventy-plugin-rev&lt;/code&gt; to add hashes&lt;/a&gt; to compiles CSS and javascript files. This required calling &lt;code&gt;filters.rev(cssURL)&lt;/code&gt; around URLs in my templates. Because of my changes to how I was passing filters to Pug, this stopped working. After digging around in &lt;a href=&quot;https://github.com/kentaroi/eleventy-plugin-rev/blob/main/lib/eleventy-plugin-rev.js#L88&quot;&gt;the code&lt;/a&gt; for &lt;code&gt;eleventy-plugin-rev&lt;/code&gt; for a bit, I settled on this code to solve it:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;eleventyConfig.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;addFilter&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;rev&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;, pluginRev.revvedFilePathFromOutputPath)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;which worked.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Finally, my site compiled successfully under 11ty 3.0. I’m looking forward to being able to use ESM imports to clean up my code a bit, leverage the asynchronous features for improved build performance, adding new features to my blog with the APIs that the new version makes available (Virtual Templates, included Bundler, and &lt;code&gt;page.rawInput&lt;/code&gt; seem especially intriguing), and possibly experiment with some of the new template languages (looking at you, &lt;a href=&quot;https://www.11ty.dev/docs/languages/webc/&quot;&gt;WebC&lt;/a&gt;) that are now available to me.&lt;/p&gt;
</content>
        </entry>
        <entry>
            <title>Set and Link Contras</title>
            <link href="https://chromamine.com/2024/11/set-and-link-contras/"/>
            <updated>2024-11-16T00:00:00Z</updated>
            <id>https://chromamine.com/2024/11/set-and-link-contras/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;It occurred to me recently that I don’t think there are any contra dances that feature a set and link figure. This is a figure from Scottish Country Dancing&lt;a href=&quot;https://chromamine.com/2024/11/set-and-link-contras/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt; which follows this sequence (for the purpose of this description I assume dancers are in contra dance formation becket, on the side with their partner):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Couples face the other couple across the set, taking convenient hands with their partner along the side&lt;/li&gt;
&lt;li&gt;All balance right and left (4 beats)&lt;/li&gt;
&lt;li&gt;All turn over their right shoulder as they trade places along the side of the set with the larks going through the middle and robins casting round the outside (4 beats)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It could be thought of as a petronella twirl for two or, perhaps, as a mad robin halfway with twirling. If none of those descriptions work for you, there’s also &lt;a href=&quot;https://youtu.be/hI-ebAspZzY?si=gkIDl8WmCzFc5HO4&amp;amp;t=16&quot;&gt;a video of the figure in action&lt;/a&gt;&lt;a href=&quot;https://chromamine.com/2024/11/set-and-link-contras/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Contra dance is fairly omnivorous in borrowing figures from other forms. We’ve taken “right shoulder round” and “mad robin” from English Country Dance, “pass the ocean” and “box circulate” from Modern Western Square Dance, just to name a few that I know off of the top of my head. So I figured I’d try my hand at writing a couple set and link dances, starting with a very simple move introduction:&lt;/p&gt;
&lt;div class=&quot;dance-card&quot;&gt;&lt;header class=&quot;dance-header&quot;&gt;&lt;div class=&quot;dance-title&quot;&gt;Set And Link Contra&lt;/div&gt;&lt;div class=&quot;dance-author&quot;&gt;Harris Lapiroff&lt;/div&gt;&lt;div class=&quot;dance-formation&quot;&gt;Becket CCW&lt;/div&gt;&lt;/header&gt;&lt;div class=&quot;dance-choreo&quot;&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;A1&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Set and link (trading with partner)&lt;br /&gt;Balance the ring&lt;br /&gt;Petronella twirl&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;A2&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Neighbor balance and swing&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;B1&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Set and link (trading with neighbor)&lt;br /&gt;Balance the ring&lt;br /&gt;Petronella twirl&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;B2&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Partner balance and swing&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-notes&quot;&gt;&lt;div class=&quot;dance-notes-item&quot;&gt;&lt;div class=&quot;dance-notes-label&quot;&gt;a1&lt;/div&gt;&lt;div class=&quot;dance-notes-content&quot;&gt;&lt;p&gt;Each time through after the first, the set and link should start with a &lt;em&gt;big&lt;/em&gt; balance to the right to progress to new neighbors&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;And a slightly more complex, but still accessible, one:&lt;/p&gt;
&lt;div class=&quot;dance-card&quot;&gt;&lt;header class=&quot;dance-header&quot;&gt;&lt;div class=&quot;dance-title&quot;&gt;Broken Link&lt;/div&gt;&lt;div class=&quot;dance-author&quot;&gt;Harris Lapiroff&lt;/div&gt;&lt;div class=&quot;dance-formation&quot;&gt;Duple Improper&lt;/div&gt;&lt;/header&gt;&lt;div class=&quot;dance-choreo&quot;&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;A1&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Neighbor balance and swing&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;A2&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Set and link (trading with neighbor)&lt;br /&gt;Robins alle L 1½&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;B1&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Partner right shoulder round&lt;br /&gt;Partner swing&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;B2&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Circle left 3&lt;br /&gt;Pass through up and down&lt;br /&gt;Next neighbor DSD&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-notes&quot;&gt;&lt;div class=&quot;dance-notes-item&quot;&gt;&lt;div class=&quot;dance-notes-content&quot;&gt;&lt;p&gt;Can also be done in becket by starting with B2, skipping the pass through, and changing to a slide left progression at the end.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;I danced these through with a few dancers in a living room and they worked. I was worried the “Set And Link Contra” wasn’t appropriate for any crowd, being too simple and repetitive for an experienced dance but too tricky for beginners. Some of my test dancers agreed, but others thought that it was satisfying enough to dance to work – which I could see maybe working for a late evening brain-off-dance-trance vibe.&lt;/p&gt;
&lt;p&gt;A few open questions I have about these dances:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In “Set And Link Contra,” is the &lt;em&gt;big&lt;/em&gt; balance right to progress satisfying or awkward? We didn’t have enough dancers to test the progression. A different option might be to make it Becket CW and slide &lt;em&gt;left&lt;/em&gt;, then balance back to the &lt;em&gt;right&lt;/em&gt;. (I suspect slide &lt;em&gt;right&lt;/em&gt;, balance &lt;em&gt;right&lt;/em&gt; would feel too muddy.)&lt;/li&gt;
&lt;li&gt;Balance right and left as a couple isn’t natural to contra dancers. Is there a way to lead into it that makes it more natural? (Notably: a couple of my test dancers had done at least a little Scottish and they both liked it, but one dancer who had &lt;em&gt;only&lt;/em&gt; done contra found it awkward.)&lt;/li&gt;
&lt;li&gt;Alternatively is there a different way of doing that balances that would be more at home in a contra? I think balancing together and away wouldn’t give good momentum into turning over the right shoulder, but perhaps balancing in and out in a ring would work?
&lt;div class=&quot;update&quot;&gt;
&lt;p&gt;&lt;strong&gt;2025-05-03:&lt;/strong&gt; After trying this with a larger group of dancers, people fairly universally agreed that the balance in and out felt bad for the set-and-link, particularly for the right hand dancer casting around the outside.&lt;/p&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;In “Broken Link,” I’m still not sure if the set and link into a robins left hand allemande sequence feels good. When I tested it myself it felt flowy in a weaving sort of way, but some of my test dancers reported it was awkward. We didn’t take time to workshop it to see if the flow felt better once the set and link was more familiar.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;I’ve danced it in &lt;a href=&quot;https://www.youtube.com/watch?v=BSBXrXzU7_I&quot;&gt;at least one English Country Dance&lt;/a&gt; as well, but I’m reasonably confident it originates in Scottish Country Dance and when I asked some Scottish dancers about it, one of them rustled up &lt;a href=&quot;https://my.strathspey.org/dd/formation/93/&quot;&gt;a note&lt;/a&gt; attributing it to Scottish Dance choreographer Alec Hay. &lt;a href=&quot;https://chromamine.com/2024/11/set-and-link-contras/#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;The video is to strathspey music, which is a fairly leisurely type of Scottish dance, but it can also be done in quick-time, closer to contra dance tempo. &lt;a href=&quot;https://chromamine.com/2024/11/set-and-link-contras/#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>URLs are better than handles</title>
            <link href="https://chromamine.com/2024/11/urls-are-better-than-handles/"/>
            <updated>2024-11-14T00:00:00Z</updated>
            <id>https://chromamine.com/2024/11/urls-are-better-than-handles/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;One micro-idea that occurs to me in our new era of fragmented social media is maybe we should bring back the primacy of URLs in place of social media handles.&lt;/p&gt;
&lt;p&gt;Instead of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Instagram: @harrislapiroff&lt;/strong&gt; I’ll use &lt;strong&gt;&lt;a href=&quot;https://instagram.com/harrislapiroff/&quot;&gt;instagram.com/harrislapiroff/&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bluesky: harris.social.coop.ap.brid.gy&lt;/strong&gt; I’ll use &lt;strong&gt;&lt;a href=&quot;https://bsky.app/profile/harris.social.coop.ap.brid.gy&quot;&gt;bsky.app/profile/harris.social.coop.ap.brid.gy&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mastodon: @harris@social.coop&lt;/strong&gt; I’ll use &lt;strong&gt;&lt;a href=&quot;https://social.coop/@harris&quot;&gt;social.coop/@harris&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The former in each case requires being part of the “in group” that knows what you’re talking about. You know what Instagram is. You know what Bluesky is. You know what Mastodon is. Without that knowledge, the handle is meaningless.&lt;/p&gt;
&lt;p&gt;The latter is an &lt;em&gt;invitation&lt;/em&gt;. It says: &lt;em&gt;Not sure what this thing is that I’m linking to? That’s OK – every browser in the world knows how to handle a URL. Come take a look and find out.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;URLs are more future-proof. If any of these services disappear, at least a future person will be able to use a service like the &lt;a href=&quot;https://archive.org/&quot;&gt;Internet Archive&lt;/a&gt;&lt;a href=&quot;https://chromamine.com/2024/11/urls-are-better-than-handles/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt; to see what was there – unless, of course, the service is a walled garden, in which case our hypothetical future human is no worse off.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;And&lt;/em&gt; they make &lt;a href=&quot;https://indieweb.org/&quot;&gt;IndieWeb&lt;/a&gt; websites as much a part of the social web as any other platform. If our social media profiles are just websites with URLs, then &lt;strong&gt;chromamine.com&lt;/strong&gt; fits right in too.&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;🤞🏼 for its continued existence. &lt;a href=&quot;https://chromamine.com/2024/11/urls-are-better-than-handles/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Try Mastodon</title>
            <link href="https://chromamine.com/2024/11/try-mastodon/"/>
            <updated>2024-11-13T00:00:00Z</updated>
            <id>https://chromamine.com/2024/11/try-mastodon/</id>
            <content xml:lang="en-us" type="html">&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/VS1_OMPjW7-768.webp 768w, https://chromamine.com/media/img/VS1_OMPjW7-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/VS1_OMPjW7-768.jpeg 768w, https://chromamine.com/media/img/VS1_OMPjW7-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A screenshot of joinmastodon.org featuring a cartoon mastodon looking out over space with binoculars. Text reads &amp;quot;Social networking that&#39;s not for sale.&amp;quot;&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/VS1_OMPjW7-768.jpeg&quot; width=&quot;1536&quot; height=&quot;960&quot; /&gt;&lt;/picture&gt;
&lt;p&gt;&lt;/p&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;In the wake of the 2024 U.S. election, a bunch of my friends are abandoning other corporate social media options and flocking to &lt;a href=&quot;https://bsky.app/&quot;&gt;Bluesky&lt;/a&gt;. I may as well put in a pitch for &lt;a href=&quot;https://joinmastodon.org/&quot;&gt;Mastodon&lt;/a&gt; as well.&lt;/p&gt;
&lt;p&gt;I won’t say it’s better than Bluesky. There’s things I really like about Bluesky’s approach. I find the &lt;a href=&quot;https://atproto.com/&quot;&gt;AT Protocol&lt;/a&gt; intriguing. I genuinely hope it succeeds. I’ll only say that it is still a venture capital funded product with no established business model. I’ve learned to be skeptical of those. It may be better in practice than other options, for the moment, but it’s subject to the same pressures. This may change over time – they certainly &lt;a href=&quot;https://bsky.social/about/blog/7-05-2023-business-plan&quot;&gt;express a commitment&lt;/a&gt; to doing things differently – but for the moment, that’s still theory.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://joinmastodon.org/&quot;&gt;Mastodon&lt;/a&gt; is already different. The software itself is developed by an NGO funded with donations and grants. It builds on a public protocol for social media applications called &lt;a href=&quot;https://w3c.github.io/activitypub/&quot;&gt;ActivityPub&lt;/a&gt; developed by the &lt;a href=&quot;https://www.w3.org/&quot;&gt;same standards body&lt;/a&gt; that established the foundations of the web itself (HTTP, HTML, CSS, etc.). It’s run across a variety of instances that each have their own governance and funding but interoperate with each other. It is truly decentralized and federated.&lt;/p&gt;
&lt;p&gt;Bluesky is developing a protocol to be federated similarly, but at the moment this is theory only. There is one and only one place where you can use Bluesky which, as far as I know, is one bad funding round away from disappearing forever and taking every Bluesky account with it.&lt;/p&gt;
&lt;p&gt;Mastodon is more robust. The software has multiple forks with different people maintaining them – even if the NGO disappears tomorrow (unlikely) it seems like there’s enough community energy to maintain the software for a while to come. The federated model means that one instance can disappear, even the largest one, mastodon.social, which will take with it the content of users on that instance, but leave intact the rest of the network with its millions of users.&lt;/p&gt;
&lt;p&gt;Again, I won’t say it’s better than Bluesky. It has its own issues:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;People find the decentralization thing confusing – though I think people also often overthink it. It works like email. Some people use &lt;a href=&quot;https://mail.google.com/&quot;&gt;Gmail&lt;/a&gt;, some use &lt;a href=&quot;https://protonmail.com/&quot;&gt;Proton Mail&lt;/a&gt;, some use &lt;a href=&quot;https://chromamine.com/2023/10/switching-to-fastmail/&quot;&gt;Fastmail&lt;/a&gt;, but they all work together. If you just want to get an account without thinking about it, sign up for &lt;a href=&quot;https://mastodon.social/&quot;&gt;mastodon.social&lt;/a&gt;, the mega-instance run by the NGO.&lt;/p&gt;
&lt;p&gt;If you want something more specific, &lt;a href=&quot;https://joinmastodon.org/servers&quot;&gt;do some research&lt;/a&gt; on different instances. (I use &lt;a href=&quot;https://join.social.coop/home.html&quot;&gt;social.coop&lt;/a&gt;, which is cooperatively funded and governed and I’ve had an account there for 7 years.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The culture can be occasionally off-putting. People are trying to create and enforce social rules for how social media should work. Some of them seem to resent latecomers. The culture has improved somewhat over time as more people have joined and social norms have developed more organically, but it can still take some people by surprise.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There’s fewer of us there. It’s the nature of it versus the VC- and corporate-funded options at the moment. You’re less likely to find your friends there. There’s also many fewer companies and public figures – you may find this to be a pro or a con.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Depending on what server you choose, it may be less stable. (I like and trust &lt;a href=&quot;https://join.social.coop/home.html&quot;&gt;my server&lt;/a&gt; and recommend it, but you do have to pay a small membership due. I think the flagship &lt;a href=&quot;https://mastodon.social/&quot;&gt;mastodon.social&lt;/a&gt; instance is also unlikely to disappear.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Discoverability isn’t as good – you may have to put in some effort to find people you’re interested in following.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But for a certain type of person it’s really good. I’ve found the maker (3D printing and fabricating of various kinds) community there to be surprisingly active, more than any of the other communities I’ve interacted with there. I even bought my 3D printer from someone I met on Mastodon.&lt;/p&gt;
&lt;p&gt;There’s also a strong open-source technologist presence, as you might expect. If you’re a maker, a tech nerd, or you like hanging out with such folks, you might find your people there. If you also have strong lefty political views, you’ll find those there too.&lt;/p&gt;
&lt;p&gt;It feels to me a lot like the early days of the internet – people connecting and building things in often messy ways, largely unmediated by the influence of venture capital and corporations. It’s probably not for everyone, but if that sounds fun to you, it might be worth a try.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://joinmastodon.org/&quot; class=&quot;button &quot;&gt;Join Mastodon&lt;/a&gt;&lt;/p&gt;
</content>
        </entry>
        <entry>
            <title>Get Notifications For All Card Transactions</title>
            <link href="https://chromamine.com/2024/10/get-notifications-for-all-card-transactions/"/>
            <updated>2024-10-24T00:00:00Z</updated>
            <id>https://chromamine.com/2024/10/get-notifications-for-all-card-transactions/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;One thing I think is a best practice is receiving notifications on your phone for all credit and debit card transactions. Doing so allows you to&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;see if someone billed you the wrong amount in-the-moment after a sale, and&lt;/li&gt;
&lt;li&gt;notice fraudulent transactions &lt;em&gt;immediately&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Noticing fraudulent transactions as soon as possible is of particular importance. Credit card fraud is common. Fraud liability protections in the U.S. are very friendly to consumers – a maximum of $50 liability, by federal law. Worth noting: &lt;em&gt;debit card liability protections are much less good&lt;/em&gt;. But in both cases, receiving maximum protection requires reporting the fraud to the card issuer promptly. (Read more on &lt;a href=&quot;https://www.nerdwallet.com/article/credit-cards/credit-card-vs-debit-card-safer-online-purchases&quot;&gt;NerdWallet&lt;/a&gt;, because I’m not an expert.) Regularly reviewing your bank statements is one good way to catch fraud, but I’m not as consistent at that as I am at checking my phone notifications.&lt;/p&gt;
&lt;p&gt;I’m not making so many card transactions in a day that this is particularly noisy and in practice I find it reassuring to see transactions confirmed immediately on my phone&lt;a href=&quot;https://chromamine.com/2024/10/get-notifications-for-all-card-transactions/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;. Compared to the many other notifications my phone gets in a day&lt;a href=&quot;https://chromamine.com/2024/10/get-notifications-for-all-card-transactions/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt; it’s a drop in the bucket.&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/dGyHG72Bdz-768.webp 768w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Screenshot of a phone notification reading &amp;quot;PNC Account Alert. On 10/20/24, a $306.87 cash withdrawal was deducted from PNC account from an ATM. This is greater than your alert threshold.&amp;quot;&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/dGyHG72Bdz-768.jpeg&quot; width=&quot;768&quot; height=&quot;242&quot; /&gt;&lt;/picture&gt;
&lt;p&gt;&lt;/p&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/PGWlwZ1nU--768.webp 768w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Screenshot of a phone notification reading &amp;quot;Citi Alert: Transaction Exceeds. A $160.00 transaction was made at MAGFEST USA on card ending in. View details now.&amp;quot;&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/PGWlwZ1nU--768.jpeg&quot; width=&quot;768&quot; height=&quot;213&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;By the way, you should come to &lt;a href=&quot;https://www.magfest.org/&quot;&gt;Magfest&lt;/a&gt; with me.&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;p&gt;Banks mostly don’t seem to assume app users want this, though most major banks offer it as a feature. Local ones are hit and miss. They all require a threshold, so the assumption seems to be that you only want to be notified of especially &lt;em&gt;large&lt;/em&gt; transactions. (It’s worth noting that fraud often starts with small transactions to test the viability of a stolen credit card number.) I’ve found it fiddly to enable, occasionally buggy to maintain, and the notifications can look somewhat awkward. Still, here’s how I enabled it for the four banks I use and the different cards I have under them:&lt;/p&gt;
&lt;h3&gt;Citi (credit):&lt;/h3&gt;
&lt;p&gt;From the Citi mobile app:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Profile &amp;gt; Account Alerts.&lt;/li&gt;
&lt;li&gt;Under “Spending” turn on notifications for “Transaction Amound Exceeds.” Citi allows you to receive alerts as notifications (“Push”) or SMS. Set the amount to $0.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Chase (credit)&lt;/h3&gt;
&lt;p&gt;From the Chase app:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;More &amp;gt; Security and Privacy.&lt;/li&gt;
&lt;li&gt;Under “Ways you can be more secure” there’s a button for “Activate alerts to help keep your finances safe.”&lt;/li&gt;
&lt;li&gt;Select the account you want to receive alerts for.&lt;/li&gt;
&lt;li&gt;Unfold “Single transaction above $X,” set the amount to 0.00 and check “Push notification.”&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;PNC (debit)&lt;/h3&gt;
&lt;p&gt;From the PNC app:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;≡ menu &amp;gt; Control Hub (it’s on the bottom of the screen) &amp;gt; Alerts &amp;amp; Notifications.&lt;/li&gt;
&lt;li&gt;PNC organizes notifications separately for cards vs. accounts. Under my accounts I turned on Push notifications for “Pre-authorized Payment Greater Than” [ETA: after double-checking, this one actually is email-only, but I enabled that] and “Withdrawal Greater Than.” Under my debit card I turned on alerts for “Card Transaction Greater Than.” I set the threshold to each to $1 (PNC doesn’t allow $0).&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;FNBO (credit)&lt;/h3&gt;
&lt;p&gt;FNBO doesn’t seem to offer push notifications. Guess I’ll just have to watch that card closely. They do seem to offer SMS notifications, but you have to log in to the website to turn them on, which I haven’t gotten around to yet.&lt;a href=&quot;https://chromamine.com/2024/10/get-notifications-for-all-card-transactions/#fn3&quot; class=&quot;footnote-ref&quot; id=&quot;fnref3&quot;&gt;³&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I think banks should enable these alerts by default for app users – with options to disable or add a threshold. But until that day, I recommend enabling it yourself as a security practice.&lt;/p&gt;
&lt;p&gt;It may be obvious, but I didn’t invent this idea. This is how the app for the now defunct banking startup Simple&lt;a href=&quot;https://chromamine.com/2024/10/get-notifications-for-all-card-transactions/#fn4&quot; class=&quot;footnote-ref&quot; id=&quot;fnref4&quot;&gt;⁴&lt;/a&gt; worked. Notifications were on by default and I realized how good it was for me to see transactions process live! Ironically Simple customers went through a series of acquisitions, ending up with PNC, which has a much less good app with notifications off by default.&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;This has actually been especially nice while traveling internationally, since it allows me to regularly confirm the exchange rate is roughly what I would expect. &lt;a href=&quot;https://chromamine.com/2024/10/get-notifications-for-all-card-transactions/#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;Which I would &lt;em&gt;really&lt;/em&gt; like to reduce the noise of generally, but that’s another story. &lt;a href=&quot;https://chromamine.com/2024/10/get-notifications-for-all-card-transactions/#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;I got this card immediately before embarking on a current international vacation, during which I’m not receiving SMSes anyway. &lt;a href=&quot;https://chromamine.com/2024/10/get-notifications-for-all-card-transactions/#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;A large part of Simple’s premise was that they provided &lt;em&gt;actually good&lt;/em&gt; banking software – blessedly rare, even still. &lt;a href=&quot;https://chromamine.com/2024/10/get-notifications-for-all-card-transactions/#fnref4&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Taking The Grand Taxi From Tangier To Chefchaouen</title>
            <link href="https://chromamine.com/2024/10/taking-the-grand-taxi-from-tangier-to-chefchaouen/"/>
            <updated>2024-10-20T00:00:00Z</updated>
            <id>https://chromamine.com/2024/10/taking-the-grand-taxi-from-tangier-to-chefchaouen/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;In my travels in Morocco for the past week, I’ve mostly stuck to destinations that I can reach by train and the occasional short &lt;em&gt;petit taxi&lt;/em&gt; (more on this name later) trip to get to a &lt;a href=&quot;https://en.wikipedia.org/wiki/Medina_quarter&quot;&gt;Medina&lt;/a&gt; or &lt;a href=&quot;https://en.wikipedia.org/wiki/Riad_(architecture)&quot;&gt;Riad&lt;/a&gt;. I’m not a driver (yet) and even if I were, I think I’d be fairly uncomfortable driving in Morocco. From landing in Casablanca, I travelled to Rabat and Fès – all three cities available on Morocco’s train system. In general I’ve found Morocco’s train system to be excellent, easy to use, affordable and on time, with even some modern rapid train lines &lt;a href=&quot;https://en.wikipedia.org/wiki/Al_Boraq&quot;&gt;recently added&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But for my last city visit in Morocco I wanted to go to Chefchaouen, the famously blue-painted city in the Rif Mountains. Chefchaouen is not on the train system. I opted to take a train from Casablanca up to Tangier – Morocco’s northern port city, just across the Strait of Gibralatar from Spain – and then a grand taxi southeast to Chefchaouen.&lt;/p&gt;
&lt;p&gt;For any frantic web searchers who, like me earlier this week, find themselves anxiously pacing &lt;em&gt;Gare de Tanger-Ville&lt;/em&gt; trying to figure out how to get Chefchaouen, here’s the short version of how I took a Grand Taxi from Tangier to Chefchaouen:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I flagged down a blue petit taxi at the train station and rode it the bus station where I could pick up a grand taxi. I wasn’t sure how to find this bus station, but I asked the taxi driver to take me to the “bus station for grand taxis” and he knew where to go. Looking back over my trip, Google Maps lists this location as “&lt;a href=&quot;https://maps.app.goo.gl/cjW7CiEtAR3Zocwy8&quot;&gt;Parc Autasa&lt;/a&gt;”. He asked me for 30 dirham for the ride (a little over $3 at the exchange rates I’ve been getting – the ~10dh = 1USD conversion makes things very easy). I only had a 50dh note, so I let him keep it as a tip.&lt;a href=&quot;https://chromamine.com/2024/10/taking-the-grand-taxi-from-tangier-to-chefchaouen/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;At the lot where he dropped me, there appeared to be a man in the middle of the lot coordinating taxis. I walked up to him and said, “Chaouen?”&lt;a href=&quot;https://chromamine.com/2024/10/taking-the-grand-taxi-from-tangier-to-chefchaouen/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt; He took me to an empty van where he spoke to the driver and gestured me get in.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;
&lt;p&gt;I waited for 5 more passengers to arrive, also going to Chefchaoeun. It took 20 or 30m. Not insubstantial, but less than I feared. Before we left, the guy in charge asked us each for 70 dirham (~$7).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I rode the 2 hours to Chefchaouen with a stop at a gas station in the middle to use the toilet. For an extra 30 dirham (~$3) the driver took me right up to the medina where I was staying.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The more detailed version is this:&lt;/p&gt;
&lt;p&gt;Morocco has two types of taxi: &lt;em&gt;petit taxi&lt;/em&gt;, your standard private for-hire point-to-point taxi for service within a city, much like we have in the U.S., and &lt;em&gt;grand taxi&lt;/em&gt;, a minivan that typically carries six passengers who are not necessarily of any relation to each other to a shared destination at a much reduced cost. Grand taxis can leave city areas and even go some long distances.&lt;/p&gt;
&lt;p&gt;I had read a fair bit about the grand taxi system but the descriptions of it in my guidebook, travel blogs, and travel forums didn’t provide me with quite enough guidance to know exactly how to go about taking one. To add to the challenge, I’d been relying on English and the little bit of French I had from high school to get by in the other cities—but I discovered that in the far north of Morocco people spoke mostly Spanish. Unfortunately for myself (and everyone I interacted with) my Arabic is non-existent and my Spanish is worse than my already pretty bad French.&lt;/p&gt;
&lt;p&gt;Fortunately I left myself all day to figure travel out and it didn’t take me more than 40 minutes or so to get on the right track. The first thing I had tried, I think somewhat reasonably, was the grand taxi lot visible in front of Gare de Tanger-Ville (the train station) where the dispatcher in a flourescent vest gestured me to get in a taxi and quoted me 700dh (~$70), 10x the amount I expected to pay. “Oh, not a shared taxi?” I said. “No shared taxi. You take that taxi to bus station,” he replied, gesturing to a blue petit taxi.&lt;/p&gt;
&lt;p&gt;I basically understood from this that I had to take a petit taxi to a bus station where I could pick up a… bus? Grand taxi? But I felt uncertain and anxious so I went back into the train station to breathe and search the internet for advice. I found a number of forum posts and travel blogs that described taking grand taxis to Chefchaouen, some even describing taking a petit taxi to a bus station, though with inconsistent information about where. I couldn’t fully piece it together, so I decided to, successfully, throw myself at the mercy of a petit taxi driver to take me to the right place.&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/9vMHHbcScy-768.webp 768w, https://chromamine.com/media/img/9vMHHbcScy-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/9vMHHbcScy-768.jpeg 768w, https://chromamine.com/media/img/9vMHHbcScy-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A parking lot full of beige minivans.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/9vMHHbcScy-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;Parked grand taxis at &lt;em&gt;Park Autasa&lt;/em&gt;&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;p&gt;All in all the trip from Gare de Tanger-Ville to Chefchaouen Medina took me ~2h40 (counting the time I spent figuring out how to do it and anxiously searching the internet for advice) and cost me $15 including tips. I was glad to have the experience taking another local form of transit, grateful for the easy assistance of locals and, if I’m honest, a little proud of myself for figuring out how to do it!&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/yqsnOjyYcj-768.webp 768w, https://chromamine.com/media/img/yqsnOjyYcj-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/yqsnOjyYcj-768.jpeg 768w, https://chromamine.com/media/img/yqsnOjyYcj-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A body of water with green hills behind it, as seen from a freeway. The sky is blue with fluffy cumulus clouds.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/yqsnOjyYcj-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;View along the journey to Chefchaouen&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;p&gt;I was also somewhat glad to be traveling this part of my trip solo. The previous legs of my travel I was with &lt;a href=&quot;https://emmaazelborn.com/&quot;&gt;Emma&lt;/a&gt; and was fairly dilligent about ensuring our travels were planned completely end-to-end. Figuring it out on the fly worked well for me here, but I think would have been even more stressful if I had been worrying about the comfort and stress of another person.&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/wqd2pvtyyp-768.webp 768w, https://chromamine.com/media/img/wqd2pvtyyp-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/wqd2pvtyyp-768.jpeg 768w, https://chromamine.com/media/img/wqd2pvtyyp-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Distant view of a Moroccan town nestled into a green mountainside on a sunny day. The town’s buildings are painted varying shades of blue or beige with red roofs.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/wqd2pvtyyp-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1024&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;Chefchaouen, seen from a nearby hill.&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;p&gt;I am less certain of my ability to get a grand taxi &lt;em&gt;back&lt;/em&gt; from Chaouen to Tangier and am on a tighter timeline (flight to catch) so I’ve booked a bus for tomorrow back to Tangier. It’s slightly cheaper at 65dh rather than 70dh, but about an hour longer journey involving a transfer in Tetouan.&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Taxis in Morocco famously overcharge tourists. I have no idea if this was an overcharge, but ~$3 seemed like a very good price to me, so I didn’t put any effort into figuring it out. &lt;a href=&quot;https://chromamine.com/2024/10/taking-the-grand-taxi-from-tangier-to-chefchaouen/#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;The city was originally called &lt;em&gt;Chaouen&lt;/em&gt; from the Arabic for “peaks” and was later named &lt;em&gt;Chefchaouen&lt;/em&gt;, roughly, “look at the peaks” – but locals refer to it by either name. &lt;a href=&quot;https://chromamine.com/2024/10/taking-the-grand-taxi-from-tangier-to-chefchaouen/#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>You can use Web Components without the shadow DOM</title>
            <link href="https://chromamine.com/2024/10/you-can-use-web-components-without-the-shadow-dom/"/>
            <updated>2024-10-05T00:00:00Z</updated>
            <id>https://chromamine.com/2024/10/you-can-use-web-components-without-the-shadow-dom/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;I’ve been hearing a lot lately about &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Web_components&quot;&gt;Web Components&lt;/a&gt;, a set of fairly recent web technologies seemingly poised to replace some of the role frameworks like React have filled for much of the past decade. As far as I can tell React and Web Components have overlap on solving this problem:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create fragments of web UIs that can be reused across a project or multiple projects.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;React also covers a couple other problems that Web Components do not – as far as I know – so Web Components are not a full-replacement, nor is using React and Web Components mutually exclusive. In particular React also:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Provides a framework for managing state data for components.&lt;/li&gt;
&lt;li&gt;Handles rendering and updating the DOM as required by state changes.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This week I took my first dive into building a project with Web Components&lt;a href=&quot;https://chromamine.com/2024/10/you-can-use-web-components-without-the-shadow-dom/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt; and have some newly informed thoughts about them. As mentioned in the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Web_components&quot;&gt;Mozilla overview&lt;/a&gt;, Web Components consist primarily of these three technologies: Custom Elements, the Shadow DOM, and HTML Templates.&lt;/p&gt;
&lt;p&gt;I really enjoyed using the Custom Elements API, but I admit to being bewildered by the Shadow DOM. It seems to be primarily a way to isolate my component, styles and all, from the rest of the website.&lt;/p&gt;
&lt;p&gt;I imagine this is great for building component library to be used by many people across different sites, but for adding interactivity to one site, I &lt;em&gt;want&lt;/em&gt; my components to share styles! My sites should feature consistent typography and colors. A button is a button anywhere.&lt;/p&gt;
&lt;p&gt;At first I thought, maybe I wasn’t getting it. If I’m using the Custom Elements API without the other pieces, am I just replacing the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Document/DOMContentLoaded_event&quot;&gt;DOMContentLoaded&lt;/a&gt; pattern with a different bit of syntactic sugar? Maybe Web Components weren’t what I was looking for.&lt;/p&gt;
&lt;p&gt;But when I searched around, I felt validated to discover a number of &lt;a href=&quot;https://frontendmasters.com/blog/light-dom-only/&quot;&gt;other frontend developers having the same experience&lt;/a&gt; I was, including several whose work I’ve followed for many years&lt;a href=&quot;https://chromamine.com/2024/10/you-can-use-web-components-without-the-shadow-dom/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt;! Like me, these developers were delighted by the custom elements API, but unpersuaded by the shadow DOM. They build their web components using what they call the “light DOM” just the same old DOM that’s always there.&lt;/p&gt;
&lt;p&gt;So what are the advantages of the Custom Elements API if you’re not going to use the Shadow DOM alongside it? I identified a few in my work:&lt;/p&gt;
&lt;h3&gt;1. Obvious Markup&lt;/h3&gt;
&lt;p&gt;In the past I relied on special class name patterns to indicate that an element was javascript enhanced. For example the HTML for a carousel might look like this, with &lt;code&gt;js-carousel&lt;/code&gt; being a class used by javascript to identify elements on the page to add functionality to:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;carousel js-carousel&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;img&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; src&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;...&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;img&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; src&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;...&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;img&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; src&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;...&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With Custom Elements, I could instead write:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;homepage-carousel&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;img&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; src&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;...&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;img&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; src&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;...&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;img&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; src&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;...&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;homepage-carousel&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Because Web Components &lt;em&gt;must&lt;/em&gt; have hyphens and native HTML elements &lt;em&gt;must&lt;/em&gt; not, it’s immediately obvious from the markup that this is a javascript enhanced object. No hunting for the CSS class and hoping I and my collaborators were consistent about our naming conventions. No removing a class thinking it wasn’t used by CSS anywhere, only to discover it &lt;em&gt;was&lt;/em&gt; used by javascript.&lt;/p&gt;
&lt;h3&gt;2. Instantiation is More Consistent&lt;/h3&gt;
&lt;p&gt;The old way of ensuring javascript interactivity got added to an element looked like this:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt; initCarousel&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;el&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;  // ... do some stuff&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;document.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&#39;DOMContentLoaded&#39;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;  document.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&#39;.js-carousel&#39;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;forEach&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(initCarousel);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Essentially saying: when the document has fully loaded (minus, perhaps, styles and other assets) run this function on every element with the class &lt;code&gt;js-carousel&lt;/code&gt; on the page. If you’re an object-oriented programmer, perhaps:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#FFA657&quot;&gt; Carousel&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;  constructor&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;el&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;    // ... do some stuff&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;document.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&#39;DOMContentLoaded&#39;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;  document.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&#39;.js-carousel&#39;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;forEach&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;el&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; =&gt;&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt; Carousel&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(el));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With the Custom Elements API it looks like this:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#FFA657&quot;&gt; HomepageCarousel&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; extends&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; HTMLElement&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;  connectedCallback&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;    // ... do some stuff&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;customElements.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;define&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&#39;homepage-carousel&#39;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;, HomepageCarousel);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In some places it’s a little wordier, but I think it’s clearer what’s happening. And it comes with one other advantage: Where the previous methods only worked if the carousel was present on the page when it first loaded – and you had to add additional javascript if you were going to add elements dynamically – the new method works immediately for elements that are added to the page (i.e., “connected”) at any time.&lt;/p&gt;
&lt;h3&gt;3. They’re Progressive Enhancement Friendly&lt;/h3&gt;
&lt;p&gt;The HTML inside a custom element renders as normal HTML, even if javascript never loads. This makes it straightforward to build a custom element with default HTML that might make sense in a no javascript context. For example a carousel element might look like this:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;homepage-carousel&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;img&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; src&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;...&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;img&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; src&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;...&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;img&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; src&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;...&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;homepage-carousel&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Without any javascript, all three images will render in sequence, a reasonable alternative for a carousel that preserves the complete information for any robots or humans browsing the site with javascript off.&lt;/p&gt;
&lt;p&gt;Then, in the javascript definition, I can add code that will hide two images, show one, and rotate through them.&lt;/p&gt;
&lt;p&gt;This is a contrast to the common React Single Page App model where the entire site is typically owned by React and if React and javascript fail to load, the site does not function.&lt;/p&gt;
&lt;h3&gt;4. Other Advantages?&lt;/h3&gt;
&lt;p&gt;Though I didn’t get to explore them thoroughly, I suspect there’s a few other advantages as well, even without the Shadow DOM. For example the lifecycle methods that come with custom elements seem useful for managing code that should run when elements are removed or, especially, when their attributes are updated.&lt;/p&gt;
&lt;p&gt;One thing that wasn’t clear to me is to what extent I should rely on attributes for state management. For example, would it make sense to have HTML that looks like this:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;homepage-carousel&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; autoplay&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; slide&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;0&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;img&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; src&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;...&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;img&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; src&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;...&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;img&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; src&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;...&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;homepage-carousel&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And then an &lt;code&gt;attributeChangedCallback&lt;/code&gt; that would respond to changes by enabling or disabling autoplay or moving to a different slide? As well as a number of internal event handlers responsible for changing those attributes?&lt;/p&gt;
&lt;h3&gt;What about &lt;code&gt;&amp;lt;template&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;slot&amp;gt;&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;One annoyance with Web Components is that it doesn’t seem possible to use &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_templates_and_slots&quot;&gt;&lt;code&gt;&amp;lt;template&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;slot&amp;gt;&lt;/code&gt;&lt;/a&gt; usefully without the Shadow DOM. I would love an option to use a browser-native template engine while still working with elements up here in the light DOM!&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;I was partially inspired by &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt;’s recent inclusion of &lt;a href=&quot;https://www.11ty.dev/docs/languages/webc/&quot;&gt;WebC&lt;/a&gt;, a template language based on Web Components. Though I wasn’t experimenting specifically with WebC this week, it’s likely that I’ll switch to it the next time I overhaul my site templates – which can’t be too far off given the web designer itch to regularly redesign. &lt;a href=&quot;https://chromamine.com/2024/10/you-can-use-web-components-without-the-shadow-dom/#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;&lt;a href=&quot;https://adactio.com/journal/20618&quot;&gt;Jeremy Keith&lt;/a&gt; and &lt;a href=&quot;https://meyerweb.com/eric/thoughts/2023/11/01/blinded-by-the-light-dom/&quot;&gt;Eric Meyer&lt;/a&gt; in particular were influential for me when I was a blossoming wee high school web developer. &lt;a href=&quot;https://chromamine.com/2024/10/you-can-use-web-components-without-the-shadow-dom/#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>L&#39;Shana Tova</title>
            <link href="https://chromamine.com/2024/10/lshana-tova/"/>
            <updated>2024-10-02T00:00:00Z</updated>
            <id>https://chromamine.com/2024/10/lshana-tova/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;I am trying, today, Rosh Hashanah, to think about the sweetness of the new year.&lt;/p&gt;
&lt;p&gt;All I can think of is the bombs being dropped far away, funded by my taxes, exploded in my name.&lt;/p&gt;
&lt;p&gt;It feels unfair that Israel should be able to take this from me. I don’t want my celebration of Jewish holidays to be predicated on what Israel is doing. I often say that my Judaism has nothing to do to Israel. My ancestors were Jewish long before the modern state of Israel existed. I’ve seen no evidence they ever lived on the land that Israel claims is my homeland. Frankly, I would be Jewish even if the state of Israel did not exist. Nor do I feel any safer because it does exist. So what right does it have to invade my thoughts on this day, to mar a celebration of renewal with cities ground down to rubble and the bloodied bodies of Arab children?&lt;/p&gt;
&lt;p&gt;But here I am, unable to think of much else.&lt;/p&gt;
&lt;p&gt;I will do what I can to make the world sweet. May the next year be sweeter than the last, for all of us.&lt;/p&gt;
&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/NXZWIOwfLf-768.webp 768w, https://chromamine.com/media/img/NXZWIOwfLf-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/NXZWIOwfLf-768.jpeg 768w, https://chromamine.com/media/img/NXZWIOwfLf-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A close up of a hand holding a slice of red apple with pink tinged flesh. The slice is dripping from one end with honey over a small glass bowl full of honey.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/NXZWIOwfLf-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;At least I’ve got a &lt;em&gt;gorgeous&lt;/em&gt; pink-fleshed apple.&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
</content>
        </entry>
        <entry>
            <title>Making blog post source files available with 11ty</title>
            <link href="https://chromamine.com/2024/08/making-blog-post-source-files-available-with-11ty/"/>
            <updated>2024-08-31T00:00:00Z</updated>
            <id>https://chromamine.com/2024/08/making-blog-post-source-files-available-with-11ty/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;You can now view the source file for any blog post on my site by replacing the trailing slash with &lt;code&gt;.txt&lt;/code&gt; in the URL. For example, the source file for this post is available &lt;a href=&quot;https://chromamine.com/2024/08/making-blog-post-source-files-available-with-11ty.txt&quot;&gt;here&lt;/a&gt;. You can also replace the trailing slash with the original file extension of the source. Most of my blog posts are composed in Markdown, so the extension will usually be &lt;code&gt;.md&lt;/code&gt;, but my setup also supports the occasional &lt;code&gt;.ojs&lt;/code&gt; (for &lt;a href=&quot;https://chromamine.com/2023/11/11ty-and-observable/&quot;&gt;Observable notebooks&lt;/a&gt;) or &lt;code&gt;.html&lt;/code&gt; post. But &lt;code&gt;.txt&lt;/code&gt; will always work.&lt;/p&gt;
&lt;p&gt;I really like the idea of source code being available for my posts, as a resource for curious readers &lt;em&gt;and&lt;/em&gt; to have a permanent link to it to which I can refer (as in the self-referential paragraph above). Of course, the source for my entire blog setup, including all posts, is &lt;a href=&quot;https://github.com/harrislapiroff/chromamine.com&quot;&gt;available on GitHub&lt;/a&gt;. But replicating the source on my own domain fulfills the &lt;a href=&quot;https://indieweb.org/principles&quot;&gt;IndieWeb principles&lt;/a&gt; of “own your data” and building for “longevity.”&lt;/p&gt;
&lt;p&gt;I also like the idea that someone could use the source files in some automated way, since they can be easily derived from post URLs. Of course, the most likely person to have a use for them will be me.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;This wasn’t an entirely trivial feat to accomplish in Eleventy. Eleventy largely assumes that one source file generates one output file and I’ve found it challenging to compel it otherwise&lt;a href=&quot;https://chromamine.com/2024/08/making-blog-post-source-files-available-with-11ty/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I would love if I could provide Eleventy with multiple templates and multiple output formats for each input file. Imagine writing a blog post and generating the HTML page, a plain text file, a PDF, etc. If you like this idea too, please upvote &lt;a href=&quot;https://github.com/11ty/eleventy/issues/2205&quot;&gt;this issue on GitHub&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;But until that’s supported, I was able to hack together a solution using the &lt;code&gt;eleventy.after&lt;/code&gt; event to trigger a function that copied the source files to the correct locations.&lt;/p&gt;
&lt;p&gt;The overall process is that it&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;grabs the results of Eleventy’s compilation,&lt;/li&gt;
&lt;li&gt;narrows it down to just blog posts,&lt;/li&gt;
&lt;li&gt;uses the input and output path of each blog post to calculate the appropriate output paths for the source code to be served on the site (e.g., mapping &lt;code&gt;./src/posts/making-blog-post-source-files-available-with-11ty.md&lt;/code&gt; to both &lt;code&gt;_site/posts/2024/08/making-blog-post-source-files-available-with-11ty.md&lt;/code&gt; and &lt;code&gt;making-blog-post-source-files-available-with-11ty.txt&lt;/code&gt;),&lt;/li&gt;
&lt;li&gt;and copies the source code for each blog appropriately.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Step by step explanations included in comments.&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;// eleventy.config.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;// ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; fs&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt; require&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;fs&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;).promises&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;// Note: For the upgrade to 11ty 3.x we will want to replace this&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;// with 11ty&#39;s built-in glob util seen here:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;// https://github.com/11ty/eleventy/blob/36e868294a668ea38748cb6d838fd371ae8ff09d/src/TemplateCollection.js#L5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; multimatch&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt; require&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;multimatch&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; blogPostFormats&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&#39;md&#39;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&#39;ojs&#39;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&#39;html&#39;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;// Any file in the posts directory with a blog post format extension&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; blogPostGlobs&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; blogPostFormats.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;format&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt; `./src/posts/*.${&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;format&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;}`&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;module&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;exports&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;eleventyConfig&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;    // ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;    /* Copy raw source files to site&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;    * -------------------------------------*/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    eleventyConfig.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&#39;eleventy.after&#39;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; ({ &lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;dir&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;results&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;runMode&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;outputMode&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; }) &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;        // Match only blog post pages&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;        const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; blogPosts&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; results.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;filter&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;r&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; =&gt;&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt; multimatch&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;([r.inputPath], blogPostGlobs).&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;        // Calculate a map from input source file to appropriate output locations&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;        const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; sourceFileInputOutputMap&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; blogPosts.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(({ &lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;inputPath&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;outputPath&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; }) &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;            const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; extension&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; inputPath.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;split&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&#39;.&#39;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;pop&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;            // Pop the trailing /index.html off the output path and add the extension&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;            const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; sourceOutputPath&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; outputPath.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&#39;/index.html&#39;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;`.${&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;extension&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;}`&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;            // We additionally copy the source with just a .txt extension so there&#39;s a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;            // predictable URL it can be found at.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;            // TODO: It would be nicer, at some point, to add this to the _redirects file&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;            // instead so the server can smoothly handle a redirect to the correct extension&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;            const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; txtSourceOutputPath&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; sourceOutputPath.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;`.${&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;extension&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;}`&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&#39;.txt&#39;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;            return&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;                [ inputPath, sourceOutputPath ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;                [ inputPath, txtSourceOutputPath ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;            ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        }).&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;flat&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;        // Make copies from each source file to the output path&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        console.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;[11ty] Copying source files to output directory...&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;        await&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; Promise&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;all&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(sourceFileInputOutputMap.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;            ([ &lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;src&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#E36209;--shiki-dark:#FFA657&quot;&gt;dest&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; ]) &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;                console.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;`[11ty] Copying ${&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;src&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;} to ${&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;dest&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;}`&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;                return&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; fs.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;copyFile&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(src, dest)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        ))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        console.&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;[11ty] Finished copying source files to output directory&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;    // ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;The one exception I’ve found is its &lt;a href=&quot;https://www.11ty.dev/docs/pagination/&quot;&gt;pagination feature&lt;/a&gt;, which I have used to hack together, e.g., individual pages for &lt;a href=&quot;https://chromamine.com/archive/&quot;&gt;each tag&lt;/a&gt;, using only a &lt;a href=&quot;https://github.com/harrislapiroff/chromamine.com/blob/main/src/tags.pug&quot;&gt;single template file&lt;/a&gt;. &lt;a href=&quot;https://chromamine.com/2024/08/making-blog-post-source-files-available-with-11ty/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Resurrecting My Flickr Account</title>
            <link href="https://chromamine.com/2024/08/resurrecting-my-flickr-account/"/>
            <updated>2024-08-30T00:00:00Z</updated>
            <id>https://chromamine.com/2024/08/resurrecting-my-flickr-account/</id>
            <content xml:lang="en-us" type="html">&lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/F5eXBL-mgZ-768.webp 768w, https://chromamine.com/media/img/F5eXBL-mgZ-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/F5eXBL-mgZ-768.jpeg 768w, https://chromamine.com/media/img/F5eXBL-mgZ-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A screenshot of Harris&#39;s Flickr profile page showing a banner with his personal information and a grid of photos below.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/F5eXBL-mgZ-768.jpeg&quot; width=&quot;1536&quot; height=&quot;960&quot; /&gt;&lt;/picture&gt;
&lt;p&gt;&lt;/p&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Now that I’m &lt;a href=&quot;https://chromamine.com/2024/08/some-favorite-d70-shots-spring-2024/&quot;&gt;taking more photos&lt;/a&gt; again, I’ve resurrected my Flickr account to share them! I considered a number of options for sharing my photos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I quickly decided to avoid the tech behemoths Meta and Google.&lt;a href=&quot;https://chromamine.com/2024/08/resurrecting-my-flickr-account/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;That avoidance notwithstanding, my existing Instagram account wouldn’t work anyway since I &lt;em&gt;do&lt;/em&gt; share the occasional photo there, but it’s not the right place for sharing or perusing large albums, e.g., 171 photos from a week at camp.&lt;/li&gt;
&lt;li&gt;A number of people made good suggestions to me &lt;a href=&quot;https://social.coop/@harris/112984433487388983&quot;&gt;on Mastodon&lt;/a&gt; including &lt;a href=&quot;https://immich.app/&quot;&gt;Immich&lt;/a&gt; and &lt;a href=&quot;https://ente.io/&quot;&gt;Ente&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;I considered and even got partway into building photo gallery sharing functionality into this website (powered by &lt;a href=&quot;https://chromamine.com/2023/10/eleventy/&quot;&gt;11ty&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ultimately I went with Flickr because it was the quickest option I was considering that wasn’t owned by Meta/Google. I also really like that it’s been around for 20 years with almost unchanged functionality. In particular I like that &lt;em&gt;I’ve&lt;/em&gt; had an account with them since I was in high school 20 years ago. It’s minor, but there’s a little bit of satisfaction I get from seeing the “Joined 2005” bug on my profile.&lt;a href=&quot;https://chromamine.com/2024/08/resurrecting-my-flickr-account/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It feels like a service that launched with a guiding star that it never lost, even through multiple acquisitions, and speaks well to its stability; it feels uncommonly rare to encounter social media platforms that aren’t trying to consume the world and like something I want to support. They even have a &lt;a href=&quot;https://www.flickr.org/&quot;&gt;foundation devoted to maintaining the Flickr archive long term&lt;/a&gt;, which is incredibly cool.&lt;/p&gt;
&lt;p&gt;It’s not all sunshine and daisies, unfortunately. The website feels like it still follows a lot of Web 2.0 design patterns from years ago. Settings that I’m looking for aren’t always where I expect them – or sometimes they don’t exist at all. The mobile app is fairly buggy and I’ve had to put some work into figuring out an upload flow that doesn’t cause the app to crash midway through. But, for the moment, these are issues I’m willing to tolerate.&lt;/p&gt;
&lt;p&gt;Also, in the style of Web 2.0 apps and in contrast to the walled gardens that dominate the web today, it has a &lt;a href=&quot;https://www.flickr.com/services/developer&quot;&gt;robust developer API&lt;/a&gt;, so I have the option to write more tools for myself when I want them.&lt;/p&gt;
&lt;p&gt;It’s possible I’ll find that Flickr is insufficiently maintained for my needs or I’ll find the time to set up a more exciting &lt;a href=&quot;https://indieweb.org/&quot;&gt;Indieweb&lt;/a&gt; or &lt;a href=&quot;https://fediverse.party/en/fediverse/&quot;&gt;Fediverse&lt;/a&gt; alternative and expatriate my photos there, but for now I’m excited to have a place to share my photos again. Check out my photos on Flickr. I’ve uploaded a bunch of albums from my spring and summer touring and going to Pinewoods dance camps and I’ll be processing and adding more soon.&lt;/p&gt;
&lt;p&gt;If you have a Flickr account yourself, follow me or let me know – I’m looking for more active people to follow!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.flickr.com/photos/chromamine/&quot; class=&quot;button &quot;&gt;Harris’s Flickr&lt;/a&gt;&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;This isn’t a hard line for me in general. I use plenty of Meta/Google products, including Instagram, but I like to find other options when I can and, especially since I expect to share a lot of photos of a lot of people who have a variety of feelings about sharing their likeness with the data-hungry monsters, I thought it was worth looking for alternatives here. &lt;a href=&quot;https://chromamine.com/2024/08/resurrecting-my-flickr-account/#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;Though I did set the privacy to &lt;em&gt;only me&lt;/em&gt; for all of my older photos. Perhaps I’ll republish them someday, but for the moment it felt weird to have the historical version of me so prominently reflected by my photostream. &lt;a href=&quot;https://chromamine.com/2024/08/resurrecting-my-flickr-account/#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Some Favorite D70 Shots Spring 2024</title>
            <link href="https://chromamine.com/2024/08/some-favorite-d70-shots-spring-2024/"/>
            <updated>2024-08-25T00:00:00Z</updated>
            <id>https://chromamine.com/2024/08/some-favorite-d70-shots-spring-2024/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;Over the spring and into the summer of this year, I took lots of photos with a Nikon D70. When I &lt;a href=&quot;http://localhost:8080/2024/04/shooting-with-a-nikon-d70-in-the-smartphone-age/&quot;&gt;wrote about this in April&lt;/a&gt; I was trying to decide&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;if I could take better photos with the D70 than I could with my smartphone, and&lt;/li&gt;
&lt;li&gt;if I was interested enough in photography to invest more deeply in it as a hobby.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Over the course of the spring and summer, my skill with the camera improved somewhat and I became more confident that, in favorable circumstances (outdoor light, scenarios where focusing wasn’t too fussy, etc.) I could indeed take better photos with my D70. I found that I most enjoyed taking photos of people, especially family and friends. These were the most fun and meaningful for me and they were subjects of whom I couldn’t just search the internet for photos – unlike, e.g., the St. Louis Arch, where I could take some nice photos, but they would be photos many people had taken before.&lt;/p&gt;
&lt;p&gt;I’ve decided I like taking pictures. I wasn’t prepared to buy a brand new camera which would cost over $1,000 at this point, but I invested in a used Nikon D750 – upgrading from a camera that’s twenty years old to one that’s a mere ten years old. Despite its age, it’s still well-regarded, and I can use the lenses I already have rather than investing in new ones&lt;a href=&quot;https://chromamine.com/2024/08/some-favorite-d70-shots-spring-2024/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;. It also features a full-frame sensor, which I understand is better for low-light scenes – one of my major beefs with the D70.&lt;/p&gt;
&lt;p&gt;Sometime soon I’ll be setting up a place where I can share more of the photos from my D70 as well as the new photos from my D750. Until then, here’s a few of my favorites from the D70. In looking back over them I can see the limitations both of the camera and my skill. Focus is fuzzy in places, some are poorly exposed, poorly composed, or grainy. Nevertheless, I like each of these photos for one reason or another.&lt;/p&gt;
  &lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/HdpjkIsZR8-768.webp 768w, https://chromamine.com/media/img/HdpjkIsZR8-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/HdpjkIsZR8-768.jpeg 768w, https://chromamine.com/media/img/HdpjkIsZR8-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A close up of a 30-something white man wearing round orange sunglasses, a dark puffy jacket, and a cap with the brim tilted upward. He&#39;s smiling and his tongue is sticking out slightly, cheekily. In his sunglasses the reflection of the photographer can be seen, with a camera obscuring his face.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/HdpjkIsZR8-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2310&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;John, Oberlin OH, April 2024&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/n63FkoeKfD-768.webp 768w, https://chromamine.com/media/img/n63FkoeKfD-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/n63FkoeKfD-768.jpeg 768w, https://chromamine.com/media/img/n63FkoeKfD-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Close up portrait of a 30-something white man taken from slightly below. Behind him the sky is blue. A shadow crosses his blue knit sweater dramatically.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/n63FkoeKfD-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2310&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;Matthew, Oberlin OH, April 2024&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/xKaRquPa5--768.webp 768w, https://chromamine.com/media/img/xKaRquPa5--1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/xKaRquPa5--768.jpeg 768w, https://chromamine.com/media/img/xKaRquPa5--1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A crowd of people holding strands of colored ribbon attached to something high up off to the left of the frame. In the center of the frame a blonde woman in a colorful floral dress and purple jacket holds a green ribbon.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/xKaRquPa5--768.jpeg&quot; width=&quot;1536&quot; height=&quot;2310&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;Emma and the maypole on May Day, Boston, May 2024&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/9xLBNzUsVH-768.webp 768w, https://chromamine.com/media/img/9xLBNzUsVH-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/9xLBNzUsVH-768.jpeg 768w, https://chromamine.com/media/img/9xLBNzUsVH-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A close up a wooden board with dark circles engraved on it in a grid pattern. There are colorful plastic tokens on it labeled things like &amp;quot;L3,&amp;quot; &amp;quot;R3,&amp;quot; &amp;quot;L2,&amp;quot; and &amp;quot;R2.&amp;quot; The focus is very shallow. There&#39;s an index card with writing in the background but it&#39;s too blurry to make out.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/9xLBNzUsVH-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2310&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;Working through some contra choreography on Amtrak, May 2024&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/kv8x6fmtwk-768.webp 768w, https://chromamine.com/media/img/kv8x6fmtwk-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/kv8x6fmtwk-768.jpeg 768w, https://chromamine.com/media/img/kv8x6fmtwk-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;An older white man wearing a newsy cap, white and brown fleece, and black puffy jacket. He&#39;s looking directly at the camera with a neutral expression on his face. The background looks like a subway train.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/kv8x6fmtwk-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2310&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;Dad, NYC Subway, May 2024&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/PxVXf0C-Lw-768.webp 768w, https://chromamine.com/media/img/PxVXf0C-Lw-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/PxVXf0C-Lw-768.jpeg 768w, https://chromamine.com/media/img/PxVXf0C-Lw-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;An older white woman with red hair and an older white man, side by side, with their heads inclined together. They&#39;re posing for the camera and smiling slightly.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/PxVXf0C-Lw-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1021&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;Dad and Aunt Holly, NYC, May 2024&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/HaRuOe4mXN-768.webp 768w, https://chromamine.com/media/img/HaRuOe4mXN-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/HaRuOe4mXN-768.jpeg 768w, https://chromamine.com/media/img/HaRuOe4mXN-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;An older white woman with folded paper crane earings, a dark gray cardigan, and a red floral shirt. She&#39;s looking off to the right and smiling.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/HaRuOe4mXN-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1021&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;Aunt Holly, NYC, May 2024&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/_Sair1CFK--768.webp 768w, https://chromamine.com/media/img/_Sair1CFK--1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/_Sair1CFK--768.jpeg 768w, https://chromamine.com/media/img/_Sair1CFK--1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A green sky with white dotty stars hovers over the silhouette of the roof of a house and a couple trees. In the green sky some shimmering striations are vaguely visible.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/_Sair1CFK--768.jpeg&quot; width=&quot;1536&quot; height=&quot;1021&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;Aurora Borealis outside my window, Somerville MA, May 2024&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/wyWz46V33t-768.webp 768w, https://chromamine.com/media/img/wyWz46V33t-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/wyWz46V33t-768.jpeg 768w, https://chromamine.com/media/img/wyWz46V33t-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A smiling brunette white woman with glasses in her early 30s holding a small grinning blonde child who has only two lower teeth in the center of her mouth. The woman is putting a blue shoe on the child. Behind them is the blue and brown structure of a playground.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/wyWz46V33t-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2310&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;Ruthie and Josephine on Mother’s Day, Boston MA, May 2024&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/KkBV8A8SnE-768.webp 768w, https://chromamine.com/media/img/KkBV8A8SnE-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/KkBV8A8SnE-768.jpeg 768w, https://chromamine.com/media/img/KkBV8A8SnE-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A small blonde child with a focused expression on her face crawling between two wide-spaced blue fences. In the background, behind the fence, is her mother, a smiling brunette woman looking at the camera.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/KkBV8A8SnE-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2310&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;Ruthie and Josephine on Mother’s Day, Boston MA, May 2024&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/TQgrGZESfz-768.webp 768w, https://chromamine.com/media/img/TQgrGZESfz-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/TQgrGZESfz-768.jpeg 768w, https://chromamine.com/media/img/TQgrGZESfz-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A small blonde child is crawling through a light brown play structure tunnel toward the camera. She&#39;s grinning and excited. Behind her, out of focus, her mother is reaching toward her and smiling.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/TQgrGZESfz-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2310&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;Ruthie and Josephine on Mother’s Day, Boston MA, May 2024&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/aOiL34eW1I-768.webp 768w, https://chromamine.com/media/img/aOiL34eW1I-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/aOiL34eW1I-768.jpeg 768w, https://chromamine.com/media/img/aOiL34eW1I-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A white bearded man is morris dancing in kit. He&#39;s wearing a white shirt with red and yellow ribbons around his elbows. He has a green felt X across his chest with patches and buttons on it. He&#39;s mid-action, a white hankie in his hand arcing upward into the air. Behind him, back to us, is another man in similar garb, and behind them an out-of-focus city block.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/aOiL34eW1I-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1021&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;Ian morris dancing, Davis Square, Somerville MA, May 2024&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/Y02CqzWDe7-768.webp 768w, https://chromamine.com/media/img/Y02CqzWDe7-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/Y02CqzWDe7-768.jpeg 768w, https://chromamine.com/media/img/Y02CqzWDe7-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;View from below of a dark green suspension bridge, cables and tower forming vertical lines crossed by the diagonal line of the deck seen from below.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/Y02CqzWDe7-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2310&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;Manhattan Bridge, NYC, June 2024&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/Vw2G7zzQXU-768.webp 768w, https://chromamine.com/media/img/Vw2G7zzQXU-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/Vw2G7zzQXU-768.jpeg 768w, https://chromamine.com/media/img/Vw2G7zzQXU-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A photo shot amidst an array of mirrors. Green foliage is visible in the background. In the mirror directly facing the camera is the photographer, an Asian man, with long dark hair and a black shirt, deep in focus, face behind his Nikon camera. Behind him, with her arm around him, is a white woman with long blonde hair and a red dress in sunglasses and throwing up a peace sign.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/Vw2G7zzQXU-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1021&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;Mirror self-portrait with Shane, Brooklyn Bridge Park, NYC, June 2024&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/B4dxU2ELoq-768.webp 768w, https://chromamine.com/media/img/B4dxU2ELoq-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/B4dxU2ELoq-768.jpeg 768w, https://chromamine.com/media/img/B4dxU2ELoq-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A young blonde woman in glasses and a black shirt with a greenish suspension bridge behind her.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/B4dxU2ELoq-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1021&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;Grace, NYC, June 2024&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/RgcRkB6kOq-768.webp 768w, https://chromamine.com/media/img/RgcRkB6kOq-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/RgcRkB6kOq-768.jpeg 768w, https://chromamine.com/media/img/RgcRkB6kOq-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A man, intently working on a fiddle with no strings or bridge. In his other hand he&#39;s holding a bottle with a needlepoint cap. Behind him two young girls and their father look on with interest.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/RgcRkB6kOq-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2310&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;Matthew at work, Arco Art, Oswego NY, June 2024&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;figure&gt;
        &lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/BODXkAhdj2-768.webp 768w, https://chromamine.com/media/img/BODXkAhdj2-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/BODXkAhdj2-768.jpeg 768w, https://chromamine.com/media/img/BODXkAhdj2-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A 30-something Asian man with long hair against a distressed gray painted exterior wall. In the foreground, green brush is visible.&quot; loading=&quot;lazy&quot; src=&quot;https://chromamine.com/media/img/BODXkAhdj2-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1021&quot; /&gt;&lt;/picture&gt;
        &lt;figcaption&gt;&lt;p&gt;Experimenting with self-portraiture and sullen faces, Martinsville IL, July 2024&lt;/p&gt;
&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Though, in the event, I did impulse-buy a couple that do things my existing lenses don’t. &lt;a href=&quot;https://chromamine.com/2024/08/some-favorite-d70-shots-spring-2024/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Covid, Round Two</title>
            <link href="https://chromamine.com/2024/08/covid-round-two/"/>
            <updated>2024-08-04T00:00:00Z</updated>
            <id>https://chromamine.com/2024/08/covid-round-two/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;Roughly six months after &lt;a href=&quot;https://chromamine.com/2023/12/my-first-brush-with-covid/&quot;&gt;my first bout of covid&lt;/a&gt;, I got it again. As with the first time, it was from a known high-risk exposure. In this case someone was at a singing party with me and tested positive the following morning. They were masked, but I was not. We were sitting next to each other for large parts of the party. Windows were cracked open, but not wide. As far as I know, out of fifteen or so people at the party, two more of us (not counting the index case) tested positive the following week.&lt;/p&gt;
&lt;h3&gt;Getting Paxlovid&lt;/h3&gt;
&lt;p&gt;This time around, I opted to get a Paxlovid prescription. This was &lt;em&gt;very easy&lt;/em&gt;, thanks to Massachusetts’ &lt;a href=&quot;https://www.mass.gov/info-details/free-telehealth-for-covid-19-treatment-with-paxlovid&quot;&gt;telehealth&lt;/a&gt; system. I filled out a form online with medical details. 15 minutes later a provider called me, ran through the instructions for taking it, and sent a prescription to my local pharmacy. I expected I would have to justify my need, but it didn’t come up. The form did ask questions about risk factors and specifically my weight and height, so it’s &lt;em&gt;possible&lt;/em&gt; I was approved by virtue of being “overweight,” but I didn’t specify any risk factors beyond that.&lt;/p&gt;
&lt;p&gt;I highly recommend anyone in Massachusetts who gets covid any wants Paxlovid go through &lt;a href=&quot;https://www.mass.gov/info-details/free-telehealth-for-covid-19-treatment-with-paxlovid&quot;&gt;this system&lt;/a&gt;. It’s so easy.&lt;/p&gt;
&lt;h3&gt;Why Paxlovid?&lt;/h3&gt;
&lt;p&gt;I wasn’t super worried about my symptoms being bad, but I was eager to &lt;em&gt;test negative&lt;/em&gt; as quickly as possible. I had plans to go to three weeks of &lt;a href=&quot;https://chromamine.com/2013/08/dragonflies/&quot;&gt;camp&lt;/a&gt; starting the following week and I wanted to miss as little of it as possible. Under the theory that Paxlovid would help me test negative more quickly, I decided to get it preemptively and decide later whether to take it.&lt;/p&gt;
&lt;p&gt;I also wanted to avoid rebound, though, where a covid infection recurs a few days to weeks after recovery. This is more common when people take Paxlovid&lt;a href=&quot;https://chromamine.com/2024/08/covid-round-two/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;. One theory as to why rebound happens with Paxlovid is that it suppresses viral replication so effectively, your own immune system doesn’t have enough time to develop a specific immune response. When the Paxlovid clears your system, a small amount of replicating virus may remain and come roaring back. I know of &lt;a href=&quot;https://www.medrxiv.org/content/10.1101/2023.06.23.23288598v1&quot;&gt;at least one study&lt;/a&gt; in which participants who took Paxlovid &lt;em&gt;later&lt;/em&gt; had a lower rate of rebound. So, though the medical advice for Paxlovid is to take it as soon as possible, I knew that if I decided to take it at all, I would wait at least three days.&lt;/p&gt;
&lt;p&gt;I should point out that I am in no way a medical expert and don’t necessarily endorse the choices I made for this course of treatment. Paxlovid is officially recommended for preventing severe outcomes with covid. Its effect on improving mild cases is mixed and as far as I was able to tell scanning the literature, its effect on the duration of testing positive is basically unstudied. There was minimal reason for me to believe it would work the way that I wanted. Nevertheless, I figured, as long as the side effects were mild, it wouldn’t hurt to experiment.&lt;/p&gt;
&lt;h3&gt;My Covid Course&lt;/h3&gt;
&lt;p&gt;The first time I had covid was mild. This time around it was milder still – less than most colds I’ve had.&lt;a href=&quot;https://chromamine.com/2024/08/covid-round-two/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt; Because my symptoms were so light, I was reluctant to take Paxlovid when day 3 rolled around. By day 4, though, I was feeling mostly better, but still had a dark positive line on my antigen tests, which spooked me enough that I decided to start my course of Paxlovid. On day 5, I tested negative.&lt;/p&gt;
&lt;p&gt;The quick negative took me by surprise&lt;a href=&quot;https://chromamine.com/2024/08/covid-round-two/#fn3&quot; class=&quot;footnote-ref&quot; id=&quot;fnref3&quot;&gt;³&lt;/a&gt;. I tested positive for nearly two weeks the first time I had covid and thought of covid as a one or two week affair. It’s tempting to attribute the quick recovery to the Paxlovid, but 12 hours seems quick for it to have a significant effect. After talking to a number of others who had covid recently, I’ve heard several stories of people who recently had a similarly brief case. As far as I can tell, no one is publishing data on this, but I’ve revised my mental model of covid to have a much wider range of durations, including much shorter.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/4s-qjOccs5-768.webp 768w, https://chromamine.com/media/img/4s-qjOccs5-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/4s-qjOccs5-768.jpeg 768w, https://chromamine.com/media/img/4s-qjOccs5-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A series of 9 covid rapid tests labeled in pen &amp;quot;Sat&amp;quot; through &amp;quot;Sun 2.&amp;quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/4s-qjOccs5-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Day -3 Wed:&lt;/strong&gt; I am exposed to covid this evening.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Day -2 Thu:&lt;/strong&gt; I find out about my exposure in the morning. I have mild congestion, to an extent that is common for me, even when not sick.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Day -1 Fri:&lt;/strong&gt; I have mild congestion that persists, a little fatigue, and just a general ickiness that I can’t place. I’m not sure if I’m sick.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Day 0 Sat:&lt;/strong&gt; I’m distinctly sick, with persistent moderate sinus congestion, a mild sore throat, an occasional cough, and mild fatigue. I test negative on an antigen test. (I count this as &lt;strong&gt;Day 0&lt;/strong&gt;, meaning the day I have symptoms distinct enough to be sure I am sick.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Day 1 Sun:&lt;/strong&gt; My symptoms are similar to the day before, though less fatigue but more congestion and a worse sore throat. This is the worst day of symptoms and it’s really not bad. I test positive on an antigen test.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Day 2 Mon:&lt;/strong&gt; Moderate to mild congestion. The sore throat is gone, but I cough occasionally.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Day 3 Tue:&lt;/strong&gt; Same as the day before. I test positive on an antigen test.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Day 4 Wed:&lt;/strong&gt; My symptoms are nearly gone. I still test positive. I initiate my course of Paxlovid.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Day 5 Thu:&lt;/strong&gt; I feel mostly better and test negative. I continue to test negative in the following days.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I continued my course of Paxlovid for all five days, despite testing negative for most of it. I did not experience rebound.&lt;a href=&quot;https://chromamine.com/2024/08/covid-round-two/#fn4&quot; class=&quot;footnote-ref&quot; id=&quot;fnref4&quot;&gt;⁴&lt;/a&gt; I had only minor side-effects from the Paxlovid, primarily a persistent and unpleasant, but mild, bitterness in my mouth.&lt;/p&gt;
&lt;p&gt;In this case I’m not convinced the Paxlovid had much effect at all and, though side-effects were only mild for me, I would probably not go through the effort to take it again in the future.&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Though it can happen on its own, even without. &lt;a href=&quot;https://chromamine.com/2024/08/covid-round-two/#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;I actually had a quite nasty cold earlier this year that knocked me on my back for two days and gave me one of the worst headaches I’ve ever had. I tested negative for covid and it didn’t have the hallmarks of the flu, so it was likely something else that was much worse than either of my experiences with covid. &lt;a href=&quot;https://chromamine.com/2024/08/covid-round-two/#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;It happened so quickly that I was permitted to go to camp on time if I wanted, though, as it happened, I was no longer logistically prepared to go to camp on time, since I hadn’t been expecting to. I ended up going just a day late. &lt;a href=&quot;https://chromamine.com/2024/08/covid-round-two/#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;As part of the three weeks of camp I’m at, I have to test once a week, so I’m relatively certain I did not even experience asymptomatic or paucisymptomatic rebound. &lt;a href=&quot;https://chromamine.com/2024/08/covid-round-two/#fnref4&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>SolveSpace Fundamentals</title>
            <link href="https://chromamine.com/2024/07/3d-cad-with-solvespace/"/>
            <updated>2024-07-15T00:00:00Z</updated>
            <id>https://chromamine.com/2024/07/3d-cad-with-solvespace/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;For most of my &lt;abbr title=&quot;computer-aided design&quot;&gt;CAD&lt;/abbr&gt; I use &lt;a href=&quot;https://www.openscad.org/&quot;&gt;OpenSCAD&lt;/a&gt;, a coding-language–based modeling environment that appeals to my programmer/mathematician brain. But when it gets tedious figuring out how to express visual shapes in code, I turn to &lt;a href=&quot;http://solvespace.com/index.pl&quot;&gt;SolveSpace&lt;/a&gt; instead.&lt;a href=&quot;https://chromamine.com/2024/07/3d-cad-with-solvespace/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I’m still fairly new to SolveSpace, and I like it quite a lot, but I haven’t been fully satisfied by the way tutorials explain the theoretical foundation of how it works. They do have &lt;a href=&quot;https://solvespace.com/tutorial.pl&quot;&gt;very good tutorials&lt;/a&gt; that get you modeling hands-on. This is my attempt to complement those tutorials with a more analytical explanation of the underlying system, as well as a general review of using it.&lt;/p&gt;
&lt;h3&gt;The Basic Process&lt;/h3&gt;
&lt;p&gt;SolveSpace is a GUI&lt;a href=&quot;https://chromamine.com/2024/07/3d-cad-with-solvespace/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt; &lt;abbr title=&quot;computer-aided design&quot;&gt;CAD&lt;/abbr&gt; program that is based, roughly, around this workflow:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sketch 2D shapes in a “workplane”&lt;/li&gt;
&lt;li&gt;Transform those 2D shapes into 3D objects by extruding them linearly, rotationally, or in a helix&lt;/li&gt;
&lt;li&gt;Optionally, duplicate those objects by repeating in a line or rotationally around a point&lt;/li&gt;
&lt;li&gt;Repeat the process to create additional components that you can combine together to create a final model&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The heart of SolveSpace, though, is the constraints engine. When you are drawing in 2D or extruding in 3D you define the relationship of elements to each other with constraints. You start by drawing something freehand and then you add constraints to give it precision. Constraints can be things like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This line segment is 2 units long&lt;/li&gt;
&lt;li&gt;This arc is 20 degrees&lt;/li&gt;
&lt;li&gt;These line segments are parallel&lt;/li&gt;
&lt;li&gt;This point is at the midpoint of this line segment&lt;/li&gt;
&lt;li&gt;This arc has double the diameter of this circle&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SolveSpace “solves” these constraints to produce an exact model that meets those specifications.&lt;/p&gt;
&lt;h4&gt;Sketch 2D Shapes in a “Workplane”&lt;/h4&gt;
&lt;p&gt;That’s a little abstract, so here’s a concrete example. When you open a new SolveSpace document, it automatically creates an initial workplane for you. SolveSpace has a rectangle drawing tool, but the rectangle drawing tool is really a shortcut for drawing four lines with specific constraints pre-applied:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/7bGyumkCGN-768.webp 768w, https://chromamine.com/media/img/7bGyumkCGN-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/7bGyumkCGN-768.jpeg 768w, https://chromamine.com/media/img/7bGyumkCGN-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A SolveSpace window depicting a rectangle overlaid on a set of coordinate axes.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/7bGyumkCGN-768.jpeg&quot; width=&quot;1536&quot; height=&quot;967&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;A rectangle is actually made up of four &lt;strong&gt;line segments&lt;/strong&gt; (represented in white) which each inherently have two &lt;strong&gt;points&lt;/strong&gt; and come with eight automatically adopted &lt;strong&gt;constraints&lt;/strong&gt; (represented in purple). The constraints are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vertical&lt;/strong&gt;: Represented by the purple &lt;code&gt;V&lt;/code&gt;s, this constraint ensures that a line segment is vertical (parallel to the Y-axis of the workplane). It’s applied to two sides of the rectangle.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Horizontal&lt;/strong&gt;: Represented by the purple &lt;code&gt;H&lt;/code&gt;s, this constraint ensures that a line segment is horizontal (parallel to the X-axis of the workplane). It’s applied to the other two sides of the rectangle.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;On Point/Coincident&lt;/strong&gt;: This is the least obvious constraint. Each line segment naturally has two points, meaning there are actually &lt;em&gt;eight&lt;/em&gt; points in this sketch. But each pair of them has the &lt;strong&gt;on point&lt;/strong&gt; constraint applied which specifies that those two points must always be in the same place. These constraints are represented by the small purple dots inside of each green point.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Together these constraints create a rectangle. You can see all the objects in this workplane and all the constraints listed in the property inspector:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/vfsmSuU9LB-768.webp 768w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The SolveSpace property inspector listing under &amp;quot;requests&amp;quot; four line segments and under &amp;quot;constraints&amp;quot; the eight constraints enumerated above.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/vfsmSuU9LB-768.jpeg&quot; width=&quot;768&quot; height=&quot;1018&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Note that the property inspector refers to this sketch as a “&lt;strong&gt;Group&lt;/strong&gt;.” There’s a number of different “Group” types in SolveSpace that can be thought of as layers or transformations acting on the layers beneath them. A sketch in a workplane is a group. An extrusion is a group. A step repeating (multiplying an object) is a group. Every group has a suite of settings and properties that can be modified in the inspector, as seen here.&lt;/p&gt;
&lt;p&gt;As described above you can also see our four line segments (titled “Requests,” I guess because we are requesting that SolveSpace draw them?) and our eight constraints. SolveSpace supports a number of constraint types, but here are the ones I commonly use:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Distance:&lt;/strong&gt; Numerically specifies the length of a line segment, the radius of a circle arc, or other similar measurements&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Angle:&lt;/strong&gt; Numerically specifies the angle between two line segments or “normals” (e.g., axes)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Horizontal&lt;/strong&gt; and &lt;strong&gt;Vertical:&lt;/strong&gt; See above&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;On Point / Curve / Plane:&lt;/strong&gt; Can specify that two points are coincident, or that a point must fall on a line, arc, or plane&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Equal Length / Radius / Angle:&lt;/strong&gt; Specifies that two circles, arcs, angles, or line segments, are equal in magnitude&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Length / Arc Ratio:&lt;/strong&gt; Similar to “Equal Length” above, but specifies that two measurements have a constant ratio between them (e.g., a line segment is always twice the length of another line segment)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Length / Arc Difference:&lt;/strong&gt; Similar to above, but specifies that two measurements have a consistent difference (e.g., a line segment is always two units longer than another line segment)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;At Midpoint:&lt;/strong&gt; Specifies that a point falls at the exact midpoint of a line segment&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parallel / Tangent:&lt;/strong&gt; Specifies that a line segment is parallel to another line segment, or that a line segment is tangent to the endpoint of an arc (if they have coincident endpoints)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Perpindicular:&lt;/strong&gt; Just what it says on the tin.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SolveSpace’s interface tries to infer intended constraints as you draw. If you start a line segment on an existing point, for example, it will automatically add an &lt;strong&gt;on point&lt;/strong&gt; constraint to the existing point and the new one. If your line seems to be horizontal, it automatically adds the horizontal constraint. This produces a predictable drawing experience, but most other constraints have to be explicitly added.&lt;/p&gt;
&lt;p&gt;You might note, with the eight constraints we have now, we can still move the rectangle around and resize it. SolveSpace lets us know this is the case in the inspector above by saying “&lt;strong&gt;4 DOF&lt;/strong&gt;,” i.e., &lt;strong&gt;four degrees of freedom&lt;/strong&gt;. SolveSpace’s interface gently nudges you toward reducing each group’s DOF to zero, for some good reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It’s good be able to use drag-and-drop to do your initial sketches, but as your model takes form, you want to specify explicitly what its shape and dimensions are.&lt;/li&gt;
&lt;li&gt;When the constraint solver is forced to resolve (which it is regularly – every time you drag a point to a new location) it attempts to solve in a way that is intuitive, but it doesn’t always get it right. The fewer DOF you have, the less resolving it has to do.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I can reduce the degrees of freedom by constraining our rectangle to some specific dimensions, say, &lt;code&gt;75&lt;/code&gt; by &lt;code&gt;50&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/14n3ek9d5a-768.webp 768w, https://chromamine.com/media/img/14n3ek9d5a-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/14n3ek9d5a-768.jpeg 768w, https://chromamine.com/media/img/14n3ek9d5a-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The same rectangle pictured above, but now dimensions are specified in purple numbers along the top and left edges.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/14n3ek9d5a-768.jpeg&quot; width=&quot;1536&quot; height=&quot;967&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;At this point the inspector will still report 2 DOF because I can still move the rectangle left/right and up/down. If I want to constrain its position, I can do so relative to the origin point of the workplane (pictured in green at the center). I can do this by adding an &lt;strong&gt;on point&lt;/strong&gt; constraint between the origin and one of the corners:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/HAmWraptjM-768.webp 768w, https://chromamine.com/media/img/HAmWraptjM-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/HAmWraptjM-768.jpeg 768w, https://chromamine.com/media/img/HAmWraptjM-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The same rectangle, but its top left point is now on the origin.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/HAmWraptjM-768.jpeg&quot; width=&quot;1536&quot; height=&quot;967&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Or&lt;/em&gt; if I want the rectangle centered, it’s a little trickier, but one way to do it is with a &lt;strong&gt;construction entity&lt;/strong&gt;. I can create a line segment going from one corner to the opposite, mark it as a construction entity (meaning it doesn’t physically produce a part of the model, it’s just used for constraint calculations). Then, if I specify that the origin must be the midpoint of the cross-line, the rectangle will be centered (note the M, representing the midpoint constraint):&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/YQgwDGDzKd-768.webp 768w, https://chromamine.com/media/img/YQgwDGDzKd-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/YQgwDGDzKd-768.jpeg 768w, https://chromamine.com/media/img/YQgwDGDzKd-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The same rectangle but with a green line crossing it diagonally and the origin at the midpoint of the green line, centering the rectangle on the origin.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/YQgwDGDzKd-768.jpeg&quot; width=&quot;1536&quot; height=&quot;967&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Okay, that’s a lot of detail on &lt;em&gt;just&lt;/em&gt; drawing in 2D, but that’s where I spend most of my time in SolveSpace! And using just these basic entities and constraints, you can produce some pretty complex objects. I’m not going to go through creating it step by step, but, as an example to use for the next bit, here’s the initial workplane for a compliant camera lens cap I modeled:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/-Ve2h-rtf4-768.webp 768w, https://chromamine.com/media/img/-Ve2h-rtf4-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/-Ve2h-rtf4-768.jpeg 768w, https://chromamine.com/media/img/-Ve2h-rtf4-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;2D sketch in solvespace of the bottom of a lens cap. Visible is a snaking 2D spring attached to a tab jutting out of a semicircle.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/-Ve2h-rtf4-768.jpeg&quot; width=&quot;1536&quot; height=&quot;967&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h4&gt;Transform 2D Shapes into 3D Objects&lt;/h4&gt;
&lt;p&gt;Taking this lens cap mechanism, the next thing I want to do is extrude it into a 3D object. I create a new &lt;strong&gt;Extrude&lt;/strong&gt; group to make it 3D.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/USBPdc6tt9-768.webp 768w, https://chromamine.com/media/img/USBPdc6tt9-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/USBPdc6tt9-768.jpeg 768w, https://chromamine.com/media/img/USBPdc6tt9-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The 2D sketch of a lens cap mechanism extruded linearly into a 3D object with flat edges&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/USBPdc6tt9-768.jpeg&quot; width=&quot;1536&quot; height=&quot;967&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Note that this is a two-sided extrusion around the initial workplane (which is on the XY plane) which is why you can also see the outline of the original drawing in the middle of it. An extrusion group naturally has one degree of freedom — how long the extrusion is. I limit this by selecting a vertical edge and setting its length to exactly &lt;code&gt;2&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/FAoxQF7-RN-768.webp 768w, https://chromamine.com/media/img/FAoxQF7-RN-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/FAoxQF7-RN-768.jpeg 768w, https://chromamine.com/media/img/FAoxQF7-RN-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The same extruded object but the left edge is labeled &amp;quot;2.00&amp;quot; in purple.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/FAoxQF7-RN-768.jpeg&quot; width=&quot;1536&quot; height=&quot;967&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;My extrusion group now has zero degrees of freedom.&lt;/p&gt;
&lt;h4&gt;Duplicate Objects&lt;/h4&gt;
&lt;p&gt;But I’ve only modeled &lt;em&gt;half&lt;/em&gt; of the lens cap mechanism. A lens, after all, is not a semicircle. I need to duplicate it across the axis. Unfortunately SolveSpace doesn’t have a reflection group, so instead I’m going to simulate it using the &lt;strong&gt;step rotating&lt;/strong&gt; group, which duplicates the most recent around an axis. A step rotating group needs a point and “normal” to revolve around, so I select the origin and the Z-axis and create a new group. I tell it to repeat only twice (including the inital group).&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/njI0nxEovy-768.webp 768w, https://chromamine.com/media/img/njI0nxEovy-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/njI0nxEovy-768.jpeg 768w, https://chromamine.com/media/img/njI0nxEovy-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The same extruded object, but now repeated across the axis so it produces a full circular object.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/njI0nxEovy-768.jpeg&quot; width=&quot;1536&quot; height=&quot;967&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Once again, step rotating groups have one inherent degree of freedom – the angle of rotation. Even though this has produced the rotation I want, by default, I’d feel most comfortable if I formalize in a constraint that it should be 180°. There’s a number of possible ways of doing this, but here’s the one I choose: I select two points that are mirror opposites as well as the ZX plane and apply the &lt;strong&gt;symmetric&lt;/strong&gt; constraint (oops I forgot to mention this one above!) to specify that those two points should be symmetrically positioned across the ZX plane.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/jzUrFZP7P1-768.webp 768w, https://chromamine.com/media/img/jzUrFZP7P1-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/jzUrFZP7P1-768.jpeg 768w, https://chromamine.com/media/img/jzUrFZP7P1-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Zoomed in view of the center of the mechanism. Two points in the center have purple arrows pointing toward each other.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/jzUrFZP7P1-768.jpeg&quot; width=&quot;1536&quot; height=&quot;967&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Note the small purple arrows in the center indicating the symmetric constraint. Now the step rotating group has zero degrees of freedom.&lt;/p&gt;
&lt;p&gt;So, constraints are not limited to when you are sketching in a workplane. You can apply constraints in extrusion groups and repeating groups – and in fact that’s how you define how different 3D components of your model relate to each other. &lt;em&gt;And&lt;/em&gt; importantly, constraints are not limited to the group that you’re currently working in. You can apply constraints as relationships across groups. In this case I applied a constraint that is a relationship between a point in the step rotating group and a point in the extrusion group. The entities of any workplane or extrusion that precedes the current group can be referenced.&lt;/p&gt;
&lt;h4&gt;Combining Components&lt;/h4&gt;
&lt;p&gt;Making a 2D object and extruding it prismatically is not a very interesting result, no matter how complex the initial 2D object. At this point, to complete the lens cap, I needed to create more components, starting from new workplanes, extruding them into 3D, and then defining how they interacted with the original part.&lt;/p&gt;
&lt;p&gt;For example, I wanted to create a groove and tongue mechanism to keep the lens cap tabs vertically aligned when pressure is applied to them. I created new workplanes that were along the surfaces I wanted to place these components on, drew triangles, and then extruded them into 3 dimensions – in some cases creating extrusions in &lt;strong&gt;assembly&lt;/strong&gt; mode (e.g., glue these components together) and in some cases &lt;strong&gt;difference&lt;/strong&gt; mode (e.g., subtract this component from the solid model so far):&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/IDUl3qZajp-768.webp 768w, https://chromamine.com/media/img/IDUl3qZajp-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/IDUl3qZajp-768.jpeg 768w, https://chromamine.com/media/img/IDUl3qZajp-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A close up of the lens cap mechanism showing a tongue and groove for alignment along certain edges.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/IDUl3qZajp-768.jpeg&quot; width=&quot;1536&quot; height=&quot;967&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I enabled stippled occluded lines so you can see with “x-ray” vision the tongue and groove.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;For a more complex extrusion, to create the “teeth” that enable the tabs to grip on to the inner ring of a camera lens, I created a workplane perpindicular to the outer arc of the tabs, drew three triangles in a row, and then extruded them using a &lt;strong&gt;revolve&lt;/strong&gt; group around the center of the arc.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/6za4djBENq-768.webp 768w, https://chromamine.com/media/img/6za4djBENq-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/6za4djBENq-768.jpeg 768w, https://chromamine.com/media/img/6za4djBENq-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Close up of the edge of a tab on the lens cap showing three triangular grooves following the arc of the tab edge.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/6za4djBENq-768.jpeg&quot; width=&quot;1536&quot; height=&quot;967&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;You can use these mechanics together to create some pretty complex objects.&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/ZHIEf_oLlU-768.webp 768w, https://chromamine.com/media/img/ZHIEf_oLlU-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/ZHIEf_oLlU-768.jpeg 768w, https://chromamine.com/media/img/ZHIEf_oLlU-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A 3D lens cap modeled with its internal components showing in stippled lines.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/ZHIEf_oLlU-768.jpeg&quot; width=&quot;1536&quot; height=&quot;967&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/dWVswqgiJM-768.webp 768w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The property viewer showing all the groups of the lens cap.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/dWVswqgiJM-768.jpeg&quot; width=&quot;768&quot; height=&quot;932&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;js-stl-viewer&quot; data-src=&quot;/media/3d-cad-with-solvespace/cap-58mm-lo.stl&quot; data-alt=&quot;undefined&quot;&gt;
[Javascript required to view 3D model]
&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;The Pros and Cons&lt;/h3&gt;
&lt;p&gt;Okay, clearly &lt;em&gt;I&lt;/em&gt; like SolveSpace. But should &lt;em&gt;you&lt;/em&gt; use it? Here’s some pros and cons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pro:&lt;/strong&gt; Extremely satisfying if you’re mathematically minded. Thinking in constraints comes easily to me.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Con:&lt;/strong&gt; The interface, as pictured, doesn’t look like anything else on a computer and doesn’t work like anything else on a computer, and can be pretty frustrating to get used to.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pro:&lt;/strong&gt; It does look like something a 1337 h4xx0r might use, though, which makes me feel pretty cool.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Con:&lt;/strong&gt; It’s really hard to get basic 3D modeling features like fillets and chamfers without a lot of extra work – and in some cases it’s basically impossible. And because of the way SolveSpace’s model works, I’m not sure &lt;a href=&quot;https://github.com/solvespace/solvespace/issues/149#issuecomment-739559115&quot;&gt;I expect this to change&lt;/a&gt; (though I’d like to see the option, when extruding, to add a chamfered top or bottom).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pro:&lt;/strong&gt; Tons of keyboard shortcuts that make sketching pretty quick once you get the hang of it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Con:&lt;/strong&gt; Even basic objects require a lot of complex groups that become pretty challenging to keep track of.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Con:&lt;/strong&gt; Sometimes the solver doesn’t seem to work the way I expect? It will often tell me constraints are impossible to solve that I am pretty sure aren’t (and then I just have to fiddle around dragging and dropping and adding and removing constraints until it works) or, more often, tell me I have redundant constraints&lt;a href=&quot;https://chromamine.com/2024/07/3d-cad-with-solvespace/#fn3&quot; class=&quot;footnote-ref&quot; id=&quot;fnref3&quot;&gt;³&lt;/a&gt;, even if I’m pretty sure I don’t. In some cases it does so when I’ve only added a single constraint to a group!. Fortunately in the redundant constraint case you can toggle a switch on the group to allow redundant constraints, which I do frequently.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Con:&lt;/strong&gt; SolveSpace tries to resolve in ways that are intuitive to the editor, but sometimes it fails. I’ve often tried to pull two points apart only to watch them snap together instead! This can be particularly frustrating if the result is zero-length line segments, which I don’t know how to get rid of besides deleting them and starting over or undoing and hoping it works.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Con:&lt;/strong&gt; Similarly, if you haven’t fully constrained a group, edits in one place can cause unexpected results several groups up. I tried to make multiple versions of the lens cap at different diameters, but I’ve found that if I don’t fully constrain the triangles that make up the tongue-and-groove mechanism, they have a tendency to invert whenever I change the diameter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Con:&lt;/strong&gt; Undo is pretty buggy and flaky.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pro:&lt;/strong&gt; Unlike triangular mesh modelers, SolveSpace can produce files that encode arcs in a pure form, leading to smaller files with higher resolution.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Con:&lt;/strong&gt; A lot of the time SolveSpace will produce surface errors trying to combine your multiple groups and you’ll be forced to tick the box that forces triangular meshes instead (“Force NURBS surfaces to triangular mesh”). This has the additional side effect of &lt;em&gt;different&lt;/em&gt; errors.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Con:&lt;/strong&gt; If you have a lot of groups, it can get really overwhelming looking at all of them at once.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pro:&lt;/strong&gt; SolveSpace’s ability to turn group visibility, certain types of entities, and occluded lines on-and-off can be pretty powerful. If I’m working on a workplane that has measurements based on only a couple preceding groups I can &lt;em&gt;just&lt;/em&gt; enable those groups.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pro:&lt;/strong&gt; The constraints system is super powerful.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Con:&lt;/strong&gt; It’s doesn’t generate truly parameterized models, in the sense that you can’t just adjust a few configuration parameters to generate a new coherent model. You can &lt;em&gt;sort of&lt;/em&gt; fake it by creating some foundational constraints that represent parameters (e.g., “lens diameter”) but even then you have to have some bulletproof constraints everywhere or deal with the unpredictable side effects of the solver. And you can’t make parameters that are discrete (e.g., “number of teeth”), binary (e.g., “generate finger grip cavity?”), or strings (e.g., “label”).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Con:&lt;/strong&gt; It can be easy to lose track of what entities from earlier layers impact later constraints. SolveSpace tries to warn you when you’re deleting an entity, but those warnings aren’t super informative and it doesn’t provide any warning or way of tracking if you’re just &lt;em&gt;adjusting&lt;/em&gt; an entity.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/1eT0Yybpw0-744.webp 744w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;An error message that reads &amp;quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/1eT0Yybpw0-744.jpeg&quot; width=&quot;744&quot; height=&quot;896&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Listen, it’s a great system, it just comes with a lot of caveats.&lt;/p&gt;
&lt;p&gt;P.S. The lens cap model is available &lt;a href=&quot;https://www.printables.com/model/943512-lens-cap-print-in-place&quot;&gt;on Printables&lt;/a&gt;.&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;It should be said that both of these are &lt;em&gt;unusual&lt;/em&gt; in the 3D &lt;abbr title=&quot;computer-aided design&quot;&gt;CAD&lt;/abbr&gt; world. They have their adherents, but most modelers use friendlier GUI &lt;abbr title=&quot;computer-aided design&quot;&gt;CAD&lt;/abbr&gt; software like &lt;a href=&quot;https://www.autodesk.com/products/fusion-360/overview&quot;&gt;Fusion 360&lt;/a&gt;. But both of these are more analytical/mathematical than drawing things freehand and, though they work quite differently, they tickle similar parts of my brain. &lt;a href=&quot;https://chromamine.com/2024/07/3d-cad-with-solvespace/#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;Graphical User Interface, as opposed to a text-based environment, like OpenSCAD. &lt;a href=&quot;https://chromamine.com/2024/07/3d-cad-with-solvespace/#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;SolveSpace tries to encourage you to avoid redundant constraints as well as having too many degrees of freedom. &lt;a href=&quot;https://chromamine.com/2024/07/3d-cad-with-solvespace/#fnref3&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Dialing in Polymaker PolyWood: Not My Favorite!</title>
            <link href="https://chromamine.com/2024/07/dialing-in-polymaker-polywood/"/>
            <updated>2024-07-10T00:00:00Z</updated>
            <id>https://chromamine.com/2024/07/dialing-in-polymaker-polywood/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;&lt;a href=&quot;https://www.polymaker.com/shop/polywood/&quot;&gt;Polymaker PolyWood&lt;/a&gt; is a 3D printing filament designed to be ultra-matte and mimic the appearance of wood filaments – plastics with wood particles mixed into the material – without the hassle of actual wood particles, which can cause nozzle clogging. It’s also the filament that, in my limited time printing, I have had the most frustrating time trying to dial in.&lt;/p&gt;
&lt;p&gt;It’s common when receiving a new filament to print some calibration objects and adjust your print settings based on the results. Calibration lets you learn the best settings for the combination of your printer and the filament you’re using.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/supermerill/SuperSlicer&quot;&gt;SuperSlicer&lt;/a&gt; is a community maintained fork of &lt;a href=&quot;https://www.prusa3d.com/prusaslicer/&quot;&gt;PrusaSlicer&lt;/a&gt;, which is the official slicer from &lt;a href=&quot;https://www.prusa3d.com/&quot;&gt;Prusa&lt;/a&gt; – who also make &lt;a href=&quot;https://shop.prusa3d.com/en/3d-printers/180-original-prusa-mini.html&quot;&gt;my printer&lt;/a&gt;. It has added features on top of PrusaSlicer, including the ability to generate some handy calibration models. Because it is released less frequently than PrusaSlicer, it is an odd combination of &lt;em&gt;more&lt;/em&gt; feature-ful but &lt;em&gt;less&lt;/em&gt; cutting edge. I tend to do calibration in SS, but then migrate those settings to PS where I do most of my day-to-day slicing.&lt;/p&gt;
&lt;p&gt;My usual calibration process is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Print extrusion multiplier calibration chips in two rounds (coarse and fine-tuning) to dial in the extrusion multiplier – a factor that adjusts how much material gets pushed through the nozzle to extrude a line.&lt;/li&gt;
&lt;li&gt;Print a temperature tower to dial in the temperature range that makes the filament strongest, creates the cleanest bridges and features, and has the least stringing.&lt;/li&gt;
&lt;li&gt;Print a retraction test to dial in the retraction setting that minimizes stringing caused by filament oozing as the nozzle moves from one location to another.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;My calibration process this time was:&lt;/p&gt;
&lt;p&gt;I attempted to print the extrusion multiplier calibration chips, but struggled to get the print to stick to the bed within the advertised range of settings, despite washing the bed multiple times to ensure it was free of oils and despite trying multiple bed temperatures within the recommended range of 30–50°C (quite low compared to other PLAs in my collection).&lt;/p&gt;
&lt;p&gt;Finally the print stuck &lt;em&gt;tolerably&lt;/em&gt; with the bed temperature at 60–65°C, well outside of the recommended range. It was still pretty messy and required some babysitting.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/8ufrH70RL3-768.webp 768w, https://chromamine.com/media/img/8ufrH70RL3-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/8ufrH70RL3-768.jpeg 768w, https://chromamine.com/media/img/8ufrH70RL3-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A green print bed of a Prusa MINI+ 3D printer with five small flat tan objects printed on it.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/8ufrH70RL3-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1021&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;I printed two rounds of calibration chips resulting in a extrusion multiplier of 1.21 – quite a bit higher than almost any other filament I use. My best theory for why such a high value works here is: PolyWood achieves its matte effect by being a foamed plastic&lt;a href=&quot;https://chromamine.com/2024/07/dialing-in-polymaker-polywood/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt; and therefore low density. When it gets pushed through the heated nozzle some of the foam collapses and the extruded plastic is higher density, resulting in less volume per length of filament pushed through.&lt;/p&gt;
&lt;p&gt;I printed a temperature tower:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/KIcgE1ZycM-768.webp 768w, https://chromamine.com/media/img/KIcgE1ZycM-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/KIcgE1ZycM-768.jpeg 768w, https://chromamine.com/media/img/KIcgE1ZycM-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A layered tan object sitting on a green 3D print bed. The object is a shape with a variety of features designed to test different 3D printing qualities. It is repeated vertically 5 times, labeled with a temperature on each layer, ranging from 210 at the bottom to 190 at the top.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/KIcgE1ZycM-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1021&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;All of these temperatures look kind of rough, but I guess 200°C looks the least bad. You can also see that I &lt;em&gt;still&lt;/em&gt; had some issues with a messy first layer.&lt;/p&gt;
&lt;p&gt;Finally, I printed my retraction test:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/JqJiG6vH3y-768.webp 768w, https://chromamine.com/media/img/JqJiG6vH3y-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/JqJiG6vH3y-768.jpeg 768w, https://chromamine.com/media/img/JqJiG6vH3y-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Four tan threaded cylinders sitting on a green 3D print bed. There&#39;s stringy plastic between the cylinders all the way up the vertical height. Int the background is a loose accumulation of extruded plastic in a curly clumped strand.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/JqJiG6vH3y-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1021&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;There is no retraction level in a reasonable range on my extruder at which the filament is not stringy. I’m just going to have to choose prints to minimize nozzle travel and accept some post-processing work.&lt;/p&gt;
&lt;p&gt;You might also notice in the background that I tried to print a &lt;em&gt;second&lt;/em&gt; retraction test, but walked away from the printer too soon and didn’t notice that it hadn’t stuck to the bed, resulting in a string monster.&lt;/p&gt;
&lt;p&gt;These are the settings I arrived at:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bed temp (first layer):&lt;/strong&gt; 65°C&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bed temp (other layers):&lt;/strong&gt; 60°C&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extruder temp (first layer):&lt;/strong&gt; 205°C&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extruder temp (other layers):&lt;/strong&gt; 200°C&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extrusion multiplier:&lt;/strong&gt; 1.21&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I didn’t quite stop here. It actually took me a few months to finalize this blog post because &lt;em&gt;I knew&lt;/em&gt; when I was drafting it that other 3D printing folks would tell me that my problem is “wet filament.” Certain types of plastic are hygroscopic and can absorb moisture over time that creates problems when printing ranging from stringing (as seen here) to poor layer adhesion to inconsistent extrusion. Annoyingly, though, this seems to be the community’s go-to answer for every problem, even when it’s not the actual issue. But this month I finally gave in and bought a filament dryer&lt;a href=&quot;https://chromamine.com/2024/07/dialing-in-polymaker-polywood/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt; and dried the filament for 36 hours to see if it would help. It did not.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/LzxTecXw2Y-768.webp 768w, https://chromamine.com/media/img/LzxTecXw2Y-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/LzxTecXw2Y-768.jpeg 768w, https://chromamine.com/media/img/LzxTecXw2Y-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Eight tan cylinders in groups of four similar to the ones above. There is stringing between the cylinders.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/LzxTecXw2Y-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1021&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;I did notice that when I printed a couple parts on “quality” settings, which print slower, some of the stringing and adhesion issues were reduced, though not gone completely. It’s possible there’s room to play with printing &lt;em&gt;even more slowly&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I also found that including a brim&lt;a href=&quot;https://chromamine.com/2024/07/dialing-in-polymaker-polywood/#fn3&quot; class=&quot;footnote-ref&quot; id=&quot;fnref3&quot;&gt;³&lt;/a&gt; helps establish bed adhesion so as not to mess up the model itself. Printing more than two perimeters from the inside out also seems like it would be a good approach here.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/h2-0tkvKms-768.webp 768w, https://chromamine.com/media/img/h2-0tkvKms-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/h2-0tkvKms-768.jpeg 768w, https://chromamine.com/media/img/h2-0tkvKms-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A tan capital-H shaped object mid-print. There&#39;s a broad flat tan &amp;quot;brim&amp;quot; around the base of the print.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/h2-0tkvKms-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1021&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Overall this is the fussiest filament I have worked with to date and was frustrating to dial in. Ultimately I’m not even that taken in with the appearance. When printed in solid it looks like a cross between plastic and cardboard – in my opinion, it looks cheap. I think it’s best when printed in a shape where it can plausibly simulate a very even-grained wood. Thin dowel/skewer shapes look OK. But at $30 for a 600kg spool, it’s a fair bit more expensive than other filaments I use.&lt;/p&gt;
&lt;p&gt;I probably won’t buy another batch, but as long as I have this spool, I might as well see if I can make some things I like with it.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/VMIuXT1bms-768.webp 768w, https://chromamine.com/media/img/VMIuXT1bms-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/VMIuXT1bms-768.jpeg 768w, https://chromamine.com/media/img/VMIuXT1bms-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/VMIuXT1bms-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href=&quot;https://thangs.com/designer/LoftedGoods/3d-model/Classic%20Planter%20with%20Drip%20Tray%20and%20Stand-924535&quot;&gt;Classic Planter&lt;/a&gt; design by Brian Hendricks. The “wood” stand was printed in PolyWood. The stand was printed on its side, in two parts, as seen in a photo above, to reduce extrusion stops and starts where stringing might occur. Inside the flowerpot is Wilbur Jr., son of &lt;a href=&quot;https://www.caseyandmolly.com/&quot;&gt;Molly and Casey&lt;/a&gt;’s spider plant Wilbur.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/QaCaQEyNp9-768.webp 768w, https://chromamine.com/media/img/QaCaQEyNp9-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/QaCaQEyNp9-768.jpeg 768w, https://chromamine.com/media/img/QaCaQEyNp9-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A glowing orb lamp sitting on a woven-looking round pedestal. It looks kind of like a crystal ball.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/QaCaQEyNp9-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1033&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href=&quot;https://www.printables.com/model/23859-designer-moon-lamp&quot;&gt;Designer Moon Lamp&lt;/a&gt; by Frank Deschner. Woven “wood” base designed by me and printed in PolyWood. This required a lot of pretty tedious cleanup of stringing.&lt;/em&gt;&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;PolyMaker calls this their “Stabilized Foaming” technology. &lt;a href=&quot;https://chromamine.com/2024/07/dialing-in-polymaker-polywood/#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;I also needed it for scenarios where wet filament &lt;em&gt;is&lt;/em&gt; the issue, not just this one. &lt;a href=&quot;https://chromamine.com/2024/07/dialing-in-polymaker-polywood/#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;A single-layer moat of filament snugly surrounding the base of the model, which is trimmed off after the print is completed. &lt;a href=&quot;https://chromamine.com/2024/07/dialing-in-polymaker-polywood/#fnref3&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Calling a Gendered Series Gender-Free</title>
            <link href="https://chromamine.com/2024/07/calling-a-gendered-series-gender-free/"/>
            <updated>2024-07-08T00:00:00Z</updated>
            <id>https://chromamine.com/2024/07/calling-a-gendered-series-gender-free/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;On my &lt;a href=&quot;https://chromamine.com/2024/07/summer-tour-with-kingfisher-reflections/&quot;&gt;summer tour with Kingfisher&lt;/a&gt; the organizers of one dance told me that their group would tolerate Larks/Robins for role terms, but &lt;em&gt;preferred&lt;/em&gt; Ladies/Gents. After talking it over with some other callers and dancers and weighing the factors (What will feel best for me? What will be best for the dancers? What will be good for contra dance in general?) I opted to call Larks/Robins.&lt;/p&gt;
&lt;p&gt;A lot of callers dislike series that use “caller’s choice” role terms. They want organizers to take responsibility for making what’s often a fraught decision so the blowback doesn’t land on callers. Personally, I’m pretty sympathetic. In some cases a community may genuinely not have preferences – they’re just happy to be dancing. Or if they do have preferences, as in this case, often it turns out that callers are the most opinionated people in the room (and &lt;em&gt;boy&lt;/em&gt; do we have a lot of strong opinions) and it’s more practical to let &lt;em&gt;them&lt;/em&gt; choose rather than eliminate a large swath of the performer base – especially since for some dances there’s a limited group of performers to begin with.&lt;/p&gt;
&lt;p&gt;It has to be done well, though, as this dance did. They were clear with me on what the likely response would be if I called Larks/Robins, getting as specific as telling me that a few dancers might mildly object, but the evening overall would be fine. This gave me the information I needed to make an informed decision and prepare for the dance.&lt;/p&gt;
&lt;p&gt;Crucially, they &lt;em&gt;advertised the role terms in advance&lt;/em&gt; so dancers attending knew what they were signing up for. This is the number one thing any series with different terms at different events &lt;em&gt;must&lt;/em&gt; do. Never take your dancers by surprise – it creates an unpredictable and antagonistic relationship with the series and, if new terms are being tested out, unpleasant surprises will deepen resistance to those terms.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Knowing what to expect, I did a few things differently to forestall any terminology-related conflicts, set dancers at ease, and leave everyone feeling good about the evening. This community has a &lt;em&gt;separate&lt;/em&gt; gender-free series, so I knew Larks/Robins would be at least somewhat familiar to the crowd, but I assumed there would be at least a few dancers who weren’t used to it – maybe even be a few who had never danced to Larks/Robins calling at all. And some, I imagined, would be familiar, but disapproving.&lt;/p&gt;
&lt;h3&gt;The Intro Spiel&lt;/h3&gt;
&lt;p&gt;First, I gave a little spiel at the beginning about the terms I would be using. It went something like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I’m used to calling dances using “Larks” and “Robins” and that’s what I’ll be doing tonight. I know some of you are more familiar with “Ladies” and “Gents.” If that’s you and you’re feeling a little uncertain about Larks and Robins, I promise I will be gentle, and I encourage you to think of it as an experiment testing how good your contra dance skills are when you’re hearing unfamiliar words. I also encourage you to listen to the &lt;em&gt;syllables&lt;/em&gt; and not the &lt;em&gt;words&lt;/em&gt;: “Larks” and “Robins” have the same number of syllables as “Gents” and “Ladies”.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For beginning dancers, who have no background in what Ladies/Gents might mean at a contra dance, I think it’s best to use the “&lt;strong&gt;L&lt;/strong&gt;arks are on the &lt;strong&gt;L&lt;/strong&gt;eft and &lt;strong&gt;R&lt;/strong&gt;obins are on the &lt;strong&gt;R&lt;/strong&gt;ight” mnemonic. But for experienced dancers transitioning from Ladies/Gents, the syllables are the thing to point out. And as I looked out over the crowd during this spiel, I did notice some lightbulbs going on in the minds of some of the dancers, which was gratifying to see.&lt;/p&gt;
&lt;p&gt;I used this spiel again on a later dance that did caller’s choice role terms. In that case I wasn’t warned that the dancers might be resistant to Larks/Robins, but I noticed some hesitation when I started teaching using them, so I deployed my intro just in case.&lt;/p&gt;
&lt;h3&gt;Positional Notes&lt;/h3&gt;
&lt;p&gt;Second, during walkthroughs, I added positional-style notes to my teaching. In a moment following a neighbor swing on the side instead of just “Larks, allemande left with each other” I said, “Larks, &lt;strong&gt;you have your left hands free&lt;/strong&gt; for an allemande left with each other.” Even if a dancer didn’t immediately recognize that they were a lark, they could check if their left hand was free to recognize when a call applied to them.&lt;/p&gt;
&lt;h3&gt;Short Prompts of Figure Names, Not Roles&lt;/h3&gt;
&lt;p&gt;As callers prompt a dance, they shorten calls as they go, getting dancers used to remembering the figure on their own and testing how quickly those dancers pull it from their memory – a step toward dropping out completely and allowing the dancers to groove to the music alone. Usually I shorten a call like “Larks allemande left 1½” to simply “Larks!,” dropping the figure name, knowing that if I say &lt;em&gt;which&lt;/em&gt; dancers should do something those dancers will search their memories for &lt;em&gt;what&lt;/em&gt; they are supposed to do.&lt;/p&gt;
&lt;p&gt;Since a lot of these dancers wouldn’t immediately recognize their role with unfamiliar terms, I did the reverse of what I usually did and dropped the role term but kept the figure name, “allemande left!”&lt;/p&gt;
&lt;h3&gt;Fewer Role Terms&lt;/h3&gt;
&lt;p&gt;In general, I relied less on role terms to identify dancers, when it was possible to drop them without increasing my wordiness. For example, when teaching a box circulate, I might usually start by identifying the two sets of dancers who are about to do different things, saying, “Larks, you’re facing out of the set” and “Robins you’re facing in, looking at someone’s back.” This time, knowing some dancers could be thrown just by hearing role terms, I simply said, “Some of you are facing out of the set” and “some of you are facing in, looking at someone’s back.”&lt;/p&gt;
&lt;p&gt;Reducing role terms means reducing the amount dancers get used to hearing those terms to refer to themselves, so as far as building the skills of responding to Larks/Robins calling, perhaps that’s not the optimal strategy. But, as far as I see it, my most important job as as caller at a contra dance is to make sure dancers have a good time. And if a few dancers who don’t usually dance gender-free leave thinking, “I went to a Larks/Robins dance and it wasn’t too hard and wasn’t too bad!” then I think that’s a win for gender-free calling.&lt;/p&gt;
</content>
        </entry>
        <entry>
            <title>Summer Tour with Kingfisher Reflections</title>
            <link href="https://chromamine.com/2024/07/summer-tour-with-kingfisher-reflections/"/>
            <updated>2024-07-03T00:00:00Z</updated>
            <id>https://chromamine.com/2024/07/summer-tour-with-kingfisher-reflections/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;I just wrapped up a weeklong summer contra dance calling tour with &lt;a href=&quot;https://www.kingfisherband.com/&quot;&gt;Kingfisher&lt;/a&gt; (&lt;a href=&quot;https://www.jefftk.com/&quot;&gt;Jeff Kaufman&lt;/a&gt; and &lt;a href=&quot;https://www.ceciliavacanti.com/&quot;&gt;Cecilia Vacanti&lt;/a&gt;). This was my first time on tour!&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/P8NCiebem3-768.webp 768w, https://chromamine.com/media/img/P8NCiebem3-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/P8NCiebem3-768.jpeg 768w, https://chromamine.com/media/img/P8NCiebem3-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A woman with short colored hair, playing fiddle in front of a blurred quilt background. There&#39;s a lens flare in the foreground from a lamp visible behind her.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/P8NCiebem3-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1021&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/p6vchKxPdE-768.webp 768w, https://chromamine.com/media/img/p6vchKxPdE-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/p6vchKxPdE-768.jpeg 768w, https://chromamine.com/media/img/p6vchKxPdE-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A bearded man at a keyboard, mic, and electronics setup. Behind him, in the blurred background, you can see a figure with a fiddle.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/p6vchKxPdE-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1021&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;We played six dances in six days with an extra day for travel at the start and an extra two days at the end, for a total of nine days on the road. We performed at these dances:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;June 27: &lt;a href=&quot;https://cdrochester.org/contra-dance/&quot;&gt;Country Dancers of Rochester&lt;/a&gt; in Rochester NY&lt;/li&gt;
&lt;li&gt;June 28: &lt;a href=&quot;https://pittsburghcontra.org/&quot;&gt;Pittsburgh Contra Dance&lt;/a&gt; in Pittsburgh PA&lt;/li&gt;
&lt;li&gt;June 29: &lt;a href=&quot;https://www.bloomingtoncontra.org/&quot;&gt;Bloomington Old-Time Music &amp;amp; Dance Group&lt;/a&gt; in Bloomington IN&lt;/li&gt;
&lt;li&gt;June 30: &lt;a href=&quot;https://childgrove.org/&quot;&gt;Childgrove Country Dancers&lt;/a&gt; in St. Louis MO&lt;/li&gt;
&lt;li&gt;July 1: &lt;a href=&quot;https://www.cincinnaticontradance.org/&quot;&gt;Cincinnati Contra Dancers&lt;/a&gt; in Cincinnati OH&lt;/li&gt;
&lt;li&gt;July 2: &lt;a href=&quot;https://indycontra.org/&quot;&gt;Indy Contra Dance&lt;/a&gt; in Indianapolis IN&lt;/li&gt;
&lt;/ul&gt;
&lt;iframe src=&quot;https://www.google.com/maps/embed?pb=!1m64!1m12!1m3!1d7997513.7986948555!2d-86.87719501272153!3d40.999125742345655!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!4m49!3e0!4m5!1s0x89e377297bf5e165%3A0x7a907799d8f97b03!2sSomerville%2C%20MA!3m2!1d42.3875968!2d-71.0994968!4m5!1s0x89d6b3059614b353%3A0x5a001ffc4125e61e!2sRochester%2C%20NY!3m2!1d43.156577899999995!2d-77.6088465!4m5!1s0x8834f16f48068503%3A0x8df915a15aa21b34!2sPittsburgh%2C%20PA!3m2!1d40.440624799999995!2d-79.9958864!4m5!1s0x886c5df6b483d8e7%3A0xe91a912d8bad33d9!2sBloomington%2C%20IN!3m2!1d39.165324999999996!2d-86.52638569999999!4m5!1s0x87d8b4a9faed8ef9%3A0xbe39eaca22bbe05b!2sSt.%20Louis%2C%20MO!3m2!1d38.627002499999996!2d-90.19940419999999!4m5!1s0x884051b1de3821f9%3A0x69fb7e8be4c09317!2sCincinnati%2C%20OH!3m2!1d39.1031182!2d-84.5120196!4m5!1s0x886b50ffa7796a03%3A0xd68e9df640b9ea7c!2sIndianapolis%2C%20IN!3m2!1d39.76909!2d-86.158018!4m5!1s0x89e377297bf5e165%3A0x7a907799d8f97b03!2sSomerville%2C%20MA!3m2!1d42.3875968!2d-71.0994968!5e0!3m2!1sen!2sus!4v1720038159093!5m2!1sen!2sus&quot; style=&quot;border:0; width: 100%; aspect-ratio: 2 / 1&quot; allowfullscreen=&quot;&quot; loading=&quot;lazy&quot; referrerpolicy=&quot;no-referrer-when-downgrade&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href=&quot;https://chromamine.com/media/summer-tour-with-kingfisher-reflections/map.png&quot;&gt;&lt;em&gt;Screenshot of map.&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This was a lot of travel! Roughly 40 hours of driving as sketched out&lt;a href=&quot;https://chromamine.com/2024/07/summer-tour-with-kingfisher-reflections/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt; and actually probably a bit more given some of the detours we took along the way. We rented a minivan for the three touring adults, their equipment, and &lt;a href=&quot;https://www.lilywise.com/&quot;&gt;two&lt;/a&gt; &lt;a href=&quot;https://www.annawise.net/&quot;&gt;of&lt;/a&gt; Jeff’s kids who joined us on tour.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/BIysNpJjKo-768.webp 768w, https://chromamine.com/media/img/BIysNpJjKo-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/BIysNpJjKo-768.jpeg 768w, https://chromamine.com/media/img/BIysNpJjKo-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A man in a blue shirt holding an unstrung violin in one hand and a bottle of glue with a needlepoint in another hand while two young children and another man look on.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/BIysNpJjKo-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2310&quot; /&gt;&lt;/picture&gt;
&lt;em&gt;Visiting &lt;a href=&quot;https://www.arcoart.net/&quot;&gt;the violin shop&lt;/a&gt; of Matthew Vacanti (Cecilia’s father) in Liverpool NY&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/nQWleMrOHa-768.webp 768w, https://chromamine.com/media/img/nQWleMrOHa-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/nQWleMrOHa-768.jpeg 768w, https://chromamine.com/media/img/nQWleMrOHa-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A woman with colored hair, two young children, and a bearded man lean over a railing looking down on a waterfall below.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/nQWleMrOHa-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2310&quot; /&gt;&lt;/picture&gt;
&lt;em&gt;Niagara Falls&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/KG8ElDqog2-768.webp 768w, https://chromamine.com/media/img/KG8ElDqog2-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/KG8ElDqog2-768.jpeg 768w, https://chromamine.com/media/img/KG8ElDqog2-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A crowd of people in a cavern with a railing on the left side.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/KG8ElDqog2-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;
&lt;em&gt;Bluespring Caverns in Indiana&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/DBDOCzuzlR-768.webp 768w, https://chromamine.com/media/img/DBDOCzuzlR-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/DBDOCzuzlR-768.jpeg 768w, https://chromamine.com/media/img/DBDOCzuzlR-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Selfie, with the St. Louis arch crossing, which gleams, crossing the image behind me, with a blue clear sky in the background.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/DBDOCzuzlR-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;
&lt;em&gt;St. Louis Arch&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/QBVy3AnFN8-768.webp 768w, https://chromamine.com/media/img/QBVy3AnFN8-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/QBVy3AnFN8-768.jpeg 768w, https://chromamine.com/media/img/QBVy3AnFN8-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Two adults on parallel ziplines in a green park with gravel beneath them. It&#39;s a sunny day.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/QBVy3AnFN8-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1021&quot; /&gt;&lt;/picture&gt;
&lt;em&gt;Just a cool park we found. It had a zipline! And also a 90-foot slide (not pictured)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It was great to call every day for almost a week and get to hone my skills. I was pretty nervous about the early gigs. I’m used to calling dances locally where I know what to expect from the crowd in terms of experience level and preferences. Even calling some of the local dances where the crowd varies from night to night, I at least have a good sense of the range to expect and prepare within that range.&lt;/p&gt;
&lt;p&gt;I’m in the habit of asking organizers what to expect from their dancers but, “It depends on the night!” is the most common response and even when they deliver a concrete answer it only sometimes matches the crowd I actually find at the dance. I generally have a pretty improvisational approach to programming an evening, but this was more than I was used to. Nevertheless, I noticed myself gaining more confidence as we went along. I think I did a pretty good job at each of the dances we performed – none were error-free, but I performed in a manner I was proud of.&lt;/p&gt;
&lt;h3&gt;Some Surprises&lt;/h3&gt;
&lt;p&gt;A couple things took me by surprise:&lt;/p&gt;
&lt;p&gt;First, I hadn’t really thought about how much the schedule of calling consecutive days meant using time wisely. If I decided to socialize after a dance and got to bed late, if the next day was a big travel day, that could mean getting less sleep that night which either meant getting a nap in while on the road or performing the next night’s gig underslept. As it turned out, I still went out for afters when the opportunity presented itself, but I had to think about it! I imagine there’s similar considerations when calling a weekend or week-long camp.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/QQsU9dpIUx-768.webp 768w, https://chromamine.com/media/img/QQsU9dpIUx-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/QQsU9dpIUx-768.jpeg 768w, https://chromamine.com/media/img/QQsU9dpIUx-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Selfie of myself (long-haired mid-30s east asian man) and two friends at a table in a bar&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/QQsU9dpIUx-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;
&lt;em&gt;Hanging out with some friends at a bar in Rochester NY after the dance&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Second, I was soliciting feedback at each of these dances by putting a small gray comment book on the registration table and announcing to dancers that they could write feedback for me in there&lt;a href=&quot;https://chromamine.com/2024/07/summer-tour-with-kingfisher-reflections/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt;. At a couple of the early dances I got feedback that I should have walked through some of the dances twice or prompted them for longer. But they had looked mostly fine to me on the floor, just the normal amount of stutters as dancers picked up and memorized the choreography! Was I picking dances that were too tricky without noticing it? Was I prompting an abnormally short amount of time and making dancers feel nervous?&lt;/p&gt;
&lt;p&gt;When I was thinking this through out loud, Jeff suggested it might be a cultural difference: some communities &lt;em&gt;expect&lt;/em&gt; two walkthroughs and their dancers don’t generally put their full attention on the first one. After this I added, “Do your dancers expect one or two walkthroughs generally?” to my list of questions for organizers&lt;a href=&quot;https://chromamine.com/2024/07/summer-tour-with-kingfisher-reflections/#fn3&quot; class=&quot;footnote-ref&quot; id=&quot;fnref3&quot;&gt;³&lt;/a&gt;. And indeed, at most of the following dances, I was told their dancers preferred &lt;em&gt;two&lt;/em&gt; walkthroughs. I didn’t get complaints on either subject for the rest of the tour and, in fact, at one of the dances where I defaulted to two walkthroughs, a couple complimented me after the dance on how efficient I was!&lt;/p&gt;
&lt;p&gt;This is quite different from what I’m used to in the Boston area. Our dancers want to get moving as quickly as possible, and, in fact, many of our local dances have &lt;a href=&quot;https://www.bidadance.org/caller-welcome&quot;&gt;caller&lt;/a&gt; &lt;a href=&quot;https://www.neffa.org/thursday-contras-caller-info/&quot;&gt;guide&lt;/a&gt;&lt;a href=&quot;http://mondaycontras.com/pages/performer-information.php&quot;&gt;lines&lt;/a&gt; that explicitly say you &lt;em&gt;should not&lt;/em&gt; need to do two walkthroughs for most dances if you have tuned the complexity appropriately.&lt;/p&gt;
&lt;h3&gt;Band Interaction&lt;/h3&gt;
&lt;p&gt;Jeff encouraged me on this tour to think more deeply about the narrative arc of an evening and offer them guidance on the type of energy I wanted for each dance. I typically put a lot of trust in the band to structure an evening’s energy. I’ll offer guidance if I think a dance should have a particular flavor or energy, and I try to vary the energy of the dances I select, but frequently I’ll just say “Any tune will do.” This week I tried to take a stronger hand, which got easier over the course of the week as I was more familiar with the range of energy and moods Kingfisher could offer.&lt;/p&gt;
&lt;p&gt;We didn’t do extensive debriefs of each evening, but it was nice to talk through certain sets occasionally and go through some of thoughts before a dance on particular choreographies I was considering and what might fit them.&lt;/p&gt;
&lt;p&gt;(Also, let it be said, Kingfisher is a phenomenal band and it was pretty great to share the stage with them so many times.)&lt;/p&gt;
&lt;h3&gt;Role Terms&lt;/h3&gt;
&lt;p&gt;I was pleased that all of the dances allowed me to call Larks/Robins. Most explicitly preferred gender-free calling, a few were caller’s choice (and they advertised the terms in advance), and one told me they preferred Ladies/Gents, but would tolerate Larks/Robins. After a bit of dithering I opted for Larks/Robins and was quite pleased with how I handled the challenge of a crowd that might be unfamiliar with or even resistant to different role terms.&lt;/p&gt;
&lt;h3&gt;Feedback Notebook&lt;/h3&gt;
&lt;p&gt;The feedback notebook provided a lot of useful ideas for improvement for me to reflect on, but it also provided me a pleasant string of compliments and testimonials. Here’s a few of my favorite excerpts:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“I really love that you noticed when people were lost or off beat and didn’t call anyone out but gave gentle corrections that people could notice were for them.”&lt;/p&gt;
&lt;p&gt;– Rochester NY&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;“I loved your smooth encouraging style. It was easy to learn, although some of the dances definitely had tricky parts! We love the music and the musicality of how the dances fit the music!”&lt;/p&gt;
&lt;p&gt;– Pittsburgh PA&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;“Fantastic calling! The beginners workshop was very well done!”&lt;/p&gt;
&lt;p&gt;– Cincinnati OH&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;“Honestly, I was worried when you started with a Becket, but it was great! I have enjoyed your choice of dances and calling. Thank you!”&lt;a href=&quot;https://chromamine.com/2024/07/summer-tour-with-kingfisher-reflections/#fn4&quot; class=&quot;footnote-ref&quot; id=&quot;fnref4&quot;&gt;⁴&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;– Indianapolis IN&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;“Thank you for the wonderful dances! They flowed well and were lots of fun. Your explanations were clear and the beginners fit right in.”&lt;/p&gt;
&lt;p&gt;– Bloomington IN&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I really liked going on tour and I really liked doing it &lt;em&gt;with&lt;/em&gt; a band. If any other bands are looking for a caller to tour with and you like my style, let me know! I might even know how to drive by then.&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;All of which was done by Jeff because A. I don’t know how to drive and cannot legally outside of Massachusetts (I have a learner’s permit, finally, for within Massachusetts!) and B. It was costly to put another adult (Cecilia) on the minivan rental. &lt;a href=&quot;https://chromamine.com/2024/07/summer-tour-with-kingfisher-reflections/#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;Inspired by &lt;a href=&quot;http://veino.com/site/pages/contra-caller.php&quot;&gt;Don Veino&lt;/a&gt; &lt;a href=&quot;https://chromamine.com/2024/07/summer-tour-with-kingfisher-reflections/#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;Other questions on this list:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What role terms are your dancers used to? (I generally call larks/robins, but can adjust to what your dancers need.)&lt;/li&gt;
&lt;li&gt;How many dancers do you generally get and how many are beginners?&lt;/li&gt;
&lt;li&gt;What does a promenade look like? (I added this question specifically for this tour, knowing the midwest has &lt;a href=&quot;https://www.jefftk.com/p/changing-contra-dialects&quot;&gt;variation in their promenade forms&lt;/a&gt;. I asked this of an organizer in person during setup so they could demonstrate.)&lt;/li&gt;
&lt;li&gt;Any other things I should know about the culture of your dance or preferences for my programming?&lt;/li&gt;
&lt;/ul&gt;
 &lt;a href=&quot;https://chromamine.com/2024/07/summer-tour-with-kingfisher-reflections/#fnref3&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/li&gt;
&lt;li id=&quot;fn4&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;The context on this one was that it was a beginner-heavy night! It surprises some experienced dances to learn (it surprised me), but Becket dances can often be easier for beginners and the one I called was &lt;a href=&quot;http://www.ibiblio.org/contradance/thecallersbox/dance.php?id=15807&quot;&gt;Will Mentor’s Festival Reel&lt;/a&gt;, which he wrote for just such a crowd, and which I’ve used &lt;a href=&quot;https://chromamine.com/2024/05/calling-the-first-dance-in-a-community/&quot;&gt;before&lt;/a&gt; for such purpose. &lt;a href=&quot;https://chromamine.com/2024/07/summer-tour-with-kingfisher-reflections/#fnref4&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>An Apple Shortcut for Converting Spotify Playlists to Apple Music</title>
            <link href="https://chromamine.com/2024/06/an-apple-shortcut-for-converting-spotify-playlists-to-apple-music/"/>
            <updated>2024-06-09T00:00:00Z</updated>
            <id>https://chromamine.com/2024/06/an-apple-shortcut-for-converting-spotify-playlists-to-apple-music/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;&lt;em&gt;If you would like to just use the iOS Shortcut &lt;a href=&quot;https://www.icloud.com/shortcuts/3c0b5cd993944f1aa8073f69350b71bf&quot;&gt;click here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I’m an Apple Music user and I’m reasonably happy with it as a service. I understand they pay artists at least a little more than streaming juggernaut Spotify&lt;a href=&quot;https://chromamine.com/2024/06/an-apple-shortcut-for-converting-spotify-playlists-to-apple-music/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt; and, as someone deeply embedded in Apple’s ecosystem&lt;a href=&quot;https://chromamine.com/2024/06/an-apple-shortcut-for-converting-spotify-playlists-to-apple-music/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt;, it’s good for me that it’s well integrated into the devices I use. One particularly annoying thing about being an Apple Music user is that a &lt;em&gt;ton&lt;/em&gt; of people and services &lt;em&gt;assume&lt;/em&gt; that I have a functioning Spotify account.&lt;/p&gt;
&lt;p&gt;I’ve been playing &lt;a href=&quot;https://musicleague.com/&quot;&gt;Music League&lt;/a&gt; with some friends lately. It’s a game where each round you submit a song related to a theme, it puts together a playlist of (anonymized) submissions, and you vote on which tracks you like best for the theme.&lt;/p&gt;
&lt;p&gt;It’s been fun &lt;em&gt;except&lt;/em&gt; that it generates a &lt;em&gt;Spotify&lt;/em&gt; playlist. Ugh! I’ve been manually recreating the playlist in Apple Music each week. It’s an irritating extra step and at least once I put off doing it and missed the voting deadline.&lt;/p&gt;
&lt;p&gt;Finally, this week, I put together an &lt;a href=&quot;https://support.apple.com/guide/shortcuts/welcome/ios&quot;&gt;Apple Shortcut&lt;/a&gt; that accepts a Spotify playlist URL and converts it to an Apple Music playlist. Apple Shortcuts is an automation tool provided on iOS, macOS, and iPadOS, which is surprisingly capable, though often poorly documented and occasionally quirky.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://chromamine.com/media/an-apple-shortcut-for-converting-spotify-playlists-to-apple-music/Spotify%20Playlist%20to%20Apple%20Music.shortcut&quot; class=&quot;button button-download&quot;&gt;Download Shortcut&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(You can also use this &lt;a href=&quot;https://www.icloud.com/shortcuts/3c0b5cd993944f1aa8073f69350b71bf&quot;&gt;iCloud link&lt;/a&gt;, which may be more convenient – but I like to host the file myself just in case.)&lt;/p&gt;
&lt;p&gt;You can invoke it from the Shortcuts app, add it to your home screen, or, as I have done, add it to your share sheet:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/iyb6LDiZgS-768.webp 768w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Screenshot of an iOS share sheet. It is sharing a link under the domain open.spotify.com titled &amp;quot;Name Check.&amp;quot; At the bottom are two options: Copy and Spotify Playlist to Apple Music&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/iyb6LDiZgS-768.jpeg&quot; width=&quot;768&quot; height=&quot;1504&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Here’s how it works, in brief:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;It requests the website version of the Spotify playlist and scrapes the HTML for Spotify IDs of the tracks. There’s a series of &lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt; tags in the HTML that look like this:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#7EE787&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;music:song&quot;&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#79C0FF&quot;&gt; content&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;https://open.spotify.com/track/0W6piFA90WF6OVPmmYVZQL&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The shortcut uses regex to search for the bit on the end which is the track ID.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It requests those IDs one by one from &lt;a href=&quot;https://odesli.co/&quot;&gt;Songlink/Odesli&lt;/a&gt;, a service for looking up songs across multiple streaming services. Here’s an &lt;a href=&quot;https://song.link/s/0W6piFA90WF6OVPmmYVZQL&quot;&gt;example lookup&lt;/a&gt;. On that page it scrapes for an Apple Music link, using regex again.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;
&lt;p&gt;If it finds an Apple Music link, it looks up the track in Apple Music.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It adds all the tracks it finds to a new playlist.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If Odesli fails to turn up an Apple Music link in step 2 (which &lt;a href=&quot;https://song.link/s/6kopmMZiyLmw7h66uXcXR7&quot;&gt;sometimes happens&lt;/a&gt;) it will search Apple Music by the track name and artist and add the first result it finds there. It issues an alert first and allows the user to choose to cancel or proceed.&lt;/p&gt;
&lt;p&gt;Some of the actions I used in this shortcut, particularly the ones to do with the iTunes Store, are poorly documented and fiddly. It required a couple hours of experimentation to get this shortcut working to my satisfaction. If you’re trying to do something similar, it might be a good example to look over – I’ve tried to add comments to help anyone reading through it along. It seems to work pretty consistently on iOS in my testing. I’ve had less good of a time getting it to work properly on macOS.&lt;/p&gt;
&lt;p&gt;I expect this Shortcut to be pretty brittle since it relies on web scraping. If either Spotify or Odesli change the code on their website and I don’t update the Shortcut, it may stop working. If you’re reading this blog post some years after it was released, &lt;em&gt;caveat emptor&lt;/em&gt;.&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Though I still try to purchase the albums outright for artists whose music I enjoy and want to support – especially indie artists and friends. &lt;a href=&quot;https://chromamine.com/2024/06/an-apple-shortcut-for-converting-spotify-playlists-to-apple-music/#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;I have a MacBook Pro, an iMac, an iPhone, an iPad, an Apple Watch, and a HomePod, to name some of the tech I use on a more-or-less weekly basis. &lt;a href=&quot;https://chromamine.com/2024/06/an-apple-shortcut-for-converting-spotify-playlists-to-apple-music/#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>A Selection of 3D Printing Designs Spring 2024</title>
            <link href="https://chromamine.com/2024/06/a-selection-of-3d-printing-designs-spring-2024/"/>
            <updated>2024-06-02T00:00:00Z</updated>
            <id>https://chromamine.com/2024/06/a-selection-of-3d-printing-designs-spring-2024/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;Here’s a small collection of quick designs I’ve made since I wrote my previous 3D printing blog post “&lt;a href=&quot;https://chromamine.com/2024/03/solving-problems-quickly-with-3d-printing/&quot;&gt;Solving Niche Problems Quickly With 3D Printing&lt;/a&gt;.”&lt;/p&gt;
&lt;h3&gt;An IKEA Skådis Sticky Note Holder&lt;/h3&gt;
&lt;p&gt;I designed this sticky note holder for my office pegboard. I made the pegs to be printed separately, both because I want to develop a modular system for creating pegboards accessories&lt;a href=&quot;https://chromamine.com/2024/06/a-selection-of-3d-printing-designs-spring-2024/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;, and because it allows me to print the pegs in the strong direction (laying flat) and without a need for supports for any of the parts. I glued them together with Gorilla Glue.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;js-stl-viewer&quot; data-src=&quot;/media/a-selection-of-3d-printing-designs-spring-2024/holder.stl&quot; data-alt=&quot;undefined&quot;&gt;
[Javascript required to view 3D model]
&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/capUUrtZZo-768.webp 768w, https://chromamine.com/media/img/capUUrtZZo-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/capUUrtZZo-768.jpeg 768w, https://chromamine.com/media/img/capUUrtZZo-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A white box with a vertically ribbed textured exterior, an open top, and a thumb slit running down the front. The box is mounted on an Ikea pegboard, next to a green plastic planter with a spider plant growing from it. Through the thumb slit a stack of multicolor sticky notes is visible. A hand is folding back the topmost note to tear it off.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/capUUrtZZo-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/D7dtRmC_xV-768.webp 768w, https://chromamine.com/media/img/D7dtRmC_xV-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/D7dtRmC_xV-768.jpeg 768w, https://chromamine.com/media/img/D7dtRmC_xV-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The white sticky note holder on the print bed. It has been printed in three separate parts—two small pegs that look oval feet attached to short legs and the box for holding the notes.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/D7dtRmC_xV-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/LHlgPe_d-C-768.webp 768w, https://chromamine.com/media/img/LHlgPe_d-C-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/LHlgPe_d-C-768.jpeg 768w, https://chromamine.com/media/img/LHlgPe_d-C-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Rear view of the sticky note holder assembled and with two pegs sticking out from the back.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/LHlgPe_d-C-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The files are available in a few sizes on &lt;a href=&quot;https://www.printables.com/model/822130-sticky-note-holder-for-ikea-skadis&quot;&gt;Printables&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;A Stand for an Articulated Manikin Hand&lt;/h3&gt;
&lt;p&gt;My housemate acquired this articulated wooden hand. Unfortunately it came with some mounting hardware that, even with some effort, she wasn’t able to remove herself. She requested a 3D print of a stand that the screw could fit into so she could pose the hand upright.&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/vgsfvdKQdR-768.webp 768w, https://chromamine.com/media/img/vgsfvdKQdR-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/vgsfvdKQdR-768.jpeg 768w, https://chromamine.com/media/img/vgsfvdKQdR-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A wooden articulated hand (like for drawing) laying on a counter. There is a metal threaded rod extending from the flat base of it, below the wrist. On the left side of the hand is a (real) hand holding a green and white plastic cylinder with a hole in the middle.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/vgsfvdKQdR-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/aJhsr0m8Gu-768.webp 768w, https://chromamine.com/media/img/aJhsr0m8Gu-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/aJhsr0m8Gu-768.jpeg 768w, https://chromamine.com/media/img/aJhsr0m8Gu-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The hand and plastic piece are joined so that at the base of the articulated hand, the plastic piece is mounted flush to it. They are standing upright on the counter.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/aJhsr0m8Gu-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;I was pleased that I was even able to get the pitch and size of the screw threads correct so that it actually screws into the printed base.&lt;a href=&quot;https://chromamine.com/2024/06/a-selection-of-3d-printing-designs-spring-2024/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;js-stl-viewer&quot; data-src=&quot;/media/a-selection-of-3d-printing-designs-spring-2024/handstand.stl&quot; data-alt=&quot;undefined&quot;&gt;
[Javascript required to view 3D model]
&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;A Clay Bead Roller&lt;/h3&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/rkx-xS4YTy-768.webp 768w, https://chromamine.com/media/img/rkx-xS4YTy-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/rkx-xS4YTy-768.jpeg 768w, https://chromamine.com/media/img/rkx-xS4YTy-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A person holding two red plastic pieces with channels running through them, one in each hand. In one of the pieces a lumpy bit of dark reddish clay is in each channel.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/rkx-xS4YTy-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;This was another project for my housemate. She’s recently been making beads out of flower petals&lt;a href=&quot;https://chromamine.com/2024/06/a-selection-of-3d-printing-designs-spring-2024/#fn3&quot; class=&quot;footnote-ref&quot; id=&quot;fnref3&quot;&gt;³&lt;/a&gt; and wanted a tool for making them round. I made these clay bead rollers. They’re used by putting a dot of clay in each channel and then rubbing the two interlocking parts against each other to make the clay in each channel into a sphere.&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/N_3ilXw3Qw-768.webp 768w, https://chromamine.com/media/img/N_3ilXw3Qw-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/N_3ilXw3Qw-768.jpeg 768w, https://chromamine.com/media/img/N_3ilXw3Qw-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The same hands now having places the two plastic pieces against each other and rubbing them together.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/N_3ilXw3Qw-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/wan2ZwAB_V-768.webp 768w, https://chromamine.com/media/img/wan2ZwAB_V-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/wan2ZwAB_V-768.jpeg 768w, https://chromamine.com/media/img/wan2ZwAB_V-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The red plastic pieces now opened up with round clay beads in the channels.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/wan2ZwAB_V-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;js-stl-viewer&quot; data-src=&quot;/media/a-selection-of-3d-printing-designs-spring-2024/bead-roller-10.stl&quot; data-alt=&quot;undefined&quot;&gt;
[Javascript required to view 3D model]
&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/_N2rpsx3me-768.webp 768w, https://chromamine.com/media/img/_N2rpsx3me-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/_N2rpsx3me-768.jpeg 768w, https://chromamine.com/media/img/_N2rpsx3me-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A green plastic tray full of clay beads with holes poked through.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/_N2rpsx3me-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;The files are available in a few sizes on &lt;a href=&quot;https://www.printables.com/model/884978-clay-bead-roller-parameterized&quot;&gt;Printables&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Decorative Easter Eggs&lt;/h3&gt;
&lt;p&gt;This is the oddball on this list. It’s a set of designs that are purely decorative. I entered these five patterned eggs into the &lt;a href=&quot;https://www.printables.com/contest/432-easter-2024&quot;&gt;Printables Easter decorations contest&lt;/a&gt;. I didn’t win the contest, but these are my most popular designs on the internet – by a wide margin.&lt;/p&gt;
&lt;p&gt;I really overthought the code for this one, replicating a formula for the shape of an egg found in &lt;a href=&quot;https://nyaspubs.onlinelibrary.wiley.com/doi/10.1111/nyas.14680&quot;&gt;this math paper&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;js-stl-viewer&quot; data-src=&quot;/media/a-selection-of-3d-printing-designs-spring-2024/egg-spiral.stl&quot; data-alt=&quot;undefined&quot;&gt;
[Javascript required to view 3D model]
&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/F5AHemCzIa-768.webp 768w, https://chromamine.com/media/img/F5AHemCzIa-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/F5AHemCzIa-768.jpeg 768w, https://chromamine.com/media/img/F5AHemCzIa-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Five easter eggs with various textured outer patterns in assorted colors: purple, sage green, and white.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/F5AHemCzIa-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;All five designs are available &lt;a href=&quot;https://www.printables.com/model/823574-decorative-easter-eggs-vase-mode-compatible&quot;&gt;on Printables&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;An Adapter for an Oversized Lampshade&lt;/h3&gt;
&lt;p&gt;A while back &lt;a href=&quot;http://www.ruthiebyers.com/&quot;&gt;Ruthie&lt;/a&gt; gifted me a “lumenator”&lt;a href=&quot;https://chromamine.com/2024/06/a-selection-of-3d-printing-designs-spring-2024/#fn4&quot; class=&quot;footnote-ref&quot; id=&quot;fnref4&quot;&gt;⁴&lt;/a&gt; which she built from a 7-to-1 light socket splitter and seven bright LED bulbs. She intended it to be hung from a ceiling, but I wanted to mount it on a table lamp base. I needed a lampshade because it was otherwise uncomfortably bright to have in my field of vision.&lt;/p&gt;
&lt;p&gt;I got a &lt;a href=&quot;https://www.ikea.com/us/en/p/ringsta-lamp-shade-white-70405361/&quot;&gt;large shade from IKEA&lt;/a&gt; but discovered the part where it would fit onto a socket was too large for my small lamp. So I quickly designed and printed this two part adapter that screws together around the lampshade’s mount and fits it onto my lamp.&lt;/p&gt;
&lt;p&gt;I got the tolerances off so it’s a little tippy, but I am pleased with how serviceable it is for 30 minutes of CAD and no revisions.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;js-stl-viewer&quot; data-src=&quot;/media/a-selection-of-3d-printing-designs-spring-2024/mount.stl&quot; data-alt=&quot;undefined&quot;&gt;
[Javascript required to view 3D model]
&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/RL9_U-yzoL-768.webp 768w, https://chromamine.com/media/img/RL9_U-yzoL-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/RL9_U-yzoL-768.jpeg 768w, https://chromamine.com/media/img/RL9_U-yzoL-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Two red plastic donut shaped objects side by side. One has three channels in the outer wall and an internal post with screw threads. The other has a knurled outer wall and internal screw threads.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/RL9_U-yzoL-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/5gnqhuCpPR-768.webp 768w, https://chromamine.com/media/img/5gnqhuCpPR-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/5gnqhuCpPR-768.jpeg 768w, https://chromamine.com/media/img/5gnqhuCpPR-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The two red parts screwed together around the frame of a lampshade. Three white metal rods extend from the channels in the red plastic.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/5gnqhuCpPR-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;image-grid&quot;&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/hhLRxmHvGX-768.webp 768w, https://chromamine.com/media/img/hhLRxmHvGX-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/hhLRxmHvGX-768.jpeg 768w, https://chromamine.com/media/img/hhLRxmHvGX-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Top view of the inside of the lampshade with the red plastic bit seated around the socket of a lamp base.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/hhLRxmHvGX-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/eIP4pCx7RD-768.webp 768w, https://chromamine.com/media/img/eIP4pCx7RD-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/eIP4pCx7RD-768.jpeg 768w, https://chromamine.com/media/img/eIP4pCx7RD-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A gray ceramic lamp on a shelf with a sligthly lopsided oversized lampshade over the top.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/eIP4pCx7RD-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3&gt;A Travel Pill Case&lt;/h3&gt;
&lt;p&gt;Typically when I travel I take three pills with me for use as-needed (not on a schedule). A weekly pill organizer isn’t optimal for this, but neither is bringing three separate pill bottles. There were a few designs available online for travel pill cases like this, but I wasn’t fully satisfied by them so I made my own with these features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Attractive exterior texture&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Three compartments for my usual travel meds (ibuprofen, cetirizine, and melatonin)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rounded inner compartments to ease sliding pills out&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;js-stl-viewer&quot; data-src=&quot;/media/a-selection-of-3d-printing-designs-spring-2024/pill-case.stl&quot; data-alt=&quot;undefined&quot;&gt;
[Javascript required to view 3D model]
&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/gr6FZOmjac-768.webp 768w, https://chromamine.com/media/img/gr6FZOmjac-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/gr6FZOmjac-768.jpeg 768w, https://chromamine.com/media/img/gr6FZOmjac-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A cylindrical pill case divided into thirds, pie-chart style, with each compartment filled with white or blue pills. The exterior has a knurled texture. The color is white with gray speckles, effecting a marbled look.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/gr6FZOmjac-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/YBO49j0eIk-768.webp 768w, https://chromamine.com/media/img/YBO49j0eIk-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/YBO49j0eIk-768.jpeg 768w, https://chromamine.com/media/img/YBO49j0eIk-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The empty pill case and a screw on top side by side.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/YBO49j0eIk-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/PRfioGPE0J-768.webp 768w, https://chromamine.com/media/img/PRfioGPE0J-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/PRfioGPE0J-768.jpeg 768w, https://chromamine.com/media/img/PRfioGPE0J-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The pill case with the top screwed on. It is flat on top. The knurled outer texture of the lid and compartment match.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/PRfioGPE0J-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3&gt;Anything You Want?&lt;/h3&gt;
&lt;p&gt;So far I’ve avoided opening a store to sell anything I design, but if you’re interested in anything I’ve made – especially if you’re a personal friend and I can give you the item in person or folk post it your way – please &lt;a href=&quot;mailto:blog@chromamine.com&quot;&gt;let me know&lt;/a&gt;! I’ve really been enjoying designing and printing physical objects and love excuses to do more of it.&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Still in progress. &lt;a href=&quot;https://chromamine.com/2024/06/a-selection-of-3d-printing-designs-spring-2024/#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;Though if I were making this for durability I probably would have purchased a metal threaded insert – plastic threads wear down easily or split at the layer lines under pressure. &lt;a href=&quot;https://chromamine.com/2024/06/a-selection-of-3d-printing-designs-spring-2024/#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;In a process that involves boiling the petals, pulverizing them, and then letting the pulp dry to the consistency of clay (and possibly some other steps I’m not aware of). &lt;a href=&quot;https://chromamine.com/2024/06/a-selection-of-3d-printing-designs-spring-2024/#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;There’s a &lt;a href=&quot;https://www.benkuhn.net/lux/&quot;&gt;number&lt;/a&gt; &lt;a href=&quot;https://www.lesswrong.com/posts/hC2NFsuf5anuGadFm/how-to-build-a-lumenator&quot;&gt;of&lt;/a&gt; &lt;a href=&quot;https://arbital.com/p/lumenators/&quot;&gt;articles&lt;/a&gt; online about this concept, but essentially the idea is to make an ultra-bright light to stave off Seasonal Affective Disorder or just the after-sundown sleepies – it’s much brighter than a conventional SAD lamp. &lt;a href=&quot;https://chromamine.com/2024/06/a-selection-of-3d-printing-designs-spring-2024/#fnref4&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>How should we notate role-free contra dance formation?</title>
            <link href="https://chromamine.com/2024/05/how-should-we-notate-role-free-contra-dance-formation/"/>
            <updated>2024-05-23T00:00:00Z</updated>
            <id>https://chromamine.com/2024/05/how-should-we-notate-role-free-contra-dance-formation/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;In response to my &lt;a href=&quot;https://chromamine.com/2024/05/calling-the-first-dance-in-a-community/&quot;&gt;most recent post about calling dances in Nantucket&lt;/a&gt;, &lt;a href=&quot;https://contra.maiamccormick.com/&quot;&gt;Maia&lt;/a&gt; wrote to me:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Harris, I have the world’s stupidest bone to pick with you. Re the dance cards on your website: I don’t think “Duple Neutral” actually means anything?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Okay, I should explain myself. First some background:&lt;/p&gt;
&lt;p&gt;When contra dance choreography is written out, one typically notes the formation of the dance in a brief phrase. The most common formations in modern contra dancing are &lt;strong&gt;duple improper&lt;/strong&gt; and &lt;strong&gt;becket&lt;/strong&gt; (which is itself a variation of duple improper&lt;a href=&quot;https://chromamine.com/2024/05/how-should-we-notate-role-free-contra-dance-formation/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Duple&lt;/strong&gt; here is short for &lt;strong&gt;duple minor&lt;/strong&gt; meaning dancers start in a long line of couples and break that line into smaller (minor) sets of two couples – four people each. When a caller says “take hands four” at the start of the dance, they are saying, in other words, “get into duple minor formation.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Improper&lt;/strong&gt; here means that every other couple switches places with their partner so that each ring of four has alternating lark-robin-lark-robin&lt;a href=&quot;https://chromamine.com/2024/05/how-should-we-notate-role-free-contra-dance-formation/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt; dancers. When a caller says “Ones&lt;a href=&quot;https://chromamine.com/2024/05/how-should-we-notate-role-free-contra-dance-formation/#fn3&quot; class=&quot;footnote-ref&quot; id=&quot;fnref3&quot;&gt;³&lt;/a&gt; cross over” they are saying, in other words, “get into improper formation.”&lt;/p&gt;
&lt;p&gt;This is contrasted with &lt;strong&gt;proper&lt;/strong&gt; formation in which the long line of couples has all the larks on one side and all the robins on the other. Many chestnuts&lt;a href=&quot;https://chromamine.com/2024/05/how-should-we-notate-role-free-contra-dance-formation/#fn4&quot; class=&quot;footnote-ref&quot; id=&quot;fnref4&quot;&gt;⁴&lt;/a&gt; are proper as well as the occasional modern contra and most English Country Dances. To a contra dancer in this day and age, proper formation often feels archaic.&lt;/p&gt;
&lt;div class=&quot;note&quot;&gt;
&lt;p&gt;I’m skipping over the explanation of &lt;strong&gt;becket&lt;/strong&gt; as well as the many other possible formations for contra dances – if you’re curious, you can peruse &lt;a href=&quot;https://www.ibiblio.org/contradance/thecallersbox/Glossary.htm#formations&quot;&gt;The Caller’s Box Glossary&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;When I was writing out my dance cards, I wanted a way to indicate that the dances were &lt;em&gt;neither&lt;/em&gt; proper nor improper since they didn’t have roles of significance at all. So I wrote “longways neutral” to mean “a line of couples, roles don’t matter” and “duple neutral” to mean, “minor sets of four dancers, roles don’t matter.”&lt;/p&gt;
&lt;p&gt;I didn’t take this notation from any source – though I did borrow the word “neutral” from a document of such dances that Maia shared with me. I’m not sure if there &lt;em&gt;is&lt;/em&gt; a standard for this. &lt;a href=&quot;https://www.ibiblio.org/contradance/thecallersbox/&quot;&gt;The Caller’s Box&lt;/a&gt; allows you to filter by formation and they list a number of “duple” formations, but none of them seem to specifically refer to role-free dances.&lt;/p&gt;
&lt;p&gt;The dances I called in Nantucket (&lt;a href=&quot;https://www.ibiblio.org/contradance/thecallersbox/dance.php?id=4677&quot;&gt;Galopede&lt;/a&gt;, &lt;a href=&quot;https://www.ibiblio.org/contradance/thecallersbox/dance.php?id=3461&quot;&gt;Jefferson and Liberty&lt;/a&gt;) are notated in the system as “proper” – which suggests something interesting: in most&lt;a href=&quot;https://chromamine.com/2024/05/how-should-we-notate-role-free-contra-dance-formation/#fn5&quot; class=&quot;footnote-ref&quot; id=&quot;fnref5&quot;&gt;⁵&lt;/a&gt; chestnuts it was &lt;em&gt;traditional&lt;/em&gt; for lines to be separated by gender, but as far as the choreography is concerned the roles are symmetrical. Perhaps “proper” is already the conventional way to notate such dances. But I can’t shake the unsettling sense that notating this way references and reinforces traditional gendered dance in a totally unnecessary way – because what does it really mean to tell each role to line up on their own side if there’s no choreographic difference between them? – but perhaps as we get deeper into the era of gender-free dancing, that meaning will shift and dancers will understand “proper” to mean “line up on whichever side, it doesn’t matter.”&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Except&lt;/em&gt;, annoyingly&lt;a href=&quot;https://chromamine.com/2024/05/how-should-we-notate-role-free-contra-dance-formation/#fn6&quot; class=&quot;footnote-ref&quot; id=&quot;fnref6&quot;&gt;⁶&lt;/a&gt;, there are also proper dances where roles &lt;em&gt;do matter,&lt;/em&gt; for example this dance from Erik Hoffman:&lt;/p&gt;
&lt;div class=&quot;dance-card&quot;&gt;&lt;header class=&quot;dance-header&quot;&gt;&lt;div class=&quot;dance-title&quot;&gt;Friday the Third Swing&lt;/div&gt;&lt;div class=&quot;dance-author&quot;&gt;Erik Hoffman&lt;/div&gt;&lt;div class=&quot;dance-formation&quot;&gt;Duple Proper&lt;/div&gt;&lt;/header&gt;&lt;div class=&quot;dance-choreo&quot;&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;A1&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Same-role nbr bal &amp; sw&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;A2&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Ones alle L 1½&lt;br /&gt;Nbr (opp role) sw&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;B1&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Larks rt sh round 1½&lt;br /&gt;Ptr sw&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;B2&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Circle L 3&lt;br /&gt;Twos half figure eight down&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;So, I see a few reasonable options for notating a role-free contra dance formation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make up a new notation as I did here with “neutral” – or adopt mine, now that you’ve read my blog post.&lt;/li&gt;
&lt;li&gt;Don’t indicate role-related formation at all. For a role-free longways dance, just call it “Longways.” For a role-free duple dance, just call it “Duple.”&lt;/li&gt;
&lt;li&gt;Use “Proper” and accept that sometimes proper means “roles don’t matter” and sometimes it means “roles do matter and they should line up on the same side.”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I may sound like I’m poo pooing that last one, and it’s not my favorite, but it also isn’t entirely unreasonable. There’s plenty of information that’s impractical to encode in a quick phrase that we leave to the choreography to communicate. For one example, we note if a dance is becket, but you have to read the choreography to determine if it progresses with a slide left at the start or not. &lt;em&gt;And&lt;/em&gt; this one has the advantage that it’s already what we mostly seem to be doing.&lt;/p&gt;
&lt;p&gt;Maybe there’s another option out there? Or a standard that I have completely overlooked?&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;&lt;em&gt;Usually&lt;/em&gt;, anyway. Caller’s Box does list &lt;em&gt;proper&lt;/em&gt; becket as a possible formation – hoo, boy, this stuff can get complicated. &lt;a href=&quot;https://chromamine.com/2024/05/how-should-we-notate-role-free-contra-dance-formation/#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;Historically contra dance roles were gendered, but at modern gender-free contra dances, we use gender-neutral terms like &lt;strong&gt;lark&lt;/strong&gt; and &lt;strong&gt;robin&lt;/strong&gt; instead. &lt;a href=&quot;https://chromamine.com/2024/05/how-should-we-notate-role-free-contra-dance-formation/#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;The Ones are the couple closest to the top of the hall (typically where the caller and band are) in each minor set. &lt;a href=&quot;https://chromamine.com/2024/05/how-should-we-notate-role-free-contra-dance-formation/#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;Traditional contra dances that are hundreds of years old. &lt;a href=&quot;https://chromamine.com/2024/05/how-should-we-notate-role-free-contra-dance-formation/#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;Perhaps all? I haven’t been thorough. &lt;a href=&quot;https://chromamine.com/2024/05/how-should-we-notate-role-free-contra-dance-formation/#fnref5&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn6&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Annoyed by the inconsistency, not by the existence of such dances, some of which are wonderful. &lt;a href=&quot;https://chromamine.com/2024/05/how-should-we-notate-role-free-contra-dance-formation/#fnref6&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Calling the First Dance for a Community</title>
            <link href="https://chromamine.com/2024/05/calling-the-first-dance-in-a-community/"/>
            <updated>2024-05-19T00:00:00Z</updated>
            <id>https://chromamine.com/2024/05/calling-the-first-dance-in-a-community/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/A1EblTipnq-768.webp 768w, https://chromamine.com/media/img/A1EblTipnq-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/A1EblTipnq-768.jpeg 768w, https://chromamine.com/media/img/A1EblTipnq-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A room with contra dancers holding two hands with their partner, in motion. In the background I&#39;m calling with a band.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/A1EblTipnq-768.jpeg&quot; width=&quot;1536&quot; height=&quot;864&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo by Tom Stoddart&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This week I called the Nantucket’s First &lt;a href=&quot;https://www.facebook.com/groups/651711967114830/&quot;&gt;Community Contra Dance&lt;/a&gt;. It was an unusual gig. The organizer is starting a contra dance community from scratch on the island. There were a small handful of experienced dancers she knew, but aside from them, the crowd was entirely new.&lt;/p&gt;
&lt;p&gt;It’s common for an evening dance to have a short (15–30 minute) workshop to teach beginners the basics. It’s not enough time to teach everything that’s needed to dance. Callers augment this by briefly teaching figures and techniques over the course of the evening during walkthroughs – and by relying on experienced dancers to direct newcomers on the floor, sharing knowledge and technique explicitly and implicitly. Since this dance had only a few experienced dancers in a crowd of about 45 people, I couldn’t rely on the latter at all.&lt;/p&gt;
&lt;p&gt;This matters more than an experienced dancer might think at first blush! There’s a long list of knowledge that is needed for even the simplest modern contras that experienced dancers take for granted: hands four, improper formation, progression, waiting out (and crossing over while waiting out), geography (across the set, side of the set, up the hall, down the hall), lark/robin roles, ending swings with roles on correct sides – and that’s before we’ve even talked about how one actually dances any of our extensive repertoire of figures. It’s a weighty collection of things for a beginner to learn in one go.&lt;/p&gt;
&lt;p&gt;This was also different from what callers often refer to as a “one night stand” dance, such as a wedding, where you have a crowd of dancers who have never done it before and may never do it again. At a dance like that, there isn’t much interest in learning. At ONS dances, callers typically call “barn dances” that are simple, require minimal teaching, and tolerate chaotic dancers.&lt;/p&gt;
&lt;p&gt;By contrast, at this dance, the organizer is deliberately trying to establish a community of regular dancers and – while dancers have come first and foremost to &lt;em&gt;have fun&lt;/em&gt; (the ultimate priority of any evening of contra dancing!) – they were also there expecting to &lt;em&gt;learn&lt;/em&gt;. I tried to program somewhere in between an ONS and a beginner-heavy contra dance and be strategic about my teaching:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I opted to forego a beginner lesson and teach entirely during walkthroughs over the course of the evening&lt;/li&gt;
&lt;li&gt;I started with some basic mixers and barn dances that could be done without much trouble&lt;/li&gt;
&lt;li&gt;I progressed to simple contra dances…&lt;/li&gt;
&lt;li&gt;Starting with one that is “neutral” – i.e., it doesn’t have two roles in any way that matters…&lt;/li&gt;
&lt;li&gt;Followed by one that has roles but doesn’t really matter where you end the swing…&lt;/li&gt;
&lt;li&gt;Followed by ones that have roles and it &lt;em&gt;does&lt;/em&gt; matter where you end the swing.&lt;/li&gt;
&lt;li&gt;With the exception of the neutral one, all of the contras were becket with a slide left progression to avoid beginners having to learn about and remember to cross over at the end of the set.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By all reports the evening went well. Nevertheless, being as this was the first dance with this many beginners that I’ve called (even “beginner-heavy” dances I’ve called are no more than 50% newbies), I made some errors and learned some lessons for the next time.&lt;/p&gt;
&lt;p&gt;This was my program:&lt;/p&gt;
&lt;div class=&quot;dance-card&quot;&gt;&lt;header class=&quot;dance-header&quot;&gt;&lt;div class=&quot;dance-title&quot;&gt;Easy Circle Of Fun&lt;/div&gt;&lt;div class=&quot;dance-author&quot;&gt;Linda Leslie&lt;/div&gt;&lt;div class=&quot;dance-formation&quot;&gt;Circle Mixer&lt;/div&gt;&lt;/header&gt;&lt;div class=&quot;dance-choreo&quot;&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;A1&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Fwd &amp; back (✕2)&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;A2&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Ptr alle R&lt;br /&gt;Ptr alle L&lt;br /&gt;Pass ptr by R&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;B1&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;New ptr DSD&lt;br /&gt;New ptr sw (elbow swing)&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;B2&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Promenade&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This dance introduced progression, allemandes, the swing (an elbow swing), and the promenade (with dancers simply holding hands, no particular promenade position).&lt;/p&gt;
&lt;p&gt;I started the evening with this simple circle mixer. I took a moment to teach some technique for the allemande, emphasizing giving weight so you could feel connection with you partner, but not gripping.&lt;/p&gt;
&lt;p&gt;Progressing was the trickiest part, since it depended on ending the swing where you started. I pointed out direction of progression early, but also told them it didn’t actually matter if they went back the other way by accident. The dance went well with a person occasionally getting stranded, but they generally found the other stranded person in the circle and joined up with them.&lt;/p&gt;
&lt;div class=&quot;dance-card&quot;&gt;&lt;header class=&quot;dance-header&quot;&gt;&lt;div class=&quot;dance-title&quot;&gt;Accretion Reel&lt;/div&gt;&lt;div class=&quot;dance-author&quot;&gt;Chris Page&lt;/div&gt;&lt;div class=&quot;dance-formation&quot;&gt;Scatter Mixer&lt;/div&gt;&lt;/header&gt;&lt;div class=&quot;dance-choreo&quot;&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;A1&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Bal ring&lt;br /&gt;Scatter, promenade single&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;A2&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Rt sh round a new ptr&lt;br /&gt;Ptr sw (elbow swing)&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;B1&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Promenade as couple&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;B2&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;With another couple circle L&lt;br /&gt;Circle R&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;I originally intended to start the evening with this one. I figured I could do it without a walkthrough, just by teaching the (very simple) figures as the music played. I liked that it removed any need to find a partner for the first dance and would tolerate lots of chaos. But I swapped it out when I arrived. The room was echoey and I was concerned I wouldn’t be clear enough for a no walkthrough. But I kept it for the second slot &lt;em&gt;with&lt;/em&gt; a walkthrough. It’s a chaotic dance to begin with and I think it hit the right level of fun and chaos for the room.&lt;/p&gt;
&lt;div class=&quot;dance-card&quot;&gt;&lt;header class=&quot;dance-header&quot;&gt;&lt;div class=&quot;dance-title&quot;&gt;Galopede&lt;/div&gt;&lt;div class=&quot;dance-author&quot;&gt;Traditional&lt;/div&gt;&lt;div class=&quot;dance-formation&quot;&gt;Longways Neutral&lt;/div&gt;&lt;/header&gt;&lt;div class=&quot;dance-choreo&quot;&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;A1&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Fwd &amp; back&lt;br /&gt;Pass ptr R and face back in&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;A2&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Fwd &amp; back&lt;br /&gt;Pass ptr R and face back in&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;B1&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Ptr DSD&lt;br /&gt;Ptr sw (two hand turn or contra swing for those who know)&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;B2&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Top couple sashay to bottom, everyone else move up&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This dance introduced longways formation.&lt;/p&gt;
&lt;p&gt;This is a typical barn/family dance. It’s easy and went smoothly. I suggested that those who knew the contra swing could do it, all others to two-hand turn.&lt;/p&gt;
&lt;div class=&quot;dance-card&quot;&gt;&lt;header class=&quot;dance-header&quot;&gt;&lt;div class=&quot;dance-title&quot;&gt;Jefferson and Liberty&lt;/div&gt;&lt;div class=&quot;dance-author&quot;&gt;Traditional&lt;/div&gt;&lt;div class=&quot;dance-formation&quot;&gt;Duple Neutral&lt;/div&gt;&lt;/header&gt;&lt;div class=&quot;dance-choreo&quot;&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;A1&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Circle L&lt;br /&gt;Circle R&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;A2&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Star R (hands-across)&lt;br /&gt;Star L (hands-across)&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;B1&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Ones down the outside&lt;br /&gt;Ones return&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;B2&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Line of 4 (ones in ctr) down the hall&lt;br /&gt;Back up four steps&lt;br /&gt;Ones arch, twos dive through&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This dance introduced duple formation (hands four), ones and twos, and progression as a couple.&lt;/p&gt;
&lt;p&gt;This is a classic contra dance (or at least a variation on one) that is role neutral. My favorite moment illustrating how little I could take for granted with new dancers took place during the walkthrough: I told dancers to take right hands with the person diagonally across from them to make a right hand star and walk it “in the convenient direction” – then watched as one minor set walked it &lt;em&gt;backwards&lt;/em&gt;!&lt;a href=&quot;https://chromamine.com/2024/05/calling-the-first-dance-in-a-community/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;But the dance worked well, though some dancers struggled with:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;going down the outside of the set&lt;a href=&quot;https://chromamine.com/2024/05/calling-the-first-dance-in-a-community/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;making sure the ones were in the center of a the line of four&lt;a href=&quot;https://chromamine.com/2024/05/calling-the-first-dance-in-a-community/#fn3&quot; class=&quot;footnote-ref&quot; id=&quot;fnref3&quot;&gt;³&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;arching and diving on time – dancers were often late for the circles&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The choreography is forgiving enough that none of these presented major issues. It all held together and everyone got to their lines of four for every down-the-hall.&lt;/p&gt;
&lt;div class=&quot;dance-card&quot;&gt;&lt;header class=&quot;dance-header&quot;&gt;&lt;div class=&quot;dance-title&quot;&gt;Festival Reel&lt;/div&gt;&lt;div class=&quot;dance-author&quot;&gt;Will Mentor&lt;/div&gt;&lt;div class=&quot;dance-formation&quot;&gt;Becket&lt;/div&gt;&lt;/header&gt;&lt;div class=&quot;dance-choreo&quot;&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;A1&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Slice L&lt;br /&gt;Long lines F&amp;B&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;A2&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Star L (hands-across)&lt;br /&gt;Star R (hands-across)&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;B1&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Robins DSD&lt;br /&gt;Larks DSD&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;B2&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Ptr B&amp;Sw&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This dance introduced Larks/Robins roles, duple improper formation (and then becket) as well as the contra dance swing and ending on the correct side.&lt;/p&gt;
&lt;p&gt;It is the first modern contra dance in my program, starting just about halfway through the evening. I took a moment before the dance to teach roles and demonstrate the contra dance swing. I also demonstrated ending the swing on correct sides, though this particular dance is forgiving if you don’t. This went smoothly, though I made one minor error:&lt;/p&gt;
&lt;p&gt;Because the dance starts with 8 beats to slide left I had dancers go forward and back twice the first time to eat the time. Each successive time through, it took them a while to slide left and get across from new neighbors, but they never forgot my original instructions to do the F&amp;amp;B twice, which made them regularly late for the stars. Fortunately the choreography was forgiving.&lt;/p&gt;
&lt;div class=&quot;update&quot;&gt;
&lt;p&gt;I chatted with Will Mentor after this dance, and he pointed out to me that the first figure is actually &lt;em&gt;slice&lt;/em&gt; left, not &lt;em&gt;slide&lt;/em&gt; left, meaning you are intended to go forward and back &lt;em&gt;as&lt;/em&gt; you shift to the left. So this was merely miscalled on my part and I made a note for next time. I’ve also corrected the choreography above.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;After this dance, the band played a waltz and we took a break. We returned with:&lt;/p&gt;
&lt;div class=&quot;dance-card&quot;&gt;&lt;header class=&quot;dance-header&quot;&gt;&lt;div class=&quot;dance-title&quot;&gt;Midwest Folklore&lt;/div&gt;&lt;div class=&quot;dance-author&quot;&gt;Orace Johnson&lt;/div&gt;&lt;div class=&quot;dance-formation&quot;&gt;Becket&lt;/div&gt;&lt;/header&gt;&lt;div class=&quot;dance-choreo&quot;&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;A1&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Slide L, circle L 3/4&lt;br /&gt;Nbr DSD&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;A2&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Nbr B&amp;Sw&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;B1&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Circle L 3/4&lt;br /&gt;Ptr DSD&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;B2&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Ptr Sw&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This was the most difficult dance of the evening. If I did it over, I’d likely take it out. Of two lines, one ran smoothly, but the other never got it and completely fell apart midway through. (I would have stopped at that point, but the dancers were valiantly determined to pull bring the line back together, so I gave them a few times through to give it a go!) These were the points of difficulty:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;As is fairly common to becket dances, but unlike the dance before and after this one, there’s little time for the slide left in this dance. It flows smoothly into the circle left – but that requires dancers know where they’re going when they slide left, otherwise they get behind immediately. Dancers were often late or occasionally didn’t slide left at all, despite my prompting, stranding couples in the middle of the line.&lt;/li&gt;
&lt;li&gt;In the biggest surprise of the night for me, &lt;em&gt;“circle left three places” was the most challenging figure of the evening&lt;/em&gt;! I saw some foursomes circle all the way around, halfway around, at one point ⅝ of the way around ending in a diamond! I’m not sure if I could have taught this better – perhaps with a slower “Mark each spot someone is standing on around this ring in your mind. You are going to circle to the left and end on the third spot,” or just better ensure they knew who their neighbor was and where the side of the set was. But possibly I should have just left any “fractional” figures out of the evening.&lt;/li&gt;
&lt;li&gt;Dancers didn’t know how to recover when couples were stranded alone in the middle of the set which sometimes caused cascading confusion as they tried to get into any circle of four that was nearby during the A1. (I gave some tips on recovery before the next dance.)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;dance-card&quot;&gt;&lt;header class=&quot;dance-header&quot;&gt;&lt;div class=&quot;dance-title&quot;&gt;Festival Waves&lt;/div&gt;&lt;div class=&quot;dance-author&quot;&gt;Will Mentor&lt;/div&gt;&lt;div class=&quot;dance-formation&quot;&gt;Becket&lt;/div&gt;&lt;/header&gt;&lt;div class=&quot;dance-choreo&quot;&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;A1&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Robins walk fwd to long wave of robins&lt;br /&gt;Bal wave&lt;br /&gt;Robins back, larks walk fwd to long wave&lt;br /&gt;Bal wave&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;A2&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;(Larks walk fwd to) Nbr DSD&lt;br /&gt;Nbr sw&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;B1&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Larks cross by R, ptr sw&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;B2&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Long lines F&amp;B&lt;br /&gt;Slice L&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;I consolidated the dancers to a single line. I figured we had a small enough group to fit in a single line and that it would actually be beneficial for the dancers to be closer together as well as for the dancers who were really getting it to be able to assist those who were a little more confused.&lt;/p&gt;
&lt;p&gt;This dance took a bit more teaching than I expected – dancers, being new to their roles, didn’t always respond immediately to robins/larks – but after the walkthrough, it went smoothly.&lt;/p&gt;
&lt;div class=&quot;dance-card&quot;&gt;&lt;header class=&quot;dance-header&quot;&gt;&lt;div class=&quot;dance-title&quot;&gt;Coke the Floor&lt;/div&gt;&lt;div class=&quot;dance-author&quot;&gt;Marian Rose&lt;/div&gt;&lt;div class=&quot;dance-formation&quot;&gt;Circle Mixer&lt;/div&gt;&lt;/header&gt;&lt;div class=&quot;dance-choreo&quot;&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;A1&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Fwd &amp; back&lt;br /&gt;Fwd, robins back out, larks face ptr&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;A2&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;All sashay R&lt;br /&gt;All sashay L&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;B1&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Ptr B&amp;Sw&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;dance-section&quot;&gt;&lt;div class=&quot;dance-section-label&quot;&gt;B2&lt;/div&gt;&lt;div class=&quot;dance-section-lines&quot;&gt;Promenade (CCW, robins outside)&lt;br /&gt;Robins turn back over rt sh as larks continue fwd&lt;br /&gt;Prom with new ptr&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;I closed with this circle mixer. It went smoothly, though dancers were conservative about how far they would sashay and kept turning back to sashay left before I prompted it. I threw in a few calls of “You can go further! And back to the left &lt;em&gt;now&lt;/em&gt;,” to encourage them along, which helped. The turn back from promenade progression took some fussing, but everyone seemed to get it in time for the big circle at the start.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Some things I’m thinking about for the next time I call a dance like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I would have liked to get in more than eight dances, but, given that I opted not to do a usual 30m workshop at the start, knowing I would spend more time during the dance teaching, I think it’s a respectable number for a 2½ hour dance.&lt;/li&gt;
&lt;li&gt;Along those lines I would have prepped more simple barn dances that needed less teaching. Because we are trying to establish a new contra dance community, I thought it was good that we got to some simple contras, but I would drop the most complex one and would have liked to have a barn dance to return to when things got complicated, to give the dancers a break and keep the momentum going. (To some extent this is a repertoire problem that will solve itself as I continue to grow my collection. In the second half I &lt;em&gt;knew&lt;/em&gt; I wanted to call a beginner dance, I just had blown through my prepped beginner dances in the first half, whoops.)&lt;/li&gt;
&lt;li&gt;I incorporated some tips on how to recover when things went wrong later in the evening, but I wonder if I should have done that more clearly earlier in the evening.&lt;/li&gt;
&lt;li&gt;I also wonder if I should have made some notes about the music. I don’t typically teach beginners anything about the music, but, since there were few experienced dancers with the intuition or knowledge to keep others on time, maybe I could have helped along those with musical knowledge if I mentioned that a figure was 8 or 16 beats long and aligned with the musical phrases. (I did see some people intuit this when I dropped calls – which I didn’t do much – but not everyone.) Or perhaps it’s just the nature of a dance like this that the timing will be fuzzy.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Despite my notes on things that could have gone better, my impression is the dance was a success! There was an enthusiastic and intergenerational group of dancers. The organizer gave me some hearty compliments on my calling (thanks, Graeme!) and said she received many people asking when the next one would be – and disappointed responses when she said it wouldn’t be till fall! The dancers seemed excited to be learning and were attentive the whole time. We kept the mood light and even during the train wreck dance I saw a lot of smiles on the dance floor. It seemed like a good time was had by all.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/IKSYtGSofn-768.webp 768w, https://chromamine.com/media/img/IKSYtGSofn-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/IKSYtGSofn-768.jpeg 768w, https://chromamine.com/media/img/IKSYtGSofn-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A room with contra dancers holding two hands with their partner, in motion. In the background I&#39;m calling with a band.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/IKSYtGSofn-768.jpeg&quot; width=&quot;1536&quot; height=&quot;864&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo by Tom Stoddart&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;A huge amount of credit goes to Graeme for putting this event on. And thanks to Sam Zakon-Anderson and Eric Boodman for being such a friendly, talented, and accomodating band. Also a huge thanks to &lt;a href=&quot;https://contra.maiamccormick.com/&quot;&gt;Maia&lt;/a&gt;, as ever, for being my calling mentor/partner-in-crime and giving me a ton of really good advice and dance suggestions before the event – some of which I even followed.&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;My guess is that, because the star R flowed out of a circle R, this particular foursome still had the momentum of the circle R in their head. I gently corrected them with, “I saw one set walked that star backing up, which is super impressive, but I did actually mean for you to walk forwards.” &lt;a href=&quot;https://chromamine.com/2024/05/calling-the-first-dance-in-a-community/#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;I &lt;em&gt;think&lt;/em&gt; what happened here was just leaving the line made them uncertain and they didn’t want to go very far? &lt;a href=&quot;https://chromamine.com/2024/05/calling-the-first-dance-in-a-community/#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;For sets that got this wrong, their progression reversed. &lt;a href=&quot;https://chromamine.com/2024/05/calling-the-first-dance-in-a-community/#fnref3&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Calling Contras at Porchfest 2024</title>
            <link href="https://chromamine.com/2024/05/calling-contras-at-porchfest-2024/"/>
            <updated>2024-05-14T00:00:00Z</updated>
            <id>https://chromamine.com/2024/05/calling-contras-at-porchfest-2024/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/jGPlFg1qK2-768.webp 768w, https://chromamine.com/media/img/jGPlFg1qK2-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/jGPlFg1qK2-768.jpeg 768w, https://chromamine.com/media/img/jGPlFg1qK2-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A street filled with people at some sort of festival as viewed from the porch of a house on that street. In the foreground, on the porch, a man with long black hair is standing at a microphone.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/jGPlFg1qK2-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1024&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo by &lt;a href=&quot;https://juliawise.net/about/&quot;&gt;Julia Wise&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;For the second year in a row &lt;a href=&quot;https://jefftk.com/&quot;&gt;Jeff&lt;/a&gt; invited me to call contra dances with his band &lt;a href=&quot;https://kingfisherband.com/&quot;&gt;Kingfisher&lt;/a&gt; on his porch for &lt;a href=&quot;https://www.somervilleartscouncil.org/porchfest&quot;&gt;Somerville Porchfest&lt;/a&gt;, for dancers in the street. I wrote a bit &lt;a href=&quot;https://chromamine.com/2023/05/calling-dances-at-porchfest/&quot;&gt;last year&lt;/a&gt; about some of the interesting challenges in calling at this particular event and they were the same this year:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We wanted to prioritize music, so made limited time for teaching and walkthroughs.&lt;/li&gt;
&lt;li&gt;There were a lot of would-be beginners milling around, but given lack of teaching, they would be pretty confused if they joined the dances! (At the same time, an event like this is a great opportunity to bring in beginners who happen upon it – if they have fun, maybe they’ll come to &lt;a href=&quot;https://www.bidadance.org/&quot;&gt;BIDA&lt;/a&gt;!)&lt;/li&gt;
&lt;li&gt;During a typical contra dance evening, I structure my program to build skills gradually, teaching dancers new figures and techniques. Since people were coming and going, there was no room for that at Porchfest.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Some things I did differently from last year:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I put two circle mixers in my program, specifically to have dances that &lt;em&gt;all&lt;/em&gt; could join in for. Circle mixers tend to be simple and if something goes wrong and someone ends up without a partner they can easily drop out or go to the “lost and found” in the center to find a new partner and rejoin the circle. Mixers are tolerant of some chaos.&lt;a href=&quot;https://chromamine.com/2024/05/calling-contras-at-porchfest-2024/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;I treated it more like a typical contra dance event in that I kept control of dance duration, signalling the band how long to play their sets for. (Last year, thinking of it more like a concert with contra dancing on the side, I let the band make these decisions, which I thought was an error, in retrospect.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some things I mostly did the same:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I made announcements before each dance, telling people what to expect and gently encouraging or discouraging beginners as needed. I did this last year, but this time I prepped them in advance and was clearer and more confident in announcing them. This sounded like:
&lt;ul&gt;
&lt;li&gt;“This dance will have a brief walkthrough. If you want to join, find an experienced dancer who can pull you through it.” (As with last year we would sometimes do a full walkthrough, but often we would do a rolling start&lt;a href=&quot;https://chromamine.com/2024/05/calling-contras-at-porchfest-2024/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt;.)&lt;/li&gt;
&lt;li&gt;“This dance is a circle mixer that anyone can join.”&lt;/li&gt;
&lt;li&gt;“This dance will have no walkthrough and is for experienced dancers. If you know how to do a hey, you’ll be fine.”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;I kept dances pretty simple. Nothing that required much teaching or would be error prone.&lt;/li&gt;
&lt;li&gt;With only one exception (deliberately, this year&lt;a href=&quot;https://chromamine.com/2024/05/calling-contras-at-porchfest-2024/#fn3&quot; class=&quot;footnote-ref&quot; id=&quot;fnref3&quot;&gt;³&lt;/a&gt;) I kept it to dances where interaction was limited to dancers’ minor sets, to minimize cascading confusion.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I’m not sure which factors account for it – having dances specifically for beginners, being more clear and confident in announcing dance difficulty, my state of mind, or the rowdy crowd being at the &lt;a href=&quot;https://www.boston.com/news/local-news/2024/05/12/guster-plays-to-a-packed-crowd-at-somerville-porchfest/&quot;&gt;Guster show&lt;/a&gt; instead – but this year felt smoother and more in control. Fewer beginners joined for the dances I established for experienced dancers, tons joined for the mixers. I heard from dancers afterward that there were some tipsy dancers, but no one disruptive. (Last year I observed new dancers joining the line with drinks in hand!) It wasn’t as hot as last year, which meant dancers were less tired and more coordinated.&lt;/p&gt;
&lt;p&gt;We had a long line that spanned half the block. There were some traffic issues; the street was supposed to be closed, but some cars made through and I had to coordinate dancers allowing them to pass on the fly, which was annoying and awkward. Jeff wrote a bit more about his &lt;a href=&quot;https://www.jefftk.com/p/somerville-porchfest-thoughts&quot;&gt;traffic logistic thoughts&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For the last dance of the afternoon I called “Train Delay,” a dance with a shadow interaction – my one exception to the remain-in-the-minor-set rule. I announced ahead of time that it was for experienced dancers, but I noticed a number of beginner couples joined, all in a row. I made a follow up announcement, in case they hadn’t heard, something like, “This dance will have figures that we haven’t done yet and is for experienced dancers. If you’re new… well, you’ll probably have a good time, but you might struggle a bit first.” I wasn’t well-prepared enough to pull out a backup dance instead and I didn’t have time to do a long walkthrough; Kingfisher had another gig that evening and we only had time for a quick dance left. I saw some dancers give each other looks, but they stayed in line.&lt;/p&gt;
&lt;p&gt;And it turned out fine! The first couple times through the dance were indeed messy in the section of the line where beginners had joined, but everyone managed to progress. The shadow interaction seemed more helpful than confusing to the beginners, somewhat surprising me, because it gave them another consistent person to look for during the dance. After a few times through the beginners were fully incorporated and the dance ran smoothly.&lt;/p&gt;
&lt;p&gt;In a 1½ hour event we got through seven dances (including the two circle mixers) and Kingfisher played a tune at the start to warm up and a waltz at the end, which was roughly what I had aimed for.&lt;/p&gt;
&lt;p&gt;This was my program:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Tica Tica Timing/Old Time Elixir #2&lt;/em&gt;, Dean Snipes/Linda Leslie (No walkthrough)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Adams Amble&lt;/em&gt;, Linda Leslie (Circle mixer)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Butter&lt;/em&gt;, Gene Hubert (No walkthrough)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Midwest Folklore&lt;/em&gt;, Orace Johnson (Rolling start)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;The Second Time Around&lt;/em&gt;, Jim Kitch (Rolling start)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Coke the Floor&lt;/em&gt;, Marian Rose (Circle mixer)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Train Delay&lt;/em&gt;, Maia McCormick (Rolling start)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I tried to annotate where we did no-walkthrough and rolling start dances, but I was taking pretty messy notes during the event. It’s possible I actually did do a full walkthrough for one of those.&lt;/p&gt;
&lt;iframe style=&quot;width: 100%; aspect-ratio: 560 / 315;&quot; src=&quot;https://www.youtube-nocookie.com/embed/Bp1xdHfNBgs?si=s7YxBsLHxuBTGDvA&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=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;em&gt;The dance is “Adams Amble” by Linda Leslie and the tune is “June Apple.”&lt;/em&gt;&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;At a typical “one night stand” dance, with dancers who have never done it before and may never do it again, a caller will usually program an entire evening of barn dances similar to these – mixers, strip-the-willow, virginia reel, etc. – rather than longways contra dances, where even the simplest ones require learning a few figures and the mechanics of progression as a couple from one set of neighbors to the next. We didn’t want to limit ourselves to &lt;em&gt;only&lt;/em&gt; dances like that, since the band wanted to play sets for contras and there &lt;em&gt;were&lt;/em&gt; a good number of experienced dancers. &lt;a href=&quot;https://chromamine.com/2024/05/calling-contras-at-porchfest-2024/#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;In which the band starts playing lightly during the walkthrough, providing a smooth, unmarked, transition from teaching to dancing. &lt;a href=&quot;https://chromamine.com/2024/05/calling-contras-at-porchfest-2024/#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;I made an exception accidentally last year 😳 &lt;a href=&quot;https://chromamine.com/2024/05/calling-contras-at-porchfest-2024/#fnref3&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Shooting with a Nikon D70 in the smartphone age</title>
            <link href="https://chromamine.com/2024/04/shooting-with-a-nikon-d70-in-the-smartphone-age/"/>
            <updated>2024-04-22T00:00:00Z</updated>
            <id>https://chromamine.com/2024/04/shooting-with-a-nikon-d70-in-the-smartphone-age/</id>
            <content xml:lang="en-us" type="html">&lt;div class=&quot;update&quot;&gt;
&lt;p&gt;I’ve since taken more photos with the D70 which can be &lt;a href=&quot;https://chromamine.com/2024/08/some-favorite-d70-shots-spring-2024/&quot;&gt;seen here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I used to do photography somewhat seriously. I was an amateur, but a reasonably devoted one. In high school I took photos with a &lt;a href=&quot;https://en.wikipedia.org/wiki/Pentax_K1000&quot;&gt;Pentax K1000&lt;/a&gt; that my father passed down to me. I shot in color film and dropped rolls to be developed at Elephant Pharmacy (&lt;a href=&quot;https://www.berkeleyside.org/2010/10/29/walgreens-to-take-over-elephant-pharmacy-space&quot;&gt;RIP&lt;/a&gt;) on my way home from school. I shot in black and white and developed them myself in the Berkeley High School darkroom. In college I bought myself a &lt;a href=&quot;https://en.wikipedia.org/wiki/Digital_single-lens_reflex_camera&quot;&gt;digital SLR&lt;/a&gt;, a &lt;a href=&quot;https://en.wikipedia.org/wiki/Nikon_D50&quot;&gt;Nikon D50&lt;/a&gt;, and shot with that for a while.&lt;/p&gt;
&lt;p&gt;I lost the photography bug. Other interests pulled me away. I was intimidated by my friends who were better photographers&lt;a href=&quot;https://chromamine.com/2024/04/shooting-with-a-nikon-d70-in-the-smartphone-age/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;. And, eventually, I was twice discouraged by the advent of smartphones: once because there was no longer a role to fill as &lt;em&gt;the person&lt;/em&gt; who documented the lives of people around you – everyone does that now – and once because I learned to prefer the convenience of an iPhone to the comparatively beastly D50 and its array of interchangeable lenses.&lt;/p&gt;
&lt;p&gt;I’ve been thinking about photography again lately – I’m not sure why. I considered buying a fancy new camera, but discovered that modern &lt;a href=&quot;https://en.wikipedia.org/wiki/Mirrorless_camera&quot;&gt;mirrorless&lt;/a&gt; cameras are pricey&lt;a href=&quot;https://chromamine.com/2024/04/shooting-with-a-nikon-d70-in-the-smartphone-age/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt;. I sometimes have a dabbling spirit when it comes to new hobbies. It didn’t seem wise to sink a bunch of money into this one immediately. I decided to dust off an older &lt;a href=&quot;https://en.wikipedia.org/wiki/Digital_single-lens_reflex_camera&quot;&gt;DSLR&lt;/a&gt; and see if I enjoyed it in 2024.&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/MLkcoKtaQc-768.webp 768w, https://chromamine.com/media/img/MLkcoKtaQc-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/MLkcoKtaQc-768.jpeg 768w, https://chromamine.com/media/img/MLkcoKtaQc-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A blond woman with a focused smile adding a zig zag drizzle of hot sauce to the white melted cheese of a breakfast sandwich.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/MLkcoKtaQc-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2310&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/ir4mJ3Zty8-768.webp 768w, https://chromamine.com/media/img/ir4mJ3Zty8-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/ir4mJ3Zty8-768.jpeg 768w, https://chromamine.com/media/img/ir4mJ3Zty8-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Close up of the breakfast sandwich receiving a drizzle of red hot sauce.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/ir4mJ3Zty8-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2310&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Annaleah applying hot sauce to a breakfast sandwich. Both taken with a Nikon D70.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Instead of my D50, which has sensor issues, I turned to a D70 (a slightly older model) that my mother acquired for free years ago and gifted to me.&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/D3TsSufa5U-768.webp 768w, https://chromamine.com/media/img/D3TsSufa5U-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/D3TsSufa5U-768.jpeg 768w, https://chromamine.com/media/img/D3TsSufa5U-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A light brown poodle, sitting with a well-behaved smile, out in the sunshine.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/D3TsSufa5U-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2310&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/rEcfOqF3Wy-768.webp 768w, https://chromamine.com/media/img/rEcfOqF3Wy-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/rEcfOqF3Wy-768.jpeg 768w, https://chromamine.com/media/img/rEcfOqF3Wy-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A long haired redheaded guitar player, wearing a cropped blue t shirt, standing and playing an acoustic guitar on stage.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/rEcfOqF3Wy-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2310&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;First: Out for a walk with Basil. Second: &lt;a href=&quot;https://alexsturbaum.com/&quot;&gt;Alex Sturbaum&lt;/a&gt; playing &lt;a href=&quot;https://dandelionromp.com/&quot;&gt;Dandelion Romp&lt;/a&gt; as part of &lt;a href=&quot;https://theengineroommusic.bandcamp.com/album/volume-one&quot;&gt;The Engine Room&lt;/a&gt;. Both taken with a Nikon D70._&lt;/p&gt;
&lt;p&gt;I’m mostly happy with the images I’ve captured on the D70, but it surprised me that they’re not consistently better than the ones I take with my iPhone. They also take a lot more work – though that’s less surprising. I already knew smartphone camera technology had progressed leaps and bounds in the past decade. I hadn’t comprehended how many of those advances improved even beyond DSLRs like the D50 and D70. I took some side by side photos to observe the differences.&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/DayZq7xmM5-768.webp 768w, https://chromamine.com/media/img/DayZq7xmM5-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/DayZq7xmM5-768.jpeg 768w, https://chromamine.com/media/img/DayZq7xmM5-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A photo of myself reflected three times in a divided bathroom mirror. The light has a purple tint. I am holding a Nikon DSLR with an iPhone mounted to the top with a black plastic phone mount.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/DayZq7xmM5-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1021&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/f1BVq4TGM9-768.webp 768w, https://chromamine.com/media/img/f1BVq4TGM9-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/f1BVq4TGM9-768.jpeg 768w, https://chromamine.com/media/img/f1BVq4TGM9-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The same photo, but in this one the edges of the mirrors are in focus and there are visible specks of grime on the mirror surface.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/f1BVq4TGM9-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1024&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Bathroom selfies showing my apparatus for using both cameras simultaneously. First: Nikon, Second: iPhone&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It’s worth reiterating here that I have never been a particularly expert photographer and it’s been years since my expertise was at its peak. It’s possible I’ve made technical errors or used terms of art incorrectly, though I’ve tried my best. I’ve made color adjustments and cropped to improve the photos and make them more comparable. I’m as amateur at editing as I am at capturing. In practice the D70 images required much more editing to get colors I was happy with.&lt;/p&gt;
&lt;p&gt;I wasn’t particularly scientific: I didn’t devise an array of subjects that that would test various factors. I vaguely tried to match shots between cameras but wasn’t super careful. I simply went out and took photos – twice – of whatever caught my eye. I also biased toward circumstances where the D70 shines and I selected images where the competition is closest – this is far from a random sample. The D70 loves bright and outdoor environments and struggles in medium- to low-light scenarios where my iPhone did fine.&lt;/p&gt;
&lt;h3&gt;iPhone photos are sharper.&lt;/h3&gt;
&lt;p&gt;In the pictures below – among other differences – you can notice that the grain of the street, the ripples in the puddle, and the texture of the paint on the hydrant are in sharper relief in the iPhone image. Some of this is explained by a focus difference, but not all of it.&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/K-MY6R5SET-768.webp 768w, https://chromamine.com/media/img/K-MY6R5SET-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/K-MY6R5SET-768.jpeg 768w, https://chromamine.com/media/img/K-MY6R5SET-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A red fire hydrant with a blue top and arms on a rainy day.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/K-MY6R5SET-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1021&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/Goz3UCs4lP-768.webp 768w, https://chromamine.com/media/img/Goz3UCs4lP-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/Goz3UCs4lP-768.jpeg 768w, https://chromamine.com/media/img/Goz3UCs4lP-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A red fire hydrant with a blue top and arms on a rainy day. The texture of the hydrant itself and the road behind the hydrant are higher contrast, less smoothed out.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/Goz3UCs4lP-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1024&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;First: Nikon, Second: iPhone&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I’d hypothesize a few reasons for this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The iPhone takes photos with 12 megapixels in contrast to the D70’s 6&lt;a href=&quot;https://chromamine.com/2024/04/shooting-with-a-nikon-d70-in-the-smartphone-age/#fn3&quot; class=&quot;footnote-ref&quot; id=&quot;fnref3&quot;&gt;³&lt;/a&gt;. The photos are sharper purely as a result of the extra pixels. I assume the sensor, generally, is higher quality.&lt;/li&gt;
&lt;li&gt;The iPhone’s autofocus is better than the D70. It’s faster and more accurate and sports features like prioritizing focus on faces. It also seems to optimize the moment of capture to wait for the sharpest focus.&lt;/li&gt;
&lt;li&gt;Behind the scenes I believe the iPhone does some technology magic taking multiple frames, selecting from them, and recombining them, which I suspect includes some improvements to sharpness.&lt;/li&gt;
&lt;li&gt;The iPhone is better at low-light and mid-light situations (see next item), which forces me to make compromises on the D70 (large aperture, long exposure) that sacrifice crispness.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Initially this seemed straightforwardly like an advantage for the iPhone, but as I’ve spent more time with images from both, purely subjectively, I’ve found that sometimes the sharp way the iPhone captures textures feels aggressive or exaggerated somehow and distracts from other aspects of the image compared to the D70. For example, in the image below, I prefer the soft contrast of the wall texture in the Nikon image that allows the brightly colored bike to pop more.&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/pPPwclxwNp-768.webp 768w, https://chromamine.com/media/img/pPPwclxwNp-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/pPPwclxwNp-768.jpeg 768w, https://chromamine.com/media/img/pPPwclxwNp-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;An orange bike against a speckled concrete wall. The image has a soft smooth quality.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/pPPwclxwNp-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1021&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/J1JBULuWWp-768.webp 768w, https://chromamine.com/media/img/J1JBULuWWp-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/J1JBULuWWp-768.jpeg 768w, https://chromamine.com/media/img/J1JBULuWWp-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;An orange bike against a speckled concrete wall. The speckling on the wall behind the bike is pronounced.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/J1JBULuWWp-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1024&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;First: Nikon, Second: iPhone&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;The iPhone is better in low-light and even medium-light situations.&lt;/h3&gt;
&lt;p&gt;The D70 excels in bright light, especially sunlight. In dim light or even standard household evening lighting, I have to bump up exposure time, ISO&lt;a href=&quot;https://chromamine.com/2024/04/shooting-with-a-nikon-d70-in-the-smartphone-age/#fn4&quot; class=&quot;footnote-ref&quot; id=&quot;fnref4&quot;&gt;⁴&lt;/a&gt;, and/or aperture size to get a decent picture. (Or use a flash, I suppose, which is what I used to do, but I haven’t broken out my flash this year so far and, anecdotally, I think flash photography is less common and less tolerated than it used to be.)&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/W47-7AGo5s-768.webp 768w, https://chromamine.com/media/img/W47-7AGo5s-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/W47-7AGo5s-768.jpeg 768w, https://chromamine.com/media/img/W47-7AGo5s-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Close up portrait of a brunette woman with glasses. The image is dark warm-toned and a bit blurry.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/W47-7AGo5s-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2310&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/74mBBd-7J9-768.webp 768w, https://chromamine.com/media/img/74mBBd-7J9-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/74mBBd-7J9-768.jpeg 768w, https://chromamine.com/media/img/74mBBd-7J9-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Close up portrait of the same woman, but this image is crisper and brighter, though it has a visible graininess. Even the texture of the upholstery of her seat shows better.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/74mBBd-7J9-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2304&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Drinks in a medium-lit bar with Jen. First: Nikon, Second: iPhone&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Both cameras struggle in dim lighting, but the iPhone produces images that are a little sharper and have colors that feel truer-to-life. The D70 image above required a fair bit of processing to get it to this level and, with my current editing skills, I still wasn’t able to get it closer to reality.&lt;/p&gt;
&lt;h3&gt;Depth of field effects on the D70 are more pronounced and natural.&lt;/h3&gt;
&lt;p&gt;It’s often desirable in photography to have parts of a scene, particularly the parts that are not the primary subject of the photo, blurry and out of focus. (On the other hand, too much of this can be &lt;em&gt;too much&lt;/em&gt; and when poorly controlled can exacerbate the crispness issues above.) This effect is less pronounced on smaller lenses like you might find on an iPhone. The unambiguous strength of even an old SLR against modern phone cameras is more powerful and swappable lenses. The lens I used for most of my Nikon shots is a Nikon 50mm f/1.8 D, which can produce very nice depth of field effects.&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/6zETKGtKWE-768.webp 768w, https://chromamine.com/media/img/6zETKGtKWE-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/6zETKGtKWE-768.jpeg 768w, https://chromamine.com/media/img/6zETKGtKWE-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A smiling brown-haired woman with a baby strapped to her chest. The image has a soft quality but individual hairs are crisply rendered even at the edges.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/6zETKGtKWE-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2310&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/ykzEVVrk2E-768.webp 768w, https://chromamine.com/media/img/ykzEVVrk2E-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/ykzEVVrk2E-768.jpeg 768w, https://chromamine.com/media/img/ykzEVVrk2E-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A smiling brown-haired woman with a baby strapped to her chest. The image is crisper, but there are some blurring artifacts around the edges of the woman&#39;s hair.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/ykzEVVrk2E-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2304&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Ruthie and Josephine. Lower f-stop simulated with portrait mode on the iPhone image. First: Nikon, Second: iPhone&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;iPhones have a “portrait mode” which is designed to simulate a shallower depth of field than their lenses really produce, but it can’t produce as coarse of a &lt;a href=&quot;https://en.wikipedia.org/wiki/Bokeh&quot;&gt;bokeh&lt;/a&gt; as a larger camera lens, often has processing artifacts (especially around people’s hair), and looks less natural – because it is less natural; it’s simulated by software rather than the pure optical effect of a lens projecting an image onto a sensor.&lt;/p&gt;
&lt;p&gt;In the iPhone version of the photo of Ruthie and Jo above, around the fringes of Ruthie’s hair, some wisps are oddly out of focus and in some places the wall seen through her hair is oddly &lt;em&gt;in&lt;/em&gt; focus. Similarly, in the iPhone image of the cherry blossoms below, some blossoms that are the same distance from the lens are in focus and others are out of focus, sometimes sharply cutting from one to the other, rather than a consistent gradient of focus over distance as in the Nikon image.&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/lOn2iVZQ6a-768.webp 768w, https://chromamine.com/media/img/lOn2iVZQ6a-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/lOn2iVZQ6a-768.jpeg 768w, https://chromamine.com/media/img/lOn2iVZQ6a-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Branch of a cherry blossom tree. The background is heavily blurred with a bokeh effect, transitioning naturally to crisp blossoms in the foreground.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/lOn2iVZQ6a-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1021&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/T3_C7XIu27-768.webp 768w, https://chromamine.com/media/img/T3_C7XIu27-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/T3_C7XIu27-768.jpeg 768w, https://chromamine.com/media/img/T3_C7XIu27-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Branch of a cherry blossom tree. Again the background is heavily blurred with a bokeh effect, transitioning to crisp blossoms in the foreground, but the blurring is inconsistent and features oddly sharp edges in places where they shouldn&#39;t be.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/T3_C7XIu27-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1024&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Cherry blossoms. Lower f-stop simulated with portrait mode on the iPhone image. First: Nikon, Second: iPhone&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/G6MZ4S_Qa7-768.webp 768w, https://chromamine.com/media/img/G6MZ4S_Qa7-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/G6MZ4S_Qa7-768.jpeg 768w, https://chromamine.com/media/img/G6MZ4S_Qa7-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Oversized chess pieces, the size of children, on a blue and white checkerboard floor.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/G6MZ4S_Qa7-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1021&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/VWPH7SMm0H-768.webp 768w, https://chromamine.com/media/img/VWPH7SMm0H-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/VWPH7SMm0H-768.jpeg 768w, https://chromamine.com/media/img/VWPH7SMm0H-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Oversized chess pieces, the size of children, on a blue and white checkerboard floor. The image is slightly brighter, the background is slightly fuzzier, and the pieces have a bit more of a halo.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/VWPH7SMm0H-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1024&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Oversized chess pieces at Tufts. Lower f-stop simulated with portrait mode on the iPhone image. First: Nikon, Second: iPhone&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;A few other notes on the experience of shooting with the D70:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It’s a conspicuous device. It’s much larger than a phone; it’s larger even than a modern mirrorless. It has an internal mirror and shutter apparatus that makes a loud click when it fires. I have to be unapologetic that I am photographing. If I’m trying to at all be discreet, I cannot use it.&lt;/li&gt;
&lt;li&gt;Along similar lines, it requires more effort to pack, carry, and use. Even as small a detail as needing to remove the lens cap makes it a more conscious and deliberate photography experience than the iPhone. I feel, abstractly, like there’s some benefit to this deliberacy, but I can’t articulate offhand what it is.&lt;/li&gt;
&lt;li&gt;Initially I shot using a compressed jpeg format on the D70, but I realized I was losing a lot in quality by not shooting RAW&lt;a href=&quot;https://chromamine.com/2024/04/shooting-with-a-nikon-d70-in-the-smartphone-age/#fn5&quot; class=&quot;footnote-ref&quot; id=&quot;fnref5&quot;&gt;⁵&lt;/a&gt; instead. Apple’s Photos ecosystem handles the raw images relatively well, though it requires some contortions to share them out in a more compatible format.&lt;/li&gt;
&lt;li&gt;In general sharing images has more of a delay. It’s very different from the straight-to-social-media practice of shooting with my phone. I speed it up somewhat from the old days (which involved waiting till I was at a computer to offload photos from the camera) with the use of a card reader that plugs into my iPad and some &lt;a href=&quot;https://support.apple.com/guide/shortcuts/welcome/ios&quot;&gt;Shortcuts&lt;/a&gt; to convert between Nikon RAW and more shareable formats. Most of the images I’ve posted to &lt;a href=&quot;https://instagram.com/harrislapiroff/&quot;&gt;Instagram&lt;/a&gt; for the past month or so have been taken with the Nikon.&lt;/li&gt;
&lt;li&gt;The battery lasts &lt;em&gt;forever&lt;/em&gt;. I’ve been shooting for a few weeks now and I’m finally just seeing a mid-charge indicator instead of high-charge.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;I guess it’s no surprise that technology ages. In their heyday DSLRs like the D70 were not only great cameras for hobbyists (and, at higher product tiers, professionals) but they were also the best point-and-shoot cameras available when set to “auto.” A couple decades later, it seems like those same cameras are frequently outpaced by features on the tiny ubiquitous cameras in our pockets.&lt;/p&gt;
&lt;p&gt;It got me thinking about the acceleration of technology development and the feeling many of us have that modern technology becomes outdated faster than its predecessors. The more cynical among us attribute this to planned obsolescence, but I’m not so sure. I think it’s possible we do develop larger advances faster than in the past or maybe it’s specific to the technology of this era: sensors, microchips, and software advance more quickly than mechanical parts.&lt;/p&gt;
&lt;p&gt;The camera I used before my D50, the Pentax K1000 was first released in 1967 and, though it was discontinued in 1997, it was an incredible camera to shoot with up through the advent of the DSLR era in the 2000s. It may still be an incredible camera – though I haven’t opted to manage the overhead of shooting on film to test it out this year. But when I look at some of the photos I took back then, the effects are unlike any camera or lens I’ve shot with since and in combination with the film grain – it still ignites something in me.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/rr4wFfVfsO-768.webp 768w, https://chromamine.com/media/img/rr4wFfVfsO-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/rr4wFfVfsO-768.jpeg 768w, https://chromamine.com/media/img/rr4wFfVfsO-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;An orange and white cat, with a heart shaped tag on his collar, in a crouched position amidst grass and a brick ledge. The background is blurred. His eyes are focused on something off frame to the right.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/rr4wFfVfsO-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1002&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;My childhood cat Montana. Taken with a Pentax K1000&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Returning to the digital age: there’s still things the Nikon can do that my iPhone can’t. The swappable lenses remain its superpower and even the three lens system on my iPhone can’t achieve the range of effects I can achieve with my 50mm f/1.8 lens alone – as long as I’m willing to apply myself a little. I didn’t play here with the telephoto lens still collecting dust in my closet. Perhaps that will be the subject of a future experiment.&lt;/p&gt;
&lt;p&gt;When I was planning this blog post out loud to &lt;a href=&quot;http://www.ruthiebyers.com/&quot;&gt;Ruthie&lt;/a&gt;, she neatly summed it up: “The best photo you can take with your Nikon is better than the best photo you can take with you iPhone, but for your average photo, the iPhone is better.”&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I’ve been reading recently &lt;em&gt;The Life-Changing Magic of Tidying Up&lt;/em&gt; (Marie Kondo) which, if I’m honest, I’m a lot iffier on than I expected to be. There’s at least one passage so far, though, that particularly spoke to me, just on the right side of the “woo” line for my taste:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Every object has a different role to play. Not all clothes have come to you to be worn threadbare. […] When you come across something that you cannot part with, think carefully about its true purpose in your life.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Kondo continues, “You’ll be surprised at how many of the things you possess have already fulfilled their role,” but after consideration, I’m finding the D70 still has a purpose in my life that it hasn’t fulfilled yet. I’ll keep shooting with it for a while – relearning the skills I once had, dialing in for the first time ones I never developed. I have more lenses to experiment with. I got some tips to test for better shooting low light situations from &lt;a href=&quot;https://bikes.emilymhorsman.com/&quot;&gt;Emily&lt;/a&gt;. There’s more to play with.&lt;/p&gt;
&lt;p&gt;Eventually, though, if I decide this is a hobby to invest in, I think it will be time for something newer.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thanks to &lt;a href=&quot;https://bikes.emilymhorsman.com/&quot;&gt;Emily&lt;/a&gt;, &lt;a href=&quot;http://www.ruthiebyers.com/&quot;&gt;Ruthie&lt;/a&gt;, and &lt;a href=&quot;https://emmaazelborn.com/&quot;&gt;Emma&lt;/a&gt; for providing feedback on drafts of this post.&lt;/em&gt;&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;I like to think that, as I’ve matured, I’ve gotten less discouraged by my friends’ overlapping interests – and by them being more skilled! – and learned to lean into sharing the joy of them, humbly seeking advice, and loving to talk shop. &lt;a href=&quot;https://chromamine.com/2024/04/shooting-with-a-nikon-d70-in-the-smartphone-age/#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;I acquired my Nikon D50 for $585 in 2007 – $890 in 2024 bucks, according to the &lt;a href=&quot;https://data.bls.gov/cgi-bin/cpicalc.pl?cost1=585&amp;amp;year1=200703&amp;amp;year2=202403&quot;&gt;BLS calculator&lt;/a&gt;. My understanding is a decent modern mirrorless is $1,000+. &lt;a href=&quot;https://chromamine.com/2024/04/shooting-with-a-nikon-d70-in-the-smartphone-age/#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;The iPhone can actually take up to 48-megapixel images, but I don’t generally use that feature and in my experience those images are not similarly crisp when fully zoomed. &lt;a href=&quot;https://chromamine.com/2024/04/shooting-with-a-nikon-d70-in-the-smartphone-age/#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;In the analog days ISO referred to how dense the photosensitive grains were on the film. Higher ISO values (less dense) capture an image quicker, even in low light, but looks grainier. The mechanics of this in digital cameras are more complicated, but the effect is approximately the same. &lt;a href=&quot;https://chromamine.com/2024/04/shooting-with-a-nikon-d70-in-the-smartphone-age/#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;A format that preserves the data as received by the sensor, without compression. &lt;a href=&quot;https://chromamine.com/2024/04/shooting-with-a-nikon-d70-in-the-smartphone-age/#fnref5&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Solving Niche Problems Quickly With 3D Printing</title>
            <link href="https://chromamine.com/2024/03/solving-problems-quickly-with-3d-printing/"/>
            <updated>2024-03-18T00:00:00Z</updated>
            <id>https://chromamine.com/2024/03/solving-problems-quickly-with-3d-printing/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;The most recent 3D printing project &lt;a href=&quot;https://chromamine.com/2024/03/3d-printed-irish-whistle-stand&quot;&gt;I wrote about&lt;/a&gt; was a months-long process of design and iteration, but one skill I’m particularly interested in honing with my 3D printer is solving niche problems quickly.&lt;/p&gt;
&lt;p&gt;3D printing is particularly good for this because it’s relatively quick, doesn’t require time and energy to buy materials (assuming you have a stockpile of filament) or components&lt;a href=&quot;https://chromamine.com/2024/03/solving-problems-quickly-with-3d-printing/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;, and is fully bespoke. It elongates the long-tail of physical objects; even if no one else in the world has the problem you do, you can rapidly produce an object to fix it. I think the quicker I can be at designing models that solve the small annoyances, the more likely I am to actually make those quality-of-life improvements instead of letting it be.&lt;/p&gt;
&lt;p&gt;This weekend I had a houseguest with a small problem – a travel mug with a woven exterior which had come detached at the base and was fraying.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/nLqQSdxFcN-768.webp 768w, https://chromamine.com/media/img/nLqQSdxFcN-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/nLqQSdxFcN-768.jpeg 768w, https://chromamine.com/media/img/nLqQSdxFcN-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A travel mug with a woven exterior. The outer fabric is blue and the base is detached from the plastic of the mug and there are fraying thread at the edges of the fabric.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/nLqQSdxFcN-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1151&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;I proposed to print a plastic cap that the bottom of the mug could tuck into to cover the frayed edges and prevent further damage. With some calipers I set to work measuring and pulled together some quick &lt;a href=&quot;https://www.openscad.org/&quot;&gt;OpenSCAD&lt;/a&gt; code to generate a model:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-scad&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;include &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;BOSL2&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;std.scad&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;$fa &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; $preview &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; 5&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; :&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; 0.5&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;$fs &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; $preview &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; 5&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; :&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; 0.2&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;INNER_WIDTH &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; 90&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;INNER_HEIGHT &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; 8&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;THICKNESS &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; 1.5&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;cyl&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    d &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; INNER_WIDTH,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    h &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; INNER_HEIGHT &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; THICKNESS,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    rounding1 &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; ROUNDING,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    teardrop &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A few notes on this code for those interested in modeling or OpenSCAD in particular – feel free to skip over if you just want to see the results:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;$fa&lt;/code&gt; and &lt;code&gt;$fs&lt;/code&gt; are special variables in OpenSCAD that control how close to a real curve rounded parts are. &lt;code&gt;$fa&lt;/code&gt; defines the maximum angle that can be covered by a single line segment. So, for example, at &lt;code&gt;$fa = 45&lt;/code&gt; every circle would be made up of 8 straight lines, making each circle an octagon. At &lt;code&gt;$fa = 5&lt;/code&gt; a circle will be made up of 72 straight lines. &lt;code&gt;$fs&lt;/code&gt; is the minimum length of a line segment, so if a circle is sufficiently small in radius, it will be broken up into fewer segments than a larger one. The trade off here is that more line segments will take longer to render, so I’ve defined these such that when you’re previewing the object while editing it, it uses relatively large segments, but when you’re rendering it, it uses smaller ones to make the curves very smooth.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It got a brief mention in my &lt;a href=&quot;https://chromamine.com/2024/03/3d-printed-irish-whistle-stand&quot;&gt;whistle stand&lt;/a&gt; post, but I use the &lt;a href=&quot;https://github.com/BelfrySCAD/BOSL2&quot;&gt;BOSL2&lt;/a&gt; library for OpenSCAD, which provides a lot of niceities that don’t come built into the language. In this case I’m using BOSL2’s &lt;code&gt;cyl&lt;/code&gt; module instead of OpenSCAD’s built-in &lt;code&gt;cylinder&lt;/code&gt; because the BOSL2 module provides rounding and chamfering options.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;code&gt;rounding1&lt;/code&gt; argument on the &lt;code&gt;cyl&lt;/code&gt; module creates a cylinder with a rounded base. Somewhat less obvious is the &lt;code&gt;teardrop&lt;/code&gt; argument, which enforces a maximum shallowness of the angle on the rounded bottom, by default 45°. This is helpful for 3D printing because outward angles can produce “overhangs” where filament is extruded fully or partially in mid-air. If your overhangs are insufficiently supported (either by the model itself or added supports that are designed to be removed in post-processing) the extruded plastic might droop or fall and the print may fail – or come out unattractive or fragile. 45° is generally a safe angle to print at without additional supports.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;js-stl-viewer&quot; data-src=&quot;/media/solving-problems-quickly-with-3d-printing/cup-base-vase-mode.stl&quot; data-alt=&quot;A 3D render of a solid bowl-shaped object.&quot;&gt;
[Javascript required to view 3D model]
&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You might notice that, weirdly, I modeled this shape solid without a hollow inside that the cup might slot into! In fact I had previously created a more complex design modeled as a bowl shape.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;js-stl-viewer&quot; data-src=&quot;/media/solving-problems-quickly-with-3d-printing/cup-base.stl&quot; data-alt=&quot;A yellow 3D render of a wide bowl-shaped object with a hollow inside, like a normal bowl.&quot;&gt;
[Javascript required to view 3D model]
&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;But midway through modeling I realized this object is a great candidate for “vase mode.” Typically when printing an object, the “slicer”&lt;a href=&quot;https://chromamine.com/2024/03/solving-problems-quickly-with-3d-printing/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt; slices&lt;a href=&quot;https://chromamine.com/2024/03/solving-problems-quickly-with-3d-printing/#fn3&quot; class=&quot;footnote-ref&quot; id=&quot;fnref3&quot;&gt;³&lt;/a&gt; a model into horizontal layers and creates a linear path for extruding the plastic on each layer. But most slicers provide a vase mode option, in which the first few layers are (optionally) printed solid and the rest is extruded as a long spiral upwards, creating an object with a single-walled perimeter. Vase mode has a number of advantages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vase mode prints are generally quicker both because they use less filament and because they eliminate nozzle movement that isn’t extrusion as well as reducing things like retractions&lt;a href=&quot;https://chromamine.com/2024/03/solving-problems-quickly-with-3d-printing/#fn4&quot; class=&quot;footnote-ref&quot; id=&quot;fnref4&quot;&gt;⁴&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;They also eliminate “seams” – places on a print where a layer started and finished, which often produces a visible line running up the side of a print.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vase mode is appropriate for models that are a solid object for which you want to print the outer walls with an open top (like a vase). This object was a perfect candidate and in checking both approaches in my slicer, the standard mode with the bowl shaped model was estimated to take 58 minutes and 50¢ of filament, versus the vase mode which was 25 minutes and 23¢ of filament&lt;a href=&quot;https://chromamine.com/2024/03/solving-problems-quickly-with-3d-printing/#fn5&quot; class=&quot;footnote-ref&quot; id=&quot;fnref5&quot;&gt;⁵&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The final result fit neatly on the mug and the process took me roughly 30 minutes for modeling and an hour of inactive time for printing – because I messed up the first model by not enabling teardrop rounding. Composing this write up took me longer than designing the model. A pretty quick solution, all told, and, in my opinion, a not unattractive one.&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/4Dog-dw3AL-768.webp 768w, https://chromamine.com/media/img/4Dog-dw3AL-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/4Dog-dw3AL-768.jpeg 768w, https://chromamine.com/media/img/4Dog-dw3AL-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A hand holding the same travel mug, now with a yellow plastic object covering the base. The woven sides are tucked neatly into it and no fraying is visible.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/4Dog-dw3AL-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1151&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/hLBCVxwOYq-768.webp 768w, https://chromamine.com/media/img/hLBCVxwOYq-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/hLBCVxwOYq-768.jpeg 768w, https://chromamine.com/media/img/hLBCVxwOYq-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The same mug set down on a kitchen island.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/hLBCVxwOYq-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1151&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;In general, this is true, but there are occasions when one might integrate non-printed components into printed assemblies when you need different properties, for example threaded metal insets can provide a more durable screw connection than a printed thread. &lt;a href=&quot;https://chromamine.com/2024/03/solving-problems-quickly-with-3d-printing/#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;Software that generates the g-code for the printer which issues specific instructions for where to move the nozzle, how hot to make it, how much pressure to use to push filament through it, etc. &lt;a href=&quot;https://chromamine.com/2024/03/solving-problems-quickly-with-3d-printing/#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;Hence the name. &lt;a href=&quot;https://chromamine.com/2024/03/solving-problems-quickly-with-3d-printing/#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;In which filament is retracted up out of the printhead to reduce oozing when the printer has stopped extruding a line and is moving to a new location. &lt;a href=&quot;https://chromamine.com/2024/03/solving-problems-quickly-with-3d-printing/#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;It’s possible I could have narrowed the gap a bit by configuring the bowl model to have a thinner wall, but I expect there still would have been a difference and the model would still be smoother printed in vase mode. &lt;a href=&quot;https://chromamine.com/2024/03/solving-problems-quickly-with-3d-printing/#fnref5&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>A 3D Printed Irish Whistle Stand</title>
            <link href="https://chromamine.com/2024/03/3d-printed-irish-whistle-stand/"/>
            <updated>2024-03-13T00:00:00Z</updated>
            <id>https://chromamine.com/2024/03/3d-printed-irish-whistle-stand/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;Irish whistles&lt;a href=&quot;https://chromamine.com/2024/03/3d-printed-irish-whistle-stand/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt; each play a limited set of pitches and therefore come in a particular key: you can have a D whistle, a G whistle, etc. If you’re a whistler, you might have a number of whistles that you switch between. Over the past several months I’ve been working on a design for a portable 3D printed whistle stand, to hold all these many whistles, as a Christmas gift&lt;a href=&quot;https://chromamine.com/2024/03/3d-printed-irish-whistle-stand/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt; for &lt;a href=&quot;https://emmaazelborn.com/&quot;&gt;my partner&lt;/a&gt; who plays the whistle.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/Mkxxsh4jtq-768.webp 768w, https://chromamine.com/media/img/Mkxxsh4jtq-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/Mkxxsh4jtq-768.jpeg 768w, https://chromamine.com/media/img/Mkxxsh4jtq-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A table with a large green and white plastic object on it. The object has three wavy legs and evenly spaced along each leg is a green cylindrical mount with a short wooden dowel protruding from the top. It looks a bit like a multidimensional menorah. On the table are three spare dowels with green topped mounts attached to the end.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/Mkxxsh4jtq-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;This is the most engineered (&lt;em&gt;over&lt;/em&gt;-engineered, perhaps?) design I’ve worked on and it’s still not perfect; I’ll get into the flaws later. Emma sketched out the original design concept to me one day – intending it to be made out of wood – but I took the concept and iterated on it in secret to produce this 3D printable design.&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/XonBsw8ghK-768.webp 768w, https://chromamine.com/media/img/XonBsw8ghK-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/XonBsw8ghK-768.jpeg 768w, https://chromamine.com/media/img/XonBsw8ghK-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The whistle stand disassembled on a table. It is made up of three wavy legs stacked on top of each other and in front of them a pile of wooden dowels mounted on green cylinders with black tabbed snap connectors at the bottom&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/XonBsw8ghK-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/BadZhw-CAL-768.webp 768w, https://chromamine.com/media/img/BadZhw-CAL-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/BadZhw-CAL-768.jpeg 768w, https://chromamine.com/media/img/BadZhw-CAL-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The whistle stand now on a desk with a blue desk mat and plants in the background. There are tin whistles over each of the dowels standing straight up with the tallest in the middle and the shortest on the outsides.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/BadZhw-CAL-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2048&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;It’s made up of three legs for the base, each with four holes that the round “dowel mounts” snap into. The dowels &lt;em&gt;are&lt;/em&gt; made of wood, held into the mounts by friction. It’s designed to come apart so that it can be taken to a session, concert, or on travel. The parts are fairly large altogether, so it’s not pocket-sized (especially if you include the size of the whistles), but it’s adequate for taking on the go. The legs snap together with magnets and the dowels are carried loose.&lt;/p&gt;
&lt;h3&gt;The Connector&lt;/h3&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/V28T_PlsZh-768.webp 768w, https://chromamine.com/media/img/V28T_PlsZh-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/V28T_PlsZh-768.jpeg 768w, https://chromamine.com/media/img/V28T_PlsZh-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A chaotic pile of 3D printed parts of different colors all on a table. It&#39;s a mix of cylindrical parts with knurled caps and different connectors—screws, snaps, and twist lock—and rectangular blocks with holes in the middle as well as a couple complete mini whistle stands with only four holes. Some parts appear to have failed midway through and are either missing bits or degrade into stringy plastic on one end.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/V28T_PlsZh-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Designing the connector between the base and the dowels took the bulk of my design time. I must have gone through testing 50 some odd iterations trying different designs, then tuning different parameters of each concept. I started with a screw thread design, took a detour through a twist-and-lock mechanism, before finally settling on the annular snap joint pictured in profile here:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/svg+xml&quot; srcset=&quot;https://chromamine.com/media/img/qVCU191Dfj-700.svg 700w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/qVCU191Dfj-768.webp 768w, https://chromamine.com/media/img/qVCU191Dfj-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/qVCU191Dfj-768.jpeg 768w, https://chromamine.com/media/img/qVCU191Dfj-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;2D cutaway diagram of two joined components. A green component in the center has ridges on either side that fit into the valleys of the grey components around the perimeter.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/qVCU191Dfj-768.jpeg&quot; width=&quot;1536&quot; height=&quot;877&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Once I settled on the annular snap joint, I discovered through stress testing that the tabs on the joint broke easily. One downside of 3D printed components is that they are printed from the bed up&lt;a href=&quot;https://chromamine.com/2024/03/3d-printed-irish-whistle-stand/#fn3&quot; class=&quot;footnote-ref&quot; id=&quot;fnref3&quot;&gt;³&lt;/a&gt; layer by layer. Layers fuse together imperfectly, so 3D prints tend to be weak along the layer lines. It turned out this was especially true of the matte green filament that I wanted to use for this part, which was disappointing because I preferred it aesthetically for this design to some stronger filaments I tested! Fortunately I realized I could print the visible cap in the matte, but switch midway through to a stronger black filament – which would be hidden when the part was engaged.&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/h1rluxJFN5-768.webp 768w, https://chromamine.com/media/img/h1rluxJFN5-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/h1rluxJFN5-768.jpeg 768w, https://chromamine.com/media/img/h1rluxJFN5-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A wooden dowel attached to a cylindrical object with a knurled green cap where the cylinder meets the dowel and on the other side a black snap connector.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/h1rluxJFN5-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/1rIXw5iQ0x-768.webp 768w, https://chromamine.com/media/img/1rIXw5iQ0x-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/1rIXw5iQ0x-768.jpeg 768w, https://chromamine.com/media/img/1rIXw5iQ0x-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The same wooden dowel attached to the cylindrical object but now the black snap connector is hidden, buried inside of a green box.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/1rIXw5iQ0x-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3&gt;Mid-Print Insertions&lt;/h3&gt;
&lt;p&gt;I wanted to add weights to the legs, to increase the stability of the whole apparatus and give it a more premium feel. I added cavities to the model into which I could insert stacks of pennies mid-print&lt;a href=&quot;https://chromamine.com/2024/03/3d-printed-irish-whistle-stand/#fn4&quot; class=&quot;footnote-ref&quot; id=&quot;fnref4&quot;&gt;⁴&lt;/a&gt;&lt;a href=&quot;https://chromamine.com/2024/03/3d-printed-irish-whistle-stand/#fn5&quot; class=&quot;footnote-ref&quot; id=&quot;fnref5&quot;&gt;⁵&lt;/a&gt;. The result was that each leg required three pauses mid-print:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;a pause to insert magnets at the bottom (you have to use a dab of superglue to hold magnets in place – otherwise they run the risk of being drawn upward to the magnetic components of the printer hotend),&lt;/li&gt;
&lt;li&gt;a pause at the halfway mark to change from the green filament to the white (this was optional, but I like the bicolor look – and it provides a visual cue to prevent trying to put the base together with parts inverted), and&lt;/li&gt;
&lt;li&gt;a pause at the top to insert the top magnets and the pennies.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/MnCQm5Sv0Y-768.webp 768w, https://chromamine.com/media/img/MnCQm5Sv0Y-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/MnCQm5Sv0Y-768.jpeg 768w, https://chromamine.com/media/img/MnCQm5Sv0Y-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A 3D printer with a print in progress on the bed. The print is wavy and green on the bottom, but the upper layers that are printing now are white. The inside is filled with a wavy pattern of plastic, known as &amp;quot;gyroid infill.&amp;quot; There are holes for the dowel mounts to snap into but between those holes are holes in which pennies and cylindrical nickel plated magnets have been embedded.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/MnCQm5Sv0Y-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3&gt;Future Work&lt;/h3&gt;
&lt;p&gt;While I have delivered the gift (partially as an attempt not to keep designing for months without knowing how well it works already) there’s already areas I’d like to improve in future versions. I’ve made it clear to Emma that the gift is the design, not the physical object, and we will continue to print further iterations of it until it meets her needs.&lt;/p&gt;
&lt;h4&gt;Connector stability&lt;/h4&gt;
&lt;p&gt;I set out trying to design a connector that would:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;hold fast and, in particular, be able to hold the middle of the base where all three parts join together, and&lt;/li&gt;
&lt;li&gt;be quick to assemble and disassemble, even if you have to do ten of them at a time,&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;My annular snap joint achieves criteria 2, but only partially achieves criteria 1. The center connection is fairly unstable with a whistle on it and I’ll have to improve it in future iterations – especially because one of Emma’s pieces of feedback upon receipt was that it would be nice to be able to grab the entire assembly from the center to move it once the whistles are on.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/HSZrTwyqnk-768.webp 768w, https://chromamine.com/media/img/HSZrTwyqnk-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/HSZrTwyqnk-768.jpeg 768w, https://chromamine.com/media/img/HSZrTwyqnk-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The whistle stand on a desk, loaded with whistles, but the large whistle in the center is leaning to the left, the connector at its base having come dislodged&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/HSZrTwyqnk-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2048&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;It’s possible I need a stronger connector design – or possibly even just for the center piece. One of my original goals was to have all of the posts be interchangeable, but I think it would be reasonable to have a slightly different design for the center post. Perhaps I’ll give the twist-and-lock connector another go.&lt;/p&gt;
&lt;h4&gt;Top finish&lt;/h4&gt;
&lt;p&gt;3D printing is done line by line, and I spend a lot of time trying to compensate for the visible extrusion lines to produce objects that are attractive and aesthetically polished. I tried a few different methods of finishing the top and finally settled on “ironing” in which the hot printer nozzle makes a final pass over the top layer at a fraction of the extrusion width to smooth out the lines. It also extrudes a small amount of filament as it goes to fill in micro-gaps in the surface.&lt;/p&gt;
&lt;p&gt;This is fairly effective, but, for whatever reason, there are some noticeable uneven bits in the finish. I’d like to dial in my ironing settings – or come up with a different method of finishing the top that I prefer.&lt;/p&gt;
&lt;h4&gt;Different shapes&lt;/h4&gt;
&lt;p&gt;The three-legged design came from Emma’s original drawings (with my own aesthetic flourishes) but as I’ve been designing this I’ve been considering other shapes it could take, some of them potentially more stable or compact. A simple square with 3×3 mounts could take the same connectors but be somewhat more compact. Or perhaps there’s a hinged base design that could fold up trifold-style, making it compact to travel, compact when laid out on a surface, and unfussy to assemble.&lt;/p&gt;
&lt;p&gt;Of course, whether or not I explore these depends on whether there’s interest in them – whether from Emma or someone else. I’m not a whistle player myself and have no need for a million different whistle stands – or even one.&lt;/p&gt;
&lt;h3&gt;Details&lt;/h3&gt;
&lt;p&gt;The model was designed in &lt;a href=&quot;https://www.openscad.org/&quot;&gt;OpenSCAD&lt;/a&gt; – which some designers consider a form of masochism&lt;a href=&quot;https://chromamine.com/2024/03/3d-printed-irish-whistle-stand/#fn6&quot; class=&quot;footnote-ref&quot; id=&quot;fnref6&quot;&gt;⁶&lt;/a&gt; – using the &lt;a href=&quot;https://github.com/BelfrySCAD/BOSL2&quot;&gt;BOSL2 library&lt;/a&gt; – which makes it slightly less masochistic. I highly recommend it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The code is available on &lt;a href=&quot;https://github.com/harrislapiroff/whistlestand&quot;&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pregenerated models in a variety of configurations (different amounts of tolerance, different numbers of posts) are available on &lt;a href=&quot;https://www.printables.com/model/802190-modern-irish-whistle-stand&quot;&gt;Printables&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Sometimes called tin whistles (despite rarely being made of tin) or penny whistles (despite never being made of pennies). &lt;a href=&quot;https://chromamine.com/2024/03/3d-printed-irish-whistle-stand/#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;You may note that it is now March, famously &lt;em&gt;not&lt;/em&gt; the month Christmas is in. &lt;a href=&quot;https://chromamine.com/2024/03/3d-printed-irish-whistle-stand/#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;At least for common “fused deposition modeling” (FDM) printers which lay plastic down out of a nozzle. Resin printers, by contrast, print downward from a hanging plate as it ascends up out of the liquid resin. &lt;a href=&quot;https://chromamine.com/2024/03/3d-printed-irish-whistle-stand/#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;As far as I can tell this is not illegal and in fact even destroying US coins is not illegal &lt;a href=&quot;https://www.ecfr.gov/current/title-31/subtitle-B/chapter-I/part-82&quot;&gt;so long as you do it in small quantities and don’t aim to profit off of the material value of the metal&lt;/a&gt;, which is why those novelty penny press machines are permissible – though I’m not even destroying them here. N.b., this is not true for the coins of all countries. &lt;a href=&quot;https://chromamine.com/2024/03/3d-printed-irish-whistle-stand/#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;There’s another joke about penny whistles in here somehow. &lt;a href=&quot;https://chromamine.com/2024/03/3d-printed-irish-whistle-stand/#fnref5&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn6&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Maybe this will be the subject of a longer post, but very few designers consider functional programming the ideal way to model 3D objects and OpenSCAD’s language is not exactly the most ergonomic. Industrial design standard features like fillets and chamfers require a lot of additional thinking through to achieve. But it has advantages as well: it tickles my programmer brain and models come out of it “parameterized” – easy to fine tune particular features or measurements on the fly to produce new versions or multiple variations. &lt;a href=&quot;https://chromamine.com/2024/03/3d-printed-irish-whistle-stand/#fnref6&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Tenfold and More</title>
            <link href="https://chromamine.com/2024/02/tenfold-and-more/"/>
            <updated>2024-02-26T00:00:00Z</updated>
            <id>https://chromamine.com/2024/02/tenfold-and-more/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;One way I’ve found to counteract the anesthetic quality of a months-long day-in-day-out massacre – the sense of inevitability and resignation of the state of the world and the gradual acclimation to an ever increasing death toll – is to revisit what I thought it would look like at the beginning. On October 9th, 2023, as the Israeli war machine was revving to life, I wrote the following &lt;a href=&quot;https://social.coop/@harris/111205889728374642&quot;&gt;on Mastodon&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Every time Palestinians kill Israelis, the Israeli military repays it tenfold and more. I’m horrified by what has happened and terrified of what’s to come.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It’s significant that I posted this on Mastodon. I use and enjoy Mastodon, but I have less personal investment in it and less following on than other platforms. So why post this there and not elsewhere? Partially, I’m ashamed to say, I was skittish about social conflict that posting about Palestine could cause, but partially it was this: even I was skeptical what I was saying. I remember thinking “Really? 15,000 dead Palestinians? That doesn’t seem very likely.” I worried that, in posting such a thing, the future would have me on record as hyperbolic, overwrought, and taken in by worst-case scenarios.&lt;/p&gt;
&lt;p&gt;Instead, I can’t believe how badly I underestimated it.&lt;/p&gt;
&lt;p&gt;By the point of this writing, there are not 15,000 dead Palestinians, but about 30,000. Humanitarian and public health experts predict that in the coming months deaths from the horrific conditions Israel has produced may outnumber those that directly result from the attacks. I hope they’re wrong – that &lt;em&gt;these&lt;/em&gt; predictions are hyperbolic, but, man, I don’t know if I can muster that optimism. It is sobering to think we’re talking about 3% of the population of Gaza killed in a year and &lt;em&gt;we’re just counting the deaths that are already inevitable. It hasn’t stopped. Who can say how much further Israel will go?&lt;/em&gt; (Not to mention that counting deaths is only one piece of the trauma being wrought on Palestinians.)&lt;/p&gt;
&lt;p&gt;Despite my existing cynicism about the Israeli military and its government, five months ago it wasn’t even possible for me to conceive of how inhumane and devastating this assault would actually turn out to be.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;You can read my previous post about Gaza &lt;a href=&quot;https://chromamine.com/2023/12/standing-up-for-gaza/&quot;&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
        </entry>
        <entry>
            <title>An IKEA Skådis Corner Bumper</title>
            <link href="https://chromamine.com/2024/02/ikea-skadis-corner-bumper/"/>
            <updated>2024-02-24T00:00:00Z</updated>
            <id>https://chromamine.com/2024/02/ikea-skadis-corner-bumper/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;This week I had a couple IKEA Skådis pegboards delivered&lt;a href=&quot;https://chromamine.com/2024/02/ikea-skadis-corner-bumper/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;. Each of them arrived with the corners mildly scuffed.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/3AQLX9hUlZ-768.webp 768w, https://chromamine.com/media/img/3AQLX9hUlZ-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/3AQLX9hUlZ-768.jpeg 768w, https://chromamine.com/media/img/3AQLX9hUlZ-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;An IKEA Skådis pegboard with the corner scuffed and the brown of the particleboard showing through a tear in the black finish.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/3AQLX9hUlZ-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;br /&gt;
&lt;em&gt;The other board was slightly less bad, but still had a visible scuff in one corner.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I thought about trying to exchange them, but the damage was so minor. Also, I figured that there was a decent chance this is just the level of quality one gets from IKEA QA/shipping and I’d be likely to get boards with similar cosmetic issues after a time-consuming exchange process. So instead, I got out my calipers and in about an hour had a simple design for some corner bumpers. I wanted to produce something that was clean and discreet enough that it would look like it could have been sold with the product.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;js-stl-viewer&quot; data-src=&quot;/media/ikea-skadis-corner-bumper/corner-bumper.stl&quot; data-alt=&quot;3D render of an L shaped yellow bumper designed slot over the corner of a board.&quot;&gt;
[Javascript required to view 3D model]
&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;They printed cleanly on my Prusa MINI+ and I’m happy with the results. They cover up the existing damage and, while the need to protect the boards hung on the wall is limited, they will protect all the corners from future damage should I move them.&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/d9AlRbnSDy-768.webp 768w, https://chromamine.com/media/img/d9AlRbnSDy-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/d9AlRbnSDy-768.jpeg 768w, https://chromamine.com/media/img/d9AlRbnSDy-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Seven L shaped corner bumpers standing vertically on a 3D printer print bed.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/d9AlRbnSDy-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/FgpyNXizFu-768.webp 768w, https://chromamine.com/media/img/FgpyNXizFu-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/FgpyNXizFu-768.jpeg 768w, https://chromamine.com/media/img/FgpyNXizFu-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The corner of a pegboard, now with a corner bumper slotted over the corner.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/FgpyNXizFu-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;I printed them in black so they’d blend in, but I’m considering printing some in a brightly colored filament to give my walls a shot of color.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/NGE3At6o7Z-768.webp 768w, https://chromamine.com/media/img/NGE3At6o7Z-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/NGE3At6o7Z-768.jpeg 768w, https://chromamine.com/media/img/NGE3At6o7Z-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;An IKEA Skådis board mounted on a wall. There are boxes and trays mounted on the board and an adjustable wrench hangs from a hook. On each corner of the board is a black bumper.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/NGE3At6o7Z-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1151&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;The model is available &lt;a href=&quot;https://www.printables.com/model/778267-ikea-skadis-corner-bumper&quot;&gt;on Printables&lt;/a&gt; – and in &lt;a href=&quot;https://www.openscad.org/&quot;&gt;OpenSCAD&lt;/a&gt; code&lt;a href=&quot;https://chromamine.com/2024/02/ikea-skadis-corner-bumper/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt;:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-openscad&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;include &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;BOSL2&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;std.scad&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;include &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;BOSL2&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;rounding.scad&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;corner_radius &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;wall_thickness &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; 1.5&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;floor_thickness &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;straight_edge_length &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; 20&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;board_thickness &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; 5&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;outer_radius &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; corner_radius &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; wall_thickness;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;floor_inner_radius &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; outer_radius &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; floor_thickness;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;wall &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; union&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;([&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;    ring&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        r1 &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; corner_radius,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        r2 &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; outer_radius,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        angle &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; 90&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        n &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; 50&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    ),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;    back&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        corner_radius,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;        left&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;            straight_edge_length,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;            square&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;([straight_edge_length, wall_thickness])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    ),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;    fwd&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        straight_edge_length,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;        right&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;            corner_radius,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;            square&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;([wall_thickness, straight_edge_length])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    ),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;]);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;floor &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt; union&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;([&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;    ring&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        r1 &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; floor_inner_radius,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        r2 &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; outer_radius,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        angle &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; 90&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        n &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; 50&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    ),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;    fwd&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        straight_edge_length,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;        right&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;            floor_inner_radius,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;            square&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;([floor_thickness, straight_edge_length])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    ),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;    back&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        floor_inner_radius,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;        left&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;            straight_edge_length,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;            square&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;([straight_edge_length, floor_thickness])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;        )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;    )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;]);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;offset_sweep&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(floor, wall_thickness, bottom&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;os_chamfer&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;position&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(TOP &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; BACK)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;offset_sweep&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(wall, board_thickness, anchor &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; BOTTOM &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; BACK)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;position&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(TOP &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; BACK)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;offset_sweep&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(floor, wall_thickness, top&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;os_chamfer&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;), anchor &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; BOTTOM &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; BACK);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Organizing my space is part of my &lt;a href=&quot;https://chromamine.com/2024/01/season-of-tidiness/&quot;&gt;Season of Tidiness&lt;/a&gt;, which involves buying some home organizing supplies. &lt;a href=&quot;https://chromamine.com/2024/02/ikea-skadis-corner-bumper/#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;Requires &lt;a href=&quot;https://github.com/BelfrySCAD/BOSL2&quot;&gt;BOSL2&lt;/a&gt;, which has become indispensable in my OpenSCAD design process. &lt;a href=&quot;https://chromamine.com/2024/02/ikea-skadis-corner-bumper/#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Origin of contra dance&#39;s &quot;Wowee&quot;</title>
            <link href="https://chromamine.com/2024/02/origin-of-the-wowee/"/>
            <updated>2024-02-15T00:00:00Z</updated>
            <id>https://chromamine.com/2024/02/origin-of-the-wowee/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;For years now, one of my pet favorites in contra dancing has been the “wowee,” a figure that involves rolling away with your neighbor across the set and immediately releasing the connection to catch your partner for a swing. It’s got good energy, flow, and when you successfully catch your partner on time coming out of the rollaway, it feels &lt;em&gt;great&lt;/em&gt;. A couple of my favorite dances with the figure are Tavi Merrill’s “&lt;a href=&quot;https://www.ibiblio.org/contradance/thecallersbox/dance.php?id=7631&quot;&gt;Soul Reversal&lt;/a&gt;” and Chris Page’s “&lt;a href=&quot;http://chrispagecontra.awardspace.us/dances/index.htm#roll-twelve&quot;&gt;Roll Twelve&lt;/a&gt;.”&lt;/p&gt;
&lt;p&gt;When I first danced a dance with the figure, someone told me the term and figure were both borrowed from Modern Western Square Dancing. This is also the story I find when I search “wowee contra dance” on the internet. But MWSD dancers I came across said, “Nope, that’s not a figure.” (Being as MWSD figures and calling standards are more &lt;a href=&quot;https://callerlab.org/dance-programs/&quot;&gt;codified&lt;/a&gt; than contra, I trusted them to know.) At some point someone else told me it was a Maine-ism coined by a particular Maine caller, but I was fairly sure that wasn’t true either.&lt;/p&gt;
&lt;p&gt;At a January Monday Contras dance, I called a dance with a wowee in it and someone there told me the figure came from Larry Jennings. A few quick internet searches later and I was able to seemingly confirm this with a PDF of Jennings’s book &lt;em&gt;Give and Take&lt;/em&gt;, which includes a number of dances containing the figure and a note about the name (Jennings uses “W” for &lt;em&gt;women&lt;/em&gt;, which was the common role term at the time, though most events I call use &lt;em&gt;robin&lt;/em&gt; now.):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;WOWEE by Larry Jennings&lt;br /&gt;
Becket formation (ccw prog): S&lt;/p&gt;
&lt;p&gt;1. Bal in cir (of four); W roll R to swap with N &amp;amp; take sw pos 2. Sw pt 3. Cir L 4. Cir R 5. 1/2 W ch 6. Long lines: fwd &amp;amp; bk 7. 1/2 W ch &amp;amp; note cpl on L diag 8. 1/2 prom &amp;amp; loop to face noted cpl&lt;br /&gt;
Ph 8: The noted couple are your next neighbors, but the promenade is initiated by the current men passing by left shoulders.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The entry into the swing of ph 2 was suggested (independently, so far as I know) by Merilee Karr and Gene Hubert. I like to give it a snappy interpretation and call it “wowee” when so danced.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I didn’t actually procure a hard copy of the book to confirm (yet) just a rogue PDF floating around the internet, but I’m now confident enough that this is the origin of the figure name and now &lt;em&gt;I’ve&lt;/em&gt; documented it on the internet to correct the record.&lt;/p&gt;
&lt;p&gt;Also, ack! Chris Page’s “Roll Twelve” even notes that it’s based on a dance, “&lt;a href=&quot;http://www.ibiblio.org/contradance/thecallersbox/dance.php?id=36&quot;&gt;Roll Eleven&lt;/a&gt;,” by Sue Rosen and Larry Jennings! I should have followed that thread sooner.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/WHYnoQhiB4-768.webp 768w, https://chromamine.com/media/img/WHYnoQhiB4-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/WHYnoQhiB4-768.jpeg 768w, https://chromamine.com/media/img/WHYnoQhiB4-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Screenshot from a book, containing the same text as below.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/WHYnoQhiB4-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1075&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
</content>
        </entry>
        <entry>
            <title>My Contra Calling in Review, 2022 and 2023</title>
            <link href="https://chromamine.com/2024/02/contra-calling-2022-2023/"/>
            <updated>2024-02-06T00:00:00Z</updated>
            <id>https://chromamine.com/2024/02/contra-calling-2022-2023/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/ZIup8ilWJg-768.webp 768w, https://chromamine.com/media/img/ZIup8ilWJg-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/ZIup8ilWJg-768.jpeg 768w, https://chromamine.com/media/img/ZIup8ilWJg-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Me, wearing a red and gold patterned shirt with koi fishes on it, standing at a microphone&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/ZIup8ilWJg-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2049&quot; /&gt;&lt;/picture&gt;
&lt;em&gt;Calling Brooklyn Contra in August 2023. Photo by Matt Willner.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In 2019 I decided to get back into &lt;a href=&quot;https://en.wikipedia.org/wiki/Contra_dance&quot;&gt;contra dance&lt;/a&gt; calling after a multi-year stretch of doing very little of it. I called one dance in December, one dance in January of 2020, and then the pandemic hit. Oops.&lt;/p&gt;
&lt;p&gt;But when my local dances started back up in 2022 I got into it again and called five dances that year:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.bidadance.org/&quot;&gt;BIDA&lt;/a&gt; in Cambridge MA once&lt;a href=&quot;https://chromamine.com/2024/02/contra-calling-2022-2023/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.mondaycontras.com/&quot;&gt;Monday Contras&lt;/a&gt; in Concord MA three times. This was particularly generous because my first evening with them was error-ridden, but I was grateful for the opportunity to redeem myself a month later.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.commonfloorcontra.dance/&quot;&gt;Common Floor Contra&lt;/a&gt; in Topsham ME once.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In 2023 I called thirteen, almost fourteen, dances:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.mondaycontras.com/&quot;&gt;Monday Contras&lt;/a&gt; (5 evenings, two of which were half evenings, split between me and an up-and-coming caller)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.bidadance.org/&quot;&gt;BIDA&lt;/a&gt; (1 evening)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.commonfloorcontra.dance/&quot;&gt;Common Floor Contra&lt;/a&gt;, now in Portland ME (1 evening)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://brooklyncontra.org/&quot;&gt;Brooklyn Contra&lt;/a&gt; in Brooklyn NY (1 evening)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://amherstcontra.org/&quot;&gt;Downtown Amherst Contradance&lt;/a&gt; in Amherst MA (1 evening)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.contramontreal.org/&quot;&gt;Contra Montréal&lt;/a&gt; in Montréal QC (1 evening)&lt;/li&gt;
&lt;li&gt;Smith College Contra Dance in Northampton MA (1 afternoon)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bfms.org/squarecontra.php&quot;&gt;BFMS Wednesday&lt;/a&gt; (1 evening)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chromamine.com/2023/05/calling-dances-at-porchfest/&quot;&gt;Porchfest&lt;/a&gt; on &lt;a href=&quot;https://www.jefftk.com/&quot;&gt;Jeff Kaufman&lt;/a&gt;’s porch in Somerville MA (1 afternoon)&lt;/li&gt;
&lt;li&gt;I had to cancel one gig because I had covid 😕&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are the different dance choreographies I called in 2023, their choreographers, and how many times I called them. You can see which ones I return to again and again. Most at the top of the list are from Maia McCormick’s “&lt;a href=&quot;https://contra.maiamccormick.com/blog/2022/10/16/go-to-dances.html&quot;&gt;My Go-To Dances&lt;/a&gt;” which was instrumental in helping me build my collection up when I started calling again.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Maliza’s Magical Mystery Motion&lt;/em&gt;, Cary Ravitz (7)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Tica Tica Timing/Old Time Elixir #2&lt;/em&gt;, Dean Snipes/Linda Leslie&lt;a href=&quot;https://chromamine.com/2024/02/contra-calling-2022-2023/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt; (6)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Train Delay&lt;/em&gt;, Maia McCormick (6)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Wrinkled Ribbon&lt;/em&gt;, Melanie Axel-Lute (6)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Appetizer&lt;/em&gt;, Scott Higgs (5)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;The Boys From Urbana&lt;/em&gt;, John Coffman (5)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Mary Cay’s Reel&lt;/em&gt;, David Kaynor (4)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Read Between The Lines&lt;/em&gt;, Bob Isaacs (4)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Serving REELness&lt;/em&gt;, Andy Shore (4)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;You Can Get There From Here&lt;/em&gt;, Linda Leslie (4)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Butter&lt;/em&gt;, Gene Hubert (3)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Get Me Going&lt;/em&gt;, Lisa Greenleaf (3)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Heartbeat Contra&lt;/em&gt;, Don Flaherty (3)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Minimum Fuss, Maximum Fun&lt;/em&gt;, Dean Snipes (3)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Salmonella Evening&lt;/em&gt;, Steve Zakon-Anderson (3)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;The Barn Mixer&lt;/em&gt;, Rick Mohr (3)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Twirly Minds Think Alike&lt;/em&gt;, Tavi Merrill (3)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;After The Solstice&lt;/em&gt;, Lisa Greenleaf (2)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Are You &#39;Most Done&lt;/em&gt;, Russell Owen (2)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Chinese New Year&lt;/em&gt;, Chris Page (2)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Dancing Bears&lt;/em&gt;, Brian DeMarcus (2)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;First Hey&lt;/em&gt;, Paul Balliet (2)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Forgotten Treasure&lt;/em&gt;, Beth Parkes (2)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Fun Dance for Marjorie&lt;/em&gt;, Bob Golder (2)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Little Green Heron&lt;/em&gt;, Joseph Pimentel (2)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Monday&lt;/em&gt;, Jim Hemphill (2)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;New Year’s Day&lt;/em&gt;, Paul Balliet (2)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Over, Under, and Through&lt;/em&gt;, Chris Page (2)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Roll Twelve&lt;/em&gt;, Chris Page (2)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Rolling and Tumbling&lt;/em&gt;, Cis Hinkel (2)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Soul Reversal&lt;/em&gt;, Tavi Merrill (2)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Stars of Alberta&lt;/em&gt;, Carol Ormand (2)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;A Pirate’s Life For Me&lt;/em&gt;, Nathaniel Jack (1)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Accretion Reel&lt;/em&gt;, Chris Page (1)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Doorbits&lt;/em&gt;, Andy Shore (1)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Flirtation Reel&lt;/em&gt;, Tony Parkes (1)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Honor Among Dancers&lt;/em&gt;, Tom Hinds (1)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Hypnosis&lt;/em&gt;, Melanie Axel-Lute (1)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Melted Butter&lt;/em&gt;, Will Mentor (1)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;My Right Hand Man&lt;/em&gt;, Roger Auman (1)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;The Big Easy&lt;/em&gt;, Becky Hill (1)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;The Devil’s Backbone&lt;/em&gt;, William Watson (1)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Venus and Mars&lt;/em&gt;, Martin Sirk (1)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Violet Ice&lt;/em&gt;, Maia McCormick (1)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Though I had a bit of experience calling from my college days and a while after, when I resumed, it mostly manifested as baseline comfort with the technical skills of calling – using the right words, listening for the phrases in music, and being on time. In the past couple years I’ve developed a much stronger sense of how to program the arc of an evening, how to communicate with a band, and how to watch and respond to a hall.&lt;/p&gt;
&lt;p&gt;One of the great pleasures of calling these past couple years has been the chance to provide some mentorship and opportunity to newer callers, even in my own still-learning state. I had the chance to share the stage with two up-and-coming callers over the past year and have since watched them rocket off onto their own successful calling careers.&lt;a href=&quot;https://chromamine.com/2024/02/contra-calling-2022-2023/#fn3&quot; class=&quot;footnote-ref&quot; id=&quot;fnref3&quot;&gt;³&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I’ve spent a lot of time thinking about what kind of a caller I am. Some callers have a lot of on stage charisma – they’re Performers with a capital P. I’m not sure that’s ever going to be me; I try to evoke a friendly and encouraging charm, but I don’t think I have the natural performance instinct. I’m sure I’ll gain some of that over time, but I’ve tried to lean into what I see as my strengths: going deep on efficiency, clarity, and attentiveness to the room.&lt;/p&gt;
&lt;p&gt;I’ve also concluded that I really like doing this. I think I’ve gotten pretty good at it and I’m determined to get better.&lt;a href=&quot;https://chromamine.com/2024/02/contra-calling-2022-2023/#fn4&quot; class=&quot;footnote-ref&quot; id=&quot;fnref4&quot;&gt;⁴&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I have some calling goals for the future:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go on a tour with a band. I love the idea of building rapport, debriefing each dance, and testing out refinements daily. I have a Midwest tour scheduled this summer with &lt;a href=&quot;https://www.kingfisherband.com/&quot;&gt;Kingfisher&lt;/a&gt;, but I’m still looking to do even more of this! (If you’re a band interested in bringing a caller on tour with you, &lt;a href=&quot;mailto:contra@chromamine.com&quot;&gt;let me know&lt;/a&gt; 😇!)&lt;/li&gt;
&lt;li&gt;Get booked to call a challenging/advanced dance.&lt;/li&gt;
&lt;li&gt;Get booked to call a weekend and eventually a full week camp.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;update&quot;&gt;
&lt;p&gt;As of the day of writing this blog post I’m now booked to call a double dance (advanced dance followed by regular evening dance) at Brooklyn on May 4!&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;If you want to see me call somewhere, check out my &lt;a href=&quot;https://chromamine.com/dance/&quot;&gt;contra dance page&lt;/a&gt; for my schedule.&lt;/p&gt;
&lt;div class=&quot;note&quot;&gt;
&lt;p&gt;In the process of putting together this list I noticed four evenings over the past two years that I had neglected to note in my records, so it’s very possible I missed others that I &lt;em&gt;still didn’t&lt;/em&gt; catch! (If you’re an organizer and you know you booked me, but don’t see it on this list, let me know!) Getting more consistent about how I record my evenings is a 2024 goal.&lt;/p&gt;
&lt;/div&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;I’m on the BIDA board and specifically I am the caller booker, so I try not to book myself too frequently, as a conflict of interest issue. Also, as a practical matter, it’s useful to keep myself in reserve for last minute cancellations or hard-to-book dates. &lt;a href=&quot;https://chromamine.com/2024/02/contra-calling-2022-2023/#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;Dean Snipes and Linda Leslie wrote almost the same dance independently, so I try to credit both when I mention it. &lt;a href=&quot;https://chromamine.com/2024/02/contra-calling-2022-2023/#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;I’d be remiss not to mention the mentorship I’ve &lt;em&gt;received&lt;/em&gt; as well, in particular from &lt;a href=&quot;http://veino.com/caller&quot;&gt;Don Veino&lt;/a&gt; who gave me crucial feedback in my early evenings of calling Monday Contras, &lt;a href=&quot;http://suerosencaller.com/&quot;&gt;Sue Rosen&lt;/a&gt; who has organized a number of up-and-coming caller chats, and &lt;a href=&quot;https://contra.maiamccormick.com/&quot;&gt;Maia McCormick&lt;/a&gt; who has consistently been there for assistance with program ideas, debriefing dances, or kicking around calling ideas generally. &lt;a href=&quot;https://chromamine.com/2024/02/contra-calling-2022-2023/#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;I had a moment of doubt about including this line here. In between when I started drafting it and finished publishing it, I called a slot at the BIDA 15th Anniversary caller extravaganza and I flubbed it. I don’t feel like a particularly good caller this week. But, errors happen. I’m better than my worst nights and I’m getting better still. &lt;a href=&quot;https://chromamine.com/2024/02/contra-calling-2022-2023/#fnref4&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>The Season of Tidiness</title>
            <link href="https://chromamine.com/2024/01/season-of-tidiness/"/>
            <updated>2024-01-05T00:00:00Z</updated>
            <id>https://chromamine.com/2024/01/season-of-tidiness/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;Fifteen years ago, in a long lost LiveJournal&lt;a href=&quot;https://chromamine.com/2024/01/season-of-tidiness/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;, &lt;a href=&quot;https://chromamine.com/2014/01/for-the-new-year/#old&quot;&gt;I wrote&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Something tricky about January 1st is that it feels arbitrary—it doesn’t deliberately coincide with anything else in my life. Fall, for instance, when school starts up and changes everything makes much more sense as the start of a year. (Of course that will likely change post-graduation, but right now that seems an eternity away.) Especially at a time in my life when I find myself questioning almost all special occasions (I felt unbelievably distant from Christmas, Hanukkah this year. Every step I took to celebrate with family was like walking through a swamp.) celebrating the new year feels completely disconnected. As when celebrating a birthday every year, I still wake up the next morning with the uncomfortable feeling that nothing is different.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Rereading this, it strikes me how those yearly milestones of my past no longer exist. I only have the seasons and arbitrary markers of time to indicate the passing of years.&lt;/p&gt;
&lt;p&gt;Ten years ago, &lt;a href=&quot;https://chromamine.com/2014/01/for-the-new-year/&quot;&gt;I wrote&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I tend to make resolutions at times in my life when I’m feeling stagnant, dissatisfied, and in need of change. So, in that respect, I’m happy to say that I haven’t felt any desire to make resolutions this year. I’m in a dynamic period of my life. Things are changing for me, resolutions or no.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;New Years 2014 was a dynamic time. I had just left my home of seven years, completed six months of travel across the country and around the world, and moved to DC with a vague plan of starting a company and not much else. There was a lot to look forward to. There wasn’t much need to shake myself out of my familiar patterns because there were none. “The roads I see ahead of me are unpaved,” I wrote.&lt;/p&gt;
&lt;p&gt;Ten years later things are pretty different. After four years in DC, I moved to Somerville MA where I’ve been for six years. The major milestones of life people tend to observe are in the past as I find myself deep in the long chapter of adulthood with its routines and gradual changes. I’ve put down some roots – though not always the traditional ones – and I’m slowly learning how to invest in a community for the long term.&lt;/p&gt;
&lt;p&gt;In the cycle of life satisfaction/dissatisfaction, I think I’ve hit this new year at an odd moment, feeling neither in particular. I’ve got a lot going for me: a community of friends I see regularly, romantic partners whom I adore, an active hobby life, a job that I enjoy and believe in, and financial security. But I’ve also been thinking a lot lately about &lt;em&gt;Life&lt;/em&gt;, writ large. I’ve been thinking about the trappings of young adulthood that I’ve left behind me, about how I should conceive of building a life that I’m happy with, now and in the future, whether I’ve been focusing my time on the right things, and about what my life’s work should be – if I even want to have such a thing.&lt;/p&gt;
&lt;p&gt;Ideas about declining neuroplasticity notwithstanding, I’m not content to be the same person indefinitely. I want to think about what I can and should change – and then I want to do it.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;2023 was the year that I really got into watching YouTube videos. I feel late to the party&lt;a href=&quot;https://chromamine.com/2024/01/season-of-tidiness/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt; but for a long time I resisted internet videos, thinking I wanted to be able to consume media at my reading speed (nevermind the copious amounts of television I watched). I came around and this was the year I got into TikTok, YouTube, the whole deal.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/@CGPGrey&quot;&gt;CGP Grey&lt;/a&gt; makes research-heavy but lighthearted animated deep dives. He’s fairly popular. In 2013 he went viral for his video about the &lt;a href=&quot;https://www.youtube.com/watch?v=qMkYlIA7mgw&quot;&gt;“no-touching zone” between Canada and the United States&lt;/a&gt;. A couple other of my favorites of his are “&lt;a href=&quot;https://www.youtube.com/watch?v=qD6bPNZRRbQ&quot;&gt;The Simple Secret of Runway Digits&lt;/a&gt;” and “&lt;a href=&quot;https://www.youtube.com/watch?v=thOifuHs6eY&quot;&gt;Hexagons are the Bestagons&lt;/a&gt;.”&lt;/p&gt;
&lt;p&gt;He also designed &lt;a href=&quot;https://www.themesystem.com/&quot;&gt;a physical journal&lt;/a&gt; that he’s been marketing on his channel. It’s designed around his notion of personal “themes.”&lt;/p&gt;
&lt;p&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube-nocookie.com/embed/NVGuFdX5guE?si=8w9q5_6UrC1I5udh&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; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;His video on the subject is the best explanation but in brief: he suggests that instead of New Years resolutions, one should set a flexible, broad &lt;em&gt;theme&lt;/em&gt; for a period of time – something like Year of Reading or Season of Health – and let the general concept guide how you make decisions during that period of time and even allowing what it means to you to be flexible as time progresses. He says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You started out wanting to read more books, but maybe as you went on you realized academic papers are where it’s at, or that reading reading just doesn’t work for you and listening reading is the way to go. You’re still on theme. The theme will change because so will you. Having a theme, you will notice paths you didn’t before. This gets you to think about your thinking and thinking about your thinking changes your thinking, which changes who you are.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It’s possible my newness to the medium has made me an easy mark for sales, or that working on developing Q1 2024 &lt;a href=&quot;https://en.wikipedia.org/wiki/Objectives_and_key_results&quot;&gt;OKRs&lt;/a&gt; in my professional life when I saw this video made me extra susceptible to the idea of grand goal setting, but I was sold. I wanted a theme and I bought his notebook.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;It took me a couple weeks to figure out what my theme should be. Initially I was thinking about it in a goal oriented way. I had some ideas for things I wanted to accomplish in the new year – organize my bedroom/office, get my budget back in order, exercise regularly, get my drivers’ license, finally – and I tried to build a theme around that. The Season of Getting Your Shit Together? The Season of Loose Ends? The Season of Order?&lt;a href=&quot;https://chromamine.com/2024/01/season-of-tidiness/#fn3&quot; class=&quot;footnote-ref&quot; id=&quot;fnref3&quot;&gt;³&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;But I started thinking about something else Grey says in his video:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Words are tuning forks for the brain. When picking a theme, you’re looking for a word or words that cause your brain to vibrate in resonance.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;None of the themes I had so far did that. They were all attempts to shoehorn a predetermined set of goals into a broad category. But one day the theme “tidiness” occurred to me and it stuck in my brain in a way that I couldn’t get it out. It’s broad, it’s meaningful, and it represents a quality I’d like to internalize – something I’d like to change in myself.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/0nuHTom-3_-768.webp 768w, https://chromamine.com/media/img/0nuHTom-3_-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/0nuHTom-3_-768.jpeg 768w, https://chromamine.com/media/img/0nuHTom-3_-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A notebook page with the word &amp;quot;Theme&amp;quot; printed across the top. Undeneath that is a box in which someone has handwritten &amp;quot;The Season of Tidiness.&amp;quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/0nuHTom-3_-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;So this is the &lt;strong&gt;Season of Tidiness&lt;/strong&gt;. I’m going to clean and organize my room. I’m going to keep up with my chores. But I’m also going to aspire to a sort of &lt;em&gt;existential tidiness&lt;/em&gt;. I’m going to do my budget. I’m going to keep up with personal communications. I’m going to keep up with my todo list or deliberately remove the items I don’t want to complete. I’m going to be a person who, at a glance, really seems to &lt;em&gt;have their life together&lt;/em&gt;. I’m going to be a person who, even at a second, deeper look, seems to have their life together. Maybe after a third look not so much – I’m not convinced that’s possible and it doesn’t seem interesting to be a person who is &lt;em&gt;too tidy&lt;/em&gt; either.&lt;/p&gt;
&lt;p&gt;I’m looking forward to seeing how this theme changes for me and how it changes me. Let’s get to it.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;A few ideas of possible themes for the future that I didn’t feel ready to approach yet, but have nevertheless lodged in my brain not unlike tidiness did, though mostly not as deeply yet:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Season of Creating&lt;/li&gt;
&lt;li&gt;The Season of Reading&lt;/li&gt;
&lt;li&gt;The Season of The Future (or The Season of Planning)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We’ll see if I keep it up long enough to do these – or if these are even the themes I want to do when I get there.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I’ll leave off with a haiku that’s been a favorite new years poem of mine for over ten years:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;New Year’s Day—&lt;br /&gt;
  everything is in blossom!&lt;br /&gt;
  I feel about average.&lt;/p&gt;
&lt;p&gt;— Kobayashi Issa, trans. Robert Hass&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Happy new year. Let’s make it a good one.&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;I still miss the LiveJournal era in a sepia-toned nostalgic sort of way. I know people are still living the LiveJournal life over at &lt;a href=&quot;https://www.dreamwidth.org/&quot;&gt;Dreamwidth&lt;/a&gt; (using a descendant of the venerable LiveJournal codebase even) but it wouldn’t be the same for me. LJ was a piece that fit into a very particular person who I was in those days that wouldn’t fit nearly as well with the person I am now. Still, nostalgia is a hell of a thing. &lt;a href=&quot;https://chromamine.com/2024/01/season-of-tidiness/#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;Or maybe I was too early to the party. In 2006 I was &lt;em&gt;obsessed&lt;/em&gt; with “the show with ze frank,” quite possibly the world’s earliest popular vlogger. And then, somehow, for the following 15 years after “the show” ended I ignored vlogging altogether as a medium. &lt;a href=&quot;https://chromamine.com/2024/01/season-of-tidiness/#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;I knew from the outset I didn’t have the commitment for a full twelve months – and Grey actually encourages seasonal themes in his video anyway. &lt;a href=&quot;https://chromamine.com/2024/01/season-of-tidiness/#fnref3&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Standing Up for Gaza</title>
            <link href="https://chromamine.com/2023/12/standing-up-for-gaza/"/>
            <updated>2023-12-24T00:00:00Z</updated>
            <id>https://chromamine.com/2023/12/standing-up-for-gaza/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;Up until this week Paul Biggar was on the board at a fairly substantial tech company that he co-founded. If you work in tech, you’ve &lt;a href=&quot;https://circleci.com/&quot;&gt;probably heard of it&lt;/a&gt;; if you don’t, you probably haven’t. But then he wrote &lt;a href=&quot;https://blog.paulbiggar.com/i-cant-sleep/&quot;&gt;a blog post&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When you read about the Holocaust and the Nazis, you like to imagine you’d be the good guy. You’d fight the Nazis, you’d free the concentration camps. But apparently I wouldn’t. Apparently I would have just sat there paralyzed, incapable of doing anything about the genocide I see every day. Unable to think of any way to help. All I can do is retweet and protest and write a stupid blog post. I feel so stupid.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Pro-Israeli investors have created a culture of fear in tech where supporters of Palestinian freedom feel unable to raise their voices. I have spoken to many people in tech who are afraid that if they speak up, they’ll be unable to raise their next round, and lose 5-10 years of work on their venture, for their families and for their employees.&lt;/p&gt;
&lt;p&gt;We must break the silence around the genocide in Gaza. I know this is a big ask. I know there are significant risks involved, and that’s not your fault. But all the same, we cannot continue to be complicit in this genocide.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;He’s &lt;a href=&quot;https://www.linkedin.com/posts/jimdotrose_effective-december-22-paul-biggar-is-no-activity-7144101534912458752--tfm&quot;&gt;no longer a director&lt;/a&gt; of that company. The CEO, Jim Rose, has &lt;a href=&quot;https://www.linkedin.com/posts/jimdotrose_i-want-to-make-it-clear-paul-does-not-speak-activity-7143115083160694784-m5XC&quot;&gt;clarified&lt;/a&gt; that Paul does not speak for them and that CircleCI “is committed to our customers in Israel and around the world.”&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;In the &lt;a href=&quot;https://www.nytimes.com/2023/12/11/opinion/international-world/us-government-gaza-humanitarian-aid.html&quot;&gt;pages of the New York Times&lt;/a&gt;, leaders of five major NGOs write together of Israel’s attacks on Gaza:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The right to self-defense does not and cannot require unleashing this humanitarian nightmare on millions of civilians. It is not a path to accountability, healing or peace. In no other war we can think of in this century have civilians been so trapped, without any avenue or option to escape to save themselves and their children.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;They continue,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Most of our organizations have been operating in Gaza for decades. But we can do nothing remotely adequate to address the level of suffering there without an immediate and complete cease-fire and an end to the siege.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Separately, &lt;a href=&quot;https://www.doctorswithoutborders.org/latest/un-security-council-resolution-gaza-crisis-fails-address-urgent-needs&quot;&gt;Doctors Without Borders calls it&lt;/a&gt; an “unmitigated humanitarian disaster” and describes Israel’s behavior as “inconsistent with international norms and laws.”&lt;/p&gt;
&lt;p&gt;And the &lt;a href=&quot;https://x.com/drtedros/status/1729748696890245146&quot;&gt;World Health Organization’s Director-General Tedros Adhanom Ghebreyesus writes&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Given the living conditions and lack of health care, more people could die from disease than bombings.&lt;/p&gt;
&lt;p&gt;We need a sustained ceasefire. NOW. It’s a matter of life or death for civilians.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is a tremendous thing to write, in a war where the the death toll from bombing alone is already staggering.&lt;/p&gt;
&lt;p&gt;Among defenders of the Israeli military, “ceasefire” has taken on a reputation as a codeword of uninformed and uninvolved social media activists. But the Director-General of WHO isn’t a keyboard warrior Twitter leftist. Doctors Without Borders aren’t online slacktivists trading half-baked political memes. These are professionals and experts, in some cases on the ground and literally in the line of fire. They are the people most versed in the horrific buffet of suffering the world has to offer and they are saying: &lt;strong&gt;this is among the worst we’ve seen and we’re calling for it to stop.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Given this united message from the humanitarian community, people shouldn’t really have to think, “that’s really complicated – who knows what the right thing to do is?” or, “I might lose my job if I speak up about this.” In reasonable world, it wouldn’t be even a little bit controversial.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Thinking about Paul Biggar this week reminds me that years ago, when &lt;a href=&quot;https://en.wikipedia.org/wiki/Daniel_Ellsberg&quot;&gt;Daniel Ellsberg&lt;/a&gt; was still alive, I had the pleasure to meet him and see him speak at a retreat for work (my job is indeed the coolest). He was the sharpest octogenarian I had ever met, speaking on a wide range of topics with clarity for exactly one hour – he didn’t even need a timer!&lt;/p&gt;
&lt;p&gt;One thing he said that stuck with me was on the subject of whistleblowers: as a society we train people when and under what circumstances to sacrifice their lives for a greater good – this is one of the things the military does, it shows up in stories, movies, TV – but we don’t really instill an idea of under what circumstances one should sacrifice comfort, a job, a career.&lt;/p&gt;
&lt;p&gt;I’m sure Paul Biggar, unlike many of the whistleblowers Ellsberg was actually talking about, will be fine. I’m sure he’s not hurting for money and I doubt the industry will permanently blackball him. But I’m sure it wasn’t easy and I have a lot of respect for what it took for him to do. I think we could all do a little more of that risk-taking.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Nearly 1 out of every 100 Palestinians alive in Gaza three months ago is now dead. &lt;a href=&quot;https://www.nytimes.com/2023/12/21/world/middleeast/gaza-death-toll-palestinians.html&quot;&gt;20,000 people and counting&lt;/a&gt;. Multiples more are injured. The majority are homeless – their homes evacuated and razed. Many are starving, sick, or covered by rubble, and will die in the coming months from &lt;a href=&quot;https://www.emro.who.int/images/stories/Sitrep_-_issue_17_for_review.pdf?ua=1&quot;&gt;lack of medical care&lt;/a&gt; or access to the basic necessities of life – these deaths now inevitable in the terrible calculus of mortality. Every day that passes bakes more needless deaths into our future.&lt;/p&gt;
&lt;p&gt;It’s unbearable to imagine something like this could happen to &lt;em&gt;my&lt;/em&gt; community, if I were born on the wrong side of a border, never allowed to leave. It’s convenient to imagine that it is somehow because of who I am as a person that my life, resources, and choices have never seriously been circumscribed. That I can travel the world as I please and come home to a house – a neighborhood – that is at no risk of being flattened by a passing bomber. It’s comforting to think this happens to people far away who are not very much like me. But I know that I just got lucky.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I’m not a big believer in pressuring people to undertake specific forms of activism. I won’t tell you that silence makes you complicit – perhaps it does – I’m not comfortable determining or saying it. I know that speaking out might not be easy or possible – it might lose you friends, family, or a job. It’s a threshold I myself have failed to meet numerous times in the past. Maybe you have other skills you’re quietly using to resist the war. I get that.&lt;/p&gt;
&lt;p&gt;Instead, this is my empathetic call to introspection. If what you’ve seen happening in Gaza horrifies you, as it should, as it does me, as it does the entire humanitarian world, are there ways you can make it harder for Israel to continue to pretend this war is moral, just, or necessary? And are you willing to risk a little more than you might have previously thought to play your part in stopping it?&lt;/p&gt;
</content>
        </entry>
        <entry>
            <title>Using Expired Covid Antigen Tests</title>
            <link href="https://chromamine.com/2023/11/using-expired-covid-antigen-tests/"/>
            <updated>2023-11-22T00:00:00Z</updated>
            <id>https://chromamine.com/2023/11/using-expired-covid-antigen-tests/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;I have covid this week and I’ve been (purposely) using expired antigen tests to track it. The way antigen tests age is a gradual decrease in sensitivity&lt;a href=&quot;https://chromamine.com/2023/11/using-expired-covid-antigen-tests/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;. A strong signal may become weak; a weak signal may drop out entirely.&lt;/p&gt;
&lt;p&gt;I already knew I had covid; I had a known exposure and symptoms, then tested positive two days later. I had a stockpile of expired Quidel QuickVue tests&lt;a href=&quot;https://chromamine.com/2023/11/using-expired-covid-antigen-tests/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt;, so I figured it would make an efficient use of resources to use them to track my infection. The idea is that, with reduced sensitivity, I could still largely rely on true positives. If the test line showed up, I almost certainly still had an active covid infection.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/gWKJr7nr78-768.webp 768w, https://chromamine.com/media/img/gWKJr7nr78-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/gWKJr7nr78-768.jpeg 768w, https://chromamine.com/media/img/gWKJr7nr78-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A positive QuickVue test strip&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/gWKJr7nr78-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;On the other hand, if the test was negative, reduced sensitivity meant it would &lt;em&gt;not&lt;/em&gt; be a reliable indicator I was done with my infection. I would need to follow up with a more sensitive test to confirm. But I could at least conserve my unexpired tests by using them only when needed.&lt;/p&gt;
&lt;p&gt;On approximately day five of my infection (seven days after exposure, five days after my first definitive symptom, four days after first positive test) I was feeling a lot better. My symptoms had declined to an occasional cough and sniffle. Using one of my expired tests I got a very faint positive.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/NrXqM3OBw6-768.webp 768w, https://chromamine.com/media/img/NrXqM3OBw6-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/NrXqM3OBw6-768.jpeg 768w, https://chromamine.com/media/img/NrXqM3OBw6-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A faintly positive QuickVue test strip&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/NrXqM3OBw6-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;I knew in theory reduced sensitivity might mislead me here, but never having seen it demonstrated, I was hopeful perhaps it wasn’t a large factor and I would be over my infection soon.&lt;/p&gt;
&lt;p&gt;On the fifth day I used my final expired Quidel test and came up negative.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/KtvOxfiz_h-768.webp 768w, https://chromamine.com/media/img/KtvOxfiz_h-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/KtvOxfiz_h-768.jpeg 768w, https://chromamine.com/media/img/KtvOxfiz_h-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A negative QuickVue test strip&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/KtvOxfiz_h-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Alas, when I tried to confirm with an unexpired BinaxNOW&lt;a href=&quot;https://chromamine.com/2023/11/using-expired-covid-antigen-tests/#fn3&quot; class=&quot;footnote-ref&quot; id=&quot;fnref3&quot;&gt;³&lt;/a&gt; I got a clear, “nope, your infection is still kicking.”&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/MM6Qyw45aa-768.webp 768w, https://chromamine.com/media/img/MM6Qyw45aa-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/MM6Qyw45aa-768.jpeg 768w, https://chromamine.com/media/img/MM6Qyw45aa-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A positive BinaxNOW card&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/MM6Qyw45aa-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1138&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;So, despite feeling mostly healthy, I’m still in isolation. At least I’ve done a cool empirical demonstration of the way antigen tests degrade. Here’s hoping it won’t be too much longer.&lt;/p&gt;
&lt;p&gt;(Obligatory caveat: I’m not a scientist and none of this is medical advice or even a sound scientific demonstration. But it is kinda neat, no?)&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;At least this is what I was told on Twitter once by someone who worked as an antigen test developer. &lt;a href=&quot;https://chromamine.com/2023/11/using-expired-covid-antigen-tests/#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;Truly expired, even accounting for the extensions. If you have tests you think are expired, be sure to check them against &lt;a href=&quot;https://www.fda.gov/medical-devices/coronavirus-covid-19-and-medical-devices/home-otc-covid-19-diagnostic-tests&quot;&gt;the FDA list&lt;/a&gt;! Many tests have had their expiration dates extended by even a year. My tests expired on June 29, 2023, including their extended life. &lt;a href=&quot;https://chromamine.com/2023/11/using-expired-covid-antigen-tests/#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;This particular demonstration would be more effective if I had used another Quidel test, but I didn’t think about it in time and I didn’t really feel like blowing a third test in a single day just for the sake of science – tempting as it is. I somewhat suspect BinaxNOW tests are more sensitive than their competitors even regardless of expiration date. &lt;a href=&quot;https://chromamine.com/2023/11/using-expired-covid-antigen-tests/#fnref3&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>At-Home Molecular Tests Are Back</title>
            <link href="https://chromamine.com/2023/11/at-home-molecular-tests-are-back/"/>
            <updated>2023-11-15T00:00:00Z</updated>
            <id>https://chromamine.com/2023/11/at-home-molecular-tests-are-back/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;I didn’t notice this when it happened, but it looks like Lucira’s at-home molecular covid tests &lt;a href=&quot;https://www.amazon.com/LUCIRA%C2%AE-COVID-19-Results-Emergency-Authorized/dp/B0CL7S9F4P/&quot;&gt;are back in stock&lt;/a&gt; under Pfizer, who acquired Lucira in bankruptcy. Notably the new ones &lt;em&gt;also test for the flu.&lt;/em&gt; These were approved by the FDA just as Lucira declared bankruptcy – really poor timing for Lucira.&lt;/p&gt;
&lt;p&gt;They seem to be priced somewhat more cheaply as well at $50 vs $75 (though not more cheaply than when they were being liquidated and I got a bunch for $23).&lt;/p&gt;
&lt;p&gt;It might be worth acquiring one for the respiratory virus season, if you can afford it, particularly if you’re high risk and might want antivirals if you get sick. It can be pretty challenging to get prescribed flu antivirals because they have to be initiated within 48 hours of symptoms starting. That means getting a test administered and picking up a prescription within that window! This is currently the only at-home flu test on the market in the US. They’re somewhat more accurate than antigen tests for covid, closer to a PCR test.&lt;/p&gt;
&lt;p&gt;I was fortunate a year ago, when I got the flu, to have a responsive PCP who had me in for a flu test same day. I ended up opting against antivirals, but I was glad to have the option. (I’m not 100% sure if a doctor can/would prescribe flu antivirals on the basis of an at home test—maybe someone else knowledgeable can let me know.)&lt;/p&gt;
</content>
        </entry>
        <entry>
            <title>Switching to Fastmail</title>
            <link href="https://chromamine.com/2023/10/switching-to-fastmail/"/>
            <updated>2023-10-20T00:00:00Z</updated>
            <id>https://chromamine.com/2023/10/switching-to-fastmail/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;A few months ago I got &lt;a href=&quot;https://chromamine.com/2023/05/increasingly-frustrated-with-gmail/&quot;&gt;pretty annoyed with Gmail&lt;/a&gt;. The motivating event was noticing ads interspersed among my emails. It maybe wasn’t a super big deal&lt;a href=&quot;https://chromamine.com/2023/10/switching-to-fastmail/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;, but it spurred me to realize that, while Gmail was the best-of-class email platform for many years, that moat has narrowed or disappeared&lt;a href=&quot;https://chromamine.com/2023/10/switching-to-fastmail/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt;. It’s now possible to pay for a service better incentivized to make product decisions for users rather than business clients. I opted to switch to &lt;a href=&quot;https://www.fastmail.com/&quot;&gt;Fastmail&lt;/a&gt;&lt;a href=&quot;https://chromamine.com/2023/10/switching-to-fastmail/#fn3&quot; class=&quot;footnote-ref&quot; id=&quot;fnref3&quot;&gt;³&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This switch was &lt;em&gt;easier&lt;/em&gt; than I expected and I’m very satisfied with Fastmail. There’s a few things that are slightly worse, but the majority of my email flow is much improved. The cost is only slightly more than I was previously paying Google for storage.&lt;/p&gt;
&lt;h3&gt;Setup&lt;/h3&gt;
&lt;p&gt;Setup was super easy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It allowed me from the outset to use a custom domain. It automatically detected &lt;a href=&quot;https://www.gandi.net/en&quot;&gt;my domain registrar&lt;/a&gt; and gave me step by step instructions for how to configure through them.&lt;/li&gt;
&lt;li&gt;It imported all of my emails from my Gmail inbox and allowed me to leave the import running indefinitely. I thought I’d undergo a process of telling my friends to update their inboxes and changing my address for services across the web – but that hasn’t been necessary. People email me at my Gmail address and I reply from my Chromamine address and there’s no trouble.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Custom Domains&lt;/h3&gt;
&lt;p&gt;The custom domain support is &lt;em&gt;so good&lt;/em&gt; it justifies the fee entirely for me. This might be a niche feature, since many people don’t own their own domain names, but having a custom domain for email is so good that you maybe should consider it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fastmail supports multiple custom domain names (Gmail, by contrast, doesn’t seem to support any unless you pay for the more costly &lt;a href=&quot;https://workspace.google.com/&quot;&gt;Google Workspace&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;For each domain you can set up as many email addresses as you want. Each email address can have its own default signature, which has turned out to be pretty useful. For example, emails I send from &lt;code&gt;contra@chromamine.com&lt;/code&gt; automatically include a link to my &lt;a href=&quot;https://chromamine.com/dance/&quot;&gt;contra dance website&lt;/a&gt; and a mention of the organizations I help run.&lt;/li&gt;
&lt;li&gt;You can also set it up to receive catch-all emails – i.e., anytime someone sends an email to &lt;code&gt;&lt;em&gt;anyuser&lt;/em&gt;@yourdomain.com&lt;/code&gt; it can show up in your inbox. I use this to filter my emails and identify who shares my email address with spammers&lt;a href=&quot;https://chromamine.com/2023/10/switching-to-fastmail/#fn4&quot; class=&quot;footnote-ref&quot; id=&quot;fnref4&quot;&gt;⁴&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;You can also &lt;em&gt;send&lt;/em&gt; from arbitrary email addresses. I can send you an email and make up an address, say &lt;code&gt;todayisoct20@chromamine.com&lt;/code&gt;, on the fly.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For me these are huge quality of life improvements over what I was getting previously from Gmail.&lt;/p&gt;
&lt;p&gt;(Worth a note here: even if you don’t have a custom domain, you can create multiple anonymous Fastmail addresses on the fly using Fastmail’s “&lt;a href=&quot;https://www.fastmail.help/hc/en-us/articles/4406536368911-Masked-Email&quot;&gt;masked email&lt;/a&gt;” feature, though I personally use &lt;a href=&quot;https://support.apple.com/en-us/102602&quot;&gt;iCloud Private Relay&lt;/a&gt; for this purpose.)&lt;/p&gt;
&lt;h3&gt;The Client&lt;/h3&gt;
&lt;p&gt;Honestly, I’ve yet to encounter an email client I &lt;em&gt;truly&lt;/em&gt; love, but I think in general the Fastmail client is as good as the Gmail client.&lt;/p&gt;
&lt;p&gt;There’s things I think are better: I think it’s generally less cluttered and easier for me to use.&lt;/p&gt;
&lt;p&gt;There’s a few things that are worse: I miss Gmail’s auto-sorting into categories. I’ve mostly made up for that by making more aggressive use of manually curated filters and labels to keep the day-to-day receipts, notifications, and subscriptions out of my inbox. Fastmail, incidentally, offers more powerful filtering options, including writing custom filters in &lt;a href=&quot;https://en.wikipedia.org/wiki/Sieve_(mail_filtering_language)&quot;&gt;Sieve&lt;/a&gt; if you so choose. I also miss being able to pop out the email composer into a popover, so I can refer to other emails while composing. I’ve worked around this by just opening a new window for composing email as needed.&lt;/p&gt;
&lt;p&gt;Fastmail has also surprised me with a few UX niceties:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;It seems to have &lt;em&gt;better&lt;/em&gt; handling of listservs than Gmail. When responding to a listserv email instead of “Reply” and “Reply All” (which can have unpredictable behavior depending on the configuration of the listserv) it offers me “Reply to List” and “Reply to Sender.”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sometimes, after using the built in “Unsubscribe” it will additionally offer to &lt;em&gt;delete&lt;/em&gt; all emails from the list I just unsubscribed from:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/Diutzb9B5V-768.webp 768w, https://chromamine.com/media/img/Diutzb9B5V-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/Diutzb9B5V-768.jpeg 768w, https://chromamine.com/media/img/Diutzb9B5V-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Screenshot of a notification saying &amp;quot;You have unsubscribed from this list. Would you also like to delete all messages received from this list?&amp;quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/Diutzb9B5V-768.jpeg&quot; width=&quot;1536&quot; height=&quot;153&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;I haven’t figured out what combination of factors triggers this option to appear or not, but I appreciate it when it does.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Some Pain Points&lt;/h3&gt;
&lt;h4&gt;Calendars&lt;/h4&gt;
&lt;p&gt;I initially tried to move to Fastmail calendar. I wanted the direct integration between email invitations and calendar events. This was, unfortunately, &lt;em&gt;disastrous&lt;/em&gt;, though I’ll concede it may have to do with the specific quirks of how I use calendars.&lt;/p&gt;
&lt;p&gt;In particular, I tried to use Fastmail as a client for my existing Google calendar, figuring I’d accept event invites through my email client, but continue to use Google Calendar’s web interface. It allows this in a halfhearted way. It doesn’t officially support using an external calendar as your default. If you don’t have a default calendar but you do connect a Google Calendar account it will choose a calendar associated with your Google account at random. Ugh.&lt;/p&gt;
&lt;p&gt;I use shared calendars for housemates and organizations. I often create events and add myself as an attendee so they also appear on my personal calendar. Fastmail and Google were unable to coordinate properly on this. Sometimes when I tried to personally RSVP “no” to an event it would &lt;em&gt;cancel&lt;/em&gt; the event for all attendees. At one point I somehow set off an autonomous loop where my calendars were canceling and then recreating an event for a &lt;a href=&quot;https://bidadance.org/&quot;&gt;BIDA&lt;/a&gt; board meeting repeatedly for an hour, spamming the rest of the board.&lt;/p&gt;
&lt;p&gt;Ultimately I gave up on getting this integration working and I’ve continued to use Google Calendar for everything. If someone sends a calendar invite to my Chromamine email I have to ask them to resend it to my Gmail (annoyingly, since this is the &lt;em&gt;only&lt;/em&gt; thing I’d like people to use that address for), but this hasn’t happened frequently.&lt;/p&gt;
&lt;p&gt;Possibly I could achieve better integration by using a different email and calendar client (such as Apple Mail and Calendar), but I haven’t experimented, since I’m otherwise satisfied with Fastmail and Google Calendar independent of each other.&lt;/p&gt;
&lt;h4&gt;Google Groups&lt;/h4&gt;
&lt;p&gt;Along similar lines, I manage a few Google Groups. Google Groups allows you to subscribe to a group with a non-Gmail email address – though it’s not well documented. As far as I can tell, it does not let you &lt;em&gt;manage&lt;/em&gt; a group with a non-Google email address.&lt;/p&gt;
&lt;p&gt;I worked around this by adding both my Google account and my Chromamine address to the group and setting my Google account to receive no emails. I could still use the Google account to manage the group, but emails only get sent to my other email.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/yae5dllVnn-768.webp 768w, https://chromamine.com/media/img/yae5dllVnn-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/yae5dllVnn-768.jpeg 768w, https://chromamine.com/media/img/yae5dllVnn-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Screenshot of the interface for managing Google Groups members. There are two Harris Lapiroffs in the group. One has the email address harrislapiroff@gmail.com, the other harris@chromamine.com. The former is set to &amp;quot;No email.&amp;quot; The latter is set to &amp;quot;Each Email.&amp;quot;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/yae5dllVnn-768.jpeg&quot; width=&quot;1536&quot; height=&quot;421&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;The workarounds for both of the above issues are irritating, but much outweighed by the things I really enjoy about Fastmail and I’m happy to have switched.&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;These ads appear only in the Promotions and Social tabs, which are somewhat marketing-heavy regardless. Though it still strikes me as ironic that for many years one of Gmail’s major features was cutting edge spam blocking – only for them to inject spam back into our inboxes. &lt;a href=&quot;https://chromamine.com/2023/10/switching-to-fastmail/#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;Largely, I think, due to the process Cory Doctorow calls “&lt;a href=&quot;https://pluralistic.net/2023/01/21/potemkin-ai/#hey-guys&quot;&gt;enshittification&lt;/a&gt;”:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Here is how platforms die: first, they are good to their users; then they abuse their users to make things better for their business customers; finally, they abuse those business customers to claw back all the value for themselves.&lt;/p&gt;
&lt;/blockquote&gt;
 &lt;a href=&quot;https://chromamine.com/2023/10/switching-to-fastmail/#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/li&gt;
&lt;li id=&quot;fn3&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;People mostly suggested Fastmail and ProtonMail to me. Though I’m generally a security-conscious user, ProtonMail’s devotion to security was above my needs, would introduce some annoyances – not being able to use third-party email clients, for example – and cost a little more than a comparable Fastmail plan. &lt;a href=&quot;https://chromamine.com/2023/10/switching-to-fastmail/#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;I’ve historically used Gmail’s &lt;a href=&quot;https://gmail.googleblog.com/2008/03/2-hidden-ways-to-get-more-from-your.html&quot;&gt;“Plus Addressing”&lt;/a&gt; to do this, but, annoyingly, many websites won’t accept email addresses containing plus signs. &lt;a href=&quot;https://chromamine.com/2023/10/switching-to-fastmail/#fnref4&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Modifying 3D Prints to Perfection</title>
            <link href="https://chromamine.com/2023/10/modifying-3d-prints/"/>
            <updated>2023-10-13T00:00:00Z</updated>
            <id>https://chromamine.com/2023/10/modifying-3d-prints/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;One particular joy of 3D printing is the discovering some potential quality of life improvement, searching it up on &lt;a href=&quot;https://www.printables.com/&quot;&gt;Printables&lt;/a&gt;, &lt;a href=&quot;https://www.thingiverse.com/&quot;&gt;Thingiverse&lt;/a&gt;, or any other 3D model repository and — lo and behold someone has designed a model for that! You pop the file into your 3D printer – maybe with a quick stopover at your &lt;a href=&quot;https://www.prusa3d.com/prusaslicer/&quot;&gt;slicer&lt;/a&gt; – et voilà, problem solved.&lt;/p&gt;
&lt;p&gt;It’s pretty thrilling, even without ever doing any design yourself. It’s especially thrilling when the problems are too niche to have widely available commercial solutions. 3D printing extends the long tail of practical objects. As an example, here’s a design &lt;a href=&quot;https://www.thingiverse.com/thing:4072679&quot;&gt;I found online&lt;/a&gt; to replace the broken ball joint on my guitar tuner, extending its lifespan:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/l_T_ThS3CI-768.webp 768w, https://chromamine.com/media/img/l_T_ThS3CI-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/l_T_ThS3CI-768.jpeg 768w, https://chromamine.com/media/img/l_T_ThS3CI-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A Snark guitar tuner clipped onto a guitar headstock. A red plastic semicircle surrounds the circumference of the tuner&#39;s round display and from it extends a red ball joint secured in the clip.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/l_T_ThS3CI-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Plenty of people spend most of their 3D printing time in this space – finding designs online and printing them at home. Sometimes, though, you have a need too specific to be solved by a premade design.&lt;/p&gt;
&lt;p&gt;For example: One common problem with old toilet paper holders is that they’re sized for the “normal” rolls of yesteryear, not the “mega” rolls of today. There’s &lt;a href=&quot;https://www.printables.com/search/all?q=toilet%20paper%20extender&quot;&gt;plenty of designs&lt;/a&gt; for toilet paper holder extenders available, but I couldn’t find one that looked like it would fit our specific holder. So I designed my own:&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/9fdZMNRQuj-768.webp 768w, https://chromamine.com/media/img/9fdZMNRQuj-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/9fdZMNRQuj-768.jpeg 768w, https://chromamine.com/media/img/9fdZMNRQuj-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Two white cylindrical plastic objects with a slot through their middle and a divot on one side.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/9fdZMNRQuj-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/0Iglij83lz-768.webp 768w, https://chromamine.com/media/img/0Iglij83lz-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/0Iglij83lz-768.jpeg 768w, https://chromamine.com/media/img/0Iglij83lz-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The two cylindrical objects pictured earlier, now slotted around the arms of a ceramic toilet paper holder. They extend the length of the holder and a roll of toilet paper sits at the end, about an inch further out than it would without the extenders.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/0Iglij83lz-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;There’s also an option between the premade and the fully bespoke: Finding a design close to your needs and modifying it. I recently downloaded &lt;a href=&quot;https://www.printables.com/model/229538-print-in-place-bag-clip-2-parametric/&quot;&gt;this design for pantry bag clips&lt;/a&gt;. They’re excellent — durable and secure&lt;a href=&quot;https://chromamine.com/2023/10/modifying-3d-prints/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;. But I wanted them to stick to my fridge so I could always find them when needed. I do most of my designing in &lt;a href=&quot;https://openscad.org/&quot;&gt;OpenSCAD&lt;/a&gt;, a coding based 3D modeling environment. I wrote this code to add a cavity to the clip where I could insert magnets:&lt;/p&gt;
&lt;pre class=&quot;shiki shiki-themes github-light github-dark-default&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#0d1117;color:#24292e;--shiki-dark:#e6edf3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-scad&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;// Render circles at high detail&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;$fa &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; 0.1&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;$fs &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; 0.01&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;clip_height &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;// Define the space to fit two 6x1.5mm magnets (with a little extra space)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;magnet_height &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; 3.5&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;magnet_radius &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; 3.5&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;difference&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; () {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;    // Import the clip file and position it above the XY plane&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;    translate&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;, clip_height &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;    import&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#A5D6FF&quot;&gt;&quot;100-mm-bag-clip-2.3mf&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#8B949E&quot;&gt;    // Add an internal cavity for the magnets&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;    translate&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt;60.5&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;, clip_height &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt; magnet_height &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79C0FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#D2A8FF&quot;&gt;    cylinder&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;(h&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;magnet_height, r&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#FF7B72&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;magnet_radius);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E6EDF3&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;which yields this (clip rendered transparent to make internal cavity visible):&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/6cGWCxDJcI-768.webp 768w, https://chromamine.com/media/img/6cGWCxDJcI-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/6cGWCxDJcI-768.jpeg 768w, https://chromamine.com/media/img/6cGWCxDJcI-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A 3D render of a bag clip, shown transparent, with a yellow cylinder embedded in the hinge of the clip&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/6cGWCxDJcI-768.jpeg&quot; width=&quot;1536&quot; height=&quot;962&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;I sliced the model in &lt;a href=&quot;https://www.prusa3d.com/prusaslicer/&quot;&gt;Prusa Slicer&lt;/a&gt; and added a pause at the top of the cavity, which tells my 3D printer to print that far, then alert me and wait for me to insert the magnets before continuing&lt;a href=&quot;https://chromamine.com/2023/10/modifying-3d-prints/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/ulWTxlFJLJ-768.webp 768w, https://chromamine.com/media/img/ulWTxlFJLJ-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/ulWTxlFJLJ-768.jpeg 768w, https://chromamine.com/media/img/ulWTxlFJLJ-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A batch of 4 clips on a 3D printer bed, paused mid-print. Four shiny circular magnets are slotted into holes at the head of each clip&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/ulWTxlFJLJ-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/iNUTg8Xtl9-768.webp 768w, https://chromamine.com/media/img/iNUTg8Xtl9-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/iNUTg8Xtl9-768.jpeg 768w, https://chromamine.com/media/img/iNUTg8Xtl9-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;The same batch of four clips with the printhead extruding a layer of plastic over the magnets.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/iNUTg8Xtl9-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;And the finished product, with the magnets fully sealed inside:&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/xeJy1Ci-I--768.webp 768w, https://chromamine.com/media/img/xeJy1Ci-I--1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/xeJy1Ci-I--768.jpeg 768w, https://chromamine.com/media/img/xeJy1Ci-I--1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A batch of clips of varying sizes stuck to a refrigerator door&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/xeJy1Ci-I--768.jpeg&quot; width=&quot;1536&quot; height=&quot;2048&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/0ngCOGFOtr-768.webp 768w, https://chromamine.com/media/img/0ngCOGFOtr-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/0ngCOGFOtr-768.jpeg 768w, https://chromamine.com/media/img/0ngCOGFOtr-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A batch of clips of varying sizes stuck to a refrigerator door&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/0ngCOGFOtr-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;They’re perhaps a bit too secure – surprisingly and inadvertently effective at locking housemates with less hand strength out of the pantry snacks. &lt;a href=&quot;https://chromamine.com/2023/10/modifying-3d-prints/#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;Because parts of the print head are magnetic and will pull up the magnets as it passes back over them, I had to use a bit of superglue to adhere the magnets in place. &lt;a href=&quot;https://chromamine.com/2023/10/modifying-3d-prints/#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Eleventy</title>
            <link href="https://chromamine.com/2023/10/eleventy/"/>
            <updated>2023-10-07T00:00:00Z</updated>
            <id>https://chromamine.com/2023/10/eleventy/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;I love the idea of static site generators (sometimes known as SSGs or SSBs – static site builders). They eschew the complexity of modern CMSes such as Wordpress. Instead of server-side code and databases, a static site generator is a script that, when run, transforms a folder of text files and templates into HTML.&lt;/p&gt;
&lt;p&gt;There are advantages to SSGs over CMSes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;They’re portable and cheap:&lt;/strong&gt; You can host an SSG site anywhere that can host HTML files – including many free services.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;They have a built-in escape strategy:&lt;/strong&gt; If you decide to switch platforms later, you can take your folder of Markdown (or similar text-formatted) files elsewhere. No complicated database migrations or exports are required.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;They’re fast:&lt;/strong&gt; All the processing happens at build time so the server doesn’t need to run custom code to serve the files.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There’s also some disadvantages. Namely: you can’t include features that typically require server-side code, such as native commenting or search. They’re not ideal for complicated multi-user setups with permissions and editorial workflows. They also aren’t appropriate for non-technical authors since they’re generally run from a &lt;a href=&quot;https://en.wikipedia.org/wiki/Command-line_interface&quot;&gt;command-line&lt;/a&gt; and require committing to a git repository&lt;a href=&quot;https://chromamine.com/2023/10/eleventy/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I’ve long used &lt;a href=&quot;https://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt;, a venerable and capable SSG, for small projects and blogs. Jekyll is simple to use and has been supported out-of-the-box by &lt;a href=&quot;https://pages.github.com/&quot;&gt;GitHub Pages&lt;/a&gt; for many years.&lt;/p&gt;
&lt;p&gt;For this blog I experimented with &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt;, stylized “11ty.” It has commonalities with Jekyll but offers more hooks for deeper customization. It’s also written in Javascript — a language I know well and can use to customize the setup to my heart’s content.&lt;/p&gt;
&lt;p&gt;It’s similar enough to Jekyll that I was able to migrate over my &lt;a href=&quot;https://chromamine.com/dance/&quot;&gt;contra dance caller and organizer site&lt;/a&gt; with almost no modifications. It’s flexible enough that I almost feel not like I’m using a prebuilt system and more like I’m constructing my own system out of the building blocks Eleventy provides. You can see my entire &lt;a href=&quot;https://github.com/harrislapiroff/chromamine.com/blob/main/eleventy.config.js&quot;&gt;Eleventy configuration&lt;/a&gt;, but here’s a few custom things I’m doing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Using Markdown footnotes and customizing how they display&lt;/li&gt;
&lt;li&gt;Using indented &lt;a href=&quot;https://sass-lang.com/&quot;&gt;SASS&lt;/a&gt; instead of CSS and &lt;a href=&quot;https://pugjs.org/&quot;&gt;Pug&lt;/a&gt; for my HTML templates&lt;a href=&quot;https://chromamine.com/2023/10/eleventy/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Adding my own custom filters for formatting dates and numbers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I’m excited to push the boundaries of what SSGs can do. Here’s a few things I’m looking forward to experimenting with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Blog posts in formats other than Markdown: In particular, I do a lot of data visualization using &lt;a href=&quot;https://observablehq.com/@harrislapiroff?tab=profile&quot;&gt;Observable notebooks&lt;/a&gt; and I’m interested in devising a way to natively self-host those.&lt;/li&gt;
&lt;li&gt;Pulling comments on posts from other platforms such as &lt;a href=&quot;https://social.coop/@harris&quot;&gt;Mastodon&lt;/a&gt;&lt;a href=&quot;https://chromamine.com/2023/10/eleventy/#fn3&quot; class=&quot;footnote-ref&quot; id=&quot;fnref3&quot;&gt;³&lt;/a&gt;. I imagine this will take the form of a periodically run &lt;a href=&quot;https://github.com/features/actions&quot;&gt;GitHub Action&lt;/a&gt; that looks for comments on other platforms and commits them to the repo.&lt;/li&gt;
&lt;li&gt;Integrating some sort of search. I’m planning to explore client-side search engines, like &lt;a href=&quot;https://lunrjs.com/&quot;&gt;Lunr&lt;/a&gt;, but if that turns out to be too bandwidth intensive, I’ll investigate hosted options, like &lt;a href=&quot;https://programmablesearchengine.google.com/about/&quot;&gt;Google Programmable Search Engine&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Overall, I’m very happy with how Eleventy is working out for me and excited about exploring its possibilities.&lt;/p&gt;
&lt;p&gt;(Someday soon, I will write a blog post that isn’t a meta-post about the blog itself. In the meantime, I just migrated over an &lt;a href=&quot;https://chromamine.com/2013/08/dragonflies/&quot;&gt;old blog post&lt;/a&gt; about my life a decade ago, if you want something different.)&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;I don’t think these are necessarily inherent to the concept of SSGs – and there have been attempts at &lt;a href=&quot;https://prose.io/&quot;&gt;user-friendly GUI editors&lt;/a&gt; – but it is at least how they are typically generated and hosted now. &lt;a href=&quot;https://chromamine.com/2023/10/eleventy/#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;I’ve been a sucker for indented languages, ever since I learned Python in college. I think they look more elegant and they eliminate whole classes of syntax errors. I may have to give up on Pug though – it’s a somewhat fussy language that’s not well documented or maintained and doesn’t play nice with Eleventy’s default filters. &lt;a href=&quot;https://chromamine.com/2023/10/eleventy/#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;Inspired by &lt;a href=&quot;https://jefftk.com/&quot;&gt;Jeff&lt;/a&gt; who pulls in comments from various platforms to display on his blog. &lt;a href=&quot;https://chromamine.com/2023/10/eleventy/#fnref3&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>My New Blog</title>
            <link href="https://chromamine.com/2023/09/my-new-blog/"/>
            <updated>2023-09-29T00:00:00Z</updated>
            <id>https://chromamine.com/2023/09/my-new-blog/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;I’m starting a blog (again)! Why do I want to have a blog?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;I used to write.&lt;/strong&gt; I was reasonably good at it, I think. I’m rusty now. I spent the past decade or so focusing on other things, but I always told myself I could get back to writing someday if I wanted to.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;I want to document things I know and learn and think.&lt;/strong&gt; I want a place to point when someone asks me questions like “&lt;a href=&quot;https://chromamine.com/2022/08/aranet4/&quot;&gt;What kind of CO₂ monitor do you use and do you like it?&lt;/a&gt;” or “&lt;a href=&quot;https://chromamine.com/2022/10/mixers-at-contra-dances/&quot;&gt;Why do you think contra dances should have mixers?&lt;/a&gt;”. I want this for sharing, but I also want it for Future Harris’s reference. My brain is leaky. Hopefully my blog is not.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;I love a technical playground.&lt;/strong&gt; Professional work can be limiting, especially as I do more management and less code as my career develops. I’ve been a web developer and designer most of my life and I enjoy it. This can be more than just a place for me to write. My blog can be a place to experiment with different technologies and aesthetics, unconstrained by professional concerns.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;I can control my own content.&lt;/strong&gt; I post plenty of trivial thoughts and day-to-day tidbits on social media, but, especially with work I put effort into, I’d like to preserve it in its best form. I don’t want to depend on &lt;a href=&quot;https://x.com/&quot;&gt;third-parties&lt;/a&gt; to make it easy to find and access. I want to know that – if I choose – I can keep my writing online for 20 years or more. I’ll likely follow a &lt;a href=&quot;https://indieweb.org/POSSE&quot;&gt;POSSE&lt;/a&gt; approach here&lt;a href=&quot;https://chromamine.com/2023/09/my-new-blog/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So, I’ve created this blog. I’ve stuck it in a design that I think is cute and the right amount of nerdy and that will probably change over time. I’ve played with some new-to-me technologies in the process (more on this later, probably). I’ve imported some older content from social media and I’ll continue to plumb my social media profiles and older blogs for things worth sharing. For a while, I expect this blog will grow in two directions – out into the future and backward into the past.&lt;/p&gt;
&lt;p&gt;I’ve had blogs in the past, on and off. I’ve maintained them with greater and lesser success at times and I make no promises about how well I’ll do with this one. I will try to keep my FILDI&lt;a href=&quot;https://chromamine.com/2023/09/my-new-blog/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt; strong. We’ll see how it goes.&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Hat tip to &lt;a href=&quot;https://www.jefftk.com/&quot;&gt;Jeff&lt;/a&gt; for pointing out the relevant acronym to me as well as being a blogging inspiration. &lt;a href=&quot;https://chromamine.com/2023/09/my-new-blog/#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;Fuck It Let’s Do It – as coined by aughts vlogger Ze Frank. &lt;a href=&quot;https://chromamine.com/2023/09/my-new-blog/#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>Recommendation: Appliance Cable Organizers</title>
            <link href="https://chromamine.com/2023/06/recommendation-appliance-cable-organizers/"/>
            <updated>2023-06-07T00:00:00Z</updated>
            <id>https://chromamine.com/2023/06/recommendation-appliance-cable-organizers/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;Here’s a small purchase that’s been bringing me some satisfaction lately:&lt;/p&gt;
&lt;p&gt;I find it really annoying when an appliance comes with a long cord and no way to store it. Especially if it’s an appliance I find myself moving frequently (like my kitchen mixer) or even if it’s one where I only move it occasionally but it’s really awkward when I do (like a window AC unit).&lt;/p&gt;
&lt;p&gt;I found these stick on cable organizers that solve this problem for me! &lt;a href=&quot;https://a.co/d/4PTlOvj&quot;&gt;These&lt;/a&gt; are the particular ones I purchased but I’m sure there’s lots of similar options on and off of Amazon.&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/nYlNu0LFae-768.webp 768w, https://chromamine.com/media/img/nYlNu0LFae-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/nYlNu0LFae-768.jpeg 768w, https://chromamine.com/media/img/nYlNu0LFae-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A white box fan with a white silicone cable organizer adhered to the side and the power cable coiled around it.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/nYlNu0LFae-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2048&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/c7oMgj245m-768.webp 768w, https://chromamine.com/media/img/c7oMgj245m-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/c7oMgj245m-768.jpeg 768w, https://chromamine.com/media/img/c7oMgj245m-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Back of a red KitchenAid stand mixer with a black silicone cable organizer adhered to the back and the power cable coiled around it.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/c7oMgj245m-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2048&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/z3w8yRvh-6-768.webp 768w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A gray boxy HEPA air purifier with a gray silicone cable organizer adhered to the back and the power cable coiled around it.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/z3w8yRvh-6-768.jpeg&quot; width=&quot;768&quot; height=&quot;947&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
</content>
        </entry>
        <entry>
            <title>Generative AI Possibilities and Adobe Firefly</title>
            <link href="https://chromamine.com/2023/05/generative-ai-possibilities-and-adobe-firefly/"/>
            <updated>2023-05-24T00:00:00Z</updated>
            <id>https://chromamine.com/2023/05/generative-ai-possibilities-and-adobe-firefly/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;I’ve critiqued conversations about new “generative AI models” for the past year as often having limited imagination about what these models can do. People tend to assume what they’re being used to do &lt;em&gt;now&lt;/em&gt; is what they will continue to be used to for in the future. Specifically “enter a prompt, get an image” for image models (like Midjourney and DALL-E) and “chatbots” for LLMs (like ChatGPT).&lt;/p&gt;
&lt;p&gt;I think this has really limited conversation, because, for example, it’s easy to see “enter a prompt, get an image” as a way to replace artists and discuss the technology on those grounds. But I’ve figured that these models aren’t going to be used in that specific way primarily for long—they’re more likely to become components in the artistic process, making certain things easier, lowering the barrier to entry to visual art, and making it trivial to accomplish certain visual effects that were previously inaccessible or challenging, much like modern cameras make certain types of photography trivial that were challenging a couple decades ago.&lt;/p&gt;
&lt;p&gt;(I think something similar happens in conversations about ChatGPT. People see chatbots, but they don’t see “cheap classifier,” “image alt text writer,” “document summarizer,” or “style guide adherence checker.” Some people see “code assistant”—partially because those products already exist—imo one of the most productive places we’ve found to deploy LLMs so far, already benefiting my work personally.)&lt;/p&gt;
&lt;p&gt;Anyway, here’s &lt;a href=&quot;https://blog.adobe.com/en/publish/2023/05/23/future-of-photoshop-powered-by-adobe-firefly&quot;&gt;the first tool&lt;/a&gt; I’ve seen based on the same general image generation technology as Stable Diffusion/DALL-E/Midjourney that’s poised to go mainstream. It’s from Adobe, baked into Photoshop, trained exclusively on image sets that Adobe has rights to, and to me feels like a natural successor to the content-aware fill functionality that visual artists have already used for a decade+ already. Very curious to see how it will be received.&lt;/p&gt;
</content>
        </entry>
        <entry>
            <title>Calling Dances at Porchfest</title>
            <link href="https://chromamine.com/2023/05/calling-dances-at-porchfest/"/>
            <updated>2023-05-19T00:00:00Z</updated>
            <id>https://chromamine.com/2023/05/calling-dances-at-porchfest/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;Last weekend I called contra dances at &lt;a href=&quot;https://somervilleartscouncil.org/porchfest&quot;&gt;Somerville Porchfest&lt;/a&gt; on &lt;a href=&quot;https://www.jefftk.com/&quot;&gt;Jeff&lt;/a&gt;’s porch, with his band &lt;a href=&quot;https://www.kingfisherband.com/&quot;&gt;Kingfisher&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There were some interesting calling challenges that were different from usual, so I made a few notes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Porchfest is a music event. We wanted to devote time to music, not me talking. Jeff requested I do no walkthroughs, short walkthroughs, and rolling starts. I wanted to have as low risk of making errors (which are time consuming and might interrupt music) as possible.&lt;/li&gt;
&lt;li&gt;A lot of non-dancers made up the audience—some drunk. I wasn’t sure how much to expect people with no contra dance experience to jump in, but the answer turned out to be at least a few every time—at least one with a White Claw still in hand!&lt;/li&gt;
&lt;li&gt;There was no time for a workshop, both because of point 1 and because people were coming and going continuously, not mostly coming at the start.&lt;/li&gt;
&lt;li&gt;Relatedly, there wasn’t much point in thinking about the flow of the program since there wasn’t really a way to ramp up the skill level of the dancers over time. (There was some flow switching from lively to mellow, etc., which the musicians and I negotiated on the spot.)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Here are some things I did to adapt to this:&lt;/p&gt;
&lt;p&gt;Every other dance I did was “no walkthrough.” The ones that I walked through were split between actual (very quick) walkthroughs and rolling starts where the band came in pretty quickly during the first time through. I didn’t do more than one walkthrough for any and—as far as I could tell—I didn’t make any errors that should have caused me to bail on a dance. Phew.&lt;/p&gt;
&lt;p&gt;I selected simple dances. I tried to choose some dances that were distinctive without complex figures, for example Cis Hinkel’s “&lt;a href=&quot;https://www.ibiblio.org/contradance/thecallersbox/dance.php?id=3194&quot;&gt;Rollin’ and Tumblin’&lt;/a&gt;.”&lt;/p&gt;
&lt;p&gt;I tried to avoid dances with interaction outside of minor sets. If a minor set got confused it wouldn’t throw anyone else off. I inadvertently threw in one, though—I didn’t take good notes on my program but I think it was David Kaynor’s “&lt;a href=&quot;http://www.quiteapair.us/calling/acdol/dance/acd_95.html&quot;&gt;Mary Cay’s Reel&lt;/a&gt;.” There was some confusion, but I think it worked out OK—everyone got where they needed for the partner swing.&lt;/p&gt;
&lt;p&gt;I didn’t want to fully discourage new dancers, but I knew they would be lost no matter what—the figure names would be gibberish to them. With too many beginners the line would fall apart, but a small number would be OK. I couldn’t say, “Exactly four new people can join the line,” though!&lt;/p&gt;
&lt;p&gt;I tried making announcements like, “We will have a brief walkthrough for this one, so if you are new, find a partner who can pull you through a contra dance,” and “This dance will have no walkthrough. If you know how to do a hey, you will be fine, otherwise maybe sit this one out.” Invariably we’d still get a totally new couple or two joining, but the experienced dancers did a great job keeping them on track. I noticed a few times new dancers encountered each other in line and stood confused or wandered around each other for 64 beats, but then the dance would progress and experienced dancers pulled them back in.&lt;/p&gt;
&lt;p&gt;At some point a dancer came up to the porch to report the experienced dancers were getting tired from shepherding new dancers and to ask if I could help. Given the constraints I was a bit at a loss, but I kept calling for longer than I would normally in the next couple dances and I think that helped.&lt;/p&gt;
&lt;p&gt;I gave Kingfisher the freedom to choose their set duration (that’s usually the caller’s responsibility) both because I was overwhelmed attending to the dancers and I wanted the band to have freedom to play how they wanted, but I think this was an error. I don’t think any of the dances were wildly long or short, but it seems hard for musicians to keep track of how long they’ve been playing or monitor the dancers for when they look tired and I probably should have just kept control of that.&lt;/p&gt;
&lt;p&gt;Overall I think this went pretty well. It was a little chaotic, but it seemed like dancers had a good time. We had enough people to keep contra dancing through the end of our slot and Kingfisher got to play almost continuously. At our peak we had probably 20-30 dancers and more in the audience just listening. I heard reports from the audience that when I announced people could do more dancing like this at BIDA some of the non-dancers seemed interested. Also we made it &lt;a href=&quot;https://www.bostonglobe.com/2023/05/13/arts/photos-somerville-porchfest-returns-with-live-performances-lots-dancing/&quot;&gt;into the paper&lt;/a&gt;!&lt;/p&gt;
</content>
        </entry>
        <entry>
            <title>Increasingly frustrated with Gmail</title>
            <link href="https://chromamine.com/2023/05/increasingly-frustrated-with-gmail/"/>
            <updated>2023-05-18T00:00:00Z</updated>
            <id>https://chromamine.com/2023/05/increasingly-frustrated-with-gmail/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;I’m increasingly annoyed with Gmail, particularly with their integrating ads into my inbox, but also general Google product antipathy. Does anyone have advice about what to switch to or things I should look out for? (I’ve been using Fastmail at work and it seems fine?) My primary concerns are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I’ll need ~30GB storage and don’t want to pay through the nose for it (I’m currently paying Google $2.99/mo for storage and willing to go up a bit.)&lt;/li&gt;
&lt;li&gt;I tend to use the web client for my email a lot so I want it to be good&lt;/li&gt;
&lt;li&gt;Should I switch my calendar as well? Curious about people’s experience with calendar integration of various mail services and how it interacts when sharing calendars, receiving and sending invites, etc. with Google users&lt;/li&gt;
&lt;li&gt;I am pretty free with how I share my email address, so good spam prevention is a must&lt;/li&gt;
&lt;li&gt;Currently I use a forwarder for my custom domain, but it would be &lt;em&gt;sweet&lt;/em&gt; to have native support instead&lt;/li&gt;
&lt;li&gt;Great privacy practices are always a plus, though I generally switch to more secure channels for truly sensitive information&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I’m looking mostly at Fastmail right now, which seems like it checks my boxes at the right price. ProtonMail is also in the running, but it’s a bit more expensive, so I need to be sold on its perks. (It does look like it has nice perks, I’m just not sure if I’d use all of them.)&lt;/p&gt;
</content>
        </entry>
        <entry>
            <title>Sentient AI</title>
            <link href="https://chromamine.com/2023/03/sentient-ai/"/>
            <updated>2023-03-21T00:00:00Z</updated>
            <id>https://chromamine.com/2023/03/sentient-ai/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;As machine learning technology continues to push the boundaries of what we expect computers to be able to do, I think we’ll see more conversation about what sentience means and whether we’ve built a “sentient AI.”&lt;/p&gt;
&lt;p&gt;I continue to think we’re nowhere near this milestone, but I can understand why some people might look at LLMs (Large Language Models) like the one powering ChatGPT and say “hmmm that’s starting to look kinda close.” Here’s one way I think about those claims:&lt;/p&gt;
&lt;p&gt;LLMs and image generating models (like &lt;a href=&quot;https://openai.com/dall-e-2&quot;&gt;DALL-E&lt;/a&gt;, &lt;a href=&quot;https://www.midjourney.com/&quot;&gt;Midjourney&lt;/a&gt;, and &lt;a href=&quot;https://stability.ai/stablediffusion&quot;&gt;Stable Diffusion&lt;/a&gt;) use related approaches to 1. “predict” a way to complete a piece of text, in one case, or 2. derive an image that relates to a text prompt, in the other.&lt;/p&gt;
&lt;p&gt;If &lt;a href=&quot;https://openai.com/blog/chatgpt&quot;&gt;ChatGPT&lt;/a&gt; appears to be sentient to you, but &lt;a href=&quot;https://openai.com/dall-e-2&quot;&gt;DALL-E&lt;/a&gt; does not, can you identify what the difference is?&lt;/p&gt;
&lt;p&gt;To be clear, there &lt;em&gt;are&lt;/em&gt; structural differences between LLMs and generative image models, and I’m not an expert on the specifics, though I’ve read a couple papers, but if someone is claiming one is sentient, I think they should be able to point at what differences make it so. So far I can’t and I don’t think “it generates words instead of pixels” is enough.&lt;/p&gt;
</content>
        </entry>
        <entry>
            <title>Signal Stories</title>
            <link href="https://chromamine.com/2023/03/signal-stories/"/>
            <updated>2023-03-09T00:00:00Z</updated>
            <id>https://chromamine.com/2023/03/signal-stories/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;When Signal launched a “stories” feature last year, my first thought was that it seemed pretty silly, almost a joke. A goofy, trendy social media feature launched on an encrypted messaging platform almost a decade after the trend.&lt;/p&gt;
&lt;p&gt;But I gave it a shot because, let’s be real, I’m a huge sucker for new social media.&lt;/p&gt;
&lt;p&gt;And it turned out I really like them! In contrast to 1:1 messaging, they provide opportunities for spontaneous interaction—people I haven’t talked to in years, people who don’t use other social media, people I haven’t had good excuse to chat with, etc.&lt;/p&gt;
&lt;p&gt;I also came around to the idea that it’s &lt;em&gt;good&lt;/em&gt; that we experiment with encrypted social media. I think a lot of people have objections to government and corporate surveillance but feel locked into platforms like Facebook because there aren’t privacy-first alternatives. Signal Stories aren’t going to replace Facebook. But they provide a nice proof-of-concept that this sort of thing is possible and fun. Plus “stories,” with their fleeting, disappearing nature, seem like a natural fit for Signal’s privacy- and security-focused model.&lt;/p&gt;
&lt;p&gt;There was another bias in my initial reaction: While here in the U.S. Stories may seem like a goofy—maybe nice-to-have, maybe super annoying—feature, there’s other countries where people see them as something they simply expect from a messaging app. This didn’t occur to me until I read their &lt;a href=&quot;https://signal.org/blog/signal-is-for-everyone/&quot;&gt;excellent blog post&lt;/a&gt; this week.&lt;/p&gt;
&lt;p&gt;It goes into some detail about how U.S.-centrism pervades tech product design and the ways that they’ve worked to resist that narrow focus in Signal. Really good food for thought—especially for me, just coming out of an eight week product management class.&lt;/p&gt;
</content>
        </entry>
        <entry>
            <title>LastPass Breach</title>
            <link href="https://chromamine.com/2022/12/lastpass-breach/"/>
            <updated>2022-12-24T00:00:00Z</updated>
            <id>https://chromamine.com/2022/12/lastpass-breach/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;&lt;a href=&quot;https://blog.lastpass.com/2022/12/notice-of-recent-security-incident/&quot;&gt;LastPass’s latest breach&lt;/a&gt; is not quite “bad guys have all your passwords” but it’s pretty bad and I’ve been unimpressed by their response. Here’s the brief summary, as far as I can understand it:&lt;/p&gt;
&lt;p&gt;(If you just want to know &lt;em&gt;what to do&lt;/em&gt; as a LastPass user, skip to the last two paragraphs.)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In August, attackers acquired technical info and source code from a LastPass development server. No user data in attacker hands at this point.&lt;/li&gt;
&lt;li&gt;LastPass published information promptly.&lt;/li&gt;
&lt;li&gt;Some unspecified amount of time later attackers used that information to get keys from an engineer (How is not clear. Maybe social engineering?) and then downloaded user vault data.&lt;/li&gt;
&lt;li&gt;Two days ago, LastPass published a blog post announcing the second part of the breach.&lt;/li&gt;
&lt;li&gt;Saved login metadata (notably URLs) are more or less unencrypted, so attackers have access to lists of what sites all LastPass users use.&lt;/li&gt;
&lt;li&gt;Passwords are encrypted using user master passwords, so the attackers can’t decrypt those unless a user’s master password is guessable or reused from somewhere else where it may have been breached.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All software has security holes and LastPass is a huge target, so of course it’s under regular attack and some of those attacks will get through. Still, a couple particular things bug me:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Storing metadata more-or-less unencrypted is not great. &lt;em&gt;Which&lt;/em&gt; websites you use can be sensitive data on its own.&lt;/li&gt;
&lt;li&gt;The passwords are still encrypted by users’ master passwords. This is roughly what you want. Breaches like this are planned for and that’s the next level of defense as per the plan. But it’s possible to do better than this. 1Password encrypts vault data with master passwords &lt;em&gt;and&lt;/em&gt; a randomly generated local secret key. Even if an attacker acquired vault data from 1P and could guess your master password, they still could not decrypt your vault. (The secret key adds a bit of friction to the 1P user experience, but I think it’s not particularly tricky and the trade off seems worth it in light of the LP breach.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But, okay, let’s set those two issues aside. Maintaining trust is about how you respond to security incidents. For me, there’s a couple red flags in LastPass’s response:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Timing:&lt;/strong&gt; Why is the timing of the user vault access unspecified? If it was earlier this week, this is a prompt disclosure, so they did the best they could. If it was much earlier than that then this is a late disclosure, either because they didn’t know user data had been accessed or because they tried to hide it. Neither would be a great explanation. In that case, dropping a report right before a bunch of people go on vacation is particularly bad. Maybe more details will be published on this front that will vindicate their announcement timing here. I’ll update this post if so.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Communication:&lt;/strong&gt; The blog post itself seems poorly written to me. The worst details of the breach and mitigations users need to take are buried in the middle of a long narrative post. Maybe a LastPass user can share if they’ve sent out any emails that are clearer about how you should protect your data?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I’m still a bit on the fence about how bad this is. If LastPass publishes more details about the attack timing, maybe I’ll come out sympathetic to them. But right now it doesn’t look great to me.&lt;/p&gt;
&lt;p&gt;If you’re a LastPass user and you have a master password that you’ve reused elsewhere or that might be guessable by a computer script (e.g., not very long or based on just a couple dictionary words) you should reset every password in your vault. If that sounds daunting, do at least the most valuable ones. You should also assume someone out there knows what websites you have credentials for.&lt;/p&gt;
&lt;p&gt;Using LastPass continues to be better than not using a password manager at all! But there are better options out there. 1Password is my password manager of choice. I think they’ve consistently been ahead of the curve on security innovations and their design work is very good—and making security tools easy and pleasant to use properly &lt;em&gt;is&lt;/em&gt; good security. I’ve also heard good things about BitWarden and Dashlane. If you like open source and local vaults I’ve heard KeePassXC is the way to go. Your system native password managers (iCloud Keychain, etc.) are also good.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;[2022-12-27]&lt;/strong&gt; A few addenda:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mastodon.social/@glyph/109561764572740750&quot;&gt;Glyph’s post for LastPass users&lt;/a&gt; is full of practical advice&lt;/li&gt;
&lt;li&gt;SwiftOnSecurity, who’s a well-respected security poster, &lt;a href=&quot;https://twitter.com/SwiftOnSecurity/status/1606085825225170945&quot;&gt;says&lt;/a&gt; this will “hasten [their] looking at Bitwarden”&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://palant.info/2022/12/23/lastpass-has-been-breached-what-now/&quot;&gt;This post&lt;/a&gt; goes deep on the possibility of cracking vaults offline without the master password. I don’t think this should be a major concern for most users, but certainly for ones with access to highly consequential systems&lt;/li&gt;
&lt;li&gt;Respected security writer Bruce Schneier did a &lt;a href=&quot;https://www.schneier.com/blog/archives/2022/12/lastpass-breach.html&quot;&gt;brief write up&lt;/a&gt; on the breach. (I’m not sure why he quotes a random crypto Twitter account to raise the possibility that the breach might be worse than they’ve publicized—I see no reason to take that tweet at face value.)&lt;/li&gt;
&lt;li&gt;A member of Yahoo’s infosec team &lt;a href=&quot;https://infosec.exchange/@epixoip/109585049354200263&quot;&gt;explains why he discourages LastPass&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;One outstanding question, which may never be answered is: Who was the attacker? It’s not like this data has cropped up on the dark web for sale (that I’ve seen) (yet). I’ve seen speculation that it’s state actors, which would suggest activists, journalists, government agents, etc. are at higher risk than most people. Of course, without knowing, one should prepare for any possibility.&lt;/li&gt;
&lt;/ul&gt;
</content>
        </entry>
        <entry>
            <title>Mixers at Contra Dances</title>
            <link href="https://chromamine.com/2022/10/mixers-at-contra-dances/"/>
            <updated>2022-10-17T00:00:00Z</updated>
            <id>https://chromamine.com/2022/10/mixers-at-contra-dances/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;At BIDA, the contra dance I help organize, as part of our &lt;a href=&quot;https://www.bidadance.org/caller-welcome&quot;&gt;caller welcome document&lt;/a&gt; we encourage callers to program a mixer early in the evening. In a mixer, instead of keeping the same partner for the duration of a dance, you switch partners each time through the choreography.&lt;/p&gt;
&lt;p&gt;In my experience mixers tend to be unpopular with experienced dancers. It doesn’t help that callers often introduce mixers with a bait-and-switch, asking dancers to find a partner, then announcing that the dance will be a mixer, but I think that’s not the only reason. I suspect experienced dancers enjoy them less because it gives them less time to connect with a particular partner—something they might really value. They also tend to be simpler dances, more beginner friendly, with fewer opportunities to exercise advanced dancer skills.&lt;/p&gt;
&lt;p&gt;I called a “scatter mixer” at BIDA last night in the third slot of the evening (Chris Page’s “&lt;a href=&quot;http://chrispagecontra.awardspace.us/dances/index.htm...&quot;&gt;Accretion Reel&lt;/a&gt;”). This was partially to solve a calling problem I’ve been experiencing recently and partially to assess whether I stand by our advice to callers. Conclusion: I stand by it and, while they may not be the most stimulating dances for experienced contra dancers, they serve some important community functions:&lt;/p&gt;
&lt;h3&gt;They split up beginner-beginner couples&lt;/h3&gt;
&lt;p&gt;This is the problem I initially set out trying to solve by programming a mixer. Beginners will often come to dances as a couple expecting to dance with each other, which is totally reasonable! But it makes it much more likely that, without an experienced partner to help them, they’ll get lost in a dance, which can have cascading effects that, in a worst-case scenario, might cause the line they’re in to fall apart. When I notice couples like this in the hall I often adjust my program to call simpler dances, which is fine, but not my ideal! Contra dances also have a pretty strong culture of dancing with different people for each dance and I want to ensure new dancers learn that.&lt;/p&gt;
&lt;p&gt;During the lesson, I encourage beginners to partner with other people, but they don’t always take that advice seriously. A mixer early in the evening can give them a bit of a push and pave the way for them to ask strangers to dance in the future. (They may still decide to pair up after that or they may sit out the mixer, but I figure it’s at least good encouragement.)&lt;/p&gt;
&lt;p&gt;I’m not sure if it was the mixer or just the particular crowd last night, but I didn’t notice many beginner-beginner couples after that dance.&lt;/p&gt;
&lt;h3&gt;They introduce you to a lot of people&lt;/h3&gt;
&lt;p&gt;Along similar lines, I think a mixer early in the evening can help integrate people new to a community. It lets dancers build up a group of people who they notice a nice dance connection with and clears the way to ask them to dance later in the evening. This is the rationale BIDA explicitly uses in our caller welcome (“to help people meet and dance with new faces”).&lt;/p&gt;
&lt;h3&gt;They’re unserious&lt;/h3&gt;
&lt;p&gt;Experienced dancers can get very serious about their contra dances! There’s a lot of room in contra for people to show off practiced skills—precision, timeliness, the right amount of weight, flourishes, correctness. And there’s a lot of contra choreography that can get pretty interesting and cerebral! Mixers on the other hand tend to be very simple, with loose timing. They’re often a bit goofy. It feels to me like good community vibes.&lt;/p&gt;
&lt;p&gt;While I do love showing off my Very Good Well Honed contra dancing skills as much as the next cool hip dancer, I think it’s also nice to have a moment to embrace that dancing is messy and goofy! Moving your body to music, connecting with other people—this is fun, even if you’re not doing it in a high-skill way! (I really enjoyed watching Jeff call the family dance earlier in the evening for similar reasons.) I think this is particularly true of scatter mixers—where you have to run around looking for a partner, always a bit of a silly feeling—but I think it’s a little true of other mixers as well.&lt;/p&gt;
</content>
        </entry>
        <entry>
            <title>My CO₂ Monitor</title>
            <link href="https://chromamine.com/2022/08/aranet4/"/>
            <updated>2022-08-29T00:00:00Z</updated>
            <id>https://chromamine.com/2022/08/aranet4/</id>
            <content xml:lang="en-us" type="html">This post contains javascript content and must be viewed &lt;a href="https://chromamine.com/2022/08/aranet4/"&gt;on site&lt;/a&gt;.</content>
        </entry>
        <entry>
            <title>The Legacy of the Peace Symbol</title>
            <link href="https://chromamine.com/2022/03/legacy-peace-symbol/"/>
            <updated>2022-03-07T00:00:00Z</updated>
            <id>https://chromamine.com/2022/03/legacy-peace-symbol/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/_3t1PkmQsO-768.webp 768w, https://chromamine.com/media/img/_3t1PkmQsO-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/_3t1PkmQsO-768.jpeg 768w, https://chromamine.com/media/img/_3t1PkmQsO-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A ceramic circle with a white crackle glaze. A black peace sign is painted on it in an uneven, organic stroke. (Image from Campaign for Nuclear disarmament)&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/_3t1PkmQsO-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1123&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;In February 1958 London artist and designer Gerald Holtom designed the icon that is commonly recognized today as the “international peace symbol.” At the time, it was created with specific purpose. Holtom created it for the first Aldermaston March – an anti-nuclear weapons demonstration organized by a committee from the Campaign for Nuclear Disarmament.&lt;/p&gt;
&lt;p&gt;Holtom designed the symbol as the letters N and D in semaphore overlaid on top of each other and enclosed in a circle. He is also quoted as drawing inspiration from a gesture of despair: “I was in despair. Deep despair. I drew myself: the representative of an individual in despair, with hands palm out, stretched outwards and downwards in the manner of Goya’s peasant before the firing squad.”&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/_nRZKT-tGp-768.webp 768w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A diagram of an abstract restroom style figure with four arms each holding a semaphore flag. Each flag is square and split along the diagonal into red and yellow triangles. The figure has one arm straight up, one arm straight down, one arm down to the left, and one arm down to the right. Together these form the directions of the lines in a peace symbol.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/_nRZKT-tGp-768.jpeg&quot; width=&quot;768&quot; height=&quot;768&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/X_VlfJuS2R-768.webp 768w, https://chromamine.com/media/img/X_VlfJuS2R-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/X_VlfJuS2R-768.jpeg 768w, https://chromamine.com/media/img/X_VlfJuS2R-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;An oil on canvas painting depicting a row of soldiers dressed in 1800s clothing pointing guns at a crowd against a wall. On the ground are several bodies lying on a splash of blood. Some in the crowd have their head in their hands, others look on. One man in the center in a bright white shirt is looking at the soldiers with his arms raised and splayed.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/X_VlfJuS2R-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1186&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;I believe the painting in question is &lt;em&gt;The Third of May 1808 / El tres de mayo de 1808 en Madrid&lt;/em&gt; [1814] – an illustration of Spanish resistance against Napoleon’s invasion. But the figure in that painting has his arms outstretched upward; possibly this was a misrecollection on Holtom’s part.&lt;/p&gt;
&lt;p&gt;As a designer, I’ve been fascinated by the story of the peace symbol for a long time. It’s simple to draw and recognize—one of the most universally recognized modern symbols in the world, I’d wager, but, as far as I know, most people don’t know its history or original meaning. It was deliberately never copyrighted and consequently gained a life of its own: it expanded beyond the Campaign for Nuclear Disarmament, representing nuclear disarmament at large, anti-war sentiment generally, and has even seen use purely as a cultural symbol. We often think of “hippies” when see a peace symbol, but Holtom also observed, in his own lifetime, the symbol “printed all over fashion garments for the rich.”&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/e67hErqYuT-768.webp 768w, https://chromamine.com/media/img/e67hErqYuT-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/e67hErqYuT-768.jpeg 768w, https://chromamine.com/media/img/e67hErqYuT-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A VW bus on a city street painted in bright childlike rainbow colors with stars, flowers, and a large black peace sign in the center of the door.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/e67hErqYuT-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1024&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;div class=&quot;image-grid__item&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/O_zTIY3ci3-768.webp 768w, https://chromamine.com/media/img/O_zTIY3ci3-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/O_zTIY3ci3-768.jpeg 768w, https://chromamine.com/media/img/O_zTIY3ci3-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Screenshot of an online shopping page for Tiffany &amp;amp; Co. The product being displayed is a &amp;amp;quot;Tiffany &amp;amp; Co. Sterling Silver Peace Pendant Necklace&amp;amp;quot; being sold for $275. The product photo displays the necklace staged on a Tiffany &amp;amp; Co. box that is colored Tiffany&#39;s characteristic teal.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/O_zTIY3ci3-768.jpeg&quot; width=&quot;1536&quot; height=&quot;887&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;(Bus photo: &lt;a href=&quot;https://unsplash.com/photos/multicolored-minivan-parked-on-roadside-near-building-9g02bqvfoq0&quot;&gt;Nick Karvounis on Unsplash&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I never know what lesson to take away from this history. I’m simultaneously awed by how lack of copyright allowed this little symbol to flourish and become ubiquitous while—one hopes—spreading a message of peace along its way. It’s a beautiful and organic legacy for a designer’s work. On the other hand, it also strikes me as a little sad that something that once had a concrete meaning for a specific movement has become diluted as it aged, sometimes used as just an aesthetic flourish without really saying much at all.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://cnduk.org/&quot;&gt;Campaign for Nuclear Disarmament&lt;/a&gt; still exists and is still active, by the way, and they still use the peace symbol as their logo.&lt;/p&gt;
&lt;p&gt;Further reading:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Andrew Rigby, &lt;a href=&quot;https://www.tandfonline.com/doi/abs/10.1080/10402659808426187&quot;&gt;A Peace Symbol’s Origins&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Campaign for Nuclear Disarmament, &lt;a href=&quot;https://cnduk.org/the-symbol/&quot;&gt;History of the Symbol&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
        </entry>
        <entry>
            <title>John Hayes&#39;s Egg Nog</title>
            <link href="https://chromamine.com/2017/12/john-hayes-egg-nog/"/>
            <updated>2017-12-24T00:00:00Z</updated>
            <id>https://chromamine.com/2017/12/john-hayes-egg-nog/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/vxb_URaEk3-768.webp 768w, https://chromamine.com/media/img/vxb_URaEk3-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/vxb_URaEk3-768.jpeg 768w, https://chromamine.com/media/img/vxb_URaEk3-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Three glass mugs of thick, creamy, lightly colored egg nog with a sprinkling of nutmeg on top.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/vxb_URaEk3-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://chromamine.com/2017/12/john-hayes-egg-nog/#eggnog-recipe&quot;&gt;&lt;em&gt;Jump to recipe&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Earlier this year my father lost his best friend &lt;a href=&quot;https://en.wikipedia.org/wiki/John_M._Hayes_(scientist)&quot;&gt;John Hayes&lt;/a&gt;. John embodied many of the qualities I often wish to see in myself. He was charming, gentle, genuine, and scientifically-minded. He was a geochemist, academically, but his interests were wide-ranging, covering photography, music, food, and drink. He was meticulous without being fussy. If he was having someone over for dinner, he would practice twice in the preceding week making the meal he had planned. He appreciated quality but didn’t make you feel inadequate if you couldn’t observe the same things he did in a fine wine or a high-quality sound system. He expressed deep care and empathy for the people around him and I was always glad that he found his way into my father’s life and—occasionally—mine.&lt;/p&gt;
&lt;p&gt;Every year around this time John would make a big batch of egg nog and invite his friends and neighbors over to enjoy it with him. It’s—no lie—the best egg nog I’ve had in my life. After his egg nog party last year, I asked him for the recipe, which he graciously emailed me. True to form, the recipe is brief—less than a page long—but contains seven footnotes, my favorite of which is this note, describing an optional obscure liqueur, Nassau Royale: “A Bacardi vanilla-rum liqueur that may not be available in the U.S., but which is a perfect addition. A trip to the Bahamas may be justified on this basis.” While dad and I weren’t able to locate Nassau Royale at the liquor stores we checked (and we weren’t able to afford a trip to the Bahamas) we made the rest of the recipe today and it was good as ever.&lt;/p&gt;
&lt;p&gt;I’m thinking of him today and am grateful to him for leaving us this recipe, among so many other things.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/iN1myUwELa-768.webp 768w, https://chromamine.com/media/img/iN1myUwELa-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/iN1myUwELa-768.jpeg 768w, https://chromamine.com/media/img/iN1myUwELa-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Recipe (transcribed below)&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/iN1myUwELa-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1536&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;div class=&quot;update&quot;&gt;
&lt;p&gt;&lt;strong&gt;2023-12-11:&lt;/strong&gt; I’ve made John’s egg nog most years since I wrote this post. I was never able to track down a bottle of Nassau Royale for purchase. A few years ago, when I decided to see if I could order it online, I discovered via a &lt;a href=&quot;https://www.tripadvisor.com/ShowTopic-g147414-i129-k11893775-o30-Nassau_Royale_Discontinued-Bahamas.html&quot;&gt;TripAdvisor forum post&lt;/a&gt; that it had been discontinued. I was a little heartbroken that I’d never be able to make the recipe as John had intended it. But someone in the same forum thread suggested Licor 43 as a good substitute and I’ve used that most years.&lt;/p&gt;
&lt;p&gt;Fate was not content to leave it at that. I was visiting my aunt Holly, who is a very occasional drinker and not at all a cocktail maker, and in the process of exploring the cobwebby corners of her kitchen cabinets, wouldn’t you know, I found a dusty old bottle – who knows how many decades old.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/cDIU4W9OMy-768.webp 768w, https://chromamine.com/media/img/cDIU4W9OMy-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/cDIU4W9OMy-768.jpeg 768w, https://chromamine.com/media/img/cDIU4W9OMy-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A dusty looking bottle of Nassau Royale on a wooden table.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/cDIU4W9OMy-768.jpeg&quot; width=&quot;1536&quot; height=&quot;1152&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;I wasn’t brave enough to incorporate it into my egg nog this year – uncertain how the flavor might have changed over the years – but I did venture a sip. It is indeed sweet, syrupy, and vanilla-flavored and I’m satisfied that Licor 43, while not exactly the same, is indeed an adequate substitute. Consider it my amendment to the recipe – alas, that it can be acquired without a trip to the Bahamas.&lt;/p&gt;
&lt;p&gt;2023’s batch:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/51oQOJrnDy-768.webp 768w, https://chromamine.com/media/img/51oQOJrnDy-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://chromamine.com/media/img/51oQOJrnDy-768.jpeg 768w, https://chromamine.com/media/img/51oQOJrnDy-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A glass mug full of eggnog, thick and creamy with nutmeg on top. Beside it is a spice jar of whole nutmeg and a grater. In the background, out of focus, is a punch bowl full of creamy, foamy, nog.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/51oQOJrnDy-768.jpeg&quot; width=&quot;1536&quot; height=&quot;2048&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr /&gt;
&lt;h3&gt;&lt;span id=&quot;eggnog-recipe&quot;&gt;John Hayes’s Christmas Eggnog&lt;a href=&quot;https://chromamine.com/2017/12/john-hayes-egg-nog/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;Yields about 6 quarts, or 32 6-ounce servings. The alcohol content is about 10% by volume. Begin preparation the night before serving, if possible.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Blend a dozen egg yolks with a pound of powdered sugar (save the egg whites).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Slowly add 2 cups bourbon whiskey.&lt;a href=&quot;https://chromamine.com/2017/12/john-hayes-egg-nog/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cover, refrigerate, and let stand for at least an hour.&lt;a href=&quot;https://chromamine.com/2017/12/john-hayes-egg-nog/#fn3&quot; class=&quot;footnote-ref&quot; id=&quot;fnref3&quot;&gt;³&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add 2 cups rum,&lt;a href=&quot;https://chromamine.com/2017/12/john-hayes-egg-nog/#fn4&quot; class=&quot;footnote-ref&quot; id=&quot;fnref4&quot;&gt;⁴&lt;/a&gt; 1 cup peach brandy,&lt;a href=&quot;https://chromamine.com/2017/12/john-hayes-egg-nog/#fn5&quot; class=&quot;footnote-ref&quot; id=&quot;fnref5&quot;&gt;⁵&lt;/a&gt; and, if possible, 1 cup Nassau Royale liqueur.&lt;a href=&quot;https://chromamine.com/2017/12/john-hayes-egg-nog/#fn6&quot; class=&quot;footnote-ref&quot; id=&quot;fnref6&quot;&gt;⁶&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add 1 quart milk. Stir thoroughly to obtain completely even mixture.&lt;a href=&quot;https://chromamine.com/2017/12/john-hayes-egg-nog/#fn7&quot; class=&quot;footnote-ref&quot; id=&quot;fnref7&quot;&gt;⁷&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Whip 1 quart cream (not stiff, but not soupy, either) and stir it evenly into the mixture. Do not beat the mixture so strongly that the lightness provided by the whipped cream is lost.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cover, refrigerate, and let stand overnight, if possible.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Just before serving, beat egg whites and fold into the mixture.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sprinkle surface with freshly ground nutmeg.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Developed from a recipe provided by Julietta Moran-Barron, an M.I.T. graduate student related to the Mexican ambassador to the United States. When Julietta asked how Americans ought to be entertained at Christmas, the embassy’s chef provided an eggnog recipe that does much to explain the high cost of diplomacy. This version contains modifications derived from the eggnog recipe in the 1962 edition of &lt;em&gt;Joy of Cooking&lt;/em&gt;. &lt;a href=&quot;https://chromamine.com/2017/12/john-hayes-egg-nog/#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;Expensive bourbon not needed. “Early Times” is fine. &lt;a href=&quot;https://chromamine.com/2017/12/john-hayes-egg-nog/#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;Important, dispells “eggy” taste. &lt;a href=&quot;https://chromamine.com/2017/12/john-hayes-egg-nog/#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;I prefer dark, more strongly flavored. Original recipe called for twice this amount, which is fine if no one has to drive away from the scene of consumption. &lt;a href=&quot;https://chromamine.com/2017/12/john-hayes-egg-nog/#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;Original recipe called for cognac, but this effect is very nice. &lt;a href=&quot;https://chromamine.com/2017/12/john-hayes-egg-nog/#fnref5&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn6&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;A Bacardi vanilla-rum liqueur that may not be available in the U.S., but which is a perfect addition. A trip to the Bahamas may be justified on this basis. &lt;a href=&quot;https://chromamine.com/2017/12/john-hayes-egg-nog/#fnref6&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn7&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;This is a volume-increasing corruption of the original recipe. It can be omitted. &lt;a href=&quot;https://chromamine.com/2017/12/john-hayes-egg-nog/#fnref7&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>For the New Year</title>
            <link href="https://chromamine.com/2014/01/for-the-new-year/"/>
            <updated>2014-01-03T00:00:00Z</updated>
            <id>https://chromamine.com/2014/01/for-the-new-year/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/D6rmYnKcjJ-768.webp 768w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Photo of a young half-Chinese half-Caucasian man with long black hair sitting on a pink couch. He is wearing a brown jacket and a red shirt. Behind him, on the wall, are framed photographs that appear to be of clouds from the sky. In the foreground and background there appear to be people sitting around him, but they are out of focus.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/D6rmYnKcjJ-768.jpeg&quot; width=&quot;768&quot; height=&quot;510&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Five years ago to this day—January 3rd, 2009—I wrote this in my LiveJournal&lt;a href=&quot;https://chromamine.com/2014/01/for-the-new-year/#fn1&quot; class=&quot;footnote-ref&quot; id=&quot;fnref1&quot;&gt;¹&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Something tricky about January 1st is that it feels arbitrary—it doesn’t deliberately coincide with anything else in my life. Fall, for instance, when school starts up and changes everything makes much more sense as the start of a year. (Of course that will likely change post-graduation, but right now that seems an eternity away.) Especially at a time in my life when I find myself questioning almost all special occasions (I felt unbelievably distant from Christmas, Hanukkah this year. Every step I took to celebrate with family was like walking through a swamp.) celebrating the new year feels completely disconnected. As when celebrating a birthday every year, I still wake up the next morning with the uncomfortable feeling that nothing is different.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;New Year’s still feels arbitrary, but now that’s part of its charm for me. Graduation is now an eternity behind me, not an eternity ahead. I’m happy that say that all of the things I listed as New Year’s resolutions in 2009—&lt;em&gt;self-confidence&lt;/em&gt;, &lt;em&gt;generosity&lt;/em&gt;, being better to the people who love me and less aloof, among others (see &lt;a href=&quot;https://chromamine.com/2014/01/for-the-new-year/#old&quot;&gt;below&lt;/a&gt;)—are areas that I feel much improved in over the intervening five years. And I’ve grown in other ways, which I am grateful for, that I could never have anticipated. I have more empathy than I did five years ago. I have stronger politics.&lt;/p&gt;
&lt;p&gt;I tend to make resolutions at times in my life when I’m feeling stagnant, dissatisfied, and in need of change. So, in that respect, I’m happy to say that I haven’t felt any desire to make resolutions this year. I’m in a dynamic period of my life. Things are changing for me, resolutions or no.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;What is there to say about 2013? That it was one of the most satisfying years of my life. That I read a lot. That my politics grew and strengthened. That I left my home and office of seven years to travel for four months. That I lived outside of the U.S. for longer than ever before. That I lived with a lover for longer than ever before. That I learned to play the guitar. That I made many friends. That I fell in love. That I maintained old relationships. That I found a new home among friends in Washington DC.&lt;/p&gt;
&lt;p&gt;What is there to say about 2014? That the roads I see ahead of me are unpaved. That I’m settling in somewhere new. That I’m working on how to build a life without the sensation of settling down. That I’m laying the groundwork for new things&lt;a href=&quot;https://chromamine.com/2014/01/for-the-new-year/#fn2&quot; class=&quot;footnote-ref&quot; id=&quot;fnref2&quot;&gt;²&lt;/a&gt;. That I don’t know what’s going to happen next, but I feel ready and excited.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;There’s a small collection of poems I like to read every year when New Year’s rolls around. I’d like to share them with you now.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;New Year’s Day—&lt;br /&gt;
everything is in blossom!&lt;br /&gt;
I feel about average.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;— Kobayashi Issa, trans. Robert Hass&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Poem for the New Year&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So far it’s suspiciously similar&lt;br /&gt;
to the old year: the same wild cold&lt;/p&gt;
&lt;p&gt;wind circling the yard,&lt;br /&gt;
and that oozy substance&lt;/p&gt;
&lt;p&gt;still clings to the carton of orange juice&lt;br /&gt;
I lift from a shelf in the fridge.&lt;/p&gt;
&lt;p&gt;Also, I notice that my face&lt;br /&gt;
in the bathroom mirror,&lt;/p&gt;
&lt;p&gt;fresh from the bed’s wrappings,&lt;br /&gt;
looks a bit worn.&lt;/p&gt;
&lt;p&gt;Last night, in my neighborhood,&lt;br /&gt;
a few guns went off amid the firecrackers,&lt;/p&gt;
&lt;p&gt;surely a sign that something new&lt;br /&gt;
was entering the world,&lt;/p&gt;
&lt;p&gt;though the sounds were identical&lt;br /&gt;
to the small-arms fire&lt;/p&gt;
&lt;p&gt;emitted from the war documentary&lt;br /&gt;
I was watching on TV.&lt;/p&gt;
&lt;p&gt;It’s possible&lt;br /&gt;
I missed the transition entirely&lt;/p&gt;
&lt;p&gt;by not attending a drunken party,&lt;br /&gt;
wearing a pointy hat&lt;/p&gt;
&lt;p&gt;and tongue-kissing a few strangers,&lt;br /&gt;
and so am still living&lt;/p&gt;
&lt;p&gt;in the previous year,&lt;br /&gt;
where the windows are rattling&lt;/p&gt;
&lt;p&gt;in the storm&lt;br /&gt;
and the front door suddenly&lt;/p&gt;
&lt;p&gt;slams open&lt;br /&gt;
and I just as quickly rush to slam it shut.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;— Kim Addonizio&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;New Year’s Day&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The rain this morning falls&lt;br /&gt;
on the last of the snow&lt;/p&gt;
&lt;p&gt;and will wash it away. I can smell&lt;br /&gt;
the grass again, and the torn leaves&lt;/p&gt;
&lt;p&gt;being eased down into the mud.&lt;br /&gt;
The few loves I’ve been allowed&lt;/p&gt;
&lt;p&gt;to keep are still sleeping&lt;br /&gt;
on the West Coast. Here in Virginia&lt;/p&gt;
&lt;p&gt;I walk across the fields with only&lt;br /&gt;
a few young cows for company.&lt;/p&gt;
&lt;p&gt;Big-boned and shy,&lt;br /&gt;
they are like girls I remember&lt;/p&gt;
&lt;p&gt;from junior high, who never&lt;br /&gt;
spoke, who kept their heads&lt;/p&gt;
&lt;p&gt;lowered and their arms crossed against&lt;br /&gt;
their new breasts. Those girls&lt;/p&gt;
&lt;p&gt;are nearly forty now. Like me,&lt;br /&gt;
they must sometimes stand&lt;/p&gt;
&lt;p&gt;at a window late at night, looking out&lt;br /&gt;
on a silent backyard, at one&lt;/p&gt;
&lt;p&gt;rusting lawn chair and the sheer walls&lt;br /&gt;
of other people’s houses.&lt;/p&gt;
&lt;p&gt;They must lie down some afternoons&lt;br /&gt;
and cry hard for whoever used&lt;/p&gt;
&lt;p&gt;to make them happiest,&lt;br /&gt;
and wonder how their lives&lt;/p&gt;
&lt;p&gt;have carried them&lt;br /&gt;
this far without ever once&lt;/p&gt;
&lt;p&gt;explaining anything. I don’t know&lt;br /&gt;
why I’m walking out here&lt;/p&gt;
&lt;p&gt;with my coat darkening&lt;br /&gt;
and my boots sinking in, coming up&lt;/p&gt;
&lt;p&gt;with a mild sucking sound&lt;br /&gt;
I like to hear. I don’t care&lt;/p&gt;
&lt;p&gt;where those girls are now.&lt;br /&gt;
Whatever they’ve made of it&lt;/p&gt;
&lt;p&gt;they can have. Today I want&lt;br /&gt;
to resolve nothing.&lt;/p&gt;
&lt;p&gt;I only want to walk&lt;br /&gt;
a little longer in the cold&lt;/p&gt;
&lt;p&gt;blessing of the rain,&lt;br /&gt;
and lift my face to it.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;— Kim Addonizio&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This last poem is not technically a New Year’s poem, since it specifically is about November, but it always feels like a New Year’s poem to me.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;It’s Sunday Morning in Early November&lt;/strong&gt;&lt;br /&gt;
and there are a lot of leaves already.&lt;br /&gt;
I could rake and get a head start.&lt;br /&gt;
The boy’s summer toys need to be put&lt;br /&gt;
in the basement. I could clean it out&lt;br /&gt;
or fix the broken storm window.&lt;br /&gt;
When Eli gets home from Sunday school,&lt;br /&gt;
I could take him fishing. I don’t fish&lt;br /&gt;
but I could learn to. I could show him&lt;br /&gt;
how much fun it is. We don’t do as much&lt;br /&gt;
as we used to do. And my wife, there’s&lt;br /&gt;
so much I haven’t told her lately,&lt;br /&gt;
about how quickly my soul is aging,&lt;br /&gt;
how it feels like a basement I keep filling&lt;br /&gt;
with everything I’m tired of surviving.&lt;br /&gt;
I could take a walk with my wife and try&lt;br /&gt;
to explain the ghosts I can’t stop speaking to.&lt;br /&gt;
Or I could read all those books piling up&lt;br /&gt;
about the beginning of the end of understanding…&lt;br /&gt;
Meanwhile, it’s such a beautiful morning,&lt;br /&gt;
the changing colors, the hypnotic light.&lt;br /&gt;
I could sit by the window watching the leaves,&lt;br /&gt;
which seem to know exactly how to fall&lt;br /&gt;
from one moment to the next. Or I could lose&lt;br /&gt;
everything and have to begin over again.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;— Philip Schultz&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;a name=&quot;old&quot;&gt;&lt;/a&gt;
My full entry from 2009, for posterity:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Something tricky about January 1st is that it feels arbitrary—it doesn’t deliberately coincide with anything else in my life. Fall, for instance, when school starts up and changes everything makes much more sense as the start of a year. (Of course that will likely change post-graduation, but right now that seems an eternity away. ) Especially at a time in my life when I find myself questioning almost all special occasions (I felt unbelievably distant from Christmas, Hanukkah this year. Every step I took to celebrate with family was like walking through a swamp.) celebrating the new year feels completely disconnected. As when celebrating a birthday every year, I still wake up the next morning with the uncomfortable feeling that nothing is different.&lt;/p&gt;
&lt;p&gt;In part it’s this arbitrariness that has made me suspicious of the tradition of the New Year’s Resolution. In the past—and especially through high school—I made a habit of making changes in myself on a continuous basis. Whenever I noticed something wrong in myself, I would that day or that week make a resolution in my head to change it. I privately—maybe even publicly a bit—prided myself on my capacity for change.
But I haven’t really done that this year. Maybe I didn’t really do it the year before either. I feel stuck. Suddenly the idea of having this impetus to change makes total sense to me. The same way that Boy Scouts have a seemingly arbitrary rule to ”do a good turn daily.” It’s not a quota thing so much as it is a training program. You should really be doing good turns or making resolutions constantly, but in case you forget here’s a reason to do it.&lt;/p&gt;
&lt;p&gt;I haven’t followed the tradition of making them before the eve, but I have been making resolutions this year. Carefully, I’m thinking about things I want to change in myself. I confess that I like myself less with every passing year since high school and that I am decreasingly satisfied with my life—more lost—so I am at no loss for things to fix. But I don’t know how to fix all of them. So I’m thinking my way through them. Trying to.&lt;/p&gt;
&lt;p&gt;I’m writing a list of things I want for the next year. None of these things are groundbreaking, particularly interesting, or even things that I haven’t said in the past. Some of them aren’t really even resolutions. And yet, I hope in writing them down something will change.&lt;/p&gt;
&lt;p&gt;This year:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Self-confidence, more of it.&lt;/li&gt;
&lt;li&gt;Take every reasonable opportunity presented to help others.&lt;/li&gt;
&lt;li&gt;I have never doubted my capacity for generosity. I would like to be sure I keep it that way.&lt;/li&gt;
&lt;li&gt;On a few occasions this year, I have conflated being completely honest with saying things that make people uncomfortable. I’d like to stop doing that.&lt;/li&gt;
&lt;li&gt;Try not to hurt people you love, who love you.&lt;/li&gt;
&lt;li&gt;Be more demonstratively loving. And less aloof.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I’ve been dissatisfied with my life these past few years and especially this year. That’s something I haven’t said enough and I don’t think people realize it. I’m giving 2009 and myself the benefit of the doubt. Maybe things this year will change.&lt;/p&gt;
&lt;p&gt;And if you’re reading this, I want you to know that I appreciate you. I really, truly do. At least in this small way (and probably other larger ways) you are here for me, and I love you for it.&lt;/p&gt;
&lt;p&gt;(Belatedly, Happy New Year. Let us make it a good one you and I.)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Belatedly, Happy New Year. Let’s make it a good one, you and I. If you’re reading this, thank you for being in my life.&lt;/p&gt;
&lt;ol class=&quot;footnotes&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Oh, how our technology dates us. &lt;a href=&quot;https://chromamine.com/2014/01/for-the-new-year/#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;Spoilers: ethical web development, and a second season of &lt;em&gt;&lt;a href=&quot;http://makesomethingeveryday.com/secondpage/&quot;&gt;The Second Page&lt;/a&gt;&lt;/em&gt;. Also, maybe socializing with more people who are not Obies? &lt;a href=&quot;https://chromamine.com/2014/01/for-the-new-year/#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content>
        </entry>
        <entry>
            <title>We&#39;re not as pretty as the dragonflies.</title>
            <link href="https://chromamine.com/2013/08/dragonflies/"/>
            <updated>2013-08-03T00:00:00Z</updated>
            <id>https://chromamine.com/2013/08/dragonflies/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://chromamine.com/media/img/u28BuZTpni-768.webp 768w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;A blue evening picture of two young women sitting on a dock over a ripple-dappled pond.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://chromamine.com/media/img/u28BuZTpni-768.jpeg&quot; width=&quot;768&quot; height=&quot;510&quot; /&gt;&lt;/picture&gt;
&lt;em&gt;Harmony of Song and Dance at Pinewoods, 2012&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;All week I have seen insects landing. I was lying on my stomach on a small dock by the pond, reading (&lt;em&gt;Infinite Jest&lt;/em&gt;, the eternal project) when two damselflies lit on me, one on my hand and one on my book. They stayed there, until I turned the page. At lunch one day I found a beautiful and bold moth on the table, who happily climbed onto my finger when I offered it and stayed with me for a while. My new insect friend. I’ve been thinking about bugs with their beautiful bodies and short lives, their wings that grant them both freedom and fragility. Dragonflies skimming the surface of the water. Enormous luna moths decorating cabins of North Carolina. The millepedes of South Africa.&lt;/p&gt;
&lt;p&gt;When I tell people about Pinewoods and why I love it, I only tell them part of the story: I tell them what makes Pinewoods a happy place. I tell them about the ponds and trees, the music, the singing and dancing. I’m rarely able to articulate what makes Pinewoods a more contemplative place for me, to explain that I’ve had weeks at Pinewoods that felt sad but also important. My friend Mia says her mind keeps wandering. That someone will walk up to her while she’s lost in thought, a face materializing in front of her, and ask if she’s OK because she looks sad or angry. And then she’ll snap out of it, suddenly back in the present. It’s easy, here, to think about everything and anything. Something about being in the woods, disconnected (at least partially) from the outside world, and the days are so much longer. When I’m at Pinewoods I cycle through many feelings a day with hardly any external cause for them at all.&lt;/p&gt;
&lt;p&gt;Not that I’m at a loss for external emotional motivators. I have departed Oberlin, my home of seven years. I am saying good-bye to friends I have seen nearly every day for the past year. I wrote and delivered a letter to a friend with whom I have been hopelessly in love for a year. I will not be seeing her for some time. Is this too much to write publicly? I’ve tended, in recent years, to keep my personal stories close to the breast, but now I’m trying to be honest; this is my genuine experience.&lt;/p&gt;
&lt;p&gt;I’m nearly a quarter of a century old now. That phrasing makes me feel old, though I know I’m not. Still. Time passes more quickly than I expect. All week I’ve been getting reminders of this. I told someone I had been dancing for seven years and was startled when they replied, “Oh, so a long time.” It still feels so recently that Rosemary taught me to swing in Tappan Square and brought me to my first Oberlin contra. Someone asked when I first came to Pinewoods and I remembered it was five years ago, visiting my friend Mog. Five years,—one fifth of my life to date. Things that still feel new to me are somehow part of me now.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Here’s a moment that I want to save:&lt;/p&gt;
&lt;p&gt;I canoe Amanda through the narrow winding channel—the same channel that Julia first showed me two years earlier—that exits the pond nearest to camp and opens out into a smaller, quieter, emptier pond. There’s an island in the middle that we paddle over to. Dragonflies abound. “We’re not as pretty as the dragonflies,” I tell her, in response to a comment I can’t remember. She has less than an hour before she has to leave, but we rest here a little too long, aware of the time passing and yet imagining that we are somehow outside of it.&lt;/p&gt;
&lt;p&gt;And then I paddle like hell to get us back to shore.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I’ve left home for the second time in my life. I’m not quite ready to settle down yet in a new one. It sounds trite to put it in words, but I feel like I’m emerging from a cocoon and I’m flying away.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;From “Dragonflies Mating”—one of my favorite Robert Hass poems:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;6.&lt;/p&gt;
&lt;p&gt;This morning in the early sun,&lt;br /&gt;
steam rising from the pond the color of smoky topaz,&lt;br /&gt;
a pair of delicate, copper-red, needle-fine insects&lt;br /&gt;
are mating in the unopened crown of a Shasta daisy&lt;br /&gt;
just outside your door. The green flowerheads look like wombs&lt;br /&gt;
or the upright, supplicant bulbs of a vegetal pre-erection.&lt;br /&gt;
The insect lovers seem to be transferring the cosmos into each other&lt;br /&gt;
by attaching at the tail, holding utterly still, and quivering intently.&lt;/p&gt;
&lt;p&gt;I think (on what evidence?) that they are different from us.&lt;br /&gt;
That they mate and are done with mating.&lt;br /&gt;
They don’t carry all this half-mated longing up out of childhood&lt;br /&gt;
and then go looking for it everywhere.&lt;br /&gt;
And so, I think, they can’t wound each other the way we do.&lt;br /&gt;
They don’t go through life dizzy or groggy with their hunger,&lt;br /&gt;
kill with it, smear it on everything, though it is perhaps also true&lt;br /&gt;
that nothing happens to them quite like what happens to us&lt;br /&gt;
when the blue-backed swallow dips swiftly toward the green pond&lt;br /&gt;
and the pond’s green-and-blue reflected swallow marries it a moment&lt;br /&gt;
in the reflected sky and the heart goes out to the end of the rope&lt;br /&gt;
it has been throwing into abyss after abyss, and a singing shimmers&lt;br /&gt;
from every color the morning has risen into.&lt;/p&gt;
&lt;p&gt;My insect instructors have stilled, they are probably stuck together&lt;br /&gt;
in some bliss and minute pulse of after-longing&lt;br /&gt;
evolution worked out to suck the last juice of the world&lt;br /&gt;
into the receiver body. They can’t separate probably&lt;br /&gt;
until it is done.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;Josh Ritter, &lt;em&gt;Leaving&lt;/em&gt;:&lt;/p&gt;
&lt;iframe width=&quot;420&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/jz15FNoiEvs&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Every time I turn around, something else has floated away.&lt;br /&gt;
There ain’t a single thing I’ve found with wings that decided to stay.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;Travel&lt;/p&gt;
&lt;p&gt;The railroad track is miles away,&lt;br /&gt;
  And the day is loud with voices speaking,&lt;br /&gt;
Yet there isn’t a train goes by all day&lt;br /&gt;
  But I hear its whistle shrieking.&lt;/p&gt;
&lt;p&gt;All night there isn’t a train goes by,&lt;br /&gt;
  Though the night is still for sleep and dreaming,&lt;br /&gt;
But I see its cinders red on the sky,&lt;br /&gt;
  And hear its engine steaming.&lt;/p&gt;
&lt;p&gt;My heart is warm with the friends I make,&lt;br /&gt;
  And better friends I’ll not be knowing;&lt;br /&gt;
Yet there isn’t a train I wouldn’t take,&lt;br /&gt;
  No matter where it’s going.&lt;/p&gt;
&lt;p&gt;— Edna St. Vincent Millay&lt;/p&gt;
&lt;/blockquote&gt;
</content>
        </entry>
        <entry>
            <title>On Loneliness</title>
            <link href="https://chromamine.com/2012/05/on-loneliness/"/>
            <updated>2012-05-06T00:00:00Z</updated>
            <id>https://chromamine.com/2012/05/on-loneliness/</id>
            <content xml:lang="en-us" type="html">&lt;p&gt;It’s nearly summer now and the world is exposed and beautiful, green and sunny, throwing itself at my feet, yet I have been thinking about loneliness.&lt;/p&gt;
&lt;p&gt;I’ve been thinking about loneliness because I have been lonely. I live in a place where my life used to overflow with friendship. But this was college and my friends have, bit by bit, moved on. I still have local friends–I don’t pretend that I don’t, but they have shrunk to a small handful. I can count on one hand the ones who make me feel loved in the way that I want to be loved. This is fair and to be expected. This is where I chose to live and this is the experience I knew that I would have if I did so. My eyes were open when I stayed in Oberlin. Still, the transition has been. Difficult.&lt;/p&gt;
&lt;p&gt;I’ve been thinking about how destructive loneliness can be, how it can be a cycle. I’ve seen lonely people who are desperate for attention, who lash out when they feel abandoned, who drive themselves further into isolation. I’ve seen this, in small ways, in myself. I’ve seen how loneliness can be a peg on which people hang up their ambitions for another day. I’ve seen them become sad and reclusive, hard-shelled and unwilling to try the things that might make them happy, for fear of failure or maybe fear of something else. Again, I’ve seen this in myself.&lt;/p&gt;
&lt;p&gt;What scares me is how easy it is to react this way to loneliness, to make loneliness from loneliness, when the opposite reaction is the more productive: to put myself out there, to be vulnerable, to pay attention to what people need from me and offer it gently, to be conscious of when I am overstepping my boundaries and step back when necessary, to neither force myself on others nor hide from them. To work to be a person who others want to be around. More than that, to work to be a person who is &lt;em&gt;good&lt;/em&gt; for others to be around. This is something I have been working on.&lt;/p&gt;
&lt;p&gt;I’ve been thinking about loneliness as circumstance, as something that can be accepted and leaned into when necessary rather than fought against. How can I take this extra time that I have for myself and turn it into something productive. Self-work, reading, projects, art, charity, and ambition can all flourish in isolation. If it must be that I spend less time socializing, perhaps that time can be put to good use. This, also, is something I have been working on.&lt;/p&gt;
&lt;p&gt;And I’ve been thinking about how to turn loneliness into solitude. How to take loneliness, which causes self-doubt, and turn it into self-love: solitary drawn-out baths, meditation, long walks in the rain, nights spent reading a book with a pot of tea. There is so much love in me, waiting to be given to others who step up to receive it, but probably there is also love for myself and in the absence of others on long lonely days and evenings, I can discover it.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Roger Ebert, &lt;a href=&quot;https://www.rogerebert.com/roger-ebert/all-the-lonely-people&quot;&gt;&lt;em&gt;All the Lonely People&lt;/em&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What do lonely people desire? Companionship. Love. Recognition. Entertainment. Camaraderie. Distraction.&lt;/p&gt;
&lt;p&gt;Encouragement. Change. Feedback. Someone once said the fundamental reason we get married is because have a universal human need for a witness. All of these are possibilities. But what all lonely people share is a desire not to be – or at least not to feel – alone.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;bell hooks, &lt;em&gt;All About Love&lt;/em&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Knowing how to be solitary is central to the art of loving. When we can be alone, we can be with others without using them as a means of escape.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;and, bell hooks quoting Henri Nouwen:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“The difficult road is the road of conversion, the conversion from loneliness into solitude. Instead of running away from our loneliness and trying to forget or deny it, we have to protect it and turn it into fruitful solitude.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Adrienne Rich:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Song&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You’re wondering if I’m lonely:&lt;br /&gt;
OK then, yes, I’m lonely&lt;br /&gt;
as a plane rides lonely and level&lt;br /&gt;
on its radio beam, aiming&lt;br /&gt;
across the Rockies&lt;br /&gt;
for the blue-strung aisles&lt;br /&gt;
of an airfield on the ocean.&lt;/p&gt;
&lt;p&gt;You want to ask, am I lonely?&lt;br /&gt;
Well, of course, lonely&lt;br /&gt;
as a woman driving across country&lt;br /&gt;
day after day, leaving behind&lt;br /&gt;
mile after mile&lt;br /&gt;
little towns she might have stopped&lt;br /&gt;
and lived and died in, lonely&lt;/p&gt;
&lt;p&gt;If I’m lonely&lt;br /&gt;
it must be the loneliness&lt;br /&gt;
of waking first, of breathing&lt;br /&gt;
dawns’ first cold breath on the city&lt;br /&gt;
of being the one awake&lt;br /&gt;
in a house wrapped in sleep&lt;/p&gt;
&lt;p&gt;If I’m lonely&lt;br /&gt;
it’s with the rowboat ice-fast on the shore&lt;br /&gt;
in the last red light of the year&lt;br /&gt;
that knows what it is, that knows it’s neither&lt;br /&gt;
ice nor mud nor winter light&lt;br /&gt;
but wood, with a gift for burning.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;How To Be Alone:&lt;/p&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/k7X7sZzSXYs?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;Eugene O’Neill:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Man’s loneliness is but his fear of life.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;David Whyte, &lt;em&gt;House of Belonging&lt;/em&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Sometimes it takes darkness and the sweet&lt;br /&gt;
confinement of your aloneness&lt;br /&gt;
to learn&lt;/p&gt;
&lt;p&gt;anything or anyone&lt;br /&gt;
that does not bring you alive&lt;/p&gt;
&lt;p&gt;is too small for you.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
        </entry>
</feed>
