Salvar links não te torna mais inteligente. Aprender com eles sim.
Problema
Eu era essa pessoa com centenas de links salvos que nunca ia abrir de novo. Eu salvava artigos, vídeos, referências. Mas quando precisava de alguma coisa, ficava procurando pelo título que mal lembrava, nas pastas que mal organizava. A ferramenta que eu usava organizava o que eu tinha salvo. O problema é que ela não me ajudava a aprender com isso nem a acessar o que eu precisava quando precisava.
Então eu construí o Coisas.space em torno de uma pergunta: e se o conteúdo que você salvou pudesse aparecer quando a gente precisa, sem precisar lembrar que existia?
A stack de IA
A categorização roda com gpt-4o-mini via OpenRouter a temperature 0.2. Eu cheguei nessa temperatura baixa testando: temperatura maior introduzia category drift, o mesmo link categorizado de formas diferentes em saves repetidos. 0.2 dá a consistência que uma feature de categorização precisa ter pra o usuário confiar.
A camada de recuperação conversacional usa a categoria como sinal de contexto escopado, uma abordagem RAG-like rápida o suficiente para UX consumer e precisa o suficiente para ser útil. Eu testei com embedding completo de documento e ficou mais lento do que os padrões reais de query justificavam.
Quando o contexto é raso, a recuperação faz fallback por três níveis: conteúdo visível da categoria ativa (últimos 3 dias), depois todo o conteúdo dessa categoria, depois todo o conteúdo independente de categoria. A estratégia mantém as respostas fundamentadas mesmo pra quem acabou de começar.
O algoritmo de matching do Foco Time usa IA semântica, então "Aprender React" traz links sobre hooks, components e JSX, inclusive links que nunca mencionam React no título. Resultados são cacheados em KV com invalidação por hash: quando um novo link é salvo, o hash muda, o cache invalida e a próxima requisição de matching regenera.
As decisões de design
Streaming foi inegociável pra mim. Qualquer categorização que exigisse espera quebraria o hábito de salvar. O produto só funciona se salvar parecer instantâneo. O link aparece imediatamente no grid com um estado pending, a categorização completa em background, o status progride de pending para processed para read.
Eu escopei a interface conversacional por categoria de propósito. Chat aberto sobre todo o conteúdo salvo produzia respostas irrelevantes nos testes, então estreitar o contexto foi a decisão que fez a feature funcionar. Quando o usuário troca de categoria com um chat aberto, um aviso inline aparece com duas opções: manter o contexto atual ou re-ancorar a conversa na nova categoria.
O comando /resumir usa progressive disclosure baseado em Fibonacci: a primeira chamada retorna 5 links. O usuário pode pedir mais, e a sequência expande para 8, 13, 21, 34. O usuário vai descobrindo o que tem, no ritmo que precisar.
O modo de falha
Quando o modelo não consegue categorizar um link com confiança (páginas com paywall, conteúdo ambíguo, URLs quebradas), o link vai para um estado Sem categoria com opção de override manual. O link está sempre lá, sempre acessível. A IA é uma camada aditiva sobre os dados, então quando ela falha, o link continua disponível.
A camada de provedor tem um fallback: se o OpenRouter retornar 402 (créditos esgotados), o sistema roteia automaticamente para o OpenAI com uma janela de retry de 1 hora. O status do serviço é rastreado em KV: provedor, último erro, tentativas falhas, último tempo de sucesso. O usuário nunca vê uma troca de provedor.
A extração de conteúdo usa silent failure: se a extração expira em 10 segundos, o link continua funcionando com seus metadados. Eu priorizei velocidade de resposta aqui, porque um link no grid já serve o usuário, mesmo sem o texto completo extraído.
Row-level security é aplicado no nível do banco de dados e na camada de aplicação. Cada tabela de dados do usuário tem políticas RLS vinculadas ao auth.uid(). Nenhum bug de aplicação pode vazar os dados de um usuário para outro.
O que vem a seguir
Eu quero adicionar leitura profunda via Firecrawl, extraindo o conteúdo real dos links salvos além dos metadados. E Gmail OAuth para puxar newsletters e threads direto para a biblioteca, transformando a caixa de entrada em um feed de aprendizado. O que eu mais quero é a camada de leitura, porque é o que vai fazer as respostas de IA ficarem ancoradas no que você de fato leu, e aí elas ficam realmente úteis.
leitura anterior
Resense →Resense é um produto que usa IA pra transformar qualquer dado que o time já tem (CSV, PDF, texto, imagem) em Synthetic Users, com RAG e embeddings. Ele também gera insights com pesos de conexão entre causa e efeito. Eu usei IA em todo o processo, da pesquisa aos testes.
