Miriam Eric Suzanne
Art, writing, and code from Miriam Suzanne
https://www.miriamsuzanne.com/
https://www.miriamsuzanne.com/images/headshots/eLIPAqMo4S-144.jpeg
https://www.miriamsuzanne.com/images/headshots/wXaLUS1ZbY-1300.jpeg
2025-11-24T00:00:00Z
© 2026 Miriam Eric Suzanne
Eleventy
Miriam Eric Suzanne
[email protected]
/who/
Handmade holiday gifts
2025-11-24T00:00:00Z
https://www.miriamsuzanne.com/2025/11/24/holiday-25/
<p>Selling things stresses me out. But making things is fun, so here we are. If you’re looking for holiday gifts – for yourself or others – I’d love to help out. <a href="https://art.miriamsuzanne.com/">Take my pots, please</a>!</p>
<p>I like making them, and I hope you like gifting them</p>
<p>Selling things stresses me out. But making things is fun, so here we are. If you’re looking for holiday gifts – for yourself or others – I’d love to help out. <a href="https://art.miriamsuzanne.com/">Take my pots, please</a>!</p>
<picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/2025/J0bmtb7e7E-640.avif 640w, https://www.miriamsuzanne.com/images/2025/J0bmtb7e7E-960.avif 960w, https://www.miriamsuzanne.com/images/2025/J0bmtb7e7E-1600.avif 1600w" sizes="(min-width: 75em) 75vw, 95vw" /><img loading="lazy" decoding="async" alt="" class="hero-img" src="https://www.miriamsuzanne.com/images/2025/J0bmtb7e7E-640.jpeg" width="1600" height="1066" srcset="https://www.miriamsuzanne.com/images/2025/J0bmtb7e7E-640.jpeg 640w, https://www.miriamsuzanne.com/images/2025/J0bmtb7e7E-960.jpeg 960w, https://www.miriamsuzanne.com/images/2025/J0bmtb7e7E-1600.jpeg 1600w" sizes="(min-width: 75em) 75vw, 95vw" /></picture><p>Erin offered to decorate
some of the pieces I made this fall, if…</p>
<ul>
<li>I would use white clay, and</li>
<li>leave flat surfaces for decoration</li>
</ul>
<p>So I did!
I even got some mid-fire Kota porcelain
from Kentucky Mudworks,
for a bright white
(and sometimes-translucent) finish.</p>
<p>Today’s ‘drop’ includes several
of these bright and colorful pieces
inspired by the decorations around our home:</p>
<figure>
<div data-gallery=""><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/2025/5mxc2l-tf_-640.avif 640w, https://www.miriamsuzanne.com/images/2025/5mxc2l-tf_-960.avif 960w, https://www.miriamsuzanne.com/images/2025/5mxc2l-tf_-1600.avif 1600w" sizes="(min-width: 65em) 60vw, 95vw" /><img loading="lazy" decoding="async" alt="A blue couch with yellow pillows, an old console tv converted to hold records, various artworks on the counter, plants, and a white wall painted with two orange pillars and large lighter orange swirls that match the fabric of a yellow & orange curtain." style="" src="https://www.miriamsuzanne.com/images/2025/5mxc2l-tf_-640.jpeg" width="1600" height="900" srcset="https://www.miriamsuzanne.com/images/2025/5mxc2l-tf_-640.jpeg 640w, https://www.miriamsuzanne.com/images/2025/5mxc2l-tf_-960.jpeg 960w, https://www.miriamsuzanne.com/images/2025/5mxc2l-tf_-1600.jpeg 1600w" sizes="(min-width: 65em) 60vw, 95vw" /></picture></div><figcaption>The wall, as inspiration</figcaption></figure>
<p>I also worked on few commissions
that resulted in extra pieces –
<a href="https://art.miriamsuzanne.com/product/goblet">like a stemmed wine goblet</a>,
a number of
<a href="https://art.miriamsuzanne.com/product/large-notched-bowls-black-brown">large soup bowls</a>,
and <a href="https://art.miriamsuzanne.com/product/two-tone-soap-dispenser-dusk">two-tone bottles/soap dispensers</a>
made from a combination of
Rocky Mountain Clay BMX and
New Mexico Clay Ironstone.</p>
<h2 id="pay-what-you-want%2C-more-or-less" tabindex="-1">Pay what you want, more or less</h2>
<p>When you look around at pottery prices,
the range is dramatic.
I’ve tried to price my pieces
where I think they fit “the market”
in terms of style and refinement –
but it still feels somewhat arbitrary.</p>
<p>I know these prices are higher
than your average Etsy seller.
But I’m not in it for the money.
I’m just happy if I can afford to keep making pots –
and I’m especially happy
when other people are enjoying the things I’ve made.</p>
<p>Ideally,
I’d prefer a pay-what-you-want model,
but my shop setup doesn’t allow that –
and people seem to get stressed out
choosing a price.
Relatable!</p>
<p>Instead I’ve added a
<a href="https://art.miriamsuzanne.com/pay-what-you-can">page of discounts</a>
and a tip jar.
I encourage you to use them!</p>
<ul>
<li><code>15-OFF</code> (15% off your order)</li>
<li><code>30-OFF</code> (30% off your order)</li>
<li><code>45-OFF</code> (45% off your order)</li>
</ul>
<p>Don’t hesitate to bring those prices
into a range that fits your budget.
If you see something you like,
I want you to have it.
That’s more fun for me
than storing it in a cupboard.</p>
<p>Feel free to pass this along to other people
you think might be interested!</p>
<h2 id="commission-something-specific" tabindex="-1">Commission something specific</h2>
<figure>
<div data-gallery=""><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/2025/BTgDnGHoO2-640.avif 640w, https://www.miriamsuzanne.com/images/2025/BTgDnGHoO2-960.avif 960w, https://www.miriamsuzanne.com/images/2025/BTgDnGHoO2-1600.avif 1600w" sizes="(min-width: 65em) 60vw, 95vw" /><img loading="lazy" decoding="async" alt="Three large wine goblets with stepped bases and slightly flared stems up to round-bottom bowls that angle in from a wide base to a narrower rim. glazed in a deep blue black from the base, turning white in the top half of the cup." style="" src="https://www.miriamsuzanne.com/images/2025/BTgDnGHoO2-640.jpeg" width="1600" height="1066" srcset="https://www.miriamsuzanne.com/images/2025/BTgDnGHoO2-640.jpeg 640w, https://www.miriamsuzanne.com/images/2025/BTgDnGHoO2-960.jpeg 960w, https://www.miriamsuzanne.com/images/2025/BTgDnGHoO2-1600.jpeg 1600w" sizes="(min-width: 65em) 60vw, 95vw" /></picture></div><figcaption>A recent goblet commission, <a href="https://art.miriamsuzanne.com/product/goblet">one still available</a>!</figcaption></figure>
<p>I’ve done several commissions, and I enjoy it! Here’s the deal:</p>
<ol>
<li>You tell me what you’re looking for
(like a wine goblet or a soap dispenser or a tissue box cover, etc).</li>
<li>I tell you if that sounds fun.
The more finishing details (like color)
you leave to my discretion, the more fun I’ll have.</li>
</ol>
<ul>
<li>If it sounds fun, I’ll try to make it!</li>
<li>If you like what I make, you can pay what you want for it.</li>
</ul>
<p>You can ask me for a price,
and I’ll make something up.
But the whole point is to make things that sound fun,
for people who would use them.
So I won’t take the commission
unless I’m excited to try it <em>for the experience</em>.</p>
<p>It usually takes at least a month of turnaround time,
depending on the complexity.</p>
<h2 id="get-updates!" tabindex="-1">Get updates!</h2>
<p>If you’re interested in updates
when I make new work,
<a href="https://buttondown.com/MiaCulpa">sign up for the occasional email</a>.
I promise to keep them rare.</p>
<p>I called the newsletter <em>Mia Culpa</em>
because it means something like
<em>through my fault</em>,
which is an accurate description
of how my pottery comes to be.
I also like apologies,
and think it would be funny to call this whole endeavor
My Bad Pottery.</p>
<p><em>Oops, sorry, here’s some pots!</em></p>
I've been making pots
2025-06-22T00:00:00Z
https://www.miriamsuzanne.com/2025/06/22/first-market/
<p>Saturday I had my first pottery market. But just a few days before the event, Rae handed me some cash and took home a moon vase.</p>
<p>And my website isn’t ready for them</p>
<p>Saturday I had my first pottery market. But just a few days before the event, Rae handed me some cash and took home a moon vase.</p>
<picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/f6b2MaJ37D-640.avif 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/f6b2MaJ37D-960.avif 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/f6b2MaJ37D-1600.avif 1600w" sizes="(min-width: 75em) 75vw, 95vw" /><img loading="lazy" decoding="async" alt="" class="hero-img" src="https://www.miriamsuzanne.com/images/art/pottery/2025/f6b2MaJ37D-640.jpeg" width="1600" height="1066" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/f6b2MaJ37D-640.jpeg 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/f6b2MaJ37D-960.jpeg 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/f6b2MaJ37D-1600.jpeg 1600w" sizes="(min-width: 75em) 75vw, 95vw" /></picture><p>I started doing weekly pottery
sessions at the local rec center
a couple years ago, coming out of lock-down.
But last fall I decided to commit more time,
and joined a studio with 24hr access.
Now I’m checking in almost daily
to throw, trim, decorate,
or see what’s fresh out of a firing.</p>
<p>The first several months of 2025
were dedicated <em>practice</em> –
working my way through online courses
from (mostly) <a href="https://learnpottery.weebly.com/">Mea Rhee</a>.
I’ve also been taking assignments from friends –
planters and ramen bowls
and a tissue box cover for our new home,
shallow dishes for Lars,
a gaiwan tea set for Gwyn,
a trinket tray for Rae…</p>
<figure>
<div data-gallery="multi"><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/E4EH0VCgVT-640.avif 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/E4EH0VCgVT-960.avif 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/E4EH0VCgVT-1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="Rectangular tray with a black and white zig-zag pattern that starts tidy on the left then skews wildly on the right - the lip of the tray is red and folds over itself ending in torn edges
" style="" src="https://www.miriamsuzanne.com/images/art/pottery/2025/E4EH0VCgVT-640.jpeg" width="1600" height="899" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/E4EH0VCgVT-640.jpeg 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/E4EH0VCgVT-960.jpeg 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/E4EH0VCgVT-1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/pbB0Yy0V39-640.avif 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/pbB0Yy0V39-960.avif 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/pbB0Yy0V39-1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="Tray from a low angle for dramatic effect, showing the torn edges close-up, and the black underside
" style="" src="https://www.miriamsuzanne.com/images/art/pottery/2025/pbB0Yy0V39-640.jpeg" width="1600" height="899" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/pbB0Yy0V39-640.jpeg 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/pbB0Yy0V39-960.jpeg 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/pbB0Yy0V39-1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/SK5BKmPaVR-640.avif 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/SK5BKmPaVR-960.avif 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/SK5BKmPaVR-1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="Old yellow dress form with holes for arms and neck, and patch nailed onto it that says coroner - there's a planter protruding from the neck, housing a ponytail fern squat conic trunk up to scraggly hair-like leaves
" style="" src="https://www.miriamsuzanne.com/images/art/pottery/2025/SK5BKmPaVR-640.jpeg" width="1600" height="2399" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/SK5BKmPaVR-640.jpeg 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/SK5BKmPaVR-960.jpeg 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/SK5BKmPaVR-1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/XJmPIstQmL-640.avif 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/XJmPIstQmL-960.avif 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/XJmPIstQmL-1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="My arm reaches in to hold the coroner head out of the dress form, revealing a long bent cone with deep texture and pooled white glaze at the rounded-off base which would not be able to sit in any other location
" style="" src="https://www.miriamsuzanne.com/images/art/pottery/2025/XJmPIstQmL-640.jpeg" width="1600" height="2399" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/XJmPIstQmL-640.jpeg 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/XJmPIstQmL-960.jpeg 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/XJmPIstQmL-1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/0Ut-yW_9U1-640.avif 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/0Ut-yW_9U1-960.avif 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/0Ut-yW_9U1-1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="A set of four shallow bowls stacked, with one overturned leaning against the others to show the deep foot ring and under-side texture. They have a deep glassy brown glaze with a splash of white and blue along one inside wall
" style="" src="https://www.miriamsuzanne.com/images/art/pottery/2025/0Ut-yW_9U1-640.jpeg" width="1600" height="900" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/0Ut-yW_9U1-640.jpeg 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/0Ut-yW_9U1-960.jpeg 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/0Ut-yW_9U1-1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture></div><figcaption>A few of the commissioned pieces for friends</figcaption></figure>
<p>I have a lot more that I’m excited to learn,
but I’m also proud of how far I’ve come.
This month I even started teaching
<em>beginner wheel throwing</em> classes
at <a href="https://www.kinshipdenver.com/">Kinship Studio</a>.
I’ll be teaching the Tuesday class
again in July, and
<a href="https://www.kinshipdenver.com/group-pottery-classes/#signup">registration is still open</a>!</p>
<p>Since teaching covers my studio membership,
I’m no longer <em>spending money</em>
to make my pottery.
First goal achieved!
The next goal is to
<em>sell</em> some pottery,
then see if I can sell it <em>consistently</em>.
I’m starting to pitch local shops,
putting together a web store,
trading pottery for hair cuts,
and this weekend
I participated in my first market!</p>
<figure>
<div data-gallery="multi"><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/M2tVIlCIHn-640.avif 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/M2tVIlCIHn-960.avif 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/M2tVIlCIHn-1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="Four 12oz tumblers with a deep inset foot ring, wide base, and grooved speckled walls sloping in to a narrower brightly glazed lip - one red, one green, one blue, and one white
" style="" src="https://www.miriamsuzanne.com/images/art/pottery/2025/M2tVIlCIHn-640.jpeg" width="1600" height="1066" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/M2tVIlCIHn-640.jpeg 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/M2tVIlCIHn-960.jpeg 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/M2tVIlCIHn-1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/-l4utujWgp-640.avif 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/-l4utujWgp-960.avif 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/-l4utujWgp-1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="Three tumblers, also wide base with grooved walls sloped in - but the clay is brown un-speckled, the lips are an icy white, and they have hand-written text. The front one says "do trans, be crime". We can also see the end of "…crimes" sticking out on one behind, and "protect trans kids" on the last one
" style="" src="https://www.miriamsuzanne.com/images/art/pottery/2025/-l4utujWgp-640.jpeg" width="1600" height="1066" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/-l4utujWgp-640.jpeg 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/-l4utujWgp-960.jpeg 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/-l4utujWgp-1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/Atc8wpdoXc-640.avif 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/Atc8wpdoXc-960.avif 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/Atc8wpdoXc-1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="v60 style coffee pour-over with frosty glaze highlighting dark clay that shows through at edges, an inverted cone down to a flat lid resting on the rim of a mug, which is slightly conic the other way - tilting in from a wide base, also in dark clay with the same glaze only at the top. Both have a grooved texture, and there's a row of small white arrows on the mug between grooves
" style="" src="https://www.miriamsuzanne.com/images/art/pottery/2025/Atc8wpdoXc-640.jpeg" width="1600" height="2400" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/Atc8wpdoXc-640.jpeg 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/Atc8wpdoXc-960.jpeg 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/Atc8wpdoXc-1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/B0HZR65w6z-640.avif 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/B0HZR65w6z-960.avif 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/B0HZR65w6z-1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="My hand holding up a red-clay cortado-size tumbler with grooved texture, inset foot ring, and white-brown glazed rim. There's just a peak of teal showing inside the foot ring, usually hidden.
" style="" src="https://www.miriamsuzanne.com/images/art/pottery/2025/B0HZR65w6z-640.jpeg" width="1600" height="2400" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/B0HZR65w6z-640.jpeg 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/B0HZR65w6z-960.jpeg 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/B0HZR65w6z-1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/MZaPFTZD3q-640.avif 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/MZaPFTZD3q-960.avif 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/MZaPFTZD3q-1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="The pour-over from underneath, showing a glazed base with concentric outer and inner rings around the funnel to keep the mug in position and the coffee flowing into the mug. My 'm' stamp stands out on the rim, dark clay unglazed
" style="" src="https://www.miriamsuzanne.com/images/art/pottery/2025/MZaPFTZD3q-640.jpeg" width="1600" height="1201" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/MZaPFTZD3q-640.jpeg 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/MZaPFTZD3q-960.jpeg 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/MZaPFTZD3q-1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/-zJjqvfr57-640.avif 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/-zJjqvfr57-960.avif 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/-zJjqvfr57-1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="A small black tumbler, maybe 6oz, with red drippy-looking arrows pointing up to a grey-brown glazed rim
" style="" src="https://www.miriamsuzanne.com/images/art/pottery/2025/-zJjqvfr57-640.jpeg" width="1600" height="1066" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/-zJjqvfr57-640.jpeg 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/-zJjqvfr57-960.jpeg 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/-zJjqvfr57-1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/MOHbYhcEy0-640.avif 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/MOHbYhcEy0-960.avif 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/MOHbYhcEy0-1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="My hand holding a lidded gaiwan tea bowl just over the saucer - one finger pulling the lid back as though to pour tea strained through the small opening. All the parts are a glassy deep brown, breaking red over grooved textures, and the bowl has a wide flared rim for picking up when hot
" style="" src="https://www.miriamsuzanne.com/images/art/pottery/2025/MOHbYhcEy0-640.jpeg" width="1600" height="1066" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/MOHbYhcEy0-640.jpeg 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/MOHbYhcEy0-960.jpeg 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/MOHbYhcEy0-1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/u-kd7xuo6e-640.avif 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/u-kd7xuo6e-960.avif 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/u-kd7xuo6e-1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="Overturned parts of the gaiwan, a lid on the table, the bottom of the bowl shows a bare white clay foot ring and my 'm' stamp, and the saucer now leaning against it has a matching grooved pattern on the underside and matching white foot-ring
" style="" src="https://www.miriamsuzanne.com/images/art/pottery/2025/u-kd7xuo6e-640.jpeg" width="1600" height="1066" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/u-kd7xuo6e-640.jpeg 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/u-kd7xuo6e-960.jpeg 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/u-kd7xuo6e-1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/_sBmEeRkDJ-640.avif 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/_sBmEeRkDJ-960.avif 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/_sBmEeRkDJ-1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="9 tea or espresso cups about 2-3oz, stacked together rim-to-rim, and foot-to-foot - four in front, three behind, and two on the table. A dark dusk glaze breaks red over grooved texture, and has hints of blue between. each has a red rim, and no handle.
" style="" src="https://www.miriamsuzanne.com/images/art/pottery/2025/_sBmEeRkDJ-640.jpeg" width="1600" height="1066" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/_sBmEeRkDJ-640.jpeg 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/_sBmEeRkDJ-960.jpeg 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/_sBmEeRkDJ-1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/rRyVC9yh2d-640.avif 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/rRyVC9yh2d-960.avif 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/rRyVC9yh2d-1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="Two vases, one upright, the other on it's side so we can see into it - both conic like my mugs but taller, and with a rim that curves back down into the vase slightly to a narrower inset lip. A brown raw clay has deep grooves and little trails of red arrows, then a white rim at the top
" style="" src="https://www.miriamsuzanne.com/images/art/pottery/2025/rRyVC9yh2d-640.jpeg" width="1600" height="1066" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/rRyVC9yh2d-640.jpeg 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/rRyVC9yh2d-960.jpeg 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/rRyVC9yh2d-1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/8zLcID5OQq-640.avif 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/8zLcID5OQq-960.avif 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/8zLcID5OQq-1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="Two nearly identical soup bowls nested so we see the outer one from the side, a grooved texture that shows through the glassy dark brown-to-black-and iridescent blue. A rounded shape with a tall speckled clay foot ring and my small 'm' stamp. The inner bowl is off-kilter showing inside walls, smooth in the same glaze from a red-brown rim down into cosmic blues and a splash of yellow to one side.
" style="" src="https://www.miriamsuzanne.com/images/art/pottery/2025/8zLcID5OQq-640.jpeg" width="1600" height="1066" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/8zLcID5OQq-640.jpeg 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/8zLcID5OQq-960.jpeg 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/8zLcID5OQq-1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/a3-mDEFrRA-640.avif 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/a3-mDEFrRA-960.avif 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/a3-mDEFrRA-1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="One of the ramen bowls, with chop-sticks sitting across a set of shallow notches in the rim
" style="" src="https://www.miriamsuzanne.com/images/art/pottery/2025/a3-mDEFrRA-640.jpeg" width="1600" height="1066" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/a3-mDEFrRA-640.jpeg 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/a3-mDEFrRA-960.jpeg 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/a3-mDEFrRA-1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/iHlypxHc3J-640.avif 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/iHlypxHc3J-960.avif 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/iHlypxHc3J-1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="A whole set of mugs and pour-overs, gaiwan, vases, and other assorted pieces laid out on the counter. Towards the back are taller vases out of focus.
" style="" src="https://www.miriamsuzanne.com/images/art/pottery/2025/iHlypxHc3J-640.jpeg" width="1600" height="899" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/iHlypxHc3J-640.jpeg 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/iHlypxHc3J-960.jpeg 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/iHlypxHc3J-1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture></div><figcaption>Some of the pieces that I made for this market</figcaption></figure>
<p>I’m aware of the dangers that come
with turning a hobby into a hustle,
but right now I’m interested in anything
that helps me spend more time in the studio.
I’m already back to work on some commissions
I’ve promised to local shops and also to family.</p>
<figure>
<div data-gallery="multi"><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/h_q-96k8X9-640.avif 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/h_q-96k8X9-960.avif 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/h_q-96k8X9-1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="A medium-size sake bottle in coal black clay, still wet on the wheel, with a barely rounded belly, narrow neck, and cup-like rim
" style="" src="https://www.miriamsuzanne.com/images/art/pottery/2025/h_q-96k8X9-640.jpeg" width="1600" height="2844" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/h_q-96k8X9-640.jpeg 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/h_q-96k8X9-960.jpeg 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/h_q-96k8X9-1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/MGXzgkkyN--640.avif 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/MGXzgkkyN--960.avif 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/MGXzgkkyN--1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="a tall cylindrical vase with straight walls up to a sharp angle in, then sharp angle back out, ending in a horizontal flared rim nearly the same diameter as the cylinder - reminiscent of an old-style milk-jug, but still wet on the wheel with splattered clay and tools around
" style="" src="https://www.miriamsuzanne.com/images/art/pottery/2025/MGXzgkkyN--640.jpeg" width="1600" height="2761" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/MGXzgkkyN--640.jpeg 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/MGXzgkkyN--960.jpeg 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/MGXzgkkyN--1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/B4oPuAqhPv-640.avif 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/B4oPuAqhPv-960.avif 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/B4oPuAqhPv-1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="A rectangular tissue-box cover in raw unglazed clay that has a circular geometric pattern pressed into it. The opening at the top seems torn and pulled back, with tissues sticking out - and the bottom rim is a torn and rolled edge as though made of draped cloth, or alive like some sort of sea creature
" style="" src="https://www.miriamsuzanne.com/images/art/pottery/2025/B4oPuAqhPv-640.jpeg" width="1600" height="1066" srcset="https://www.miriamsuzanne.com/images/art/pottery/2025/B4oPuAqhPv-640.jpeg 640w, https://www.miriamsuzanne.com/images/art/pottery/2025/B4oPuAqhPv-960.jpeg 960w, https://www.miriamsuzanne.com/images/art/pottery/2025/B4oPuAqhPv-1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture></div><figcaption>A few of the new pieces currently under construction…</figcaption></figure>
<p>At some point I also need to find time
for getting this website in a better state –
ready to display (and sell)
my work more easily.</p>
<p>If you’re interested in updates
on my pottery or other creations,
sign up for my new
‘<a href="https://email.miriamsuzanne.com/">Mia Culpa</a>’ newsletter.
It will be rarely used,
but give you first access
when I do have something new to show,
or new work available
in my <a href="https://art.miriamsuzanne.com/">online store</a>.</p>
Laser-Cut Pottery Throwing Gauge
2025-05-16T00:00:00Z
https://www.miriamsuzanne.com/2025/05/16/throwing-gauge/
<p>I designed a pottery throwing gauge
that I could laser cut with scrap material,
and assemble using only friction
and bat pins.</p>
<p>As simple as I could make it</p>
<p>I designed a pottery throwing gauge
that I could laser cut with scrap material,
and assemble using only friction
and bat pins.</p>
<picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/2025/KAEY-acxId-640.avif 640w, https://www.miriamsuzanne.com/images/2025/KAEY-acxId-960.avif 960w, https://www.miriamsuzanne.com/images/2025/KAEY-acxId-1589.avif 1589w" sizes="(min-width: 75em) 75vw, 95vw" /><img loading="lazy" decoding="async" alt="" class="hero-img" src="https://www.miriamsuzanne.com/images/2025/KAEY-acxId-640.jpeg" width="1589" height="894" srcset="https://www.miriamsuzanne.com/images/2025/KAEY-acxId-640.jpeg 640w, https://www.miriamsuzanne.com/images/2025/KAEY-acxId-960.jpeg 960w, https://www.miriamsuzanne.com/images/2025/KAEY-acxId-1589.jpeg 1589w" sizes="(min-width: 75em) 75vw, 95vw" /></picture><p>Choose a format to download the design templates:</p>
<ul>
<li><a href="https://www.miriamsuzanne.com/assets/downloads/throwing_gauge.dxf" download="">DXF drawings</a></li>
<li><a href="https://www.miriamsuzanne.com/assets/downloads/throwing_gauge.lbrn2" download="">LightBurn 2</a></li>
</ul>
<p>This is inspired by
<a href="https://www.darrenellispottery.com/shop/1-pointer">Darren Ellis</a>
and <a href="https://tobyduncan.com/downloads/throwing-gauge">Toby Duncan</a>,
with some adjustments
to simplify the construction.</p>
<h2 id="build-your-own" tabindex="-1">Build your own</h2>
<p>To make your own gauge,
you’ll need:</p>
<ul>
<li>1/4" plywood, <abbr>MDF</abbr>, or acrylic</li>
<li>1/8" plywood, <abbr>MDF</abbr>, or acrylic</li>
<li><1/8" flexible rubber or plastic</li>
<li>1/4" bolts & nuts (bat pins will work!)</li>
</ul>
<p>This requires a laser cutter,
or some other way of cutting out
the parts from a template.
Maybe you’re good with a jig saw?
Once you have the parts,
you can fit and bolt them together.
There’s no carving or gluing required.</p>
<p>I made mine using whatever I could find
in the scrap pile
at <a href="https://denhac.org/">my local maker space</a> –
a combination of 1/4" MDF, 1/8" plywood, 1/8" acrylic,
and flexible magnetic sheeting for the pointers.
It’s assembled entirely with bat pins and wing nuts.</p>
<p>None of the width measurements need to be precise,
as long as they are consistent,
so it should also be fine
to do rough metric conversions as needed.</p>
<h2 id="the-frame" tabindex="-1">The frame</h2>
<p>The frame is ideally made from thicker,
more structural plywood.
I cut three rectangles for the base,
and slot two uprights through them in order
to match the stepped foot design.
I had to do some minimal sanding of the slots,
but a tight fit is good.
This frame is quick to assemble and disassemble,
and the sliding-bolts for the pointer arms
will provide additional structure.</p>
<p>The bottom base piece isn’t ‘held on’
by anything besides friction.
That’s worked fine for me,
but you can also fasten the layers together
if you prefer.
Glue, nails, screws, bolts –
whatever you like.
That’s optional.</p>
<figure>
<div data-gallery="multi"><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/2025/qCg7OmGEm8-640.avif 640w, https://www.miriamsuzanne.com/images/2025/qCg7OmGEm8-960.avif 960w, https://www.miriamsuzanne.com/images/2025/qCg7OmGEm8-1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="Holding up the assembled frame, 2 identical uprights slotted through a three-layer base. The uprights also have a vertical slot for adjusting the arms up and down. The assembled arms with pointer ends are on the table behind the frame.
" style="" src="https://www.miriamsuzanne.com/images/2025/qCg7OmGEm8-640.jpeg" width="1600" height="2400" srcset="https://www.miriamsuzanne.com/images/2025/qCg7OmGEm8-640.jpeg 640w, https://www.miriamsuzanne.com/images/2025/qCg7OmGEm8-960.jpeg 960w, https://www.miriamsuzanne.com/images/2025/qCg7OmGEm8-1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/2025/qr6pVTYFw8-640.avif 640w, https://www.miriamsuzanne.com/images/2025/qr6pVTYFw8-960.avif 960w, https://www.miriamsuzanne.com/images/2025/qr6pVTYFw8-1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="One of the arms is attached to the frame using a bat pin and wing nut.
" style="" src="https://www.miriamsuzanne.com/images/2025/qr6pVTYFw8-640.jpeg" width="1600" height="2399" srcset="https://www.miriamsuzanne.com/images/2025/qr6pVTYFw8-640.jpeg 640w, https://www.miriamsuzanne.com/images/2025/qr6pVTYFw8-960.jpeg 960w, https://www.miriamsuzanne.com/images/2025/qr6pVTYFw8-1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture></div><figcaption>These photos are from my first draft. More recent versions include a nut and bolt at the back of each arm to keep the layers aligned.</figcaption></figure>
<h2 id="the-pointer-arms" tabindex="-1">The pointer arms</h2>
<p>Each arm consists of a pointer
and core sandwiched between outer plates.
Darren recommends making the core from acrylic,
and that’s working well for me.
The essential thing is that
the core must be slightly thicker material
than the pointer.
If there’s not enough space,
it might be hard to adjust.
But if there’s too much space,
the pointer will flop around.</p>
<p>The pointer should be cut from something flexible,
so it doesn’t damage your work.
Rubber seems ideal,
but I used scraps of magnetic sheeting,
because I found some in the scrap pile.
That’s been working fine for me.</p>
<h2 id="hardware" tabindex="-1">Hardware</h2>
<p>Each arm takes 3 bolt/nut pairs –
one as an adjustable mounting point
attaching the arm to the frame,
one as a pivot for the pointer,
and a final one at the back for stability.
The mounting bolt should be
over an inch long,
with a wing nut for easy adjustments.
The other two can be shorter,
and don’t require quick access.</p>
<p>All these connection points
are designed for 1/4" bolts.
Standard bat pins (in the US)
are 1/4 20 socket-head screws
with wing nuts.
You can get them from most pottery supplier,
or <em>any old hardware store</em>.
I designed it specifically
so that these could be interchangeable
with tools & equipment already in the studio,
but any 1/4" bolts will work.</p>
<p>If you have different bat pins or bolts
that you’d like to use,
you might need to adjust the drawings.
All the bolt holes and slots are 0.26"
in my designs.</p>
Tech continues to be political
2025-02-12T00:00:00Z
https://www.miriamsuzanne.com/2025/02/12/tech-ai-wtf/
<p>Being “in tech” in 2025 is depressing,
and if I’m going to stick around,
I need to remember why I’m here.</p>
<p>And the politics aren’t looking great</p>
<p>Being “in tech” in 2025 is depressing,
and if I’m going to stick around,
I need to remember why I’m here.</p>
<p>(<a href="https://www.miriamsuzanne.com/2025/02/12/tech-ai-wtf-fr/">en français</a>)</p>
<h2 id="you-are-here%2C-on-my-personal-web-log" tabindex="-1">You are here, on my personal web log</h2>
<p>A note of warning,
before you proceed:
this is a journal entry,
at a difficult time.</p>
<blockquote>
<p>It’s very hard to think or act
when you can’t tell if you’re about to lose your job,
have your research killed off,
have your healthcare terminated,
witness unstoppable crimes,
or just experience extended and
apparently unescapable moral injury.</p>
<p>—Erin Kissane, <a href="https://erinkissane.com/against-entropy">Against Entropy</a></p>
</blockquote>
<p>TL;DR – This is a post about
billionaires who love eugenics<sup class="footnote-ref"><a href="https://www.miriamsuzanne.com/2025/02/12/tech-ai-wtf/#fn1" id="fnref1">[1]</a></sup>,
support a pro-eugenics government,
and sell us a product
that they promise will help their longterm
eugenic goals.
But really this is a post about how I feel,
when colleagues treat that product
as though it <em>might have merit, if we just give it a chance</em>.</p>
<p>For some reason,
I find that opinion to be <em>in bad taste</em>.
I know I shouldn’t yuck your yum, or whatever,
but I don’t like eugenics.</p>
<p>Reader, <em>it fucks me up</em>.</p>
<h2 id="chill-out%2C-it%E2%80%99s-just-a-tool" tabindex="-1">Chill out, it’s just a tool</h2>
<p>For years we’ve been saying that
<em>tech is political</em>,
and that <em>tech is not neutral</em>.
But I don’t know if we’re communicating
the full nuance of that adage.
It’s not just a warning about bad Apples (or Palantirs)
who might use code to dabble in evil extracurriculars.
More important to me
is the understanding
that <em>technologies often carry an ideology inside them</em>:</p>
<blockquote>
<p>It is something of an amusing curiosity
that some AI models were perplexed
by a giraffe without spots.
But it’s these same tools and paradigms
that enshrine normativity of all kinds,
“sanding away the unusual.”</p>
<p>—Ben Myers, <a href="https://benmyers.dev/blog/spotless-giraffe/">I’m a Spotless Giraffe</a></p>
</blockquote>
<p>Tools tend to exist between us and a goal,
and the shape of the tool
tells us something about how to proceed,
and what outcomes are desirable.
Tech <em>enacts</em> and <em>shapes</em> our world,
our lives, and our politics.</p>
<p>Guns don’t kill people,
guns are designed <em>to help people kill people</em>.</p>
<p>Maybe we should consider the beliefs and assumptions
that have been built into a technology
before we embrace it?
But we often prefer to treat each new toy
as as an abstract and unmotivated <em>opportunity</em>.
If only the <em>good people like ourselves</em>
would get involved early,
we can surely teach everyone else to use it ethically!</p>
<p>Every tool is a hammer,
with context lost to history –
and it’s up to us
to determine <em>individually</em>
what looks like a nail.
There is no system, no society,
no marketing department, no regulation.
Each of us is an island of isolated <s>trolly conductors</s>
<em>hammer enthusiasts</em>.</p>
<p>Once we’ve established some useful norms –
a ‘best practice’ or two –
I can’t imagine anyone
[<em>crowd cheers for CEO giving sieg heil salute</em>].</p>
<h2 id="meanwhile%2C-back-at-the-hammer-factory%E2%80%A6" tabindex="-1">Meanwhile, back at the hammer factory…</h2>
<p>The AI projects currently mid-hype
are being developed and sold by billionaires and VCs
with companies explicitly
pursuing surveillance, exploitation, and weaponry.
They fired their ethics teams
at the start of the cycle,
and diverted our attention
to a long-term sci-fi narrative
about the coming age of machines –
a “General Intelligence” that will soon
“surpasses” human ability.</p>
<p><em>Be it god or demon,
only the high priests of venture capital
can summon and tame such a powerful being
for the good of humanity!
It will only cost you all your labor (past and present),
a reversal on climate policy,
and a rather large fortune.</em></p>
<p>What does that mean?
Hand-waving eugenics.
We have no way to measure <em>intelligence</em>,
no idea what it means to <em>surpass humans</em>,
and no reason to believe that ‘intelligence’
might be exponential.
Unless you rely on debunked race science,
which many of these CEOs seem obsessed with.
Now they are eager to jump on board
an authoritarian movement
<em>that wants to exterminate trans and disabled people</em>,
fire black people,
and deport all my immigrant friends and colleagues.</p>
<p>It’s wild to see major tech companies
throwing out all pretense –
giddy to abandon previous commitments around
diversity, equity, inclusion, or accessibility.
Run free, little mega-corps!
Be the evil you’ve always dreamed for the world!</p>
<p>Surely this has nothing to do with their products, though.</p>
<h2 id="but-her-use-cases" tabindex="-1">But her use-cases</h2>
<p>I know that ‘AI’ <em>broadly</em> has a long history,
with ‘language models’ and ‘neural nets’
developing real use-cases in science and other fields.
I’m not new here.
But this background level of validity-by-association
is used to prop up absolute garbage.
The chatSlop we’re drowning in now
is clearly designed and deployed for a different purpose.</p>
<p>Haven’t you heard?
They’re building a digital god
who will lead us to salvation,
uploaded into the virgo supercluster
where we can expand the light of
<a href="https://bengrosser.com/projects/andreessens-techno-optimist-manifesto-as-redaction-poetry//">exponential profit</a>
throughout the cosmos!
This is the actual narrative of several AI CEOs,
despite being easy to dismiss
as hyperbolic nonsense.
Why won’t I focus on the actual use-cases?</p>
<p><em>Why won’t you focus
on the actual documented harms?
Somehow there is always room for people
to dismiss concerns as “overblown and unfounded”
past the first attempted coup,
and well into an authoritarian power grab.</em></p>
<p>But the bigger issue is that
they don’t have to be <em>successful</em> to be <em>dangerous</em>.
Because along the way,
these companies get to steal our work and sell it back to us,
lower our wages, de-skill our field,
bury us in slop, and mire us in algorithmic bureaucracy.
If the long-term space god thing doesn’t work out,
at least they can make a profit in the short-term.</p>
<p>The beliefs of these CEOs aren’t incidental
to the AI product they’re selling us.
These are not tools designed for us to <em>benefit from</em>,
but tools designed to <em>exploit us</em>.
To poison our access to jobs,
and our access to information at the same time.</p>
<p>I said on social media
that people <em>believe</em> what chatbots tell them,
and I was laughed at.
<em>No one would trust a chatbot, silly</em>!
That same day,
several different friends and colleagues
quoted the output of an ‘AI’ to me
in unrelated situations,
as though quoting reliable facts.</p>
<p>So now
a select few companies run by billionaires
control much of the information
that people see –
“summarized” without sources.
Meanwhile,
there’s an oligarchy taking power in the US.
Meanwhile,
Grok’s entire purpose is to be ‘anti-woke’ and anti-trans,
<em><a href="https://gizmodo.com/chatgpts-political-views-are-shifting-right-a-new-analysis-finds-2000562328">ChatGPT’s political views are shifting right</a></em>,
and Anthropic is partnering with Palantir.</p>
<p>Seems chill.
I bet ‘agents’ are cool.</p>
<p><em>Wouldn’t want to eat
<a href="https://defector.com/salesforce-is-using-a-hallucination-to-sell-ai">a shrimp cocktail in the rain</a>.</em></p>
<h2 id="tech-workers-seem-to-like-tech-actually" tabindex="-1">Tech workers seem to like tech actually</h2>
<p><a href="https://knowyourmeme.com/photos/2069350-twitter-x">There’s a meme</a>
that goes around regularly,
about the attitudes of <em>tech enthusiasts</em>
vs <em>tech workers</em>…</p>
<blockquote>
<p>Tech enthusiasts: My entire house is smart.</p>
<p>Tech workers: The only piece of technology
in my house is a printer
and I keep a gun next to it
so I can shoot it
if it makes a noise I don’t recognize.</p>
<p>—<a href="https://knowyourmeme.com/photos/2069350-twitter-x">Pranay Pathole</a></p>
</blockquote>
<p>I can relate to that sentiment,
but many in our community seem <em>unfazed</em>
or even <em>excited</em> about ‘AI’ and ‘agents’
and ‘codegen’ and all the rest of it.
As far as I can tell,
most of our industry is still on board with the project,
even while protesting the changes in corporate politics,
or occasionally complaining about the most obvious over-use.
There are certainly a number of people
raising alarms or expressing frustration,
but we’re often dismissed as <em>uninformed</em>.</p>
<p>Based on every conference I’ve attended over the last year,
I can absolutely say we’re a fringe minority.
And it’s wearing me out.
I don’t know how to participate
in a community that so eagerly brushes aside
the active and <em>intentional</em>/<em>foundational</em> harms of a technology.
In return for what? Faster copypasta?
Automation tools being rebranded as an “agentic” web?
Assurance that we won’t be <em>left behind</em>?</p>
<p><em>This is your opportunity
to get in at the ground floor!</em></p>
<p>I don’t know how to attend conferences
full of gushing talks about the tools
that were <em>designed to negate me</em>.
That feels so absurd to say.
I don’t have any interest in trying to
reverse-engineer use-cases for it,
or improve the flaws to make it “better”,
or help sell it by bending it to new uses.</p>
<p>When eugenics-obsessed billionaires
try to sell me a new toy,
I don’t ask how many keystrokes it will save me at work.
It’s impossible for me to discuss the <em>utility</em> of a thing
when I fundamentally disagree with the <em>purpose</em> of it.</p>
<p>I don’t care how well their ‘AI’ <em>works</em> –
or if you found a fancy fun use-case.
It <em>fucks me up</em> watching peers treat this tech
<em>from people who want to eradicate me</em>
as a future worth considering.
I don’t want any of this.</p>
<p>I don’t need <em>an agent</em>,
I want to <a href="https://www.youtube.com/watch?v=QEJpZjg8GuA"><em>maintain my own agency</em></a>.</p>
<h2 id="i-don%E2%80%99t-know" tabindex="-1">I don’t know</h2>
<blockquote>
<p>I used to see the AI bubble
and trans rights as distinct issues.
I no longer do.
The fascist movement in tech
has truly metastasized,
as evidenced by Elon Musk’s personal coup,
his endless supply of techbro supporters,
tech companies’ eagerness to axe DEI programs
once Trump gave them an excuse,
erasure of queer lives from tech products, etc.</p>
<p>To the extent that AI marketing
is an attempt to enclose and commodify culture,
and thus to concentrate political power,
I see it as a kind of fascism.</p>
<p>—<a href="https://wandering.shop/@xgranade/113987828759081498">Cassandra Granade</a></p>
</blockquote>
<p>I know the anti-DEI(A) sea-change
in mega-corp C-suites
doesn’t reflect the desires of my
friends and colleagues
now working for (<em>surprise!</em>) AI arms dealers,
but just trying to do their best
for open web standards.
I don’t know what I would do in that situation.
Labor and capital are often at odds.
I imagine we all
<a href="https://ethanmarcotte.com/books/you-deserve-a-tech-union/">deserve a tech union</a>.
But I worry about how few people
seem to see the need for it.</p>
<p>Every time I log on
I feel like I’m being gaslit –
asked to train my shitty replacement,
and then step aside.
The future is <em>not women</em>,
I’m learning now.
You can be sued in the US
for intentionally hiring women.
The future is actually <em>inhuman word synthesizers</em>.</p>
<p><em>Oh no, I was tricked by the genders
and their sneaky ideology!
Now I’m a crime!
Haha, oops!</em></p>
<p>Work is already harder to find,
and companies mostly want help
slopping more slop into the slop machine.
<em>Because it will help users</em>, you ask?
Of course not!
Because everyone now has slop <em>on-tap</em>,
and needs to turn that flow of garbage
into a cash-flow!</p>
<p><s><em>That’s the trouble with tribbles.</em></s>
<a href="https://business-business.business/">Money, gain, profit</a>!</p>
<p>What are we doing here?
What am I doing here?
How do I stay engaged in this field,
and keep paying my bills,
without feeling like a constant outsider –
about to be dismissed from my career?
I know I’m not the only one feeling this way,
but the layering of threats and betrayals add up.
It feels so isolating.</p>
<h2 id="it%E2%80%99s-probably-good-to-get-this-clarity" tabindex="-1">It’s probably good to get this clarity</h2>
<p>“Tech” was always a vague and hand-waving field –
a way to side-step regulations
while starting an unlicensed taxi company or hotel chain.
That was never my interest.</p>
<p>But I got curious about <em>the web</em>,
a weird little project
built for sharing research between scientists.
And I still think this web could be pretty cool, actually,
if it wasn’t trapped in the clutches of big tech.
If we can focus on
the bits that make it special –
the bits that make it unwieldy for capitalism:</p>
<blockquote>
<p>Large companies find HTML & CSS frustrating “at scale”
because the web is
a fundamentally anti-capitalist mashup art experiment,
designed to give consumers all the power.</p>
<p>—Me, <a href="https://tweets.miriamsuzanne.com/1198717316269084672/">before all this</a></p>
</blockquote>
<p>What are we going to build now –
those of us who still care about
diversity, equity, inclusion, accessibility,
and giving consumers the power?
Can we still put our HTML & CSS to good use?
Can we get back to building a web
where people have <em>agency</em> instead of <em>inhuman agents</em>?</p>
<p>Where are you looking to put your energy next?</p>
<hr />
<figure>
<div data-gallery="multi"><a href="https://art.miriamsuzanne.com/"><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/art/pottery/2026/gcSHUf5sUp-640.avif 640w, https://www.miriamsuzanne.com/images/art/pottery/2026/gcSHUf5sUp-960.avif 960w, https://www.miriamsuzanne.com/images/art/pottery/2026/gcSHUf5sUp-1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="Handmade ceramic cups that say 'do trans, be crimes' in a handwritten slab serif. Each has a deep foot ring and slightly rounded wide base, and bare clay textured walls that slope in towards the mossy green-and-gold glazed rim.
" src="https://www.miriamsuzanne.com/images/art/pottery/2026/gcSHUf5sUp-640.jpeg" width="1600" height="1066" srcset="https://www.miriamsuzanne.com/images/art/pottery/2026/gcSHUf5sUp-640.jpeg 640w, https://www.miriamsuzanne.com/images/art/pottery/2026/gcSHUf5sUp-960.jpeg 960w, https://www.miriamsuzanne.com/images/art/pottery/2026/gcSHUf5sUp-1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture></a><a href="https://art.miriamsuzanne.com/"><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/art/pottery/2026/LHNIwdMHvT-640.avif 640w, https://www.miriamsuzanne.com/images/art/pottery/2026/LHNIwdMHvT-960.avif 960w, https://www.miriamsuzanne.com/images/art/pottery/2026/LHNIwdMHvT-1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="Similar cups, but these say 'no cops, no cages, no borders' and have a blue glaze at the rim and inside.
" src="https://www.miriamsuzanne.com/images/art/pottery/2026/LHNIwdMHvT-640.jpeg" width="1600" height="1066" srcset="https://www.miriamsuzanne.com/images/art/pottery/2026/LHNIwdMHvT-640.jpeg 640w, https://www.miriamsuzanne.com/images/art/pottery/2026/LHNIwdMHvT-960.jpeg 960w, https://www.miriamsuzanne.com/images/art/pottery/2026/LHNIwdMHvT-1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture></a><a href="https://art.miriamsuzanne.com/"><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/art/pottery/2026/6Lu7F6SA8x-640.avif 640w, https://www.miriamsuzanne.com/images/art/pottery/2026/6Lu7F6SA8x-960.avif 960w, https://www.miriamsuzanne.com/images/art/pottery/2026/6Lu7F6SA8x-1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="A set of angular ceramic bottles, some with an inset hourglass waist, some outset and diamond-shaped. All of them have a black clay base and a hard slightly-swirled transition to white clay for the upper two-thirds. They also have soap dispenser pumps in the top.
" src="https://www.miriamsuzanne.com/images/art/pottery/2026/6Lu7F6SA8x-640.jpeg" width="1600" height="1066" srcset="https://www.miriamsuzanne.com/images/art/pottery/2026/6Lu7F6SA8x-640.jpeg 640w, https://www.miriamsuzanne.com/images/art/pottery/2026/6Lu7F6SA8x-960.jpeg 960w, https://www.miriamsuzanne.com/images/art/pottery/2026/6Lu7F6SA8x-1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture></a></div><figcaption>Enjoy some <a href="https://art.miriamsuzanne.com/">handmade functional art</a>? Keep fighting for your neighbors.</figcaption></figure>
<h2 id="addendum%2C-2025-02-16" tabindex="-1">Addendum, 2025-02-16</h2>
<p>I’ve been spending a lot of time
<a href="https://art.miriamsuzanne.com/">in the pottery studio</a>
instead of keeping up with my RSS feed –
so I wasn’t aware of the most recent <em>AI discourse</em>.
Jeremy Keith does a great job
putting my thoughts in context
of a <a href="https://adactio.com/journal/21712">larger blogging conversation</a>.
I recommend reading that summary,
and the excellent linked posts by
<a href="https://www.baldurbjarnason.com/notes/2025/now-im-disappointed/">Baldur Bjarnason</a>
and <a href="https://css-irl.info/debating-the-merits-of-llms/">Michelle Barker</a>.</p>
<p>I find it particularly troubling
the way we talk about current harms of current technology
as <em>temporary and therefor insignificant</em> –
as though something being “solvable”
means that it’s basically solved already,
and we shouldn’t worry about it.
The logic seems so <a href="https://adactio.com/journal/21405">obviously backwards to me</a>.
Solve the problems first,
if they are so easily solvable.</p>
<p>This is often used to dismiss the current energy use of LLMs,
but also a common rhetorical trick of CEOs
as they lay off their workforce.
Don’t worry,
your current unemployment could someday be solved
with a <em>universal basic income</em>.
Please ignore the harms of capitalism
<em>as we weaponize it against you</em> –
because <em>socialism could eventually make it better</em>!</p>
<p>And yet (<em>surprise!</em>) when the tech titans
take over government institutions,
they don’t seem to have much interest for
improving social safety nets.
It’s almost (almost) like their goal
is to <em>weaken</em> the bargaining power of labor,
and they don’t consider this a flaw in the first place.</p>
<p>In our marketing-department imagined future
of a new technology
all harms will somehow disappear (details TBD),
but the potential benefits are endless and extraordinary.
We could cure cancer!
But are any of the AI companies
trying to cure cancer,
as a primary goal of their work?
Well, no…</p>
<p><em>Step 2 may be actively harmful,
and step 3 might be perpetually absent,
but the <a href="https://front-end.social/@mia/114004360489192892">profit described by step 4 is undeniable</a>.
Critics always lack the proper imagination.</em></p>
<hr class="footnotes-sep" />
<section class="footnotes">
<ol class="footnotes-list">
<li id="fn1" class="footnote-item"><p>Hashtag Not All Billionaires, or whatever.
I chose this language,
because I’m feeling vulnerable and upset –
and because it reflects what I see
when I look at the <em>longtermist</em>
and <em>pro-natalist</em>
and <em>ultra-utilitarian</em> comments and actions
of many AI-backers,
and their ties to <em>rationalist</em> (lol) forums.
I’m not the first one to suggest that
there’s <a href="https://www.truthdig.com/articles/nick-bostrom-longtermism-and-the-eternal-return-of-eugenics-2/">a hint of eugenics</a>
in the way these LLM-as-AI-enthusiasts
talk about their techno-utopian dreams.</p>
<p>I understand it is not always productive
to rely on the strongest and least nuanced terms available.
I imagine <em>some</em> of the billionaires involved
are primarily in it for the money, actually.
But that seems like distinction
with very little difference to me,
especially as it relates to <em>how I feel about this moment</em>.
Even without citing <em>eugenics-per-se</em>,
I remain opposed to their project,
and the documented exploitations at every step.</p>
<p>Anyway, this is a journal entry,
not an explainer on billionaire ideologies. <a href="https://www.miriamsuzanne.com/2025/02/12/tech-ai-wtf/#fnref1" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section>
Aggregating my distributed self
2024-09-22T00:00:00Z
https://www.miriamsuzanne.com/2024/09/22/agregate-self/
<p>Most of the content on this site
is an aggregate view
of my work in other venues.
How do I want to manage that process
going forward?</p>
<p>Where does all this content belong?</p>
<p>Most of the content on this site
is an aggregate view
of my work in other venues.
How do I want to manage that process
going forward?</p>
<p>It’s 2024,
and I’m including this post
in a series called <code>redesign 2022</code>.
That’s when I ripped out all the styles on my site,
and declared <a href="https://www.miriamsuzanne.com/2022/08/07/minimal/">my intent to renovate</a>
<em>with a light touch</em>.</p>
<blockquote>
<p>How much can I change,
<em>without moving any of the walls</em>?</p>
<p>—Me, 2022</p>
</blockquote>
<p>But the walls got in my way.
Instead of minimal renovation,
I got just far enough to <em>live with it</em>
and then started a brand new <a href="https://www.11ty.dev/">Eleventy</a> repo.</p>
<p>The plan was to prototype over there,
and bring back well-formed solutions.
To <a href="https://daverupert.com/tag/prototyping">echo Dave Rupert</a>,
prototyping is useful.
It’s easier to play with new ideas
when you’re not carrying a decade of content
and old code along with you.</p>
<p>But <em>prototyping</em> evolved into
what I would call <em>tinkering</em> (complimentary).
Maybe I mean <em>procrastinating</em> (also complimentary),
but it’s a wandering process
that also helps me better understand
what I <em>want</em> from a website.
I might not make visible progress over two years,
but I start to form a <em>point of view</em>:</p>
<ol>
<li>I want <em>minimal site furniture</em>,
and a focus on only what’s essential (usually text).
What is the least navigation required,
and can I move it out of the way?
How simple can I keep the layout?</li>
<li>I want <em>maximum style customization</em>.
Not just a theme picker,
but as many user controls
and interactions as possible –
from useful to playful to absurd.</li>
<li>I want content maintenance to <em>feel easy</em>.
Right now it feels <em>redundant</em>.</li>
</ol>
<p>Keeping things easy is
always where things get complicated.
And it brings me back to where my redesign started –
a desire to
<a href="https://www.miriamsuzanne.com/2022/08/07/minimal/#clarify-the-information-architecture">clarify the information architecture</a>.
Not only for visitors,
but for myself.</p>
<h2 id="the-objects-of-my-web-desire-(again)" tabindex="-1">The objects of my web desire (again)</h2>
<p>I’m still thinking about roughly the same
<a href="https://www.miriamsuzanne.com/2022/08/25/content/">content types I’ve discussed before</a>,
though maybe the boundaries have become
slightly more clear.</p>
<p>First, there are <em>posts</em>.
Short or long,
posts always have a date & time attached.
They are active,
part of a <em>feed</em>,
and might appear in an RSS reader.</p>
<p>Then there are <em>projects</em>, maybe –
the things I’m doing.
But that’s too broad.
Let’s break it down:</p>
<ul>
<li>Sometimes I do <em>events</em>
where I speak, or teach a workshop,
or perform.
Events happen at a time and place.</li>
<li>Sometimes I create <em>artifacts</em>
like a book or an album, a website, or specification.
Artifacts often have a home URL.
They might have a launch date,
but they are not date-specific.</li>
<li>Some of my projects are <em>other channels</em>
with their own feeds,
their own events and artifacts.</li>
<li>Those channels are often maintained by
an <em>organization</em> that I work with long-term.
A band, a web agency, a performance company, etc.</li>
</ul>
<p>These boundaries aren’t always clean.
A post that remains relevant
could be considered an artifact.
Events can generate artifacts, and vice versa.
An entire organization might exist to
curate a single channel.</p>
<p>But all these projects tend to exist <em>elsewhere</em>.
Adding them to my website, even in advance,
is an <em>archival</em> act –
documenting that the event,
artifact, channel, or organization exists off-site.</p>
<h2 id="what-belongs-in-the-feed%3F" tabindex="-1">What belongs in the feed?</h2>
<p>Posts are simple enough to simplify.
The web is littered with <em>what’s on your mind</em> text-areas.
Hit <em>publish</em>, and the date becomes
not just a sorting mechanism,
but an ID, a URL slug, and a placeholder title.
My layout should allow for more,
but not rely on anything beyond a bit of text.</p>
<p>As part of my desire to prioritize
page content over site furniture,
I’m also leaning into my ‘cold open’ design –
with a small content block
that comes before the title & credits roll.
For a short post,
would I put the entire contents up-front?
I think so.</p>
<p>Right now,
I’m re-purposing
a <code>summary</code> field in my YAML front-matter
to split out that pre-title content.
But that doesn’t feel accurate to the purpose.
Maybe I can use
an HTML comment as the divider?
Then it all goes cleanly into an RSS feed,
but I can splice a header in
for my own purposes.</p>
<p>I also want to think
about what happens to posts over time.
Some remain relevant,
becoming a sort of artifact.
Do I need a way to promote them?
Other posts becomes less relevant, even obsolete.
Maybe they can be <em>unlisted</em>,
so the URL remains (cooly) in place
but not linked from anywhere.</p>
<h2 id="what-belongs-in-the-archive%3F" tabindex="-1">What belongs in the archive?</h2>
<p>It’s possible to have artifacts
that originate here,
but most of the ‘archive’ is aggregated from off-site activity –
often with a more ‘canonical’ online home.
Conference talks are announced on the conference website,
theater productions on the Grapefruit Lab site,
albums on the Teacup Gorilla site,
specs live on the W3C servers,
even my novel has it’s own URL.</p>
<p>At their most basic,
these things can all be represented
by a name and URL –
with dates that are more or less essential
depending on the type of project.</p>
<p>So the eternal question is:
how much do I duplicate in my own archive?</p>
<ul>
<li>At one extreme,
I can re-post the entire contents –
articles, videos, music embeds, event details –
with <code>canonical</code> metadata pointing to the original.
Each archival item gets a document in my repo,
and a URL on here in the archive,
in addition to any off-site links.
That’s where things start to feel like busy work,
redundant.</li>
<li>On the other extreme,
the archives can be simple data structures
slotted into the Eleventy ‘data cascade’
wherever I see fit.</li>
</ul>
<p>In either case,
there’s a question of detail.
Do I link to channels and organizations as a whole
and leave it at that,
or do I link to each article I post
on the OddBird blog,
each <em>Winging It</em> live stream,
each spec and explainer for the CSS Working Group,
each album, conference, and production?</p>
<p>All those things can be found
on other websites.
The purpose of having them here
is only to aggregate my sprawling work
in a single location.</p>
<p>Is that useful?
For me or for you?
Is it interesting, apart from any utility?</p>
<h2 id="a-first-pass" tabindex="-1">A first pass</h2>
<p>At a high level, I’m thinking:</p>
<ul>
<li>List all the items in yaml data, with links off site</li>
<li>Group the items onto index pages by channel when useful</li>
<li>Don’t duplicate the details, that’s what links are for</li>
</ul>
<p>In practice, that means:</p>
<ul>
<li>Organizations and channels get their own pages</li>
<li>Those pages act as tag-list pages for related posts,
and home for relevant offsite links</li>
<li>Artifacts & events start as data/links,
and only get promoted to page status
if a tag page would be useful
to group multiple related items</li>
</ul>
A web component for CodePen embeds?
2024-09-09T00:00:00Z
https://www.miriamsuzanne.com/2024/09/09/embed-pen/
<p>David Darnes
already made
<a href="https://darn.es/code-pen-web-component/">a <code>&lt;code-pen&gt;</code> web component</a>.
It’s great.
It takes code,
and creates a pen from that code.
But I don’t want to create a pen,
I want to embed one.</p>
<p>It’s not essential, but it took me down a path…</p>
<p>David Darnes
already made
<a href="https://darn.es/code-pen-web-component/">a <code><code-pen></code> web component</a>.
It’s great.
It takes code,
and creates a pen from that code.
But I don’t want to create a pen,
I want to embed one.</p>
<p>The default CodePen embed is pretty good already.
So right from the start,
this whole project is unnecessary.
The code looks like this:</p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>codepen<span class="token punctuation">"</span></span> <span class="token attr-name">data-slug-hash</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>BEvjbm<span class="token punctuation">"</span></span> <span class="token attr-name">data-height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>600<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> CodePen Demo:<br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://codepen.io/miriamsuzanne/pen/BEvjbm<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> CSS-only 'mixin'<br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>script</span> <span class="token attr-name">async</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://static.codepen.io/assets/embed/ei.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>script</span><span class="token punctuation">></span></span></code></pre>
<p>There are other optional attributes,
but those are the essentials in my experience.
You can put anything you want inside the paragraph,
since the entire element is getting replaced.</p>
<p>To my eye,
that’s a custom element waiting to happen.
And I had a few small adjustments in mind:</p>
<ul>
<li>The pen <code>data-slug-hash</code> could be extracted from the link</li>
<li>If we provide the height in CSS,
we can use it to avoid layout shift?</li>
</ul>
<p>I’m not sure it’s enough to make this worthwhile,
but it was enough for me to create
<a href="https://codepen.io/miriamsuzanne/pen/JjQxzYR?editors=1010">a new pen</a>
and start playing around.</p>
<p>With the first draft,
my fancy new embed looks like this:</p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>embed-pen</span> <span class="token special-attr"><span class="token attr-name">style</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token value css language-css"><span class="token property">height</span><span class="token punctuation">:</span> 600px</span><span class="token punctuation">"</span></span></span><span class="token punctuation">></span></span><br /> CodePen Demo:<br /> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://codepen.io/miriamsuzanne/pen/BEvjbm<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /> CSS-only 'mixin'<br /> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>embed-pen</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>script</span> <span class="token attr-name">async</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://static.codepen.io/assets/embed/ei.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>script</span><span class="token punctuation">></span></span></code></pre>
<p>Ok, so not much has changed.
But it works!
Here it is, doing the thing:</p>
<embed-pen style="height: 600px">
CodePen Demo:
<a href="https://codepen.io/miriamsuzanne/pen/BEvjbm">
An embed-pen web web component
</a>
</embed-pen>
<script src="https://codepen.io/miriamsuzanne/pen/JjQxzYR.js"></script>
<script async="" src="https://static.codepen.io/assets/embed/ei.js"></script>
<p>If I was to flesh this out,
I think:</p>
<ul>
<li>The custom element should stick around,
instead of becoming <code>div.cp_embed_wrapper</code></li>
<li>The <code>embed/ei.js</code> logic should be part of the element definition,
not a separate script</li>
</ul>
<p>Along the way,
I learned that the <code>height</code> attribute
is only allowed on specific elements,
which is why I had to use the <code>style</code> attribute instead.
One of those elements is the <code>iframe</code>.</p>
<p>Looking closer,
the <a href="https://blog.codepen.io/documentation/embedded-pens/">CodePen Embed docs</a>
demonstrate using an <code>iframe</code> from the start,
if you need to avoid JS:</p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>iframe</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://codepen.io/miriamsuzanne/embed/BEvjbm<span class="token punctuation">"</span></span> <span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>600<span class="token punctuation">"</span></span> <span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>100%<span class="token punctuation">"</span></span> <span class="token attr-name">loading</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>lazy<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>iframe</span><span class="token punctuation">></span></span></code></pre>
<iframe src="https://codepen.io/miriamsuzanne/embed/BEvjbm" height="600" width="100%" loading="lazy"></iframe>
<p>Well that sure gets right to the point.
Maybe that’s all I need?
I don’t feel like I’m losing essential behavior, here.
All the parameters are still available via the URL.</p>
We don't need a boss, we need a process
2024-08-08T00:00:00Z
https://www.miriamsuzanne.com/2024/08/08/vision/
<p>Robin says
<a href="https://robinrendle.com/notes/design-aint-a-democracy/">design ain’t a democracy</a>,</p>
<blockquote>
<p>great design can only thrive
with a dictator/director</p>
</blockquote>
<p>I aim to push back</p>
<p>(and our team will probably need some training)</p>
<p>Robin says
<a href="https://robinrendle.com/notes/design-aint-a-democracy/">design ain’t a democracy</a>,</p>
<blockquote>
<p>great design can only thrive
with a dictator/director</p>
</blockquote>
<p>I aim to push back</p>
<p>Everyone can agree that
<em>design by committee</em> usually fails.
But it’s not because
there are multiple people involved,
it’s because (most) <em>committees</em>
are not made up of skilled collaborators
with a shared vision and process.</p>
<p>Shared vision and collaborative process
don’t <em>just happen</em>
when good developers sit around a table.
Like anything else,
collaborative art and design
are skills that people learn and practice.
We have to exercise new muscles,
not usually covered by
a developer bootcamp
or design school.
The process can have a lot in common
with <em>agile</em> approaches,
but it’s a different set of skills
from collaborating on a codebase.</p>
<p>Skills we can learn.
But skills we won’t have
unless we study and practice.</p>
<p>Or we can skip all that
and get one person to make all the decisions.
That’s an option,
but it’s not <em>the only way</em>.
It’s just the way most of us were taught.</p>
<p>I’m not saying this theoretically.
Not all theaters or bands
are collaborative, but many are –
and there are long traditions
around ‘devised’ or ‘ensemble’ theater in particular.
Learning to <em>write plays</em> or <em>act in them</em>
does not prepare you to devise with an ensemble,
but there are many people who do
study, learn, practice, document and teach those skills.</p>
<p>(In fact, it’s what I’ve spent most of my life doing,
with occasional CSS distractions)</p>
<p>But I suppose Robin is right that
even good collaboration
generally <em>ain’t a democracy</em>.
It’s more involved and messy than voting,
or tallying a majority opinion.
It requiring deep engagement,
and shared ownership of a vision.
Let’s call it anarchist, maybe,
with an emphasis on mutual aid?</p>
<p>Creative collaboration
requires effort, argument, trust, and play.
The ability to fight for an idea,
and then let it go.
To be open, and then decisive.
Knowing when to work together,
and when to work apart.
Cycles of action, reaction, reflection, etc.</p>
<p>Developers have excellent tools for that last bit –
working together, while apart.
Many artists would benefit from something like GitHub.
These skills are not entirely unrelated.
But they’re also not directly equivalent.</p>
<p>I don’t remember the source,
but at some point I learned
that ‘brainstorming’ tends to fail
because the strength of collaboration
comes from <em>pushing back</em>.
Not off-hand rejection,
shooting ideas down –
but honing our ideas
by articulating what makes them work or fail.</p>
<p>What we like about a dictator
is that they have a vision,
and set the process,
and take the responsibility
to be decisive when necessary.
But it’s not impossible for us to do that together,
if we learn how to hold a strong vision collectively.</p>
<p>We must become a team,
united against our work.
Our job, together,
is to hone and curate that work
towards the exclusive vision
through continuous questioning and articulation.</p>
<p>We define a vision by the choices we make,
and we clarify that vision by the choices we reject.</p>
<p>(Now I want to re-read Anne Bogart’s
<a href="https://bookshop.org/p/books/a-director-prepares-seven-essays-on-art-and-theatre-anne-bogart/21516283?ean=9780415238328">A Director Prepares</a>,
and
<a href="https://bookshop.org/p/books/the-viewpoints-book-a-practical-guide-to-viewpoints-and-composition-anne-bogart/10486980?ean=9781559362412">The Viewpoints Book</a>)</p>
Eleventy Buckets & Cascade Layers
2024-07-06T00:00:00Z
https://www.miriamsuzanne.com/2024/07/06/buckets-layers/
<p>Solving a problem I created</p>
<p>I’m re-working this site from scratch –
sticking with <a href="https://www.11ty.dev/">Eleventy</a>,
but moving from
<a href="https://www.11ty.dev/docs/languages/nunjucks/">Nunjucks</a> templates/macros
to <a href="https://www.11ty.dev/docs/languages/webc/">WebC</a>
and web components.
Outside of static-site templates,
one goal of this refresh
is to keep things as ‘vanilla’ as possible.</p>
<p>This isn’t some purist stance on my part.
There are a lot of great tools
that we recommend to clients every day.
But this is my personal site,
and a place to experiment.
<em>What happens when I let go
of all the tools that I’m used to,
and rely entirely on the web platform?</em></p>
<p>Along the way,
I’m trying to find the best pattern
for organizing my CSS into Cascade Layers.
Layering can be done within a file,
using the <code>@layer <name> { … }</code> rule block,
or it can be done with a <code>layer(<name>)</code> function
on-import.
I prefer the latter
for my top-level layers, because:</p>
<ul>
<li>The layering can happen in one central place</li>
<li>Renaming and reordering is more more flexible</li>
<li>There’s less nesting in the CSS files</li>
</ul>
<p>A few other rough criteria
for how I write CSS:</p>
<ul>
<li>Component-specific styles
can be embedded in
‘single file components’ (WebC handles this well),
but <em>most of my CSS</em> will be global</li>
<li>I like the global styles split into ‘partials’,
so it’s not all one long document<sup class="footnote-ref"><a href="https://www.miriamsuzanne.com/2024/07/06/buckets-layers/#fn1" id="fnref1">[1]</a></sup></li>
<li>Each partial will be assigned
to a cascade layer</li>
</ul>
<p>Without any build steps,
I get an HTML <code><head></code>
that contains something like:</p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>style</span> <span class="token attr-name"><span class="token namespace">webc:</span>keep</span><span class="token punctuation">></span></span><span class="token style"><span class="token language-css"><br /> <span class="token atrule"><span class="token rule">@layer</span> reset<span class="token punctuation">,</span> config<span class="token punctuation">,</span> default<span class="token punctuation">,</span> layout<span class="token punctuation">,</span> component<span class="token punctuation">,</span> utility<span class="token punctuation">;</span></span><br /><br /> <span class="token atrule"><span class="token rule">@import</span> <span class="token url"><span class="token function">url</span><span class="token punctuation">(</span><span class="token string url">'/css/reset.css'</span><span class="token punctuation">)</span></span> <span class="token function">layer</span><span class="token punctuation">(</span>reset<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br /><br /> <span class="token atrule"><span class="token rule">@import</span> <span class="token url"><span class="token function">url</span><span class="token punctuation">(</span><span class="token string url">'/css/config/colors.css'</span><span class="token punctuation">)</span></span> <span class="token function">layer</span><span class="token punctuation">(</span>config<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br /> <span class="token atrule"><span class="token rule">@import</span> <span class="token url"><span class="token function">url</span><span class="token punctuation">(</span><span class="token string url">'/css/config/sizes.css'</span><span class="token punctuation">)</span></span> <span class="token function">layer</span><span class="token punctuation">(</span>config<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br /><br /> <span class="token atrule"><span class="token rule">@import</span> <span class="token url"><span class="token function">url</span><span class="token punctuation">(</span><span class="token string url">'/css/default/type.css'</span><span class="token punctuation">)</span></span> <span class="token function">layer</span><span class="token punctuation">(</span>default<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br /> <span class="token atrule"><span class="token rule">@import</span> <span class="token url"><span class="token function">url</span><span class="token punctuation">(</span><span class="token string url">'/css/default/links.css'</span><span class="token punctuation">)</span></span> <span class="token function">layer</span><span class="token punctuation">(</span>default<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br /> <span class="token atrule"><span class="token rule">@import</span> <span class="token url"><span class="token function">url</span><span class="token punctuation">(</span><span class="token string url">'/css/default/buttons.css'</span><span class="token punctuation">)</span></span> <span class="token function">layer</span><span class="token punctuation">(</span>default<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br /> <span class="token atrule"><span class="token rule">@import</span> <span class="token url"><span class="token function">url</span><span class="token punctuation">(</span><span class="token string url">'/css/default/forms.css'</span><span class="token punctuation">)</span></span> <span class="token function">layer</span><span class="token punctuation">(</span>default<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br /> <span class="token atrule"><span class="token rule">@import</span> <span class="token url"><span class="token function">url</span><span class="token punctuation">(</span><span class="token string url">'/css/default/media.css'</span><span class="token punctuation">)</span></span> <span class="token function">layer</span><span class="token punctuation">(</span>default<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br /> <span class="token atrule"><span class="token rule">@import</span> <span class="token url"><span class="token function">url</span><span class="token punctuation">(</span><span class="token string url">'/css/default/blocks.css'</span><span class="token punctuation">)</span></span> <span class="token function">layer</span><span class="token punctuation">(</span>default<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br /><br /> <span class="token atrule"><span class="token rule">@import</span> <span class="token url"><span class="token function">url</span><span class="token punctuation">(</span><span class="token string url">'/css/layout/page.css'</span><span class="token punctuation">)</span></span> <span class="token function">layer</span><span class="token punctuation">(</span>layout<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br /> <span class="token atrule"><span class="token rule">@import</span> <span class="token url"><span class="token function">url</span><span class="token punctuation">(</span><span class="token string url">'/css/layout/nav.css'</span><span class="token punctuation">)</span></span> <span class="token function">layer</span><span class="token punctuation">(</span>layout<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br /> <span class="token atrule"><span class="token rule">@import</span> <span class="token url"><span class="token function">url</span><span class="token punctuation">(</span><span class="token string url">'/css/layout/header.css'</span><span class="token punctuation">)</span></span> <span class="token function">layer</span><span class="token punctuation">(</span>layout<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br /> <span class="token atrule"><span class="token rule">@import</span> <span class="token url"><span class="token function">url</span><span class="token punctuation">(</span><span class="token string url">'/css/layout/main.css'</span><span class="token punctuation">)</span></span> <span class="token function">layer</span><span class="token punctuation">(</span>layout<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br /> <span class="token atrule"><span class="token rule">@import</span> <span class="token url"><span class="token function">url</span><span class="token punctuation">(</span><span class="token string url">'/css/layout/footer.css'</span><span class="token punctuation">)</span></span> <span class="token function">layer</span><span class="token punctuation">(</span>layout<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br /><br /> <span class="token atrule"><span class="token rule">@import</span> <span class="token url"><span class="token function">url</span><span class="token punctuation">(</span><span class="token string url">'/css/utility/a11y.css'</span><span class="token punctuation">)</span></span> <span class="token function">layer</span><span class="token punctuation">(</span>utility<span class="token punctuation">)</span><span class="token punctuation">;</span></span><br /></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>style</span><span class="token punctuation">></span></span></code></pre>
<p>The component styles are missing from that global list.
CSS is designed to be global,
and the best way to write minimal CSS
(in my experience)
is to focus more on <em>reusable patterns</em>
over <em>individual components</em>.
So I don’t expect much to end up
in our component layer,
but there’s always something.
We can access those styles
as a <a href="https://www.11ty.dev/docs/languages/webc/#asset-bundling">WebC asset bundle</a>:</p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>style</span> <span class="token attr-name"><span class="token namespace">webc:</span>keep</span><br /> <span class="token attr-name">@raw</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>`@import url(${getBundleFileUrl(<span class="token punctuation">'</span>css<span class="token punctuation">'</span>)}) layer(component);`<span class="token punctuation">"</span></span><br /><span class="token punctuation">></span></span><span class="token style"></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>style</span><span class="token punctuation">></span></span></code></pre>
<p>I love that there’s
very little build-time <em>magic</em> involved!
Still, that’s a whole wall of imports,
and I have a decades-old flinch reflex
when I see that.
Should I be worried?</p>
<h2 id="am-i-creating-performance-issues%3F" tabindex="-1">Am I creating performance issues?</h2>
<p>I’m not a performance expert,
so I <a href="https://front-end.social/@mia/112741641485635928">asked mastodon</a>,
and got a generally
<a href="https://gomakethings.com/modular-css-and-different-ways-to-structure-your-stylesheets/">positive but mixed</a>
response.</p>
<p>It might not be <em>the best</em> performance,
but (with HTTP 2/3) it shouldn’t be bad.
My personal site doesn’t need
<em>eXtreme optimization</em>,
so that might be good enough for me?
I’ll probably ship it,
and find out.</p>
<p>Still,
I know
<a href="https://csswizardry.com/2023/10/the-three-c-concatenate-compress-cache/">the first step in optimizing CSS</a>
is to <em>concatenate</em> –
so I did explore a few approaches
along the way,
which could work if I need them.</p>
<h2 id="sass-can-load-css-into-layers" tabindex="-1">Sass can <code>load-css</code> into layers</h2>
<p>In the past, I’ve used <a href="https://sass-lang.com/">Sass</a>.
I like Sass a lot.
In Sass,
I concatenate and layer the partials
using <code>meta.load-css()</code>
in my primary Sass file:</p>
<pre class="language-scss"><code class="language-scss"><span class="token keyword">@use</span> <span class="token string">'sass:meta'</span><span class="token punctuation">;</span><br /><br /><span class="token atrule"><span class="token rule">@layer</span> reset</span> <span class="token punctuation">{</span><br /> <span class="token atrule"><span class="token rule">@meta</span>.<span class="token function">load-css</span><span class="token punctuation">(</span><span class="token string">'reset'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><br /><br /><span class="token rule">@layer</span> config</span> <span class="token punctuation">{</span><br /> @meta.<span class="token function">load-css</span><span class="token punctuation">(</span><span class="token string">'config/colors'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /> @meta.<span class="token function">load-css</span><span class="token punctuation">(</span><span class="token string">'config/sizes'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br /><span class="token punctuation">}</span><br /><br /><span class="token comment">// etc.</span></code></pre>
<p>That works pretty well.
It’s what I’ve been doing on this site
ever since I originally added layers.</p>
<p>But if I’m not using Sass for anything else,
maybe I can avoid the dependency altogether?</p>
<h2 id="when-in-eleventy%2C-do-as-the-eleventies-do" tabindex="-1">When in Eleventy, do as the Eleventies do</h2>
<p>(Eleventines? Eleventonians?)</p>
<p>I’m already using WebC,
which provides <em>asset bundling</em>.
I’ve already used that feature (above)
to concatenate individual component styles.
That compiles all the CSS
into one bundle,
and all the JS into another
(unless you opt-out with <code>webc:keep</code>).
Those bundles are available
as either raw output
or external files:</p>
<pre class="language-html"><code class="language-html"><span class="token comment"><!-- direct output --></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>style</span> <span class="token attr-name">@raw</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>getBundle(<span class="token punctuation">'</span>css<span class="token punctuation">'</span>)<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">webc:</span>keep</span><span class="token punctuation">></span></span><span class="token style"></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>style</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>script</span> <span class="token attr-name">@raw</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>getBundle(<span class="token punctuation">'</span>js<span class="token punctuation">'</span>)<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">webc:</span>keep</span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>script</span><span class="token punctuation">></span></span><br /><br /><span class="token comment"><!-- external files output --></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>link</span> <span class="token attr-name">:href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>getBundleFileUrl(<span class="token punctuation">'</span>css<span class="token punctuation">'</span>)<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">webc:</span>keep</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>style</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>script</span> <span class="token attr-name">:src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>getBundleFileUrl(<span class="token punctuation">'</span>js<span class="token punctuation">'</span>)<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">webc:</span>keep</span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>script</span><span class="token punctuation">></span></span></code></pre>
<p>But you can take that even further
with <em>asset bucketing</em> –
assigning <code><style></code>, <code><link></code>, or <code><script></code> tags
to individually named CSS or JS buckets:</p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>style</span> <span class="token attr-name"><span class="token namespace">webc:</span>bucket</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>good<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token style"><span class="token language-css"><span class="token comment">/* … */</span></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>style</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>link</span> <span class="token attr-name"><span class="token namespace">webc:</span>bucket</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>bad<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>terrible.css<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span> <span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>style</span> <span class="token attr-name"><span class="token namespace">webc:</span>bucket</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>bad<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token style"><span class="token language-css"><span class="token comment">/* … */</span></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>style</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>style</span> <span class="token attr-name"><span class="token namespace">webc:</span>bucket</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>ugly<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token style"><span class="token language-css"><span class="token comment">/* … */</span></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>style</span><span class="token punctuation">></span></span></code></pre>
<p>And each bucket will get bundled up individually:</p>
<pre class="language-html"><code class="language-html"><span class="token comment"><!-- just the bad styles --></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>style</span> <span class="token attr-name">@raw</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>getBundle(<span class="token punctuation">'</span>css<span class="token punctuation">'</span>, <span class="token punctuation">'</span>bad<span class="token punctuation">'</span>)<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">webc:</span>keep</span><span class="token punctuation">></span></span><span class="token style"></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>style</span><span class="token punctuation">></span></span></code></pre>
<p>Are you thinking what I’m thinking?
Probably. It’s the title of the post.</p>
<p><strong>Bundles let you concatenate CSS partials,
and buckets let you group them as needed.
That’s what I’m trying to do.</strong></p>
<p>My CSS partials are external stylesheets,
not attached to any particular WebC component,
so first I have to pull them into buckets.
I can do that with <code><link></code> tags in the header:</p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>link</span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>../../_css/reset.css<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">webc:</span>bucket</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>reset<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>link</span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>../../_css/config/colors.css<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">webc:</span>bucket</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>config<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>link</span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>../../_css/config/sizes.css<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">webc:</span>bucket</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>config<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>link</span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>../../_css/config/fonts.css<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">webc:</span>bucket</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>config<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><br /><span class="token comment"><!-- etc --></span></code></pre>
<p>Since I’m using <code>webc:bucket</code> and not <code>webc:keep</code>,
these <code><link></code> tags won’t appear in the HTML output.
But now I have my buckets.</p>
<p>Since I’m interested in layering the buckets ‘on import’,
I’ll need to generate external stylesheets.
And since layering is
<a href="https://css.oddbird.net/layers/link-layer/">not yet possible with the <code><link></code> tag</a>,
I’ll need to use <code>@import</code> rules instead.
WebC makes that simple enough,
using JS template tags.
These, I’ll keep around:</p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>style</span><br /> <span class="token attr-name"><span class="token namespace">webc:</span>keep</span><br /> <span class="token attr-name">@raw</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>`@import url(${getBundleFileUrl(<span class="token punctuation">'</span>css<span class="token punctuation">'</span>, <span class="token punctuation">'</span>reset<span class="token punctuation">'</span>)}) layer(reset);`<span class="token punctuation">"</span></span><br /><span class="token punctuation">></span></span><span class="token style"></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>style</span><span class="token punctuation">></span></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>style</span><br /> <span class="token attr-name"><span class="token namespace">webc:</span>keep</span><br /> <span class="token attr-name">@raw</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>`@import url(${getBundleFileUrl(<span class="token punctuation">'</span>css<span class="token punctuation">'</span>, <span class="token punctuation">'</span>config<span class="token punctuation">'</span>)}) layer(config);`<span class="token punctuation">"</span></span><br /><span class="token punctuation">></span></span><span class="token style"></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>style</span><span class="token punctuation">></span></span><br /><span class="token comment"><!-- etc --></span></code></pre>
<p>We can simplify that even more,
using <a href="https://www.11ty.dev/docs/languages/webc/#webcfor-loops"><code>webc:for</code> loops</a>.
I don’t know if there’s a way
to access the list of buckets in WebC,
so (for now) I’ve just added some front-matter data.
While I’m at it,
I’ll use that data to define my layer order up-front:</p>
<pre class="language-html"><code class="language-html"><span class="token comment"><!-- <style>@layer reset, config, default, etc;</style> --></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>style</span><br /> <span class="token attr-name"><span class="token namespace">webc:</span>keep</span><br /> <span class="token attr-name">@raw</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>`@layer ${($data.layers).join(<span class="token punctuation">'</span>, <span class="token punctuation">'</span>)};`<span class="token punctuation">"</span></span><br /><span class="token punctuation">></span></span><span class="token style"></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>style</span><span class="token punctuation">></span></span><br /><br /><span class="token comment"><!-- <style>@import url('bucket-name.css') layer(bucket-name);</style> --></span><br /><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>style</span><br /> <span class="token attr-name"><span class="token namespace">webc:</span>keep</span><br /> <span class="token attr-name"><span class="token namespace">webc:</span>for</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>layer of ($data.layers)<span class="token punctuation">"</span></span><br /> <span class="token attr-name">@raw</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>`@import url(${getBundleFileUrl(<span class="token punctuation">'</span>css<span class="token punctuation">'</span>, layer)}) layer(${layer});`<span class="token punctuation">"</span></span><br /><span class="token punctuation">></span></span><span class="token style"></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>style</span><span class="token punctuation">></span></span></code></pre>
<p>That’s it!
Not quite as compact
as the other two approaches,
but it’s close –
and it works great,
without any extra dependencies.</p>
<p>I might be able to simplify that even further
with <a href="https://www.11ty.dev/docs/languages/webc/#using-javascript-to-generate-content"><code>webc:type='js'</code></a>,
but I’ll cross that bridge
if I decide that concatenation is
worth the effort.</p>
<hr class="footnotes-sep" />
<section class="footnotes">
<ol class="footnotes-list">
<li id="fn1" class="footnote-item"><p>Back in the late <em>aughts</em>
and early 2010s,
I was a big fan of CSSEdit
(now part of <a href="https://espressoapp.com/">Espresso</a>, I believe).
One of the best features was viewing
a single massive CSS file
<em>as though it contained many smaller folders</em>.
Maybe I should go back to that approach,
or even back to that specific app? <a href="https://www.miriamsuzanne.com/2024/07/06/buckets-layers/#fnref1" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section>
A Slash-Why Proposal
2024-07-02T00:00:00Z
https://www.miriamsuzanne.com/2024/07/02/slash-why/
<p>Get yourself
a fancy little
manifesto page,
and tell us all
what you’re about.</p>
<p>What are you aiming for?</p>
<p>Get yourself
a fancy little
manifesto page,
and tell us all
what you’re about.</p>
<p>I’m working on a personal site refresh,
oh so slowly.
Part of the process has been
considering what slash pages I have or want.</p>
<p>Robb Knight has a great list of ideas
over at <a href="https://slashpages.net/">slashpages.net</a></p>
<p>But there’s one I’ve had for a decade,
that I think others might consider adding:
<a href="https://www.miriamsuzanne.com/why">/why</a>.</p>
<p>It’s an opportunity
to say what you care about,
what <a href="https://www.miriamsuzanne.com/2023/12/31/23-24/">direction</a> you’re heading,
and how you hope to exist in the world.
A <em>minifesto</em> on the purpose of your site,
or your work.</p>
<p>Mine could use an update,
but here’s the current state:
<em><a href="https://www.miriamsuzanne.com/why">Notes Towards a More Queer Art (and a more humane technology)</a></em></p>
User Styles
2024-01-24T00:00:00Z
https://www.miriamsuzanne.com/2024/01/24/have-preferences/
<p>You’re allowed to have preferences.
Set your preferences.</p>
<p>You’re allowed to have preferences.
Set your preferences.</p>
<p>I’ve been playing with user styles.</p>
<p>Not like fancy site-specific styles,
just setting the defaults that I want.
Slightly larger text,
nicer fallback fonts, etc. Why not?</p>
<ul>
<li><strong>Firefox</strong>/Gecko:
<code>about:preferences</code> (GUI)</li>
<li><strong>Chrome</strong>/Blink:
<code>chrome://settings/appearance</code> (GUI)</li>
<li><strong>Safari</strong>/WebKit: go to…
<code>Settings / Advanced / Style sheet…</code>
(you’ll need to write CSS)</li>
</ul>
<p>As a developer
I worry about seeing
something different
than what other people will see
by default.
But then I think:
that’s the whole point, right?
We should be mindful of that anyway.</p>
<p>What do you want the default web to look like?</p>
Custom Element, Two ways
2024-01-24T00:00:00Z
https://www.miriamsuzanne.com/2024/01/24/el-2-ways/
<p>Sometimes I build
a custom element,
and then I have second thoughts about it.</p>
<p>Sometimes I build
a custom element,
and then I have second thoughts about it.</p>
<ul>
<li><code style="--swatch:hotpink">hotpink</code></li>
<li><code><color-tile>teal</color-tile></code></li>
<li><code style="--swatch:#22f6">#22f6</code></li>
<li><code><color-tile>#f226</color-tile></code></li>
</ul>
<p>The first is just
a clever use of CSS.
The second (‘real’) custom element
simplifies the markup,
but adds a JS dependency.
The markup:</p>
<ul>
<li><code><code style="--swatch:hotpink">hotpink</code></code></li>
<li><code><color-tile>teal</color-tile></code></li>
</ul>
<p>Maybe that small syntax improvement
is a job for
<em>HTML templating</em>,
rather than a custom element?</p>
<p>If we had support
for the full <code>attr()</code> function
in CSS,
we could simplify
the CSS markup.
Now it’s a custom attribute,
instead of a custom element:</p>
<ul>
<li><code><code color-tile="hotpink">hotpink</code></code></li>
</ul>
<p>Down the road
I can imagine more
interactive features
for the component.
That could sway things
towards use of JS.
But still –
is it a custom element?
I’m not sure.</p>
<p>What do you think?</p>
<figure>
<div data-gallery=""><p class="codepen" data-height="500" data-slug-hash="KKEXQKr" data-default-tab="result" data-user="miriamsuzanne" data-embed-version="2">See the Pen <a href="https://codepen.io/miriamsuzanne/pen/KKEXQKr">custom element, two ways</a> by <a href="https://codepen.io/miriamsuzanne">@miriamsuzanne</a> on <a href="https://codepen.io/">CodePen</a>.</p><script async="" src="https://static.codepen.io/assets/embed/ei.js"></script></div></figure>
<script>
class ColorTile extends HTMLElement {
static register(tagName) {
if ("customElements" in window) {
customElements.define(tagName || "color-tile", ColorTile);
}
}
static observedAttributes = ['for-color'];
static #appendShadowTemplate = (node) => {
const template = document.createElement("template");
template.innerHTML = `<span part="tile"></span><slot></slot>`;
const shadowRoot = node.attachShadow({ mode: "open" });
shadowRoot.appendChild(template.content.cloneNode(true));
}
static #adoptShadowStyles = (node) => {
const shadowStyle = new CSSStyleSheet();
shadowStyle.replaceSync(`
[part=tile] {
aspect-ratio: 1;
background:
linear-gradient(var(--tile-color), var(--tile-color)),
linear-gradient(
45deg,
black 50%,
white 50%
)
;
border: thin solid;
content: '';
display: inline-block;
inline-size: 1em;
margin-inline-end: 0.2ch;
}
`);
node.shadowRoot.adoptedStyleSheets = [shadowStyle];
}
color;
#tile;
constructor() {
super();
ColorTile.#appendShadowTemplate(this);
ColorTile.#adoptShadowStyles(this);
this.#tile = this.shadowRoot.querySelector('[part=tile]');
}
attributeChangedCallback(attr) {
if (attr === 'for-color') this.#applyColor();
}
connectedCallback() {
this.#initColor();
this.#applyColor();
}
disconnectedCallback() {
}
setColor(tileColor) { this.setAttribute('for-color', tileColor); }
#initColor = () => {
if (!this.color) this.setColor(this.innerText);
}
#applyColor = () => {
this.color = this.getAttribute('for-color');
this.#tile.style.setProperty('--tile-color', this.color);
}
}
ColorTile.register();
</script>
New Year, Same (Terrible) Mia
2023-12-31T00:00:00Z
https://www.miriamsuzanne.com/2023/12/31/23-24/
<p>It wasn’t always a great year, but I’ve been <a href="/2023/05/06/2023-preview/">moving the right direction</a>. In 2024, the plan is to <em>just keep moving</em>. (maybe too literally)</p>
<p>I don’t know where I’m going, but I’m on my way</p>
<p>It wasn’t always a great year, but I’ve been <a href="https://www.miriamsuzanne.com/2023/05/06/2023-preview/">moving the right direction</a>. In 2024, the plan is to <em>just keep moving</em>. (maybe too literally)</p>
<p>I don’t like to define my year
as a series of measurable OKRs
achieved or failed.
To quote <a href="https://robinrendle.com/notes/i-am-a-poem-i-am-not-software/">Robin Rendle</a>:
<em>I am a poem, I am not software</em>.
But at the end of 2022
my anxiety was pretty high,
and I was feeling pretty low.
So I set out to
<a href="https://www.miriamsuzanne.com/2023/05/06/2023-preview/">turn things around</a>:</p>
<blockquote>
<p>I want to cultivate a spacious openness
for curiosity and discovery…
So that when I am busy,
it should be from
<em>an abundance of creative projects,
not a scarcity of time</em>.</p>
</blockquote>
<p>Now, heading into another new year,
I want to celebrate and re-affirm that direction.
I haven’t <em>made progress</em> exactly,
because there’s no end goal,
and no metrics –
but I’m feeling a lot better
about how I waste my time.
I’m feeling better about
<em>having time to waste</em>.
Not because my days are any less full,
but because I’m the one filling them up.</p>
<p>Here are some things I enjoyed in 2023.
And some projects that will continue
into the new year!</p>
<figure>
<div data-gallery="multi"><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/2023/review/bpOCbH5YAr-640.avif 640w, https://www.miriamsuzanne.com/images/2023/review/bpOCbH5YAr-960.avif 960w, https://www.miriamsuzanne.com/images/2023/review/bpOCbH5YAr-1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="Bower bird dancers twisting and untwisting on yellow swings in purple theater lighting
" style="" src="https://www.miriamsuzanne.com/images/2023/review/bpOCbH5YAr-640.jpeg" width="1600" height="1066" srcset="https://www.miriamsuzanne.com/images/2023/review/bpOCbH5YAr-640.jpeg 640w, https://www.miriamsuzanne.com/images/2023/review/bpOCbH5YAr-960.jpeg 960w, https://www.miriamsuzanne.com/images/2023/review/bpOCbH5YAr-1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/2023/review/mBIcNTqXbS-640.avif 640w, https://www.miriamsuzanne.com/images/2023/review/mBIcNTqXbS-960.avif 960w, https://www.miriamsuzanne.com/images/2023/review/mBIcNTqXbS-1280.avif 1280w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="Small round flower pot covered in spikes off the side like organic mountain ranges, glazed in a streaked brown that gathers on the spikes and valleys, and on the rim -- set on a hexagon tray with stalagmites protruding around the pot base
" style="" src="https://www.miriamsuzanne.com/images/2023/review/mBIcNTqXbS-640.jpeg" width="1280" height="960" srcset="https://www.miriamsuzanne.com/images/2023/review/mBIcNTqXbS-640.jpeg 640w, https://www.miriamsuzanne.com/images/2023/review/mBIcNTqXbS-960.jpeg 960w, https://www.miriamsuzanne.com/images/2023/review/mBIcNTqXbS-1280.jpeg 1280w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/2023/review/1bGmxmNOh--640.avif 640w, https://www.miriamsuzanne.com/images/2023/review/1bGmxmNOh--960.avif 960w, https://www.miriamsuzanne.com/images/2023/review/1bGmxmNOh--1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="High side angle of a mostly bare stage, a woman is on a couch in a pool of light and the glow of her laptop -- large screens with rain projected behind her
" style="" src="https://www.miriamsuzanne.com/images/2023/review/1bGmxmNOh--640.jpeg" width="1600" height="1067" srcset="https://www.miriamsuzanne.com/images/2023/review/1bGmxmNOh--640.jpeg 640w, https://www.miriamsuzanne.com/images/2023/review/1bGmxmNOh--960.jpeg 960w, https://www.miriamsuzanne.com/images/2023/review/1bGmxmNOh--1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/2023/review/t6RCdov1pm-640.avif 640w, https://www.miriamsuzanne.com/images/2023/review/t6RCdov1pm-960.avif 960w, https://www.miriamsuzanne.com/images/2023/review/t6RCdov1pm-1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="Low side across the stage a white woman and south asian man in spot lights facing the audience -- their faces projected behind them as a face-time call
" style="" src="https://www.miriamsuzanne.com/images/2023/review/t6RCdov1pm-640.jpeg" width="1600" height="1067" srcset="https://www.miriamsuzanne.com/images/2023/review/t6RCdov1pm-640.jpeg 640w, https://www.miriamsuzanne.com/images/2023/review/t6RCdov1pm-960.jpeg 960w, https://www.miriamsuzanne.com/images/2023/review/t6RCdov1pm-1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture><iframe src="https://www.youtube.com/embed/ntNzVlqbwPM" title="video embed" width="560" height="315" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen="" style="--ratio:560/315;"></iframe>
<picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/2023/review/AHKMMxOd0k-640.avif 640w, https://www.miriamsuzanne.com/images/2023/review/AHKMMxOd0k-960.avif 960w, https://www.miriamsuzanne.com/images/2023/review/AHKMMxOd0k-1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="Four angles of a Fusion 360 CAD design for the pendulum and escapement of a mechanical clock
" style="" src="https://www.miriamsuzanne.com/images/2023/review/AHKMMxOd0k-640.jpeg" width="1600" height="1000" srcset="https://www.miriamsuzanne.com/images/2023/review/AHKMMxOd0k-640.jpeg 640w, https://www.miriamsuzanne.com/images/2023/review/AHKMMxOd0k-960.jpeg 960w, https://www.miriamsuzanne.com/images/2023/review/AHKMMxOd0k-1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/2023/review/BDWr9QGvgs-640.avif 640w, https://www.miriamsuzanne.com/images/2023/review/BDWr9QGvgs-960.avif 960w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="Prototype of a clear acrylic mechanical clock movement, just the pendulum and escape mechanisms, sitting across two stools so the pendulum can hang between
" style="" src="https://www.miriamsuzanne.com/images/2023/review/BDWr9QGvgs-640.jpeg" width="960" height="1280" srcset="https://www.miriamsuzanne.com/images/2023/review/BDWr9QGvgs-640.jpeg 640w, https://www.miriamsuzanne.com/images/2023/review/BDWr9QGvgs-960.jpeg 960w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/2023/s0bgQd6hFR-640.avif 640w, https://www.miriamsuzanne.com/images/2023/s0bgQd6hFR-960.avif 960w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="Habit-tracking wall calendar with month columns and light-up numbered hexagon days - all lit up!
" style="" src="https://www.miriamsuzanne.com/images/2023/s0bgQd6hFR-640.jpeg" width="960" height="1280" srcset="https://www.miriamsuzanne.com/images/2023/s0bgQd6hFR-640.jpeg 640w, https://www.miriamsuzanne.com/images/2023/s0bgQd6hFR-960.jpeg 960w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/2023/review/jbyQZ1Iv2N-640.avif 640w, https://www.miriamsuzanne.com/images/2023/review/jbyQZ1Iv2N-960.avif 960w, https://www.miriamsuzanne.com/images/2023/review/jbyQZ1Iv2N-1280.avif 1280w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="Sondra sitting behind the drum kit, surrounded by mics and cables, ready to record
" style="" src="https://www.miriamsuzanne.com/images/2023/review/jbyQZ1Iv2N-640.jpeg" width="1280" height="720" srcset="https://www.miriamsuzanne.com/images/2023/review/jbyQZ1Iv2N-640.jpeg 640w, https://www.miriamsuzanne.com/images/2023/review/jbyQZ1Iv2N-960.jpeg 960w, https://www.miriamsuzanne.com/images/2023/review/jbyQZ1Iv2N-1280.jpeg 1280w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/2023/review/5x_Xof3UuS-640.avif 640w, https://www.miriamsuzanne.com/images/2023/review/5x_Xof3UuS-960.avif 960w, https://www.miriamsuzanne.com/images/2023/review/5x_Xof3UuS-1600.avif 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="Part of a theatrical lighting plot drawn in Drafty Pro
" style="" src="https://www.miriamsuzanne.com/images/2023/review/5x_Xof3UuS-640.jpeg" width="1600" height="1000" srcset="https://www.miriamsuzanne.com/images/2023/review/5x_Xof3UuS-640.jpeg 640w, https://www.miriamsuzanne.com/images/2023/review/5x_Xof3UuS-960.jpeg 960w, https://www.miriamsuzanne.com/images/2023/review/5x_Xof3UuS-1600.jpeg 1600w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/2023/review/LvxSUw46bz-640.avif 640w, https://www.miriamsuzanne.com/images/2023/review/LvxSUw46bz-960.avif 960w, https://www.miriamsuzanne.com/images/2023/review/LvxSUw46bz-1280.avif 1280w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="Hand holding a notebook and mechanical pencil, open to a page with a detailed sketch of my condo covered in measurements
" style="" src="https://www.miriamsuzanne.com/images/2023/review/LvxSUw46bz-640.jpeg" width="1280" height="960" srcset="https://www.miriamsuzanne.com/images/2023/review/LvxSUw46bz-640.jpeg 640w, https://www.miriamsuzanne.com/images/2023/review/LvxSUw46bz-960.jpeg 960w, https://www.miriamsuzanne.com/images/2023/review/LvxSUw46bz-1280.jpeg 1280w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture><picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/2023/review/q3i36AIBnv-640.avif 640w, https://www.miriamsuzanne.com/images/2023/review/q3i36AIBnv-960.avif 960w, https://www.miriamsuzanne.com/images/2023/review/q3i36AIBnv-1280.avif 1280w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /><img loading="lazy" decoding="async" alt="Wooden desk with an open lid exposing two drawers, some clock parts, and a variety of tools
" style="" src="https://www.miriamsuzanne.com/images/2023/review/q3i36AIBnv-640.jpeg" width="1280" height="960" srcset="https://www.miriamsuzanne.com/images/2023/review/q3i36AIBnv-640.jpeg 640w, https://www.miriamsuzanne.com/images/2023/review/q3i36AIBnv-960.jpeg 960w, https://www.miriamsuzanne.com/images/2023/review/q3i36AIBnv-1280.jpeg 1280w" sizes="(min-width: 65em) 30vw, (min-width: 30em) 45vw, 95vw" /></picture></div><figcaption>Following my curiosity. Maybe I should take up lock picking next?</figcaption></figure>
<ul>
<li>I performed in <a href="https://www.curioustheatre.org/">Curious Theatre</a>’s
New Voices festival,
and designed lights for
their regional premier
<a href="https://www.curioustheatre.org/event/lettersofsuresh/"><em>Letters of Suresh</em></a></li>
<li><a href="https://grapefruitlab.com/">Grapefruit Lab</a>
has officially formed as a non-profit,
and we should hear soon about getting 501c3 status</li>
<li>Our spring show
<a href="https://grapefruitlab.com/shows/queer-bird/"><em>Strange Bird, Queer Bird</em></a>
was a huge success,
and a fun opportunity to work with new collaborators</li>
<li><a href="https://teacupgorilla.com/">Teacup Gorilla</a>
has mostly finished recording a new album,
and we’re collaborating with Grapefruit Lab
to make a fully-staged live performance
based on it (opening in May!)</li>
<li>I got really into clock repair,
and I’ve fixed several old wall clocks
for friends
(I even made a video about
<a href="https://www.youtube.com/watch?v=ntNzVlqbwPM&t=198s">the Rack and Snail strike mechanism</a>)</li>
<li>I joined <a href="https://denhac.org/">DenHac</a>,
the local maker space,
and learned a number of new tools –
from laser cutting and 3d printing,
to the metal lathe and
(just this week)
the embroidery machine</li>
<li>I’ve been learning parametric CAD,
using OnShape and Fusion 360
along with the DenHac tools
to design a mechanical pendulum clock
from scratch</li>
<li>I’ve started exploring
custom elements and web components
(huge thanks to Zach Leatherman
and Westbrook Johnson for significant guidance)</li>
<li>I’m half done with a major re-build of this site,
and a few other web side projects
that I want to get back to</li>
<li>I joined a the local recreation center
pottery class,
and really enjoyed getting my hands
back into the clay
(classes start again soon!)</li>
<li>I did “something active outside”
(usually a walk) <em>every day of the year</em>
(though some days were much more active than others)</li>
</ul>
<p>I absolutely love my daily walks,
and plan to keep that up.
I thought I might track another daily
(or weekly?) habit this year –
I’d like to get back into
a regular creative writing practice.
It might even be fun to re-program
my <a href="https://yetch.store/products/every-day-goal-calendar">Yetch calendar</a>,
so it can track multiple habits at once.
I also have some ideas to make
<a href="https://front-end.social/">Front-End Social</a>
more sustainable
over the long term.
But all that will have to wait
for another couple months.
That’s ok,
there’s plenty of time.</p>
<p>For now, I’m moving
and preparing
<a href="https://smashingconf.com/online-workshops/workshops/modern-css-miriam-suzanne/">a new CSS workshop</a> for Feb/March.
I’m really excited about this one,
and have big plans
to do more teaching for work this year.
Maybe even make some videos again?</p>
<p>But more immediate
than any of that,
Erin and I spent the holidays
cleaning and painting our condos –
putting anything we can into
friends’ basements.
This home that I’ve curated for myself
for the last eight years
no longer feels like mine,
and it will go on the market next weekend.
I’m sad to leave,
but excited to start something new.</p>
<p>Having separate space
has been important to us here,
and will be important to us
in a new home as well –
but without the public hallway between,
and no need for the extra kitchen.</p>
<p>Bring on the new year.</p>
<p><em>(oh fuck. the election. we’re fucked.)</em></p>
CSS @scope
2023-12-15T00:00:00Z
https://www.miriamsuzanne.com/2023/12/15/scope/
<p>The new <code>@scope</code> rule is here! It’s a better way to keep our component styles contained – without relying on third-party tools or extreme naming conventions.</p>
<p>Bookmark from
<a href="https://12daysofweb.dev/2023/css-scope/" class="h-cite h-card u-bookmark-of">12 Days of Web</a></p>
<p>Keep selector conflicts to a minimum</p>
<p>The new <code>@scope</code> rule is here! It’s a better way to keep our component styles contained – without relying on third-party tools or extreme naming conventions.</p>
<p>Bookmark from
<a href="https://12daysofweb.dev/2023/css-scope/" class="h-cite h-card u-bookmark-of">12 Days of Web</a></p>
<picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/elsewhere/aJpb2x-biX-640.avif 640w, https://www.miriamsuzanne.com/images/elsewhere/aJpb2x-biX-960.avif 960w, https://www.miriamsuzanne.com/images/elsewhere/aJpb2x-biX-1600.avif 1600w" sizes="(min-width: 75em) 75vw, 95vw" /><img loading="lazy" decoding="async" alt="" class="hero-img" src="https://www.miriamsuzanne.com/images/elsewhere/aJpb2x-biX-640.jpeg" width="1600" height="667" srcset="https://www.miriamsuzanne.com/images/elsewhere/aJpb2x-biX-640.jpeg 640w, https://www.miriamsuzanne.com/images/elsewhere/aJpb2x-biX-960.jpeg 960w, https://www.miriamsuzanne.com/images/elsewhere/aJpb2x-biX-1600.jpeg 1600w" sizes="(min-width: 75em) 75vw, 95vw" /></picture><p>Scoped styles have always been the primary goal of CSS.
Selectors scope declarations to matched elements.
Those selectors can be combined to create more specific scopes –
each modified by its relation to others.
But the <code>@scope</code> feature,
already available in Chromium browsers,
will make that functionality even more powerful.</p>
HTML Web Components are Just JavaScript?
2023-11-17T00:00:00Z
https://www.miriamsuzanne.com/2023/11/17/components/
<p>There’s been a recent flurry of articles about web components, with advice on how to shape them as extensions of HTML. I decided to dig in, and see how these ‘HTML web components’ could become a part of my own workflow.</p>
<p>Bookmark from
<a href="https://www.oddbird.net/2023/11/17/components/" class="h-cite h-card u-bookmark-of">OddBird.net</a></p>
<p>I’m still getting used to this</p>
<p>There’s been a recent flurry of articles about web components, with advice on how to shape them as extensions of HTML. I decided to dig in, and see how these ‘HTML web components’ could become a part of my own workflow.</p>
<p>Bookmark from
<a href="https://www.oddbird.net/2023/11/17/components/" class="h-cite h-card u-bookmark-of">OddBird.net</a></p>
<picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/2023/P59JH21kOd-640.avif 640w, https://www.miriamsuzanne.com/images/2023/P59JH21kOd-960.avif 960w, https://www.miriamsuzanne.com/images/2023/P59JH21kOd-1600.avif 1600w" sizes="(min-width: 75em) 75vw, 95vw" /><img loading="lazy" decoding="async" alt="" class="hero-img" src="https://www.miriamsuzanne.com/images/2023/P59JH21kOd-640.jpeg" width="1600" height="906" srcset="https://www.miriamsuzanne.com/images/2023/P59JH21kOd-640.jpeg 640w, https://www.miriamsuzanne.com/images/2023/P59JH21kOd-960.jpeg 960w, https://www.miriamsuzanne.com/images/2023/P59JH21kOd-1600.jpeg 1600w" sizes="(min-width: 75em) 75vw, 95vw" /></picture>
Cascade Layers, CSS Functions, and More
2023-11-14T00:00:00Z
https://www.miriamsuzanne.com/2023/11/14/shop-talk23/
<p>I drop by the show
to talk about CSS updates
and news on container queries,
rolling out cascade layers,
<code>!important</code> things to remember,
custom properties,
exit animations,
CSS functions,
state queries,
and more.</p>
<p>Bookmark from
<a href="https://shoptalkshow.com/591/" class="h-cite h-card u-bookmark-of">Shop Talk Show</a></p>
<p>I drop by the show
to talk about CSS updates
and news on container queries,
rolling out cascade layers,
<code>!important</code> things to remember,
custom properties,
exit animations,
CSS functions,
state queries,
and more.</p>
<p>Bookmark from
<a href="https://shoptalkshow.com/591/" class="h-cite h-card u-bookmark-of">Shop Talk Show</a></p>
<picture><source type="image/avif" srcset="https://www.miriamsuzanne.com/images/elsewhere/3IAdQY0Vtr-640.avif 640w, https://www.miriamsuzanne.com/images/elsewhere/3IAdQY0Vtr-960.avif 960w, https://www.miriamsuzanne.com/images/elsewhere/3IAdQY0Vtr-1400.avif 1400w" sizes="(min-width: 75em) 75vw, 95vw" /><img loading="lazy" decoding="async" alt="" class="hero-img" src="https://www.miriamsuzanne.com/images/elsewhere/3IAdQY0Vtr-640.jpeg" width="1400" height="772" srcset="https://www.miriamsuzanne.com/images/elsewhere/3IAdQY0Vtr-640.jpeg 640w, https://www.miriamsuzanne.com/images/elsewhere/3IAdQY0Vtr-960.jpeg 960w, https://www.miriamsuzanne.com/images/elsewhere/3IAdQY0Vtr-1400.jpeg 1400w" sizes="(min-width: 75em) 75vw, 95vw" /></picture><figure>
<div data-gallery=""><div style="--span: "><audio src="https://cdn.simplecast.com/audio/167887a0-ac00-4cf9-bc69-b5ca845997db/episodes/02c9a71e-21e8-4ee9-b0ca-b2d8f6ebf030/audio/9f538fb5-34bf-49fe-9616-1874a2e488f1/default_tc.mp3" style="--width:100%;" controls="">https://cdn.simplecast.com/audio/167887a0-ac00-4cf9-bc69-b5ca845997db/episodes/02c9a71e-21e8-4ee9-b0ca-b2d8f6ebf030/audio/9f538fb5-34bf-49fe-9616-1874a2e488f1/default_tc.mp3</audio></div></div><figcaption>Listen to the podcast…</figcaption></figure>