[ \t]+$
Control + Command + Space, or fn + E
fn+E works if you type a word first and want to match the emoji to that. Then hit return/enter to make it go.
To save myself opening the Mintest Style Guide and squinting at the answer there:
In Minitest, we assert_equal expected, actual
mysql -h 127.0.0.1 -u root -p db_name
This lets me connect to a dev db locally, without going through Rails.
bin/rails db -p
This gives me a sql console that is in Rails.
mysql -h 127.0.0.1 -u root -p db_name < query.sql > next_query.sql
This runs the stuff in query.sql and pipes the output to next_query.sql.
ActiveRecord::Base.connection.execute(sql_string)
Run some SQL in a Rails console without going into a special console.
|- or just | is yaml for "multilines"
{%- tag?We can include hyphens in your tag syntax ({{-,-}},{%-,-%}) to strip whitespace from left or right.
Nunjucks does it, too.
{# like this #}
I am about halfway through “Common Bonds: A Speculative Aromantic Anthology”, and have enjoyed a lot of the stories in it quite a bit.
“Taslīm: We are the prophets: Poems on a Coptic Girlhood” by Carolyn M. Ramzy, an Ottawa professor of Egyptian Coptic heritage has been really interesting, too. I didn’t go in knowing a ton about Coptic culture or theology, but I read the notes in back first and that gave me a good enough starting point to appreciate some of the themes presented. I learned that in Coptic Christiainity (a religious minority in Egypt), sacred music is central in worship, but women’s voices are suspect, too potentially sin-inducing, and expected to blend into the background, never heard solo or even able to be picked out individually in group singing. Ramzy writes in this context, of trying to make sense of the sacred and begin to claim one’s own voice as worthy, as a person growing up in the Coptic diaspora in Canada. There’s a lot more to it, too, and I’d definitely recommend checking this one out if you get a chance.
Kids books, though! You clicked for kids books. We’ve got a great crop of kids books we’ve been reading lately. In no particular order…
“Blueberries for Sal,” first published in 1976 by Robert McCloskey seems to be my 4 year old’s current favorite. The illustrations are nice - I love the character art of Little Sal and her mother especially, and the shocked expression on Mother Bear and how they match Little Sal’s mother’s shocked expression are great. There’s a very pleasing symmetry across the text: Little Sal does this, Little Bear does this, etc. It doesn’t necessarily sound as dated as the very classic-feeling art looks to read, but somehow I still end up slipping into that voice that I imagine newscasters or actors used in the 50s when I read it aloud. I definitely want to pick up “Make Way for Ducklings” next time I see it at the library.
Second to “Blueberries for Sal” currently as a household favorite is “How It Feels to Be A Boat” by James Kwan. The art in this one is really nice, and it flows well to read aloud without being overly sing-songy. I would describe it as basically “intro to Internal Family Systems for kids”, though it doesn’t use any therapy-speak at all or get into any traumatic stuff. You are a boat! And the many individuals who live in your belly-rooms, with their various interests and alignments (the chef, the octopus with his gadgets, the superhero waiting by his telephone, the big brass band, Daniel) usually get along, but sometimes they fight. They have different ideas about where the boat should go. But you are a boat, and you are strong. Ahoy! I love this book; it’s really quite lovely.
“Here Comes Truck Driver Hippo” by Jonathan London is also very big right now. Little Hippo is the main character and he likes pretending to be big, like when he decided to become Truck Driver Hippo for the day to deliver sand to the lion cubs so they could have a sandbox. He crosses a lot of other animals on his way to make the delivery. And then he goes home and and takes a nap in his truck. I stumbled into hot water at bed time the other night when I suggested we put the book away, because it turns out it’s become an essential part of bedtime lately for the book to be near my kid’s head in their nest of blankets on their bedroom floor (I promise they have a perfectly normal twin bed that only occasionally gets slept in; this is not a battle I care about), open to the page where Truck Driver Hippo is asleep in the bed of the truck.
We picked up “Construction Site: Farming Strong, All Year Long” from the library as a companion to the French version I had given the kids for Christmas. Since I (re)started just in the last year or so with speaking to our older kid in French, when they can communicate in English now, I often read books in French to them with an ad-hoc English translation for each sentence or page as we go along. (This is to ensure we get to keep reading French books and it’s still fun and my primarily anglophone kid doesn’t just get mad and hate French. It may not be the ideal language acquisition strategy, but neither is never getting to read in French together or making it into a chore!) The construction site books use a lot of truck-specific words though that I was struggling a bit with on the fly. So we’ve done a couple sessions now of reading them side by side, with two books open at once. The library version in English (after the ripped-out first pages we have to skip, sorry OPL I swear it wasn’t us) and our home version in French. The translation isn’t perfect; the book’s rhymes definitely flows much more nicely in English than in French. Same with the other Construction Site book we have in French now - “Bonjour les camions”. It’s a bit disappointing; the rhythm in all the books in the series works so well and they’re so pleasant to read in English! In French they’re… fine.
“Plenty of Hugs” features two moms in the pictures, but the text doesn’t really focus on that. Really it’s like a poem about abundance, and the joy in our lives that has no limit. There’s blue for every blueberry, and red for every strawberry, and plenty of hugs for you and me. It’s really beautiful and touching, and also hard to read and not tear up a little bit thinking about how violence and hate keeps so many kids from having plenty of hugs from their parents, whether that’s from bombings in Gaza or kidnappings and murders in Minneapolis. It’s hard to finish the sentence here, finish the paragraph, get back to thinking about kids books. So I went back to the book itself: “The world is full of wonders. Just look around: It’s true. There are seas for ships, and kisses for lips, so we can whisper I love you.”
“How to Say Hello” by Sophie Beer is another big, bright, colorful board book with nice pictures. ”Love Makes a Family” is the original, and there’s a few out now - I hadn’t even seen this one before though when we found it at the library! I think “Kindness Makes Us Strong” is my favorite one so far. (Every English speaking queer family you know probably has a copy of “Love Makes a Family” already. If you want to gift a board book on inclusive family themes, “Families Can” and “Families Belong” are actually a couple of my favorites to read, though kids do love the bright pictures in Sophie Beer’s work!)
Speaking of different family structures, today we read “My Friends and Me“ by Stephanie Stansbie. Each friend is introduced with the people they live with: a friend with two moms and lots of siblings, one with two dads, one with two houses, a single mom, a foster mom, one with an older sister caring for them, and the main character lives with their grandparents. It was cute. The illustrations include little snippets of text labeling different parts, like “best meal ever” labeling a tower of treats at the brunch Kate’s dads take her out. My kid enjoyed pointing at the different pieces of text: “what’s this one say?” And also was proud to know already that brunch means breakfast and lunch at the same time, since we discussed that last time grandma & grandpa were in town and we went out for it.)
“Our Home: The Love, Work, and Heart of Family” is a book I like more than my kid, sadly. It talks about it’s a lot of work to keep things going around a house and do stuff like make doctor’s appointments and make grocery lists and get everyone and all their things where they need to go... but kids can contribute too to the household by helping out with stuff, too! No idea why my four year old isn’t obsessed with it tbh.
“Robin Hood” by Bethan Woollvin is a fresh-feeling retelling of Robin Hood with eye-catching high contrast art and a she/her Robin. We’re pretty into this one. We haven’t previously read any others from the same author (or series?) but I’m definitely interested in checking more out.
“Roto and Roy to the Rescue!” by Sherri Duskey Rinker (of “Goodnight Goodnight Construction Site” fame) I had to grab when I saw it - a couple months ago we had “Roto and Roy: Helicopter Heroes” and loved it. All the Construction Site books are great, as I said before. (We even have the Christmas and Halloween special editions at home; they’re fun.) Roto and Roy are recognizable as the same author via the text: the rhyme scheme and meter are the same or very similar, and quite consistent. (this is a compliment, to be clear!) But Roto and Roy are also clearly for a slightly older audience, and have slightly more high stakes action. In “to the Rescue”, there’s a flood in what appears to be a town in a desert and Roto and Roy help rescue people who are stranded, then work through the night to lay sandbags with other helpers. In “Helicopter Heroes”, Roto and Roy help put out a wildfire, but first they rescue some people who were camping and now find themselves surrounded by fire.
“Goldfish on Vacation” by Sally Lloyd-Jones is apparently based on a true story of a fountain in some semi-famous New York City park that for a decade or so, local kids dumped their gold fish in at the start of the summer and then reclaimed a couple fish from the fountain, after someone had started maintaining the fountain, sort of? It’s a cute story but as the parent reader I have a lot of unanswered questions about the logistics here and the pet care implications!
“Izzy Paints” by Tim Miller is about a koala named Izzy who visits a museum and is inspired to become an artist. We read it and my kid immediately was inspired to visit a museum and become an artist. 10/10.
“All Are Neighbors” by Alexandra Penfold is pretty simple and repetitive in text, but the illustrations are so detailed and colorful that it’s still a pretty fun read. It’s probably about time to take this one back (we’ve renewed a couple times already) and time to hit our local indie bookstore to get a copy to keep.
“Un coin de parapluie” by David Herńandez Sevillano is one of the best French picture books we’ve read lately. It’s about a zebra at the start of the rainy season who has a big colorful umbrella, and a variety of animal friends show up and ask if they can sit under it to stay dry. “Bien sûr,” the zebra says over and over, of course! Come on in, there’s room under my umbrella! Simplicity is its strength, I think, and it’s just really charming. The page with no text, just a close up full-bleed illustration of all the animals huddled up drinking hot cocoa under the umbrella always makes us all smile.
“A Dress With Pockets” by Lily Murray is a fun read with fun illustrations to look at and pretty good text. The main character’s aunt takes her to a store that sells all kinds of dresses, and after a demonstration of the wide variety of kinds of dresses the stores sells, what the kid really wants most is a dress with pockets. Then we hear all about the cool adventures she could go on wearing a dress with pockets. Leave your tropes at the door, though: I don’t think the sentence “thanks, it has pockets” appears in this book anywhere.
]]>Time felt a little slippery this year in a few ways, I guess. At one point I shared in my work chat about a silly mistake I'd made, and added a sarcastic "happy Monday". I didn't realize til later that it was not in fact literally Monday that day; my coworkers had assumed part of the joke was I already knew that. Not that time!
Being more present in the moment was something I tried to put effort into this year - not 100% of the time, but more and more, using principles from mindfulness meditation. Be in the moment with my family, phone down, focus on what's happening right in front of me and that time together rather than thinking grown-up thoughts about grown-up problems. I tried to remember at other times to pay more attention to the sensations I was feeling in my body as I did chores or waited on something, or to just to notice my breathing. I just started re-reading Nurture the Wow: Finding Spirituality in the Frustration, Boredom, Tears, Poop, Desperation, Wonder, and Radical Amazement of Parenting by Rabbi Danya Ruttenberg, which I first read when I was pregnant with our older kid. I'm happy to revisit the actual text, but mindfulness, quiet devotion, and wonder to get through the hard parts of parenting is something that has really stuck with me these past few years.
I started 2025 (here again, I pause - is it 2024 I mean to write? No, 2025.) with a new baby I had just birthed. The song "Hostages" by the Mountain Goats somehow became my anthem of the end of pregnancy; my wife and I listened to it in the car as a hype track on our way to the birthing centre and again, on the way home with the new baby the next morning. In labor I kept repeating to myself "I can do hard things". You know what? I was right.
Reflecting back on the year with my wife the other night, we discussed what moments or experiences brought each of us the most joy this year. My answer came immediately - any time we spent riding bikes as a family. Reading to my kids and being silly and playful with them is up there, too. The baby is now big enough to add his own silliness to the mix, and it's really something special.
I've seen people suggest that instead of a New Year's resolution, one might make a list of things they want more of in their life in the new year, and another list of things they want less of. More family bike rides goes to the top of a list right away; more books does, too. At first I wasn't a big fan of how toddlers (and now I can say, also preschoolers) often want to hear the same books over and over, even back to back in the same sitting. I don't mind it now though, though I do wish it was my turn to pick the book more often! Sometimes the repetition even feels meditative. Tonight we read The Giving Tree in French (L'arbre généreux) three times in a row. We read it first last night and this morning, my big kid told us we needed to go on a tree hunt, to find them a tree to love, and visit everyday. I have mixed feelings on The Giving Tree but still– shouldn't we all go out and look for a tree we can love?
I didn't do a lot of my own reading in 2025, and I'd like to do more in 2026. Between work, and parenting, and managing seemingly endless household tasks and paperwork, I often didn't feel like I had any spare cognitive capacity available this year for other pursuits. Outside of kids' books, I mostly read poetry. I didn't write much, and am hoping to soon do more of that, and more personal writing in general. In past years I've used a digital journaling app, but I'm going back to writing with pen and paper. I bought a paper planner too, for the first time in years. I want to anchor myself in my sense of time, slightly more zoomed out than just the current moment. Place, too- I know our neighbourhood well now and am building up my mental map of Ottawa, and I'm ready to zoom out a bit, and get more familiar with the the wider map of Ontario and Canada.
As far as blogging, I somewhat hastily moved my personal site from the custom-coded Eleventy project I've been cultivating for many years, to this new site using Ghost as a CMS. It's more like Wordpress, more batteries-included for blogging, and less like a hobby coder's playground. I'm more interested in the writing than the code right now, and I was especially seeking a way for people to comment on the things I write - I don't really post much on Facebook or Instagram these days, (and let's not even mention Twitter) and I miss the people I'd have interacted with if I was posting my hot takes and screeds there and if it was still many years ago, before Facebook and Instagram (and let's not mention Twitter) were quite so easily recognizable as what they've become today. If you're reading this, or any other post, and you feel like commenting, please do! I'd love to hear from you. If you don't feel like commenting, heck, send me a text, or an email, or drop me a note on Mastodon or however you usually would contact me.
If you're reading this, and you don't live in my house, there's a pretty good chance I miss you. The heartache of my missing you, and the heartache of all the reasons I have so many people to miss these days, casts a pretty big shadow over the last year.
The top of the list for "what should I do less of in 2026" is really easy, too: in 2026 I hope to not move houses. We moved in 2023, within Lincoln, then 2024 to Ottawa, then in 2025, we moved from the house we first rented here in Ottawa to one we purchased. It's in the same neighbourhood, really close by in fact, but that did not seem to save us all that much of the hassle and headache of moving.
We're making this place ours in a way that I've never really done with anywhere I've lived as an adult before, and it's a lot of fun. The inside of the front door is a vibrant cheery purple, and the living room has a bright green accent wall. Our bedroom walls are purple and my office walls are periwinkle. Big kid picked a forest green, with the promise of blue decorations so both favorite colors could be represented. The "neutral" walls are baby blue or this faint lavender that's just gorgeous in low light. While we were picking colors for the remaining rooms, the store clerk offered us an incredible deal on some paint they'd mixed in the wrong shade– so now the basement is floor-to-ceiling pepto-pink.


