Skip to content
Kortix
Esc
↑↓navigate↵open⌘Jpreview
On this page

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
  • memory/
    • MEMORY.md
  • tools/
    • lookup_order.ts
  • harnesses/
    • opencode/
      • opencode.jsonc
      • plugins/
      • tools/
      • commands/
    • pi/
      • settings.json
      • extensions/
      • skills/
      • prompts/
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: 3 project reads no harness folder. Its slash commands are declared in kortix.yaml; see commands (v3).
  • agents.<name>.file, opencode.config_dir and pi.config_dir in kortix.yaml move an agent file or a harness folder to another path.
  • The manifest path is a project setting, kortix.yaml by 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’s skills list. The platform kortix-* 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-memory skill tells an agent to read MEMORY.md at the start of a task, then the files the index points to.
  • Write. The memory tool (memory: kortix:memory under tools:) views, creates, edits, inserts into, renames and deletes files under memory/ 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-reflector cleans 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 default

    Add --project <id> for another project and --json for machine output.

  • API: PATCH /v1/projects/<project_id>/features with {"feature": "reminders", "enabled": true}. false turns it off. null clears the override.

  • SDK: kortix.project(projectId).updateFeatureFlag('reminders', true). useFeatureFlag(projectId, key) from @kortix/sdk/react reads 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. With event_triggers on, the app events that Kortix checks start, or move to error and 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.
  • volumes is an ordinary project flag. It is listed only on a deployment with Platinum.
  • drives follows the project’s volumes flag. It is never listed. A write answers 400. With Volumes off, every Files write answers 403 feature_disabled, and a file a session already wrote under /drives still opens.

Delete a project

  1. Open Customize → Settings → General.
  2. 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.

Was this page helpful?