Zum Hauptinhalt springen
TaskForge 3.0: KI liest Ihre Aufgaben.

Obsidian-Aufgaben zwischen Formaten umwandeln

Obsidian Tasks hat keinen Befehl, der einen Vault von einem Format in ein anderes umschreibt. Die eigene Dokumentation sagt das ausdrücklich. Die folgenden Umwandlungen sind Skripte und Rezepte, die diese Arbeit erledigen, jeweils getestet an den Beispielzeilen aus der Plugin-Dokumentation, dazu die eine Umwandlung, für die es ein Werkzeug gibt: von einer Aufgabenzeile in eine Aufgabendatei und zurück.

Geschrieben gegen Obsidian Tasks 8.6, Task Genius 9.13 und TaskNotes 4.14, Oktober 2026. Feldnamen und Symbole stehen im Spickzettel.

Bevor Sie etwas ändern

  1. Den Vault sichern. Kopieren Sie den Ordner oder committen Sie ihn in git. Ein Skript, das 4.000 Zeilen umschreibt, sollte sich leicht rückgängig machen lassen.
  2. Zuerst an einer Kopie arbeiten. Führen Sie die Umwandlung an einer Kopie des Vaults aus, öffnen Sie sie in Obsidian und führen Sie eine Ihrer üblichen Aufgabenabfragen aus. Vergleichen Sie die Anzahl mit dem Original.
  3. Erst umwandeln, dann das Plugin umstellen. Obsidian Tasks liest jeweils nur ein Format. Wandeln Sie zuerst die Zeilen um und ändern Sie dann das Aufgabenformat in den Einstellungen, damit das Plugin nie einen halb umgewandelten Vault sieht.
  4. Prüfen, was übrig ist. Durchsuchen Sie den Vault nach den alten Symbolen (📅, ⏳, ⏫ bei Emoji; due::, repeat:: bei Dataview), um Zeilen zu finden, die das Rezept übersprungen hat.

Welche Umwandlung brauchen Sie

Von Nach Wie
Emoji-Zeilen Dataview-Felder Das Skript oder das Suchen-und-Ersetzen-Rezept unten.
Dataview-Felder Emoji-Zeilen Das umgekehrte Skript oder Rezept unten.
Beides Task Genius Nichts umzuschreiben. Task Genius liest beides in derselben Zeile. In seinen Einstellungen wählen Sie, welches es schreibt.
Aufgabenzeilen Aufgabendateien TaskNotes wandelt jeweils eine Zeile um. Die TaskForge-Befehlszeile wandelt viele auf einmal um.
Aufgabendateien Aufgabenzeilen Die TaskForge-Befehlszeile, mit einer Vorschau von allem, was verloren ginge.

Emoji in Dataview-Felder

Jedes Emoji samt Wert wird zu einem Feld in Klammern. Prioritäts-Emoji werden zu einem Feld priority mit einem Wort, und der Wiederholungstext wandert in seine Klammern. Führen Sie die Ersetzungen in dieser Reihenfolge aus: erst Daten und Priorität, zuletzt die Wiederholung, damit der Wiederholungstext dort endet, wo die nächste Klammer beginnt.

Vorher und nachher

Vorher
- [ ] Send invoice to Acme ⏫ 🔁 every month ➕ 2026-10-01 ⏳ 2026-11-01 📅 2026-11-03 #finance
- [x] Book flights 📅 2026-10-25 ✅ 2026-10-20
- [ ] Order parts 🆔 parts1
- [ ] Assemble 🛫 2026-11-10 ⛔ parts1 📅 2026-11-15
Nachher
- [ ] Send invoice to Acme  [priority:: high]  [repeat:: every month]  [created:: 2026-10-01]  [scheduled:: 2026-11-01]  [due:: 2026-11-03] #finance
- [x] Book flights  [due:: 2026-10-25]  [completion:: 2026-10-20]
- [ ] Order parts  [id:: parts1]
- [ ] Assemble  [start:: 2026-11-10]  [dependsOn:: parts1]  [due:: 2026-11-15]

Suchen und Ersetzen, Feld für Feld

Diese Muster funktionieren in jedem Editor mit Regex-Suche über mehrere Dateien, etwa VS Code, das den erfassten Text als $1 schreibt. Schalten Sie den Regex-Modus und die Beachtung der Groß- und Kleinschreibung ein. Anders als das Skript laufen sie über jede Zeile, nicht nur über Kontrollkästchen.

