Skip to content

Native Org mode

For a first outline, follow Write Org Notes.

An admitted .org file or M-x org-mode uses native Org mode. Source starts fully visible. Visibility controls change only the selected editing view; they also work on read-only text. Folding never changes saved bytes, modification state, regions or undo history.

The control catalog connects all shipped Org capabilities to their commands, context maps, typed defaults and palette roles.

Clocks, timers and reports

Task clocks edit compatible CLOCK records in canonical source. Use org-clock-in, org-clock-out, org-clock-cancel and org-resolve-clocks for explicit tracking and recovery. Clock commands and persistence explain checked switching, completion, recent tasks and opt-in state recovery. Clock totals and reports compare actual intervals with effort and explicitly update clocktable source.

Session timers are independent monotonic state. Relative/paused timers do no periodic work; only an armed countdown owns a wake. Timer insertion is a normal source transaction, while undo does not rewind time. See controls for startup values and all other Org capabilities.

Heading presentation

org-pretty-headings-mode switches the active Org view between configured markers and original stars. org-reset-heading-presentation clears that view's choice and restores org.headings.pretty. Both use M-x or modal colon, including in read-only Org results; neither has a factory shortcut or writes TOML. Feedback is Org headings: source or Org headings: pretty, including reset's effective startup choice. See the heading exercise for a small source/pretty example. A split inherits its source view's choice, then each pane is independent. Buffer switches, edits, undo and reload retain the choice. Prefix cells, point, copy and wrapping stay source-backed; entering the prefix never reveals it automatically. See startup preferences for markers, leading-star visibility, overflow and terminal font ownership.

Visual indentation

org.indent defaults to true. Level-N headings receive N-1 extra visual cells; bodies and heading continuations receive 2N. The added margin is capped at max(0, text width-2); preamble stays unindented, and source tabs keep their original stops. Copy, save, source positions and history never acquire padding.

When disabled, body lines keep their source indentation and pretty headings with hidden leading stars display a single marker at the left margin. No blank star cells remain before that marker. Source presentation keeps the complete literal star prefix. Hidden stars retain canonical positions for keyboard edits and copy; their cursor shares the marker cell, and clicking the marker targets the final star. Changing pretty/source presentation can therefore reflow a plain heading while retaining the same source point.

Use org-indent-mode, org-indent-enable or org-indent-disable through M-x, modal colon or configured editing bindings. The choice belongs to the active Org buffer and all its views, including read-only results. It is independent of per-view pretty headings and buffer-local Visual Line mode, survives edits and reload, suspends in Text mode and is discarded on buffer close. No factory shortcut or TOML write is added. The body alignment exercise shows both layouts; exact controls and configuration describe their lifetime and bounds.

Keys and named commands

Key Command Behavior
TAB org-cycle On a heading, cycle through heading-only, direct child headings and complete subtree. In a drawer, toggle its body.
S-TAB org-shifttab Cycle the whole view through overview, contents and show-all.

Overview shows top-level headings. Contents shows all heading lines and hides their bodies. Show-all restores all source, including drawer bodies. Drawer folding keeps both boundary lines visible. A complete subtree also opens drawers inside it.

M-x provides the same handlers and these direct choices:

Commands Target
org-overview, org-content, org-show-all The selected view.
org-hide-subtree, org-show-children, org-show-subtree The heading at point or containing point.
org-hide-drawer, org-show-drawer, org-toggle-drawer The drawer containing point.

TAB requires a heading line or admitted drawer. Ordinary body text, literal block text and unavailable structural targets report that no target is available. They do not insert text or fold another heading. Plain-text, capture and source editing retain their own TAB binding; a focused prompt retains completion. An active native completion popup takes Tab for acceptance. Native completion covers heading TODO positions/tags, property keys, directives, link types and current-document heading targets; ordinary prose and literal block bodies stay quiet. M-TAB requests immediately in an admitted structural context. The binding reference and configuration sample list the context maps.

Navigation and independent views

Splitting a pane copies its current visibility. Later choices affect only the selected pane. Resize preserves those choices. When explicit folding would hide point, point moves to the visible heading or drawer opener that owns the hidden body.

