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.

Repository @chalky.town did:plc:mthv22lb4hhaxupzjnqvijwk namespace authority
Details · record, key tid
Kindrecord
Record keytid
Authoritychalky.town
Indexed

Record

record · key tid

Properties

color

string

Id 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

completed

requiredboolean
  • default: false

completedAt

string · datetime

When `completed` last flipped to true (non-recurring tasks only; recurring tasks track per-occurrence completion in completedDates).

createdAt

requiredstring · datetime

day

string

Local calendar day the task sits on, as YYYY-MM-DD. Omit for the Someday bucket.

Optional 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

Whether this task is a recurring template.

  • default: false

movedAt

string · datetime

When rank (or, on a legacy record, movedRank) was last set.

movedRank

integer

Legacy, 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.

order

requiredinteger

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

integer

The 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

integer

Yearly only: the month (1=January … 12=December). Omitted means the anchor's month.

  • minimum: 1
  • maximum: 12

Monthly & yearly "day" mode: the date-of-month. Omitted means the anchor's date. Months without this day are skipped.

  • minimum: 1
  • maximum: 31

Weekly only: weekdays the series lands on (0=Sunday … 6=Saturday). Omitted means just the anchor day's weekday.

itemsinteger
  • minimum: 0
  • maximum: 6

recCount

integer

Optional: end the series after this many occurrences, counted from the anchor (inclusive).

  • minimum: 1

How often the task recurs.

  • enum: daily | weekly | monthly | yearly

Recur every N frequency units (e.g. every 2 weeks).

  • minimum: 1

Monthly & 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

string

Optional last occurrence day (YYYY-MM-DD), inclusive. Set directly or kept in sync as the concrete stop date when recCount is used.

Reference
itemsref
Reference

title

requiredstring

The task title. May contain inline Markdown (links and emphasis); clients that don't render Markdown can show it as plain text.

  • maxLength: 500

updatedAt

requiredstring · datetime

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

object

Per-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

color

string

Covers color.

done

string

Covers completed and completedAt.

notes

string

Covers description.

place

string

Covers day, order, movedRank, and movedAt, which move together.

Covers isRecurring and every rec* field.

subtasks

string

Covers subtasks.

text

string

Covers title.

#subtask

object

Properties

completedAt

string · datetime

When `done` last flipped to true. Used to order completed subtasks by completion time.

done

requiredboolean
  • default: false

id

requiredstring

text

requiredstring
  • maxLength: 500

Similar lexicons

semantic match

Lexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.

  • town.chalky.occurrence

    record not from the namespace authority

    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

  • A task on a list.