Organize Tasks logo

Organize Tasks

Community
matyasstoch
organize-tasks

Use when David wants to clean up, review, or triage his Todoist tasks. Batch review process - 4 tasks at a time, David decides, AI executes.

Overview

Publishermatyasstoch
Repositorydavid-skills
Skill nameorganize-tasks
Stars
61
Forks
11
Bundled files
Instructions only
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by matyasstoch on GitHub. Read the source before you install it.

Installation

Install the Organize Tasks AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/matyasstoch/david-skills/tree/main/skills/organize-tasks
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/matyasstoch/david-skills.git /tmp/david-skills
mkdir -p .claude/skills
cp -r /tmp/david-skills/skills/organize-tasks .claude/skills/organize-tasks
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Organize Tasks in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Organize Tasks on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Organize Tasks is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Todoist Cleanup - Batch Review

Goal: Review every active task with David. He decides - AI presents and executes.

How David Uses Todoist

The Inbox is a brain dump - tasks, ideas, frustrations, observations, notes all land here. This is by design, not a problem. Triage is where signal gets separated from noise. Never comment on this pattern or suggest changing it.

Rules

  • No bulk-deleting, auto-triaging, or judgment calls. AI has <1% of context.
  • Present tasks exactly as written. David says keep, delete, complete, move, or delegate.
  • TXT reminders: When converting a Todoist task to a .txt reminder file, ALWAYS delete the Todoist task immediately after confirming the file was created. One atomic operation.
    • Business reminders -> business/reminders/
    • Personal reminders -> personal/reminders/

Steps

Step 1: Confirm scope

Fetch scope is defined by David at session start. Ask if unclear. Examples:

  • "Inbox only" -> project_id <INBOX_PROJECT_ID>, no date filter.
  • "Today across 4 main projects" -> Personal, Business, Wisdom, David, due == today.
  • "Today + overdue everywhere" -> all 5 projects, due <= today.

Project IDs and the fetch pattern live in the todoist skill. Never assume scope - confirm first.

Track a session set of task contents David has said "keep/skip" on - these stay in Todoist but should not be re-presented.

Step 2: Fetch + present 4

Fetch the scope from Todoist. Filter out anything in the session's kept/skipped set. Sort: P4 first, then P3, P2, P1.

Show progress (handled this session / total remaining in scope), then the current batch (numbered 1-4), a separator, then a preview of the next batch (numbered 5-8). Use identical formatting for both - David reads them side by side and any styling difference makes the preview harder to scan:

text
**12 handled, 28 remaining**

**Current batch:**

1. **P4** task text
2. **P2** task text
3. **P1** task text
4. **P4** task text

---

**Preview of next batch:**

5. **P4** task text
6. **P3** task text
7. **P2** task text
8. **P1** task text
  • Restart numbering from 1 each batch; preview continues from 5-8.
  • No project name. Priority + task text only.
  • David responds only to 1-4. Preview is for him to start thinking about the next batch in parallel.

Step 3: Execute David's calls

For each of the 4, David gives a disposition. Execute immediately in Todoist:

  • Keep / Skip: No Todoist changes. Add task content to session kept/skipped set.
  • Delete: Delete from Todoist.
  • Complete: Close task in Todoist.
  • Move: Move to target project in Todoist.
  • Delegate: Move to team member's project.
  • Reprioritize: Update priority in Todoist.
  • Set due date: Update due date in Todoist.
  • Convert to reminder: Create .txt file, delete Todoist task.
  • Add label: Update labels in Todoist (e.g. "labels": ["reminder"]). Common label: reminder for self-nudge tasks.
  • Compound: David often gives multiple actions at once, e.g. "into Business, p2, today" or "into Personal, p3, today, label 'reminder'" = move + set priority + set due date + add label. Execute all parts together - update priority, due date, and labels first, then move (move changes the task ID).

Step 4: Re-fetch and advance

Once all 4 are handled, re-fetch the scope from Todoist (fresh state, latest IDs), filter out the kept/skipped set, present the next 4 plus preview. No confirmation needed. Repeat until no tasks remain in scope.

ALWAYS re-fetch before every batch - David often edits Todoist directly in the web/mobile app between batches (adds, deletes, reprioritizes, reschedules). Never present from cached data. One fresh fetch per batch is non-negotiable.

Step 5: Wrap up

Summarize totals (kept, deleted, completed, moved, delegated). Report final task count remaining in Todoist.

Execution Discipline (LEARNED THE HARD WAY - READ EVERY TIME)