Vertical, page and wheel motion skip hidden rows. A targeted jump or search reveals the target entry and its ancestor path while retaining unrelated folded entries. C-g during search restores the starting point, scroll and visibility. Logical line numbers and source regions continue to refer to canonical text. Edits, undo and redo release obsolete visibility choices in affected views.

Pending observations

A command can briefly report a pending structural observation; editing remains available. C-g cancels its owned request. Moving to another view, changing source or opening another interaction prevents that request from folding a later state. Visibility works with syntax coloring disabled and with NO_COLOR.

An incomplete observation rejects folding and keeps source readable. At most 4096 heading/drawer records participate, within the ordinary native Org source observation limits. org-show-all remains available without an observation.

Heading insertion and motion

Key Command Behavior
M-RET org-meta-return Insert a heading in ordinary heading/paragraph context.
C-c C-n org-next-visible-heading Visit the next visible heading.
C-c C-p org-previous-visible-heading Visit the previous visible heading.
C-c C-f org-forward-heading-same-level Visit the next sibling, skipping descendants.
C-c C-b org-backward-heading-same-level Visit the previous sibling, skipping descendants.
C-c C-u org-up-heading-safe Visit the parent heading.

M-x exposes every name above and org-insert-heading, which uses the same insertion handler. A new heading has the current heading's level, or level one before the first heading. At the start of a heading, insertion creates a heading above it. In a title or paragraph, insertion splits at point; at a paragraph start it prefixes the existing line. Following section text remains after the new heading. Drawers, blocks, descendants and blank separators retain their original bytes and order. BOM, LF/CRLF and final-newline presence are preserved. Point stays on the new title. Insertion is one ordinary undo/redo operation.

org-insert-heading reports unavailability in lists, tables, drawers and literal bodies. M-RET selects list continuation in an admitted item; other unsupported deeper contexts retain their source ownership. C-g can cancel an observation request before insertion, just as for visibility commands.

Heading motion also works on read-only source and never creates history. Next/previous motion skips folded headings even outside the viewport. Same-level motion stops at a parent boundary; parent motion visits the nearest structural parent, including skipped numerical levels. These targeted moves use ordinary hierarchy reveal. A missing target reports unavailability and keeps the view.

Subtree editing

Key Command Behavior
M-Left in heading context org-metaleft Remove one star from the heading and every descendant.
M-Right in heading context org-metaright Add one star to the heading and every descendant.
M-Up in heading context org-metaup Move the complete subtree before its previous sibling.
M-Down in heading context org-metadown Move the complete subtree after its next sibling.

The explicit M-x names org-promote-subtree, org-demote-subtree, org-move-subtree-up and org-move-subtree-down retain heading-only ownership. Meta-arrow names select actual list context before these heading handlers. Point can be on the heading or in its ordinary section text. A list, table, drawer, literal block or other deeper context keeps its own ownership and reports that the subtree edit is unavailable there.

Demotion requires a preceding sibling to become the new parent. Promotion rejects level one. Movement stops at parent boundaries. Missing parent levels, unclosed owned/parent structures, incomplete observations and levels beyond 256 reject the whole operation. Malformed source outside the affected ownership remains intact. Read-only buffers reject every subtree mutation.

A linear region may cover one or more complete adjacent sibling subtrees with the same parent and level. Both endpoints must match those ownership boundaries. Partial, empty or rectangular regions reject; descendants are never detached.

Only heading stars change during promotion/demotion. Movement retains drawers, blocks, table metadata, unknown directives and blank separators with their subtree. At an unterminated EOF, the existing separator run remains between the reordered subtrees; no newline bytes are invented. BOM, LF/CRLF and final-newline presence remain intact.

Stored marks, peer points and viewport anchors follow canonical source fragments. A boundary at a heading start follows that heading; an unterminated line end follows that line. One undo/redo reverses the complete operation and restores the initiating point, while peers map from their current positions. As with ordinary edits, publication releases active selection and obsolete folds in affected views.

Lists and checkbox progress

