Customize
How projects, skills, apps and connectors work, their manifests and the skills
inside them. Everything you own carries a bundle.json manifest file holding
its name and description, whichever of the four it is.
How they work#
When a project, skill, app or connector is loaded into a chat the agent gains the skills, files and tools it contains. Several can be active at the same time.
What an item is comes from its files: a project has an AGENTS.md context file,
an app has a UI, a connector reaches external services and a skill set holds
skills. An item with more than one of these reads as the first that applies in
that order, so a project that also ships skills is a project. Chart and Diagram,
which each ship a widget and tools, are apps, and both are always on, so the
agent can draw a chart or a diagram in any chat with no setup. Word, a skill
item, is always on the same way, so the agent can write a .docx file in any
chat, or change text inside an existing one while keeping its formatting. These
kinds decide which badges an item carries on the Customize page and whether the
chat selector offers it. The page groups items by owner rather than by kind, so
an item with none of these still appears under its owner.
They are activated in several ways:
- Pinned projects load automatically in every chat. They show in the selector as read-only entries; unpin the project from its page to stop loading it.
- The selector above the conversation toggles projects for the chat. Typing # in the composer opens the same list as a keyboard picker.
- The agent can load a skill, app or connector itself when it detects relevant intent
Some connectors require authorization to access external services. Installing a connector that requires OAuth redirects to the provider's authorization page and returns to the Customize page on completion.
A project's home page lists the chats that loaded it, newest first. An archived
chat drops out of that feed the same way it drops out of /chats.
Who can reach a project, skill, app or connector is a separate question, covered in privacy.md.
File names ignore case#
File names in an item ignore case, so README.md and readme.md are the same
file. The first name written keeps its casing, and renaming only the case of a
name works through a move.
The bundle.json manifest#
Everything you own carries a bundle.json file holding its name and
description. Editing that file is the same as editing the name and description
fields on the Overview page - the two always agree, since the row shown there is
a projection of the file. Writing a bundle.json that leaves out description
clears the description, the same as clearing the field on the Overview page. A
name key is required; a write that omits it, or leaves it empty, fails.
The manifest also carries examples, up to four short requests a member would
type to try it. The owner edits them from the "Try asking" section's own Edit
control. An item with a description and no authored examples gets three
generated once from that description, shown until the owner writes their own or
the description changes.
Dependencies#
A project, skill set, app or connector can declare dependencies on others in its
bundle.json. Each entry names a slug with no version range.
A single skill has no dependency field of its own, so activating one pulls the chain of whatever holds it. Dependents mirror the same relation.
Loading an item loads its dependencies into the chat as well. The agent gains the skills, files and tools of the whole dependency chain, not just the one you asked for. A dependency you turn off in the selector comes back the next time its parent loads. The selector shows a tooltip naming what requires it.
Dependencies you can access but have not installed are installed alongside. One confirmation names everything about to be installed, reading "Install N items?" when there are several. Confirming installs them all, and loading the original again activates them. Built-in system skills install without a prompt. A very large dependency chain is truncated so it cannot flood the context window.
Activating fails when a dependency names nothing you can access or names an MCP connector. The failure names the slug. The Customize page marks the item with an amber warning icon. Uninstalling also removes auto-installed dependencies that nothing else needs.
A dependency names its target by slug, so renaming breaks everything that depends on it. Renaming warns first and lists the dependents it can see. Fix each one by editing its dependencies to the new name.
Declare a dependency only when the one needs the other on every run. Something a skill merely refers to belongs in SKILL.md as a cross reference, which the agent loads on demand.
What enters the context#
Loading an item, or a dependency of one, does not put all of its files into the conversation. Each loaded item contributes:
- Its AGENTS.md in full, with every file it imports through an
@pathline inlined, up to four levels deep - The full SKILL.md of each active skill. A skill is active when its frontmatter
sets
activate: true, or when it is the item's only skill - Every other skill as one line holding its address and description, which the agent opens when a request calls for it
- Its tables and any deferred tools, listed by name
Any other file, such as a reference, a rules file or a template, stays out until the agent reads it, unless AGENTS.md or an active skill imports it. The size an item adds to every turn is its AGENTS.md, its imports and its active skills, not the whole folder.
Every chat also carries the platform's own instructions and a one-line index of each installed item, its name and its description. Tool descriptions reach the model through the provider's tool definitions rather than as text in the prompt.
Links between them#
A markdown link can point at a file in another project, skill, app or connector,
written as [text](slug:relpath) where slug is the other one's name. The agent
writes this address the same way it writes a link within the same one; nothing
needs typing by hand.
Whether it opens depends on the reader, not the writer. Ghostlyn resolves the slug against whoever clicks it, the same access check that page and sharing settings already enforce, so a link into a private project opens for its owner and shows "not shared with you" for anyone else. That check happens on every open, so a link keeps working after its target is renamed and stops working the day access is revoked, whichever comes first.
The references panel on both files lists the link, naming the other one alongside the file, in whichever of Inbound or Outbound it belongs to. A link whose target you cannot reach still appears there, muted, so you know it exists without being told what it is called.
Typing @ in the editor also searches every project, skill, app and connector
the current one can reach, not just its own files. Matches from elsewhere appear
grouped under each one's name, below the current one's own matches. Typing a
name before a colon narrows the search to that one. Selecting a result from
elsewhere writes the same slug:relpath address, so nothing needs typing by
hand there either.
Creating custom skills and connectors#
Users can author their own skills and connectors through conversation. Load the
create skill and describe what you want to build. The create skill interviews
you, then writes files to Home or a project you choose.
Skill files live at skills/<name>/SKILL.md inside a project or skill set.
Writing that file in chat creates or updates the skill automatically. Writing
index.ts at the root creates a script-based connector; adding bundle.json
with a "provider" field binds it to an OAuth service or with a "credentials"
array makes it an API-key connector that offers an "Add key" prompt for each
entry without blocking its other tools. Loading the connector after writing
activates new tools in the same turn.
solidtime, the API-key connector for weekly tracked hours, works against a hosted or a self-hosted instance. Its key card shows an editable Host field above the key itself, prefilled with the hosted default, for a member whose team runs its own solidtime. Only a personal key should go there, since a company key stored on the organization's default project lets every member who asks read every colleague's hours, with no way to scope it to the member's own.
Improving an existing skill#
When a skill you already have runs badly - slow, taking several messages for one
job, giving a different answer each time, costing more than expected or never
firing when you expect it to - load the optimize skill rather than create.
It reads the skill, converts deterministic prose steps into a script, checks
whether the trigger description and body size are the cause, and fixes table
flags. A change to the description or the body, or moving a table between
skill-scoped and shared storage, is proposed first and applied only once you
approve it.