Skip to main content

Every attribute here is defined by you, at runtime: a label, a type and a value, stored together in one self-describing record. Nothing is predefined and nothing you type is ever executed. The record lives in this browser; the same editor backs record files on the desk.

Your record

  1. Give the first attribute a value, then add more: pick a type beside Add — text, number, date, choice, list or rating — and press it.
  2. Change an attribute's type: a value that does not convert exactly is kept beside the new one until you restore or discard it.
  3. Rename a label and watch the stored JSON: the attribute keeps its id, value and place.
  4. Reorder with the arrows or Alt+Shift+↑/↓, remove a row and bring it back from Recently removed, undo and redo.
  5. Reload the page: the record is restored exactly. Switch to offline first and unsaved edits come back as a recoverable draft.
  6. Edit here, wait for Saved, then edit the second writer below without reloading it: its save is refused as a conflict, and Merge combines both by attribute.

Opening the record…

A second writer

The same record, opened by a second editor — another tab, another person or an assistant. Each save names the version it started from; a save based on an older version changes nothing and pauses for your choice.

Opening the record…

What is stored

The record as the store holds it now, after the last accepted save of either writer: canonical JSON, keys sorted, definitions beside values, ids that never change. The desk's database keeps the same document.

Import and the codec

Paste a record or pick a sample. The codec decides what may enter: unknown keys, prototype keys and wrongly typed values are refused with a reason; a type this app does not know is kept, read-only.

Think this pattern could be better? Tell us how.

Leave feedback