DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS /// DOCS
PAGES·OVERVIEW

Pages

A Page is a rich-text document that lives in your workspace. You write with headings, lists, code blocks, callouts, and more. You can also embed references to any other entity in the workspace — a table, a task, a bot, a team member — and those references stay live: click one to open the entity's panel.

Pages are stored as both a TipTap JSON document (content) and a markdown mirror (content_text). The markdown mirror is what Onnie AI reads when it uses a page as context.


What a Page is

A Page has a name, an optional description, an optional icon, and an optional cover image. It sits inside a workspace and can optionally belong to a project and a parent page. The hierarchy is tree-shaped with no depth limit, though the database enforces a 50-step circular-reference guard.

Key schema facts:

  • alias_id — a 12-char base64 token auto-generated from the row UUID by the set_alias_id() trigger. It doubles as the public URL slug when is_public is true.
  • is_public — when true, anonymous (unauthenticated) users can read the page.
  • content — TipTap JSON document (jsonb).
  • content_text — markdown mirror kept in sync at every save. This is the string Onnie AI ingests.

Pages can be nested under a parent_page_id. A page can also belong to a project_id; project membership is independent of the folder tree.


Blocks

The page editor (PageEditor) is built on TipTap and supports a set of block types you insert with the / slash-command menu:

  • Headings (H1–H3)
  • Paragraphs
  • Bullet lists and numbered lists
  • Task lists (checkbox items)
  • Callout blocks (info / warning / success / error)
  • Code blocks with syntax highlighting
  • Images (embedded by URL)
  • Horizontal dividers
  • Two-column layouts
  • Hyperlinks (inline mark)
  • Embeds — six live-data blocks: table, record, routine, gallery, export, form

See Blocks and references for the standard block types and inline reference pills. See Embeds for the live-data embed blocks.


References inside Pages

Type @ anywhere in a page body to open the reference picker. Select any entity and an inline reference pill lands in the text. The pill shows the entity's icon and name, and clicking it opens the entity's panel.

The wire format is:

[Display Name](ref:entity_type:uuid/alias_id)

Valid entity types include table, page, task, engine_bot, routine, function, skill, record, project, user, team, folder, and variable.

See Blocks and references for the full entity-type table, rendering behavior, and what happens when a referenced entity is deleted.


Sharing

By default a page is workspace-private: only authenticated members with workspace access can read it. Turning on the public link (is_public = true) lets anyone with the URL read the page without signing in.

You toggle this from the Share button in the page panel's action bar. When public, the URL follows the pattern /<workspaceAliasId>/p/<pageAliasId>, and visitors see a clean reader view with optional workspace header, cover image, and a conversion footer. Embeds remain live on the public surface — table previews show real data, gallery tiles link to other public pages, form embeds accept anonymous submissions, and routine embeds let visitors trigger runs after providing their email.

See Sharing and publishing for the toggle, branding controls, public form submissions, and public routine runs.


Pages and the rest of Onnie

Onnie AI can read Pages as context via the explore_pages tool. When a bot calls this tool, it reads the content_text field of the pages you've written. The markdown mirror is kept current at every save, so the AI always sees the latest content. Pages aren't passively injected into the AI's context — they're fetched on demand.

Pages appear in the reference picker on supported surfaces. Any surface in Onnie that renders an editor with a configured reference-type list — chat messages, skill content — can reference a page with @. Task bodies do not currently enable the reference picker.