# Embed a kit UI in your own page **Page:** guides/embed-urls [Download Raw Markdown](./guides/embed-urls.md) --- # Embed a kit UI in your own page Every kit with a browser UI serves it at a URL on the container. This guide covers building that URL for one specific view with the options you want, such as a file open in the editor, a terminal in read-only mode, or one table in the database studio, and framing it in your own page. The SDK, the CLI and plain HTTP build the same URL from one published catalog, so a URL built in one place opens the same view as a URL built in another. Embedding a URL shares it. A new container's URLs are reachable by anyone who has them: the two 24-character IDs in the hostname are the credential. Anyone who can view your page can read the frame's address, and on an open container that address also reaches every other service of that container. Set proxy permissions, or front the view with an alias, before you embed it for other people. --- ## Build a URL A view is one page of a kit UI, named `.`: `files.editor`, `terminal.session`, `sqlite.tables`. Each kit has a default view, used when you name the kit only. The [view reference](#view-reference) at the end of this page lists every view with its parameters. ```typescript import { HoodyClient } from 'hoody-sdk'; const hoody = await HoodyClient.login('https://api.hoody.com', { username, password }); const { data: container } = await hoody.api.containers.get(containerId); if (!container?.id || !container.project_id) throw new Error('Container not found'); // One function per view: client.embeds..(container, options) const editor = hoody.embeds.files.editor( { ...container, id: container.id, project_id: container.project_id }, { params: { path: '/home/user/app/server.ts' } }, ); // https://PROJECT_ID-CONTAINER_ID-files-1.SERVER.containers.hoody.com/home/user/app/server.ts?edit= // On a withContainer() client the container can be left out. const box = await hoody.withContainer(containerId); const terminal = box.embeds.terminal.session(undefined, { index: 2, params: { readonly: true, fontSize: 14 } }); // https://PROJECT_ID-CONTAINER_ID-terminal-2.SERVER.containers.hoody.com/?readonly=true&fontSize=14 // By kit name, for views chosen at run time. const table = box.embeds.url('sqlite', undefined, { view: 'tables', params: { table: 'users' } }); // https://PROJECT_ID-CONTAINER_ID-sqlite-1.SERVER.containers.hoody.com/tables?table=users ``` `buildEmbedUrl(kit, container, options)` builds the same URL without a client, from the fields a hoody-api container response carries (`id`, `project_id`, `server_name`). `box.embeds.views('files')` lists a kit's view names, default first, and `box.embeds.catalog()` returns the whole construction catalog. Both entry points of the package, Node and browser, export these functions. ```bash # Open the editor view in your browser. hoody files open --container "$CONTAINER_ID" --view editor --path /home/user/app/server.ts # Print the URL instead of opening it. hoody terminal open 2 --container "$CONTAINER_ID" --readonly --font-size 14 --url # Every kit with a UI has an open command; its help lists the views and flags. hoody db open --help ``` The positional number is the instance index, as in the SDK's `index` option. `--url` prints the URL and opens and starts nothing. ```bash # The construction catalog: host rule, domain rule, and every view with its parameters. curl -s https://docs.hoody.com/embeds/catalog.v1.json | jq '.views["files.editor"]' # The three container fields the host is built from. curl -s "https://api.hoody.com/api/v1/containers/$CONTAINER_ID" \ -H "Authorization: Bearer $HOODY_TOKEN" | jq '.data | {id, project_id, server_name}' ``` With those fields, fill the catalog's host template and the view's path, then append the query parameters in the order the catalog's `serialization` section gives. The catalog also ships inside the SDK package, at `generated/embeds.catalog.v1.json`, versioned with the SDK. ## URL shape Every embed URL has the form of any other service URL on the container: ``` https://{projectId}-{containerId}-{segment}.{serverName}.{containersDomain}{path}?{query} ``` - `segment` is the service and its instance number, such as `files-1` or `terminal-2`. The number is 1 or more and has an upper bound per service, which the catalog publishes. An index outside the bounds is refused; it is never rounded to the nearest valid one. - `containersDomain` comes from the API base URL: `https://api.hoody.com` gives `containers.hoody.com`, and `https://api.hoody.com` gives `containers.hoody.com`. The catalog's `domain` section lists every rule in order. - `path` is the view's path, with path parameters encoded as the catalog states. A file path keeps its slashes and percent-encodes each segment. - The query holds only parameters the view accepts. Booleans are `true` or `false`, and a flag such as `edit` is sent as `edit=`. A DNS label holds at most 63 characters. With 24-character project and container IDs, a terminal number above 9999 makes the first label 64 characters long, so the SDK refuses it with `HOST_LABEL_TOO_LONG`. ## Parameters an embed URL never carries For a kit's own views, the builders refuse three kinds of parameter the kit itself would read: - **Credentials and sign-in state**, such as tokens, passwords and SSH or proxy credentials. Sign-in pages are not embed views. - **Parameters that change state**, such as a command for the terminal to run, a startup script, a restart, or a download trigger. Use the kit's HTTP API for those, where the request is explicit. - **Parameters the platform sets itself**, such as the terminal or display number, which the hostname already selects. Three views are outside these rules. `http.content` and `https.content` show your own application, so the builder passes any query you give it, credentials included. `exec.script` runs your script when the URL is opened and hands it every query parameter. Opening some other views also starts something, such as a shell, a desktop or the editor, or starts receiving on a pipe; the reference marks them with "starts a process" or "changes state". Each refusal is an error with a code, never a silently dropped parameter: ```typescript box.embeds.url('terminal', undefined, { query: { cmd: 'ls' } }); // EmbedValidationError: PARAM_EXCLUDED: cmd cannot be set in an embed URL (mutating) ``` The view reference lists the refused parameters of each kit with the reason. In the SDK the error is `EmbedValidationError`, and its `code` is one of the values below. | Code | Meaning | |---|---| | `KIT_UNKNOWN`, `VIEW_UNKNOWN` | The kit or view name is not in the catalog. | | `KIT_NOT_BUILDABLE` | The kit has no browser UI to embed. | | `INDEX_OUT_OF_RANGE`, `INDEX_NOT_SUPPORTED`, `PORT_INVALID` | The instance number or port is outside what the service accepts. | | `HOST_LABEL_TOO_LONG` | The first hostname label would be longer than 63 characters. | | `TARGET_INVALID` | The container fields are missing or cannot form a hostname. | | `LOCAL_REFUSED` | A local URL was requested. Several kit UIs only work at the root of their host. | | `PARAM_EXCLUDED`, `PARAM_FORCED`, `PARAM_NON_UI`, `PARAM_DEAD` | The parameter is a credential, changes state, is set by the platform, is not a UI parameter, or has no effect. | | `PARAM_UNKNOWN`, `PARAM_NOT_ON_VIEW`, `PARAM_NOT_TYPED`, `QUERY_NOT_PASSTHROUGH` | The parameter is not accepted by this view, or not in the form given. | | `REQUIRED_MISSING`, `VALUE_INVALID`, `PATH_INVALID` | A required parameter is missing, or a value is outside its allowed values or pattern. | | `DUPLICATE_KEY`, `CONST_OVERRIDE` | A key was given twice, or a fixed value of the view was overridden. | | `ALIAS_URL_MISSING`, `ALIAS_MISMATCH`, `ALIAS_VIEW_UNSUPPORTED`, `ALIAS_TARGET_PATH_CONFLICT` | The alias cannot serve this view (see below). | ## Frame a view ```html ``` On kit UI pages the proxy sends `Content-Security-Policy: frame-ancestors`, which allows any origin by default; on the agent, only its web UI gets it. The proxy adds the directive to the kit's own policy, so the kit's other directives still apply. A page your own application serves on an `http-{port}` or `https-{port}` URL keeps whatever headers the application sends. Pages that must never be framed keep refusing: the sign-in and secret-entry pages of the chat bot answer with `frame-ancestors 'none'`, and a notebook export keeps its own policy. Each view in the catalog has a `frameable` value. `yes` views load in a frame from another origin. `no` views refuse framing; open them in a new tab instead. ## Aliases A view can also be opened through a proxy alias: pass the alias as the target instead of the container, and the builder uses the alias's own address as the host. ```typescript box.embeds.cron.manager({ alias: 'jobs', program: 'cron', index: 1, url: 'https://jobs.example.com' }); // https://jobs.example.com/ ``` Most kit UIs read their own identity from the hostname, so they cannot work under an alias hostname, and those views are refused with `ALIAS_VIEW_UNSUPPORTED`. The Alias column of the reference shows which views accept an alias. ## View reference The tables below are generated from the construction catalog at [`/embeds/catalog.v1.json`](/embeds/catalog.v1.json). The catalog is the machine-readable form of the same information. Parameters are listed by their URL query name; the SDK's embed options use the same names, except that `pipe.noscript` takes its `path` as `noscriptPath`. Direct pipe page links, including `autostart`, which the builder refuses, are on the [Pipe page](/kit/pipe/#page-links). Pipe page links open in the browser, so they do not carry the SDK's `kitAuth` headers: the browser itself must be allowed by the container's access rule. The embed builder limits the send page's `name` to 1023 characters and pipe `path` values to 1023 characters after percent-encoding. `noscriptPath` has a separate 1024-character limit. Direct pipe links and `PipeMedia.getPageUrl()` allow names up to 1024 encoded characters. The `pipe.video` embed view does not accept `n`; for a fixed viewer count, use a direct `?video&n=3` link or `media.getPageUrl('video', 'demo', { n: 3 })`. ### terminal Web terminal sessions in the browser. | View | Label | Path | Required | Frameable | Alias | Notes | |---|---|---|---|---|---|---| | `terminal.session` | Terminal session | `/` | none | yes | no | default, starts a process | #### `terminal.session` A browser terminal attached to one session. Opening it starts a shell if the session is not running; a terminal that belongs to a daemon program attaches to that program instead and never starts a shell. | Parameter | In | Values | Description | |---|---|---|---| | `cwd` | query | string | Starting directory for a new session. The directory must already exist. | | `readonly` | query | boolean | Open the session read-only: output is shown, keyboard input is blocked. | | `title` | query | string | Browser tab title. HTML tags are removed. | | `fontSize` | query | integer (≥ 8, ≤ 72) | Font size in pixels. | | `backgroundColor` | query | string | Background colour: a hex colour (#RGB, #RRGGBB, #RRGGBBAA) or a CSS colour name. | | `panel` | query | URL | An http(s) URL to show in a side panel next to the terminal. | | `panel-visible` | query | boolean | Show the side panel on load. | | `panel-position` | query | `left`, `right`, `top`, `bottom` | Where the side panel sits. | | `panel-width` | query | string | Initial side-panel width, in pixels (400px) or percent, for a left or right panel. | | `panel-height` | query | string | Initial side-panel height, in pixels (300px) or percent, for a top or bottom panel. | | `panel-resizable` | query | boolean | Allow resizing the side panel by dragging. | | `panel-width-pct` | query | integer (≥ 5, ≤ 95) | Initial side-panel width as a percentage of the window. Takes precedence over panel-width. | | `panel-height-pct` | query | integer (≥ 5, ≤ 95) | Initial side-panel height as a percentage of the window. Takes precedence over panel-height. | | `hide-toolbar` | query | boolean | Hide the terminal toolbar. | | `fontFamily` | query | string | CSS font-family list for terminal text. | | `fontWeight` | query | `normal`, `bold`, `100`, `200`, `300`, `400`, `500`, `600`, `700`, `800`, `900` | Font weight for normal text. | | `fontWeightBold` | query | `normal`, `bold`, `100`, `200`, `300`, `400`, `500`, `600`, `700`, `800`, `900` | Font weight for bold text. | | `lineHeight` | query | integer (≥ 1) | Line height as a multiple of the font size. | | `letterSpacing` | query | integer | Extra spacing between characters, in whole pixels. | | `cursorBlink` | query | boolean | Make the cursor blink. | | `cursorStyle` | query | `block`, `underline`, `bar` | Cursor shape when the terminal has focus. | | `cursorWidth` | query | integer (≥ 1) | Cursor width in pixels when the cursor style is bar. | | `cursorInactiveStyle` | query | `outline`, `block`, `bar`, `underline`, `none` | Cursor shape when the terminal does not have focus. | | `theme` | query | object (JSON) | Colour theme as a JSON object (foreground, background, cursor, and the 16 ANSI colours). | | `minimumContrastRatio` | query | integer (≥ 1, ≤ 21) | Minimum contrast ratio between text and background; colours are adjusted to meet it. | | `drawBoldTextInBrightColors` | query | boolean | Draw bold text in the bright colour variants. | | `scrollback` | query | integer (≥ 0, ≤ 100000) | Number of lines kept above the visible screen. | | `scrollSensitivity` | query | integer (≥ 1) | Scroll speed multiplier. | | `fastScrollSensitivity` | query | integer (≥ 1) | Scroll speed multiplier while Alt is held. | | `smoothScrollDuration` | query | integer (≥ 0) | Smooth-scroll duration in milliseconds; 0 scrolls instantly. | | `screenReaderMode` | query | boolean | Enable screen-reader support. | | `disableResizeOverlay` | query | boolean | Do not show the size overlay while the window is resized. | | `unicodeVersion` | query | `graphemes`, `11` | Character-width rules: graphemes (default, emoji-aware) or 11. | | `rendererType` | query | `dom`, `canvas`, `webgl` | Renderer used to draw the terminal: webgl (the default; Firefox uses dom), dom, or canvas (drawn with WebGL). Phones, tablets and other touch-screen devices use dom even when webgl or canvas is asked for. Try dom if text renders wrongly with WebGL on a particular browser or GPU. | Refused parameters: `terminal_id` (forced; use serviceIndex), `display` (forced; use serviceIndex), `cwd_auto_create` (mutating), `shell` (mutating), `user` (mutating), `cmd` (mutating), `arg` (mutating), `reset` (mutating), `pid` (mutating), `env` (mutating), `startup_script` (mutating), `welcome` (mutating), `debug` (mutating), `env_inject` (mutating), `desktop` (mutating), `redirect` (mutating), `agent` (mutating), `ephemeral` (mutating), `desktop_env` (mutating), `ssh_host` (credential), `ssh_user` (credential), `ssh_port` (credential), `ssh_password` (credential), `ssh_key` (credential), `socks5_host` (credential), `socks5_port` (credential), `socks5_user` (credential), `socks5_pass` (credential), `redirect_delay` (non-ui), `wait_timeout` (non-ui). ### desktop A full graphical desktop environment in the browser. | View | Label | Path | Required | Frameable | Alias | Notes | |---|---|---|---|---|---|---| | `desktop.session` | Desktop | `/` | none | yes | no | default, starts a process | #### `desktop.session` A full graphical desktop. Opening it starts the desktop if needed, then shows it once it is ready. | Parameter | In | Values | Description | |---|---|---|---| | `desktop_env` | query | `xfce`, `mate` | Desktop environment to start. | | `redirect_delay` | query | integer (≥ 0, ≤ 30) | Extra seconds to wait after the desktop is ready before it opens. | | `wait_timeout` | query | integer (≥ 1, ≤ 300) | Seconds to wait for the desktop to become ready. | Refused parameters: `terminal_id` (forced; use serviceIndex), `display` (forced; use serviceIndex), `desktop` (forced; use view), `redirect` (forced; use view), `cwd_auto_create` (mutating), `shell` (mutating), `user` (mutating), `cmd` (mutating), `arg` (mutating), `reset` (mutating), `pid` (mutating), `env` (mutating), `startup_script` (mutating), `welcome` (mutating), `debug` (mutating), `env_inject` (mutating), `agent` (mutating), `ssh_host` (credential), `ssh_user` (credential), `ssh_port` (credential), `ssh_password` (credential), `ssh_key` (credential), `socks5_host` (credential), `socks5_port` (credential), `socks5_user` (credential), `socks5_pass` (credential), `cwd` (non-ui), `readonly` (non-ui), `title` (non-ui), `fontSize` (non-ui), `backgroundColor` (non-ui), `panel` (non-ui), `panel-visible` (non-ui), `panel-position` (non-ui), `panel-width` (non-ui), `panel-height` (non-ui), `panel-resizable` (non-ui), `panel-width-pct` (non-ui), `panel-height-pct` (non-ui), `hide-toolbar` (non-ui), `fontFamily` (non-ui), `fontWeight` (non-ui), `fontWeightBold` (non-ui), `lineHeight` (non-ui), `letterSpacing` (non-ui), `cursorBlink` (non-ui), `cursorStyle` (non-ui), `cursorWidth` (non-ui), `cursorInactiveStyle` (non-ui), `theme` (non-ui), `minimumContrastRatio` (non-ui), `drawBoldTextInBrightColors` (non-ui), `scrollback` (non-ui), `scrollSensitivity` (non-ui), `fastScrollSensitivity` (non-ui), `smoothScrollDuration` (non-ui), `screenReaderMode` (non-ui), `disableResizeOverlay` (non-ui), `unicodeVersion` (non-ui), `rendererType` (non-ui), `ephemeral` (mutating). ### agent The Hoody agent's interactive interface and API reference. | View | Label | Path | Required | Frameable | Alias | Notes | |---|---|---|---|---|---|---| | `agent.webui` | Agent | `/` | none | yes | no | default, starts a process | #### `agent.webui` The agent's interactive interface in a browser terminal. Opening it starts the agent if it is not running. | Parameter | In | Values | Description | |---|---|---|---| | `title` | query | string | Browser tab title. HTML tags are removed. | | `fontSize` | query | integer (≥ 8, ≤ 72) | Font size in pixels. | | `backgroundColor` | query | string | Background colour: a hex colour (#RGB, #RRGGBB, #RRGGBBAA) or a CSS colour name. | | `panel` | query | URL | An http(s) URL to show in a side panel next to the terminal. | | `panel-visible` | query | boolean | Show the side panel on load. | | `panel-position` | query | `left`, `right`, `top`, `bottom` | Where the side panel sits. | | `panel-width` | query | string | Initial side-panel width, in pixels (400px) or percent, for a left or right panel. | | `panel-height` | query | string | Initial side-panel height, in pixels (300px) or percent, for a top or bottom panel. | | `panel-resizable` | query | boolean | Allow resizing the side panel by dragging. | | `panel-width-pct` | query | integer (≥ 5, ≤ 95) | Initial side-panel width as a percentage of the window. Takes precedence over panel-width. | | `panel-height-pct` | query | integer (≥ 5, ≤ 95) | Initial side-panel height as a percentage of the window. Takes precedence over panel-height. | | `fontFamily` | query | string | CSS font-family list for terminal text. | | `fontWeight` | query | `normal`, `bold`, `100`, `200`, `300`, `400`, `500`, `600`, `700`, `800`, `900` | Font weight for normal text. | | `fontWeightBold` | query | `normal`, `bold`, `100`, `200`, `300`, `400`, `500`, `600`, `700`, `800`, `900` | Font weight for bold text. | | `lineHeight` | query | integer (≥ 1) | Line height as a multiple of the font size. | | `letterSpacing` | query | integer | Extra spacing between characters, in whole pixels. | | `cursorBlink` | query | boolean | Make the cursor blink. | | `cursorStyle` | query | `block`, `underline`, `bar` | Cursor shape when the terminal has focus. | | `cursorWidth` | query | integer (≥ 1) | Cursor width in pixels when the cursor style is bar. | | `cursorInactiveStyle` | query | `outline`, `block`, `bar`, `underline`, `none` | Cursor shape when the terminal does not have focus. | | `theme` | query | object (JSON) | Colour theme as a JSON object (foreground, background, cursor, and the 16 ANSI colours). | | `minimumContrastRatio` | query | integer (≥ 1, ≤ 21) | Minimum contrast ratio between text and background; colours are adjusted to meet it. | | `drawBoldTextInBrightColors` | query | boolean | Draw bold text in the bright colour variants. | | `scrollback` | query | integer (≥ 0, ≤ 100000) | Number of lines kept above the visible screen. | | `scrollSensitivity` | query | integer (≥ 1) | Scroll speed multiplier. | | `fastScrollSensitivity` | query | integer (≥ 1) | Scroll speed multiplier while Alt is held. | | `smoothScrollDuration` | query | integer (≥ 0) | Smooth-scroll duration in milliseconds; 0 scrolls instantly. | | `screenReaderMode` | query | boolean | Enable screen-reader support. | | `disableResizeOverlay` | query | boolean | Do not show the size overlay while the window is resized. | | `unicodeVersion` | query | `graphemes`, `11` | Character-width rules: graphemes (default, emoji-aware) or 11. | | `rendererType` | query | `dom`, `canvas`, `webgl` | Renderer used to draw the terminal: webgl (the default; Firefox uses dom), dom, or canvas (drawn with WebGL). Phones, tablets and other touch-screen devices use dom even when webgl or canvas is asked for. Try dom if text renders wrongly with WebGL on a particular browser or GPU. | Refused parameters: `terminal_id` (forced; use serviceIndex), `display` (forced; use serviceIndex), `agent` (forced; use view), `cwd_auto_create` (mutating), `shell` (mutating), `user` (mutating), `cmd` (mutating), `arg` (mutating), `reset` (mutating), `pid` (mutating), `env` (mutating), `startup_script` (mutating), `welcome` (mutating), `debug` (mutating), `env_inject` (mutating), `desktop` (mutating), `redirect` (mutating), `onboarding` (mutating), `desktop_env` (mutating), `cwd` (mutating), `readonly` (mutating), `ssh_host` (credential), `ssh_user` (credential), `ssh_port` (credential), `ssh_password` (credential), `ssh_key` (credential), `socks5_host` (credential), `socks5_port` (credential), `socks5_user` (credential), `socks5_pass` (credential), `redirect_delay` (non-ui), `wait_timeout` (non-ui), `ephemeral` (mutating). ### display Web viewer for one remote display. | View | Label | Path | Required | Frameable | Alias | Notes | |---|---|---|---|---|---|---| | `display.client` | Display | `/` | none | yes | no | default | #### `display.client` Opens the display in the web viewer. | Parameter | In | Values | Description | |---|---|---|---| | `decorations` | query | boolean | Show window title bars and buttons. Set false for a frameless look. | | `toolbar` | query | boolean | Show the toolbar. false hides it, exactly as menu=false does. | | `menu` | query | boolean | Show the menu button. false hides it, exactly as toolbar=false does. | | `maximize_new_windows` | query | boolean | Open new application windows maximized. Takes effect only on a desktop of at least 1024x1024; on a smaller desktop new windows already fill the screen. | | `readonly` | query | boolean | View-only mode: keyboard and mouse input is not sent. | | `dark_mode` | query | boolean | Use the dark colour scheme. | | `encoding` | query | `auto`, `webp`, `jpeg`, `png`, `rgb` | Pre-selects the encoding in the settings dialog; does not change the stream encoding. | | `offscreen` | query | boolean | Render with an offscreen canvas. | | `bandwidth_limit` | query | integer (≥ 0) | Bandwidth limit for this viewer in bits per second; 0 means unlimited. | | `override_width` | query | string | Requested desktop width: auto or a number. | | `override_height` | query | string | Requested desktop height: auto or a number. | | `vrefresh` | query | integer | Refresh rate in Hz; -1 picks it automatically. | | `suspend_inactive_tab` | query | boolean | Pause updates while the browser tab is hidden. | | `sound` | query | boolean | Play the session's audio in the viewer. | | `audio_codec` | query | string | Preferred audio codec. | | `keyboard` | query | boolean | Show the on-screen keyboard. | | `swap_keys` | query | boolean | Swap the Cmd and Ctrl keys. | | `clipboard` | query | `false` | Set false to turn clipboard sharing off for this viewer. | | `clipboard_preferred_format` | query | `text/plain`, `text/html`, `UTF8_STRING` | Preferred clipboard format. | | `printing` | query | `false` | Set false to turn print forwarding off. | | `file_transfer` | query | `false` | Set false to turn file transfer off. | | `video` | query | boolean | Allow video encodings. | | `mediasource_video` | query | boolean | Allow MediaSource video decoding. | | `web_notifications` | query | boolean | Pre-set the browser-notifications option in the connection dialog. | | `display_notifications` | query | boolean | Show notifications inside the display view. | | `notification_connection_type` | query | `websocket`, `polling` | Pre-set the notification connection type in the connection dialog. | | `reconnect` | query | boolean | Reconnect automatically after a lost connection. | | `floating_menu` | query | boolean | Show the floating menu. | | `clock` | query | boolean | Show the server clock. | | `scroll_reverse_y` | query | `auto`, `true`, `false` | Reverse vertical scrolling: auto, true or false. | | `scroll_reverse_x` | query | boolean | Reverse horizontal scrolling. | | `title_show_hoody` | query | boolean | Show Hoody in the page title. | | `title_show_display_id` | query | boolean | Show the display number in the page title. | Refused parameters: `displayId` (mutating), `node` (mutating), `project_id` (mutating), `container_id` (mutating), `url_display_id` (mutating), `ssl` (mutating), `webtransport` (mutating), `path` (mutating), `action` (mutating), `display` (mutating), `keyboard_layout` (mutating), `clipboard_poll` (mutating), `open_url` (not-supported), `notification_server_url` (mutating), `sharing` (mutating), `steal` (mutating), `app` (mutating), `remote_logging` (mutating), `insecure` (auth), `debug_main` (mutating), `debug_keyboard` (mutating), `debug_geometry` (mutating), `debug_mouse` (mutating), `debug_clipboard` (mutating), `debug_draw` (mutating), `debug_audio` (mutating), `debug_network` (mutating), `debug_file` (mutating). ### browser Status page of the headless or headful browser service, and a full-page view of its display. | View | Label | Path | Required | Frameable | Alias | Notes | |---|---|---|---|---|---|---| | `browser.status` | Status | `/` | none | yes | no | default | | `browser.display` | Display | `/` | none | yes | no | none | #### `browser.status` Lists the running browser instances with links to their display and developer tools. | Parameter | In | Values | Description | |---|---|---|---| | `maximize_new_windows` | query | boolean | Open new browser windows maximized in the display. On by default. | Always sent: `start=false`. #### `browser.display` Shows the browser's display full-page. | Parameter | In | Values | Description | |---|---|---|---| | `maximize_new_windows` | query | boolean | Open new browser windows maximized in the display. On by default. | | `iframe_url` | query | URL | Web address shown in the full-page frame instead of the browser's own display. Must start with http:// or https://. | Always sent: `view=display`, `start=false`. Refused parameters: `display` (forced; use serviceIndex). ### code A VS Code editor in the browser, opened on a folder of the container, optionally focused on a single extension. | View | Label | Path | Required | Frameable | Alias | Notes | |---|---|---|---|---|---|---| | `code.root` | Editor (default folder) | `/api/v1/code` | none | yes | no | starts a process | | `code.editor` | Editor | `/api/v1/code` | `folder` | yes | no | default, starts a process | | `code.extension` | Extension | `/api/v1/code` | `extension` | yes | no | starts a process | #### `code.root` The editor opened on the default workspace folder the platform sets. Opening it starts the editor instance when it is not running yet. | Parameter | In | Values | Description | |---|---|---|---| | `locale` | query | string | Display language of the editor, as a language tag such as en or pt-BR. Applies when the instance starts. | | `page-loader` | query | boolean | Show a loading overlay while a newly started editor initialises. Applies when the instance starts. | | `disable-walkthroughs` | query | boolean | Hide the editor's walkthrough pages. Applies when the instance starts. | | `hoody-code` | query | boolean | Load the Hoody page integration scripts, such as tab-title sync. Applies when the instance starts. | #### `code.editor` The editor opened on a folder. Opening it starts the editor instance when it is not running yet. | Parameter | In | Values | Description | |---|---|---|---| | `folder` | query | string | Absolute path of the folder to open. It applies when the editor instance starts; a running instance keeps the folder it was started with. | | `locale` | query | string | Display language of the editor, as a language tag such as en or pt-BR. Applies when the instance starts. | | `page-loader` | query | boolean | Show a loading overlay while a newly started editor initialises. Applies when the instance starts. | | `disable-walkthroughs` | query | boolean | Hide the editor's walkthrough pages. Applies when the instance starts. | | `hoody-code` | query | boolean | Load the Hoody page integration scripts, such as tab-title sync. Applies when the instance starts. | #### `code.extension` The editor in extension-only mode: only the chosen extension's view is shown. Opening it starts the editor instance when it is not running yet. | Parameter | In | Values | Description | |---|---|---|---| | `folder` | query | string | Absolute path of the folder to open. It applies when the editor instance starts; a running instance keeps the folder it was started with. | | `extension` | query | string | Extension identifier in PUBLISHER.NAME form. Opens the editor in extension-only mode, showing only that extension's view. | | `locale` | query | string | Display language of the editor, as a language tag such as en or pt-BR. Applies when the instance starts. | | `page-loader` | query | boolean | Show a loading overlay while a newly started editor initialises. Applies when the instance starts. | | `disable-walkthroughs` | query | boolean | Hide the editor's walkthrough pages. Applies when the instance starts. | | `hoody-code` | query | boolean | Load the Hoody page integration scripts, such as tab-title sync. Applies when the instance starts. | Refused parameters: `id` (forced; use serviceIndex), `restart` (mutating), `welcome-iframe-url` (mutating), `page-loader-path` (mutating), `proxy-domain` (mutating), `app-name` (mutating). ### files A file manager for the container: folder listings, search, a code editor and a read-only viewer. | View | Label | Path | Required | Frameable | Alias | Notes | |---|---|---|---|---|---|---| | `files.root` | Root folder | `/` | none | yes | no | none | | `files.folder` | Folder | `/{path}` | `path` | yes | no | default | | `files.editor` | Editor | `/{path}` | `path` | yes | no | none | | `files.search` | Search | `/{directory}` | `directory`, `q` | yes | no | none | #### `files.root` The listing of the container root folder, with upload, rename and delete controls for the user. | Parameter | In | Values | Description | |---|---|---|---| | `sort` | query | `name`, `mtime`, `size` | Sort the listing by name, modification time or size. | | `order` | query | `asc`, `desc` | Sort direction. Only desc changes the order; asc is the default. | | `theme` | query | `oc-1`, `aura`, `ayu`, `carbonfox`, `catppuccin`, `dracula`, `gruvbox`, `monokai`, `nightowl`, `nord`, `onedarkpro`, `shadesofpurple`, `solarized`, `tokyonight`, `vesper` | Colour theme of the page. | | `colorScheme` | query | `light`, `dark` | Light or dark colour scheme. Without it the page follows the system setting. | | `font` | query | `ibm-plex-mono`, `cascadia-code`, `fira-code`, `hack`, `inconsolata`, `intel-one-mono`, `iosevka`, `jetbrains-mono`, `meslo-lgs`, `roboto-mono`, `source-code-pro`, `ubuntu-mono` | Monospace font of the editor and listing. | | `fontSize` | query | integer (≥ 8, ≤ 72) | Editor font size in pixels, 8 to 72. | | `embedderOrigin` | query | URL | Origin of the embedding page, such as https://app.example.com. The page then accepts theme and layout messages from it and tells it when it is ready. | | `chromeless` | query | boolean | Hide the header, sidebar, preview, footer and borders at once. Each can be turned back on with its own option set to false. | | `borderless` | query | boolean | Hide the page borders. | | `hideHeader` | query | boolean | Hide the header bar. | | `hideSidebar` | query | boolean | Hide the sidebar. | | `hidePreview` | query | boolean | Hide the preview pane. | | `hideFooter` | query | boolean | Hide the footer. | | `embedBg` | query | `transparent` | Set to transparent to let the embedding page's background show through. | #### `files.folder` The listing of a folder, with upload, rename and delete controls for the user. | Parameter | In | Values | Description | |---|---|---|---| | `path` | path | string | Absolute path inside the container, starting with /. Each segment is percent-encoded; the slashes between segments are kept. | | `sort` | query | `name`, `mtime`, `size` | Sort the listing by name, modification time or size. | | `order` | query | `asc`, `desc` | Sort direction. Only desc changes the order; asc is the default. | | `theme` | query | `oc-1`, `aura`, `ayu`, `carbonfox`, `catppuccin`, `dracula`, `gruvbox`, `monokai`, `nightowl`, `nord`, `onedarkpro`, `shadesofpurple`, `solarized`, `tokyonight`, `vesper` | Colour theme of the page. | | `colorScheme` | query | `light`, `dark` | Light or dark colour scheme. Without it the page follows the system setting. | | `font` | query | `ibm-plex-mono`, `cascadia-code`, `fira-code`, `hack`, `inconsolata`, `intel-one-mono`, `iosevka`, `jetbrains-mono`, `meslo-lgs`, `roboto-mono`, `source-code-pro`, `ubuntu-mono` | Monospace font of the editor and listing. | | `fontSize` | query | integer (≥ 8, ≤ 72) | Editor font size in pixels, 8 to 72. | | `embedderOrigin` | query | URL | Origin of the embedding page, such as https://app.example.com. The page then accepts theme and layout messages from it and tells it when it is ready. | | `chromeless` | query | boolean | Hide the header, sidebar, preview, footer and borders at once. Each can be turned back on with its own option set to false. | | `borderless` | query | boolean | Hide the page borders. | | `hideHeader` | query | boolean | Hide the header bar. | | `hideSidebar` | query | boolean | Hide the sidebar. | | `hidePreview` | query | boolean | Hide the preview pane. | | `hideFooter` | query | boolean | Hide the footer. | | `embedBg` | query | `transparent` | Set to transparent to let the embedding page's background show through. | #### `files.editor` A text file opened in the code editor. Changes are saved only when the user saves. | Parameter | In | Values | Description | |---|---|---|---| | `path` | path | string | Absolute path inside the container, starting with /. Each segment is percent-encoded; the slashes between segments are kept. | | `theme` | query | `oc-1`, `aura`, `ayu`, `carbonfox`, `catppuccin`, `dracula`, `gruvbox`, `monokai`, `nightowl`, `nord`, `onedarkpro`, `shadesofpurple`, `solarized`, `tokyonight`, `vesper` | Colour theme of the page. | | `colorScheme` | query | `light`, `dark` | Light or dark colour scheme. Without it the page follows the system setting. | | `font` | query | `ibm-plex-mono`, `cascadia-code`, `fira-code`, `hack`, `inconsolata`, `intel-one-mono`, `iosevka`, `jetbrains-mono`, `meslo-lgs`, `roboto-mono`, `source-code-pro`, `ubuntu-mono` | Monospace font of the editor and listing. | | `fontSize` | query | integer (≥ 8, ≤ 72) | Editor font size in pixels, 8 to 72. | | `embedderOrigin` | query | URL | Origin of the embedding page, such as https://app.example.com. The page then accepts theme and layout messages from it and tells it when it is ready. | | `chromeless` | query | boolean | Hide the header, sidebar, preview, footer and borders at once. Each can be turned back on with its own option set to false. | | `borderless` | query | boolean | Hide the page borders. | | `hideHeader` | query | boolean | Hide the header bar. | | `hideFooter` | query | boolean | Hide the footer. | | `embedBg` | query | `transparent` | Set to transparent to let the embedding page's background show through. | Always sent: `edit=`. #### `files.search` Search results for a text inside a folder and its subfolders. | Parameter | In | Values | Description | |---|---|---|---| | `directory` | path | string | Absolute path of the folder to search in, starting with /, encoded like path. | | `q` | query | string | Search text. Lists the entries below the folder whose names match. | | `theme` | query | `oc-1`, `aura`, `ayu`, `carbonfox`, `catppuccin`, `dracula`, `gruvbox`, `monokai`, `nightowl`, `nord`, `onedarkpro`, `shadesofpurple`, `solarized`, `tokyonight`, `vesper` | Colour theme of the page. | | `colorScheme` | query | `light`, `dark` | Light or dark colour scheme. Without it the page follows the system setting. | | `font` | query | `ibm-plex-mono`, `cascadia-code`, `fira-code`, `hack`, `inconsolata`, `intel-one-mono`, `iosevka`, `jetbrains-mono`, `meslo-lgs`, `roboto-mono`, `source-code-pro`, `ubuntu-mono` | Monospace font of the editor and listing. | | `fontSize` | query | integer (≥ 8, ≤ 72) | Editor font size in pixels, 8 to 72. | | `embedderOrigin` | query | URL | Origin of the embedding page, such as https://app.example.com. The page then accepts theme and layout messages from it and tells it when it is ready. | | `chromeless` | query | boolean | Hide the header, sidebar, preview, footer and borders at once. Each can be turned back on with its own option set to false. | | `borderless` | query | boolean | Hide the page borders. | | `hideHeader` | query | boolean | Hide the header bar. | | `hideSidebar` | query | boolean | Hide the sidebar. | | `hidePreview` | query | boolean | Hide the preview pane. | | `hideFooter` | query | boolean | Hide the footer. | | `embedBg` | query | `transparent` | Set to transparent to let the embedding page's background show through. | Refused parameters: `json` (non-ui), `simple` (non-ui), `hash` (non-ui), `sha256` (non-ui), `base64` (non-ui), `view` (not-read-only), `download` (mutating), `content-type` (non-ui), `history` (non-ui), `at` (non-ui), `revision` (non-ui), `diff` (non-ui), `from_seq` (non-ui), `from_ts` (non-ui), `to_seq` (non-ui), `to_ts` (non-ui), `after_id` (non-ui), `limit` (non-ui). ### notes Hoody Notes: notebooks, pages and databases in the browser. Whether a framed Notes page shares its local cache with Notes open in a tab depends on the browser: a frame embedded by another site usually gets separate storage. Separate caches exchange changes, offline edits included, once they sync with the server. Offline edits survive a reload only when the browser gives Notes persistent storage; where it does not, Notes runs from memory and unsynced edits are lost on reload. | View | Label | Path | Required | Frameable | Alias | Notes | |---|---|---|---|---|---|---| | `notes.home` | Home | `/` | none | yes | no | default | | `notes.create` | Create notebook | `/create` | none | yes | no | none | | `notes.notebook` | Notebook | `/notebook/{userId}` | `userId` | yes | no | none | | `notes.notebookHome` | Notebook home | `/notebook/{userId}/home` | `userId` | yes | no | none | | `notes.node` | Page | `/notebook/{userId}/{nodeId}` | `userId`, `nodeId` | yes | no | none | | `notes.modal` | Page with modal | `/notebook/{userId}/{nodeId}/modal/{modalNodeId}` | `userId`, `nodeId`, `modalNodeId` | yes | no | none | | `notes.alias` | Page by alias | `/notebook/{userId}/alias/{alias}` | `userId`, `alias` | yes | no | none | | `notes.files` | Files | `/notebook/{userId}/files` | `userId` | yes | no | none | | `notes.uploads` | Uploads | `/notebook/{userId}/uploads` | `userId` | yes | no | none | | `notes.downloads` | Downloads | `/notebook/{userId}/downloads` | `userId` | yes | no | none | | `notes.users` | Users | `/notebook/{userId}/users` | `userId` | yes | no | none | | `notes.settings` | Notebook settings | `/notebook/{userId}/settings` | `userId` | yes | no | none | | `notes.account` | Account settings | `/notebook/{userId}/account` | `userId` | yes | no | none | #### `notes.home` Opens the last used locally available notebook, or the first available one. | Parameter | In | Values | Description | |---|---|---|---| | `mode` | query | `readonly`, `readwrite` | Share presentation. Either value hides the sidebar. readonly shows the notebook's content and management views as a viewer sees them; your own account settings and appearance preferences stay editable. readwrite keeps the editing controls your permissions allow, including section and channel role overrides. Neither changes permissions. | | `sidebar` | query | `hidden` | Set to hidden to hide the notebook sidebar. | | `theme` | query | `oc-1`, `hc-black`, `aura`, `ayu`, `carbonfox`, `catppuccin`, `dracula`, `gruvbox`, `monokai`, `nightowl`, `nord`, `onedarkpro`, `shadesofpurple`, `solarized`, `tokyonight`, `vesper` | Colour theme id. | | `colorScheme` | query | `light`, `dark` | Light or dark colour scheme, over the saved preference. A page set to light or dark in its own appearance keeps it. | | `font` | query | `ibm-plex-mono`, `jetbrains-mono`, `fira-code`, `cascadia-code`, `hack`, `source-code-pro`, `inconsolata`, `roboto-mono`, `ubuntu-mono`, `intel-one-mono`, `meslo-lgs`, `iosevka` | Monospace font id. | #### `notes.create` Opens the form for creating a new notebook; only submitting the form creates one. Like any Notes page, the first visit may set up the default notebook and your user in it. | Parameter | In | Values | Description | |---|---|---|---| | `theme` | query | `oc-1`, `hc-black`, `aura`, `ayu`, `carbonfox`, `catppuccin`, `dracula`, `gruvbox`, `monokai`, `nightowl`, `nord`, `onedarkpro`, `shadesofpurple`, `solarized`, `tokyonight`, `vesper` | Colour theme id. | | `colorScheme` | query | `light`, `dark` | Light or dark colour scheme, over the saved preference. A page set to light or dark in its own appearance keeps it. | | `font` | query | `ibm-plex-mono`, `jetbrains-mono`, `fira-code`, `cascadia-code`, `hack`, `source-code-pro`, `inconsolata`, `roboto-mono`, `ubuntu-mono`, `intel-one-mono`, `meslo-lgs`, `iosevka` | Monospace font id. | #### `notes.notebook` Opens a notebook at its last visited location, or its home page. | Parameter | In | Values | Description | |---|---|---|---| | `userId` | path | string | Your own user id in the notebook to open, as the viewing identity knows it (not the notebook id, and not another member's user id: an id the viewer does not have opens Notes home instead). New ids are 24 lowercase hexadecimal characters; older ids may be up to 28 lowercase letters and digits. | | `mode` | query | `readonly`, `readwrite` | Share presentation. Either value hides the sidebar. readonly shows the notebook's content and management views as a viewer sees them; your own account settings and appearance preferences stay editable. readwrite keeps the editing controls your permissions allow, including section and channel role overrides. Neither changes permissions. | | `sidebar` | query | `hidden` | Set to hidden to hide the notebook sidebar. | | `theme` | query | `oc-1`, `hc-black`, `aura`, `ayu`, `carbonfox`, `catppuccin`, `dracula`, `gruvbox`, `monokai`, `nightowl`, `nord`, `onedarkpro`, `shadesofpurple`, `solarized`, `tokyonight`, `vesper` | Colour theme id. | | `colorScheme` | query | `light`, `dark` | Light or dark colour scheme, over the saved preference. A page set to light or dark in its own appearance keeps it. | | `font` | query | `ibm-plex-mono`, `jetbrains-mono`, `fira-code`, `cascadia-code`, `hack`, `source-code-pro`, `inconsolata`, `roboto-mono`, `ubuntu-mono`, `intel-one-mono`, `meslo-lgs`, `iosevka` | Monospace font id. | #### `notes.notebookHome` Opens the home page of a notebook. | Parameter | In | Values | Description | |---|---|---|---| | `userId` | path | string | Your own user id in the notebook to open, as the viewing identity knows it (not the notebook id, and not another member's user id: an id the viewer does not have opens Notes home instead). New ids are 24 lowercase hexadecimal characters; older ids may be up to 28 lowercase letters and digits. | | `mode` | query | `readonly`, `readwrite` | Share presentation. Either value hides the sidebar. readonly shows the notebook's content and management views as a viewer sees them; your own account settings and appearance preferences stay editable. readwrite keeps the editing controls your permissions allow, including section and channel role overrides. Neither changes permissions. | | `sidebar` | query | `hidden` | Set to hidden to hide the notebook sidebar. | | `theme` | query | `oc-1`, `hc-black`, `aura`, `ayu`, `carbonfox`, `catppuccin`, `dracula`, `gruvbox`, `monokai`, `nightowl`, `nord`, `onedarkpro`, `shadesofpurple`, `solarized`, `tokyonight`, `vesper` | Colour theme id. | | `colorScheme` | query | `light`, `dark` | Light or dark colour scheme, over the saved preference. A page set to light or dark in its own appearance keeps it. | | `font` | query | `ibm-plex-mono`, `jetbrains-mono`, `fira-code`, `cascadia-code`, `hack`, `source-code-pro`, `inconsolata`, `roboto-mono`, `ubuntu-mono`, `intel-one-mono`, `meslo-lgs`, `iosevka` | Monospace font id. | #### `notes.node` Opens one page or node of a notebook. | Parameter | In | Values | Description | |---|---|---|---| | `userId` | path | string | Your own user id in the notebook to open, as the viewing identity knows it (not the notebook id, and not another member's user id: an id the viewer does not have opens Notes home instead). New ids are 24 lowercase hexadecimal characters; older ids may be up to 28 lowercase letters and digits. | | `nodeId` | path | string | Id of the page or node to open. New ids are 24 lowercase hexadecimal characters; older ids may be up to 28 lowercase letters and digits. | | `mode` | query | `readonly`, `readwrite` | Share presentation. Either value hides the sidebar. readonly shows the notebook's content and management views as a viewer sees them; your own account settings and appearance preferences stay editable. readwrite keeps the editing controls your permissions allow, including section and channel role overrides. Neither changes permissions. | | `sidebar` | query | `hidden` | Set to hidden to hide the notebook sidebar. | | `theme` | query | `oc-1`, `hc-black`, `aura`, `ayu`, `carbonfox`, `catppuccin`, `dracula`, `gruvbox`, `monokai`, `nightowl`, `nord`, `onedarkpro`, `shadesofpurple`, `solarized`, `tokyonight`, `vesper` | Colour theme id. | | `colorScheme` | query | `light`, `dark` | Light or dark colour scheme, over the saved preference. A page set to light or dark in its own appearance keeps it. | | `font` | query | `ibm-plex-mono`, `jetbrains-mono`, `fira-code`, `cascadia-code`, `hack`, `source-code-pro`, `inconsolata`, `roboto-mono`, `ubuntu-mono`, `intel-one-mono`, `meslo-lgs`, `iosevka` | Monospace font id. | #### `notes.modal` Opens a page with another node shown in a modal over it. | Parameter | In | Values | Description | |---|---|---|---| | `userId` | path | string | Your own user id in the notebook to open, as the viewing identity knows it (not the notebook id, and not another member's user id: an id the viewer does not have opens Notes home instead). New ids are 24 lowercase hexadecimal characters; older ids may be up to 28 lowercase letters and digits. | | `nodeId` | path | string | Id of the page or node to open. New ids are 24 lowercase hexadecimal characters; older ids may be up to 28 lowercase letters and digits. | | `modalNodeId` | path | string | Id of the node shown in a modal over the page. New ids are 24 lowercase hexadecimal characters; older ids may be up to 28 lowercase letters and digits. | | `mode` | query | `readonly`, `readwrite` | Share presentation. Either value hides the sidebar. readonly shows the notebook's content and management views as a viewer sees them; your own account settings and appearance preferences stay editable. readwrite keeps the editing controls your permissions allow, including section and channel role overrides. Neither changes permissions. | | `sidebar` | query | `hidden` | Set to hidden to hide the notebook sidebar. | | `theme` | query | `oc-1`, `hc-black`, `aura`, `ayu`, `carbonfox`, `catppuccin`, `dracula`, `gruvbox`, `monokai`, `nightowl`, `nord`, `onedarkpro`, `shadesofpurple`, `solarized`, `tokyonight`, `vesper` | Colour theme id. | | `colorScheme` | query | `light`, `dark` | Light or dark colour scheme, over the saved preference. A page set to light or dark in its own appearance keeps it. | | `font` | query | `ibm-plex-mono`, `jetbrains-mono`, `fira-code`, `cascadia-code`, `hack`, `source-code-pro`, `inconsolata`, `roboto-mono`, `ubuntu-mono`, `intel-one-mono`, `meslo-lgs`, `iosevka` | Monospace font id. | #### `notes.alias` Opens the page that has the given alias, or the notebook home when none has it. | Parameter | In | Values | Description | |---|---|---|---| | `userId` | path | string | Your own user id in the notebook to open, as the viewing identity knows it (not the notebook id, and not another member's user id: an id the viewer does not have opens Notes home instead). New ids are 24 lowercase hexadecimal characters; older ids may be up to 28 lowercase letters and digits. | | `alias` | path | string | Page alias (lowercase letters, digits, '_' and '-', up to 48 characters). Opens the page with that alias, or the notebook home when no page has it. | | `mode` | query | `readonly`, `readwrite` | Share presentation. Either value hides the sidebar. readonly shows the notebook's content and management views as a viewer sees them; your own account settings and appearance preferences stay editable. readwrite keeps the editing controls your permissions allow, including section and channel role overrides. Neither changes permissions. | | `sidebar` | query | `hidden` | Set to hidden to hide the notebook sidebar. | | `theme` | query | `oc-1`, `hc-black`, `aura`, `ayu`, `carbonfox`, `catppuccin`, `dracula`, `gruvbox`, `monokai`, `nightowl`, `nord`, `onedarkpro`, `shadesofpurple`, `solarized`, `tokyonight`, `vesper` | Colour theme id. | | `colorScheme` | query | `light`, `dark` | Light or dark colour scheme, over the saved preference. A page set to light or dark in its own appearance keeps it. | | `font` | query | `ibm-plex-mono`, `jetbrains-mono`, `fira-code`, `cascadia-code`, `hack`, `source-code-pro`, `inconsolata`, `roboto-mono`, `ubuntu-mono`, `intel-one-mono`, `meslo-lgs`, `iosevka` | Monospace font id. | #### `notes.files` Opens the file tree of a notebook. | Parameter | In | Values | Description | |---|---|---|---| | `userId` | path | string | Your own user id in the notebook to open, as the viewing identity knows it (not the notebook id, and not another member's user id: an id the viewer does not have opens Notes home instead). New ids are 24 lowercase hexadecimal characters; older ids may be up to 28 lowercase letters and digits. | | `mode` | query | `readonly`, `readwrite` | Share presentation. Either value hides the sidebar. readonly shows the notebook's content and management views as a viewer sees them; your own account settings and appearance preferences stay editable. readwrite keeps the editing controls your permissions allow, including section and channel role overrides. Neither changes permissions. | | `sidebar` | query | `hidden` | Set to hidden to hide the notebook sidebar. | | `theme` | query | `oc-1`, `hc-black`, `aura`, `ayu`, `carbonfox`, `catppuccin`, `dracula`, `gruvbox`, `monokai`, `nightowl`, `nord`, `onedarkpro`, `shadesofpurple`, `solarized`, `tokyonight`, `vesper` | Colour theme id. | | `colorScheme` | query | `light`, `dark` | Light or dark colour scheme, over the saved preference. A page set to light or dark in its own appearance keeps it. | | `font` | query | `ibm-plex-mono`, `jetbrains-mono`, `fira-code`, `cascadia-code`, `hack`, `source-code-pro`, `inconsolata`, `roboto-mono`, `ubuntu-mono`, `intel-one-mono`, `meslo-lgs`, `iosevka` | Monospace font id. | #### `notes.uploads` Opens the uploads list of a notebook. | Parameter | In | Values | Description | |---|---|---|---| | `userId` | path | string | Your own user id in the notebook to open, as the viewing identity knows it (not the notebook id, and not another member's user id: an id the viewer does not have opens Notes home instead). New ids are 24 lowercase hexadecimal characters; older ids may be up to 28 lowercase letters and digits. | | `mode` | query | `readonly`, `readwrite` | Share presentation. Either value hides the sidebar. readonly shows the notebook's content and management views as a viewer sees them; your own account settings and appearance preferences stay editable. readwrite keeps the editing controls your permissions allow, including section and channel role overrides. Neither changes permissions. | | `sidebar` | query | `hidden` | Set to hidden to hide the notebook sidebar. | | `theme` | query | `oc-1`, `hc-black`, `aura`, `ayu`, `carbonfox`, `catppuccin`, `dracula`, `gruvbox`, `monokai`, `nightowl`, `nord`, `onedarkpro`, `shadesofpurple`, `solarized`, `tokyonight`, `vesper` | Colour theme id. | | `colorScheme` | query | `light`, `dark` | Light or dark colour scheme, over the saved preference. A page set to light or dark in its own appearance keeps it. | | `font` | query | `ibm-plex-mono`, `jetbrains-mono`, `fira-code`, `cascadia-code`, `hack`, `source-code-pro`, `inconsolata`, `roboto-mono`, `ubuntu-mono`, `intel-one-mono`, `meslo-lgs`, `iosevka` | Monospace font id. | #### `notes.downloads` Opens the downloads list of a notebook. | Parameter | In | Values | Description | |---|---|---|---| | `userId` | path | string | Your own user id in the notebook to open, as the viewing identity knows it (not the notebook id, and not another member's user id: an id the viewer does not have opens Notes home instead). New ids are 24 lowercase hexadecimal characters; older ids may be up to 28 lowercase letters and digits. | | `mode` | query | `readonly`, `readwrite` | Share presentation. Either value hides the sidebar. readonly shows the notebook's content and management views as a viewer sees them; your own account settings and appearance preferences stay editable. readwrite keeps the editing controls your permissions allow, including section and channel role overrides. Neither changes permissions. | | `sidebar` | query | `hidden` | Set to hidden to hide the notebook sidebar. | | `theme` | query | `oc-1`, `hc-black`, `aura`, `ayu`, `carbonfox`, `catppuccin`, `dracula`, `gruvbox`, `monokai`, `nightowl`, `nord`, `onedarkpro`, `shadesofpurple`, `solarized`, `tokyonight`, `vesper` | Colour theme id. | | `colorScheme` | query | `light`, `dark` | Light or dark colour scheme, over the saved preference. A page set to light or dark in its own appearance keeps it. | | `font` | query | `ibm-plex-mono`, `jetbrains-mono`, `fira-code`, `cascadia-code`, `hack`, `source-code-pro`, `inconsolata`, `roboto-mono`, `ubuntu-mono`, `intel-one-mono`, `meslo-lgs`, `iosevka` | Monospace font id. | #### `notes.users` Opens the member list of a notebook. | Parameter | In | Values | Description | |---|---|---|---| | `userId` | path | string | Your own user id in the notebook to open, as the viewing identity knows it (not the notebook id, and not another member's user id: an id the viewer does not have opens Notes home instead). New ids are 24 lowercase hexadecimal characters; older ids may be up to 28 lowercase letters and digits. | | `mode` | query | `readonly`, `readwrite` | Share presentation. Either value hides the sidebar. readonly shows the notebook's content and management views as a viewer sees them; your own account settings and appearance preferences stay editable. readwrite keeps the editing controls your permissions allow, including section and channel role overrides. Neither changes permissions. | | `sidebar` | query | `hidden` | Set to hidden to hide the notebook sidebar. | | `theme` | query | `oc-1`, `hc-black`, `aura`, `ayu`, `carbonfox`, `catppuccin`, `dracula`, `gruvbox`, `monokai`, `nightowl`, `nord`, `onedarkpro`, `shadesofpurple`, `solarized`, `tokyonight`, `vesper` | Colour theme id. | | `colorScheme` | query | `light`, `dark` | Light or dark colour scheme, over the saved preference. A page set to light or dark in its own appearance keeps it. | | `font` | query | `ibm-plex-mono`, `jetbrains-mono`, `fira-code`, `cascadia-code`, `hack`, `source-code-pro`, `inconsolata`, `roboto-mono`, `ubuntu-mono`, `intel-one-mono`, `meslo-lgs`, `iosevka` | Monospace font id. | #### `notes.settings` Opens the settings of a notebook. | Parameter | In | Values | Description | |---|---|---|---| | `userId` | path | string | Your own user id in the notebook to open, as the viewing identity knows it (not the notebook id, and not another member's user id: an id the viewer does not have opens Notes home instead). New ids are 24 lowercase hexadecimal characters; older ids may be up to 28 lowercase letters and digits. | | `mode` | query | `readonly`, `readwrite` | Share presentation. Either value hides the sidebar. readonly shows the notebook's content and management views as a viewer sees them; your own account settings and appearance preferences stay editable. readwrite keeps the editing controls your permissions allow, including section and channel role overrides. Neither changes permissions. | | `sidebar` | query | `hidden` | Set to hidden to hide the notebook sidebar. | | `theme` | query | `oc-1`, `hc-black`, `aura`, `ayu`, `carbonfox`, `catppuccin`, `dracula`, `gruvbox`, `monokai`, `nightowl`, `nord`, `onedarkpro`, `shadesofpurple`, `solarized`, `tokyonight`, `vesper` | Colour theme id. | | `colorScheme` | query | `light`, `dark` | Light or dark colour scheme, over the saved preference. A page set to light or dark in its own appearance keeps it. | | `font` | query | `ibm-plex-mono`, `jetbrains-mono`, `fira-code`, `cascadia-code`, `hack`, `source-code-pro`, `inconsolata`, `roboto-mono`, `ubuntu-mono`, `intel-one-mono`, `meslo-lgs`, `iosevka` | Monospace font id. | #### `notes.account` Opens the account settings for a notebook's account. The display name and avatar choice are kept in this browser for the signed-in identity and do not sync to other browsers or to a frame with separate storage; the avatar image itself is uploaded to the server. | Parameter | In | Values | Description | |---|---|---|---| | `userId` | path | string | Your own user id in the notebook to open, as the viewing identity knows it (not the notebook id, and not another member's user id: an id the viewer does not have opens Notes home instead). New ids are 24 lowercase hexadecimal characters; older ids may be up to 28 lowercase letters and digits. | | `mode` | query | `readonly`, `readwrite` | Share presentation. Either value hides the sidebar. readonly shows the notebook's content and management views as a viewer sees them; your own account settings and appearance preferences stay editable. readwrite keeps the editing controls your permissions allow, including section and channel role overrides. Neither changes permissions. | | `sidebar` | query | `hidden` | Set to hidden to hide the notebook sidebar. | | `theme` | query | `oc-1`, `hc-black`, `aura`, `ayu`, `carbonfox`, `catppuccin`, `dracula`, `gruvbox`, `monokai`, `nightowl`, `nord`, `onedarkpro`, `shadesofpurple`, `solarized`, `tokyonight`, `vesper` | Colour theme id. | | `colorScheme` | query | `light`, `dark` | Light or dark colour scheme, over the saved preference. A page set to light or dark in its own appearance keeps it. | | `font` | query | `ibm-plex-mono`, `jetbrains-mono`, `fira-code`, `cascadia-code`, `hack`, `source-code-pro`, `inconsolata`, `roboto-mono`, `ubuntu-mono`, `intel-one-mono`, `meslo-lgs`, `iosevka` | Monospace font id. | Refused parameters: `widgetId` (mutating). ### sqlite Hoody SQLite studio: browse tables, run queries and manage key-value data. | View | Label | Path | Required | Frameable | Alias | Notes | |---|---|---|---|---|---|---| | `sqlite.overview` | Overview | `/` | none | yes | no | default | | `sqlite.tables` | Tables | `/tables` | none | yes | no | none | | `sqlite.query` | Query editor | `/query` | none | yes | no | none | | `sqlite.kvStore` | Key-value store | `/kv-store` | none | yes | no | none | | `sqlite.history` | History | `/history` | none | yes | no | none | | `sqlite.pragmas` | Pragmas | `/pragmas` | none | yes | no | none | #### `sqlite.overview` Opens the database overview. | Parameter | In | Values | Description | |---|---|---|---| | `db` | query | string | Path of the database file to open. A missing file is reported as an error, never created. | | `colorScheme` | query | `light`, `dark`, `system` | Force the light or dark colour scheme, or follow the system. | | `embed` | query | boolean | Compact chrome for embedding: a thin navigation bar instead of the full header. | #### `sqlite.tables` Opens the table browser, optionally with one table selected. | Parameter | In | Values | Description | |---|---|---|---| | `table` | query | string | Table to select. On the key-value view it names the key-value table (default kv_store). | | `db` | query | string | Path of the database file to open. A missing file is reported as an error, never created. | | `colorScheme` | query | `light`, `dark`, `system` | Force the light or dark colour scheme, or follow the system. | | `embed` | query | boolean | Compact chrome for embedding: a thin navigation bar instead of the full header. | #### `sqlite.query` Opens the SQL query editor. Nothing runs until you run a query. | Parameter | In | Values | Description | |---|---|---|---| | `db` | query | string | Path of the database file to open. A missing file is reported as an error, never created. | | `colorScheme` | query | `light`, `dark`, `system` | Force the light or dark colour scheme, or follow the system. | | `embed` | query | boolean | Compact chrome for embedding: a thin navigation bar instead of the full header. | #### `sqlite.kvStore` Opens the key-value store browser. | Parameter | In | Values | Description | |---|---|---|---| | `table` | query | string | Table to select. On the key-value view it names the key-value table (default kv_store). | | `db` | query | string | Path of the database file to open. A missing file is reported as an error, never created. | | `colorScheme` | query | `light`, `dark`, `system` | Force the light or dark colour scheme, or follow the system. | | `embed` | query | boolean | Compact chrome for embedding: a thin navigation bar instead of the full header. | #### `sqlite.history` Opens the query history. | Parameter | In | Values | Description | |---|---|---|---| | `db` | query | string | Path of the database file to open. A missing file is reported as an error, never created. | | `colorScheme` | query | `light`, `dark`, `system` | Force the light or dark colour scheme, or follow the system. | | `embed` | query | boolean | Compact chrome for embedding: a thin navigation bar instead of the full header. | #### `sqlite.pragmas` Opens the database pragma settings. Nothing changes until you save. | Parameter | In | Values | Description | |---|---|---|---| | `db` | query | string | Path of the database file to open. A missing file is reported as an error, never created. | | `colorScheme` | query | `light`, `dark`, `system` | Force the light or dark colour scheme, or follow the system. | | `embed` | query | boolean | Compact chrome for embedding: a thin navigation bar instead of the full header. | Refused parameters: `sql` (not-supported). ### notifications Notification landing page: recent notifications and a live feed from all displays, plus a test sender for one display. | View | Label | Path | Required | Frameable | Alias | Notes | |---|---|---|---|---|---|---| | `notifications.landing` | Notifications | `/` | none | yes | yes (display selects) | default | #### `notifications.landing` Recent and live notifications from every display, with a button to send a test notification to one display. | Parameter | In | Values | Description | |---|---|---|---| | `display` | query | string | Display number to send the test notification to. Takes precedence over the display named by the host. The feed always shows every display. | | `displays` | query | string | Alternative name for display; read only when display is absent. | ### pipe Browser pages for streaming data through a named pipe path: send files or text, receive downloads, share a screen, camera or microphone, watch video, and follow a transfer's progress. | View | Label | Path | Required | Frameable | Alias | Notes | |---|---|---|---|---|---|---| | `pipe.send` | Send | `/api/v1/pipe/` | none | yes | no | default | | `pipe.noscript` | Send without JavaScript | `/api/v1/pipe/noscript` | none | yes | no | none | | `pipe.progress` | Progress | `/api/v1/pipe/{path}` | `path` | yes | no | none | | `pipe.video` | Video player | `/api/v1/pipe/{path}` | `path` | yes | no | changes state | | `pipe.share` | Share screen, camera or audio | `/api/v1/pipe/{path}` | `path` | yes | no | none | | `pipe.receive` | Receive | `/api/v1/pipe/{path}` | `path` | yes | no | none | #### `pipe.send` The page for sending a file or text to a pipe path. Its fields can be pre-filled, except the file itself, which the user picks; nothing is sent until the user confirms. | Parameter | In | Values | Description | |---|---|---|---| | `name` | query | string | Pipe name to pre-fill on the send page, without a leading slash. The values . and .. as a segment, control characters, backslashes and the reserved names help, noscript, health, metrics, favicon.ico and robots.txt are refused. Absent: the page picks a random name. | | `n` | query | integer (≥ 1, ≤ 256) | How many receivers the transfer waits for, from 1 to 256. It pre-fills the receivers field; nothing is sent or received until the user confirms on the page. | | `text` | query | string | Text to pre-fill on the send page; it selects text mode unless mode says otherwise. | | `mode` | query | `file`, `text` | Whether the form sends a file or typed text. Defaults to file, or on the send page to text when text is given. | | `filename` | query | string | A file name to pre-fill: on the send page the name given to a text or pasted send, on the receive page the download name. | #### `pipe.noscript` A plain HTML form for sending a file or text to a pipe path, for browsers without JavaScript. | Parameter | In | Values | Description | |---|---|---|---| | `path` | query | string | Pipe path to prefill in the form, without a leading slash. Letters, digits and the characters . _ ~ : @ ! $ & ' ( ) * + , ; = % - only. The values . and .., and the reserved names help, noscript, health, metrics, favicon.ico and robots.txt are refused. | | `mode` | query | `file`, `text` | Whether the form sends a file or typed text. Defaults to file, or on the send page to text when text is given. | | `wait` | query | integer (≥ 1, ≤ 3600) | Seconds the page's own transfer waits for the other side, from 1 to 3600 (default 300): on the receive page how long the download waits for the sender, on the video player how long the player waits for the stream, on the send page without JavaScript how long the send waits for the receivers. It changes no other participant's wait. | | `sha256` | query | `1` | 1 to have the kit compute a SHA-256 digest of the transfer the page starts: the receive page's download or the send of the page without JavaScript. Leave it out for none. The page without JavaScript shows the digest in its send result; the receive page shows none (the digest goes to the sender's status). | #### `pipe.progress` A live view of a transfer's progress on a pipe path. It only observes; it does not receive the data. | Parameter | In | Values | Description | |---|---|---|---| | `path` | path | string | The pipe path the sender uses, without a leading slash. Each segment is percent-encoded. | Always sent: `progress=true`. #### `pipe.video` A video player for a video streamed to a pipe path. Opening it starts receiving: the player takes the stream as one of the transfer's receivers or, with live, joins a live stream from now on. | Parameter | In | Values | Description | |---|---|---|---| | `path` | path | string | The pipe path the sender uses, without a leading slash. Each segment is percent-encoded. | | `live` | query | `1` | 1 for a live stream. On the share page it pre-ticks Live: once the user starts, viewers join and leave at any time, and the receivers count is hidden and not used. On the video player the player joins a live stream from now on and keeps up with the newest data. Any n is then ignored. | | `wait` | query | integer (≥ 1, ≤ 3600) | Seconds the page's own transfer waits for the other side, from 1 to 3600 (default 300): on the receive page how long the download waits for the sender, on the video player how long the player waits for the stream, on the send page without JavaScript how long the send waits for the receivers. It changes no other participant's wait. | Always sent: `video=true`. #### `pipe.share` A page that streams the user's screen, camera or microphone live to a pipe path, for viewers on the video view. Capture starts only on the user's click. In an iframe, give the frame allow="display-capture; camera; microphone; autoplay". | Parameter | In | Values | Description | |---|---|---|---| | `path` | path | string | The pipe path the sender uses, without a leading slash. Each segment is percent-encoded. | | `source` | query | `screen`, `camera`, `audio` | What the share page captures: screen (default), camera or audio (microphone only). | | `audio` | query | `1`, `0` | 1 to also capture audio when sharing a screen, 0 (default) for none. | | `surface` | query | `monitor`, `window`, `browser` | Which kind of surface the browser's screen picker offers first: monitor, window or browser (tab). A hint; the user still picks. | | `quality` | query | `low`, `medium`, `high` | Video quality of the share: low, medium (default) or high. | | `fps` | query | integer (≥ 1, ≤ 60) | Frames per second of the share, from 1 to 60 (default 30). | | `n` | query | integer (≥ 1, ≤ 256) | How many receivers the transfer waits for, from 1 to 256. It pre-fills the receivers field; nothing is sent or received until the user confirms on the page. | | `live` | query | `1` | 1 for a live stream. On the share page it pre-ticks Live: once the user starts, viewers join and leave at any time, and the receivers count is hidden and not used. On the video player the player joins a live stream from now on and keeps up with the newest data. Any n is then ignored. | Always sent: `share=true`. #### `pipe.receive` A page for receiving what is sent to a pipe path as a download. It shows the transfer state and starts the download only on the user's click. | Parameter | In | Values | Description | |---|---|---|---| | `path` | path | string | The pipe path the sender uses, without a leading slash. Each segment is percent-encoded. | | `n` | query | integer (≥ 1, ≤ 256) | How many receivers the transfer waits for, from 1 to 256. It pre-fills the receivers field; nothing is sent or received until the user confirms on the page. | | `filename` | query | string | A file name to pre-fill: on the send page the name given to a text or pasted send, on the receive page the download name. | | `wait` | query | integer (≥ 1, ≤ 3600) | Seconds the page's own transfer waits for the other side, from 1 to 3600 (default 300): on the receive page how long the download waits for the sender, on the video player how long the player waits for the stream, on the send page without JavaScript how long the send waits for the receivers. It changes no other participant's wait. | | `sha256` | query | `1` | 1 to have the kit compute a SHA-256 digest of the transfer the page starts: the receive page's download or the send of the page without JavaScript. Leave it out for none. The page without JavaScript shows the digest in its send result; the receive page shows none (the digest goes to the sender's status). | Always sent: `receive=true`. Refused parameters: `download` (mutating), `autostart` (mutating), `status` (non-ui), `transfer` (non-ui), `ws` (mutating). ### cron Cron manager: browse and edit the crontab entries of each user. | View | Label | Path | Required | Frameable | Alias | Notes | |---|---|---|---|---|---|---| | `cron.manager` | Cron manager | `/` | none | yes | yes | default | #### `cron.manager` Lists users and their cron entries; changes are made only through the page controls. ### bot Management pages for chat-channel bot registrations. | View | Label | Path | Required | Frameable | Alias | Notes | |---|---|---|---|---|---|---| | `bot.index` | Bot registrations | `/` | none | yes | no | default | | `bot.detail` | Registration | `/api/v1/bot/ui/registrations/{registrationId}` | `registrationId` | yes | no | none | | `bot.confirmDelete` | Confirm deletion | `/api/v1/bot/ui/registrations/{registrationId}/delete` | `registrationId` | yes | no | none | #### `bot.index` Lists every bot registration of the owner, with a form to register a new one. #### `bot.detail` One bot registration with its state and its start and stop controls. | Parameter | In | Values | Description | |---|---|---|---| | `registrationId` | path | string | Registration id, as returned when the bot was registered or listed. | #### `bot.confirmDelete` Asks for confirmation before a registration is deleted. Opening this page deletes nothing. | Parameter | In | Values | Description | |---|---|---|---| | `registrationId` | path | string | Registration id, as returned when the bot was registered or listed. | ### run A results page that lists the applications matching a name, with their versions and the provider each comes from. | View | Label | Path | Required | Frameable | Alias | Notes | |---|---|---|---|---|---|---| | `run.results` | Results | `/api/v1/run/resolve` | `app` | yes | no | default | #### `run.results` The list of applications matching a name. It only looks them up; nothing is installed or started. | Parameter | In | Values | Description | |---|---|---|---| | `app` | query | string | Name of the application to look up. | | `os` | query | `linux`, `windows`, `any` | Target operating system of the application. | | `source` | query | array[] | Source types to search: `nix`, `pkgx`, `appimage`, `oci` (Docker images already on the machine), `registry`, `system` or `any`. Repeat the key for several types. | | `kind` | query | `gui`, `cli`, `any` | Graphical or terminal applications. | | `arch` | query | `amd64`, `arm64`, `any` | Target CPU architecture. | | `profile` | query | string | Named preference profile to apply to this lookup; without it, the selected profile applies. The results page appears only when the profile leaves `pick` unset or set to `ask`: a profile that picks a result answers with JSON instead. | | `version` | query | string | Package version for pkgx candidates: the listed pkgx entry runs that version. It does not change which applications are listed. | | `repo` | query | string | Limits the GitHub-release applications to the configured repository with this name. | | `release` | query | string | Release tag to use for GitHub-release applications. | | `asset` | query | string | Asset-name filter for GitHub-release applications; with no matching asset the application is not listed. | | `limit` | query | integer (≥ 1, ≤ 100) | Maximum number of candidates, 1 to 100. The page lists at most 50. | Always sent: `format=html`. Refused parameters: `pick` (non-ui), `pick_index` (non-ui), `candidate_id` (non-ui), `set_id` (non-ui), `terminal_id` (non-ui), `display` (non-ui), `dry_run` (non-ui), `print_curl` (non-ui), `origin` (mutating). ### watch A short information page about the watch service. | View | Label | Path | Required | Frameable | Alias | Notes | |---|---|---|---|---|---|---| | `watch.index` | About | `/` | none | yes | no | default | #### `watch.index` A static page describing the watch service and where its API starts. ### exec Pages served by your own scripts. The address runs the script mapped to the path, and the script decides what is returned. | View | Label | Path | Required | Frameable | Alias | Notes | |---|---|---|---|---|---|---| | `exec.script` | Script page | `/{path}` | `path` | yes | no | default, starts a process, changes state | #### `exec.script` The response of your script for the given path. Opening it runs the script; any query parameters are passed to it unchanged. | Parameter | In | Values | Description | |---|---|---|---| | `path` | path | string | Path of the script route to open, without the leading slash. Each segment is percent-encoded; the slashes between segments are kept. | Any other query parameter is passed through unchanged. ### http Whatever the application listening on the chosen port serves. | View | Label | Path | Required | Frameable | Alias | Notes | |---|---|---|---|---|---|---| | `http.content` | App content | `/{path}` | none | yes | no | default | #### `http.content` A path of the application on this port, with any query the caller passes. | Parameter | In | Values | Description | |---|---|---|---| | `path` | path | string | Path inside the application, encoded segment by segment. | Any other query parameter is passed through unchanged. ### https Whatever the application listening on the chosen port serves. | View | Label | Path | Required | Frameable | Alias | Notes | |---|---|---|---|---|---|---| | `https.content` | App content | `/{path}` | none | yes | no | default | #### `https.content` A path of the application on this port, with any query the caller passes. | Parameter | In | Values | Description | |---|---|---|---| | `path` | path | string | Path inside the application, encoded segment by segment. | Any other query parameter is passed through unchanged. ## What's next - [Kit services](/kit/) describes what each kit does once its UI is open. - [Proxy](/concepts/proxy/) covers aliases, custom domains and permission rules for the URLs you embed. - [Security](/concepts/security/) explains the open-by-default model and how to lock a container down before sharing it.