Home / Blog Menu ↓

Blog: #marks

Thoughts on a little language for generative art

I’ve been thinking about resurrecting the Marks idea, partly because I’d like to use it for my art and partly because I want to have my 12in23 project (for at least some of the languages) be a simplified Marks parser. (And a little bit because my dad’s name was Mark.)

As a refresher: Marks is going to be a DSL for generative art. In its newest incarnation, it could also be used more generally for composition, but generative art is the focus.

The current plan is to have a number of types of top-level blocks: layers, brushes, path profiles, color definitions, functions, and properties, and probably a few others I haven’t fully thought through yet. A rough draft, which still needs a lot of refining, and which doesn’t yet include a lot of the ideas I’ll include in the notes below:

size 7500x7500
background white
color black #000
color red hsl(0 50% 50%)
seed 24601

brush circles {
  random.xy0(num: 50).each {
    circle(x, y, r: random(0.1), fill: black)

pathprofile mytaper {

layer.svg some shapes {
  subtract {
    circle(x: $width/2, y: $height/2, r: $height/2*.8, fill: red)
    rectangle(x: random.x, y: random.y, w: random($width - $x), h: 50, fill: red.lighten(0.2))
  mask {
    line(x1: random.x, y1: random.y, x2: random.x, y2: random.y, strokeWidth: random(5, 20), brush: circles)
  blend soft-light

layer.raster noise {
  xy.each {
    red.jitter(hue: 0.2)
  blend soft-light
  opacity 0.2

Notes, acknowledging that this is mostly brainstorming and not a final, consolidated list:

  • Layers are the fundamental block, in that nothing gets output if there aren’t any layers.
  • Layers can be SVG (which then gets rendered to raster once the layer is done) or raster.
  • The background property adds a bottom layer filled with the color (leaving it out allows for transparency).
  • There’s a debug flag that exports each layer to a file individually (minus blending mode and opacity), so you can see what happened.
  • SVG layer commands include CSG booleans.
  • The “some shapes” and “noise” bits on the layers are layer names.
  • This isn’t shown here, but layers can be different sizes and can be positioned.
  • I’m leaning towards having Marks be as purely declarative as possible, though I suspect I’ll still need some imperative support (a random walk, for example, would be more difficult to do declaratively) (though I’m still going to see if I can make it work somehow). I’m thinking the top-level function blocks would be where imperative code happens, maybe.
  • random.x would get a random X coordinate within the canvas.
  • Layers can be masked, and within the mask there can be any rendering commands (still working on nomenclature here) that are available for the current layer type (which mostly means raster commands aren’t available on SVG layers except in places where an image is expected).
  • For SVG layers, the layer blending mode and opacity only apply after rasterization.
  • The xy variable returns an array of all the coordinates of the rasterized canvas.
  • Numbers and colors have a jitter method that allows for jittering within a set range .
  • The brush block allows using rendering commands to create a brush that can then be used to stroke paths or fill shapes.
  • The pathprofile block needs (a lot of) work, but the idea is to have some way to describe the profile of a path, so you can have paths with the width varying along the stroke. Ideally, this would support both relative percentage-based profiles (leading to different effects for short paths vs. long paths) and absolute profiles (so the effect is the same for any length of path that matches the values) and possibly a mix of both (absolute for the first 50px and then relatively fade out for the rest, however long that is, for example).
  • Good support for path navigation and manipulation. Be able to easily work with points every 20px along the path, for example, or every control point, or fifty random points along the path. Also be able to get normals and tangents for any points along the path.
  • Importing images from disk will of course be included.
  • This is a lower priority for me: animation support. There would be access to a frame variable. Each frame could use the same global random seed (with each layer getting seeded individually to try to preserve behavior) or could use a different seed.
  • This is moving more into pie in the sky territory, but I’ve become enamored of the idea of having Marks support 3D, including programmatic generation of the canvas texture in 3D and being able to layer paint (and then scrape some off to see layers underneath) and get impasto effects and all that. This would also support moving the camera around and creating/modifying 3D models to some extent. I like this a lot and I think it fits conceptually, but it may be a bit Too Much. (Part of me thinks it would make far more sense to do this separately as something in Blender, where you get so many 3D features for free.)
  • Marks files can import other Marks files.
  • Custom fill functions can be written, where you provide some code that then generates the content for whatever polygon is filled (clipped to the polygon boundary).
  • Shape packing helpers are planned, too, so you can fill a polygon with circles or any other shape. I’d like this to be programmatic, so that each shape could be different.
  • Layer filters will be included, too — blur, threshold, erosion/dilation, etc. — and these will apply to masks as well.
  • Colors can be defined in the usual formats (HSL, RGB, hex) and also LCH, and they can be modified dynamically (lightened, darkened, etc.).

There will undoubtedly be simplification along the way, since this is…a lot. The initial core implementation would (in my mind) be layers (both SVG and render, with a basic set of commands, excluding masks but including blending modes and opacity), colors, the random generator, debug mode, and exporting a final image. That’s enough base functionality for it to be usable.

I’m going to be working on a BNF grammar for this soon, once I get the syntax finalized enough that writing a parser is feasible.

Reply via email

Prints 1.3

Welcome to Prints volume 1, issue 3.

Table of contents: Reading • Watching • Making • Links • Thoughts


Typos in books used to bother me a lot. They don’t anymore. (Unless it’s an utter avalanche of them.) Still can’t read books with bad typography, though. Relatedly, I’ve begun reading physical books again, for typographic variety.

I used to like thrillers with secret conspiracies making for amazing plot twists. Now, though, I see how a conspiracies-behind-everything worldview can really mess people up, with dire ramifications for society. Seems like at least some of that worldview stems from stories about conspiracies. I have no evidence for this assertion — it’s just an idle thought — but to me it feels compelling enough that I feel uncomfortable reading conspiracy thrillers even though my story-eating brain loves those tasty plot twists.

One of the delights of having loads and loads of books in your house is forgetting you have some of them and rediscovering them later.

Lately I’ve been thinking about books as software updates for my brain, a way to inject a load of training data into my neural net. (I think I’ve mentioned that before. It’s still something I’m thinking about.)

Recent reads


  • Jordan Mechner’s The Making of Prince of Persia journals, 1985 – 1993. (I have a thing for makings-of.) Interesting to see what’s changed since the ’80s and what hasn’t.
  • Anthony DePalma’s The Cubans, about life in Cuba since Castro took power. My grandfather was born in Cuba. While he left around ten years before the revolution, I still have cousins living there. The conditions are not great. The sinking of the 13 de Marzo was horrifying. This book, though, was really good.
  • Eric Gill’s An Essay on Typography. There’s a fair amount of social commentary here, which I bounced off of the first time I tried to read this, years ago. Now, though, the critique of industrialism resonated with me. Some strong typographic opinions here, too. More and more I’m of the mind that even word spacing is more important than an even edge, so ragged right is probably the future for any books I typeset going forward. This book was set in Gill’s Joanna, and I was intrigued by the left single quote (riding low at x-height) and the running heads (italic lowercase with Roman initial caps, which was how italics were used long ago but you don’t see it much these days) (also, this book was published in the 1930s). While reading this I kept itching to run to my laptop and design some type. Gave in a couple times.
  • John Boardley’s Typographic Firsts: Adventures in Early Printing (the edition that just barely came out). It’s all about innovations in printing — the first printed books, first time printing in gold, first printer’s marks, first time printing music, etc. Right up my alley. Things I learned, in no particular order:
    • Blockbooks are a thing (using woodcuts for the text as well as any decorations or illustrations).
    • The word miniature comes from minium, the Latin name for a red form of lead oxide.
    • The shape of T-O (orbis terrarum maps). I think I may have seen this before but had totally forgotten about it.
    • Loved the conical-projection Ptolemaic map from the Nuremberg Chronicle, though I’m not sure why.
    • The atlas was named by Mercator after a Mauritanian king, not the Greek Titan.
    • Criss-cross comes from Christ-cross. (Which seems blindingly obvious in hindsight.)


  • Martha Wells’ Exit Strategy, novella, fourth in the Murderbot series. Enjoyed it. (This was after bailing on two other novels after reading around 400 pages across them both, so it was nice to come back to a comfort read.) Looking forward to reading Network Effect.
  • P. Djèlí Clark’s Ring Shout. Also a novella, one that felt as substantial as a novel. It’s about hunting down monsters that are disguised as Ku Klux Klan members, and wow, I really liked it. More fantasy like this, please.

Books acquired since last issue

  • Factory Girls: From Village to City in a Changing China — Leslie T. Chang
  • What Can a Body Do?: How We Meet the Built World — Sara Hendren
  • Embassytown — China Miéville
  • Merchants of Culture: The Publishing Business in the Twenty-First Century — John B. Thompson
  • How Music Got Free: A Story of Obsession and Invention — Stephen Richard Witt
  • Game Over: How Nintendo Conquered The World — David Sheff
  • Inside the Kingdom: Kings, Clerics, Modernists, Terrorists, and the Struggle for Saudi Arabia — Robert Lacey
  • The End of Poverty: Economic Possibilities for Our Time — Jeffrey D. Sachs
  • The Tudors: The Complete Story of England’s Most Notorious Dynasty — G. J. Meyer
  • The World in a Grain: The Story of Sand and How It Transformed Civilization — Vince Beiser
  • Magna Carta: The Birth of Liberty — Dan Jones
  • Bible and Sword: England and Palestine from the Bronze Age to Balfour — Barbara W. Tuchman
  • Where Good Ideas Come From — Steven Johnson
  • Golden Gates: The Housing Crisis and a Reckoning for the American Dream — Conor Dougherty
  • The Fatal Shore: The Epic of Australia’s Founding — Robert Hughes
  • Four Queens: The Provencal Sisters Who Ruled Europe — Nancy Goldstone
  • Secrets: A Memoir of Vietnam and the Pentagon Papers — Daniel Ellsberg
  • Mythology — Edith Hamilton
  • How Money Became Dangerous: The Inside Story of Our Turbulent Relationship with Modern Finance — Christopher Varelas
  • Autumn in the Heavenly Kingdom: China, the West, and the Epic Story of the Taiping Civil War — Stephen R. Platt
  • Imperial Twilight: The Opium War and the End of China’s Last Golden Age — Stephen R. Platt
  • The Art of Language Invention: From Horse-Lords to Dark Elves to Sand Worms, the Words Behind World-Building — David J. Peterson
  • The Signal and the Noise: Why So Many Predictions Fail—But Some Don’t — Nate Silver
  • The World: A Brief Introduction — Richard Haass
  • Certain Dark Things — Silvia Moreno-Garcia
  • The Crisis Years: Kennedy and Khrushchev, 1960–1963 — Michael R. Beschloss
  • His Master’s Voice — Stanislaw Lem
  • In the Land of Invented Languages: Esperanto Rock Stars, Klingon Poets, Loglan Lovers, and the Mad Dreamers Who Tried to Build A Perfect Language — Arika Okrent
  • In the Camps: China’s High-Tech Penal Colony — Darren Byler
  • Paradox Bound — Peter Clines
  • No Filter: The Inside Story of Instagram — Sarah Frier
  • Amazon Unbound: Jeff Bezos and the Invention of a Global Empire — Brad Stone
  • The Body: A Guide for Occupants — Bill Bryson
  • Mapping the Heavens: The Radical Scientific Ideas That Reveal the Cosmos — Priyamvada Natarajan
  • My Stroke of Insight: A Brain Scientist’s Personal Journey — Jill Bolte Taylor
  • Kennedy and Roosevelt: The Uneasy Alliance — Michael R. Beschloss


Words I’ve come across lately:

  • jointure
  • donnybrook
  • banditti
  • sus
  • hopepunk
  • chrysography
  • neume

Unicode corner

An experimental new section, where I a) read part of the Unicode spec and b) jabber about it to y’all. Years ago I read the first few chapters and generally enjoyed it, and I like the intersection of tech, type, and languages, so here we go.

Decided to start with chapter 21, on notation systems. I’ll only talk about the points I found interesting.

Unicode doesn’t specify physical dimensions for Braille, which makes me wonder how many different standard sizes of Braille there are, and whether large-print Braille would be easier to read or harder/slower. (From some cursory research it looks like each country might have its own size standard, but international Braille is a thing so maybe sizes are more uniform.)

I didn’t know Common Musical Notation (CMN) was the name for what I think of as standard Western music notation. The Unicode characters for music are focused on inline use (which makes sense), so there’s no pitch encoding. Nice use of combining characters, though of course there is a small set of precomposed characters as well. Also interesting that the accidentals are in a different block — I ran into that with Coptic, which re-uses characters from the Greek block. Apparently RTL music at least some of the time mirrors the clef sign — but not the note heads. Ties and slurs and such are encoded with just beginning and ending markers, which makes sense because ties and slurs and such have variable length. I’m less familiar with the 18th-century ornamentation but it looked interesting.


Just BYU volleyball, both women’s (last season) and men’s (this current season). I haven’t seen Tenet yet but want to.


Minor epiphany this past week: for me to care about a project I’m working on, it has to feel innovative in at least some small way. While I don’t know that I want innovation to be the sole lens I look at my work through, it matters enough that I need to make sure I account for it going forward. (By consciously acknowledging what the innovation is on each project, that is, and culling the projects where I can’t come up with anything new.)

I haven’t done a good job at bringing innovation into my writing, however, and I suspect that’s one of the reasons I’ve struggled to produce much there. Still thinking through what might work for that. I should add, by the way, that it doesn’t have to actually be innovative in the world, it just has to be something I personally haven’t seen before.

Reading about printer’s marks in Typographic Firsts made me realize I hadn’t said anything on here about my initial attempt at a publisher’s mark, used on the title page of my recent Historia Calamitatum edition. It’s nothing special, and I suspect I’ll rework it soon, but it was fun to make. (By the way, it wasn’t technically an initial attempt. I’ve used a couple other publisher’s marks in the past, back when I was making books under my Riverglen Press and Quillfire Studios imprints.)

Current projects

Salviana (working title): Figured out who the narrator needs to be and got the outline finalized enough to start drafting. With the voice change, it made more sense to start from scratch (though I hate doing that, which is why I want to get good at outlining). Five pages written so far, and it’s going well. I need to resurrect that create-before-consume idea (already abandoned! I like reading!) to put more time in on this, though, because it’s slow going when I only spend a few minutes a day on it.

Charts: Haven’t done anything here yet. Still thinking about making that Latin ending lookup chart, though I worry it might always be incomplete enough that it wouldn’t be useful. (I’ve also been out of the Latin-study frame of mind for a long time.)

Marks: The main update here is that I’m now seeing this as a DSL not only for purely generative art, but also as a DSL for modifying input paths — e.g., pass in an SVG or a font glyph, modify it, and then re-export it. A slightly more concrete example: take in a font glyph, split its paths into small segments of equal length, move each segment’s start point along its normal (out if it’s odd numbered, in if it’s even), and union random small circles to it along the way as well. This all comes from my interest in making digital things look analog. Also, as far as going with a DSL instead of a library in a general-purpose language: while a DSL might not be able to do everything a general-purpose language can do, it can make certain tasks easier; and you can always use a general-purpose language to create the DSL code. Anyway, I’m still writing up explorations for how this Marks language should work. Nothing worth showing yet.

Bend: Still slow progress here, haven’t spent much time on it. Decided to decouple cursor movement from moving the current selection. I need to come up with more user stories to guide the language design.

Hinterlight: I’ve done a couple of revision passes. Type design is still hard, and I still haven’t produced anything I’m happy with, but I think I’m getting a little bit better at making curves look smooth and not janky. (I need to look at existing fonts in FontForge to see how their curves are set up. That should help.) The new proof setup (Paged.js to generate, iPad to proof) is nice. FYI, my focus with Hinterlight has been to design a typeface that looks like it’s been printed with traditional processes — ink spread, rounded, less sharp and clear, more in the vein of the IM Fell fonts. But I’m starting to think it might be better/easier to design a digital font and then use Marks to modify it to get the look I want. Still deciding. Also, I’ve been running into posture-based neck pain issues both with proofing and with the type design work itself. Need to figure that out.

Journal PDFs: I added Paged.js to my Leaf journal app so I can easily export annual journal PDFs for any of the years I have journals for. It’s working fairly nicely, except that sometimes the last line on a page will disappear. I haven’t managed to figure out yet if it’s Paged.js or Chrome dropping the line, but either way, it’s problematic. (There was a similar issue related to hyphenated final lines, with a fix in the comments, but this one is still unsolved for me.)

Morte d’Arthur. I’m planning to make a Middle English edition of Malory’s Morte, for fun. If I can figure out the Paged.js issue I may do a PDF, but at this point I’m leaning toward doing just an EPUB. Originally I was going to first write Caxton, a shiny new replacement for my md2epub script, but I realized that md2epub works fine and I don’t actually have a real need to replace it. (I’ve thought about using pandoc instead, but the same principle applies.)

Andrew Lang’s Green Fairy Book, to go along with the first two books in the series. This’ll just be EPUB. (Getting Kindle books to look good outside of Amazon’s enhanced typesetting ecosystem is a losing battle, so I’ve given up on that.) Also, I’m looking at Green and Morte as a way to figure out better, more sustainable ways for me to make books — avoiding RSI, mainly. This will probably take the form of a text processing DSL ala Fledge, possibly with a more verbose and more user-friendly replacement for regular expressions.

Projects I’ll probably never do

  • A self-contained wireless plotter, basically a DIY Logo turtle. Probably with a Raspberry Pi Zero W running it. Maybe with Legos for the chassis and motors. An arm to hold the pen, and some kind of DSL to control the movement.
  • Paper speaker (copper tape) that can somehow read its audio data from printed marks on the same sheet of paper. (No idea how this would actually work.)

Ploum on a computer built to last fifty years. I like the offline-first idea, and the peer-to-peer idea is intriguing.

Steve Lord on the hundred-year computer. Similar idea. Permacomputing is my jam.

Collapse OS. Even if an apocalypse like this never happens, these projects fascinate me.

The Manager’s Handbook on giving feedback. Good suggestions.

SimulaVR on why VR computers are better than PCs/laptops. Whether it’s AR or VR, something in this vein feels like the future and I want it.

Matt Webb on social gradients. This was good. I need to read A Pattern Language, too.

Joe Pinsker on not apologizing for being slow to respond. Food for thought.

Tracy Durnell on writing metrics. I think she’s on to something.

Lincoln Michel on writing the right words, not the most words. Also good.

Lincoln Michel on the plotting vs pantsing false dichotomy. Useful.

Charles Brooks’ photos from inside musical instruments. Lovely and a little haunting.

Tom Watson’s wiki trivia game was fun.

Brian Potter on why skyscrapers are so short. I don’t know that I agree with him that we should build taller, but I’m also super afraid of heights.

Natashah Hitti on the Norimaki taste synthesizer. I’m assuming at some point I’ll have to mute smells on Zoom calls.

Ryo Tada’s Fulu project, a haptic fingernail. I’m still not entirely sure how it works, but it looks interesting.

Alise Fisher on the Webb telescope arriving successfully at L2. Yay!

Janelle Shane with some New Year’s resolutions generated by AI. These are great.

Jason Fried on presence indicators in apps like Slack. Agreed. After reading this, I set my Slack status at work to always be away (with my manager’s blessing and with letting my team know).

Lincoln Michel on why you need to read fiction to write fiction. Yup.

Max Böck on making free stuff (on the web). I am clearly in favor of this. Sidenote: I am becoming less and less of a capitalist as I grow older.

Merriam-Webster on what ‘sus’ means. I haven’t heard it in the wild yet but I’m looking forward to!

Paul Karasik on studying something you love in depth. This is good.


I made Siri fast on my phone again (it had gotten incredibly slow) by turning off content suggestions. Also sped up the Reminders app by turning it off in iCloud and back on again, and moving all my items to a new list.

I totally forgot about macOS Monterey and still haven’t upgraded yet. I used to be a day-one adopter on these OS upgrades but in recent years I’ve gotten burned too many times. Still trying to decide if I want to chance it.

Some of the career paths I wish I could have tried in addition to the one I have, in no particular order: writer, editor, journalist, graphic designer, illustrator, 3D animator, artist, typesetter, lawyer, professor, detective, private investigator, architect, city planner, publisher, think tank researcher, archaeologist, anthropologist, physicist, biologist, geologist, astronomer, civil engineer, mechanical engineer, electrical engineer, aerospace engineer, materials engineer, roboticist, cartographer, lexicographer, set designer, technical writer, carpenter, blacksmith, sculptor, geographer, historian, baker, tailor, potter.

When I see other people behaving badly, I now tend to think of them as having gotten their mental software into a glitchy state. I don’t yet know all the ramifications of thinking about people this way, or whether I’ll continue with it, but one advantage I’m finding is that it dissociates the behavior from the person. (When I say state, I’m thinking of software state while a program is running — temporary and not innate. And yes, rebooting humans is harder.)

For my website, I’m now leaning toward sticking with my Linode instead of moving everything to Render. Running my own VPS is more hassle, sure, but it feels more indie to me…and apparently that matters. I do plan to start over soon with a new Linode where I can keep on top of upgrades more regularly, though.

Reply via email

Prints 1.2

Welcome to Prints volume 1, issue 2.

Table of contents: Reading • Watching • Making • Links • Thoughts


After reading four nonfiction books at a time, I’ve dropped back down to one at a time (along with one fiction at a time). Reading more books concurrently felt like a way to get through the slow more easily, but I think it made it worse. I definitely wouldn’t have finished Bede’s Ecclesiastical History any time in the next month or two if I hadn’t focused on it. One at a time also has the advantage of being cognitively easier, which feels better on my brain.

I predominantly read books written in the past fifty years, but as I’ve mentioned, I’d like to read more books written before that narrow sliver of time. (Thus the Bede.) To that end, I’m hoping to try to have every fourth book (or so) be an old book. Planning to try some Roman historians next, and maybe some English chronicles as well.

Goodness, there are lot of books I want to read. Mount TBR’s growth is certainly more than linear. Hopefully not exponential yet, though.

With my (extremely meager) writing, I tend to measure my output by the number of words written. Getting one or two thousand words down marks a really good day for me. Well, for comparison: last year I read approximately 9.4 million words — around 25,000 a day. (While the comparison interests me, it is of course not fair. Creating is usually more time-intensive than consuming, something I need to remember more often.)

Recent reads


  • Kassia St. Clair’s The Golden Thread was fascinating. More wide-ranging than I expected, across both time and space. I absolutely want to read more about textiles — very open to recommendations.
  • As alluded to above, I went full Bede and finally made it to the end of his Ecclesiastical History of the English People a few days ago. If you care deeply about what day Easter is observed on, this is the book for you. Slow reading at times, but I liked it and I’m glad I read it. Also, the old place names were delightful. A small sample: Infeppingum, Ythancaestir, Streanaeshalch, Paegnalaech, Lyccidfelth, Cerotaesei, and Adtuifyrdi.


  • As with the first in the series, I liked the anthropological/linguistic angle in Arkady Martine’s A Desolation Called Peace. My brain found it very reminiscent of C. J. Cherryh’s Foreigner — so much so, in fact, that my imagination kept replacing the Teixcalaanlitzim with Cherryh’s atevi aliens. (This reminds me that I need to continue the Foreigner series sometime.)
  • I enjoyed Martha Wells’ Rogue Protocol, third in the Murderbot series. The novella length is perfect for me. These are light, easy reads, too.

Books acquired

A new experimental section, inspired by David Allen’s book posts. It’ll be embarrassing (I buy a ridiculous amount of books) but I like books enough to want to include it. Keep in mind that I mostly buy ebooks on sale, and I also work at a company that has an unlimited books benefit, which I am clearly putting to full use.

Books acquired since last issue, in acquisition order:

  • The Black Coast — Mike Brooks
  • The First Clash: The Miraculous Greek Victory at Marathon and Its Impact on Western Civilization — James Lacey
  • Termination Shock — by Neal Stephenson
  • The Passage of Power: The Years of Lyndon Johnson IV — Robert A. Caro
  • Caught in the Revolution: Petrograd, Russia, 1917 – A World on the Edge — Helen Rappaport
  • The Artist, the Philosopher, and the Warrior: The Intersecting Lives of Da Vinci, Machiavelli, and Borgia and the World They Shaped — Paul Strathern
  • Ghosting the News: Local Journalism and the Crisis of American Democracy — Margaret Sullivan
  • Win at All Costs: Inside Nike Running and Its Culture of Deception — Matt Hart
  • Betsy Ross and the Making of America — Marla R. Miller
  • Ages of American Capitalism: A History of the United States — Jonathan Levy
  • Songs of a Dead Dreamer and Grimscribe — Thomas Ligotti
  • Labyrinth of Ice: The Triumphant and Tragic Greely Polar Expedition — Buddy Levy
  • They Said They Wanted Revolution: A Memoir of My Parents — Neda Toloui-Semnani
  • The Tycoons: How Andrew Carnegie, John D. Rockefeller, Jay Gould, and J. P. Morgan Invented the American Supereconomy — Charles R. Morris
  • The Brothers Karamazov (Pevear & Volokhonsky translation) — Fyodor Dostoevsky
  • Kingdom of Nauvoo: The Rise and Fall of a Religious Empire on the American Frontier — Benjamin E. Park
  • The One Device: The Secret History of the iPhone — Brian Merchant
  • How Do We Look: The Body, the Divine, and the Question of Civilization — Mary Beard
  • A Practical Guide to Conquering the World — K. J. Parker
  • Ember Rising — S. D. Smith
  • Ember’s End — S. D. Smith
  • China in Ten Words — Yu Hua
  • Bag Man: The Wild Crimes, Audacious Cover-Up, and Spectacular Downfall of a Brazen Crook in the White House — Rachel Maddow
  • The Making of Prince of Persia: Journals 1985–1993 — Jordan Mechner
  • Leonardo da Vinci — Walter Isaacson
  • The Cloud Roads — Martha Wells
  • The Undoing Project: A Friendship That Changed Our Minds — Michael Lewis
  • Edgar Rice Burroughs: Master of Adventure — Michael A. Lupoff
  • Facebook: The Inside Story — Steven Levy


Another new experimental section: words I’ve come across in my reading that caught my interest.

The polite thing to do here would be to include definitions, but looking words up is half the fun, right? I’m also leaving out the language — some of these are from a French dictionary, for example — and I’ll leave the list unsorted to boot. (If you think I’m just being irresponsibly lazy here, you’re not wrong.)

  • maltote
  • IOOF
  • chapfallen
  • gage
  • marivaudage
  • rodomontade
  • mulct
  • flitch
  • electuaries
  • on eyre
  • condign


I don’t feel like I watch enough of anything to warrant a section here, but that’s probably not as true as I think, so here we are.

Enjoyed Encanto (still have the music stuck in my head), Ron’s Gone Wrong, the Loki series (so weird), and the Assembled documentary series (I love love love making-of documentaries).

Tried The Book of Boba Fett but I really struggle to enjoy Star Wars at all anymore. Back when The Mandalorian came out, I bounced off it as well. (Guess which streaming service we subscribe to, by the way.)

Lately we’ve started watching BYU volleyball games, which has been fun.


This past run (as in a run of days, which is what I’m calling the time period between issues, at least for now) my back has been worse, which makes some type of work (like art) more painful/difficult. My day job has also been very busy, leaving me with fairly little energy left over in the evenings. End result: not much project work.

Current projects

Salviana (working title): I’m close to finishing the new outline. It incorporates a lot of what I already have in the first draft (which is a nice change; usually my revision outlines end up changing everything). Hoping to finalize it soon so I can dive in and make the revisions.

Retzi (working title): On hold while I finish outlining the Salviana story.

Religious art: My Their Work and Glory piece is in a new exhibit, The Sacred Feminine in LDS Art & Theology at the Center for Latter-day Saint Arts Gallery in New York City, open January 14 through March 6. (It’s in under the alternate title Their Work and Their Glory.) I’ve tried a few ideas for new work but haven’t come up with anything I’m happy with. I suspect I may have reached the end of my time exploring this type of art; a pivot to some other kind of art is probably best. Also, in case anyone’s curious about scale here: in 2019 I sold 15 prints, in 2020 I sold 183, and in 2021 I sold 196 (all on-demand through Society6). I haven’t done any marketing and don’t care to.

Other art: I played around a little with Procreate 5.2’s new 3D painting functionality. Itching to do more with that and realized I need to get better at modeling in Blender first. (I did end up playing around with geometry nodes a little. Nothing to show for it yet.)

Charts: I’m thinking about making a Latin endings chart. It would show -ae, for example, and then list out all the grammatical possibilities for that suffix. Not sure yet if it’s actually a good idea; still in the exploratory phase. (Still haven’t actually done anything beyond writing down the idea, to be fully transparent.)

Bane: Backburnered for now. I’m not sure designing a general-purpose language interests me enough right now to continue with it — at least not one that’s basically just an amalgam of other languages. If it was innovative enough, though, then perhaps.

Marks: I’ve decided to go with making this a DSL instead of a VM. Random ideas for it that I haven’t really thought through yet:

  • Leaning towards declarative instead of imperative (ala POV-Ray, Lilypond, OpenSCAD, etc.)
  • Special focus on path manipulation (iterating through paths, moving points around, filters for roughening paths, etc.)
  • CSG/Boolean support
  • Not sure if this is purely generative or if modifying existing SVGs (for example) would also be part of it
  • Custom brush strokes defined through functions, with controls for falloff, opacity, etc.
  • Paths and points as primitives, along with being able to define new primitives (just functions, really)
  • Not sure yet how much will be vector vs. raster
  • Reference implementation built in JavaScript

Bend: I’d been trying to figure out the curve-editing commands more abstractly, but it was hard to latch on to and I didn’t get anywhere with it. Recently, though, I tried writing user stories — e.g., “I place a point, pull out a control point, and then place another point up and to the right with its control points extended” — and already it’s helping anchor things enough that I’m making (slow) progress again.

Hinterlight: A typeface, previously known as Hinte. I started it months ago (designing it in FontForge) but abandoned it because I am not at all good at type design yet. Recently I resurrected the project, with a few new process ideas that will hopefully help: using Paged.js to generate proof PDFs and then proofing those on my iPad (in Documents, using my Apple Pencil to make annotations). I feel like it’ll still take a long time before I get any good at type design. Baby steps.

Projects I’ll probably never do

  • A protocol (parallel to HTTP, Gopher, Gemini) that lets you broadcast one word per day. An exploration of the idea of really slow communications. This would possibly lead to some suspense (“Which way is this sentence going to go? I won’t know for weeks!”), but more likely it would just be insanely boring. Still, smaller, simpler protocols for alternate nets interest me. (I do still plan to get a Gemini server up at some point.)
  • Take a medieval chronicle and publish it in blog format. Probably posted all at once, but possibly in “real time” with a contemporary day for each year in the chronicle. Someone has probably already done this.

Brandur on using Docker for local development. Reproducible deterministic environments are worth it, I think. But I’m all for getting rid of complexity where possible.

Mapbox on their adaptive projections for interactive maps. Loved this.

TinyGo, a Go compiler for embedded and WebAssembly. (A stripped hello world gets down to 10k.)

Where Is Webb, a nice info page showing the current status of the Webb telescope.

James Padolsey’s Break the Bubble escape chamber. A recommendation service for books you probably haven’t read by people who read books like you.

Tom Scocca on how long it takes to caramelize onions. From 2012 but still good.

Dinwar on how geologists think. Found this fascinating.

Moxie Marlinspike on crypto. For whatever reason I’ve had zero interest in blockchain/crypto/NFTs/etc., but this seems a level-headed take.

Molly White on blockchains. Also a level-headed take.

PrinceJS, a web-based recreation of Prince of Persia (which I played as a kid). Works on mobile, too.

Stanford Carmack on subordinate that usage in the Book of Mormon. His research into the Early Modern English syntax of the Book of Mormon is fascinating.

Christopher Moore on a meteor that hit Tall el-Hammam 3,600 years ago. More particularly, it’s about how they deduced that this happened.

Women in Type, a research project showcasing women’s contributions in type history. (Fonts, that is.)

Patrick Tanguay’s list of friendly indie micropublishers. I love lists like this.

Kevin Kelly on ideas wanting to be shared. This resonated with me.

Kevin Kelly’s 99 additional bits of unsolicited advice. Also, I wish I’d had the foresight to register bc.net back in the early days of the web.

Julio Merino’s EndBASIC project. A web-based interpreter modeled on QuickBASIC with a DOS environment. Nostalgia! (It’s not quite the same as what I programmed with as a kid, but still nice.)

Anthony Warner on botulism and Botox. The stats toward the end blew my mind.


On that iOS keyboard bug I mentioned last issue: if I open Safari, go back to Home Screen, and then reopen my PWA, the keyboard returns. A little quicker than killing the PWA, though still obnoxious.

Some random small horological musings on advantages analog clocks have over digital. Analog is spatial: time takes up space, so you can see the size of it at a glance, along with relationships between intervals. With digital, you have to do some basic math first and it’s still more abstract. Also, analog clocks make me less concerned about the exact time — within a few minutes is usually acceptable. (These thoughts bubbled up when I decided to change my watch face from digital to analog.)

Realized I’ve had this website for over half my life.

Reply via email

Prints 1.1

Welcome to Prints volume 1, issue 1.

Table of contents: Introduction • Reading • Projects • Work • Personal • Links • Miscellanea


In my recent (failed) attempts to get back into blogging, I’ve been aiming for a frequent stream of small blog posts. It hasn’t worked.

Enter an experiment from stage left, one that will veer in the other direction: longer, less frequent posts. More specifically, I’m taking the weeknotes idea and fleshing it out even more, effectively turning this blog into a cozy little magazine. (How is this different from weeknotes? For me, in this model all posts are part of the zine, rather than having other posts alongside the weeknotes. Does this matter to anyone but me? No.)

I anticipate issues going out every couple weeks, but let’s leave that open and flexible. The name, Prints, is an allusion to both printing/publishing and footprints/tracks. It all feels a bit pretentious, to be honest, but I’m doing it anyway.


I recently got a Kobo Libra 2, to explore the ereader ecosystem outside of Kindle. It’s…a lot better. Better typography, better page turns, better lighting. I much prefer the Libra to my Paperwhite. (That said, I still do almost all my reading on my phone. Hoping to branch out a bit, though, because I can get larger fonts on the Libra and that’s nicer on my aging eyes.)

The quest to read more old books continues. I’m a third of the way through Bede’s Ecclesiastical History and it’s taken me two months to get this far. I’m not giving up!

Lately I’ve started making time to read from dictionaries, and I love it. So delightful. So many good words. (I’ve also started making time to study maps.)

Recent reads

Nonfiction: I ate up Robert A. Caro’s Working and can’t wait to read both The Power Broker and his LBJ series. David Grann’s Killers of the Flower Moon was sad and riveting. It was fascinating reading about Aldrich Ames and Robert Hanssen from the KGB side in Victor Cherkashin’s Spy Handler.

Fiction: K. J. Parker’s Siege series really clicks with me and How to Rule an Empire and Get Away With It was a delight. Also enjoying the Murderbot books. Sam Hughes’ There Is No Antimemetics Division was mind-bending but ultimately not particularly enjoyable for me. I did like Naomi Novik’s The Last Graduate, though, along with Orson Scott Card’s Duplex.

This year’s reading stats

92 books finished. 55% of those were nonfiction (51 books) and 45% were fiction (41 books). 19 books abandoned mercilessly.

37,634 pages read (103 pages per day on average). By page (which includes abandoned books), 44% of my reading was nonfiction, 34% was fantasy, 19% was science fiction, and 3% was other.

Of the fiction, 14 books were standalone, 9 were the first book in a series, and 18 were subsequent books in a series.


My interest in different types of projects tends to rotate on a near-daily basis. I used to trim my list of current projects each time that happened (convinced that this is the time that I really do focus just on writing forevermore), but lately I’ve realized that it’s better to just leave everything in place for when my interests change once again.

Also, I feel like I haven’t really been great at finishing projects lately. Not sure why. (Could be my back issues, or the pandemic, or switching jobs. Or maybe I’m just losing my touch.)

Current projects

Salviana (working title): A story I’ve been working on for a couple months. Thirty pages written (discovery written, I should say) and the first draft is very close to done. Figuring out revisions and hoping that helps with figuring out the ending.

Retzi (working title): A story I’m outlining, in the hope that I can make myself into an outliner and become at least a little more prolific with my fiction. I got an initial high-level outline finished and then decided I want to take the story in a different direction.

Bane: A programming language I’m designing, mostly just to play around in that space and see if it’s something I want to spend more time on. I don’t know yet if I’ll actually build a compiler/interpreter for it. Some silly and unorganized sample code (all subject to change):

export printName
import lookup from utils

fn add x:i16 y:i16 -> i16 = x + y

fn printName name:str {
  print "{name}"

// conditionals
x > 5 {
  printName "Bob"
  y = add 42 x
  z = fn count:i32 -> str { count.str }
} else {
  print "Too small."

person = lookup "Jane Doe"
match person {
  firstName.length > 10 {
    print "{firstName} is too long!"
  firstName./^Ro/ {
    // regex match
    print "Probably Robert or Roger"
  firstName./^Sa(?<rest>.+?)/ {
    // regex match with named capturing group
    print "Hello, Sa{rest}"
  phone[:3] == "801" {
    // slice
    print "Utah"

// basic loops
loop 0..10 step 2 {
  print "Counting by twos"

loop until x == 0 {
  x -= 1

loop while x < 10 {
  x += 1

// loop through a list
loop names as index, value {
  print "Name {index}: {value}"

// loop through regex capture groups
loop nameString./Name: (?<name>.+?)/ {
  print "Found name: {name}"

// error handling
  // .. some code ..
}.trap error {
  log error

I’m sure there are inconsistencies there and things that aren’t well thought out yet. It’s a rough draft.

Marks: A VM for generative art that I’ve been planning, though I’m beginning to think it may turn from a VM into a DSL. Either way, the idea is to establish some primitives that make it easier to make some kinds of generative art. Is this better than just making a good library for an existing language, though? That’s the question.

Bend: An exploration of what a UI for editing curves entirely via the keyboard might look like. (Vim for Illustrator, I guess?) I’ve got a basic prototype built that can do straight lines; now I’m figuring out how the editing language should work for curves, selection, all that. (With this project, the design appears to be the hardest part.)

Cast: The engine for this site. I got most of the way done building Cast as a static site generator but then stalled out, and in the past couple days I’ve realized that it’s almost certainly because I don’t really want to use it. So I’m pivoting it to something I hope will fit me better (probably integrating it with Slash, my blog engine).

Religious art: After taking a break for several months, I did another abstract religious piece. I’m not sure if I’m back in the saddle there or if it was a one-off, though. (Up until this last piece, I’d tried several times to come up with new ideas but the well was dry.)

Generative art: Back in October I played around with forming lines out of small circles, for a marker-like effect:


Recently I took that code and used it to make some random-walk art (textured afterwards in Affinity Photo, which I realize could be considered cheating but it is what it is):


I’m hoping to play around with Blender’s new geometry nodes soon.

Charts: I’m thinking about making a Braille alphabet chart and maybe more Latin charts. I’m particularly intrigued by the idea of doing them in HTML and CSS or in SVG (and thus being far easier for other people to modify, since PlotDevice is Mac-only).


I’ve started going through Josh Comeau’s CSS course, and so far it’s good. Still planning to dive deep into the actual CSS specs, though. (When I get time. Ha. There is so, so, so much to study and learn, and so little time to do it in. But baby steps make a real if small difference.)

In our engineering team book club we’ve been reading Martin Fowler’s Refactoring and I’m liking it a lot more than I expected to. Haven’t yet adopted the overt refactoring steps, but I plan to try it out.


Since the last weeknotes I posted back in March: my wife and I have gotten fully vaccinated and boosted, and our three oldest kids have also had their second shots. We’d hoped our youngest would be able to get vaccinated soon but it’s looking like it’ll take at least several more months. Because of that we’re still not hanging out with people or going back to church or into restaurants or movie theaters, but we’ve started doing in-person grocery shopping again.

As far as my back goes, it hasn’t gotten better, even with physical therapy. So that’s fun.

Liz Stinson’s oral history of Processing. Enjoyed this even though I’ve barely used Processing itself.

Mary Soon Lee on The Sign of the Dragon, her novel made from 300+ poems. Intriguing — particularly the way the poems are all self-contained and yet combine together into a larger story. Maybe it technically isn’t a novel, but either way, it has hooked my interest.

Alvar Carto lets you make phone wallpaper from maps. My lockscreen is currently a view on York, England.

Justin Etheredge on twenty things he’s learned in twenty years as a software engineer. Some good points.

Matt Mikalatos on the problem of Susan in the Chronicles of Narnia. Loved this.

Natalie Wolchover on why the Webb telescope matters so much. I actually hadn’t heard about it at all until a few days ago, which is mildly embarrassing.

Parimal Satyal on rediscovering the small web. Nostalgia!

Oliver Burkeman on treating your to-read list like a river, not a bucket. A decent strategy for those of us where we’re adding to the list faster than we’re finishing books.

Ahmad Shadeed on defensive CSS techniques. Some good suggestions.

Dave Rupert’s RSS club. Posts that only show up in RSS readers. Intriguing.

Alex Chinneck’s art installations. Love these so much.

East Asian age reckoning is something which I a) didn’t know about till recently and b) found startling, in a good way.

Bruno Simon’s homepage. I love the 3D take on a homepage along with the aesthetic.

Lynne Olver’s food history timeline is fascinating.

Paul Salopek’s 24,000-mile walk from Africa to South America is also fascinating.

Vertiwalk, an invention for moving between floors without needing to use stairs.

Bartosz Ciechanowski does it again with an interactive tutorial on curves and surfaces.

Aram Drevekenin on the anatomy of a terminal emulator. Love the aesthetic here, too.


iOS 15 has been more miss than hit for me. Particularly the Reminders app (it takes five to ten seconds for items to update once I’ve checked them off, and they frequently come back even after that) and PWAs (when I tap on a textarea, the keyboard comes up except all the keys are missing, so I have to force-kill and restart the app, and if I switch to another app and then switch back, the keyboard disappears again; it’s bothersome especially because I use a handful of personal PWAs extensively).

We enjoyed watching the Hawkeye miniseries.

I switched the font on my site to self-hosted (used to be Google Fonts), which brings the third-party tracking down to nothing, finally. Also moved to an IM Fell font for more of an old-book vibe.

Reply via email