:DURATION 2023-05-11T00:00:00Z 2026-07-19T00:00:00Z :INFO That One Is Real First commit to the day this page was written. Three years and two months, rendered by the Duration chip from two lines of text. The chip picked that visual on its own: it measures the gap in days and switches presentation at one day, thirty one days and three hundred and sixty five. Anything longer than a year gets the year view. :INFO Three Chips, Three Different Answers Duration, Countdown and Moment are siblings in the chip catalogue and they sound like a set. They are not. They were built at different times by the same person solving different problems, and the seams show. This page documents that honestly, because the inconsistency is more instructive than a tidy description would be. :INFO Duration Wants Exactly Two Lines Start on the first, end on the second. Fewer than two and the chip is dropped with an error. More than two and the extras are ignored without comment. Both values go through the strict parser, which means the full instant form with a zone. A bare date fails. A datetime without a zone fails. :CODE [language:plaintext] :DURATION 2023-05-11T00:00:00Z 2026-07-19T00:00:00Z :NOTE The snippets on this page are indented by one space on purpose. A line whose first character is a colon starts a new chip, including inside a Code chip, so an unindented example would parse itself. :INFO No Sanity Check on the Range An end date before the start date is accepted. Nothing in the payload validates ordering, and nothing caps the span. You can publish a Duration running backwards and the page will render it. Whether that is a bug or a missing feature is arguable. It is certainly not a decision anyone made. :COUNTDOWN [targettime:2027-05-11T00:00:00Z] :INFO That One Is Real Too It is counting toward 11 May 2027, four years to the day from the first commit. It ticks once a second in your browser. There is a paragraph attached to it that you cannot read yet. :INFO The Reveal Is Enforced on the Server This is the design decision worth defending. The Countdown chip's text is not hidden by the frontend. The API mapper compares the target against the current time in UTC and only copies the text onto the response if the target has passed. Before that, the field is absent from the payload entirely. Open the network tab and it is not there. A reveal that a reader can defeat by viewing source is not a reveal. :CODE [language:java] if (item.getTargetTime() != null && LocalDateTime.now(ZoneOffset.UTC).isAfter(item.getTargetTime())) { target.setText(item.getText()); } :INFO Countdown Got the Lenient Parser Countdown does not use the strict parser Duration uses. It runs the value through a flexible reader that accepts a trailing Z, an explicit offset like plus one hour, or no zone at all (assumed UTC), and it will accept a time without seconds. What it will not accept is a bare date, because the underlying formatter requires a time component. That surprises people, and it is the single most common way to lose a Countdown chip. :CODE [language:plaintext] 2026-12-31T23:59:59Z parses 2026-12-31T23:59:59 parses, assumed UTC 2026-06-19T18:00:00+01:00 parses, stored as 17:00 UTC 2026-12-31T23:59 parses, seconds default to zero 2026-12-31 does not parse, chip dropped :INFO The Leniency Was a Later Fix Countdown shipped on 1 April 2026 with the strict parser, same as Duration. On 15 June 2026 a fix replaced it with the flexible one and made the whole path explicitly UTC, because the reveal comparison had been running on server local time. Duration was not migrated in that commit. That is how the two ended up with different parsers: not a design, an omission that was never tidied. :INFO Moment Takes No Date Despite the name, the Moment chip has no date field. Line one is an image filename, line two a title, line three a location. That is the whole chip. It is for behind the scenes photography: a picture, what it is, where it was. :CODE [language:plaintext] :MOMENT workshop-bench.jpg The bench at 2am St. Gallen :INFO It Did Have One, for Four Hours The first version of the chip, committed on 27 January 2026, had a happenedAt column, a payload field, and a clock icon drawn for it. A commit four hours later removed all of it, in the same change that replaced the chip's flat background with a WebGL glass effect. The visual redesign left no room for a date row and the field went rather than the layout. No commit message explains it. The leftover data transfer object survived until March before someone deleted it. :INFO Why There Is No Moment Chip on This Page Because a Moment needs an image file that exists in the slate's assets folder, and this slate has none. The chip would be silently skipped and the page would look like it had simply forgotten to include one. Saying so is better than an unexplained gap. :STATS :TIMELINE The arc 2026-01-27 | Moment ships, minus the date it was built with 2026-01-27 | Moment redesigned around a WebGL effect the same day it landed 2026-04-01 | Countdown ships with the strict parser 2026-06-15 | Countdown gains offsets and zoneless input, Duration does not :INFO The Honest Summary Three chips, no shared abstraction, two parsers, and one of them named after a concept it does not model. Nothing here is broken enough to be urgent, which is exactly why it has stayed this way. Small inconsistencies survive by being individually reasonable. Writing them down in public is the cheapest way to make them stop being reasonable. :QUOTE [quotetype:plain] Every date parser in a codebase is a decision someone made once and nobody revisited.