town.chalky.task
A single task in a chalky.town weekly planner. Stored in the author's repo. Field names mirror app.attodo.task where the concept is shared (title/description/completed/completedAt and the rec* recurrence fields); chalky-specific fields (day, order, color, subtasks, updatedAt) extend it. A recurring task is a template that projects occurrences onto later matching days; per-occurrence state (done/skipped) lives in separate town.chalky.occurrence records that reference this one.
Details · record, key tid
| Kind | record |
|---|---|
| Record key | tid |
| Authority | chalky.town |
| Indexed |
Record
record · key tidProperties
color
stringId of a color in the author's editable palette (town.chalky.config#colors). knownValues lists the five built-in defaults; any other palette color id is also valid since the field is open.
knownValues: salmon | chardonnay | witch-haze | mint-green | melrose
default: false
completedAt
string · datetimeWhen `completed` last flipped to true (non-recurring tasks only; recurring tasks track per-occurrence completion in completedDates).
day
stringLocal calendar day the task sits on, as YYYY-MM-DD. Omit for the Someday bucket.
description
stringOptional longer notes. May contain block-level Markdown (headings, lists, links, code, etc.); clients that don't render Markdown can show it as plain text.
maxLength: 3000
isRecurring
booleanWhether this task is a recurring template.
default: false
movedAt
string · datetimeWhen rank (or, on a legacy record, movedRank) was last set.
movedRank
integerLegacy, read-only: the malleable sort strategy's pinned position on the small unscaled color-rank axis, written by clients built before `rank` existed. Current clients read this (scaled up) only when `rank` is absent, and never write it — write `rank` instead.
Sort key within a day; lower sorts higher. Integer, atproto's data model allows no other numeric type — clients must never write a fractional value here.
rank
integerThe malleable sort strategy's pinned position, on the same numeric axis as color rank scaled by RANK_SCALE (1024) — see the app's config.ts. Set when the user drags this task while that strategy is active; cleared when its color changes, rejoining the color grouping. Supersedes the legacy `movedRank` field, which used an unscaled axis with no integer headroom to halve into.
recByMonth
integerYearly only: the month (1=January … 12=December). Omitted means the anchor's month.
minimum: 1maximum: 12
recByMonthDay
integerMonthly & yearly "day" mode: the date-of-month. Omitted means the anchor's date. Months without this day are skipped.
minimum: 1maximum: 31
recByWeekday
arrayWeekly only: weekdays the series lands on (0=Sunday … 6=Saturday). Omitted means just the anchor day's weekday.
minimum: 0maximum: 6
recCount
integerOptional: end the series after this many occurrences, counted from the anchor (inclusive).
minimum: 1
recFrequency
stringHow often the task recurs.
enum: daily | weekly | monthly | yearly
recInterval
integerRecur every N frequency units (e.g. every 2 weeks).
minimum: 1
recMonthly
stringMonthly & yearly: land on the calendar date-of-month ("day") or the anchor's nth weekday ("weekday", e.g. the 2nd Friday). Omitted means "day".
enum: day | weekday
recUntil
stringOptional last occurrence day (YYYY-MM-DD), inclusive. Set directly or kept in sync as the concrete stop date when recCount is used.
The task title. May contain inline Markdown (links and emphasis); clients that don't render Markdown can show it as plain text.
maxLength: 500
Last local edit; used as the whole-record last-write-wins clock during sync. The physical component of a hybrid logical clock, so it is monotonic per device.
#stamps
objectPer-field-group hybrid-logical-clock stamps (an approach borrowed from the CRDT ideas behind automerge.org), enabling field-level last-write-wins merges: two devices editing different groups of the same task both keep their edits. Each value is '<ISO datetime>.<counter hex4>.<device id>', totally ordered by plain string comparison. Absent on a group (or entirely, on records from before stamps existed) means updatedAt stands in for it. Clients that don't merge field-wise can ignore this and compare updatedAt whole-record.
Properties
#subtask
objectProperties
completedAt
string · datetimeWhen `done` last flipped to true. Used to order completed subtasks by completion time.
default: false
maxLength: 500
Similar lexicons
semantic matchLexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.
-
A single occurrence of a recurring town.chalky.task that has diverged from its series' default. A recurring task is a template that projects occurrences onto later matching days; an occurrence stays a pure projection until the user acts on one day (marks it done, or removes it), at which point this record materializes to carry that per-day state. It exists only while it differs from the default — reverting an occurrence to not-done and not-skipped deletes the record. Replaces the older completed
-
dev.skytick.todo
recordA task on a list.