Engineering · 4 October 2026 · 3 min
The first date wins - how Jot decides which date in a sentence is the reminder
A line like "push the meeting from Tuesday to Thursday" contains two dates. Why Jot's parser takes the first one, strips tokens before reading dates, and shows the result before saving.
People do not type tidy data. They type sentences, and sentences sometimes contain more than one date: “push the meeting from Tuesday to Thursday”, “remind me on Friday about Monday’s deadline”, “book flights for the 12th, decide by the 3rd”.
A capture parser has to decide what to do with that. Jot’s answer is deliberately simple, and this post explains why.
The order of operations
When you type a line in the capture box, the parser in src/ui/parse.ts does three things, in this order:
- Strip the tokens.
#tags, a>listdestination and a standalone!are pulled out of the text first. That order matters: if a token sits next to a date phrase, as in>Work tomorrow 2pm, removing it first means the date parser never sees “Work” as part of the date. - Find the first date. The remaining text goes to chrono, a JavaScript natural-language date parser. Jot takes the first date or time chrono recognises.
- Remove that phrase from the title. “Call Sam tomorrow 3pm” becomes the title “Call Sam” with a due time.
Everything else stays as plain text in the title, including any second date.
Why the first one
Two dates in one line usually mean one of two things:
- A move: “push from Tuesday to Thursday”. The meaningful date is arguably the second.
- A deadline with a prep date: “remind me Friday about Monday’s deadline”. The meaningful date is the first.
There is no rule that gets both right, and guessing based on prepositions (“to”, “about”, “by”) works until it does not. A parser that is right 80% of the time in a way you cannot predict is worse than one that is right 60% of the time in a way you can.
So Jot does the predictable thing: first date wins, and the rest stays in the title where you can see it. The comment in the source puts it plainly: the parser does not attempt to guess which one is the reminder.
Showing the result before saving
Predictable only helps if you can see the outcome. As you type, the capture box shows chips for what was parsed, including the date. If the chip says Tuesday and you meant Thursday, you can rephrase (“Thursday: move the meeting from Tuesday”) or delete the extra date before saving. The cost of a wrong guess is a glance, not a missed reminder.
Notes do not get dates
One more rule: dates are only applied to todos. A note that happens to mention “Friday” stays a note with no due time, because “the Friday standup notes” is reference, not a reminder. See notes and todos are different animals.
Reminder equals due, for now
A parsed date sets both the due time and the reminder time. They are separate fields in the database, so a lead time (“remind me an hour before”) can be added later without a migration, but today the reminder fires at the due time. That is on the roadmap as “a reminder lead time separate from the due time”.
Testing it
The parser is a pure function with a referenceDate parameter, so tests can pin “now” to a fixed moment and check that “tomorrow” means the right day. That is also why examples in the tests avoid words like “now”, which chrono happily treats as a date. More on the token rules in four tokens and a date, and on how to phrase dates so they parse in any app in natural-language dates in task apps.
Jot is on the Microsoft Store.
Jot is a quick-capture app for Windows: one hotkey, one line, back to what you were doing. What it is, or what is still unproven.