InDraft

No ar

Projeto pessoal — um motor de rascunhos para LinkedIn orientado por config. Rascunha no seu estilo via cron, você revisa no celular, nada é publicado sem uma asserção de passkey.

Função
Solo — engenharia, deploy
Período
mai. de 2026 – Atual
Stack
  • Next.js 16
  • TypeScript
  • Vercel KV
  • Vercel Cron
  • OpenRouter
  • Claude Opus 4.7
  • Claude Haiku 4.5
  • WebAuthn (passkeys)
  • Resend
  • Pexels
  • Tailwind v4

O que ele faz

Você faz um fork do repositório, preenche o config.yml com seu parágrafo de perfil, feeds RSS, agenda de postagem e pilares de conteúdo, e o yarn setup faz o deploy no Vercel. A partir daí, um cron diário dispara às 14:00 UTC, filtra pelos dias e horário local configurados, busca um item novo das suas fontes, rascunha um post no seu estilo e te envia um magic link por e-mail.

Você abre a página de revisão no celular. Pode editar o rascunho de forma conversacional até ficar satisfeito, depois toca em “Publicar” — Face ID ou Touch ID, e o post vai ao ar no LinkedIn.

Por que construí isso

A qualidade de um post no LinkedIn depende de voz e timing. A maioria das ferramentas de automação mata os dois: geram texto genérico de IA e postam em horários que não têm nada a ver com o que está acontecendo naquele dia. O InDraft tenta preservar os dois — seu estilo é o principal contexto do modelo, o agendamento é baseado em fontes atualizadas, e um humano sempre revisa antes de qualquer publicação.

É também um motor genérico orientado por config, não um SaaS. Nada pessoal — estilo, fontes, credenciais — fica no repositório. Faça um fork, aponte sua config para o que é seu, e suba.

Como funciona

Arquitetura

Vercel Cron (daily 14:00 UTC)
   | day/hour filter
Collector: RSS + GitHub
   |
Generator + anti-AI-tell linter
   |
Media: Pexels or owner upload
   |
Vercel KV
   |
Resend: magic-link email to /review
   |
Conversational chat edits
   |
WebAuthn passkey assertion
   |
LinkedIn Posts API

A máquina de estados em src/lib/state/drafts.ts é a única escritora do status do rascunho e o limite de segurança central. O único caminho para a LinkedIn Posts API é através de uma asserção WebAuthn verificada — nenhum caminho agendado ou automático publica. Um teste e2e em tests/e2e/publish-guard.test.ts prova isso no nível da máquina de estados: um rascunho que não está em PENDING_REVIEW nunca pode transitar para PUBLISHED, e uma asserção capturada não pode ser reaproveitada contra um rascunho editado porque o desafio está vinculado à versão do rascunho.

Padrões principais

  • link_placement: "none" — pesquisas atuais sobre o algoritmo do LinkedIn mostram que links externos suprimem o alcance. O InDraft exibe a URL de origem dentro da UI de revisão. Sobrescreva por post se quiser.
  • Modelo frontier para rascunho, modelo barato para ranking — Claude Opus 4.7 rascunha porque a qualidade anti-cacoetes de IA cai em modelos mais fracos; Claude Haiku 4.5 cuida do ranking de fontes e tarefas mecânicas. Ambos roteados via OpenRouter BYOK.
  • Token do LinkedIn de 60 dias, sem refresh — apps LinkedIn self-serve emitem tokens de 60 dias sem caminho de refresh. O InDraft armazena issued_at no KV, envia um aviso de reautenticação ~7 dias antes do vencimento e exibe um banner de “reconectar LinkedIn” na UI de revisão.

Modelo de segurança

  • O único caminho de publicação é: um clique, depois uma asserção WebAuthn, depois uma transição no servidor com um publishProof derivado. O desafio da asserção é sha256(draft.id || draft.version || draft.body), então uma asserção capturada não pode ser reaproveitada.
  • Magic links são assinados com HMAC, de uso único (nonce armazenado no KV com TTL) e expiram após 24 horas por padrão.
  • O endpoint público /access sempre envia e-mail apenas para o NOTIFY_TO_ADDRESS configurado — nunca para um endereço fornecido por um atacante.
  • As sessões são cookies HttpOnly, Secure, SameSite=Lax vinculados a um id de rascunho específico.
  • O .gitignore exclui config.yml, .env* e .vercel/. O script de setup envia secrets apenas via prompt -> vercel env add — nunca para o disco.

Status

O motor está com funcionalidades completas e licenciado sob MIT. O repositório é o entregável; meu deploy pessoal fica em indraft.dev.

Perguntas

O que é o InDraft?

InDraft é um motor open-source de rascunhos para LinkedIn. Um job agendado busca itens novos dos seus feeds RSS e da sua atividade no GitHub, escolhe um e rascunha um post no seu estilo. Você revisa no celular, edita de forma conversacional, e o post só vai ao ar após uma asserção de passkey WebAuthn vinculada àquele rascunho exato.

Por que usar passkey para publicar?

Não existe caminho de publicação automática no código. Todo post publicado passa por uma asserção WebAuthn vinculada a um sha256 do id, versão e corpo do rascunho — então uma asserção capturada não pode ser reaproveitada contra um rascunho editado. A máquina de estados em src/lib/state/drafts.ts é a única escritora do status do rascunho e garante essa propriedade no nível de tipos.

Como o InDraft preserva o estilo de escrita?

Um bloco de texto livre no config.yml é o principal contexto do modelo. O modelo de rascunho é Claude Opus 4.7 via OpenRouter BYOK porque a qualidade anti-cacoetes de IA cai em modelos mais fracos. Um linter separado rejeita abuso de travessão, "vamos mergulhar nesse tema", e outros vícios antes de o rascunho chegar à UI de revisão.

Por que omitir o link por padrão?

Pesquisas sobre o algoritmo do LinkedIn em 2026 mostram que posts com link no corpo perdem até 60% de alcance, e o antigo truque de "link no primeiro comentário" perde até 80%. O padrão do InDraft é link_placement = "none" — a URL de origem aparece dentro da UI de revisão. Você pode sobrescrever por post.

Publicado 26 de mai. de 2026, 18:25 GMT-3 · Atualizado 28 de mai. de 2026, 22:29 GMT-3

← Todos os projetos