📄 Markdown: a base universal
Comece aqui. 80% dos usuarios nao precisam de mais.
✅ Por que markdown ganha
Vantagens reais:
- •Zero dependencia — so precisa de editor e grep.
- •Humano legivel — voce le direto no terminal.
- •Git nativo — versionamento e backup automatico.
- •Portavel — funciona em qualquer OS, qualquer editor.
- •Custo zero — nem API, nem DB, nem config.
💡 Nao subestime
Muito engenheiro quer ir direto pra vetor. Markdown resolve 80% dos casos com 0% da complexidade.
🌐 Obsidian: duas portas
Mesmo markdown, dois acessos: humano no app, IA via CLI.
📐 Arquitetura two-doors
┌───────────────┐
│ vault files │ (markdown .md)
│ no disco │
└───────┬───────┘
│
┌────────┴────────┐
│ │
▼ ▼
┌──────────────┐ ┌──────────────┐
│ Obsidian │ │ Claude Code │
│ UI, mobile, │ │ via bash │
│ backlinks, │ │ (grep, cat, │
│ grafo │ │ Obsidian │
│ │ │ CLI) │
└──────────────┘ └──────────────┘
Voce edita no Obsidian. Claude le os .md.📊 Quando vale Obsidian
- Ja tem vault pessoal: sinergia enorme
- Trabalha mobile: Obsidian Sync ($4/mes)
- Gosta de grafo visual: ver conexoes
- Publica conhecimento: Obsidian Publish
- Nao vale se: voce nao gosta do app e so usaria por Claude
🗃️ SQLite + FTS5
Quando grep fica lento, SQLite e o passo natural. DB embedded, zero config.
📐 Schema minimo
CREATE TABLE memories ( id INTEGER PRIMARY KEY, title TEXT NOT NULL, body TEXT NOT NULL, type TEXT NOT NULL, -- fact/decision/pattern/... created_at TEXT NOT NULL, access_count INTEGER DEFAULT 0 ); -- FTS5 virtual table para busca full-text CREATE VIRTUAL TABLE memories_fts USING fts5( title, body, content=memories ); -- Trigger para manter FTS em sync CREATE TRIGGER memories_ai AFTER INSERT ON memories BEGIN INSERT INTO memories_fts(rowid, title, body) VALUES (new.id, new.title, new.body); END; -- Busca: <50ms em 10k entries SELECT id, title FROM memories_fts WHERE memories_fts MATCH 'webhook OR idempotency' ORDER BY rank LIMIT 5;
📊 Quando migrar do markdown
- Grep > 500ms: hora de SQLite
- Memorias > 500: FTS5 vale a pena
- Precisa de filtro por tipo: SQL vence grep combinado
- Acces_count tracking: salience scoring precisa
🧠 sqlite-vec + fastembed
Semantica local. Sem API externa, sem custo recorrente, sem latencia de rede.
📐 Setup local
# Instalar dependencias (Python)
pip install sqlite-vec fastembed
# Criar index vetorial
import sqlite3
import sqlite_vec
from fastembed import TextEmbedding
db = sqlite3.connect('memory.db')
db.enable_load_extension(True)
sqlite_vec.load(db)
db.execute('''
CREATE VIRTUAL TABLE vec_memories USING vec0(
embedding float[384]
)
''')
# Adicionar memoria
model = TextEmbedding() # modelo leve, offline
emb = list(model.embed(['texto da memoria']))[0]
db.execute('INSERT INTO vec_memories VALUES (?, ?)',
(id, emb.tolist()))
# Buscar 3 mais proximos
query_emb = list(model.embed(['pergunta']))[0]
results = db.execute('''
SELECT rowid, distance FROM vec_memories
WHERE embedding MATCH ?
ORDER BY distance LIMIT 3
''', (query_emb.tolist(),)).fetchall()📊 Privacidade + performance
- Tudo local: privacidade total
- Offline: funciona sem rede
- Custo: zero recorrente
- Latencia: ~30ms embed + 10ms search
☁️ Supabase, Turso, Pinecone
Cloud vale em casos especificos. Na duvida, nao e o seu.
✓ Cloud vale a pena
- ✓Time de 3+ pessoas compartilhando memoria
- ✓Voce troca entre desktop e mobile frequentemente
- ✓Ja paga Supabase/Postgres para outra coisa
- ✓Precisa auth e permissoes granulares
✗ Cloud e overkill
- ✗Voce e solo com 1 maquina
- ✗Privacidade e critica (medicina, direito)
- ✗Budget zero
- ✗Ainda em fase de experimentar
📊 Matriz de decisao
Tabela unica. Cole na sua documentacao.
📐 Matriz completa
| Backend | Setup | Custo | Privacidade | Multi-dev | Semantica | |---------------|-------|-------|-------------|-----------|-----------| | Markdown | 0min | $0 | total | git | nao | | Obsidian | 10min | $0-4 | total | Sync | parcial | | SQLite | 30min | $0 | total | nao | nao | | sqlite-vec | 1h | $0 | total | nao | sim | | Supabase | 2h | $0-25 | cloud | sim | pgvector | | Turso | 1h | $0-20 | cloud | sim | nao | | Pinecone | 2h | $50+ | cloud | sim | sim | Regra: comece na linha 1-2. Sobe so quando medir limitacao real.
💡 Migration path
Markdown → SQLite (script: scan .md, insert). SQLite → sqlite-vec (add virtual table). Sempre reversivel.
📝 Resumo do Modulo
Proximo:
5.4 — Multi-sinal: o painel de juizes