I'm taking on projects too that I'd never DIY'd before: I've never painted before, and painted most of the main floor before we moved in. (And eventually hired someone when it was clear finishing the rest of the painting in the gaps between work and kids and whatever else would never happen.) I've fixed a leaking faucet, and am planning to put up a tile backsplash in the kitchen when the onslaught of winter illness ends and I have more PTO banked back up to devote to it.


I've found local community this year most successfully in spaces where my kids are welcome to be part of it, too - play groups and family-oriented meetups or time hanging out at the neighbourhood park. I've taken small steps towards non-family-oriented community-building, but it's been slow going. There's a few factors that go into that; high among them is that the baby only just started sleeping through the night, so I've been exhausted, and has never really successfully taken a formula or pumped milk feed, so... I've been exhausted, and haven't been able to be gone for long solo this entire year. That wasn't really the plan or how I wanted it to work out, but it's what happened.
I can do hard things, indeed.
Happy New Year. May this year be not quite so hard, even though I am confident you too, can do hard things. May you find joy, on a bike or with your loved ones or in a community that makes you feel whole. May you find a tree to love and visit it every day. May we all sleep through the night.
]]>I suspect that some of my thoughts I'd like to share would make a great hit segment on a far-right outrage channel about those crazy libs/the radical left. We're gonna nitpick here, pals! It's my blog and that's what I feel like doing. I am not asking for these books to be banned, and most of these books I've enjoyed reading with my kids and will continue to do so even if there's pages I roll my eyes at each time.
This is hopefully the first entry in a series I'd like to continue, but I have learned from my attempt at writing a mega-post giving a short blurb about every Adeem the Artist song, that is still not complete (or published) approximately a year or more after starting it that it is perhaps best to write the couple thoughts you have right now, and maybe you can put more up later, but don't try to do everything all at once or you'll never be able to share any of it.
Good Night, Good Night Construction Site by Sherri Duskey Rinker: Let's start with an easy one. This book is great, 10/10 no notes. The rhythm and rhymes are great. It's a good length for bedtime.
Construction Site, Taking Flight by Sherri Duskey Rinker: From the same author as the above, this one has the same trucks as the original plus some airplanes and airport-related trucks. The rhythm patterns of the original are present and still great. My main beef with this book though is that the first few pages, when it's talking about the need to expand the airport and the roads leading to it, totally ignores the very real phenomenon of induced demand - adding lanes to a road will never help traffic!
We still read this book all the time and are getting our kid the Construction Site farm themed book, and the airplane one but in French, for our kids as a Christmas gift.
Sharky McShark by Alison Murray: Okay, I get that this is a shark-based retelling of a classic fable, where the big strong animal who bullies the small ones realizes he needs a small one's help and decides to be a better animal-person from then on... but that story's message sucks! Sharky is a mean bully, and proud of it. He doesn't have any friends. Then he gets in a dangerous scary situation (honestly almost too-scary side for our nearly 4-year-old), and a little shrimpy fish he was mean to just a page before helps him out and then they become friends, somewhat inexplicably? And Sharky decides to stop being a bully because he realizes he does actually need friends, and was just scared of being rejected. Maybe let's not with the "bullies are just sad and misunderstood" narrative, and also, even if we help out our bullies when they are in a tough spot, we don't actually have to be friends with them immediately after that? Where's the accountability, where's the apology and repair and efforts to do better, not necessarily mediated by the bully's most recent victim driving the redemption arc?
Interdit aux éléphants by Lisa Mantchev (appears to be called Strictly No Elephants in English, but we got the French from the library). This is a cute concept that I think could have used a few more rounds of revisions. On the day of the Club des Animaux, the kid who has a pet mini-elephant finds an "elephants not allowed" sign on the door of the club location. There is no explanation given for why elephants are not allowed and the book does not even reall question this. Every time my kid asks "why were the elephants not allowed" and I have to say "I don't really know; the book doesn't really say." And then the kid with the elephant meets someone who wanted to bring her skunk to the club, and says the other kids didn't want them to hang out either even though skunks weren't mentioned on the sign. "He doesn't smell, you know", the girl says (in French). "They don't know anything." Okay, sure, maybe the other kids are mislead on the merits of pet skunks (are they?), but there was no reasoning even offered about why elephants weren't allowed so how do we know it's based on a factual misunderstanding? (Remember when I said we were gonna nitpick?) Then the two kids decide to make their own club where everyone is welcome. They pick a treehouse in a park where there is inexplicably (are you noticing a theme here) a sign already on the door that says certain types of people aren't allowed, which they are crossing off to put "everyone is welcome" on instead. The treehouse isn't the same place the previous exclusive club was held; why is there already some other kids' exclusionary sign on it, too? My kid always ask abou that too - what are they writing on the sign, what's that part that's crossed out say? Why does it say that? And, it's a treehouse, and a giraffe is standing on the ground looking in. "Everyone's allowed" I say, and my kid says, every time "but not the giraffe". In the spirit of the book the giraffe is supposed to be being included, but it's equality but not equity I guess - the giraffe can not actually get inside the tree house even if it's allowed to be there.
Go Bikes, Go! by Addie Boswell. We all love this one. 10/10 for giving us a reason to yell "go bikes, go!" when we're biking somewhere together as a family each time we take off from a stop.
If I Were a Llama by JellyCat. This book has nice tactile things on each page babies might want to touch. If I were a llama I'd have a fluffy tail, wow so fluffy. I might have soft ears, wow so soft. All nice attributes of a possible llama, and then bam, last page, "If I were a llama I would live with my friends guarding the magic mountain." Excuse me, what! We have not previously explored at all in this book the possibility this is a magical mountain guard type llama; there is no lead-up here. There's also nothing else really; that's the end of the book. I can't stand this book. I've read it to my kid so many times. :D
Anything ever written about Petit Ours Brun (Little brown bear). We've got some little booklets in French I picked up while we were still in the US about a bear called Petit Ours Brun. A beloved classic character of French children's media, for sure, but I kinda hate all the books. Petit Ours Brun is kinda whiny, or seems to at least not model very good behavior - the booklet that narrates his bedtime routine is the worst but not the only offender. Petit Ours Brun is complaining about not being able to find his teddy. Now he's asking for a drink after he's already in bed. Now he's asking for another hug after his parent already left the room, and the parents keep coming back. Set some boundaries, Papa Ours and Mama Ours!
Board books in cursive. I've only seen French language board books do this; American publishers would never, apparently. But we have some board books where the font for the text is entirely in cursive. I'd rather they weren't!
I'm out of time for now, so that's my list for today! Press publish and next time I have time I can post again - that's the joy of blogging after all.
]]>Ottawa has four separate school boards covering the same geographic area, that are each managed entirely separately: French secular, English secular, French
]]>Ottawa has four separate school boards covering the same geographic area, that are each managed entirely separately: French secular, English secular, French Catholic, and English Catholic. In the French boards, all communication from the school happens in French, and so does all the teaching and activities day-to-day (outside English classes, of course). In the English boards, communication at school is primarily in English, but French-as-an-additional-language classes are part of the curriculum for all students.
Ottawa is predominantly English-speaking, but it's one of the most francophone parts of Ontario. Since it's home to the Canadian federal government, French language ability is a highly sought after skill for employers here. My own ability to speak French started as a random childhood interest, lead me to spending ten months in France living with a host family at 16, and ultimately had a huge impact on my life that teenage me had never dreamed of: it gave me the ability to immigrate as an adult to Canada. Not French-speaking Europe as I dreamed of as a kid, and certainly not under the carefree circumstances kid-me imagined I'd make such a move under. Still though, the impact on my life of speaking French has been truly énorme.
The English schools here offer French Immersion programs all throughout, but I've heard that for kids who speak English at home who do French Immersion all through K-12, it's still somewhat hit or miss if they will be actually functionally bilingual as adults. Whereas, if a kid does their education fully in the French board, they will leave school 100% able to communicate in French and also 100% fine in English too.
I speak French; my partner does not. My wife's been feeling nervous about having our kid do school in a language one of the parents doesn't speak— both as a cultural thing (our kid's experience will be even more different from our own as kids, and even more incomprehensible to our loved ones back in the US than they already are), and not being able to fully participate in things like homework help or conversations with teachers. The benefits of our kids becoming bilingual feel so huge for me, though, and French schooling seems the most reliable path to that outcome.
We arrived the other night at the "portes ouvertes" at the elementary school about 20 minutes after it started. This had seemed totally reasonable to me— my wife had been trying to get us out the door quicker and I kept saying 'it's an open house, it lasts an hour, we've got time to finish dinner.' It turned out to be a sit-down presentation that had started 20 minutes before, and clearly most of the other parents had known that, turning their heads to look at us awkwardly shuffle in. That felt bad! My first test at having full responsibility for handling details with the French school, and I lead us astray.
Later that evening I was reading online and came across Garrett Bucks's potluck manifesto, about the vital importance of potlucks and watching each others' kids, and scooping each other's sidewalks, and all that messy, joyous, sometimes annoying interpersonal stuff that makes up what we call "community". Community, that thing so many people are realizing they lack, yet aren't sure how to make it happen in their own lives.

And I realized that in addition to the logistical worries, and the concern with dramatically leaning back towards "mental load all on me" instead of sharing parental decision-making, knowledge, and power between both parents as we generally do pretty well with kid stuff— French school would mean locking my wife out of a lot of the community aspect of having a young kid in school, and joining the parents' association and volunteering for the after school clubs and making coherent small talk with the other parents at drop off & pick up.
Garrett's essay reminded me, as Garrett's essays often do, that a primary value in our family is community. We make decisions large and small based on what helps us be good community members. Community is the number one thing we want to be able to pass on to our kids as a skill and value. Not French, and really not even anything academic at all.
We'll be enrolling our kid in our neighbo(u)rhood English public school for junior kindergarten next fall. When I think about the pros & cons of each choice, and think about our family values, there's really no question.
As I think about wrapping up this post on a high note, patting myself on the back for remembering a deeply held value and actually thinking about how it applies to a decision in my life (wow, so wise), another truth of this story feels a bit more uncomfortable. I've been thinking for years about the misfires that happens from well-meaning parents "wanting what's best." That's often a very narrow lens that only prioritizes a certain kind of "best"— making sure kids maintain or exceed their parents' social and economic class status in adulthood, perhaps.
I've done the reading, so to speak— though there's always more to do. I can throw around terms like intensive parenting and I've fretted a lot about how to avoid the trap of modern kids' sports culture. "White Kids: Growing up with privilege in a racially divided America" by Margaret A. Hagerman was one of the first books I read during my first pregnancy. (Sarah Jaffe's book "Wanting What's Best" is still on my to-read list, though it's perhaps most directly "the book" for this question.) I read and think about "doing community" nonstop, and I've been trying my dangedest to put it into practice, though the whole international move from my beloved prior community while pregnant and then parenting two young kids while working full time has made the last year harder on the practice front than I'd like.
And yet. All that, and I can imagine how easy it would be to have arrived at a different conclusion. All the times my partner & I had talked before about the choice we are faced with about what school board to enter, and we almost missed this really huge aspect of what that decision could mean for us for the next decade-plus.
I think that's why I wanted to write this and share it, actually. Not just to say "community is important to me" once again, though I am saying that. Not only to say you should read Garrett's manifesto about potlucks, or host a proverbial potluck yourself, though I am also saying that, too. (Here it is again.)
It's maybe to remind myself, and maybe you, too, that your values, even the ones you know you hold most strongly, are never a set-it-and-forget-it kind of deal. You have to keep choosing to prioritize the things you care about. You have to keep remembering those higher principles in new situations, new decision points, and figure out how they factor in. You have to be constantly on guard against cultural messaging that tells you you should value something else. Especially when you do value that something else! There are always tradeoffs. It is better to choose between them with intention, and with attention always to what you are truly seeking to prioritize.
]]>For a while in the last year we've been in Canada, I kept having a dream that we had to return to Lincoln
]]>For a while in the last year we've been in Canada, I kept having a dream that we had to return to Lincoln for something, maybe a wedding, or even just a visit, and then we realized we didn't want to go back to Canada at all, even though all our stuff was still back in our place in Ottawa and it was going to be really awkward to explain to our friends and family that we were back now actually, and let's just forget that whole thing we said before about moving, okay?
I haven't had that dream in a while now; I realized it when I saw the sky open up over the Experimental Farm on a beautiful recent fall day.
Other people are having different dreams, back in the US. I read about the whole apartment building forced out of bed in the middle of the night a few weeks back, in Chicago, and it took a long time to get the horror of what was reported to have happened out of my head.
My empathy didn't used to be quite so vivid, I think, or come with so many pictures attached. A little kid was killed by a garbage truck here recently and the picture of the happy little kid who isn't any more physically hurts each time I see it, on social media or the news or in updates about a vigil or a rally. A young trans woman who just wanted to swim, to compete and have a normal American college experience, was found to have died today. I'm off social media now for the day because it hurts too much to see her beautiful face; to know she shouldn't have died; to know why she died; to know she could be any number of my friends; to see myself, in my own small way, in her.
I think about that apartment building that night in Chicago, and so many of the small moments before and since where the routines of daily life in cities around the US is being interrupted by senseless violence and intentionally stoked fear, state-sponsored terrorism coming straight from the highest halls of power in what used to be/should be/was/could have been/will always be my home.
The people who are most under threat currently by the US's new secret police with seemingly unlimited funding are people who don't look like me - people who don't get read as white. I've always known that we're all human, right? In a "love for humanity, all the humans" kind of way. Having children has made me feel so much more connected to other humans on a spiritual level than I ever have before, though. I see other parents at the park and maybe the foods they eat at home or the languages they speak or the way they dress or the colors of their skin are different from mine, but I know we're both at some point needing to yell "do not jump off of that!" and "get that out of your mouth!" and saying "do you want your hat?" and getting an immediate "no!" as the little cheeks turn rosy as the sun goes down. We all just want our kids to be safe, and healthy, and happy. We want them to please just eat something for dinner and please sleep when it's bedtime.
Since having my first kid I can't stop looking around at politicians and all the "bad guys" of the current moment in the US and around the world and imagining them as little babies. Helpless little babies who have simple needs, hard to satisfy - milk, clean diapers, cozy jammies, warm arms to rock them and mouths to sing to them and kiss their little baby heads. Everyone I meet, everyone in every seat of power who gets to decide who lives & dies, whose life gets harder or easier or wiped out entirely with a stroke of a pen or a triumphant group text about bombing an apartment building - they were little babies once, and they were probably cared for by someone who wanted for them what I want for my babies. To keep them safe, and clean, and healthy so they can grow up and learn about the world and do whatever they'll do as grownups. To get them to please, just please sleep, little baby. Someone wanted that for them before, probably with all their might.
I don't know what my point is here really other than this is what I think about a lot these days. That we were all babies once, even the people who've grown up to do so much harm, and to have values that seem so incomprehensible and foreign to my own. And all us grownups also have a lot in common, especially those of us who are parents. My heart is breaking for the parents (and the not-parents, and the kids) in much more danger than I am, danger maybe I can say I escaped. How soon is too soon to have survivor's guilt, when the metaphorical (and sometimes all too real) bullets aren't done falling yet? And my heart is also breaking because I miss my home, my friends and family, my community. All of it at once.
Hug your babies, hug your friends, hug your community and your neighbors and shower everyone you meet in care. We're all just little beings with simple needs, hard to satisfy. Harder than it should be.
]]>Consider checking out my previous post that has an overview of Ruby on Rails-blessed asset management approaches over the years. The research I did for that post laid a great foundation for me in this work, and helped me feel more confident at helping the team choose a new approach to migrate to since Webpacker is no longer officially maintained.
Webpacker was a Ruby gem for integrating Webpack (the javascript build tool) with a Rails app specifically. It attempted to abstract a lot of the details of configuring Webpack into a set of reasonable defaults that would probably work for a Rails apps, with the option to further customize via Rails-conventional config files instead of the standard config files that webpack-js uses. This supported the general Rails guiding principle of convention over configuration, but in practice, was a bit of a mess. It often was necessary to look at both the documentation for Webpack itself, then translate that into the special case of what Webpacker may or may not be doing already and how Webpacker wanted the config to be defined vs what was shown in the Webpack docs.
Webpacker is no longer officially maintained by the Rails team, and there are a few migration options possible (again see my previous overview for more details!). The most straightforward, and most likely to need to be migrated to something else again later, would have been to swap out webpacker for shakapacker, a still-maintained-as-of-now tool that works essentially the same as webpacker. The least straightforward option would have been to jump straight to importmap-rails, which would have been a poor choice at the moment for an app that uses a lot of React, and is running Rails 6. (Updating the javascript tooling was a big part of helping us get ready for Rails 7, though!) So, we decided to migrate to jsbundling-rails to handle the integrating-with-Rails parts, and stick with Webpack over the more modern esbuild in order to hopefully not have to touch much actual Webpack config and move more quickly.
In hindsight, I wish we had went ahead and switched to esbuild - it seems more documentation and "here's what I did" blog posts or Q&A are out there for jsbundling-rails and esbuild vs Webpack, and I spent much more time fiddling with the new Webpack config than I would have preferred. Webpack configuration is notoriously complex, and I was frustrated by parts of the documentation, like for when an option was going to use a file path, figuring out what the file path would be read as relative to - the location of the config file? the place the webpack process was run from? the context option in my config?
It's worth noting too that the Rails app was already using Sprockets, as that's what "asset pipeline" has meant in versions of Rails prior to Rails 8, where "asset pipeline" starts meaning the PropShaft gem instead of the Sprockets gem. Sprockets can do a bit more than PropShaft, like compile & minify some javascript & Sass on its own, and process Ruby code in ERB that might be in those JS & (s.)css files. I thought not migrating to PropShaft would save time and effort; I ended up running into some issues where Sprockets conflicted with behavior Webpack was already handled that made me wish we were just moving to PropShaft which would stick to the asset-digesting lane only and nothing else.
To get started, I followed the guide from jsbundling-rails to switch from Webpacker 5 to jsbundling-rails with webpack. The first few steps were really straightforward! Remove some gems, add some others. However, for various reasons, at least in our app, it was hard to see it all working til much later in the process, after many more issues were resolved.
The CSS & JS section doesn't say anything about what if you were using the asset-url helper before (see more detail on that later in this post).
The fonts & images section doesn't mention you'll need to switch any of the uses of those images from image_pack_tag to just image_tag, but you'll need to do that. I ended up moving all the images to Sprockets' domain and leaving out file-loader (which is deprecated anyways in Webpack, in favor of using something called asset modules instead). See the "Image Assets" and the "Sprockets asset_path helper gotcha" sections below.
When you're at the use webpack to chunk assets section, you might face the Sprockets issue described here about dashes in file names, but I did not. Including the link though because I thought it might be a source of some of my problems, and it was good to identify whether or not that was true.
In the final section on support for development environment, you see that NODE_ENV is being read, but how are you getting that NODE_ENV to be set? And do the sourcemaps you'd like to have actually work? Read on, my friend.
Previously in the app I migrated, some image assets were served by Sprockets only and used the asset_tag helper, and some were first processed by Webpacker, and used the asset_pack_tag helper. I decided it would be simpler to have all image assets served this way (and PDFs, and any other frontend static files not destined to become a CSS or JS file) handled only by Sprockets, and leave Webpack out of it entirely. This worked pretty well, but lead to an issue where previously some Sass files were able to use the asset-tag helper provided by Webpacker (or Sprockets?) to get asset URLs, but that helper was no longer available because the CSS files handled by Webpack didn't know anything about the Rails environment or how Sprockets was going to add a hash/digest to the asset filename. This is behavior that has a replacement in cssbundling-rails & Rails 7, but as far as I can tell, does not work with jsbundling-rails.
This was a surprise - I expected based on docs and the research I did before that jsbundling-rails would behave more like a superset of cssbundling-rails, with all the Rails-integration features that cssbundling-rails had, plus some extras to let you use a Node-based bundler tool. This seems to be at least one behavior in cssbundling-rails that doesn't have an exact counterpart in jsbundling-rails.
I puzzled for a bit about what to do, and eventually settled on having my Webpack-generated CSS output file have the extension ".css.erb", and I wrote the URL I needed as an ERB-containing string in the .scss file where it was needed.
background: "<%= asset_url('fancy-design.png') %>";Then when Sprockets tried to fulfill stylesheet_link_tag("application"), it found application.css.erb in the Webpack output directory I told it about, and happily did its Sprockets thing of turning that into a simple application.css with the ERB turned into the actual URL I needed for that CSS background declaration.[1]
The app I upgraded used a decent amount of React, but in a very Rails-y way: instead of a single React <App/> that was rendered on every page and was responsible for most of the frontend HTML, most of the app views were in regular Rails view templates/partials. When a page needed a React component, the component for that page was loaded onto a particular element using a gem called Webpacker-React.
Webpacker-React would let you call a view helper likereact_component('Hello', {name: "My Name"}) that would render a React component like <Hello name="My Name" /> at that location. Neat!!
But as you might expect, continuing to use Webpacker-React is a bit complicated when you are removing Webpacker. The original author of Webpacker-React originally intended to deprecate it following Webpacker's phase-out. But, then they started work on a new version that would both rename, and at least partially, rewrite the gem to not depend on Webpacker.
Because, as you might not expect, it turns out that Webpacker-React didn't actually require Webpacker specifically all that much, even though Webpacker was listed as a required peer dependency in the gem. The rewrite kept most of the functionality untouched, but with a more modern javascript setup. The gem name changed from webpacker-react to react-component-rails, signaling you could make your React components into plain javascript however you wanted. Unfortunately, work on this branch stalled in 2022 with version 1.0.0-beta.4, but we were able to use it at that version anyways.
However, there was an issue using it with older React versions, and despite a workaround other people reported worked for them, we bumped our React version to 18 in order to keep our components working with [email protected]. We did need this line still in our webpack.config.js:
resolve: { alias: { "react-dom/client$": "react-dom", }}After replacing the webpacker-react gem with [email protected], I got a really weird error at application startup, where another gem in use by the app wasn't getting loaded properly. It was really weird and seemed totally unrelated to anything I was actually doing around frontend assets. Clearly something had changed about the loaders or some config setting, but what was it?
Eventually I traced it back to a naming conflict with the way Ruby's load path works.
I'm struggling to find an authoritative source on this, so I don't have a link here (feel free to send me one to add if you find one!), but when you're using bundler for your gems, the way it works is that all individual files that are a direct child of lib/ from each gem you're using will be added to the Ruby $LOAD_PATH of your app.
A best practice for creating gems is to have just one file there as a direct child of lib/, perhaps matching the name of your gem, so that users can do require 'my-gem' and get exactly what my-gem wants that to mean.
Any of my-gem's files that its lib/my-gem.rb depends on should be grouped within lib/some-other-folder and namespaced like MyGem::MySupportingClass in order to avoid polluting the namespace. Namespace pollution is when multiple source files are trying to stake a claim on some common name, such that, furthering this example, when somewhere in the app tries to do require 'my-supporting-class', the wrong file is required - we get OtherGem's version of MySupportingClass when it should be MyGem's version. To avoid this, lib/my-gem.rb should instead require 'my-gem/my-supporting-class', because it's pretty unlikely that another gem would ask for one of the files it needs by that exact name.
In the case of react-component-rails, unlike in webpacker-react, there is a file named railtie.rb right there as a direct child of lib/, not inside another folder and namespaced properly. We happened to already use an important-to-us gem that made that same namespace pollution error, with a file named the same thing. So when we did require "railtie" in our gem, we got the wrong railtie.rb and stuff that would normally be included by that gem didn't work.
Since the conflicting gem in our case was under our team's control, we solved this by moving lib/railtie.rb to lib/our-gem/railtie.rb, so the clash no longer happened. It could again, though, if we ever happen to add another gem that makes this same mistake with that exact file name. (Not out of the question; railtie.rb, as you might expect, is not an uncommon file name for gems for use in Rails!)
asset_path helper gotchaOne interesting[2] thing I found when moving more assets to live in Sprockets-land only, not Webpack-land, was that the asset_path helper behaves differently depending on where it is coming from.
If you need an asset_path or asset_url in code outside of a Rails controller or view (such as perhaps, a View Component class, you need to include a module that contains it. If you include ActionView::Helpers::AssetUrlHelpers to get it, your paths and urls won't contain the Sprockets-appended file digest, and you'll get a 404! (in environments where asset digesting is happening - which may not include your dev environment. Have fun!) Instead, you should use ActionController::Base.helpers.asset_path and ActionController::Base.helpers.asset_url, and then you'll have the digests you (may, at least in prod) need.[3]
The jsbundling-rails guide on migrating from webpacker suggested that I could have source maps, optionally. Yay! I do want those.[4] But in practice, I kept getting 404s in my browser developer console for sourcemap files. Hmm. I thought maybe the devtool I was setting in the Webpack config could be the problem, and tried several of them. Nope. Then I was a bit stumped for a while. I thought maybe that Sprockets name-collision issue could be the culprit, but adding the suggested hotfix initializer code didn't seem to help.
Eventually, I realized that my source maps were getting written out just fine by Webpack, but then Sprockets was helpfully trying to add its own source map based on app/assets/config/manifest.js. Sprockets put its sourcemap URL at the end of the file, where my browser read that last line and took that as the source map to use. Reasonable, right? Except because manifest.js was just passing through //= link application.js which Webpack had already compiled, the source map didn't give anything very useful - if the source map was picked up by the browser, it didn't make stepping through the JS any more clear than it was, because the map just pointed at the big Webpack-compiled-and-minified one-liner anyways.
I solved this by making sure to set config.assets.debug = false in my config.environments.development.rb. With debug = false, Sprockets didn't attempt to make and serve its own sourcemap, so my Webpack sourcemap "won" as the sourcemap used by my browser, and thus I had actually useful sourcemaps again.
Related to the sourcemap issue we just covered, a frustration throughout this project was the somewhat inscrutable nature of what all these assets-related config settings were actually doing:[5]
assets.quietassets.debugassets.raise_runtime_errorsassets.compileassets.css_compressorassets.js_compressorEven assets.precompile, a pretty important setting, behaved confusingly. I want all the stuff in my manifest.js to be compiled, right? So if I am precompiling assets with bin/rails assets:precompile, why do I need to define all the things that will then be precompiled in this initializer setting, rather than Rails figuring it out from my manifest.js? I did not actually figure out why this duplication was necessary or how to avoid it if that's possible. Again it's probably one of those things that if Sprockets was the ruler of all things frontend-assets, like before Webpacker came around, we'd all just know and remember when we were adding new files. But that knowledge has atrophied, and the documentation around it (if it ever existed) seems to have, too.
To figure out the source map issue, I pieced together clues from this doc on How Sprockets Works[6], and this one on extending Sprockets. Surprisingly, I didn't find anything really useful in this one on Source Maps :D since it mainly explains the concept of a source map and some more browser-centric and algorithm-y details of how source maps work, and not how they work in Sprockets, specifically.
At some point in reading those I tried setting assets.js_compressor = nil in the initializer, but that didn't fix my source maps.
However, the section on asset generation in development of How Sprockets Works gave me a clue that the debug pipeline in Sprockets was what was adding in something called "SourceMapCommentProcessor" and thus creating the issue that made me not have working source maps. I tried unsuccessfully to clear out the debug pipeline in Sprockets to do nothing, but instead, since SourceMapCommentProcessor is in fact the only thing that the debug pipeline actually does, that pointed me to the final answer: setting assets.debug = false in my development environment where I wanted to see the sourcemaps.
With Webpacker, your Webpack config could know stuff about your fully loaded Rails environment settings. With jsbundling-rails connecting to Webpack instead, the jsbundling-rails docs encourage you to run Webpack directly with yarn[7] aka yarn run build, rather than bin/webpack or bin/webpack-dev-server which are Rails binstubs for running webpack (the Webpacker way). So, when you run Webpack, your Webpack process doesn't know anything now about your Rails env.
That's okay though, because you can use the npm package dotenv to read your values from .env into the executing Webpack process. However, you might already be using a Ruby gem that's also called dotenv, and it behaves a little differently! The gem version encourages (or at least allows) you to have many layers of files with env values in them that cascade to become the final environment values in your Rails app. Some of those files may be committed (not gitignored), with only certain layers of the cascade having secret values and others being plain-text-friendly. The npm package doesn't allow that, and in fact has sections of its FAQ encouraging you to gitignore .env, and not have multiple .env files that cascade together. It even quotes The Twelve-Factor App guidelines to give weight to this argument. I get it, I'm on board - but the app I'm working in already has the cascading multiple file version, and it's out of scope to change that now.
I need one file max that config values can come from for the Webpack process. Ultimately, I chose to avoid having any npm dotenv use at all, since I really just need the one variable: NODE_ENV, to determine whether to output source maps (and do other prod-related optimizations in Webpack) or not. So, now I have two scripts in package.json, and devs running locally have to remember to use the one that will give them source maps.
(Note here that jsbundling-rails defaults to using the defined build script from package.json for what's going to happen when you run assets:precompile in Rails, so you can't swap the order of these easily- the local version (not precompiled assets) needs to have a special-cased name and the production/precompiled version needs to just be named build.)
"scripts": { "build": "NODE_ENV=production webpack --config ./config/webpack.config.js", "build:dev": "NODE_ENV=development webpack --config ./config/webpack.config.js"}When it was time to build the app in the CI environment, I ran into an issue where packages that were clearly listed as dependencies in package.json were reported by the build process as not being present - specifically in my case, webpack-cli had gone missing. webpack-cli was listed in devDependencies in package.json, but that's no problem, because I had told the CI script to run yarn install --production=false to ensure those devDependencies got installed. (I could have also used NODE_ENV=development yarn install, but I wanted to skip source maps in CI.) So why was webpack-cli not found?
I eventually figured out that even though there was a yarn install step explicitly in our CI setup, when we did assets:precompile for the CI/test run, jsbundling-rails does its own yarn (or bun) install unless you've set ENV["SKIP_YARN_INSTALL"] || ENV["SKIP_BUN_INSTALL"]. And it will only do yarn install (or the install for a different tool like bun, npm, or pnpm if it can find those instead), no customizing of the NODE_ENV or production=false flags.
So, if you're using jsbundling-rails, you will need to set SKIP_YARN_INSTALL=true if some of your required packages (like the ones your Webpack compilation needs, so.. probably anything you're doing in JS in your Rails app at all) are listed in devDependencies. Or, you can do what I ultimately did, and move any packages listed in package.json to plain old dependencies and forget devDependencies exists at all.
I'm not entirely sure how Webpacker was getting around this, but one of the npm packages used by our site threw an error after switching to Webpack-without-webpacker that turned out to be because the module was now running in strict mode. The module code in question hadn't changed, and the strict-mode error was correct: the package had some code that was trying to write to a variable that hadn't been instantiated already (with var, let, or const; preferring one of the two latter in modern JS). But somehow, it worked before, and only started erroring when Webpacker was removed. It does seem like "javascript modules are executed in strict mode" is spec-compliant behavior, so it makes sense this needed to be addressed to use it with Webpack, but it was still a surprise since it had worked fine before under Webpacker.
Happy migrating, see you in the next era of frontend assets in Rails!
assets.raise_runtime_errors actually does what it says it will & I like itUpdated 2025-09-02: Added Wike, Burley Hopper, Specialty Cargo Add-ons section
I can haul a lot of stuff on my cargo bikes (one front bucket style, one midtail; both electric), but I'm always interested in ways to haul even more when necessary.
In particular,
]]>Updated 2025-09-02: Added Wike, Burley Hopper, Specialty Cargo Add-ons section
I can haul a lot of stuff on my cargo bikes (one front bucket style, one midtail; both electric), but I'm always interested in ways to haul even more when necessary.
In particular, I'm curious about how I might be able to haul the front-loader home with the midtail, should the front-loader break down somewhere. Currently, we'd need to go rent a truck or call a tow truck to get that bike home. (It is 100 pounds, and not going to fit in our car!)
Here are some options for cargo trailers for bikes that I've considered. None of these are affiliate links or benefit me in any way.
The cheapest item on my list, the Burley Flatbed was $300 on 2024-01-15. It can carry up to 100 pounds and has two wheels. At 32 inches long though (82 centimeters), it's not going to help much with the bucket bike.
New from Burley, the Hopper can be used as a cargo trailer and also a wagon you push. You can put a cushion in it and have a kid ride in it in stroller mode, but not while biking. (Burley makes lots of other trailers for kid-hauling while biking, though.) It's got a 100 pound weight capacity and 115 liter volume. $800 USD as of 2025-09-02.
A company from Ames, Iowa (practically local!!) called Bikes at Work makes some trailers that are much longer.
These trailers include:
The frames of each trailer is modular, so you can shorten it, or purchase an extension kit later if you get a smaller one but realize you need 96 inches of space later. Or, you can make your 96 inch trailer into a 32 inch or 64 inch bed by taking out parts! They each are advertised as supporting 300 pound loads.
Shipping to my location in Nebraska was under $100 for the 64" -
This video I was sent on Mastodon shows someone hauling an Urban Arrow on one of their 64" long, Wide models.
This person had a 96AWD for a while and hauled many things. More photos.
This person suggests increasing stability for carrying a box bike, but has carried many other heavy & unwieldy things successfully.
This person's bike co-op uses one.
The Surly Bill Trailer comes in at $815, with two wheels, a 63" x 24" cargo area, and a 300 pound weight limit. This looks like a really nice option.
EXCEPT maybe the hitch won't work with my Tern bike? I don't know all the words here, but this Q&A answer seems like no.
I'm sorry to say but our trailer hitch is not compatible with thru axles. The mounting options include a 135 - 141 mm QR with our axle, our axle nuts that bolt directly to our dedicated dropouts such as the Troll, Ogre and ECR, or could also be used with a bolt-on / solid axle hub.
A mastodon user points out the Surly trailers are sold without a hitch, and the hitch assembly (an additional $325) is perhaps less universal than the Bikes at Work hitches.
These Main Carla Cargo page trailers are the priciest at $4,000 USD from a random US seller I found! But, they have their own brake system for extra safety, and you can even get a motorized one to take some of the load off whatever bike you're pulling with. The loading area is 64 inches long. They offer a hitch adapter made specifically for Tern bikes - nice. The load limit is a bit more than others we've seen with the others here, at 440 pounds.
The Carla Cargo trailers have 3 wheels - you can unhitch and use the trailer as a hand truck, then hitch back up and go home. That's neat!
Here's some photos of Tern HSDs in NYC towing Carla trailers, operated by Dutch Express.
Wike, a Canadian brand, has a few different cargo trailer options, as well as some child trailers and most ineterestingly perhaps, some bike trailers for carrying adults in the "special needs/adaptive trailers" section.
Of interest for cargo are the Kayak, Canoe and Surf Cart for your water adventures, a flatbed trailer of a similar size to the one Burley sells, a big aluminum box trailer, and a DIY kit to make your own custom flatbed cargo trailer.
Thule makes some bike trailers. I'm undecided on if these should really count as "very big bike trailers", but decided to include them for now for completeness. If you want to haul kids or dogs by trailer, Thule is a popular, reliable brand. The "Reacha" line of trailers is more cargo-y, like the Reacha Sport you could use to carry a kayak. If you want the kind that can hold kids (or pets), your local online used marketplaces are a great place to look for Thule trailers, and you'll likely have more luck finding a used one local to you than anything else on this list.
These are a few things I've seen that offer additional cargo capacity for bikes. Some are provided by a particular bike brand and may not work at all with your bike, or may need some slight hacking to make work. Hopefully this will give you a jumping off point for research though if you want to haul any of these kinds of things!
Know any big trailers I should know about that aren't listed here? Give me a shout on Mastodon or however else you usually contact me & let me know!
]]>At some point, I made a comment I thought would be one of those things several people would nod and smile at, about how Sensodyne is supposed to help you have less sensitive teeth, but it's hard to use properly since you have to rush to spit it out when the minty freshness starts burning after you've been brushing for a bit. But it turned out that while some people don't care for minty flavorings, this specific "must spit the fire now" experience did not really resonate. One coworker mentioned that it may be that I'm just allergic to something in that toothpaste - something I'd heard in passing as a story before, like someone who mentions offhand how spicy mangoes or bananas are and finds out they're actually just allergic to those fruits. But I'd never heard it about toothpaste.
I looked into it later, and found something called "SLS" or Sodium Lauryl Sulfate is a common additive in toothpastes (and some other products like body soaps and shampoos) that some people are mildly allergic to. Contact dermatitis, I learned, is a typical symptom, which can manifest as dry lips or mouth. In fact, I've had dry lips all summer, something I thought was weird but maybe somehow related to it being a pretty dry summer here. But I've never really heard of summer air conditioning causing dry skin, mostly winter heating instead. And despite the drought there's been no shortage of humidity this summer in Ottawa. My lips have been so dry they've been cracking and hurting at the corners of my mouth, something I've not really experienced as a winter dryness symptom, either. It was new for me this summer.
In fact, this summer I started using Sensodyne, because my wife already did, and it's supposed to help with teeth sensitivity so I might as well, right? The cold of biting in to a strawberry or grape straight from the fridge makes me wince. So I started using this toothpaste my wife's been using for a year or so now.
In fact my wife has been having this same mouth dryness issue too, for quite a bit longer than me. She had these sores at the corner of her mouth that she saw a doctor about who told her to try a topical treatment that didn't really help, but eventually she figured out just slathering on lots of lotion helped keep it under control. It's been an issue for her long enough that when it started for me, I was confident it wasn't any sort of contagious condition, but rather that I must now be having the same sort of environmental sensitivity that she is. She switched to Sensodyne on a dentist's recommendation a year or two ago now.
I threw away the tube of Sensodyne on the counter and brought out a spare tube of the kind I'd been using before I switched. It's minty, but doesn't burn - I can brush for 10 minutes again, lost in thought before bed, if I want to. The irritation at the corners of my mouth cleared up immediately. My partner's did, too.
So we've established that both of us must have some sort of sensitivity to something in the toothpaste, probably SLS though I've read there are other ingredients that can cause issues. Great.
I thought about how our kid flinches back when the toothbrush reaches her, how much of a struggle it is to get her to brush each night even though she's pretty chill about other required parts of the daily hygiene processes. We've tried a couple different flavors of toothpaste but she hates them all.
I looked up recommendations for SLS-free flouride toothpastes for kids and saw Orajel Natural Anti-Cavity recommended. The nearby pharmacy carries it, in marshmallow. We bought some and tried it last night.
“This is the much better toothpaste ever!” she said.
So that settles that.
]]>
Like
]]>
Like Comfect/The Quad Urbanist says in his post, these aren't necessarily things that are truly unique for that place, but just uncommon enough, or maybe just noticeable enough, that it feels like they form part of the identity of the city.
Comfect pointed out Minneapolis has free public wading pools, and I was delighted to learn when we moved here that Ottawa does, too! They are actually staffed by city-employed lifeguards, though, and only filled when the lifeguards are present, and drained at the end of each swimming session. In addition to the many wading pools, there are also over 100 splash pads spread across city parks, and there are lots of city parks in general.
The EarlyON program of free drop-in play groups for kids aged 0-6 is technically an Ontario program, but feels very Ottawa to me since my experience of Ontario is, well, Ottawa, mostly. They're held at different times throughout the week in lots of different locations, sharing buildings with childcare centers or elementary schools or office buildings. You can just show up with your kid and hang out with the other parents (it's not a daycare situation; the adult who brought the kid has to stay present the whole time) and they have a ton of cool stuff for the kids to do.
In general, it feels like Ottawa is a city that knows that parents of young kids live here, and actually thinks that's good, and maybe it should be nice to be a parent of a young kid, even. The malls have spacious, well-appointed nursing rooms (at Bayshore, you even have to get buzzed in to enter, like a secret agent on a hungry-baby-related mission).
Lincoln is the city I've lived in the longest, having lived there for a bit over a decade, and growing up with it as the main place we'd go for any shopping beyond groceries.
Comfect points out that Lincoln has nice public library hours, and since Lincoln is the only public library system I'd really experienced much until we moved last year, I had never really appreciated that! Ottawa's library branches tend to be open later into the evenings on weekdays which is nice, but closed entirely on Sundays which feels like prime library time to me, for a lazy mid-afternoon pick-up or some time browsing the magazine racks or featured selections.

