Help
TimeboardApp is a lightweight task tracker with tags, recurring tasks, notifications, and a complete JSON API.
Core concepts
Tasks
- Name: the task title.
- Due date: stored in UTC and displayed using your browser's locale.
- Status:
pending,completed, orarchived. - URL (optional): if provided, notifications link to this URL; otherwise they link to the in-app task editor.
- Tags: free-form labels used for organization and (optionally) notification routing.
Tags
Tags are global (per installation) but tasks are always scoped to a user account. Tags are used for filtering and for routing notifications.
Past-due tag bar
Each user can enable Profile → Dashboard shortcuts → Show frozen past-due tag bar. When enabled, a sticky top bar lists tags assigned to active past-due tasks and opens a dashboard tab filtered to the selected tag.
ChatGPT
TimeboardApp 00.14.00 includes an experimental native MCP connection for ChatGPT. Each person signs in with their own TimeboardApp account and approves the requested permissions. MCP is disabled by default; an administrator must enable it on a publicly reachable HTTPS installation.
Native MCP is enabled on this installation. You can review approved applications under Profile → Connected applications.
Connect your account
- Ask your administrator for this installation's public MCP address, such as
https://tasks.example.com/mcp. - In ChatGPT, open Plugins → + → Add custom MCP server. Enter that address, choose OAuth, and create the plugin. Availability depends on your ChatGPT account and workspace settings.
- Sign in on the TimeboardApp page. Check the account name and requested permissions, then select Allow access, or Cancel to decline.
- Start a new ChatGPT conversation and select the plugin with
@. Ask it to identify your account and list your tasks before creating a disposable test task.
You do not need an OpenAI API key or a copied TimeboardApp API token. If ChatGPT displays a callback address that the server rejects, give the exact address to your administrator so they can configure it and restart the service. Administrator setup and troubleshooting are in the ChatGPT integration guide.
Permissions and task changes
The connection offers eleven tools, subject to the permissions shown on the consent page:
| Permission | What it allows |
|---|---|
tasks:read | Identify your account, list or search your tasks, read a task, and summarize your task counts. |
tasks:write | Create, update, complete, archive, and restore your tasks. |
users:read | List eligible assignees by username and ID. |
tasks:assign | Transfer an active standalone task you own to an eligible assignee. |
- Your account's tasks only: even administrator connections cannot read or change another person's tasks through MCP. Read-only permission does not allow changes.
- Assignment: you can assign to yourself or eligible subordinates; administrators can assign to any user. Tasks in a parent/subtask tree cannot be transferred. After a transfer, the former owner loses MCP access to the task, existing followers are removed, and the recipient receives an in-app notification.
- Existing task rules apply: changes can send configured notifications, and completing a recurring task can create its next occurrence. Resolve open subtasks in TimeboardApp before completing the parent.
- Check results: review the task and intended changes before approving a write. If a response is interrupted, ask ChatGPT to check the task's current state before trying again.
Disconnect an application
Open Profile → Connected applications → Manage connections, review the application's permissions, and select Disconnect. This immediately stops its access to your account. Reconnect and approve access again if you want to use it later. Changing your TimeboardApp password also invalidates existing MCP connections.
Existing private GPT Actions
Private GPT Actions remain available separately, with eight task operations at /api/chatgpt.
They use a scoped integration token and the /openapi-chatgpt.json schema instead of MCP OAuth.
Existing Actions configurations keep working when MCP is disabled. Their tokens are managed separately;
disconnecting an MCP application does not revoke an Actions token.
Notifications
Notifications are configured per user via Profile → Notifications. Each notification service entry creates a unique tag. If a task includes that tag, notifications are sent to that service whenever the task changes.
Non-browser notifications (email/webhooks/etc.) are dispatched asynchronously. If a send fails, the delivery status and an error summary are recorded on the notification event log (and in the application logs).
What triggers notifications
- created: a new task is created
- updated: an existing task is edited (including tags, due date, URL, etc.)
- past_due: the task is overdue (sent by the scheduled overdue scan)
- completed: the task is completed
- archived: the task is archived
Notification routing (service tags)
- Create one or more notification services in your profile.
- Copy the generated
notify:…tag for that service (tip: click the tag in the Notifications page to copy). - Add that tag to any task you want routed to that service.
- If a task has multiple service tags, it will send to multiple services.
Notification message format
Notifications use this canonical text format:
<CHANGE_ACTION>:<URL><TASK_NAME></URL> -<DUE_DATE> [<TAGS>]
The URL is the task's configured URL if present, otherwise it links to the in-app task editor.
Supported notification services
Each service type has a small configuration payload. You can create multiple entries per type (for example, multiple Gotify tokens or multiple webhooks).
- Browser: delivered to the currently-open browser via an SSE stream. Requires browser permission.
- Email: sends an email per notification. Requires admin email configuration (SMTP or SendGrid).
- Windows Push Notifications (WNS): requires admin WNS credentials and a per-device channel URI in your service entry.
- Gotify: posts to a Gotify server using an application token.
- ntfy: posts to an ntfy topic (supports optional token and click-through link).
- Discord: posts to a Discord channel via webhook (uses an embed so the task name is clickable when an absolute URL is available).
- Generic webhook: POSTs a JSON payload to a URL; optional secret is sent as
X-TimeboardApp-Secret. - Generic API: calls a configurable URL/method with optional headers/token and a JSON body (for POST/PUT/PATCH).
Example service configuration payloads
These match the fields shown in the profile notifications UI and the /api/notifications/services endpoints.
{
"service_type": "gotify",
"name": "Phone",
"enabled": true,
"config": {
"base_url": "https://gotify.example.com",
"token": "YOUR_APP_TOKEN",
"priority": 5
}
}
{
"service_type": "ntfy",
"name": "Personal",
"enabled": true,
"config": {
"server_url": "https://ntfy.sh",
"topic": "my-topic",
"token": "OPTIONAL_BEARER_TOKEN",
"priority": "high"
}
}
{
"service_type": "webhook",
"name": "Automation",
"enabled": true,
"config": {
"url": "https://example.com/webhook/timeboardapp",
"secret": "OPTIONAL_SHARED_SECRET"
}
}
{
"service_type": "generic_api",
"name": "Custom API",
"enabled": true,
"config": {
"url": "https://api.example.com/v1/events",
"method": "POST",
"token": "OPTIONAL_BEARER_TOKEN",
"headers": {
"X-App": "timeboardapp"
}
}
}
Admin settings
Email settings are configured in Admin → Email and stored in the database.
The sample settings.yml can be used once to seed initial values, but runtime configuration is managed in the admin UI (or via the admin API).
SMTP Docker note: if TimeboardApp is running in a container, localhost/127.0.0.1 refers to the container itself.
Use a hostname/IP that is reachable from inside the container (for example: an SMTP container service name on the same docker-compose network,
or host.docker.internal when using Docker Desktop).
Push notifications (WNS)
Global WNS credentials are configured in Admin → Push Notifications.
Users then add per-device channel_uri values in their own notification service entries.
Application logs
Logs are written to /data/logs (one file per day) with standard levels: DEBUG, INFO, WARN, ERROR.
Retention and log level are configured in Admin → Logs.
Validation
Admins can run feature and security validation from Admin → Validation.
The run writes a redacted, pasteable log under /data/validation by default.
API
Interactive API documentation is available at /docs (OpenAPI/Swagger UI).
Endpoint reference
All endpoints below are rooted at the same TimeboardApp base URL. Most endpoints require an API token.
/api/auth
POST /api/auth/token— obtain an access token (form-encodedusername/password).
/api/users
GET /api/users/me— get the current user.PATCH /api/users/me— update current user (name/email/password).GET /api/users/— list users (admin).POST /api/users/— create user (admin).PATCH /api/users/{user_id}— update user (admin).DELETE /api/users/{user_id}— delete user (admin).
/api/tasks
GET /api/tasks/— list tasks (supports filters likestatus, due windows, and pagination).POST /api/tasks/— create task.GET /api/tasks/{task_id}— get task.PUT /api/tasks/{task_id}— update task.DELETE /api/tasks/{task_id}— archive task.POST /api/tasks/{task_id}/complete— mark complete.POST /api/tasks/{task_id}/restore— restore from completed/archived.
/api/tags
GET /api/tags/— list tags for current user (admin can list tags for a specific user via?user_id=).
/api/notifications
GET /api/notifications/services— list your notification services (includes generated routing tags).POST /api/notifications/services— create a notification service entry (creates a routing tag).GET /api/notifications/services/{service_id}— get a service entry.PUT /api/notifications/services/{service_id}— update a service entry.DELETE /api/notifications/services/{service_id}— delete a service entry (also deletes its generated tag).GET /api/notifications/events— list notification events (filterable byservice_type,task_id,before_id,after_id).
/api/admin
GET /api/admin/email— get email settings (admin).PUT /api/admin/email— update email settings (admin).GET /api/admin/logging— get logging settings (admin).PUT /api/admin/logging— update logging settings (admin).GET /api/admin/wns— get WNS settings (admin).PUT /api/admin/wns— update WNS settings (admin).GET /api/admin/logs/files— list log files (admin).GET /api/admin/logs/files/{filename}?max_lines=...— read the tail of a log file (admin).
Authentication
Obtain a token with:
curl -X POST -d "username=YOUR_USERNAME&password=YOUR_PASSWORD" \
http://localhost:8000/api/auth/token
Use the returned token as:
Authorization: Bearer <ACCESS_TOKEN>
Common API examples
Create a task:
curl -X POST http://localhost:8000/api/tasks/ \
-H "Authorization: Bearer <TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"name": "Pay rent",
"due_date_utc": "2026-03-01T00:00:00Z",
"tags": ["finance", "notify:u1:ntfy:abcd1234"]
}'
List tasks (pending):
curl http://localhost:8000/api/tasks/?status=pending \
-H "Authorization: Bearer <TOKEN>"
Create a notification service:
curl -X POST http://localhost:8000/api/notifications/services \
-H "Authorization: Bearer <TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"service_type": "ntfy",
"name": "Phone",
"enabled": true,
"config": {
"server_url": "https://ntfy.sh",
"topic": "my-topic"
}
}'
List your notification services (and copy the generated tag):
curl http://localhost:8000/api/notifications/services \
-H "Authorization: Bearer <TOKEN>"
List notification events:
curl http://localhost:8000/api/notifications/events?limit=50 \
-H "Authorization: Bearer <TOKEN>"
Admin API examples
Admin endpoints require an admin user.
Update email settings (SMTP):
curl -X PUT http://localhost:8000/api/admin/email \
-H "Authorization: Bearer <ADMIN_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"enabled": true,
"provider": "smtp",
"smtp_host": "smtp.example.com",
"smtp_port": 587,
"smtp_username": "user@example.com",
"smtp_password": "YOUR_PASSWORD",
"smtp_from": "TimeboardApp <timeboardapp@example.com>",
"use_tls": true
}'
Update email settings (SendGrid):
curl -X PUT http://localhost:8000/api/admin/email \
-H "Authorization: Bearer <ADMIN_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"enabled": true,
"provider": "sendgrid",
"sendgrid_api_key": "YOUR_SENDGRID_API_KEY",
"smtp_from": "TimeboardApp <timeboardapp@example.com>"
}'
List log files:
curl http://localhost:8000/api/admin/logs/files \
-H "Authorization: Bearer <ADMIN_TOKEN>"
Read the tail of a log file:
curl "http://localhost:8000/api/admin/logs/files/timeboardapp-2026-02-20.log?max_lines=2000" \
-H "Authorization: Bearer <ADMIN_TOKEN>"