Your lists
Loading list…
Inbox · Stored items
Read-only: every stored field, ID, revision, and custom value is shown below. Add, edit, move, and delete tasks from the list view. Saved changes survive refresh.
List settings
Configure any normal or smart list here. Choosing a list to configure keeps your current list open in the drawer.
Selected list
Only this list’s own view receives its tasks and list information. Other views, dependency lookups, and task pickers omit them.
ID:
View configuration
Current view type:
This list always runs its assigned view. Other lists keep their own assignments. Editing a shared view changes its definition for every list using it.
Source lists
Choose normal lists to include or exclude. New lists are included automatically in All lists and All but selected lists. Hidden lists are always omitted. Task status filters candidates before Lua runs; compact dependency references remain available.
Task destination
View library
Browse and edit view definitions here. Assign a view to a list in List settings.
Views
ID:
Define options and optional fixedOptions. Use the Creation action selector above to configure task initialization. Lua receives selector values in input.options.
Lua editors
Editing view: . Choose a definition in the view library above.
Scripts run their saved version. Save applies source for this session; errors appear when it runs. Discard removes unsaved edits. Only saved definitions are stored on the server.
Contract v1: input.items contains item snapshots; input.list is the selected list; input.lists contains visible list snapshots. Normal lists supply only their own items; smart lists supply items from the sources chosen in List settings. Hidden lists and task lookups are excluded before Lua runs, except in their own normal-list context. Join each item’s list_id to its list record. input.context.today and input.context.tomorrow are workspace calendar dates (YYYY-MM-DD). Return sections whose rows have primary controls, plus one selected_item={item_id,controls} for the drawer. The host always sends input.selected_item: the full selected task snapshot, or null when closed, including when that task is absent from input candidates. Check json.kind(input.selected_item) == "object" before generating its drawer. It is task data; the returned selected_item.controls is UI. Render details independently of row filtering. Helpers: table.sort, log, json.object(), json.array(), and json.null.
Every view receives input.task_index, keyed by task ID, with only id, list_id, name and completed for resolving tasks across lists. Full view data is limited to input.items and the selected drawer snapshot. Actions receive only input.item, input.value and input.context, with no task collection or index. Use json.kind(value) to distinguish JSON types. A picker with source="tasks" opens the built-in searchable task chooser; the selected ID becomes the action’s input.value. Lua declares its caption, criteria and action; JS supplies its task choices. A list control renders paired text/action entries. Default views use these for informational dependencies in custom.app_depends_on; dependencies never block completion.
Stored fields & view contract
Items: {id, list_id, revision, fields, custom}. Rows: {item_id, primary={...}, appearance={accent="orange"}}. Drawer: selected_item={item_id,controls={...}}. Lua declares all row and drawer elements. The selected task may be filtered out of the rows. Section titles and row order are also returned by Lua. Views never change stored data; actions return updates. No implicit field rendering or action-label defaults are used.
Available UI elements · JavaScript renderers
The view returns each row’s primary controls and one separate selected_item.controls array for the drawer. It sets every text, label, value, disabled state, and action ID. For example: {kind="button", label="Cycle urgency", action="default-action-cycle-urgency"}. Inputs require an explicit value. No separate UI configuration or label/default inheritance exists. The catalog is also available as data in input.ui.
Action scripts
Action ID:
phases: ["create", "edit"] or either phase. argument: {"type":"none"}; types: none, string, number, boolean, any. Creation requires phase create and type none. These settings do not define task UI.
Contract v1: actions receive input.item, input.value, and input.context (shared calendar: now, time_zone, day_start, today, tomorrow, today_start, tomorrow_start; action fields: phase create/edit, today/tomorrow, source list and owning target_list). Return one update_item command with item_id, expected_revision, registered field changes, or a set_custom object / unset_custom key array for custom data. Use json.null for JSON null, json.object() for an empty object, or json.array() for an empty array. Only name and completed are core fields. Date, urgency, favorite and completed_at are optional custom metadata; their meaning is defined by scripts.
Actions can return {rejected="Explanation"} to display a message without changing the task. Adding/removing dependencies uses ordinary update_item commands; picker selection and list-entry buttons pass the referenced ID as input.value.