REST API
Vibora exposes a REST API for programmatic access to task management and server features.
Base URL
http://localhost:7777/apiAuthentication
The API currently does not require authentication. When running on a remote server, secure access via SSH tunneling or reverse proxy.
Tasks
List Tasks
GET /api/tasksQuery Parameters:
| Name | Type | Description |
|---|---|---|
status | string | Filter by status |
repositoryId | string | Filter by repository |
Response:
[
{
"id": "abc123",
"title": "Add authentication",
"status": "IN_PROGRESS",
"repositoryId": "repo456",
"worktreePath": "/home/user/.vibora/worktrees/task-abc123",
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-01-15T14:20:00Z"
}
]Get Task
GET /api/tasks/:idResponse:
{
"id": "abc123",
"title": "Add authentication",
"description": "Implement user login and registration",
"status": "IN_PROGRESS",
"repositoryId": "repo456",
"worktreePath": "/home/user/.vibora/worktrees/task-abc123",
"prUrl": "https://github.com/org/repo/pull/42",
"linearUrl": "https://linear.app/team/issue/TEAM-123",
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-01-15T14:20:00Z"
}Create Task
POST /api/tasksBody:
{
"title": "Add authentication",
"description": "Implement user login",
"repositoryId": "repo456",
"baseBranch": "main"
}Update Task
PATCH /api/tasks/:idBody:
{
"title": "Updated title",
"description": "Updated description"
}Update Task Status
PATCH /api/tasks/:id/statusBody:
{
"status": "IN_REVIEW"
}Delete Task
DELETE /api/tasks/:idRepositories
List Repositories
GET /api/repositoriesResponse:
[
{
"id": "repo456",
"name": "my-project",
"path": "/home/user/projects/my-project",
"defaultBranch": "main"
}
]Get Repository
GET /api/repositories/:idCreate Repository
POST /api/repositoriesBody:
{
"path": "/home/user/projects/my-project"
}Delete Repository
DELETE /api/repositories/:idApps
List Apps
GET /api/appsResponse:
[
{
"id": "app123",
"name": "my-app",
"repositoryId": "repo456",
"status": "running",
"composeFile": "docker-compose.yml",
"autoDeployEnabled": false,
"services": [
{
"serviceName": "web",
"containerPort": 3000,
"exposed": true,
"domain": "myapp.example.com"
}
]
}
]Get App
GET /api/apps/:idCreate App
POST /api/appsBody:
{
"name": "my-app",
"repositoryId": "repo456",
"branch": "main",
"composeFile": "docker-compose.yml",
"services": [
{
"serviceName": "web",
"containerPort": 3000,
"exposed": true,
"domain": "myapp.example.com"
}
]
}Update App
PATCH /api/apps/:idBody:
{
"name": "updated-name",
"autoDeployEnabled": true,
"notificationsEnabled": true,
"environmentVariables": {
"DATABASE_URL": "postgres://..."
},
"services": [
{
"serviceName": "web",
"containerPort": 3000,
"exposed": true,
"domain": "myapp.example.com"
}
]
}Delete App
DELETE /api/apps/:idStops all containers and removes the Docker stack.
Query Parameters:
| Name | Type | Description |
|---|---|---|
stopContainers | boolean | Whether to stop containers (default: true) |
Deploy App
POST /api/apps/:id/deployTriggers a deployment. Returns immediately; check deployments for status.
Response:
{
"success": true,
"deployment": {
"id": "deploy123",
"status": "building",
"createdAt": "2024-01-15T10:30:00Z"
}
}Deploy App (Streaming)
GET /api/apps/:id/deploy/streamServer-Sent Events endpoint for real-time deployment progress.
Events:
progress— Build progress updatescomplete— Deployment finished successfullyerror— Deployment failed
Stop App
POST /api/apps/:id/stopStops all containers without deleting the app.
Cancel Deployment
POST /api/apps/:id/cancel-deployCancels an in-progress deployment.
Get App Logs
GET /api/apps/:id/logsQuery Parameters:
| Name | Type | Description |
|---|---|---|
service | string | Filter by service name |
tail | number | Number of lines (default: 100) |
Get App Status
GET /api/apps/:id/statusResponse:
{
"containers": [
{
"name": "myapp_web.1",
"status": "running",
"state": "Running"
}
]
}Get Deployments
GET /api/apps/:id/deploymentsReturns the last 10 deployments for the app.
Sync Services
POST /api/apps/:id/sync-servicesRe-parses the compose file and updates service ports.
Deployment Settings
Get Prerequisites
GET /api/deployment/prerequisitesCheck if Docker, Traefik, and other prerequisites are configured.
Response:
{
"docker": {
"installed": true,
"running": true,
"version": "24.0.7"
},
"traefik": {
"detected": true,
"type": "vibora",
"containerName": "traefik",
"network": "traefik"
},
"settings": {
"cloudflareConfigured": true
},
"ready": true
}Get Deployment Settings
GET /api/deployment/settingsUpdate Deployment Settings
POST /api/deployment/settingsBody:
{
"cloudflareApiToken": "your-token"
}Start Traefik
POST /api/deployment/traefik/startStarts Vibora's managed Traefik container.
Stop Traefik
POST /api/deployment/traefik/stopTerminals
List Terminals
GET /api/terminalsCreate Terminal
POST /api/terminalsBody:
{
"name": "My Terminal",
"cwd": "/home/user/projects"
}Delete Terminal
DELETE /api/terminals/:idWorktrees
List Worktrees
GET /api/worktreesDelete Worktree
DELETE /api/worktrees/:pathGit Operations
Repository Status
GET /api/git/status?path=/path/to/repoRepository Diff
GET /api/git/diff?path=/path/to/repoList Branches
GET /api/git/branches?path=/path/to/repoNotifications
Send Notification
POST /api/notificationsBody:
{
"title": "Task Complete",
"message": "Authentication feature is ready for review"
}Health
Health Check
GET /api/healthResponse:
{
"status": "ok",
"version": "1.0.0"
}WebSocket
Terminal I/O is handled via WebSocket:
ws://localhost:7777/ws/terminalProtocol
Messages are JSON-encoded:
{
"type": "input",
"terminalId": "term123",
"data": "ls -la\n"
}{
"type": "output",
"terminalId": "term123",
"data": "total 48\ndrwxr-xr-x..."
}Error Responses
Errors return appropriate HTTP status codes with a JSON body:
{
"error": "Task not found",
"code": "NOT_FOUND"
}| Status | Description |
|---|---|
| 400 | Bad Request — Invalid input |
| 404 | Not Found — Resource doesn't exist |
| 500 | Internal Server Error |