For me though, the thing that feels most distinctly Lincoln is the very strong coffee shop culture. There are really quite a lot of great local coffee shops in Lincoln for a city of its size, and a good spread of the kinds of settings I look for in a coffee shop: nice to hang out and chat with a friend, but also a fine place to sit with a laptop and get some work done. In college I mostly went to The Coffee House or Cottonwood to study or do homework. Later friends preferred the Mill (now up to 5 locations in Lincoln; 3 in range of downtown), but I always had a soft spot for Meadowlark or Cultiva. I was never bold enough to let myself into the cleaning closet and restart the router at Cultiva like a friend would sometimes do when the wifi wasn't working[1], but the staff would usually do it if you asked. And I liked the option of getting crepes for a lunch or snack. Hub Cafe's hours had it closing at 2:30pm on weekdays for years, so it was nice if you could make it out for a remote work session before lunch and planned to move on shortly after. Crescent Moon in a Haymarket basement has such a cozy, artsy vibe. The last few years since Mana Games has opened up, I enjoyed going there for coffee even when not looking to play games. And Indigo Bridge Books was a great spot for coffee or hanging out, at its Haymarket location years ago or the one on 16th St. (also now closed) more recently.
I've been working remote since 2017 or so, and for me the years from 2017 and ending in March 2020 were really the glory days of hanging out in coffee shops with friends in Lincoln. On weekends we'd meet up at one of them and just chat, and even if you didn't text in advance about where you were headed, there was a good chance you'd run into friends there anyways. During the week, I had a handful of friends who also worked remotely, and we'd meet up at any of the above or a different one I've failed to mention and work together for a few hours, sharing physical space while we typed away for our jobs at different companies, even in entirely different industries. (There were a couple computer programmers, of course, but our number also contained at least one tax policy analyst and a rotating cast of academics.) The Lincoln Journal Star took a great picture of my coworking setup at CoHo one time.

