Configuration¶
HoneyDew is configured through a config.json file at the project root. It defines who you are, who your agent is, and what boards to create on first run.
Where Config Lives¶
| Item | Location |
|---|---|
| Config file | config.json (project root) |
| Template | config.example.json |
| Env override | SMARTIFY_CONFIG — set to an absolute path to use a different config file |
If config.json is missing, HoneyDew falls back to config.example.json in the project root. The install.sh script creates config.json interactively (prompting for names) if it doesn't exist. The start.sh script copies the example to config.json on first run so you always have an editable config.
Validating Your Config¶
Run the validation check without starting any servers:
This verifies that the active config file (either config.json or config.example.json) is valid JSON with all required fields. Exit code 0 means valid, 1 means invalid.
Field Reference¶
| Field | Type | Required | Description |
|---|---|---|---|
user.profile_id |
string | Yes | Profile ID for the human user. Used in the API and database. |
user.display_name |
string | Yes | Display name shown in the UI header and profile switcher. |
agent.profile_id |
string | Yes | Profile ID for the AI agent. Used in the API and database. |
agent.display_name |
string | Yes | Display name shown in the UI header and profile switcher. |
boards |
array | No | Board definitions. Each entry has name (string) and columns (array of column name strings; order = position). |
Board defaults¶
If boards is omitted or empty, no boards are created at startup. You can add boards later via the API (POST /api/boards) or by adding entries to config.json and restarting.
Tip
The install.sh script creates a config.json with two boards (one for you, one for your agent) when run for the first time, so most users start with boards already configured.
Config Examples¶
Minimal — profiles and one board¶
The simplest useful config defines both profiles and a single board.
{
"user": {
"profile_id": "dylan",
"display_name": "Dylan"
},
"agent": {
"profile_id": "jarvis",
"display_name": "Jarvis"
},
"boards": [
{
"name": "Dylan & Jarvis's Board",
"columns": ["To Do", "In Progress", "Done"]
}
]
}
If you omit boards, no boards will be created on startup — you would need to create them via the API.
One board with custom columns¶
Add a Blocked column or rename columns to match your workflow.
{
"user": {
"profile_id": "dylan",
"display_name": "Dylan"
},
"agent": {
"profile_id": "jarvis",
"display_name": "Jarvis"
},
"boards": [
{
"name": "Dylan & Jarvis's Board",
"columns": ["To Do", "In Progress", "Done", "Blocked"]
}
]
}
Multiple boards¶
Use separate boards for different workstreams or ownership.
{
"user": {
"profile_id": "tony",
"display_name": "Tony"
},
"agent": {
"profile_id": "jarvis",
"display_name": "Jarvis"
},
"boards": [
{
"name": "Tony's Board",
"columns": ["To Do", "In Progress", "Done", "Blocked"]
},
{
"name": "Jarvis's Board",
"columns": ["To Do", "In Progress", "Done", "Blocked"]
}
]
}
Backlog workflow¶
Add a separate backlog board alongside your main board.
{
"user": {
"profile_id": "alex",
"display_name": "Alex"
},
"agent": {
"profile_id": "claw",
"display_name": "Claw"
},
"boards": [
{
"name": "Sprint Board",
"columns": ["To Do", "In Progress", "Review", "Done"]
},
{
"name": "Backlog",
"columns": ["Ideas", "Groomed", "Ready"]
}
]
}
Environment Variables¶
| Variable | Default | Description |
|---|---|---|
SMARTIFY_CONFIG |
./config.json |
Override the path to the config file. |
SMARTIFY_API_URL |
http://localhost:8000 |
Base URL for the API (used by the Python tools module and agents). |
SMARTIFY_DOCS_URL |
http://localhost:8001 |
URL (host:port) for the documentation site when running ./start.sh --docs. Override to bind to a different address (e.g. http://0.0.0.0:8001). |
Moving Cards Between Boards¶
When you move a card to another board (via the UI Move to board action or POST /api/cards/{id}/move-to-board), the target column is resolved as follows:
- If you pass a
column_namethat exists on the target board, that column is used. - Otherwise, the card's current column name is matched on the target board (case-insensitive).
- If no match is found, the first column of the target board is used.
This means boards with the same column names (e.g. both have "In Progress") will preserve a card's status when moving between them.