Key Command Behavior in an admitted list
M-RET org-meta-return Split or continue an item, retaining its marker/description form.
M-Left / M-Right org-metaleft / org-metaright Outdent/indent the item and continuation text, leaving nested items in place.
M-S-Left / M-S-Right org-outdent-item-tree / org-indent-item-tree Change indentation with complete nested source.
M-Up / M-Down org-metaup / org-metadown Exchange complete adjacent items and renumber ordered siblings.
M-S-RET org-insert-item-checkbox Insert a new unchecked checkbox item.
C-c C-c org-ctrl-c-ctrl-c Edit heading tags, or toggle an existing checkbox and verify current list numbering in list context.
C-c C-x C-b org-toggle-checkbox Toggle the current checkbox, selected checkboxes, or the current heading section.
C-c C-x C-r org-toggle-radio-button Select a checkbox and clear same-level radio peers.
C-c # org-update-statistics-cookies Refresh existing item/heading fraction and percentage cookies.

M-x also provides org-insert-item, org-indent-item, org-outdent-item, org-move-item-up, org-move-item-down, org-renumber-list and org-toggle-checkbox-presence. Presence adds/removes checkboxes explicitly; factory description items reject adding them. Existing checkbox text in a description item remains actionable. Ordinary drawers may contain real lists; literal example/source blocks and table cells never become list targets.

Ordered markers retain period/parenthesis spelling and explicit [@N] resets. Decimal counters do not overflow a machine integer; generated counters share the finite native source byte budget. Description continuation creates an empty term, including existing relative-timer description spelling, without arming a timer or inventing elapsed time. New checkbox items start unchecked unless their existing nested children determine a derived state.

Ordinary outdent rejects detaching children. Use the tree command for that operation. The first outermost tree command shifts the whole list by one column; ordinary first-item indentation and nested first-item demotion require a real preceding item. Promoting a nested item adopts the following source siblings. Structural list commands require an unselected item. Checkbox operations accept linear regions in either direction and use the first selected checkbox's new state; rectangles reject. Read-only, incomplete and unclosed current-entry observations reject before publication.

Checkbox parents reflect direct children as [ ], [-] or [X]. Existing [/] and [%] cookies update as fractions or integer percentages. A heading normally counts its direct checkboxes, or direct TODO/DONE child headings when no checkbox count applies. Local COOKIE_DATA: todo or COOKIE_DATA: checkbox selects that source explicitly. Local ORDERED: t blocks newly completing a checkbox before an unfinished predecessor. #+ATTR_ORG: :radio t applies radio choice to its list; hierarchy still derives parent states from child checkboxes.

A list edit and its parent/cookie changes undo as one operation. Untouched source, BOM, line endings and EOF spelling remain intact. Moves retain source anchors in shared panes, including outside a list whose counter widths changed. At most 8192 item/list/heading records and 4096 statistics cookies participate in this bounded derived model. Other entries' cookie spelling stays untouched.

The Org list reference and checkbox reference describe the corresponding source forms and familiar interactions.

Properties and source owners

C-c C-x p and M-x org-set-property prompt for a name and local value. New drawers follow the heading and its planning line. Before the first heading, they precede non-comment content. Existing key spelling, indentation, unknown properties and surrounding source remain intact. Names are case-insensitive; new names use uppercase. Append + to add a value without replacing its base.

org-delete-property removes only the named local base; a name ending in + removes its local additions. It preserves ancestors, file declarations and the other form. Removing the final field retains the empty drawer. org-inspect-property shows the effective value and source line for each local, inherited or file contribution. Derived fields such as ITEM, TODO, PRIORITY, TAGS and FILE are identified as derived and cannot be stored through these commands.

org-edit-property-owner explicitly edits an effective source contribution. It identifies the source line before asking for a value. When there are several contributions, select their 1-based number first. This action can edit an ancestor or a file directive; ordinary local set/delete never silently changes that owner. One accepted edit forms one undo group and maps shared views through canonical source. C-g cancels either prompt without changing the document.

Factory property inheritance is off. Set org.properties.inherit = ["PROJECT", "CUSTOM"] to inherit only those stored names, including file defaults. A local base wins over the nearest ancestor, then the file drawer and #+PROPERTY: declarations. Local NAME+ lines extend the selected inherited base. A nil value stops the search and represents an explicitly undefined value. File #+PROPERTY: NAME value declarations apply in source order; a later base resets its earlier file additions. A file drawer base overrides file declarations. Recognized keywords change data semantics only. They cannot alter inheritance policy, editor configuration or process authority, and keywords inside literal or nested forms do not become file property defaults.