Feld Suchen Ersetzen durch
📅 (?:📅|📆|🗓️?)\s*(\d{4}-\d{2}-\d{2}) [due:: $1]
⏳ (?:⏳|⌛)\s*(\d{4}-\d{2}-\d{2}) [scheduled:: $1]
🛫 🛫\s*(\d{4}-\d{2}-\d{2}) [start:: $1]
➕ ➕\s*(\d{4}-\d{2}-\d{2}) [created:: $1]
✅ ✅\s*(\d{4}-\d{2}-\d{2}) [completion:: $1]
❌ ❌\s*(\d{4}-\d{2}-\d{2}) [cancelled:: $1]
🔺 🔺️? [priority:: highest]
⏫ ⏫️? [priority:: high]
🔼 🔼️? [priority:: medium]
🔽 🔽️? [priority:: low]
⏬ ⏬️? [priority:: lowest]
🏁 🏁\s*(keep|delete) [onCompletion:: $1]
🆔 🆔\s*([A-Za-z0-9_-]+) [id:: $1]
⛔ ⛔\s*([A-Za-z0-9_-]+(?:\s*,\s*[A-Za-z0-9_-]+)*) [dependsOn:: $1]
🔁 🔁\s*([A-Za-z0-9, !]*[A-Za-z0-9])(?=\s*(?:\[|\^|$)) [repeat:: $1]

Dasselbe als Skript

Speichern Sie dies als emoji_to_dataview.py und führen Sie python3 emoji_to_dataview.py Inbox.md Projects/*.md aus. Es berührt nur Kontrollkästchen-Zeilen, schreibt zwei Leerzeichen vor jedes Feld wie Obsidian Tasks und wandelt auch die alternativen Symbole für Fälligkeit und geplantes Datum um: 📆, 🗓 und ⌛.

#!/usr/bin/env python3
"""Rewrite Obsidian Tasks emoji fields to Dataview [key:: value] fields.

Usage: emoji_to_dataview.py NOTE.md [NOTE.md ...]   (rewrites in place; back up first)
Only checkbox lines are touched. Run it on a copy of your vault first.
"""
import os
import re
import sys

DATE = r"(\d{4}-\d{2}-\d{2})"
ID = r"[A-Za-z0-9_-]+"
RULES = [
    (rf"(?:📅|📆|🗓️?)\s*{DATE}", r"[due:: \1]"),
    (rf"(?:⏳|⌛)\s*{DATE}", r"[scheduled:: \1]"),
    (rf"🛫\s*{DATE}", r"[start:: \1]"),
    (rf"➕\s*{DATE}", r"[created:: \1]"),
    (rf"✅\s*{DATE}", r"[completion:: \1]"),
    (rf"❌\s*{DATE}", r"[cancelled:: \1]"),
    (r"🔺️?", "[priority:: highest]"),
    (r"⏫️?", "[priority:: high]"),
    (r"🔼️?", "[priority:: medium]"),
    (r"🔽️?", "[priority:: low]"),
    (r"⏬️?", "[priority:: lowest]"),
    (r"🏁\s*(keep|delete)", r"[onCompletion:: \1]"),
    (rf"🆔\s*({ID})", r"[id:: \1]"),
    (rf"⛔\s*({ID}(?:\s*,\s*{ID})*)", r"[dependsOn:: \1]"),
    # Last, so the rule text ends at the next bracket or the end of the line.
    (r"🔁\s*([A-Za-z0-9, !]*[A-Za-z0-9])(?=\s*(?:\[|\^|$))", r"[repeat:: \1]"),
]
TASK = re.compile(r"^(\s*(?:[-*+]|\d+\.)\s+\[.\]\s)(.*)$")

for path in sys.argv[1:]:
    out = []
    for raw in open(path, encoding="utf-8", newline="").read().split("\n"):
        cr = "\r" if raw.endswith("\r") else ""
        line = raw[: len(raw) - len(cr)]
        m = TASK.match(line)
        if m:
            head, body = m.groups()
            for pattern, repl in RULES:
                body = re.sub(pattern, repl, body)
            body = re.sub(r"\s*(\[(?:due|scheduled|start|created|completion|cancelled|priority|onCompletion|id|dependsOn|repeat):: )", r"  \1", body)
            line = head + body
        out.append(line + cr)
    tmp = path + ".tmp"
    with open(tmp, "w", encoding="utf-8", newline="") as fh:
        fh.write("\n".join(out))
    os.replace(tmp, path)

Dataview-Felder in Emoji

Die Umkehrung liest sowohl [key:: value] als auch (key:: value) und schreibt die Standard-Emoji. Felder, die sie nicht kennt, wie [project:: Website], bleiben unberührt in der Zeile, und eine als Zahl geschriebene Priorität bleibt unverändert, weil die Plugins sich uneins sind, was die Zahlen bedeuten.

Vorher
- [ ] Send invoice to Acme  [priority:: high]  [repeat:: every month]  [created:: 2026-10-01]  [scheduled:: 2026-11-01]  [due:: 2026-11-03] #finance
- [x] Book flights  [due:: 2026-10-25]  [completion:: 2026-10-20]
- [ ] Order parts  [id:: parts1]
- [ ] Assemble  [start:: 2026-11-10]  [dependsOn:: parts1]  [due:: 2026-11-15]
Nachher
- [ ] Send invoice to Acme ⏫ 🔁 every month ➕ 2026-10-01 ⏳ 2026-11-01 📅 2026-11-03 #finance
- [x] Book flights 📅 2026-10-25 ✅ 2026-10-20
- [ ] Order parts 🆔 parts1
- [ ] Assemble 🛫 2026-11-10 ⛔ parts1 📅 2026-11-15

Auf die Ausgabe des vorigen Skripts angewendet, liefert es die ursprünglichen Zeilen zurück. Echte Vaults sind weniger ordentlich: Zeilen mit 📆, 🗓 oder ⌛ kommen als 📅 oder ⏳ zurück, und eine Zeile mit leerer Beschreibung bekommt ein Leerzeichen dazu.

Speichern Sie dies als dataview_to_emoji.py und führen Sie es genauso aus.

#!/usr/bin/env python3
"""Rewrite Dataview [key:: value] task fields to Obsidian Tasks emoji fields.

Usage: dataview_to_emoji.py NOTE.md [NOTE.md ...]   (rewrites in place; back up first)
Reads [key:: v] and (key:: v). Only checkbox lines are touched.
"""
import os
import re
import sys

DATE = r"(\d{4}-\d{2}-\d{2})"
ID = r"[A-Za-z0-9_-]+"


def field(key, value):
    return rf"[\[(]\s*{key}::\s*{value}\s*[\])]"


RULES = [
    (field("due", DATE), r"📅 \1"),
    (field("scheduled", DATE), r"⏳ \1"),
    (field("start", DATE), r"🛫 \1"),
    (field("created", DATE), r"➕ \1"),
    (field("completion", DATE), r"✅ \1"),
    (field("cancelled", DATE), r"❌ \1"),
    (field("priority", "highest"), "🔺"),
    (field("priority", "high"), "⏫"),
    (field("priority", "medium"), "🔼"),
    (field("priority", "low"), "🔽"),
    (field("priority", "lowest"), "⏬"),
    (field("onCompletion", "(keep|delete)"), r"🏁 \1"),
    (field("id", f"({ID})"), r"🆔 \1"),
    (field("dependsOn", rf"({ID}(?:\s*,\s*{ID})*)"), r"⛔ \1"),
    (field("repeat", r"([A-Za-z0-9, !]*[A-Za-z0-9])"), r"🔁 \1"),
]
TASK = re.compile(r"^(\s*(?:[-*+]|\d+\.)\s+\[.\]\s)(.*)$")

for path in sys.argv[1:]:
    out = []
    for raw in open(path, encoding="utf-8", newline="").read().split("\n"):
        cr = "\r" if raw.endswith("\r") else ""
        line = raw[: len(raw) - len(cr)]
        m = TASK.match(line)
        if m:
            head, body = m.groups()
            for pattern, repl in RULES:
                body = re.sub(pattern, repl, body, flags=re.I if "priority" in pattern else 0)
            line = head + re.sub(r"[ \t]{2,}", " ", body).rstrip()
        out.append(line + cr)
    tmp = path + ".tmp"
    with open(tmp, "w", encoding="utf-8", newline="") as fh:
        fh.write("\n".join(out))
    os.replace(tmp, path)

Was die Umwandlung nicht abdeckt

  • Eine Zeile mit Text zwischen zwei Feldern. Obsidian Tasks liest vom Zeilenende her, diese Felder hat es also von vornherein nicht gelesen.
  • Ein Blocklink wie ^abc123 am Zeilenende. Die Skripte lassen ihn dort, wo Obsidian ihn erwartet.
  • Syntax, die es nur in Task Genius gibt: Uhrzeiten hinter Daten, Prioritäten wie [#A], Projekt- und Kontextfelder, iCalendar-Wiederholungsregeln. Lassen Sie diese Zeilen in Ruhe oder wandeln Sie sie von Hand um.
  • Wiederholungsregeln, die ein Format anders schreibt. Prüfen Sie nach dem Wechsel einige wiederkehrende Aufgaben, vor allem solche mit when done.
  • Wiederkehrende Aufgaben, die in der Datei schon erledigte Kopien haben. Die Kopien sind gewöhnliche erledigte Aufgaben und werden wie jede andere Zeile umgewandelt.
  • Zeilen in Codeblöcken. Die Skripte arbeiten zeilenweise und kennen keine Zäune. Wandeln Sie Notizen, die Beispiele zitieren, daher von Hand um.
  • Ein unbekanntes Feld am Zeilenende, etwa [custom:: x]. Obsidian Tasks liest vom Ende her, hält dort an und ignoriert die davor umgewandelten Felder.
  • Eine 🔁-Regel gefolgt von einem #Tag. Die Wiederholung bleibt unumgewandelt; setzen Sie den Tag davor oder wandeln Sie diese Zeile von Hand um.
  • Aufgaben in Zitatblöcken oder Callouts (Zeilen, die mit > - [ ] beginnen). Die Skripte überspringen sie.
  • Eine Uhrzeit nach einem Datum, etwa 14:30. Sie bleibt außerhalb des umgewandelten Felds. Obsidian Tasks hat kein Zeitfeld, daher liest sie nur Task Genius.

Aufgabenzeilen in Aufgabendateien

Eine Aufgabendatei ist eine Notiz mit den Feldern der Aufgabe im YAML-Frontmatter, dem Format, das TaskNotes verwendet. Nicht jedes Zeilenfeld hat darin einen Platz. So werden die Felder auf TaskNotes-Eigenschaften abgebildet.

Wohin jedes Feld kommt

In einer Aufgabenzeile In einer Aufgabendatei Hinweis
📅 2026-11-03
due: 2026-11-03
Gleicher Name.
⏳ 2026-11-01
scheduled: 2026-11-01
Gleicher Name.
🛫 2026-11-10
start: 2026-11-10
TaskNotes hat kein Startdatum. Behalten Sie es als benutzerdefinierte Eigenschaft, falls Sie es brauchen.
➕ 2026-10-01
dateCreated: 2026-10-01T08:00:00Z
Wird als ISO-Zeitstempel geschrieben.
✅ 2026-10-20
completedDate: 2026-10-20
Der Status wird zu einem Wert für erledigt, und das Datum kommt in completedDate.
⏫
priority: high
Verwendet die Werte aus Ihrer TaskNotes-Prioritätsliste. Die Standardliste hat drei Stufen, nicht fünf, legen Sie also fest, wie die fünf zugeordnet werden.
🔁 every month
recurrence: "DTSTART:20261103;FREQ=MONTHLY"
Wird zu einer iCalendar-Regel. every month bei einem Fälligkeitsdatum von 2026-11-03 wird zu DTSTART:20261103;FREQ=MONTHLY.
#finance
tags:
  - finance
Werden zu einer YAML-Liste, ohne Rautezeichen.
🏁 delete
onCompletion: delete
Keine TaskNotes-Eigenschaft. Bleibt als gewöhnlicher Frontmatter-Schlüssel erhalten, den TaskNotes ignoriert.
🆔 parts1
id: parts1
Keine TaskNotes-Eigenschaft. Abhängigkeiten in TaskNotes verweisen auf Dateipfade, nicht auf IDs.
⛔ parts1
blockedBy:
  - uid: "Tasks/Order parts.md"
    reltype: FINISHTOSTART
Wird zu einem blockedBy-Eintrag, der die Datei der anderen Aufgabe nennt.

Eine Zeile nach der anderen mit TaskNotes

TaskNotes hat den Befehl Convert to TaskNote und eine Umwandeln-Schaltfläche neben Kontrollkästchen, die Sie in den Funktionseinstellungen aktivieren können. Beide erzeugen aus der Zeile eine neue Aufgabendatei und ersetzen die Zeile durch einen Link darauf. Gut für ein paar Aufgaben, langsam für einen ganzen Vault.

Viele auf einmal mit der TaskForge-Befehlszeile

TaskForge ist eine eigenständige App, und ihr Befehlszeilenwerkzeug (zugleich die Engine hinter ihrem MCP-Server) wandelt Aufgaben zwischen Zeile und Datei um, in beide Richtungen, einzeln oder im Stapel. Es braucht einen für Aufgabendateien eingerichteten Vault, weil es wissen muss, woran es sie erkennt. Sehen Sie zuerst die Vorschau an. Ein Stapel-Commit muss die Anzahl der Aufgaben wiederholen, die die Vorschau gefunden hat, damit eine breite Abfrage nicht mehr umwandeln kann, als Sie wollten.

Vorschau, dann Umwandlung, jeder Aufgabe mit dem Tag #home
taskforge convert --query 'tag:home' --to tasknotes --folder Tasks --dry-run
taskforge convert --query 'tag:home' --to tasknotes --folder Tasks --acknowledge-count 2

Ein echter Durchlauf

In Inbox.md
- [ ] Send invoice to Acme ⏫ 🔁 every month 📅 2026-11-03 #finance
Tasks/Send invoice to Acme.md
---
title: Send invoice to Acme
status: open
priority: high
tags:
  - finance
  - task
recurrence: "DTSTART:20261103;FREQ=MONTHLY"
due: 2026-11-03
---

Die Priorität ⏫ wurde zu high, und every month wurde zu einer iCalendar-Regel, verankert am Fälligkeitsdatum. In einem zweiten Durchlauf blieben ein Startdatum, eine Aktion bei Abschluss und eine Aufgaben-ID als gewöhnliche Frontmatter-Schlüssel (start, onCompletion, id) erhalten, statt zu entfallen. Der Befehl lehnt jede Aufgabe ab, die er nicht vollständig umwandeln kann. Beim Zurückwandeln einer Datei in eine Zeile fügt er der Zeile das kennzeichnende Tag der Datei hinzu, task.

Für die Gegenrichtung nennen Sie eine Zielnotiz und sehen zuerst die Vorschau an:

taskforge convert --query 'tag:home' --to inline --folder Inbox.md --dry-run

Häufige Fragen

Wie wandle ich meine Obsidian-Tasks-Emoji ins Dataview-Format um?

Obsidian Tasks hat keinen Umwandlungsbefehl. Ändern Sie das Aufgabenformat in den Einstellungen erst, nachdem Sie die Zeilen umgeschrieben haben, mit Regex-Suchen-und-Ersetzen oder einem Skript wie dem auf dieser Seite. Sichern Sie zuerst und testen Sie an einer Kopie.

Wandelt die Änderung des Aufgabenformats in Obsidian Tasks meine vorhandenen Aufgaben um?

Nein. Die Einstellung ändert nur, wie das Plugin von da an liest und schreibt. Zeilen im alten Format werden nicht mehr als Felder gelesen, bis Sie sie umschreiben.

Wie mache ich aus vielen Kontrollkästchen-Aufgaben TaskNotes-Dateien?

TaskNotes wandelt jeweils eine Zeile um. Für einen Stapel wandelt die TaskForge-Befehlszeile jede Aufgabe um, die zu einer Abfrage passt, zuvor mit einem Probelauf. Prüfen Sie in beiden Fällen, ob Felder ohne TaskNotes-Eigenschaft, etwa Startdaten, dort gelandet sind, wo Sie sie haben wollen.

Muss ich überhaupt umwandeln, wenn ich Task Genius nutze?

Meist nicht. Task Genius liest Emoji- und Klammerfelder in derselben Zeile, gemischte Vaults funktionieren also, wie sie sind. Umwandeln hilft nur, wenn Sie auch Obsidian Tasks oder Dataview nutzen, die jeweils einen Stil lesen.

Können die Skripte meine Notizen beschädigen?

Sie ändern nur Kontrollkästchen-Zeilen und nur die Felder, die sie erkennen, schreiben die Dateien aber an Ort und Stelle um. Sichern Sie zuerst, führen Sie sie an einer Kopie aus und vergleichen Sie, bevor Sie ihnen den echten Vault anvertrauen.