Project Chat is the mode used for any conversation tied to a specific Amplify project — a codebase you've opened, a starter template you've spun up, or a workspace you're actively building in. Unlike standalone chats, project chats always run in agent mode: the chat ↔ agent toggle is not available, because the agent system prompt is mandatory when working on real code.
Why project chat is always agent mode
A project chat needs everything chat mode strips out:
<project_context>— the project's file tree, open files, and runtime state. Without it the AI can't reason about your codebase.- The full tool set —
inject_template, sandbox read/write/exec, package install. Building requires mutation. - All skills —
react-best-practices,mobile-app-development,webapp-builder, etc. The right skill has to be discoverable or output quality collapses. - The planning engine — multi-step builds ("add auth, then a dashboard, then wire them up") need decomposition + sub-chat workers + FlowVerifier.
Removing any of these to save tokens would make project chats useless — you'd be talking about a project without the context or tools to act on it. So the toggle is hidden entirely in project chats; the full agent system prompt is always attached.
The toggle is hidden, not broken
If you've used the chat ↔ agent switch in a standalone chat and don't see it in a project chat, that's intentional. Project chats opt out of chat mode by design. To use chat mode, start a new (non-project) chat from the home screen.
What's in the project context
The <project_context> block injected into the system prompt includes:
| Field | Source | Purpose |
| File tree | sandbox readdir walk | Lets the AI navigate the codebase without reading every file |
| Open files | editor state | Currently-focused code the AI should reason about |
| Runtime state | WebContainer / Docker | Installed packages, running dev server, env vars |
.amplify/ignore | project root | Files excluded from context (secrets, build output) |
.amplify/prompt | project root | Project-specific instructions appended to the system prompt |
The selectStarterTemplate flow (see Templates) bootstraps this context the moment you pick a template — it clones the repo, installs deps, and starts the dev server so the AI has a live, runnable project from turn one.
Per-project skill filtering
Not every skill is relevant to every project. A Vue project doesn't need the React skill; an API backend doesn't need react-native-component. Amplify filters skills per project via getProjectSkills(projectId) from the projectSkillsStore.
// Per-project skills: the project can toggle skills on/off in settings.
// Only enabled skills appear in <available_skills> for that project's chats.
const skills = getProjectSkills(projectId);
// → ["react-best-practices", "frontend-design", ...] (project's enabled subset)
You can toggle skills on or off per project in the project Settings panel. Disabling a skill for a project removes it from that project's <available_skills> block — it won't be discovered or loaded, saving tokens on every turn of that project's chats. Other projects are unaffected.
How per-project filtering interacts with the skill directories
Skills are still loaded from the three directories (
app/lib/skills/,design/skills/,user_skills/) globally by the SkillLoader. The per-project filter is applied after loading:getProjectSkills(projectId)returns the intersection of loaded skills and the project's enabled list. So:- A skill must be installed (in one of the 3 dirs) and enabled for the project to appear.
- Uninstalling a skill removes it from all projects.
- Disabling a skill for one project keeps it available everywhere else.
See Built-in Skills → Skill directories for the loading process.
Memory & vector search per project
Project chats also have access to Amplify's Vector Database for long-term memory scoped to that project. This lets the AI recall decisions, file relationships, and prior fixes across sessions — even after the WebContainer resets.
- Context persistence: BM25 + embeddings over the project's files and past chat turns, stored in IndexedDB.
- Project-scoped: memories are keyed by
projectId, so switching projects swaps the memory store. - Budget-aware: a 70% context-budget threshold controls how much memory is injected per turn (see AI Workflow).
This is why project chats are heavier on tokens than standalone chats — but also why they're dramatically more useful for real engineering work.
When to use project chat
Building from a starter template
Any chat started after picking a template from the templates grid is a project chat.
Working in an existing codebase
Open a project, and every chat in it runs in agent mode with full project context.
When per-project skill control matters
Use the project Settings panel to enable only the skills relevant to that stack.
For quick questions that don't need the codebase, start a standalone chat (which defaults to Chat Mode) instead — it'll be cheaper and just as accurate for pure Q&A.
Next: Rate Limiting