Persona
Workspace Markdown local-first para macOS, servidor MCP. O persona mcp permite que Claude Code / Cursor leiam e escrevam notas e tarefas.
Documentação
Persona
Notas, tarefas e um chat de IA que conhece seus arquivos. Tudo vive em uma única pasta de Markdown simples na sua máquina.
$ persona
Isso inicia um servidor local e abre seu workspace no navegador. Sem contas,
sem nuvem, sem banco de dados. Se este projeto desaparecesse amanhã, você ainda
teria todas as notas e tarefas como arquivos .md que podem ser abertos
com qualquer ferramenta.
Por que outro aplicativo de notas?
Porque eu ficava escolhendo entre software bonito e ter controle dos meus dados:
| Persona | Obsidian | Notion | Logseq | |
|---|---|---|---|---|
| Formato dos dados | Markdown simples | Markdown + plugins | banco de dados proprietário na nuvem | org-mode/Markdown |
| Funciona totalmente offline | ✅ | ✅ | ❌ | ✅ |
| Tarefas integradas | ✅ | plugin | ✅ | básico |
| Chat de IA local | ✅ Ollama, zero configuração | via plugins de API na nuvem | nuvem deles | ❌ |
| Entrada por voz | ✅ STT local | ❌ | ❌ | ❌ |
| Código aberto | ✅ MIT | freemium, fechado | fechado | ✅ AGPL |
Usei o Obsidian diariamente por dois anos. Em algum lugar por volta do plugin trinta, percebi que estava mais ocupado mantendo minha configuração de notas do que escrevendo nela. Persona é minha tentativa da versão onde tudo que importa funciona de fábrica e o formato dos dados nunca te faz refém.
O que você ganha
- Notas em Markdown — arquivos no disco na estrutura de pastas que você preferir. Edite-os de qualquer aplicativo; Persona observa o sistema de arquivos e se mantém atualizado
- Tarefas — escreva
fix login bug #backend !! fridaye ele organiza prioridade, tag de projeto e data de vencimento no frontmatter. Visualização Kanban incluída - Chat de IA — conecta-se ao Ollama automaticamente se estiver em execução (gratuito e privado), ou use qualquer API compatível com OpenAI. Ele pode criar notas e gerenciar tarefas, não apenas responder perguntas
- Busca semântica — embeddings calculados localmente, armazenados dentro do workspace
- Entrada por voz — transcrição de fala local via parakeet.cpp no Apple Silicon
- Servidor MCP — Claude Code, Cursor e outros agentes podem ler/escrever seu workspace diretamente
Capturas de tela
Início rápido (macOS)
Você precisa de Node.js 20+ (brew install node) e git.
git clone https://github.com/jayamitkatariya/personacli.git
cd personacli
npm install --allow-scripts=persona
npm install -g . --allow-scripts=persona
persona
A primeira execução guia você na escolha de uma pasta de workspace e,
opcionalmente, na conexão de um modelo de IA. Depois disso, é só
persona.
Quer que a IA rode gratuita e privada?
brew install ollama && ollama pull llama3.2
persona # detects ollama automatically, no config
Mais comandos, atualização, configuração de voz, desinstalação
persona doctor # health check: node, workspace, server, AI config
persona path # print workspace path
Atualizando:
cd personacli && git pull
npm install --allow-scripts=persona
npm install -g . --allow-scripts=persona
Desinstalando:
npm uninstall -g persona
pkill -f "dist/server/index"
rm -rf ~/.persona
A solução de problemas está detalhada mais abaixo neste README.
A stack
TypeScript de ponta a ponta. Interface React servida por um servidor Hono, Vite para builds. Embeddings locais para busca, parakeet.cpp para voz, Ollama ou qualquer endpoint compatível com OpenAI para chat. Tecnologia simples de propósito.
Contribuindo
Issues e PRs são bem-vindos, especialmente relatos de bugs de uso real. Se algo parecer errado, provavelmente está; me avise.
Licença
Se Persona te poupar um pouco de sanidade, uma estrela ajuda outras pessoas a encontrá-lo.
Extras opcionais
| Extra | Instalação | O que você ganha |
|---|---|---|
| Ollama | brew install ollama && ollama pull llama3.2 | IA local gratuita e privada — detectada automaticamente, sem chave de API |
ffmpeg | brew install ffmpeg | Entrada por voz (grava e transcreve no chat) |
| modelo parakeet | lançamentos do parakeet.cpp | Modelo local de transcrição de fala para entrada por voz |
Para entrada por voz, aponte o Persona para seu binário e modelo parakeet:
export PERSONA_STT_BIN=/path/to/parakeet-cli
export PERSONA_STT_MODEL=/path/to/model.gguf
persona
Solução de problemas
| Sintoma | Correção |
|---|---|
persona: command not found | npm install -g . --allow-scripts=persona novamente e verifique se npm config get prefix está no seu PATH |
npm warn allow-scripts ou binário persona ausente após a instalação | npm ≥11.16 bloqueia scripts de pacote por padrão — instale com --allow-scripts=persona (ou execute npm config set allow-scripts=persona --location=user) e reinstale |
npm install -g . falha com EACCES | Seu prefixo npm não é gravável — instale o Node via nvm ou Homebrew (ou use sudo como último recurso) |
| O servidor não inicia / erros de porta | persona doctor, depois verifique ~/.persona/logs/server.log |
| O chat diz "nenhum modelo configurado" | Abra Configurações → IA (⌘,) e adicione um provedor, ou instale o Ollama |
Você executa persona e nada acontece | O servidor pode já estar em execução — pressione ⌘K no navegador, ou encerre com pkill -f "dist/server/index" e tente novamente |
| A entrada por voz falha | ffmpeg deve estar instalado e PERSONA_STT_MODEL deve apontar para um GGUF válido |
Primeira execução
Na primeira vez que você executar persona, um guia de configuração
rápido orienta você por três etapas no navegador:
- Workspace — onde o Persona armazena suas notas (
~/Personapor padrão).Notes/,Projects/e.persona/tasks/são criados para você. - IA — opcional. Um Ollama em execução é detectado e conectado com zero configuração; caso contrário, adicione qualquer chave de API compatível com OpenAI. Pule a qualquer momento e configure depois em Configurações → IA (⌘,).
- Concluído — uma nota
Notes/Welcome.mdé criada como um tour guiado do workspace: as três visualizações, atalhos de teclado e comandos de terminal. Abra-a novamente a qualquer momento pela paleta de comandos (⌘K → "Abrir nota de boas-vindas").
Nada é sobrescrito: se a pasta do workspace já tiver arquivos, eles aparecem na barra lateral intactos, e a nota de boas-vindas é criada apenas uma vez.
Comandos
| Comando | O que faz |
|---|---|
persona | Inicia o servidor se necessário, abre o workspace no navegador |
persona open | Inicia o servidor se necessário, abre o workspace no navegador |
persona note "text" | Adiciona uma linha à nota do diário de hoje (Notes/YYYY-MM-DD.md) |
persona task "Buy domain tomorrow #personal !!" | Cria uma tarefa (linguagem natural) sem abrir o navegador |
persona triage | Pede à IA para revisar suas tarefas abertas (apenas sugestões) |
persona ask "what's left on the PRD?" | Converse com a IA pelo terminal, resposta transmitida inline. Anexe arquivos/pastas/tarefas com @file.md, @folder, @tasks |
persona today [--open] | Cria/abre a nota do diário de hoje; --open abre o navegador |
persona search "query" | Busca arquivos e tarefas pelo terminal (difusa + semântica) |
persona path | Imprime o caminho atual do workspace |
persona doctor | Verificação de saúde: node, workspace, servidor, configuração de IA |
persona mcp | Executa o Persona como servidor MCP (stdio) para Claude Code, Hermes, Cursor, etc. Veja docs/mcp.md |
O que fica onde
~/Persona/ ← your workspace (choose it on first run)
├── Notes/ ← plain Markdown, organised however you like
├── Projects/
│ └── my-project/
│ └── PRD.md
├── Imported/ ← notes brought in from other apps
│ ├── obsidian/
│ ├── bear/
│ ├── roam/
│ ├── notion/
│ └── plain/
└── .persona/
├── tasks/ ← tasks are Markdown files with frontmatter
├── agents/ ← background agent runs (JSON)
├── pins.json ← your pinboard (pinned notes & tasks)
└── embeddings/ ← local semantic-search index (notes, not secrets)
Tarefas são apenas arquivos:
---
type: task
status: todo
priority: high
due: 2026-08-12
project: Personal
---
Finish Persona PRD
Edite-os em qualquer editor, ou no Finder — Persona observa o sistema de arquivos e sincroniza automaticamente.
Workspaces
- Escrever — árvore de arquivos + editor Markdown (CodeMirror). Salvamento automático, status de salvamento, pré-visualização ao vivo (Editar / Dividir / Pré-visualizar), renomear, mover, duplicar, excluir, arrastar e soltar. Abra várias notas ao mesmo tempo em abas (⌘W para fechar, ⌘⇧[ / ⌘⇧] para alternar); cada aba mantém sua própria posição de rolagem e histórico de desfazer. Tags geradas por IA: pressione ⌘S (ou o botão ✨) e o Persona sugere tags para sua nota, adicionadas automaticamente como frontmatter YAML.
- Tarefas — lista de tarefas pessoal rápida. Digite
Buy domain tomorrow #personal !na caixa de adição rápida; datas, projetos e prioridade são interpretados para você. Tarefas recorrentes também funcionam:Water plants every weekse reabre com a próxima data de vencimento quando você a conclui. Clique em Triagem (ou executepersona triage) e a IA revisa suas tarefas abertas — sinalizando prioridades erradas, datas de vencimento ausentes, projetos sem tag, tarefas obsoletas e duplicatas — e aplica cada sugestão com um clique. Ela nunca muda uma tarefa sem sua aprovação. - Quadro de avisos — fixe notas ou tarefas importantes (menu ⋯ na árvore de
arquivos ou na linha da tarefa) e elas permanecem fixadas no topo da barra
lateral em todas as abas. Clique em um alfinete para ir direto até ele; passe
o mouse para desafixar. Os alfinetes ficam em
.persona/pins.jsone sobrevivem a reinicializações. - Chat — uma IA que pode ver seu workspace e agir sobre ele. Anexe contexto
com
@file.md,@folderou@taskse pergunte sobre seu trabalho real. A IA também pode criar, editar, mover e excluir notas e pastas, e criar, concluir, atualizar e excluir tarefas em seu nome — você verá um pequeno indicador de status para cada ação que ela executa. - Agentes — execuções de IA em segundo plano para trabalho com várias
etapas. Dê ao Persona uma tarefa como "organize minhas notas da caixa de
entrada" e ele trabalha nela com ferramentas, ao vivo, sem manter um chat
aberto. As execuções são persistidas em
.persona/agents/e podem ser canceladas, repetidas ou excluídas. - Busca semântica — suas notas são incorporadas localmente e buscadas por
significado, então "aquela coisa que escrevi sobre acampar" encontra a nota
que menciona a floresta, a barraca e a chuva — mesmo que nunca diga "acampar".
Ela alimenta a paleta de comandos (⌘P),
persona searche o chat: quando você não anexa contexto, o assistente puxa automaticamente as notas mais relevantes para sua pergunta e as cita. - Módulos — Foco, Diário, Coisas de Hoje e Agentes podem ser ativados/ desativados em Configurações → Módulos; módulos habilitados aparecem na barra lateral, os desabilitados permanecem acessíveis via ⌘K.
- Importar — traga exportações do Obsidian, Bear, Roam, Notion ou pastas
simples de Configurações → Importar. Tudo vai para
Imported/<source>/e nunca sobrescreve notas existentes.
Teclado
| Atalho | Ação |
|---|---|
⌘K | Paleta de comandos |
⌘P | Busca rápida de arquivos/tarefas |
⌘1 ⌘2 ⌘3 | Escrever / Tarefas / Chat |
⌘N | Novo arquivo |
⌘⇧N | Nova tarefa |
⌘T | Nova nota de rascunho |
⌘W | Fechar aba |
⌘⇧[ ⌘⇧] | Aba anterior / próxima |
⌘S | Salvar |
⌘, | Configurações |
⌘⇧B | Alternar barra lateral |
Esc | Fechar paleta / modal |
IA
Qualquer provedor compatível com OpenAI funciona — OpenAI, OpenRouter, Ollama, modelos locais, endpoints personalizados. Configure provedor, URL base, modelo e chave de API em Configurações → IA. A chave é armazenada no Chaveiro do macOS (com fallback para um arquivo de configuração com permissão 0600) e só é enviada ao provedor que você escolheu.
Zero configuração com Ollama. Se uma instância local do Ollama estiver em
execução (http://127.0.0.1:11434, ou onde $OLLAMA_HOST apontar), o Persona
a detecta automaticamente e conecta sem chave de API e sem configuração. Ele
escolhe um modelo de chat sensato entre os que você tem instalados. Um provedor
configurado explicitamente sempre tem precedência sobre a detecção automática,
e persona doctor informa o que foi detectado.
O assistente de chat tem capacidade de escrita: ele pode criar e editar notas, criar pastas, mover e renomear arquivos, e gerenciar suas tarefas — criar, atualizar, concluir e excluir. Ele exclui arquivos ou pastas apenas quando você pede explicitamente. Provedores sem suporte a ferramentas caem automaticamente para chat somente leitura.
Busca semântica. As notas são divididas em blocos e incorporadas localmente,
armazenadas em .persona/embeddings/. Os embeddings vêm, em ordem de prioridade:
- Uma URL base de embedding explícita (opcional, Configurações → IA) — aponte para qualquer provedor com capacidade de embeddings (OpenRouter, SiliconFlow, um Ollama local…).
- Um Ollama local em execução com um modelo de embedding — ex.
ollama pull all-minilmounomic-embed-text— sem chave de API necessária. - Caso contrário, o endpoint do seu provedor de chat.
O índice é reconstruído em segundo plano quando o servidor inicia, quando sua
chave de API ou modelo de embedding muda, e incrementalmente sempre que uma nota
é salva. A busca por palavras-chave ainda vence para correspondências exatas;
resultados semânticos aparecem como "Melhores correspondências" quando agregam
valor. Se nenhuma fonte de embedding estiver disponível, a busca cai
silenciosamente para apenas palavras-chave.
Entrada de voz (macOS). A caixa de chat tem um botão de microfone para
transcrição de fala local via parakeet.cpp.
Requer ffmpeg (brew install ffmpeg) e um modelo GGUF compatível com parakeet.
Pegue um parakeet-cli pré-compilado para macOS na
página de releases e aponte
o Persona para ambos com PERSONA_STT_MODEL=/path/to/model.gguf e
PERSONA_STT_BIN=/path/to/parakeet-cli (em Apple Silicon o modelo roda em
Metal).
Aparência
Tema claro, escuro ou do sistema em Configurações → Aparência. O tema é salvo na sua configuração e segue a aparência do macOS quando definido como Sistema.
Desenvolvimento
npm run dev # Vite dev server (5173) + API server (4321), hot reload
npm run build # production build: server + CLI + web app
npm run typecheck
Scripts de teste ad-hoc (é preciso compilar antes):
npm run build
node scripts/tool-test.mjs # unit-level tests for AI tools, tasks, fs
node scripts/mcp-test.mjs # E2E: MCP server via stdio (Persona tools over MCP)
node scripts/e2e-chat-test.mjs # E2E: AI chat performs file & task operations
node scripts/e2e-chat2-test.mjs # E2E: chat reads notes and cites sources
Os scripts E2E esperam que um servidor esteja rodando contra um workspace descartável
(por exemplo, HOME=$PWD/.testhome npm run dev:server em outro terminal, para que a
configuração do servidor vá para .testhome/.persona/).
MCP — use o Persona a partir do Claude Code, Hermes, Cursor, etc.
O Persona é um servidor MCP. Qualquer cliente MCP pode ler/gravar seu workspace:
persona mcp --help
claude mcp add persona -- persona mcp # Claude Code
# Hermes/Cursor/Windsurf: { "mcpServers": { "persona": { "command": "persona", "args": ["mcp"] } } }
Ferramentas: 15 (list_folder, read_note, create_note, write_note, append_note, create_folder, move_file, rename_file, delete_file, list_tasks, create_task, update_task, delete_task, search, get_workspace_info) + recursos (persona://workspace, persona://file/{path}) + HTTP Streamable em http://127.0.0.1:4321/mcp.
Configuração completa → docs/mcp.md.
Contribuindo
Abra uma issue ou PR — relatos de bugs, ideias de recursos e perguntas são todos bem-vindos. Diretrizes:
- Mantenha a promessa local-first: tudo são arquivos simples, sem contas, sem nuvem, sem lock-in.
- O servidor nunca deve enviar seus arquivos para ninguém além do provedor de IA que você configurou explicitamente; o índice de embeddings é local.
- Execute
npm run typecheckenpm run buildantes de abrir um PR, e adicione um testescripts/quando mexer no comportamento do servidor. - O pacote é licenciado sob MIT; ao contribuir, você concorda com os mesmos termos.
Arquitetura
persona CLI ── spawns ──▶ local Hono server (127.0.0.1:4321 — first free port)
│ REST API + SSE events
├─ filesystem (chokidar watcher)
├─ tasks (Markdown + frontmatter)
├─ AI (OpenAI-compatible, streaming)
└─ embeddings (semantic index, local JSON)
│
▼
React app (prebuilt, served by the server)