Names are 1..128 UTF-8 bytes without whitespace, colons or interior +. Inheritance accepts at most 128 unique stored names; an empty array replaces an included array and disables inheritance. Property prompts use the existing minibuffer input limit. The observation retains at most 4096 source entries and 8192 stored/declaration records. Incomplete observations, ambiguous duplicate local bases, malformed metadata, literal/deeper contexts and read-only mutation reject before publication. Inspection does not insert inherited text. Existing ordinary and property drawers fold independently through the drawer commands.

Tags and membership

C-c C-q, M-x org-set-tags-command and C-c C-c on an actual heading replace that heading's local tags. Enter colon-separated, comma-separated or space-separated names. Empty input clears local tags. Names are case-sensitive; Work and work remain distinct. Each name permits letters, numbers, _, @, # and %, up to 128 UTF-8 bytes. Each heading admits at most 128 local names. Duplicate entered names are collapsed without changing their order. The edit replaces only the suffix: existing title spacing, unknown source, line endings and EOF spelling remain intact. A new suffix uses two spaces before its colons.

org-remove-tag removes one exact local name and leaves inherited owners alone. org-inspect-tags identifies local, ancestor and FILETAGS source lines. Factory org.tags.inherit = true includes ancestors and file membership; false selects local tags only. Inheritance never inserts text. Tab completes case-sensitive names from observed tags and direct #+TAGS: declarations, extending their common prefix and showing up to 16 candidates. Completion changes only the prompt. Return publishes one checked undo group; C-g cancels without publication.

The observation retains at most 4096 heading records, 8192 tag/candidate occurrences and 8192 metadata contexts. Incomplete observations and invalid or excessive suffixes reject. Literal/deeper contexts do not fall through to an ancestor tag action. Read-only source admits inspection and matching but rejects tag mutation. Prompt acceptance rechecks its originating view and source revision.

Tag and property matches

M-x org-match-tags prompts for an expression and reports whether the current heading matches. It uses that heading's actual effective tags, configured inherited properties and source task declarations. Matching changes neither text nor history.

The native data grammar uses & for AND, | for OR and leading - or ! for NOT. Leading + selects positively; subsequent + or - implies AND. AND binds more strongly than OR; parentheses group expressions. For example, (Work|home)+urgent-boss selects an urgent heading with Work or home membership and excludes boss. Tag and TODO state spelling remains case-sensitive.

Property comparisons use =, ==, <>, !=, /=, <, <=, > and >=. Property names are case-insensitive. Bare finite numbers use numerical comparison; double-quoted literals use case-sensitive string ordering. Signs, decimal points and exponents are admitted in numbers. Missing numeric/string values compare as zero/empty text; append * to the operator to require a present value instead, as in EFFORT<*2. Invalid or non-finite stored numbers do not match numerical comparisons. Strings admit \", \\, \n, \r and \t escapes; unknown escapes reject. Backslashes escape punctuation in property names, for example OWNER\-ROLE="lead". Unknown stored property names remain data.

Derived TODO, LEVEL, PRIORITY, ITEM, TAGS and ALLTAGS values come from the actual heading and effective membership. A suffix /WAITING|NEXT applies a separate Boolean expression to TODO states; /! additionally requires an unfinished task. Work/!-WAITING selects unfinished Work tasks outside WAITING. Factory states are TODO/DONE; direct TODO/SEQ_TODO/TYP_TODO data declarations identify configured states for matching. Task keywords retain their own punctuation rules; escape punctuation in a TODO suffix, as in /NEXT\-ACTION. Their fast-key/log annotations do not execute anything.

Compilation admits at most 4096 UTF-8 bytes, 32 nested forms and 512 nodes. Evaluation is iterative, with at most 8192 tag and 512 property records and a 1048576-byte temporary metadata projection. Regexp/function forms are not scalar comparison operands; they reject rather than being evaluated as code. Malformed syntax, unsupported operators and excess input reject with a source-byte location. There is no Lisp, predicate callback or external process evaluation.

Task workflows and logs

