Your First Project

Step-by-step guide to creating your first CodeCourier project, configuring settings, setting up contexts and assets, adding team members, configuring personas, and running an end-to-end workflow.

12 min read
first-projecttutorialproject-setup

This guide takes you through creating a fully configured CodeCourier project from scratch. By the end, you will have a project with API keys, contexts, assets, session configurations, team members, personas, a workflow, and a completed run with extracted learnings. Each section builds on the previous one, so follow them in order.

Creating the project

1

Navigate to project creation

After signing in, you land on the project selection screen. If you are already inside a project, click your project name in the sidebar header to return to the project switcher. Click New Project.

2

Enter project details

Provide the following information:

  • Project name- A human-readable name for your project, e.g., “E-commerce Backend” or “Design System”
  • GitHub repository URL - (Optional) The HTTPS URL of the repository you want agents to work on, e.g., https://github.com/your-org/your-repo. This enables automatic branch creation and PR generation.

The project slug is generated automatically from the name. For example, “E-commerce Backend” becomes e-commerce-backend. This slug is used in all project URLs.

3

Confirm creation

Click Create Project. CodeCourier creates the project record, sets you as the owner, initializes project settings with defaults, and redirects you to the project dashboard. The dashboard initially shows zeroed counters for sandboxes, runs, workflows, and members.

Configuring project settings

Navigate to Project Settings (wrench icon in the sidebar). The settings page is organized into several tabs.

API keys

The API Keys tab is where you configure the external service credentials your project needs. Add keys for each provider:

  • E2B - Required for sandbox provisioning. Obtain from your E2B dashboard.
  • Anthropic - Required if using Claude Code as your CLI tool. This is the standard Anthropic API key.
  • Anthropic Token - An alternative OAuth-style token for Anthropic API access.
  • OpenRouter - Required if using OpenRouter for model routing and access to multiple providers through a single key.
  • OpenAI - Required if using OpenAI-powered CLI tools like Codex.
  • GitHub - Required for branch creation and PR generation. Use a personal access token with repo scope.

Project-level keys

API keys are configured per-project, not globally. If you create multiple projects, each one needs its own key configuration. This ensures isolation between projects and allows different team members to contribute keys to different projects.

General settings

The general settings tab lets you configure default behaviors:

  • Sandbox system prompt- Text that is appended to every agent prompt in this project. Use this for project-wide conventions like “Always use TypeScript strict mode” or “Follow our commit message format”.
  • CLAUDE.md - Markdown content written as a CLAUDE.md file in the sandbox. This is read by Claude Code automatically and serves as persistent instructions for every session.

Environment variables

Define environment variables that are injected into every sandbox in the project. Each variable has a key, value, and a secret flag. Secret variables are masked in the UI and treated with extra care during transmission.

Example environment variables
NODE_ENV=development
DATABASE_URL=postgresql://localhost:5432/mydb  (marked as secret)
NEXT_PUBLIC_API_URL=https://api.example.com

Git configuration

Set the author name and email used for commits made by agents inside sandboxes. This keeps agent commits identifiable in your Git history:

Example git config
Git Commit Name: CodeCourier Bot
Git Commit Email: bot@codecourier.dev

Setting up Contexts

Contexts are versioned instruction documents bound to specific session types. Navigate to Contexts at /p/[your-project]/context to manage them.

1

Create an issue session context

Click New Context and select the issuesession type. Write the system prompt that the issue-scanning agent should receive, including your project’s priorities, areas of concern, and any patterns it should look for:

Example issue session context
You are scanning a TypeScript/Next.js codebase for issues.
Focus on:
- Type safety violations and implicit any usage
- Missing error boundaries and unhandled promise rejections
- N+1 query patterns in data fetching
- Accessibility regressions in UI components
- Missing or inadequate test coverage

Prioritize issues that would affect production stability.
Generate specific, actionable titles and descriptions.

Save the context. CodeCourier creates version 1 of this document and associates it with issue sessions in your project.

2

Create a learning session context

Create another context for the learning session type. This context instructs the learning-extraction agent how to identify and categorize learnings from completed runs:

Example learning session context
You are extracting learnings from an AI agent's completed coding session.
Focus on:
- Mistakes the agent made that were corrected
- Project-specific patterns or conventions that emerged
- Tool usage gotchas specific to this codebase
- Architectural decisions with rationale

Categorize each learning as: preference, pattern, gotcha, tool, or architecture.
Only extract learnings that would be actionable in future sessions.
3

Optionally create contexts for other session types

Repeat for any other session types you use: merging, answering, evaluating, and judging. Each context type is independent; you can add them as you introduce each capability into your workflow.

Context versioning

When you need to update a context, edit and save it - the previous version is preserved. This lets you experiment with instruction changes without permanently losing what worked before.

Setting up Assets

Assets (skills, commands, and scripts) extend what agents can do inside the sandbox. Navigate to the Assets section of your project settings to create them.

1

Create a skill

