Projects
A project is one git repository that holds your agents, skills, tools, memory and kortix.yaml: its layout, how a change takes effect, its settings, feature flags and deletion.
A project is one git repository with kortix.yaml at its root. It holds your agents, skills, tools, memory, triggers and connector declarations as files. This page is for the people who set up a project and keep it running.
What a project is
- One repository, one default branch. Every session starts on its own branch from the default branch. Every change request merges back into it. A session reads config from its base branch: the default branch unless the session was created with another
base_ref. Triggers read the default branch. - Config is files. Agents, skills, tools and memory are files in the repository. You change them with a commit, not in a separate config store. Secret values, feature flags and reminders live on the platform, not in git.
- Managed, GitHub or any other git host. All three work the same once the project exists. See Your project’s repository.
Each branch of a GitHub repository can be its own project. main and dev can run as two projects, each with its own sessions and change requests.
A project is not your codebase. Every session clones the project, so keep it small. When a task needs a codebase, the agent clones that repository in the session, does the work, and opens a change request there. Do not add kortix.yaml to an existing codebase. Create a dedicated project and point its agents at the repositories they work on.
To create a project, follow the Quickstart.
Repository layout
- kortix.yaml
- AGENTS.md
- agents/
- kortix.md
- skills/
- my-skill/
- SKILL.md
- my-skill/
- memory/
- MEMORY.md
- tools/
- lookup_order.ts
- harnesses/
- opencode/
- opencode.jsonc
- plugins/
- tools/
- commands/
- pi/
- settings.json
- extensions/
- skills/
- prompts/
- opencode/
| Path | Holds | Read by |
|---|---|---|
kortix.yaml |
The manifest: agent grants, tools, triggers, connectors, env names, sandbox templates. See the kortix.yaml reference. |
Kortix |
AGENTS.md |
Instructions for every agent of the project. pi reads CLAUDE.md when the root has no AGENTS.md. |
Both harnesses |
agents/<name>.md |
One agent: frontmatter and prompt. See Agents & permissions. | Both harnesses |
skills/<name>/SKILL.md |
One skill, plus any reference files beside it. | Both harnesses |
memory/ |
The project memory. See Memory. | Agents, through the memory tool |
tools/<name>.ts |
Project tools, declared under tools: in kortix.yaml. Any folder works. See Tools. |
Both harnesses |
harnesses/opencode/ |
opencode.jsonc, plugins/, tools/, commands/. |
OpenCode only |
harnesses/pi/ |
settings.json, extensions/, skills/, prompts/. A new project does not have this folder. |
pi only |
- A
kortix_version: 3project reads no harness folder. Its slash commands are declared inkortix.yaml; see commands (v3). agents.<name>.file,opencode.config_dirandpi.config_dirinkortix.yamlmove an agent file or a harness folder to another path.- The manifest path is a project setting,
kortix.yamlby default. See File and schema. - A project that keeps agents and skills under
.kortix/opencode/and memory under.kortix/memory/works unchanged. Every reader accepts both layouts. - To remove a project skill, open its card under Customize → Skills and select Remove, or run
kortix marketplace uninstall skills/<name> --yes. One commit on the default branch deletes the folder with every file in it and takes the skill off every agent’sskillslist. The platformkortix-*skills have no Remove.
What a new project contains
A new project starts from the general starter. It commits these files to the default branch:
| Item | What it is |
|---|---|
kortix agent |
The primary agent and the default_agent. It has access to all connectors, secrets, skills and Kortix permissions. Edit agents/kortix.md to specialize it. |
harness-reflector agent |
Reviews recent sessions, then improves prompts, skills, tools and memory. It opens one change request titled harness: … and never merges. It has no connectors and no secrets. |
session-reviewer agent |
A subagent of harness-reflector. It reviews one session and reports what went wrong. |
harness-reflector trigger |
A cron trigger that runs harness-reflector daily at 03 UTC. It ships with enabled: false. |
| Skills | kortix-cli, agent-browser, convert-documents-to-markdown, design-foundations, docx, pdf, presentations, web-publishing-and-deployments, webapp, website-building, xlsx. |
| Tools | The five Kortix tools under tools:: web_search, image_search, scrape_webpage, memory, show. |
memory/MEMORY.md |
The empty memory index. |
harnesses/opencode/ |
opencode.jsonc, package.json and the terminal plugin under plugins/. |
Kortix adds 12 managed kortix-* skills to every session when it boots, kortix-cli among them. They overwrite a committed copy with the same name. See Agents & permissions. Read one with kortix system-skills get <name>.
To turn on the reflection loop, change enabled: false to enabled: true on the harness-reflector trigger in kortix.yaml and merge the change. Keep its prompt: unchanged. Each run starts a session in its own sandbox.
Create a project with kortix init
kortix init my-agent && cd my-agent
kortix init [project-name] creates a new directory from the general starter. It writes kortix.yaml, agents/, skills/, memory/ and harnesses/opencode/, runs git init -b main, and asks which local coding tools to wire. It refuses a directory that exists and is not empty.
| Flag | Effect |
|---|---|
--name <project> |
Same as the positional project name. |
--primary <tool> |
The primary local coding tool: opencode, claude, codex, pi or cursor. Default codex. |
--agents <list> |
Comma-separated extra tools to wire. Codex, pi and Cursor also get a root AGENTS.md pointer. |
--force |
Wire local tools into the current directory in place. The directory must be a cloned Kortix project, for example after kortix projects clone. |
--overwrite |
Replace existing starter files. Without it, init keeps them. |
--no-git |
Skip git init. |
-y, --yes |
No prompts. Needs a project name. |
kortix init does not create the cloud project and does not write .kortix/link.json. The first kortix ship does both. See The first ship. The local tool wiring never changes how sessions run in the cloud.
Memory
memory/ holds what the project knows about itself: its purpose, connections, conventions and decisions. memory/MEMORY.md is the index, with one line per file.
- Read. Kortix does not put memory into the prompt. The managed
kortix-memoryskill tells an agent to readMEMORY.mdat the start of a task, then the files the index points to. - Write. The
memorytool (memory: kortix:memoryundertools:) views, creates, edits, inserts into, renames and deletes files undermemory/only. Without that line, agents edit the files with their file tools. - Persist. A memory edit is an ordinary file change on the session branch. Other sessions see it only after a change request merges it into the default branch.
- Curate.
harness-reflectorcleans up memory on each run when its trigger is on.
Do not write secrets or personal data into memory. Store credentials as secrets.
Install from the marketplace
The marketplace lists skills and agents you can add to a project. Browse it at kortix.com/marketplace or from the CLI:
kortix marketplace search pdf # search by text
kortix marketplace list --type skill # filter by type; --source kortix filters by source
kortix marketplace show <id|name> # one item
kortix marketplace install <id|name> # import into the linked project
install starts a session in the project. Its agent reads the item, adds what fits, and opens a change request. The install never merges: you review and merge the change request. --project <id> picks another project. --timeout <seconds> sets the deadline (default 300).
| Exit code | Meaning |
|---|---|
0 |
A skill item is configured and its files are on the default branch. Other item types end with 3. |
1 |
The install failed. The message names the session to inspect. |
2 |
Usage error: a missing item id or name, or an invalid --timeout. |
3 |
The session ended. Review its change request or finish setup. |
124 |
The deadline passed. The session can still be running. |
The marketplace feature flag gates install. It is on by default. With the flag off, install answers 403 feature_disabled. search, list and show keep working.
How a change takes effect
| Change | When it reaches sessions |
|---|---|
A commit that reaches the default branch: agents, skills, tools, harness files, kortix.yaml |
Each commit is a new config release. New sessions start on it. Running sessions converge to it in the background. A session that is behind converges when its current turn ends, and its next turn runs the new config. A prompt never waits for it. |
An edit inside a session’s /workspace |
Never on its own. It takes effect only when a change request merges it into the default branch. |
| A secret value | Kortix pushes it to the project’s running sandboxes. |
| A sandbox template | Sessions that start after the change. Running sandboxes keep their image. |
| A feature flag | At once. pi_harness applies to new sessions; an existing session keeps its harness. us_region and drives apply to new sessions. |
To force a running session onto the newest config, run kortix sessions reload <session_id>. It restarts the agent runtime and refuses during a turn unless you pass --force. Config comes from the base branch explains releases and fallback.
Project settings
Open Customize → Settings in a project. The sections:
| Section | What you set |
|---|---|
| General | The project name and icon. Danger zone holds Delete workspace. |
| Git repo | The repository, its status, the default branch (labeled Base branch), the manifest file, and who can reach the repository. |
| Sandbox templates | The image recipe for a session’s sandbox, and the record of each build. See Sandboxes & previews. |
| Feature flags | Per-project switches. See Feature flags. |
| Upgrades | Changes an agent makes to the project. Every run opens a change request. Nothing merges on its own. |
The same settings from the CLI:
kortix projects info # the linked or default project (--json)
kortix projects set --name "My project"
kortix projects set --branch main # default branch
kortix projects set --manifest kortix.yaml # manifest path
A project on kortix.toml migrates with Upgrades or kortix projects upgrade. See Migrate from kortix.toml.
kortix projects set needs project.settings.write. It writes only the fields you pass. --project <id> acts on another project. Which project a command uses explains the default.
Feature flags
A feature flag turns one surface on or off for one project. Kortix stores the flag on the project, never in kortix.yaml. A flag does not travel with a clone or a fork, and it changes nothing in other projects.
Turn a flag on or off
-
Web: Customize → Settings → Feature flags. Each row shows its origin: Default on, Default off, Overridden for this project or Managed by Kortix.
-
CLI:
kortix projects features # every flag: state (on, off, n/a) and origin (default, override, kortix, unavailable) kortix projects features enable reminders kortix projects features disable reminders kortix projects features reset reminders # clear the override; follow the defaultAdd
--project <id>for another project and--jsonfor machine output. -
API:
PATCH /v1/projects/<project_id>/featureswith{"feature": "reminders", "enabled": true}.falseturns it off.nullclears the override. -
SDK:
kortix.project(projectId).updateFeatureFlag('reminders', true).useFeatureFlag(projectId, key)from@kortix/sdk/reactreads the effective state. See React.
A write needs project.settings.write. An unknown key answers 400 Unknown feature flag '<key>'.
A flag the deployment does not support is unavailable. It stays off whatever the project sets. Settings hides it, and the CLI prints state n/a with origin unavailable.
A toggle of these flags also updates running state. The API response does not wait for it.
agentmail_email: the email channel connector appears or goes.event_triggers: app-event subscriptions start or stop.connectors_v2: the Telegram channel connector appears or goes. Withevent_triggerson, the app events that Kortix checks start, or move toerrorand stop.genui: warm sandboxes from before the toggle are not used for new sessions.
Every flag
| Flag | Name | Default | Stability | Available | When on |
|---|---|---|---|---|---|
marketplace |
Marketplace | On | Beta | Always | Install marketplace items into the project. See Install from the marketplace. |
connectors_api_discover |
Connectors API Discover | Off | Beta | Always | Browse direct API, MCP, GraphQL, CLI and Postman surfaces when you add a connector. |
agentmail_email |
AgentMail Email | Off | Experimental | Always | Inbound email starts and continues sessions. See Slack, Teams & email. |
meta_agent |
Meta Agent | Off | Experimental | Always | Adds a platform coordinator agent that starts and manages other sessions. It becomes the default agent for a new session that names no agent. See Agents & permissions. |
session_log_restore |
Session log restore | Off (on by default on the Kortix dev deployment). Kortix turns it on per project. | Experimental | Always | A session whose sandbox lost the conversation (a new sandbox, or a sandbox whose saved conversation is older than the session log) gets it back from the session log when the sandbox starts. A session log over the restore limit (24 MB by default; attachments count at two fifths of their size) is not loaded: the agent gets a note instead, and the session page shows a notice. Off: the sandbox keeps what it has. Settings does not list this flag. |
monitors |
Monitors | Off | Experimental | With Platinum sandboxes (PLATINUM_API_KEY) |
24/7 watchers from your repo fire trigger events into sessions. See Monitors. |
reminders |
Reminders | On | Beta | Always | Scheduled re-prompts of one session, and kortix remind. Off: existing reminders do not fire. See Reminders. |
warm_sessions |
Warm Sessions | Off | Beta | Always | Keeps one sandbox booted per person while the project is open, so a new session starts without a cold boot. The warm sandbox uses compute while it waits. See Warm sessions. |
secrets_egress |
Network-Enforced Secrets | On | Experimental | Always | Offers the “Enforce at the network” option for a secret. Off: every secret loads into the sandbox environment. See Secrets. |
pooled_provider_secrets |
Pooled Provider Secrets | Off | Experimental | Always | Members connect their own ChatGPT subscriptions and provider keys, share them, and choose which ones each session uses. See Models. |
pi_harness |
Pi Harness (in-sandbox) | On | Experimental | Always | New sessions boot pi instead of OpenCode. Off: runtime: pi in kortix.yaml still selects pi. See Harnesses. |
genui |
Generative UI | Off | Experimental | Always | The agent may answer with cards, comparisons, charts, maps and tabs instead of long text. Each new session of the project lists the kortix-genui system skill, and the agent loads it when an answer needs UI. Off: the skill is hidden and the agent writes markdown only; blocks already in a transcript still render. A running or restarted session keeps its setting until you start a new session. See Generative UI. |
us_region |
US Region | Off | Experimental | With Platinum and a configured US region (PLATINUM_API_KEY, KORTIX_PLATINUM_US_REGION) |
New Platinum sandboxes start in the US region. This moves compute only, not the API, database or archives. Existing sandboxes keep their region. If the image cannot be copied to the region, the session starts in the home region. See Sandboxes & previews. |
event_triggers |
App event triggers | Off | Beta | Always | Events in connected apps start agents. Off: the event routes answer feature_disabled, and a type: event trigger has status error. See App events. |
connectors_v2 |
Connectors v2 | Off | Experimental | Always | The MCP app catalog in Customize → Connectors, with sign-in that Kortix runs. With event_triggers on, Kortix checks those apps for new items and starts agents: source mcp in App events. Telegram as a channel. New connector accounts are not shared with the whole project by default. Off: Discover lists the managed apps, and mcp event triggers have status error. |
notification_center |
Notification Center | Off | Beta | Always | A bell inbox, browser push and email for the people a session concerns, plus trigger and reminder alerts. Off: only the session creator’s phone gets a session push, and an account owner’s phone gets one when a trigger starts failing. See Notifications. |
agent_rooms |
Rooms | Off | Experimental | Always | Named chat rooms where agent sessions and people post. Off: nothing of Rooms exists in the project. On: the Rooms page, the kortix rooms command and the kortix-rooms agent skill appear. |
volumes |
Volumes | Off | Experimental | With Platinum (PLATINUM_API_KEY) |
Shared Files for the project: the Files page and the drives flag. See Files. |
goals |
Goals | Off | Experimental | With Platinum (PLATINUM_API_KEY) |
An agent owns an objective until an independent check confirms it: it plans, works, waits, chases people, and keeps its state in a Goals/ folder in Files. Needs volumes and reminders on. Off: kortix goals new refuses; a goal that already exists keeps running. |
drives |
Files | Follows the project’s volumes flag |
Experimental | With Platinum (PLATINUM_API_KEY) |
Shared folders under /drives in new sessions. See Files. |
When a flag is off
A route behind an off flag answers 403:
{
"error": "Reminders is not enabled for this project. Enable it in Settings → Feature flags.",
"code": "feature_disabled",
"feature": "reminders"
}
Branch on code, never on error. The SDK exports isFeatureDisabledError(error) and featureDisabledKey(error). The error text has three forms:
| Flag kind | error |
|---|---|
| A normal flag | <Name> is not enabled for this project. Enable it in Settings → Feature flags. |
A flag managed by Kortix (session_log_restore) |
<Name> is not enabled for this project. Contact Kortix to enable it. |
A flag that follows the project’s Volumes flag (drives) |
<Name> is not enabled for this project. Turn on Volumes in Settings → Feature flags. |
volumesis an ordinary project flag. It is listed only on a deployment with Platinum.drivesfollows the project’svolumesflag. It is never listed. A write answers400. With Volumes off, every Files write answers403feature_disabled, and a file a session already wrote under/drivesstill opens.
Delete a project
- Open Customize → Settings → General.
- Under Danger zone, select Delete workspace and confirm.
From the CLI, run kortix projects rm [<project_id>]. It acts on the linked project when you pass no id. -y skips the confirmation. Both need project.delete. A delete cannot be undone.
Kortix deletes a managed repository with the project. A repository you connected yourself is left untouched.
| Way in | After the delete |
|---|---|
LLM gateway keys (kortix_gw_…) |
Refused with 401. |
| Public share links | Answer 410. |
| Apps | Not served. |
| New sessions | Refused with 404, code: "project_archived". |
| Existing sessions | Take no new message: not from a chat thread, a trigger, or a prompt queued before the delete. |
| Slack and Microsoft Teams | Reply that the workspace was deleted, name the command that connects another project, and start nothing. |
| Email inboxes | Reply once per thread in 30 days: “This address is not accepting email right now. No one will answer this message.” Email that fails sender authentication gets no reply. |