The Woven Thread
Overview
Melian bridges the physical and digital worlds through her task system. Handwritten notes on a Remarkable tablet are scanned via OCR, parsed into structured tasks, and synced to an Obsidian vault. Follow-up jobs ensure nothing falls through the cracks.
Tasks are addressed by line number (the 1-based position of a task in the markdown file is its stable ID). All tool calls and API endpoints use line numbers to reference specific tasks.
Task Interface
export interface Task {
line: number; // 1-based line number, stable ID
text: string;
completed: boolean;
created: string | null; // ISO date
due: string | null;
completedDate: string | null;
tags: string[];
}
export type TaskFilter = "all" | "pending" | "completed" | "overdue" | "backlog";Tasks are stored in standard Obsidian markdown checkbox format with optional metadata:
- [ ] Review the API design doc 📅 2026-04-18 #work
- [ ] Send feedback to the team ➕ 2026-04-17
- [x] Update the deployment script ✅ 2026-04-16The Pipeline
The Remarkable pipeline moves handwriting into structured tasks in five steps:
- Remarkable Tablet: you write tasks by hand on the tablet
- OCR: Google Cloud Vision extracts text from the handwriting image
- Parsing: Melian structures the raw OCR output into
Taskobjects, inferring due dates and tags from natural-language phrases - Obsidian Sync: tasks are written to your Obsidian vault as markdown checkboxes in the standard format
- Follow-up Scheduling: tasks with due dates get a reminder job created automatically; Melian handles the scheduling without further input
The sync is bidirectional. Tasks completed or modified in Obsidian are reflected in Melian's task view on the next read.
Tools
| Tool | Parameter | Type | Required | Description |
|---|---|---|---|---|
tasks_list |
filter |
"all" | "pending" | "completed" | "overdue" | "backlog" |
no (defaults to "pending") |
Return tasks matching the filter |
tasks_add |
text |
string | yes | Task description |
due |
string | no | ISO date (YYYY-MM-DD) | |
tags |
string[] | no | Tags to attach | |
tasks_complete |
line |
number | yes | Mark a task complete by line number |
tasks_search |
query |
string | yes | Search task text |
tasks_backlog |
line |
number | yes | Move a task to the backlog |
tasks_unbacklog |
line |
number | yes | Restore a task from the backlog |
API
| Method | Path | Description |
|---|---|---|
| GET | /tasks/today |
Categorized view: overdue, due today, upcoming |
| GET | /tasks/list?filter=<filter> |
List tasks with a TaskFilter |
| POST | /tasks/:line/complete |
Mark task at line as complete |
| POST | /tasks/:line/backlog |
Move task at line to backlog |
| POST | /tasks/:line/unbacklog |
Restore task at line from backlog |
Obsidian Integration
Melian reads and writes the vault markdown file directly, with no plugin required. The file is read fresh on each tool call so edits made in Obsidian are immediately visible. Writes append to the file or perform line-targeted replacements using the 1-based line number as the address.
The backlog state is represented by the #backlog tag, keeping the file valid markdown that renders correctly in Obsidian while preserving the semantic state Melian needs.