InDraft
No arProjeto 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.
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_atno 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
publishProofderivado. 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
/accesssempre envia e-mail apenas para oNOTIFY_TO_ADDRESSconfigurado — 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
.gitignoreexcluiconfig.yml,.env*e.vercel/. O script de setup envia secrets apenas viaprompt -> 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.