add-app · git:20261107.950015c · 2026-11-07 · sha256 b1e60d743f6b185e
add-app git:20261107.950015cA
Immutable. This exact content never changes and is served at /api/v1/blob/b1e60d743f6b185e.
---
name: add-app
description: Scaffold a new AI app config JSON file in contents/apps/ that passes the project's Zod schema validation. Use when creating a new AI application for the iHub platform.
---
## Gather Requirements
Ask the user for:
- **id**: Unique app identifier (lowercase, hyphens, max 50 chars, e.g. `my-new-app`)
- **name**: Display name in English and German
- **description**: Short description in English and German
- **system prompt**: The AI system prompt in English and German
- **icon**: HeroIcon name (e.g. `SparklesIcon`, `ChatBubbleLeftIcon`, `DocumentTextIcon`)
- **color**: Hex color code (e.g. `#4F46E5`)
> Note: apps no longer configure token limits. The context window and output cap
> come from the selected model (`contextWindow` / `maxOutputTokens` in the model config).
## Create the Config File
Create `contents/apps/{id}.json` with this minimal valid shape:
```json
{
"id": "{id}",
"name": {
"en": "...",
"de": "..."
},
"description": {
"en": "...",
"de": "..."
},
"color": "#4F46E5",
"icon": "SparklesIcon",
"system": {
"en": "...",
"de": "..."
},
"enabled": true
}
```
## Optional Fields (add as needed)
```json
{
"order": 10,
"preferredModel": "gpt-4o",
"preferredOutputFormat": "markdown",
"sendChatHistory": true,
"messagePlaceholder": { "en": "Type your message...", "de": "Nachricht eingeben..." },
"greeting": { "en": "Hello! How can I help?", "de": "Hallo! Wie kann ich helfen?" },
"starterPrompts": [
{ "en": "Summarize this document", "de": "Dieses Dokument zusammenfassen" }
],
"allowedModels": ["gpt-4o", "claude-opus-4-6"],
"disallowModelSelection": false,
"allowEmptyContent": false,
"websearch": { "enabled": true },
"integrations": { "ifinder": { "actions": ["search"] } },
"features": { "magicPrompt": true },
"upload": { "enabled": true, "maxSize": 10485760 },
"variables": [
{
"id": "language",
"type": "select",
"label": { "en": "Language", "de": "Sprache" },
"options": [
{ "value": "en", "label": { "en": "English", "de": "Englisch" } }
]
}
]
}
```
An app has no `tools` list: it gets tools only from the integrations it binds under `integrations` (an installation id, a definition id or `type:<type>`, with an optional `actions` list; the group must be granted the installation in `permissions.integrations`) and from `websearch`.
## Permissions
To restrict access to specific groups, add to `contents/config/groups.json` under the relevant group's `permissions.apps` array. Use `"*"` to allow all apps for a group.
## Verify
After creating the file, check that the server loads it correctly:
```bash
timeout 10s node server/server.js 2>&1 | grep -E "error|{id}" | head -10
```
No server restart needed — apps are reloaded automatically via `configCache`.