Saggar links
A Saggar link proposes one action to the Mac app. The app shows its source and the complete request, then waits for the user to confirm. Opening a link never changes settings, creates a session, runs a prompt, or writes a skill by itself.
The canonical shape is:
https://saggar.marginalutility.dev/open/v1/{action}?{parameters}
v1 supports five actions:
| Action | Parameters | Result after confirmation |
|---|---|---|
navigate | Optional pane | Opens Saggar or a Settings pane. |
settings | One or more supported setting keys | Shows and applies an exact before-and-after diff. |
session | name, command | Adds an enabled session preset. |
prompt | prompt, provider, model, optional title | Opens an agent session and runs the visible prompt. |
skill | id, provider | Installs a skill shipped inside this Saggar build for one provider. |
Supported setting keys are appFontScale, optionAsMetaKey,
terminalFontSize, and terminalScrollback. Links can't change remote access,
accounts, credentials, grants, or secrets.
Add a button to a docs page
Import the shared component, then pass typed parameters:
import SaggarLink from '@site/src/components/SaggarLink';
<SaggarLink
action="session"
parameters={{name: 'Review', command: 'codex'}}
>
Add the Review session
</SaggarLink>
Open Provider settings
Use a button label that names the action. Don't use a generic “Confirm” or “Continue” label.
Trust and limits
Universal links delivered from the public Saggar site appear as official. The
browser fallback uses saggar:// and always appears as unverified, even when it
claims to come from the public site. Both paths require the same native confirmation.
The parser rejects unknown actions, duplicate parameters, unsupported versions, and oversized URLs. Prompts are limited to 4,000 bytes, commands to 1,000 bytes, and the whole URL to 8,192 bytes. Links can't contain arbitrary skill files or direct shell-execution actions.