C-c C-t and M-x org-todo use the same native task transition. With no fast keys they cycle the current sequence through its states and then unmarked. With declared selection keys they open a state prompt; enter the key or full keyword and Return. org-todo-set always opens that prompt; empty or - clears the state. org-todo-next and org-todo-previous cycle without selection. org-inspect-todo reports the current recognized state and available choices, including on read-only source. Unknown leading words remain ordinary title text.

Typed org.todo.sequence and org.todo.finished default to TODO/DONE with DONE finished. File-local TODO, SEQ_TODO and TYP_TODO declarations replace that workflow. Each declaration has a separate sequence; | begins its finished states, or the last state is finished when no separator appears. There are at most 64 unique keywords across the file, each 1..128 UTF-8 bytes without whitespace, controls, |, ( or ). Duplicate keys/keywords and malformed annotations reject editing and matching before mutation.

For example, #+TODO: TODO(t) WAIT(w@/!) | DONE(d!) selects keys and state logging. ! requests a timestamp and @ a one-line note, with / selecting logging on departure. Entry logging takes precedence over departure logging. org.todo.log_done = true additionally records CLOSED on completion; factory ordinary completion logging is off. A state note can be empty to record only time. C-g cancels every pending part of the transition.

The inherited LOGGING property resets the default logging policy and annotations when nonempty. Supported data tokens are nil, logdone, lognotedone and annotations on declared keywords, such as WAIT(!) or DONE(@). Unsupported tokens reject before mutation. State notes use normal source placement after planning/properties by default. org.todo.log_drawer selects an explicit drawer; inherited LOG_INTO_DRAWER overrides it with a drawer name, nil for normal placement or t for LOGBOOK. Existing selected drawers receive newest entries first; unrelated drawers retain their contents.

org.todo.block_children optionally blocks completion while a descendant task is unfinished. An ORDERED parent additionally requires earlier sibling tasks to finish. Local NOBLOCKING=t exempts an entry. The refusal explains the condition before any state, log or history changes.

A checked transaction publishes the keyword, selected CLOSED/state log/note and applicable immediate-parent TODO progress cookies together. COOKIE_DATA selects TODO or checkbox ownership as before. Priorities, tags, unrelated planning and properties stay intact. Reopening removes CLOSED and preserves an adjacent property drawer's ownership. Undo/redo restore the entire transaction and shared source anchors. Deeper literal/list contexts never fall through to an ancestor task action; drafts recheck their originating view, source and read-only state.

Logging captures local time once before opening its note prompt. The session reads at most 1 MiB from the local TZif file; TZ can select UTC or a TZif zone name/absolute path. Leap-aware, malformed, unsupported or uncovered local time rejects before publication. No source directive can execute code or select a process, and task logging invokes no external date command.

Priorities and effort estimates

C-c , (org-priority) prompts for a priority character; empty input or a space removes the explicit cookie. Away from timestamps, S-Up and S-Down cycle through the admitted range and unmarked. Up from an unmarked heading inserts the lowest priority; down inserts the highest. Passing an endpoint removes the cookie. org-inspect-priority identifies an explicit value or the implicit default without inserting text. The priority fallback acts on the current heading, including plain headings without task keywords; deeper literal/list contexts reject.

The single-character native range uses uppercase A-Z. Startup org.priority.highest, lowest and default are A, C and B, with highest <= default <= lowest. Direct #+PRIORITIES: D F E data overrides that buffer's range. Malformed declarations or unsupported existing cookies reject before mutation. Priority insertion follows an actual recognized task keyword; unknown words remain title text. Task transitions preserve cookies. Derived PRIORITY matching sees the effective default while ITEM excludes only actual state/cookie prefixes.

C-c C-x e (org-set-effort) edits the current heading's local EFFORT property. Enter a nonnegative decimal number of minutes, integer H:MM/H:MM:SS, or unit components such as 1d3h5min, 1.5h or 1 h 2min. Values remain in their entered spelling, including fractional work units; they are not normalized on storage. Empty input removes the local base estimate. org-inspect-effort shows source spelling and elapsed minutes, honoring only selected EFFORT inheritance. Ordinary set/delete never silently rewrites an inherited owner.

