I find myself spending very little time enjoying Vue. Which is not to say I hate it, but that I don't have a lot of fun with it — I've reached a sort of intellectual detente with the framework, and most of my "fun frontend time" is spent in pure functional TypeScript. But I was delighted to discover a change in Vue 3.4 that makes life 2% better (and I do not mean that to damn with faint praise — 2% is a lot!).
Historically, declaring a component with a value that can/should be updated requires a slew of boilerplate:
<template>
<input
type="text"
:value="modelValue"
@input="
emit('update:modelValue', ($event.target as HTMLInputElement).value)
"
/>
</template>
<script lang="ts" setup>
defineProps<{
modelValue: string;
}>();
defineEmits<{
"update:modelValue": string;
}>();
</script>
Vue 3.4 shipped support for the glorious defineModel macro, which makes this all much simpler:
<template>
<input
type="text"
v-model="modelValue"
/>
</template>
<script lang='ts' setup>
defineModel<string>();
</script>
This is not paradigm-shifting, but it is both quite nice and conceptually clarifying. I'm very grateful for the addition, and excited to slowly backport a whole bunch of boilerplate.
This finding suggests that exposing children to peanuts early helps them avoid peanut allergies — and that these effects are big. In the wake of these peanut findings, the recommendations about exposure have changed completely. Early exposure to peanuts is now the normal recommendation, especially for children at risk for an allergy.
The most important thing is consistency: choose a method you can stick with, and stick with it.
Hide your strength; bide your time; never take the lead.
One of the trickiest tightropes for an author publishing a business book to walk is: "how deftly do I tip my hand that this is all part of a greater lead generation and monetization engine?"
Some books do this well: The E-Myth Revisited is pretty explicitly a marketing campaign for consulting services, but is a useful narrative in its own right, as is Cadence & Slang or even The Life-Changing Magic of Tidying Up: The Japanese Art of Decluttering and Organizing. Others do it poorly: Working Backwards is a series of poorly re-written press releases ending with a call to action, for instance, and The 4-Hour Workweek descends into outright metanonfiction.
This is Personal is a pretty interesting take on this difficult problem, and it's hard not to read it without thinking "ah, so I'm reading the artifact of having been successfully segmented and monetized by the author." [1] And the content is, all in all, fairly light — there's a sense that this book would have been better served in its ideal medium as a series of drip essays [2], and there's a lot of padding in the form of "here's seven emails pasted and padded to give us an additional ten pages where we need it."
But the content is legitimately good, and the models it describes are useful ones. The advice he offers is legitimate, actionable, and valuable — which puts it ahead of the vast majority of its competitors.
A follow-up to Expecting Better focusing on the first few years of parenthood and what some combination of data, studies, and rational rigor tells us about common crossroads (breastfeeding vs. formula, daycare vs. nanny, television vs. no television, et cetera.)
I found this a less compelling read than its predecessor through no fault of Oster — I think there's a little less concrete to say or take away from the corpus of scientific literature at hand, and this mostly served to re-inforce a few of our existing thoughts and heuristics for when we have kids as opposed to completely re-shaping our framing of parenthood.
More than anything, I think the take-away I had from this book was a simple but useful one: everything is an opportunity cost. There's very little inherent merit or demerit in a lot of choices one makes, and the real analyses have to be made within the context of the maelstorm — and the maelstrom is different for every family.
Highlights
The most important thing is consistency: choose a method you can stick with, and stick with it.
This finding suggests that exposing children to peanuts early helps them avoid peanut allergies — and that these effects are big. In the wake of these peanut findings, the recommendations about exposure have changed completely. Early exposure to peanuts is now the normal recommendation, especially for children at risk for an allergy.
Finally, our intuitions should be informed by the economic idea of “opportunity cost of time.” If a child is watching TV, they are not doing something else. Depending on what that “something else” is, TV watching may be better or worse. Many studies of this emphasize that (for example) your kid can learn letters or vocabulary from Sesame Street, but they are better at learning those things from you. That’s almost certainly true, but … [i]f the alternative to an hour of TV is [instead] a frantic and unhappy parent yelling at their kid for an hour, there is good reason to think the TV might actually be better.
I wrote two days ago about a real and useful application of Tailwind black magic; here's another.
Buttondown has a dropzone component lets folks drag-and-drop items or click on it to get a file-picker. It's used for importing images, archives, CSVs, the works: because it's so flexible, we expose a slot so that components can customize the text and copy as they see fit:
<template>
<button id="dropzone" ref="dropzoneElement" @click="handleUpload">
<slot />
</button>
</template>
This of course comes with a problem, which is that if you pass in a block element such as a div:
<template>
<Dropzone>
<div> Click to upload a CSV. </div>
</Dropzone>
</template>
Users who click the div won't trigger handleUpload
, as the div intercepts the click event. You can of course fix this by manually catching and ignoring the click event on the div (or setting it to pointer-events: none
); or you can add a simple rule to the button
to ignore pointer events on all of its children:
<template>
<button
id="dropzone"
ref="dropzoneElement"
class="[&>*]:pointer-events-none"
@click="handleUpload"
>
<slot />
</button>
</template>
And voila! Broken down a little:
[&>*]:pointer-events-none
means "setpointer-events: none
to all elements that satisfy the rule of[&>*]
;[&>*]
is Tailwind-ese for "> *
, relative to the current element`;> *
is standard CSS for "all direct children".
I have no qualm or reservation with the general concept of "superforecasters", and find myself predisposed to agree with the author's screeds against 'experts' in the media and pleas to treat prediction with the same level of scientific rigor that has advanced other disciplines. But the abrupt whiplash from "it is important to ground our understanding of the world in repeatable, falsifiable observations and experiments" into "also, you should really check out Thinking Fast and Slow, this System I and System II thinking stuff is really important and interesting" (a notion that was disputed in 2015, completely unreplicatable in 2024, and should be considered obviously suspect to most people) made me realize too late what this book was, which was a Gladwellian pop psychology opus: an airport book that admires other airport books, filled with the same low-grade smarm that permeates The Signal and the Noise (also a book that I detest despite being written by someone whom I generally find smart and admirable!)
I want to learn more and more to see as beautiful what is necessary in things; then I shall be one of those who make things beautiful. Amor fati: let that be my love henceforth! I do not want to wage war against what is ugly. I do not want to accuse; I do not even want to accuse those who accuse. Looking away shall be my only negation. And all in all and on the whole: some day I wish to be only a Yes-sayer.
I can count on one hand the number of books I've read in the past decade that immediately overwhelmed me with how obviously and singularly great they were, not just in deployment of prose and style or in narrative structure or in content and message but how all of these things swirled together in a perfect cocktail, each informing and enhancing the other — indeed, this sort of gestalt analysis of a piece of art seems more obvious to me in the context of video games (see my writing on Celeste), where it's easier for me to separate the act of "playing the game" from the act of "internalizing/critiquing the game."
But Austerlitz, like Pale Fire or To the Lighthouse (to call out two examples that come most readily to mind), as a perfect gem — unique, brilliant prose supporting a terrific and (to flirt with redundancy) unique post-modernistic struture, neither of which are rococo but in fact are deployed specifically to tell the story that Sebald wishes to tell.
A jewel of a book; everyone should experience it.
Highlights
Someone, he added, ought to draw up a catalogue of types of buildings listed in order of size, and it would be immediately obvious that domestic buildings of less than normal size—the little cottage in the fields, the hermitage, the lockkeeper’s lodge, the pavilion for viewing the landscape, the children’s bothy in the garden—are those that offer us at least a semblance of peace, whereas no one in his right mind could truthfully say that he liked a vast edifice such as the Palace of Justice on the old Gallows Hill in Brussels. At the most we gaze at it in wonder, a kind of wonder which in itself is a form of dawning horror, for somehow we know by instinct that outsize buildings cast the shadow of their own destruction before them, and are designed from the first with an eye to their later existence as ruins.
We take almost all the decisive steps in our lives as a result of slight inner adjustments of which we are barely conscious.
Then she said, so quietly that you could hardly hear her: What was it that so darkened our world? And Elias replied: I don’t know, dear, I don’t know.
Our concern with history, so Hilary’s thesis ran, is a concern with preformed images already imprinted on our brains, images at which we keep staring while the truth lies elsewhere, away from it all, somewhere as yet undiscovered
industrialists and manufacturers, lawyers and doctors, rabbis and university professors, singers and composers, bank managers, businessmen, shorthand typists, housewives, farmers, labourers and millionaires, people from Prague and the rest of the Protectorate, from Slovakia, from Denmark and Holland, from Vienna and Munich, Cologne and Berlin, from the Palatinate, from Lower Franconia and Westphalia—each of whom had to make do with about two square meters of space in which to exist and all of them, in so far as they were in any condition to do so or until they were loaded into trucks and sent on east, obliged to work entirely without remuneration in one of the primitive factories set up, with a view to generating actual profit, by the External Trade Section, assigned to the bandage-weaving workshop, to the handbag and satchel assembly line, the production of horn buttons and other haberdashery items, the manufacturing of wooden soles for footwear and of cowhide galoshes; to the charcoal yard, the making of such board games as Nine Men’s Morris and Catch the Hat, the splitting of mica, the shearing of rabbit fur, the bottling of ink dust, or the silkworm-breeding station run under the aegis of the SS
Moments of the final season were exciting and cool: the timeskip had interesting moments, the budget was well-spent on some terrific action sequences, the production quality was overall high.
But the entire thing was incoherent, an incoherence which existed back in its first season but has only grown over time and with stakes. Characterization is minimized in favor of "how do we get people to move this plot forward in the most surpising way"; power levels are absolutely random in a way that makes it hard to empathize or invest in any single conflict since the answer to "who wins?" is "whatever services the arc most conveniently"; every single character is shrouded in plot armor.
The closest thing I think the show has to a coherent thesis is this: the cycle of war is interminable, and horrific, and corrupts everything and everyone it touches. But despite that, life is worth living and peace is a cause worth fighting for. There are points in this season of television that portray that subtly and gracefully; there are points where I am not quite sure that the show even believes that message.
All of this is to say: Attack on Titan certainly lacked the enduring warmth and charm of Mob Psycho 100, and it has less trenchant and cogent things to say about war and the human condition than Vinland Saga. I am glad to have finished it, and do not think it was very good.
As one might surmise from the tagline, The Late Show attempts to combine the cynicism and cinema of Chinatown with the wit and bonhemie of The Thin Man; unfortunately, as the joke goes, it ended up with the reverse. It was fun to see a young Lily Tomlin, who is one of those actors I only really know of in the context of their later career; beyond that, there was no real sense of if this was meant to be parody or sincerity, and the coterie of paper-thin characters did little to salvage an uninteresting pair of leads and an up-it's-own-ass plot. The closest thing this movie had to a through-line was the repeated emphasis that the day of the private detective was over (as foreshadowed by us opening the film with Carney's character writing his own memoir), but it hardly tackles that subject in a more interesting or meaningful way than Klute or The Conversation.
The new version of the Buttondown docs site is all in on Keystatic, Markdoc, and Tailwind's typography plugin — which makes it really easy to author beautiful docs in plaintext.
We ran into one small issue, which is that the Markdoc renderer likes to place paragraph tags in table cells, such that:
| Column | Description |
|-----------------------|--------------------------------------|
| Subject | The subject line of the email |
| Audience | The audience the email was sent to |
Becomes:
<table
><thead
><tr
><th><p>Column</p></th
><th><p>Description</p></th></tr
></thead
><tbody
><tr
><td><p>Subject</p></td
><td><p>The subject line of the email</p></td></tr
><tr
><td><p>Audience</p></td
><td><p>The audience the email was sent to</p></td></tr
></tbody
></table
>
This is problematic as Tailwind's prose
selector will automatically add a very healthy vertical margin to those paragraphs, spacing out the table!
Rather than drop down to 'raw' CSS, we can apply a gross-but-effective selector to override this:
[&_td>p]:!my-0 [&_th>p]:!my-0
This translates to:
For every
p
that is a direct descendant of atd
or ath
, set the vertical margin to0 !important
.
It always takes me ten minutes to re-stumble upon the syntax for [&_whatever]
, so I'm blogging it as a way of committing it to memory.
(A lot of people will passionately and reasonably argue that such selectors are a code-smell, and I get it, but also — being able to just add those two lines and cargo-cult them around the codebase a bit is actually way easier and way lower in terms of TCO than suddenly having to mentally reconcile two different styling methods. Still, use at your own risk — there's a reason I preface this "tailwind black magic.")
For a long time, my goal with Buttondown was largely around failure avoidance: "I want to get my first paying customer so I know it's not a fake product"; "I want to hit a thousand dollars in revenue so I know it's not just friends humoring me"; "I want to make $10K/mo or else I won't be able to work on it full-time if I want to"; and so on. It's now at the point where those kinds of milestones don't really exist: it's profitable enough to support my salary and the salary of others, it grows every month.
As such, I've become more attuned to what my goal really should be with Buttondown. Most tech companies have a goal centered around some flavor of maximalism: disrupting an industry, revolutionizing a process, that kind of thing. Buttondown is not that kind of product; I am not that kind of person.
And yet I do want Buttondown to grow larger than it currently is: not by leaps and bounds, of course, but there are things that I think make it a better product that require further investment [1] and I genuinely think there are a lot of people out there who would be happier using Buttondown than using their current tool. Both of those things imply a size of company that is larger than Buttondown's current size. (I'm also having a lot of conversations with folks considering striking out on their own who are doing this brand of soul-searching, and realizing that their goals — "leave my nine-to-five and do whatever I want" are no longer my own.)
Right now, I think the answer for all of this is something like the following: I want Buttondown to grow and flourish specifically to validate and proselytize a slightly different model of software company: one that uses all the amazing things about software (negligible marginal costs! the infinite breadth of the internet!) to build high-value, sustainable tools for customers and doing so in a way that is fair and rewarding to employees. It seems almost trivializing to write that, but it's legitimately true. I think the world would be a better place if there were more smaller, older software companies focused on craftsmanship, and I think the best way to help catalyze that world is by building such a company.
My friend Nick pithily summed up his approach:
Our philosophy:
- Sustainable business
- Sustainable team (high quality of life)
- Without compromising those two, grow our positive impact on people
In the figurative sense, not the literal one — I promise this is not a backdoor announcement of a Series A. ↩︎
One of the more interesting theses advanced by Zero to One [1] is that monopolies are good to the extent that they afford companies the agency and comfort to engage in long-term activities:
Monopolists can think about things other than making money; non-monopolists can’t. In perfect competition, a business is so focused on today’s margins that it can’t possibly plan for a long-term future. Only one thing can allow a business to transcend the daily brute struggle for survival: monopoly profits.
If you accept this argument on its face, you can dither a little: sometimes these longer-term investments both involve value-generation and value-capture on behalf of the monopolist (the iPhone being subsidized by iPod's runaway success); sometimes they're purely altruistic, like Facebook's investment in open-source [2].
It's an interesting line of reasoning that essentially reduces down to "the area under the curve generated by a very successful business which would otherwise be eroded by perfect competition can be directed towards useful ends."
Finishing up Acquired's great two-part dive into the formation and breakup of Standard Oil, I stumbled into a useful (albeit anecdotal) rejoinder. They quote Ron Chernow in Titan:
While the old guard at 26 Broadway mourned the trust's passage, some Young Turks at the operating companies were overjoyed... One of these extraordinary mavericks, Dr. William M. Burton of Standard Oil of Indiana, thought that Roosevelt had performed an inestimable service. After the 1911 dismemberment, he said, 'It was felt all along the line—younger men were given a chance.' Burton patented an exceptionally valuable process in 1913 (two years later) for 'cracking' crude oil—that is, for refining it so as to yield a far higher percentage of gasoline. This discovery permitted Standard of Indiana to reap incredible windfall royalties.
Can you imagine a more useful counterfactual than "literally Standard Oil got better from both a shareholder and consumer perspective once they were liberated from the shackles of infinite market power?" I certainly can't!
Setting aside the much trickier discussion of whether or not market power can be amassed within a corporation without negative consumer-facing externalities [3], I find it difficult to argue that the safety of monopoly-granted market power outweighs the Darwinian pressure of a market outside of very specific circumstances. One right and responsibility granted to any successful company is to allocate their profits towards investments; it doesn't take a monopoly to be able to do so.
industrialists and manufacturers, lawyers and doctors, rabbis and university professors, singers and composers, bank managers, businessmen, shorthand typists, housewives, farmers, labourers and millionaires, people from Prague and the rest of the Protectorate, from Slovakia, from Denmark and Holland, from Vienna and Munich, Cologne and Berlin, from the Palatinate, from Lower Franconia and Westphalia—each of whom had to make do with about two square meters of space in which to exist and all of them, in so far as they were in any condition to do so or until they were loaded into trucks and sent on east, obliged to work entirely without remuneration in one of the primitive factories set up, with a view to generating actual profit, by the External Trade Section, assigned to the bandage-weaving workshop, to the handbag and satchel assembly line, the production of horn buttons and other haberdashery items, the manufacturing of wooden soles for footwear and of cowhide galoshes; to the charcoal yard, the making of such board games as Nine Men’s Morris and Catch the Hat, the splitting of mica, the shearing of rabbit fur, the bottling of ink dust, or the silkworm-breeding station run under the aegis of the SS
Hard to come up with a more trenchant or accurate summation of my thoughts than: "movie owned", because that's where I really ended up with this — this was not my favorite science fiction film of all time, and I think there are some quibbles and flaws, but it absolutely owned.
Some rapid-fire takes:
- I think almost every divergence Denis took from the original book was correct, much to the chagrin of very few ultraloyalist dorks. The "who is the traitor?!" arc was fairly hackeneyed and anti-climactic in the book, and would have chewed up otherwise-precious time in the film; Alia being a mutant toddler would have translated very poorly onto the screen; even my biggest complaint from the original, the immediate reveal that the concept of the Lisan al Gaib was a Bene Gesserit plot, was steered into in a rewarding way by recasting Chani as more of a skeptic.
- I suspect we might look back on this film with an understanding that it reified the superstardom of its four leads in a way that few prior films have done.
- Walken and Pugh's characters are not given much to do in the books, nor are they in this film, nor do their portrayals redeem or salvage what are fairly wooden characters overall. (Walken, in particular, felt like a kind of stunt casting whose choice was understandable but incorrect.)
- A couple sequences in this film — the fireworks on Giedi Prime, the nameless Harkonnen troops silently ascending the crag — will sit with me for a long time as some of the most indelible sequences in science fiction cinema. Truly incredible things.
- I thought Chalamet's transformation over the course of the film was tremendous, and he sold Paul's journey much more than the book's tortured monologuing did.
I think that in many ways, Dune 2 represents the apogee of blockbuster genre storytelling: a visual marvel, a spectacle of brilliance and novelty, a parable that raises more questions than it answers, a meal that can be enjoyed both as a child and an adult. Here's hoping it launches a thousand ships.
Via HN I ran into not one but two extremely neat and pleasant-looking libraries for URL manipulation. They look like great libraries, and a prior version of me would have taken a brief set of cursory glances at the hodgepodge of janky URL manipulation code that I wrote for Buttondown and said "okay, time to rip out all of this and replace it with a library that knows what it's doing."
Right now — and I don't mean this in some sort of absolute, zealous sense — that seems unwise. The incremental cost and ongoing burden of pulling in a third-party library for something so trivial and tangential feels high relative to best-case return. (It's not like my existing logic is brittle or terrible: it has bugs and edge cases, I'm sure, but they're not an ongoing concern.)
The right way to evaluate new libraries, even small ones, is just like anything else: "does the value this brings me outweigh not just the one-time cost of adopting it but the ongoing cost of having to rely on it?" Sometimes — often times! — the answer is yes. But people tend to underrate the ongoing costs of depending on third-party libraries, because those costs are more volatile and implicit than depending on your own code.
It's hard to watch this series and not feel like Garland had a couple lynchpin scenes and concepts in mind — the general monologue about determinism, for instance [1], or Lyndon's deliberate suicide, or Nick Offerman [2]'s supervillain origin story — built a plot around it, and then incorrectly chose (as so many talented auteurs did from 2016—2020) to make it a miniseries instead of a film.
There are a lot of beautiful moments in Devs: it is shot and set in a way that reminds me of Legion, a sort of scientific retro-futurism that gives you the impression less of a point in time and more a slightly alternate reality, and there are quiet moments that make the entire enterprise worth watching (Jamie cutting a lemon for Lily's water; Stewart's terrific and haunting recital of Aubade; every shot of the exterior of Devs), but the entire thing feels so padded and filled with unnecessary moments of repetition and melodrama.
Folks who like Garland qua Garland will find this worth the investment; it could have and should have been two episodes shorter. (The reveal with the title was funny, though, and I'll give him creit for that!)
Which, don't worry if you don't quite grok it the first time — because there will be seven other identical monologues delivered in the same neutral deadpan spaced out evenly, one per episode ↩︎
Who I thought did a terrific job, and was the only performance outside of Stephen McKinley Henderson that felt noteworthy ↩︎