DotBlue is an enterprise AI assistant platform for teams that need agent management, runtime isolation, skill governance, enterprise administration, and private deployment in one stack.
Instead of stitching together a chat UI, auth, model settings, runtime hosting, IM integrations, and deployment scripts, DotBlue gives you a full-stack foundation for building, governing, and delivering AI assistants to real users.
- Manage agents, conversations, skills, models, and enterprise access in one product
- Run each agent in an isolated containerized runtime for safer execution boundaries
- Support SaaS-style, self-hosted, and private deployment paths from the same codebase
- Connect assistants to external channels instead of limiting them to an internal web chat
- Product and platform teams shipping AI assistants to internal or external users
- Enterprise teams that need organizations, members, roles, invitations, and admin workflows
- Developers and operators who want a self-hosted AI agent platform with a real product surface
- Open-source builders who want a full-stack starting point instead of a thin SDK demo
The recommended way to try DotBlue is Docker Compose. It gives you the most complete end-to-end setup with the lowest local complexity.
- Docker Engine with Docker Compose available
- Enough local resources to run
postgres,redis,casdoor,dotblue, andweb - A valid LLM API key for the provider you want to test
- Free local ports for the default endpoints listed below
- Go to the deployment directory.
cd deploy/compose- Copy the environment template.
cp .env.example .envWindows PowerShell:
Copy-Item .env.example .env- Update the key values in
.env.
- Database passwords
- Platform admin account information
DOTBLUE_LLM_API_KEY- Public URLs and ports
- Generate the local config files.
Linux/macOS:
./prepare-config.shWindows PowerShell:
.\prepare-config.ps1- Start the full stack.
docker compose up -d --build- Web:
http://localhost:19000 - Backend:
http://localhost:18080 - Casdoor:
http://localhost:18000
postgresrediscasdoordotbluein all-in-one mode, with the worker loop embeddedweb
After the containers are healthy:
- Open
http://localhost:19000 - Confirm that the landing page or login flow is reachable
- Complete initialization through auto-install or the
/setuppage if needed - Log in and verify you can create an agent and open the chat page
For a more detailed walkthrough, see deploy/compose/README.md.
- Create, edit, and delete agents
- Configure a name and system prompt for each agent
- Manage multiple agents for different roles and workflows
- Conversation list, message history, and auto-generated titles
- Streaming responses and visible thinking states
- Tool call and step records for better execution traceability
- Create and switch enterprises
- Manage members, org units, roles, and invitations
- Use an enterprise admin console for team collaboration and access control
- Configure platform data paths and runtime ports
- Manage platform-wide model access and provider credentials
- Let platform admins manage global settings in one place
- Configure and enable enterprise IM connections
- Bind IM channels to agents
- Route assistant interactions through channels such as Feishu, Slack, Telegram, Discord, QQ, Matrix, and Web
- Create platform skills from scratch
- Import external skills from connected hubs
- Govern the skill lifecycle from catalog to agent installation
- Inject installed skills into both Hermes and Nanobot runtimes
- Backend: Go 1.25, GoFrame, PostgreSQL
- Frontend: React 19, TypeScript, Vite, Ant Design
- Authentication: Casdoor
- Runtime isolation: Docker-based agent runtimes
- Models: centralized platform configuration with OpenAI-compatible and provider-specific runtime handling
- Testing: Go
*_test.go, Vitest
.
├─ backend/ # Go backend: APIs, domain services, schema init, auto-install
├─ web/ # React frontend: landing page, login, setup, dashboard, chat, admin UI
├─ deploy/ # Deployment assets: Casdoor, DotBlue, and Compose quick start
├─ docs/ # Domain and product design notes
└─ README.md
Useful directories:
backend/internal/domains: core business domains such asagent,chat,conversation,enterprise,im,metering, andskillbackend/manifest/config: runtime and initialization config templatesweb/src/domains: frontend pages and business modulesdeploy/compose: one-command local or test environment startup
- Go to
web/ - Copy
.env.exampleto.env.local - Configure Casdoor and backend URLs
- Start the dev server
cd web
npm install
npm run devCommon commands:
npm run build
npm run lint
npm run test- Go to
backend/ - Prepare PostgreSQL
- Copy
manifest/config/config.example.yamltomanifest/config/config.yaml - If you want auto-install, also copy
manifest/config/init_data.example.jsontomanifest/config/init_data.json - Set the required environment variables
- Start the service
cd backend
go run .Recommended for first-time setup:
export DOTBLUE_ADMIN_PASSWORD='replace-with-a-strong-password'
export DOTBLUE_LLM_API_KEY='replace-with-provider-key'Windows PowerShell:
$env:DOTBLUE_ADMIN_PASSWORD='replace-with-a-strong-password'
$env:DOTBLUE_LLM_API_KEY='replace-with-provider-key'
go run .At startup, the backend automatically performs:
- Casdoor initialization
- Database connectivity checks
- Database schema initialization
- Auto-install based on
init_data.json
- Runtime template:
backend/manifest/config/config.example.yaml - Initialization template:
backend/manifest/config/init_data.example.json - Recommended local files:
backend/manifest/config/config.yamlbackend/manifest/config/init_data.json
Notes:
organization.nameandapplication.namemust match the backend Casdoor configuration- Do not commit sensitive values; inject them through environment variables when possible
- If no initialization file is provided, the Web setup page at
/setupstill works as a fallback
Key environment variables:
VITE_CASDOOR_SERVER_URLVITE_CASDOOR_CLIENT_IDVITE_CASDOOR_ORG_NAMEVITE_CASDOOR_APP_NAMEVITE_BACKEND_URL
The container image also supports runtime overrides through /runtime-config.js, so private deployments can reuse the same dotblue-web image without rebuilding for each environment.
The frontend includes:
- Landing page
- Login and login callback
- Setup wizard
- Dashboard and agent management
- Chat page
- Enterprise admin console
- Platform settings page
- Skill market, skill builder, skill governance, and dedicated agent skill management pages
The backend exposes:
/api/setup/*: setup and installation/api/agents: agent CRUD/api/conversations: conversations and messages/api/chat: chat interface/api/admin/settings: platform settings/api/admin/*: enterprise and IM administration/api/admin/skills*,/api/admin/platform/skill-hubs*,/api/admin/platform/skill-import-jobs*: skill governance, connected hubs, and import workflows/api/admin/agents/:agentId/skills*: install, list, and remove skills on a target agent
Also available by default:
- OpenAPI:
/api.json - Swagger:
/swagger
- If you update the platform-level model or provider settings after agent containers have already started, recycle or restart the existing
hermes_*agent containers before re-testing. Running agent containers keep their existing runtime config until they are recreated. - For skill-related end-to-end checks, prefer the local Compose environment and real browser verification. A typical validation flow is: import or create a skill -> install it to an agent -> open the chat page -> confirm the assistant actually uses the installed skill.
- Root overview:
README.md - Compose deployment guide:
deploy/compose/README.md - Backend setup notes:
backend/README.MD - Frontend environment notes:
web/README.md - Domain design docs:
docs/skill-system-design.mddocs/skill-backend-design.mddocs/skill-frontend-design.mddocs/skill-database-design.mddocs/credit-domain-design.md
Every push and pull request runs .github/workflows/ci.yml, which lints, type-checks, builds, and tests both the backend and the web app, and builds both Docker images as a smoke test.
Cutting a tag of the form vX.Y.Z (for example v0.1.0) triggers .github/workflows/release.yml, which:
- builds and pushes release tags of the backend and web images to GitHub Container Registry
- drafts a GitHub release with auto-generated notes
Once a tag is pushed, users can pull pre-built images directly instead of building from source. Replace <owner> with the GitHub owner of this repository:
docker pull ghcr.io/<owner>/dotblue:v0.1.0
docker pull ghcr.io/<owner>/dotblue-web:v0.1.0The backend image is published as dotblue, and the frontend image is published as dotblue-web.