EFFORT_ALL properties/declarations supply up to 64 validated choices through explicit source inheritance. Tab completes a unique choice; free duration entry remains available. org-inc-effort cycles those choices, retaining their source spelling. The factory has no implicit allowed-value list; cycling without a list reports that condition without changing source.

Duration entry is bounded to 128 UTF-8 bytes and 32 components. Signed values, scientific notation, unknown units, fractional colon components and non-finite results reject the whole edit. Typed positive finite scales under org.duration.units default to min=1, h=60, d=1440, w=10080, m=43200 and y=525960 elapsed minutes. Colon forms retain canonical hour/minute/second arithmetic. Work-unit scales do not perform calendar scheduling and source directives cannot alter them or execute programs.

All edits use the existing checked transaction and history owner. Priority edits replace only their cookie; effort edits replace only the owned property value or record, preserving key case, indentation, tags, planning, unknown metadata, BOM/line endings and unrelated EOF spelling. Undo restores the whole operation and independently mapped peer points. C-g cancels drafts; changed source/view qualifiers and read-only mutations reject. Read-only inspection stays usable.

The agenda role admits e/comma for these same operational source handlers. Agenda row construction and checked source-row routing are defined by the agenda owner; adding a keymap does not create a report or a task copy.

Operation time zones

org.time.zone defaults to local: capture TZ once, or use the system localtime file when it is unset. system always selects system localtime. UTC and relative IANA names such as Europe/Paris override TZ. Named data is validated when an operation is selected; an unknown or unreadable zone reports an error before source changes. Task logging uses this policy and retains its one timestamp through note entry. The next operation observes external zone changes; an already captured operation retains its original date and rules.

Local TZ accepts named zones, absolute TZif paths and explicit POSIX rules. An empty value selects UTC. POSIX daylight zones require explicit start/end rules instead of an implementation-defined fallback. Native code evaluates TZif v1/v2/v3/v4 and available future footer rules, without an external process, FFI or a permanent watcher. Unknown -00 records, missing future coverage, malformed data and leap-second TZif files report errors under the Unix-time profile. These outcomes do not alter source.

org.time.ambiguous and org.time.nonexistent admit prompt. The time API returns every valid offset for a repeated local time; callers must select an observed offset. A forward gap requires a valid replacement local time. Forcing an invalid offset cannot create a result. Civil shifts remain separate from elapsed instant subtraction and configured work-duration units.

Each observation reads at most 1 MiB from a regular file and admits at most 65536 transitions, 256 types, 4096 designation bytes, 1024 POSIX bytes and 64 abbreviation bytes. Offsets are bounded to 24 hours. Future recurrence examines at most eight events per lookup; local resolution checks at most 258 candidate offsets against that same observation. A blocked filesystem operation has no hard kernel deadline; there is no idle polling or unbounded recurrence expansion.

Timestamp entry

C-c . and C-c ! open a native date prompt for active <...> and inactive [...] timestamps. At an existing timestamp, they edit its checked source range. The calendar shows three months when 88 columns fit and one month on narrower surfaces; small surfaces clip it. Navigation and mouse selection retain the canonical source point. Enter publishes one undoable edit; C-g discards every stage. C-c > inspects the calendar without editing; after accepting a date, C-c < inserts that retained date at point. Calendar inspection works read-only.

Empty input retains the current timestamp. Input accepts ISO dates, short 3-2-5 or 2/5/3 dates, day numbers, English month/weekday names, and ISO week dates such as 2012-w04-5. An omitted month/year prefers the next matching date relative to the captured current date. Short years use the captured current century's 30-year future window; four-digit source years remain explicit within 0001..9999. . selects the captured current date. A single +/- shifts from that date; ++/-- shifts from the prompt default. Units are h/d/w/m/y; a missing unit means days. Relative weekday forms such as +2tue select later occurrences, while -Tue selects the previous one. No host time is reread while typing.

Times accept 12:45, 11am, 13h15, compact 22sept0:34, and clock ranges such as 11am-1:15pm or 11am+2:15. A clock range crossing midnight carries its end to the next civil day. Date ranges accept 2024-02-29--2024-03-02 or complete <...>--<...> forms. Editing the end checks the complete observed range. Weekday spelling, whitespace, clocks and repeat/warning suffixes remain exact when their fields are untouched. A changed date receives its correct English weekday. Date entry validates suffix syntax without advancing recurrence.

