Vikunja Skill
Connects an OpenClaw agent to any Vikunja instance via its REST API (/api/v1).
Uses an API token for authentication — no session management needed.
Configuration (required env vars)
| Variable |
Description |
VIKUNJA_BASE_URL |
Base URL of the instance, e.g. https://vikunja.example.com |
VIKUNJA_API_TOKEN |
API token created under Settings → API Tokens |
The agent must confirm both vars are set before making any request.
If missing, tell the user exactly which var is absent and where to create the token
(Settings → API Tokens in the Vikunja web UI).
Important API conventions
Vikunja uses non-standard HTTP verbs:
PUT = create a new resource
POST = update an existing resource
GET = read / list
DELETE = delete
All requests:
- Header:
Authorization: Bearer <VIKUNJA_API_TOKEN>
- Header:
Content-Type: application/json
- Base:
${VIKUNJA_BASE_URL}/api/v1
Paginated list endpoints accept ?page=N&per_page=50&s=<search>.
Response headers x-pagination-total-pages and x-pagination-result-count
tell you if more pages exist.
Supported operations
See references/endpoints.md for the full endpoint reference.
Projects
- List all projects the user has access to
- Create a new project
- Get a single project by ID
Tasks
- List tasks (all, or filtered by project)
- Get a single task by ID
- Create a task in a project
- Update a task (title, description, priority, due date, percent done)
- Mark a task as done (
"done": true)
- Delete a task
Labels
- List all available labels
- Create a label
- Add a label to a task
- Remove a label from a task
Assignees
- Add a user as assignee to a task
- Remove an assignee from a task
- List task assignees
Reminders
- Add a reminder to a task (absolute datetime or relative offset)
- Remove a reminder from a task
- Reminders are part of the task object — use the task update flow
Task Relations
- Create a relation between two tasks (precedes, follows, blocked_by, subtask, etc.)
- Delete a relation
- When creating a new task with a known relation, use
related_tasks inline in the body — no separate call needed
- When adding relations to already-existing tasks, use
PUT /tasks/{id}/relations
Workflow guidelines
- Resolve names to IDs first. If the user says "add a task to my Work
project", list projects and find the ID for "Work" before creating the task.
- Confirm destructive actions. Before deleting a task or project, confirm
with the user.
- Show structured output. When listing tasks, present title, due date,
priority, labels, and done status. Format dates in a human-readable way.
- Handle pagination. If
x-pagination-total-pages > 1, fetch subsequent
pages or inform the user that results are truncated.
- Error handling. On HTTP 4xx/5xx, surface the
message field from the
JSON response to the user. On 401, remind them to check VIKUNJA_API_TOKEN.
Example interactions
- "What tasks are due this week?" → GET /tasks/all with filter, format results
- "Create a task 'Deploy new release' in my Homelab project due Friday" → resolve
project ID, then PUT /projects/{id}/tasks
- "Mark task 42 as done" → POST /tasks/42 with
{"done": true}
- "Add the 'urgent' label to task 17" → resolve label ID, PUT /tasks/17/labels
- "Assign me to task 5" → look up current user via GET /user, PUT /tasks/5/assignees
- "Set a reminder for task 8 in 2 hours" → compute absolute datetime, POST /tasks/8
Read references/endpoints.md for exact request/response shapes.
1---2name: vikunja3description: Interact with a Vikunja task management instance via its REST API. Use this skill whenever the user wants to manage tasks, projects, labels, assignees, or reminders in Vikunja — including creating tasks, listing what's due, marking things done, adding labels, assigning users, or organizing projects. Trigger on phrases like "add a task", "what's due today", "create a project in Vikunja", "assign this to me", "set a reminder", or any mention of Vikunja task management.4---56# Vikunja Skill78Connects an OpenClaw agent to any Vikunja instance via its REST API (`/api/v1`).9Uses an API token for authentication — no session management needed.1011## Configuration (required env vars)1213| Variable | Description |14|---|---|15| `VIKUNJA_BASE_URL` | Base URL of the instance, e.g. `https://vikunja.example.com` |16| `VIKUNJA_API_TOKEN` | API token created under Settings → API Tokens |1718The agent must confirm both vars are set before making any request.19If missing, tell the user exactly which var is absent and where to create the token20(Settings → API Tokens in the Vikunja web UI).2122## Important API conventions2324> **Vikunja uses non-standard HTTP verbs:**25> - `PUT` = **create** a new resource26> - `POST` = **update** an existing resource27> - `GET` = read / list28> - `DELETE` = delete2930All requests:31- Header: `Authorization: Bearer <VIKUNJA_API_TOKEN>`32- Header: `Content-Type: application/json`33- Base: `${VIKUNJA_BASE_URL}/api/v1`3435Paginated list endpoints accept `?page=N&per_page=50&s=<search>`.36Response headers `x-pagination-total-pages` and `x-pagination-result-count`37tell you if more pages exist.3839## Supported operations4041See `references/endpoints.md` for the full endpoint reference.4243### Projects4445- List all projects the user has access to46- Create a new project47- Get a single project by ID4849### Tasks5051- List tasks (all, or filtered by project)52- Get a single task by ID53- Create a task in a project54- Update a task (title, description, priority, due date, percent done)55- Mark a task as done (`"done": true`)56- Delete a task5758### Labels5960- List all available labels61- Create a label62- Add a label to a task63- Remove a label from a task6465### Assignees6667- Add a user as assignee to a task68- Remove an assignee from a task69- List task assignees7071### Reminders7273- Add a reminder to a task (absolute datetime or relative offset)74- Remove a reminder from a task75- Reminders are part of the task object — use the task update flow7677### Task Relations78- Create a relation between two tasks (precedes, follows, blocked_by, subtask, etc.)79- Delete a relation80- When creating a new task with a known relation, use `related_tasks` inline in the body — no separate call needed81- When adding relations to already-existing tasks, use `PUT /tasks/{id}/relations`8283## Workflow guidelines84851. **Resolve names to IDs first.** If the user says "add a task to my Work86 project", list projects and find the ID for "Work" before creating the task.872. **Confirm destructive actions.** Before deleting a task or project, confirm88 with the user.893. **Show structured output.** When listing tasks, present title, due date,90 priority, labels, and done status. Format dates in a human-readable way.914. **Handle pagination.** If `x-pagination-total-pages > 1`, fetch subsequent92 pages or inform the user that results are truncated.935. **Error handling.** On HTTP 4xx/5xx, surface the `message` field from the94 JSON response to the user. On 401, remind them to check `VIKUNJA_API_TOKEN`.9596## Example interactions9798- "What tasks are due this week?" → GET /tasks/all with filter, format results99- "Create a task 'Deploy new release' in my Homelab project due Friday" → resolve100 project ID, then PUT /projects/{id}/tasks101- "Mark task 42 as done" → POST /tasks/42 with `{"done": true}`102- "Add the 'urgent' label to task 17" → resolve label ID, PUT /tasks/17/labels103- "Assign me to task 5" → look up current user via GET /user, PUT /tasks/5/assignees104- "Set a reminder for task 8 in 2 hours" → compute absolute datetime, POST /tasks/8105106Read `references/endpoints.md` for exact request/response shapes.