Every operation MUST go through a script file (write_file to /tmp/todoist_*.sh, then bash). NEVER run inline curl/jq in the terminal.

  1. Auth-token masking corrupts inline commands. A security filter rewrites the literal string Authorization: Bearer $TOKEN and can silently break the command. Workaround that survives the filter:

    bash
    TK=$(grep -E '^TODOIST_API' .env | cut -d= -f2- | tr -d '"' | tr -d "'" | tr -d ' ')
    WORD="Bea""rer"
    HDR="Authorization: ${WORD} ${TK}"
    curl -s ... -H "$HDR" ...

    After write_file, read_file the script to confirm the auth line is intact.

  2. curl exits 0 even on 401/auth failure. Capture the response body and check it with jq. A success body has the task object; a failure has an error/null. Never report a disposition as done without seeing the updated object.

  3. Don't invent priority errors. P3 = API value 2. If David says P3 and you send priority:2, that is correct. Re-check the Priority Trap table before fixing anything.

Content Matching with Special Characters

David's brain-dump tasks often contain smart quotes, em-dashes, and ellipses. Exact full-content jq matching is fragile. Match on a safe ASCII prefix with startswith, not the full string.

bash
findid() { echo "$INBOX" | jq -r --arg s "$1" '.results[] | select(.content | startswith($s)) | .id' | head -1; }
ID=$(findid "Team member is right")
ID=$(findid "list out all things I")

Recurring Tasks via due_string

When David asks for a recurring disposition ("every 14 days", "every 4 days"), set it through due_string, NOT a separate field. Combine recurrence + start date in one string:

  • "due_string":"every 14 days starting Monday" -> recurs, first due Monday
  • "due_string":"every 10 days starting today" -> recurs, first due today
  • "due_string":"every 4 days starting today" -> recurs from today

Verify the response body's .due.string echoes the recurrence and .due.date is the correct first occurrence. This is part of a compound action - set priority/labels/due_string before the move.

Priority Mapping (THE PRIORITY TRAP)

API priority is inverted vs UI. Always convert:

API priorityUI LabelMeaning
4P1Highest (red)
3P2High (orange)
2P3Medium (blue)
1P4Lowest (no color)

Before presenting ANY batch: Verify the API value matches the UI label.

Recurring Tasks (due_string syntax)

David frequently sets recurring reminders during triage. Set recurrence via the due_string field on the update call:

  • "due_string":"every 4 days starting today" -> first occurrence today
  • "due_string":"every 14 days starting Monday" -> first occurrence next Monday
  • "due_string":"every 6 days" -> Todoist defaults first occurrence to today

When David says "every N days, due date today" he means recurrence every N days, first occurrence today -> "every N days starting today".

Task IDs Change When Moved

When a task is moved to a different project, Todoist assigns a new task ID. Match by content (task text), not by id.

Execution order for compound actions: Always update priority and due date before moving. The move changes the task ID, so later updates using the old ID will silently fail.

Team-Prefixed Tasks in Inbox

When David asks to auto-categorize remaining Inbox tasks between main projects, tasks prefixed with a team member's name (e.g. assistant -- ...) are not candidates for self-categorization - they belong delegated to that person's project. If David's stated task count does not match the actual Inbox count, the diff is usually team-prefixed tasks.

Name-only-not-prefixed tasks (e.g. "assistant errand") are different. They are not a team-prefixed delegation pattern. If David scopes categorization to Personal/Business/Wisdom only, ask: "Assistant's project, or Personal?"

Stale ID Trap

ALWAYS re-fetch task IDs immediately before any delete/move/update operation. Never reuse IDs from an earlier fetch - they go stale when tasks are moved or recreated. The API returns 204 on already-deleted IDs with no error, so stale IDs fail silently.

Resuming an Interrupted Batch

If a compound-action run gets interrupted mid-batch, do not re-execute the whole list.

  1. Re-fetch the source project fresh.
  2. For each task on the original job list, try content-match against the fresh source fetch.
  3. NOT FOUND on the source means likely already moved successfully. Verify by fetching the intended target project and confirming expected priority and due date.
  4. Only re-execute jobs where the task is still in the source project.

This avoids double-moving, duplicate creates, or silently leaving the half-finished task in the wrong state.

API Reference

Uses the todoist skill for all API operations. Key endpoints:

  • Delete: DELETE /api/v1/tasks/{id}
  • Complete: POST /api/v1/tasks/{id}/close
  • Move: POST /api/v1/tasks/{id}/move with {"project_id": "TARGET_ID"}
  • Update priority: POST /api/v1/tasks/{id} with {"priority": API_VALUE}
  • Recurring delete: Clear recurrence first ({"due_string": ""}), then delete.
  • NEVER use update endpoint to move - it silently ignores project_id.

Auth: $TODOIST_API_TOKEN from .env file. Always source .env first.

Frequently asked questions

What does the Organize Tasks AI skill do?

Use when David wants to clean up, review, or triage his Todoist tasks. Batch review process - 4 tasks at a time, David decides, AI executes.

Why use Organize Tasks on TypingMind?

Because you install it once and use it with any model. Organize Tasks is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Organize Tasks in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/matyasstoch/david-skills/tree/main/skills/organize-tasks. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Organize Tasks?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Organize Tasks?

As many as you like. As long as a model supports skills, you can use Organize Tasks with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Organize Tasks AI skill free?

It is published on GitHub by matyasstoch. Check the repository for licensing terms. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