C-c C-s and C-c C-d edit the current heading's SCHEDULED and DEADLINE facts. They preserve adjacent CLOSED/planning facts, drawers, body text and line endings. New planning lines follow their heading and retain an unterminated EOF. Malformed/duplicate facts and unavailable structural contexts reject without falling through to a different heading. Every publication rechecks its original buffer revision, selected view and read-only state.

One org.time zone observation belongs to the entire operation. Repeated local times prompt for a 1-based choice among observed UTC offsets; invalid choices retain the prompt. Missing local times return to date entry for an explicit replacement. A selected range must be ordered in the captured zone. Source remains an Org civil timestamp; choosing an offset does not add a zone directive. Invalid dates, unknown words, controls and overlong drafts cannot insert text. Free date entry is bounded to 256 UTF-8 bytes, complete timestamp ranges to 514, and source observation to one logical line of at most 4096 bytes. The calendar projects at most three fixed six-week grids and owns no editable document.

S-Up/S-Down adjust the timestamp field under point; at a bracket they toggle the connected range's active status. S-Right/S-Left change its date by one day. The named org-timestamp-up, org-timestamp-down, org-timestamp-up-day and org-timestamp-down-day require a timestamp instead of selecting a heading fallback. The first clock adjustment retains the block's civil length by moving its end equally; end-clock adjustment changes only the length. Untouched hour, weekday and suffix spelling stay exact. Point remains in the same field when weekday or hour spelling changes width. Civil month/year field adjustment uses excess-day normalization, independently of the calendar picker's clamping.

C-c C-c repairs the selected timestamp's weekday without changing its date, clock or suffixes. When no timestamp owns point, it retains heading-tag and checkbox actions. S-Up/Down retain priority fallback; S-Right/Left change task state only on the current heading, including its unterminated EOF. Literal blocks/comments never route to an ancestor heading through these actions.

Invoking the same timestamp command again immediately after a new insertion prompts for the range's end. That prompt owns a fresh source-qualified operation; accepting it validates the whole range and publishes one undoable replacement. Canceling it retains the first timestamp. Intervening editing, movement, window commands or cancellation retire the successive-command anchor. M-x entry alone does not retire it. A saved anchor cannot authorize an edit after a revision or selected-view change.

Repeating task completion

Completing an active repeating task with the ordinary task controls advances its own repeated timestamps and resets its state. +N advances once from the stored base, ++N advances whole intervals until future, and .+N advances from completion. Counts use calendar h/d/w/m/y units. Monthly/yearly excess days normalize as timestamp adjustments do. An hourly repeater requires a clock; hourly restart uses the captured completion minute, while larger units retain the source clock. Timed catch-up may select a later time today.

Only active timestamps in the selected heading's own section participate. Inactive timestamps, literal blocks and child entries remain unchanged. Connected date-range endpoints repeat independently; a resulting inverted range rejects the entire transition. Ordinary warning/delay -N cookies remain, while first-only --N delays disappear after repetition. Habit interval maxima such as .+2d/3d retain calendar units and cannot precede their minimum. Deadline warning boundaries precede the date; scheduled display delays follow it.

The reset state is the first unfinished state in the selected workflow sequence. A local REPEAT_TO_STATE property can select another declared keyword. Completion removes obsolete CLOSED and non-repeating SCHEDULED facts, advances each participating timestamp, records selected history and LAST_REPEAT, and updates parent progress from the reset state. All source changes form one undo unit. Two explicit backlog completions on one day remain two actual history events.

org.todo.log_repeat defaults to "time"; "none" suppresses repeat history and LAST_REPEAT, and "note" requests a cancellable one-line note. Existing state logging annotations still apply. #+STARTUP: logrepeat, lognoterepeat and nologrepeat override the preference. Local/inherited LOGGING can select the same choices or use nil to disable logging. LOG_INTO_DRAWER and the configured log drawer retain their ordinary source ownership.

Completion captures its clock and zone once before offset or note input. Every next local-time endpoint must resolve: repeated local times require an observed offset; missing times request a valid date/time. Correction retains active status, cookies and clock/range fields. Cancellation or a changed source revision rejects the complete transition. No query advances source dates.

