Skip to content

Local API Server

Mindwtr includes an optional local REST API server for scripting and integrations. On desktop it runs inside the app binary and uses the same local storage paths as the app. The repository also includes a Bun helper for development and advanced scripting.


Desktop Toggle

Desktop builds can start the local REST API without running source code:

  • Open Settings -> Advanced.
  • Enable Local API server.
  • Keep the default port 3456 or choose another localhost port.
  • Copy the generated bearer token from the same settings card.

The app binds to 127.0.0.1 only and requires Authorization: Bearer <token> on every request. Mobile binaries do not expose a local REST API surface.

Development Helper

The repo helper is still available when you want to run the API outside the desktop app or point it at explicit files.


Quick Start

From the desktop app:

text
Settings -> Advanced -> Enable local API server

Default URL:

text
http://127.0.0.1:3456

From the repo root with Bun:

bash
bun install
bun run mindwtr:api -- --port 4317 --host 127.0.0.1

Options

OptionDefaultDescription
--port <n>4317Server port
--host <host>127.0.0.1Bind address
--data <path>Platform defaultOverride data.json location
--db <path>Platform defaultOverride mindwtr.db location

Environment Variables

VariableDescription
MINDWTR_DATAOverride data.json location (if --data is omitted)
MINDWTR_DB_PATHOverride mindwtr.db location (if --db is omitted)
MINDWTR_API_TOKENBun helper only: if set, require Authorization: Bearer <token>

By default, the API resolves both data.json and mindwtr.db using Mindwtr's platform paths (preferring XDG data on Linux).


Authentication

Desktop Local API requests always require the bearer token shown in Settings -> Advanced:

Authorization: Bearer <token>

The Bun helper only requires a token when MINDWTR_API_TOKEN is set.


Endpoints

MethodEndpointDescription
GET/healthHealth check → { ok: true }
GET/tasksList tasks
GET/tasks?status=nextFilter by status
GET/tasks?query=@workSearch tasks
GET/tasks?all=1Include done/archived
GET/tasks?deleted=1Include soft-deleted
POST/tasksCreate task
GET/tasks/:idGet single task
PATCH/tasks/:idUpdate task
DELETE/tasks/:idSoft delete task
POST/tasks/:id/completeMark as done
POST/tasks/:id/archiveMark as archived
POST/tasks/:id/restoreRestore a soft-deleted task
GET/projectsList projects
GET/areasList areas
GET/v1/areasCompatibility alias for areas
GET/search?query=...Search tasks + projects

Response Shapes

Task (partial)

json
{
  "id": "uuid",
  "title": "Task title",
  "status": "inbox",
  "projectId": "uuid",
  "dueDate": "2026-01-25T12:00:00.000Z",
  "tags": ["#work"],
  "contexts": ["@email"],
  "createdAt": "2026-01-25T10:00:00.000Z",
  "updatedAt": "2026-01-25T10:00:00.000Z",
  "deletedAt": null
}

Project (partial)

json
{
  "id": "uuid",
  "title": "Project name",
  "status": "active",
  "color": "#94a3b8",
  "createdAt": "2026-01-25T10:00:00.000Z",
  "updatedAt": "2026-01-25T10:00:00.000Z",
  "deletedAt": null
}

Area

json
{
  "id": "uuid",
  "name": "Area name",
  "color": "#94a3b8",
  "icon": "briefcase",
  "order": 0,
  "createdAt": "2026-01-25T10:00:00.000Z",
  "updatedAt": "2026-01-25T10:00:00.000Z"
}

Create Task Body

json
{
  "input": "Call Alice",
  "title": "Alternative title",
  "props": {
    "status": "next",
    "contexts": ["@phone"],
    "tags": ["#errands"]
  }
}

Desktop uses title when present, otherwise input, and applies explicit props. The Bun helper additionally runs parseQuickAdd for input.


Examples

List next actions:

bash
curl -s 'http://127.0.0.1:3456/tasks?status=next' \
  -H 'Authorization: Bearer <token>' | jq .

Create with explicit props:

bash
curl -s -X POST 'http://127.0.0.1:3456/tasks' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{"title":"Call Alice","props":{"status":"next","contexts":["@phone"],"tags":["#errands"]}}' | jq .

Complete a task:

bash
curl -s -X POST "http://127.0.0.1:4317/tasks/$TASK_ID/complete" | jq .

CLI Tool

A simpler command-line interface is also available:

bash
# Add a task
bun mindwtr:cli -- add "Call mom @phone #family"

# List active tasks
bun mindwtr:cli -- list

# List with filters
bun mindwtr:cli -- list --status next --query "due:<=7d"

# Read or update a task
bun mindwtr:cli -- get <taskId>
bun mindwtr:cli -- update <taskId> '{"status":"next"}'

# Complete a task
bun mindwtr:cli -- complete <taskId>

# Archive, delete, or restore
bun mindwtr:cli -- archive <taskId>
bun mindwtr:cli -- delete <taskId>
bun mindwtr:cli -- restore <taskId>

# Search
bun mindwtr:cli -- search "@work"

# List projects
bun mindwtr:cli -- projects

CLI Reference

CommandExampleNotes
addmindwtr:cli -- add "Call mom @phone"Uses quick-add parsing
listmindwtr:cli -- list --status nextSupports --all, --deleted, --query
getmindwtr:cli -- get <taskId>Prints full task JSON
updatemindwtr:cli -- update <taskId> '{"status":"next"}'Applies a JSON patch
searchmindwtr:cli -- search "@work due:<=7d"Searches tasks/projects
completemindwtr:cli -- complete <taskId>Marks task as done
archivemindwtr:cli -- archive <taskId>Marks task as archived
deletemindwtr:cli -- delete <taskId>Soft-deletes task
restoremindwtr:cli -- restore <taskId>Restores a deleted task
projectsmindwtr:cli -- projectsLists active projects

Security Notes

  • The server is intended to run on 127.0.0.1 (localhost). Don't expose it publicly unless you understand the risks.
  • Desktop API access requires the generated bearer token from Settings. Keep that token private.
  • If you need remote access to the Bun helper, set MINDWTR_API_TOKEN and place the server behind an authenticated reverse proxy.

See Also

Mindwtr is free, open source, and local-first.