Time Chips

By Steph16
Scroll to open

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.

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.

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.

plaintext
 :DURATION
 2023-05-11T00:00:00Z
 2026-07-19T00:00:00Z

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.

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.

9 months and20 days and11:56:40

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.

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.

java
 if (item.getTargetTime() != null
     && LocalDateTime.now(ZoneOffset.UTC).isAfter(item.getTargetTime())) {
   target.setText(item.getText());
 }

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.

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

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.

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.

plaintext
 :MOMENT
 workshop-bench.jpg
 The bench at 2am
 St. Gallen

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.

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.

Chips that sound like time chips

3

Date parsers between them

2

Chips that accept a bare date

0

Duration lines required

exactly 2

Countdown tick interval

1 second

Shared time abstraction

none

The arc27.01.2026 – 15.06.2026
27.01.2026Moment ships, minus the date it was built with
27.01.2026
27.01.2026Moment redesigned around a WebGL effect the same day it landed
27.01.2026
01.04.2026Countdown ships with the strict parser
01.04.2026
15.06.2026Countdown gains offsets and zoneless input, Duration does not
15.06.2026

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.

"

Every date parser in a codebase is a decision someone made once and nobody revisited.

"