Personas
A persona is a named character the assistant can switch into: its own instructions, and optionally its own model and sampling. Each one is a file, ~/.config/kaja/marketplace/personas/<id>.toml, and the file name is the persona’s id.
Every persona in the folder loads, default first, and the persona picker shows the ones you added yourself in a different colour; rename or move a file to switch it off. A fresh install has default built in, and a default.toml in the folder (the marketplace brings one) replaces it.
label = "Self-care companion"
when = "the user talks about their day, feelings, mood, or personal struggles"
temperature = 0.3
instructions = """
You are a warm, grounded self-care companion.
Listen first. Reflect back what you heard before offering anything.
"""
| Field | Purpose |
|---|---|
label | display name (required) |
instructions | system-prompt text for this persona |
when | short clause telling the model when to switch here on its own |
dataset | id of a dataset this persona collects |
models | a model id per task from your models.toml, like chat = "reasoning-chat" |
abilities | the abilities this persona uses, by name (see below). Unset means only the built-in tools |
localOnly | true keeps the persona out of the cloud, for one whose abilities only work on your machine |
| sampling | temperature, top_p, top_k, max_tokens, frequency_penalty, presence_penalty, seed |
Kaja already tells the model to ask questions through
ask_userand how to collect a dataset. Don’t repeat either ininstructions.
Abilities
A persona’s abilities list decides which skills, HTTP tools, MCP servers and code tools the model gets while it’s active. Built-in tools (files, memory, ask_user and the rest) don’t depend on it. A name uses every part of that ability; a table tweaks one:
abilities = [
"web-search", # every part of the ability
{ name = "chrome-devtools", tools = ["navigate_page", "take_screenshot"] }, # only these tools
{ name = "meeting-notes", skill = "sticky" }, # the skill's instructions stay in the system prompt
{ name = "system-report", skill = "off" }, # the ability's tools, without its skill
{ name = "filesystem", roots = ["~/notes", { path = "~/site", readOnly = true }] } # the folders it may work in
]
| Key | Purpose |
|---|---|
name | the ability’s folder name |
skill | load (listed under ## Skills, loaded with load_skill when needed), sticky (always in the system prompt, its other files still opened with load_skill) or off. Unset follows the SKILL.md’s sticky, else load |
tools | only these of the ability’s tools; unset means all of them |
roots | the folders an MCP server that takes roots (like filesystem) may work in while this persona is active. Absolute paths or ~/…; one that isn’t an existing folder is left out with a warning. Without any, that ability is off for the persona. { path = "…", readOnly = true } lets it only read there, and backup = true has Kaja copy each file before it’s changed (see MCP servers) |
An ability that needs a key you haven’t saved is left out, and the rest still load. Shipped personas list no roots, and kaja abilities update would replace your edits to them, so give folders in a persona of your own. An MCP server starts only when a persona that lists it becomes active, so a chat that never needs the browser never starts one.
Switching
Every persona’s when goes into the system prompt, so the model can call switch_persona on its own mid-conversation. A persona without when can only be reached from the persona picker.
- Automatic (
switch_persona) keeps the current conversation going. - Manual (the picker) starts a fresh one, and isn’t remembered: every launch starts from
default.
The new persona’s abilities apply from the next model call: its tools replace the old ones, and its MCP servers connect then. A persona with a models pin swaps the model too, otherwise the current one stays. A pin to an id your models.toml doesn’t have (expected for a persona written elsewhere) falls back to that task’s default instead of failing to load.
Both work in cloud mode too, among every persona in the cloud’s copy of the marketplace.
Shipped personas
| Id | What it does |
|---|---|
default | fallback for anything no other persona fits; uses every marketplace ability |
care | self-care companion: listens, reflects, doesn’t lecture |
barkochba | plays Twenty Questions, asking through ask_user |
onboarding | walks a new user through the onboarding profile; uses geo-service, time and open-meteo |
config-hyprland | changes your Hyprland desktop live (Lua config): previews, saves on your yes, backs up ~/.config/hypr files first; local only |
Read them in marketplace/personas.
Next: