Converter tarefas do Obsidian entre formatos
O Obsidian Tasks não tem comando que reescreva um cofre de um formato para outro. A documentação dele diz isso. As conversões abaixo são scripts e receitas que fazem o trabalho, cada uma testada nas linhas de exemplo da documentação do próprio plugin, mais a única conversão para a qual existe uma ferramenta: de linha de tarefa para arquivo de tarefa e de volta.
Escrito com Obsidian Tasks 8.6, Task Genius 9.13 e TaskNotes 4.14, outubro de 2026. Os nomes dos campos e os símbolos estão no guia rápido.
Antes de mudar qualquer coisa
- Faça backup do cofre. Copie a pasta ou faça commit no git. Um script que reescreve 4.000 linhas precisa ser fácil de desfazer.
- Trabalhe primeiro numa cópia. Rode a conversão numa cópia do cofre, abra no Obsidian e execute uma das suas consultas de tarefas de sempre. Compare as contagens com o original.
- Converta e depois troque o plugin. O Obsidian Tasks lê um formato por vez. Converta as linhas primeiro e depois mude o formato de tarefa nos ajustes dele, para que o plugin nunca veja um cofre meio convertido.
- Confira o que sobrou. Busque no cofre os símbolos antigos (📅, ⏳, ⏫ para emoji; due::, repeat:: para Dataview) para achar as linhas que a receita pulou.
Qual conversão você precisa
| De | Para | Como |
|---|---|---|
| Linhas com emoji | Campos do Dataview | O script ou a receita de localizar e substituir abaixo. |
| Campos do Dataview | Linhas com emoji | O script ou a receita inversos abaixo. |
| Qualquer um | Task Genius | Nada a reescrever. O Task Genius lê os dois na mesma linha. Escolha qual ele escreve nos ajustes. |
| Linhas de tarefa | Arquivos de tarefa | O TaskNotes converte uma linha por vez. A linha de comando do TaskForge converte várias de uma vez. |
| Arquivos de tarefa | Linhas de tarefa | A linha de comando do TaskForge, com uma prévia de tudo que seria perdido. |
De emoji para campos do Dataview
Cada emoji e seu valor viram um campo entre colchetes. Os emoji de prioridade viram um campo priority com uma palavra, e o texto de recorrência vai para dentro dos colchetes. Faça as substituições nesta ordem: datas e prioridade primeiro, recorrência por último, para que o texto da recorrência termine onde o próximo colchete começa.
Antes e depois
- [ ] 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 - [ ] 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] Localizar e substituir, um campo por vez
Esses padrões funcionam em qualquer editor com busca regex em vários arquivos, como o VS Code, que escreve o texto capturado como $1. Ative o modo regex e diferencie maiúsculas de minúsculas. Ao contrário do script, eles rodam em todas as linhas, não só nas de checkbox.
| Campo | Localizar | Substituir por |
|---|---|---|
| 📅 | (?:📅|📆|🗓️?)\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] |
A mesma coisa como script
Salve como emoji_to_dataview.py e rode python3 emoji_to_dataview.py Inbox.md Projects/*.md. Ele mexe só em linhas de checkbox, escreve dois espaços antes de cada campo como o Obsidian Tasks faz e também converte os símbolos alternativos de vencimento e agendada 📆, 🗓 e ⌛.
#!/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)
De campos do Dataview para emoji
A conversão inversa lê [key:: value] e (key:: value) e escreve os emoji padrão. Campos que ela não conhece, como [project:: Website], ficam na linha sem alteração, e uma prioridade escrita como número é deixada como está porque os plugins divergem sobre o que os números significam.
- [ ] 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] - [ ] 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 Executado sobre a saída do script anterior, devolve exatamente as linhas de exemplo acima. Cofres reais são menos arrumados: linhas que usavam 📆, 🗓 ou ⌛ voltam como 📅 ou ⏳, e uma linha com a descrição vazia ganha um espaço.
Salve como dataview_to_emoji.py e rode do mesmo jeito.
#!/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)
O que a conversão não cobre
- Uma linha com texto entre dois campos. O Obsidian Tasks lê a partir do fim da linha, então ele nem teria lido esses campos.
- Um link de bloco como ^abc123 no fim da linha. Os scripts o deixam onde está, que é onde o Obsidian o espera.
- Sintaxe exclusiva do Task Genius: horas depois das datas, prioridades [#A], campos de projeto e contexto, regras de recorrência do iCalendar. Deixe essas linhas em paz ou converta à mão.
- Regras de recorrência que um formato escreve de outro jeito. Confira algumas tarefas recorrentes depois da troca, principalmente as com when done.
- Tarefas recorrentes que já têm cópias concluídas no arquivo. As cópias são tarefas concluídas comuns e convertem como qualquer outra linha.
- Linhas dentro de blocos de código. Os scripts trabalham linha a linha e não conhecem as cercas, então converta à mão as notas que citam exemplos.
- Um campo não reconhecido no fim da linha, como [custom:: x]. O Obsidian Tasks lê a partir do fim, então para ali e ignora os campos convertidos que vêm antes.
- Uma regra 🔁 seguida de uma #tag. A recorrência fica sem converter, então mova a tag para antes dela ou converta essa linha à mão.
- Tarefas dentro de citações ou callouts (linhas que começam com > - [ ]). Os scripts as ignoram.
- Uma hora depois de uma data, como 14:30. Ela fica fora do campo convertido. O Obsidian Tasks não tem campo de hora, então só o Task Genius a lê.
De linhas de tarefa para arquivos de tarefa
Um arquivo de tarefa é uma nota com os campos da tarefa no frontmatter YAML, o formato que o TaskNotes usa. Nem todo campo de uma linha tem lugar nele. É assim que os campos se mapeiam para as propriedades do TaskNotes.
Para onde vai cada campo
| Numa linha de tarefa | Num arquivo de tarefa | Observação |
|---|---|---|
📅 2026-11-03 | | Mesmo nome. |
⏳ 2026-11-01 | | Mesmo nome. |
🛫 2026-11-10 | | O TaskNotes não tem data de início. Guarde como propriedade personalizada se precisar. |
➕ 2026-10-01 | | Escrita como timestamp ISO. |
✅ 2026-10-20 | | O status vira um valor de concluída, e a data vai em completedDate. |
⏫ | | Usa os valores da sua lista de prioridades do TaskNotes. A lista padrão tem três níveis, não cinco, então decida como os cinco se mapeiam. |
🔁 every month | | Vira uma regra do iCalendar. every month com data de vencimento 2026-11-03 vira DTSTART:20261103;FREQ=MONTHLY. |
#finance | | Viram uma lista YAML, sem o jogo da velha. |
🏁 delete | | Não há propriedade no TaskNotes. Fica como uma chave comum de frontmatter que o TaskNotes ignora. |
🆔 parts1 | | Não há propriedade no TaskNotes. As dependências no TaskNotes apontam para caminhos de arquivo, não para IDs. |
⛔ parts1 | | Vira uma entrada blockedBy que nomeia o arquivo da outra tarefa. |
Uma linha por vez com o TaskNotes
O TaskNotes tem um comando Convert to TaskNote e um botão de converter ao lado dos checkboxes, que você pode ativar nos ajustes de recursos dele. Qualquer um dos dois cria um arquivo de tarefa novo a partir da linha e a substitui por um link para ele. Serve para poucas tarefas e é lento para um cofre inteiro.
Várias de uma vez com a linha de comando do TaskForge
O TaskForge é um app independente, e a ferramenta de linha de comando dele (que também é o motor do servidor MCP) converte tarefas entre linha e arquivo, nos dois sentidos, uma a uma ou em lote. Ela precisa de um cofre configurado para arquivos de tarefa, porque precisa saber como reconhecê-los. Faça a prévia primeiro. Um commit em lote precisa repetir o número de tarefas que a prévia encontrou, então uma consulta ampla demais não converte mais do que você pretendia.
taskforge convert --query 'tag:home' --to tasknotes --folder Tasks --dry-run
taskforge convert --query 'tag:home' --to tasknotes --folder Tasks --acknowledge-count 2 Uma execução real
- [ ] Send invoice to Acme ⏫ 🔁 every month 📅 2026-11-03 #finance ---
title: Send invoice to Acme
status: open
priority: high
tags:
- finance
- task
recurrence: "DTSTART:20261103;FREQ=MONTHLY"
due: 2026-11-03
--- A prioridade ⏫ virou high e every month virou uma regra do iCalendar ancorada na data de vencimento. Em uma segunda execução, uma data de início, uma ação ao concluir e um ID de tarefa foram mantidos como chaves comuns de frontmatter (start, onCompletion, id) em vez de descartados. O comando recusa qualquer tarefa que não consiga converter por inteiro. Converter um arquivo de volta para linha acrescenta à linha a tag que identifica o arquivo, task.
Para ir no sentido contrário, indique uma nota de destino e faça a prévia primeiro:
taskforge convert --query 'tag:home' --to inline --folder Inbox.md --dry-run Relacionados
Perguntas frequentes
Como converto os emoji do Obsidian Tasks para o formato Dataview?
O Obsidian Tasks não tem comando de conversão. Mude o formato de tarefa nos ajustes dele só depois de reescrever as linhas, com localizar e substituir em regex ou um script como o desta página. Faça backup antes e teste numa cópia.
Mudar o formato de tarefa no Obsidian Tasks converte as minhas tarefas existentes?
Não. O ajuste muda como o plugin lê e escreve dali em diante. As linhas no formato antigo deixam de ser lidas como campos até você reescrevê-las.
Como transformo muitas tarefas de checkbox em arquivos do TaskNotes?
O TaskNotes converte uma linha por vez. Para um lote, a linha de comando do TaskForge converte todas as tarefas que batem com uma consulta, com um teste a seco antes. De qualquer forma, confira se os campos sem propriedade no TaskNotes, como datas de início, foram parar onde você quer.
Preciso converter alguma coisa se uso o Task Genius?
Normalmente não. O Task Genius lê campos em emoji e em colchetes na mesma linha, então cofres mistos funcionam do jeito que estão. Converter só ajuda se você também usa o Obsidian Tasks ou o Dataview, que leem um estilo cada um.
Os scripts podem danificar minhas notas?
Eles alteram apenas linhas de checkbox e apenas os campos que reconhecem, mas reescrevem os arquivos no lugar. Faça backup, rode numa cópia e compare antes de confiar neles com o cofre de verdade.