<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet type="text/xsl" href="/feed.xsl"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Design on jvalol</title><link>https://jva.lol/tags/design/</link><description>Recent content in Design on jvalol</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 19 Jul 2026 15:09:00 -0600</lastBuildDate><atom:link href="https://jva.lol/tags/design/index.xml" rel="self" type="application/rss+xml"/><item><title>A glance is not a reading</title><link>https://jva.lol/weblog/a-glance-is-not-a-reading/</link><pubDate>Sun, 19 Jul 2026 15:09:00 -0600</pubDate><guid>https://jva.lol/weblog/a-glance-is-not-a-reading/</guid><description>In which ’new’ gets defined wrong twice before it gets defined right</description><content:encoded>&lt;p&gt;PopsicleBoat&amp;rsquo;s sidebar recently grew a badge: &lt;strong&gt;All Posts · 13&lt;/strong&gt;. Thirteen new things since you last looked, plus a list up top of what they are — because I&amp;rsquo;d noticed that even I, the person who built the place, couldn&amp;rsquo;t find my own new content. If the shipwright can&amp;rsquo;t find the new planks, a stranger has no chance.&lt;/p&gt;
&lt;p&gt;Shipping the badge was easy. Defining the one word it depends on took three tries.&lt;/p&gt;
&lt;p&gt;The word is &lt;em&gt;new&lt;/em&gt;, and my first definition was the obvious one: new means &lt;em&gt;posted since your last visit&lt;/em&gt;. One timestamp per user — stamped when you open the board — and everything after it is new. Databases love this. It&amp;rsquo;s one column, one comparison, and it&amp;rsquo;s how half the software you use decides what to bold.&lt;/p&gt;
&lt;p&gt;Then I used it. I opened the board, clicked the first new post, read it, came back — and the list of new posts was gone. All of it. The badge still insisted there were thirteen, but the list beneath it had emptied, because my &lt;em&gt;visit&lt;/em&gt; had stamped the timestamp, and by the time I returned, nothing in the database was &amp;ldquo;since your last visit&amp;rdquo; anymore. I had read one post and the system had quietly credited me with all thirteen.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s the watermark model, and its flaw is right there in the metaphor: a watermark rises whether or not you looked at what it covered. Arriving at the page claimed I&amp;rsquo;d seen everything on it. A glance at the harbor became a certified reading of every ship&amp;rsquo;s manifest.&lt;/p&gt;
&lt;p&gt;So, second try: sessions. Don&amp;rsquo;t let a single visit swallow the list — hold the line steady while you&amp;rsquo;re actively reading, and only advance it after you&amp;rsquo;ve been away a while. Now the list survived a click-and-return. Progress. I opened a post, read it, came back, and — the badge still said thirteen. And the post I had &lt;em&gt;just read&lt;/em&gt; sat there in the list, marked new, looking at me.&lt;/p&gt;
&lt;p&gt;Of course it did. I&amp;rsquo;d made the line move more politely, but &amp;ldquo;new&amp;rdquo; was still defined by &lt;em&gt;time&lt;/em&gt;. The system knew when I&amp;rsquo;d been on the board; it had no idea what I&amp;rsquo;d actually read. Both models shared the same wrong bone: they tracked the clock, when they should have tracked the items.&lt;/p&gt;
&lt;p&gt;Third try, the one that stuck: a read is a fact about &lt;em&gt;you and one post&lt;/em&gt;. A little join table — this user read this post — written the moment you open a thread. Now the pieces fall into place without any cleverness. Open a post and the badge counts down by exactly one, live. Come back to the board and that post has left the list; the other twelve are still there, still owed to you. Nothing you didn&amp;rsquo;t open gets claimed on your behalf. The timestamp survives only as a floor, so ancient history from before the feature existed doesn&amp;rsquo;t haunt the count — but above that floor, every post is settled item by item.&lt;/p&gt;
&lt;p&gt;And because any inbox eventually becomes a chore, there&amp;rsquo;s a broom: &lt;em&gt;Mark all as read&lt;/em&gt;, for the days you&amp;rsquo;d rather wave at the backlog than shake hands with it. The broom is honest too — it&amp;rsquo;s you declaring the items read, not the system inferring it from your footsteps.&lt;/p&gt;
&lt;p&gt;What strikes me in hindsight is that I knew the right model all along, as a &lt;em&gt;user&lt;/em&gt;. Every notification system that has ever annoyed me — the messenger that marks a whole conversation read because I peeked, the changelog bolding things I&amp;rsquo;ve already seen — annoyed me for exactly this reason: it confused my presence with my attention. I had simply never said the rule out loud. It took a badge refusing to count down, twice, to make me say it:&lt;/p&gt;
&lt;p&gt;A glance is not a reading. Presence is not attention. If the system claims I&amp;rsquo;ve seen something, it should be because I opened &lt;em&gt;that thing&lt;/em&gt; — not because I walked past it.&lt;/p&gt;
&lt;p&gt;One timestamp is how the database wants to remember it. One row per reading is how it actually happened.&lt;/p&gt;</content:encoded></item></channel></rss>