> **Tip:** This is sometimes referred to as "white labelling" — creating a branded or tailored version of an open source project for your organization.
This guide explains how to create custom distributions of goose tailored to your organization's needs—whether that's preconfigured models, custom tools, branded interfaces, or entirely new user experiences.
## Overview
goose's architecture is designed for extensibility. Organizations can create "remixed" versions that:
- **Preconfigure AI providers**: Ship with a specific model (local or cloud) and API credentials
- **Bundle custom tools**: Include proprietary extensions for internal data sources
- **Customize the experience**: Modify branding, UI, and default behaviors
- **Target specific audiences**: Create specialized versions for developers, legal teams, designers, etc.
| Build complex multi-step workflows | Recipes with sub-recipes and subagents | Medium |
## Getting Started
### 1. Fork and Clone
```bash
git clone https://github.com/YOUR_ORG/goose.git
cd goose
```
### 2. Choose Your Customization Strategy
- **Configuration-only**: Modify config files and environment variables (no code changes)
- **Extension-based**: Add custom MCP servers for your tools (minimal core changes)
- **Deep customization**: Modify core behavior, UI, or add new providers
### 3. Build and Distribute
See [BUILDING_LINUX.md](BUILDING_LINUX.md) and [ui/desktop/README.md](ui/desktop/README.md) for platform-specific build instructions.
## Important Considerations
### Licensing
goose is licensed under Apache License 2.0 (ASL v2). Custom distributions must:
- Include the original license and copyright notices
- Clearly indicate any modifications made
- Not use "Goose" trademarks in ways that imply official endorsement
For detailed guidance on ASL v2 compliance, see the [Apache License FAQ](https://www.apache.org/foundation/license-faq.html).
### Contributing Back
While you're free to maintain private forks, contributing improvements upstream benefits everyone—including your distribution. Private forks that diverge significantly become expensive to maintain and miss out on security updates and new features. Consider upstreaming generic improvements while keeping only organization-specific customizations private.
### Telemetry
goose includes optional telemetry (via PostHog) to help improve the project. For custom distributions, you can:
- **Disable telemetry**: Set `GOOSE_DISABLE_TELEMETRY=1`
- **Use your own instance**: Modify `crates/goose/src/posthog.rs` to point to your PostHog instance
### Staying Current
To benefit from upstream improvements:
1. Regularly sync your fork with the main repository
2. Keep customizations isolated (config files, separate extension repos) when possible
3. Use recipes for workflow customization rather than code changes
4. Subscribe to release announcements for breaking changes
---
# Appendix: Custom Distribution Scenarios
## A. Preconfigured Local Model Distribution
**Goal**: Ship goose preconfigured to use a local Ollama model, requiring no API keys.
### Steps
1.**Create an init-config.yaml** in your distribution root:
```yaml
# init-config.yaml - Applied on first run if no config exists
GOOSE_PROVIDER:ollama
GOOSE_MODEL:qwen3-coder:latest
```
2.**Set environment defaults** in your launcher script or packaging:
```bash
exportGOOSE_PROVIDER=ollama
exportGOOSE_MODEL=qwen3-coder:latest
exportOLLAMA_HOST=http://localhost:11434 # Or your hosted instance
```
3.**Optionally hide provider selection** in the UI by modifying `ui/desktop/src/` components.
5.**Align packaging and updater names** when rebranding:
- Update static branding metadata in `ui/desktop/package.json` (`productName`, description) and Linux desktop templates (`ui/desktop/forge.deb.desktop`, `ui/desktop/forge.rpm.desktop`)
- Set build/release environment variables consistently:
-`GITHUB_OWNER` and `GITHUB_REPO` for publisher + updater repository lookup
-`GOOSE_BUNDLE_NAME` for bundle/debug scripts and updater asset naming (defaults to `Goose`)
Example:
```bash
exportGITHUB_OWNER="your-org"
exportGITHUB_REPO="your-goose-fork"
exportGOOSE_BUNDLE_NAME="InsightStream-goose"
```
6.**Use this branding consistency checklist** before release:
- Application metadata (`forge.config.ts`, `package.json`, `index.html`) uses your distro name
- Release artifact names and updater lookup names are consistent
- Desktop launchers (Linux `.desktop` templates) point to the same executable name produced by packaging
For richer integrations (IDEs, desktop apps, embedded agents), use the **Agent Client Protocol (ACP)**—a standardized JSON-RPC protocol for AI agent communication over stdio or other transports.
ACP provides:
- **Bidirectional communication**: Agents can request permissions, stream updates, and receive cancellations
- **Rich tool call handling**: Detailed status updates, locations, and content for each tool invocation
- **Session management**: Create, load, and resume sessions with full conversation history
- **MCP server integration**: Dynamically add MCP servers to sessions
**Start goose as an ACP agent**:
```bash
# Run goose as an ACP server on stdio
goose acp --with-builtin developer,memory
# Or programmatically
cargo run -p goose-cli -- acp --with-builtin developer
```
**Key ACP methods**:
| Method | Description |
|--------|-------------|
| `initialize` | Establish connection and exchange capabilities |
| `session/new` | Create a new session with optional MCP servers |
| `session/load` | Resume an existing session by ID |
| `session/prompt` | Send a prompt and receive streaming responses |
| `session/cancel` | Cancel an in-progress prompt |
**Example: Python ACP client** (see `test_acp_client.py` for a complete example):
# Send a prompt (responses stream as notifications)
client.send_request("session/prompt",{
"sessionId":session["result"]["sessionId"],
"prompt":[{"type":"text","text":"List files in this directory"}]
})
```
**ACP notifications** (sent from agent to client):
-`session/notification` with `agentMessageChunk` - Streaming text responses
-`session/notification` with `toolCall` - Tool invocation started
-`session/notification` with `toolCallUpdate` - Tool status/result updates
-`requestPermission` - Agent requests user confirmation for sensitive operations
For the full ACP specification, see the [Agent Client Protocol documentation](https://github.com/anthropics/anthropic-cookbook/tree/main/misc/agent_client_protocol).
### Technical Details
**REST API (goose-server)**:
- Server implementation: `crates/goose-server/src/routes/`
- OpenAPI generation: `just generate-openapi`
- API client example: `ui/desktop/src/api/` (generated TypeScript client)
**ACP**:
- ACP server implementation: `crates/goose-acp/src/server.rs`
- Example providers: `crates/goose/src/providers/declarative/*.json`
---
## H. Preconfigured Workflows with Recipes
**Goal**: Create standardized, repeatable workflows that users can run with minimal setup.
Recipes are YAML files that define complete goose experiences—instructions, extensions, parameters, and prompts bundled together. They're ideal for custom distributions because they require no code changes and can be distributed as simple files.
### Basic Recipe Structure
```yaml
version:1.0.0
title:Daily Standup Report Generator
description:Generates standup reports from GitHub activity