# How records look

How the app draws your records on a reader's day, and the words you choose: names in their language, plain figures, a change with no colour, events first.

A reader who turned your plug-in on finds a bar with its name, and one quiet
row a record, on each day that has one. You choose the words; every plug-in is
drawn the same flat way, so a reader learns it once. These days are drawn by the
app's own code from the examples' fixtures (in Markdown, a line a row).

```day title="Harbour Almanac on Thu 1 Oct, as the app draws it"
Thu 1 Oct · today
◌ Harbour council: berth fees · Scheduled · Harbour Almanac
High and low tide · High 2.20, Low 0.63 · −3.93% · Harbour Almanac
Fish landed · 2026-08 · Landed 399.00 · −14.38% · Last rate · Thu 10 Sep · Harbour Almanac
↗ Tide table for October 2026 published · https://notices.harbour-almanac.example/2026/10/01/1
↗ Leading light on the east bank shows a reduced range · https://notices.harbour-almanac.example/2026/10/01/2
```

## The words you choose {#names}

Your plug-in's `name`, each series' `name` and each name in `fieldNames` are
per language, keyed by a two- or three-letter code (optionally with a region),
at most 80 characters each. A reader sees their language, then `en`, then the
first you listed. The app looks up two letters, so key `es`, not `es-DO`, and
give `en`. The same day, for a Spanish reader:

```day title="Almanaque del puerto on Thu 1 Oct, as the app draws it"
Thu 1 Oct · today
◌ Harbour council: berth fees · Scheduled · Harbour Almanac
Pleamar y bajamar · Pleamar 2.20, Bajamar 0.63 · −3.93% · Harbour Almanac
Pesca desembarcada · 2026-08 · Desembarcado 399.00 · −14.38% · Last rate · Thu 10 Sep · Harbour Almanac
↗ Tide table for October 2026 published · https://notices.harbour-almanac.example/2026/10/01/1
↗ Leading light on the east bank shows a reduced range · https://notices.harbour-almanac.example/2026/10/01/2
```

- **A series name** labels the row: name what the reader sees, "High and low
  tide", not where it came from.
- **Field names** say what each figure is; a field without one shows its key.
- **A unit**, at most 16 characters as the source writes it (`m`, `DOP`, `%`),
  is not drawn: it decides how a change is measured and how a screen reader
  says the number (`DOP`, `USD`, `EUR` and `%` as words, others as written).
- **Keys** (`tide`, `high`) are lowercase letters, digits, hyphens and
  underscores, kept once records are stored.
- **The attribution** ends your rows, at most 40 characters, or the `holder`.
- **Titles** are plain text, at most 200 characters, never markup, in the
  source's words and language; the day already says the date. An item's is its
  link; an event without one shows the series' name.

The app's own words (`Scheduled`, `Last rate`, `Rate of`, `Moved to`,
`Cancelled`) and dates are in English today.

## Values

A value row is the series' name (with `period` when dated by publication:
`Fish landed · 2026-08`), the figures in the order of `fields`, each named under
it and rounded to two decimals (`59.5577` reads `59.56`), then the change of
your `change` field (or the first) from the previous record, a signed percent
or, for a `%` unit, basis points. It is the same quiet grey either way: a higher
dollar is a weaker peso, and Kanboombo does not decide which is good news. Your
attribution sits under it.

From its first record to the reader's today, a value series fills every day.
Before your newest record, a day with none shows the value in force, lighter,
with no change, and `Rate of <date>`:

```day title="DOP Economy on Sat 26 Sep, as the app draws it"
Sat 26 Sep
Dollar · Buy 59.28, Sell 59.65 · Rate of Fri 25 Sep · Banco Central
```

After your newest record, each day shows it with `Last rate · <date>` (monthly
series too, and the words may change); after the reader's today, nothing.

```day title="DOP Economy on Wed 30 Sep, as the app draws it"
Wed 30 Sep
Dollar · Buy 59.27, Sell 59.56 · −0.15% · Last rate · Mon 28 Sep · Banco Central
```

## Events and items

Events lead their day, then values and items, each in your manifest's order of
series.

| State | The row |
|---|---|
| `scheduled` | `◌` and the title, with `Scheduled · <source>` under it |
| `happened`, with a `value` | The series' name and the value: two decimals, or `5.50%` for a `%` unit |
| `happened`, no `value` | The title |
| moved | On the old date, the title and `Moved to <date>` |
| `cancelled` | The title and `Cancelled` |

Only events are drawn after the reader's today: scheduled ones, and the old
date of one that moved.

```day title="Harbour Almanac on Thu 15 Oct, as the app draws it"
Thu 15 Oct
◌ Harbour council meeting · Scheduled · Harbour Almanac
```

A happened event's change is against the previous happened event (`+25 bp`,
with `Was 5.25%` under it, or `held`); with no earlier value, the value alone:

```day title="Harbour Almanac on Thu 2 Jul, as the app draws it"
Thu 2 Jul
Harbour council · 11.50
High and low tide · High 2.39, Low 0.38 · −1.65% · Harbour Almanac
Fish landed · 2026-05 · Landed 528.00 · Rate of Wed 10 Jun · Harbour Almanac
```

A cancelled meeting keeps its day:

```day title="Harbour Almanac on Thu 6 Aug, as the app draws it"
Thu 6 Aug
Harbour council meeting: lapsed for want of a quorum · Cancelled
High and low tide · High 1.87, Low 0.86 · +1.08% · Harbour Almanac
Fish landed · 2026-06 · Landed 488.90 · Rate of Fri 10 Jul · Harbour Almanac
```

An item is its title, a link to its `url`, on its own day only, with no figure
and no attribution.

## When your plug-in falls behind

Days after your newest record end with:

| Your plug-in | Those days say |
|---|---|
| Running | `Last rate · <date> · <source>` |
| Failing: the last run failed after the last success | `Couldn't refresh · from <date>` |
| The reader's app cannot reach Kanboombo | `Couldn't reach Kanboombo · from <date>` |
| Paused, or a new version waits for approval | `Not updating · from <date>` |

A plug-in with no records has no section, except on today when its first run
failed or Kanboombo cannot be reached. A screen reader reads a row as one
sentence:

```text
Dollar, buy 59.27, sell 59.56 pesos, down 0.15 percent, Monday 28 September, Banco Central
```

`preview` draws your own days with this code, in any language:
[preview](/developers/plugins/build/fixtures/#preview).