Click New Skill. Give the skill a name (e.g., “Project Conventions”) and add one or more files. Each file has a name and content:

Example skill file: conventions.md
# Project Conventions

## TypeScript
- All files must use strict mode
- Never use `any` - use `unknown` and narrow it
- Prefer interface over type for object shapes

## Database (Convex)
- Never call .collect() on large tables
- Use paginate() for lists longer than 100 items
- Batch writes use ctx.scheduler.runAfter

## Testing
- All new functions need a Vitest unit test
- Integration tests go in __tests__/integration/
- Use MSW for HTTP mocking, never mock fetch directly

Save the skill. It is now available to attach to personas and session configurations.

2

Create useful commands

Create commands for your most common agent operations. For example:

  • Name: run-tests - Expression: npx vitest run --reporter=verbose
  • Name: typecheck - Expression: npx tsc --noEmit
  • Name: lint - Expression: npx eslint . --ext .ts,.tsx

Commands give agents stable, project-specific aliases that remain consistent even if your tooling configuration changes.

3

Optionally create scripts

Scripts are optional but useful for pre-run or post-run automation. For example, a pre-run script might clone the repository to a known state, or a post-run script might run a final lint pass and commit any auto-fixed issues.

Configuring Session Configurations

Session Configurations let you bind contexts and assets to each session type. These settings are accessible from Project Settings under the dedicated tab for each session type: Issue Session, Learning Session, Merge Session, Answering Session, Evaluator Session, and Judge Session.

1

Configure the Issue Session

Navigate to Issue Session in Project Settings. Here you can:

  • Bind a context - Select the issue context you created earlier. This context document will be injected automatically into every issue scanning session.
  • Select skills- Choose which skill packages are available in issue sessions. Your “Project Conventions” skill is a good default selection.
  • Select commands - Add yourrun-tests and typecheck commands so the scanning agent can validate its findings.
  • Set the issue session prompt- An additional free-text prompt prepended to the user’s discovery prompt.
2

Configure the Learning Session

Open the Learning Session configuration tab. Bind your learning context document and select any skills or commands relevant to learning extraction. The learning agent will use these resources when analyzing completed sessions.

3

Configure other session types as needed

Repeat the binding process for Merge, Answering, Evaluator, and Judge sessions as you adopt those capabilities. Each session type is fully independent - you can configure them incrementally as your workflow matures.

Adding team members

1

Navigate to members

Click Members in the sidebar under the Insights section. This page shows all current members and pending invitations.

2

Invite a team member

Click Invite Member. Enter the email address of the person you want to invite and select their role:

  • Admin - Can manage all project resources and settings, invite other members
  • Member - Can create and manage their own sandboxes, runs, and workflows

The invitation is created immediately. The invited person will see a pending invitation when they sign into CodeCourier. Once they accept, their status changes from “pending” to “accepted” and they gain access to all project resources according to their role.

3

Manage existing members

From the members page you can change a member’s role or remove them from the project. The project owner cannot be removed but can transfer ownership by making another member the owner.

Member limits

The number of team members is tracked in project counters. The members page and dashboard both show the current count of active members and pending invitations.

Setting up personas

Personas define how your AI agents behave. Setting up a few key personas before running workflows ensures consistent quality. Each persona can be assigned specific skills, commands, and scripts from the assets you created earlier.

1

Navigate to personas

Click Personas in the sidebar. This page shows all personas configured for the project.

2

Create a designer persona

Click New Persona and configure it:

  • Name: “Senior Developer”
  • Type: Designer
  • Model: Choose your preferred model (e.g., claude-sonnet-4-6 for speed or claude-opus-4-6 for quality)
  • Thinking effort: Medium or High
  • Instructions:
Designer instructions example
You are a senior full-stack developer. Follow these principles:
- Write clean, well-documented TypeScript code
- Prefer composition over inheritance
- Write tests for all new functions
- Use existing project patterns and conventions
- Keep changes focused and minimal
  • Skills: Select your “Project Conventions” skill and any other relevant skills
  • Commands: Enable run-tests, typecheck, and lint
  • Learnings: Enable to include project learnings in context
3

Create a checker persona

Create a second persona for code review:

  • Name: “Code Reviewer”
  • Type: Checker
  • Model: Use a strong model for reviewing ( claude-opus-4-6 recommended)
  • Thinking effort: High
  • Instructions:
Checker instructions example
You are a thorough code reviewer. Evaluate the changes against:
- Correctness: Does the code do what was asked?
- Type safety: Are there any TypeScript errors or any-typed values?
- Edge cases: Are error states and boundary conditions handled?
- Testing: Are tests present and meaningful?
- Style: Does the code follow project conventions?

Return pass: true only if ALL criteria are met.
If rejecting, provide specific, actionable feedback.
4

Optionally create specialized personas

Consider creating additional personas for specific roles:

  • Investigator - For research tasks that explore codebases before making changes
  • Planner - For issue sessions and codebase analysis with specific architectural principles
  • Reviewer - Focused on readability, maintainability, and code review thoroughness
  • Deep-dive - For in-depth analysis tasks requiring extended reasoning

