Skills
A skill is a reusable instruction document stored in your workspace. You write it once — describing a process, a pattern, a set of rules, or a multi-step workflow — and then make it available to any agent that needs it. When an agent has a skill in its allowed list, it can read and apply that knowledge during any conversation or automated run.
Skills are the primary way you encode institutional knowledge and standard operating procedures into your agents without hardcoding everything into each bot's base instructions.
What a skill is
Each skill is a row in the skills table with a workspace_id, a name, an optional description, and a content field that holds a TipTap JSON document. The document is also stored as content_text (plain markdown) for use by the AI layer.
Skills support inline references using [label](ref:entity_type:uuid/alias_id) syntax. You can reference routines, functions, other skills, bots, users, and teams inside a skill document. The database maintains a linked_entities cache (gin-indexed) that tracks every entity referenced in the skill — useful for reverse lookups ("which skills reference this routine?").
Skills are workspace-scoped: they are visible and editable by all workspace editors and admins, but they do not bleed between workspaces.
Built-in skills
Coming soon. No pre-seeded built-in skills ship with the current version of Onnie. The skills table and all scaffolding are in place; the install/export bundle flow (for distributing packaged skill sets) is specced but not yet built.
When bundled skill packs land, you will be able to install them from the workspace skill library without writing any content yourself.
Custom skills
Any workspace editor or admin can create a skill. Open the workspace skill library, click New Skill, and write the content in the editor. The document supports the same rich content and reference syntax as pages.
Some patterns that work well as skills:
- SOPs. Step-by-step procedures — "how to triage a support ticket" or "how to write a status update."
- Domain rules. Constraints specific to your team — column naming conventions, required fields in a given table, escalation thresholds.
- Sub-workflows. A multi-step sequence that several bots all need to know — "extract action items from a transcript and create tasks."
- Tool recipes. Specific patterns for calling a Function or chaining several tools, with examples of good output.
How agents pick a skill
When an agent is called, it receives the content of any skills in its allowed_skills list as part of its working context. The agent doesn't "choose" a skill at runtime the way it picks a tool — skills are always-on instructions, not on-demand lookups.
To give a bot access to a skill, add the skill's alias ID or UUID to the bot's allowed_skills field in the Onniebots configuration panel. Setting allowed_skills to null (the default) means the bot can see all skills in the workspace.
Agent Routines inherit the skill access of the bot they run under. A workspace-level routine with no bot specified inherits the workspace default (all skills visible).
Referencing other entities in a skill
Because skills are TipTap documents, they support the full inline reference syntax. You can embed a live reference to a routine, a function, another skill, a bot, a user, or a team using [label](ref:entity_type:uuid/alias_id). For bots the entity type is engine_bot.
Example: [Triage Bot](ref:engine_bot:aB3kR7mN2pQx) — clicking this in the docs panel opens the bot detail. The linked_entities column is updated automatically whenever the skill is saved, so you can query "which skills reference this bot?" without scanning the document text.
This is useful for skills that describe the division of labor between bots: "Hand off research tasks to Research Bot and writing tasks to Writer Bot."
Skill permissions
All workspace editors and admins can read and write skills (skills: editor write RLS policy). Viewers can read skills (skills: read). Skills are not project-scoped — they live at the workspace level. If you need project-specific agent instructions, put them in the project's onnie_md field instead.