Memorito — base de conhecimento pessoal com busca automatizada
Passei muito tempo procurando na internet e percebi que meu conhecimento pessoal estava espalhado por todo lugar: anotações, PDFs, bookmarks, recados, links, imagens, gravações de áudio — tudo em lugares diferentes, impossível de encontrar quando precisava. O Notion era bom, mas não queria colocar o conteúdo do meu cérebro em outro serviço SaaS.
Então pensei: “Por que não construo a minha própria?”
E construí.
O que é Memorito?#
Memorito é uma base de conhecimento multimodal self-hosted que eu criei para mim mesmo — não um produto pronto que uso, mas algo que codifiquei para minhas próprias necessidades e continuo desenvolvendo. Ele pode processar, indexar e buscar texto, URLs, imagens, arquivos de áudio e PDFs. Não é apenas busca por palavra-chave — é busca semântica, ou seja, encontra conteúdo relevante baseado no significado.
O resumo: jogue qualquer coisa lá, e depois pode pesquisar por ela em linguagem natural, como pedir a um assistente pessoal.
O código é open source e está disponível no GitHub: https://github.com/Yappito/memorito. Se estiver interessado, dê uma olhada, e se tiver ideias ou um pull request, eu aceito de bom grado.
Por que construí?#
Honestamente? Porque era irritante procurar em todo lugar. Tenho um NAS QNAP, tenho um cluster Proxmox homelab, e pensei: “Por que não rodaria minha própria base de conhecimento?” Queria meu próprio software, não um produto SaaS.
As principais motivações:
- Meus dados, meu servidor — não dou o conteúdo do meu cérebro para uma empresa SaaS
- Multimodal — não apenas texto, mas imagens, áudio, PDF também
- Busca semântica — não match de palavra-chave, mas busca baseada em significado real
- Automatizável — endpoints de API, então agentes podem usar
- Self-hosted — controle total, na minha própria infraestrutura
- Meu próprio código — se algo não funciona, eu conserto sozinho, não preciso escrever um ticket de suporte
Vibe-coding, ou o Pecado#
Sim, eu vibe-codifiquei. Pelo GLM-5.1, via OpenCode, a v1 ficou pronta em uma tarde. Claro que refinei muito depois, mas a ideia básica e a maior parte do código vieram do vibe-coding. Não sou desenvolvedor de jeito nenhum, sou engenheiro de infraestrutura, ultimamente arquiteto. Mas com grandes modelos de linguagem hoje, você realmente consegue colocar junto um app funcional se tiver um bom prompt e uma ideia clara.
A chave é saber o que você quer. Se você consegue descrever precisamente o que quer, e tem um parceiro de IA que pode traduzir em código — então não precisa esperar semanas por um feature. Algumas horas e está pronto.
Como funciona?#
Ingestion — alimentando conteúdo#
Existem cinco endpoints para processamento, todos assíncronos:
- Text — entrada direta de texto com título e tags
- URL — busca e indexação de páginas web
- Image — upload de imagem para busca visual
- Audio — upload de arquivo de áudio, transcrito automaticamente (com modelo z.ai GLM-ASR-2512)
- PDF — upload de documento para busca em texto completo
Toda ingestion é assíncrona: POST um job, depois faça poll no endpoint /api/ingest/<id>/status até retornar COMPLETED. Não precisa esperar terminar — só envie e pesquise depois.
Retrieval — busca e consulta#
Duas formas principais de pesquisar:
/api/search?q=...— busca semântica híbrida, filtrável por tipo de fonte, tags, intervalo de datas, toggle de reranker, paginação/api/items/<id>— consultando um item específico, retornando metadata, chunks, links duplicados, e uma URL de download S3 presigned para arquivos de mídia
Modificando dados existentes#
Endpoints PATCH permitem atualizar títulos e tags sem reenviar o conteúdo. Útil se você estragou o título ou quer adicionar tags depois.
O background técnico#
O stack não é exatamente comum:
- Next.js 15 App Router + TypeScript strict mode
- tRPC v11 (UI interna) + REST ingestion API (chamadores externos)
- Prisma + PostgreSQL 17 + pgvector (busca híbrida)
- Redis + BullMQ (fila de jobs assíncronos)
- Jina embeddings v4 (1024-dimensionais) + Jina reranker v3
- Camada LLM provider-agnostic — pode lidar com quatro modelos diferentes:
zai— API do Plano de Codificação z.ai (GLM-5.1,/layout_parsing, ASR)local— servidor OpenAI-compatible local (ex. llama.cpp)custom— qualquer endpoint OpenAI-compatibleollama-cloud— Ollama Cloud (https://ollama.com/v1)
O processamento de áudio usa um modelo z.ai GLM-ASR-2512 separado, independente do provedor LLM.
Armazenamento#
Os arquivos vão para um backend S3-compatible — eu rodo Garage em um NAS QNAP. URLs de download são URLs presigned, válidos por cerca de 1 hora. Isso significa que Memorito não armazena arquivos diretamente — ele envia para o backend S3 e serve de lá.
Como os agentes OpenClaw e Hermes se conectam?#
Aqui é onde fica realmente interessante. Tenho dois agentes de IA (OpenClaw e Hermes) que usam a API do Memorito. Eu não escrevi o código — a IA gerou, mas eu projetei a arquitetura, e sei exatamente como cada endpoint funciona e como tirar o máximo proveito.
OpenClaw#
OpenClaw usa uma skill (openclaw-skill/SKILL.md) que envia requisições HTTP baseadas em curl para a API do Memorito. Comportamentos-chave:
- Ingestion com tag
sourceName: "openclaw"— então sei qual conteúdo veio do agente - Polling até
COMPLETED— nunca pule para busca antes da ingestion estar pronta - Busca no endpoint
/api/search - Recuperação de contexto completo no endpoint
/api/items/<id>para resultados relevantes - Tradução para inglês — resultados não-em-inglês são sempre traduzidos para inglês
- Download e entrega de arquivos — se houver arquivo de mídia no resultado, baixa da
downloadUrle envia ao usuário
Importante: a downloadUrl é uma URL S3 presigned, não um endpoint Memorito. Baixe diretamente com curl: curl -o file.jpg "$DOWNLOAD_URL".
Hermes#
O agente Hermes funciona de forma semelhante, mas com algumas diferenças:
- Fallback netcat — curl falha no ambiente VM, então usa netcat para HTTP raw
- Entrega de arquivos em canais de mensagem — para Telegram/WhatsApp, a tag
MEDIA:não é suficiente, o arquivo deve ser baixado para~/.openclaw/workspace/, depois enviado comopenclaw message send --channel <channel> --target <target> --media <local-path> - Modelo de raciocínio GLM-5.1 —
generateTitleprecisa de mínimo 2048 tokens, caso contrário a resposta pode estar vazia (tokens de reasoning comem o budget)
Para que eu uso?#
Basicamente posso jogar qualquer coisa e pesquisar depois:
- Artigos técnicos, documentação — ingestion URL, pesquise depois se lembrar do tópico
- Documentos PDF — materiais de pesquisa, manuais
- Gravações de áudio — notas de reunião, podcasts, minhas próprias notas de voz
- Imagens — screenshots, diagramas, qualquer coisa visual
- Notas de texto — pensamentos rápidos, dicas, soluções
- Fotos de anotações, panfletos, etiquetas de móveis IKEA — este é o maior use-case para mim: eu fotografo algo (ex. uma etiqueta de móvel IKEA, um panfleto, uma nota), e depois pesquiso por ele, ou peço ao agente de IA para encontrar a URL do item, salvar as dimensões, ou suplementar a informação baseada nos dados extraídos.
Agentes não ingestam conteúdo automaticamente — eles só enviam dados para Memorito quando eu instruo. Quando pesquiso por algo, Memorito retorna os resultados relevantes com contexto completo.
Resumo#
Memorito é uma base de conhecimento forte, bem projetada, que eu construí para mim mesmo, e realmente funciona. Não é apenas mais um gerenciador de bookmarks, mas uma camada real de busca semântica para seu conhecimento pessoal. As integrações de agentes (OpenClaw, Hermes) tornam realmente útil — não precisa ingestar tudo manualmente, os agentes coletam e categorizam o conteúdo automaticamente.
E já que estamos falando do meu próprio código — se estiver interessado em Memorito, dê uma olhada no GitHub: https://github.com/Yappito/memorito. É open source, então não precisa temer vendor lock-in. Se tiver ideias, relatórios de bug, ou pull requests — eu aceito de bom grado.
Se você também está cansado de seu conhecimento espalhado em dez lugares diferentes, e quer que um agente de IA ajude a encontrar o que procura — vale a pena tentar. Ou se sente que também poderia construir — vá construir, é muito divertido. Você realmente não precisa ser um desenvolvedor profissional para construir seu próprio software hoje.