One completion observes at most 262144 UTF-8 bytes in its own entry and 64 repeating timestamp ranges. Individual timestamp/range and logical-line bounds remain 256/514/4096 bytes. Fixed-unit catch-up skips backlog arithmetically; calendar normalization has a finite 4800-step bound before a safe calendar jump. Exhausted bounds, unavailable zone data, malformed metadata and read-only source report a diagnostic before publication. No recurrence worker or idle timer is added.

Habit schedules and history

An unfinished task with local :STYLE: habit and one active repeating SCHEDULED timestamp is a native habit. Use ordinary task state commands to complete it. .+2d/3d permits completion after two days and reaches its maximum interval after three. + retains backlog and ++ catches up; .+ restarts from completion. Daily, weekly, monthly and yearly units retain calendar arithmetic. An explicit maximum must exceed the minimum. An hourly period, missing repeat or finished REPEAT_TO_STATE rejects the full transition.

Completion retains existing compatible logs, updates selected history and LAST_REPEAT, reschedules, and resets to an unfinished task in one undo step. File-local TODO keywords, STARTUP repeat logging, LOGGING and LOG_INTO_DRAWER keep their ordinary authority. Disabling logging adds no history; it does not erase old observations. Literal examples and child entries do not contribute to the selected habit's history. Multiple actual completions on one day remain separate events. LAST_REPEAT alone does not prove a completion; malformed history remains unresolved, and an unrecorded day is not an invented failure.

org.time.extend_today_until sets the Org day boundary to a local hour 0..23, with midnight as default. Before that hour, date-only habit recurrence uses the previous Org date. Timed repeats and completion logs retain actual captured local time. No elapsed duration or time-zone offset is inferred from the day boundary. Habit observation reads current canonical source, including unsaved text, with no edits or idle work. Its limits are 262144 entry bytes, 4096 completion records and 4096 bytes per history line. Graphs open with C-c C-x h or org-habit-show-graph.

Behavior reference: Org habit tracking.

Habit consistency graphs

Open the selected buffer's native habit agenda with C-c C-x h. It reads current canonical text, including unsaved or read-only source, and displays bounded graphs without creating an editable agenda document. g explicitly refreshes source and captured local date. A stale source label remains until refresh; repainting does not rerun graph analysis or read the clock.

K toggles visibility; C-u K toggles today-only display; A includes all habits on today's agenda, including those not yet scheduled. d selects a view date (YYYY-MM-DD or today); graphs stay relative to the captured effective today. G accepts three unsigned integers: preceding days, following days and preferred column. Invalid entry preserves the current policy and allows correction; C-g cancels input. q or C-g returns from the agenda to the unchanged source view. Up/Down scroll graph rows. Text, paste, pointer and source-edit commands cannot mutate the document through this read-only viewport.

Factory preferences are 21 preceding days, 7 following days, column 40, today-only true, all-today false and done-always-green false. Each side permits 0..366 days; column permits 0..4096. Narrow panes clip whole glyphs and retain today. Four semantic states use . before due, + available, ? imminent and - overdue; actual completions use *, and today uses ! when not completed. These markers remain readable with NO_COLOR. Eight configurable palette.org.habit_* backgrounds distinguish past/future states. Past unmarked non-overdue days use the subdued future background, preserving the difference between availability and an actual completion. Late completions retain overdue color unless explicitly configured always green.

One selected-buffer agenda admits 128 habit rows, each with the existing entry and history bounds. Exceeding the row count diagnoses an incomplete request before replacing the current view. The shared native worker owns graph work and cancellation; inactive agendas create no additional polling or source changes.

Refile and copy

Use C-c C-w to move complete subtrees or C-c M-w to copy them to an explicitly selected heading. See Org files for source selection, coherent publication and ordinary per-file saves.

Use C-c l to store a checked location, C-c C-l to insert or edit a link, and C-c C-o to follow it. See Org links for admitted targets, source checks and return navigation.

Use C-c C-a for the attachment dispatcher, including checked copy/move/hard-link, listing and opening.

Source block editing and header resolution: Org source blocks.