Creating a sandbox

While workflows create sandboxes automatically, you can also create standalone sandboxes for interactive exploration.

1

Create a standalone sandbox

Navigate to Sandboxes in the sidebar and click New Sandbox. Configure the sandbox template, timeout, and resources. Give it a descriptive name like “Explore codebase” and provide an initial prompt.

Standalone sandboxes are useful for one-off tasks: investigating a bug, prototyping a solution, or testing a configuration change before encoding it in a workflow.

2

Interact with the sandbox

Once the sandbox is running, you can view the agent’s message stream in real time. The detail page shows the full conversation history, sandbox status, and any PR or learning extraction status.

Running a workflow end-to-end

1

Create a workflow using your personas

Navigate to Workflows and create a new Persona Pipeline workflow:

  • Name: “Full Review Pipeline”
  • Type: Persona Pipeline
  • Steps: Add your “Senior Developer” persona as the first step, then your “Code Reviewer” persona as the second step. Optionally configure a loop between them with a max iteration count.
  • Template: Select the sandbox template matching your CLI tool preference
  • Timeout: 30 minutes per step
2

Start a run

Click Run on your new workflow. Enter a prompt describing the feature or fix you want:

Example prompt
Add a reusable DateRangePicker component to
components/ui/date-range-picker.tsx. It should:

1. Accept startDate, endDate, and onChange props
2. Use the existing react-day-picker dependency
3. Support both controlled and uncontrolled modes
4. Include proper TypeScript types
5. Follow the existing shadcn/ui component patterns
6. Add a Storybook story file

Specify a branch name (e.g., feat/date-range-picker) and confirm the GitHub repository URL if needed. Click Start Run.

3

Monitor and review

Watch the run progress from the run detail page:

  1. The designer persona receives your prompt, explores the repository, and implements the feature
  2. The checker persona reviews the implementation against your criteria and either approves or provides feedback
  3. If rejected, the designer iterates with the feedback until approval or the max iteration count is reached
  4. Quality scores are recorded for each step - you can see correctness, type safety, code style, test coverage, and completeness scores in the step details
  5. On completion, CodeCourier creates a PR on the specified branch

Running an issue session with Answering

Issue sessions can surface questions and assumptions that need resolution before implementation. Here is how to use the Answering Session feature:

1

Trigger an issue session

Navigate to Issues in the sidebar and click New Issue Session. Select the branch you want to analyze and provide a discovery prompt (or rely on the context document you configured earlier). Start the session.

The session will use the Issue Session context and assets you configured in Project Settings. When it completes, you will see a list of generated issues with titles, descriptions, and priorities.

2

Review questions and start an Answering Session

Some issues may come with open questions or unresolved assumptions - for example, “Is this cache miss acceptable, or should we pre-warm the cache?” When you see such questions attached to an issue, click Start Answering Session.

The Answering Session creates a sandbox using your configured Answering Session context. The agent receives the open questions and works through them, producing structured answers that are attached back to the issue. These answers are then passed to the implementation run so the designer agent does not need to guess.

3

Execute issues

With questions resolved, click Runon an issue (or select multiple issues and create a work chain). The implementation run receives the issue’s suggested prompt plus any answers from the Answering Session.

Viewing results and learnings

Pull request

After the run completes, check the run detail page for the PR status. If the run was configured to create a PR, you will see the PR URL linking directly to GitHub. The PR status is tracked in real time: creating, created, merged, or failed. CI check results will appear in the CI Checks panel as your pipeline runs against the PR branch.

Quality scores

Each completed run step shows its quality scores. Navigate to the run’s step list and click any step to see the breakdown of correctness, type safety, code style, test coverage, completeness, and the composite score. The overall run quality score is visible on the run summary card.

Learnings extraction

If learning extraction is enabled (configured in Project Settings and via the Learning Session configuration), CodeCourier runs a post-completion step that analyzes the agent’s session using the learning context document and extracts structured learnings. Navigate to Learnings in the sidebar to see newly extracted records.

Review each pending learning:

  • Approve learnings that capture genuine project knowledge - these will be compiled and injected into future sessions
  • Reject learnings that are incorrect, too generic, or not applicable

Usage and costs

Navigate to Usage in the insights section for detailed cost breakdowns. Usage records track token consumption, sandbox duration, and per-service costs (Claude Code, E2B, Trigger.dev) down to the individual run step. The analytics page provides charts and trends across time.

Dashboard

Return to the Dashboard to see updated project counters. The dashboard shows total sandboxes, active sandboxes, total runs, completed and failed runs, total workflows, team members, and pending invitations. Daily stats track sandboxes created, runs created and completed, iterations, and workflows created.

Next steps

You now have a fully configured project with contexts, assets, session configurations, personas, and a complete end-to-end workflow. Here are recommended next steps to deepen your usage: