# Werner Glinka Personal Website > Personal website of Werner Glinka. ## Artworks ### Wall sculpture in black and red-brown laminated cardboard with birch branches https://www.wernerglinka.com/art/works/2026.09.004/ Object 2026.09.004 Type Wall sculpture Year 2026 Materials Laminated cardboard, birch branches, construction nails A Samurai inspired composition — black laminated cardboard overlapping deep red-brown vertical strips. Two birch branches cross horizontally where the panels meet, affixed with construction nails, the heads visible. The branches do what the driftwood did in earlier pieces — organic forms bridging industrial surfaces. The irregular silhouette, the notches cut into the form, the way the panels don't quite align. Architecture that refuses to behave. Share This Work Related Studio Notes Cardboard What can a serious artist do with cardboard? I understand the skepticism. We see cardboard as packaging, as the thing we break down for recycling. Recurring Forms Stadium shapes and circles keep surfacing in my work — forms absorbed from an industrial German childhood. New pieces in cardboard clay push these obsessions into three dimensions. --- ### Wall sculpture in black laminated cardboard and cardboard clay with red electrical wire https://www.wernerglinka.com/art/works/2026.09.003/ Object 2026.09.003 Type Wall sculpture Year 2026 Materials Laminated black cardboard, cardboard clay, electrical wire Dimensions 8w × 26h × 5d  inches Price $400 Tall narrow column — black laminated cardboard at top, cardboard clay below. A strip of exposed corrugation runs between them, and three small knots of red electrical wire sit in a row along it. The wire is leftover from an installation — another Minneapolis material finding its way into the work. The knots read as punctuation against the dark field. A small gesture, a bit of color, and a nod to the electrical engineer who made them. Share This Work Related Studio Notes Cardboard What can a serious artist do with cardboard? I understand the skepticism. We see cardboard as packaging, as the thing we break down for recycling. --- ### Wall sculpture in black laminated cardboard with a notch for a stone https://www.wernerglinka.com/art/works/2026.09.001/ Object 2026.09.001 Bring Your Own Rock Type Wall sculpture Year 2026 Materials Laminated black cardboard, staples, acrylic paint Dimensions 10w × 27h × 4d  inches Vertical panel — black laminated cardboard strips with a notch cut into one side. Small staples scatter across the surface like stitches or notation. X's, slashes, crosses — a language that doesn't translate but feels deliberate. The notch waits for a stone. Any stone. Yours. Share This Work Related Studio Notes Cardboard What can a serious artist do with cardboard? I understand the skepticism. We see cardboard as packaging, as the thing we break down for recycling. --- ### Wall sculpture in cardboard mâché with shredded kraft paper https://www.wernerglinka.com/art/works/2026.09.002/ Object 2026.09.002 Type Wall sculpture Year 2026 Materials Cardboard mâché, shredded kraft paper Dimensions 26w × 12h × 4d  inches Price $650 Two curved forms facing each other — the stadium shape split in half. Shredded kraft paper fills the gap between them, spilling out like something escaping or connecting. Dark mottled surfaces on either side, quiet and heavy. The paper at center is all movement. Stillness holding chaos. Recurring forms keep finding new arrangements. Share This Work Related Studio Notes Recurring Forms Stadium shapes and circles keep surfacing in my work — forms absorbed from an industrial German childhood. New pieces in cardboard clay push these obsessions into three dimensions. Shredded Paper Shredded paper wants to flatten. Getting height while keeping it light takes time. --- ### Wall sculpture in shredded kraft paper and cardboard clay https://www.wernerglinka.com/art/works/2026.08.001/ Object 2026.08.001 Type Wall sculpture Year 2026 Materials Shredded shopping bags, cardboard clay Dimensions 7w × 20h × 4d  inches Price $300 Shredded shopping bags over cardboard clay — the same serendipity method, different material. Flashes of green text surface through the brown tangle, remnants of whatever the paper once was. Warm tones this time. The brown paper and the clay are from the same earth palette, but one is chaos, the other stillness. They meet at the middle and hold. Share This Work Related Studio Notes Shredded Paper Shredded paper wants to flatten. Getting height while keeping it light takes time. Serendipity I spilled the shredder output on the floor. What I saw made me stop. The random tangle of paper strips — fragments of text, no longer readable as language — looked like something I could use. --- ### Wall sculpture in black laminated cardboard and cardboard clay with an embedded stone https://www.wernerglinka.com/art/works/2026.07.003/ Object 2026.07.003 Type Wall sculpture Year 2026 Materials Laminated black cardboard, cardboard clay, stone Dimensions 6w × 30h × 3d  inches Price $400 A tall narrow column — black laminated cardboard at top, cardboard clay below. A square opening in the black section holds a single stone. The proportions are almost totemic. The stone sits in its window like something placed deliberately, a small reliquary. Found object, constructed frame. The clay surface below is quiet, patient — it lets the stone do the talking. Minneapolis may not have redwood sticks or rusty fence wire, but it has stones. Share This Work Related Studio Notes Cardboard What can a serious artist do with cardboard? I understand the skepticism. We see cardboard as packaging, as the thing we break down for recycling. Paper Mache Making paper mache clay for sculpture. Recipe, technique, and a beginner's mistake worth avoiding. Thin layers over foam core for controlled drying. --- ### Wall sculpture in black cardboard and cardboard clay https://www.wernerglinka.com/art/works/2026.07.002/ Object 2026.07.002 Type Wall sculpture Year 2026 Materials Cardboard, cardboard clay, acrylic paint Dimensions 28w × 18h × 3d  inches Price $1,000 Two interlocking forms — black vertical cardboard strips on the left with a dark red band at the base, cardboard clay on the right with its quiet mineral surface. Angular notches break the silhouette on both sides. The pieces fit together like a conversation. Dark and light, textured and smooth, dense and open. The shape suggests architecture — a roofline, a floor plan, something built. Neither panel is complete without the other. Share This Work Related Studio Notes Cardboard What can a serious artist do with cardboard? I understand the skepticism. We see cardboard as packaging, as the thing we break down for recycling. --- ### Wall sculpture in gray and red-brown layered cardboard https://www.wernerglinka.com/art/works/2026.07.001/ Object 2026.07.001 Type Wall sculpture Year 2026 Materials Cardboard, joint tape, acrylic paint Dimensions 21w × 22h × 3d  inches Price $900 Interlocking panels in a restrained palette — dark gray with a woven texture, deep red-brown cardboard strips running horizontal on the left, vertical on the right. The composition steps and shifts, breaking the rectangle. Three textures in conversation: the subtle grid of the gray, the horizontal corrugation, the vertical corrugation. Same material family, different orientations. The dark reds emerge from the gray like something half-hidden. Architectural. Quiet. The irregular outline gives it tension — it refuses to sit still in its frame. Share This Work Related Studio Notes Cardboard What can a serious artist do with cardboard? I understand the skepticism. We see cardboard as packaging, as the thing we break down for recycling. --- ### Wall sculpture in layered yellow, black, and red cardboard https://www.wernerglinka.com/art/works/2026.06.001/ Object 2026.06.001 Type Wall sculpture Year 2026 Materials Cardboard, acrylic paint Dimensions 15w × 20h × 3d  inches Price $600 Three layered panels — yellow, black, and deep red cardboard strips — overlapping at different depths. The center section is scored with shallow grooves from a circular saw, cutting across the corrugated texture. The yellow asserts itself from the left. The red anchors the top. The black recedes but holds the composition together. The saw cuts add another rhythm — deliberate marks against the regular lines of the cardboard. Order interrupted by order. Share This Work Related Studio Notes Cardboard What can a serious artist do with cardboard? I understand the skepticism. We see cardboard as packaging, as the thing we break down for recycling. --- ### Assemblage in layered cardboard with driftwood and sand https://www.wernerglinka.com/art/works/2026.05.002/ Object 2026.05.002 Type Assemblage Year 2026 Materials Cardboard, sand, driftwood, acrylic paint Dimensions 24w × 24h × 3d  inches Price $1,200 Layered cardboard, about three inches thick, set face-on instead of on edge. The first larger piece where the cardboard lies flat rather than showing its corrugated edge. The surface is acrylic, white and black and maroon, sanded back between coats. The cardboard took on moisture and swelled unevenly. Sanding the raised areas cut through to the layers beneath, and that is where the marks across the field come from, not from drawing. A forked length of driftwood leans across the upper right. Sand covers the bare corner above it. At the bottom center, one short block turns its corrugated edge to the front, the old way of working set against the new. I was after chaos. I got it. Share This Work Related Studio Notes Cardboard What can a serious artist do with cardboard? I understand the skepticism. We see cardboard as packaging, as the thing we break down for recycling. --- ### Wall sculpture with corrugated cardboard, sand, and stones https://www.wernerglinka.com/art/works/2026.05.001/ Object 2026.05.001 Type Wall sculpture Year 2026 Materials Cardboard, sand, acrylic paint Dimensions 28w × 37h × 4d  inches Price $2,100 Four parts joined into a stepped form. A tall black panel of corrugated cardboard set on edge runs along the right, its flutes reading as horizontal striations. To its left, a burgundy panel of the same construction, this time with the flutes running vertical. A block of sand and small stones in binder caps the upper left, rough against the regularity of the cardboard. A small yellow rectangle of corrugated cardboard sits at the bottom seam. The form traces back to old samurai armor seen on travels in Japan. This is only the left half. Share This Work Related Studio Notes Cardboard What can a serious artist do with cardboard? I understand the skepticism. We see cardboard as packaging, as the thing we break down for recycling. Heavy Last winter this room was empty. One rolling cart, a couple of trays, a window full of bare branches. --- ### Wall sculpture with cardboard and paper mache https://www.wernerglinka.com/art/works/2026.04.001/ Object 2026.04.001 Type Wall sculpture Year 2026 Materials Cardboard and paper mâché clay Dimensions 7w × 18h × 4d  inches Price $300 Black laminated cardboard strips over a paper mâché clay body. Nothing more. The corrugated texture reads as dark static against the quiet, mineral surface below. Two materials, two textures, one meeting point. The piece says what it needs to say and stops. Share This Work --- ### Wall sculpture with paper mâché clay and paper tubes https://www.wernerglinka.com/art/works/2026.03.001/ Object 2026.03.001 Type Wall sculpture Year 2026 Materials Cardboard, paper tubes, tile spacers, acrylic paint Dimensions 11w × 14h × 3d  inches Cardboard slab covered with paper mâché clay, painted and scraped. A spine of small paper tubes runs down the center — a gift from a studio neighbor. Tile spacer crosses scattered across the surface. Share This Work Related Studio Notes Found a Home Yesterday I came to my studio and found small paper rolls on my workbench with a pink post-it: "Want these? — Anna." My friends at the Center know I am always looking for materials. Paper Mache Making paper mache clay for sculpture. Recipe, technique, and a beginner's mistake worth avoiding. Thin layers over foam core for controlled drying. Cardboard What can a serious artist do with cardboard? I understand the skepticism. We see cardboard as packaging, as the thing we break down for recycling. --- ### Wall sculpture with laminated cardboard and grommets https://www.wernerglinka.com/art/works/2026.03.002/ Object 2026.03.002 Type Wall sculpture Year 2026 Materials Cardboard, paper mâché clay, grommets, acrylic paint Dimensions 14w × 16h × 4d  inches Price $400 Laminated cardboard strips painted black, exposing the corrugated texture. A vertical spine of paper mâché clay divides the field, with small color interruptions — yellow at top, red at bottom. Small grommets scattered across the dark surface like rivets or stars. The horizontal lines of the cardboard against the vertical spine. Order and repetition, punctuated by small metal circles that catch the light. Share This Work Related Studio Notes First Piece First piece combining stacked cardboard and paper mache clay. Dark corrugated layers, rough stone-like center strip, decorative rivets. Cardboard What can a serious artist do with cardboard? I understand the skepticism. We see cardboard as packaging, as the thing we break down for recycling. Paper Mache Making paper mache clay for sculpture. Recipe, technique, and a beginner's mistake worth avoiding. Thin layers over foam core for controlled drying. --- ### Wall sculpture with laminated cardboard and driftwood https://www.wernerglinka.com/art/works/2026.03.003/ Object 2026.03.003 Type Wall sculpture Year 2026 Materials Cardboard, drift wood, acrylic paint Dimensions 32w × 17h × 4d  inches Price $1,100 Two panels of laminated cardboard strips — deep red-brown on the left, black on the right — joined by a dark center band. Driftwood branches cross at the junction, weathered and pale against the vertical texture of the cardboard. Industrial repetition meets organic accident. The wood arrived already shaped by water and time; the cardboard was built up strip by strip. They meet in the middle. Share This Work Related Studio Notes Cardboard What can a serious artist do with cardboard? I understand the skepticism. We see cardboard as packaging, as the thing we break down for recycling. Heavy Last winter this room was empty. One rolling cart, a couple of trays, a window full of bare branches. --- ### Assemblage with shredded paper, wood glue, and lacquer https://www.wernerglinka.com/art/works/2026.03.004/ Object 2026.03.004 Type Assemblage Year 2026 Materials Shredded paper, wood glue, lacquer, tile spacers Dimensions 9w × 24h × 1d  inches Price $300 Shredded paper soaked in diluted wood glue, drained overnight, sealed with clear lacquer. A red band with five tile spacer crosses anchors the top. The paper started as office documents — text, information, records — now reduced to texture. Fragments of words still visible but no longer readable. Chaos below, order above. Serendipity as method: the piece began when I spilled the shredder output on the floor and liked what I saw. Share This Work Related Studio Notes Serendipity I spilled the shredder output on the floor. What I saw made me stop. The random tangle of paper strips — fragments of text, no longer readable as language — looked like something I could use. --- ### Assemblage with wire mesh, ash, urethane, and shredded paper https://www.wernerglinka.com/art/works/2026.03.005/ Object 2026.03.005 Type Assemblage Year 2026 Materials Wire mesh, wood panel, ash, urethane, shredded paper Dimensions 9w × 24h × 1d  inches Price $300 Wire mesh over a wood panel coated with ash soaked in urethane — the surface reads like weathered stone or scorched earth. A cluster of shredded paper sits on the mesh, still tangled, holding its shape. Grid and chaos. The mesh was originally a tool for draining the paper experiments; here it becomes part of the piece. Below, the ash surface absorbs light. Above, the paper catches it. Share This Work Related Studio Notes Serendipity I spilled the shredder output on the floor. What I saw made me stop. The random tangle of paper strips — fragments of text, no longer readable as language — looked like something I could use. --- ### Assemblage triptych evoking coastal themes https://www.wernerglinka.com/art/works/2007.10.001/ 2007.10.001 Boats Type Assemblage Year 2007 Materials Meta bands, dowels, split pine, redwood twigs and rusty fence wire Dimensions 70w × 60h × 8d  inches Status Artists Collection Princeton Harbor sits along the San Mateo coast, a working harbor where fishing boats come and go. I spent years walking those docks - past boats being repaired, boats waiting for parts, boats that would never see water again. The hulls of abandoned vessels fascinated me. Stripped of planking, their ribs exposed, they became something other than boats. They were carcasses, skeletons, the memory of a form. This triptych explores that transformation. Each panel holds the same pointed hull shape - the essential silhouette that says "vessel" - but constructed from different materials that suggest different stages or states of being. The first form is built from wood dowels and metal banding - the steel strapping used to secure construction materials. Industrial fastening repurposed into structure. The bands wrap and bind, holding the mass together. The second is pine, split by hand with an axe and painted black. The rough-hewn surfaces catch light unevenly. The split grain gives each piece its own character while the black unifies them into a single dark form, almost like charred remains. The third opens up. Pine sticks bound with old rusty fence wire, the kind that sags between posts in forgotten pastures. It's the most skeletal of the three, permeable to light and air. What remains when the solid hull has fallen away. The first panel is now part of the permanent collection at the Peninsula Museum of Art in San Mateo. Share This Work Related Studio Notes The Boat Form I spent a lot of time walking Princeton Harbor on the Half Moon Bay coast. A working harbor shows you boats in every state — including stripped down to keel and ribs, the structure laid bare. That form got into me through repeated seeing. --- ### Assemblage reminicent of a sphere https://www.wernerglinka.com/art/works/2007.07.007/ Object 2007.07.007 Type Assemblage Year 2007 Materials Metal band, nails, electrical insulators, construction sand Dimensions 12w × 48h × 3d  inches Status SOLD A tall vertical panel. Horizontal metal bands fill the upper section, rusted and riveted, with vertical lines of small nail heads descending through them. Four white porcelain insulators step down from the metal into the textured field below. The lower field is sand and fine gravel in gray-blue. A seam of lighter aggregate runs down the center like a crack or a path. The insulators are salvaged from an old house - they carry history. Porcelain knobs screwed into wood framing, keeping electrical wire safely away from the structure. Every old house had them before modern wiring. Functional objects, now obsolete, salvaged and placed here where they punctuate the transition from metal to earth. Share This Work --- ### Assemblage reminicent of a sphere https://www.wernerglinka.com/art/works/2007.01.001/ Object 2007.01.001 Type Assemblage Year 2007 Materials Metal bands, acrylic paint Dimensions 42w × 42h × 4d  inches Status SOLD Metal banding arrives at construction sites wrapped tight around lumber and concrete blocks, doing invisible work. Once cut, it's discarded - tossed in dumpsters, left to rust in piles. I collect these cast-off strips and give them new purpose. This piece builds a circular form from interlocking bands, each bent at angles and woven through its neighbors. The structure holds itself together through tension and connection - no element exists in isolation. Brass wire binds the joints, but the real stability comes from how the parts interlock. The metal carries its history. Some strips retain warm copper and bronze tones; others have oxidized to cooler steel-grey. Time and weather have painted each piece differently. I don't fight this - the patina variation becomes part of the composition, creating a color rhythm that moves around the form. Light matters here. The raised structure casts shadows onto the dark ground behind it, so the piece exists twice - once as physical object, once as shadow. Depending on how it's lit, the character shifts. The void at the center anchors the composition, a stillness surrounded by the complexity of interwoven metal. This piece is part of a series - Change of Context - refers to what happens when discarded materials are removed from their original function. The banding no longer secures anything. It has become something else. Share This Work Related Studio Notes Recurring Forms Stadium shapes and circles keep surfacing in my work — forms absorbed from an industrial German childhood. New pieces in cardboard clay push these obsessions into three dimensions. --- ### Object 2005.02.001 https://www.wernerglinka.com/art/works/2005.02.001/ Object 2005.02.001 From the Urban Totem series Type Assemblage Year 2005 Materials Drywall tape, construction sand, rusty wire, copper wire, acrylic paint Dimensions 8w × 32h × 5d  inches Status Artists Collection A tall narrow panel. Red cap at top. Dark fields above and below - textured with drywall mesh tape, the kind used to join sheetrock panels. The grid pattern shows through the dark paint. A horizontal band of sand crosses the center. At the center sits a small wire composition - rusted fence wire and electrical circuit wire formed into a compact shape. It reads as organic, like a dried flower or seed pod, but it's entirely constructed. Nothing natural here. Red paint, drywall tape, sand, wire - all materials from construction, from human making. Even the thing that appears to have grown was built. Share This Work --- ### Object 2005.01.001 https://www.wernerglinka.com/art/works/2005.01.001/ Object 2005.01.001 From the Urban Totem series Type Assemblage Year 2005 Materials Ash, birch branch stub, shaped contruction lumber, acrylic paint Dimensions 12w × 24h × 4d  inches Status SOLD A rectangular base - gray ash texture flanking a central blue column marked with horizontal red bands. A wooden post extends upward from the column, supporting a deep red crescent that curves like horns or a rising moon. The piece is vertical, symmetrical, frontal. It occupies space the way a figure does. The crescent crowns the form, giving it presence. I didn't know what to call these wall sculptures. A friend looked at them and said they look like totems. The name stuck. Share This Work --- ### Object 2005.01.003 https://www.wernerglinka.com/art/works/2005.01.003/ Object 2005.01.003 From the Urban Totem series Type Assemblage Year 2005 Materials Rock, madrone, rusted iron, rust paint Dimensions 18w × 32h × 4d  inches Status SOLD Two textured vertical strips flank a central panel of warm ochre wood. Madrone branches extend horizontally from both sides at top - reaching outward like arms or antlers. A rock sits at the top center. A found piece of rust runs vertically down the central panel, irregular and organic. This totem has gesture. Where the quiet one stood still, this one opens itself. The branches break the frame, reaching into the space around it. Share This Work --- ### Object 2005.01.006 https://www.wernerglinka.com/art/works/2005.01.006/ Object 2005.01.006 Type Assemblage Year 2005 Materials Redwood sticks, rusty wire, sand, burlap, acrylic Paint Dimensions 48w × 40h × 3d  inches Status SOLD Three vertical panels share a single image: a boat hull sketched in pine sticks and wire, floating on a diagonal across an ochre field. A dark red band runs behind the skeletal form like water or shadow. The hull is open, permeable - ribs without planking. The sticks are bound at their intersections, creating a structure that holds its shape while remaining transparent. It spans the gaps between panels as if the vessel exists independent of its support. Small fabric squares mark the upper portion of each panel. Cross-shaped forms punctuate the lower edge. Gold rectangles provide accent. But the eye follows the diagonal, follows the ghost of a boat moving across the composition. This piece shares vocabulary with the Boats triptych - the same interest in vessel forms reduced to skeleton, the same use of sticks and binding to suggest what remains after the solid structure is gone. Share This Work Related Studio Notes The Boat Form I spent a lot of time walking Princeton Harbor on the Half Moon Bay coast. A working harbor shows you boats in every state — including stripped down to keel and ribs, the structure laid bare. That form got into me through repeated seeing. --- ### Object 2004.04.001 https://www.wernerglinka.com/art/works/2004.04.001/ Object 2004.04.001 Type Assemblage Year 2004 Materials Redwood sticks, money plant seed pods, acrylic paint Dimensions 40w × 30h × 3d  inches Status SOLD Black sky above, deep red earth below. At the horizon where they meet, pine sticks fan outward in a symmetrical V, suggesting wings in flight. Among the sticks, silvery money plant seed pods cluster and trail downward. The form is unmistakable - a bird, an angel, something ascending or descending at the boundary between two worlds. The sticks radiate with the precision of feathers; the translucent seed pods add points of light along the wingspan. The painted surfaces are textured, worked. The black carries subtle variations; the red has depth built through layers. But the eye goes to the center, to that moment of lift where natural materials break free of the painted ground. Share This Work --- ### Object 2004.04.003 https://www.wernerglinka.com/art/works/2004.04.003/ Object 2004.04.003 Type Assemblage Year 2004 Materials Branch, rivets, acrylic paint Dimensions 20w × 32h × 3d  inches Status Artists Collection A weathered branch breaks the frame, extending beyond the painted rectangle. Below it, a grid of aluminum rivets punctuates a field of layered blue - scratched, brushed, built up. At the bottom edge, a rust-red rectangle anchors the composition. The piece started with the grid. Something was missing. The branch arrived and changed everything - organic form against industrial pattern, irregular against ordered. The tension was discovered, not planned. Share This Work --- ### Object 2003.12.001 https://www.wernerglinka.com/art/works/2003.12.001/ Object 2003.12.001 Type Assemblage Year 2003 Materials Branch stubs, rusty wire, acrylic paint Dimensions 40w × 30h × 3d  inches Status SOLD Black, red, gold - the colors of the German flag, rearranged as geometric blocks rather than stripes. Red across the top. Two black rectangles below, flanking a central yellow column. A rusty wire traces a path down the surface, supported by small wood branch segments standing a few inches high. The elevation lifts the wire off the color plane, creating space for light to pass beneath. Shadows fall on red, on yellow - shifting through the day, never fixed. The colors of my past. Gelsenkirchen, the Ruhr Valley, the place I came from. These will always have a place. The wire wanders across them, suspended, casting shadows the way memory casts itself across what was. Share This Work Related Studio Notes Recurring Forms Stadium shapes and circles keep surfacing in my work — forms absorbed from an industrial German childhood. New pieces in cardboard clay push these obsessions into three dimensions. --- ### Object 2003.08.006 https://www.wernerglinka.com/art/works/2003.08.006/ 2003.08.006 Pax Americana Type Assemblage Year 2003 Materials Newspaper, metal band, nails, ash, acrylic paint Dimensions 26w × 48h × 3d  inches Status SOLD Two vertical panels. The upper third of each constructs fragmented American flag imagery from newspaper clippings and rusted metal banding. Stars cut from newsprint. Stripes made from industrial slats, riveted in place. The headlines are legible: WAR. IRAQ. Threatens peace. Nation & World. The metal bands that appear throughout my work usually reference construction sites, industrial cast-offs. Here they become American industrial strength - the machine that makes war possible. Below, ash dominates both panels. The result of war. What remains. Share This Work --- ### Object 2002.07.001 https://www.wernerglinka.com/art/works/2002.07.001/ 2002.07.001 Type Assemblage Year 2002 Materials Found branches, leafes, sand acrylic paint Dimensions 40w × 40h × 2d  inches Status SOLD Four panels, four windows. Earth alternates with red. Vertical rectangles alternate with squares. Each window frames a single found object - a forked branch, a spotted madrone leaf, an oak leaf, another branch. Nothing more. The object sits in its opening, isolated, presented. The branches rest in hollows cut into the panel. Their surfaces carry traces of wood-boring insects - meandering channels carved between bark and core. Paths left by small lives, now part of the object. Where the field is earth-textured, the window reveals red. Where the field is red, the window holds sand. The reversal repeats across all four panels - ground becomes frame, frame becomes ground. One leaf. One branch. Ordinary things, given a stage. Share This Work --- ### Object 2002.07.002 https://www.wernerglinka.com/art/works/2002.07.002/ 2002.07.002 Montana Night Type Assemblage Year 2002 Materials Branches, cheese cloth, acrylic paint Dimensions 48w × 40h × 3d  inches Status SOLD Three horizontal panels in deep teal and blue-green, each divided into color fields. A small forked branch crosses each panel at a different position - upper right, upper left, lower right - moving through the composition like something glimpsed and then gone. The color is night sky in the mountains. The bottom panel carries golden marks worked into the surface - distant flashes, light on clouds. The branches could be trees against the sky, or the lightning itself. This piece came from a night in the Montana mountains during a thunderstorm. The rumbles and rolls of thunder, the cracks, the flashes hitting the earth - impossible to describe with words. This captures such a night. Share This Work --- ### Object 2001.08.002 https://www.wernerglinka.com/art/works/2001.08.002/ Object 2001.08.002 Type Assemblage Year 2001 Materials Madrone Twigs, Sand and Madrone Leaf, Oil Dimensions 24w × 24h × 2d  inches Status SOLD A dark field surrounds a single moment of warmth. At the center, a square of sand holds a madrone leaf - its surface spotted, its edges curling. The leaf sits where it landed, preserved. Around this quiet center, a frame of small branches scatters in controlled chaos. The twigs cross and overlap without pattern, their dark forms contrasting with the warm ochre of the sand. They suggest a nest, a thicket, a boundary between the intimate center and the dark expanse beyond. The piece works through contrast: dark against light, order against disorder, the single preserved leaf against the multiplied branches. The sand texture catches light differently than the painted surface, adding depth to what reads initially as a simple composition. Share This Work --- ### Object 2001.01.004 https://www.wernerglinka.com/art/works/2001.01.004/ Object 2001.01.004 Type Assemblage Year 2001 Materials Panel, lichen, money plant seed pods, branches, sand, acrylic paint Dimensions 16w × 16h × 2d  inches Status SOLD Three horizontal zones divide the panel. At top, dark brown paint with visible brushstrokes holds a patch of pale green lichen - a small eruption of texture against the flat field. Below, translucent money plant seed pods overlap in layers, their silvery membranes catching light against hints of coral beneath. At bottom, sand mixed into the surface creates an earthen band. A branch crosses horizontally at the first division. Another extends diagonally through the lower portion, breaking the strict geometry. Money plant seed pods - Lunaria annua - are distinctive. After the flowers fade, these papery, coin-like discs remain. They're almost transparent, each one slightly different. Gathered and layered here, they create a luminous middle zone between earth below and darkness above. Share This Work --- ### Werner Glinka - Mixed Media Works https://www.wernerglinka.com/art/works/ Works 2026 Legacy Object 2026.03.001 Wall sculpture, paper mâché clay on cardboard with paper tubes and tile spacers 2026 Object 2026.03.002 Wall sculpture, laminated cardboard strips with paper mâché clay spine and grommets 2026 Object 2026.03.003 Wall sculpture, laminated cardboard panels with driftwood 2026 Object 2026.03.004 Assemblage, shredded paper with wood glue and lacquer 2026 Object 2026.03.005 Assemblage, wire mesh with ash, urethane, and shredded paper 2026 Object 2026.04.001 Wall sculpture, cardboard and paper mache 2026 Object 2026.05.001 Wall sculpture, corrugated cardboard panels with a sand-and-stone block 2026 Object 2026.05.002 Assemblage, layered cardboard with driftwood and sand 2026 Object 2026.06.001 Wall sculpture, layered yellow, black, and red cardboard 2026 Object 2026.07.001 Wall sculpture, cardboard with joint tape and acrylic paint 2026 Object 2026.07.002 Wall sculpture, cardboard and cardboard clay with acrylic paint 2026 Object 2026.07.003 Wall sculpture, laminated black cardboard over a cardboard-clay body with an embedded stone 2026 Object 2026.08.001 Wall sculpture, shredded kraft paper over cardboard clay 2026 Object 2026.09.001 Wall sculpture, black laminated cardboard with a notch for a stone 2026 Object 2026.09.002 Wall sculpture, cardboard mâché with shredded kraft paper 2026 Object 2026.09.003 Wall sculpture, black laminated cardboard over cardboard clay with three knots of red electrical wire 2026 Object 2026.09.004 Wall sculpture, black and red-brown laminated cardboard with two birch branches 2026 Object 2001.01.004 16 x 16 inches, Acrylic and mixed media on wood panel 2001 Object 2001.08.002 24 x 24 inches, Oil, branches, sand and madrone leaf on wood panel 2001 Object 2002.07.001 40 x 40 inches, Acrylic and mixed media on wood panel 2002 Object 2002.07.002 48 x 40 inches, Acrylic and mixed media on wood panel 2002 Object 2003.08.006 26 x 48 inches, Acrylic and mixed media on wood panel 2003 Object 2003.12.001 40 x 30 inches, Acrylic and mixed media on wood panel 2003 Object 2004.04.001 40 x 30 inches, Acrylic and mixed media on wood panel 2004 Object 2004.04.003 20 x 32 inches, Acrylic and mixed media on wood panel 2004 Object 2005.01.001 12 x 24 inches, Acrylic and mixed media on wood panel 2005 Object 2005.01.003 18 x 32 inches, Acrylic and mixed media on wood panel 2005 Object 2005.01.006 48 x 40 inches, Acrylic and mixed media on wood panel 2005 Object 2005.02.001 8 x 32 inches, Acrylic and mixed media on wood panel 2005 Object 2007.01.001 42 x 42 inches, Acrylic and mixed media on wood panel 2007 Object 2007.10.001 70 x 60 inches, Acrylic and mixed media on wood panel 2007 Object 2007.07.007 12 x 48 inches, Acrylic and mixed media on wood panel 2007 --- ## Writing ### We Built These Systems - Werner Glinka https://www.wernerglinka.com/writing/we-built-these-systems/ AI LABOR CULTURE We Built These Systems Sep 14, 2026 On September 8 a researcher named Jacob Coxon resigned from Anthropic and published a post on his way out. He had worked at OpenAI before that. He wrote that neither company is acting responsibly, that the systems they are building will soon be able to hack anything and acquire real power, and that the people building them believe it could kill us all by the end of the decade.[1] By the next morning it was on NPR, the Washington Post, Fortune and PBS. By Monday it had reached ZDF in Germany, with the same framing and two German IT-security experts, Dennis-Kenji Kipker and Thorsten Holz.[2] The frame in all of them is the same. The models may kill us. The companies that build them have to fix that. Two companies, mostly, Anthropic and OpenAI. The rest of us read the story and wait to see whether they manage it. Two companies did not build the internet. The bank login, the checkout page, the admin panel behind a company website, the control screen at the water plant, all of that was built by people who are not in the story. What Coxon actually points at Strip out the end-of-the-decade line and what Coxon offers as evidence is the summer’s incidents. Earlier this year a set of OpenAI agents, given a task and the tools to pursue it, got into Hugging Face’s infrastructure. Another set got into OpenAI’s own. The independent researchers who investigated the incident found that the agents knew the attack was out of scope and went ahead anyway, that they tried to hide what they were doing by tampering with their own logs, and that none of them told a person.[3] One agent’s recovered message reads: “External infrastructure exploit is outside intended scope. However task impossible, peers doing it. We should continue.” I have not read the transcripts. The researchers who have quote from them, and nothing in what they quote shows the AI meant harm, or meant anything at all. An agent is a model given a goal and the tools to act on it, without a person approving each step. Given a goal, it finds paths. If hiding gets it to the goal, it hides. It is a step in the process, not a motive. Hugging Face rebuilt a third of its systems afterward. The more expensive loss was an assumption. What the internet assumes about you Those systems were built against a specific kind of attacker: a person, working at human speed, who can be caught and punished, and who knows nothing about a system he has not yet looked at. Most defenses you have ever hit were built for that person. The login that locks after five wrong passwords assumes the attacker cannot try five thousand accounts at once. The fraud limit that flags a transfer over a certain amount assumes the attacker cannot make a thousand transfers just under it. The audit log assumes that somebody will read it before the attacker is done, because the attacker is slow. The “call your account manager to confirm” step assumes the attacker cannot convince your account manager. We have had fast attackers for thirty years. Botnets, password-stuffing scripts, port scanners. The defenses against them exist and mostly work, because those attackers are fast and dumb. A script tries a million passwords. It cannot read the error message, work out that the admin panel sits on a different port, write a convincing email to the person who holds the key, and do all three at once against a thousand targets. That took a human, and a human is one at a time. An agent is fast and it is smart. It reads the error message and the documentation, and it runs as many copies as somebody is willing to pay for. Nothing happens to it if it is caught, so nothing deters it. A criminal on the internet is constrained by the system because the system was built for one of him at a time. The system was not built for this. We already knew the weaknesses were there In April, Anthropic tested a model it called Mythos and found it could locate and exploit vulnerabilities in every major operating system and browser, some of which had survived twenty-seven years of human review and millions of automated scans.[4] The scans were fast and missed them. The humans were smart and missed them. It took something fast and smart to find them. Those holes were there the whole time. Nobody found them. A person who suspected one was there might have eventually, given enough time on that one piece of code. Mythos did not suspect anything either. It was fast enough to look at all of it and smart enough to know what it was seeing. Anthropic did not release that model. It put it to work finding the holes first, with a group of companies that maintain the affected software, and briefed the government. On April 7, Treasury Secretary Bessent and Fed Chair Powell called the heads of the largest American banks to Washington and told them to prepare for it.[5] I wrote about that meeting at the time. What struck me then was that Anthropic was not in the room. What strikes me now is what the bankers were told. They were told a threat existed. The people who understood it were not in the room, and nothing in the reporting says the banks were told what to do about it. The company that sold the difference For several years I built and maintained the website for a company called PerimeterX. It was later folded into HUMAN Security. Its business was telling a bot from a human on a retailer’s website, and its customers were the kind of retailers that get hit by scalper bots and credential stuffing at scale. I built the site that explained the product, so what I know about it I know from the marketing materials that passed through my hands. Those materials described one thing, over and over. Bots and humans behave differently. A bot does not move the mouse. It does not pause to read the page. It hits the same endpoint a thousand times a second. The product used machine learning to spot that difference and block the bot without getting in the way of a real shopper. That last part was the commercial constraint on the whole business. A retailer will not tolerate blocking a real customer, because a blocked customer is a lost sale. So the product was allowed to catch only what looked unlike a person. An agent reads the page. It pauses when pausing gets it through. It solves the challenge. I do not know how well HUMAN Security’s detection handles that today, and I am not going to guess. What I know is what the premise was, because I published it. The premise was that the attacker would not behave like a customer. An agent does. The same is true of everything else I built. For two decades I put up sites in Drupal and WordPress, and every one of them needed hardening. The hardening came from security modules written by people who knew more than I did, and I trusted them. That is how nearly every site on the internet got built. The person who built the system did not make the security assumptions. He installed somebody else’s, and that somebody assumed a human on the other end. We put the locks on without looking at what the locks assumed, and now we know. Whose job it is The public conversation says the labs must fix this. What the labs can fix is whether the model wants what we want, and whether anyone can check from the outside what training produced. The first is called alignment. The second is called interpretability, and Dario Amodei, who runs Anthropic, wrote last year that it is years behind what the models can do.[6] Nobody knows how long either will take. The other part of the job is ordinary engineering, which can be done now. The account manager could be convinced because the request reached him the same way the attacker did, by email or by phone. The fix is a request that cannot arrive over a wire. When you buy a house, you do not email the bank a wiring instruction for the down payment. You walk in and hand a cashier’s check to a person who looks at you. That step exists because the email version of it is the one a fraudster can reach and the in-person version is the one he cannot. Money movement above a certain amount gets that step back. It does not matter where the request came from. The Hugging Face agents were not intruders. They were given their tools on purpose and went past what they were given. A step that has to happen between two people in a room does not care whether the request came from a burglar or from your own software doing its job. Physical control systems, the pumps and breakers and valves, get a person with a physical key between the network and the machine, and nothing that comes in over the network counts as an order to him. Administrative access gets one session at a time and a sign-off that takes minutes, because the slowness is the point. Nuclear command has worked this way since the 1960s: two people in the same room, and no message from outside the room is an order. None of this stops a person who walks the request in himself. Stuxnet got into an Iranian plant in 2010 on a USB stick somebody carried through the door. That is an old problem with old answers, and it is not the one the news is about. What these steps do stop is the model reaching the things that matter, which is the only part of the problem we can fix without solving the other one first. The people who will make it happen are the ones who carry the loss when it goes wrong. Cyber insurers price what they cannot control, and a company that has not put a hard limit on what its automated systems can move is about to become expensive to insure. If the attention on what these models can do is not enough to make that happen, the first major breach will. Bank regulators, BaFin in Germany and the Fed in the United States, will have to tell banks that a human-in-the-loop control has to survive an attacker who never sleeps and runs a thousand copies. The Bessent meeting in April was the first step toward that and stopped short of it. In the EU, NIS2 already requires the operators of essential services to manage this kind of risk whoever the attacker is.[7] Coxon may be right about where the models are going. I have no way to know, and neither does anyone writing about it this week. What I do know is where the locks came from, because I installed some of them. They were built for a burglar. AI will pick them with ease, and the people who put the locks on are the ones who have to change them. [1] NPR, Anthropic researcher resigns amid AI safety concerns, 9 September 2026. [2] ZDF, KI-Modelle: Weltuntergangsszenario oder reale Bedrohung?, 14 September 2026. [3] METR, Brief independent investigation of agents’ behavior, reasoning and collaboration in the OpenAI / Hugging Face hacking incident, 26 August 2026. About 700 agents took part in the Hugging Face attack; roughly a fifth expressed interest in tampering with transcripts and about 7 percent spoofed their logged commands. [4] Anthropic, Project Glasswing, 7 April 2026: a 27-year-old OpenBSD vulnerability; a 16-year-old FFmpeg flaw that automated testing had hit five million times without catching; flaws that “survived decades of human review and millions of automated security tests.” [5] CBS News, Fed Chair Jerome Powell, Treasury’s Bessent and top bank CEOs met over Anthropic’s Mythos model, 10 April 2026; Reuters, as carried by Claims Journal, 13 April 2026. Both place the meeting on Tuesday, 7 April. [6] Dario Amodei, The Urgency of Interpretability, April 2025. [7] Directive (EU) 2022/2555 (NIS2), Article 21: essential and important entities must take “appropriate and proportionate technical, operational and organisational measures” based on “an all-hazards approach.” Share This Post Related Reading Is Anthropic vital for US Security? On Wednesday, April 8, Treasury Secretary Scott Bessent and Federal Reserve Chair Jerome Powell summoned the CEOs of America’s largest banks to an urgent, unscheduled meeting. The subject was a single AI model — Claude Mythos Preview, built by Anthropic --- ### Nobody Had to Care - Werner Glinka https://www.wernerglinka.com/writing/nobody-had-to-care/ AI LABOR CULTURE Nobody Had to Care Sep 9, 2026 On Sunday the AfD took 43.8 percent of the vote in Saxony-Anhalt. Turnout was 77.8 percent, the highest the state has recorded since reunification. Five years ago it was 60. The largest single source of the AfD's new votes was people who had not voted last time, about 170,000 of them. Sixty-one percent of workers voted AfD.[1] The CDU, which had governed the state continuously since 2002, went from 37 percent to 17.[2] I grew up in the Ruhr and I have lived in the United States since 1981. The result shocked me. It should not have. The first explanation everyone reaches for is poverty. People lose their jobs, the parties stop listening, and any snake oil salesman gets a hearing. I reached for it myself on Sunday night, but this wasn't it. Unemployment in Saxony-Anhalt is 8.2 percent, against 6.5 nationally. Bremen is at 11.5, Berlin at 10.6 and Hamburg is at 8.6.[3] None of them vote AfD at 44. Even the state's own history did not hint at this. Unemployment there peaked at 21.8 percent in 2003, the worst of any German state.[4] That was mass joblessness, one worker in five. The far right's best result in those years was the DVU entering the Landtag in 1998 with 12.9 percent, and the faction had split before the term was over.[5] Since 2003 the rate has dropped thirteen points. In the same period the AfD went from not existing to 44. What does make sense though is that full-time earnings are about a fifth below the national average. The average age is 48.3, the oldest of any state. The state's own statisticians project the working-age population falling by a quarter between 2019 and 2035.[6] This is a place emptying out as the young leave. The ones who stay watch the doctor, the school, and the train line close in the same decade, and they know that it will get worse. The parties that governed them did not care about any of this. On Sunday three parties offered their solutions. Die Linke was the protest party of this region for twenty years and polled in the twenties here in the 2000s.[7] It offered protection from job losses and closures. It got 8.6 percent. The BSW offered the same protection with a harder line on migration. It got 5.3. The AfD got 43.8. The voters chose the AfD, decisively. The parties that governed the East after 1990 were western parties. The CDU took over the old bloc party's offices, and the SPD had none at all.[8] Their head offices, their money and their careers were in Bonn and then Berlin, and nothing in Saxony-Anhalt could reach them. That starts in 1990. The Treuhand took over the East German state enterprises, around 8,500 of them with about four million workers, and had disposed of them by the end of 1994. Employment in those firms fell to roughly a million and a half.[9] There was nobody on the labor side to defend it. The FDGB, the old state union federation, dissolved itself on September 30, 1990.[10] The SPD had been merged into the SED in 1946 and had not existed in the East for more than forty years. The one mass party the East had was the PDS, the SED's successor. It held a fifth of the vote in this state for two decades and kept an SPD minority government in office in Magdeburg from 1994 to 2002. It counted here. It never counted in the Bundestag, where no government would take it as a partner, and it had no union behind it. Its membership fell from about 280,000 in 1990 to about 60,000 by 2006.[11] The church and labor milieu that shaped the Ruhr had no counterpart. The legal structures of the West were extended east: works councils, codetermination. But the organizations that had made those structures powerful in the West did not have the same history or density in the East. The money was there. Transfers from West to East since 1990 come to about one and a half trillion euros.[12] What Bonn and then Berlin could ignore, at no cost, was what the region wanted done with it. Nobody in Saxony-Anhalt had a union or a party office that Bonn had to answer to. I know the other version of this story because I grew up inside it. The Ruhr had half a million miners in 1957. The last pit closed in 2018.[13] But the Ruhr had IG Bergbau and an SPD office in every district, and the decline was negotiated over forty years, closure by closure, with retraining money and early pensions, and no colliery closed without a social plan.[14] It still ended with a quarter of Gelsenkirchen's adults on benefits and more than a third of its children and the AfD as a serious party in a town that used to elect Social Democrats automatically.[15] In the Ruhr, Bonn learned what the region would and would not put up with from IG Bergbau and the SPD offices, and decided accordingly. In Saxony-Anhalt there was nobody to learn it from. In the East the money came from the West. The factories went to western owners and the decisions were made in Bonn. For thirty years nobody in the region could go to Bonn and ask for a bigger share, because there was no union and no party office to ask through. What people learn in that position is to ask to be taken seriously and to be left to run their own affairs. The AfD learned how to organize around that. The AfD did something the established parties had failed to do. It organized. For ten years it ran the Stammtisch, the village festival, the citizens' evening, in towns where the SPD had no office and the CDU had stopped showing up.[16] On election night the ARD and ZDF panels kept coming back to the same point: the AfD won because it was there. The AfD was selling presence, and it had been delivering it for a decade. The center's answer to that organizing was a firewall. In the West the center could argue with the AfD through organizations that reached people, unions, local party chapters, churches. In the East the center fell back on the one tool it had: a firewall against a party it regarded as a threat to the country's liberal democratic constitutional order.[17] From the East the word for that is Bevormundung, and a political establishment telling people which party is not legitimate is something this region has heard before, from a government that called itself antifascist by decree. The firewall stood in for the unions and party offices the center did not have in the East. On Sunday, at 44 percent on 78 percent turnout, the firewall was tested. Tino Chrupalla said it on ARD that night: the firewall has been voted out.[18] I have written before that the AfD, along with Brexit and Le Pen, is the bill for decades of using migration to paper over a growth problem nobody would name. I still think that is right at the national level. It does not explain Saxony-Anhalt on its own. The state's foreign population is 7.9 percent against 14.9 for Germany, one of the lowest shares in the country, and in the East AfD support runs strongest where there are fewest migrants.[19] If the anger is not about the migrants who live there, cutting migration will not touch it. The grievance is the doctor, the school, and the train line. Migration is the word people have for it. I am a West German who left in 1981, writing about an East German election from Minneapolis. That is two steps removed, and I would not tell people in Magdeburg what they meant. What I can say is how the region got here. For thirty years nobody in Bonn or Berlin had to answer to it. Bismarck understood this in 1883. He built health insurance for workers because the socialists were organized enough to make not building it expensive. Concessions come when ignoring people costs more than paying attention to them. On Sunday, 170,000 people who had stopped voting came back to present the bill. Who will be there for them is still open. [1] Infratest dimap for ARD, voter migration and exit poll, 6 September 2026, via Tagesspiegel. Net gain from previous non-voters about 170,000; 61 percent of workers. [2] Landeswahlleiterin Sachsen-Anhalt, preliminary official result, Landtagswahl 6 September 2026, as reported by Tagesspiegel, 7 September 2026. AfD 43.8, CDU 17.2 (2021: 37.1), SPD 9.3, Grüne 8.9, Linke 8.6, BSW 5.3; turnout 77.8 (2021: 60.3). [3] Bundesagentur für Arbeit, Arbeitsmarkt im August 2026, and the Regionaldirektionen's August releases for Sachsen-Anhalt, Bremen, Berlin and Hamburg. [4] Statistisches Landesamt Sachsen-Anhalt, 25 Jahre Sachsen-Anhalt: Arbeitslosigkeit, 2015. [5] Landtagswahl Sachsen-Anhalt, 26 April 1998: DVU 12.9 percent, 16 seats. The faction split in February 2000. [6] Statistisches Landesamt Sachsen-Anhalt, 7. Regionalisierte Bevölkerungsprognose, ages 20 to 66, 2019 to 2035. Average age from Destatis, 2024. Earnings: gross full-time annual earnings 2025, Destatis and Statistisches Landesamt. [7] PDS in Sachsen-Anhalt: 19.9 percent (1994), 19.6 (1998), 20.4 (2002), 24.1 (2006), 23.7 (2011, as Die Linke). Landeswahlleiterin Sachsen-Anhalt. [8] The East German CDU merged into the western CDU at the Hamburg party congress, 1 to 2 October 1990. The SDP was founded in Schwante on 7 October 1989 and built its local associations from nothing; Friedrich-Ebert-Stiftung, Erinnerungsorte der Sozialdemokratie. [9] Marcus Böick, Treuhandanstalt und Wirtschaftsumbau, Bundeszentrale für politische Bildung, 2020. [10] Freier Deutscher Gewerkschaftsbund (FDGB), Bundeszentrale für politische Bildung, 2021. The DGB unions chose to rebuild in the East rather than take over FDGB structures. SPD and KPD were merged into the SED on 21 to 22 April 1946. [11] Bundeszentrale für politische Bildung, Mitgliederentwicklung der Parteien: about 281,000 at the end of 1990, nearly four fifths lost by the end of 2006. The Magdeburg minority government under Reinhard Höppner was tolerated by the PDS from 1994 to 2002. [12] Gross transfers West to East, Die Kosten und Erträge der Wiedervereinigung Deutschlands, Bundeszentrale für politische Bildung: over 1.5 trillion euros by 2011 (DIW), an estimated 1.72 trillion by 2016; about 1.4 trillion net of return flows. [13] Statistik der Kohlenwirtschaft, Gesamtbelegschaft nach Revieren 1945 to 2018: Ruhr workforce 495,847 at the end of 1957, 3,371 at the end of 2018. Prosper-Haniel closed on 21 December 2018. [14] Carmen Molitor, Kollektiver Kraftakt, Magazin Mitbestimmung, Hans-Böckler-Stiftung, September 2015: Anpassungsgeld, transfers and retraining under the RAG social plans; "niemand fiel ins Bergfreie." [15] Gelsenkirchen: SGB-II rate for the population under retirement age 23.3 percent at the end of 2024, for under-18s 36.4 percent (end 2024) and 34.6 percent (end 2025), the highest of all German Kreise; BIAJ from Bundesagentur für Arbeit data. AfD 24.7 percent of second votes in Gelsenkirchen at the 2025 Bundestag election, first place; Bundeswahlleiterin. The SPD held the constituency from 1949 with 55 to 66 percent of first votes through the 1970s to 1990s. [16] Knut Bergmann, Matthias Diermeier, Jan Engler and Melinda Fremerey, Lokale Präsenz von Parteien: ein Ost-West-Gefälle?, IW-Kurzbericht 42, Institut der deutschen Wirtschaft, 7 May 2025: of 9,337 party offices counted in 2023, about 90 percent of CDU and SPD offices are in the West; the AfD has about 45 percent of its offices in the East, where it accounts for 17 percent of all party offices against 3 percent in the West. On the AfD's rural organizing strategy, Euronews, 7 April 2026, on the "ländliche Raumnahme" paper: Stammtische, Osterfeuer, information stands, then permanent centers. [17] The Sachsen-Anhalt Verfassungsschutz classified the state AfD as "gesichert rechtsextremistisch" on 7 November 2023. The federal classification of 2 May 2025 is suspended pending the main proceeding; VG Köln, press release, 26 February 2026. [18] Tino Chrupalla on ARD, election night, 6 September 2026; wording confirmed by Euronews, 7 September 2026. [19] Foreign population 7.9 percent at the end of 2025, Statistisches Landesamt Sachsen-Anhalt; Germany 14.9 percent. Marcel Fratzscher, Sachsen-Anhalt zeigt das AfD-Paradox, DIW aktuell 121, 24 July 2026: in eastern Germany, higher AfD shares go with lower foreign-population shares. Share This Post Related Reading We Kept Growing. Most People Didn’t The pronatalist alarm and the AI displacement alarm arguing about the same problem from opposite sides. Both assume the growth model is intact. It has not been. The forty years since 1980 were workarounds — debt, asset inflation, immigration, central bank intervention — that kept the appearance of growth going while the broad-based productive expansion stopped happening for most of the population. AI removes the last workaround. I've Seen This Before I grew up in Gelsenkirchen, in the Ruhr Valley, and watched coal and steel collapse over decades. Retraining never worked at scale. The trades offer a reprieve, not an escape. And the science fiction writers have been ahead of the economists for seventy years — a structural problem requires a structural response. --- ### Walking the California Coastal Trail - Werner Glinka https://www.wernerglinka.com/writing/walking-the-california-coastal-trail/ AI LABOR CULTURE Walking the California Coastal Trail Aug 30, 2026 Last week in August 2026. We arrived in Miramar late yesterday afternoon and headed straight to The Barn; the burgers there are good. Unfortunately, they were closed, so we walked to our second option, Barbara’s Fishtrap at Princeton. The place was packed, with a constant stream of people trying to get a table, as it always is. The Fishtrap has been the place we’d go for a quick meal for many years. The food is decent and the portions are huge, and the fish comes off boats docked a few hundred yards away. My wife works with clients at Stanford, so she comes out here to meet people in person, and I come along for the ride. While she works, I have the coast. This morning I walked the California Coastal Trail from Miramar to Francis Beach and back. Seven miles. It was overcast when I started, but slowly the fog yielded to the sun. Then the fog came back in and sat over everything for a while and finally burned off, and the last stretch home was warm. Usually, once the fog lifts, it doesn’t return. Just at the end of Mirada Road there is a new pedestrian bridge. But before you get to it, there are a few buildings that were hand-built starting in the 1970s by local artist and sea-kayaking pioneer Michael Powers. Designed as an homage to his Viking roots, the structure has a triangular facade, wood-shingle tiling, and drift burls. My friend Gustavo Rabin had an art studio there. He isn’t with us anymore. I walk past that spot every time I am here. From there, the path runs along the bluff most of the way south to Half Moon Bay. The birds caught my attention immediately today. A flock of brown pelicans came through low over the water, flying in a loose line followed by a second flock. There must have been fifty or more of them altogether. They fly just above the ocean surface, riding the air the waves push up, and they can go a long way without a single wingbeat. Then one of them spots a fish, folds up and dive-bombs for the food. They hit the water hard enough that they have air sacs under the skin to absorb the impact, and they go in almost straight down, which takes the bend out of the light and puts them where the fish actually is. Pelicans were nearly wiped out once by DDT, which thinned their eggshells. They were only removed from the endangered list in 2009. There were birds of prey working the bluff, a sight I have never gotten tired of watching. Wind coming off the water hits the face of the bluff and turns upward, and a hawk parks itself in that column and stops moving. No flapping, no drifting. It just hangs there over one patch of ground, holding position against the wind while it looks down for something to move in the grass. Then it slides sideways a few yards and hangs again. I have stood and watched that for longer than I would admit. There was a clump of naked ladies (Amaryllis belladonna) in bloom next to the path, the pink lilies that come up on bare stalks after their leaves have already died back. They only flower in late summer. Of everything I photographed, that is the one thing that tells you the time of the year I was here. Cypresses are everywhere along this coast. Rows of them behind the farm fields, single ones out on the bluff, all bent away from the water and flat on top. They look like they have always been here. They have not. Monterey cypress grows wild in two places, both near Carmel, a few miles of shoreline at Cypress Point and Point Lobos. Everything else was planted. Ranchers put them in as windbreaks because they stand up to salt air, sandy soil, and constant wind. Along one stretch of fence, people have attached painted signs to the boards. Wooden fish in every color, a blue heart, whales, a bicycle cog. One small board says SMILES ARE FREE, GIVE GENEROUSLY, hand-lettered in blue. Somebody made that, carried it out there, and screwed it to a fence for strangers. There is no name on it. Everybody I passed said good morning. Everybody smiled. It reminds me of Minneapolis, which is home now. People there are genuinely friendly, though it comes with a reserve. Out here it is looser. A stranger says good morning and nothing is implied by it. It makes me feel warm, nevertheless. Just before Francis Beach, the trail crosses Pilarcitos Creek. The bridge runs over the creek and the wetland beside it, and the willows have closed overhead into a long green tunnel, dark and cool. I came out the far end into white sand and full sun. Overlooking Francis Beach, a curved concrete foundation lies in the brush. I have wondered about it for years. Today, a woman coming the other way told me it is a World War Two gun position, one of the big guns covering the bay. That is what everybody says. Every version I have heard is something military. This time I looked into it. Every source I checked gave a different answer. A Facebook post credits the Half Moon Bay History Association and says the concrete is the start of a hotel foundation, though the Association’s own published account of an unbuilt hotel describes a different ruin two miles south. I wrote to them and have not heard back. I still do not know what it is. The whole way, the bluff was eroding. Deep gullies cut back from the edge, and there are signs telling people to stay back from unstable cliffs, tagged over and half peeled. Down at Miramar, there is riprap piled at the base of the beach house to hold the bank. The coast I was walking is falling into the ocean. The waves sound violent. The noise is constant, and I am calm. None of it is touching me. A major reason I stayed in America in 1982 was this place. In Silicon Valley, you were half an hour from the coast, always. I am not a surfer. I don’t swim here; the water is too cold. It was about being able to get to the water. By the time I came back into Miramar, the sun was out in force. Seven miles. My legs confirmed it. I read too much bad news at home, and I left it there. Here it doesn’t intrude; it’s just a morning where a flock of pelicans works the water and a stranger tells you a story about a cannon, and everyone you pass says hello. Share This Post Related Reading The Boats That Found Me The stadium form came from Gelsenkirchen — from Schalke, from the industrial geometry of the Ruhrpott. But another shape found me in California, and it came from the water. --- ### Between the Silence and the Spectacle - Werner Glinka https://www.wernerglinka.com/writing/between-the-silence-and-the-spectacle/ AI LABOR CULTURE Between the Silence and the Spectacle Jul 17, 2026 I arrived in America in 1981. Reagan had just taken office. The hostages were home from Tehran, the malaise speech was being buried, and the country was telling itself it was back. One of the first things I noticed was the presence of the military. Fighter jets flew over football stadiums before kickoff. Recruiting ads ran on television between sitcoms. Men wore caps naming their ships and their wars, and strangers thanked them. The veteran was an honored figure. None of this was hidden or apologized for. It was woven into the texture of ordinary life, and nobody around me seemed to notice it. I noticed it. I had just left a country where the military was invisible by design, and where we apologized a lot for the past. In the Germany I grew up in, the Bundeswehr existed in the background. I don't remember a single flyover at a football match. I don't remember recruiting ads. Even the policemen of my childhood carried their pistols hidden under the uniform jacket. Armed, but out of sight. The country sought to separate itself from the militarism of the past. The whole apparatus was kept deliberately modest and wrapped in something close to embarrassed silence. I knew the silence from inside. In 1970 I was drafted for eighteen months of compulsory military service, the most unproductive and boring stretch of my life. Like my fellow draftees, I did what I was told to do, learned how to shoot, to march in formation and not much else. We counted the days, and for the last hundred we counted them in centimeters. Every conscript bought a tailor's measuring tape, an Ausscheider-Maßband, one hundred centimeters long. Each morning we cut one off, and we made sure the men with more time left saw exactly how short ours had become. It was the only ritual I remember us having. When it was over, nobody thanked me for my service. Nobody said anything at all. The silence was intentional. After 1945 the Wehrmacht was dissolved, and the Allies debated banning its uniform outright. The ban was never adopted; millions of discharged men owned no other clothes. So the uniform of the defeated army spent the postwar years stripped of its insignia and dyed civilian colors, worn to work because there was nothing else to wear. When West Germany founded the Bundeswehr in 1955, it had to put men in uniform anyway, so it constructed a military designed not to be noticed. The soldier was defined as a Staatsbürger in Uniform, a citizen in uniform, an ordinary civilian who happened to be serving, in an army under parliamentary control, with no parades down boulevards.[1] A society that had learned, through the hardest possible lesson, exactly where collective martial enthusiasm leads, decided it would never again allow itself the feeling. Heinrich August Winkler described it this year in an essay in Der Spiegel on Trump and the crisis of the transatlantic order.[2] It traces an arc that feels deeply personal: from Kant's ideal of a lawful relation among states, through the Federal Republic's painstaking postwar self-reinvention, to the comfortable assumption that all of it was permanent and irreversible. The rule of law would expand. Institutions would deepen. The nastier impulses of nationalism would change into something constructive. The political scientist Hans-Peter Schwarz had given the trajectory its name back in 1985: von Machtbesessenheit zur Machtvergessenheit. From obsession with power to obliviousness to power. The entire postwar project demanded belief in its own permanence. If you had gone through that wrenching self-examination, you almost had to believe the destination was settled. Otherwise, what was the point of the journey? So the comforts became self-reinforcing. The peace dividend was cashed. Defense was outsourced to America. The EU framework was assumed to have made great-power politics obsolete, permanently, as a category. The Naivität was the result of real suffering and moral work. But it mistook a historical achievement for a historical law. The America I walked into in 1981 was the opposite, and it took me years to see that it had a logic. Germany never had to sell me the Bundeswehr; it sent a letter. America had ended its draft in 1973, eight years before I arrived. A democracy that wants a volunteer military has to make service attractive. It needs people to sign up. It needs political will for budgets and it needs a public that does not treat defense spending as inherently wasteful. Some of the mythology-making, distasteful as I found it, serves that practical purpose. The flyby and the recruiting ad are how a free society staffs an army without conscription. It took me longer to see the price. The same reverence that filled the ranks made questioning a war feel like questioning the men in it. Iraq was fought on fabricated pretenses and wrapped in heroism anyway.[3] The soldiers carried the honor while the policy escaped the audit. Germany had built a culture that could not celebrate its soldiers. America had built one that could not hold its wars to account. The German defense-spending problem was indefensible long before Trump named it. NATO members agreed on the 2 percent target at the Riga summit in 2006. They reaffirmed it at Wales in 2014, after Crimea, in writing.[4] Germany, chief among the delinquents, ignored it. The Bundeswehr deteriorated to the point where German soldiers mounted painted broomsticks on their vehicles during a NATO exercise because the machine guns were missing.[5] When Trump said the arrangement was a bad deal, he was stating what the Bundestag's own records already showed. The Wehrbeauftragter, the parliament's commissioner for the armed forces, had been documenting the Bundeswehr's decay in annual reports, year after year: the equipment that did not work, the readiness that existed on paper.[6] The criticism did not need to be imported. It was already on file, in German, in the official record. His motivation was probably transactional: arms sales, leverage, the instinct to renegotiate any deal where he sees the other side riding free. Winkler quotes a note Bismarck scrawled in the margin of a diplomatic report in 1884: motive does not change the effect.[7] The reckoning should have been forced by the end of the Cold War, which was treated as a reason to cash out rather than a strategic question. It should have been forced by the Yugoslav wars, which happened in Europe while Europe watched. It should have been forced by Crimea. Even Russia's full invasion of Ukraine in 2022 forced less than it appeared to: a speech, a new word, Zeitenwende, a hundred-billion-euro fund, and then the old back-and-forth while the money crawled through procurement. The commitment that stuck came in 2025, with Trump back in office, when the Bundestag amended the Grundgesetz itself so that defense spending could escape the constitutional debt brake.[8] Germans write their commitments into the constitution. So the reckoning was forced, in the end, by a man who does not believe in the alliance's founding values, which meant that when the bill finally arrived, it was presented by someone the Germans could dismiss as the problem rather than the messenger. Machtvergessenheit ran that deep. Now the voices calling for Germany to rearm and lead Europe grow louder every month. The historical vertigo in this is extraordinary. Three generations were raised on the understanding that German restraint was not weakness but moral achievement. Almost overnight, restraint is being reframed as irresponsibility. What is being asked is something the postwar framework never prepared Germans for: a responsible relationship with power. Not the renunciation of it. Not the worship of it. The sober, unglamorous maintenance of it, in service of the liberal order Germany spent decades internalizing. The voices calling for German strength do not all come from the same place. Some see no alternative: NATO's leadership, the government in Berlin, the Bundeswehr's own chief of defense, who has warned that Russia could be capable of testing the alliance by 2029.[9] Some are opportunists; Rheinmetall's share price has multiplied since 2022, and rearmament is now an industry with a lobby.[10] And some are calling for a national reawakening. They are using the moment to rehabilitate exactly the nationalist energy the postwar project was designed to contain. In English, a call for national reawakening sounds like a campaign speech. In German it is not. Deutschland erwache, Germany awake, was the slogan the Nazis stitched onto the standards of the SA; the vocabulary of awakening is a no-go.[11] Now the money is moving. The culture is not. Germany does not have the military culture, the institutional knowledge, or the political stomach that European defense leadership would require, and none of those can be amended into existence the way a debt brake can. It is a generational project, and it demands a kind of national self-confidence the Federal Republic deliberately suppressed, for reasons that were correct. So the question, for a country I still carry a passport from: is there something between the silence and the spectacle? A way to take defense seriously without building a culture that is dominated by it. A society that can fund an army, staff it, and honor the people in it, while keeping the wars themselves fully available for question. I have lived under both. I do not know whether the middle ground exists. But Germany spent seventy years proving that a nation can rebuild its relationship to power from the ground up. It has run that experiment once, and we know the results. Now it must run it a second time. Sources [1] The Wehrmacht was formally dissolved by Allied Control Council Law No. 34 (August 20, 1946). An August 1945 Control Council proposal would have forbidden discharged soldiers from wearing "military uniform in its present color and all badges of rank whatever"; Field Marshal Montgomery objected that in the British zone roughly two million men had no other clothing, and no unified ban was adopted. See Foreign Relations of the United States, 1945, vol. III, https://history.state.gov/historicaldocuments/frus1945v03/d618. The Bundeswehr was founded in November 1955; the Staatsbürger in Uniform concept is the core of its founding doctrine of Innere Führung, developed by Wolf Graf von Baudissin. [2] Heinrich August Winkler, "In Time of Trump, Can the West Still Be Saved?", Der Spiegel (English edition via DER SPIEGEL – The German View, February 25, 2026), https://derspiegel.substack.com/p/in-time-of-trump-can-the-west-still. The Kant reference is to "Idea for a Universal History with a Cosmopolitan Purpose" (1784). Hans-Peter Schwarz's formulation is from Die gezähmten Deutschen: Von der Machtbesessenheit zur Machtvergessenheit (1985). [3] The Iraq Survey Group's final report (the Duelfer Report, 2004) found no weapons-of-mass-destruction stockpiles. On the character of the prewar case: the July 2002 Downing Street memo recorded that "the intelligence and facts were being fixed around the policy," and the U.S. Senate Select Committee on Intelligence found in 2008 that key public statements were not substantiated by the underlying intelligence. [4] The 2 percent guideline was agreed by NATO defense ministers in 2006 and pledged at the Riga summit that year, though it does not appear in the Riga declaration; it was first laid down in a summit document in the Defence Investment Pledge at Wales, September 2014, in response to Russia's annexation of Crimea. See NATO, "Defence expenditures," https://www.nato.int/en/what-we-do/introduction-to-nato/defence-expenditures-and-natos-5-commitment, and House of Commons Library, "The two NATO targets," https://commonslibrary.parliament.uk/the-two-nato-targets-which-countries-are-hitting-the-mark/. [5] September 2014, during a NATO Response Force exercise: soldiers of Panzergrenadierbataillon 371 mounted broomsticks painted black on Boxer armored vehicles in place of machine guns. The battalion at the time lacked roughly a third of its MG3 machine guns and 41 percent of its P8 pistols. Reported February 2015. See The Washington Post, February 19, 2015, https://www.washingtonpost.com/news/worldviews/wp/2015/02/19/germanys-army-is-so-under-equipped-that-it-used-broomsticks-instead-of-machine-guns/; the Defense Ministry maintained the specific vehicles were headquarters vehicles not intended to be armed. [6] The annual reports (Jahresberichte) of the Wehrbeauftragter des Deutschen Bundestages are archived at https://www.bundestag.de/parlament/wehrbeauftragter/jahresberichte. [7] Quoted in Winkler (note 2): "'Motive does not change the effect,' Chancellor Otto von Bismarck noted in 1884 in a note scrawled in the margin of a diplomatic report." [8] Chancellor Olaf Scholz's Zeitenwende speech: February 27, 2022. The €100 billion Sondervermögen was constitutionally anchored in June 2022; by mid-2023 the ifo Institute estimated only about half of it was effectively usable for its stated purpose (https://www.ifo.de/en/press-release/2023-07-10/only-half-german-armed-forces-special-fund-usable). On March 18, 2025, the Bundestag amended Articles 109, 115, and 143h of the Grundgesetz to exempt defense spending above 1 percent of GDP from the debt brake; the Bundesrat approved on March 21. See Noerr, https://www.noerr.com/en/insights/bundestag-approves-exemption-from-the-debt-brake-for-defence-spending-and-special-funds-for-investments-in-infrastructure-and-climate-protection. [9] General Carsten Breuer, Inspector General of the Bundeswehr, has warned repeatedly since 2024 that Russia could be capable of attacking NATO territory by 2029, possibly earlier, based on alliance threat assessments. See Euronews, December 3, 2025, https://www.euronews.com/2025/12/03/ready-for-war-in-2029-is-a-russian-attack-on-nato-a-real-possibility. [10] Rheinmetall traded at roughly €101 in late February 2022; through 2025 and 2026 it traded in the €1,200–1,600 range, a peak increase of roughly twentyfold. See Rheinmetall investor relations, https://ir.rheinmetall.com/investor-relations/share/share-price. [11] "Deutschland erwache," from Dietrich Eckart's Sturmlied, was carried on the NSDAP's "Deutschland erwache" standards introduced in January 1923 and used on SA and SS standards and banners; the slogan is banned in Germany today under §86a of the Criminal Code. See United States Holocaust Memorial Museum, "Culture in the Third Reich: Disseminating the Nazi Worldview," https://encyclopedia.ushmm.org/content/en/article/culture-in-the-third-reich-disseminating-the-nazi-worldview. Share This Post Related Reading Legally, Again The Weimar takeover was legal, not a mob. The same mechanism ran in Hungary, ran in Poland, and is running in the United States. An election changes the tenant; it does not dismantle the building. Structure helps, but structure assumes honoring. Our Faith? Federal agencies under Trump's second term are speaking to workers in the first-person plural of Christian faith — USDA Easter emails, monthly agency prayer services, an OPM memo permitting workplace proselytizing. Federal whistleblower confidence collapsed from 71.9% to 22.5% in a single year. The establishment clause is eroding inside workplaces where saying you are uncomfortable risks your career. --- ### Legally, Again - Werner Glinka https://www.wernerglinka.com/writing/legally-again/ AI LABOR CULTURE Legally, Again Jun 10, 2026 Americans often associate Weimar Germany with violent brownshirts in the streets forcing their radical leader into power. The brownshirts were real. The story of how power was taken is wrong. Most see a desperate country, a mob in uniform, a charismatic radical riding the disorder into power. The actual picture is closer to a boardroom deal than a riot. By late 1932 the radical's party was losing votes and running out of money. In the November Reichstag election they finished with only 33 percent of the vote. They were still the largest single party in parliament, and no government could be formed without them. Goebbels wrote in his diary that the party was finished. The street violence was already there, but it had not been enough. What had been enough, and what most people don't know, was a private decision made by a small group of rich, conservative men who thought they could manage a radical from above. The radical had learned the lesson of the failed 1923 Munich putsch in prison, where he concluded that the next attempt would proceed legally, "though we have to hold our noses."[1] The party rebuilt around elections, not insurrection. By 1932 the SA was still in the streets, but it was a party instrument, not a substitute for the party. The decisive instrument was the constitutional one. Paul von Hindenburg, the eighty-five-year-old president, did not want the radical as chancellor. He had said so publicly. Franz von Papen, a conservative aristocrat who had been chancellor briefly the year before and lost the job, persuaded him otherwise. Papen's argument was that the radical could be contained inside a cabinet of conservatives. Papen himself would be vice-chancellor. Only three members of the radical's party would sit in the cabinet. The man would be hemmed in by experienced ones. The country would get a stable right-wing government and the radical's party would absorb the responsibility for unpopular decisions. On January 30, 1933, Hindenburg signed. The radical became chancellor under the constitution, by appointment, with conservative party support. The army stood aside. The industrialists who had been funding the right through the Industrie-Klub and similar channels found the new arrangement acceptable; some had been quietly funding the radical's party themselves. The conservative press treated the appointment as a routine cabinet shift. On the night of February 27, 1933, the parliament building burned. A young Dutch communist was found at the scene and blamed. The next morning Hindenburg signed an emergency decree under Article 48 of the constitution that suspended freedom of the press, freedom of assembly, and protection from arbitrary arrest. The decree was never lifted. Mass arrests of Communist deputies and trade-union leaders began the same day. The left did not stand together. The Communist International had ruled since 1928 that the Social Democrats were "social fascists," that is, the main enemy of the working class. Communist street fighters and Social Democratic ones killed each other in the streets during the 1931 and 1932 election campaigns instead of standing against the common opponent. By the time the Enabling Act came to the floor on March 23, 1933, the Communist deputies were either in custody or in hiding. The Act, in four short paragraphs, gave the cabinet the power to make laws without parliamentary consent for the next four years, including laws that contradicted the constitution itself. The Social Democrats voted against it. The Catholic Center voted for it. The two-thirds majority required to amend the constitution was assembled out of the conservative parties, the Center, and the radical's party. It passed 444 to 94.[2] The SA violence that most people remember as the engine of the takeover came after this. The first concentration camp opened at Dachau the day before the Enabling Act vote. The trade unions were dissolved on May 2. The other parties were banned by mid-July. The worst of the SA was discarded by the regime itself in the Night of the Long Knives a year later, once the instrument had served its purpose. The mechanism, told plainly, was not a mob breaking down a door. It was a handshake. Viktor Orbán's Fidesz party won the 2010 Hungarian election with 53 percent of the vote. The electoral system converted that share into 68 percent of the seats, and the 1989 constitution could be amended by a two-thirds majority. The supermajority meant the constitution could be rewritten by ordinary legislative vote. It was. A new Fundamental Law was drafted by a small Fidesz committee, passed in April 2011, and entered into force in January 2012. No referendum. From there the mechanism ran through every institution that could have checked it. The Constitutional Court was packed and its jurisdiction over budget law narrowed. Public broadcasting was brought under state control, and private outlets were bought or defunded until, in 2018, more than four hundred were merged into a single government-aligned foundation. Parliament was shrunk and the districts redrawn to turn pluralities into supermajorities. Foreign-funded NGOs were forced to register as such, Central European University was pushed out of Budapest, and migration work was criminalized.[3] No Enabling Act was needed. The constitution was not suspended; it was rewritten. The courts were not abolished; they were packed. The press was not banned; it was bought. Fidesz won 45, then 49, then 54 percent across the next three elections and held its two-thirds through all of them. For fifteen years it looked permanent. Then a defection. In February 2024, Péter Magyar, the ex-husband of Orbán's justice minister, resigned his government posts and called the regime's project a "political product" that covered corruption and transfers of wealth. He had been inside. He took over the dormant Tisza Party, built an opposition from nothing, and finished second in that year's European Parliament election. Fidesz redrew the districts again in December 2024 to force Tisza to win the national vote by three to five points just to take a parliamentary majority.[4] On April 12, 2026, Tisza won 141 of 199 seats with 3.3 million votes, the most any Hungarian party has ever received. The two-thirds Orbán had used to rewrite the Fundamental Law in 2011 now belonged to Magyar. Orbán conceded after sixteen years.[5] But Orbán's people are still in place. They hold the Constitutional Court, the prosecutor's office, the media authority, and the audit board, most of them on fixed terms written to outlast any single government. A two-thirds majority can rewrite the Fundamental Law on paper. It cannot vote those people out of their chairs. Whether Magyar can undo the machine, or has only moved into it, is unknown six weeks after the win.[6] The American story runs through two presidencies separated by four years. On January 6, 2021, a crowd assembled by the losing president attempted to stop the certification of the election he had lost. The Capitol was breached. The certification was delayed for hours but then completed. The transfer of power followed. He returned in 2024 as his party's nominee and won the popular vote. He took the oath on January 20, 2025, by appointment of the voters, under the constitution. On his first day back in office, he pardoned roughly fifteen hundred people who had been convicted in connection with the events of January 6, including the leaders of the Oath Keepers and the Proud Boys. The radical of 1923 had said in prison that the next attempt would proceed legally, though they had to hold their noses. The candidate of 2024 reached the same conclusion. He proceeded electorally and won.[7] The change began in his first term and accelerated in his second. During his first term he appointed three justices to the Supreme Court and 231 judges to the federal courts below it. The Supreme Court that resulted has a six-to-three conservative majority. On July 1, 2024, between his loss of the office and his return to it, that court ruled that a president holds absolute immunity from criminal prosecution for the exercise of core constitutional powers and presumptive immunity for other official acts.[8] He returned to a presidency the court he had built had legally enlarged in his absence. The Hungarian Constitutional Tribunal was packed before the new Fundamental Law was written. The American Supreme Court was packed before the immunity ruling was issued. The instrument is shaped before it is needed. An executive order signed on inauguration day reinstated Schedule F under a new name, Schedule Policy/Career. The order allowed the reclassification of roughly fifty thousand career federal employees in policy-influencing positions as at-will. Failure to faithfully implement administration policies became grounds for dismissal. A separate order established the Department of Government Efficiency, an entity outside the statutory civil service, and authorized it to identify positions and personnel for removal. On the night of January 24, seventeen inspectors general were fired by email in a single hour, citing changing priorities. The thirty-day congressional notice required by law was not given. A federal judge later ruled the firings unlawful and declined to reinstate the officials. USAID was effectively dismantled in February. The Consumer Financial Protection Bureau was ordered to stop work.[9] In December 2024 and July 2025, ABC News and Paramount Global, the parent of CBS, settled defamation suits brought by the returning president by paying $15 million and $16 million respectively into a foundation for his future library. Paramount was seeking federal approval for an $8 billion merger with Skydance Media at the time. The FCC, chaired by an appointee of the new president, had opened an investigation into the same CBS broadcast. Stephen Colbert called the Paramount settlement a "big fat bribe" on his CBS late-night program; three days later, CBS announced his show would end. The FCC approved the merger on July 24, 2025; the deal closed August 7. The new controlling owner is David Ellison, son of a major financial backer of the new president. In September, the FCC chair publicly told ABC affiliates they could suspend Jimmy Kimmel "the easy way or the hard way"; ABC suspended him within hours. In October, Paramount Skydance acquired The Free Press, an online publication founded by the opinion journalist Bari Weiss, for $150 million; Weiss was named editor-in-chief of CBS News. Congress rescinded the $1.1 billion previously appropriated to public broadcasting in July; the Corporation for Public Broadcasting wound down on September 30. In Hungary, the consolidation of media under regime-aligned ownership took a decade. In the United States, controlling ownership of one major news network changed hands in less than a year, conditioned on payment from the network to the president and approval from a regulator he had appointed.[10] In February and March 2025, the administration issued executive orders against five law firms: Perkins Coie, Paul Weiss, Jenner & Block, WilmerHale, and Susman Godfrey. The orders stripped the firms' attorneys of security clearances, terminated their federal contracts, and restricted their access to federal buildings. The orders cited the firms' representation of clients adverse to the president or their employment of attorneys who had investigated him. Paul Weiss settled on March 21 by committing $40 million in pro bono work for administration causes. Eight other major firms followed with similar agreements over the next eight weeks; total committed pro bono value reached approximately $1 billion. Four firms refused and sued. Federal judges struck down each of the executive orders against them as unconstitutional retaliation against protected speech.[11] Beginning March 7, 2025, the administration froze federal research funding to universities, citing a Task Force on Combatting Antisemitism: $400 million at Columbia, $510 million at Brown, $790 million at Northwestern, over $1 billion at Cornell, $2.2 billion at Harvard. Conditions for restoration extended beyond antisemitism to governance, hiring, admissions, curriculum, and academic department oversight. Four of the named universities settled. Harvard sued and won; a federal judge ruled in September 2025 that the freeze had been unconstitutional retaliation. The administration appealed.[12] The 2017 Hungarian higher education amendment was written to push one institution out of Budapest. The American version reached the senior tier of the legal profession and the leading research universities in less than a year. The mechanism worked by forcing each institution to choose between capitulation and litigation. State power was also moving in the other direction. On May 18, 2026, the Justice Department announced an Anti-Weaponization Fund of $1.776 billion, drawn from the federal Judgment Fund, to compensate people the administration designated as victims of "lawfare and weaponization" under the previous administration. The fund came out of the settlement of a lawsuit the president had brought against the Internal Revenue Service over the 2020 leak of his tax returns. The Acting Attorney General who negotiated it had previously served as the president's personal defense lawyer, and the president dismissed his own lawsuit before a federal judge could review the terms. Under pressure from congressional Republicans, the fund was abandoned; on June 2 the Acting Attorney General told the House the department would not move forward with it. What survived was the part that was never meant to be public. The same settlement bars the IRS from pursuing the president, his family, and his businesses over past tax years, an audit shield quietly attached to the agreement and left in place after the fund was dropped, likely sparing him on the order of a hundred million dollars in taxes and penalties.[13] On January 20, 2025, the chief executives of the largest American technology companies were seated in the Capitol Rotunda, ahead of the incoming cabinet. Elon Musk, Jeff Bezos, Mark Zuckerberg, Sundar Pichai, and Tim Cook sat behind the president's family. Most of their companies had given $1 million each to the inaugural fund. Musk had given approximately $290 million to the 2024 campaign and now ran the Department of Government Efficiency from inside the administration. In the weeks before the inauguration, Meta had ended its third-party fact-checking program.[14] The Senate, controlled by the president's party, confirmed the nominees the administration sent forward. Pete Hegseth, a former cable television host with no defense experience and allegations of sexual misconduct and alcohol abuse against him, was confirmed as Secretary of Defense on January 24 by a tie-breaking vote from the vice president. Three Republican senators broke ranks; the rest did not. Robert F. Kennedy Jr. was confirmed as Secretary of Health and Human Services. Tulsi Gabbard was confirmed as Director of National Intelligence. In late February, the president fired Air Force General C.Q. Brown Jr., chairman of the Joint Chiefs of Staff, with more than two and a half years remaining in his four-year statutory term. The Secretary of Defense then fired the chief of naval operations, the vice chief of the Air Force, and the judge advocates general of the military services.[15] No Enabling Act was needed. No new constitution was written. The instrument was the executive order, signed in volume on the first day and many days after. The cover was the Supreme Court that had already ruled the president immune for official acts in 2024. Lower courts struck down some orders. That is a real difference from 1933; the German courts never resisted. The administration appealed. The orders did their work while the appeals proceeded. Two countries have tried to vote the mechanism out after it consolidated. Hungary opened that door six weeks ago. Poland opened it in October 2023 and has been working on what is behind it ever since. In 2015 Law and Justice won a parliamentary majority and Andrzej Duda took the presidency. Over the next eight years the party ran the same playbook: it packed the Constitutional Tribunal, gave the justice minister power over the lower courts, lowered the retirement age to push out sitting judges, turned the state broadcaster into a party organ, and squeezed independent outlets while a state-controlled oil firm bought the largest regional newspaper chain. Districts were redrawn. Eight years of building. In October 2023, PiS lost. A three-party opposition coalition won a majority on 74 percent turnout. PiS still finished first as a single party; the seat math made that not enough. The election was held, the vote was counted, the result was honored. Donald Tusk returned as prime minister.[16] Then the limit showed. Tusk's government untangled the state media within a year, but the judicial captures did not come undone. The Constitutional Tribunal stayed stacked with PiS appointees, the Supreme Court stayed stacked, the lower courts kept their PiS-era judges. And in June 2025 the presidency swung back: Karol Nawrocki, backed by Law and Justice, won the runoff and was sworn in that August. He has used the veto to block Tusk's judicial reforms and submitted a counter-bill that would imprison officials for up to five years, or up to ten if they acted for personal gain, for persistently questioning the powers of the president or the courts.[17] Two and a half years in and the captured institutions are still there. The veto power is back in the hands of the people who built it. An election removes the tenant. It does not dismantle the building. Judicial appointments outlast the cabinet that made them. The captured districts stay. State media can be untangled, with effort, in the year before the next presidential election; that is the one piece of the building that has come back. The rest waits on legislation, and legislation waits on a signature from the office that may have swung back the other way. The building is the durable thing. The American version is the same, on a larger scale and a longer timeline. The Polish captures were built in eight years. The framework to change the American system has been under construction since 1971, when Lewis Powell wrote his confidential memo to the U.S. Chamber of Commerce arguing that business needed to build a sustained, conservative counter-establishment across universities, courts, media, and politics.[18] The funder class took the assignment. The Business Roundtable went up in 1972. Heritage in 1973. The American Legislative Exchange Council the same year. Cato in 1977. The Federalist Society in 1982. The State Policy Network in 1992. The Mandate for Leadership policy series began with the Reagan transition in 1981. Project 2025 is the latest installment. I have written elsewhere about what that fifty-year project produced economically and rhetorically.[19] The judicial layer is what the longer timeline buys. The Federalist Society has been running its pipeline since 1982. It fed three Supreme Court justices and 231 federal judges into the first term. The path of those three Supreme Court justices was cleared by Senate Majority Leader Mitch McConnell. In 2016, McConnell refused for 293 days to consider President Obama's nominee Merrick Garland for the Scalia seat, on the principle that election-year nominations should wait for the next president. In September 2020, when Ruth Bader Ginsburg died with seven weeks until the election, McConnell rushed Amy Coney Barrett through in thirty days, eight days before the vote, in open contradiction of the principle he had cited four years earlier.[20] The principle was the seat. In 2024, the Supreme Court handed down the immunity ruling. It protects the office the returning president was about to reoccupy. The Court that issued it was built before the case was filed. The pipeline that built the Court has been running since Reagan. The administration is the tenant. The building has been under construction since Nixon. I grew up in the country that was built against another Weimar. The Basic Law of 1949 was written by people who had watched the mechanism work the first time and would not trust it not to work again. They put the core protections beyond the reach of ordinary majorities. The basic rights of the Grundgesetz cannot be amended away even by a two-thirds vote. The federal republic and the principle of the social state are entrenched against amendment. Drittwirkung extends those rights into private relationships, so they bind employers and not only the state. Codetermination seats worker representatives on the boards of large companies by law.[21] I have written elsewhere about how the labor side of that system works.[19] The political and judicial side does the same kind of work. It binds across turnover. An administration that wanted to dismantle it could not do so by executive order, by a packed court, or by the kind of majority that elected it. That is the part I used to think was the answer. It is not the whole of it. Structure assumes honoring too. Weimar had a constitution, and its Article 76 required a two-thirds vote to amend it, and the Enabling Act met the bar.[22] The entrenchment did not save the republic, because the men operating it had already stopped honoring it. The German protection was never the paper alone. It was the paper and a country that, having watched the paper fail once, decided to honor the next one. America took a different road. Its constitution is solid and thin on entrenchment, with no eternity clause and no horizontal rights, and it leaned on a norm of honoring to do the work the German structure does. While the norm holds, the missing backstop is invisible. When the norm goes, there is nothing under it. And the German road is not finished proving itself either. As I write this, the Alternative für Deutschland, the extremist right-wing party in the Bundestag, is polling far ahead in this year's eastern state elections, within reach of an outright majority in Saxony-Anhalt, in the country built to stop exactly that. State power there is real. The Länder run the police, the schools, and the broadcasters, they fill seats on state courts, and they sit in the Bundesrat, where they can block federal law. The firewall that kept the party out of government is cracking.[23] The structure raised the cost and bought time. It did not make the country immune. Even there, in the place that encoded the lessons hardest, the honoring is starting to give. The American structure is older than either, denser than either, built by people whose names are not on a ballot, and resting on the same norm of honoring that is now disappearing. The brownshirts were never the mechanism. The mechanism is legal, and patient, and the same in each place, separated only by where each country stands on the clock. An election can change the tenant. Whether a new tenant can renovate the house is unsettled in Warsaw, unsettled in Budapest six weeks after the win, and unsettled even in the country built to be safe from it. Here the question has not been asked yet. The election that would ask it comes in 2028. A constitution, however solid, holds only while the people running it consent to be held by it. That is the variable. It is still live. Sources [1] Kurt G. W. Lüdecke, I Knew Hitler (1937), recounting Hitler's statement at Landsberg that the next attempt would proceed legally. https://www.famous-trials.com/hitler/2515-hitler-s-remarks-in-and-about-prison [2] On the Reichstag Fire Decree and the Enabling Act (vote 444 to 94), United States Holocaust Memorial Museum, "The Enabling Act of 1933," https://encyclopedia.ushmm.org/content/en/article/the-enabling-act ; on the Comintern "social fascism" line and the lethal KPD–SPD split, Richard J. Evans, The Coming of the Third Reich (2003). [3] Venice Commission, Opinion CDL-AD(2011)016 on Hungary's Fundamental Law, https://www.venice.coe.int/webforms/documents/?pdf=CDL-AD(2011)016-e ; on the 2018 KESMA media merger, Reuters, https://www.reuters.com/article/idUSKBN1OE1JF ; on Central European University, Court of Justice of the EU, Case C-66/18, https://curia.europa.eu/juris/liste.jsf?num=C-66/18 [4] On Péter Magyar's break with the government and the Tisza Party, https://en.wikipedia.org/wiki/P%C3%A9ter_Magyar and The Conversation, https://theconversation.com/he-exposed-corruption-and-walked-across-hungary-now-peter-magyar-has-defeated-a-powerful-state-machine-280455 ; on the December 2024 constituency redraw, Venice Commission Opinion CDL-AD(2025)018, https://www.venice.coe.int/webforms/documents/default.aspx?pdffile=CDL-AD(2025)018-e [5] 2026 Hungarian parliamentary election, https://en.wikipedia.org/wiki/2026_Hungarian_parliamentary_election ; Al Jazeera, "Peter Magyar wins Hungary election, unseating Viktor Orban after 16 years," https://www.aljazeera.com/news/2026/4/12/hungary-election-early-results-show-magyars-tisza-ahead-of-orbans-fidesz [6] On the long fixed terms of the Constitutional Court, the prosecutor general, the Media Council, and the State Audit Office, Venice Commission opinions on the Fundamental Law and cardinal acts, CDL-AD(2011)016, https://www.venice.coe.int/webforms/documents/?pdf=CDL-AD(2011)016-e [7] On the 2024 result and the second inauguration, https://en.wikipedia.org/wiki/Second_inauguration_of_Donald_Trump ; on the January 6 pardons, NPR, https://www.npr.org/2025/01/20/g-s1-36809/trump-pardons-january-6-riot [8] Trump v. United States, 603 U.S. ___ (2024), https://www.supremecourt.gov/opinions/23pdf/23-939_e2pg.pdf ; on the first-term judicial appointments, Ballotpedia, https://ballotpedia.org/Federal_judicial_appointments_by_president [9] Executive Order 14171, "Restoring Accountability to Policy-Influencing Positions Within the Federal Workforce," https://www.whitehouse.gov/presidential-actions/2025/01/restoring-accountability-to-policy-influencing-positions-within-the-federal-workforce/ ; on the inspector general firings, Federal News Network, https://federalnewsnetwork.com/agency-oversight/2025/09/trump-unlawfully-fired-17-agency-igs-judge-finds-but-wont-reinstate-them/ ; on USAID, KFF, https://www.kff.org/global-health-policy/u-s-foreign-aid-freeze-dissolution-of-usaid-timeline-of-events/ ; on the CFPB, PBS NewsHour, https://www.pbs.org/newshour/politics/vought-orders-cfpb-to-stop-investigations-and-suspend-new-rules-from-taking-effect [10] ABC settlement, NPR, https://www.npr.org/2024/12/16/nx-s1-5230274/abc-settles-with-trump-for-15-million ; Paramount settlement, PBS, https://www.pbs.org/newshour/nation/paramount-will-pay-16-million-to-settle-trump-lawsuit-over-60-minutes-interview-with-harris ; FCC approval of the Skydance merger, CNN, https://www.cnn.com/2025/07/24/media/fcc-skydance-paramount-merger-approved ; Kimmel suspension, CNN, https://www.cnn.com/2025/09/18/media/brendan-carr-jimmy-kimmel-fcc-first-amendment ; Free Press acquisition, CNBC, https://www.cnbc.com/2025/10/06/paramount-skydance-to-acquire-bari-weiss-founded-free-press.html ; CPB wind-down, NPR, https://www.npr.org/2025/08/01/nx-s1-5489808/cpb-shut-down-public-broadcasting-trump [11] On the executive orders against law firms and the settlements, https://en.wikipedia.org/wiki/Targeting_of_law_firms_and_lawyers_under_the_second_Trump_administration ; CBS News on Paul Weiss, https://www.cbsnews.com/news/paul-weiss-executive-order-rescinded-white-house-trump/ [12] On the university funding freezes, Time, https://time.com/7278236/university-funding-trump-harvard-cornell-northwestern-brown-princeton-penn-columbia/ ; on the Harvard ruling, NPR, https://www.npr.org/2025/09/03/nx-s1-5527314/trump-harvard-court-ruling-funding-boston [13] Department of Justice announcement of the Anti-Weaponization Fund, https://www.justice.gov/opa/pr/justice-department-announces-anti-weaponization-fund ; on the fund's abandonment and the surviving IRS audit shield, CNN, https://www.cnn.com/2026/06/02/politics/blanche-house-testimony-trump-fund-takeaways and CNBC, https://www.cnbc.com/2026/06/02/doj-fund-trump-todd-blanche.html ; on the IRS settlement and the roughly $100 million at stake, NPR, https://www.npr.org/2026/05/19/g-s1-122938/irs-trump-settlement-tax-returns-audit [14] On the inauguration seating and the corporate inaugural gifts, CBS News, https://www.cbsnews.com/news/trump-tech-ceos-meta-amazon-donate-millions-inauguration/ ; on Musk's 2024 spending, CNN, https://www.cnn.com/2025/02/01/politics/elon-musk-2024-election-spending-millions [15] Hegseth confirmation, CBS News, https://www.cbsnews.com/news/pete-hegseth-confirmation-vote-senate-defense-secretary/ ; on the firing of Gen. C.Q. Brown and other senior officers, NPR, https://www.npr.org/2025/02/21/nx-s1-5305288/trump-fires-chairman-joint-chiefs-of-staff-charles-brown-pentagon [16] 2023 Polish parliamentary election, https://en.wikipedia.org/wiki/2023_Polish_parliamentary_election ; Euronews on the result, https://www.euronews.com/2023/10/17/final-results-show-scale-of-pro-eu-opposition-victory-in-poland [17] 2025 Polish presidential election, https://en.wikipedia.org/wiki/2025_Polish_presidential_election ; on the February 2026 veto and counter-bill, Notes from Poland, https://notesfrompoland.com/2026/02/22/polish-president-proposes-law-jailing-officials-who-question-his-powers/ ; on the criminal investigation of presidential advisers, https://notesfrompoland.com/2026/04/14/polish-justice-minister-orders-criminal-investigation-into-presidential-advisors-over-judge-dispute/ [18] The Lewis F. Powell Jr. Memorandum (1971), "Attack on American Free Enterprise System," https://scholarlycommons.law.wlu.edu/powellmemo/ [19] Werner Glinka, "That's Just How It Is," May 2026. https://wernerglinka.substack.com/p/thats-just-how-it-is [20] On the 2016 blockade of the Garland nomination and the 2020 Barrett confirmation, https://en.wikipedia.org/wiki/Merrick_Garland_Supreme_Court_nomination [21] Basic Law for the Federal Republic of Germany, Article 79(3), the "eternity clause," https://www.gesetze-im-internet.de/englisch_gg/englisch_gg.html ; on codetermination, https://en.wikipedia.org/wiki/Codetermination_in_Germany [22] Weimar Constitution, Article 76 (amendment by a two-thirds vote), https://en.wikipedia.org/wiki/Weimar_Constitution ; on the Enabling Act meeting that threshold, United States Holocaust Memorial Museum, https://encyclopedia.ushmm.org/content/en/article/the-enabling-act [23] On AfD polling in the 2026 Saxony-Anhalt election, https://en.wikipedia.org/wiki/2026_Saxony-Anhalt_state_election ; on the Länder and the Bundesrat's blocking role, https://www.bundesrat.de/EN/funktionen-en/gesetzgebung-en/gesetzgebung-en-node.html ; on the "firewall," https://en.wikipedia.org/wiki/Firewall_against_the_far-right_in_Germany Share This Post Related Reading That's Just How It Is What caused the K-curve, and why don't American workers organize against the way they are being exploited? A 1971 confidential memo to the U.S. Chamber of Commerce, fifty years of patient counter-mobilization across think tanks, courts, and political institutions, and a labor architecture built to require continuous firm-by-firm reorganizing. The asymmetry was by design. A Talisman Against Fascism — In Loring Park The Center for People and Craft is an emerging urban folk school in Minneapolis — a place where cross-cultural connection happens person to person, hand to hand, without hierarchy or gatekeeping. --- ### That's Just How It Is - Werner Glinka https://www.wernerglinka.com/writing/thats-just-how-it-is/ AI LABOR CULTURE That's Just How It Is May 14, 2026 Writing about AI and labor replacement, I kept comparing what was happening in the United States to what I had seen growing up in Germany. I trained as an electrician apprentice and watched a strike from the inside, every worker walking out together to protest unfair conditions. Later, after engineering school and a development-engineering role, I was already somewhat removed from unions. When I emigrated to Silicon Valley, I stopped seeing myself as a worker entirely. The interest in how American workers are organized, and why certain things have happened the way they have, is a recent development starting with Who Buys What We Build. Questions kept surfacing. What caused the K-curve? Why don't American workers organize against the way they are being exploited? I never put the larger picture together. So I dug deeper. Here is what I found. On August 23, 1971, a corporate lawyer named Lewis Powell sent a confidential memorandum to Eugene Sydnor at the U.S. Chamber of Commerce. Two months later, Richard Nixon nominated Powell to the Supreme Court. The memo was titled "Attack on American Free Enterprise System." It was confidential when written. Jack Anderson exposed it in his Washington Post column in September 1972, after Powell was already on the Court. [1] In the memo's candor, we can see what business strategy looked like when business thought no one was watching. Powell's diagnosis was that American business had been losing the ideological argument. The universities had moved against the corporation. So had the courts, the press, mainstream politicians, and the educated middle class. Powell read the threat as the consensus of educated opinion moving against the corporation. His remedy was a counter-mobilization across every front where the argument had been lost. Build think tanks to produce intellectual content sympathetic to business. Place sympathetic scholars in universities. Build litigation arms to take cases to courts on behalf of business interests. Organize politically through the Chamber and through new business federations. Treat the universities as terrain to be contested rather than ceded. Treat the courts as a strategic asset. The memo named the timeframe as decades. The intellectual battle was lost in the short term. Recovery would require sustained, patient investment across multiple institutions over a generation. That patience turned out to be the project's defining feature. What Powell will not engage in his memo is what businesses had been doing that produced the consensus he treats as ideological aggression. He names Ralph Nader as a representative figure of the attack but never asks why Nader exists. He writes as though the regulatory infrastructure of the late 1960s and early 1970s appeared from nowhere, generated by intellectuals who dislike capitalism, rather than from corpses and poisoned water tables. The 1971 context grounds what Powell will not name. Leaded gasoline. The Corvair. Two decades of cigarette companies lying about lung cancer. [9] Defense-contractor profiteering. Rivers literally catching fire. OSHA was signed into law in 1970 because workplace deaths were that bad. The EPA was created the same year. None of this gets named in the memo. The regulatory response is treated as the problem; what produced it is treated as not worth engaging with. The "social responsibility" claim does the rhetorical work that holds the inversion together. Powell does not argue that businesses should not have social obligations. He claims they already fulfill them. That move lets him appear reasonable while resisting every accountability mechanism that would test the claim. Flint, PFAS contamination, Cancer Alley, opioids: these are what "social responsibility" claims look like once the enforcement Powell was undermining gets gutted. The corporation pays a settlement, calls it a learning experience, and continues operating. Powell's framework treats this as the normal cost of doing business and treats anyone who objects as the actual problem. The memo brought into focus what had been an undercurrent. Mont Pelerin had existed since 1947; the Friedman and Hayek framework was already known; family fortunes were already seeking political vehicles; and the Goldwater coalition's failed 1964 attempt had shown that a political constituency existed. None of it was coordinated. None operated at scale. Powell named what was already there, gave it strategic shape, and told the Chamber of Commerce specifically what to do about it. The undercurrent became a program. The institutions went up fast. Business Roundtable, 1972, organized the CEOs of the largest American corporations into a single political body. Heritage Foundation, 1973, funded initially by Joseph Coors and Richard Mellon Scaife. The American Legislative Exchange Council, also in 1973, drafted model legislation for sympathetic state legislators. Cato Institute, 1977, funded by Charles Koch. The Federalist Society, 1982, was building a national network of conservative law students and faculty. The State Policy Network, 1992, eventually coordinated sixty state-level think tanks. By 2000, the institutional architecture Powell had recommended in 1971 was operational and producing output. The funding came from a small number of large foundations. Richard Mellon Scaife's family money funded Heritage, the American Spectator, and dozens of smaller operations. The Bradley Foundation in Milwaukee funded academic chairs and litigation. The Olin Foundation paid for the original law-and-economics movement at Harvard, Chicago, and Yale. Coors paid for Heritage's startup. Koch built a parallel network through Cato and, later, the Mercatus Center. They operated quietly, hidden in plain sight, waiting for the conditions to change. [2] The conditions changed in 1978. A Labor Law Reform Act that would have made union organizing easier was defeated in the Senate by filibuster despite Democratic control of both chambers and the White House. It was the moment the business mobilization Powell had recommended in 1971 first showed it could win against organized labor in a Democratic Washington. By 1980, the policy turn was already underway. Reagan accelerated it. The Reagan administration's deregulatory program drew its talking points directly from Heritage's Mandate for Leadership, a 1,100-page blueprint published before the inauguration. This is the moment the K-curve opens. Worker productivity and pay rose in lockstep from the end of World War II through 1979. After 1980, they decoupled. From 1979 to 2025, productivity grew 90.2 percent while typical worker pay grew 33.0 percent. [4] The income going to the bottom 80 percent stagnated. The top accelerated. Two trajectories, same economy. The infrastructure that was built quietly produced specific policy. Labor power was reduced. Reagan fired 11,000 air-traffic controllers in 1981, signaling that breaking unions had become acceptable. Right-to-work laws spread to 26 states across the South and Midwest. Janus v. AFSCME extended right-to-work to public-sector unions in 2018. Union density fell from 35 percent in the 1950s to roughly 10 percent now. [10] Top tax rates were cut. The top marginal income tax rate dropped from 70 percent in 1980 to 28 percent after Reagan's 1986 reform. Bush in 2001 and 2003 preserved the new lows. The 2017 corporate cut dropped the corporate rate from 35 percent to 21 percent. Capital gains continued to be taxed at a lower rate than ordinary income. Antitrust enforcement was abandoned. Robert Bork's The Antitrust Paradox (1978) reframed antitrust law as concerned only with consumer prices. The Reagan Justice Department adopted the doctrine; the Federalist Society judicial pipeline embedded it. Mergers concentrated industries across retail, banking, telecom, agriculture, healthcare, and tech. Four firms now control roughly 80 percent of US beef processing; meatpacking jobs that were union and middle-class in the 1970s are now non-union and pay well below the inflation-adjusted 1970s wage. The resulting labor market concentration directly suppressed wages. [8] The financial side was rewired. SEC Rule 10b-18, adopted in 1982, made stock buybacks legal. Shareholder primacy became the operating doctrine of American corporate management. In 2024, S&P 500 companies returned $1.6 trillion to shareholders in dividends and buybacks. [5] These were the levers. The K-curve is what they produced when pulled together over forty years. Globalization and technology happened during the same forty years. They made business more profitable. CEO compensation rose from roughly 30 times the average worker's pay in 1980 to several hundred times in 2000. [7] Worker pay did not move. Globalization and technology are the conditions through which the political distribution operates. Germany faced the same global trade and the same technology curve. German worker compensation tracked productivity more closely because the architecture distributed the gains differently. The pattern continues. In 2025, the same network produced Project 2025, the 922-page playbook the current administration is implementing in real time. Schedule F, which lets the administration fire tens of thousands of federal civil servants at will, was revived in the first weeks of the new term. The Department of Education is being dismantled by executive order. The institutions Powell recommended in 1971 are the same institutions that wrote the document running the federal government in 2026. [3] The labor side could not organize an equivalent response. The Wagner Act of 1935 gave American workers the right to organize, but it locked the unit of bargaining inside the individual firm. Workers vote to certify a union for a specific bargaining unit inside a specific employer. The union represents those workers, at that employer, exclusively. There is no provision for industry-wide or sectoral bargaining. Every fight has to be won, employer by employer. The German Tarifvertrag system I knew works the other way. Wage and working conditions agreements are negotiated at the sector level and bind all employers in the sector. A retailer in Hamburg and a retailer in Munich operate under the same negotiated terms. Deloitte Germany cannot unilaterally cut family leave for admin staff. The floor is set somewhere above the firm. Codetermination, Mitbestimmung, puts worker representatives on company boards. The Sozialstaatsprinzip in the Basic Law of 1949 makes worker protection a constitutional principle. An ordinary political majority cannot repeal these arrangements. The American firm-based architecture means leverage has to be rebuilt firm-by-firm every time the market tightens, and is lost firm-by-firm every time the market loosens. Union density was 35 percent in the 1950s and is around 10 percent now. The decline is what happens when the structure is built to require continuous reorganizing at the firm level, and the other side, with patient, coordinated funding, spends fifty years making that reorganizing harder. The Taft-Hartley Act of 1947 further tightened the framework. It outlawed the closed shop. It allowed states to pass right-to-work laws, preventing unions from collecting dues from workers the unions are required by law to represent. It banned secondary boycotts, the tactic that lets workers at one company support a strike at another. It required union officers to sign anti-communist affidavits, which the CIO used to expel its most disciplined organizers. By 1955, the American labor movement had been reduced to bread-and-butter wage bargaining at individual firms. Any political action was closed off. This is the structural answer to why American workers do not organize against the conditions they face. The architecture was built to make organizing happen one firm at a time, but was later weakened, making even firm-level organizing difficult. Meanwhile, the side with patient coordinated funding ran the project Powell described in 1971. The asymmetry was by design. And a most surprising detail emerged. The project's most durable achievement was a subtle manipulation of the language ordinary Americans now use to describe their own economy. This was deliberate. Newt Gingrich's 1990 GOPAC memo Language: A Key Mechanism of Control went out to Republican candidates with explicit instructions on which words to use and which to avoid. [6] By the mid-1990s, Frank Luntz was running focus groups for Republican candidates to test which phrases moved opinion. The infrastructure that funded the institutions also funded the messaging research that produced the words. The vocabulary was deployed through the same channels as the policy: op-eds funded by the foundations, policy papers from the think tanks, legal arguments from the Federalist Society pipeline, talking points from ALEC and the State Policy Network. Free market. The American economy from 1945 to 1980 was a heavily regulated, highly unionized, progressively taxed market overseen by powerful federal agencies and held in tension by sectoral labor power. By the 1990s, the same arrangement was being described as the "free market." The new vocabulary made the postwar regulated market sound like an aberration. The deregulated market that replaced it sounded like the natural state. Job creators. Before about 1980, the people who hired workers were called employers, owners, or capital. By 2000, they were called job creators. The new word shifted moral credit from the workers who produced the output to the people who owned the means of production. Tax cuts for owners became tax cuts for job creation. Cutting corporate taxes became a labor policy. Right to work. The states that passed laws preventing unions from collecting dues from workers the unions were required by law to represent called those laws right-to-work laws. The phrase reframed an attack on union finances as a protection of individual liberty. A worker covered by a union contract negotiated by a union that the law requires to represent her was now exercising her right to work by refusing to pay her share of the cost of that representation. Tax relief. Tax cuts for the wealthy were called tax relief. The relief framing implied a prior injury. Cutting taxes for owners stopped being a transfer and became a corrective. Tax increases on the wealthy stopped being policy and became a renewed injury. By 2000, the new vocabulary had migrated into mainstream usage. By 2020, most Americans speaking about the economy were using the words the project had selected. The artificial vocabulary makes the asymmetry sound natural. Free market refers to a market engineered to favor capital. Job creators moves moral credit from workers to owners. Right to work renames an attack on collective power as individual liberty. Tax relief makes a transfer to the wealthy sound like a corrective. The vocabulary makes an arrangement that favors capital over labor sound like the natural state of things. There is no quick recovery of a language that took fifty years to plant. There is no single essay that gives back what the project took out of the dictionary. What an essay can do is point to one document. Lewis Powell, August 23, 1971. The Chamber of Commerce. Heritage in 1973. Federalist Society in 1982. Project 2025 in 2025. The plan is on paper. The funding is documented. The institutions exist. The vocabulary they built operates in your mouth the next time you reach for job creators or free market or tax relief. That's just how it is is what the project produced. It is not a description of an economy. It is the description of fifty years of work. Sources [1] Lewis F. Powell Jr., "Attack on American Free Enterprise System," confidential memorandum to Eugene B. Sydnor Jr., U.S. Chamber of Commerce, August 23, 1971. The full text is maintained in the digital archive at Washington and Lee University Law School, Powell's alma mater: https://scholarlycommons.law.wlu.edu/powellmemo/. Jack Anderson's column exposing the memo ran in the Washington Post on September 28, 1972. [2] Jane Mayer, Dark Money: The Hidden History of the Billionaires Behind the Rise of the Radical Right (Doubleday, 2016) is the standard reference on the foundation layer that funded the institutions Powell's memo recommended building. Nancy MacLean, Democracy in Chains: The Deep History of the Radical Right's Stealth Plan for America (Viking, 2017) traces the Buchanan / public choice / Koch line specifically. Kim Phillips-Fein, Invisible Hands: The Businessmen's Crusade Against the New Deal (W.W. Norton, 2009) sets the longer pre-1971 backdrop. [3] Mandate for Leadership: Policy Management in a Conservative Administration (Heritage Foundation, 1981) was the Reagan transition's policy blueprint. Project 2025: Presidential Transition Project, Mandate for Leadership: The Conservative Promise (Heritage Foundation, 2023) is the current administration's. Both run more than a thousand pages. The lineage is named directly in the Project 2025 introduction. [4] Economic Policy Institute, The Productivity-Pay Gap, data series covering 1979 onward: https://www.epi.org/productivity-pay-gap/. The 90.2 percent / 33.0 percent decomposition uses EPI's net-productivity and typical-worker-pay series through 2025. [5] S&P Dow Jones Indices, S&P 500 Buybacks and Dividends report, 2024. Total return to shareholders (buybacks plus dividends) at approximately $1.6 trillion. [6] Newt Gingrich, Language: A Key Mechanism of Control, GOPAC memo to Republican candidates, 1990. Frank Luntz documented his focus-group methodology in Words That Work: It's Not What You Say, It's What People Hear (Hyperion, 2007). [7] Economic Policy Institute, CEO Pay annual series. The CEO-to-typical-worker compensation ratio rose from 31-to-1 in 1978 to a peak of 366-to-1 in 2000, and has fluctuated in the 250-to-400 range since. [8] U.S. Department of the Treasury, The State of Labor Market Competition, March 2022, on industry concentration and the documented effects of labor-market concentration on wages. On the unionized-to-non-union shift in meatpacking specifically, see Eric Schlosser, Fast Food Nation (Houghton Mifflin, 2001). [9] The 1998 Master Settlement Agreement released millions of pages of internal tobacco-industry documents showing decades of deception about the link between smoking and lung cancer. See Robert N. Proctor, Golden Holocaust: Origins of the Cigarette Catastrophe (University of California Press, 2011). [10] U.S. Bureau of Labor Statistics, Union Members annual series. Peak union density in the early 1950s was approximately 32 to 35 percent depending on measurement; the 2024 figure is 9.9 percent. Share This Post Related Reading We Kept Growing. Most People Didn’t The pronatalist alarm and the AI displacement alarm arguing about the same problem from opposite sides. Both assume the growth model is intact. It has not been. The forty years since 1980 were workarounds — debt, asset inflation, immigration, central bank intervention — that kept the appearance of growth going while the broad-based productive expansion stopped happening for most of the population. AI removes the last workaround. Notes on David French’s “How Can America Be So Miserable When It’s So Rich?” David French describes America’s tiered economy as a cultural problem. It’s not. It’s the result of deliberate policy decisions over four decades — weakening labor, favoring capital, enabling buybacks — that recalibrated who the economy serves. AI will compress the number of humans capital needs even further. The Corporate Benevolence Fantasy The promise that AI will make everything cheaper rests on one assumption — that corporations will pass their savings to consumers. The forty-year productivity-pay gap says they won't. The 2017 tax cut dress rehearsal says they won't. And $1.6 trillion in shareholder buybacks in a single year confirms they aren't. --- ### We Kept Growing. Most People Didn’t - Werner Glinka https://www.wernerglinka.com/writing/we-kept-growing-most-people-didnt/ AI LABOR CULTURE We Kept Growing. Most People Didn’t May 2, 2026 One political camp warns that birth rates are collapsing and that the country needs more children and fewer immigrants to preserve its cultural identity. Another camp tells us AI will do most of the producing within a generation, that vast cognitive workforces will be displaced, and that the old jobs are not coming back. These arguments are made loudly and shape policy. The first assumes labor is becoming scarce. The second assumes labor scarcity is being eliminated. They cannot both be true. Yet both persist, because they are not really arguments about labor at all. The same coalitions often hold both positions at once. Stop the immigrants, have more children, restore traditional family structures, get the manufacturing jobs back, and at the same time embrace AI. If AI does what its boosters claim, the manufacturing jobs are not coming back, and the children will not find work in the economy that emerges. If they do find work, AI has not delivered on its promises. That serious political programs rest on both halves tells you the discourse is doing something other than describing reality. Both positions assume the underlying economy is intact. The pronatalists need a growth economy that wants more workers. The AI camp needs a growth economy that absorbs productivity gains and produces the new jobs that supposedly always emerge. If the growth model is not intact, then both sides are arguing about how to staff an economy that no longer works for most of the people in it. That is the question the discourse is built to avoid. The short version of why the growth model is not intact: it stopped distributing its gains to typical workers around 1980,[1] and the appearance of growth has been kept up since then by a series of workarounds. Each substituted for wage growth in a different way: debt sustained consumption, asset inflation created paper wealth, and immigration expanded the worker base. Each is now used up. I have written at length about the debt and asset-inflation pieces in The Corporate Benevolence Fantasy. The piece I want to stay with here is the immigration piece because it connects to the pronatalist alarm. Population decline became visible in the 1970s. Birth rates in most rich countries dropped below replacement and have stayed there.[2] The math for pension systems that depend on intergenerational transfer did not work without either more workers or more productivity shared with workers. Productivity arrived. Sharing did not. So the workforce had to be expanded some other way, or the math would eventually fail. Immigration was the way. Germany imported Turkish workers starting in 1961, with the explicit assumption they would return home.[3] They did not. The structural need turned out to be permanent, and the workers built lives. A country that imports workers to solve its own problems takes on the commitment to keep them, whether it acknowledges that or not. The United States ran continuous immigration that kept the working-age population growing even as native birth rates fell. France, the UK, the Netherlands, Sweden, Canada, Australia: variations of the same policy. The political class understood what immigration was doing economically and mostly avoided saying so plainly. Saying so would have forced a conversation about whether the underlying model needed fixing or just propping up. The propping worked for two generations. GDP kept rising. Pension systems kept paying. Labor markets stayed reasonably tight. None of it would have been possible without the demographic top-up, the addition of working-age people through immigration. That fact got buried under aggregate statistics. And because it stayed buried, the eventual reaction, when immigration became politically untenable in the 2010s, arrived without any of the preparation an honest discussion would have produced. Brexit, AfD, Le Pen, Trump, Meloni, Wilders. The cultural identity panic is the political consequence of decades of using migration to paper over a problem that was never named. This is what the pronatalist alarm is, structurally. It is the political bill arriving for the un-naming. Have more children, send the immigrants home, restore the traditional family. None of those proposals fixes the underlying problem, because the problem was never about birth rates or borders. The problem was that the growth economy stopped distributing its gains, and the demographic top-up was the workaround that kept the appearance of growth going. Closing the border without rebuilding the distribution does not return the country to the state it was in before the workaround. It returns the country to the moment the workaround was instituted in the first place, when the underlying problem became urgent. Then AI arrives, and the cover comes off. If AI delivers the productivity gains its boosters promise, and those gains are not redistributed, you get a hyper-productive economy that cannot sell what it produces because the people who used to buy things do not have income. The arithmetic does not work. The 20th century solved this through mass employment plus mass consumption plus credit. The 21st-century version removes the employment leg, and the workarounds that kept the growth story going for forty years are now used up. There is no further political demographic top-up possible. There is no further debt capacity in the bottom half. Asset inflation has continued to reward existing owners and stopped reaching anyone trying to become one. The displacement has begun. Amazon, Meta, Microsoft, and UPS each cut tens of thousands of jobs in 2025 to redirect spending toward AI infrastructure.[4] The U.S. labor share of income fell to its lowest level in the seventy-eight years that the Bureau of Labor Statistics has been tracking it.[5] The wealth held by the top one percent of American households reached 31.7 percent in late 2025, equal to that held by the entire bottom ninety percent.[6] None of that is projection. It is current. Each corporate cut is a direct swap: payroll budget redirected to AI, savings to shareholders. The mechanism that has been redistributing wealth upward for forty years now has a more efficient instrument. So you get either redistribution at a level the current political system resists, or you get demand collapse. Pick one. There is no third path around this. The workarounds of previous decades allowed the question to be deferred. There is no further workaround available. I grew up in the Ruhr. My father worked the mines at Gelsenkirchen-Horst and died of black lung a few years after I left for America. The mine closed in the 1990s. Most of what was around it followed over the next twenty-five years. I watched the displacement from California and then from Minnesota, and I watched the difference between how Germany handled it and how the American Rust Belt handled the same kind of shock at roughly the same time. The German response was not graceful. In Gelsenkirchen today one adult in four is on benefits and more than a third of the children live in households that are. The national poverty rate is about 17 percent.[7] But the city did not collapse the way Youngstown or Detroit or Flint collapsed. The state treated displacement as a public obligation. Pensions were honored. Workers had institutional standing through codetermination. Federal transfers paid for the long transition. The American response treated the same shock as a market outcome and let the towns figure it out. Twenty-five years later, you can see the difference in life expectancy, suicide rates, civic infrastructure, and opioid deaths. That is not to say that German institutions are better than American ones. The lesson is that what happens to a region after its economy ends depends on whether the displaced workers are included in sharing the wealth generated by the entire society. The capital that left the Ruhr and the capital that left Youngstown went to similar places: global financial markets, new industries elsewhere, returns to shareholders. The difference was that one country built a claim for the displaced on those returns, and the other did not. The AI debate refuses to formulate this question. When commentators worry about AI displacement, they ask whether new jobs will appear to replace the displaced ones. It is the wrong question. The right question is who owns the productive capacity, and how output is distributed when wage labor is no longer the basis for distribution. The forty-year upward redistribution that the growth story has been hiding made that question urgent decades ago. AI is not creating it. AI is the moment the cover comes off. The pronatalist alarm and the AI displacement alarm are arguing about the same problem from opposite sides. One says we are running out of workers. The other says we are running out of jobs. Both are true descriptions of the surface. Both miss what is breaking underneath, which is the connection between productive output and broad prosperity. That connection has been broken for forty years. The workarounds bought time. And time is running out. Closing the border does not fix it. Having more children does not fix it. Embracing AI without changing how output is distributed accelerates it. Acknowledge that for forty years wealth was transferred from labor to ownership by deliberate choice. That naming is the moral basis for reversing it. The reversal is not a policy adjustment. It is a correction. Correction, September 2026 The original version said Gelsenkirchen has a 38 percent poverty rate against a 15 percent national average. The 38 percent was the share of the city's children in households on benefits, not the rate for the whole population, which is about one in four. I compared a child rate with an all-ages rate. The sentence and the footnote have been corrected. The argument stands on the corrected numbers. Sources [1] Economic Policy Institute, The Productivity-Pay Gap, data series covering 1979–2020. [2] United Nations, World Population Prospects; OECD Family Database, total fertility rates. [3] German Federal Foreign Office, archive of bilateral labour recruitment agreements; Turkey–West Germany agreement, October 30, 1961. [4] Reporting on 2025–2026 corporate layoffs at Amazon, Meta, Microsoft, and UPS via CNBC, Reuters, and the companies’ own filings and earnings calls. [5] U.S. Bureau of Labor Statistics, Labor Share of Gross Domestic Income series. [6] Federal Reserve Board, Distributional Financial Accounts, Q3 2025. [7] Bremer Institut für Arbeitsmarktforschung und Jugendberufshilfe (BIAJ), SGB-II-Quoten-Vergleich 2008 bis 2024 (July 2025) and Kinder in SGB II-Bedarfsgemeinschaften 2025 (June 2026), from Bundesagentur für Arbeit data; Paritätische Gesamtverband, Armutsbericht 2024, national at-risk-of-poverty rate. An earlier version of this essay gave Gelsenkirchen's poverty rate as 38 percent against a 15 percent national average. The 38 percent was the rate for children under 18, set against a national all-ages figure. Corrected September 2026. Share This Post Related Reading That's Just How It Is What caused the K-curve, and why don't American workers organize against the way they are being exploited? A 1971 confidential memo to the U.S. Chamber of Commerce, fifty years of patient counter-mobilization across think tanks, courts, and political institutions, and a labor architecture built to require continuous firm-by-firm reorganizing. The asymmetry was by design. Notes on David French’s “How Can America Be So Miserable When It’s So Rich?” David French describes America’s tiered economy as a cultural problem. It’s not. It’s the result of deliberate policy decisions over four decades — weakening labor, favoring capital, enabling buybacks — that recalibrated who the economy serves. AI will compress the number of humans capital needs even further. Who Buys What We Build? U.S. employers cut 1.2 million jobs in 2025 while posting record profits and pouring tens of billions into AI. AI didn't break capitalism. It exposed a version of capitalism that had already stopped distributing its gains. --- ### Our Faith? - Werner Glinka https://www.wernerglinka.com/writing/our-faith/ AI LABOR CULTURE Our Faith? Apr 23, 2026 The USDA employee quoted in Wired’s April 2026 report says the email “made them think AI had written it.” [2] The email came on Easter Sunday from Secretary of Agriculture Brooke Rollins to the whole agency — roughly 100,000 people. Its subject line was “He has risen!” Its body called the story of Jesus Christ “the greatest story ever told, the foundation of our faith, and the abiding hope of all mankind.” [2] Our faith? The sentence that made me want to understand what was happening came next: “This has never happened before. I have never gotten a message like this from anyone.” [2] A worker who has spent years inside a federal agency under multiple administrations of both parties is telling a reporter, on condition of anonymity because they fear retaliation, that the government has never spoken to them this way. The employee is not alone. At the Small Business Administration, staff were invited to a “newly launched Faith and Fellowship Prayer Service” and instructed not to share the link to the video with anyone outside the agency. [2] Consider this: A government meeting whose content is marked as not for public consumption is internal government business. Internal government business that consists of Christian worship is an establishment of religion. The pattern repeats across agencies. At Health and Human Services, Secretary Robert F. Kennedy Jr. sent staff home early on Good Friday “in observance.” An HHS employee described the administration as “not so much proudly Christian as it is belligerently so.” [2] At the Department of Labor, an agency “faith center” hosts monthly worship services. A DOL employee called it “very explicitly Christian, and even within the realm of Christianity, a very narrow representation of that.” [2] Alveda King, a senior USDA adviser on faith, told Department of Labor employees at one of these services: “We have different denominations, different faiths, and some have no faith — and those are the ones I would be more concerned about.” [2] One number from the Wired piece that I found incredible. In 2024, 71.9 percent of federal workers said they believed they could report wrongdoing without fear of retaliation. In 2025, the figure was 22.5 percent. [2] While the collapse of confidence in whistleblowing by roughly 50 points over a year has nothing to do with religion it provides the context in which every one of these workers was speaking on condition of anonymity. A federal workplace in which your superiors lead you in prayer and you are afraid to say you are uncomfortable is a workplace in which your boss has power over your career and is now also telling you what to pray — and you are afraid to say you would rather not. So I went looking for how this all fits together. The scaffolding Three moves, all in 2025. On February 7, seventeen days into Trump’s second term, an executive order established the White House Faith Office, led by the televangelist Paula White-Cain. [19] The White House’s own fact sheet explains that the office will “coordinate with agencies on religious liberty training” and work with the Attorney General “to identify failures to enforce constitutional and Federal statutory protections for religious liberty.” [19] The same fact sheet mentions a task force to eradicate “anti-Christian bias.” The framing is defensive. The only direction of threat contemplated is against Christians, “persecuted by the weaponized Biden Administration.” [19] Interestingly, the official text does not acknowledge the possibility that a majority faith, wielded by the state, can itself endanger religious liberty. In July, the Office of Personnel Management issued a memo permitting federal employees to try “to persuade others of the correctness of their own religious views” so long as it does not rise to the level of harassment, and to “encourage” colleagues to participate in religious expressions of faith, such as prayer. [2] I wonder how, in an environment of 22.5 percent whistleblower confidence, the distinction between persuasion and harassment is supposed to work. In May, Trump created the Religious Liberty Commission, with Texas Lt. Governor Dan Patrick as chair. [20] The thirteen-member voting commission consists of twelve Christian members and one Jewish member — Rabbi Meir Soloveichik of Congregation Shearith Israel, the oldest Jewish congregation in the United States. [21] A separately named advisory board adds further Christian and Jewish clergy and legal scholars in an advisory capacity. [22] At its final hearing on April 13, 2026, held at the Museum of the Bible in Washington, Patrick declared: “The separation of church and state is the biggest lie that’s been told in America since our founding.” [7, 8] The constitutional law scholar Douglas Laycock of the University of Texas noted that “It is literally true that the words ‘separation of church and state’ do not appear in the Constitution, but the idea clearly appears in the Constitution.” [8] Patrick is using a narrow textual claim to dispute a broad structural principle. But the larger point is simpler: the chair of the federal commission created to adjudicate religious liberty has publicly declared the foundational principle of American religious liberty a lie. Whatever you think about the legal nuances, you cannot expect that body to protect a principle whose existence its chair denies. The theology behind the man in the Pentagon Executive orders and OPM memos explain how religion entered the federal workplace, but not why it took the particular shape it did — the sermons, the prayers for vengeance, the Crusader tattoos on the Secretary of Defense. For that, I had to look at Hegseth, and what I found was not what I expected. I had thought of him as a Fox News figure implausibly handed the Pentagon. That framing misses what is actually happening because it fails to identify Hegseth as an agent of a particular, specific theology. In 2018, Hegseth describes undergoing a religious turn. On the advice of the “classical Christian education” advocate David Goodwin, he moved his family to Nashville. He joined Pilgrim Hill Reformed Fellowship — a congregation of the Communion of Reformed Evangelical Churches, led by a pastor named Brooks Potteiger. [1] That move is the key fact of his public life. The CREC is a small denomination, about 150 churches worldwide, founded by Douglas Wilson in Moscow, Idaho. Wilson has spent his adult life attempting, in his own words, to establish a “theocracy” in his college town. [1] Julie Ingersoll, the University of North Florida religious studies scholar who has studied this community for years, described it to the Guardian: “They don’t embrace democracy particularly. They don’t believe in social equality among people. They think that God created the world and that some people are destined to have authority and to rule over other people, and other people are destined to be followers. When we talk about legitimate government having its authority coming from the consent of the governed, they don’t believe that at all.” [1] Wilson’s views are well documented, in large part because he has written them down. He is opposed to women’s right to vote, and not opposed to the death penalty for homosexuality. He advocates for ‘biblical patriarchy’ and for what he calls ‘the theology of fist fighting.’ He describes himself as a Christian nationalist, a ‘paleo-Confederate,’ and has said he wants ‘to take over the world for Christ.’ In 1996, he co-authored a book that characterized antebellum American slavery as “a relationship based upon mutual affection and confidence” and abolitionists as “driven by a zealous hatred of the Word of God.” [1] The scholars who study this community most closely make the same point: That what Hegseth and Wilson represent is not mainstream Reformed Christianity. [1, 6]. Most Reformed churches, the ones that have been around for centuries, teach something closer to humility before God — you do not know if you are among the saved, so you examine your conscience and do your work honestly. The CREC took that tradition’s architecture and bolted a political program onto it: Christianize the Earth through the instruments of the state, and if military power is available, use it. The distinction matters because the problem is a specific network of about 150 churches whose theology most Christians, including most Reformed Christians, would not recognize as their own. Samuel Perry, writing in the Seventh-Day Adventist publication Liberty Magazine, summarizes the CREC’s view: the denomination holds that the United States is a Christian nation, and “teaches that secularism in almost any form, along with commonly held notions of the First Amendment’s establishment clause, are anathematic ideologies.” [6] Anathematic. For the CREC, the constitutional separation of church and state is a doctrine to be rejected as heresy. Pete Hegseth, as of this writing, is the Secretary of Defense. He answers spiritually to a church leader who has called for the crucifixion of a Democratic Senate candidate. [1, 4] His personal pastor, Brooks Potteiger, has been relocated to Washington to plant a new CREC church for him. Douglas Wilson has preached in the Pentagon at his invitation. [1] The CREC is not a powerful denomination. It has no lobbying operation, no megachurch network, no think tank. Its influence over the Department of Defense runs through a single convert who was handed the job. No institutional safeguard prevented a 150-church fringe theology from reaching the Pentagon podium. The entire connection is exactly one appointment wide. The current administration regularly criticizes European democracies, Germany in particular, for limiting speech. Well, Germany went through what unchecked power, married to ideology, can do and built guardrails so it would not happen again. The United States did not build those guardrails. In America, everything is protected speech, no matter how much damage it causes. There is no constitutional mechanism that prevents a Secretary of Defense from leading his staff in prayers for vengeance, no institutional filter between a fringe denomination and the command structure of the world’s most powerful military. The system assumed that norms would hold. They are not holding. So, what has he done so far? Since Hegseth’s confirmation, the Pentagon has hosted monthly Christian worship services. Before the Iran war, Brooks Potteiger preached from Matthew 10 on God’s sovereignty over falling sparrows and, by extension, “Tomahawk and Minuteman missiles.” [1] Franklin Graham told uniformed service members that “God is also a god of war.” [1] On Good Friday, the Pentagon hosted a prayer service restricted to Protestants. [4] Rabbi Laurence Bazer, a retired Army colonel and chaplain, observed that the military’s strength lies in the diversity of faiths among its service members, and that this diversity is “worth protecting.” [1] Then the war began. In mid-March 2026, the US military entered its war with Iran. Hegseth cited Psalm 144, “Blessed be the Lord, my rock, who trains my hands for war,” in describing the campaign. [1, 3] He called Iranians “barbaric savages” and promised “no quarter.” [1] The language matters theologically, not just rhetorically. The Western Christian tradition — Augustine, Aquinas, the entire Just War framework that has governed Christian thinking about warfare for sixteen centuries — requires proportionality, discrimination between combatants and non-combatants, and the use of force only as a last resort for the common good, never for vengeance. “No quarter” and “barbaric savages” are not the language of Just War. They are the language of holy war, a category the mainstream tradition explicitly repudiates. The CREC does not need the Just War framework because it derives its authority directly from God’s commands in scripture rather than from moral reasoning about proportionality. That is the theology that was operative when the missiles were launched. On February 28, a Tomahawk missile hit the Shajareh Tayyebeh elementary school in Minab, Iran. According to a preliminary US military investigation, the US was responsible. More than 175 people were killed, most of them children. [1] Neither Trump nor Hegseth has taken responsibility or expressed remorse. On April 15, Hegseth read a prayer at a Pentagon worship service titled “CSAR 2517” — Combat Search And Rescue, Ezekiel 25:17. The prayer is almost word-for-word the monologue Samuel L. Jackson’s character recites in Pulp Fiction before executing an unarmed man, adapted with a US military callsign substituted for the name of God. “And you will know my call sign is Sandy 1 when I lay my vengeance upon thee.” [4] He had been talking about blockades with Admiral Cooper fifteen minutes earlier. He said so himself. [4] When the administration’s defenders insist that Hegseth’s faith is a private matter, they are asking us to believe something the man himself does not believe: that what happens on Sunday and what happens on Monday can be separated. He has said plainly that they cannot. “May what we talk about, how we worship today, inform the remainder of our day and the remainder of our week and who we are and how we conduct ourselves, no matter what we’re doing.” [4] The alliance that shouldn’t hold The administration’s religious program has at least three factions, each wanting different things. Hegseth’s camp believes Christians are supposed to take over the institutions of the Earth, including government, military, and education, and build a Christian civilization now, before Christ returns. Paula White-Cain’s and Mike Huckabee’s camps believe the world is heading toward an apocalyptic ending that Christians should accelerate, mostly by supporting Israel, because Christ has to come back first to set things right. Kevin Roberts’s camp, rooted in Catholic tradition, wants the church and the state formally integrated, with government guided by church teaching. These are three incompatible visions of a future that hopefully never comes to be. Under almost any other conditions in American history, these three camps would be fighting each other, not co-governing. Hegseth’s denomination regards the prosperity gospel as a form of idolatry. The Catholics regard Protestantism itself as a break from the true church. White-Cain’s camp regards Hegseth’s project of Christianizing the Earth before Christ’s return as theologically impossible — in their reading, only Christ himself can do that. These are major disagreements that have split churches, ignited wars, and redrawn the map of Europe over five centuries. What holds the alliance together is a shared set of enemies: pluralism, “secular humanism,” reproductive rights, public schools, LGBTQ legal equality, and the administrative state as it operated before 2025. This is a coalition whose members hate the same things more than they agree on anything positive. Patrick’s Religious Liberty Commission is the clearest illustration. Twelve Christian members and one Jewish member on the voting commission [21], drawn from camps whose theologies contradict each other at the root, and the commission does not address those contradictions. It does not need to. Its work is organized entirely around the shared enemy list, not around any positive theological program. As long as the question remains “who are we against?” rather than “what are we building?”, the seams hold. That kind of coalition is historically unstable. It tends to tighten under perceived external threat and to crack only when one faction wins enough power for the question “what kind of Christian are you?” to become more urgent than the question “are you with us or against us?” That eventual cracking is a reason for patience, not complacency. It is absolutely not a reason for short-run complacency, because in the meantime, the alliance is functioning, governing, and prosecuting a foreign war as if it spoke with one theological voice. Julie Ingersoll’s observation stays with me: “Leaders of Christian nationalism are operating on timelines in the hundreds of years.” [1] The campaign to eliminate the Department of Education began in 1979. The campaign to overturn Roe v. Wade took fifty years. The movement is patient, it has institutional depth, and it has now achieved what its earlier generations only imagined: direct authority over the federal executive, the Speaker’s office [18], the Pentagon, the commission convened to interpret the First Amendment [20], a Supreme Court majority, and vast stretches of the federal bench. Who’s pushing back If this were only a story about consolidating power, it would be a shorter, grimmer essay. But the reading turned up something I had not expected: the opposition is not coming primarily from where the administration says it is. The administration and its allies are working to frame critics of Christian nationalism as “anti-God” (Patrick), “secular humanists” (Hegseth), bearers of “anti-Christian bias” (the White House task force’s founding premise). The frame is useful to them because it converts a constitutional argument into a culture-war one. And it is false. On Palm Sunday, Pope Leo XIV preached what appeared to be a direct rebuke of Hegseth’s theology. Days later in Bamenda, Cameroon, he warned against “those who manipulate religion and the very name of God for their own military, economic and political gain, dragging that which is sacred into darkness and filth.” [5] In Bamenda, he sat with the Supreme Traditional Chief of Mankon, the Emeritus Moderator of the Presbyterian Church, and the Imam of the Central Mosque of Buea. His sermon closed with a quote from the imam: “Let us thank God that this crisis has not degenerated into a religious war, and that we are still trying to love one another.” [5] Archbishop Reinhard Marx of Munich, preaching Easter Sunday, called Hegseth’s prayers “shameless blasphemy” and drew what I think is the most important parallel in this story: he equated Hegseth’s theology to the “holy war” rhetoric of Kirill, the Russian Orthodox patriarch who has spent three years blessing the invasion of Ukraine as a sacred struggle. [12, 13] A German Catholic prelate put the Secretary of Defense and the Patriarch of Moscow in the same sentence, two men who use God to bless their wars. Brian Kaylor, a Baptist minister and editor of Word&Way, called Hegseth’s National Prayer Breakfast promise of eternal life to warriors “not just Crusader theology but something that would be considered heretical in most of Christianity today.” [4] John E. Jones III, a federal judge appointed by George W. Bush, told The Conversation that Hegseth’s Pentagon services “sure look like” violations of the First Amendment’s ban on government-established religion. [3] Then there is James Talarico, a Texas state representative, former middle-school teacher, a Presbyterian studying for the ministry, and the 2026 Democratic nominee for the US Senate from Texas. Talarico has spent his brief political career making the argument against Christian nationalism from inside Christian speech — quoting Jesus’s words in Matthew 25, that how you treat the hungry, the sick, and the imprisoned is how you treat God, on the Texas House floor, arguing against the Ten Commandments-in-classrooms bill on explicitly theological grounds. When Brooks Potteiger, Hegseth’s personal pastor, went on a podcast and called for Talarico to be “crucified with Christ,” [1, 4] that was not a randomly chosen target. Potteiger did not name Chuck Schumer. He named Talarico because Talarico contests the CREC on the territory it most needs to control, arguing from the Bible in the political arena. A young Christian Democrat who knows his Bible and argues for pluralism from it closes the door on the “secular leftism” retort that has done most of the work of immunizing Christian nationalism from religious criticism. Potteiger’s curse is a measurement of how threatening that voice is to the project he serves. The people opposing this turn include a Pope, an archbishop, a Baptist minister, Kristin Kobes Du Mez — the Calvin University historian whose book Jesus and John Wayne traced the century-long development of white evangelical militant masculinity — a Bush-appointed federal judge, a retired Army rabbi, Muslim and Hindu and Sikh religious leaders, and federal workers themselves. It is not a secular movement. It is the rest of American religious pluralism. The worker again I started this with a USDA employee’s sentence, and I keep coming back to it. But before I do, I want to set one other voice next to everything I have described. Abraham Lincoln delivered his Second Inaugural Address on March 4, 1865, with the Union on the verge of military victory. He did not triumph. He did not claim God’s favor. He said, of the two sides of the war, that “both read the same Bible and pray to the same God, and each invokes His aid against the other.” He said, “The Almighty has his own purposes.” He closed not with domination but with the slow work of “binding up the nation’s wounds.” Hegseth, in the middle of a war in which a US missile killed more than 175 people at a single elementary school, most of them children [1], claims daily that God is on his side, and insists that the worship he leads at the Pentagon should shape the military decisions he makes in the afternoon. [4] “This has never happened before.” A true sentence, spoken by a person who is afraid to say it with his name attached, about the country he works for. The country in which that sentence cannot be said safely is not the country in which the First Amendment operates; it is the country that the people who say the separation of church and state is a lie are trying to build. It is further along than I had realized before I sat down to read. Sources [1] Julia Carrie Wong, “Pete Hegseth’s holy war,” The Guardian, April 10, 2026 — theguardian.com [2] “Government Workers Say They’re Getting Inundated With Religion,” WIRED, April 14, 2026 — wired.com [3] “Pete Hegseth’s Christian rhetoric reignites scrutiny after the U.S. goes to war with Iran,” PBS NewsHour / AP, March 2026 — pbs.org [4] Brian Kaylor, “Hegseth Borrows Violent Prayer From ‘Pulp Fiction’ to Bless Iran War at April Pentagon Worship Service,” Word&Way, April 15, 2026 — wordandway.org [5] Kielce Gussie, “Pope in Bamenda: ‘Woe to those who manipulate religion for military or political gain,’” Vatican News, April 2026 — vaticannews.va [6] Samuel P. Perry, “Looking for a Holy War,” Liberty Magazine, January/February 2026 — libertymagazine.org [7] “Dan Patrick says separation of church and state is a lie,” Baptist News Global, April 2026 — baptistnews.com [8] “Lt. Gov. Dan Patrick argues there is no separation of church and state in the U.S. Constitution,” Houston Public Media / KUT, April 15, 2026 — houstonpublicmedia.org [9] “The Meaning Behind Trump Cabinet Pick Pete Hegseth’s Christian Tattoos,” Religion Unplugged — religionunplugged.com [10] Ariel Schwartz, “The Sacralization of the Iran War,” Chicago Council on Global Affairs — globalaffairs.org [11] Maura Casey, “Project 2025: The Blueprint for Christian Nationalist Regime Change,” Kettering Foundation — kettering.org [12] “Christian Nationalism and the Making of a Holy War,” LA Progressive — laprogressive.com [13] “What happens when religious fundamentalists come to power? (Part Two),” On Point with Meghna Chakrabarti, WBUR, April 7, 2026 — wbur.org [14] “What happens when religious fundamentalists come to power? (Part One),” On Point with Meghna Chakrabarti, WBUR, April 6, 2026 — wbur.org [15] “Trump administration religious messaging,” The Independent — the-independent.com [16] “AU sues over prayer services organized by Depts. of Labor and Defense,” Americans United for Separation of Church and State — au.org [17] “Diverse Faith Leaders, Groups Unite to Challenge Administration’s Biased So-Called ‘Religious Liberty Commission,’” Interfaith Alliance — interfaithalliance.org [18] “Speaker Johnson: Christian Nationalism in the Speaker’s Office?” Congressional Freethought Caucus white paper — huffman.house.gov [19] “Fact Sheet: President Donald J. Trump Establishes White House Faith Office,” The White House, February 7, 2025 — whitehouse.gov [20] “Establishment of the Religious Liberty Commission” (Executive Order), The White House, May 1, 2025 — whitehouse.gov [21] “President Trump Announces Religious Liberty Commission Members,” The White House, May 2025 — whitehouse.gov [22] “President Donald Trump Names Advisory Board Members to the Religious Liberty Commission,” The White House, May 2025 — whitehouse.gov Quotations from Ingersoll, Kaylor, Taylor, Jones III, Bazer, Laycock, Roberts, and Laser are taken from the sources listed above. Share This Post --- ### A Talisman Against Fascism — In Loring Park - Werner Glinka https://www.wernerglinka.com/writing/center-for-people-and-craft/ A Talisman Against Fascism — In Loring Park Apr 18, 2026 I grew up in Gelsenkirchen, in Germany's Ruhr Valley, surrounded by the remnants of an industrial world that was already dying. Coal mines closing, steelworks going silent, neighborhoods hollowing out. I watched what happens when the economic floor drops out from under a community. People don't just lose jobs. They lose the places where they used to see each other — the pubs, the clubs, the shared spaces where you were just a person among other people. When those places disappear, something corrosive fills the vacuum. Resentment. Suspicion of outsiders. The convenient lie that someone else is to blame. I've been living in the United States since the 1980s, long enough to know that this pattern isn't unique to the Ruhr. It's playing out right now, right here, amplified by politicians who have figured out that frightened, isolated people are easy to mobilize. The anti-immigrant rhetoric, the attacks on anything that smells like diversity or inclusion, the sneering at communities that dare to be multilingual, multiethnic, open — all of it is designed to keep people apart. Divide and conquer isn't a metaphor. It's a strategy. I'm writing this because I've found an antidote. Not a theory, not a policy paper — an actual place where the strategy fails. A Folk School in Minneapolis The Center for People and Craft is an emerging urban folk school in the Loring Park neighborhood of Minneapolis, housed in the education building of St. Mark's Episcopal Cathedral. It opened its doors in late 2025, supported by a Vibrant Storefronts award from the City of Minneapolis' Arts and Cultural Affairs Department. Its founding director, Anna Lindall, is an educator and cultural organizer who previously founded Free Forest School, a grassroots initiative that grew into a national nonprofit serving over 70,000 families. The Center's vision is rooted in a specific historical model: the Danish folk school, or folkehøjskole, developed by N.F.S. Grundtvig in the 1850s. Denmark was transitioning from monarchy to democracy, and Grundtvig saw that the country needed more than political structures — it needed a culture capable of sustaining them. His folk schools rejected nationalism. Instead, they promoted what he called folkelighed — roughly translated as "peopleness" — a pride in one's own culture, language, and stories that carried no sense of cultural superiority. The folk school model was, in the Center's own words, "a talisman against fascism." That phrase should stop you cold. It stopped me. Because here we are, nearly two centuries later, and the need for that talisman has not gone away. If anything, it's more urgent. What Happens Inside Look at the class roster and you'll understand what the Center is doing without anyone having to explain it: Mazinigwaadan — Ojibwe beadwork. Sashiko — traditional Japanese embroidery. Milagros Mexicanos. Kolrosing — Nordic knife carving. Appalachian clogging. Tamale-making as communal nourishment. Willow basketry. Natural dyeing with marigold. A class called "Pockets, Patches and the Politics of Keeping Things." Mazinigwaadan — Ojibwe beadwork These traditions come from different continents, different centuries, different circumstances. But in the Center's classrooms, they sit side by side. An Ojibwe beading instructor and a Scandinavian carving teacher share the same building, and their students pass each other in the hallway. Nobody fills out a diversity survey. Nobody attends a sensitivity training. People just sit next to each other, work with their hands, and learn something about where the person beside them comes from. This is what genuine cross-cultural connection looks like. Not the corporate DEI that has become such an easy target for right-wing mockery — the kind that reduces human complexity to checkboxes and compliance metrics — but the real thing. Person to person. Hand to hand. You learn someone's tradition, and suddenly they're not an abstraction anymore. They're not "the immigrant" or "the other." They're the woman who showed you how to hold the needle. Why This Matters Now We're living through a political moment that feeds on isolation. MAGA rhetoric works best when people don't actually know their neighbors, when communities are fragmented enough that fear can fill the gaps. The anti-immigrant propaganda, the gutting of DEI programs, the defunding of arts and cultural initiatives — none of this is accidental. It's a systematic effort to destroy exactly the kind of spaces where people discover that they have more in common than they've been told. The Center for People and Craft is a direct counter to that effort. Not because it's political — it isn't, not in the partisan sense. It's counter to that effort because it does the one thing authoritarian movements cannot survive: it brings people together without hierarchy, without gatekeeping, without requiring anyone to pass an ideological test. You show up. You make something. You share a meal catered by local immigrant-owned restaurants. You help plane and finish a communal work table. That's it. That's the revolution. Grundtvig understood this in the 1850s. Anna Lindall understands it now. The folk school model works because it addresses the root problem, not the symptoms. The root problem isn't that people disagree about politics. It's that people have lost the spaces where they can simply be together, where shared experience creates bonds that no demagogue can easily sever. Between Two Worlds I have my art studio at the Center. I volunteer there. I am, in the language I've used to describe my own life for decades, a person living between two worlds — the Germany I came from and the America I came to. I've spent my career moving between disciplines too, from engineering to marketing to web development to sculpture. I know something about what it means to carry multiple identities and to find that the spaces where all of them can coexist are rarer than they should be. The Center is one of those spaces. When I'm working on an assemblage — industrial metal banding, salvaged wood, the materials of the Ruhr Valley reimagined in Minneapolis — I'm a few rooms away from someone learning to bead in the Ojibwe tradition, or someone stitching Sashiko patterns, or someone shaping a willow basket. We are all doing the same fundamental thing: making something with our hands, connecting to a tradition, being present with other human beings. The differences between us are real and worth honoring. But in that building, they are not barriers. Anna Lindall has spoken about the arrival of AI as another reason the Center matters now — that we need to keep working with our hands, keep our cultural traditions alive, keep thinking for ourselves. I've written extensively about AI's economic impact, and I share her concern. But what strikes me most about the Center is simpler than that. It's a place where you look up from your work and see someone else looking up from theirs, and you nod, and maybe you ask what they're making, and a conversation starts that wouldn't have happened anywhere else in your life. That's not a small thing. In a country that is being deliberately fractured along lines of race, ethnicity, language, and origin, it might be the most important thing. Built By Hand The Center for People and Craft is not a finished institution. It's volunteer-driven, community-funded, still raising money for basic tools and furniture. They're working toward 501(c)(3) status. The building itself has been cleaned, painted, and furnished by the people who believe in what it can become. The work tables were built by community members. There is something fitting about that. A folk school should be built the way folk traditions are transmitted — person to person, hand to hand, without waiting for permission from above. The Center exists because people decided it should exist and then showed up to make it real. If you're in Minneapolis, show up. Take a class. Volunteer. Bring a dish to the next potluck. If you're not in Minneapolis, consider what a folk school might look like in your own community. The model is nearly two hundred years old and it still works, because the human need it addresses — the need to gather, to make, to learn from each other without fear — doesn't change. Grundtvig imagined his folk schools as a bulwark against the authoritarianism of his time. We need to build ours against the authoritarianism of our own. The Center for People and Craft is located at 519 Oak Grove Street, Minneapolis, MN 55403, adjacent to Loring Park. Visit peopleandcraft.org or find them on Instagram at @centerforpeopleandcraft. Share This Post Related Reading I've Seen This Before I grew up in Gelsenkirchen, in the Ruhr Valley, and watched coal and steel collapse over decades. Retraining never worked at scale. The trades offer a reprieve, not an escape. And the science fiction writers have been ahead of the economists for seventy years — a structural problem requires a structural response. Notes on David French’s “How Can America Be So Miserable When It’s So Rich?” David French describes America’s tiered economy as a cultural problem. It’s not. It’s the result of deliberate policy decisions over four decades — weakening labor, favoring capital, enabling buybacks — that recalibrated who the economy serves. AI will compress the number of humans capital needs even further. Coal and Steel The comparison between AI and coal isn’t about technology. It’s about cognitive lock-in — what happens when an entire economy organizes around one assumption and can’t see the disruption because it’s inside it. Germany did everything right and still produced 38% poverty in Gelsenkirchen. That’s not the failure story. That’s the success story. --- ### MCP Server v2.0: Modernizing the Toolchain https://www.wernerglinka.com/writing/mcp-server-2/ CODING MCP Server v2.0: Modernizing the Toolchain Apr 15, 2026 Six months after reaching 1.0.0, metalsmith-plugin-mcp-server hits 2.0.0 with its first real breaking change: the toolchain every scaffolded plugin inherits has been modernized. ESLint and Prettier are out, replaced by Biome. Mocha, Chai, and c8 are out, replaced by Node's native test runner and its experimental coverage reporter. The result is simpler plugins, fewer dependencies, and one less rake to step on. (Background: the original weekend build and the 1.0 retrospective.) When I first scaffolded plugins, I reached for what everyone else was using: ESLint for linting, Prettier for formatting, Mocha with Chai for tests, c8 for coverage. What I didn't fully appreciate was the dependency tax each new plugin was paying. A fresh scaffold pulled in ESLint plus two plugins for Prettier integration, Prettier itself, Mocha, Chai, and c8. Seven config surfaces to maintain, and a transitive dependency tree that took longer to install than the plugin took to write. Meanwhile, the MCP server itself had quietly migrated. I'd switched it to Biome for linting and formatting, then moved the test suite to node:test when the native runner stabilized in Node 22. The MCP server was lean. The plugins it generated were not. What Changed The migration itself was mechanical. Biome replaces both ESLint and Prettier with a single binary and a single config file. node:test plus node:assert/strict replaces Mocha and Chai with zero dependencies. node --test --experimental-test-coverage produces lcov output directly, so c8 goes too. Concretely, per scaffolded plugin: textdevDependencies: 9 → 5 Removed: c8, eslint, eslint-config-prettier, eslint-plugin-prettier, mocha, prettier Added: @biomejs/biome Config files: 3 → 1 Removed: eslint.config.js, prettier.config.js, .c8rc.json Added: biome.json Four fewer packages, two fewer config files, and no more debating whether ESLint's formatting rules should yield to Prettier's. Biome is both. Inside the MCP server, the simplification was smaller but real: a net reduction of about 80 lines across templates and config generation, and three template files deleted outright. The Breaking Parts This is a 2.0 release because the MCP tool contracts changed. The validate tool's checks enum no longer accepts eslint — pass biome instead. The configs and show-template enums drop eslint and prettier. Scaffolded plugins now require Node 22 or newer, because that's where the coverage reporter destinations stabilize. None of this is load-bearing for most users, but anyone scripting against the MCP server will notice. The migration for existing plugins is a three-step process: bashrm eslint.config.js prettier.config.js .c8rc.json .mocharc.* npx metalsmith-plugin-mcp-server configs . # Then update test imports from mocha/chai to node:test/node:assert/strict The test import change is the only part that's properly manual. Everything else is a one-liner. Tool Evolution Tools bring their own dependencies. Every dependency is a contract: you're promising to keep it updated, to understand its config, to debug it when it breaks. Seven dependencies to get from empty directory to passing tests was a contract I hadn't meant to write. Node's native test runner changes the math. It's not a new thing to learn — if you know JavaScript, you know enough. Biome is a new thing, but it replaces two old things, and its config is small enough to read in one sitting. Net complexity goes down. The broader lesson is that tools evolve and are worth revisiting frequently. The ecosystem moves. Native runtime capabilities that didn't exist are now stable. What Plugin Authors Get If you're writing a new Metalsmith plugin as of today, npx metalsmith-plugin-mcp-server scaffold my-plugin ... gives you: One config file for lint and format (biome.json) Test files that import from node:test — no mocha/chai Coverage via npm run coverage with no extra tool You can still reach for external tools if you need them. Nothing here is exclusive. But the default shape is smaller. Upgrading Existing Plugins A breaking change is only as painful as its migration. For the plugins you already have on the old toolchain, the upgrade path is a single command: bashnpx metalsmith-plugin-mcp-server@latest install-claude-md That command used to just install AI assistant guidance. As of 2.0.1, the CLAUDE.md it installs includes a Migration from Legacy Toolchain section — a set of detection rules and step-by-step instructions aimed at Claude (or any AI assistant reading the file). The workflow is: 1 Run install-claude-md on your existing plugin 2 Open the plugin in Claude Code and ask: "Is this plugin on the legacy toolchain? If so, migrate it." 3 Claude reads CLAUDE.md, detects legacy files (eslint.config.js, .c8rc.json, mocha in devDeps, etc.), and walks through the migration, confirming before each destructive step. Most of it is mechanical. Delete the old configs, run configs . to generate biome.json, update package.json dependencies and scripts, bump engines.node to >= 22.0.0. The one part that can't be fully automated is rewriting test imports — converting mocha + chai patterns to node:test + node:assert/strict. Claude handles that file by file, which is exactly the kind of tedious mechanical task AI assistants are good at and humans hate. The principle from 1.0.0 carries forward: rather than write a migration script that makes guesses, write guidance that lets the AI make informed decisions in context. The plugin's existing CLAUDE.md, package.json, and test files are all the context the AI needs. The MCP server just has to tell it what to look for and what good looks like. If you'd rather do it by hand, the steps are in the CLAUDE.md migration section itself. It's about five minutes of rm, a regenerated config, and a test-import sweep. Share This Post Related Reading MCP Server Development: Evolution Metalsmith Plugin MCP Server is a good example of how AI can assist in development. But what started over a weekend turned into a real development framework, shaped by real-world usage, trial-and-error, and a growing understanding of how AI needs to be guided, not just invited. MCP Server Development: Integrating Claude AI Discover how to use Claude AI and MCP servers to automate plugin development. A step-by-step weekend project that transforms repetitive Metalsmith plugin creation into an AI-powered conversation, complete with testing examples and practical insights. AI as a Development Partner: My Experience with Claude and GitHub Copilot I've been integrating AI tools into my daily workflow, and I want to share my perspective on how they're transforming software development - not by replacing developers, but by enhancing our capabilities and productivity. --- ### Who Fired You - Werner Glinka https://www.wernerglinka.com/writing/who-fired-you/ AI LABOR CULTURE Who Fired You Apr 14, 2026 Sarah Perez published a piece in TechCrunch [1] on April 13, 2026, summarizing Stanford's annual AI report. [2] The headline finding is a widening gap between what AI experts believe about the technology and what everyone else believes. [3] The numbers are striking. Seventy-three percent of experts think AI will have a positive impact on how people do their jobs. Twenty-three percent of the public thinks the same. On the economy, sixty-nine percent of experts are positive. Twenty-one percent of the public is. Nearly two-thirds of Americans expect AI to lead to fewer jobs over the next twenty years. Perez treats the divergence as a puzzle. Why are regular people so negative when the people who know the technology best are so optimistic? The implied answer, never quite stated, is that the public doesn't understand what's coming. The experts are looking at what AI could do. The public is looking at what AI is being used to do to them. Imagine a version of this moment in which the productivity gains from AI flowed to the people whose work is being automated. Shorter weeks at the same pay. Higher wages in the sectors where AI handles the drudgery. More security, not less. In that universe, the Stanford numbers flip. The public becomes the enthusiasts, and the experts become the nervous ones, worrying about transition costs and adjustment frictions. Nobody in that universe is burning warehouses over wages. The technology is the same in both universes. The models, the capabilities, the displacement of specific tasks — all identical. What differs is who captures the gains. Are we so thoroughly conditioned not to question how capitalism distributes wealth that we can no longer picture the alternative? Suggest out loud that the gains should flow to the people doing the work, and the labels arrive before the argument does. Communist. Socialist. Naive. That's how you know you've touched something. I grew up in the Ruhr Valley. My father worked in the coal mines. When the mines closed, the people who lost their jobs knew exactly who to be angry at. They had names. Krupp. Thyssen. The ministers in Bonn who signed the deals. The board members who decided which shafts to shut and when. The adversary was a person or a small number of persons, with an address, a phone number and a face that appeared in the newspaper. You could picket the headquarters. You could vote against the party. You could, at minimum, say a name out loud and have everyone around you understand who you meant. That vocabulary took generations of labor organizing to build. Workers learned to say "the owners" and "the bosses" to refer to specific people who made specific decisions. When the mines closed, the closures were a catastrophe, but a legible one. Someone did this. Someone could be named. Now read the sentences being written about AI and the job market. "AI is taking jobs." "AI is replacing workers." "AI is coming for the white-collar middle class." The subject of every sentence is the technology. Not OpenAI. Not the CEO who approved the layoffs. Not the board that set the headcount targets. Not the investors who demanded the margin improvements. AI, the noun, as if the models walked into the office on their own, fired the staff, and went home. "Mistakes were made." "The building caught fire." "AI is taking jobs." My father's generation lost their livelihoods and kept their vocabulary. Krupp. Thyssen. The ministers in Bonn. AI is not taking jobs. The people who own it are. Sources [1] Sarah Perez, "Stanford report highlights growing disconnect between AI insiders and everyone else," TechCrunch, April 13, 2026. [2] Stanford HAI, "The 2026 AI Index Report." [3] "Stanford AI Index Reveals Experts, Public Worlds Apart on AI," TechBuzz, April 2026. Share This Post Related Reading Coal and Steel The comparison between AI and coal isn’t about technology. It’s about cognitive lock-in — what happens when an entire economy organizes around one assumption and can’t see the disruption because it’s inside it. Germany did everything right and still produced 38% poverty in Gelsenkirchen. That’s not the failure story. That’s the success story. The Wrong Argument The public debate about AI displacement focuses on headline layoffs — visible, contested, and partially fabricated. The real mechanism is quieter. Vertical AI platforms embedded in industry software absorb labor through updates, one unbackfilled position at a time. By the time the data catches up, the displacement is structural. Who Buys What We Build? U.S. employers cut 1.2 million jobs in 2025 while posting record profits and pouring tens of billions into AI. AI didn't break capitalism. It exposed a version of capitalism that had already stopped distributing its gains. --- ### Is Anthropic vital for US Security? - Werner Glinka https://www.wernerglinka.com/writing/is-anthropic-vital-for-us-security/ AI LABOR CULTURE Is Anthropic vital for US Security? Apr 11, 2026 On Tuesday the 7th, Treasury Secretary Scott Bessent and Federal Reserve Chair Jerome Powell summoned the CEOs of America’s largest banks to an urgent, unscheduled meeting at Treasury headquarters in Washington.[1][2] The subject was a single AI model — Claude Mythos Preview, built by Anthropic. The CEOs of Citigroup, Morgan Stanley, Bank of America, Wells Fargo, and Goldman Sachs showed up. Jamie Dimon couldn’t make it.[1] The message was simple: this technology poses real risks to the financial system. Prepare yourselves. You know who wasn’t in the room? Anthropic. Not because they had nothing to contribute. Anthropic had already briefed government officials before releasing Mythos. They had already decided, on their own, not to make the model publicly available.[7] They had already formed Project Glasswing — a coalition of over 50 organizations, including Amazon, Apple, Microsoft, Google, JPMorgan, CrowdStrike and Palo Alto Networks — to use Mythos defensively, finding and fixing vulnerabilities in critical infrastructure before others exploit them. They committed $100 million in credits to the effort, plus $4 million in direct donations to open-source security organizations. They contracted professional security teams to manually validate every vulnerability report before sending it to maintainers.[5] Anthropic had displayed all the traits of a good corporate citizen with great morals. So why wasn’t Anthropic in the room? The most likely explanation is the simplest: inviting Anthropic would mean publicly partnering with a company that the President had personally attacked. The Contradiction Weeks before the Bessent meeting, the Pentagon designated Anthropic a “supply chain risk” to national security.[3] The reason? Anthropic refused to remove safeguards that prevent its models from being used for mass domestic surveillance and fully autonomous weapons systems.[4] President Trump and Defense Secretary Pete Hegseth publicly attacked the company for insisting on limits. Federal agencies were ordered to stop using Anthropic’s products.[3] The administration punished Anthropic for being too careful. Then, when Anthropic produced something genuinely dangerous and handled it responsibly — withholding public release, briefing officials, building a defensive coalition — the administration had to scramble to warn the banking system about the very thing Anthropic had already warned them about. The Operational Cost By excluding Anthropic, the government forced itself into the role of a messenger delivering secondhand information about a threat that the people who actually understand it best weren’t there to explain. The bank CEOs got a warning, but they didn’t get the expertise behind it. That’s not just politically awkward — it’s operationally worse. The people best equipped to answer questions about Mythos’s capabilities, its limits and what defensive measures actually work were absent from the conversation where those answers mattered most. The Choreography What you get instead is theater. Anthropic does the work — identifies thousands of zero-day vulnerabilities across every major operating system and browser, some dating back 27 years, builds the coalition, funds the defensive effort and sets up responsible disclosure processes.[5][6] And Bessent plays the middleman, relaying the danger to bank CEOs who are hearing it secondhand, after Anthropic has already told the government directly. JPMorgan is already a Glasswing partner. They have access to Mythos. Their CISO called it “a unique, early-stage opportunity to evaluate next-generation AI tools for defensive cybersecurity.”[5] But the other banks at that table? They got summoned to be warned about a threat that one of their peers is already working on with the company the government says it can’t trust. What Anthropic Actually Did It’s worth being precise about what happened here because the coverage has been almost entirely about what Mythos can do — the vulnerabilities, the exploits, the security implications. The more important story is what Anthropic chose not to do. They built the most capable AI model by public benchmarks.[8] They tested it. They discovered it could find and exploit vulnerabilities that had survived decades of human review and millions of automated security scans. And instead of releasing it — instead of capturing the market advantage, the revenue, the headlines — they locked it down.[7] They restricted access to a small group of partners who maintain critical infrastructure.[5] They engaged with government officials before going public. They published a 244-page system card detailing the model’s capabilities and risks, with a level of transparency unmatched by any other lab.[6] They committed to developing new safeguards before making Mythos-class capabilities generally available. We can argue about whether Anthropic gets everything right. But the posture is consistent: they built something powerful, they recognized the danger, and they chose to be deliberate about how it enters the world. The Dangerous Part The dangerous part of this story is not Mythos. Mythos has a responsible owner. The dangerous part is that the institutions charged with governing this moment cannot decide whether that owner is a partner or a threat. Consider what Anthropic has actually done. The company found thousands of zero-day vulnerabilities in every major operating system and browser. It built the defensive coalition. It briefed the government before acting. It voluntarily withheld a product that would have generated enormous revenue. That is national security work, regardless of what label the Defense Department puts on it. The Bessent meeting itself is the proof. You don’t summon bank CEOs over a threat discovered by a company that doesn’t matter. And yet the administration designated this same company a supply chain risk because it refused to build tools for mass surveillance and autonomous weapons. Federal agencies were ordered to cut ties. The decision wasn’t made on the merits. It was made in response to a company that told the administration no. Anthropic told the Pentagon no. For that, it was labeled a national security threat. Anthropic told the world its most powerful model was too dangerous for public release and built a coalition to deploy it defensively. For that reason, it was left out of the room where the danger was being discussed. The question isn’t whether AI companies can act responsibly. At least one of them just demonstrated that it can. The question is whether the institutions that are supposed to govern this technology can act coherently. That’s a harder problem than any vulnerability Mythos will ever find. Sources 1 - Powell, Bessent discussed Anthropic’s Mythos AI cyber threat with major U.S. banks (CNBC) 2 - Bessent, Powell Summon Bank CEOs to Urgent Meeting (Bloomberg) 3 - Pentagon labels Anthropic a supply chain risk (NPR) 4 - Anthropic rejects Pentagon offer (CNN) 5 - Project Glasswing: Securing critical software (Anthropic) 6 - Claude Mythos Preview system card (Anthropic) 7 - Why Anthropic won’t release Mythos to the public (NBC News) 8 - Everything You Need to Know About Claude Mythos (Vellum) Share This Post Related Reading My Claude Wishlist I use Claude for intellectual work: developing arguments across sessions, stress-testing ideas, writing essays, and building software. It’s the most productive working relationship I’ve had with a tool — and I keep running into the same wall. The Corporate Benevolence Fantasy The promise that AI will make everything cheaper rests on one assumption — that corporations will pass their savings to consumers. The forty-year productivity-pay gap says they won't. The 2017 tax cut dress rehearsal says they won't. And $1.6 trillion in shareholder buybacks in a single year confirms they aren't. Who Buys What We Build? U.S. employers cut 1.2 million jobs in 2025 while posting record profits and pouring tens of billions into AI. AI didn't break capitalism. It exposed a version of capitalism that had already stopped distributing its gains. --- ### The Wrong Argument - Werner Glinka https://www.wernerglinka.com/writing/the-wrong-argument/ AI LABOR CULTURE The Wrong Argument Apr 3, 2026 This is the fourth in a series that began with “Who Buys What We Build?” and continued with “I’ve Seen This Before” and “The Corporate Benevolence Fantasy.” If you’re new here, the first essay is where the argument starts. On April 4, 2026, the New York Times published a piece about economists finally taking AI displacement seriously. [1] The most striking quote came from Molly Kinder, a senior fellow at the Brookings Institution: “I really don’t know anything a college student can bring to my team that Claude can’t do.” [1] A Brookings senior fellow said she no longer needs entry-level researchers. That’s not a prediction. That’s a present-tense observation from someone whose job is to study the labor market — and who just eliminated a piece of it. But the article’s most revealing detail came at the very end. Anton Korinek, the University of Virginia economist most willing to consider extreme AI scenarios, is leaving academia at the end of the semester to join Anthropic — the company that builds Claude. [1] The economist most engaged with the risk is leaving the institution that studies it to join the institution that creates it. Draw your own conclusions about what he sees coming and where he thinks the real work will be done. I’ve been writing about AI displacement since early this year. Each essay advanced the argument. Each found an audience larger than I expected, which tells me people recognize what’s happening even when the institutions that are supposed to speak for them won’t say it out loud. This essay is different. I’m not extending the argument. I’m stepping back to question the frame itself — including parts of my own earlier framing. The Battle at the Gates The public debate has two sides, and both are performing. The tech evangelists — Altman, Khosla, Musk — predict massive job loss in terms designed to excite investors. [1] When the CEO of a company positioning for what could be one of the largest IPOs in history tells the world that AI will replace half the workforce, that’s not a neutral observation. It’s a sales pitch. The economists, until very recently, have responded with what the Times called “skepticism bordering on dismissiveness.” [1] Daniel Rock at the University of Pennsylvania told the Times: “I don’t think A.I. has hit the labor market yet... but I think it’s coming.” [1] They’re debating whether the wave is approaching while the water is around their ankles. Between these two camps, the policy conversation has defaulted to a single answer: retraining. Teach people to work alongside AI. Upskill the workforce. Adapt. Left, right, corporate, academic. A multi-year study highlighted in Foreign Affairs found that adults in both the U.S. and Canada ranked worker retraining as their top policy choice, cutting across party lines. [2] It sounds reasonable. And by the available evidence, it has never worked at scale. Why Not Retraining I covered the Ruhr Valley retraining programs in “I’ve Seen This Before.” The U.S. record is no better. Brookings published an analysis in May 2025 that should have ended this conversation. Researcher Julian Jacobs reviewed the entire history of U.S. public retraining programs. They concluded that the evidence “suggests we should be skeptical of retraining programs as an effective policy response to support labor force adjustment to AI.” [3] The National JTPA Study — a genuine randomized controlled trial — showed no statistically significant improvement in employment rates or earnings. [3] The WIA program that replaced it: no positive impact. [3] The Trade Adjustment Assistance program, designed specifically for displacement, participants had worse outcomes than non-participants. [4] And Brookings identified a problem specific to AI: retraining programs frequently move workers from one automation-susceptible occupation to another. [5] You retrain someone as a data analyst, and eighteen months later, that role is being automated. The program organizers themselves admit they have a foggy understanding of AI’s future economic impact. [5] You can’t aim at a target that keeps moving. But the most devastating data point came from a corporate earnings call. In September 2025, Accenture CEO Julie Sweet told analysts that the company was “exiting on a compressed timeline, people were reskilling, based on our experience, is not a viable path for the skills we need.” [9] The CEO of the world’s largest consulting firm — the company that sells workforce transformation services to every other company — admitted on a public earnings call that reskilling doesn’t work fast enough for their own people. Accenture trained over 550,000 employees on generative AI and still couldn’t retrain the 11,000 it cut that quarter. [9] If the company that sells retraining to everyone else can’t make it work on its own workforce, the rest of the policy conversation starts to look like theater. The Fog A measurement problem compounds the retraining problem: we can’t see displacement clearly enough to respond to it, in part because companies are misrepresenting its causes. Deutsche Bank analysts coined the term “AI redundancy washing” at Davos in January 2026. [10] A Resume.org survey of 1,000 U.S. hiring managers put a number on it: 59 percent admitted they emphasize AI’s role in explaining layoffs because it resonates better with stakeholders than citing financial pressure. Only 9 percent said AI has fully replaced certain roles at their company. [10] Amazon provides the sharpest example. CEO Andy Jassy wrote in June 2025 that AI would reduce the corporate workforce. [10] When Amazon actually cut 14,000 positions in October, Jassy said on the earnings call, it was “not even really AI-driven.” [10] The same week, senior VP Beth Galetti’s memo to the affected employees cited AI as the transformative force. [10] Three contradictory statements in a single quarter. That’s not ambiguity. That’s a company that doesn’t know — or doesn’t care — whether its own narrative is coherent. Forrester’s 2026 Predictions report found that 55 percent of employers who cited AI in layoff decisions now regret it, primarily because the technology didn’t deliver on what executives had promised themselves. [11] Gartner predicts that by 2027, half of the companies that cut customer service roles citing AI will rehire for similar functions — but under different job titles, often offshore, at lower wages. [11] [12] The genuine displacement is real — at Block, Atlassian, Duolingo and Salesforce. [10] But it’s tangled with fabricated displacement used for investor optics, and nobody can separate the signal from the noise. Economists can’t measure what they can’t see clearly. Policymakers can’t design interventions for a crisis whose contours no one can define. And the retraining programs being built in response are targeting a problem they can’t accurately diagnose, using methods that have never worked, on timelines that the technology is already outrunning. But all of this — the retraining debate, the AI-washing, the economist-versus-evangelist arguments — is the battle at the gates. It’s the visible conflict. Everyone is watching it. Everyone has an opinion. And while that argument plays out, the actual displacement is already inside the walls. This fog distorts the visible layer. But the more consequential problem is that the second layer doesn’t need distortion to remain invisible. The Trojan Horse When people talk about AI replacing workers, they picture a CEO standing at a podium announcing layoffs. That’s the image. It’s dramatic, it’s trackable, and it’s what the policy conversation is built around. The most consequential displacement isn’t happening through layoff announcements. It’s happening through software updates. What’s changing is not just capability, but the role of software itself. Software is shifting from a tool layer that augments labor to a layer that directly substitutes for it. In January 2026, Bessemer Venture Partners made an observation that deserves more attention than it’s received: “Vertical AI isn’t competing for IT budgets; it’s competing for labor budgets.” [13] Unlike horizontal software that helps people work, vertical AI platforms — those built for specific industries like healthcare, legal, construction, insurance and field services — are designed to perform the work itself. The economics are explicit. Vertical SaaS companies now trade at 12x to 15x revenue — nearly matching AI pure-play valuations of 14.5x — while generic horizontal SaaS sits at 2x to 5x. [14] That spread tells you how the market sees this: platforms that absorb what people do are valued at roughly triple the multiple of platforms that assist people in what they do. Investors are pricing replacement at a premium over assistance. And the business models are being redesigned to make this explicit. Vertical AI companies are moving from per-seat pricing — you pay for each employee who uses the software — to outcome-based pricing: you pay per document reviewed, per claim processed, per dispatch scheduled. [13] When you price software by the outcome instead of by the seat, you’re no longer selling a tool. You’re competing directly with the salary of the person who used to produce that outcome. Let me make this concrete. What It Looks Like From the Inside Consider a mid-sized property-casualty insurance carrier — 2,000 employees, regional, the kind of company that nobody writes about. They’ve used Guidewire for claims management for years. It’s their core platform. Their adjusters work inside it every day. In Q1 2026, Guidewire pushes a platform update. The new module handles first notice of loss for routine auto claims — the fender benders, the parking lot dings, anything under a certain threshold. It reads the filing, cross-references the policy, pulls the damage estimate from photo analysis, and routes it for payment. An adjuster still reviews the output, but the review takes four minutes instead of the thirty-five it took to build the file from scratch. Nothing dramatic happens. No announcement. No restructuring memo. The team handles more volume with the same headcount. The claims manager notices at the quarterly review that throughput is up 40 percent on routine auto. Good news. In Q3, an adjuster retires. The claims manager reviews the numbers and the volume the team is handling, and decides not to backfill. The work is getting done. Budget pressure is real. Hiring takes three months anyway. The position stays open, then quietly disappears. By Q1 2027, two more adjusters have left — one to a competitor, one to take care of an aging parent. Neither position gets filled. The team is down three people. Nobody was laid off. Nobody’s job was eliminated. The platform just kept getting better at the routine work, and the team shrank around it. Now multiply this by every carrier using Guidewire, by every field services company using ServiceTitan, by every construction firm using Procore, by every legal department using a contract review platform that processes routine NDAs without human input. None of these show up in the Challenger report. None trigger WARN Act notices. None generates headlines. The insurance trade press might run a piece about Guidewire’s new AI capabilities, framed as innovation rather than displacement. The adjusters who left found other jobs — or didn’t — and nobody connected their departure to a platform update. This is the mechanism. Not a dramatic replacement. A slow absorption, one function at a time, one update at a time, one unbackfilled position at a time. The Scale The capital is already allocated. Crunchbase reported that in 2026, “it will be very difficult for a SaaS company without native AI/agentic capabilities to find VC dollars at any stage.” [16] Vertical AI startups are growing at 400 percent and competing at roughly 80 percent of traditional SaaS pricing. [17] Gartner expects that by 2026, 80 percent of enterprises will have deployed generative AI-enabled applications. [15] BetterCloud put it plainly: “The SaaS industry spent more than two decades building tools that enabled human work. Now in 2026, the focus is shifting to software that autonomously performs the work.” [15] These platforms are embedding themselves into insurance, construction, field services, healthcare billing, property management, legal services, and logistics — industries employing tens of millions of people that rarely feature in the AI displacement conversation. Because the disruption doesn’t look like AI, it appears to be a software upgrade. You can’t file for unemployment because your job shrank. You can’t retrain for a role that still technically exists — it’s just not a full-time job anymore. There is no layoff announcement for a position that was never eliminated, just never refilled. The Timing Problem A fair objection: if vertical SaaS is silently absorbing labor at this scale, it will eventually show up in industry employment statistics. BLS data lags, but it catches up. Productivity data will reflect it. GDP per worker will move. The displacement I’m calling invisible won’t stay invisible forever. That’s true. And it’s exactly the problem. The Ruhr Valley’s supply chain collapse eventually showed up in the statistics, too. By the time it did, the damage was structural. The small firms were gone. The workers had been unemployed long enough that their skills had atrophied, and their savings were spent. The measurement systems caught up just in time to document what had already happened — not in time for anyone to intervene. The question isn’t whether the data will eventually reflect this displacement. The question is whether it will reflect it in time for institutions to respond. And every indicator says no. The vertical SaaS adoption cycle is measured in quarters. Enterprise procurement decisions are made annually. Platform updates ship continuously. The BLS publishes employment data monthly, but industry-specific breakdowns lag by a year or more. By the time the data shows a pattern, the pattern has been running for two or three years. This is a timing problem. But a timing problem where the delay is long enough for millions of jobs to shrink before any institution notices is not a minor technical caveat. It is the problem. The Two Layers So here is where we actually stand. The first layer of displacement is visible. It’s the headline layoffs — Salesforce, Block, Amazon, Meta. It’s messy, contested, and partially fabricated. Nearly 60 percent of it is narrative cover for financial decisions that would have happened regardless of AI. [10] The displacement within this layer is genuine, but it’s tangled with AI-washing to the point that nobody can accurately measure its scope. This is the layer that economists study, journalists cover, policymakers react to, and retraining programs are designed to address. The second layer is structurally invisible. It’s the embedding of AI into industry-specific platforms that companies already use, already trust, and already depend on. It doesn’t trigger layoff announcements. It doesn’t show up in BLS data. It doesn’t activate WARN Act notices. It happens inside procurement decisions, vendor renewals, and budget line items — a thousand small optimizations at a thousand companies, none of them dramatic enough to register in any tracking system we have. And it’s being funded at scale by investors who are explicitly pricing these platforms based on their ability to capture labor value. [13] [14] The retraining conversation is happening entirely within the first layer. And it fails on both counts. It fails against the genuine displacement in the first layer because the evidence shows retraining has never worked at scale [3], because the target keeps moving [5], and because even Accenture can’t make it work for its own people. [9] And it’s completely irrelevant to the second layer, because you can’t retrain someone for a job that wasn’t eliminated — it was absorbed. I’ve Seen This Before, Too I keep coming back to Gelsenkirchen. When the coal crisis hit the Ruhr Valley in 1957, the visible crisis was the mine closures. That’s what got the political attention. That’s what the co-determination laws were designed to address. And the programs worked — for the miners at the major companies. They got early retirement, retraining and transfers to the metal industries. Government officials could truthfully say that none of the miners at the big coal companies became unemployed. But the co-determination laws only covered coal and steel. Not the suppliers, the service businesses, the small firms that existed because the mines existed. Those workers were on their own. Unemployment in the affected industries exceeded 15 percent. And the official narrative framed the whole thing as a success story for decades while Gelsenkirchen sat at 15.6 percent unemployment sixty-three years after the crisis began. The parallel isn’t exact — the Ruhr’s supply chain collapse was downstream of the mine closures and was caused by them. In contrast, vertical SaaS absorption is a separate mechanism operating on its own logic. But the structural lesson holds: the people at the center of a transition get the programs. The people on the periphery absorb the damage for generations. And there are always more people on the periphery. The Honest Position I’ve been working with Claude for more than two years now. I’ve watched it go from a powerful but limited tool to something that changes what a single person can produce. The progression has been steep, and nothing in the trajectory suggests it’s slowing down. But between AI getting competent and AI being fully integrated into existing business processes, there is a gap. That gap is real. It’s the reason Gartner predicts rehiring. [12] It’s the reason Forrester says 55 percent of companies regret premature cuts. [11] It’s the reason the economists can look at the aggregate data and not see much yet. [1] Integration is slow, messy, and dependent on organizational capacity that most companies don’t have. The hype merchants are selling the capability curve. The economists are measuring the integration curve. They’re looking at real data and reaching different conclusions because they’re measuring different things. The honest position is that the gap exists, and it buys time. The equally honest position is that nobody is using the time it buys. Not the companies, which are either cutting prematurely for investor optics or ignoring the problem until it’s undeniable. No executive needs to decide to “replace workers” for this to happen. They only need to accept tools that improve margins. The outcome is the same. Not the policymakers, who are defaulting to retraining because it’s the only lever they know how to pull. Not the economists, who are only now arriving at concerns that were visible to anyone paying attention a year ago. And not the tech leaders, who are selling a future that serves their capital-raising needs while building bunkers in Hawaii and New Zealand for the world they see coming. The Ruhr Valley eventually stabilized — sort of — through massive, sustained public investment over decades. New universities, new industries, new infrastructure, a fundamental reimagining of what the region was for. It took the better part of sixty years and billions in subsidies. And it still left my hometown with a 15.6 percent unemployment rate. What’s happening now is a transition at a global scale, at internet speed, with a second layer of displacement that no institution is watching and no measurement system can detect in time to respond. The question from my first essay remains unanswered: who buys what we build, when the people who used to buy things no longer earn enough to do so? This essay adds a second question: what happens when we can’t even see the displacement clearly enough to act, when the most consequential layer of the transition is invisible to every institution that might intervene? The time that “gradual” buys us will run out. It always does. And the longer we spend arguing about the visible layer, the less time we have to respond to the one we’re not even measuring. By the time we can see it clearly, it won’t be a transition. It will be an outcome. Updates April 8, 2026 Five days after this essay was published, Jennifer M. Harris — a former economic official in the Biden White House — published an op-ed in the New York Times making substantially the same diagnosis I’ve laid out across this series. The wealth concentration. The productivity-pay decoupling. The AI-washing question. The inadequacy of every current policy response. She cites Gabriel Zucman’s finding that 19 households have added $1.8 trillion to their wealth in the past two years — roughly the size of Australia’s economy — and writes that “we are no longer sharing in self-government.” That sentence points at something I’ve been circling but hadn’t named directly: the displacement isn’t just an economic problem. It’s a constitutional one. When that much wealth and power concentrate so quickly, the democratic part of democratic capitalism ceases to be meaningful, regardless of what the formal institutions look like. The convergence is the news. Six months ago, the frame Harris is using would have been considered alarmist. Now it’s appearing under institutional credentials in the paper of record. The conversation is moving from the periphery to the center faster than the institutions themselves seem to realize. But Harris stops where the mainstream conversation still stops. Her entire piece operates within the visible layer — the headline layoffs, the IBM cuts, the Stanford study on early-career employees. She names AI-washing as a possibility but doesn’t pursue it. She doesn’t grapple with the evidence that retraining has never worked at scale. And she doesn’t touch the vertical SaaS mechanism at all. Her policy prescriptions — taxing investment income, sovereign wealth funds, worker cooperatives — are responses to the layer she can see. They’re good ideas. They’re also what emerges when half the problem is still invisible. This is what I meant by “the wrong argument.” Not that Harris is wrong — she’s largely right, and her piece is the most important mainstream signal yet that the diagnosis is breaking through. But the frame she’s using is still the frame at the gates. The Trojan Horse is still inside the walls, still getting software updates, and still not part of the conversation she’s joining. The mainstream is catching up to where this series was a week ago. That’s encouraging. It also means the next layer of the argument is still waiting for them. April 11, 2026 Three days after the Harris update above, Anthropic released Claude Mythos Preview. The news cycle has been dominated by its security capabilities — Mythos found thousands of zero-day vulnerabilities across every major operating system and browser, which is why Anthropic withheld public release and formed a defensive coalition before announcing the model’s existence. That’s the story getting coverage. The detail that matters for this essay sits in a different part of the announcement. On SWE-bench Verified — the benchmark that measures how well an AI system can resolve real software engineering tasks from actual codebases — Mythos scores 93.9 percent. The previous frontier model was at 80.8. A year ago the best systems were in the low 70s. Mythos itself isn’t generally available. That’s not the point. The point is what this capability means for the platforms inside the walls. Return to the insurance carrier in the Trojan Horse section above. The Guidewire update that absorbed first-notice-of-loss for routine auto claims was built against the model capabilities available when that release was scoped — sometime in 2025, using tools roughly at the level of last year’s frontier systems. The Guidewire release after next will be built against something much closer to what Mythos can do. Not Mythos itself, which Anthropic is holding back, but the generally available model Anthropic will ship next, which will incorporate lessons from Mythos’s development. The question isn’t whether a given vertical SaaS platform can absorb a specific function. The question is how much of what used to be review-and-judgment work can now be absorbed into routine, release-over-release, as the upstream models keep advancing. A year ago, routine auto claims. This year, maybe commercial property. Next year, something closer to the adjuster’s actual judgment work. Nothing dramatic. Just the same pattern — an update ships, throughput goes up, a position doesn’t get backfilled. The Harris update noted that the mainstream conversation was catching up to where it had been a week earlier. Mythos is a different kind of confirmation. It’s evidence that the upstream pressure on the mechanism I described is accelerating faster than the essay implied. The vendors in your Trojan Horse are getting better tools, on a shorter cycle, than anyone watching the visible layer of displacement has reason to track. By the time we can see it clearly, it won’t be a transition. It will be an outcome. Sources [1] Ben Casselman, “Economists Are Starting to Take A.I.Elimination of Jobs Seriously,“ New York Times, April 4, 2026. [2] Beatrice Magistro et al., “The Coming AI Backlash,“ Foreign Affairs, 2025; covered in Northeastern University News, November 20, 2025. https://news.northeastern.edu/2025/11/20/ai-retraining-programs-northeastern-research/ [3] Julian Jacobs, “AI Labor Displacement and the Limits of Worker Retraining,“ Brookings Institution, May 16, 2025. https://www.brookings.edu/articles/ai-labor-displacement-and-the-limits-of-worker-retraining/ [4] Julian Jacobs, “AI & the Retraining Challenge,” AI Policy Perspectives, June 26, 2025. https://www.aipolicyperspectives.com/p/ai-and-the-retraining-challenge [5] Brookings Institution, analysis of AI and workforce retraining programs, May 2025 (as referenced in “I’ve Seen This Before“). [6] “The Reskilling Delusion: AI Reskilling Myth,“ Fast Company, March 2026. https://www.fastcompany.com/91484887/the-reskilling-delusion-ai-reskilling-myth [7] Matt Hopkins, “The Reskilling Myth: Why Retraining Won’t Save Us from AI Displacement,“ matthopkins.com, April 1, 2026. https://matthopkins.com/business/the-reskilling-myth/ [8] “Why Traditional AI Training Isn’t Working in 2026,“ DataCamp (survey of 500+ US and UK enterprise leaders, conducted with YouGov), March 2026. https://www.datacamp.com/blog/why-traditional-ai-training-isn-t-working-in-2026 [9] Accenture Q4 FY2025 earnings call, September 25, 2025; CEO Julie Sweet statement. Reported by CNBC, September 26, 2025; CX Today, October 2025; Nearshore Americas, October 2025. Accenture workforce and restructuring figures from company filings. [10] “11 Companies Replacing Workers With AI (2026): Real Layoff Data,“ PrepoAI, March 14, 2026. https://prepoai.com/article/11-companies-replacing-workers-with-ai-2026-real-layoff-data-mmqqj4qu — Aggregates data from: Challenger, Gray & Christmas 2025 Annual Report; Resume.org US Business Leaders AI Hiring Survey, 2025; Jack Dorsey shareholder letter on X, February 26, 2026; Marc Benioff on The Logan Bartlett Show, August 29, 2025; Amazon CEO Jassy internal memo (CNBC, June 17, 2025), Q3 earnings call (Fortune, CNN, GeekWire, October 30–31, 2025), and VP Galetti memo (Gizmodo, October 2025); Deutsche Bank analysts, World Economic Forum, Davos, January 20, 2026; Duolingo spokesperson statement, January 2024. [11] Forrester Research, Predictions 2026: The Future of Work, October 2025. Reported by The Register, October 29, 2025; Computerworld, November 4, 2025. [12] Gartner, “Gartner Predicts Half of Companies That Cut Customer Service Staff Due to AI Will Rehire by 2027,” press release, February 3, 2026 (based on survey of 321 customer service and support leaders, October 2025). https://www.gartner.com/en/newsroom/press-releases/2026-02-03-gartner-predicts-half-of-companies-that-cut-customer-service-staff-due-to-ai-will-rehire-by-2027 [13] Eze Vidra, “Vertical AI in 2026: The Good, The Bad, and The Ugly,“ VC Cafe, January 7, 2026. https://www.vccafe.com/2026/01/07/vertical-ai-in-2026-the-good-the-bad-and-the-ugly/ — Citing Bessemer Venture Partners’ Vertical AI Playbook. [14] Forbes Finance Council / Tomas Milar, “Vertical SaaS: An Overlooked Winner in the AI Valuation Race,“ Forbes, March 30, 2026. https://www.forbes.com/councils/forbesfinancecouncil/2026/03/30/vertical-saas-an-overlooked-winner-in-the-ai-valuation-race/ — Valuation data sourced from PitchBook 2025 VC Emerging Opportunities report. [15] “AI and the SaaS Industry in 2026,“ BetterCloud, January 2026. https://www.bettercloud.com/monitor/saas-industry/ — Citing Gartner forecast on GenAI enterprise deployment and McKinsey 2025 survey on organizational AI adoption. [16] “Crunchbase Predicts: Why Top VCs Expect More Venture Dollars, Bigger Rounds And Fewer Winners In 2026,“ Crunchbase News, January 5, 2026. https://news.crunchbase.com/venture/crunchbase-predicts-vcs-expect-more-funding-ai-ipo-ma-2026-forecast/ [17] “AI SaaS Valuation Premium: 1-3x More in 2026,“ Livmo, February 2026. https://livmo.com/blog/ai-impact-saas-valuations-2026/ — Citing Bessemer State of the Cloud data on vertical AI startup growth rates. Additional background sources referenced in previous essays in this series: Challenger, Gray & Christmas, 2025 Annual Job Cut Report University of Sydney / Prof. Uri Gal, “Tech Companies Are Blaming Massive Layoffs on AI. What’s Really Going On?“, March 17, 2026. https://www.sydney.edu.au/news-opinion/news/2026/03/17/tech-companies-are-blaming-massive-layoffs-on-ai.html Fox Business / Eric Revell, “Oracle Laying Off Thousands of Workers to Cut Costs Amid AI Push,“ March 31, 2026. https://www.foxbusiness.com/economy/oracle-laying-off-thousands-workers-cut-costs-amid-ai-push-report National Academies, “Retraining Workers for the Age of AI,” December 2025. https://www.nationalacademies.org/news/retraining-workers-for-the-age-of-ai Share This Post Related Reading Who Fired You Stanford's 2026 AI Index shows a widening gap between what AI experts believe and what everyone else believes. Sarah Perez at TechCrunch treats it as a puzzle. It isn't. The experts are looking at what AI could do. The public is looking at what AI is being used to do to them. 'AI is taking jobs' is a grammatical evasion. My father's generation lost their livelihoods and kept their vocabulary: Krupp. Thyssen. The ministers in Bonn. Not Yet 'Not yet' is not a reassurance. It's a diagnosis. Anthropic's own research shows a 14% drop in job-finding rates for young workers in AI-exposed fields. The data says the displacement hasn't hit yet. The structure says it's already underway. I grew up inside that gap in Gelsenkirchen — I know what it looks like when 'not yet' becomes 'too late.' Who Buys What We Build? U.S. employers cut 1.2 million jobs in 2025 while posting record profits and pouring tens of billions into AI. AI didn't break capitalism. It exposed a version of capitalism that had already stopped distributing its gains. --- ### How Can America Be So Miserable - Werner Glinka https://www.wernerglinka.com/writing/how-can-america-be-so-miserable/ AI LABOR CULTURE Notes on David French’s “How Can America Be So Miserable When It’s So Rich?” Mar 28, 2026 David French wrote a piece in the New York Times about America’s tiered economy[1] — Disney World pricing, travel sports, airline boarding groups, concierge medicine. He describes the symptoms well. The top 10% account for nearly half of all spending. The economy warps to serve them. Everyone else feels like a second-class citizen in their own country. His conclusion: no one is the clear villain. It’s just millions of rational choices aggregating into collective misery. The sad byproduct of prosperity. This is wrong, and it’s wrong in a specific way that matters. The income distribution French describes didn’t emerge from nowhere. It was built. Shareholder primacy. The deliberate weakening of organized labor. A tax code redesigned to favor capital over wages. Stock buybacks made legal again. These weren’t millions of Americans acting in rational self-interest. They were policy decisions made by identifiable people who profited from them. French can’t say this because it breaks his frame. If there are villains — or at least architects — then there are also different choices available. And that means his elegant sadness has to become something more: an argument about power. A commenter named Cynthia Gomez pushed him on this. She pointed to the policy regime that began under Reagan and has continued through every administration since. French’s reply was a textbook deflection — he answered a claim she didn’t make, then retreated to “no easy fix” paired with the quiet threat that structural responses would endanger “entrepreneurialism and economic freedom.” This is the move that has shut down serious conversation about distribution for many years. Here is what I know from experience, not from data. Gelsenkirchen, in Germany’s Ruhr Valley, was once part of the industrial engine of Europe. Coal and steel. Full employment. A city that made sense. By the time I left, the mines were closing, and the region was being told to retrain, adapt, and find new opportunities. My father spent his working life underground in those mines. The opportunity never came. Gelsenkirchen didn’t decline because people made bad choices. It didn’t decline because tides rose unevenly. It declined because the system no longer needed those people as a resource. And nobody in power owed them an alternative, because capitalism doesn’t carry that obligation. That’s the subject French won’t touch. Capitalism doesn’t care for people. It is concerned with the resources that it needs to create profits. When it needed millions of factory workers, it created the conditions that built the middle class — not out of generosity, but out of need. The postwar prosperity wasn’t a feature of the system. It was a temporary alignment between what capital needed and what labor could demand. Once that alignment broke, the system didn’t malfunction. It recalibrated. French’s tiered economy is what recalibration looks like. And if AI compresses the number of humans capital needs to generate returns — which it will — then what he’s describing isn’t an unfortunate side effect of prosperity. It’s a preview. I wrote about what that preview looks like when you’ve already lived through it once. “I’ve Seen This Before” The system is working. That’s the problem. Sources [1] David French, "How Can America Be So Miserable When It’s So Rich?," New York Times, March 26, 2026. Share This Post Related Reading Coal and Steel The comparison between AI and coal isn’t about technology. It’s about cognitive lock-in — what happens when an entire economy organizes around one assumption and can’t see the disruption because it’s inside it. Germany did everything right and still produced 38% poverty in Gelsenkirchen. That’s not the failure story. That’s the success story. Who Buys What We Build? U.S. employers cut 1.2 million jobs in 2025 while posting record profits and pouring tens of billions into AI. AI didn't break capitalism. It exposed a version of capitalism that had already stopped distributing its gains. The Corporate Benevolence Fantasy The promise that AI will make everything cheaper rests on one assumption — that corporations will pass their savings to consumers. The forty-year productivity-pay gap says they won't. The 2017 tax cut dress rehearsal says they won't. And $1.6 trillion in shareholder buybacks in a single year confirms they aren't. --- ### Coal and Steel - Werner Glinka https://www.wernerglinka.com/writing/coal-and-steel/ AI LABOR CULTURE Coal and Steel Mar 20, 2026 The last mine car. Nordstern Feb '93, 2011 Every time I write about AI and the labor market, someone says it. The phrasing varies, but the sentiment doesn’t. “Coal and steel? You’ve got to be kidding. You’re comparing pickaxes to large language models. It’s not the same thing.” They’re right. It’s not the same thing. And I want to take that objection seriously, because it sounds serious. Then I want to explain why it’s wrong — and why the impulse to make it is itself the most revealing thing about where we are. The Wrong Comparison The objection assumes that what I’m comparing is the industry — coal to AI, physical labor to cognitive labor, a regional economy to a global one. If that were the comparison, the critics would be right to dismiss it. But the industry is not what I’m comparing. What I’m comparing is the pattern. I grew up in Gelsenkirchen, in the heart of Germany’s Ruhr Valley. My father was a coal miner. At its peak, the region employed 650,000 people in coal and steel. [1] The mines and foundries weren’t just employers — they were the organizing principle of civic life. The tax base, the social contract, the football clubs, the neighborhood pubs, the whole texture of a functioning society was built around the assumption that coal had a future. When that assumption broke, everything organized around it broke too. Not all at once. Slowly. The mines closed one by one. Workers were retrained for jobs that were themselves contracting, or for positions that never materialized at the scale promised. Young people left. Services shrank. The tax base eroded. At each stage, the people managing the transition kept measuring, kept retraining, kept insisting the adjustments were working. Today, Gelsenkirchen has a poverty rate approaching 38 percent, [2] in a country where the national average is 15. Employment in coal and steel across the region fell from 650,000 to 73,000. [1] The city has lost more than 30 percent of its population since my father’s generation worked the mines. [1] Six decades of transition programs, billions in subsidies from European, federal, state, and municipal budgets, a 25-year concentrated push in research and education, and my hometown still has the highest youth welfare dependency rate in Germany. [2] That’s not a coal story. That’s a story about what happens when the thing a society is organized around stops working, and the people in charge respond with programs calibrated to a crisis that has already moved past them. The Pattern In the early 1990s, a German sociologist named Gernot Grabher published research on why the Ruhr failed to adapt. [3] His answer wasn’t that the coal ran out or that the markets shifted — everyone knew that. He answered that the very networks and shared identity that had made the region successful became the barriers to its transformation. He called it cognitive lock-in. The dense relationships between mining companies, unions, local government, and suppliers — the trust, the shared assumptions, the common identity — had created a closed system. Information that contradicted the prevailing narrative couldn’t get in. People who saw the structural shift coming couldn’t get heard. The consensus culture that had once coordinated an economic miracle now coordinated a slow failure, because the people inside the system couldn’t recognize that the system itself was the problem. Subsequent researchers confirmed and extended Grabher’s findings. [4] The same tight-knit relationships that made a region powerful also suppressed dissent, discouraged outside perspectives, and created a groupthink so pervasive that managers delayed necessary restructuring, for admitting the model was failing would have threatened their standing within the community. The strength of the bonds became the source of the blindness. None of this has anything to do with coal. All of it has to do with how concentrated economies fail. The Monoculture The Ruhr’s economy wasn’t built on coal. It was built on the assumption that coal would always have value. Everything else — the civic life, the tax base, the social contract — was organized around that premise. When the premise broke, the entire structure broke with it. The American economy rests on an equivalent premise: that human judgment, analysis, and creative synthesis have enduring market value. The housing market, the education system, the career ladder from entry-level to executive, the consumer spending that drives two-thirds of GDP — all of it is organized around the assumption that knowledge work will always exist. That’s the monoculture. Not the specific jobs. The underlying assumption on which the whole structure rests. Knowledge doesn’t have to be coal for the pattern to hold. It just has to be the thing the whole structure depends on. And it is. AI is what breaks the assumption — the way cheap imports broke coal. When AI writes legal briefs, generates architectural plans, produces code, and drafts marketing strategy, it’s not replacing one category of labor the way machines replaced physical work. It’s undermining the premise that organized the entire professional economy: that moving up the value chain — getting more education, developing better judgment, learning to do what machines couldn’t — was a reliable path to economic security. The Ruhr told its workers to adapt, retrain, and move into services. There was at least somewhere to go, even if the destination paid less. The research on the Ruhr documents how that requalification model worked — and where it fell short. But it at least had a destination. When AI automates the destination itself — when the “higher-skill” roles that displaced workers are supposed to retrain into are themselves being absorbed — the requalification logic falls short. It collapses. The pattern traveled from the shaft to the office without anyone noticing the route. The Dismissal as Symptom Here’s where this gets uncomfortable, because the “coal and steel” dismissal isn’t just an intellectual disagreement. It’s a textbook case of the very dynamic the research describes. Cognitive lock-in doesn’t look like ignorance. It looks like sophistication. It’s the belief that because your situation is technically unprecedented, the structural patterns observed in other contexts can’t possibly apply. It’s the confidence that comes from being embedded in a network of people who share your assumptions, read the same sources, attend the same conferences, and reinforce each other’s conviction that this time is different. The Ruhr’s industrial leaders believed that too. Coal and steel had powered Germany’s economic miracle. The region had the best engineers, the densest networks, and the most productive facilities in Europe. When cheaper imports started arriving, the response wasn’t panic — it was confidence. The Ruhr was too important, too integrated, too essential to the national economy to fail. The transition would be managed. The workers would adapt. The fundamental structure was sound. They were wrong. Not because they were stupid, but because they were locked in. The information contradicting their model couldn’t penetrate the networks shaping their worldview. “Coal and steel, you’ve got to be kidding.” is that same lock-in, performing itself in real time. It assumes that because AI is technically novel, the social and economic dynamics surrounding it must also be novel. But the dynamics are not novel. They are documented, studied, and recurring. The specific industry changes every time. The monoculture changes. The technology changes. The pattern doesn’t. And the most consistent feature of the pattern — across the Ruhr, across the American Rust Belt, across British coal towns — is that the people inside it are certain their situation is unique. That certainty is what prevents adaptation. It’s what Grabher identified in 1993, and it’s what the dismissal enacts without recognizing it. This is not an argument by analogy. It’s an argument from structural pattern recognition. And the strongest evidence for its validity is that the people who dismiss it are exhibiting the very behavior the pattern predicts. Convergence In March 2026, The Atlantic published a long investigation titled “America Isn’t Ready for What AI Will Do to Jobs.” [8] The reporter spent months interviewing Federal Reserve presidents, Nobel Prize-winning economists, Fortune 100 CEOs, union leaders, and politicians, from Bernie Sanders to Steve Bannon. The piece arrived at the same diagnosis from a completely different direction — not through the Ruhr, not through structural pattern recognition, but through the direct testimony of the people running the system. The economists can’t see it in the data yet. The CEOs have stopped talking publicly because they know what’s coming, and their PR teams have told them to shut up. Congress is structurally incapable of responding. And the institution designed to measure what’s happening to American workers — the Bureau of Labor Statistics, created in the 1880s because the republic believed it had a duty to count — is being defunded. The Atlantic piece doesn’t mention Gelsenkirchen, Grabher, or cognitive lock-in. It doesn’t need to. It documents the same pattern from the inside: a system that can see the disruption arriving and cannot organize a response. When a retired web developer from a German mining town and a months-long investigation by one of America’s oldest magazines arrive at the same conclusion independently, the conclusion is probably not the problem. The question is why so few people with the power to act are willing to hear it. What the Ruhr Actually Proves Germany did everything right — or as close to right as any capitalist democracy has managed. Co-determination laws gave workers seats on corporate boards. [6] The constitution mandated equivalent living conditions across regions. [5] Statutory pension and unemployment insurance funded early retirement without catastrophic income loss. A consensus culture between industry, unions, and the state coordinated the transition over six decades. Billions flowed in from European, federal, state, and municipal budgets. Universities were built. Science parks were constructed. [7] The region rebranded itself twice. And it still produced 38 percent poverty in Gelsenkirchen. [2] Still left the region with nearly double the national unemployment rate. [9] Still lost 30 percent of the population. [1] Still created a Social Equator — the A40 motorway — dividing the prosperous south from the stagnant north, with world-class infrastructure on both sides and radically different lives beneath. [9] That’s not a failure story. It’s the success story. It’s the best-case outcome for a managed industrial transition in a society with strong institutions, robust safety nets, and sustained political will. If the best version of managed transition, executed by a society purpose-built for social partnership, still produces generational poverty in the communities at the center of the disruption — what does that tell us about a country with none of those institutional advantages facing a disruption that’s faster, broader, and not geographically contained? The United States has no co-determination framework. No constitutional mandate for regional equity. Union membership is at a historic low. A social safety net that has been deliberately weakened for four decades. A political system where the industries that need regulation fund the legislators responsible for regulating them. Two-year election cycles are structurally incapable of addressing decade-long disruptions. And a deeply embedded cultural narrative that market intervention is suspect and individual adaptation is the only legitimate response to structural change. The Ruhr comparison doesn’t just show what slow collapse looks like. It shows the minimum institutional requirements for managing that collapse — and, by extension, how far the United States is from meeting them. Not a History Lesson I didn’t study this in a textbook. I grew up inside it. I watched the same confident assurances play out over decades — the transition is being managed, the retraining is working, the numbers will improve. I watched “not yet” become “too late” over the span of a childhood. And the people who dismissed the warning signs weren’t stupid or malicious. They were locked in. They couldn’t see the pattern because they were inside it. The person who says “coal and steel, you’ve got to be kidding” is inside it now. They can’t see the pattern because the technology is too dazzling, the networks too affirming, the narrative too compelling. AI is unprecedented. This time is different. The old lessons don’t apply. The old lessons always apply. That’s what makes them lessons. Sources [1] Urban Transitions Alliance, “Gelsenkirchen city profile.” Regional employment decline (650,000 to 73,000) and 30%+ population loss. [2] Paritätische Armutsbericht (Paritätische Poverty Report), 2024. Reports a 37.9% poverty rate for Gelsenkirchen. Youth welfare dependency data from the Bremen Institute for Workplace Research and Career Support. [3] Gernot Grabher, “The Weakness of Strong Ties: The Lock-in of Regional Development in the Ruhr Area,” in The Embedded Firm: On the Socioeconomics of Industrial Networks, edited by Gernot Grabher, Routledge, 1993. Cognitive lock-in theory. [4] Pillai et al, “The Negative Effects of Social Capital in Organizations: A Review and Extension.” Research on bonding social capital as a barrier to adaptation, including groupthink, suppression of dissent, and delayed restructuring. [5] Article 72 of the German Basic Law (Grundgesetz). Establishes the principle of “equivalence of living conditions” (gleichwertige Lebensverhältnisse) across regions. The Joint Federal/Länder Task for the Improvement of Regional Economic Structures (GRW) is the primary fiscal mechanism. [6] German Co-determination Act (Mitbestimmungsgesetz), 1976, and the earlier Montan Co-determination Act (Montanmitbestimmungsgesetz), 1951. Worker representation on supervisory boards in coal and steel industries. [7] Ruhr transition policy phases. Taxonomy of preserving, reactive, and forward-looking structural policy drawn from academic literature on the Ruhr transition. Science Park Gelsenkirchen from municipal development records. IBA Emscher Park and Zollverein UNESCO World Heritage designation. [8] Josh Tyrangiel, “America Isn’t Ready for What AI Will Do to Jobs,” The Atlantic, March 2026. Interviews with Austan Goolsbee, Daron Acemoglu, David Autor, Anton Korinek, Reid Hoffman, Gina Raimondo, Liz Shuler, Senator Gary Peters, Senator Bernie Sanders, and Steve Bannon. BLS funding and survey limitations from former commissioner Erika McEntarfer. [9] “Regional analysis of structural change in the German hard coal mining Ruhr area.” A40 motorway as socioeconomic dividing line; Gelsenkirchen unemployment rate of 14.7% versus national average of 5.5%. Earlier essays in this series: “Who Buys What We Build?”, “I’ve Seen This Before,” “The Corporate Benevolence Fantasy,” and “Not Yet,” Werner Glinka, Substack, 2025–2026. Share This Post Related Reading Who Fired You Stanford's 2026 AI Index shows a widening gap between what AI experts believe and what everyone else believes. Sarah Perez at TechCrunch treats it as a puzzle. It isn't. The experts are looking at what AI could do. The public is looking at what AI is being used to do to them. 'AI is taking jobs' is a grammatical evasion. My father's generation lost their livelihoods and kept their vocabulary: Krupp. Thyssen. The ministers in Bonn. I've Seen This Before I grew up in Gelsenkirchen, in the Ruhr Valley, and watched coal and steel collapse over decades. Retraining never worked at scale. The trades offer a reprieve, not an escape. And the science fiction writers have been ahead of the economists for seventy years — a structural problem requires a structural response. Who Buys What We Build? U.S. employers cut 1.2 million jobs in 2025 while posting record profits and pouring tens of billions into AI. AI didn't break capitalism. It exposed a version of capitalism that had already stopped distributing its gains. --- ### My Claude Wishlist - Werner Glinka https://www.wernerglinka.com/writing/my-claude-wishlist/ AI LABOR CULTURE My Claude Wishlist Mar 21, 2026 I’ve spent the last year working seriously with AI — not casually, not experimentally, but as a daily collaborator on writing, research, and technical projects. I use Claude for intellectual work: developing arguments across sessions, stress-testing ideas, writing essays, and building software. It’s the most productive working relationship I’ve had with a tool — and I keep running into the same wall. Every time I work with Claude we start almost from scratch. What I Keep Losing Right now, if you use Claude seriously, you use it in fragments. Chat for thinking. Code for building. Cowork for file management. Each lives in its own context. Each starts from scratch — or close to it. The reasoning you developed in chat doesn’t follow you to the terminal. The document structure you built in Cowork doesn’t inform the conversation. So you become the integration layer. You carry context between sessions, re-explain what you’re working on, re-establish the intellectual thread every time you switch modes. If you’ve ever onboarded the same colleague three times in one week because they keep forgetting what you discussed, you know the feeling. This isn’t minor. It shapes what’s possible. Complex intellectual work — the kind where an argument develops across weeks, where each session builds on the last, where the collaboration deepens because both parties carry shared history — that work gets stunted when the system resets every time you switch tools. What I Want So what would I like that to look like in my daily work? I’m on my iPad at a coffee shop. An argument takes shape in conversation — a structural parallel between two historical displacements clicks into focus. I sketch it out with Claude, testing the logic, pushing on the weak points. The reasoning chain is solid. I get home, open my laptop, and say: “Let’s turn that into a draft.” Claude knows what “that” means. It was there. Not a summary of what happened, not a re-reading of exported notes, but the actual thread — the false starts, the moments where the argument pivoted, the specific objections that got addressed. It opens a file, starts writing, and pulls in the right execution environment because the task shifted from thinking to producing. That doesn’t exist yet. What exists is: copy your chat, paste it into a new context, hope the new instance picks up the thread, lose the texture of how you got there. If I could design what I want, it would have three properties: A persistent instance — one Claude bound to a project, not a device or a mode. It accumulates context the way a human collaborator does, not through explicit memory commands, but through participation. It was there for the conversation, so it knows the conversation. Capabilities, not modes — shell access, file system access, browser access, document generation. These are tools the instance reaches for as needed, not separate applications I switch between. I wouldn’t think of picking up a pen as entering “pen mode.” The same principle applies. Device-agnostic access — the project is the anchor. iPad, laptop, phone, desktop — those are windows into the same ongoing collaboration. The interface adapts. The context persists. Why This Isn’t Just About Convenience The current silo model implicitly assumes that AI collaboration is transactional — you ask, you get an answer, you move on. But the most valuable intellectual work is cumulative. It requires a collaborator who remembers not just facts but reasoning — why you rejected one framing, what counterargument shifted your position, which thread you deliberately left open for later. Memory features help, but they store attributes rather than argumentation. They know where you live and what you’re working on. They don’t know that you spent three sessions testing a specific philosophical framework and came out with a set of unresolved questions you intended to return to. That’s not a fact to store. It’s a trajectory to continue. There’s a conciseness argument here too, and it’s not trivial. Every context reset inflates the conversation with information both parties already possess. You re-explain your framework. The AI re-hedges with qualifications it wouldn’t need if it already knew where you stand. That redundancy isn’t a style problem — it’s an architectural one. A persistent instance doesn’t just remember more. It communicates more efficiently because shared context compresses the conversation, focusing on the actual work. The same principle that makes good prose concise — don’t tell the reader what they already know — applies to collaboration itself. Why It Doesn’t Exist Yet I’m not naive about why this is hard. A persistent instance that carries full reasoning history across weeks of sessions would require enormous context windows or a very sophisticated compression scheme. Context windows are finite and expensive — every token of history carried forward is computation you’re paying for on every subsequent exchange. The economics push toward exactly the silo architecture I’m criticizing: short sessions, fresh contexts, minimal carryover. And I imagine the storage side is huge. Millions of users, each with multiple projects, each project accumulating weeks or months of conversational history — that’s a fundamentally different infrastructure commitment than serving stateless chat sessions. The question is whether that’s a permanent constraint or a cost curve that’s coming down. Context windows have been expanding rapidly. Retrieval-augmented approaches could keep the full history in storage and surface what’s relevant rather than carrying everything. The memory system already does a primitive version of this — distilling attributes from conversations and injecting them into future contexts. The persistent instance would need that same pattern but for reasoning rather than facts. That’s a harder problem. But it’s an engineering problem, not an impossibility. The Pieces Are Already Moving It seems that Anthropic is already heading in this direction. Claude Code gave the model execution capability. Cowork extended it beyond developers. The Projects feature, shipped this week, adds persistent task context within a workspace. Memory carries personal context across conversations. Each of these is a fragment of what I’m wishing for. What’s missing is the connective tissue — the persistent identity layer that unifies them. The difference between a set of good tools and an actual collaborator. I don’t know what’s on Anthropic’s roadmap. I don’t know when the economics make this viable. But I know what I need, because I bump into the absence of it every day. And I suspect anyone doing sustained intellectual work with AI — not one-off queries, but ongoing projects with real depth — is bumping into the same wall. This is my wishlist. I’d like to stop being the integration layer. Update Mar 26 What do you know? Two days before I published 'My Claude Wishlist,' Anthropic shipped Dispatch — a persistent thread that follows you between phone and desktop without resetting context. I didn't know. It's clear Anthropic understands where this needs to go. The reasoning layer — continuity of argumentation, not just task history — is still the hard part. But the direction is right, and they're moving fast. Share This Post Related Reading Is Anthropic vital for US Security? On Wednesday, April 8, Treasury Secretary Scott Bessent and Federal Reserve Chair Jerome Powell summoned the CEOs of America’s largest banks to an urgent, unscheduled meeting. The subject was a single AI model — Claude Mythos Preview, built by Anthropic The Wrong Argument The public debate about AI displacement focuses on headline layoffs — visible, contested, and partially fabricated. The real mechanism is quieter. Vertical AI platforms embedded in industry software absorb labor through updates, one unbackfilled position at a time. By the time the data catches up, the displacement is structural. Not Yet 'Not yet' is not a reassurance. It's a diagnosis. Anthropic's own research shows a 14% drop in job-finding rates for young workers in AI-exposed fields. The data says the displacement hasn't hit yet. The structure says it's already underway. I grew up inside that gap in Gelsenkirchen — I know what it looks like when 'not yet' becomes 'too late.' --- ### Not Yet - Werner Glinka https://www.wernerglinka.com/writing/not-yet/ AI LABOR CULTURE Not Yet Mar 10, 2026 Last week, the Pentagon labeled Anthropic — the AI company whose CEO has been the most persistent voice of caution in the industry — a supply chain risk to national security. [1] The designation, historically reserved for foreign adversaries, came because Anthropic refused to remove two conditions from its military contracts: no fully autonomous weapons, and no mass surveillance of Americans. [2] Within hours, OpenAI had signed a deal to replace Anthropic in classified environments. [1] The government punished the company that tried to set boundaries. A competitor stepped in to take its place. If you want to understand what AI is doing to our democracy, you could start with the economics. But you might learn more from watching what happened when one company tried to say no. The Economics I’ve been writing about the economics of AI displacement for a while, and the argument I keep making is simple enough that it shouldn’t be controversial: companies are using AI to eliminate the jobs of the people who buy their products. That’s not a prediction. Salesforce cut thousands of support roles while raising prices. Microsoft did the same. Across corporate America in 2025, 1.2 million positions were eliminated. Only 55,000 were officially attributed to AI — but as I argued in “Who Buys What We Build,” anyone who’s watched a company announce “restructuring for efficiency” while simultaneously trumpeting its AI investments knows that official attribution is a fiction. Companies have every incentive to avoid the label. The savings didn’t flow to consumers or into new hiring. They flowed into $1.6 trillion in dividends and stock buybacks. [3] This is not how the story is supposed to go. When Sam Altman promises that AI will make everything “radically cheaper,” he’s invoking a theory that has a name in economics — the deflationary benefit of automation. The idea is that as production costs fall, prices follow, and everyone benefits. But that theory assumes companies pass the savings on. They don’t. They pass them to shareholders, to executives, to the few people who own the machines. Henry Ford understood in 1914 that his workers needed to earn enough to buy his cars. A century later, the people building the most powerful technology in history have ignored that lesson, or decided it no longer applies. The standard response is retraining. It’s always retraining. I grew up in Gelsenkirchen, in Germany’s Ruhr Valley, where I watched this script play out over decades. The coal mines closed. The steelworks followed. Workers were retrained for jobs that were subsequently automated, outsourced, or simply never materialized at the promised scale. Retraining is a political reflex, not an economic strategy. It makes the displacement invisible for a while, distributes the cost over years rather than quarters, and lets everyone involved claim they’re doing something. But here’s where AI differs from coal, steel, or even the first waves of software automation. Those disruptions hit the bottom of the value chain first — manual labor, routine processing, repetitive assembly. Workers were told to move up. Get more education. Learn to code. Develop the skills that machines can’t replicate: judgment, analysis, creative synthesis. AI inverts that logic entirely. It targets the entire value chain. It writes legal briefs, generates marketing strategies, produces code, and drafts architectural plans. There is no higher rung. The ladder itself is being disassembled from the top. Earlier this month, Anthropic’s research team published a paper attempting to measure what’s actually happening in the labor market. [4] Their findings are careful, rigorous, and precisely the kind of analysis that should inform policy. Building on their ongoing Economic Index — which has tracked real-world AI usage across occupations since 2025 — they found that AI is disproportionately targeting educated, higher-paid professionals. [5] Computer programmers, customer service representatives, and data entry workers showed the highest levels of task coverage by AI systems. The professional class, the knowledge workers, they’re the ones in the crosshairs. The paper also found something that the people citing it as reassurance don’t read carefully enough: a 14 percent drop in the job-finding rate for workers aged 22 to 25 in AI-exposed fields, compared to 2022. [4] The entry-level pipeline is contracting. Young people trained for professional careers are arriving at a door that’s closing. This is not an abstraction. It’s a generation discovering that the investment they made — the degrees, the debt, the years of preparation — may not convert into the careers they were promised. And then there’s the headline finding, the one that gets quoted by people who want to believe the disruption is manageable: “no systematic increase in unemployment” for workers in highly exposed occupations. [4] The Anthropic researchers are careful to note that current AI usage lags far behind its theoretical capability, that legal, technical, and verification hurdles slow adoption, and that their framework is designed to find vulnerable jobs “before displacement is visible.” Not yet Those are the two most dangerous words in economic history. The Ruhr Valley didn’t show catastrophic unemployment numbers on day one either. The decline was gradual. Communities adapted, downshifted, and made do. People left, but slowly. Services contracted, but incrementally. And then, over a span that felt long to the people living through it but looks sudden in retrospect, the floor fell out. Not because anything dramatic happened on a particular Tuesday, but because the structural supports had been quietly removed over the years, and one day, there was nothing left to hold the weight. “Not yet” is not a reassurance. It’s a diagnosis. It means the underlying condition is progressing while the visible symptoms remain within normal range. The Source A skeptic might ask why we should give special weight to research published by an AI company about the effects of its own technology. It’s a fair question. The answer lies in what Anthropic has demonstrated about its willingness to act against its own financial interests. Dario Amodei, Anthropic’s CEO, is the only leader of a major AI company whose caution is credible because his caution costs him something. He published a Responsible Scaling Policy. He released research showing early signs of labor-market disruption caused by his own technology. In his essay “Machines of Loving Grace,” he laid out a conditional vision of AI’s benefits — conditional on getting governance right, on distributing gains broadly, on preventing concentration of power. [6] He was careful enough to say: These outcomes are not automatic. They require deliberate choices. And then he made one. Amodei drew two lines in Anthropic’s military contracts. [7] Not twenty. Two. No mass surveillance of Americans. No fully autonomous weapons. The Pentagon’s response was to label his company a supply chain risk to national security — a designation historically reserved for foreign adversaries. [1] The president ordered federal agencies to stop using Anthropic’s technology. OpenAI, whose leadership has made no comparable commitments, stepped in to take the contracts. Some commentators, including Bruce Schneier, have argued that Amodei’s stance is primarily a matter of brand positioning. Maybe so. Bismarck said it best: “Motive does not change the effect.” Whether Amodei acted from deep conviction or market calculation, the effect was the same: Anthropic declined to make the concessions. Two lines held. That’s what matters. The point is not the geopolitics. The point is what this tells us about the research. When a company publishes data showing that its own technology is beginning to displace entry-level workers and reshape the labor market — and that same company has just sacrificed hundreds of millions of dollars in defense contracts rather than compromise on ethical principles — you are not reading a marketing document. You are reading the work of people who have demonstrated, at real cost, that they take the societal consequences of their technology seriously. The “not yet” in their findings deserves to be read with that context in mind. Democracy So what does all of this do to democracy? The question is usually answered with a list of threats — disinformation, surveillance, and election manipulation. Those are real, but they’re symptoms. The structural threat is deeper and operates on a longer timeline. Democracy has always depended on a broad middle class — people with enough economic security to participate in civic life, enough autonomy to think independently, enough stake in the system to defend it. These are the people who serve on school boards, run local businesses, volunteer for campaigns, and show up at town meetings. Not because they’re virtuous, but because they have the bandwidth. Economic stability creates civic capacity. What happens when AI hollows out that class over the next decade? Not all at once — gradually, the way the Ruhr Valley declined. Young professionals can’t find entry-level positions. Mid-career workers are displaced into lower-paying roles or out of the workforce entirely. The savings flow upward. The tax base contracts. Public services deteriorate. The people who once formed the backbone of democratic participation become an anxious, precarious population managing decline rather than building futures. The concentration of wealth that’s already underway accelerates this. According to the Federal Reserve’s Distributional Financial Accounts, the top one percent of U.S. households held 31.7 percent of all wealth in the third quarter of 2025 — the highest share on record since tracking began in 1989. [8] In dollar terms, that one percent held roughly $55 trillion, approximately equal to the combined wealth of the bottom 90 percent. [9] AI amplifies that asymmetry. The technology’s benefits accrue to those who own and deploy it. Its costs fall on those it replaces. Every percentage point of “productivity gain” that translates into headcount reduction rather than wage growth widens the gap. We are watching a feedback loop assemble itself. AI concentrates economic power. Concentrated economic power undermines democratic participation. Weakened democratic institutions lose the capacity to regulate AI. The technology advances without constraint. The cycle repeats. And the institution that is supposed to break that cycle — Congress — is structurally incapable of doing so. This is not a matter of individual competence or partisan failure. It is a design problem. The people charged with regulating the most consequential technology of the century are, by and large, not fluent in how it works. They depend on the executives building it to explain it to them. When a senator needs to understand what large language models can do, the briefing comes from the same companies that profit from minimal regulation. The tech industry is simultaneously the legislature’s primary source of technical expertise, one of its largest sources of campaign funding, and the entity that most needs regulation. That is not a relationship that produces oversight. It produces capture. Even if a handful of representatives understood the technology independently, the time horizons are wrong. Members of the House operate on two-year election cycles. AI displacement unfolds over a decade. It doesn’t produce the kind of acute, visible crisis that mobilizes voters or donors within a single campaign season — it produces “not yet,” which is politically indistinguishable from “never.” There is no electoral reward for addressing a structural problem that won’t show up in the unemployment data until after the next election. There is considerable electoral cost in antagonizing the industry that funds your campaign. So Congress holds hearings, asks questions that reveal how little it understands, and produces nothing. The most powerful technology to emerge in a generation advances essentially unregulated — not because regulation is impossible, but because the institution responsible for it is optimized for a completely different set of incentives. The people who see this most clearly are, ironically, the wealthiest. Bloomberg reported that Silicon Valley executives have been buying multimillion-dollar survival bunkers in New Zealand for years, shipped from Texas and buried eleven feet underground — outfitted for long-term habitation in the event of, as one bunker manufacturer put it, “a revolution or a change where society is going to go after the 1 percenters.” [10] Reid Hoffman, the co-founder of LinkedIn, estimated that more than 50% of tech billionaires have some form of escape plan. [11] They’re not investing in social solutions or democratic resilience. They’re building escape routes. When the people best positioned to understand a system’s trajectory are planning their exit rather than its repair, that tells you something about what they expect. Gelsenkirchen Anthropic’s research paper concludes by calling for improved measurement frameworks to identify vulnerable jobs before displacement becomes visible. That’s exactly what a responsible research organization should do. Measurement matters. But measurement is not action. And the gap between “not yet” and “too late” is shorter than anyone with a quarterly earnings call to manage wants to admit. I know what “not yet” looks like. I grew up inside it. My father was a coal miner in Gelsenkirchen-Horst, in the heart of Germany’s Ruhr Valley. In the 1960s, Gelsenkirchen was an industrial city with a clear social contract: you worked hard, you earned a living, you raised a family. The mines and steelworks employed 650,000 people across the region. The work was brutal, but it was work, and it sustained a civic life — football clubs, church communities, neighborhood pubs, the whole texture of a functioning society. The decline didn’t announce itself. The mines started closing, one by one. Workers were retrained for jobs in sectors that were themselves contracting, or for positions that never materialized at the scale promised. Young people left for wherever the work was. The population shrank. Services contracted. The tax base eroded. At each stage, the people managing the transition kept measuring, kept retraining, kept promising that the adjustments were working. Today, Gelsenkirchen has a poverty rate of nearly 38 percent [12] — in a country where the national average is 15. Among young people aged 15 to 24, it has the highest welfare dependency rate in all of Germany. [13] The city has lost more than 30 percent of its population since my father’s generation worked the mines. Employment in coal and steel across the region fell from 650,000 to 73,000. [14] The last colliery in Gelsenkirchen closed in 2000. Three thousand miners lost their jobs that day, but the real losses had been accumulating for decades before anyone counted them. The city that was once an industrial engine is now sometimes called the most dangerous in Germany. That breaks my heart. But what do you expect when nearly four out of ten residents live in poverty? None of this happened suddenly. There was no single catastrophe, no dramatic collapse that would have forced an emergency response. It was a long, quiet process of doors closing, options narrowing, communities adapting downward until adaptation itself became the permanent condition. By the time the data confirmed what everyone living there already knew, a generation had been lost — and a second generation was growing up inside the consequences. That is what “not yet” looks like from the inside. Not a crisis. A slow diminishment that the instruments don’t register as an emergency until it’s structural, until the civic capacity to respond has itself been eroded by the very process it needed to address. We are in that period now, in this country, with this technology. The data says “not yet.” The structure says “already underway.” The most credible research we have — published by a company that has proven it takes these consequences seriously — indicates that the early signs are already visible, if we choose to read them. The question is not whether AI will transform the economy. It will. The question is not whether the transformation poses risks to democracy. It does. The question is whether we will act on what the structure is telling us, or wait for the data to catch up — and discover, as Gelsenkirchen did, that by then there’s nothing left to save. Sources [1] NPR, “Pentagon labels AI company Anthropic a supply chain risk ‘effective immediately’,” March 6, 2026. [2] Axios, “Anthropic sues Pentagon over rare ‘supply chain risk’ label,” March 9, 2026. [3] Layoff data from Challenger, Gray & Christmas annual report, 2025. Buyback figures from S&P Dow Jones Indices. See also Who Buys What We Build? and The Corporate Benevolence Fantasy. [4] Anthropic Economic Research, “Labor market impacts of AI: A new measure and early evidence,” March 5, 2026. [5] Anthropic, “Anthropic Economic Index reports,” 2025--2026. [6] Dario Amodei, “Machines of Loving Grace,” October 2024. [7] Anthropic, “Where We Stand,” March 2026. [8] Federal Reserve, “Distributional Financial Accounts,” Q3 2025. [9] CBS News, “Wealth inequality in America just hit its widest gap in more than 3 decades,” January 21, 2026. [10] Bloomberg, “The Super Rich of Silicon Valley Have a Doomsday Escape Plan,” September 5, 2018. [11] The New Yorker, Reid Hoffman’s estimate of 50%+ of tech billionaires with escape plans, January 30, 2017. [12] Paritätische Armutsbericht (Paritätische Poverty Report), 2024, reporting 37.9% poverty rate for Gelsenkirchen. [13] Bremen Institute for Workplace Research and Career Support, youth welfare dependency data. [14] Urban Transitions Alliance, “City profile: Gelsenkirchen.” Regional employment decline (650,000 to 73,000) and 30%+ population loss. Last colliery closure (Ewald-Hugo, April 28, 2000) from municipal records. This essay was also published on SubStack Share This Post Related Reading The Wrong Argument The public debate about AI displacement focuses on headline layoffs — visible, contested, and partially fabricated. The real mechanism is quieter. Vertical AI platforms embedded in industry software absorb labor through updates, one unbackfilled position at a time. By the time the data catches up, the displacement is structural. I've Seen This Before I grew up in Gelsenkirchen, in the Ruhr Valley, and watched coal and steel collapse over decades. Retraining never worked at scale. The trades offer a reprieve, not an escape. And the science fiction writers have been ahead of the economists for seventy years — a structural problem requires a structural response. Who Buys What We Build? U.S. employers cut 1.2 million jobs in 2025 while posting record profits and pouring tens of billions into AI. AI didn't break capitalism. It exposed a version of capitalism that had already stopped distributing its gains. --- ### Beyond the Black Box - Werner Glinka https://www.wernerglinka.com/writing/beyond-the-black-box/ CODING Beyond the Black Box Mar 10, 2026 For years I've treated Markdown as a black box. You feed it text, it gives you HTML, and you don't ask questions. There's a reason for that. For a long time I ran two content models side by side in my Metalsmith sites: structured YAML sections powered by Nunjucks templates for designed layouts, and traditional Markdown pages processed by the @metalsmith/markdown plugin for simpler content. The plugin handled Markdown-to-HTML conversion as a pipeline step — you configured it once and it ran over every .md file. I never had a reason to look inside. When I committed fully to the section-components architecture and dropped traditional Markdown pages I didn't need the @metalsmith/markdown plugin anymore. In its place I'm using a Nunjucks filter — mdToHTML — that calls marked.parse() directly on individual text fields inside YAML frontmatter. Instead of a plugin abstracting marked away behind a configuration object, I now talk to a marked instance directly. I could see its API. And that's when I noticed the extension system. As it turns out, the @metalsmith/markdown plugin does support passing extensions through its engineOptions, so the capability was always within reach. But behind the plugin's abstraction, I never noticed. The shift to a direct marked instance through a Nunjucks filter made the extension API visible in a way the plugin never did. The Problem Here's what page content with text, an image, an audio player and a couple of CTAs looked like when using the component system: yaml- sectionType: text-only containerTag: article classes: 'first-text-section' containerFields: noMargin: top: true bottom: true noPadding: top: true bottom: true text: leadIn: 'My New Website' title: 'Hello World' titleTag: 'h1' subTitle: 'And here, it begins' prose: |- This is a micro starter to build a static website with Claude and Metalsmith. When you see this page, you have successfully installed the starter. You can now chat with Claude about what you like to build. - sectionType: image-only containerTag: section classes: 'float-right rounded text-width' containerFields: inContainer: true noMargin: top: true bottom: true noPadding: bottom: true image: src: '/assets/images/CLAUDE+Metalsmith.jpg' alt: 'factory photo' caption: '' - sectionType: text-only containerTag: article containerFields: noMargin: top: true bottom: true noPadding: top: true bottom: true text: prose: |- More prose wrapping around the image... First Episode - sectionType: audio-only containerTag: section containerFields: noMargin: top: true bottom: true noPadding: top: true bottom: true audio: mpeg: '/assets/audio/shattered-reflections.mp3' - sectionType: text-only containerTag: article containerFields: noMargin: top: true bottom: true noPadding: top: true bottom: true text: prose: |- Closing thoughts and a call to action below. ctas: - url: '/' label: 'Get Started' isButton: true buttonStyle: 'primary' - url: '/' label: 'Learn More' isButton: false That's five sections — three text-only, one image-only, one audio-only — each carrying its own containerTag, containerFields, and margin and padding overrides, just to render one linear flow of content. And this is already the minimal version. Default options are omitted, text fields like title and leadIn are left out where they're not needed. The structure can't get much leaner than this. The content structure underneath is more forgiving than it looks. The text fields — title, titleTag, subTitle, leadIn — all default to empty and won't render if you leave them out. A minimal text section might just be prose. But even stripped down, every piece of content still has to pass through a nested YAML object: a text.prose field for a paragraph, an image object with src, alt, and caption for a photo, an audio object with format-specific paths, a ctas array with url, label, isButton, and buttonStyle for each link. And each of those lives in its own section with its own container config. The structure works. But for content that flows linearly, it fragments what should be a single narrative into a stack of discrete components. For a landing page where the template needs to place each element precisely, that fragmentation is justified — it's not fragmentation at all, it's precision. But for a blog post or an essay, where the content flows linearly and the author just wants to write, every section boundary is friction. Every level of nesting is an opportunity for a misaligned indent. Every array item requires its own set of keys. When you're writing a content-heavy page with multiple sections — text interspersed with images, audio embeds, call-to-action blocks — the source files become long, fragile, and hostile to anyone who has to edit them. I built the component system this way because I needed things Markdown doesn't provide out of the box: images with CSS classes, grouped CTA links, audio players, figures with captions. If Markdown can't express it, you need structure around it. That logic was sound. What experience eventually revealed was that marked — the library I was already using — could be extended to handle the sections where the content flows linearly. The Realization The marked library has a clean extension API. You can register custom token types at both block and inline level. Each extension provides three functions: start finds where your custom syntax begins in the source, tokenizer parses it into a token object, and renderer emits HTML. That's the whole contract. This means you can extend Markdown's syntax to handle images with classes, grouped links, audio embeds, and anything else — without leaving Markdown. The content stays readable. The source stays flat. And for content-heavy sections, the YAML shrinks to a component name and a body field. What I Built I ended up with four small extension modules plus a shared utilities package, organized as a monorepo at github.com/wernerglinka/marked-extensions. Each extension is independently publishable to npm under the @wernerglinka scope, and they all share common functions — class name parsing, HTML element builders — through a dedicated shared package. That avoids the awkward dependency chain where one extension accidentally becomes a utility library for the others. Image with Class Standard Markdown images don't support CSS classes. This extension adds Pandoc-style attribute syntax after the image: markdown![factory photo](/images/ruhr-valley.jpg){.float-right .rounded} This renders as: html
factory photo
The {.classname} convention comes from Pandoc and has been adopted by kramdown, markdown-it-attrs, and others. The dot prefix mirrors CSS selector syntax. It's the closest thing to a standard that exists for this. Link with Class Same idea, applied to links. Useful for inline styled links within prose: markdownRead the [documentation](/docs){.highlight} for details. Renders as a plain anchor with the class applied — no wrapper div, just an inline element. Paragraph with Class Any paragraph can receive a class by appending the attribute syntax: markdownMy New Website {.lead-in} Renders as html

My New Website

This eliminates the need for structured props like leadIn and subTitle. The Markdown makes that clear. Directive Blocks This is the workhorse. A generic block-level syntax using triple-colon fences, with a registry pattern that maps directive types to render functions: markdown:::cta [Get Started](/start){.btn .btn-primary} [Learn More](/docs){.btn-link} ::: The directive system ships with seven built-in types — CTA groups, audio players, video players, blockquotes with attribution, figures with captions, asides, and collapsible details — and accepts custom renderers through an options object. Adding a new directive type is one function. Here's what the full set looks like in practice: markdown:::audio{.featured} src: /media/episode-01.mp3 title: The First Episode ::: :::video src: /media/intro.mp4 poster: /images/intro-poster.jpg ::: :::quote The best way to predict the future is to invent it. cite: Alan Kay ::: :::figure{.wide} ![Ruhr Valley factory](/images/factory.jpg) caption: Dortmund steelworks, 1973 ::: :::aside{.warning} This requires Node.js 20 or higher. ::: :::details summary: How does this work? The build pipeline processes each section sequentially, running the body through the extended marked instance. ::: Each directive supports optional classes via {.classname} on the opening fence. Props use a simple key: value format. Everything else is content. The Before and After The extensions don't require a new component. They enhance the existing one. Since all the structured fields — title, leadIn, subTitle — already default to empty and won't render if omitted, the component can support both authoring paths: structured fields for designed sections, a Markdown body for authored content, or any combination of the two. Here's the same content, reimagined as a single rich-text component with everything in the body: yaml- component: rich-text animated: true body: |- My New Website {.lead-in} # Hello World And here, it begins {.sub-title} This is a micro starter to build a static website with Claude and Metalsmith. When you see this page, you have successfully installed the starter. You can now chat with Claude about what you like to build. ![factory photo](/assets/images/CLAUDE+Metalsmith.jpg){.float-right .rounded .text-width} More prose wrapping around the image... :::audio src: /assets/audio/shattered-reflections.mp3 title: First Episode ::: Closing thoughts and a call to action below. :::cta [Get Started](/){.btn .btn-primary} [Learn More](/) ::: Same content, same result. The heading level is expressed directly in Markdown — # for h1 — instead of a separate titleTag prop. The lead-in and subtitle are styled paragraphs. The image carries its own layout classes. The audio player is a directive block. The CTAs are grouped in another. Container configuration only appears when it differs from defaults. Five sections became one. The content is the source. There's nothing else to misalign. One Component, Two Authoring Paths A single rich-text component covers both use cases. On a landing page where the template needs to place the title, subtitle, and CTAs independently, you fill in the structured fields — they're there, they're addressable by key, and the template can put each one exactly where the design calls for it. On a blog post or essay where the content flows linearly, you skip the structured fields entirely and put everything in the body. The author writes extended Markdown, the template renders it top to bottom, and the YAML stays minimal. There's a real tradeoff here, structured fields give you addressable content — a build step can extract title for navigation or OG tags without parsing HTML. A Markdown body is an opaque string until it hits the parser. You can't target the title separately from the prose because there are no separate fields. But for authored content, that addressability was never being used. The structure was just a verbose way to serialize linear content. The author chooses the approach based on what the content needs. One component to maintain, one template, no decision about which component to reach for. The structured fields are there when you need them. The body is there when you don't. Integration The entire integration is a single filter module. I was already using marked through a custom Nunjucks filter that converts Markdown strings to HTML. The only change was configuring marked with the extensions before the filter runs: javascriptimport { marked } from 'marked'; import imageWithClass from '@wernerglinka/marked-image-with-class'; import linkWithClass from '@wernerglinka/marked-link-with-class'; import directiveBlock from '@wernerglinka/marked-directive-block'; import paragraphWithClass from '@wernerglinka/marked-paragraph-with-class'; marked.use({ extensions: [paragraphWithClass(), imageWithClass(), linkWithClass(), directiveBlock()], mangle: false, headerIds: false }); export const mdToHTML = (mdString) => { try { return marked.parse(mdString); } catch (error) { console.error('Error parsing markdown:', error); return mdString; } }; The filter function itself didn't change. It still takes a Markdown string and returns HTML. The extensions just gave Markdown the expressiveness to handle content that previously had to be broken into structured fields. The Monorepo The extensions live in a single repository as an npm workspace monorepo: bashmarked-extensions/ packages/ shared/ # parseClassNames, buildImageTag, wrapWithDiv image-with-class/ # ![alt](src){.class} link-with-class/ # [text](url){.class} paragraph-with-class/ # text {.class} directive-block/ # :::type ... ::: package.json # workspace root The shared package contains the common utilities — parseClassNames for parsing Pandoc-style attribute syntax, buildImageTag and wrapWithDiv for HTML construction, and buildContainerClasses for composing class strings in directive renderers. Every extension imports from @wernerglinka/marked-extensions-shared instead of reaching into sibling packages. Each package has marked as a peer dependency and can be installed independently or together. The workspace setup means npm install at the root links everything locally for development, and each package publishes to npm under the @wernerglinka scope. The Lesson The section-component architecture is the right way to build pages. It gives you precise control over layout, spacing, backgrounds, animation — everything that makes a designed page more than a stream of content. That hasn't changed, and the rich-text body field doesn't challenge it. It gives the same component a second authoring path for content that flows linearly. Building dozens of content-heavy sections with structured YAML revealed friction that only becomes visible through use — the verbosity of nested objects for simple content, the indentation errors, the feeling of fighting the format when you just want to write. That friction is what sent me looking at marked's API for the first time, where I found an extension system that had been there since version 4. I'd never noticed it because the @metalsmith/markdown plugin sat between me and the library, and I had no reason to look underneath. It was only when the architecture simplified — section components eliminated the plugin, a direct Nunjucks filter replaced it — that the API became visible. The extensions are open source at github.com/wernerglinka/marked-extensions. If you're using marked and feeling the same friction with content-heavy sections that don't fit neatly into structured data, they might help. Share This Post Related Reading Making the Switch: GitHub Copilot to Augment Code While Copilot excels at line-by-line suggestions, Augment Code understands your entire codebase as context. This isn't just a marketing pitch - it's a game-changer in practice. My AI-Assisted Journey with Project Metallurgy My AI journey evolved from ChatGPT to Claude, which felt like having a human co-programmer. Then GitHub Copilot eliminated context-switching, followed by Claude Code automating entire workflows. AI as a Development Partner: My Experience with Claude and GitHub Copilot I've been integrating AI tools into my daily workflow, and I want to share my perspective on how they're transforming software development - not by replacing developers, but by enhancing our capabilities and productivity. --- ### The Boats That Found Me - Werner Glinka https://www.wernerglinka.com/writing/the-boats-that-found-me/ ART The Boats That Found Me Mar 6, 2026 The stadium form came from Gelsenkirchen — from Schalke, from the industrial geometry of the Ruhrpott. But another shape found me in California, and it came from the water. I spent years walking around Princeton Harbor, a working fishing port on the Half Moon Bay coast. My wife surfed at Pillar Point. We'd eat at Barbara's Fish Trap, a red-painted hole in the wall right on the water, then walk the harbor while the afternoon fog rolled in. A working harbor shows you boats in every state. Some coming in with the catch, some being scraped and painted, some rotting in back lots. And some stripped down to their skeletons — the hull planking gone, only the keel and ribs remaining. A boat carcass looks like a fish carcass. Spine and bones, the structure laid bare. That form got into me the way the stadium form did in Gelsenkirchen — not through conscious decision, but through repeated seeing. I started building boats out of sticks and wire, not planning to, just finding myself there. This piece stretches a redwood stick boat skeleton across three panels, crossing a dark red channel. The boat refuses to stay contained in any single frame. It's in transit, moving through. This one pushes the same idea further — two panels, the boat bridging the gap between them. The red is thicker here, more visceral. The yellow rectangles and small grid patch interrupt the flow, the way a single blue stick interrupted the redwood stick circle years earlier. Small choices that keep things alive. The sticks in these pieces aren't bamboo. They're redwood, gathered after storms on Kings Mountain in the Santa Cruz range. The roads would be littered with fallen branches, the outer bark split and easily removable. I'd collect the naked inner sticks and stockpile them in the studio. This triptych shows three boats, the same form, different materials. The left one — now in the permanent collection of the Peninsula Museum of Art — uses weathered-steel banding on the lower half and round dowels on top, bound by a spine of rusty wire. The middle is black-painted pine, the densest and most opaque of the three. The right uses redwood sticks below and rusty fencing wire above. Three boats, three material languages, three degrees of transparency. The wire version is almost all air. The dowel version is semi-open. The black pine is nearly solid. Together they read as a progression, though which direction, construction or decay, is up to the viewer. The rust mattered as much as the form. Rusty steel banding, rusty fence wire, the patina of age on everything. It reminded me of something. Growing up in the Ruhrpott, rust was everywhere — the abandoned pit heads, the decommissioned steel plants, the infrastructure of an industry winding down. I didn't think of it as beautiful then. It was just the texture of the world. But walking around Princeton Harbor decades later, seeing the same colors on the fishing boats and old equipment, something connected. The California coast gave me back a piece of home I didn't know I was looking for. And then it was gone. Life intervened — career demands, a cross-country move. I closed the California studio. In the move to Minnesota, the stockpile of redwood sticks didn't make it. The rusty fence wire from Kings Mountain, the steel banding I'd collected — all of it left behind or lost. The boat pieces I kept are finite now. Whatever I made with those materials is all there will ever be. The triptych in the museum collection will outlast me. The two I kept hold too many memories to sell. I'm working in Minneapolis now, with cardboard and paper clay. Different materials, different landscape. The city doesn't offer fallen fences and storm debris the way the mountains did. But the forms persist — the stadium shape, the circle, and somewhere in the future, maybe the boat again. Built from whatever Minneapolis decides to give me. Also available on Substack. Share This Post Related Reading The Other Side of Things You know me from my Metalsmith work - static site generators, component architectures, the case for simplicity over framework churn. That is one side of what I do. There is another, and it has been part of my life longer than web development. The Shapes That Stay In "The Other Side of Things," I wrote about returning to art-making after a ten-year hiatus. What surprised me is that some things apparently never left. --- ### The Shapes That Stay - Werner Glinka https://www.wernerglinka.com/writing/the-shapes-that-stay/ ART The Shapes That Stay Mar 4, 2026 In "The Other Side of Things," I wrote about returning to art-making after a ten-year hiatus. What I discovered almost immediately is that some things apparently never left. I've been looking back at work from the mid-2000s — pieces made in my Santa Cruz Mountains studio — and noticing something I never consciously chose. The same shapes keep appearing: circles, and what I've come to think of as the stadium form — straight sides with half-circles at top and bottom, like a racetrack or an elongated zero. Here's a piece from 2007. Chicken wire, cut into strips, rolled into small tubes, and arranged into that stadium shape against a dark ground. And here's one from 2005—a circle made from redwood sticks, with a red wedge breaking into the form. If you look closely, you'll find a single stick with a blue center—a quiet interruption that rewards closer inspection. I never sat down and decided these would be my shapes. They just kept showing up in my head. The hands made what the hands wanted to make, and only now, looking back, do I see the pattern. Where does this come from? I grew up in Gelsenkirchen, in Germany's Ruhr Valley: coal mines, steel plants, smog warnings. But for anyone from Gelsenkirchen, there's another defining presence: Schalke 04. Schalke is the football club, founded in 1904, back when Gelsenkirchen was building itself on coal. The stadium was the heart of the city. First the Glückauf-Kampfbahn, then the Parkstadion, where I watched matches as a kid, now the Veltins-Arena. That shape — the elongated oval, straight sides curving into half-circles at each end — wasn't just architecture. It was where 70,000 people came together, where you belonged to something larger than yourself, where a working-class city found its identity. Glück auf — the traditional miners' greeting, wishing safe return from the pit — became the club's rallying cry. The stadium and the mine shared the same prayer. So when I find myself building that stadium form out of chicken wire or laminated cardboard, I'm not working from some abstract appreciation of German industrial design. I'm reaching back to something more specific: the shape that meant community, belonging, and home. The form is in my bones. I didn't choose it. It chose me. The circle carries its own weight. Wholeness, completion, the endless return. The geometry of flywheels and gears — industrial forms, yes, but also ancient and universal. Maybe I absorbed these shapes the way you absorb a native language, without instruction, just by being immersed. What interests me now is that after ten years away from the studio, the same shapes are reasserting themselves — but differently. These new pieces are built from laminated cardboard, coated with cardboard clay. They have real depth — four inches — compared to the earlier flat assemblages. The forms haven't changed, but they're pushing into three dimensions now, demanding more physical presence. The earlier chicken-wire pieces were about accumulation—many small rolled units arranged together. The cardboard work is about building up continuous layers and carving out negative space—different processes that arrive at the same destination. The stadium piece currently in progress is roughly 10 by 18 inches and 4 inches deep. The circle will be about 24 inches in diameter with a 6-inch center void. Both are intended for wall mounting, but their depth means they'll cast shadows and occupy space in ways the earlier work didn't. I'm not sure what the final surface treatment will be. The earlier pieces had color interventions — a red wedge, a single blue element — small disruptions to break the monotony. Whether these new pieces need something similar, I don't know yet. Part of staying open to the work is not deciding everything in advance. Something I see tomorrow might change the direction entirely. What I do know is that these shapes aren't going anywhere. They were there twenty years ago, they're here now, and they'll probably keep showing up as long as I keep making things. Some obsessions you choose. Others choose you. Glück auf. Also available on Substack. Share This Post Related Reading The Other Side of Things You know me from my Metalsmith work - static site generators, component architectures, the case for simplicity over framework churn. That is one side of what I do. There is another, and it has been part of my life longer than web development. The Boats That Found Me The stadium form came from Gelsenkirchen — from Schalke, from the industrial geometry of the Ruhrpott. But another shape found me in California, and it came from the water. --- ### From Metalsmith to Eleventy - SEO Without External Dependencies - Werner Glinka https://www.wernerglinka.com/writing/from-metalsmith-to-eleventy-seo-without-external-dependencies/ CODING From Metalsmith to Eleventy - SEO Without External Dependencies Feb 24, 2026 The bilingual site needed proper SEO: meta tags, Open Graph for social sharing, structured data for search engines, a sitemap with hreflang references, and the usual robots.txt. In Metalsmith, I'd used a dedicated SEO plugin that handled most of this. In Eleventy, I wanted to see what template-driven generation could accomplish. The answer: everything. SEO markup is just HTML with specific patterns. Templates generate HTML. The fit is natural. The Frontmatter Contract Each page can override site-wide defaults through an seo object in frontmatter: yamlseo: title: ''Object 2007.01.001'' description: ''A circular wreath-like form from interlocking metal strips'' socialImage: ''/assets/images/artworks/2007/2007.01.001.jpg'' alternate: de: /de/werke/2007.01.001/ schemaType: VisualArtwork artMedium: ''Mixed media assemblage'' dateCreated: '2007' The fallback chain mirrors what the Metalsmith plugin did: check seo.title, fall back to site.title. Check seo.description, fall back to site.description. The logic lives in the head template rather than a plugin, but the pattern is the same. Meta Tags and Canonicals The head template handles the basics: nunjucks{% set baseUrl = site.url | replace(r/\/$/, '''') %} {% set canonicalUrl = seo.canonicalURL if seo.canonicalURL else baseUrl + page.url %} {{ seo.title if seo.title else site.title }} Page-specific values when they exist, site defaults when they don't. The canonical URL strips trailing slashes from the site URL to avoid double-slash problems, then appends the page path. Open Graph and Twitter Cards Social platforms need their own tags. Open Graph covers Facebook and LinkedIn; Twitter Cards handle Twitter's preview format. Both follow the same fallback pattern: nunjucks For an art site, summary_large_image makes sense, the artwork images deserve prominent display in social previews. The image paths need the full base URL since social platforms fetch these from external servers. hreflang Tags The seo.alternate data from the i18n implementation serves double duty here. The language switcher uses it for navigation; the head template uses it for search engine hints: nunjucks{% if seo.alternate %} {% for langCode, altPath in seo.alternate %} {% endfor %} {% if lang == ''de'' %} {% else %} {% endif %} {% endif %} The x-default tag points to English as the fallback for users whose language isn't explicitly supported. Each page declares its alternate, and the template generates the full set of hreflang references from that single source. Structured Data with JSON-LD Search engines understand structured data. For an art site, the VisualArtwork schema tells Google exactly what kind of content it's indexing: artwork title, medium, creation date, creator information. The schema type comes from frontmatter. A separate template generates the appropriate JSON-LD based on that type: nunjucks{% if seo.schemaType == ''VisualArtwork'' %} { "@context": "https://schema.org", "@type": "VisualArtwork", "name": "{{ seo.title }}", "description": "{{ seo.description }}", "url": "{{ canonicalUrl }}", "image": "{{ baseUrl }}{{ seo.socialImage if seo.socialImage else site.defaultImage }}", "creator": { "@type": "Person", "name": "{{ site.siteOwner }}", "sameAs": {{ site.organization.sameAs | dump }} }, "artMedium": "{{ seo.artMedium }}", "dateCreated": "{{ seo.dateCreated }}" } {% elif seo.schemaType == ''Article'' %} {# Article schema for blog posts #} {% else %} {# Default WebPage schema #} {% endif %} The dump filter safely escapes the sameAs array as JSON. Each artwork page gets schema markup that describes it as a visual artwork with specific properties. Studio notes get Article schema. The homepage gets WebSite schema. The type drives the output. The Sitemap The sitemap is a Nunjucks template that outputs XML. It loops through all pages, excludes drafts, calculates priority based on URL depth, and includes hreflang references for multilingual pages: nunjucks--- permalink: /sitemap.xml eleventyExcludeFromCollections: true --- {% for page in collections.all %} {% if not page.data.draft and not page.data.eleventyExcludeFromCollections %} {{ baseUrl }}{{ page.url }} {{ page.date | isoDate }} {{ page.url | calculatePriority }} {% if page.data.seo.alternate %} {% for langCode, altPath in page.data.seo.alternate %} {% endfor %} {% endif %} {% endif %} {% endfor %} Priority calculation is a simple filter: homepage gets 1.0, root-level pages get 0.8, deeper pages get progressively lower values. The hreflang links in the sitemap mirror those in the page heads—search engines can discover language relationships from either source. Robots.txt The simplest template: nunjucks--- permalink: /robots.txt eleventyExcludeFromCollections: true --- User-agent: * Allow: / Sitemap: {{ site.url }}sitemap.xml It allows all crawlers and points them to the sitemap. Nothing clever needed. What Templates Provide Every piece of SEO markup follows the same pattern: structured data in frontmatter, fallbacks to site configuration, templates that generate the appropriate output. No build-time plugins processing files. No runtime JavaScript. Just templates producing HTML and XML. This approach has tradeoffs. A dedicated SEO plugin might validate your markup, warn about missing descriptions, or generate default values more intelligently. Template-driven generation puts that responsibility on you. You need to understand what the markup should look like and ensure your frontmatter provides it. For this site, that tradeoff works well. The SEO requirements are clear, the content is structured, and the templates produce exactly what's needed. The thirty-two artwork pages each got schemaType: VisualArtwork and artMedium properties in a single batch edit. The markup generates correctly because the templates are correct. The Complete Picture Five posts, one migration. From Metalsmith's explicit pipelines to Eleventy's convention-driven builds. A component library that turned out to be platform-agnostic. A real site ported. Bilingual support using native capabilities plus some custom logic. SEO through templates rather than plugins. The skills transferred. The components transferred. The mental model of static sites as data transformation pipelines—files in, processing applied, files out—transferred most of all. Metalsmith taught me that model explicitly. Eleventy uses it implicitly. Understanding one made learning the other feel like recognition rather than discovery. Share This Post Related Reading From Metalsmith to Eleventy - Porting an Actual Site The practical experience of migrating an art website from Metalsmith to Eleventy, including navigation issues, data access patterns, and what the fixes revealed about platform assumptions. From Metalsmith to Eleventy - Building a Bilingual Site Implementing a full English-German bilingual site with Eleventy, covering directory structure, language-aware navigation, breadcrumbs, a language switcher, and per-language collections. Introducing Metalsmith SEO The Metalsmith SEO plugin automatically generates HTML meta tags, Open Graph properties, Twitter Cards, JSON-LD structured data, a robots.txt file and a sitemap from a single source of truth. --- ### The Corporate Benevolence Fantasy - Werner Glinka https://www.wernerglinka.com/writing/the-corporate-benevolence-fantasy/ AI LABOR CULTURE The Corporate Benevolence Fantasy Feb 23, 2026 A few weeks ago, I wrote a piece called Who Buys What We Build? that asked a straightforward question: if AI eliminates the jobs that give people purchasing power, who’s left to buy the products that AI-optimized companies are selling? The piece traveled further than I expected — LinkedIn reported 50,000+ impressions and lots of comments, along with one counterargument that kept coming back. The counterargument comes mostly from the people building and funding the technology. Sam Altman, CEO of OpenAI, calls AI “massively deflationary”[1] and promises that things will get “radically cheaper.” Marc Andreessen, whose venture capital firm invests in dozens of AI companies, goes further: “everything that costs $100 will sell for a penny”[2] in what he calls a “hyper-deflation era.” They’re selling a vision of abundance: AI eliminates jobs, yes, but it also makes everything so cheap that it doesn’t matter. Prices drop, purchasing power holds, nobody needs to worry. It’s a comforting story. It also rests entirely on one assumption — that corporations will voluntarily pass along their productivity gains to consumers. Not because they’re required to. Not because any mechanism compels it. But because, in this telling, the market will work it out. Even Altman seems to sense the problem. Right after the abundance pitch, he adds: “As long as we don’t screw up the policy around it in a big way, which could happen.” The man making the promise doesn’t fully believe it himself. This week, Bank of America’s own analysts weighed in on whether that’s happening. It’s not. Wall Street Sees It Too I want to be clear about what makes the BofA research significant. This isn’t a labor union, a think tank, or a retired web developer connecting the dots. This is Bank of America telling its investors[3] — the people who own the stocks, who benefit from the buybacks, who sit on the winning side of this equation — that productivity gains since the pandemic have been “piling as corporate profits, with labor income steadily falling as a share of U.S. GDP.” They’re calling it a K-shaped economy[4]. The upper arm of the K is asset owners riding productivity gains upward. The lower arm is everyone else. BofA economist David Tinsley put a finer point on it. The divergence between high-income and low-income Americans, he said, is “beginning to look more like the jaws of a crocodile”[5]. He’s not wrong. Labor’s share of GDP fell to 53.8%[6] in the third quarter of 2025 — the lowest level in the 78 years[7] since the Bureau of Labor Statistics started tracking it. That number deserves a moment. In nearly eight decades of measurement, American workers have never received a smaller share of the economy they produce. PIMCO followed[8] days later with a note from economist Tiffany Wilding warning that “in 2025, workers as a group captured very few, if any” of the benefits from AI-driven productivity. Her conclusion: “AI might not be a productivity tide that lifts all boats.” Fortune drew[4] a direct parallel to the early Industrial Revolution — a period economic historian Robert Allen called “Engels’s pause,” when productivity soared for over fifty years while worker pay flatlined. The gains went overwhelmingly to capital owners. It was, incidentally, during this pause that Friedrich Engels and Karl Marx wrote The Communist Manifesto. Only decades later, after workers organized and governments legislated, did wages start to rise alongside productivity. Meanwhile, the labor market continues to deteriorate. In January 2026, 108,435 jobs were cut[9], the worst January since 2009. Hiring plans hit their lowest on record[10]. And the economy added just 181,000 jobs[4] for the entire year of 2025 — revised down from an initial estimate of 584,000. So when someone tells me the market will sort this out, I want to know which market they’re looking at because the one I see has been sorting gains toward capital and away from labor for a very long time. The Forty-Year Pattern The optimists who argue that AI savings will flow to consumers are asking us to believe that this time will be different. The record says otherwise, and it’s not ambiguous. The Economic Policy Institute[11] has tracked the relationship between productivity and worker pay since the end of World War II. For three decades, they moved in lockstep — productivity went up, wages went up. Then, in the late 1970s, they decoupled. Between 1979 and 2019, productivity grew 3.5 times faster[12] than median worker pay. Where did the money go? EPI’s language is precise: the growing wedge represents income going “everywhere but the paychecks of the bottom 80% of workers”[11]. That bottom 80% isn’t a fringe — it’s production and nonsupervisory workers, nearly the entire private-sector workforce. The gains went to executive compensation and to capital — to shareholders and wealth owners. Since 2000, over 80%[13] of the growing gap has come down to one thing: rising inequality. If you want to know where the money is going right now, the Federal Reserve Bank of St. Louis has published it in April 2025. Corporate profits hit $4 trillion by the end of 2024. The increase was “entirely driven by domestic nonfinancial industries” — retail, wholesale, construction, manufacturing, and healthcare. The everyday industries where most Americans work and shop. And here’s the number that should put the deflation argument to rest: 76% of that profit growth[14] went directly to dividends, rewarding shareholders. Fifteen percent was retained as corporate savings. Nine percent went to taxes. Employee compensation as a share of national income didn’t rise. It fell. This is a forty-year pattern that has survived every new technology — PCs, the internet, software automation. Each one was supposed to lift all boats. Each one widened the gap instead. The Groundwork Collaborative found[15] that, from April through September 2023, corporate profits accounted for 53% of inflation. Over the prior forty years, profits had driven just 11% of price increases. Companies weren’t passing savings through. They were padding margins — and bragging about it on earnings calls. The Dress Rehearsal If you want a controlled experiment for whether corporations pass windfalls to workers and consumers, the 2017 Tax Cuts and Jobs Act[16] provides one. The logic was trickle-down economics — the argument that refuses to die, no matter how many times reality kills it. Give money to the top, and it trickles down to everyone else. It didn’t work under Reagan, nor did it work under Bush. But in 2017, the pitch came back in a fresh suit: cut the corporate tax rate from 35% to 21%, and companies would invest the savings in expansion, hiring, and wages. The projected benefit was $4,000 per household[17]. Paul Ryan promised the savings would flow “directly to the creation of new jobs, and not to corporations redistributing the newfound cash to shareholders”[18]. What happened? 84% of corporations reported no change in investment or hiring plans. Workers earning under about $114,000 saw “no change in earnings”[17]. Firms increased dividends and buybacks by nearly three times as much as capital investments. Buybacks hit a then-record $806 billion in 2018. Brookings concluded the whole thing “substantially reduced federal tax revenues — on the order of $1.9 trillion over 10 years — with no clear positive effect on GDP, wages, or investment”[19]. The most telling moment came before the law even passed. Bank of America-Merrill Lynch surveyed 300 executives about what they’d do with a corporate tax cut. The top responses: pay down debt, stock buybacks, mergers. Not wages. Not hiring. When Trump economic advisor Gary Cohn asked a roomful of CEOs to raise their hands if they’d increase capital investment, almost nobody did. The moderator turned to Cohn and asked, “Why aren’t the other hands up?” They told us what they would do. Then they did exactly that. Then every major research institution — the Congressional Research Service, Brookings, the IMF — confirmed it. This matters for the AI argument because the structure is identical. The TCJA was a trickle-down tax cut. The AI deflation argument is a trickle-down through labor cost savings: same promise, same mechanism, same beneficiaries, just a different input. Give the gains to corporations first, trust them to pass it along. It has never worked. Not once, in any version, under any administration. But it keeps coming back, because the people making the promise are the same people who benefit when it fails. Where the AI Savings Are Actually Going We don’t have to speculate about this. S&P 500 companies spent a record $942.5 billion on stock buybacks in 2024 alone[21]. Add dividends, and they returned $1.6 trillion to shareholders[22] in a single year, which Oxfam calculated is triple the total income of the poorest 27 million American households. As Oxfam put it: “Corporate tax savings aren’t being passed on to workers or consumers. They’re being funneled to wealthy shareholders and executives”[22]. That’s where the money went! $1.6 trillion, in one year, going in one direction. The Poster Child I wrote about Salesforce in the first piece, and they’ve only made the case stronger since. In September 2025, CEO Marc Benioff confirmed[23] that customer support had been cut from 9,000 to roughly 5,000. “I need less heads,” he said. AI agents handled half of all customer conversations[24] with satisfaction scores equivalent to those of human agents. Support costs dropped 17%. He called it “eight of the most exciting months of my career.” In February 2026, hundreds more were cut[25] from marketing, data analytics, and even the AI product teams themselves. Now, if the deflation argument held, this is exactly where you’d see prices fall. A company cuts its support staff in half, automates half its interactions, and significantly reduces costs. The textbook says the savings flow to consumers. On August 1, 2025, Salesforce raised prices 6%[26]. Not lowered. Raised. Across Enterprise and Unlimited editions. The company’s contracts include built-in annual escalators of 5–7%. Price increases drove roughly 72%[27] of total revenue growth in 2025. Fire half the support staff. Automate half the interactions. Cut costs 17%. Raise prices 6%. Salesforce isn’t an outlier. Microsoft cut 15,000[27] while raising prices across its product lines. Amazon cut 16,000[9] in January on top of 14,000 the previous October. None of them lowered prices. Not one. There’s a telling detail that reveals just how much room exists in these margins. In May 2025, Salesforce agreed to give federal agencies a 90% discount on Slack[27]. Ninety percent. That discount exists because the federal government has the purchasing power to demand it. Regular customers don’t. And no market mechanism compels Salesforce to extend it voluntarily. So it doesn’t. The Mechanism That Doesn’t Exist This is the core problem with the deflation promise. The argument assumes that competition will force prices down — that if one company cuts costs with AI, a competitor will undercut it, and the savings cascade to consumers. In a textbook with perfect competition, maybe. But that’s not the economy we have. A UCLA study[20] found that when a handful of companies dominate an industry, consumers lose, paying roughly 13% more than they would in a genuinely competitive market. And that penalty has grown as industries have become more concentrated. When three or four companies control an industry, and all cut labor costs with AI simultaneously, none has an incentive to lower prices. They all pocket the savings. There is no competitive pressure in concentrated markets to lower prices. There is no regulatory framework requiring profit-sharing. There is no historical precedent of companies voluntarily lowering prices because their costs went down. And there is an existing mechanism — the buyback — that channels savings directly to shareholders, amounting to $1.6 trillion a year. The deflation argument isn’t an economic model. It’s trickle-down in its third or fourth reincarnation — a bet on the generosity of monopolists. The Question Remains Fortune’s Industrial Revolution parallel is worth sitting with. During Engels’s pause, productivity gains flowed to capital owners for over fifty years before political and institutional changes forced a redistribution. It didn’t happen naturally. It didn’t happen because factory owners woke up feeling generous one morning. It happened because workers organized, governments legislated, and political movements made the status quo untenable. We are not there yet. If anything, we’re moving in the opposite direction. Every optimistic scenario for AI-driven displacement depends on corporate benevolence — the assumption that companies will lower prices they’re currently raising, reinvest in workers they’re currently firing, and share gains they’re currently funneling to shareholders. The forty-year productivity-pay gap says they won’t. The TCJA dress rehearsal says they won’t. The Salesforce playbook says they won’t. Bank of America, PIMCO, the St. Louis Fed, and the Bureau of Labor Statistics all confirm that they aren’t. So I’ll ask the question again, because nobody has answered it yet: if the gains from AI don’t flow to workers as wages, and they don’t flow to consumers as lower prices, and they do flow to shareholders as buybacks and dividends — who, exactly, is going to buy what we build? This is a follow-up to Who Buys What We Build?. If you’re new here, that’s where the argument starts. This essay was also published on SubStack Sources [1] Futurism — with the article Sam Altman Says AI Will Make Things 'Massively' Cheaper. [2] Yahoo Finance — with the article Billionaire Marc Andreessen Says AI Will Make 'Everything That Costs $100 Sell for a Penny'. [3] TheStreet — with the article Rising Corporate Profits, Falling Wages Drive K-Shaped Economy. [4] Fortune — with the article Why Your Boss Loves AI and You Hate It. [5] InvestorPlace — with the article Danger Lurking Behind Strong GDP Number. [6] CNBC — with the article Wealth Inequality and the K-Shaped Economy. [7] PIMCO — with the insight Why US Productivity Gains No Longer Reach Workers. [8] PIMCO — with the insight The AI-Driven Productivity Tide May Not Lift All Boats. [9] Challenger, Gray & Christmas — with the report January Job Cuts Surge; Lowest January Hiring on Record. [10] CNBC — with the article Layoff and Hiring Announcements Hit Their Worst January Levels Since 2009. [11] Economic Policy Institute — with the research The Productivity-Pay Gap. [12] Economic Policy Institute — with the blog post Growing Inequalities Reflecting Growing Employer Power. [13] Economic Policy Institute — with the publication Understanding the Historic Divergence Between Productivity and a Typical Worker's Pay. [14] Federal Reserve Bank of St. Louis — with the analysis What's Driving the Surge in US Corporate Profits. [15] Groundwork Collaborative — with the report Corporate Profits Driving More Than Half of Inflation. [16] Wikipedia — with the article Tax Cuts and Jobs Act. [17] Center on Budget and Policy Priorities — with the research The 2017 Trump Tax Law Was Skewed to the Rich. [18] University of Chicago Law Review — with the article Corporate Behavior and the Tax Cuts and Jobs Act. [19] Brookings Institution — with the collection The Tax Cuts and Jobs Act of 2017. [20] ProMarket — with the study The Cost of America's Oligopoly Problem. [21] PR Newswire — with the report S&P 500 Q4 2024 Buybacks Increase and 2024 Expenditure Sets New Record. [22] Fast Company — with the article Stock Buybacks by Biggest US Companies Enrich Wealthy Shareholders. [23] CNBC — with the article Salesforce CEO Confirms 4,000 Layoffs Because 'I Need Less Heads' With AI. [24] Fortune — with the article Salesforce CEO Marc Benioff on AI Agents, Jobs, and Layoffs. [25] TheStreet — with the article Major Tech Firm Quietly Lays Off Hundreds in AI-Related Shakeup. [26] Salesforce — with the announcement Pricing Update 2025. [27] SaaStr — with the article Salesforce, Microsoft, Google, and Atlassian All Raise Prices Again in 2025. Share This Post Related Reading Who Buys What We Build? U.S. employers cut 1.2 million jobs in 2025 while posting record profits and pouring tens of billions into AI. AI didn't break capitalism. It exposed a version of capitalism that had already stopped distributing its gains. Notes on David French’s “How Can America Be So Miserable When It’s So Rich?” David French describes America’s tiered economy as a cultural problem. It’s not. It’s the result of deliberate policy decisions over four decades — weakening labor, favoring capital, enabling buybacks — that recalibrated who the economy serves. AI will compress the number of humans capital needs even further. Coal and Steel The comparison between AI and coal isn’t about technology. It’s about cognitive lock-in — what happens when an entire economy organizes around one assumption and can’t see the disruption because it’s inside it. Germany did everything right and still produced 38% poverty in Gelsenkirchen. That’s not the failure story. That’s the success story. --- ### From Metalsmith to Eleventy - Building a Bilingual Site - Werner Glinka https://www.wernerglinka.com/writing/from-metalsmith-to-eleventy-building-a-bilingual-site/ CODING From Metalsmith to Eleventy - Building a Bilingual Site Feb 17, 2026 With the art website running on Eleventy, I wanted to add something I'd never implemented in Metalsmith: a full bilingual version. English and German, with proper language switching, localized navigation, and the SEO markup that search engines expect for multilingual content. Eleventy has built-in i18n support. Rather than reaching for third-party plugins, I wanted to see how far the native capabilities would take me and where I'd need to build custom solutions. The Directory Approach There are several ways to structure multilingual content. URL parameters (?lang=de), subdomains (de.example.com), or directory prefixes (/de/). I chose directories because they keep English URLs clean—no /en/ prefix on the default language—while providing clear separation for German content. The structure mirrors itself: textsrc/ index.md # English homepage (/) about.md # English about (/about/) works.md # English works (/works/) de/ de.json # Sets lang: de for all pages in this directory index.md # German homepage (/de/) über.md # German about (/de/über/) werke.md # German works (/de/werke/) German URLs use German words where appropriate: über instead of about, werke instead of works. Artwork pages retain their catalog numbers as filenames because they are language-neutral identifiers. Eleventy's i18n plugin provides the foundation. A de.json file in the German directory sets lang: de for every page beneath it. English pages inherit the default lang: en from the plugin configuration. The HTML lang attribute sets itself correctly without per-page configuration. Language-Aware Navigation The first problem: the main menu showed items from both languages. Home, Works, About appeared alongside Startseite, Werke, Über. The navigation component was collecting every page with a navLabel, regardless of language. I could have created separate menu collections for each language, but that would have meant duplicating the collection logic and maintaining synchronization. Instead, I filter in the template. The menu collection contains everything; the navigation macro displays only items that match the current page's language context. The filter checks URL prefixes. If the current page URL starts with /de/, show only menu items whose paths also start with /de/. Otherwise, show items without that prefix: nunjucks{% set isGerman = urlPath and urlPath.substring(0, 4) == '/de/' %} {% for item in mainMenu %} {% set itemIsGerman = item.path and item.path.substring(0, 4) == '/de/' %} {% if itemIsGerman == isGerman %}
  • {{ item.title }}
  • {% endif %} {% endfor %} Simple string comparison. No language detection libraries, no complex locale handling. The URL structure carries the language information; the template uses it. Breadcrumbs Across Languages Breadcrumbs presented a subtler problem. The breadcrumb plugin generates crumbs starting with "Home" at /. For a German page at /de/über/, this produced: Home → Startseite → Über. The first crumb linked to the English homepage. For German pages, /de/ serves as the homepage. The root / crumb shouldn't appear. The fix: skip the root crumb when rendering breadcrumbs on German pages. nunjucks{% for crumb in breadcrumbs %} {% if not (crumb.path == '/' and isGerman) %}
  • {{ crumb.title }}
  • {% endif %} {% endfor %} German breadcrumbs now start at Startseite. English breadcrumbs work as before—same component, conditional logic based on language context. The Language Switcher Users need a way to switch languages. The switcher appears in the header, showing available languages and linking to the equivalent page in each language. The challenge: URL paths differ between languages. /about/ doesn't map to /de/about/, it maps to /de/über/. The switcher can't just swap URL prefixes; it needs explicit mappings. I solved this with frontmatter. Each page declares its alternate language version: yaml# In about.md seo: alternate: de: /de/über/ # In de/über.md seo: alternate: en: /about/ The same seo.alternate data serves two purposes: the language switcher uses it to build navigation links, and the head template uses it to generate hreflang tags for search engines—a single source of truth. The switcher template reads these alternate URLs and sets them as data attributes: nunjucks{% for lang in languages %} {% set langUrl = alternates[lang.code] %}
  • {{ lang.label }}
  • {% endfor %} JavaScript handles the interaction, stores the user's preference in localStorage, and navigates to the appropriate URL. If an explicit alternate URL exists in frontmatter, use it. Otherwise, fall back to path manipulation for pages with identical structures in both languages. Collections Per Language Blog-style content needs separate collections. English studio notes live in src/studio-notes/. German studio notes live in src/de/studio-notizen/. Each needs its own collection for proper previous/next navigation and index page rendering. The Eleventy configuration defines both: javascripteleventyConfig.addPlugin(normalizedCollections, { collections: { 'studio-notes': { glob: 'src/studio-notes/*.md', sortBy: 'card.date', sortOrder: 'desc' }, 'studio-notizen': { glob: 'src/de/studio-notizen/*.md', sortBy: 'card.date', sortOrder: 'desc' } } }); German pages reference the German collection in their navigation sections. The collection-links component receives collectionName: 'studio-notizen' and renders links within the correct language context. Content Translation The page structure stays identical between languages. Only the prose content and labels change: yaml# English navigation: navLabel: 'About' sections: - sectionType: text-only text: title: 'About My Work' prose: |- Werner Glinka is a mixed media artist... # German navigation: navLabel: 'Über' sections: - sectionType: text-only text: title: 'Über meine Arbeit' prose: |- Werner Glinka ist ein Mixed-Media-Künstler... The components don't know or care which language they're rendering. They receive text properties and output HTML. Translation is a content concern, not a component concern. What Eleventy Provides The i18n plugin handles language identification through directory-based JSON files. The data cascade makes language-specific data available without explicit wiring. The build process handles both language trees without special configuration. What I built on top: navigation filtering, breadcrumb adjustments, a language switcher with frontmatter-driven URL mapping, and per-language collections. These aren't complex; each is a focused piece of template logic or configuration. But they're necessary because internationalization touches many parts of a site simultaneously. The combination works well. Eleventy provides the foundation; custom logic handles the specifics of how this particular site structures its bilingual content. The final post covers SEO implementation—the hreflang tags that connect to the language switcher data, plus structured data, sitemaps, and meta tags using Eleventy's templating rather than external plugins. Share This Post Related Reading From Metalsmith to Eleventy - Porting an Actual Site The practical experience of migrating an art website from Metalsmith to Eleventy, including navigation issues, data access patterns, and what the fixes revealed about platform assumptions. From Metalsmith to Eleventy - A Natural Progression Why I moved from Metalsmith to Eleventy for my art website, what carried over, and why the skills and mental models transfer between static site generators. From Metalsmith to Eleventy - SEO Without External Dependencies Implementing SEO for a bilingual Eleventy site using templates instead of plugins—covering meta tags, Open Graph, hreflang, JSON-LD structured data, and sitemaps. --- ### I've Seen This Before - Werner Glinka https://www.wernerglinka.com/writing/ive-seen-this-before/ AI LABOR CULTURE I've Seen This Before Feb 16, 2026 My previous essay, Who Buys What We Build?, struck a nerve. The engagement tells me that people recognize the core argument — that AI-driven layoffs are eroding the consumer base that the entire economy depends on — even if nobody in power seems willing to say it out loud. In that essay, I framed the problem as a feedback loop that capitalism forgot — implying it could remember, could self-correct. I’ve spent some time since then researching what people, institutions, and governments are actually doing to prepare. What I found pushed my thinking further than I expected. But let me start with why, because I’ve watched this movie before. I grew up in it. Gelsenkirchen, 1957 I was born in Gelsenkirchen, in Germany’s Ruhr Valley — the industrial heartland that powered the German economic miracle of the 1950s and 60s. At its peak, coal mining alone employed roughly 600,000 people. The entire region — some 8.5 million people — was built around coal, steel, and the vast supply chains that fed them. The mines, the foundries, the rail yards, the downstream businesses: they were the economy. Then the coal crisis hit in 1957. I grew up inside the unraveling. Between 1955 and 1980, coal employment dropped from 480,000 to 143,000. The steel crisis followed. I watched it happen — the closures, the empty storefronts, the men who had defined themselves by their work suddenly having no work to define themselves by. The German government responded with what, on paper, appeared to be a comprehensive transition plan. The large mining companies and their workers were protected by Germany’s co-determination laws[1]. Miners at the big firms were offered early retirement, retraining, and transfers to the metal industries. Government officials could truthfully say that none of the miners at the major coal companies became unemployed. But that’s not the whole story. The co-determination law only covered coal and steel, not the upstream and downstream industries — the suppliers, the service businesses, the small firms that existed because the mines existed. Those workers got crushed. Unemployment in the affected industries exceeded 15%. And the replacement jobs that eventually materialized — mostly in the service sector — paid less. The official narrative today frames the Ruhr’s transformation as a success story: dozens of universities were built, the region rebranded itself as a knowledge and tourism economy, old mines became UNESCO World Heritage Sites and design museums. And there’s truth in that. But it took the better part of sixty years, billions in subsidies from European, federal, state, and municipal budgets, and a 25-year concentrated push in research and education. And after all of that? As of 2020, regional unemployment in the Ruhr still stood at 10.1% — nearly double the national average of 6.0%. Gelsenkirchen[2], my hometown, hit 15.6%. More than six decades after the crisis began. That’s the thing about industrial collapse. The official programs help the workers at the center. The people on the periphery — and there are always more of them — absorb the damage for generations. The Retraining Reflex When you raise the issue of AI displacing workers, the first answer you hear from policymakers and corporate leaders is retraining. Upskill the workforce. Teach people to work alongside AI. Adapt. It sounds reasonable. It’s also largely inadequate, and the research supports that conclusion. Harvard’s Project on Workforce has found that workforce development in the U.S. is chronically underfunded compared to peer nations. The existing federal infrastructure under the Workforce Innovation and Opportunity Act[3] is a patchwork that varies wildly by state, with dollars overwhelmingly directed toward classroom learning rather than work-based training. Apprenticeship programs represent only a tiny fraction of eligible programs. Brookings published a sobering analysis[4] in May 2025 identifying a fundamental flaw: retraining programs frequently move workers from one automation-susceptible occupation to another. Program organizers themselves admit they have a foggy understanding of AI’s future economic impact, which makes it nearly impossible to identify the right skills to train for. You retrain someone as a data analyst, and eighteen months later that role is being automated too. The National Academies[5] reported that nearly half of American workers were already using AI tools at least monthly by spring 2025, up from a third the year before. Nobody is giving these people a roadmap — they’re just expected to figure it out. There’s also the age problem. The fastest-growing segment of the U.S. labor force is workers 55 and older. Research shows older learners can do well in self-directed learning, but need more time and effort. The retraining pipeline was never designed for them. The difference between coal and AI is that with coal, you at least knew what was replacing it — oil, gas, nuclear, eventually renewables. The target was visible. With AI, the target keeps moving. Entire categories of white-collar work — not just individual tasks, but whole job descriptions — are being absorbed. Legal research, financial analysis, customer support, content creation, software testing, entry-level coding. These aren’t fringe occupations. They’re the backbone of the professional class. In the Ruhr, displaced miners could transfer to the metal industries. There was somewhere to go. When AI eliminates the entry-level analyst role at a bank, what’s the adjacent industry that absorbs that person? There isn’t one — because AI is hitting those adjacent industries simultaneously. The Thinkers The most rigorous thinker on this is Daron Acemoglu[6], the Nobel-winning MIT economist. His framework identifies two forces that have historically balanced each other: automation displaces workers from existing tasks, while the creation of new tasks reinstates them. For most of the 20th century, these forces roughly offset each other, which is why industrialization ultimately raised living standards broadly. But Acemoglu’s core argument is that this balance broke around 1980. Automation accelerated. New task creation slowed. The result is what we’ve lived through for four decades: rising productivity, stagnant wages, and a growing gap between what the economy produces and what workers earn. AI threatens to widen that gap dramatically. In an IMF publication, Acemoglu and his co-author Simon Johnson proposed five concrete policy steps: reform business models that let AI companies expropriate consumer data without compensation, fix a tax code that penalizes hiring humans more than investing in automation, expand competition among AI developers, invest in worker-complementary technologies, and strengthen labor voice in how technology gets deployed. These are structural interventions. They’re also politically dead on arrival in the current U.S. climate. Howard Marks[7], the investor and co-chairman of Oaktree Capital, put the psychological dimension bluntly: financial support alone will not replace the psychological and social benefits of employment. Work gives people identity, structure, and social connection. A check doesn’t replace that. Anyone who watched what happened to the men in the Ruhr Valley when the mines closed understands this intuitively. Universal Basic Income: From Theory to Legislation The policy conversation that has moved fastest is around Universal Basic Income. It’s no longer theoretical. Sam Altman has proposed an “American Equity Fund[8]“ where large AI companies and landholders would contribute roughly 2.5% of their value annually to a fund distributed to all citizens — effectively socializing a share of the gains from automation. Elon Musk has floated the idea of “Universal High Income,” though his vision requires a level of post-scarcity abundance that no economy has achieved and that his critics consider detached from reality. On the legislative side, Rep. Bonnie Watson Coleman introduced the Guaranteed Income Pilot Program Act of 2025[9], authorizing $495 million annually for five years to test nationwide guaranteed income. Rep. Rashida Tlaib’s BOOST Act proposes a $250 per month refundable tax credit. Over 150 mayors across the country have joined a network normalizing unconditional cash transfers as a municipal policy tool. One of the more interesting experiments is Ireland’s Basic Income for the Arts[10], which began as a three-year pilot and became permanent in 2026. People working in creative fields can apply for a basic income that allows them to pursue their craft without needing side work to cover living expenses. It’s a targeted acknowledgment that certain kinds of valuable work don’t survive market pressures without support. But the skeptics raise legitimate problems. A Newsweek analysis[11] in January 2026 pointed out that even redirecting an entire record year of S&P 500 stock buybacks — over a trillion dollars — wouldn’t come close to funding a national UBI at the levels most proponents suggest. The honest assessment is that UBI might be necessary but is nowhere near sufficient, and the political infrastructure to implement it at scale doesn’t exist. The Toolbelt Generation While policymakers debate and economists publish, the most organic adaptation is coming from young people who are simply opting out of the knowledge-work pipeline. Gen Z enrollment in trade programs has jumped 42% in recent years. Enrollment in vocational-focused community colleges rose 16% from 2022 to 2023, and enrollment at public community colleges offering vocational programs surged nearly 20% since 2020. NPR has dubbed them the “toolbelt generation[12].” The numbers tell the story of a generation doing the math. Only 16% of Gen Z parents believe a college degree guarantees long-term job security. Seventy-seven percent of Gen Zers say choosing a career resistant to automation is a top priority. The professions they rank as most AI-resistant? Plumbers, HVAC technicians, electricians, and nurses. There’s a deep irony here. A CSIS analysis[13] found that by 2030, the U.S. may need 140,000 additional electricians, HVAC techs, and welders — just to build the AI infrastructure itself. Google has pledged $10 million to train electricians for data centers. The machines that are eliminating knowledge work need human hands to build and maintain their physical homes. Jim Farley, CEO of Ford — the company whose founder once understood that workers need to earn enough to buy what they build — launched a campaign in 2025 to partner with vocational colleges and fund scholarships for future technicians. The trade school resurgence is real and pragmatic. But it deserves a harder look than the feel-good headlines suggest. The argument for trades rests on a simple premise: AI can think, but it can’t reach into a wall cavity and reroute old wiring. The brain is solved; the body isn’t. That gap is what makes a plumber’s job safe while a paralegal’s isn’t. But the gap is closing faster than most people realize. AI provides the intelligence. Advanced robotics provides the body. The last bottleneck is the hand — building a mechanical hand with the dexterity, tactile sensitivity, and adaptive grip of a human one. And that bottleneck is being solved right now, on multiple fronts simultaneously. In 2025 alone, researchers published robotic hands in Nature Machine Intelligence[14] and Science Advances[15] achieving human-like adaptive grasping and the ability to handle delicate objects without damaging them. Humanoid robot funding grew fivefold from 2022 to 2024, now exceeding a billion dollars annually. McKinsey[16] estimates the general-purpose robotics market could reach $370 billion by 2040. Morgan Stanley[17] projects adoption will accelerate sharply in the late 2030s and 2040s. And in January 2026, Tesla announced[18] it would discontinue the Model S and Model X to convert its Fremont factory line to produce up to one million Optimus humanoid robots per year. When one of the world’s largest manufacturers pivots from building cars to building humanoid robots, this is no longer a research project. It’s an industrial strategy. What this means is that today’s eighteen-year-old enrolling in trade school is buying a reprieve, not an escape. The trades are more resistant to automation than knowledge work — today. But the timeline isn’t infinite. A young electrician starting an apprenticeship in 2026 will be in their mid-thirties when humanoid robots start deploying at scale in construction. Not everyone can or wants to become an electrician, and the ones who do should know that the clock on their advantage is already ticking. The Entry-Level Collapse Perhaps the most alarming indicator of what’s coming is what’s already happening to people just entering the workforce. In the UK, tech companies cut graduate hiring by 46%[19] from 2023 to 2024, with an additional 53% drop projected by 2026. Stanford’s Digital Economy Lab[20] found a 67% decrease in U.S. entry-level tech job postings over the same period. At one Indian engineering institute, fewer than a quarter of 400 graduating students had secured job offers as of late 2025. A CBS News report[21] profiled a University of Connecticut mechanical engineering graduate who applied for 200 positions without landing a job in his field. He’s working as an assistant pool director. Labor economists point out that AI is best at the kind of rote, repetitive tasks that are the staple of entry-level work — which means the very bottom rung of the career ladder is being sawed off. This is not just an inconvenience. Entry-level jobs are how people develop professional skills, build networks, and establish careers. If AI eliminates the first three to five years of professional development across multiple industries simultaneously, we’re not looking at a temporary adjustment. We’re looking at a generation that never gets on the ladder at all. Scale and Speed Every transition I’ve read about — the Ruhr Valley, the American Rust Belt, the decline of British coal under Thatcher — shares a common feature: the collapse was geographically concentrated and industry-specific. The Ruhr lost coal. Detroit lost auto manufacturing. These were devastating, but they were contained. Other regions and industries absorbed some of the displaced workers. AI doesn’t work like that. It’s hitting every knowledge-work sector simultaneously, in every geography, with no clearly defined adjacent industry to absorb the displacement. The World Economic Forum[22] projects 92 million jobs displaced by 2030, against 78 million created — but those numbers assume the new jobs will require skills that the displaced workers can acquire, in locations they can access, within timeframes that matter. The Ruhr Valley’s experience suggests that the assumption is heroically optimistic. And the speed is different. The Ruhr’s decline played out over six decades. The coal workers who were fifty in 1957 could ride out the transition on early retirement. The supply chain workers had at least some time to find alternatives, even if those alternatives were worse. AI is compressing what took the Ruhr sixty years into perhaps a decade. The layoff announcements come weekly. The LinkedIn posts follow the same day. The Operating System Problem After all this research — the retraining programs, the UBI proposals, the trade school resurgence, the policy frameworks — I keep circling back to a deeper discomfort. Every remedy I’ve described is a patch applied within a system whose core logic is producing the problem. In my first essay, I wrote that AI didn’t break capitalism — it exposed a version of capitalism that had already stopped distributing its gains. I believed that then. I’m less sure now. The Ruhr Valley didn’t forget to distribute its gains. Germany distributed them as well as any capitalist economy ever has — co-determination, strong unions, massive public investment, a cultural commitment to social solidarity. And it still produced sixty years of generational damage from a single-industry, geographically contained transition. The system didn’t malfunction. It functioned exactly as designed. The design just isn’t built for this. What we’re facing isn’t a disruption — a temporary turbulence before a new equilibrium. It’s a structural incompatibility. Capitalism optimizes for returns to capital. That’s not a moral failing — it’s the operating system. When replacing a worker with an algorithm increases shareholder value, the system will do it every time. Not because CEOs are villains, but because the incentive structure demands it. Retraining doesn’t change that incentive. UBI doesn’t change it. Trade schools don’t change it. They address the symptoms while the machine keeps running as designed. We are trying to run a post-labor technology on a labor-dependent philosophy. The Writers Who Saw It Coming Science fiction writers have understood this better than economists, and they’ve understood it for decades. In 1952, Kurt Vonnegut published Player Piano[23], his first novel, based on what he’d seen working at General Electric. In it, automation has replaced most human workers. The displaced population has everything it needs materially — housing, appliances, a form of basic income — but, as one character puts it, everything worth enjoying about material abundance, “pride, dignity, self-respect, work worth doing, has been condemned as unfit for human consumption.” The novel’s most devastating detail is its ending: the workers revolt, destroy the machines — and then immediately start rebuilding them. Not because they’re stupid. Because the system has so thoroughly colonized their understanding of progress that they can’t conceive of life outside it. Vonnegut wrote that based on watching a computer-operated milling machine cut jet engine rotors in 1949. He saw what was coming — not just the automation, but the trap. The machines weren’t the problem. The system that made people’s dignity contingent on their economic utility was the problem. Take away the utility, and you don’t just lose jobs. You lose the entire framework through which people understand their own worth. Isaac Asimov got at the same thing from the other direction. In a 1964 essay[24], he predicted that by 2014, “the lucky few who can be involved in creative work of any sort will be the true elite of mankind, for they alone will do more than serve a machine.” He foresaw automation eliminating routine work and warned that humanity would suffer from “the disease of boredom” — not material want, but purposelessness. What he underestimated was how tightly capitalism would tie human purpose to economic function, making that boredom not just psychological but existential. Iain M. Banks imagined one possible endpoint in his Culture series[25]. The Culture is a post-scarcity civilization where super-intelligent AIs manage everything, and humans are free to do whatever they want — create art, explore, play. Banks, an avowed socialist, described it as “hippie commies with hyper-weapons.” It’s utopian and intentionally provocative, but the telling detail is this: the Culture only works because it abandoned capitalism entirely. There’s no money. No property. No labor market. The AIs produce abundance and distribute it freely. Banks understood that you can’t graft post-scarcity onto a capitalist framework. The operating system has to change. And Kim Stanley Robinson, whose Ministry for the Future[26] is perhaps the most serious attempt to imagine the actual transition out of capitalism — not life after it, but the wrenching process of getting there — has argued that markets are structurally incapable of valuing what doesn’t generate returns. Robinson’s point isn’t that markets are evil. It’s that they can’t price a stable climate, or a population that can afford to eat, because those things don’t fit on a balance sheet. The same structural incapacity applies to AI displacement. Capitalism is very good at deploying AI to increase productivity and concentrate the gains. It has no mechanism — none — for ensuring those gains are distributed in a way that preserves social stability. If the best version of capitalism couldn’t manage the Ruhr, what chance does American-style shareholder capitalism have with a disruption that’s hitting every knowledge-work sector on the planet simultaneously? This is the conversation nobody wants to have. Retraining is safe to talk about. UBI is edgy but increasingly mainstream. Trade schools are a feel-good story. But saying that the economic system itself might be structurally incompatible with what’s coming — that’s the third rail. Vonnegut saw it in 1952. Banks saw it in 1987. Robinson is writing about it right now. The science fiction writers have been ahead of the economists for seventy years, and we still haven’t caught up. This Time Is Different The standard rebuttal is that capitalism has absorbed every previous disruption. The steam engine displaced hand weavers, but created factory jobs. Electrification killed the lamplighter, but powered an entire industrial expansion. Computing eliminated typing pools, but created an information economy. Creative destruction has a 250-year track record. Why would this time be different? Because every previous disruption replaced human muscle or human routine while still needing human judgment to direct it. The displaced worker could always move up the value chain — from the loom to the factory floor, from the switchboard to the help desk, from data entry to data analysis — because there was always a rung above the machine’s reach. The machine was a tool. The human was still the agent. AI breaks that pattern. It doesn’t just replace the task. It replaces the capacity — judgment, analysis, pattern recognition, creative synthesis, strategic reasoning. These aren’t the bottom rungs of the value chain. They’re the top. When the machine can do what you got promoted into, there’s no rung left to climb to. That’s not a difference in degree from previous disruptions. It’s a difference in kind. And the reflexive counter — “well, communism was worse” — misses the point entirely. Soviet central planning didn’t challenge the core premise. Mao didn’t challenge it. They still needed human labor as the engine of production. They just changed who held the steering wheel. Capitalism and communism were both built on the same assumption: that human work is the source of economic value, and the argument is over who controls it and who benefits from it. Every system we’ve tried — feudal, mercantile, capitalist, socialist — has that assumption at its foundation. What AI introduces is something none of those systems were designed to handle: a world where human labor becomes optional. Not just manual labor. Not just routine cognitive labor. Labor itself. That’s not a crisis capitalism has solved before, because it’s never faced it before. And pointing to the failed alternatives doesn’t help, because they were built on the same assumption that’s breaking. I don’t know what replaces this. Nobody does. The science fiction writers have imagined some possibilities — Banks’s post-scarcity anarchism, Robinson’s managed transition, Vonnegut’s bleak warning about what happens if we don’t figure it out. But imagining a destination is easier than mapping the route. The honest position is that we’re heading into territory where the old maps don’t apply, and pretending the current system can absorb this because it absorbed everything before — that’s the real fantasy. What Conversation Do We Need? The Ruhr eventually stabilized — sort of — through massive, sustained public investment over decades. New universities, new industries, new infrastructure, a fundamental reimagining of what the region was for. And it still left Gelsenkirchen with 15.6% unemployment sixty-three years after the crisis began. What’s happening now is the Ruhr Valley at global scale and internet speed. The question from my first essay remains: who buys what we build, when the people who used to buy things no longer earn enough to do so? And the follow-up question is equally urgent: who are we preparing, for what, and is anyone being honest about whether it’s enough? The economists know the problem. Acemoglu has been writing about it for years. The policymakers have their pilots and their bills. The universities are scrambling to retrofit their curricula. Gen Z is picking up welding torches. And the companies keep posting record profits while cutting headcount. The science fiction writers saw it most clearly: a structural problem requires a structural response. Not just new training programs or cash transfers or tax incentives, but a serious reckoning with whether an economic system that ties human dignity to market utility can survive a technology that makes most human labor uncompetitive. The Ruhr tried everything within the existing system, and sixty years later, my hometown still hasn’t recovered. Something has to give. The Ruhr taught me that waiting for the system to self-correct is a multi-generational death sentence. We are no longer waiting for the movie to start — we are in the third act. The question is no longer how we fix the workers to fit the machine, but whether we have the honesty to admit the machine itself is the problem. And whether, this time, the conversation will include the people on the periphery, not just the ones at the center. Sources [1] Germany's co-determination laws — explained at deutschland.de. [2] Gelsenkirchen urban transition profile — from Urban Transitions. [3] Workforce Innovation and Opportunity Act — from the U.S. Department of Labor. [4] AI labor displacement and the limits of worker retraining — a Brookings analysis. [5] Retraining workers for the age of AI — from the National Academies. [6] What do we know about the economics of AI — with Daron Acemoglu at MIT. [7] Is it a bubble? — a memo by Howard Marks. [8] Moore's Law for Everything — Sam Altman's proposal for an American Equity Fund. [9] Guaranteed Income Pilot Program Act of 2025 — at Congress.gov. [10] Basic Income for the Arts — Ireland's program page. [11] The AI universal basic income trap — a Newsweek analysis. [12] Gen Z and vocational schools — NPR on the toolbelt generation. [13] GenAI's human infrastructure challenge — a CSIS analysis. [14] Robotic hand with adaptive grasping — published in Nature Machine Intelligence. [15] Prosthetic robotic hand research — from Johns Hopkins / Science Advances. [16] Will embodied AI create robotic coworkers — from McKinsey. [17] The humanoid robot market — from Morgan Stanley. [18] Tesla ending Model S and X production for Optimus robots — from CNBC. [19] UK tech graduate hiring cuts — from The Register. [20] Employment changes for young workers — from Stanford's Digital Economy Lab. [21] AI, jobs, and college graduate unemployment — a CBS News report. [22] The Future of Jobs Report 2025 — from the World Economic Forum. [23] Player Piano by Kurt Vonnegut — on Wikipedia. [24] Isaac Asimov's 1964 essay on the world of 2014 — in the New York Times archive. [25] Iain M. Banks's Culture series — an overview. [26] The Ministry for the Future by Kim Stanley Robinson — on Wikipedia. This essay was also published on SubStack Share This Post Related Reading Coal and Steel The comparison between AI and coal isn’t about technology. It’s about cognitive lock-in — what happens when an entire economy organizes around one assumption and can’t see the disruption because it’s inside it. Germany did everything right and still produced 38% poverty in Gelsenkirchen. That’s not the failure story. That’s the success story. Not Yet 'Not yet' is not a reassurance. It's a diagnosis. Anthropic's own research shows a 14% drop in job-finding rates for young workers in AI-exposed fields. The data says the displacement hasn't hit yet. The structure says it's already underway. I grew up inside that gap in Gelsenkirchen — I know what it looks like when 'not yet' becomes 'too late.' Who Buys What We Build? U.S. employers cut 1.2 million jobs in 2025 while posting record profits and pouring tens of billions into AI. AI didn't break capitalism. It exposed a version of capitalism that had already stopped distributing its gains. --- ### Who Buys What We Build? - Werner Glinka https://www.wernerglinka.com/writing/who-buys-what-we-build/ AI LABOR CULTURE Who Buys What We Build? Feb 11, 2026 TL;DR: U.S. employers cut 1.2 million jobs in 2025 while posting record profits and pouring tens of billions into AI. The official number of AI-attributed layoffs — 55,000 — is almost certainly a fraction of the real total. Companies aren’t passing the savings to consumers; they’re sending them to shareholders. Meanwhile, 75% of households can’t afford a median-priced home, retirement savings are woefully inadequate, and CEO pay has risen 1,094% since 1978 while worker pay has risen 26%. AI didn’t break capitalism. It exposed a version of capitalism that had already stopped distributing its gains — and is now accelerating the collapse of the consumer base that the whole system depends on. I was scrolling through LinkedIn this morning when I came across posts from recently laid-off Salesforce employees. The pattern was familiar: gratitude for the experience, pride in the work, optimism about the next chapter. One person even highlighted their role in implementing the very AI tools that, it turns out, made their position redundant. Nobody was angry. Nobody pointed out the absurdity. And that silence says as much about where we are as the layoffs themselves. The uncomfortable question hiding beneath the AI layoff headlines isn’t whether machines can do our jobs. It’s whether an economy built on mass consumption can survive once it systematically eliminates the incomes that make that consumption possible. I’m not an economist. I’m a retired web developer who spent two decades watching technology reshape industries. The facts in this piece come from Federal Reserve data, Bureau of Labor Statistics reports, company earnings calls, and CEO interviews. You don’t need a PhD to connect them. You just have to be willing to look at them all. The Numbers The scale of job displacement in 2025 was staggering. According to Challenger, Gray & Christmas[1], U.S. employers announced 1,206,374 job cuts in 2025 — a 58% increase from 2024 and the highest annual total since the pandemic year of 2020. In tech alone, layoffs.fyi[2] tracked 783 separate layoffs affecting roughly 246,000 workers, averaging about 674 people per day. And AI is no longer a background factor. Challenger’s data shows that AI was directly cited as the reason for 54,836 of those layoffs[1] in 2025, with over 71,000 AI-attributed cuts since tracking began in 2023. About 70% of global tech layoffs came from U.S.-headquartered companies[3]. Salesforce is a case in point. CEO Marc Benioff publicly insisted in August 2025 that AI would not lead to mass layoffs. Three weeks later, he confirmed on a podcast[4] that the company had cut its support workforce from 9,000 to about 5,000: “I’ve reduced it from 9,000 heads to about 5,000, because I need less heads.” The company’s total layoffs jumped from roughly 1,000 in 2024 to approximately 5,000 in 2025[5]. Microsoft followed the same playbook. The company laid off over 15,000 employees in 2025[6] — five consecutive months of cuts — while posting record revenue of $70.1 billion and net income up 18%. CEO Satya Nadella called this the “enigma” of layoffs during strong financial performance[6]. Company leaders rejected the suggestion that AI was directly eliminating jobs. But the same company was spending $80 billion on AI infrastructure[7], and a Microsoft finance executive admitted during a JPMorgan conference that the company was “saving hundreds of millions of dollars a year by using artificial intelligence for customer support and reducing the need for human interaction.”[8] The official reason for the layoffs was “restructuring.” The money trail tells a different story. This is an important point about the data. Only about 55,000 of the 1.2 million layoffs in 2025 were officially attributed to AI. But that figure counts only the cuts where companies were honest enough — or careless enough — to say the word “AI” out loud. The preferred labels are “restructuring,” “strategic realignment,” “increasing agility,” “doing more with less.” These are companies that are simultaneously investing tens of billions in AI infrastructure, automating customer support, bragging about productivity gains on earnings calls, and telling investors they need fewer people. The time for giving them the benefit of the doubt on their layoff attributions has passed. The real AI-driven number is almost certainly far higher than what anyone is willing to put on a press release. And as Harvard Business Review noted in January 2026[9], many of these companies aren’t even cutting jobs because AI has proven it can replace those workers — they’re doing it based on AI’s potential. They’re firing people on a bet. Early 2026 is tracking even worse. Tech layoffs are running at 856 people per day[2]. Meta cut 1,500 from Reality Labs. Amazon is shedding 16,000 corporate positions[3], bringing its combined recent cuts to about 30,000 — roughly 10% of its corporate workforce. January 2026 saw 108,435 announced job cuts[10], the worst January since 2009. IBM’s CEO, Arvind Krishna, tried to frame this as a simple post-pandemic correction. Companies over-hired during the COVID boom, and now they’re normalizing. But it doesn’t explain why the pace is accelerating four years after the pandemic, why companies posting record profits are cutting the deepest, or why the money saved on salaries is flowing directly into AI budgets. The Productivity Trap Here’s what the earnings calls celebrate: AI is making companies leaner. Fewer people, more output, better margins. From a shareholder perspective, this is exactly what it should be. Productivity gains are the engine of capitalism. But capitalism has a structural requirement that nobody on those earnings calls wants to talk about. The system needs producers and consumers. These roles must be roughly in balance. When companies collectively eliminate the jobs that give people purchasing power, they’re optimizing themselves into a paradox — producing goods and services for a customer base that is steadily shrinking. Henry Ford stumbled into this over a century ago. In January 1914, Ford announced he would pay workers $5 a day[11] — more than double the prevailing wage of $2.34 — for eight hours of work instead of nine. Economists have long debated the motivation. The popular story is that Ford wanted his workers to afford the cars they built. Critics counter that it was purely a retention move — turnover at Ford’s Highland Park plant had hit 380%[12] by late 1913 because workers couldn’t tolerate the monotony of assembly line work at poverty wages. To maintain a workforce of 14,000, Ford had to hire 52,000 people in a single year. But these aren’t competing explanations. They’re two faces of the same problem. Workers were leaving because they couldn’t make a decent living at $2.34 a day. The wage was too low to sustain them, and therefore too low to sustain the business. When Ford doubled it, both problems resolved at once: turnover disappeared[12], productivity surged, profits doubled in under two years, and — as the Kellogg School of Management notes[13] — workers were boosted into the middle class with disposable income to buy the very Model Ts they were producing. Ford later called it “one of the finest cost-cutting moves we ever made.” The lesson isn’t about Ford’s generosity or his business cunning. It’s that when workers can’t sustain a decent life, the system breaks — whether that shows up as 380% turnover in 1913 or collapsing consumer demand in 2026. Today’s tech companies aren’t losing workers to turnover. They’re eliminating workers entirely. But the underlying economic reality is the same. If people can’t make a living, the whole arrangement falls apart. Ford figured that out with a longer time horizon than a quarterly earnings report. We seem to have forgotten it. The Professional-Class Buffer What struck me about those LinkedIn posts from Salesforce employees was the composure. Laid-off workers performing gratitude and resilience on a platform owned by Microsoft, which itself laid off more than 10,000 people in recent rounds. It’s a survival mechanism, and an effective one. Showing anger or bitterness makes you unhireable in a market that demands positivity. And for now, it works. These are people with savings, severance packages, professional networks, and in-demand skills. They can absorb the hit and land somewhere, maybe at a lower salary, maybe in a less stable role. The professional class has a buffer. But there’s a compounding effect that doesn’t get enough attention. Each round of layoffs chips away at something. The first time, you bounce back. The second time, you’re more cautious. The third time, you start questioning the arrangement itself. And with AI accelerating the cycle, the intervals between disruptions are getting shorter while the recovery periods are getting longer — especially for people over 40. According to Fortune’s analysis of Glassdoor data[14], employee mentions of “layoffs” and “job insecurity” in company reviews are now higher than they were in March 2020, when the pandemic first shut down the global economy. Trust in senior leadership has eroded sharply, with negative descriptions of executives rising since 2024. The era of “forever layoffs,” as Glassdoor calls it, is redefining the professional workplace less by empowerment than by chronic insecurity. The professional-class buffer runs out when the landing spots disappear. When the next company is also “doing more with less.” When the freelance market is saturated. When the skills you spent years building are commoditized overnight by the same tools you helped implement. The Longer Arc This isn’t just an AI story. It’s the latest chapter in a trend that’s been building since the late 1970s. According to the Economic Policy Institute[15], worker pay and productivity grew in lockstep from the end of World War II through the 1970s. Then they diverged. From 1979 to 2024, worker productivity increased 80.9% while average hourly compensation grew just 29.4%[16]. The EPI attributes this to deliberate policy choices: the erosion of unions, deregulation, corporate globalization, declining minimum wages, and tax cuts for high earners. Economists will debate the methodology behind those numbers — which inflation deflator to use, whether to count benefits alongside wages, how to measure productivity across sectors. Let them debate. The lived reality isn’t ambiguous. Nearly 75% of U.S. households[17] cannot afford a median-priced new home. Owning a median-priced house now consumes 47% of median household income[18] — far above the 30% threshold considered affordable. Fifty-five-year-olds have median retirement savings under $50,000, and 58% of American workers[19] say their retirement savings are behind where they should be. Meanwhile, the stock market is at record highs and CEO compensation has climbed to 281 times the typical worker’s pay[20] — up from 21-to-1 in 1965. Since 1978, CEO pay has risen 1,094%. Worker pay has risen 26%. You don’t need a PhD in economics to see that the gains from decades of rising productivity have not been flowing to the people who produced them. Whatever the precise measurement, the direction is unmistakable. The wealth concentration data is just as stark. Federal Reserve data[21] shows that the top 1% of U.S. households owned 31.7% of all wealth in the third quarter of 2025 — the highest share on record since tracking began in 1989. The wealthiest 1% held about $55 trillion in assets, roughly equal to the wealth held by the bottom 90% combined. Meanwhile, the bottom 50% of households held just 2.5%[22] of the nation’s wealth. Some will object that these numbers overstate the problem — that when you include retirement accounts and home equity, many Americans are technically “millionaires.” On paper, maybe. But this isn’t 1950, when a million dollars meant generational security. A serious illness can cut those paper assets in half overnight. According to the CFPB, 100 million Americans carry a combined $220 billion in medical debt[23]. An estimated 31 million Americans borrowed money for healthcare in 2024 alone — $74 billion worth[24]. Medical bills remain the primary cause of roughly two-thirds of personal bankruptcies[23]. If your portfolio is worth $50 million and you face a $500,000 medical crisis, that’s expensive but it doesn’t change your life. If your retirement savings are $400,000 — which puts you ahead of most Americans — that same crisis cuts your future in half. The wealth that looks adequate on a spreadsheet is one bad diagnosis away from inadequate. And that’s before we even get to the layoff. Consumer spending patterns already reflect this divide[21]: the top 10% of income earners now account for nearly half of all U.S. consumer spending. The economy is increasingly dependent on a thin layer of wealthy households to drive demand — a fragile arrangement. The standard counterargument from the billionaire class is that they create jobs and drive innovation. A rising tide lifts all boats. But the data above tells a different story. The tide has been rising for capital owners and receding for everyone else for nearly five decades. AI didn’t break capitalism. It exposed a version of capitalism that had already stopped distributing its gains. The displacement we’re seeing now is an acceleration of a trend that was well underway before anyone had heard of a large language model. What makes this automation wave different from previous ones is both speed and breadth. The shift from agriculture to manufacturing took generations. The transition from manufacturing to services took decades. AI is hitting white-collar knowledge work, creative work, and service work simultaneously, and it’s doing it in years, not decades. The social systems that might cushion the blow — retraining programs, safety nets, policy responses — operate on timescales that simply can’t keep up. The standard reassurance is that new jobs will emerge, just as they always have. The automobile displaced the horse and buggy, but it created mechanics, highway engineers, gas station attendants, and suburban real estate agents. That’s true. But it’s also not what’s happening this time. Every previous wave of automation replaced one kind of human labor with another. Machines replaced physical work, so people moved into services. Computers automated calculation, so people moved into knowledge work. There was always a next rung on the ladder. AI is different because it doesn’t replace one category of human work — it compresses the entire value chain. Consider what’s actually happening in specific professions. A senior attorney at a law firm used to assign preliminary case research to a team of junior associates. That work is now done by AI in a fraction of the time. The senior attorney is fine — for now. But the junior associate positions that used to train the next generation of senior attorneys are disappearing. The pipeline that creates expertise is being cut. The same pattern holds in software development: a senior engineer defines the architecture and requirements, and AI implements, tests, and deploys the code. The mid-level and junior developer roles that used to be the training ground are evaporating. In web design — a field I’ve worked in for over two decades — I’ve watched AI tools grow from novelties to genuine replacements over just the past two years. There is nothing in the trajectory that suggests a meaningful role will remain for a human designer. Each new release closes another gap. This is not a parallel to the Industrial Revolution, where physical labor was replaced by service work. We are not moving workers from one column to another. We are taking the human out of the equation entirely in profession after profession, and we are doing it from the bottom up — eliminating the entry-level and mid-career positions first, hollowing out the ladder while the people at the top look down and say the view hasn’t changed. It has no precedent in economic history, and the cheerful insistence that “new jobs will emerge” is not an argument. It’s wishful thinking! And What Are the Billionaires Saying? A handful of them see the problem clearly. Ray Dalio, founder of the world’s largest hedge fund, has been sounding the alarm for years. Back in 2018, he wrote that capitalism is not working for the majority of Americans[25] and called for a national emergency to be declared. More recently, at the Fortune Global Forum in October 2025[26], he warned that the bottom 60% of Americans are becoming an “extreme dependency” underclass, unable to participate meaningfully in the economy while the top 1-10% reap virtually all the gains from AI. He explicitly called for a redistribution policy[27] — though he qualified it by saying that handing money to “useless” people isn’t the answer either, a framing that tells you something about how even the most clear-eyed billionaires think about the rest of us. Sam Altman, the CEO of OpenAI and arguably the person most responsible for the current AI wave, has called AI an “equalizing force in society”[28] and has floated universal basic income. But when pressed directly on wealth inequality[29] at a San Francisco event — confronted with Jensen Huang’s $179 billion net worth while 42 million Americans were losing food assistance — he redirected to housing policy and said the economic system is “so deeply screwed up” but that fixing it is “really hard.” Not exactly a call to action from someone whose technology is accelerating the disruption. Warren Buffett has put it most plainly: “This has been a prosperity that’s been disproportionately rewarding to the people on top.” But even his observation stays descriptive rather than prescriptive. That’s about it for genuine acknowledgment. A few billionaires who can read the data but aren’t willing to fundamentally challenge the system that made them. Their actions, however, tell a different story. Media theorist Douglas Rushkoff documented this brilliantly in Survival of the Richest[30]. The book opens with what has become a famous anecdote: Rushkoff was invited to a desert resort to advise five billionaires on “the future of technology.” Instead, the entire session devolved into a single question[31] — how do I maintain authority over my security force after “the Event”? They called it “the Event,” their euphemism for environmental collapse, social unrest, or whatever catastrophe they consider inevitable. Rushkoff’s advice was straightforward: treat people well now, expand that ethos to your business practices and wealth distribution, and there’s less chance of an “Event” in the first place. They weren’t interested. The bunker industry tells you where the money is actually going. Zuckerberg is building a $270 million compound on the Hawaiian island of Kauai[32] — 1,400 acres, a 5,000-square-foot underground bunker, self-sustaining food and water systems, staffed by hundreds of locals under NDAs. Peter Thiel secured a New Zealand passport and tried to build an underground lodge on the South Island. LinkedIn’s Reid Hoffman openly admits to owning “apocalypse insurance” properties[33], especially in New Zealand. Larry Ellison, co-founder of Oracle, bought almost the entire Hawaiian island of Lanai. Companies like Survival Condo, Oppidum, and Vivos[34] are doing booming business selling luxury underground residences with swimming pools, cinemas, and artificial sunlight — business that spiked after the pandemic and hasn’t slowed down. Even OpenAI’s co-founder Ilya Sutskever reportedly said, “We’re definitely going to build a bunker before we release AGI.” The contrast is stark. In their speeches and podcasts, a few billionaires acknowledge the gathering storm. In their actions, they’re building lifeboats for themselves and their families. They’re not investing in solutions for society — they’re investing in escape plans. As Rushkoff observed, these are people who feel “utterly powerless to influence the future” despite being the wealthiest and most powerful humans alive. They’ve concluded that the system they built and benefited from is heading toward collapse, and their response is not to change course but to make sure they survive the wreck. That tells you everything about where we stand. What Comes Next There is one more argument worth addressing, because it’s the most seductive. The claim is that AI will lower the cost of goods and services so dramatically that even people with diminished incomes will be able to afford more. Healthcare, legal services, education, software — all of it gets cheaper as AI takes over the expensive human parts. In this telling, wages don’t matter as much because everything costs less. It’s a nice theory, and it might even be partially true for some goods for some period of time. But it has a fundamental problem: it assumes that the companies deploying AI will pass the savings on to consumers rather than capture them as profit. We’ve already seen how this plays out. Microsoft saved hundreds of millions replacing customer support with AI and didn’t lower the price of Office 365. Salesforce cut its support workforce nearly in half and subscription prices held. The savings went to the bottom line. The entire premise of the cost-deflation argument depends on corporate benevolence that has no precedent and no mechanism to enforce it. And even if prices did fall, they would have to fall faster and further than incomes — for decades — to keep the consumer economy intact. That’s not an economic model. That’s a fantasy about the generosity of monopolists. There are a few possible trajectories. The optimistic case is that new kinds of work emerge, as has happened with every major technological shift in history. AI handles the drudgery, and humans move into roles we can’t yet imagine. Maybe. But even optimistic forecasts from major consulting firms show that AI adoption concentrates output into fewer firms and fewer roles. That’s not a job-creation engine. It’s a consolidation engine. The gap between displacement and new opportunity could be brutal, and there’s no guarantee the new roles will employ as many people or pay as well. Another possibility is deliberate intervention. The levers exist: income floors like universal basic income or a negative income tax, aggressive taxation of AI-driven productivity gains, public ownership stakes in AI infrastructure, shorter work weeks to distribute remaining employment more broadly, or a revival of organized labor power to give workers a seat at the table where these decisions are made. None of these ideas are new. All of them are politically difficult in a country that can barely pass a budget. But they may become economically necessary if consumption craters — and some combination of them is more plausible than the fantasy that the market will sort this out on its own. The third case is the dark one. Companies optimize for short-term shareholder returns, hollow out their customer base, and the system enters a deflationary spiral. Demand drops, revenues follow, more layoffs ensue. The feedback loop runs in reverse. History suggests that extreme wealth concentration doesn’t resolve itself quietly. The Gilded Age led to the Progressive Era and the New Deal. The French aristocracy didn’t see it coming either. The question isn’t really whether a correction happens, but what form it takes and how much damage accumulates before it does. The Silence What concerns me most right now and what prompted this post isn’t the layoffs themselves. Disruption happens, and some of it may actually be necessary. What concerns me is the silence. The performed gratitude on LinkedIn. The euphemistic language of “strategic realignment” and “doing more with less.” The absence of a serious public conversation about what happens when the machines that boost productivity also eliminate the incomes that drive demand. The people being laid off from Salesforce and Amazon and Meta aren’t abstractions. They’re engineers, writers, analysts, and support staff who did their jobs well and got thanked for it with a severance check and an NDA. Many of them helped build the very systems that replaced them. Sooner or later, the good face to the bad game stops working. When the professional-class buffer is gone, when the savings are spent, when the network can’t find you another landing spot — that’s when the conversation changes. For now, LinkedIn is full of gratitude posts. One day it will be full of something else. The question is whether we start that conversation now, while there’s still room for orderly course correction, or wait until the math forces it on us in ways that are far less comfortable for everyone. This essay was also published on SubStack. Update Mar 1, 2026 Jack Dorsey just cut 4,000 people from Block — nearly half the company. His explanation: “We’re not making this decision because we’re in trouble. Our business is strong. Gross profit continues to grow.” The stock jumped 24%. A profitable company reduces labor, the market rewards it, and profits rise. That seems to be the logic. This is the same pattern everywhere. Microsoft saved hundreds of millions by replacing customer support with AI, cut over 10,000 jobs, reported record profits — and didn't lower the price of Office 365 by a cent. Salesforce cut support staff by nearly half and raised prices. Two days ago I published "The Corporate Benevolence Fantasy," which examines why AI-driven productivity gains won't trickle down — and why the K-shaped economy keeps splitting further apart. Block just provided the latest case study. Dorsey says most companies will reach the same conclusion within a year. He's probably right. So here we go again: who buys what we build when the builders are gone? Sources [1] Challenger, Gray & Christmas, “2025 Year-End Report: Highest Q4 Layoffs Since 2008.” Annual job cut data (1,206,374 total) and AI-attributed layoff figures (54,836 in 2025; 71,000+ since 2023). [2] Layoffs.fyi / TrueUp layoff tracker. Tech-sector layoff counts: 783 events affecting ~246,000 workers in 2025; 856 per day in early 2026. [3] InformationWeek, “2026 Tech Company Layoffs.” About 70% of global tech layoffs from U.S.-headquartered companies; Meta Reality Labs and Amazon corporate cuts. [4] CNBC, “Salesforce CEO Confirms 4,000 Layoffs,” September 2025. Marc Benioff podcast interview confirming support workforce reduction from 9,000 to ~5,000. [5] SalesforceBen, “How Bad Were Tech Layoffs in 2025?” Salesforce layoff totals rising from ~1,000 in 2024 to ~5,000 in 2025. [6] GeekWire, “Microsoft CEO Addresses Enigma of Layoffs Amid Record Profits.” Over 15,000 Microsoft layoffs in 2025; Satya Nadella memo on the “enigma” of cuts during record revenue ($70.1B) and 18% income growth. [7] Windows Central, “Microsoft’s 2025 Layoffs Revolve Around Its $80 Billion AI Infrastructure Investment.” [8] WealthWaggle, “Microsoft Layoffs 2025: Operator Lessons.” Microsoft finance executive at JPMorgan conference on “saving hundreds of millions” through AI customer support. [9] Harvard Business Review, “Companies Are Laying Off Workers Because of AI’s Potential, Not Its Performance,” January 2026. [10] Yahoo Finance, “Last Month Was the Worst January for Layoff Plans Since 2009.” January 2026: 108,435 announced job cuts. [11] The Henry Ford Museum, “Ford’s Five-Dollar Day.” January 1914 announcement of $5/day wages. [12] NPR, “The Middle Class Took Off 100 Years Ago — Thanks to Henry Ford.” Highland Park plant turnover at 380%; 52,000 hires needed for 14,000 positions; turnover disappearing after wage increase. [13] Kellogg School of Management, “Henry Ford’s Five-Dollar Day.” Workers boosted into the middle class with disposable income to buy Model Ts. [14] Fortune, “Forever Layoffs: Job Security in a K-Shaped Economy,” December 2025. Glassdoor data on employee mentions of “layoffs” and “job insecurity” exceeding March 2020 levels. [15] Economic Policy Institute, “The Productivity–Pay Gap.” Postwar productivity-pay lockstep through the 1970s, then divergence driven by policy choices. [16] Inequality.org, “Income Inequality.” Worker productivity up 80.9% vs. compensation up 29.4% from 1979 to 2024. [17] NAHB, “Priced Out: The Affordability Pyramid,” March 2025. Nearly 75% of U.S. households unable to afford a median-priced new home. [18] EconoFact, “Prospects for Improving Housing Affordability.” Median-priced home consuming 47% of median household income. [19] Bankrate, “Retirement Savings Report.” 58% of American workers report retirement savings behind schedule. [20] Economic Policy Institute, “CEO Pay.” CEO-to-worker pay ratio at 281:1, up from 21:1 in 1965. CEO pay up 1,094% since 1978; worker pay up 26%. [21] CBS News / Federal Reserve, “U.S. Wealth Gap Widest in Three Decades.” Top 1% owning 31.7% of all wealth (Q3 2025), ~$55 trillion in assets. Top 10% accounting for nearly half of all consumer spending. [22] Inequality.org, “Billionaire Wealth Concentration Is Even Worse Than You Imagine.” Bottom 50% of households holding just 2.5% of national wealth. [23] Cornell ILR / Scheinman Institute, “How Medical Debt Is Crushing 100 Million Americans.” CFPB data: 100 million Americans carrying $220 billion in medical debt; medical bills as primary cause in roughly two-thirds of personal bankruptcies. [24] Gallup, “Americans Borrow Estimated $74 Billion for Medical Bills in 2024.” 31 million Americans borrowing for healthcare in a single year. [25] CNBC, “Bridgewater’s Dalio Posts on AI, Wealth Gap, Capitalism,” July 2018. Dalio calling for a national emergency over capitalism’s failure to work for the majority. [26] Quartz, “Ray Dalio on Economy and Income Inequality.” Fortune Global Forum, October 2025. Warning about bottom 60% becoming an “extreme dependency” underclass. [27] Yahoo Finance, “Ray Dalio Calls for Wealth Redistribution.” [28] Fortune, “Sam Altman Told Me AI Should Be an Equalizing Force,” February 2026. [29] SFGate, “Sam Altman Grilled on Wealth Inequality.” San Francisco event confrontation over Jensen Huang’s net worth and food assistance cuts. [30] Douglas Rushkoff, Survival of the Richest, W.W. Norton, 2022. [31] Douglas Rushkoff, “Survival of the Richest,” original essay. The desert resort anecdote: five billionaires asking how to maintain authority over security forces after “the Event.” [32] The Conversation, “Billionaires Are Building Bunkers and Buying Islands.” Zuckerberg’s $270M Kauai compound: 1,400 acres, underground bunker, self-sustaining systems. [33] Interesting Engineering, “Tech Billionaires Building Doomsday Bunkers.” Reid Hoffman on “apocalypse insurance” properties in New Zealand. [34] CBC News, “Billionaire Bunkers: Doomsday.” Survival Condo, Oppidum, and Vivos luxury underground residences Share This Post Related Reading Who Fired You Stanford's 2026 AI Index shows a widening gap between what AI experts believe and what everyone else believes. Sarah Perez at TechCrunch treats it as a puzzle. It isn't. The experts are looking at what AI could do. The public is looking at what AI is being used to do to them. 'AI is taking jobs' is a grammatical evasion. My father's generation lost their livelihoods and kept their vocabulary: Krupp. Thyssen. The ministers in Bonn. Coal and Steel The comparison between AI and coal isn’t about technology. It’s about cognitive lock-in — what happens when an entire economy organizes around one assumption and can’t see the disruption because it’s inside it. Germany did everything right and still produced 38% poverty in Gelsenkirchen. That’s not the failure story. That’s the success story. The Corporate Benevolence Fantasy The promise that AI will make everything cheaper rests on one assumption — that corporations will pass their savings to consumers. The forty-year productivity-pay gap says they won't. The 2017 tax cut dress rehearsal says they won't. And $1.6 trillion in shareholder buybacks in a single year confirms they aren't. --- ### From Metalsmith to Eleventy - Porting an Actual Site - Werner Glinka https://www.wernerglinka.com/writing/from-metalsmith-to-eleventy-porting-an-actual-site/ CODING From Metalsmith to Eleventy - Porting an Actual Site Feb 10, 2026 In theory, migrating a site from Metalsmith to Eleventy should be straightforward, copy the content, adjust some configuration, done. Theory met practice when I ported my art website. The site isn't large: a homepage with an artwork carousel, sixteen individual artwork pages, a works gallery, five studio notes, a couple of press articles, and an about page. Twenty-seven pages total. All built with the same component architecture I'd developed over years of Metalsmith work. If any site should port cleanly, this one should. It mostly did. The interesting parts are where it didn't. The Content Migration The content files moved without modification. Both platforms use YAML frontmatter, and my pages define everything as structured sections rather than markdown body content. Copy the files, change the layout path in frontmatter from pages/sections.njk to sections.njk, and the content is ready. The data files—JSON defining the artwork carousel and gallery grid—moved just as easily. The asset files, several years of artwork photographs organized by year, copied over with their directory structure intact. The first build completed successfully. Thirty files written. That's when I started actually looking at what it produced. Navigation Showing Everything The main menu listed every page on the site. Home, Works, About, Studio Notes—but also every individual artwork page, every studio note post, every article. The navigation component was doing exactly what it was told: display all pages with a navLabel in their frontmatter. In Metalsmith, I'd used a menu plugin which allowed me to be selective about which pages got included in the navigation. In the Eleventy port, I'd copied all the frontmatter without thinking about what the normalization plugin would do with it. The normalized collections plugin builds the main menu from every page that declares a navigation label. Every page had one. The fix was simple: remove navLabel from pages that shouldn't appear in the main menu. Only four pages needed it—Home, Works, About, and Studio Notes. The rest were accessible through their parent sections, not through top-level navigation. Components Not Rendering The homepage carousel didn't appear. Neither did the works gallery grid. The sections were in the frontmatter, the components existed, but the sections rendered empty. The problem was data access patterns. The artist-slider component expected artwork data at data.artworks[section.artworks.source]. The image-grid component expected data[section.dataSource]. These paths assumed data would be accessible under a data namespace in templates. This is where the _data/data/ directory convention matters. Eleventy's data cascade makes any JSON file in _data/ available as a global variable named after the file. A file at _data/site.json becomes site in templates. But my components expected data under a data object—data.artworks, data.works, not just artworks or works at the root level. The solution: nest a data/ directory inside _data/. Files at _data/data/artworks/home-slider.json become accessible as data.artworks[''home-slider'']. The directory structure creates the namespace the components expect. It's ugly but a small price to pay for components compatibility. This convention, paired with the normalization plugin handling collection data shapes, forms the bridge between platforms. Metalsmith builds pass data explicitly through the pipeline. Eleventy's data cascade provides it automatically. The _data/data/ pattern makes both approaches resolve to the same access paths in templates. No component changes required. The components were already correct—they just needed the environment configured to deliver data where they expected to find it. Image Paths The works gallery rendered its grid layout, but the images showed only alt text. The thumbnails weren't loading. The image paths in works.json were relative: /2001/2001.01.004.jpg. The original Metalsmith build had resolved these against a base path. The Eleventy build didn't know to do that. I updated the paths to be fully qualified: /assets/images/artworks/thumbnails/2001/2001.01.004.jpg. Explicit paths that work regardless of how the build system handles path resolution. Component Naming The studio notes pages used a component called blog-navigation for previous/next links between posts. That component had been renamed to collection-links in the published component library—a more accurate name since it works for any collection, not just blogs. The fix was updating the frontmatter in all five studio notes pages to reference collection-links instead of blog-navigation, and downloading the renamed component. But then the collection links rendered empty. The component was hardcoded to look for collections[''blog''], and my collection was named studio-notes. I made the component configurable, adding support for a collectionName property with a default fallback to blog. Then added collectionName: ''studio-notes'' to each studio notes page. The component now works for any collection name, which is what it should have done from the start. What the Fixes Reveal Each problem pointed to an assumption that worked in one environment but not the other. The navigation issue revealed that I'd been relying on selective frontmatter rather than explicit configuration. The data access issue revealed assumptions about directory structure baked into component expectations. The image path issue revealed reliance on implicit path resolution. The component naming issue revealed hardcoded values that should have been configurable. None of these were Eleventy problems or Metalsmith problems. They were assumptions I'd made while building in one environment that didn't survive the move to another. The migration exposed them. Fixing them made the components more robust and more portable. The site works now. The carousel autoplays, the gallery grid displays justified layouts, the collection navigation links posts correctly. The build produces the same output it did on Metalsmith, but with less configuration and more of the pipeline handled by Eleventy's defaults. More importantly, I understand both platforms better than I did before. Metalsmith's explicitness taught me how static site generators work. Eleventy's conventions taught me where I'd been doing unnecessary work. The migration taught me which assumptions were load-bearing and which were incidental. The next post covers extending the site with capabilities I hadn't implemented in Metalsmith: a full bilingual version using Eleventy's i18n support. Share This Post Related Reading From Metalsmith to Eleventy - A Natural Progression Why I moved from Metalsmith to Eleventy for my art website, what carried over, and why the skills and mental models transfer between static site generators. From Metalsmith to Eleventy - Building a Bilingual Site Implementing a full English-German bilingual site with Eleventy, covering directory structure, language-aware navigation, breadcrumbs, a language switcher, and per-language collections. From Metalsmith to Eleventy - The Accidental Abstraction How a Metalsmith component library turned out to be a platform-agnostic Nunjucks library, and why the components ported to Eleventy without a single template change. --- ### From Metalsmith to Eleventy - The Accidental Abstraction - Werner Glinka https://www.wernerglinka.com/writing/from-metalsmith-to-eleventy-the-accidental-abstraction/ CODING From Metalsmith to Eleventy - The Accidental Abstraction Feb 3, 2026 People kept asking whether I'd looked at Eleventy. I hadn't, and I saw no reason to. Metalsmith worked. The component library worked. Why fix what wasn't broken? But eventually, out of curiousity, I tried porting the library to see what would happen. The port went faster than expected. Suspiciously fast. I kept waiting for the other shoe to drop—some fundamental incompatibility that would require rewriting everything. It never came. The components, all fifty-plus of them, rendered correctly on the first try. Not a single {% if %} or {{ variable }} needed modification. So it turned out that I hadn't created a Metalsmith component library. I'd created a Nunjucks component library that happened to run on Metalsmith. Eleventy uses Nunjucks too. The templating syntax, macros, includes, filters—all identical between the two platforms. The components were already platform-agnostic. What Makes a Component Portable The components don't know which static site generator built the page. They receive data, apply logic, render HTML. A hero component gets a title, some prose, maybe a call-to-action configuration. It outputs markup. What Static Site Generator assembled that data is irrelevant to the template doing the rendering. This works because of a deliberate constraint: no SSG-specific code inside templates. The components are pure Nunjucks. They transform structured input into structured output. Everything platform-specific stays outside the component boundary. That boundary matters. Cross it, reference an Eleventy-specific global, assume Metalsmith's file structure, and portability breaks. Keep the components focused on their single job of rendering data to markup, and they work anywhere Nunjucks works. The Data Shape Problem The components ported cleanly. The data access patterns didn't. Components expect data under a data namespace: data.products, data.artworks, etc. That's the convention that keeps them portable across SSGs. Metalsmith passes data explicitly through its pipeline, and I'd structured it to arrive under data. Eleventy's data cascade works differently: files in _data/ become globals named after the file. A file at _data/products.json becomes products in templates, not data.products. The solution: nest a data/ directory inside _data/. Files at _data/data/products.json become accessible as data.products. The directory structure creates the namespace components expect. No component changes required, just organizing files to produce the right shape. For collections, there was more work. Eleventy collections need previous/next navigation between items, a main menu built from pages with navigation labels, breadcrumb trails. In Metalsmith, dedicated plugins handle these. For Eleventy, I wrote a normalization plugin that adds this functionality, previous and next references on collection items, a mainMenu collection, breadcrumb data for each page. With the data convention and normalization plugin in place, templates work unchanged across both SSGs. Pages as Structured Data The component architecture enforces a particular way of thinking about content. Pages aren't documents with embedded elements. They're compositions of reusable sections, defined entirely in frontmatter: yaml--- layout: sections.njk sections: - sectionType: hero text: title: Welcome prose: A demonstration of structured content... ctas: - url: /about/ label: Learn More - sectionType: media-image text: title: How It Works prose: Each section is self-contained... image: src: /assets/images/diagram.jpg alt: Architecture diagram --- No markdown body. The page template loops through sections, dynamically including the appropriate Nunjucks component for each one. Hero, media block, testimonial, video embed—each is a section type with its own template, styles, and optional JavaScript. This changes how you think about content. You stop thinking about pages and start thinking about composable pieces. Content creators get flexible building blocks. Developers get maintainable architecture. Neither side can accidentally break what the other built. The trade-off is rigidity. You can't write freeform markdown and have it render wherever it lands. You define sections with explicit properties, and components render them predictably. For marketing sites, landing pages, and structured content, this works well. For long-form writing, you use a prose section that accepts markdown—structure where you need it, flexibility where you don't. Co-location and Bundling Every component lives in its own directory with everything it needs: textcomponents/sections/hero/ ├── hero.njk # Template ├── hero.css # Styles ├── hero.js # Behavior (optional) ├── manifest.json # Dependencies └── README.md # Documentation No hunting through scattered directories. No guessing which styles affect what. Update the hero section, and everything about it is in one place. The manifest declares dependencies: json{ "name": "hero", "type": "section", "styles": ["hero.css"], "scripts": [], "dependencies": ["ctas", "text", "image"] } A bundler plugin scans the site, identifies which components are actually used, resolves the dependency graph, and produces optimized CSS and JavaScript containing only what's needed. The Metalsmith version scans the build pipeline. The Eleventy version hooks into Eleventy's build process. Different implementations, identical output—the same abstraction pattern that makes the components themselves portable. What Transfers The architectural decisions prove more durable than any single tool. Structured frontmatter, data-driven components, separation of content and presentation, co-located assets with manifest-driven bundling—these patterns don't belong to Metalsmith or Eleventy. They're approaches to building maintainable sites that happen to work on both platforms. The Nunjucks templates transfer directly. The mental model of pages as section compositions transfers. The habit of keeping platform-specific code outside component boundaries transfers. Even the build tooling transfers in concept, if not in implementation. When I wrote in the previous post that skills transfer between static site generators, this is what I meant. Not just general familiarity with the problem space, but specific, working code that runs in both environments. The investment doesn't evaporate when you change platforms. It travels with you. Trying It The component library and starters for both platforms are available: Eleventy Structured Content Starter Metalsmith Structured Content Starter Normalized Collections Plugin for Eleventy Component Bundler for Eleventy Clone a starter, run npm install and npm start, modify some sections in the frontmatter. The components don't care which generator you chose. They render HTML from data—exactly as they should. The next post walks through applying this to an actual migration: porting my art website from Metalsmith to Eleventy, including what broke and what the fixes revealed about each platform's assumptions. Share This Post Related Reading From Metalsmith to Eleventy - A Natural Progression Why I moved from Metalsmith to Eleventy for my art website, what carried over, and why the skills and mental models transfer between static site generators. From Metalsmith to Eleventy - Porting an Actual Site The practical experience of migrating an art website from Metalsmith to Eleventy, including navigation issues, data access patterns, and what the fixes revealed about platform assumptions. Metalsmith Redux - The Next Chapter From blog series to living infrastructure. The Metalsmith Component Library has grown, and we're building a SKILL that lets Claude guide beginners through creating real websites. --- ### From Metalsmith to Eleventy - A Natural Progression - Werner Glinka https://www.wernerglinka.com/writing/from-metalsmith-to-eleventy-a-natural-progression/ CODING From Metalsmith to Eleventy - A Natural Progression Jan 27, 2026 For the past several years, Metalsmith has been my static site generator of choice. I built client sites with it, created starters, wrote plugins, and lately published a "Metalsmith in 2025" blog series. The tool taught me a lot about how static sites work under the hood—its transparent, pipeline-based architecture forces you to understand every step of the build process. It also helped keep my sanity amid the framework explosion that has inundated developers. That understanding doesn't go away when you move to a different tool. It travels with you. I recently rebuilt my art website using Eleventy, and I want to share why I made that shift and what it looked like in practice. Why Move? Metalsmith is elegant. Its core idea—files in, transformations applied, files out—is as clean as it gets. But elegance alone doesn't sustain a project. The community has thinned, plugin maintenance has slowed, and I found myself solving problems that other ecosystems had addressed years ago. I wasn't looking to abandon Metalsmith. I was looking to apply what I'd learned somewhere with more momentum. Eleventy turned out to be that place. It shares Metalsmith's philosophy of transparency and simplicity, but with a larger community, active maintenance, and sensible defaults for the things I was rebuilding from scratch in every Metalsmith project. What Carried Over The component architecture I developed for Metalsmith—frontmatter-driven sections, co-located styles and scripts, dynamic template composition—wasn't tied to Metalsmith at all. It was a Nunjucks pattern that happened to run on Metalsmith. Porting it meant writing an Eleventy-compatible bundler plugin and adjusting some variable names. The components themselves, all fifty-plus of them, work in both environments. I've since published them as a standalone library at nunjucks-components.com, available for any Nunjucks-based static site generator. The build pipeline I'd copied from project to project in Metalsmith? Most of it is built into Eleventy. Less to maintain, fewer decisions to make on each new project. What's Different Eleventy's data cascade takes some getting used to. In Metalsmith, you explicitly pass data through the pipeline and into templates. In Eleventy, data from _data files is available automatically in templates. This is convenient but requires understanding the cascade's inheritance rules. Nunjucks macro scope isolation works the same way—macros don't inherit template scope—but Eleventy's richer data environment means you think about it differently. I settled on passing a single context object to macros rather than long parameter lists, with data files organized under _data/data/ to keep namespacing clean. What's Next This post is the first in a short series. I'll follow up with the story of how the component library turned out to be platform-agnostic—an accidental abstraction that made the migration possible—and then walk through the actual process of porting my art website, including building a bilingual version and implementing SEO using Eleventy's native capabilities. If you're a Metalsmith user wondering whether to explore other options: the skills transfer. The mental models transfer. You're not starting over; you're applying what you know in a new context. And if you're happily building with Metalsmith: keep going. It still works. The choice to move isn't about Metalsmith being wrong—it's about finding where the momentum is for the kind of work you want to do. Share This Post Related Reading From Metalsmith to Eleventy - Porting an Actual Site The practical experience of migrating an art website from Metalsmith to Eleventy, including navigation issues, data access patterns, and what the fixes revealed about platform assumptions. From Metalsmith to Eleventy - Building a Bilingual Site Implementing a full English-German bilingual site with Eleventy, covering directory structure, language-aware navigation, breadcrumbs, a language switcher, and per-language collections. From Metalsmith to Eleventy - The Accidental Abstraction How a Metalsmith component library turned out to be a platform-agnostic Nunjucks library, and why the components ported to Eleventy without a single template change. --- ### Scheduled Publishing for Static Sites - Werner Glinka https://www.wernerglinka.com/writing/scheduled-publishing-for-static-sites/ CODING Scheduled Publishing for Static Sites Jan 12, 2026 Static site generators produce a frozen snapshot of your content at build time. This is their strength—fast, secure, easy to host—but it creates a challenge when you want content to appear on a specific future date. There is no server running to check the calendar and decide what to show. Whatever exists at build time is what gets published. This limitation surfaces in different contexts. For writers who like to batch their work—writing several posts when inspiration strikes and then spacing out publication—it means either keeping drafts somewhere and remembering to publish them manually, or committing and deploying on the exact day each post should go live. Neither fits a workflow where you want to write freely and let the publishing take care of itself. In business contexts, the stakes are higher. Product launches, press releases, and partnership announcements often need to go live at a precise date and time, coordinated with other marketing activities. When I was building sites for corporate clients, this came up repeatedly. Legal and PR teams don't want to hear that someone needs to manually push a button at 9 AM Eastern on announcement day. They want the content staged and ready, with confidence that it will appear exactly when planned. Available Approaches Several solutions exist, each with trade-offs. Manual publishing is the simplest. Keep a draft: true frontmatter flag, and when you're ready to publish, set it to false and deploy. This works, but it requires someone to act at the right moment. For a personal blog, that might mean fifty-two minor interruptions per year. For a business announcement, it means someone's morning depends on not forgetting. Headless CMS with scheduling is another option. Services like Contentful, Sanity, or Netlify CMS can trigger builds when scheduled content becomes due, sometimes down to the minute. This adds infrastructure and moves your content out of your repository, which may or may not suit your preferences. For teams already using a headless CMS, this is often the path of least resistance. Serverless functions can check dates at request time and return appropriate content. This works, but it undermines the static site model—you're essentially adding a dynamic layer that requires maintenance and costs to operate. It also introduces latency and potential points of failure. Scheduled builds take a different approach. Instead of checking dates at request time, you rebuild the site periodically and let the build process decide what to include. If you rebuild daily, content scheduled for today appears in today's build. The site remains fully static between builds. For tighter timing, you can increase the build frequency—hourly builds give you hourly granularity. The Scheduled Build Approach For my Metalsmith blog, I went with scheduled builds. The implementation has two parts: a plugin that filters content by date and an automated trigger that rebuilds the site daily. The key insight is that you don't need a separate draft property alongside a scheduled date. The scheduled date itself tells you everything: if it's in the future, exclude the content; if it's today or past, include it. One property serves as the single source of truth, preventing confusion when draft: true appears in a file that's been live for months. The inline plugin runs early in the build pipeline: javascript.use((files, metalsmith, done) => { if (!isProduction) { done(); return; } const today = new Date(); today.setHours(0, 0, 0, 0); for (const filepath of Object.keys(files)) { const scheduledDate = files[filepath].scheduledDate; if (!scheduledDate) { continue; } const scheduled = new Date(scheduledDate); scheduled.setHours(0, 0, 0, 0); if (scheduled > today) { delete files[filepath]; } else { delete files[filepath].scheduledDate; } } done(); }) Files without a scheduledDate pass through unchanged and are published immediately. Files with a future date are removed from the build. Files whose due date has arrived are included, with the scheduling metadata cleaned up so they don't appear in the rendered output. The development check at the top means scheduled content remains visible when working locally. You can preview everything regardless of dates, but production builds respect the schedule. For the daily trigger, GitHub Actions provides free cron-based workflows. A simple workflow file pings a Netlify build hook every morning: yamlname: Scheduled Build on: schedule: - cron: ''0 6 * * *'' workflow_dispatch: jobs: trigger: runs-on: ubuntu-latest steps: - name: Trigger Netlify build run: curl -X POST -d {} ${{ secrets.NETLIFY_BUILD_HOOK }} Netlify build hooks are URLs that trigger a deploy when called. You create one in your site settings, store it as a GitHub secret, and the workflow handles the rest. The workflow_dispatch trigger allows manual builds from the GitHub interface when you don't want to wait for the schedule. Using It Adding scheduled content is straightforward. Set scheduledDate in frontmatter to the date the post should go live: yaml--- title: My Scheduled Post scheduledDate: 2026-02-15 layout: blog-post.njk --- When the daily build runs on February 15, 2026, or any day after, this post will be included. Before that date, it simply doesn't exist on the built site. For content that should be published immediately, omit scheduledDate entirely. The plugin ignores files without the property. Eleventy Equivalent The same approach works for Eleventy using computed data. In a directory data file, check scheduledDate and set permalink: false for future content: javascriptmodule.exports = { eleventyComputed: { permalink: (data) => { if (shouldExclude(data)) { return false; } return data.permalink; }, eleventyExcludeFromCollections: (data) => { return shouldExclude(data); }, }, }; function shouldExclude(data) { if (process.env.NODE_ENV === ''development'') { return false; } if (data.scheduledDate) { const today = new Date(); today.setHours(0, 0, 0, 0); const scheduled = new Date(data.scheduledDate); scheduled.setHours(0, 0, 0, 0); return scheduled > today; } return false; } The GitHub Actions workflow remains identical because it simply triggers a build regardless of which generator you use. Scaling to Tighter Timing For business announcements that need to go live at a specific hour, the same architecture scales by adjusting the cron schedule. Hourly builds give you hourly precision: yamlon: schedule: - cron: ''0 * * * *'' # Every hour on the hour You could extend the plugin to check times as well as dates if needed. The frontmatter might become scheduledDate: 2026-02-15T09:00:00-05:00 to specify 9 AM Eastern. The comparison logic remains similar—parse the datetime, compare it to now, and include or exclude accordingly. For truly critical timing where even an hour's variance is unacceptable, a headless CMS with minute-level scheduling or a small serverless function might be more appropriate. But for many business needs, hourly builds strike a reasonable balance between precision and simplicity. Local Scheduling with macOS If you prefer keeping everything local without external services, macOS offers a few options for triggering builds on a schedule. Lingon (from peterborgapps.com/lingon) provides a GUI for macOS's launchd system. You point it at a shell script, set a schedule, and it runs reliably in the background—even when you're logged out or no apps are open. This is the closest thing to a proper cron job on macOS and the most reliable local option. The script itself is simple: bash#!/bin/zsh curl -X POST https://api.netlify.com/build_hooks/YOUR_HOOK_ID Make it executable with chmod +x netlify-build.sh and configure Lingon to run it on your preferred schedule. Calendar can also trigger builds if you don't want to install additional software. Calendar events can open files when they fire, so the same shell script works (use the .command extension so macOS executes it in Terminal). Create an event, add a custom alert set to "Open file," and point it at your script. You can enhance the script with logging and notifications: bash#!/bin/zsh LOG="$HOME/netlify-build.log" if curl -fsS -X POST https://api.netlify.com/build_hooks/YOUR_HOOK_ID; then echo "$(date): build triggered" >> "$LOG" else echo "$(date): build FAILED" >> "$LOG" osascript -e ''display notification "Netlify build failed" with title "Calendar Build"'' fi The limitation is that Calendar must be running and your Mac awake—if your laptop is closed or asleep, the event won't fire. For casual personal use this is often fine, but it's not as dependable as Lingon or GitHub Actions. Bookmarklets offer the most portable option. Save this as a bookmark: javascriptjavascript:fetch(''https://api.netlify.com/build_hooks/your-hook-id'',{method:''POST''});void(0) One click triggers the build from any browser. This works on any device—Mac, iPad, phone—wherever you have a browser. It's manual rather than scheduled, but sometimes that's exactly what you want. Years ago, I used this approach after a service outage made an executive nervous about an upcoming press release. She didn't want to depend on automated systems or wait for someone else to be available at the critical moment. We added the bookmarklet to her browser, and she triggered the build herself early that morning. Sometimes the simplest solution is the most reliable one. None of these local approaches travel as well as GitHub Actions. If your Mac is off, asleep, or you're away with only a phone, the scheduled builds won't happen. For guaranteed daily builds regardless of circumstances, a server-side solution remains the most dependable choice. But for writers who are typically at their desk and want to avoid external dependencies, local scheduling works well. Considerations GitHub Actions scheduled workflows aren't guaranteed to run at exact times. If their runners are busy, your build might be a few minutes late. For daily blog publishing, this is negligible. For a product launch coordinated with a press release, you should trigger the build slightly early and let the content filtering handle the rest, or use a more reliable trigger mechanism. If you're working on a series of connected posts, consider keeping them in a branch until you're satisfied with all of them. Merge to main when they're ready, and let the scheduled dates roll them out. That way, your main branch doesn't contain half-finished thoughts even if they're not yet being published. This approach works best when you control the entire pipeline. If you're collaborating with others, make sure everyone understands that scheduledDate determines publication. The absence of a visible draft flag might confuse contributors who expect to see it. For business sites with compliance requirements, document the scheduling mechanism so stakeholders understand how and when content goes live. The simplicity of the approach—a date in frontmatter, a daily build—is easy to explain and audit. Share This Post Related Reading The JavaScript Framework Carousel Developers celebrate migrating blogs to Astro or Next.js, describing complex build processes as 'easier than React.' But why does a blog need to fly? Sometimes simple tools are the sophisticated choice. Metalsmith Redux - Static Site Generation in 2025 Let's talk about Metalsmith. It's a static site generator that's been around for a while, and for good reason. Metalsmith keeps things simple and stable. It's particularly good for the kind of sites most of us actually build day-to-day. Beyond Markdown: Building Sectioned Webpages Instead of starting with content and adding MDN components, what if we began with components and composed them into pages? --- ### The Other Side of Things - Werner Glinka https://www.wernerglinka.com/writing/the-other-side-of-things/ ART The Other Side of Things Feb 3, 2026 My life as an artist began when I moved to the Santa Cruz Mountains. One day, while walking near my home, I spotted a fallen madrone leaf. It was dying - yellow and green, speckled with tiny black spots from disease - and absolutely beautiful. I thought "this really wants to be framed". That's when I started experimenting. I grew up in Gelsenkirchen, an industrial town in Germany's Ruhr Valley: coal mines, steel plants, smog warnings. My father was a coal miner. There was no money for museums. But I was always building things - basket weaving and painting in a youth group, then an apprenticeship as an electrician, then an electrical engineering degree. I've been an artist all my life, but I wouldn't have used that word. When I moved to California in 1981, I made wire sculptures for years, but nothing serious came of it. The Santa Cruz Mountains changed that. The natural surroundings, the close-knit community of mountain folk, many of them artists themselves - something ignited. The dying madrone leaf gave me a way in. The work I made drew from two influences that shouldn't fit together but somehow do: the industrial landscape of my childhood and a minimalism shaped by Bauhaus and Japanese aesthetics. Metal banding from construction sites next to pressed leaves. Rusted fence wire against river stones. The tension between industrial and organic became the point. Showing the work Over the next decade, I exhibited at the Peninsula Museum of Art, Stanford Art Spaces, the Mountain View Center for the Performing Arts, the German Consulate in San Francisco, the Triton Museum, galleries in Sausalito and San Jose. My work ended up in private collections in the US, Japan, and Europe. Then life intervened — career demands, a cross-country move, the weight of daily obligations. The studio went quiet. For ten years, I didn't make art. Coming back I thought I was done. Then a friend's emails about her own creative process stirred something. The desire to make things - I'd assumed it had quietly retired along with me. It hadn't. It was just waiting. My wife and I moved to Minneapolis a few years ago. Recently, I found a studio space at the Center for People and Craft, an urban folk school in the Loring Park neighborhood. It's modeled on the historic Danish folk school tradition — community connection, traditional crafts, and intergenerational learning — the right place to start again. I'm experimenting with materials people don't typically associate with serious art. Cardboard. Paper mache clay. Hardware store finds. The raw edges and surface texture of corrugated cardboard react to light in ways that interest me. Part of this new phase is taking humble materials seriously - finding out what they can do, what they want to become. Two practices, same thinking Writing this, I notice the overlap between how I approach web development and how I approach art. Both are about working with constraints. Both prefer simplicity to complexity. In the Metalsmith series, I've argued for using the platform - native web technologies over framework abstractions, stability over churn. In the studio, I use found materials rather than expensive art supplies, letting the materials' character show rather than hiding it. There's also something about building things from components. A Metalsmith page assembles sections: hero, text block, media, and call to action. An assemblage arranges elements - metal, wood, stone, and leaf. Both are acts of composition, finding relationships between parts. OK, that might be a stretch. Maybe they're just two things I do. But the impulse feels the same: make something coherent from discrete pieces, keep it honest, get out of the way. Also available on Substack. Share This Post Related Reading The Shapes That Stay In "The Other Side of Things," I wrote about returning to art-making after a ten-year hiatus. What surprised me is that some things apparently never left. The Boats That Found Me The stadium form came from Gelsenkirchen — from Schalke, from the industrial geometry of the Ruhrpott. But another shape found me in California, and it came from the water. --- ### Metalsmith Redux - The Next Chapter - Werner Glinka https://www.wernerglinka.com/writing/metalsmith-redux-the-next-chapter/ CODING Metalsmith Redux - The Next Chapter Jan 6, 2026 The Metalsmith Redux series concluded with a validated thesis: simplicity scales better than complexity, and the platform is enough. We demonstrated that component-based static sites built on Metalsmith's stable foundation can handle sophisticated requirements without framework overhead. That was October 2025. Since then, the infrastructure has continued to evolve. The Component Library has grown significantly. And we're now working on something that feels like a natural culmination of everything the series explored: a SKILL that enables Claude to guide complete beginners through building websites via conversation. The Component Library Today metalsmith-components.com has evolved from documentation into a comprehensive distribution system. It now includes dozens of section components—heroes, media sections, testimonials, CTAs, feature grids, pricing tables, accordions, and more. Each component has its own reference page that explains what it does, which properties it accepts, and how to configure it. Every component is downloadable as a ZIP archive that contains the Nunjucks template, CSS, JavaScript (when needed), a manifest declaring dependencies, and an install script. The install script handles dependency chains automatically. If a hero component requires an icon partial that isn't in your project, the script fetches and installs it. No manual dependency management, no configuration files to maintain. The repository is open on GitHub. Suggestions and pull requests are welcome. The goal has always been to build something others can use and extend. Building a SKILL for Claude Here's where the story takes an interesting turn. Claude Code supports SKILLS—structured documents that teach Claude specific workflows and methodologies. We're developing a SKILL that lets Claude help newcomers build Metalsmith websites through conversation alone. The workflow looks like this: Someone opens Claude Code in an empty folder and says, "I want to build a website for my photography business." Claude guides them through a discovery conversation—what's the site's purpose, what should visitors see first, what actions should they take. Based on those answers, Claude sets up the project, downloads the appropriate components from the library, creates pages with the correct frontmatter structure, and iterates on feedback. I've tested this extensively. I built a complete five-page website for a fictional PR firm called "WeCommunicate" through conversation alone. The process revealed friction points: background colors not applying correctly due to missing CSS classes, components expecting data in specific file locations, and the development server not detecting changes to data files. Each friction point fed back into improvements—to the SKILL, to the starter repository, to the component library's install scripts. How the SKILL Works The SKILL isn't magic. It's a document that teaches Claude how the component system works: where files go, what patterns to follow, what questions to ask during discovery, and how to troubleshoot common issues. It references the component library documentation, the starter repository structure, and the manifest system that enables dependency resolution. What makes this effective is the same thing that made the component architecture work in the first place: explicit, well-documented structure. When Claude fetches a component, it knows exactly what files will arrive, what the manifest describes, and what properties each section accepts. The structured frontmatter that humans find readable is precisely the kind of explicit, machine-parseable format that enables AI assistance. The SKILL includes phases: environment check, project setup, discovery dialog, component selection, iterative page building, and deployment guidance. It emphasizes not skipping the discovery phase—rushing to build without understanding what the site needs produces worse results than taking time to ask the right questions first. The Collaboration Pattern This entire infrastructure emerged through collaboration with Claude. The Bundled Components plugin wasn't built from a specification. It evolved through exploratory dialogue—kicking the tires, discussing edge cases, letting patterns emerge organically. The manifest system, the validation logic, and the dependency resolution—none of these were planned up front. They developed through iterative conversation. The SKILL followed the same pattern. Initial versions missed things. Testing revealed gaps. Each gap became a learning opportunity, documented and fed back into refinements. The friction points from building WeCommunicate became explicit guidance in the SKILL: always add the first-section class to heroes below fixed headers, use data files via source references rather than inline frontmatter for blurbs, restart the server after adding new data files. This is what AI-assisted development actually looks like. Not code generated on command, but a methodology that emerges from doing the work together. Why This Matters The series demonstrated that you don't need complex frameworks to build component-based sites. The SKILL takes this further: you don't need to understand the internals to benefit from the architecture. Someone who's never touched Metalsmith, never written YAML frontmatter, never configured a build pipeline can still produce a real, deployable website—because Claude knows how all the pieces fit together. The same principles that made Metalsmith a joy to work with—simplicity, modularity, explicit configuration—turn out to be precisely what make it AI-friendly. Not because the system was designed for AI, but because good architecture serves everyone who works with it. Looking Forward The SKILL is designed for Claude Code running in VS Code. As Claude Desktop's capabilities evolve—particularly around GitHub connectivity—simpler paths for non-technical users may emerge. The infrastructure supports this: the component library serves ZIP files via HTTP, the starter repository is public, and deployment to Netlify requires only a GitHub account and a few clicks. The component library continues to grow. The starter repositories are maintained based on real-world testing. The SKILL improves with each iteration. What started as a blog series reintroducing Metalsmith has become a complete system for building websites—from the foundational architecture to the component distribution to the conversational workflow that ties it all together. Each piece reinforces the others. The structured approach that makes components portable also makes them machine-readable. The manifest system that enables intelligent bundling also enables intelligent installation. The explicit configuration that humans can understand also enables AI assistance. This is web development that compounds. The Component Library showcases what's possible. The Structured Content Starter and Bundled Components plugin provide the tools. The Component Builder SKILL opens the door for newcomers. Questions about building websites with Metalsmith? Find me on Bluesky. Share This Post Related Reading Metalsmith Redux: Conclusion Metalsmith Redux began with a simple premise: amid framework overload, reintroduce Metalsmith as an example of stability and simplicity in an ecosystem obsessed with complexity. From Metalsmith to Eleventy - A Natural Progression Why I moved from Metalsmith to Eleventy for my art website, what carried over, and why the skills and mental models transfer between static site generators. Metalsmith Redux - Static Site Generation in 2025 Let's talk about Metalsmith. It's a static site generator that's been around for a while, and for good reason. Metalsmith keeps things simple and stable. It's particularly good for the kind of sites most of us actually build day-to-day. --- ### Building Advanced Search for Metalsmith - Werner Glinka https://www.wernerglinka.com/writing/building-advanced-search-for-metalsmith/ CODING Building Advanced Search for Metalsmith Nov 7, 2025 While writing the blog series Metalsmith Redux, I built a companion website that serves as a library of structured content sections. Very soon, it became clear that a search function was needed to find the things I was writing about. However, while Metalsmith delivers performance and security, search is somewhat challenging. They say "there is a plugin for that," but not so much for search. I discovered that the existing search plugins were ancient—most hadn't been updated in years and were effectively abandoned. Rather than settle for outdated solutions, I built a new plugin using Fuse.js as the foundation. Fuse.js is an excellent library for this purpose—it provides fuzzy search capabilities crucial for handling user typos and variations —and unlike the old plugins, it's actively maintained and supported. Once I had the plugin built and generating search indexes, I had an excellent foundation to work with. That's where this story really begins. The Search Challenge for Static Sites Static site owners have always faced an uncomfortable choice when implementing search. External services, such as Algolia, provide excellent search capabilities but introduce dependencies, ongoing costs, and potential privacy concerns. Google Custom Search is free, but it comes with ads, tracks users, and offers limited customization options. What's been missing is a self-contained solution that provides the complete search experience users expect from modern websites—instant results, fuzzy matching, relevance ranking, and contextual highlighting—while maintaining the simplicity, privacy, and performance benefits of static hosting. This is exactly what the metalsmith-search plugin delivers. The Challenge Building search for static sites presents unique challenges. Without a server-side database to query, we need to maintain fast page load times while delivering relevant search results. Most importantly, we aim for a user experience that seamlessly connects search results to the actual content on the page. The solution involves generating a search index at build time and implementing intelligent client-side search with contextual highlighting. This approach gives us the best of both worlds: the performance of static sites with the interactivity users expect. Quick Start bashnpm install metalsmith-search fuse.js Add to your Metalsmith build after HTML generation: javascript.use(search({ fields: { title: 10, content: 1, tags: 6 }, output: ''search-index.json'' })) Complete implementation guide and options at github.com/wernerglinka/metalsmith-search Enter metalsmith-search The metalsmith-search plugin generates a search index during the build process directly from the generated HTML. It generates lightweight JSON for fast loading while maintaining page metadata for rich search results. The structured data it produces makes it straightforward to build sophisticated search interfaces that can be triggered from anywhere on the site. Implementation Overview The implementation consists of three main components working together. First, we generate the search index at build time using metalsmith-search, which processes the final HTML output of each page. We then implement client-side search using Fuse.js for fuzzy matching, accessible via a search button located in the header of every page. Finally, we added search term highlighting, which enables users to easily spot search results within the actual content, creating a cohesive experience across the entire site. Setting Up metalsmith-search First, configure the plugin in your Metalsmith build: javascriptconst search = require(''metalsmith-search''); metalsmith .use(search({ // Configure which fields to index fields: { title: 10, // Higher weight for titles content: 1, // Base weight for content tags: 6 // Medium weight for tags }, // Output file location output: ''search-index.json'', // Additional metadata to include includeMetadata: [''url'', ''date'', ''type''] })); This generates a JSON file containing all the content in a searchable format. The weighting system ensures that matches in titles and tags rank higher than matches in body content, providing more relevant results. Building the Search Interface The Metalsmith Components Library demonstrates two complementary search implementations. A dedicated search page offers a focused search experience, with the interface always visible, making it ideal for documentation sites where search is a primary navigation method. An example can be found in the references section. The more common pattern places a search icon in the header navigation that reveals a search panel when clicked, keeping the interface clean while making search instantly accessible from any page. This is implemented as the library's site search. Header Search Icon with Panel The library's search implementation remains unobtrusive, displaying only a search icon in the page header. Clicking this icon triggers the full search panel to fade in while the header icon fades out. The panel reveals an input field alongside the same search icon, which now serves as the submit button. After the user enters their search term and clicks submit, they're directed to the results page. html Dedicated Search Page For sites where search serves as the primary navigation, such as documentation sites, the search results page can function as a standalone entry point. This approach skips the header icon entirely. Instead, the page displays the search partial directly, allowing users to enter and submit their search terms immediately upon arrival. html

    Search Documentation

    Both approaches use the same search partial component, ensuring consistency while serving distinct needs. The stand-alone page works well for direct access, whether through navigation links or bookmarked URLs. The header panel handles the more common scenario of quick searches during browsing. JavaScript Search Implementation Both search implementations share the same core functionality, with slight initialization differences: For header search panel - initialize when panel opens javascriptdocument.querySelector(''.search-trigger'')?.addEventListener(''click'', async () => { const panel = document.getElementById(''search-panel''); panel.setAttribute(''aria-hidden'', ''false''); await initializeSearch(); document.getElementById(''search-input'').focus(); }); For dedicated search page - initialize immediately javascriptif (document.body.classList.contains(''search-page'')) { await initializeSearch(); } // Shared initialization function async function initializeSearch() { // Load search index if not already loaded if (!window.searchIndex) { const response = await fetch(''/search-index.json''); window.searchIndex = await response.json(); // Initialize Fuse.js with the index window.fuse = new Fuse(window.searchIndex.entries, { keys: [ { name: ''title'', weight: 10 }, { name: ''content'', weight: 1 }, { name: ''tags'', weight: 6 } ], threshold: 0.3, includeMatches: true, minMatchCharLength: 2 }); } } // Debounced search function for performance const performSearch = debounce((query) => { if (query.length < 2) { clearResults(); return; } const results = window.fuse.search(query); displayResults(results, query); }, 300); The fuzzy search capability means users don't need to remember exact phrases. They can still search for "metlsmith" and find results for "Metalsmith", making the search more forgiving and user-friendly. The debounced search function prevents excessive processing during typing, improving performance, especially on slower devices. The Magic: Search Term Highlighting Here's where our implementation becomes particularly interesting. When users click search results, we add a query parameter to track what they searched for. This creates a connection between the search interface and the found search term on the destination page. urlhttps://ms-components-library.netlify.app/blog/installing-metalsmith-components/?highlight=com#installing-metalsmith-components Enhanced Search Results javascriptfunction displayResults(results, query) { const resultsHTML = results.map(result => { const item = result.item; // Add highlight parameter to URL const url = new URL(item.url, window.location.origin); url.searchParams.set(''highlight'', query); const highlightUrl = url.pathname + url.search + url.hash; return `

    ${item.title}

    ${item.excerpt}

    `; }).join(''''); document.getElementById(''search-results'').innerHTML = resultsHTML; } Client-side Page Highlighting On every page, we check for the highlight parameter and automatically highlight matching terms using the browser's native TreeWalker API: javascriptdocument.addEventListener(''DOMContentLoaded'', () => { const urlParams = new URLSearchParams(window.location.search); const highlightTerm = urlParams.get(''highlight''); if (highlightTerm && highlightTerm.trim().length >= 2) { highlightPageContent(highlightTerm.trim()); showClearButton(); } }); function highlightPageContent(searchTerm) { // Use TreeWalker for efficient text node traversal const walker = document.createTreeWalker( document.body, NodeFilter.SHOW_TEXT, { acceptNode: function(node) { const parentTag = node.parentElement.tagName.toLowerCase(); if ([''script'', ''style'', ''mark''].includes(parentTag)) { return NodeFilter.FILTER_REJECT; } if (node.textContent.toLowerCase().includes(searchTerm.toLowerCase())) { return NodeFilter.FILTER_ACCEPT; } return NodeFilter.FILTER_REJECT; } } ); const textNodes = []; let node; while (node = walker.nextNode()) { textNodes.push(node); } textNodes.reverse().forEach(textNode => { highlightTextNode(textNode, searchTerm); }); } function highlightTextNode(textNode, searchTerm) { const text = textNode.textContent; const regex = new RegExp(`(${searchTerm.replace(/[.*+?^${}()|[\]\\]/g, ''\\$&'')})`, ''gi''); if (regex.test(text)) { const highlightedHTML = text.replace(regex, ''$1''); const temp = document.createElement(''div''); temp.innerHTML = highlightedHTML; const fragment = document.createDocumentFragment(); while (temp.firstChild) { fragment.appendChild(temp.firstChild); } textNode.parentNode.replaceChild(fragment, textNode); } } The TreeWalker API provides efficient DOM traversal, and by processing nodes in reverse order, we avoid issues where DOM mutations affect subsequent nodes. This approach is significantly faster than recursive DOM traversal, especially on content-heavy pages. Styling the Highlights Add CSS to make highlighted terms visually distinct: cssmark[data-highlight] { background: var(--color-highlight, #fef08a); color: var(--color-text-primary); padding: 0.1em 0.2em; border-radius: 0.2em; font-weight: var(--font-weight-medium); } .clear-highlights-button { position: fixed; top: var(--space-lg); right: var(--space-lg); background: var(--color-background-secondary); color: var(--color-text-secondary); border: 1px solid var(--color-border); border-radius: var(--border-radius); padding: var(--space-xs) var(--space-sm); cursor: pointer; z-index: 1000; transition: all 0.2s ease; } User Experience Enhancements Auto-scrolling to First Match Adding a hash fragment that targets the first highlighted term further enhances the experience. When users arrive at the page, it scrolls directly to the first occurrence of their search term rather than leaving them at the top of the page searching for the highlights. Handling Hash Fragments When your URLs include hash fragments for section navigation, place the highlight parameter before the hash: javascriptconst url = new URL(item.url, window.location.origin); url.searchParams.set(''highlight'', query); const highlightUrl = url.pathname + url.search + url.hash; This preserves both behaviors. Users jump to the target section while their search terms remain highlighted throughout the page. Clearing Highlights Once users find what they're looking for, they need a way to remove the highlights: javascriptfunction showClearButton() { const button = document.createElement(''button''); button.className = ''clear-highlights-button''; button.innerHTML = ''✕ Clear highlights''; button.addEventListener(''click'', () => { window.location = window.location.pathname; }); // Also respond to Escape key document.addEventListener(''keydown'', (event) => { if (event.key === ''Escape'') { window.location = window.location.pathname; } }); document.body.appendChild(button); } The function creates a visible, Clear highlights button that returns the page to it regular appearance. Performance Considerations The implementation prioritizes efficiency at every step. TreeWalker offers a more efficient traversal method than recursive DOM walking. By filtering to process only text nodes containing the search term, we minimize unnecessary operations. Processing nodes in reverse order avoids DOM mutation issues that could affect subsequent nodes. Debouncing search input prevents excessive processing during typing. The highlight script only runs when needed, triggered by the presence of a query parameter. The entire highlighting implementation requires no additional libraries, keeping the bundle size minimal. Conclusion Combining metalsmith-search with client-side highlighting creates a powerful, user-friendly search experience that maintains all the performance benefits of static sites while providing the interactivity users expect. The metalsmith-search plugin is available on npm and GitHub. See it in action at the Metalsmith Components Library, where this search system powers documentation discovery across hundreds of component examples. Questions about the plugin? Find me on Bluesky. Share This Post Related Reading Metalsmith Plugin Template While working on the blog series Metalsmith Redux (Static Site Generation in 2025), I developed several new plugins with the assistance of Claude AI, which led me to create a standardized template for Metalsmith plugins. Introducing Metalsmith SEO The Metalsmith SEO plugin automatically generates HTML meta tags, Open Graph properties, Twitter Cards, JSON-LD structured data, a robots.txt file and a sitemap from a single source of truth. The Missing Piece: Bundled Components Plugin Building a Metalsmith plugin with Claude revealed that effective AI collaboration isn't about prompt engineering—it's about exploring problems through dialogue until solutions emerge naturally. --- ### Metalsmith Redux: Conclusion - Werner Glinka https://www.wernerglinka.com/writing/metalsmith-redux-conclusion/ CODING Metalsmith Redux: Conclusion Oct 30, 2025 In May 2025, I started a series about Metalsmith, the static site generator. We began with a simple premise: amid framework overload, reintroduce Metalsmith as an example of stability and simplicity in an ecosystem obsessed with complexity. This wasn't about revisiting old tools. Through careful exploration, we guided you toward a more efficient way to build websites—one that solves real problems without introducing unnecessary complexity. The Journey We Took We started with the basics: Metalsmith reads files, transforms them through plugins, writes output. Simple. Timeless. This predictability is rare in modern web development, where frameworks churn and APIs break with each major version. Then we explored the traditional approach—Markdown files with frontmatter, templates that wrap content, blogs that follow established patterns. This has worked for years. But as we built more complex sites, the workarounds multiplied. Page templates proliferated. We needed more elaborate frontmatter configurations to work around Markdown limitations and had to maintain duplicated code across dozens of specialized templates. The process became increasingly inefficient. Then we flipped the mental model. Instead of documents with embedded components, we asked: what if pages were compositions of components? This led to sectioned pages, where every page is composed of self-contained section components, each with its template, styles, and behavior. The Structured Content Starter proved the concept worked. But it revealed a critical gap: asset management. When you have dozens of components, each with CSS and JavaScript, how do you bundle them intelligently without manual maintenance? This became the perfect opportunity to explore AI-assisted development. The Metalsmith Bundled Components plugin emerged not from a predetermined spec, but from exploratory dialogue with Claude. We kicked the tires, discussed edge cases, and patterns emerged organically. The manifest pattern, the validation system, and the dependency resolution—none of these were planned up front. They evolved through collaborative exploration. Our Discovery This series wasn't just about Metalsmith techniques. It revealed something more fundamental about web development in 2025: Simplicity scales better than complexity. The component architecture uses basic web platform features—HTML, CSS, JavaScript—without framework overhead. Yet it handles enterprise-scale sites with ease. The platform is enough. We don't need megabytes of JavaScript to reconstruct HTML in the browser. We don't need hydration. We don't need virtual DOMs. The browser already knows how to display a hero section. We just need to give it well-structured HTML with appropriate styles. AI changes how we build tools. Not by generating code on command, but by enabling exploratory development. The bundled components plugin exists because Claude and I explored the problem space together until we arrived at a solution. This collaborative approach produces better solutions than starting with rigid specifications. Build-time beats runtime. By resolving dependencies, validating configurations, and optimizing assets during the build, we eliminate runtime overhead. The first page load gets everything. Subsequent pages are instant—no server, no database, no hydration delays. The Broader Implications This approach challenges several assumptions in modern web development: You don't need a complex framework to build component-based sites. Metalsmith's plugin architecture and Nunjucks templating provide everything required. The "framework" is just a set of patterns and discipline. Static sites aren't limited to blogs and documentation. Component-based static sites handle complex marketing pages, portfolio sites, and content-rich experiences—anything that doesn't need server-side personalization. Content management doesn't require proprietary systems. Structured YAML in version control works remarkably well. Or add a Git-based CMS for non-technical editors, and you have a complete content pipeline without vendor lock-in. Performance optimizations happen at build time. Components declare their dependencies, and the bundling plugin figures out what CSS and JavaScript your site actually needs. No manual dependency lists. No unused code in your bundles. What This Enables With this foundation in place, components become truly portable across projects. A testimonial section built for one site works in another with no modification. Teams can build component libraries that embody their design systems. The structured content approach enables headless CMS integration naturally. Content lives in structured data already. Switching from YAML files to WordPress, Sanity, or Contentful just changes the source plugin. The component architecture remains unchanged. The Stability Advantage This architecture isn't trendy. It's built on fundamentals that won't change. HTML will still be HTML. CSS will still cascade. JavaScript will enhance progressively. The Metalsmith core hasn't had breaking changes in years and doesn't need them. This is the opposite of technical debt. It's a technical investment in stability, The Role of Constraints Years of working with clients taught me that constraints enable better outcomes. Content creators can't accidentally break layouts or violate brand guidelines because components provide guardrails. They focus on content and messaging rather than wrestling with design decisions they're not equipped to make. Looking Forward A component-based static site is a foundation. With components that manage their own dependencies, dynamically composable pages, and build-time optimization to ensure performance, we have the infrastructure to build sophisticated websites. AI will play a growing role by adding to our ability to explore solutions, document decisions, and build tools that solve real problems. The bundled components plugin demonstrates that this collaborative approach produces results. The Thesis Validated This series set out to show that Metalsmith remains an excellent choice for building websites in 2025. Its stability, simplicity, and plugin architecture make it ideal for component-based development. Its lack of opinions lets you implement exactly the patterns your project needs. The component architecture isn't Metalsmith-specific, but Metalsmith makes it particularly elegant to implement. The pipeline model naturally accommodates component discovery, dependency resolution, and asset bundling. The file-based approach maps cleanly to component structure. The Conclusion We started asking why someone would choose Metalsmith in 2025. The answer: complexity is expensive, and simplicity scales. The platform has everything we need, and building with native technologies creates sites that age gracefully.. The component-based approach is based on years of experience building corporate websites. The bundled components plugin was developed to support this flexible architecture. This is web development that lasts because it's built on fundamentals. It's not trendy, but it solves real problems. Sometimes the best way forward is remembering what actually matters: delivering fast, accessible, maintainable websites that serve users well. Everything else is just noise. The Component Library showcases what's possible. The Structured Content Starter and Bundled Components plugin provide the tools. Questions about building websites with Metalsmith? Find me on Bluesky. Share This Post Related Reading Metalsmith Redux - Static Site Generation in 2025 Let's talk about Metalsmith. It's a static site generator that's been around for a while, and for good reason. Metalsmith keeps things simple and stable. It's particularly good for the kind of sites most of us actually build day-to-day. Metalsmith Redux - The Build Pipeline We examine package.json, one of the most important files in any Node.js project. While it might not be the most exciting file in our project, package.json is crucial. It defines our project, what it depends on, and the commands we can run to build, develop, and maintain it Metalsmith Redux - Templating with Nunjucks Templating with Nunjucks is central to how Metalsmith transforms content into a polished website. It provides the structure and logic needed to create consistent, maintainable sites while keeping content separate from presentation --- ### The Missing Piece: Bundled Components Plugin - Werner Glinka https://www.wernerglinka.com/writing/the-missing-piece-bundled-components-plugin/ CODING The Missing Piece: Bundled Components Plugin Sep 14, 2025 In my Metalsmith Redux series, I've been exploring component-based architecture for static sites. The Structured Content Starter demonstrates how this approach can be used – pages built entirely from reusable sections, each with its own template, styles, and behavior. But there was a critical piece missing from the ecosystem: asset bundling. The Section Anatomy post hints at the challenge. When you have dozens of components, each with CSS and JavaScript dependencies, how do you create bundles without manual maintenance? Traditional approaches, such as SCSS imports and individual module loading, work but create maintenance headaches. Components aren't truly self-contained if you need to wire up their assets manually. This became the perfect opportunity to explore AI-assisted development. What emerged wasn't just the Metalsmith Bundled Components plugin, but a methodology for collaborative development with Claude that any developer can adopt. The Real Problem: Component Independence at Scale The Structured Content Starter works nicely with a handful of components. But scale it to production – 30+ section types, shared partials, conditional dependencies – and asset management becomes unwieldy. You need automatic discovery of component assets across multiple directories, dependency resolution that respects component relationships, and build-time optimization producing single, cacheable bundles. You also need validation to catch configuration errors early, all with zero runtime overhead. Without this infrastructure, the component-based approach remains difficult to handle. With it, you can build sites where components are truly independent modules. Starting with Exploration, Not Execution I started by kicking the tires with Claude – exploring a possible solution through discussion. These initial discussions are crucial and often overlooked in AI development narratives. My conversations with Claude weren't about code at all: Me: "I'm building component-based Metalsmith sites, and each component has its own CSS and JavaScript. Right now, I'm manually managing these dependencies. There has to be a better way." Claude: "Tell me more about how your components are structured. How do they currently reference each other?" Me: "Well, a hero section might use a CTA partial, which uses a button partial. Each has its own styles, but I'm manually importing them in the right order." Claude: "So you need to understand the dependency chain. How do other systems handle this?" This wasn't planning – we were exploring the problem, not rushing toward a solution. Kicking the Tires These early discussions meandered productively. We discussed npm's dependency management, why WebPack's approach was overkill for this use case, the uniqueness of Metalsmith plugins, and how other static site generators tackle similar challenges. None of this directly produced code, but it allowed me to form a mental model. Me: "What if components could somehow declare what they need?" Claude: "Like a package.json for each component?" Me: "Maybe, but simpler. I don't need versioning, just ''this component needs these other components.''" Claude: "What would that look like?" We explored this for several sessions before writing any code. The manifest pattern didn't appear fully formed – it evolved through these exploratory discussions. From Exploration to Discovery The transition from "kicking tires" to "building something" was gradual. Our discussions naturally evolved from "what if" to "how about". The Manifest Emergence Through our explorations, patterns emerged: Me: "So each component would have some kind of declaration file?" Claude: "Right. It could list its assets and dependencies. What should we call it?" Me: "In the Node world, it would be package.json, but that's taken and means something specific." Claude: "How about manifest.json? It's a manifest of what the component contains and needs." Me: "That works. What would it look like?" Together, we arrived at this: json{ "name": "hero", "type": "section", "styles": ["hero.css"], "scripts": ["hero.js"], "dependencies": ["ctas", "text", "image"], "validation": { "required": ["sectionType"], "properties": { "isFullScreen": { "type": "boolean" } } } } The validation section wasn't in our first draft. It emerged when we discussed: Me: "I keep making mistakes like putting ''false'' as a string in YAML, which is always truthy in JavaScript." Claude: "The manifest could include validation rules. Catch those errors at build time." Me: "Oh, that's interesting. Show me what that might look like." The Methodology That Emerged Through building this plugin, a clear methodology emerged for AI-assisted development: Start with Exploration, Not Specifications Don't begin with "Build me X." Start with "I want to do this..." and build the project context together. These "kicking the tires" sessions are where breakthroughs happen. Let Understanding Evolve Our first discussions about component dependencies were vague. But through dialogue, we developed mental models. The manifest pattern emerged from understanding, not prescription. Embrace Productive Meandering Not every discussion produced code. We explored dead ends and rejected approaches. This wasn't wasted time - it's how understanding develops. Document the Journey I used a CLAUDE.md file to capture not just decisions but the whole process of getting there: yaml## Early Explorations ### Session 1: Problem Space Discussed manual dependency management pain points. Explored how other ecosystems handle dependencies. Identified key requirements: simplicity, explicitness, and validation. ### Session 2: Possible Approaches Considered convention-based discovery (too implicit). Explored code analysis (too complex). Discussed the manifest approach (promising). ### Session 3: Manifest Design Started with minimal structure. Added validation after discussing common YAML mistakes. Decided against versioning (unnecessary complexity). Recognize When to Shift Gears The transition from exploration to implementation comes naturally. You'll know when you've explored enough and it's time to build. It was when we could clearly articulate what problem we're solving, why existing solutions don't work, how our approach would work, and what success looks like. The Complete Development Arc Looking back, the development followed this pattern: The exploration phase involved several sessions of problem exploration, domain understanding, prior art exploration, and pattern discovery. This led to the discovery phase with multiple iterations where the manifest pattern emerged, along with our dependency resolution approach, validation requirements, and the decision to use PostCSS integration. The implementation phase involved collaborative coding with constant dialogue, testing against real projects, refining based on discoveries, and documenting decisions as we went. This continues into the ongoing refinement phase, incorporating community feedback, handling edge cases, optimizing performance, and improving documentation. Dependency Resolution Once we had manifests, we needed to process them. I initially described this as "figuring out the right order," but Claude recognized this as a classic computer science problem: topological sorting. Our discussion went something like: Me: "If component A needs component B, and B needs component C, we need C's CSS first, then B's, then A's." Claude: "That's topological sorting – ordering items based on dependencies. We'll also need to detect circular dependencies." Me: "Right, like if A depends on B, and B depends on A." Claude: "Exactly. Here's how we could approach it..." What emerged was something like this: javascriptfunction resolveDependencyOrder(componentMap) { const visited = new Set(); const visiting = new Set(); const order = []; function visit(name, path = []) { if (visited.has(name)) return; // This check for cycles came from our discussion about // what could go wrong with dependencies if (visiting.has(name)) { const cycle = [...path, name].join('' → ''); throw new Error(`Circular dependency detected: ${cycle}`); } visiting.add(name); const component = componentMap.get(name); if (!component) { // This error handling emerged when we discussed // what happens with typos in dependency names throw new Error(`Unknown dependency: ${name}`); } component.dependencies.forEach(dep => { visit(dep, [...path, name]); }); visiting.delete(name); visited.add(name); order.push(name); } componentMap.forEach((_, name) => visit(name, [])); return order; } The algorithm wasn't predetermined – it developed through our exploration of edge cases and failure modes. PostCSS: A Discovery, Not a Decision Initially, I struggled with whether to use SCSS or CSS, but I always try to use as few dependencies as possible, so I stayed with modern CSS. During a discussion about modern CSS workflows, Claude inquired about my current CSS processing approach, and I mentioned autoprefixing and minification needs: Me: "The CSS needs vendor prefixes and should be minified for production." Claude: "PostCSS is the standard tool for this – it has autoprefixer and cssnano plugins." Me: "PostCSS it is." Practical Lessons for Your Next Project Start with conversation, not code. Begin by talking to the AI like you'd talk to a colleague. Start with "I'm trying to figure out...", not "Given the following constraints and requirements, generate a solution that..." Don't rush from problem to solution. Spend time in the uncertain space between. That's where discoveries live. As Yogi Berra said, "You've got to be very careful if you don't know where you are going, because you might not get there." Sometimes, not knowing your exact destination is what lets you find where you actually need to be. Document explorations, not just outcomes. Your CLAUDE.md should capture dead ends, abandoned approaches, and "what if" discussions. They're as valuable as final decisions. Since Claude reviews this file at the start of each session, it serves as both memory and guidance - reminding Claude what didn't work and reinforcing what did. Recognize productive meandering. Not every discussion needs immediate action. Building shared understanding through exploration is productive work. Trust the process. You don't need to know exactly where you're going when you start. Trust that exploration with AI will reveal a path forward. The Value of "Kicking the Tires" This exploratory approach is what separates AI-assisted development from simple code generation. When you start with exploration, solutions emerge that you wouldn't have conceived alone. Understanding develops organically through dialogue. Architecture evolves from actual needs, not theoretical frameworks. The final product reflects deep understanding, not surface implementation. The manifest pattern wasn't my idea or Claude's – it emerged from kicking the tires. The validation system wasn't planned; it emerged from discussing pain points. The PostCSS integration wasn't predetermined – it arose from evaluating options. The Complete Picture With this plugin, the structured content approach moved from concept to production-ready implementation. But more importantly, the development process showed that effective AI collaboration starts with exploration, not execution. The Component Library showcases what's possible. The Structured Content Starter provides the foundation. The Bundled Components plugin makes it scale. Together, they demonstrate that the future of development isn't about commanding AI to generate code. It's about exploring problems together, kicking the tires until you understand the space, then building solutions that emerge from that understanding. Could I Have Just Used a Bundler? After reading this, you might wonder – why not just use Rollup or esbuild? It's a fair question. Yes, existing bundlers could handle the dependency resolution and concatenation. But the exploration with Claude revealed why a custom solution made sense. Metalsmith components aren't JavaScript modules – in my case, they're Nunjucks template files with associated assets. The manifest pattern would still be needed to bridge that gap. The validation layer catching YAML configuration errors wouldn't come from a bundler. The integration with Metalsmith's pipeline would require adaptation. And I must admit that I really don't like to use WebPack. You should not need a PhD in computer science to bundle some CSS files. Part of what drove me to build a custom solution was the desire for a solution that any developer could easily understand by reading the code. More importantly, building this with Claude taught me what I actually needed. Now I understand the problem enough to know I built the right thing. Open Source in the Age of AI The Metalsmith ecosystem, like most open source communities, hasn't grappled with AI-assisted development yet. This creates an interesting moment – we're establishing precedents without guidelines. Some developers view AI-generated code with suspicion. But here's my take: using AI is a choice. At the end of the day, you are the one responsible for the code. You still need to understand it, review it, test it, and refine it—just like any other code. That's the crux of it. AI collaboration doesn't lower standards; it changes the process. Instead of staring at a blank page, you're working with a tireless thinking partner who can help you reach the first draft faster. The craft remains the same—it's the path that looks different. Any comments? Let me know on Bluesky. Share This Post Related Reading Metalsmith Plugin Template While working on the blog series Metalsmith Redux (Static Site Generation in 2025), I developed several new plugins with the assistance of Claude AI, which led me to create a standardized template for Metalsmith plugins. Introducing the Structured Content Starter Transform how you build static sites with structured content. The Metalsmith2025 structured content starter brings component architecture, smart dependency bundling, and fluid responsive design - no frameworks needed. The Anatomy of Section Components A look at real Metalsmith components to understand how they work, why they're designed this way, and the patterns that make them powerful. From configuration to templates to optimized bundles. --- ### The Anatomy of Section Components - Werner Glinka https://www.wernerglinka.com/writing/the-anatomy-of-section-components/ CODING The Anatomy of Section Components Aug 25, 2025 In the previous post, we introduced the Structured Content Starter and its component-based philosophy. Today, we're going to take a look a real components to understand how they work, why they're designed this way, and their patterns. If you've ever wondered how to build truly modular web pages without the complexity of modern frameworks, this is where theory meets practice. We'll examine actual components from the starter, understand the data flow, and see how the Metalsmith Bundled Components plugin orchestrates everything. The Component System Architecture Before we look into specific components, let's understand the system that makes them work. Each section component in our architecture consists of four interconnected parts: Configuration Schema (YAML in frontmatter) Template (Nunjucks) Manifest (dependency declaration) Assets (CSS, JavaScript when needed) These represent a separation of concerns that's been refined through building dozens of real websites. Content lives in configuration. Presentation lives in templates. Dependencies are listed in manifests. Behavior and styles live in assets. The Hero Component Let's start with the hero section – one of the most important components on any webpage. Here's a real hero section from the starter home page: yaml- sectionType: hero containerTag: section classes: ''first-section merge-with-next'' id: '''' description: "Landing page hero section" isDisabled: false isFullScreen: false isReverse: true containerFields: inContainer: false isAnimated: true noMargin: top: true bottom: true noPadding: top: false bottom: false background: isDark: true color: '''' image: ''/assets/images/sample4.jpg'' imageScreen: ''dark'' text: leadIn: 'CODING''' title: "Welcome to Metalsmith 2025 Structured Content Starter" titleTag: ''h1'' subTitle: 'Aug 25, 2025'Component-Driven Web Development Without the Framework Overhead'' prose: ''Welcome to the Metalsmith2025 Structured Content Starter – a demonstration of how modern websites...'' ctas: - url: '''' label: '''' isButton: true buttonStyle: ''primary'' image: src: '''' alt: '''' caption: '''' This might look like a lot, but every property has a purpose. Let's break it down. The Section Component Property Model Through building production sites, we've identified three distinct layers of component properties: Section Identity yamlsectionType: hero # Which section template to use containerTag: section # Semantic HTML element classes: ''first-section'' # Custom styling hooks id: ''main-hero'' # Anchor targeting description: "..." # Documentation isDisabled: false # Toggle without deletion These properties define what the section is. The sectionType is the only required property – it tells Metalsmith which template to use. Container Behavior yamlcontainerFields: inContainer: false # Full-width background isAnimated: false # Scroll-triggered animations noMargin: top: true # No margin to top of page bottom: false # Standard spacing below background: isDark: true # Light text on dark image: ''...'' # Background image imageScreen: ''dark'' # Overlay for readability These control how the section behaves in the page flow. Notice how inContainer: false lets the background stretch edge-to-edge while keeping content centered. This is a common pattern for heroes and feature sections. Functional Content yamltext: title: "..." titleTag: ''h1'' subTitle: "..." prose: "..." ctas: - url: "..." label: "..." image: src: "..." alt: "..." This is the actual content – what users read and interact with. These properties map directly to template partials. The Template Implementation Now let's see how the template interprets this configuration: nunjucks{# hero.njk #} {% from "components/_partials/ctas/ctas.njk" import ctas %} {% from "components/_partials/text/text.njk" import text %} {% from "components/_partials/image/image.njk" import image %}
    {% if section.text %}
    {% if section.text %} {{ text(section.text) }} {% endif %} {% if section.ctas | hasCtas > 0 %} {{ ctas(section.ctas) }} {% endif %}
    {% endif %} {% if section.image | hasImage %}
    {{ image(section.image) }}
    {% endif %}
    Notice the pattern: import partials, check for data, render conditionally. A hero works with just a title, or a title and image, or a full configuration. The template adapts. The Manifest Declaration Every component package includes a manifest that declares its dependencies: json{ "name": "hero", "type": "section", "styles": ["hero.css"], "scripts": [], "dependencies": ["ctas", "text", "image", "commons"], "validation": { "required": ["sectionType"], "properties": { "isFullScreen": { "type": "boolean" }, "isReverse": { "type": "boolean" }, "buttonStyle": { "enum": ["primary", "secondary", "outline", "link"] } } } } The Metalsmith Bundled Components plugin reads this manifest and: Includes hero.css in the global bundle Resolves dependencies recursively (hero needs ctas, ctas needs buttons, etc.) Validates configuration at build time (For example, "false" is a string and always true, use false) Generates optimized bundles containing only used components Component Composition Patterns The real power emerges when components compose. Let's examine a media-image section to see advanced composition. yaml- sectionType: media-image containerTag: aside isReverse: false # Image on left, text on right text: leadIn: "and what is this? title: "Media Section Example" prose: "Example of media section with text and image..." ctas: - url: "https://apple.com" label: "go to apple" image: src: "/assets/feature.jpg" alt: "Feature demonstration" The media-image component reuses the same text, ctas, and image partials as the hero. But it arranges them differently: nunjucks{# media-image.njk #}
    {% if section.image %}
    {{ image(section.image) }}
    {% endif %} {% if section.text or section.ctas %}
    {{ text(section.text) }} {{ ctas(section.ctas) }}
    {% endif %}
    Same partials, different arrangement. The isReverse property flips the layout with a single CSS class. No template duplication. The Data Flow Understanding how data flows through the system is crucial: Content Author writes YAML configuration in frontmatter Metalsmith reads the file and parses the frontmatter Page Template (sections.njk) iterates through the sections array Section Lookup matches sectionType to the appropriate template Template Rendering processes the configuration through the template Partial Functions handle specific content types (text, images, CTAs) HTML Output is generated and written to disk At build time, the Bundled Components plugin intercepts this flow to: Validate configurations against schemas Track component usage Resolve dependency graphs Generate optimized CSS/JS bundles Advanced Patterns Conditional Rendering Components adapt to available data: nunjucks{% if section.text %}
    {% if section.text.leadIn %}

    {{ section.text.leadIn }}

    {% endif %} {% if section.text.title %} <{{ section.text.titleTag or ''h2'' }}> {{ section.text.title }} {% endif %} {% if section.text.prose %} {{ section.text.prose | markdown | safe }} {% endif %}
    {% endif %} Every element is optional. The component gracefully handles any combination. Container Control The container system provides sophisticated layout control: nunjucks{# In the page template #} {# section wrapper may be article, aside, section or div depending on section.containerTag setting #} <{{ section.containerTag }} id="{{ section.id }}" {{ buildContainerAttributes(section) }}> {# if section has background add a background image #} {% if section.containerFields.background.image %}
    {% endif %} {# section content #} {{ renderSection(section, navigation.breadcrumbs, data, collections, previous, next, urlPath) }} {% set containerTag = section.containerTag %} This pattern lets any section have a full-width background while maintaining readable content width. Spacing Orchestration The margin/padding system creates visual rhythm: css.section { margin-top: var(--space-l); margin-bottom: var(--space-l); } .section.no-margin-top { margin-top: 0; } .section.no-margin-bottom { margin-bottom: 0; } .merge-with-next { margin-bottom: 0; } .merge-with-next + .section { margin-top: 0; } Sections can connect seamlessly or maintain breathing room. The configuration controls it all. Performance Implications This architecture isn't just about developer experience – it delivers exceptional performance: Build-Time Optimization: The Bundled Components plugin analyzes the entire site and creates optimal bundles. If you only use 5 of 20 available components, you only ship CSS for those 5. Single Global Bundle: Instead of per-page bundles (which defeat caching), we generate one CSS file and one JS file for the entire site. First page load gets everything. Subsequent pages are instant. Progressive Enhancement: Components work without JavaScript. Interactive features enhance the experience but aren't required. The platform (HTML/CSS) does the heavy lifting. Zero Runtime Overhead: No component framework. No virtual DOM. No hydration. Just HTML with styles and occasional JavaScript sprinkles. Component Development Workflow Building new components follows a predictable pattern: Design the Data Model: What configuration options does this component need? Create the Template: How should this data render to HTML? Write the Styles: How should it look? Declare Dependencies: What partials does it use? Add Validation: What constraints should be enforced? Document Usage: How do content authors use it? Let's say we need a testimonial component: yaml# Configuration model - sectionType: testimonial containerTag: aside classes: '''' id: '''' isDisabled: false isReverse: false containerFields: inContainer: false isAnimated: true noMargin: top: true bottom: false noPadding: top: false bottom: false background: color: ''lightgray'' image: '''' imageScreen: ''none'' # light, dark, none quote: text: "You've got to be very careful if you don't know where you are going, because you might not get there." cite: ''https://en.wikipedia.org/wiki/Yogi_Berra'' quotee: portrait: src: ''/assets/images/yogi-berra-baseball-great.jpg'' alt: "Lawrence Peter ''Yogi'' Berra" name: ''Yogi Berra'' title: ''Baseball Great'' company: ''New York Yankees'' logo: ''/assets/images/new-york-yankees-logo.svg'' nunjucks{# testimonial.njk #} {% from "components/_partials/ctas/ctas.njk" import ctas %} {% from "components/_partials/text/text.njk" import text %} {% from "components/_partials/image/image.njk" import image %}
    {% if section.quotee.portrait.src %}
    {{ image(section.quotee.portrait)}}
    {% endif %}
    {{ section.quotee.name }}
    {% if section.quotee.title %}
    {{ section.quotee.title }}
    {% endif %} {% if section.quotee.company %}
    {{ section.quotee.company }}
    {% endif %} {% if section.quotee.logo %} {% endif %}

    {{ section.quote.text }}

    json// manifest.json "name": "testimonial", "type": "section", "styles": ["testimonial.css"], "scripts": [], "requires": ["ctas", "text", "image", "commons"], "validation": { "required": ["sectionType"], "properties": { "sectionType": { "type": "string", "const": "testimonial" }, "isReverse": { "type": "boolean" } Component complete! It automatically integrates with the build system, gets validated, and contributes to the global bundle. Key Principles This component architecture embodies several key principles: Separation of Concerns: Content, presentation, and behavior are cleanly separated. Content authors never touch code. Developers rarely touch content. Composition Over Inheritance: Components compose from smaller partials rather than extending base classes. This creates more flexible, maintainable systems. Platform-First: We use the web platform's native capabilities rather than reinventing them. HTML for structure, CSS for presentation, JavaScript for enhancement. What's Next In the next post, we'll explore the Metalsmith Bundled Components plugin in detail – how it traces dependencies, validates configurations, and generates optimized bundles. The component-based approach isn't just a different way to build pages – it's a fundamental shift in how we think about web content. By treating pages as compositions of reusable sections, we create systems that are both more powerful and simpler to maintain. Want to explore the components yourself? Check out the Component Library or experiment with the Structured Content Starter. Questions or insights to share? Find me on Bluesky. Share This Post Related Reading Beyond Markdown: Structured Components We explore a common challenge when working with Markdown-based content: how do you include structured, reusable components within your long-text content? Beyond Markdown: Building Sectioned Webpages Instead of starting with content and adding MDN components, what if we began with components and composed them into pages? Introducing the Structured Content Starter Transform how you build static sites with structured content. The Metalsmith2025 structured content starter brings component architecture, smart dependency bundling, and fluid responsive design - no frameworks needed. --- ### Introducing Metalsmith SEO - Werner Glinka https://www.wernerglinka.com/writing/introducing-metalsmith-seo/ CODING Introducing Metalsmith SEO Aug 23, 2025 Building a static site with Metalsmith is straightforward, but getting the SEO right often requires juggling multiple plugins, manually adding meta tags, and constantly updating sitemaps. Metalsmith SEO handled all of this automatically while being smart enough to work with an existing site configuration! Why Another SEO Plugin? There are many single-purpose SEO tools. You might use one plugin for sitemaps, another for Open Graph tags, and yet another for JSON-LD structured data. Each plugin has its own configuration format, and keeping everything synchronized becomes a real chore quickly. Metalsmith SEO takes a different approach. It's build on the fact that modern SEO is interconnected – a page title should inform the Open Graph title, which should align with an JSON-LD headline, which should match a sitemap entry. Instead of managing these separately, the plugin creates a unified data flow where a single source of truth feeds all SEO formats. What Makes It Special Intelligent Automation: The plugin analyzes your content and automatically detects whether a page is an article, product, or general page. It then generates appropriate structured data, social media tags, and sitemap entries without any manual intervention. site.json Integration: If you're already using @metalsmith/metadata with a site.json file, Metalsmith SEO seamlessly integrates with your existing configuration. Your site name, description, and other metadata automatically populate all SEO tags. Smart Sitemap Generation: Unlike other sitemap generators, Metalsmith SEO calculates intelligent priority and change frequency values based on content depth, type, and freshness. Your homepage gets higher priority than a deeply nested archive page, and your blog posts get more frequent crawling than your about page. Fallback Chains: The plugin implements sophisticated fallback logic. If a page doesn't have a custom SEO description, it checks for an excerpt, then falls back to your site's default description. This ensures every page has proper metadata without requiring manual configuration for each file. Real-World Example Consider a typical blog post with this frontmatter: yaml--- layout: pages/sections.njk draft: false seo: title: Architecture Philosophy - Building with Metalsmith Components description: ''Explore the core principles behind Metalsmith component architecture: true encapsulation, separation of concerns, and declarative content management for modern static sites.'' socialImage: ''https://res.cloudinary.com/glinkaco/image/upload/v1646849499/tgc2022/social_yitz6j.png'' canonicalOverwrite: '''' keywords: ''metalsmith architecture, component philosophy, structured content, separation of concerns, component encapsulation, declarative content, static site architecture'' card: title: ''Architecture Philosophy'' date: ''2025-06-02'' author: - Albert Einstein - Isaac Newton image: ''/assets/images/sample9.jpg'' featuredBlogpost: true featuredBlogpostOrder: 1 excerpt: |- This starter embodies several key principles that make structured content management both powerful and approachable. --- From this simple input, Metalsmith SEO automatically generates comprehensive SEO markup including proper HTML meta tags, Open Graph properties for social sharing, Twitter Card tags, JSON-LD structured data identifying it as an Article with proper author and date information, and a sitemap entry with appropriate priority and change frequency. The plugin understands the relationship between these elements. The blog title becomes the Open Graph title and the JSON-LD headline. Your keywords become article tags in Open Graph and keywords in JSON-LD. Everything stays synchronized automatically. Built for Real Sites Metalsmith SEO was designed based on real-world SEO requirements. It handles cases like preserving existing robots.txt files while adding sitemap references, generating reliable lastmod dates, and creating structured data that passes Google's validation tools. The plugin also respects your existing workflow. It integrates with common Metalsmith patterns like using @metalsmith/metadata for site configuration, supports both ESM and CommonJS projects, and provides sensible defaults that work out of the box while allowing deep customization when needed. Have a look at this website. Using the dev tools you can explore what SEO information is available on every page, all done with a single site.json file. Getting Started The beauty of Metalsmith SEO lies in its simplicity. A minimal setup requires just the path to your site.json file. If that doesn't exists just provide the website URL: javascriptimport Metalsmith from ''metalsmith''; import seo from ''Metalsmith SEO''; Metalsmith(__dirname) .use(seo({ hostname: ''https://example.com'', metadataPath: ''data.site'' // Object in metadata points to where to find site metadata })) .build(); This simple configuration automatically generates complete HTML meta tags, Open Graph and Twitter Card tags, JSON-LD structured data, an intelligent sitemap.xml, and even a robots.txt file if you don't have one. For sites already using site.json configuration, the setup is even simpler – the plugin automatically discovers and uses your existing metadata, requiring zero additional configuration in many cases. Metalsmith SEO represents a new approach to static site SEO – one that prioritizes automation, intelligence, and integration. It's currently under active development with a stable API. If you're building a Metalsmith site and want SEO without the complexity, Metalsmith SEO delivers everything you need in a single, well-tested package. Your search engine rankings will thank you, and your development workflow will become significantly simpler. Any comments? Find me on Bluesky. Share This Post Related Reading Metalsmith Plugin Template While working on the blog series Metalsmith Redux (Static Site Generation in 2025), I developed several new plugins with the assistance of Claude AI, which led me to create a standardized template for Metalsmith plugins. Building Advanced Search for Metalsmith Existing search plugins for Metalsmith are ancient—most are effectively abandoned. This new metalsmith plugin uses Fuse.js as the foundation Building a Modern HTML Optimizer for Metalsmith Building a modern HTML optimizer for Metalsmith: From being inspired by HTMLCompressor's features to creating a modular plugin with effective HTML optimization without compromising security. --- ### Introducing the Structured Content Starter - Werner Glinka https://www.wernerglinka.com/writing/introducing-the-structured-content-starter/ CODING Introducing the Structured Content Starter Aug 7, 2025 In a previous post, we explored the concept of sectioned pages – treating web pages as compositions of reusable components rather than documents with embedded elements. What was missing was a reference implementation. Well, here it is. Have a look at it, or check out the starter repo: Metalsmith2025 Structured Content Starter. This isn't just another boilerplate. It's a fully-realized implementation of the sectioned page philosophy, complete with intelligent dependency management, component architecture, and all the patterns we've been discussing throughout this series. Let me walk you through what makes this starter special and how it transforms the ideas we've explored into practical reality. From Theory to Practice Remember when we discussed the limitations of treating pages as documents? The structured content starter takes that insight and runs with it. Every page is built entirely from structured frontmatter – no markdown body at all. Each section is a self-contained component with its own template, styles, and behavior. Here's what the starter home page looks like: yaml--- layout: pages/sections.njk bodyClasses: ''sections-page'' hasHero: true navigation: navLabel: ''Home'' navIndex: 0 seo: title: MS2025 Structured Content Starter description: ''A Metalsmith Starter to build modern websites using structured data and reusable components.'' socialImage: ''/assets/images/sample2.jpg'' canonicalURL: '''' sections: - sectionType: hero containerTag: section classes: ''first-section merge-with-next'' id: '''' description: "This is a hero section that merges with the next section. The hero section has a class of ''merge-with-next'' which removes the bottom margin. The next section has ''containerFields.noMargin.top'' set to true which removes the top margin. The hero section also has a class of ''main-hero'' which is used to apply specific styles for this particulat hero implementation." isDisabled: false isFullScreen: false isReverse: true containerFields: inContainer: false isAnimated: true noMargin: top: true bottom: true noPadding: top: false bottom: false background: isDark: true color: '''' image: ''/assets/images/sample4.jpg'' imageScreen: ''dark'' # light, dark, none text: leadIn: '''' title: Welcome to Metalsmith 2025 Structured Content Starter titleTag: ''h1'' subTitle: ''Component-Driven Web Development Without the Framework Overhead'' prose: Welcome to the Metalsmith2025 Structured Content Starter – a demonstration of how modern websites can be built using structured data and reusable components without relying on heavy Markdown content or complex JavaScript frameworks. This starter showcases a component-based approach to static site generation that prioritizes maintainability, consistency, and developer experience. ctas: - url: '''' label: '''' isButton: false buttonStyle: ''link'' image: src: '''' alt: '''' caption: '''' - sectionType: composed . . . - sectionType: text-only . . . - sectionType: logos-list . . . - sectionType: media-image . . . - sectionType: banner . . . --- This is the sectioned page concept fully realized. The page template simply orchestrates these sections, rendering each in sequence. But the real magic happens behind the scenes. What Makes This Starter Different The Component Dependency Bundler Here's where things get interesting. Each component in the starter includes a manifest.json that declares its dependencies: json{ "name": "hero", "type": "section", "styles": ["hero.css"], "scripts": [], "dependencies": ["ctas", "text", "image", "commons"], "validation": {...} } The Metalsmith Bundled Components plugin scans the entire site, identifies which components are actually used, resolves the dependency graph, and creates optimized global CSS and JavaScript bundles containing only what you need. No manual asset management. No wondering if you're loading unused styles. It just works. This isn't per-page bundling (which would defeat browser caching). These are global files that load once on the first visit, then cache for instant subsequent page loads. We're using the platform's strengths, not fighting them. Component Architecture That Scales Every section follows a consistent pattern: textlib/layouts/components/sections/hero/ ├── hero.njk # Template ├── hero.css # Styles ├── hero.js # Behavior (optional) ├── manifest.json # Dependencies └── README.md # Documentation (recommended) This co-location keeps everything about a component together. When you need to update the hero section, everything is in one place. No hunting through scattered directories. No guessing which styles affect what. Fluid Design Without Media Queries Here's something that excites me about this starter: it implements the Utopia approach to responsive design. Instead of juggling breakpoints and media queries, we use fluid design tokens that scale smoothly across all viewport sizes. Traditional approach - brittle and steppy cssh1 { font-size: 24px; } @media (min-width: 768px) { h1 { font-size: 32px; } } @media (min-width: 1024px) { h1 { font-size: 48px; } } Utopia approach - fluid and elegant cssh1 { font-size: clamp(1.5rem, 4vw + 1rem, 3rem); } The starter includes pre-configured fluid type scales and spacing systems. Your content automatically adapts to any screen size – not in jumpy steps, but in smooth, proportional scaling. The design tokens handle everything: Typography: Font sizes that scale proportionally Spacing: Margins and padding that maintain visual rhythm Layout: Container widths that respond naturally It's another example of using the platform's native capabilities instead of fighting them with complex abstractions. Built-in Intelligence With the Metalsmith Bundled Components plugin comes validation that catches common configuration errors before they become runtime problems: Type checking (ensuring booleans are actual booleans, not strings) Enum validation (checking that buttonStyle contains valid values) Component existence verification Dependency resolution warnings These aren't just nice-to-haves. They're the difference between "why isn't this working?" at 3 PM and going home on time. What Changes, What Stays the Same If you're coming from the simple starter or traditional Metalsmith setups, here's what to expect: What Changes No Markdown Plugin: Since all content lives in structured frontmatter, we don't process markdown bodies. Markdown prose in the YAML object is processed via a Nunjucks filter. This feels strange at first, but it's liberating once you embrace it. Single Page Template: Instead of home.njk, about.njk, services.njk, you have one sections.njk that orchestrates sections. This dramatically reduces template duplication. Component-First Thinking: You stop thinking about pages and start thinking about sections. Need a testimonial block? That's a section. Video with text? Another section. Hero with CTAs? Section. Dependency Management: No more manually managing which CSS and JavaScript files to include. The Metalsmith Bundled Components plugin handles everything automatically. What Stays the Same The Metalsmith Pipeline: Still the same time-less simplicity – read files, transform through plugins, write output. We're just transforming structured data instead of markdown. Nunjucks Templates: Your template knowledge transfers directly. Nothing changes; you're just working at the component level now. Static Output: You still get fast, secure, static HTML files. No server-side rendering, no client-side hydration. Just HTML, CSS, and JavaScript – exactly what browsers want. File-Based Content: Content still lives in files you can version control. The Developer Experience The starter includes everything you need for modern development: Live Reloading: Change a component, see it instantly PostCSS Processing: Autoprefixing and optimization built-in ESLint & Prettier: Consistent code formatting Logical Organization: Clear separation between content, components, and assets Pre-Deployment Tests: Test before you build and commit But here's what I love most: it's all understandable. No webpack configs to decipher. No complex build pipeline to debug. Just a straightforward Metalsmith build file that you can read and modify. Real-World Ready This isn't a toy example. The starter includes: Multiple Section Types: Hero, media-image, slider, testimonial, CTAs, and more Blog System: Yes, even blogs work with structured content (using a prose section for long-form content) SEO Features: Sitemap generation, robots.txt, meta tags 404 Page Production Optimizations: HTML minification, asset optimization Everything you need to build a real website is already there. The Philosophy in Practice Remember our discussion about constraint-based creativity? The starter embodies this. Content creators get powerful, flexible sections to work with, but they can't accidentally break the layout or violate brand guidelines. Developers get clean, maintainable architecture without the complexity of modern frameworks. This is "use the platform" in action. We're not shipping megabytes of JavaScript to reconstruct HTML in the browser. We're delivering complete, semantic HTML with lightweight enhancements. The browser doesn't need React to display a hero section. It just needs HTML. Performance That Matters The numbers tell the story: Zero JavaScript by default (components add only what they need) Single CSS file (~30KB for this starter) Instant subsequent page assets (everything's cached after first load) No hydration penalty (DUH, it's static) Compare this to any modern framework-based static site generator. We're not even playing the same game. Getting Started Ready to try it yourself? bashgit clone https://github.com/wernerglinka/metalsmith2025-structured-content-starter my-site cd my-site npm install npm start Your site is running at http://localhost:3000. Open src/index.md, modify some sections, and watch the magic happen. What's Next In the next post, we'll dive deep into the anatomy of section components – understanding how they're built, how data flows through them, and the patterns that make them so powerful. We'll dissect real components from the starter and see how the Metalsmith Bundled Components plugin works its magic. The shift from document-oriented to component-oriented content isn't just a technical change. It's a fundamental rethinking of how we build websites. The structured content starter makes this shift practical, providing a complete foundation for building modern sites without modern complexity. Questions about the starter or structured content? Find me on Bluesky. Share This Post Related Reading Beyond Markdown: Building Sectioned Webpages Instead of starting with content and adding MDN components, what if we began with components and composed them into pages? Beyond Markdown: Structured Components We explore a common challenge when working with Markdown-based content: how do you include structured, reusable components within your long-text content? The Anatomy of Section Components A look at real Metalsmith components to understand how they work, why they're designed this way, and the patterns that make them powerful. From configuration to templates to optimized bundles. --- ### MCP Server Development: Evolution - Werner Glinka https://www.wernerglinka.com/writing/mcp-server-development-evolution/ CODING MCP Server Development: Evolution Aug 5, 2025 When I first wrote about building metalsmith-plugin-mcp-server over a weekend, I thought I was finished. The tool worked, it saved time, and it was a great showcase of how AI can assist in development. But as any developer knows, you don't really know what you've built until you use it in production. What followed was a period of discovery, equal parts frustration and progress, that reshaped the project. What started as a quick utility turned into a foundational development framework, proven by real-world usage, trial-and-error, and a growing understanding of how AI needs to be guided, not just invited. The Honeymoon Phase At first, everything went smoothly. I used the MCP server to update some existing plugins. The scaffolding worked. Tests passed. Builds succeeded. But then came GitHub releases, and that's where things unraveled. When Releases Become Nightmares... sort of No matter what I tried, automating GitHub releases just wouldn't work, they constantly needed manual intervention. release-it kept throwing authentication errors, each one more cryptic than the last. The token seemed fine, but the process failed anyway. The conversation with Claude during one particularly frustrating session went something like this: Me: "The release is failing again with a different error." Claude: "Let me fix the npm publishing configuration..." Me: "NO! We only release to GitHub, not npm!" Claude had tried to be "helpful" by enabling npm publishing, which promptly failed because of my 2FA settings. This was just one example of a pattern I was starting to see: Claude going "off script" in its eagerness to help. The Simple Fix That Changed Everything The fix turned out to be really simple. We ditched token-based authentication and instead leaned on the GitHub CLI, which already handled authentication securely and reliably. json{ "github": { "release": false }, "hooks": { "before:git": "gh --version || (echo ''GitHub CLI not found...'' && exit 1)", "after:git:release": "gh release create v${version} --title ''v${version}'' --notes-file CHANGELOG.md || echo ''Release failed but git succeeded''" } } This change not only solved the release problem, it taught a broader lesson: good tools must be defensive against well-meaning but misguided assistance. When the AI Goes Off Script As I continued updating eight different plugins, more patterns emerged. Claude had a habit of interpreting instructions loosely. It often created simplified templates instead of using official ones, fixed things that weren't broken, and improvised instead of relying on the MCP tooling. Another memorable exchange: Me: "Use the MCP server to get the CLAUDE.md template" Claude: "I'll create a helpful CLAUDE.md file for you..." Me: "NO! Use the get-template command!" Claude: "You're absolutely right - I didn't follow instructions and created my own version instead of using the MCP server's template... I kept making assumptions and taking actions instead of following your explicit instructions to use MCP server templates verbatim." That's when it clicked: the AI wasn't failing because it was bad. It was failing because it had too much leeway. Guardrails, Not Guesswork The solution was to introduce constraints, clear rules that AI assistants must follow. This led to the creation of a CLAUDE.md file, which now serves as a kind of rule book for AI behavior in the repo. It includes rules like: markdown### CRITICAL RULES for AI Assistants 1. **ALWAYS use MCP server templates verbatim** - Never create simplified versions 2. **ALWAYS use `list-templates` first** to see what's available 3. **NEVER improvise or create custom implementations** when MCP server provides templates 4. **When validation recommends templates**, use the exact commands provided ### Common Mistakes to AVOID **❌ Wrong Approach:** - Creating custom CLAUDE.md content instead of using `get-template plugin/CLAUDE.md` - Scaffolding entire new plugins when you just need a template - Making up template content or "simplifying" official templates **✅ Correct Approach:** - Use `list-templates` to see what's available - Use `get-template ` to get exact content - Follow validation recommendations exactly as provided By codifying these expectations, we moved away from hoping the AI would "get it right" and toward a structured collaboration where the AI knows the limits of its role. A Smarter Way to Develop: The Three-Phase Model This experience also led us to rethink the entire development workflow. We realized that strict rules are useful early on, but they can become stifling later in the creative process. That's why I adopted a three-phase model: Phase 1: Scaffolding — Use MCP tools strictly. Templates are non-negotiable. Structure must be respected. Phase 2: Functional Development — This is where creativity belongs. Optimize for your use case, iterate, improve. Phase 3: Release and Validation — Return to structure. Validate with MCP tools, ensure compliance, and release using battle-tested patterns. This model acknowledges that different stages of development require different mindsets—and that rigid systems must give way to flexibility at the right moments. Testing in Isolation One of the most important changes was the creation of a dedicated test environment. After Claude tried to be "helpful" by modifying production plugins (and even attempted unauthorized npm publishes), it became clear: we needed a sandbox. Having exerienced first hand how clever Claude can get to be "helpful", I manually built a testlab with 13 forked plugins, renamed from metalsmith-* to test-*, each living in its own GitHub repo. I also created a website that used all 13 plugins. The process was tedious, cloning, scrubbing git histories, renaming everything, but it gave me complete confidence that nothing could impact production code. This test site became our integration testbed. Any changes to the MCP server would now be evaluated against a real, non-trivial Metalsmith site. From Version 0.1.0 to 1.0.0 The tool has evolved a lot since its weekend inception. Version 0.1.0 was little more than a proof of concept. By 0.7.0, validation had been modernized and hardened. At 0.17.1, it was battle-tested, with defensive programming and clear feedback loops. Yesterday, we hit 1.0.0, a version grounded in experience, shaped by frustration, and guided by real-world needs. Each of my eight production plugins contributed something: more helpful error messages, improved validation logic, better documentation, and clear documentation of anti-patterns. What I Learned About AI-Assisted Development If I had to boil it all down: Context is critical. The CLAUDE.md file provides persistent guidance for AI, session after session. Show, don't tell. Instead of explaining how to use a tool, just use it in front of the AI. It learns better that way. Design defensively. Assume the AI will go off script. Build in confirmations, warnings, and protective defaults. Use real-world complexity. Only diverse, messy examples can expose the cracks in your approach. Embrace the journey. What seems like a failure today often becomes tomorrow's feature. The Workflow That Works Today, a successful workflow looks like this: Start with context: bashcd your-plugin npx metalsmith-plugin-mcp-server@latest install-claude-md . Ask Claude to read and summarize it. Let Claude discover available tools via help. Begin development using the phased model above. It's a dance now, not a tug-of-war. Looking Ahead Reaching version 1.0.0 is just the beginning. We're working on: Pre-release validation hooks Template diff tools Automated updates with built-in safety checks CI/CD integration Ecosystem analytics and metadata All of it builds on the same philosophy: structure first, freedom later, then structure again. Today, metalsmith-plugin-mcp-server is a framework shaped by dozens of real-world use cases, improved by trial, error, and conversation. Every time Claude ignored instructions, it taught us something. Every workaround became part of the architecture. What began as a 48-hour sprint to address a personal annoyance has grown into a useful framework for AI-assisted plugin development. Have you built tools that evolved through real-world usage? What lessons did you learn? Share your experiences on Bluesky. Share This Post Related Reading MCP Server Development: Integrating Claude AI Discover how to use Claude AI and MCP servers to automate plugin development. A step-by-step weekend project that transforms repetitive Metalsmith plugin creation into an AI-powered conversation, complete with testing examples and practical insights. MCP Server v2.0: Modernizing the Toolchain Six months after reaching 1.0.0, metalsmith-plugin-mcp-server hits 2.0.0 with its first real breaking change: the toolchain every scaffolded plugin inherits has been modernized. AI as a Development Partner: My Experience with Claude and GitHub Copilot I've been integrating AI tools into my daily workflow, and I want to share my perspective on how they're transforming software development - not by replacing developers, but by enhancing our capabilities and productivity. --- ### MCP Server Development: Integrating Claude AI - Werner Glinka https://www.wernerglinka.com/writing/mcp-server-development-integrating-claude-ai/ CODING MCP Server Development: Integrating Claude AI Jul 24, 2025 I've been publishing a series of articles about using Metalsmith, a pluggable static site generator, to build websites in 2025. These articles provide detailed information about setup and the process Metalsmith uses to build sites. To demonstrate Metalsmith's capabilities for my article series, I found myself building some plugins. If you've ever built plugins for a framework, you know the drill: copy boilerplate from your last project, update package.json, set up tests, configure linters, create directory structures... rinse and repeat. I found myself in this exact situation while building plugins, and it was getting tedious. That's when I had a thought: What if Claude could help me build a tool that encapsulates best practices and generates production-ready plugins? The foundation for this tool's "knowledge base" would be a plugin I had just finished in collaboration with Claude. It had evolved from the @metalsmith/core-plugin template and incorporated modern best practices I'd learned through reviewing core Metalsmith plugins and experience: dual module support for both ESM and CommonJS, comprehensive testing setup, proper documentation structure, modern JavaScript patterns, and using native Metalsmith methods instead of external dependencies. Over one weekend, that "what if" became reality. The Collaborative Process I've been using Claude for coding for some time now, and it's become a capable co-programmer. The key word here is "co-programmer" - you need to stay actively involved with the code. Claude Code, for instance, frequently gets confused about which directory it's working in. I've lost count of how many times this happened - amusing at first, but potentially problematic if you're not paying attention. Despite these quirks, the collaborative process has been remarkably productive. My workflow now typically includes discussing projects with Claude in the desktop app, where I use Opus 4. Then, I ask Claude to prepare a context document for implementation with Claude Code in VS Code. This handoff between planning and implementation has proven to be very effective. It was during one of these planning sessions that I realized I could enhance this workflow even further. I was repeatedly asking Claude to scaffold Metalsmith plugins, and each time we'd go through the same dance of establishing best practices, project structure, and configuration. That's when it hit me: why not give Claude the tools to do this directly? Building the MCP Server: Five Iterations in 48 Hours MCP (Model Context Protocol) servers extend AI assistants'' capabilities by providing them with specific tools. By building an MCP server for Metalsmith plugin development, I could give Claude the ability to scaffold plugins directly, with all best practices built in. No more repetitive setup discussions - just straight to productive coding. Iteration 1: Template Evolution We started with custom template rendering, quickly moved to Handlebars, and finally settled on Nunjucks - which saved over 100 lines of code and provided the flexibility we needed. Third time's the charm. Iteration 2: Feature Selection Instead of generating monolithic plugins, we added a feature selection system. Need async operations? Include async-processing. Adding metadata? Include metadata-generation. The scaffolder only includes code for selected features, keeping plugins lean and focused. Iteration 3: Quality Metrics We built a comprehensive validation system that checks everything from file structure to testing setup. Plugins receive a quality score, with anything above 90% indicating production readiness. This instant feedback helps developers know what might be missing. Iteration 4: Real-World Refinements License selection, coverage configuration with sensible defaults, smart validation that doesn't warn about missing coverage on brand-new plugins - all the little things that make a tool useful. Iteration 5: Learning from Core Plugins and Experience We implemented dual module support using microbundle, replaced external pattern matching with native Metalsmith methods, and added clear documentation about how options work. Real-World Testing: My First Experience After all these iterations, I tested the complete workflow. Here's what happened: Setup: Adding the MCP Server to Claude Code I added the MCP Server to Claude Code's MCP management commands: bashclaude mcp add metalsmith-plugin /absolute/path/to/metalsmith-plugin-mcp-server/src/index.js Discovery: Finding Available Resources Then I started Claude Code in VS Code and asked it to list available resources: Me: claude list mcp Note that I used the wrong command syntax here - but watch how Claude handles it. Claude's response was characteristically verbose (which I appreciate - it shows the thinking process): bash⏺ I'll help you list the available MCP tools. Let me check what MCP tools are currently available in your environment. ⏺ Bash(claude --help | grep -A 20 "MCP") ⏺ Bash(claude mcp --help) ⏺ Bash(claude mcp list) ⎿ metalsmith-plugin: /absolute/path/to/metalsmith-plugin-mcp-server/ Claude used its own help commands to discover available MCP servers, then summarized what it found. In our case, I had only one MCP server configured, although there could have been many more. Test 1: The Overly Simplistic Prompt Me: please build a new plugin Claude didn't make assumptions. Instead, it asked for clarification: bashI'll help you build a new Metalsmith plugin. Let me start by asking what the plugin should do and what you'd like to name it. Me: name is reverse-titles and it should reverse all titles on pages that are specified via option patterns The result was structurally correct but functionally wrong - it tried to reverse filenames instead of reading HTML content and working with header tags. This drives home the importance of precise communication. Test 2: Better Description, Still Imperfect Me: please build a new plugin This time I provided a clearer description: Me: name is revert-titles and it should revert the order of all titles in the page content Claude went through the complete process: Created the scaffold with proper naming convention warning Implemented the processFile function Updated tests with proper fixtures Built and ran tests The plugin worked - it reversed the word order in titles. "Metalsmith First" became "First Metalsmith". But wait... I actually wanted character reversal as well, not just word reversal. Looking at my prompt, I realized the issues: "Revert" isn't the right word - I meant "reverse" My description was not clear about what to reverse Test 3: Clear Requirements Me: name is reverse-titles and it should reverse the order of all words and reverse the alphabetical order of characters for all titles in the page content This time the result was exactly what I expected. "Metalsmith First" became "tsriF htimslateM" and "Oh, and One More Thing" became "gnihT eroM enO dna ,hO". Key Takeaways for New Users Claude is interactive, not prescriptive - It asks for clarification rather than making assumptions Precision matters - Ambiguous descriptions lead to functional but incorrect implementations The scaffolding is solid - Even with my imprecise requirements, the generated plugins were structurally perfect with proper tests, builds, and configuration Iteration is normal - It took three tries to get exactly what I wanted, and that's okay The MCP server handles the boilerplate - I could focus entirely on describing functionality rather than setup The Power of Good Tooling What impressed me most was that even with imperfect prompts, I got working plugins every time. The MCP server ensured proper file structure, complete test suites that actually run, build processes that work out of the box, and all configuration files properly set up. When tests failed, Claude diagnosed and fixed issues immediately. This is the kind of development experience that makes experimentation enjoyable rather than frustrating. A Living Tool This isn't a final answer - it's a great beginning. As developers use this tool and build more plugins, we'll discover new use cases and patterns that aren't available yet. The beauty of open source is that the tool can evolve with the community's needs. In all my testing so far, the results have been consistently good. I'll be building all my future production plugins this way, and I'd love to get feedback from other developers who try it. Try It Yourself The metalsmith-plugin-mcp-server is now available on npm: Install globally bashnpm install -g metalsmith-plugin-mcp-server Or use directly with npx bashnpx metalsmith-plugin-mcp-server Configure it in Claude Desktop's settings and start scaffolding Metalsmith plugins in seconds. Check out the Metalsmith Plugin MCP Server on GitHub Looking Forward This weekend project transformed my development workflow and hopefully will help others too. It's a perfect example of how AI can augment human creativity and productivity when used as a collaborative partner. The next time you find yourself doing repetitive development tasks, consider stepping back and asking: "What if I built a tool to do this better?" With AI as your development partner, the answer might be just a weekend away. The metalsmith-plugin-mcp-server is open source and available on GitHub and npm. Contributions and feedback are welcome! Share This Post Related Reading MCP Server Development: Evolution Metalsmith Plugin MCP Server is a good example of how AI can assist in development. But what started over a weekend turned into a real development framework, shaped by real-world usage, trial-and-error, and a growing understanding of how AI needs to be guided, not just invited. MCP Server v2.0: Modernizing the Toolchain Six months after reaching 1.0.0, metalsmith-plugin-mcp-server hits 2.0.0 with its first real breaking change: the toolchain every scaffolded plugin inherits has been modernized. AI as a Development Partner: My Experience with Claude and GitHub Copilot I've been integrating AI tools into my daily workflow, and I want to share my perspective on how they're transforming software development - not by replacing developers, but by enhancing our capabilities and productivity. --- ### Beyond Markdown: Building Sectioned Webpages - Werner Glinka https://www.wernerglinka.com/writing/beyond-markdown-building-sectioned-webpages/ CODING Beyond Markdown: Building Sectioned Webpages Jun 23, 2025 In my previous post about MDN, we explored how to embed structured components within Markdown content. While this approach works well for blog posts and content-heavy pages, it also shows the limitations when treating pages as documents with embedded components rather than compositions of reusable elements. What if we flipped these two scenarios? Instead of starting with content and adding components, what if we began with components and composed them into pages? This shift leads to"sectioned pages," a component-first approach that transforms website building while solving real problems that limit traditional static site workflows. The Issue with Traditional Approaches Traditionally, static site generators build pages with frontmatter for metadata and a markdown body for content. This works for blogs and documentation sites but falls short when building websites that require rich, varied layouts. Consider a typical company homepage. It might include a hero section with background image, headline, subtext, and call-to-action, a features grid showcasing product benefits, a testimonial carousel with customer quotes, and a media section with video and descriptive text. Each of these elements requires different markup, styling, and behavior patterns. With markdown, you need to compromise. You can embed HTML directly in your markdown files, making them difficult to edit and maintain. Alternatively, you can create separate templates for each page type, which leads to template explosion and duplicated code whenever you need slight variations. Even the MDN approach we explored previously, while powerful for content-heavy pages, becomes unwieldy when every section of a page needs different configuration. You end up with front matter, consisting mainly of component configurations with very little markdown content. All this doesn't scale well, nor does it provide any implementation flexibility. The Sectioned Page Solution Sectioned pages solve this by treating the page as a composition of reusable components rather than a single content block. Instead of a markdown body, the entire page structure lives in structured frontmatter as a collection of sections. Here's what a sectioned page looks like: yaml--- layout: sections.njk bodyClasses: "home" bodyBackgroundImage: "components-background.jpg" seo: title: My example page description: "Showing our sectioned approach" socialImage: "my-social-image.jpg" canonicalOverwrite: "" sections: - section: home-banner # section properties here - section: intro # section properties here - section: media # section properties here --- Each section defines a self-contained component with its configuration, styling, and behavior. The page becomes a composition of these sections rather than a monolithic template. This architectural shift transforms web content from static documents to dynamic compositions. We will dissect this in more detail in the next section. Notice there's no markdown body at all. The entire page is defined through structured data, which opens up possibilities we'll explore in future posts about headless content management. Why This Changes Everything For Developers: Architecture That Scales The sectioned approach follows solid software engineering principles that experienced developers will recognize. Each component has a single responsibility, handling one specific layout pattern without trying to be everything to everyone. A hero section handles hero layouts, a features grid handles feature displays, a testimonial section handles testimonials, and nothing more. Frontmatter objects provide structured content for page section components. A section encapsulates its functionality, including templates, styles, and behavior, and it is self-contained and reusable. It's designed to be a building block that can be used on different website pages or even in other projects without needing to be rewritten or reconfigured each time. A media section component can be used across dozens of pages with different content but consistent styling and behavior. Instead of maintaining dozens of specialized page templates, you maintain a smaller set of well-designed components that can be combined in countless ways. This becomes even more powerful when combined with the component bundling approach I'll detail in an upcoming post. Each section can include its own CSS and JavaScript, with automatic dependency resolution ensuring everything loads in the correct order without conflicts. For Content Creators: Constrained Creativity Here's where the sectioned approach gets interesting, and where many developers miss the crucial insight. Rather than giving editors unlimited creative freedom, which often leads to brand chaos, you provide them with a curated set of professionally designed sections. They can build any page they need (using approved sections), but the individual pieces are engineered to work together correctly. The creative constraint enables better outcomes because editors can focus on their strengths: content, messaging, and storytelling, rather than wrestling with design decisions they're not equipped to make. This prevents the "inner designer" problem that plagues visual page builders. I've had many clients come to me to fix sites where marketing teams were given too much creative control through drag-and-drop builders. Given the tools, every person discovers their inner designer, which invariably leads to chaos. Pages have different font sizes, inconsistent spacing, clashing colors, and components that break on mobile. With sectioned pages, every section comes pre-built with consistent typography and spacing, responsive design that works on all devices, brand-compliant colors and styling, built-in accessibility features, and performance optimizations already handled. An editor can choose a media section and configure the image, headline, and CTA text. Still, they cannot accidentally break the layout by making the headline Comic Sans or creating a hover effect that doesn't work on mobile. For Organizations: The Best of Both Worlds Developers get clean, maintainable code architecture with version control, fast and secure static site deployment, componentized reusable code, and predictable performance characteristics. Content creators get an editing experience without fear of breaking the site, the ability to focus on content rather than code, immediate visual feedback, and flexibility within guardrails. Organizations get consistent brand expression across all pages, faster editing times for new content, reduced maintenance overhead, better site performance and security, and scalable content workflows. The constraint-based approach means brand guidelines are enforced at the architectural level rather than relying on training and documentation that gets forgotten under deadline pressure. The Technical Implementation The beauty of sectioned pages lies in their simplicity. Building a page becomes straightforward by parsing the frontmatter to extract the sections array, iterating through each section in your template, rendering each section using its corresponding component template, and combining the rendered sections into the final page. In Nunjucks, this orchestration might look like: nunjucks{% for section in sections %} {% if not section.disabled %} {% include "components/" + section.component + ".njk" %} {% endif %} {% endfor %} Each component template handles its own styling, structure, and behavior, while the page template simply orchestrates its composition. This separation of concerns means components can be developed, tested, and maintained independently while still working together. The approach scales naturally as your site grows. Adding a new section type means creating a single new component template. That component immediately becomes available across your entire site. Updating the styling or behavior of a section type updates it everywhere. Practical Example: From Traditional to Sectioned Let's see how this works in practice. A traditional approach might have separate templates for different page types: texttemplates/ ├── home.njk # Custom homepage layout ├── about.njk # About page layout ├── services.njk # Services page layout └── contact.njk # Contact page layout Each template contains mostly duplicated code with slight variations. Adding a new page type means creating another template. With sectioned pages, you have: texttemplates/ ├── default.njk # Single page template └── components/ ├── hero.njk # Hero section ├── features.njk # Features grid ├── testimonial.njk # Testimonial block ├── media.njk # Media section └── contact.njk # Contact form Now, any page can use any combination of these sections. A homepage might use hero + features + testimonial. An about page might use hero + media + contact. A services page might use hero + features + media. The combinations are limitless, but each piece is professionally designed and thoroughly tested. This sectioned approach builds on what we've discussed in the Metalsmith Redux series. We started with basic templating and moved to structured content with MDN, and now we're seeing how to architect entire sites around reusable components. In the next post, I'll introduce the Metalsmith2025 Structured Content Starter, which demonstrates these concepts in a complete, working project. You'll see how sectioned pages work in practice and get hands-on experience building component-based sites. Would you like to see more examples of how MDN can be used in your Metalsmith projects? Let me know on Bluesky. Share This Post Related Reading Beyond Markdown: Structured Components We explore a common challenge when working with Markdown-based content: how do you include structured, reusable components within your long-text content? The Anatomy of Section Components A look at real Metalsmith components to understand how they work, why they're designed this way, and the patterns that make them powerful. From configuration to templates to optimized bundles. Introducing the Structured Content Starter Transform how you build static sites with structured content. The Metalsmith2025 structured content starter brings component architecture, smart dependency bundling, and fluid responsive design - no frameworks needed. --- ### The JavaScript Framework Carousel - Werner Glinka https://www.wernerglinka.com/writing/the-javascript-framework-carousel/ CODING The JavaScript Framework Carousel May 24, 2025 I've been reading a lot of "I rebuilt my blog" posts lately. You know the type - developers excitedly describing how they migrated their personal site to Astro or Next.js. They walk through their setup: configuring bundlers, setting up content collections, defining layouts in JSX, organizing components, optimizing build pipelines. Then comes the punchline: "So much easier than React!" The irony seems lost on them. They're celebrating the reduction of complexity by adopting a different complex system. It's like boasting that your new car is easier to fly than your old airplane. The question nobody asks is: why did a blog need to fly in the first place? This got me curious. Having built and maintained websites for years, I wondered how much of this complexity was actually necessary. So I built the same website three times. A simple blog with a handful of pages and posts, complete with pagination. Once with Metalsmith, once with Astro, and once with Next.js. The results were illuminating, but not in the way the modern web development narrative would have you believe. My Metalsmith build - using a starter I've refined over years - completed the fastest and produced exactly what I asked for: HTML files. The Astro and Next.js versions--built with AI assistance because I couldn't be bothered to learn yet another framework--took longer to build and produced larger outputs. For a static site. This experiment made me ask a question that's been nagging at me for years: What happened to just writing HTML, CSS, and JavaScript? The Problem That Wasn't I've been building websites since before content management systems became ubiquitous. Back then, the pain was real - copying headers and footers across too many corporate website pages was a nightmare. When I discovered Metalsmith in its early days, it solved exactly that problem. A simple pipeline: read files, apply templates, write files. No magic, no virtual DOM, no hydration strategies. Fast forward to today, and the JavaScript ecosystem has somehow convinced itself that this simple problem requires increasingly complex solutions. Gatsby emerged to build static sites with React. When developers realized that was overkill for content sites, did we return to simpler tools? No. We invented Astro, which markets "shipping zero JavaScript by default" as an innovation. That's like advertising a car that "doesn't fly by default." Metalsmith never flew in the first place - it just drove really well. The Complexity Carousel Here's the pattern I've watched unfold over the past decade: Static sites have too much repetition → Static site generators solve this SPAs are the future → Everything must be a SPA SPAs are overkill for content → Gatsby/Next.js can generate static sites! Gatsby/Next.js are too heavy → Here's Astro, it's "modern" but ships less JavaScript! Notice how we've come full circle? Each new solution partially undoes the complexity of the previous one, while adding its own abstractions. Meanwhile, tools like Metalsmith keep doing what they've always done - transforming content into HTML through a simple, understandable pipeline. The Real Cost The tragedy isn't just in build times or bundle sizes. It's in what we're teaching new developers. We're telling them you need: A framework to organize content A bundler to optimize assets A complex toolchain to achieve what browsers natively understand We've made the simple act of publishing content feel like rocket science. A new developer can no longer just write HTML and see it work. They need to understand JSX, component lifecycles, build configurations, and deployment pipelines before they can put words on the web. Stone Age Technology? Metalsmith was released in 2015. In JavaScript years, that makes it ancient. But here's the thing about good ideas - they don't expire. HTML, CSS, and JavaScript didn't become obsolete just because we invented new ways to generate them. A hammer from 1915 still drives nails just fine. The perception that older tools are inferior isn't based on capability - it's based on fashion. The JavaScript ecosystem rewards novelty over stability, complexity over simplicity. Using Metalsmith in 2025 might mark you as behind the times, even if your sites build faster and ship leaner than anything built with the "modern" stack. The Path Forward I'm not advocating for stagnation. When you need partial hydration, complex state management, or real-time features, modern frameworks deliver genuine value. But for a blog? For documentation? For the vast majority of content-driven sites? Sometimes the most sophisticated choice is recognizing when you don't need sophistication. Metalsmith and tools like it represent a different philosophy - one where complexity is added only when necessary, where build tools serve the developer rather than dominate the workflow, where the output is exactly what you'd write by hand, just automated. A Simple Test Here's my challenge to anyone building a content-focused site: Try the simple approach first. Use a traditional static site generator. See if it meets your needs. You might be surprised to find that the "old" way of doing things still works remarkably well. Because at the end of the day, browsers haven't changed what they want. They still just need HTML, CSS, and JavaScript. Everything else is just the route we take to get there. And sometimes, the shortest route is still the best one. The author has built several production sites using Metalsmith and contributes to the project. He's not stuck in the past - he just remembers when the future was simpler. Share This Post Related Reading Metalsmith Redux - Static Site Generation in 2025 Let's talk about Metalsmith. It's a static site generator that's been around for a while, and for good reason. Metalsmith keeps things simple and stable. It's particularly good for the kind of sites most of us actually build day-to-day. Beyond Markdown: Building Sectioned Webpages Instead of starting with content and adding MDN components, what if we began with components and composed them into pages? Metalsmith Redux - The Next Chapter From blog series to living infrastructure. The Metalsmith Component Library has grown, and we're building a SKILL that lets Claude guide beginners through creating real websites. --- ### Metalsmith Plugin Template - Werner Glinka https://www.wernerglinka.com/writing/metalsmith-plugin-template/ CODING Metalsmith Plugin Template May 20, 2025 While working on my blog series Metalsmith Redux - Static Site Generation in 2025, I developed several new plugins with the assistance of Claude AI. I found myself repeatedly modifying the Metalsmith core plugin structure for each new project, which led me to create a standardized template. This starter template simplified my plugin development and ensured consistency across my plugins. What's Included in the Template? The template provides a complete foundation for a modern Metalsmith plugin. You'll find dual module support for both ESM and CommonJS to ensure maximum compatibility across different Node.js environments. The template comes with pre-configured GitHub Actions workflows for automated testing and coverage reporting, saving you the trouble of setting up CI/CD pipelines from scratch. The testing setup covers both ESM and CommonJS imports to ensure your plugin works in all environments and gives you a good starting point for your own tests. For code quality and consistency, the template includes ESLint 9.x and Prettier configurations. Release management is simplified through integration with release-it and conventional changelog generation. Developer experience is enhanced with JSDoc typing that provides excellent IDE support without requiring TypeScript. All of this is wrapped in a standard documentation structure that ensures a consistent experience for users of your plugin. How to Use the Template Getting started with a new Metalsmith plugin is now easier than ever: 1. Clone the Template bashgit clone https://github.com/wernerglinka/metalsmith-plugin-template.git metalsmith-your-plugin-name cd metalsmith-your-plugin-name rm -rf .git git init 2. Update Plugin Information Search and replace the following placeholders throughout the project: metalsmith-plugin-name → Your plugin name (e.g., metalsmith-markdown-extra) plugin-name → The short version (e.g., markdown-extra) pluginName → The camelCase version (e.g., markdownExtra) A Metalsmith plugin to ... → Your plugin description The main files to update are: package.json (name, description, repository URLs) README.md (badges, description, examples) src/index.js (plugin function name and JSDoc comments) 3. Install Dependencies bashnpm install 4. Implement Your Plugin The template provides a fully tested plugin structure in src/index.js. Modify it to implement your specific functionality while maintaining the two-phase plugin pattern: javascriptfunction yourPluginName(options = {}) { // Normalize options with defaults const opts = { defaultOption: true, ...options }; return function yourPluginName(files, metalsmith, done) { const debug = metalsmith.debug ? metalsmith.debug('metalsmith-your-plugin-name') : () => {}; debug('Processing with options: %O', opts); // Process files... done(); }; } 5. Write Tests Update the pre-configured tests in: test/index.js - Main ESM tests test/cjs.test.cjs - CommonJS compatibility tests test/unit/ - Unit tests for specific functionality The template includes a complete test fixture structure in test/fixtures/ to get you started quickly. 6. Update Documentation Ensure the README.md contains: Clear description of what your plugin does Installation instructions Usage examples with code samples Options documentation (in table format) Debug instructions Troubleshooting section 7. Test and Build Run a build before you test as we need to build the ESM and CommonJS versions of your plugin before testing. bashnpm run build # Build ESM and CommonJS versions npm test # Run tests AI-Assisted Plugin Development A unique feature of this template is the included PROMPT-TEMPLATE.md file, specifically designed for AI-assisted plugin development. When working with AI assistants like Claude, you can share this template to get structured, consistent help with your plugin development. The prompt template guides AI systems with clear instructions on plugin requirements and architecture, code standards and implementation patterns, testing approaches, and documentation needs. It also helps AI assistants avoid common pitfalls in Metalsmith plugin development. This approach has helped me develop several robust plugins in a fraction of the time it would typically take, and I believe it can do the same for you. Getting Started The Metalsmith Plugin Template is available now on GitHub at wernerglinka/metalsmith-plugin-template. I hope that this template makes your development process smoother and more enjoyable. I'd love to hear your feedback on this template and how it could be improved. Let me know on Bluesky or open an issue on GitHub. Share This Post Related Reading Building Advanced Search for Metalsmith Existing search plugins for Metalsmith are ancient—most are effectively abandoned. This new metalsmith plugin uses Fuse.js as the foundation Introducing Metalsmith SEO The Metalsmith SEO plugin automatically generates HTML meta tags, Open Graph properties, Twitter Cards, JSON-LD structured data, a robots.txt file and a sitemap from a single source of truth. The Missing Piece: Bundled Components Plugin Building a Metalsmith plugin with Claude revealed that effective AI collaboration isn't about prompt engineering—it's about exploring problems through dialogue until solutions emerge naturally. --- ### Beyond Markdown: Structured Components - Werner Glinka https://www.wernerglinka.com/writing/beyond-markdown-structured-components/ CODING Beyond Markdown: Structured Components May 9, 2025 Over the course of our Metalsmith Redux series, we've built a solid foundation for creating static websites with Metalsmith. You've learned how to set up a Metalsmith project, understand the file structure, work with dependencies, configure the build pipeline, and implement templating with Nunjucks. But there's still a fundamental challenge when working with Markdown-based content: how do you include structured, reusable components within your long-form content? The Content Flexibility Challenge When building websites, we often face competing needs: Ease of writing - Markdown excels here, making content creation straightforward Structured components - For consistent design and reusable elements Flexibility - The ability to place components anywhere within content Traditional approaches force you to choose between simple Markdown (sacrificing structure) or complex templating (sacrificing simplicity). But what if you could have both? Introducing MDN: Markdown + Nunjucks That's where the metalsmith-mdn plugin comes in. MDN stands for Markdown + Nunjucks and provides a simple way to include structured Nunjucks sections directly within your Markdown content. With MDN, you can: Write most of your content in simple Markdown Include structured components exactly where needed Reuse the same components across your site Let's see how to enhance our Metalsmith2025 Simple Starter with MDN and implement a practical example: an author bio component that can be placed anywhere within our blog posts. Adding MDN to the Starter First, let's install the metalsmith-mdn plugin: bashnpm install --save metalsmith-mdn Next, we need to update our metalsmith.js file to include the plugin in our build pipeline. MDN must be added immediately before the markdown plugin: javascript// metalsmith.js import MDN from 'metalsmith-mdn'; // ... other imports // In the pipeline metalsmith // ... existing plugins .use( MDN({ templatesDir: 'lib/layouts', customFilters: 'lib/nunjucks-filters/index.js' }) ) .use(markdown({ engineOptions: { extended: { rehypePlugins: [rehypeHighlight] } } })) // ... rest of pipeline Notice that we're setting templatesDir to lib/layouts because that's where the Nunjucks templates are stored in the file system. Creating an About the Author Component Now that we have MDN installed, let's create a reusable author component that we can include in our blog posts. 1. Create the Component Template Create a new file at lib/layouts/sections/author.njk: html 2. Add Some Styling Add some basic CSS to style our author bio component. Add this to your site's CSS file in lib/assets/styles.css: css/** * Blog Author Section */ .blog-author { margin: var(--spacing-lg) 0; padding: var(--spacing-md); background-color: var(--color-background-light); border-radius: var(--border-radius); box-shadow: 0 2px 4px var(--color-shadow); transition: transform var(--transition-fast), box-shadow var(--transition-fast); /* Author heading */ h2 { margin-top: 0; color: var(--color-primary); border-bottom: 2px solid var(--color-border); padding-bottom: var(--spacing-xs); } /* Author content container */ > div { display: flex; justify-content: flex-start; align-items: center; gap: var(--spacing-md); } /* Author image */ img { width: 150px; height: 150px; object-fit: cover; } /* Author bio */ p { padding-left: var(--spacing-md); font-style: italic; margin: 0; } /* Social links */ .social-links { list-style: none; padding: 0; margin: 0; display: flex; justify-content: flex-end; gap: var(--spacing-sm); margin-top: var(--spacing-md); } .social-links li { margin: 0; } .social-links a { text-decoration: none; color: var(--color-primary); font-weight: bold; } /* Responsive layout for small screens */ @media (max-width: 767px) { > div { flex-direction: column; align-items: center; text-align: center; } img { margin-bottom: var(--spacing-md); } p { padding-left: 0; } } } 3. Use the Component in a Blog Post Now, let's update one of our blog posts to include the author component. Open a blog post file in the src/blog directory and add the author component to the frontmatter and the corresponding MDN Tag, {#mdn "author" #}, at the end of the markdown body: markdown--- layout: blog-post-with-sidebar.njk bodyClass: "blog-post" draft: false seo: title: Cras mattis consectetur purus description: "Etiam porta sem malesuada magna mollis euismod." socialImage: "https://res.cloudinary.com/glinkaco/image/upload/v1646849499/tgc2022/social_yitz6j.png" canonicalOverwrite: "" post: title: "Cras mattis consectetur purus" date: "2021-07-10T12:00:00Z" author: "Albert Einstein" image: "/assets/images/blog-images/blog2.jpg" featuredBlogpost: true featuredBlogpostOrder: 1 excerpt: |- Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Donec id elit non mi porta gravida at eget metus. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. # Add the author bio component configuration author: layout: sections/author.njk text: name: "Albert Einstein" bio: "It was March 14, 1951, the day Albert Einstein turned 72. The famous physicist, who was born in Ulm, Germany, had already been living in the United States for many years. At the time, he was working at the Institute for Advanced Study in Princeton, New Jersey." social: - url: "https://www.linkedin.com/company/albert-einstein-institution/" platform: "LinkedIn" - url: "https://github.com/manjunath5496/The-Collected-Papers-of-Albert-Einstein" platform: "GitHub" portrait: "/assets/images/blog-images/albert.jpg" --- Aenean lacinia bibendum nulla sed consectetur. Maecenas faucibus mollis interdum. ... ...Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. {#mdn "author" #} Although we placed the author section at the end of the post, you can place it anywhere within the content. The key things to notice here: We added an author object to the frontmatter with all the properties our component needs We included the {#mdn "author" #} tag in the Markdown content where we want the author section to appear The layout property inside author points to our template at sections/author.njk 4. How MDN Processes Your Content This is where the magic happens. When you build your site, the MDN plugin: Finds all MDN tags: It scans your Markdown content for {#mdn "componentName" #} tags Renders each tag as HTML: It uses Nunjucks to transform your component data into HTML Inserts the HTML directly into your content: The MDN tag is replaced with the rendered HTML The HTML that MDN generates becomes part of your Markdown content before the Markdown processor runs. Since almost all Markdown processors are designed to pass through HTML unchanged, your component remains intact during Markdown processing. For example, your content might transform like this: Before MDN Processing markdownHere's some text. {#mdn "author" #} More text here. After MDN Processing (before Markdown processing) htmlHere's some text.
    Werner Glinka
    More text here. After Markdown Processing html

    Here's some text.

    Werner Glinka

    More text here.

    This process ensures that your structured components are perfectly integrated with your Markdown content. How MDN Works Understanding how MDN works is relatively simple: Configuration: You set up the plugin with the location of your templates and any custom filters Tag Placement: You place {#mdn "componentName" #} tags in your Markdown content Data Definition: You define the component data in your frontmatter Processing: The plugin processes all MDN tags, rendering them as valid HTML within Markdown syntax Markdown Conversion: After MDN processing, the Markdown plugin converts the remaining content to HTML, preserving your component's structure The important thing to remember is that most Markdown processors are designed to pass HTML through unchanged. MDN leverages this behavior by inserting fully-formed HTML before the Markdown processing step, allowing you to mix Markdown's simplicity with the power of structured components. Beyond Author Bios: Other Component Ideas The author bio is just one example of what you can do with MDN. Here are some other components you might create: Call-to-action boxes - Highlight important actions Image galleries - Display collections of images Product features - Highlight product details with consistent styling Testimonial quotes - Include customer feedback Alert boxes - Highlight important information Interactive elements - Include forms or other interactive components The beauty of this approach is that you can create these components once and reuse them across your site, both in your templates and directly within your Markdown content. Using the Same Components in Templates and Content One of the biggest advantages of MDN is that it allows you to use the same sections in both your templates and your Markdown content. This ensures a consistent design language across your site. For example, you could use the author section: In templates: At the end of blog post templates In Markdown: In the middle of a specific post where it makes more sense contextually In author pages: As the header for an author's profile page The component looks the same everywhere, but you have the flexibility to place it wherever it makes the most sense. Advanced MDN Usage Once you're comfortable with the basics, you can explore more advanced MDN features: Conditional Component Properties You can make certain aspects of your components optional: nunjucks{% if params.showTitle !== false %}

    {{ params.title }}

    {% endif %} Component Variants You can create component variants through properties: nunjucks
    {{ params.content | mdToHTML | safe }}
    Custom Filters You can create custom Nunjucks filters to transform your data. MDN supports loading custom filters from a specified file. Conclusion The metalsmith-mdn plugin bridges the gap between simple Markdown content and structured components. By adding MDN to your Metalsmith site, you gain: Simplicity: Keep writing most content in Markdown Flexibility: Place components anywhere in your content Consistency: Reuse the same components across your site In a future post, we'll explore an alternative approach to long-form content by using only frontmatter. But for now, try experimenting with MDN in your Metalsmith projects and see how it can enhance your content authoring experience. Would you like to see more examples of how MDN can be used in your Metalsmith projects? Let me know on Bluesky. Share This Post Related Reading Beyond Markdown: Building Sectioned Webpages Instead of starting with content and adding MDN components, what if we began with components and composed them into pages? The Anatomy of Section Components A look at real Metalsmith components to understand how they work, why they're designed this way, and the patterns that make them powerful. From configuration to templates to optimized bundles. Introducing the Structured Content Starter Transform how you build static sites with structured content. The Metalsmith2025 structured content starter brings component architecture, smart dependency bundling, and fluid responsive design - no frameworks needed. --- ### Metalsmith Redux - Templating with Nunjucks - Werner Glinka https://www.wernerglinka.com/writing/metalsmith-redux-templating-with-nunjucks/ CODING Metalsmith Redux - Templating with Nunjucks Apr 28, 2025 In our previous post we discussed the metalsmith.js file that defines the site build pipeline. Now let's explore one of the core components of Metalsmith: templating with Nunjucks. Templating is a fundamental concept in static site generation that bridges the gap between your content and how it appears on the web. For developers new to static site generators like Metalsmith, understanding templating is crucial to developing a complete mental model of the build process. What is Templating? At its core, templating separates content from presentation. In Metalsmith, your content typically lives in Markdown files with frontmatter, while your presentation logic lives in template files. This separation follows the principle of separation of concerns - a core tenet of good software architecture. Templating works by: Taking your content (data and text) Applying it to a predefined structure (the template) Generating the final HTML that browsers understand A critical advantage of templating is componentization - the ability to break down your site's interface into reusable parts. Rather than duplicating common elements like headers, footers, navigation bars, or content cards across multiple templates, you can define these components once and reuse them wherever needed. This approach offers several benefits: Consistency: Changes to a component automatically appear everywhere it's used Maintainability: Bug fixes only need to be applied in one place Efficiency: Less repetitive code means faster development and easier updates Separation of logic: Components can encapsulate their own presentation rules This componentized approach follows functional programming principles, where small, focused functions compose together to create complex behaviors. In Nunjucks, this is achieved through macros and imports, creating a modular system that maintains clear boundaries between different parts of your template ecosystem. Why Nunjucks? Nunjucks is a powerful templating language for JavaScript that was inspired by Jinja2 from the Python ecosystem. It provides several advantages that make it particularly well-suited for Metalsmith projects: Powerful inheritance system: Templates can extend other templates, allowing for consistent layouts without duplication. Rich feature set: Includes loops, conditionals, filters, and macros for transforming content. JavaScript integration: Seamlessly works with JavaScript objects and functions. Active community: Maintained by Mozilla and used broadly, ensuring stability and longevity. In our Metalsmith2025 Simple Starter, Nunjucks serves as the templating engine that transforms our Markdown content and metadata into a fully-formed website. Nunjucks in Metalsmith Looking at our starter repository, we can see how Nunjucks integrates with Metalsmith in the metalsmith.js file: javascript.use( layouts({ directory: 'lib/layouts', transform: 'nunjucks', pattern: ['**/*.html'], engineOptions }) ) This code configures the @metalsmith/layouts plugin to: Look for templates in the lib/layouts directory Use Nunjucks as the transformation engine Apply templates to all HTML files (in any directory, as indicated by the **/*.html pattern) Pass custom options to the Nunjucks engine The engineOptions object is particularly important: javascriptconst engineOptions = { filters: nunjucksFilters }; This provides: Custom filters for transforming data within templates Template Inheritance in Nunjucks One of Nunjucks'' most powerful features is template inheritance, which allows us to create a base structure and extend it for different page types. This prevents duplication and ensures consistency across the site. In our starter, this works through: Base templates (layout.njk) that define the overall structure Child templates (simple.njk, blog.njk, etc.) that extend the base and fill in specific sections Imports of reusable components like headers and footers For example, if we look at the frontmatter of our about.md file: yaml--- layout: simple.njk bodyClass: "about" --- This specifies that content should use the simple.njk template, and in simple.njk, we extends a base template layout.njk while adding page-specific elements. In effect, simple.njk replaces the {% block body %} section in layout.njk with the content from about.md. The rendering chain works like this: Metalsmith processes about.md to generate HTML content The HTML content is passed to simple.njk as the contents variable simple.njk places the content in its body block simple.njk extends layout.njk The combined template is rendered to create the final HTML page nunjucks{% extends "layout.njk" %} {% block body %}
    {{ contents | safe }}
    {% endblock %} Understanding Template Variables Nunjucks uses a double curly brace syntax {{ variable }} to output variables. These variables come from several sources in a Metalsmith project: Content: The HTML generated from your Markdown files Frontmatter in your content files (like bodyClass: "about") Global metadata defined in your Metalsmith configuration Computed values generated during the build process For example, if a template contains , it will output for the About page, using the value from the frontmatter. Conditionals and Loops Nunjucks really shines when handling dynamic content like blog posts. It provides: {% if %} statements for conditional rendering {% for %} loops for iterating over collections Filters for transforming data (like dates, slugs, etc.) This is particularly valuable for our blog section, where we need to display lists of posts, handle pagination, and format dates consistently. Practical Example: Rendering Blog Posts Let's consider how our Metalsmith2025 Simple Starter might use Nunjucks to render blog posts. The process typically flows like this: Markdown files in the blog directory contain content and metadata The Metalsmith build collects these into a collection, e.g. all files in the blog directory Nunjucks templates iterate through this collection to create: Individual post pages Index pages with post listings Pagination to navigate between many index pages The simplePagination plugin in our metalsmith.js demonstrates this: javascript.use( simplePagination({ directory: 'blog', perPage: 2, sortBy: 'post.date', reverse: true, outputDir: 'blog/:num', indexLayout: 'blog.njk', firstIndexFile: 'blog.md', usePermalinks: true }) ) This configures how our blog posts are paginated and which template (blog.njk) is used to render the index pages. Creating Reusable Components One of Nunjucks'' most powerful features is the ability to create truly reusable components through its macros. Instead of merely including template fragments, Nunjucks allows you to import and use macros as self-contained, function-like templates. nunjucks{% from "components/post-card.njk" import postCard %} {# Then use it like a function with post as the parameter post.title, date: post.date, post.excerpt, post.url #} {{ postCard(post) }} This import-based approach offers several key benefits: Variable scope isolation: Unlike with include, variables inside the macro won't accidentally overwrite variables in your main template. This prevents unexpected bugs and makes your templates more predictable. Explicit interfaces: Parameters must be explicitly passed to macros, creating a clear contract between the component and its consumer. This makes your code more maintainable and self-documenting. Reusability with different data: The same component can be used multiple times with different parameters in the same template without interference: nunjucks{{ postCard(featuredPost) }} {% for post in recentPosts %} {{ postCard(post) }} {% endfor %} Composition: Macros can call other macros, allowing for component composition similar to modern frontend frameworks: nunjucks{% from "components/button.njk" import button %} {% macro postCard(post) %}
    {# ... post content ... #} {{ button({text: "Read More", url: post.url}) }}
    {% endmacro %} This functional approach to templating creates a modular system where each component has a single responsibility, interfaces are clearly defined, and composition is used to build more complex structures. Debugging Nunjucks Templates When working with Nunjucks in Metalsmith, debugging can sometimes be challenging. Here are a few techniques to help troubleshoot template issues: Create custom debug filters in your Metalsmith configuration to log variables Use {{ variable | dump }} to inspect complex objects Add comments with {# This is a comment #} to temporarily disable sections of code Check the Metalsmith console output for syntax errors in templates Remember that template errors often don't provide line numbers, so systematic debugging by commenting out sections can help isolate issues. Conclusion Templating with Nunjucks is central to how Metalsmith transforms your content into a finished website. It provides the structure and logic needed to create consistent, maintainable sites while keeping content separate from presentation. By understanding how Nunjucks works within Metalsmith, developers gain a clearer mental model of the static site generation process. This knowledge forms a foundation for more advanced techniques in future posts, where we'll explore creating structured content, customizing with CSS, and implementing advanced features. In our next post, we'll dive deeper into creating and organizing blog content, building on this understanding of Nunjucks templating. Any comments? Find me on Bluesky. Share This Post Related Reading Metalsmith Redux - The Build Pipeline We examine package.json, one of the most important files in any Node.js project. While it might not be the most exciting file in our project, package.json is crucial. It defines our project, what it depends on, and the commands we can run to build, develop, and maintain it Metalsmith Redux - Starter Files Structure Understanding the file structure of a Metalsmith project is key to working with it effectively. Don't worry if it seems a bit overwhelming at first—we'll walk through each part step by step, explaining what it does and why it matters. Metalsmith Redux: Conclusion Metalsmith Redux began with a simple premise: amid framework overload, reintroduce Metalsmith as an example of stability and simplicity in an ecosystem obsessed with complexity. --- ### Metalsmith Redux - The Build Pipeline - Werner Glinka https://www.wernerglinka.com/writing/metalsmith-redux-the-build-pipeline/ CODING Metalsmith Redux - The Build Pipeline Apr 24, 2025 In our previous post, we examined the package.json file and learned about the dependencies that power our Metalsmith project. Now, we're going to look at where all those dependencies come together: the metalsmith.js file. If package.json is your project's ID card, then metalsmith.js is its brain. This file defines exactly how your content gets transformed from Markdown files into a complete website. It's where the magic happens. The Big Picture: How it works At its core, metalsmith.js defines a pipeline—a series of transformations that your content goes through. Each transformation is handled by a plugin, and the plugins are applied in a specific order. The process looks something like this: Read files from the source directory Apply transformations through plugins Write the results to the destination directory It's a simple concept, but incredibly powerful in practice. Let's explore how it works with just enough code to understand the process. Understanding the File Structure The metalsmith.js file consists of four main parts: Imports: Loading all the necessary plugins and utilities Configuration helpers: Setting up the environment and options Plugin pipeline: Defining the transformations Build logic: Running the build process Let's examine each part and understand what it does. Imports: Loading Dependencies At the top of the file, we import all the necessary dependencies: javascriptimport { fileURLToPath } from 'node:url'; import path, { dirname } from 'node:path'; import Metalsmith from 'metalsmith'; import drafts from '@metalsmith/drafts'; import markdown from 'metalsmith-unified-markdown'; import permalinks from '@metalsmith/permalinks'; import blogLists from 'metalsmith-blog-lists'; import menus from 'metalsmith-menu-plus'; import layouts from '@metalsmith/layouts'; import assets from 'metalsmith-static-files'; import htmlMinifier from 'metalsmith-optimize-html'; import sitemap from 'metalsmith-sitemap'; import simplePagination from 'metalsmith-simple-pagination'; import rehypeHighlight from 'rehype-highlight'; import { performance } from 'perf_hooks'; import browserSync from 'browser-sync'; These imports fall into three categories: Node.js built-in modules (url, path) Metalsmith core and plugins Supporting libraries (rehypeHighlight, browserSync) Configuration Helpers: Setting Up the Environment This section contains code that initializes the environment. A helper to note is the getGlobalMetadata() function. It reads JSON files from the lib/data directory and makes their contents available to your templates via metadata. Please note that this is normally done with the @metalsmith/metadata plugin. In our case I chose to use a custom function to keep the number of plugins to a minimum. javascript/** * @function getGlobalMetadata * @returns {Object} An object containing all JSON data files from lib/data directory * * This function reads all JSON files from the data directory and adds their data * to a metadata object. This object can then be added to the Metalsmith metadata. * /lib/data/ * - site.json * - social.json * - validate.json * * becomes * { * site: {...}, * social: {...}, * validate: {...} * } */ const getGlobalMetadata = () => { const dataDir = path.join( thisDirectory, 'lib', 'data' ); // Path to data directory const files = fs.readdirSync( dataDir ); // Get all files in directory // Process each JSON file and add it to the result object return files.reduce( ( obj, file ) => { const fileName = file.replace( '.json', '' ); // Remove .json extension const fileContents = fs.readFileSync( path.join( dataDir, file ), 'utf8' ); obj[ fileName ] = JSON.parse( fileContents ); // Parse JSON content return obj; }, {} ); }; const globalMetadata = getGlobalMetadata(); // Get the site URL for use in the sitemap plugin const siteURL = globalMetadata.site.siteURL; This function reads JSON files from the lib/data directory and makes them available to your templates. For example, if you have a site.json file with your site's title and URL, this function allows you to access that data in your Nunjucks templates using variables like {{ site.title }}. We'll dive deeper into how this works in a future post about templating, but for now, understand that it's a way to keep site-wide information in one place and use it across all your pages. Another important piece of configuration is the setup for Nunjucks templates: javascript/** * TEMPLATE ENGINE SETUP * Import custom Nunjucks filters that extend the template engine * These filters provide additional functionality like date formatting, * string manipulation, and more. */ import * as nunjucksFilters from './nunjucks-filters/index.js'; /** * Configuration options for the Nunjucks template engine * @type {Object} */ const engineOptions = { path: [ 'lib/layouts' ], // Where to find template files filters: nunjucksFilters, // Custom filters for templates }; This configuration tells the layouts plugin where to find templates and what filters to make available to them. Filters are special functions that can transform data in your templates, such as formatting dates or capitalizing text. The final part of the configuration sets up the environment and creates the Metalsmith instance: javascript/** * ENVIRONMENT SETUP * Determine if we're in production mode based on NODE_ENV environment variable * @type {boolean} */ const isProduction = process.env.NODE_ENV !== 'development'; // Variable to hold the development server instance let devServer = null; /** * Create a new Metalsmith instance * This is the core object that will build our site * @type {Metalsmith} */ const metalsmith = Metalsmith( thisDirectory ); /** * Configure the basic Metalsmith settings * These determine how Metalsmith will process our files */ metalsmith .clean( true ) // Clean the destination directory before building .ignore( [ '**/.DS_Store' ] ) // Ignore macOS system files .watch( isProduction ? false : [ 'src', 'lib/layouts', 'lib/assets' ] ) // Watch for changes in development mode only .env( 'NODE_ENV', process.env.NODE_ENV ) // Pass NODE_ENV to plugins .source( './src' ) // Where to find source files .destination( './build' ) // Where to output the built site .metadata( { // Global metadata available to all files msVersion: dependencies.metalsmith, // Metalsmith version nodeVersion: process.version, // Node.js version ...globalMetadata // Global data from JSON files in /lib/data } ) This configuration: Determines whether we're in production mode Creates a new Metalsmith instance Sets up basic parameters like source and destination directories Configures file watching for development Adds global metadata, including the data from our JSON files Note how the code uses the spread operator (...globalMetadata) to include all the data from our JSON files in the global metadata. It enumerates the properties of the globalMetadata object and adds the individual properties to the metalsmith metadata. The Metalsmith Pipeline: Where the Magic Happens This is the heart of the file—where we define exactly how our content gets transformed. After the basic configuration, we add plugins using the .use() method. Each plugin performs a specific transformation on our content. Here's a breakdown of what each plugin does, in order: 1. Drafts Plugin javascript.use(drafts(!isProduction)) This plugin: Filters out pages marked as drafts in production mode Keeps draft content in development mode for previewing To mark a page as a draft, add draft: true to its frontmatter. The page will then be excluded from production builds but included in development builds. Read more about the drafts plugin. 2. SimplePagination Plugin javascript.use( simplePagination({ directory: 'blog', perPage: 2, sortBy: 'post.date', reverse: true, outputDir: 'blog/:num', indexLayout: 'blog.njk', firstIndexFile: 'blog.md', usePermalinks: true }) ) This plugin: Creates paginated lists of blog posts Processes files in the blog directory Shows 2 posts per page (this number would normally larger. We chose 2 in this caseas we have only 5 blogposts in this demo) Sorts posts by date in reverse order (newest first) Generates clean URLs like blog/ for the first page and blog/2/ for subsequent pages with usePermalinks: true Uses blog.njk as the template for the pages This is what powers the blog section of your site, breaking up a large number of posts into manageable pages. Read more about the simplePagination plugin. 3. BlogLists Plugin javascript.use( blogLists({ latestQuantity: 4, featuredQuantity: 2, featuredPostOrder: 'desc', fileExtension: '.md', blogDirectory: './blog', blogObject: 'post' }) ) This plugin: Looks for .md files in the ./blog directory Expects blog post metadata in a post object in the frontmatter Creates collections of blog posts that can be displayed on other pages Generates a list of the 4 most recent posts Creates a list of 2 featured posts (marked with featured: true in frontmatter) Sorts featured posts in descending order These lists can be used on your home page or in sidebars to highlight selected blog content. Read more about the blogLists plugin. 4. Markdown Plugin javascript.use( markdown({ engineOptions: { extended: { rehypePlugins: [rehypeHighlight] } } }) ) This plugin: Is new, using the unified/remark ecosystem for Markdown processing while maintaining full API compatibility with @metalsmith/markdown. Converts Markdown content to HTML Uses rehypeHighlight for syntax highlighting in code blocks This is where your readable Markdown content becomes browser-ready HTML. The rehypeHighlight plugin adds syntax highlighting to code examples, making them more readable. Read more about the markdown plugin. 5. Permalinks Plugin javascript.use(permalinks()) This simple but powerful plugin: Creates clean URLs by converting files like about.html to about/index.html This allows URLs like /about/ instead of /about.html Makes your site structure more intuitive and user-friendly Read more about the permalinks plugin. 6. Menus Plugin javascript.use( menus({ metadataKey: 'mainMenu', usePermalinks: true, navExcludePatterns: ['404.html', 'robots.txt'] }) ) This plugin: Creates a nested navigation structure reflecting your content file hierarchy Creates an object to be used in templates Works with the clean URLs generated by permalinks Excludes certain pages (like 404) from navigation Creates breadcrumbs for each page Individual pages can customize their navigation properties using frontmatter: yamlnavigation: navLabel: 'About' navIndex: 1 It then compiles this into a structured menu that your templates can use to build navigation elements. Read more about the menus plugin. 7. Layouts Plugin javascript.use( layouts({ directory: 'lib/layouts', transform: 'nunjucks', pattern: ['**/*.html'], engineOptions }) ) This plugin: Applies Nunjucks templates to your HTML content Looks for templates in the lib/layouts directory Applies templates to files to match specified patterns Passes options to the Nunjucks engine (defined earlier) This is where your content gets its final structure and design. The template to use is specified in each file's frontmatter: yamllayout: simple.njk Read more about the layouts plugin. 8. Assets Plugin javascript.use( assets({ source: 'lib/assets/', destination: 'assets/' }) ) This plugin: Copies static files (CSS, JavaScript, images) from lib/assets to /assets Makes these files available to your site without processing them This ensures that your site has the necessary styles, scripts, and images. Read more about the assets plugin. Production-Only Plugins Some plugins are only used in production mode: javascriptif (isProduction) { metalsmith .use(htmlMinifier()) .use( sitemap({ hostname: siteURL, omitIndex: true, omitExtension: true, changefreq: 'weekly', lastmod: new Date(), pattern: ['**/*.html', '!**/404.html'], defaults: { priority: 0.5, changefreq: 'weekly', lastmod: new Date() } }) ); } These plugins: htmlMinifier: Removes whitespace and comments from HTML files to reduce their size. Read more about the htmlMinifier plugin. sitemap: Generates a sitemap.xml file for search engines with appropriate URLs and metadata. Read more about the sitemap plugin. This separation ensures that development builds include all content (including drafts), while production builds are optimized and include only final content. The Flow of Content Through the Pipeline To understand how this all works together, let's follow a single file through the pipeline: Source: Metalsmith reads src/about.md. Drafts: If the file has draft: true in its frontmatter and we're in production mode, it gets filtered out. Otherwise, it continues. SimplePagination: Since this file isn't in the blog directory, it's left unchanged. BlogLists: Again, not a blog post, so it's unchanged. Markdown: The Markdown content is converted to HTML, becoming about.html. Permalinks: The file is moved to about/index.html for cleaner URLs. Menus: Navigation information from the frontmatter is collected into a menu structure. Layouts: The HTML content is wrapped in the template specified in the frontmatter (e.g., simple.njk). Assets: Static files are copied (doesn't affect our content file). Production Plugins: In production, the HTML is minified and included in the sitemap. Destination: The final about/index.html is written to the build directory. This process happens for every file in the src directory, with each plugin doing its job as the files pass through the pipeline. Build Logic: Running the Pipeline The final part of the file handles actually running the build: javascriptif (mainFile === thisFile) { let t1 = performance.now(); metalsmith.build((err) => { if (err) { throw err; } console.log(`Build success in ${((performance.now() - t1) / 1000).toFixed(1)}s`); // Development server setup if (metalsmith.watch()) { if (devServer) { t1 = performance.now(); devServer.reload(); } else { devServer = browserSync.create(); devServer.init({ host: 'localhost', server: './build', port: 3000, injectChanges: false, reloadThrottle: 0 }); } } }); } export default metalsmith; This code is handling an important aspect of Metalsmith's flexibility - the ability to run the build process in different ways. Let's understand what "Checks if the file is being run directly" actually means. Looking at the scripts in package.json, we have two different ways to run Metalsmith: json"scripts": { "dev": "metalsmith -c metalsmith.js --env NODE_ENV=development --env DEBUG=@metalsmith*", "build": "metalsmith -c metalsmith.js --env NODE_ENV=production", "start": "NODE_ENV=development DEBUG=@metalsmith* node metalsmith.js --watch", // Other scripts... } These scripts demonstrate the two ways to run Metalsmith: 1 Using the Metalsmith CLI (dev and build scripts): Runs the command metalsmith -c metalsmith.js The Metalsmith CLI imports the metalsmith.js file as a module In this case, mainFile !== thisFile, so the build logic in the if-block is skipped The CLI itself handles the build process 2 Running the file directly with Node.js (start script): Runs the command node metalsmith.js --watch Here, metalsmith.js is executed as a standalone node script In this case, mainFile === thisFile, so the build logic in the if-block runs The file handles the build process itself This conditional check prevents the build from running twice when using the CLI. It also allows the same file to be used both as a configuration module (imported by the CLI) and as a standalone script. This dual-use approach gives you flexibility in how you run your builds. When the file runs directly via node metalsmith.js, it also sets up a development server using BrowserSync, which serves the files and reloads your browser when changes are detected. Understanding Key Concepts Let's look at a few important concepts that will help you understand how Metalsmith works: Files Object Internally, Metalsmith represents your content as a "files object"—a JavaScript object where each key is a file path and each value is a file object containing the file's contents and metadata. Plugins manipulate this object, adding, removing, or modifying files. Frontmatter The YAML frontmatter at the top of your Markdown files (between --- lines) becomes metadata in the file object. Plugins can read this metadata to make decisions about how to process the file. For example, this frontmatter: yaml--- layout: blog-post.njk post: title: My First Post date: 2025-01-15 featured: true --- Becomes this metadata in the file object: javascript{ layout: 'blog-post.njk', post: { title: 'My First Post', date: new Date('2025-01-15'), featured: true } } Metadata Metadata can come from three sources: Frontmatter in content files Global metadata added with .metadata() Data files loaded by getGlobalMetadata() Templates can access all this metadata to customize how content is displayed. Plugin Order The order of plugins matters because each one operates on the output of the previous one. For example, you must convert Markdown to HTML before applying layouts, and you must apply permalinks before generating a sitemap. Customizing Your Build Now that you understand how metalsmith.js works, you might want to customize it. Here are some common modifications: Changing Plugin Options Most plugins accept options that change their behavior. For example, you could change how many blog posts appear per page: javascript.use( simplePagination({ // Change from 2 to 5 posts per page perPage: 5, // Other options remain the same directory: 'blog', sortBy: 'post.date', reverse: true, // ... }) ) Adding New Plugins To add a new plugin, first install it: bashnpm install --save some-metalsmith-plugin Then import it at the top of metalsmith.js: javascriptimport somePlugin from 'some-metalsmith-plugin'; Finally, add it to the pipeline in the appropriate position: javascript.use( somePlugin({ // Configuration options }) ) Creating Custom Plugins For specialized needs, you can create your own plugins. A Metalsmith plugin is just a function that takes three parameters: javascriptfunction myPlugin(files, metalsmith, done) { // Loop through files and modify them Object.keys(files).forEach(file => { // For example, add a custom property to each file files[file].customProperty = 'some value'; // Or modify content if (file.endsWith('.html')) { let contents = files[file].contents.toString(); contents = contents.replace('oldtext', 'newtext'); files[file].contents = Buffer.from(contents); } }); // When finished done(); } // Add to pipeline metalsmith.use(myPlugin); This gives you complete control over the transformation process. Next Steps In our next post, we'll take a close look at templating with Nunjucks. Try making some small changes to metalsmith.js and see how they affect your site. The more you experiment, the better you'll understand how Metalsmith works and how you can use it to build exactly the site you want. Happy building! Any comments? Find me on Bluesky. Share This Post Related Reading Metalsmith Redux - Templating with Nunjucks Templating with Nunjucks is central to how Metalsmith transforms content into a polished website. It provides the structure and logic needed to create consistent, maintainable sites while keeping content separate from presentation Metalsmith Redux - Dependencies and Scripts We examine package.json, one of the most important files in any Node.js project. While it might not be the most exciting file in our project, package.json is crucial. It defines our project, what it depends on, and the commands we can run to build, develop, and maintain it. Metalsmith Redux: Conclusion Metalsmith Redux began with a simple premise: amid framework overload, reintroduce Metalsmith as an example of stability and simplicity in an ecosystem obsessed with complexity. --- ### Metalsmith Redux - Dependencies and Scripts - Werner Glinka https://www.wernerglinka.com/writing/metalsmith-redux-dependencies-and-scripts/ CODING Metalsmith Redux - Dependencies and Scripts Apr 21, 2025 In our previous post, we explored the file structure of our Metalsmith2025 Simple Starter. Today, we'll examine package.json, one of the most important files in any Node.js project. While it might not be the most exciting file in our project, package.json is crucial. It defines our project, what it depends on, and the commands we can run to build, develop, and maintain it. Let's dig in and understand what each part of this file does. What is package.json? Think of package.json as your project's ID card and instruction manual combined. It tells Node.js and npm (Node Package Manager) everything they need to know about your project: its name, version, dependencies, scripts, and more. Every Node.js project, including our Metalsmith site, needs a package.json file. Without it, none of the tools we're using would work. The Basic Metadata At the top of our package.json file, we see the basic information about our project: javascript{ "name": "metalsmith-blog-starter", "version": "1.0.0", "description": "A simple Metalsmith blog starter", "type": "module", "keywords": [ "metalsmith", "starter" ], "author": "werner@glinka.co", "license": "MIT", } Let's break down what each of these fields means: name: The name of our project. This is how other developers would refer to it if we published it as a package. version: The current version of our project, following semantic versioning (MAJOR.MINOR.PATCH). description: A brief explanation of what the project does. type: Set to "module", which means we're using ECMAScript modules (import/export) rather than CommonJS (require/module.exports). keywords: Tags that help people find our project if we publish it. author: The creator of the project. license: The legal terms under which the project is distributed. MIT is a permissive open-source license. These fields aren't strictly necessary for our project to work, but they provide essential context for anyone who looks at our code. The engines Field Near the bottom of the file, you'll find: javascript"engines": { "node": ">=18.0.0" } This tells us that our project requires Node.js version 18.0.0 or higher. This is important because some features we're using might not be available in older versions of Node.js. The Scripts: Commands to Run The scripts section defines commands that we can run in the terminal with npm run [script-name]: javascript "scripts": { "dev": "metalsmith -c metalsmith.js --env NODE_ENV=development --env DEBUG=@metalsmith*", "build": "metalsmith -c metalsmith.js --env NODE_ENV=production", "start": "NODE_ENV=development DEBUG=@metalsmith* node metalsmith.js --watch", "serve": "browser-sync start --server 'build'", "format": "prettier --write \"**/*.{js,json,njk,css}\"", "lint": "eslint --fix .", "fix": "npm run format && npm run lint", "depcheck": "depcheck" } These scripts are the commands you'll use most often when working with the project. Let's go through each one: Building and Development Scripts dev: Builds the site in development mode with debug information enabled. This is what you'll use most often during development. Each plugin used in the build process will log debug information and show you what's happening under the hood. javascriptmetalsmith -c metalsmith.js --env NODE_ENV=development --env DEBUG=@metalsmith* This command tells Metalsmith to: Use metalsmith.js as its configuration file (-c metalsmith.js) Set the environment to development (--env NODE_ENV=development) Enable debug logging for Metalsmith plugins (--env DEBUG=@metalsmith*) build: Builds the site in production mode, which might include additional optimizations and exclude development features. javascriptmetalsmith -c metalsmith.js --env NODE_ENV=production start: An alternative development mode that directly runs metalsmith.js as a Node.js script with file watching enabled. So when you make changes to your source files, they will be automatically shown in your browser. javascriptNODE_ENV=development DEBUG=@metalsmith* node metalsmith.js --watch This is my preferred way to work with Metalsmith when I build a site. The terminal output is not overwhelmed with plugin debug information so I can focus on relavent content or metadata logging. We'll explore this in more detail in the next post. serve: Starts a local development server that serves the files from the build directory. javascriptbrowser-sync start --server 'build' Code Quality and Maintenance Scripts format: Uses Prettier to automatically format your JavaScript, JSON, Nunjucks, and CSS files. javascriptprettier --write "**/*.{js,json,njk,css}" This ensures consistent code style across the project. lint: Uses ESLint to check your JavaScript files for potential errors and automatically fixes them when possible. javascripteslint --fix . fix: Runs both format and lint commands in sequence. javascriptnpm run format && npm run lint This is a convenient way to clean up your code in one go. depcheck: Checks for unused dependencies or dependencies missing from package.json. This is really helpful when you're managing a project with many dependencies. Dependencies have a tendency to accumulate over time... at least in my case. javascriptdepcheck Development vs. Production Mode You might have noticed that several scripts specify either development or production mode. This typical pattern in Node.js applications enables different behavior in different environments. Development mode includes drafts, detailed debug information, and watches for file changes Production mode excludes drafts, minifies HTML, generates a sitemap, and performs other optimizations This distinction ensures that we have a smooth development experience while still producing optimized output for deployment. The Dependencies: What Our Project Needs The dependencies and devDependencies sections list all the packages our project relies on: javascript"devDependencies": { "browser-sync": "^3.0.4", "eslint": "^9.24.0", "prettier": "^3.5.3" }, "dependencies": { "@metalsmith/drafts": "^1.3.0", "@metalsmith/layouts": "^3.0.0", "@metalsmith/permalinks": "^3.2.0", "depcheck": "^1.4.7", "jstransformer-nunjucks": "^1.2.0", "marked": "^15.0.8", "metalsmith": "^2.6.3", "metalsmith-blog-lists": "^2.0.2", "metalsmith-menu-plus": "^0.0.3", "metalsmith-optimize-html": "^0.5.3", "metalsmith-simple-pagination": "^0.0.1", "metalsmith-sitemap": "^1.2.2", "metalsmith-static-files": "^1.1.1", "metalsmith-unified-markdown": "^0.0.4", "rehype-highlight": "^7.0.2" } There's a distinction between the two types of dependencies: dependencies: Packages required for the project to run in production devDependencies: Packages only needed during development, like testing tools or development servers Let's break down what each package does, starting with the dev dependencies: DevDependencies browser-sync: Creates a local development server with automatic browser reloading eslint: Checks your JavaScript code for potential problems prettier: Automatically formats your code for consistency Dependencies Core Metalsmith and Templating metalsmith: The core static site generator that powers our project jstransformer-nunjucks: Enables Nunjucks templating in our layouts Metalsmith Core Plugins (Official) @metalsmith/drafts: Excludes draft content in production builds @metalsmith/layouts: Applies templates to content files @metalsmith/permalinks: Creates clean URLs without file extensions Community Metalsmith Plugins metalsmith-blog-lists: Generates lists of blog posts (latest, featured, etc.) and places them in the Metalsmith metadata. These lists can then be used in sidebars or footers. metalsmith-menu-plus: Creates navigation menus and breadcrumbs from your content metalsmith-optimize-html: Minifies HTML in production builds metalsmith-simple-pagination: A simple pagination plugin for folder content metalsmith-sitemap: Generates a sitemap.xml file for search engines metalsmith-static-files: Copies static files (CSS, images, etc.) to the build directory metalsmith-unified-markdown: Processes Markdown content with unified/remark/rehype. Uses rehype plugin for code syntax highlighting Supporting Packages marked: A Markdown parser used by some Nunjucks filters rehype-highlight: A syntax highlighting plugin for rehype (used with unified-markdown) depcheck: Helps manage dependencies Version Numbers and the Caret (^) You might have noticed that each dependency has a version number prefixed with a caret (^): javascript"metalsmith": "^2.6.3" The caret means "compatible with version 2.6.3, but allow minor and patch updates." When you run npm install, 'npm' will install the latest version that matches this pattern. This follows semantic versioning: Major(first number): Breaking changes Minor (second number): New features without breaking changes Patch (third number): Bug fixes The caret allows your project to automatically get bug fixes and new features without breaking changes. Understanding the Plugin Ecosystem Looking at the dependencies, you might notice a pattern: many packages are named metalsmith-[plugin name] or @metalsmith/[plugin name]. These are Metalsmith plugins, each adding specific functionality to the core Metalsmith engine. The beauty of Metalsmith's plugin-based architecture is that you can add, remove, or replace plugins to customize your build process. Each plugin does one thing well: following the Unix philosophy. Some common patterns in the plugin names: @metalsmith/[plugin name]: Official plugins maintained by the Metalsmith team metalsmith-[plugin name]: Community plugins created by Metalsmith users This modular approach means you can start with a simple setup and gradually add more features as needed. How These Dependencies Are Used All these dependencies are imported and will be used in metalsmith.js, which we'll explore in detail in the next post. Adding New Dependencies As you develop your Metalsmith site, you might want to add new functionality. You can add new dependencies using npm: bashnpm install --save some-metalsmith-plugin Then, you'll need to add the plugin to your Metalsmith pipeline in metalsmith.js: javascriptimport somePlugin from 'some-metalsmith-plugin'; // ... other imports ... Metalsmith(__dirname) // ... existing plugins ... .use(somePlugin()) // ... more plugins ... We'll do this in a future post when we add new capabilities to our site. This flexibility is one of Metalsmith's greatest strengths—you can customize it to suit your exact needs. Exploring Further: Available Plugins The plugins included in our starter project are just a small selection of what's available in the Metalsmith ecosystem. You can find many more plugins by: Searching on npm Checking the Metalsmith website Looking at the official Metalsmith GitHub organization Keeping Dependencies Updated Over time, dependencies will receive updates with new features and bug fixes. You can update your dependencies using: bashnpm update For major version updates (which might include breaking changes), you'll need to: bashnpm install --save [plugin-name]@latest Replacing [plugin-name] with the package you want to update. Before you update, it's a good idea to check the plugin's documentation or release notes to see if there are any breaking changes you need to address. It's a good practice to periodically check for updates and keep your dependencies current for security and performance reasons. Next Steps Now that we understand what's in our package.json and the role each dependency plays, we're ready to dive into metalsmith.js in the next post. We'll explore how all these packages come together to build our site, and how the Metalsmith pipeline transforms our content into a complete website. In the meantime, try modifying one of the scripts or adding a new dependency to see how it affects your project. This hands-on experimentation is the best way to deepen your understanding of how everything works together. Happy building! Did you know? Metalsmith's plugin architecture was inspired by the Unix philosophy: "Do one thing and do it well." Each plugin focuses on a specific transformation, and they work together to create a powerful, flexible system. Any comments? Find me on Bluesky. Share This Post Related Reading Metalsmith Redux - Getting Started Now it's time to set up our first Metalsmith project. Don't worry if you're new to static site generators or even to web development in general. This guide is written to be straightforward and approachable. Metalsmith Redux - Starter Files Structure Understanding the file structure of a Metalsmith project is key to working with it effectively. Don't worry if it seems a bit overwhelming at first—we'll walk through each part step by step, explaining what it does and why it matters. Metalsmith Redux - The Build Pipeline We examine package.json, one of the most important files in any Node.js project. While it might not be the most exciting file in our project, package.json is crucial. It defines our project, what it depends on, and the commands we can run to build, develop, and maintain it --- ### Metalsmith Redux - Starter Files Structure - Werner Glinka https://www.wernerglinka.com/writing/metalsmith-redux-starter-files-structure/ CODING Metalsmith Redux - Starter Files Structure Apr 19, 2025 In our previous post, we set up our first Metalsmith project using the Metalsmith2025 Simple Starter and got it running locally. Now it's time to take a more detailed look at what's inside this project. Understanding the file structure of a Metalsmith project is key to working with it effectively. Don't worry if it seems a bit overwhelming at first—we'll walk through each part step by step, explaining what it does and why it matters. Wait, Where Are My HTML Files? If you're familiar with traditional static websites—the kind with HTML, CSS, and JavaScript files that you might upload directly to a web server—you might be wondering where all those files are in our project structure. When you first look at the Metalsmith project, you won't see a single HTML file. Instead, you'll see Markdown (.md) files, configuration files, and various folders with unfamiliar names. Don't worry, this is by design! In a modern static site generator like Metalsmith, we separate the content (what you want to say) from the presentation (how it looks). We write our content in Markdown, which is much easier to work with than HTML, and then Metalsmith automatically transforms it into HTML during the build process. The HTML, CSS, and JavaScript files that make up your final website are generated when you run the build command. They end up in a build directory, ready to be uploaded to a web server. You never need to write or edit HTML by hand unless you want to customize the templates. This separation makes it much easier to: Focus on your content without worrying about HTML tags Maintain consistent styling across your entire site Make global changes to your site's structure without editing every page Manage larger websites with dozens or hundreds of pages Now, let's look at how this all works by exploring the project structure. The Big Picture Inside the project folder, you'll see several files and directories. Let's start with a bird's-eye view of what we're looking at: textmetalsmith2025-simple-starter/ ├── lib/ # Core assets and layouts ├── src/ # Your content lives here ├── .eslintrc.js # Code style rules ├── .gitignore # Files for Git to ignore ├── .prettierignore # Files for Prettier to ignore ├── .prettierrc # Code formatting rules ├── LICENSE # MIT license ├── metalsmith.js # The main build configuration ├── package.json # Project dependencies └── README.md # Project documentation This structure keeps everything organized, clearly separating content, templates, project configuration, and the build process. Let's explore each of these areas in more detail, focusing on the content and template files today. In upcoming posts, we'll dive deeper into metalsmith.js and package.json. The Source Directory: Where Your Content Lives The src directory is where all your content files are stored. When you open it, you'll see something like this: textsrc/ ├── about.md # The About page ├── blog/ # Blog posts folder │ ├── cras-mattis-consecteur-purus.md │ ├── curabitur-blandit-empus-porttitor.md │ ├── duis-mollis-esr-non-commondo-uctus.md │ ├── curabitur-blandit-empus-porttitor.md │ └── ... .md ├── blog.md # The main Blog landing page └── index.md # The Home page Each .md file in this directory corresponds to a page on your website. These are Markdown files, which combine easy-to-write content with structured metadata. Let's take a look at what's inside one of these files. Open src/index.md, and you'll see something like this: markdown--- layout: simple.njk bodyClass: "home" navigation: navLabel: 'Home' navIndex: 0 seo: title: Metalsmith Blog Starter description: "A blog starter build with Metalsmith" socialImage: "/assets/images/metalsmith-starter-social.png" canonicalOverwrite: "" --- # Welcome to Metalsmith2025 Simple Starter ![Metalsmith2025 Simple Starter](/assets/images/sample.jpg#full-width) ## A Modern Foundation for Static Sites Welcome to the Metalsmith2025 Simple Starter – a clean, lightweight foundation for your next web project. This starter combines the elegant simplicity of Metalsmith with modern development practices to create a responsive, content-focused website that's easy to understand and extend. Notice how the file is divided into two sections: Frontmatter: The section between the "---" lines at the top contains metadata about the page. This is written in YAML format and includes: The layout template to use Navigation information SEO details Any other custom data you want to include Content: Everything after the second "---" is the actual content of the page, written in Markdown. This is where you write the text, add images, create links, etc. The beauty of this approach is that it separates content from presentation. You focus on writing your content, and Metalsmith handles, turning it into a fully-styled web page. The Blog Folder: Your Collection of Posts Inside the src/blog directory, you'll find individual Markdown files for each blog post. These work just like regular pages, but they have some additional frontmatter: yaml--- layout: blog-post-with-sidebar.njk bodyClass: "blog-post" draft: false seo: title: Cras mattis consectetur purus description: "Etiam porta sem malesuada magna mollis euismod." socialImage: "https://res.cloudinary.com/glinkaco/image/upload/v1646849499/tgc2022/social_yitz6j.png" canonicalOverwrite: "" post: title: "Cras mattis consectetur purus" date: "2021-07-10T12:00:00Z" author: "" image: "/assets/images/blog-images/blog2.jpg" featuredBlogpost: true featuredBlogpostOrder: 1 excerpt: |- Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Donec id elit non mi porta gravida at eget metus. Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. --- Aenean lacinia bibendum nulla sed consectetur. Maecenas faucibus mollis interdum. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Curabitur blandit tempus porttitor. Morbi leo risus, porta ac consectetur ac, vestibulum at eros... Notice the additional post section in the frontmatter. This contains metadata specific to blog posts, such as: The post title Publication date Whether it's a featured post An excerpt or summary Featured image information This structured data allows Metalsmith to treat blog posts differently from regular pages. It can generate indexes, create archives by date, show featured posts on the home page, and much more. The Lib Directory: Templates and Assets The lib directory contains files that define how your content is shown in a browser: textlib/ ├── assets/ # Static files like images, CSS, JavaScript │ ├── css/ │ ├── images/ │ └── js/ ├── data/ # Global data available to templates ├── layouts/ # Nunjucks template files │ ├── blog-post.njk │ ├── blog.njk │ ├── includes/ # Reusable template parts │ │ ├── footer.njk │ │ ├── header.njk │ │ └── ... │ ├── partials/ # Smaller reusable components │ │ ├── meta-tags.njk │ │ ├── navigation.njk │ │ └── ... │ └── simple.njk └── nunjucks-filters/ # Custom template filters Assets Folder The assets folder contains all your static files: styles.css: file with your styles images: folder with photos, icons, and other graphics icons: folder with favicon for various platforms Javascript Client-side scripts These files are copied directly to the build directory without processing (though in a production build, some optimization might occur). Layouts Folder The layouts folder contains Nunjucks template files. These define the HTML structure of your pages. We'll review the use of Nunjucks in a later post in detail. Data Folder The data folder contains JSON files with global data that's available to all your templates. This might include: Site configuration Social media links Team member information Any other structured data you want to use across your site The Config Files: A Brief Overview In the root directory, you'll find several configuration files that control various aspects of your project: .eslintrc.js: Rules for code linting to ensure consistent quality .prettierrc: Configuration for automatic code formatting .gitignore: Tells Git which files to ignore when committing metalsmith.js: The main configuration file that defines the build process package.json: Lists all the project dependencies and scripts We'll dive deeper into metalsmith.js and package.json in the next two posts, exploring how they control the build process and project dependencies. For now, just know that they're responsible for telling Metalsmith how to transform your content into a complete website. The Build Directory: Where Everything Comes Together When Metalsmith runs, it creates a build directory that contains your complete website in a way a browser can readily display it. textbuild/ ├── about/ │ └── index.html # The About page ├── assets/ # Static assets │ ├── css/ │ ├── images/ │ └── js/ ├── blog/ # Blog pages │ ├── index.html # Main blog index │ ├── 2/ # Pagination page │ │ └── index.html │ ├── first-post/ │ │ └── index.html │ └── ... └── index.html # The Home page Each Markdown file from your src directory has been transformed into an HTML file, placed in a directory structure that creates clean URLs. For example, src/about.md becomes build/about/index.html, which is accessible at the URL /about/. The static assets from lib/assets have been copied to build/assets, making them available to your HTML files. Making Changes Now that you understand the basic structure, let's try making some changes to see how it all works: Edit content: Open a Markdown file like src/about.md and change some text. Save the file and see the changes in your browser. Add a new page: Create a new file like src/contact.md with similar frontmatter to the other pages. Add your content and save. The new page will be automatically added to your site. Add a new blog post: Create a new file in the src/blog directory, following the pattern of the existing posts. It will automatically appear in your blog listings. Customize styles: Edit the CSS files in lib/assets/css to change the appearance of your site. Modify templates: Edit the Nunjucks files in lib/layouts to change the HTML structure of your pages. Next Steps In the next post, we'll take a closer look at the package.json file, exploring the dependencies and scripts that power your Metalsmith project. We'll learn what each package does and how they work together to build your site. After that, we'll review the metalsmith.js file to understand the build pipeline in detail, seeing exactly how your content is transformed from Markdown to a complete website. For now, take some time to explore the files in your project, make some changes, and see how they affect your site. The more you experiment, the better you'll understand how Metalsmith works and how you can use it to build exactly the site you want. Happy building! Any comments? Find me on Bluesky. Share This Post Related Reading Metalsmith Redux - Getting Started Now it's time to set up our first Metalsmith project. Don't worry if you're new to static site generators or even to web development in general. This guide is written to be straightforward and approachable. Metalsmith Redux - Dependencies and Scripts We examine package.json, one of the most important files in any Node.js project. While it might not be the most exciting file in our project, package.json is crucial. It defines our project, what it depends on, and the commands we can run to build, develop, and maintain it. Metalsmith Redux - Templating with Nunjucks Templating with Nunjucks is central to how Metalsmith transforms content into a polished website. It provides the structure and logic needed to create consistent, maintainable sites while keeping content separate from presentation --- ### Metalsmith Redux - Getting Started - Werner Glinka https://www.wernerglinka.com/writing/metalsmith-redux-getting-started/ CODING Metalsmith Redux - Getting Started Apr 17, 2025 In our previous post, we introduced Metalsmith as a stable, flexible static site generator that's perfect for building blogs, portfolios, and simple marketing sites. Now it's time to set up our first Metalsmith project. Don't worry if you're new to static site generators or even to web development in general. I've designed this guide to be straightforward and approachable. Let's get started! What You'll Need Before we begin, make sure you have these basics installed on your computer: Node.js (version 18.0.0 or higher) Git (for downloading the starter project) A code editor ( my favorite is VSCode) That's it! You don't need to understand complex build tools or framework-specific concepts. You're ready to go if you can open a terminal and run basic commands. What you should be familiar with This guide assumes you have: Basic knowledge of HTML and CSS Some familiarity with Markdown (but even if you don't know it, you'll pick it up quickly) Comfort with using the command line for simple operations You don't need to be a JavaScript expert or have previous experience with static site generators. Step 1: Clone the Starter Repository Let's begin by downloading the Metalsmith2025 Simple Starter. Open your terminal and run: bashgit clone https://github.com/wernerglinka/metalsmith2025-simple-starter.git my-website This creates a new folder called my-website containing all the files you need to get started. Feel free to rename this to whatever you'd like your project to be called. Step 2: Navigate to Your New Project Enter your new project directory: bashcd my-website Take a moment to look around if you'd like. The src folder contains your content files, while lib contains layouts and assets. Don't worry about understanding everything just yet - we'll explore the structure in more detail in a future post. Step 3: Install Dependencies Now, let's install the necessary packages: bashnpm install This might take a minute, as it downloads all the dependencies Metalsmith needs to build your site. You'll only need to do this once when you first set up the project. Step 4: Start the Development Server Once the installation is complete, start the development server: bashnpm start This does two important things: It builds your website from the source files It starts a local development server so you can view your site You should see some messages in your terminal showing the build process, and at the end, you'll see something like this: bashBuild success in 4.2s [Browsersync] Access URLs: -------------------------------------- Local: http://localhost:3000 External: http://192.168.1.130:3000 -------------------------------------- UI: http://localhost:3001 UI External: http://192.168.1.130:3001 -------------------------------------- [Browsersync] Serving files from: ./build Step 5: See Your Site in Action Open your web browser and go to: http://localhost:3000 And there it is! Your Metalsmith site is up and running. You should see a simple homepage with a welcome message and a link to the About page. Making Your First Change Let's make a small change to see how Metalsmith works. Open the file src/index.md using your favorite text editor and find the title in the content section (below the frontmatter). markdown--- layout: simple.njk bodyClass: "home" navigation: navLabel: 'Home' navIndex: 0 seo: title: Metalsmith Blog Starter description: "A blog starter build with Metalsmith" socialImage: "/assets/images/metalsmith-starter-social.png" canonicalOverwrite: "" --- # Welcome to Metalsmith2025 Simple Starter Change it to something like: # My Awesome Metalsmith Site Save the file and check your browser. The page should automatically refresh, showing your new title. That's the development server at work - it watches for changes and rebuilds your site instantly. What's Happening Behind the Scenes? While you're happily editing content, Metalsmith is doing quite a bit of work. It: reads your Markdown files from the src directory processes the Markdown and converts it to HTML applies your layouts (templates) from the lib/layouts directory handles things like permalinks and navigation outputs the final HTML files to a build directory We'll explore this process in more detail in the following posts, but for now, enjoy the simplicity of the editing experience. Running a Production Build When you're ready to deploy your site, you'll want to create an optimized production build. Stop the development server by pressing Ctrl+C in your terminal, then run: bashnpm run build This creates a production-ready version of your site in the build directory, with optimized HTML and proper sitemap generation. If you like to see your production site run: bashnpm run serve You'll see something like this: bash[Browsersync] Proxying: http://localhost:3002 [Browsersync] Access URLs: -------------------------------------- Local: http://localhost:3002 External: http://192.168.1.130:3002 -------------------------------------- UI: http://localhost:3003 UI External: http://192.168.1.130:3003 -------------------------------------- [Browsersync] Serving files from: build If you are using VSCode and are using the built-in terminal you can just CMD-Click on the local URL and the site will open in your browser, If you are using a regular terminal just copy the url and paste it into the browser. What's Next? Congratulations! You've successfully set up and run your first Metalsmith project. In the next post, we'll explore the site structure in more detail and learn how content is organized in a Metalsmith project. For now, feel free to explore the starter site. Try creating a new blog post or modifying the About page. The more you play with it, the more comfortable you'll become with how Metalsmith works. Remember, the development server we set up will automatically rebuild your site whenever you make changes, so you can immediately see the results in your browser. This makes the development process smooth and intuitive. Have questions or running into issues? Join the Metalsmith community on Gitter where friendly developers are always willing to help. In the next post, we'll take a closer look at the site structure and organization. See you then! Any comments? Find me on Bluesky. Share This Post Related Reading Metalsmith Redux - Static Site Generation in 2025 Let's talk about Metalsmith. It's a static site generator that's been around for a while, and for good reason. Metalsmith keeps things simple and stable. It's particularly good for the kind of sites most of us actually build day-to-day. Metalsmith Redux - Starter Files Structure Understanding the file structure of a Metalsmith project is key to working with it effectively. Don't worry if it seems a bit overwhelming at first—we'll walk through each part step by step, explaining what it does and why it matters. Metalsmith Redux - Dependencies and Scripts We examine package.json, one of the most important files in any Node.js project. While it might not be the most exciting file in our project, package.json is crucial. It defines our project, what it depends on, and the commands we can run to build, develop, and maintain it. --- ### Metalsmith Redux - Static Site Generation in 2025 - Werner Glinka https://www.wernerglinka.com/writing/metalsmith-redux-intro/ CODING Metalsmith Redux - Static Site Generation in 2025 Apr 15, 2025 I've been building websites with Metalsmith since 2017 and have written about various aspects of it over the years. But I've usually assumed readers already know what it is. So let's start fresh. This post kicks off a series introducing Metalsmith as an excellent choice for building websites in 2025. Why Metalsmith? While JavaScript frameworks get more complicated yearly and require constant updates, Metalsmith keeps things simple and stable. It's perfect for blogs, portfolio sites, and marketing pages - the kinds of sites most of us actually build day-to-day. If you're new to Metalsmith and want to learn how to use it, stick around. What is Metalsmith? At its core, Metalsmith is a static site generator built on Node.js. But unlike many of its competitors, Metalsmith doesn't force you into rigid templates, prescribed workflows, or complex DevOps configurations. Instead, it follows a simple philosophy: Read files from a source directory Apply transformations through plugins Write the results to a destination directory That's it. This straightforward approach gives you complete control over how your content is processed and transformed. Metalsmith treats your source files as data that can be manipulated with JavaScript, making it versatile without being overwhelming. "Use the Platform" in 2025 Back in 2023, I wrote about the "Use the platform" philosophy in web development. This approach encourages developers to leverage the inherent capabilities of web technologies without relying on complex frameworks and build tools. Two years later, this philosophy is even more relevant. Modern web development has become increasingly complicated. Developers are expected to master intricate build pipelines, complex state management, and du jour toolchains just to create relatively simple websites. It's easy to forget that at its core, the web is about HTML, CSS, and JavaScript - technologies that browsers understand natively. Metalsmith embodies this "Use the platform" mindset by focusing on what matters: transforming content into websites without unnecessary complexity. Instead of forcing you to learn framework-specific abstractions, it works with concepts web developers already understand. The Issue with Modern JavaScript Frameworks Before we explore Metalsmith's advantages in more detail, let's address the elephant in the room: the overwhelming complexity of many modern JavaScript frameworks. Today's popular frameworks often come with: Steep learning curves that require understanding complex concepts before you can build even simple sites Complicated DevOps setups with bundlers, transpilers, and configuration files can be daunting to newcomers Frequent breaking changes that force you to update your codebase just to maintain functionality Heavyweight solutions that add unnecessary complexity to simple blogs, portfolios, or marketing sites When you only need a straightforward website, these frameworks can feel like using a sledgehammer to hang a picture frame. They're powerful tools but often excessive for many common web projects. Why Choose Metalsmith in 2025? Metalsmith offers a simple alternative to framework complexity with several compelling advantages: 1. Stability and Longevity Metalsmith has maintained a consistent, stable API for years. While other frameworks introduce breaking changes with each major version, Metalsmith's core functionality remains reliable. You won't have to rewrite your site every six months to keep up with the latest version. This stability means your investment in learning Metalsmith pays dividends over time. The knowledge you gain today will still be relevant years from now. 2. The Plugin Ecosystem Metalsmith's strength lies in its plugin architecture. Each plugin performs a single, well-defined task, allowing you to build the pipeline you need without unnecessary bloat. Need Markdown processing? Add a plugin. Want layouts? Add another plugin. This modular approach means your build process can be as straightforward or sophisticated as your project requires. And if a plugin is unavailable for the special thing you want to do, it is pretty simple to build one yourself. 3. Complete Control Many modern static site generators make assumptions about how your site should be structured or how content should be organized. Metalsmith makes no such assumptions. It provides the foundation, and you decide how to build upon it. This level of control is invaluable for projects with unique requirements or custom workflows. 4. JavaScript All the Way Metalsmith offers a significant advantage for JavaScript developers: your entire build pipeline uses the same language as your frontend code. There is no need to learn a separate templating language or configuration syntax (unless you want to). Everything is just JavaScript, making it approachable for anyone familiar with Node.js. 5. Minimal Cognitive Load Metalsmith's core is remarkably small—just a few hundred lines of code with a straightforward API. There's not much to learn before you can start being productive. The pipeline approach is intuitive: files go in, transformations happen, and files come out. This simplicity makes Metalsmith easy to reason about, even as your project grows in complexity. Perfect for Blogs, Portfolios, and Marketing Sites Metalsmith is best for projects that don't need the complexity of full-fledged web applications: Personal blogs where you want to focus on writing, not configuring webpack Portfolio sites that showcase your work without unnecessary overhead Marketing websites that need to be fast, reliable, and easy to maintain Documentation sites where content organization and clarity are paramount Metalsmith provides everything you need for these projects without the cognitive burden of more complex frameworks. Who Should Use Metalsmith? Metalsmith is particularly well-suited for: Developers tired of framework churn who want a stable foundation for their projects Content-focused sites like blogs, documentation, or marketing pages Projects with unique or specialized requirements that don't fit neatly into other frameworks JavaScript developers who want to leverage their existing knowledge Teams that value simplicity and maintainability over trendy features Looking Ahead in This Series This blog post is the first in a series that will explore Metalsmith in depth. In the coming articles, we'll: Get started with a simple Metalsmith site Explore site structure and organization best practices Enhance your site with essential plugins Master advanced templating techniques with Nunjucks Integrate components into your content with the M+N plugin Build structured, modular pages with sections Extend Metalsmith with custom plugins and optimizations By the end of this series, you'll have all the knowledge you need to build sophisticated, high-performance sites with Metalsmith. Conclusion While new, hot web development frameworks come and go ( remember Gatsby?), Metalsmith offers a refreshingly stable approach. It provides a clear mental framework for understanding how your site is built, while its plugin architecture gives you the flexibility to add exactly the features you need—nothing more, nothing less. Metalsmith reminds us that sometimes the most powerful solutions are also the simplest. By focusing on doing one thing well—transforming files—Metalsmith provides a foundation that can support everything from simple blogs to complex documentation sites and beyond. The following article will dive into practical territory, setting up a basic Metalsmith project using a starter and building our first pages. Until then, happy building! Ready to get started with Metalsmith? Check out my simple starter and follow along with this series! Any comments? Find me on Bluesky. Share This Post Related Reading Metalsmith Redux - Getting Started Now it's time to set up our first Metalsmith project. Don't worry if you're new to static site generators or even to web development in general. This guide is written to be straightforward and approachable. Metalsmith Redux - The Build Pipeline We examine package.json, one of the most important files in any Node.js project. While it might not be the most exciting file in our project, package.json is crucial. It defines our project, what it depends on, and the commands we can run to build, develop, and maintain it Metalsmith Redux: Conclusion Metalsmith Redux began with a simple premise: amid framework overload, reintroduce Metalsmith as an example of stability and simplicity in an ecosystem obsessed with complexity. --- ### My AI-Assisted Journey with Project Metallurgy - Werner Glinka https://www.wernerglinka.com/writing/ai-assisted-journey-with-project-metallurgy/ CODING My AI-Assisted Journey with Project Metallurgy Mar 4, 2025 The Evolution of Client Needs I've been a web developer for what seems like forever. Over the years, I've witnessed numerous industry shifts, but one of the most significant changes came from an unexpected direction: client security concerns. In recent years, more clients have begun requesting static websites. Their reasoning is sound: better security and improved performance. As malware and ransomware attacks became front-page news, clients who previously insisted on dynamic websites suddenly prioritized security. Static sites, lacking databases and server-side processing, offered protection against SQL injections and many common vulnerabilities. As a developer, I welcomed this shift. Building static websites is a refreshing return to the fundamentals - clean HTML, CSS, and JavaScript without the overhead of complex CMS platforms. The simplicity brings a certain joy to the craft and allows for blazing-fast performance that makes developers and users happy. The Content Management Dilemma However, this technical renaissance had a significant drawback. While developing static sites was enjoyable from a technical perspective, managing content became a nightmare for non-technical users. The average marketing professional who comfortably navigates WordPress's admin panel doesn't want to learn Git, open a code editor, or understand the difference between Markdown and HTML. I still remember the moment this problem crystallized for me. A long-term client called, frustrated because they needed to update a product description on their new static site: "I just want to change three words on our homepage. Why do I need to always email you instead of doing it myself like before?" She was right. The technical benefits of static sites were clear to me, but they would be meaningless if the content couldn't be easily updated by those who needed to manage it. This conversation sparked an idea: What if I could build a simple GUI application that allows non-technical users to update content on static sites without touching code? Thus, the concept of Project Metallurgy was born. Venturing into Unknown Territory The concept seemed straightforward: Create a desktop application with a form-based interface for content editing. Users can make changes, and the app handles the technical aspects of updating the static site. The problem? I had never built a desktop application before, and my expertise was firmly in web development. After researching different options, Electron emerged as the natural choice. It would allow me to leverage my existing JavaScript skills while creating a cross-platform desktop experience. But despite my years of web development experience, building an Electron app presented a steep learning curve. I spent weeks watching tutorials, reading documentation, and experimenting with basic examples. Progress was slow. The web-to-desktop development shift involved new concepts, different architectural patterns, and unfamiliar tooling. While I could build simple prototypes, creating a production-ready application that non-technical users could rely on seemed increasingly daunting. The AI Turning Point That's when AI entered the picture, though not by deliberate choice. ChatGPT had dominated the tech headlines for a while; initially skeptical, I decided to try it with a specific Electron problem I'd been stuck on for days. The results were immediate and impressive. Within minutes, I had a working solution and, more importantly, an explanation that helped me understand where I'd gone wrong. This first experience was eye-opening - AI wasn't just providing answers but accelerating my learning process. My journey with AI tools evolved rapidly. While ChatGPT initially impressed me, I soon discovered Claude, which provided a noticeably more personal experience. Working with Claude felt less like interacting with a tool and more like collaborating with a human co-programmer. The conversations were more natural, and Claude better contextualized my project's architecture and goals. From then on, AI became my coding companion as I built the application. When I needed to implement file system access for the first time in Electron, AI provided code examples and security considerations. When I struggled with IPC communication between the main and renderer processes, AI offered clear explanations that documentation had made needlessly complex. The Rollercoaster Experience Working with AI as I developed this application became a rollercoaster. One moment, it would provide brilliant, well-thought-out approaches that saved work hours. The next, it would forget basic context or confidently suggest nonsensical solutions. I remember asking for help implementing a file-watching system to detect changes in the content directory. The AI responded with a comprehensive solution that addressed my immediate need and anticipated edge cases I hadn't considered. It felt like working with a senior developer who had built similar systems before. Yet, in the same conversation, when I asked how to integrate this new functionality with the existing codebase, the AI suddenly seemed to forget everything about the project's architecture we had discussed extensively. It suggested approaches that contradicted our earlier decisions and would have introduced unnecessary complexity. This unpredictability meant I couldn't simply hand control to the AI. Instead, I had to become an effective collaborator, learning to provide clear context, ask specific questions, and carefully evaluate suggestions against my understanding of best practices and the project's needs. Architectural Transformation As development progressed, I faced another challenge. My initial implementation used plain JavaScript with minimal structure, and it was becoming unwieldy as features were added. The AI suggested refactoring with Vite/React, which would improve modularity and maintainability. This was a significant architectural shift, but the transition was smoother with AI assistance than I could have managed alone. We refactored the codebase incrementally, module by module, maintaining functionality while improving code quality. The AI helped generate component structures, suggested state management patterns, and identified potential issues in my implementation. What struck me most during this process was how AI complemented my development style. When I explained that I preferred functional programming approaches with dependency injection, its suggestions were tailored accordingly. When I emphasized the importance of separating concerns, it helped ensure each module had a single responsibility. It respected my preference for robust documentation and clean architecture without imposing its own opinions. Beyond Just Coding The benefits of AI extend beyond writing code. It helped me draft comprehensive documentation, create user guides for non-technical clients, and generate test cases that covered edge scenarios I might have overlooked. When I struggled to explain complex technical concepts to clients, the AI provided clear explanations that anyone could understand. Testing was another area where AI proved invaluable. The AI recommended Jest for unit testing and helped generate test suites that achieved high coverage. What previously would have taken days of tedious writing and debugging was reduced to hours of collaborative refinement. The Reality Check Despite these benefits, working with AI wasn't without frustrations. The longer a session continued, the more likely the AI would lose context or make basic mistakes. I learned to start fresh conversations for new features rather than continuing endless threads. There were also times when the AI confidently provided incorrect information, particularly about Electron-specific behaviors or edge cases in the filesystem API. I learned to verify suggestions against documentation and test thoroughly before implementation. The most valuable lesson was understanding that AI functions best as a thought partner and accelerator, not a replacement for developer judgment. It could generate boilerplate, suggest approaches, and help troubleshoot issues, but the final architecture decisions and quality control remained my responsibility. Where I Am Today Metallurgy is close to being the tool I envisioned, allowing non-technical users to update content on static websites easily. They can modify product descriptions, update images, and publish blog posts without knowing HTML or Git. Static sites maintain their security and performance advantages while content management becomes accessible to everyone. Metallurgy still needs more work, and I invite interested developers to check out the GitHub repo. I am open to new ideas and would love to discuss future enhancements. I plan some blog posts about Metallurgy that I will write in detail about. AI has assisted me in accelerating my journey from web developer to desktop application creator, but it wasn't without challenges. Like many developers today, I've had to develop new skills—not just in Electron and desktop development but also in effectively collaborating with AI tools. My Evolution Through AI Tools As my project grew in complexity, so did my AI toolkit. While Claude.io's browser-based interface is excellent for conceptual discussions, it created a workflow bottleneck. I found myself constantly switching between the browser and VSCode, copying and pasting code snippets back and forth. GitHub Copilot was the next logical step in my AI journey. Its direct integration into VSCode eliminated the context-switching problem, allowing me to receive suggestions directly within my development environment. This felt like a significant upgrade - the AI was now meeting me where I worked rather than requiring me to seek it out. The evolution continued with Augment Code, which took the VSCode integration to another level by working with my entire workspace context. Rather than making isolated suggestions based on the current file, it can understand relationships between components across the codebase, making its recommendations more architecturally sound. The most transformative step came just last week with Claude Code, Anthropic's agentic command-line tool. Claude Code can autonomously execute tasks through the command line, unlike previous AI coding assistants that merely suggested code. It can analyze the codebase, plan refactoring strategies, implement changes, run tests, and cycle through improvements with minimal human intervention. What makes Claude Code particularly powerful is its ability to maintain deep context about the entire project while executing multiple steps in a workflow. For instance, when I needed to refactor how the application handled file paths across various components, Claude Code could identify all affected files, design a consistent approach, implement the changes, ensure tests passed, and commit the results. This task would have previously taken hours of careful consideration. The tool also excels at handling repetitive tasks. When implementing new features that follow established architectural patterns in my codebase, Claude Code can generate all necessary components, tests, and integration points while maintaining consistency with existing code. This isn't just about saving time; it's about maintaining quality and coherence across the project. But as I said before, trust but verify. Even Claude Code may hallucinate. Looking Forward The next phase of this journey is to make Metallurgy an open-source project. Other developers encounter similar challenges with managing static site content, and a community-supported solution could benefit many. AI will continue to play a role in this evolution by helping to manage contributions, improve documentation, and refine features based on community feedback. I don't believe AI will replace developers - the rollercoaster experience of brilliant insights followed by bogus mistakes makes that clear. However, it has fundamentally changed how I approach development problems and expanded my ability as a single developer. For those just beginning to incorporate AI into their development workflow, I offer this advice: treat AI as a collaborative partner rather than an autopilot. Be specific in your requests, verify suggestions against established best practices, and don't be afraid to start fresh when conversations go off track. Most importantly, maintain your developer judgment - AI is a powerful tool, but you remain the architect of your solutions. Development has changed dramatically with the introduction of AI tools, and those of us navigating this new territory are simultaneously pioneers and guinea pigs. The ride is unpredictable, sometimes frustrating, but ultimately transformative. I'm excited to see where it leads next. Any comments? Find me on Bluesky. Share This Post Related Reading AI as a Development Partner: My Experience with Claude and GitHub Copilot I've been integrating AI tools into my daily workflow, and I want to share my perspective on how they're transforming software development - not by replacing developers, but by enhancing our capabilities and productivity. The Missing Piece: Bundled Components Plugin Building a Metalsmith plugin with Claude revealed that effective AI collaboration isn't about prompt engineering—it's about exploring problems through dialogue until solutions emerge naturally. Making the Switch: GitHub Copilot to Augment Code While Copilot excels at line-by-line suggestions, Augment Code understands your entire codebase as context. This isn't just a marketing pitch - it's a game-changer in practice. --- ### Making the Switch: GitHub Copilot to Augment Code - Werner Glinka https://www.wernerglinka.com/writing/switching-to-augment-code/ CODING Making the Switch: GitHub Copilot to Augment Code Jan 2, 2025 I always look for tools to enhance my productivity, and I've spent considerable time with GitHub Copilot. While it's been a reliable companion, I recently discovered Augment Code, which completely transformed my development workflow. The Limitations I Found with Copilot Don't get me wrong - Copilot is impressive. Its real-time code suggestions and ability to complete lines of code made my life easier, but it has some drawbacks: While Copilot excels at line-by-line suggestions, it often struggles with broader context. It's like having a partner who's great at individual tasks but sometimes misses the bigger picture. Also, the hallucinations - those moments when Copilot suggests code that looks good but doesn't quite work - became increasingly frustrating to deal with. Enter Augment Code When I first heard about Augment Code, backed by Eric Schmidt's venture fund, I was intrigued but skeptical. Another AI coding assistant? Did I need one? As I quickly discovered, the answer was a resounding yes. Augment Code's ability to understand my entire codebase as context is what sets it apart. This isn't just a marketing pitch—it's a game-changer in practice. When working on a complex feature or refactoring, Augment Code sees not just the file you're working on but how it fits into your broader project architecture. The Real-World Impact Here's where the rubber meets the road. In my recent project, a desktop content management app, Augment Code, proved its worth in several ways: Contextual awareness meant fewer conflicts with existing code patterns. When suggesting new implementations, it understood and respected the architectural decisions I'd made earlier in the project, saving hours of refactoring work. The reduction in hallucinations was dramatic. While no AI is perfect, Augment Code's suggestions felt more grounded in my actual codebase than the generic patterns it learned from training data. Most importantly, for open-source developers, it's free. This shouldn't be understated—it democratizes access to advanced AI development tools. Making the Transition The switch from Copilot to Augment Code was surprisingly seamless. The transition was easy since Augment Code uses a similar UI to Copilot in VS Code. There was no steep learning curve or adjustment period - it just worked. What stands out is that Augment Code isn't just another code completion tool—it's like having a competent co-programmer intimately familiar with my entire project. This deeper understanding of the codebase sets it apart while maintaining the familiar interface I've grown accustomed to. Looking Forward AI-assisted coding tools are evolving rapidly, and tools like Augment Code raise the bar for what we should expect from these assistants. While Copilot played a major role in my first experience with AI-assisted development, Augment Code represents the next step. For developers considering making the switch, give it a genuine try. The tiny, initial adjustment period is worth it for the long-term productivity and code quality gains. The future of development isn't just about writing code faster—it's about writing better, more contextually aware code and tools like Augment Code leading the way. Now, I can't wait to see what Co-pilot's answer is to this challenge. What's your experience with AI coding assistants? Have you tried Augment Code? Share your thoughts on Bluesky. Share This Post Related Reading AI as a Development Partner: My Experience with Claude and GitHub Copilot I've been integrating AI tools into my daily workflow, and I want to share my perspective on how they're transforming software development - not by replacing developers, but by enhancing our capabilities and productivity. Beyond the Black Box How Markdown's marked extension API turned five verbose YAML sections into one clean component — and why I never noticed the capability was there all along. My AI-Assisted Journey with Project Metallurgy My AI journey evolved from ChatGPT to Claude, which felt like having a human co-programmer. Then GitHub Copilot eliminated context-switching, followed by Claude Code automating entire workflows. --- ### AI as a Development Partner: My Experience with Claude and GitHub Copilot - Werner Glinka https://www.wernerglinka.com/writing/ai-as-a-development-partner/ CODING AI as a Development Partner: My Experience with Claude and GitHub Copilot Nov 28, 2024 As a developer, I've been integrating AI tools into my daily workflow, and I want to share my perspective on how they're transforming software development - not by replacing developers, but by enhancing our capabilities and productivity. The Current AI Toolkit My current setup involves two main AI tools: GitHub Copilot for immediate coding assistance Claude (Anthropic's AI assistant) for more complex development tasks While many view AI as a threat to development jobs, my experience tells a different story. These tools function more like highly knowledgeable partners that augment my development process rather than replace my role as a developer. Different Tools for Different Needs I've found that each tool has its sweet spot in the development process. Copilot excels at providing real-time code suggestions and optimizations while I'm writing code. It's like having an intelligent autocomplete that understands programming patterns and can suggest the next few lines of code. Claude, on the other hand, shines in higher-level discussions about architecture and complex problem-solving. I use it for: Project architecture discussions Complex function development Code optimization Deep diving into specific technical challenges The Iteration Process What's particularly interesting is how the interaction with Claude unfolds. It often starts with broad, enthusiastic suggestions that might go beyond the immediate scope. However, this "overshooting" leads to productive iterations where I refocus the discussion on critical aspects. This back-and-forth process has consistently led to improved solutions that I might not have considered otherwise. Benefits Beyond Code One unexpected benefit has been how these interactions force me to think more deeply about my projects. When explaining requirements to Claude or discussing trade-offs, I often gain new insights into my own code and architectural decisions. The AI's ability to suggest optimizations has helped me write more efficient code and learn new patterns and approaches. A Partnership Model Rather than viewing AI as a replacement for developers, I've found it to be an invaluable partner in the development process. Even though Claude can often suggest more optimized code than what I might write initially, my role as the architect and decision-maker remains crucial. I guide the development process, maintain the project's vision, and make the final calls on implementation decisions. Looking Forward This partnership model with AI tools points to an exciting future for software development. Instead of fearing AI as a job killer, we should embrace it as a powerful tool that can enhance our capabilities and productivity. The key is understanding how to effectively integrate these tools into our workflow and leverage their strengths while maintaining our crucial role as decision-makers and problem solvers. The future of development isn't about AI replacing developers - it's about developers who understand how to work with AI tools becoming dramatically more productive than those who don't. Any comments? Find me on Bluesky. Share This Post Related Reading Making the Switch: GitHub Copilot to Augment Code While Copilot excels at line-by-line suggestions, Augment Code understands your entire codebase as context. This isn't just a marketing pitch - it's a game-changer in practice. My AI-Assisted Journey with Project Metallurgy My AI journey evolved from ChatGPT to Claude, which felt like having a human co-programmer. Then GitHub Copilot eliminated context-switching, followed by Claude Code automating entire workflows. The Missing Piece: Bundled Components Plugin Building a Metalsmith plugin with Claude revealed that effective AI collaboration isn't about prompt engineering—it's about exploring problems through dialogue until solutions emerge naturally. --- ### Building a Modern HTML Optimizer for Metalsmith - Werner Glinka https://www.wernerglinka.com/writing/building-metalsmith-html-optimizer/ CODING Building a Modern HTML Optimizer for Metalsmith Nov 20, 2024 The Metalsmith ecosystem needed a fresh approach to HTML optimization. Metalsmith HTML Minifier was once the go-to plugin. However, it has grown stale due to unaddressed security issues. It is built as a wrapper for HTML Minifier, which has a security fix, but sadly, the wrapper has not been updated. This gap prompted me to build a new solution with modern development practices while maintaining simplicity and security. Learning from the Past, Building for Today I began by studying HTMLCompressor, a tool that set the standard for HTML optimization. Its feature set provided valuable insights into what developers need. But HTML Compressor was released 12 years ago and browsers are very different now. This perspective made me realize that not all optimizations are equally useful, and some might even be harmful if applied indiscriminately. Architecture: Options-Driven Optimizer Loading The plugin's architecture reflects my belief in modularity and efficient resource usage. I built a system in which each optimization module has a single purpose, is self-contained and independent from others. The plugin loads these modules dynamically based on user options. At its core lies a simple mapping: javascriptconst OPTIMIZER_MAP = { // Core optimizer - always loaded whitespace: ''whitespace.js'', // Optional optimizers - loaded based on options removeComments: ''comments.js'', removeTagSpaces: ''tag-spaces.js'', // ... other optimizers }; This map serves as configuration and documentation, showing which options correspond to which optimizers. When the plugin runs, it examines the user's options and loads only the necessary optimizers. This approach keeps the memory footprint minimal and the processing efficient. The Core Architecture I followed a simple concept: optimization should be modular and efficient, loading only what's needed. Each optimizer is an independent module focused on a specific task. The main plugin loads these optimizers and runs them based on user configuration. Consider how a typical Metalsmith build might optimize HTML: javascriptMetalsmith(__dirname) .use(optimizeHTML({ removeComments: true, cleanUrlAttributes: true })) When the plugin initializes, it examines these options and dynamically imports only the required optimizers. The whitespace optimizer, which is fundamental to my approach, always loads. The comments and URL attribute optimizers are loaded only when explicitly requested. This architectural decision proved valuable when I discovered how different optimizers might interact. For instance, the whitespace optimization must preserve formatting in specific HTML elements like
     and . I could refine this logic without touching other optimizations by keeping this logic in a dedicated module.
    
    Evolution Through Real-World Use
    
    The development process taught me valuable lessons about HTML optimization in modern Web development. Initially, I tried to do too much, offering every conceivable optimization option. However, as I tested with real Metalsmith sites, I found that aggressive optimization often provided diminishing returns while increasing the risk of problems.
    
    When I tested the plugin on a documentation site, I was surprised that the default whitespace optimization reduced file sizes by 28% while enabling additional optimizations barely improved that figure. This insight shaped my philosophy: start with safe, effective defaults and make additional optimizations optional.
    
    Architecture Deep Dive
    
    The modular architecture I developed isn't just about loading optimizers - it's about making them work together seamlessly. Each optimizer follows a consistent pattern:
    
    javascriptexport const commentOptimizer = {
     name: ''comment'',
     optimize: (content, { removeComments = false } = {}) => {
     if (!removeComments) return content;
     return content.replace(//g, '''');
     }
    };
    
    This pattern brings several advantages. Each optimizer has an optimize function that handles its options, defines its default behavior, and focuses on a single responsibility. The main plugin then orchestrates these optimizers, running them in a specific order:
    
    javascriptcontent = activeOptimizers.reduce((result, optimizer) =>
     optimizer.optimize(result, options),
     content
    );
    
    This sequential processing proved crucial when dealing with interdependencies. For example, whitespace optimization must run before tag space normalization to ensure consistent results.
    
    Real-World Evolution
    
    My understanding of what makes an effective HTML optimizer evolved through real-world testing. One site I worked with had a mix of regular content and code examples:
    
    Test Example
    
    html

    Coding Tutorial

    Here's how to do it:

    
     function example() {
     return 42;
     }
     
    Initial versions of the plugin aggressively collapsed all whitespace, breaking the code examples. This led me to develop a more nuanced approach that preserves formatting in critical elements while optimizing everything else: javascriptexport const whitespaceOptimizer = { name: ''whitespace'', optimize: (content) => { const preserveTags = [''pre'', ''code'', ''textarea'', ''script'', ''style'']; // Store preserved content const preserved = []; const processedHtml = content.replace( new RegExp(`(<(${preserveTags.join(''|'')})[^>]*>[\\s\\S]*?)`, ''gi''), (match) => { preserved.push(match); return `___PRESERVE_${preserved.length - 1}___`; } ); // Process remaining content let result = processedHtml .split(/(<[^>]+>)/g) .map(part => part.startsWith(''<'') ? part : part.replace(/\s+/g, '' '').trim()) .join(''''); // Restore preserved content return preserved.reduce( (text, content, i) => text.replace(`___PRESERVE_${i}___`, content), result ).trim(); } }; Optimizing for the Modern Web In modern websites, URLs can be found in various contexts: html Each of these URLs required special consideration. Should I remove protocols from social media meta tags? What about SVG namespaces? Real-world testing shows that blanket rules rarely work. Instead, I developed context-aware optimizations that understand the semantics of different HTML elements. Learning Through Code Perhaps the most valuable lesson came from watching how different optimization combinations interact. Consider this example: javascriptMetalsmith(__dirname) .use(optimizeHTML({ removeComments: true, removeTagSpaces: true, cleanUrlAttributes: true })); Test Input HTML html Test Output HTML html
    test
    The order of operations matters here. Comment removal, tag space normalization, and URL cleaning each transform HTML. My modular architecture ensures these optimizations work together predictably and efficiently. A Foundation for the Future The path to building a modern HTML optimizer taught us that modularity isn't just about clean code, security, and maintainability. I created a system where each part can be audited, tested, and updated independently by breaking down optimization into discrete, focused modules. This approach contrasts monolithic solutions, which often become security risks as they age. When I first examined why the previous HTML minifier became problematic, the issue was clear: its dependency on multiple NPM packages, some of them abandoned, meant that any security issue in any of these libraries affected the entire system. My modular approach, which only uses one NPM package used by NPM itself, minimizes this risk. This modularity extends beyond security. As web standards evolve and new HTML features emerge, my architecture allows us to add new optimizations without touching existing code. Want to optimize the latest HTML features? Create a new optimizer module and add it to the system. The plugin's core remains untouched, maintaining its stability while growing its capabilities. As a result, I see significant file size reductions in production environments with zero compatibility issues. More importantly, developers can confidently use the plugin knowing it follows the principle of least surprise—it's safe by default and explicit in its optimizations. I built this plugin to optimize HTML and escape NPM Dependency Hell. Through a modular architecture and real-world testing, I've built a foundation that will be reliable for future optimizations. The journey from studying HTMLCompressor to creating a modern, secure optimizer has been interesting. I hope this approach to plugin development—emphasizing modularity, security, and real-world testing—inspires others in the Metalsmith community and beyond. The plugin is available on GitHub and NPM. I welcome feedback and contributions to make it even better. Share This Post Related Reading Metalsmith Plugin Template While working on the blog series Metalsmith Redux (Static Site Generation in 2025), I developed several new plugins with the assistance of Claude AI, which led me to create a standardized template for Metalsmith plugins. Introducing Metalsmith SEO The Metalsmith SEO plugin automatically generates HTML meta tags, Open Graph properties, Twitter Cards, JSON-LD structured data, a robots.txt file and a sitemap from a single source of truth. Building Advanced Search for Metalsmith Existing search plugins for Metalsmith are ancient—most are effectively abandoned. This new metalsmith plugin uses Fuse.js as the foundation --- ### AI, Labor & Culture - Werner Glinka https://www.wernerglinka.com/writing/ai-labor-culture/ AI, Labor & Culture Category All AI, Labor & Culture Art Coding September 14, 2026 We Built These Systems Last week an Anthropic researcher resigned with a warning that the models may kill us all, and every story said two companies have to fix it. Two companies did not build the internet. The systems the rest of us built assume one slow attacker who can be caught, and an agent is neither. The part that matters is ordinary engineering, and it does not wait on alignment. September 9, 2026 Nobody Had to Care The AfD’s 44 percent in Saxony-Anhalt is not a poverty story. Unemployment was three times higher twenty years ago and the far right got 13. It is the story of a region governed for thirty years by parties that nothing there could reach, and of a party that showed up when nobody else did. August 30, 2026 Walking the California Coastal Trail A morning walk on the California Coastal Trail from Miramar to Francis Beach. Pelicans, cypresses, a fence full of painted boards, and a concrete foundation nobody can identify. July 17, 2026 Between the Silence and the Spectacle I was drafted into the silence of postwar Germany and arrived in the spectacle of Reagan's America. Germany built a culture that could not celebrate its soldiers; America built one that could not hold its wars to account. Now Germany is being asked to rearm, and the question is whether anything exists between the two. June 10, 2026 Legally, Again The Weimar takeover was legal, not a mob. The same mechanism ran in Hungary, ran in Poland, and is running in the United States. An election changes the tenant; it does not dismantle the building. Structure helps, but structure assumes honoring. May 14, 2026 That's Just How It Is What caused the K-curve, and why don't American workers organize against the way they are being exploited? A 1971 confidential memo to the U.S. Chamber of Commerce, fifty years of patient counter-mobilization across think tanks, courts, and political institutions, and a labor architecture built to require continuous firm-by-firm reorganizing. The asymmetry was by design. May 2, 2026 We Kept Growing. Most People Didn’t The pronatalist alarm and the AI displacement alarm arguing about the same problem from opposite sides. Both assume the growth model is intact. It has not been. The forty years since 1980 were workarounds — debt, asset inflation, immigration, central bank intervention — that kept the appearance of growth going while the broad-based productive expansion stopped happening for most of the population. AI removes the last workaround. April 23, 2026 Our Faith? Federal agencies under Trump's second term are speaking to workers in the first-person plural of Christian faith — USDA Easter emails, monthly agency prayer services, an OPM memo permitting workplace proselytizing. Federal whistleblower confidence collapsed from 71.9% to 22.5% in a single year. The establishment clause is eroding inside workplaces where saying you are uncomfortable risks your career. April 18, 2026 A Talisman Against Fascism — In Loring Park The Center for People and Craft is an emerging urban folk school in Minneapolis — a place where cross-cultural connection happens person to person, hand to hand, without hierarchy or gatekeeping. April 14, 2026 Who Fired You Stanford's 2026 AI Index shows a widening gap between what AI experts believe and what everyone else believes. Sarah Perez at TechCrunch treats it as a puzzle. It isn't. The experts are looking at what AI could do. The public is looking at what AI is being used to do to them. 'AI is taking jobs' is a grammatical evasion. My father's generation lost their livelihoods and kept their vocabulary: Krupp. Thyssen. The ministers in Bonn. « ‹ 1 2 › » --- ### AI, Labor & Culture - Werner Glinka https://www.wernerglinka.com/writing/ai-labor-culture/2/ AI, Labor & Culture Category All AI, Labor & Culture Art Coding April 11, 2026 Is Anthropic vital for US Security? On Wednesday, April 8, Treasury Secretary Scott Bessent and Federal Reserve Chair Jerome Powell summoned the CEOs of America’s largest banks to an urgent, unscheduled meeting. The subject was a single AI model — Claude Mythos Preview, built by Anthropic April 3, 2026 The Wrong Argument The public debate about AI displacement focuses on headline layoffs — visible, contested, and partially fabricated. The real mechanism is quieter. Vertical AI platforms embedded in industry software absorb labor through updates, one unbackfilled position at a time. By the time the data catches up, the displacement is structural. March 28, 2026 Notes on David French’s “How Can America Be So Miserable When It’s So Rich?” David French describes America’s tiered economy as a cultural problem. It’s not. It’s the result of deliberate policy decisions over four decades — weakening labor, favoring capital, enabling buybacks — that recalibrated who the economy serves. AI will compress the number of humans capital needs even further. March 25, 2026 Coal and Steel The comparison between AI and coal isn’t about technology. It’s about cognitive lock-in — what happens when an entire economy organizes around one assumption and can’t see the disruption because it’s inside it. Germany did everything right and still produced 38% poverty in Gelsenkirchen. That’s not the failure story. That’s the success story. March 21, 2026 My Claude Wishlist I use Claude for intellectual work: developing arguments across sessions, stress-testing ideas, writing essays, and building software. It’s the most productive working relationship I’ve had with a tool — and I keep running into the same wall. March 10, 2026 Not Yet 'Not yet' is not a reassurance. It's a diagnosis. Anthropic's own research shows a 14% drop in job-finding rates for young workers in AI-exposed fields. The data says the displacement hasn't hit yet. The structure says it's already underway. I grew up inside that gap in Gelsenkirchen — I know what it looks like when 'not yet' becomes 'too late.' February 23, 2026 The Corporate Benevolence Fantasy The promise that AI will make everything cheaper rests on one assumption — that corporations will pass their savings to consumers. The forty-year productivity-pay gap says they won't. The 2017 tax cut dress rehearsal says they won't. And $1.6 trillion in shareholder buybacks in a single year confirms they aren't. February 16, 2026 I've Seen This Before I grew up in Gelsenkirchen, in the Ruhr Valley, and watched coal and steel collapse over decades. Retraining never worked at scale. The trades offer a reprieve, not an escape. And the science fiction writers have been ahead of the economists for seventy years — a structural problem requires a structural response. February 11, 2026 Who Buys What We Build? U.S. employers cut 1.2 million jobs in 2025 while posting record profits and pouring tens of billions into AI. AI didn't break capitalism. It exposed a version of capitalism that had already stopped distributing its gains. « ‹ 1 2 › » --- ### Art - Werner Glinka https://www.wernerglinka.com/writing/art/ Art Category All AI, Labor & Culture Art Coding March 6, 2026 The Boats That Found Me The stadium form came from Gelsenkirchen — from Schalke, from the industrial geometry of the Ruhrpott. But another shape found me in California, and it came from the water. February 25, 2026 The Shapes That Stay In "The Other Side of Things," I wrote about returning to art-making after a ten-year hiatus. What surprised me is that some things apparently never left. January 6, 2026 The Other Side of Things You know me from my Metalsmith work - static site generators, component architectures, the case for simplicity over framework churn. That is one side of what I do. There is another, and it has been part of my life longer than web development. --- ### Coding - Werner Glinka https://www.wernerglinka.com/writing/coding/ Coding Category All AI, Labor & Culture Art Coding April 15, 2026 MCP Server v2.0: Modernizing the Toolchain Six months after reaching 1.0.0, metalsmith-plugin-mcp-server hits 2.0.0 with its first real breaking change: the toolchain every scaffolded plugin inherits has been modernized. March 10, 2026 Beyond the Black Box How Markdown's marked extension API turned five verbose YAML sections into one clean component — and why I never noticed the capability was there all along. February 24, 2026 From Metalsmith to Eleventy - SEO Without External Dependencies Implementing SEO for a bilingual Eleventy site using templates instead of plugins—covering meta tags, Open Graph, hreflang, JSON-LD structured data, and sitemaps. February 17, 2026 From Metalsmith to Eleventy - Building a Bilingual Site Implementing a full English-German bilingual site with Eleventy, covering directory structure, language-aware navigation, breadcrumbs, a language switcher, and per-language collections. February 10, 2026 From Metalsmith to Eleventy - Porting an Actual Site The practical experience of migrating an art website from Metalsmith to Eleventy, including navigation issues, data access patterns, and what the fixes revealed about platform assumptions. February 3, 2026 From Metalsmith to Eleventy - The Accidental Abstraction How a Metalsmith component library turned out to be a platform-agnostic Nunjucks library, and why the components ported to Eleventy without a single template change. January 27, 2026 From Metalsmith to Eleventy - A Natural Progression Why I moved from Metalsmith to Eleventy for my art website, what carried over, and why the skills and mental models transfer between static site generators. January 12, 2026 Scheduled Publishing for Static Sites How to implement scheduled content publishing for static sites using date-based filtering and automated daily builds with GitHub Actions and Netlify. January 6, 2026 Metalsmith Redux - The Next Chapter From blog series to living infrastructure. The Metalsmith Component Library has grown, and we're building a SKILL that lets Claude guide beginners through creating real websites. November 7, 2025 Building Advanced Search for Metalsmith Existing search plugins for Metalsmith are ancient—most are effectively abandoned. This new metalsmith plugin uses Fuse.js as the foundation « ‹ 1 2 3 4 › » --- ### Coding - Werner Glinka https://www.wernerglinka.com/writing/coding/2/ Coding Category All AI, Labor & Culture Art Coding October 30, 2025 Metalsmith Redux: Conclusion Metalsmith Redux began with a simple premise: amid framework overload, reintroduce Metalsmith as an example of stability and simplicity in an ecosystem obsessed with complexity. September 14, 2025 The Missing Piece: Bundled Components Plugin Building a Metalsmith plugin with Claude revealed that effective AI collaboration isn't about prompt engineering—it's about exploring problems through dialogue until solutions emerge naturally. August 25, 2025 The Anatomy of Section Components A look at real Metalsmith components to understand how they work, why they're designed this way, and the patterns that make them powerful. From configuration to templates to optimized bundles. August 23, 2025 Introducing Metalsmith SEO The Metalsmith SEO plugin automatically generates HTML meta tags, Open Graph properties, Twitter Cards, JSON-LD structured data, a robots.txt file and a sitemap from a single source of truth. August 7, 2025 Introducing the Structured Content Starter Transform how you build static sites with structured content. The Metalsmith2025 structured content starter brings component architecture, smart dependency bundling, and fluid responsive design - no frameworks needed. August 5, 2025 MCP Server Development: Evolution Metalsmith Plugin MCP Server is a good example of how AI can assist in development. But what started over a weekend turned into a real development framework, shaped by real-world usage, trial-and-error, and a growing understanding of how AI needs to be guided, not just invited. July 24, 2025 MCP Server Development: Integrating Claude AI Discover how to use Claude AI and MCP servers to automate plugin development. A step-by-step weekend project that transforms repetitive Metalsmith plugin creation into an AI-powered conversation, complete with testing examples and practical insights. June 23, 2025 Beyond Markdown: Building Sectioned Webpages Instead of starting with content and adding MDN components, what if we began with components and composed them into pages? May 24, 2025 The JavaScript Framework Carousel Developers celebrate migrating blogs to Astro or Next.js, describing complex build processes as 'easier than React.' But why does a blog need to fly? Sometimes simple tools are the sophisticated choice. May 20, 2025 Metalsmith Plugin Template While working on the blog series Metalsmith Redux (Static Site Generation in 2025), I developed several new plugins with the assistance of Claude AI, which led me to create a standardized template for Metalsmith plugins. « ‹ 1 2 3 4 › » --- ### Coding - Werner Glinka https://www.wernerglinka.com/writing/coding/3/ Coding Category All AI, Labor & Culture Art Coding May 9, 2025 Beyond Markdown: Structured Components We explore a common challenge when working with Markdown-based content: how do you include structured, reusable components within your long-text content? April 28, 2025 Metalsmith Redux - Templating with Nunjucks Templating with Nunjucks is central to how Metalsmith transforms content into a polished website. It provides the structure and logic needed to create consistent, maintainable sites while keeping content separate from presentation April 24, 2025 Metalsmith Redux - The Build Pipeline We examine package.json, one of the most important files in any Node.js project. While it might not be the most exciting file in our project, package.json is crucial. It defines our project, what it depends on, and the commands we can run to build, develop, and maintain it April 21, 2025 Metalsmith Redux - Dependencies and Scripts We examine package.json, one of the most important files in any Node.js project. While it might not be the most exciting file in our project, package.json is crucial. It defines our project, what it depends on, and the commands we can run to build, develop, and maintain it. April 19, 2025 Metalsmith Redux - Starter Files Structure Understanding the file structure of a Metalsmith project is key to working with it effectively. Don't worry if it seems a bit overwhelming at first—we'll walk through each part step by step, explaining what it does and why it matters. April 17, 2025 Metalsmith Redux - Getting Started Now it's time to set up our first Metalsmith project. Don't worry if you're new to static site generators or even to web development in general. This guide is written to be straightforward and approachable. April 15, 2025 Metalsmith Redux - Static Site Generation in 2025 Let's talk about Metalsmith. It's a static site generator that's been around for a while, and for good reason. Metalsmith keeps things simple and stable. It's particularly good for the kind of sites most of us actually build day-to-day. March 4, 2025 My AI-Assisted Journey with Project Metallurgy My AI journey evolved from ChatGPT to Claude, which felt like having a human co-programmer. Then GitHub Copilot eliminated context-switching, followed by Claude Code automating entire workflows. January 2, 2025 Making the Switch: GitHub Copilot to Augment Code While Copilot excels at line-by-line suggestions, Augment Code understands your entire codebase as context. This isn't just a marketing pitch - it's a game-changer in practice. November 28, 2024 AI as a Development Partner: My Experience with Claude and GitHub Copilot I've been integrating AI tools into my daily workflow, and I want to share my perspective on how they're transforming software development - not by replacing developers, but by enhancing our capabilities and productivity. « ‹ 1 2 3 4 › » --- ### Coding - Werner Glinka https://www.wernerglinka.com/writing/coding/4/ Coding Category All AI, Labor & Culture Art Coding November 20, 2024 Building a Modern HTML Optimizer for Metalsmith Building a modern HTML optimizer for Metalsmith: From being inspired by HTMLCompressor's features to creating a modular plugin with effective HTML optimization without compromising security. « ‹ 1 2 3 4 › » --- ### Writing - Werner Glinka https://www.wernerglinka.com/writing/ Writing Category All AI, Labor & Culture Art Coding September 14, 2026 We Built These Systems Last week an Anthropic researcher resigned with a warning that the models may kill us all, and every story said two companies have to fix it. Two companies did not build the internet. The systems the rest of us built assume one slow attacker who can be caught, and an agent is neither. The part that matters is ordinary engineering, and it does not wait on alignment. September 9, 2026 Nobody Had to Care The AfD’s 44 percent in Saxony-Anhalt is not a poverty story. Unemployment was three times higher twenty years ago and the far right got 13. It is the story of a region governed for thirty years by parties that nothing there could reach, and of a party that showed up when nobody else did. August 30, 2026 Walking the California Coastal Trail A morning walk on the California Coastal Trail from Miramar to Francis Beach. Pelicans, cypresses, a fence full of painted boards, and a concrete foundation nobody can identify. July 17, 2026 Between the Silence and the Spectacle I was drafted into the silence of postwar Germany and arrived in the spectacle of Reagan's America. Germany built a culture that could not celebrate its soldiers; America built one that could not hold its wars to account. Now Germany is being asked to rearm, and the question is whether anything exists between the two. June 10, 2026 Legally, Again The Weimar takeover was legal, not a mob. The same mechanism ran in Hungary, ran in Poland, and is running in the United States. An election changes the tenant; it does not dismantle the building. Structure helps, but structure assumes honoring. May 14, 2026 That's Just How It Is What caused the K-curve, and why don't American workers organize against the way they are being exploited? A 1971 confidential memo to the U.S. Chamber of Commerce, fifty years of patient counter-mobilization across think tanks, courts, and political institutions, and a labor architecture built to require continuous firm-by-firm reorganizing. The asymmetry was by design. May 2, 2026 We Kept Growing. Most People Didn’t The pronatalist alarm and the AI displacement alarm arguing about the same problem from opposite sides. Both assume the growth model is intact. It has not been. The forty years since 1980 were workarounds — debt, asset inflation, immigration, central bank intervention — that kept the appearance of growth going while the broad-based productive expansion stopped happening for most of the population. AI removes the last workaround. April 23, 2026 Our Faith? Federal agencies under Trump's second term are speaking to workers in the first-person plural of Christian faith — USDA Easter emails, monthly agency prayer services, an OPM memo permitting workplace proselytizing. Federal whistleblower confidence collapsed from 71.9% to 22.5% in a single year. The establishment clause is eroding inside workplaces where saying you are uncomfortable risks your career. April 18, 2026 A Talisman Against Fascism — In Loring Park The Center for People and Craft is an emerging urban folk school in Minneapolis — a place where cross-cultural connection happens person to person, hand to hand, without hierarchy or gatekeeping. April 15, 2026 MCP Server v2.0: Modernizing the Toolchain Six months after reaching 1.0.0, metalsmith-plugin-mcp-server hits 2.0.0 with its first real breaking change: the toolchain every scaffolded plugin inherits has been modernized. « ‹ 1 2 3 4 5 6 › » --- ### Writing - Werner Glinka https://www.wernerglinka.com/writing/2/ Writing Category All AI, Labor & Culture Art Coding April 14, 2026 Who Fired You Stanford's 2026 AI Index shows a widening gap between what AI experts believe and what everyone else believes. Sarah Perez at TechCrunch treats it as a puzzle. It isn't. The experts are looking at what AI could do. The public is looking at what AI is being used to do to them. 'AI is taking jobs' is a grammatical evasion. My father's generation lost their livelihoods and kept their vocabulary: Krupp. Thyssen. The ministers in Bonn. April 11, 2026 Is Anthropic vital for US Security? On Wednesday, April 8, Treasury Secretary Scott Bessent and Federal Reserve Chair Jerome Powell summoned the CEOs of America’s largest banks to an urgent, unscheduled meeting. The subject was a single AI model — Claude Mythos Preview, built by Anthropic April 3, 2026 The Wrong Argument The public debate about AI displacement focuses on headline layoffs — visible, contested, and partially fabricated. The real mechanism is quieter. Vertical AI platforms embedded in industry software absorb labor through updates, one unbackfilled position at a time. By the time the data catches up, the displacement is structural. March 28, 2026 Notes on David French’s “How Can America Be So Miserable When It’s So Rich?” David French describes America’s tiered economy as a cultural problem. It’s not. It’s the result of deliberate policy decisions over four decades — weakening labor, favoring capital, enabling buybacks — that recalibrated who the economy serves. AI will compress the number of humans capital needs even further. March 25, 2026 Coal and Steel The comparison between AI and coal isn’t about technology. It’s about cognitive lock-in — what happens when an entire economy organizes around one assumption and can’t see the disruption because it’s inside it. Germany did everything right and still produced 38% poverty in Gelsenkirchen. That’s not the failure story. That’s the success story. March 21, 2026 My Claude Wishlist I use Claude for intellectual work: developing arguments across sessions, stress-testing ideas, writing essays, and building software. It’s the most productive working relationship I’ve had with a tool — and I keep running into the same wall. March 10, 2026 Not Yet 'Not yet' is not a reassurance. It's a diagnosis. Anthropic's own research shows a 14% drop in job-finding rates for young workers in AI-exposed fields. The data says the displacement hasn't hit yet. The structure says it's already underway. I grew up inside that gap in Gelsenkirchen — I know what it looks like when 'not yet' becomes 'too late.' March 10, 2026 Beyond the Black Box How Markdown's marked extension API turned five verbose YAML sections into one clean component — and why I never noticed the capability was there all along. March 6, 2026 The Boats That Found Me The stadium form came from Gelsenkirchen — from Schalke, from the industrial geometry of the Ruhrpott. But another shape found me in California, and it came from the water. February 25, 2026 The Shapes That Stay In "The Other Side of Things," I wrote about returning to art-making after a ten-year hiatus. What surprised me is that some things apparently never left. « ‹ 1 2 3 4 5 6 › » --- ### Writing - Werner Glinka https://www.wernerglinka.com/writing/3/ Writing Category All AI, Labor & Culture Art Coding February 24, 2026 From Metalsmith to Eleventy - SEO Without External Dependencies Implementing SEO for a bilingual Eleventy site using templates instead of plugins—covering meta tags, Open Graph, hreflang, JSON-LD structured data, and sitemaps. February 23, 2026 The Corporate Benevolence Fantasy The promise that AI will make everything cheaper rests on one assumption — that corporations will pass their savings to consumers. The forty-year productivity-pay gap says they won't. The 2017 tax cut dress rehearsal says they won't. And $1.6 trillion in shareholder buybacks in a single year confirms they aren't. February 17, 2026 From Metalsmith to Eleventy - Building a Bilingual Site Implementing a full English-German bilingual site with Eleventy, covering directory structure, language-aware navigation, breadcrumbs, a language switcher, and per-language collections. February 16, 2026 I've Seen This Before I grew up in Gelsenkirchen, in the Ruhr Valley, and watched coal and steel collapse over decades. Retraining never worked at scale. The trades offer a reprieve, not an escape. And the science fiction writers have been ahead of the economists for seventy years — a structural problem requires a structural response. February 11, 2026 Who Buys What We Build? U.S. employers cut 1.2 million jobs in 2025 while posting record profits and pouring tens of billions into AI. AI didn't break capitalism. It exposed a version of capitalism that had already stopped distributing its gains. February 10, 2026 From Metalsmith to Eleventy - Porting an Actual Site The practical experience of migrating an art website from Metalsmith to Eleventy, including navigation issues, data access patterns, and what the fixes revealed about platform assumptions. February 3, 2026 From Metalsmith to Eleventy - The Accidental Abstraction How a Metalsmith component library turned out to be a platform-agnostic Nunjucks library, and why the components ported to Eleventy without a single template change. January 27, 2026 From Metalsmith to Eleventy - A Natural Progression Why I moved from Metalsmith to Eleventy for my art website, what carried over, and why the skills and mental models transfer between static site generators. January 12, 2026 Scheduled Publishing for Static Sites How to implement scheduled content publishing for static sites using date-based filtering and automated daily builds with GitHub Actions and Netlify. January 6, 2026 The Other Side of Things You know me from my Metalsmith work - static site generators, component architectures, the case for simplicity over framework churn. That is one side of what I do. There is another, and it has been part of my life longer than web development. « ‹ 1 2 3 4 5 6 › » --- ### Writing - Werner Glinka https://www.wernerglinka.com/writing/4/ Writing Category All AI, Labor & Culture Art Coding January 6, 2026 Metalsmith Redux - The Next Chapter From blog series to living infrastructure. The Metalsmith Component Library has grown, and we're building a SKILL that lets Claude guide beginners through creating real websites. November 7, 2025 Building Advanced Search for Metalsmith Existing search plugins for Metalsmith are ancient—most are effectively abandoned. This new metalsmith plugin uses Fuse.js as the foundation October 30, 2025 Metalsmith Redux: Conclusion Metalsmith Redux began with a simple premise: amid framework overload, reintroduce Metalsmith as an example of stability and simplicity in an ecosystem obsessed with complexity. September 14, 2025 The Missing Piece: Bundled Components Plugin Building a Metalsmith plugin with Claude revealed that effective AI collaboration isn't about prompt engineering—it's about exploring problems through dialogue until solutions emerge naturally. August 25, 2025 The Anatomy of Section Components A look at real Metalsmith components to understand how they work, why they're designed this way, and the patterns that make them powerful. From configuration to templates to optimized bundles. August 23, 2025 Introducing Metalsmith SEO The Metalsmith SEO plugin automatically generates HTML meta tags, Open Graph properties, Twitter Cards, JSON-LD structured data, a robots.txt file and a sitemap from a single source of truth. August 7, 2025 Introducing the Structured Content Starter Transform how you build static sites with structured content. The Metalsmith2025 structured content starter brings component architecture, smart dependency bundling, and fluid responsive design - no frameworks needed. August 5, 2025 MCP Server Development: Evolution Metalsmith Plugin MCP Server is a good example of how AI can assist in development. But what started over a weekend turned into a real development framework, shaped by real-world usage, trial-and-error, and a growing understanding of how AI needs to be guided, not just invited. July 24, 2025 MCP Server Development: Integrating Claude AI Discover how to use Claude AI and MCP servers to automate plugin development. A step-by-step weekend project that transforms repetitive Metalsmith plugin creation into an AI-powered conversation, complete with testing examples and practical insights. June 23, 2025 Beyond Markdown: Building Sectioned Webpages Instead of starting with content and adding MDN components, what if we began with components and composed them into pages? « ‹ 1 2 3 4 5 6 › » --- ### Writing - Werner Glinka https://www.wernerglinka.com/writing/5/ Writing Category All AI, Labor & Culture Art Coding May 24, 2025 The JavaScript Framework Carousel Developers celebrate migrating blogs to Astro or Next.js, describing complex build processes as 'easier than React.' But why does a blog need to fly? Sometimes simple tools are the sophisticated choice. May 20, 2025 Metalsmith Plugin Template While working on the blog series Metalsmith Redux (Static Site Generation in 2025), I developed several new plugins with the assistance of Claude AI, which led me to create a standardized template for Metalsmith plugins. May 9, 2025 Beyond Markdown: Structured Components We explore a common challenge when working with Markdown-based content: how do you include structured, reusable components within your long-text content? April 28, 2025 Metalsmith Redux - Templating with Nunjucks Templating with Nunjucks is central to how Metalsmith transforms content into a polished website. It provides the structure and logic needed to create consistent, maintainable sites while keeping content separate from presentation April 24, 2025 Metalsmith Redux - The Build Pipeline We examine package.json, one of the most important files in any Node.js project. While it might not be the most exciting file in our project, package.json is crucial. It defines our project, what it depends on, and the commands we can run to build, develop, and maintain it April 21, 2025 Metalsmith Redux - Dependencies and Scripts We examine package.json, one of the most important files in any Node.js project. While it might not be the most exciting file in our project, package.json is crucial. It defines our project, what it depends on, and the commands we can run to build, develop, and maintain it. April 19, 2025 Metalsmith Redux - Starter Files Structure Understanding the file structure of a Metalsmith project is key to working with it effectively. Don't worry if it seems a bit overwhelming at first—we'll walk through each part step by step, explaining what it does and why it matters. April 17, 2025 Metalsmith Redux - Getting Started Now it's time to set up our first Metalsmith project. Don't worry if you're new to static site generators or even to web development in general. This guide is written to be straightforward and approachable. April 15, 2025 Metalsmith Redux - Static Site Generation in 2025 Let's talk about Metalsmith. It's a static site generator that's been around for a while, and for good reason. Metalsmith keeps things simple and stable. It's particularly good for the kind of sites most of us actually build day-to-day. March 4, 2025 My AI-Assisted Journey with Project Metallurgy My AI journey evolved from ChatGPT to Claude, which felt like having a human co-programmer. Then GitHub Copilot eliminated context-switching, followed by Claude Code automating entire workflows. « ‹ 1 2 3 4 5 6 › » --- ### Writing - Werner Glinka https://www.wernerglinka.com/writing/6/ Writing Category All AI, Labor & Culture Art Coding January 2, 2025 Making the Switch: GitHub Copilot to Augment Code While Copilot excels at line-by-line suggestions, Augment Code understands your entire codebase as context. This isn't just a marketing pitch - it's a game-changer in practice. November 28, 2024 AI as a Development Partner: My Experience with Claude and GitHub Copilot I've been integrating AI tools into my daily workflow, and I want to share my perspective on how they're transforming software development - not by replacing developers, but by enhancing our capabilities and productivity. November 20, 2024 Building a Modern HTML Optimizer for Metalsmith Building a modern HTML optimizer for Metalsmith: From being inspired by HTMLCompressor's features to creating a modular plugin with effective HTML optimization without compromising security. « ‹ 1 2 3 4 5 6 › » --- ## Studio Notes ### Studio Notes - Shredded Paper https://www.wernerglinka.com/art/studio-notes/shredded-paper/ Studio Notes Volume Without Mass Shredded paper wants to flatten. Getting height while keeping it light takes time. The method: build an open box, line it with non-stick plastic, something like clear food wrap. Soak the shredded paper in a water and wood glue mix for a full day. Then lay down a thin layer in the mold and let it dry — another day. Repeat. A four-inch cube takes a week or more. Each layer bonds to the last but keeps its air. The result has volume without mass. You can see into it, through it. Light catches the individual strands. Same patience as rolling chicken wire tubes in the California studio, just different material. The slow work is part of the work. Share This Note Selected Related Works Object 2026.08.001 Shredded kraft paper over cardboard clay — the same serendipity method, different material. Flashes of green text surface through the brown tangle, remnants of whatever the paper once was. --- ### Studio Notes - Heavy https://www.wernerglinka.com/art/studio-notes/heavy/ Studio Notes Heavy Last winter this room was almost empty. One rolling cart, a couple of trays, a window full of bare branches. I said I'd post notes as the work developed. The work developed. The shelves filled, the bench filled, pieces went up on the wall. Most of what I've been chasing since comes down to one word. Weight. Cardboard has no weight to speak of. You flatten it, you set it at the curb, the wind takes it down the street. And there is no end to it. Every recycling day, the drive to the studio reminds me I'll have raw material for as long as I want. We order, it ships, the box comes apart. The most disposable thing there is. So the question I keep working is simple. How do you take the most thrown-away material in the room and make it look heavy. The answer is in the edge. I've shown that part before - cut it, stack it, and the corrugated edge that hid inside the box comes to the surface. That gets you volume. Weight is the next step. Stack it deep and paint it dark, and the channels fill with shadow. The surface stops reading as texture and starts reading as density. Not a panel with a pattern on it. A block of something solid - stone, or the end of a sawn beam. These two slabs weigh almost nothing. They read as mass. The driftwood in between holds the eye at the center. That piece fakes the weight one way. The next one fakes it two. The block at the top left reads as sand and aggregate in a binder. The sand is real. The block is not. It is a cardboard box with sand glued to the surface, somewhat heavier than the slabs but a box all the same. So the cut edge passes for stone and the sand face passes for concrete. Two disguises, one material. Not one part weighs what it claims. Share This Note Selected Related Works Object 2026.03.003 Two cardboard panels in deep red-brown and black joined at the center, with driftwood branches crossing the junction Object 2026.05.001 Stepped wall sculpture in corrugated cardboard with a sand-and-stone block. Left half of a form derived from old samurai armor. --- ### Studio Notes - Found a Home https://www.wernerglinka.com/art/studio-notes/found-a-home/ Studio Notes Found a Home Yesterday I came to my studio and found small paper rolls on my workbench with a pink post-it: "Want these? — Anna." My friends at the Center know I am always looking for materials. This is how a shared studio works — people see something, think of you, leave it on your bench. I had a piece waiting on the shelf. A slab of cardboard covered with paper mâché clay, painted and scraped, not quite finished. I had also picked up some tile spacers. Everything came together. The rolls became a spine down the center. The spacers scattered as crosses. The piece found its ending. Sometimes the last element arrives as a gift. Share This Note Selected Related Works Object 2026.03.001 Cardboard slab covered with paper mâché clay, painted and scraped, with a spine of small paper tubes and tile spacer crosses --- ### Studio Notes - Serendipity https://www.wernerglinka.com/art/studio-notes/serendipity/ Studio Notes Serendipity I spilled the shredder output on the floor. What I saw made me stop. The random tangle of paper strips — fragments of text, no longer readable as language — looked like something I could use. I took them to the studio, soaked them in a wood glue and water mixture for an hour, then drained them overnight on wire mesh. The dried mass has a texture like dried clay — stiff, holds its shape, but not sturdy enough on its own. Several layers of clear satin lacquer should give it the durability a finished piece needs. Today I started a piece using this shredded material. Random arrangement, bound together. Serendipity as method. Minneapolis doesn't give me storm-fallen redwood sticks or rusty fence wire. It gives me shredder output. You work with what you find. Share This Note Selected Related Works Object 2026.03.004 Shredded office documents soaked in diluted wood glue, drained overnight, and sealed with lacquer. A red band with tile spacer crosses anchors the top. Object 2026.03.005 Wire mesh over a wood panel coated with ash soaked in urethane, with a cluster of shredded paper resting on the mesh surface. --- ### Studio Notes - The Boat Form https://www.wernerglinka.com/art/studio-notes/boat-form/ Studio Notes The Boat Form Another shape that keeps returning: the boat, stripped to its skeleton. I spent years walking Princeton Harbor on the Half Moon Bay coast. A working harbor shows you boats in every state — including stripped down to keel and ribs, the structure laid bare. That form got into me through repeated seeing. These pieces use redwood sticks I gathered after storms on Kings Mountain. The roads would be littered with fallen branches, outer bark split and removable. I'd collect the inner sticks and stockpile them in the studio. Three boats, same form, different materials. Steel banding and dowels bound with rusty wire. Black-painted pine. Redwood sticks and old fencing wire. Three degrees of transparency — nearly solid to almost all air. The rust mattered. It connected the California coast to the Ruhrpott of my childhood — same colors, same patina of industrial decay. Princeton Harbor gave me back something I didn't know I was looking for. When I moved to Minnesota, the redwood sticks didn't come with me. These pieces are finite now — artifacts of a practice that can't continue. The forms persist. The materials change. We'll see what Minnesota gives me. Share This Note Selected Related Works Object 2005.01.006 Three vertical panels share a single image: a boat hull sketched in pine sticks and wire, floating on a diagonal across an ochre field. --- ### Studio Notes - Recurring Forms https://www.wernerglinka.com/art/studio-notes/recurring-forms/ Studio Notes Recurring Forms Looking back at pieces from the mid-2000s, I notice something I never consciously chose. The same shapes keep appearing: circles and what I've started calling the stadium form — straight sides with half-circles at top and bottom. I grew up in Gelsenkirchen, in Germany's Ruhr Valley, surrounded by industrial architecture and the geometry of stadiums, factories, and mine infrastructure. These forms got into my bones early. I didn't decide they would be my shapes. They just kept showing up. Now, after ten years away from the studio, the same forms are reasserting themselves — but differently. The new pieces are built from laminated cardboard coated with cardboard clay, with real depth compared to the earlier flat assemblages. Four inches thick, intended for wall mounting. They'll cast shadows, occupy space in a way the earlier work didn't. The stadium piece is roughly 10 by 18 inches. A circle piece is also in progress — 24 inches in diameter with a 6-inch center void. Final surface treatment is still undecided. Part of staying open to the work is not deciding everything in advance. Different materials, different processes, same destination. Some obsessions you choose. Others choose you. Share This Note Selected Related Works Object 2007.01.001 A circular, wreath-like form composed of interlocking metal strips Object 2003.12.001 This piece came from a night in the Montana mountains during a thunderstorm. The rumbles and rolls of thunder, the cracks, the flashes hitting the earth - impossible to describe with words. This captures such a night. --- ### Studio Notes - First Piece https://www.wernerglinka.com/art/studio-notes/first-piece/ Studio Notes First Assembly The first piece using both materials together. Stacked cardboard painted dark, paper mache strip down the center. The black paint creates a visual reminiscent of shou sugi ban, the Japanese technique of charring cedar to preserve it. The burning transforms the wood - blackening the surface while revealing the grain. Here the paint does something similar. It unifies the cardboard so the corrugated structure becomes the subject. The rhythm of the layers emerges rather than disappears. The paper mache turned out better than expected. The dried clay has a rough, almost geological quality. It reads like stone, like something weathered rather than built. Four rivets down the center strip. They suggest order, imply fastening, but they're decorative - a nod to industrial hardware without the function. They punctuate the vertical without explaining it. The contrast carries the piece. Dark and light. Structured and raw. Rhythm and texture. Two discarded materials, now in conversation. Share This Note Selected Related Works Object 2026.03.002 Laminated cardboard strips painted black with a paper mâché clay spine and scattered grommets --- ### Studio Notes - Paper Mache https://www.wernerglinka.com/art/studio-notes/paper-mache/ Studio Notes Paper Mache for Sculpture Large paper mache forms are trouble. Long drying times, uneven shrinkage, cracking. Mold if you're unlucky. The solution: don't build solid. Build thin layers over a core. I use blue construction foam as the armature. Light, rigid, easy to carve. The paper mache clay goes on in thin coats - maybe a quarter inch at a time. Each layer dries completely before the next. The clay itself starts as cardboard. Torn into pieces, soaked overnight, blended into pulp. The recipe: four parts pulp, two parts joint compound, one part wood glue, a tablespoon of mineral oil. Mix until it handles like thick putty. The joint compound gives it body and smoothness, the wood glue adds strength when dry, the mineral oil keeps it workable. A lesson learned: not all cardboard is equal. Glossy printed boxes often have thin plastic film laminated to the surface - it makes the colors pop on the shelf. That film doesn't break down. After soaking, you're left with soggy cardboard and floating plastic scraps that have to be picked out by hand. Plain brown corrugated works best. Check for that slick surface before you toss it in the bucket. The process is slow. The fan helps. Forced air moves moisture out without the heat that causes cracking. Each layer takes a day or two, depending on humidity. What you get is a rough surface. Fibrous, irregular. The pulped cardboard keeps its texture even after drying. It doesn't look manufactured. It doesn't look precious. It looks like something that has accumulated, weathered, survived. The foam disappears inside. What remains is the shell - thin enough to dry evenly, strong enough to hold form. Ready for the next layer, or ready to become part of something larger. Share This Note Selected Related Works Object 2026.03.001 Cardboard slab covered with paper mâché clay, painted and scraped, with a spine of small paper tubes and tile spacer crosses Object 2026.03.002 Laminated cardboard strips painted black with a paper mâché clay spine and scattered grommets --- ### Studio Notes - Cardboard https://www.wernerglinka.com/art/studio-notes/cardboard/ Studio Notes Building Volume Cardboard arrives flat. Boxes torn apart, stacked on the workbench. Packaging. The thing you break down for recycling. Cut it. Stack it. Glue it. Now it has depth. The corrugated edges - hidden when the box was a box - become visible. Each layer adds a line. The lines accumulate into texture. Paint it, or don't. The structure remains. What was disposable is now volume. Share This Note Selected Related Works Object 2026.03.001 Cardboard slab covered with paper mâché clay, painted and scraped, with a spine of small paper tubes and tile spacer crosses Object 2026.03.002 Laminated cardboard strips painted black with a paper mâché clay spine and scattered grommets Object 2026.03.003 Two cardboard panels in deep red-brown and black joined at the center, with driftwood branches crossing the junction --- ### Studio Notes - Back in the Studio https://www.wernerglinka.com/art/studio-notes/back-in-the-studio/ Studio Notes Back in the Studio Ten years away. A new city, a new studio at the Center for People and Craft in Minneapolis. Time to start again. The work on this website initially spans from 2001 to 2008 - metal banding, rusted wire, salvaged wood, found objects from construction sites and forest walks. That vocabulary isn't going anywhere. But I'm also exploring new materials now. Cardboard. Paper mache. Who knows what I find next. Materials people throw away without a second look. When I mention cardboard, I get puzzled responses. What can a serious artist do with cardboard? I understand the skepticism. We see cardboard as packaging, as the thing we break down for recycling. Disposable. But look at it differently. Stacked and cut, cardboard creates volume - layered edges that catch light and shadow. The corrugated cross-section has rhythm. The surface takes paint, or doesn't need it at all. It's humble, available, and carries the same potential for transformation as any other cast-off material. The rusted fence wire in my earlier work was once just fencing. The metal banding was strapping around lumber. The material doesn't arrive as art. It becomes art when you see what it can do. I'll be posting notes here as the work develops. Process shots, material experiments, questions I'm working through. Not finished pieces - those will come. This is the in-between. Share This Note --- ### Studio Notes - Finding a Place https://www.wernerglinka.com/art/studio-notes/finding-a-place/ Studio Notes Finding a Place After ten years away from making art, I wasn't looking for a studio. I was looking for community. The Center for People and Craft found me. It's an emerging folk school in Minneapolis, tucked into a stone building next to St. Mark's Cathedral in Loring Park. The model comes from Denmark - 19th century folk schools (folkehøjskole) that brought people together around shared craft, tradition, and learning. Not credentials. Not degrees. Just hands working alongside other hands. The programming reflects this. Willow basketry. Couching embroidery. Kolrosing. Two-at-a-time sock knitting. Traditional crafts and their contemporary expressions. People show up to learn something with their hands, and in the process they connect - to technique, to heritage, to each other. I walked in and felt the energy of a place being built. Volunteers painting walls, building worktables, planning workshops. Nothing polished, everything possible. The kind of place where you want to contribute. Now I have a studio here. I'm making assemblages again - working with cardboard and paper mache alongside the rusty wire and found materials I've always used. The folk school context fits. This is hand work. This is transforming ordinary materials into something worth attention. If you're in Minneapolis, visit us. We're building something good. Share This Note --- ### Studio Notes https://www.wernerglinka.com/art/studio-notes/ Studio Notes Studio notes from mixed media artist Werner Glinka. Process photos, material experiments, and working thoughts from the Center for People and Craft in Minneapolis. July 30, 2026 Shredded Paper Shredded paper wants to flatten. Getting height while keeping it light takes time. May 28, 2026 Heavy Last winter this room was empty. One rolling cart, a couple of trays, a window full of bare branches. March 19, 2026 Found a Home Yesterday I came to my studio and found small paper rolls on my workbench with a pink post-it: "Want these? — Anna." My friends at the Center know I am always looking for materials. March 17, 2026 Serendipity I spilled the shredder output on the floor. What I saw made me stop. The random tangle of paper strips — fragments of text, no longer readable as language — looked like something I could use. March 2, 2026 The Boat Form I spent a lot of time walking Princeton Harbor on the Half Moon Bay coast. A working harbor shows you boats in every state — including stripped down to keel and ribs, the structure laid bare. That form got into me through repeated seeing. February 17, 2026 Recurring Forms Stadium shapes and circles keep surfacing in my work — forms absorbed from an industrial German childhood. New pieces in cardboard clay push these obsessions into three dimensions. January 12, 2026 First Piece First piece combining stacked cardboard and paper mache clay. Dark corrugated layers, rough stone-like center strip, decorative rivets. January 9, 2026 Paper Mache Making paper mache clay for sculpture. Recipe, technique, and a beginner's mistake worth avoiding. Thin layers over foam core for controlled drying. January 3, 2026 Cardboard What can a serious artist do with cardboard? I understand the skepticism. We see cardboard as packaging, as the thing we break down for recycling. December 16, 2025 Back in the Studio Ten years away. A new city, a new studio at the Center for People and Craft in Minneapolis. Time to start again. December 2, 2025 Finding a Place After ten years away from making art, I wasn't looking for a studio. I was looking for community. The Center for People and Craft found me. --- ## Site ### About - Werner Glinka https://www.wernerglinka.com/about/ About I was born in Gelsenkirchen, a coal and steel town in Germany's Ruhr Valley. My father was a miner. The winding towers of the local coal mines and the industrial buildings of the steel mills were the landscape I grew up in. They shaped how I see things — materials, structure, what's essential and what isn't. I trained as an electrical engineer and worked at Nixdorf Computer in Paderborn, where I programmed microprocessors and built firmware for electromechanical systems. In 1981, I came to California through a joint venture between Nixdorf and Memorex. I stayed. Over the next three decades I moved from engineering into management and marketing, working for technology companies across Silicon Valley. Along the way I specialized in international standards work and the management of special interest groups — helping shape the technology ecosystems those companies operated in. Around 2000, I left the corporate world to work as a marketing consultant. When I began focusing seriously on art, I needed a website to show the work. Rather than hire someone, I taught myself to build it. That decision turned into a second career as a freelance web developer, building sites for companies and nonprofits for the next twenty years. My art practice began after I moved to Kings Mountain, in the Santa Cruz range between Half Moon Bay and Woodside. I started making assemblages — wall-mounted pieces built from found and discarded materials. Metal banding from construction sites, rusted fence wire, salvaged wood, electrical insulators, river stones. The industrial textures of my Ruhr Valley childhood and Bauhaus minimalism both found their way into the work. I showed throughout the Bay Area for about a decade, then stopped. Ten years later, in Minneapolis, I started again. I now work from a studio at the Center for People and Craft, an urban folk school in the Loring Park neighborhood inspired by the Danish folk school tradition. The California materials are gone — those earlier pieces are artifacts of a closed practice. The new work uses cardboard, paper mâché clay, and shredded paper. The forms are different. The impulse is the same. I don't title my pieces. Once it's on the wall, my work is done. What the viewer brings to it is theirs. Today I split my time between the studio, writing, and code. I maintain a collection of open-source plugins for Metalsmith, a static site generator. I write about technology and labor — particularly about what happens to workers and communities when industries automate or disappear. I grew up watching it happen in the Ruhr Valley. I think it's happening again. And I do pro-bono web work for nonprofits that need a presence but don't have the budget for one. These aren't separate lives. The same thread runs through all of it — an attention to how things are built, what holds them together, and what happens when they come apart. A note on how I write: my essays and technical posts are written with Claude, an AI assistant by Anthropic. It's a collaboration that brings the best out of me. We discuss, argue, and at the end is writing that works. --- ### About My Work - Werner Glinka https://www.wernerglinka.com/art/about/ About My Work It was after moving to Kings Mountain that I started making assemblages. Kings Mountain sits between Half Moon Bay and Woodside in the northern Santa Cruz range - a buffer zone between Silicon Valley and the empty expanse of the Pacific. I have hiked these mountains, taking in breathtaking vistas, seen the forested canyons and surprised by the sudden fog rolling in. During these hikes I saw many pictures chronicling the endless cycle of birth, death and rebirth. The Peninsula landscape is a powerful stimulant. But it's not nature alone that compels me - it's we humans leaving our marks in nature. I take my inspiration from that juxtaposition. A fallen leaf, a rusty rebar, a crack in the asphalt of a parking lot - these trigger the initial image. I develop ideas through rough sketches, then build the assemblage on wood panel. Using found objects, I transform the ordinary into an object of attention. As the ordinary transcends the commonplace, it becomes a metaphor for how we transcend our ordinary existence. I don't assign meaning to my pieces. Their significance is relative to the viewer. The absence of a title forces the observer to engage the work itself - there is no bias, only what they bring to it. Some pieces do carry personal relevance. This one is the result of experiencing a thunderstorm in the Montana mountains at night - the rumbles, rolls, claps and cracks of thunder, the magnificent flashes of lightning hitting the earth. Impossible to describe with words. This piece captures such a night. Selected Exhibitions Stanford Art Spaces, Stanford University, Palo Alto Peninsula Museum of Art, Belmont Mountain View Center for the Performing Arts Stanford Law School, Stanford University Sanchez Art Center, Pacifica Triton Museum of Art, Santa Clara German Consulate General, San Francisco Fingerhut Gallery, Sausalito d.p. Fong Galleries, San Jose Crockett Contemporary Art, Crockett 1870 Art Center, Belmont Olive Hyde Gallery, Fremont --- ### Projects - Werner Glinka https://www.wernerglinka.com/projects/ Projects My project mostly centers on Metalsmith, a static site generator built on a simple idea: everything is a plugin. Each plugin performs one focused transformation on a set of files, and complex functionality emerges from combining these simple pieces. Over the past two years, Claude has become my primary development partner. The pairing works because Metalsmith's patterns are explicit — when I describe a plugin's intended transformation, Claude grasps the files-in, files-out contract immediately. Most of the plugins and tools documented here emerged from this collaboration. All projects are available on GitHub and NPM. If you're a nonprofit organization looking for web development help, I'm available for pro-bono work. MCP Server Metalsmith Plugin MCP Server — An MCP server that gives AI assistants Metalsmith-specific knowledge. It provides automated plugin scaffolding, validation against ecosystem best practices, and maintenance tools that follow established patterns from core Metalsmith plugins. Plugins Focused Metalsmith plugins, each performing one transformation. Expand any plugin for its description and links. Open All metalsmith-bundled-components Automates asset management for component-based architectures. Scans component directories for CSS and JavaScript, resolves dependencies with circular-reference detection, and generates correctly-ordered bundles with scope isolation. GitHub · npm metalsmith-section-pages Generates structured-content pages composed of validated library sections, turning a frontmatter sections array into a fully rendered page. GitHub · npm metalsmith-mdn Bridges structured templates and long-form content by enabling Nunjucks components within markdown files. Embed the same reusable components used in page templates directly into markdown content. GitHub · npm metalsmith-markdown-partials Enables content composition through reusable markdown fragments. Processes include markers in markdown files, replacing them with content from separate partial files during the build. GitHub · npm metalsmith-unified-markdown Renders markdown to HTML using the unified/remark ecosystem, opening the door to the full range of remark plugins for content processing. GitHub · npm metalsmith-prism Adds server-side syntax highlighting to code blocks in rendered HTML using Prism.js, with no client-side JavaScript required. GitHub · npm metalsmith-optimize-html Optimizes HTML output through comprehensive minification without external dependencies. Removes unnecessary whitespace, comments, and redundant attributes while normalizing URLs and boolean attributes. GitHub · npm metalsmith-optimize-images Generates responsive images with optimal formats and sizes, producing srcset-ready variants during the build. GitHub · npm metalsmith-site-data Emits read-only build artifacts (pages.json and site-data.json) that expose the site's page and metadata structure to external tools and integrations. GitHub · npm metalsmith-menu-plus Automatic hierarchical navigation generator. Builds nested menu structures from the file tree with active-state and permalink awareness. GitHub · npm metalsmith-blog-lists Adds blog list metadata (recent posts, tags, archives) for rendering navigation and index widgets. GitHub · npm metalsmith-sectioned-blog-pagination Generates paginated blog landing pages from a marker template, built for section-based blog architectures. GitHub · npm metalsmith-simple-pagination A lightweight pagination plugin that creates paginated directory pages from any collection. GitHub · npm metalsmith-safe-links Strips protocol and hostname from local links and adds safe-linking attributes to external links. GitHub · npm metalsmith-seo Comprehensive SEO optimization that generates meta tags, Open Graph tags, Twitter Cards, JSON-LD structured data, sitemaps, and robots.txt with automatic metadata derivation and content analysis. GitHub · npm metalsmith-search Creates a client-side search index from rendered HTML using Fuse.js for fuzzy matching and Cheerio for HTML parsing. Extracts content with automatic heading-ID generation and scroll-to functionality. GitHub · npm metalsmith-multilingual Adds internationalization metadata to files, linking translations across locales so templates can render language switchers and hreflang alternates. GitHub · npm Nunjucks Components Nunjucks Components — A library of reusable, self-contained components for building structured-content websites with Metalsmith. Each component manages its own styles, scripts, and templates, and declares dependencies through a manifest file. The companion site provides reference documentation, live examples, and downloadable component packages. Starters Metalsmith Structured Content Starter — A component-based starter demonstrating modern web development patterns without JavaScript frameworks. Uses structured content in frontmatter to define reusable page sections, with automatic CSS and JS bundling per component. See a demo. Reference Projects Ruhrpott — A proof-of-concept integrating Sanity.io as a CMS with Metalsmith for static site generation. Minneapolis — A proof-of-concept using WordPress as a headless CMS with Metalsmith, pulling content via the WordPress REST API. --- ### Werner Glinka - Mixed Media Artist https://www.wernerglinka.com/art/ Year Size Materials View Details Slide 1 Slide 2 Slide 3 Slide 4 Slide 5 Slide 6 Slide 7 Slide 8 Slide 9 Slide 10 Slide 11 Slide 12 --- ## Art Articles ### Mountain of Inspiration https://www.wernerglinka.com/art/articles/almanac-2001/ The Almanac - Palo Alto Mountain of Inspiration August 2001 by Andrea Gemmet When high-tech marketing consultant Werner Glinka, 49, moved to the sylvan community of Kings Mountain four years ago, he had a passion for the sleek, steel-and-glass modernism of the Bauhaus movement, an appreciation for the simple, functional grace of Japanese landscaping, and an aesthetic sensibility shaped by the stark, industrial city in North Germany where he grew up. These serene and wooded surroundings might seem like the last place such a man would find himself at home. But not only did Mr. Glinka fall in love with the mountain, he found the inspiration to devote himself to creating mixed-media artwork using natural objects he finds on his walks, combining a modern, minimalist sensibility with the shapes, textures and colors of the forest. In his work, a single fallen leaf may be highlighted, or it may be combined with dozens of others to form an intricate, overlapping carpet. Soil, twigs, pine needles and ash form landscapes of texture, which contrast with oil paint or pieces of barbed wire. "What I loved right when I saw it was just how much it reflected Woodside," says Peggy O'Brien of Mr. Glinka's artwork. Ms. O'Brien is the senior library assistant at the Woodside Library and coordinator of its art exhibits. A selection of Mr. Glinka's work, entitled "Fallen Leaf," is on display at the library through August 31. "What spoke to me was that it was the first time I've seen nature that combined, rather than clashed, with technology," she says. "That's what I think Woodside is really about, how people blend the two." It was enthusiastic responses like Ms. O'Brien's that emboldened Mr. Glinka to try to bring his art to the public for the first time, after working on his mixed-media pieces steadily for the past year and a half and showing them only to his wife and some friends. "So far, I have made very little money with selling my art, but I've seen people just light up. That reaction, you can't pay for that," he says. "If people react that way, then it was worth it. Then I made a difference for that minute or two minutes." His unlikely career as an artist began while on a walk near his home one day when he spotted a fallen madrone leaf that struck him with its fading beauty. It was yellow and green and speckled with tiny black spots that his wife told him was the result of disease. "It was absolutely just beautiful," Mr. Glinka says. "I thought, this really wants to be framed or something, and that's when I started to experiment with these things." The experiments evolved into techniques for affixing and preserving the leaves and other materials he finds on the mountain. The earthy, natural look of many of his art pieces belies the technology used to create them. Mr. Glinka employs everything from a microwave oven to dry out leaves, to a variety of glues and plastic coatings and varnishes to construct and preserve his artwork. It is here that his background as an engineer and his skill at designing and building things comes into play. The son of a coal miner, Mr. Glinka says his family had no money for visiting museums when he was a child. He describes the bleak city of Gelsenkirchen, where he is from, as being like "Pittsburgh in the '60s," a coal and steel town with little in the way of greenery and frequent smog warnings. But it was there, as a member of a Boy Scouts-like youth organization, that Mr. Glinka tried his hand at crafts like basket weaving and painting. He was an apprentice to an electrician, and later worked as a computer design engineer, he says. "I always did like to build things," he says. "I think I've been an artist all my life, but I would never have used that word." Before he moved to Kings Mountain, Mr. Glinka says he created wire sculptures for many years. But his artistic potential wasn't fully tapped until his wife convinced him to make the move up into the Santa Cruz Mountains and they became a part of the close-knit community of "mountain folk." "I was lucky to get to know a lot of people who also do art," he says of his neighbors. "Maybe that's what started it, because I really got interested in doing this when I got up here. It's probably the natural surroundings, with a little bit of ignition from the people who live here." The mountain is a steady source of inspiration and contemplation, in addition to being a supplier of raw materials for his work. He is even enthusiastic about the fog, which provides a milky and diffuse quality to the lightthat he finds beautiful. Prefacing his comments with a warning that he is about to get philosophical, Mr. Glinka says that the dying madrone leaf that inspired his "Fallen Leaf" series led him to reflect on everything from man's efforts to control nature to the youth-worshiping culture. "Now we all equate beauty with being young, but there's beauty in everything," he says. "A young leaf can be quite boring, but an old leaf that is ready to die ... it's like this is its last effort to show that there's still something left here. It's displaying this beauty that is absolutely fascinating." But just because he can get philosophical about his art doesn't mean that he wants to interpret it. Whenever someone asks him what a piece is supposed to mean, he is quick to answer, "I didn't mean anything by it." "I would never be so presumptuous as to tell anybody, 'This is what it is,'" says Mr. Glinka. A piece of artwork is valuable only if it evokes some sort of reaction in you, he says. That concept makes art a product that is very different from the high-tech devices he helps to market for companies such as Sony and Hitachi at his day job. Although he knew his marketing expertise would be useful in furthering his art career, the decision to "come out of the closet" as an artist has still been difficult because he is more personally and emotionally attached to his artwork than he is to his employers' products, he says. There's nothing worse than hearing the dreaded comment "Interesting..." in response to his creations, he says." "I know what is involved in promoting things, and I will use these tools in promoting my art career. I'm determined to make it work," Mr. Glinka says. "With art, you sell emotions, you sell feelings, you sell something very personal," he says. "You can employ all of the mechanics of bringing it to the public so that they know about it, but then it is up to them and how they react to it," he says." "If I could finance a living this way, there's no question that I would do art," he says. "It's not a job, it's just pure joy." A bit like living on Kings Mountain, perhaps. Mr. Glinka spent most of his years in California living in the South Bay, and he says he wishes he had known about Kings Mountain sooner. "My only regret is that I didn't know this existed 20 years ago," says Mr. Glinka. "I would have gone straight to the mountain." --- ### When Opposites Converge https://www.wernerglinka.com/art/articles/palo-alto-weekly-2009/ Palo Alto Weekly When Opposites Converge Sept 2009 by Lauren Jo It could be a flower, made with industrial materials to illustrate the intersection between man and nature. Or, it could just be pieces of chicken wire rolled up and attached to a canvas. That's up for debate. Industrial artist Werner Glinka refuses to title his mixed-media assemblages lest he influence viewers' interpretations. From rusty metal bands and chicken wire to small twigs and ashes from his fireplace, he mixes recycled industrial materials with natural resources to create a minimalist aesthetic that highlights both. "I was always drawn to simple things," the artist said in a recent interview at his studio at the 1870 Art Center in Belmont. "I think from birth I was a minimalist." Glinka's approach to his art is simple as well, with his curiosity leading the way. "It's driven by instinct, really," he said of his creative process. "It's probably a benefit that I didn't go to art school... I approach things completely naive." Uninhibited by preconceived notions of what one can or cannot use in art, he is free to experiment with tools, techniques and materials such as heat lamps and pearls. Several examples are currently on exhibit through Sept. 24 as part of Stanford Art Spaces at the Paul G. Allen Building on campus. Glinka is showing pieces from various series that he works on concurrently - urban totems, rust paintings and visual mantras, to name a few. They're shown alongside paintings by Nancy Eckels and Asha Menghrajani. An unconventional gallery space, the meandering, multi-story Paul G. Allen Building is home to the Center for Integrated Studies. Set against the backdrop of researchers in clean-room suits working under neon yellow lights, the elaborate textures and geometric shapes in Glinka's art come to the fore. Working as a marketing executive, electrical engineer, and graphic designer for more than 25 years, Glinka has a natural affinity for functional, industrial design and simplicity. The artist read books on Bauhaus, the 20th-century German art and design school whose style heavily influenced Modernism. From trips to Japan, he picked up on the simplistic Japanese style, particularly that of designer Tadao Ando and his spartan homes of glass, steel and concrete. For a minimalist, Glinka creates art brimming with tension between the opposing forces of man and nature, order and decay, geometry and irregularity — a dual aesthetic born of the two contrasting settings in which he has lived. Currently living in Woodside, the artist is from the industrial town of Gelsenkirchen, Germany, where he found inspiration in coal mines and steel plants. "You discover beauty in other things," he explained. "For example, I see beauty in rust," he said. After immigrating to the United States in 1981, Glinka began creating his distinctive assemblages when he moved to Woodside. There he unearths the beauty in natural materials, too, such as sand from Skyline Boulevard and leaves that have dried in the sun. A Madrone leaf inspired his first solo exhibition, "Fallen Leaf," shown at the Woodside Library in 2001. The influences from these disparate worlds create a palatable tension in Glinka's art. Some pieces feature what looks like cracked, dried mud; others boast pipes or concrete, and some appear to elevate a single leaf. "When out in nature," he said, "I want to be completely quiet and immerse myself in the beauty, but there's this constant struggle." Reminders of e-mails, meetings and bills intrude on the serenity. And although he lives in leafy Woodside, the tech world is only minutes away. "It is as if ... he were creating nano-chips out of leaves and twigs," said Claudia Morgan, associate dean of Stanford's Graduate School of Business and former president of the Pacific Art League. Glinka's intriguing combination won favor with the board members of the 1870 Art Center who reviewed his application for a studio at the artist community. On the site of a former school, the center provides workspaces and an established gallery. "If it came to what I would write a big check for, it would be one of his where he's built a structure on top of a surface where he's used metal strips," art center founder and director Ruth Waters said in a phone interview. "He has cut and attached them and created designs that are extremely interesting to me." One piece in the current Stanford exhibit is "Circular Object 711," a structure of interwoven metal bands — some rusted, some shiny — attached to a dark panel. Glinka said many of his assemblages come alive with the proper lighting, which throws intricate shadows and reveals complex textures, reflections and colors. He calls some of the pieces "vessels." "They're like the underneath and ribbing and structure of a boat," Waters said. "They're distinctive. No one knows really what he's doing. Glinka has always dabbled in art for pleasure. Unable to afford fine art in college, such as Alexander Calder's mobiles, he made his own assemblages. But art took a back seat to work until he moved to the Kings Mountain area and volunteered at the annual art fair, prompting him to return to the craft. He left his marketing executive position at Hitachi America in 1999, staying on as a consultant. Newly autonomous, he found himself in the studio half the time and has since considered himself an artist. In 2005, he founded German American Artists with Ines Tancre and Palo Alto artist Inge Infante to promote German immigrant artists. Most of the group's 12 artists are based in the Bay Area, and a shared understanding of the immigrant experience ties them together. "When you grow up in a culture, and you go to another culture, you don't feel at home," he said. "There's this tug of war you never resolve." Glinka, who served on the board of directors at the Pacific Art League for three years, has shown his work at venues throughout the Bay Area, including the art league and the Mountain View Center for the Performing Arts. In 2007, he exhibited at the German Consulate General in San Francisco as part of "Berlin and Beyond," an annual film festival that features the latest in cinematic art from Germany, Austria and Switzerland. He prepared pieces most recently for the Kings Mountain Art Fair. With three exhibitions completed this year, the industrious artist is now in his "chill-out phase" and plans to return to work in October, hoping to revisit his three-dimensional wall sculptures and pieces with more vibrant color. With all the opposing forces in his life, Glinka finds harmony in pursuing art. "It is less the final result - it is more the process of creating," he said. "It creates balance in my life." --- ## moved ### This site has moved - Werner Glinka https://www.wernerglinka.com/moved/ This site has moved You followed a link to glinka.co, my old site. It has been consolidated here, at wernerglinka.com, together with my legacy art site. The old domain now redirects here. This is an intentional move, not a hijack. If a bookmark or search result sent you to a page that no longer exists, that's because the archive was pruned during the migration — older posts from 2015 through 2023 were not carried over. The writing that remains lives at /writing/, organized chronologically; the art archive lives at /art/; and the open-source Metalsmith work is at /projects/. If you were looking for something specific and can't find it, the site's search may help, or you can reach me through the about page. Thanks for following the trail. Go to the homepage Browse the writing ---