The other aspect of Lincoln that feels the most emblematic of the city for me, and what I miss most about it, is the really strong grassroots culture-making and the amazing wealth of culture-makers, aka people who have cool ideas and put those ideas into action[2]. I know the history goes back at least half a century; Nebraskans For Peace was founded in 1970 in opposition to the Vietnam War, and Nebraskans for Alternatives to the Death Penalty has been active since 1981. Now I'm getting distracted from actually finishing this post because I want to keep looking for records and memories of different groups I know of, some of which still exist and some of which don't, a seductive rabbit hole I've fallen down before, for a few months at one point compiling notes and even attempting to arrange a few interviews.


The Black Cat House has been open for more than a decade now; Common Root's been operating since 2008. I open every one of those pages and see the names or faces of people I love. There's local music played in local bands and at front porch festivals and in house venues or rented out buildings somewhere between South Salt Creek and the Near South. Porch Art Palooza, my beloved. The names of long lost community spaces and cultural projects pile up: the Clawfoot House, Church, the Lavender Mansion, the Colonel Mustard Attic Theatre Company, SPCE Commons.

Occupy Lincoln's encampment lasted more than 100 days, outlasting the original protest grounds in Manhattan and dozens of other cities. It wasn't Lincoln's first encampment, either - the Lincoln City-Wide Tenants Association[3] mounted a "Tent City" direct action in 1971 with over 100 people participating from over 20 families - fighting for more housing support for low-income families and protesting the University of Nebraska's expansion into neighborhoods where many low-income families lived, causing displacement.

So many more collective efforts I could name - Everett Free Grocery Program, Lincoln Community Care, We Are Vital. The efforts without a name, like the series of disaster preparedness potlucks that sprung up after a workshop at the 2022 Do It Ourselves Fest I & others organized. So much for my quick blog post before bed; I could go on all night.


When I think of Lincoln, I think of people who have ideas about ways to bring people together and make something happen, and they go out and start doing it. Probably that kind of thing happens in other places, too. I wonder though if it happens less than it used to in many of them. I've heard it said that an affordable cost of living is a big part of what made the most famed artsy neighborhoods of New York City and San Francisco in the mid-to-late 1900s be so vibrant and creative; sometimes I wonder if the thing that was happening in those places is what is still happening in Lincoln, with a really vibrant arts and activism scene because people can still afford to do weird stuff and go to weird little events instead of spending all their time hustling on extra shifts or gig work jobs to make rent.
There are fewer people, certainly, and few if any of them get famous or have things named after them that are taught in art history or political science classes. But they are there and always have been, and they are a big part of what The Good Life in Lincoln means to me.
One way I've been marking the end of our first year here is with a flurry of paperwork and new admin tasks to take care of. Our year of newcomer promotional offering from the bank we opened accounts with is over, and the credit cards and bank accounts we set up as part of that offer will start charging fees. Time to downgrade to lower fee versions or consolidate accounts to save on those charges. The first year promotional pricing on our cellular and internet plans are expiring, too, so time to shop around for that, too.
Our Canadian cell plans with Bell are pretty expensive, but it was the best I could do to get new numbers, on an esim (our new-ish phones we brought from the US don't have a physical sim slot), with no existing Canadian credit history when we first moved up. I couldn't open the lines at all til we had Canadian credit cards, but even then, the cheaper tier providers I tried to sign up with rejected my lack of history. Now we have Canadian numbers ready to port in to a different carrier, and I can pass a "are you a real person who pays their bills in Canada" automated check.
I've found a cheaper way to keep our US numbers active, too - moving from Google Fi at around $40/month for both numbers to Tello at $10. More filling out online forms, reading FAQs and service overviews, entering card details.
Our year-long lease of the house we've been renting rolled over to month-to-month already, and we've given notice that we're intending to move out this fall. We are buying a house in the same neighborhood and gearing up to move, including all the paperwork and packing and researching that goes along with that.
When people say moving abroad isn't easy, I know now that endless paperwork and research is part of that. It's not the only part, though.
The new broker I'm talking to about home insurance thought our car insurance should be much less than we paid for our first year on our car, based on how long we've been licensed drivers. But we don't have enough proof of that history - the Nebraska DMV won't give you an official report of when you got your very first license, which Canadian insurers expect. The new broker we're talking to suggested maybe trying the insurance agent who insured me when I first started driving; maybe some Canadian insurance company would accept whatever old records that original agent could dig up as sufficient proof of how long I've been driving.
So in the midst of a harder-than-usual week last week, I called up the insurance broker near my Nebraska hometown that my parents have used for decades now. I asked the receptionist for the guy my parents work with, and she transferred me before warning me about possible challenges with the new phone system they're setting up. I got off the phone almost in tears. The receptionist and the insurance agent both answered the phone and talked to me like Nebraskans answer the phone, and like Nebraskans talk business. It was so familiar and yet I haven't had a call like that now in so long.
A few weeks ago we were riding our bikes to have dinner with friends. It was a lovely evening, sunny but not too hot, and we rode our bikes through Mooney's Bay, a big park on the river with a lifeguarded beach, a large and very cool playground, and lots of grassy space for grilling and picnicking. The park was full of people laughing and having fun but not crowded. As my wife and I biked along with our two kids through this idyllic summer scene, I thought to myself, "is this paradise?" And a second later, I saw someone walking who from behind, looked like it might be our friend C from back in Lincoln, and then realized of course it wasn't. And the illusion totally shattered: as nice as this place is, as much as we are happy to live here and enjoying the city, as grateful as we are to have had the opportunity to immigrate here, this is no utopia, because so many of the people we love aren't here, and most of them will never be.
Years and years ago I read a bestseller self-help book that I'm a bit embarrassed to name, but it was my first introduction to anything vaguely resembling Stoic philosophy, and despite the book's many shortcomings, there were a few ideas that have stuck with me. One big idea in the book (cribbed no doubt from the long tradition of Stoicism) is that no matter what, in life, you're going to have problems. One key to happiness is accepting that, and doing your best to make choices that result in the problems you'd prefer to have.
I'd like to think we went into this move with a reasonable level of awareness of the types of problems we were likely to have, due to being here in Canada and to not being back in Nebraska. I knew we would likely have difficulties with the primary care doctor shortage, but that there'd be no big bill if we managed to get one. I knew daycare waitlists were long, and that I was behind the curve by getting the baby I was still gestating on the list when he was only a few months from being born, especially since I'd read the recommendations were for Ottawa parents to get their babies on waitlists as soon as they found out they were pregnant, for enrollment only after 12 to 18 months of parental leave. We knew the job market would likely be challenging here, especially for my partner. We knew that a lot of the social safety net that exists here was put in place a while ago and political power-holders have been steadily working to erode it. We knew racism and white supremacy exists here too, and there are pockets of anti-trans reactionaries hoping to take Canada in the direction we were hoping to leave behind in the US. We cried and cried and agonized over the decision to leave our friends, our family, and our community behind in Lincoln.
We started considering this move in 2023, and we left Nebraska last July. An online friend asked when Joe Biden dropped out of the US presidential race if that would change our plans to move, and I told her we'd been in our new home for a few weeks at that point. Our gamble was that a Democrat in the White House wouldn't be enough to turn back the tide of anti-trans, patriarchal, and gender binary-enforcing political violence that was sweeping the country, Nebraska no exception.
I was really hoping we were being paranoid, or risk averse in a way that maybe in a few years, sheepishly unloading a truck we'd driven back West, we might even laugh about. I don't carry that particular hope any more.
I think we will be here in Canada, and specifically Ottawa, for many years. We love so many things about Ottawa so far. We have made some friends and started building ties to community. For the first time in my adult life, I can picture myself more than a few years into the future. I realized it first when we were talking about which school system our older kid will start in next year, among the four separate public school boards overlapping the city of Ottawa. I could imagine her graduating an Ottawa high school, after completing her entire primary and secondary schooling here, and thinking about what to do next. I can imagine how useful it would be for her to speak French well as an adult in a city where every job posting from cashier on up seems to be "bilingual preferred." As much as I loved Lincoln, it felt more fragile, as we watched so many friends leave town each year, and saw the state government, from the executive branch to the once politically moderate unicameral legislature becoming more and more radical in finding ways to chip away at "the good life".
I wish the options available to us for where to live came with different sets of pros and cons, with different probability ranges for each of those outcomes, too. I miss my Nebraska family, friends, and community so much. My heart aches for my community, and the people who have already faced, and will continue to face, so much cruelty and shameless evil from what my country has done, is doing, will do.
I am so thankful to friends in Lincoln who over the years, have taught me to live in the both-and instead of hard absolutes, especially E, C, and the whole Dandelion Network who helped me deepen my understanding of what it means to be in community and in solidarity with one another. I miss you all so much, and I promise to do my best to keep moving deeper into community as I can find it here, building solidarity with my new neighbors while remaining as much as I can in solidarity with those I am no longer in physical proximity to, and those that struggle for justice around the world.
Having little kids gives you a chance to slow down (sometimes way down...) and really take in what you might have otherwise taken for granted. To experience it all in total wonder and unselfconscious delight. Our three year old was delighted this spring by the explosion of bright yellow dandelions in our yard and the parks all around us. "Mama!" she said. "Can we plant more, for next year?" I told her that we didn't have to plant the seeds ourselves, but the dandelions would come back next year anyways. The insistent bright flowers with their raucous yellows are hard to stop, even if someone is trying pretty hard to stomp them out. They will come again, and they will grow, and spread, and share their joy even in the hard-scrabble ditches and parking lot edges. Like the dandelions we too can stick our roots down hard, and raise our joy up, and spread it around when we get a chance.
]]>I've been pretty happy with Cloudflare, and it's what I often
]]>I've been pretty happy with Cloudflare, and it's what I often recommend now for people looking for a static site host. I like the AI/LLM crawler defenses I can turn on with a single toggle, and the confidence that while on the free tier, I'm not going to wake up to a huge bill if I suddenly start getting DDOSed while I'm sleeping.
I also had an experience where Netlify disabled my entire account (including immediately taking down all my sites, including this one) without warning because my previous credit card on file was denied for one domain on auto-renew I had registered there. My account getting suspended was the first I had heard about an outstanding bill at all, let alone a payment issue - I got a reminder several months before that my auto-renew was coming up, letting me know my autopayment was set up, but no notice at all that the payment had in fact not gone through a few months later when the renewal happen. I'd already been leaning towards moving off Netlify due to the billing horror story I'd heard about before, but this was the last straw.
So, I use Cloudflare now! And while I'm pretty happy with it, the UX is a lot less straightforward than on Netlify. In some ways that makes sense; Cloudflare has a lot of capabilities in its platform than Netlify, and a longer history of being the enterprise solution that Netlify is trying to become. In other ways the UX seems confusing in ways that I think could be fixed. But that's not my job, so here's some hints for working within the current setup instead!
"Pages" (or Workers) is doing the bit that Github Pages might have done for you, or Netlify, or having your html files in an S3 bucket on AWS. It's actually hosting the files, possibly including running a build command, and has the configuration for things like connecting to a github repo to build automatically.
The Domains part is only the DNS level settings to point your domain to the Pages project. (or maybe somewhere else! you can use Cloudflare DNS services without hosting your application there, and that's often what enterprise tier customers do - Cloudflare just provides a caching/CDN layer and spam protection at the DNS level.) And adding on confusion, the DNS settings can be fully managed in Cloudflare, or just proxy requests through to the DNS registration configured at wherever you got your domain from.
The main headache for me when I started with Cloudflare, until I figured out the secret and reliably remembered it, is that your settings for domains attached to your static site and your settings for the static site's code (connection to a git provider, build command for a static site generator, etc) are in two different sections of the site with different side navigations, and the navigation (on the side and up top) don't let you go from one to the other directly. Instead, you need to go back to the main "Account Home" setting by clicking your account name at the top of the page, and then you can change between them.
When you first log in to Cloudflare Dashboard, you see an "Account Home" page with three tabs across the main portion of the screen. One is Domains, and you should see your domain(s) there. The next is Developer Platform, and that is where you hopefully will also see the same sites as on the domains tab, with "Pages" next to them if they are static sites. (Or possibly "Workers"; it seems Cloudflare is putting functionality that was previously just known as Pages into the Workers product and encouraging people to migrate their static sites there.)
If you start by clicking on one of the Developer Platform entries for a site, there isn't an obvious way to get back to your Domains without going back out to that Account Home page. The side nav links that refer to domain-related stuff don't take you there! And they might even make it seem like you don't have any domains in Cloudflare currently even if you do, with a page saying something like "add your first domain to Cloudflare to get started" even after you already have domains.
The same is true if you start on a domain - notice that you get an entirely different side nav in that case, with different links, but there's no way that I've found to go directly to your Pages/Workers applications that live in the Developer Platform area. There's also no indication on the Domains area header/navigation that you're even in a specific and siloed Domains area! To go back to Application Home, you need to click the text up top that says "Account Name's Account", which tells you only on hover will take you to Account Home if you click it. You may not even realize this is a link until you hover on it; I certainly didn't.
For each of the sites in Developer Platform, there is a "Custom Domains" tab in the main section of the page. If you go to that Custom Domains section, and click the tri-dot menu next to one of the domains and then "Manage Cloudflare DNS", you'll get taken over to the Domains area to manage its settings. But then you may be confused again, because you can't seem to come back without backing out to Account Home!
Turning on SSL initially on each of my domains was a bit of a headache. I have SSL on now on all of them, so can't step back through to refresh myself on the specifics, but I believe there may be a setting both in the Pages part and in the Domains part you need to turn on for SSL to work, and if you miss one side of that, it won't actually work.
If you want to have people able to get to your site from www.yourdomain.com with Cloudflare, in the DNS settings area, go to Rules on the sidebar, then click "Templates" and you can add "redirect from www to root" and even "redirect from http to https" if you want. I noted some more specifics on that in my previous post.
Something to note if you're moving to Cloudflare from another static site host is that Cloudflare is much more aggressive at caching resources even after new builds of the site. I was finding my application.css files weren't getting updated after new builds that changed it, and having to do a forced/manual cache flush each time in order to see changes, which sometimes didn't even seem to work! As I described in my post on moving 11ty to Cloudflare Pages, I added a plugin to my 11ty site to automatically add file name hashing to my static assets like CSS and JavaScript (if I had any) for caching purposes, and haven't had a problem since.
By consumerism, I mean all the societal and cultural forces (from government policy to
]]>By consumerism, I mean all the societal and cultural forces (from government policy to what big companies do, all the way down to how I gather with and engage with my friends) that come together to reinforce the idea that buying and possessing lots of consumer goods is a path to happiness and fulfillment in life. It's the idea that there's always a product out there that could make life easier or that you never have quite enough. It sees shopping and acquiring as leisure activities, not chores.
Fighting against all this is hard work! As a teenager in a small town, key Friday night fun involved driving with my buddies to one of the nearby towns with a Wal-Mart, and making a lap or two around the store before driving back home. As an adult, I could spend hours perusing the shelves of any given bookstore, and I'm a sucker for those little boutiques in touristy downtowns that sell things like mugs with snarky sayings on them and candles with Frida Kahlo drawings. (I usually don't buy anything, but I want to see it all.)
But, I also see now that a life driven by "stuff" (having stuff, wanting stuff, strategizing about the right stuff to want, figuring out how to store the overload of stuff I have acquired, working harder and harder to make sure I can acquire more or better stuff) is not the kind of life I want. I don't want it on a personal level for myself; I don't want it for my kids; and I would really prefer to live in a community where "stuff" isn't the driving force for the people around me, either.
This consumerism stuff though isn't just something I arrived at on my own out of thin air; it's deeply embedded in the culture I grew up in. So even if you know you want to do something different, it's hard to know where to start. Here are a few things that I've been trying to practice - sometimes succeeding, sometimes not. It's a work in progress.
A small language shift I'm trying to make is to talk about actions (especially ones I do online) a bit more generically rather than by brand name. "Do a search" or "search online" rather than naming the service one might use. I prefer not to wear clothing with prominent brand labels, though I'll make an exception for non-chain, small local businesses like my favorite coffeeshops or indie bookstores back in Lincoln.
One aspect of this I feel ambivalent about still is how this relates to my kids. They're at the age where they aren't buying their own clothes, obviously, but the older one (aged 3) definitely has opinions about what she prefers to wear. And wow she really loves wearing stuff featuring either of her two favorite cartoons. It makes her really happy, so I don't want to take it away. (She's gotten some from us and some as gifts from other family members.) But I sometimes feel weird about it.
The world around us (and certainly our devices big and small, too) is downright saturated in advertising. I try to let as little of it as possible reach me. This can be challenging if you don't know what tools to use so: gonna do some free advertising here in disregard of the first practice I mentioned!
I have found it hard to block ads on Youtube (other people say their adblocker can do it fine, not sure what I'm missing?) so to be honest, I watch as little as possible there. I know a lot of short-form video in general is laced with "buy this to change your life" or is made by influencers that is designed to make me want the same products, home decor, outfits, hobby supplies etc that they have, so I mostly just avoid short video platforms in general - fewer Tiktoks, Youtubes, Instagram Reels or Shorts. I use youtube occasionally when I need a how-to video, but most of the time, I prefer text format, anyways.
I use uBlock Origin with Firefox to block ads on my desktop browser. (If you're using Google Chrome, you can get a more privacy-preserving and less ad-driven experience immediately by switching to Firefox even if you do nothing else.) It works pretty well. On my phone, I pay a few bucks a month for an app called 1Blocker that block trackers in apps as well as blocking ads in mobile Safari. I want to set up a home server running AdGuard Home, to block ads for all devices on our home internet connection even if they don't have ad blockers running (like on our TV). I haven't done so yet, though, because it's a little more of an involved set-up process. In the mean time, we've mostly stopped watching youtube through the smart TV directly at home, and screenshare one of our computers (running ad blockers) or play cartoons from a good old-fashioned DVD borrowed from the library.
There are some newsletter writers I started following because they had interesting cultural writing, and over time, I noticed they were doing more and more writing instead about stuff they purchased - home decor, outfits they bought, cool gadgets or toys or kitchen tools. I get why it happens; I hear from those writers that those are the emails that people open the most, and when people click the links and buy stuff, the writers get paid. And it's often hard for writers to get paid these days! Truly, I get it, in the same way that I get why the recipe websites are now covered in ads and auto-play video (also with ads) and I don't really blame the creators for it even if I hate it. But for the newsletters, at least, when I start noticing it, I think carefully about if I'm still getting what I initially signed up for out of that newsletter, and often, I choose to unsubscribe to stop being advertised to so much. For recipes, I save the recipe to my Paprika app if I'm going to use it again. And I check out cookbooks from the library and flip through those for ideas - no pop-up ads there! Paprika is a one-time purchase, not a subscription, and my partner & I use it for storing recipes, meal planning, and grocery lists. I can go back and look at the recipe in the app later without being on the original ad-filled website.
I also unsubscribe immediately from whatever company just started sending me email promotions - they're not sending me a 20% off coupon out of the goodness of their hearts; they know that if they do, there's a good chance I'll spend more than if I wasn't getting their emails and occasionally a coupon. So they aren't allowed to keep entering my inbox; unsubscribe!
The opportunities available to me for entertainment are so much broader than when I was a teenager 20 miles from the nearest Wal-Mart, which was pretty much the only indoor space other than someone's house that a teenager could be after 10pm without their parents. When I feel the need to get out of the house, I try to find something else to do that isn't just wandering around a store, thinking about all the stuff I could buy some day. I could get outside and just be in nature, maybe taking a book with me. I could go to the library. I admit that I wish I had more options here for indoor, no-purchase-required places I could spend time - even in the city of a million people I now live in, it can be hard to figure out where to go to just exist for a bit without needing to buy something. This would be the loss of third places that you may have heard much (justified) hand-wringing about.
Shopping as entertainment isn't just in the physical world, either. Do I go to the websites of places you like to buy stuff sometimes just to see what's new, or only when I have a particular thing I'm trying to buy? How much time do I spend reading "holiday gift guides" just to see what cool stuff is suggested? Or seeing what new "deals" are being pushed on whatever product review site I happen across? I have historically enjoyed all of these things quite a lot, to be clear. But there are other things I enjoy too, that aren't driving me towards wanting to buy stuff, and I'd like to do those other things more and the shopping things (even when I'm not intending to purchase that day) less.
I have definitely been guilty in the past of having my first step of trying a new hobby be to buy lots of stuff that it seems like one might need for it, before I have really determined if I actually like the hobby all that much in the first place. I am trying to be more intentional about this going forward. I know that I will keep wanting to try new things, and that, based on past experience, it's very likely I'll be interested in it for a while and then move on to something else. I am trying to be more mindful of doing the new activity rather than just shopping for the new activity. And finding ways to use the craft supplies I already have, rather than getting a bunch of new stuff for every new project I want to make. When I do need a new kind of tool, can I borrow it first or buy used?
Another part of this is that "hobby as collection of stuff" often ends up as a joke within that hobby community, and I try to avoid indulging in those jokes myself. You've surely heard about the knitter with a closet full of yarn, the quilter with a room full of fabric, the reader with piles and piles of unread books, and seen some jokes shared (especially on social media, but even in person) poking fun at this phenomenon but also sort of wearing it like a badge of honor. I've done it too! Maybe I even did it in the first paragraph of this section; I want to defend my own past hobby practices and make you think I am passionate and excited and interesting, and not spend any time feeling actual guilt or shame for my past spending. But, I'm trying to do it less, because all of it contributes to what feels normal and good, vs what feels like something we should maybe think twice about before following along with.
Like I said, this is all a work in progress for me. These are some things I've been trying to do, and sometimes I find it all easier than at other times. Over time I'm hoping it will all get easier, and that I'll find more ways to resist consumerism, too.
What are some of your ways? Tell me about it on mastodon, perhaps, one of the few places to experience ad-free social media?
I thought of another one! I have also been trying to avoid purchases that are for a single occasion - decor I can't reuse, costumes or special outfits for one particular party, etc. If I really want something like that, I see if I can borrow from a friend or purchase used (there are so many Halloween costumes and themed party decorations on used online marketplaces, and items can go right back there when we're done with them). But often, those things are not as necessary as they once felt. I've bought tee shirts before with pretty "of the moment" political references or memes on them, and not only do I not end up wanting to wear them for more than a year or so, no one else is going to want to, either. When I need something to wear to a special occasion like a funeral or wedding, I am trying to find pieces that I can re-wear more frequently rather than things that will never be worn again.
(I'd love if I could just wear the same stuff I wore years ago for these kind of occasions, but through two pregnancies and other life changes in the last decade, the way clothes fit me has fluctuated quite a bit. I know now there's a good chance that it will again before the next big "special clothes" event, so I keep that in mind when I purchase.)
]]>When my first kid was first born, we didn't really do much about the flaky bits on her scalp that people call "cradle cap". When we gave her a bath, we had a little soft brush that we would dutifully rub to try to flake some off, but it didn't work that well. But I knew that the cradle cap was mostly cosmetic and didn't bother her or indicate a health problem, so I didn't fuss over it much. It stayed there, big soft flakes on her head, for much longer than internet experts suggested it likely would without intervention. Less noticeable after a bath, but then it'd come back every time, for 6 or 9 months.
When my second kid was born, I was more annoyed about the cradle cap, even though same as before, it's really just cosmetic. So around 3 months of age when it had yet to disappear or reduce in any meaningful way, I decided to try some of the more advanced remedies beyond the soft scrubber in the bath that I found suggested on the internet.
One piece of advice I found was to slather the baby's head in vaseline or mineral oil, let it sit for a while, then wash it out, scrubbing softly with that soft scrubby brush. We didn't have mineral oil, so I tried vaseline. Vaseline, you may recall, is a clear greasy sludge. But I dutifully slathered it on my baby's head and let it sit for a couple hours as we went on with the rest of our day. Then we headed to the bath.
I soaped up the baby's little noggin with the baby soap, and scrubbed with the little soft scrubby brush we got with the cradle cap set. And... there was so much vaseline and it was not budging, at all. The baby's head stayed greasy. So greasy. I did a few more rounds of rinsing and repeating, like all the shampoo bottles of my life have told me I might want to do, but the grease remained.
I took the baby out of the bath and pondered my next move. What do people do about greasy soft fragile beings?? Well, baby ducks who've survived an oil spill get greasy, according to some commercials I've seen, and they are pretty soft and small. They use dish soap for that? We had dish soap. So back to the bath, and I tried a few rounds of scrubbing and rinsing with the name-brand dish soap from the kitchen sink, being extra careful to not rinse towards baby's eyes.
Was my baby's head no longer greasy, like a freshly washed baby bird ready to return to nature after a traumatic man-made disaster? No. It was still so greasy. And it was getting late.
Some people on the internet also said that a zinc oxide-based diaper cream might help with cradle cap. I didn't try that first because it sounded really messy, but uh, see results above with vaseline, and now we were headed straight to bedtime with a very greasy baby head anyways, so why not?
So I grabbed our tube of baby butt paste, which has the texture of a mineral sunblock if the sunblock was very thick and stiff instead of runny. I have heard it said that the proper application of this kind of diaper cream to put on irritated booty is to, ahem, apply it like frosting on a cinnamon roll, which is a more apt metaphor texturally than you might truly want it to be. If you have been shaking your head at why "young parents these days" have taken to applying butt paste with a dedicated paste-spreading spatula rather than using their hands, this textural change (that our own parents, shaking the container of now passé powder, probably did not experience) is why.
I did not use the spatula to spread the zinc oxide cream on my baby's head, just my hands. I turned his scalp into a little white cue ball, then off he went to bed for the night.
The next morning it was time for a bath, again. We returned to the baby bath. This time I started with the scrubber, then used a little fine-toothed comb. Because the cradle cap flakes? They were coming off! Oh wow, were they coming off. But now they were glued to my baby's hair by thick paste & the previous layer of still-present vaseline. So I used the comb to work out the nasty bits, and then did multiple rounds of baby shampoo and then a couple of dish soap, followed by another baby shampoo and rinse, and then finally, finally, the baby's head was clean again.
And after all that work, it turns out: it actually worked! It's been a few months now and the cradle cap has not actually come back.
Anyways - to all the online advice givers (including somewhat official sources on baby health & care) and even actual doctors our babies have seen for primary care who said "oh don't worry, the cradle cap will clear up on its own within a few weeks" or "just scrub it during the bath, it will be gone in no time", you were wrong actually, and much higher intervention levels turned out to be needed. But once we did those, our flaky head baby days were truly over. Good riddance.
]]>Rails is all about convention over configuration, so there has typically been a "right answer" at any given time about how things like JavaScript and CSS work in a Rails app. But "the Rails way" of handling assets has changed a lot over the years, and it's all too common for a major version upgrade of a legacy app to stop short of upgrading the asset management strategy to what's recommended by that next major version of Rails - meaning knowing you're on a certain version of Rails doesn't guarantee that the Rails Guides relating to asset management for that version of Rails reflect what's actually happening in the legacy app you've been asked to maintain or make changes to.
After running into this problem a few times I decided to do a deep dive into Rails asset management strategies over the years, and make a reference for myself to guide me towards what asset management patterns are in use in any given Rails app I might encounter. And, I wanted to get a better sense of what the currently recommended patterns are, so I can make stronger recommendations about which upgrades to pursue.
Frontend asset management in Rails means getting JavaScript, css, and static images from the server to the browser.
It includes doing stuff to the JS, CSS, and maybe even images:
-webkit and -moz)Thank you to this blog post with a timeline which helped me start figuring this out, as well as this 7 year old Reddit post asking about webpacker/yarn/npm and this one on Rails before Sprockets. The Ruby on Rails History section on Wikipedia was also quite useful.
public/ directorypublic/ together that sometimes workedrails ggem "sprockets-rails", and is not required by the rails gemImport maps are a newly supported way of using JavaScript modules that you can serve as individual files that reference one another, without a bundler and without a big performance hit that you'd have had in the past by serving many small files instead of one big bundle.
They let you use relative imports (import React from 'react') in your code that gets served not-bundled to the browser, and there's a map saying what file 'react' should point to. The map is important because of the hashing & caching strategy we've discussed - if you update your version of a dependency but don't touch your own code, you want to be able to bust the cache for that dependency only, and not have to update every file that imports it to have the dependency's new digest hash, which would require re-downloading each of those files since their own digest hashes would change. (like if you had import React from 'path/to/react-asdf11.js')
Head over to MDN for a more detailed overview on what import maps are.
For a deep dive on JavaScript modules in general, including the new ECMAScript (ES) modules that give rise to the import map feature now supported by browsers, I highly recommend the Modules chapter of Exploring JavaScript, a book I came across while researching for this talk/post that is super duper informative and useful.
Part of DHH's argument for importmaps is that many of the things that bundlers like webpack can do for us are not as necessary as they were in the past. That is at least somewhat true!
HTTP/2 is part of the story of why Rails is moving towards Propshaft + Import Maps as the way of the future. But what even is HTTP/2?
HTTP/2 is an update to the HTTP protocol that was supported in all major browsers by the end of 2015. Before that, there was HTTP/1.1
Okay, but now it's 2025, how do I know if I am using Router 2.0 on my Heroku app?
Check the HTTP headers of your Heroku site:
curl --head https://your-domain.comcurl will show you whether you're using HTTP/1.1 or HTTP/2 even if you're not on Heroku, but you're on your own to figure out how to turn it on there if you're not.
To turn it on on Heroku:
heroku features:enable http-routing-2-dot-0 -a <app name>Bookmark this! :) You'll thank me later.
config/assets.rbapp/assets./app/assets/config/manifest.jsgem 'babel-transpiler.es6 like app/assets/javascript/application.es6image_url('logo.png')uses comment directives
/* Multi-line comment blocks (CSS, SCSS, JavaScript) *= require jquery *///= require bootstrap//= require_tree some_folderRemember:
app/javascriptapp/javascript/packs has webpack entry files, like application.js and application.cssimport or require to load the files you wantpackage.json lists the npm packages you are using and might define some scripts you can run with npm or yarn runbin/webpack-dev-server watches for changes & rebuilds while the app is running, during developmentbin/webpack does a single build & exitsbin/shakapacker ; shakapacker replaced the deprecated webpacker gemconfig/webpacker.yml is a webpacker-specific config file that lets you set up stuff that a normal webpack project would put in webpack.config.jsbabel.config.jspostcss.config.js.browserslistrc - target browsers used by Babel or maybe also Postcss; can be defined in your package.json insteadwebpacker:compile task added to bin/rails assets:precompilepublic/packsIf you see a package-lock.json in your project, use npm commands, like npm install.
If you see a yarn.lock, use yarn.
If you see both of these files, pick one together with your team, delete the file corresponding to the other tool, and make sure the lockfile for the tool you pick is up-to-date and committed to your git repo. Pay attention to your PRs to make sure the opposite file doesn't get checked back in at some point.
[editorial advice] If you are undecided on which one to use, just go with npm. Use a Node version manager to make sure you're on the right version of Node for your project; I like nvm. It's like rbenv or rvm, but Node.
gem 'propshaft'url(), like url('logo.png') (as opposed to image_url('logo.png'))image_tag to get images from app/assets/imagesapp/assets<script type="module" src="main.js"></script> in your layout file.manifest.json is automatically generated and looks like this:
{ "application.css": "application-6d58c9e6e3b5d4a7c9a8e3.css", "application.js": "application-2d4b9f6c5a7c8e2b8d9e6.js", "logo.png": "logo-f3e8c9b2a6e5d4c8.png"} gem importmap-railsconfig/importmap.rbpin "@rails/actioncable", to: "actioncable.esm.js"<%= javascript_importmap_tags %> as well as <script type="module">import "application"</script>app/javascript/application.jsgem jsbundling-railsapp/assets/builds/ folder that is gitignoredapp/javascript/application.js as the entrypoint<%= javascript_include_tag "application" %> if using the asset pipelinejavascript:build task attached to assets:precompile which runs the build script that's defined in package.jsonThese are my bottom-line recommendations; follow them at your own risk.