orelhudo

Seu Orelhudo, na sua conta Cloudflare.

O Orelhudo roda inteiro na Cloudflare e cabe no plano gratuito. Você instala uma vez com o Wrangler e passa a ter o seu próprio lugar para dobrar páginas.

O que vai ser criado na sua conta

ServiçoPara quêLimite do plano free
Workers + Static AssetsAPI e interface100 mil req/dia, 10 ms de CPU por invocação
D1Dados e busca5 GB, 5 milhões de leituras/dia, 100 mil escritas/dia
R2Cópias das páginas (texto legível, screenshot, PDF)10 GB
QueuesFila de arquivamento10 mil operações/dia (cerca de 3 por link)
Browser RunScreenshot e PDF10 min/dia, 3 navegadores simultâneos
Cron TriggerTenta de novo os arquivamentos pendentes, de hora em horaGrátis
R2 precisa de cartão. A Cloudflare só ativa o R2 em contas com um cartão cadastrado, mesmo dentro do plano gratuito.

Instalação

Você vai precisar de Node 22 ou mais recente, make, openssl, uma conta Cloudflare e um provedor de login compatível com OIDC (Google, GitHub via Dex, Authentik, Keycloak, Auth0, Pocket ID…).

  1. Baixe o código e instale as dependências. O primeiro make run já instala tudo e sobe uma versão local para você conferir.

    make run
  2. Entre na sua conta Cloudflare pelo Wrangler.

    npx wrangler login
  3. Crie o arquivo .env.production a partir de .dev.vars.example. Nele, deixe DEV_FAKE_OIDC=0, preencha o provedor OIDC e defina APP_URL com o endereço onde o Orelhudo vai ficar.

    cp .dev.vars.example .env.production
    # .env.production
    SESSION_SECRET=# openssl rand -hex 32
    DEV_FAKE_OIDC=0
    OIDC_ISSUER=https://login.exemplo.com
    OIDC_CLIENT_ID=orelhudo
    OIDC_CLIENT_SECRET=...
    OIDC_PROVIDER_NAME=Exemplo
    APP_URL=https://orelhudo.exemplo.com
  4. Registre o callback no provedor OIDC:

    <APP_URL>/auth/callback
  5. Publique.

    make deploy

    O deploy faz o build, envia as variáveis de .env.production como secrets do Worker e aplica as migrations no D1. Na primeira vez, o Wrangler cria sozinho o banco D1, o bucket R2 e a fila. Você não precisa copiar nenhum ID para o wrangler.jsonc.

Para atualizar depois, baixe a versão nova do código e rode make deploy de novo.

Configuração

Toda a configuração vem de variáveis de ambiente: em produção, do .env.production; localmente, do .dev.vars. A referência comentada está em .dev.vars.example.

Login

VariávelPadrãoDescrição
SESSION_SECRETobrigatóriaChave do cookie de sessão, com 32 caracteres ou mais.
OIDC_ISSUERobrigatóriaURL do issuer. O Orelhudo lê /.well-known/openid-configuration.
OIDC_CLIENT_IDobrigatóriaClient ID registrado no provedor.
OIDC_CLIENT_SECRETvazioVazio = cliente público, só com PKCE.
OIDC_SCOPESopenid email profile
OIDC_PROVIDER_NAMESSONome no botão da tela de login: “Continuar com …”.
APP_URLorigem da requisiçãoBase do redirect <APP_URL>/auth/callback.
SESSION_TTL_DAYS30Duração da sessão, em dias.
ALLOWED_EMAILSvazioE-mails liberados, separados por vírgula. Vazio = qualquer usuário do provedor.
ALLOWED_DOMAINSvazioO mesmo, por domínio do e-mail.
Restrinja o acesso. Com ALLOWED_EMAILS e ALLOWED_DOMAINS vazios, qualquer pessoa que tenha conta no seu provedor consegue entrar. Se usar um provedor público, como o Google, preencha pelo menos uma das duas.

Arquivamento

VariávelPadrãoDescrição
ARCHIVE_SCREENSHOTtrueGuarda um screenshot de cada página.
ARCHIVE_PDFtrueGuarda um PDF de cada página.
ARCHIVE_CRON_BATCH4Links reenfileirados a cada hora pelo cron. 0 desliga.
ARCHIVE_MAX_BYTES10000000Tamanho máximo de cada arquivo no R2.

A fila arquiva um link por vez. Se a cota diária do Browser Run acabar, o link fica como parcial e o cron tenta de novo, até 3 vezes. Se preferir economizar cota, desligue o screenshot ou o PDF: a versão em texto legível continua sendo guardada.

Domínio próprio

Depois do primeiro deploy, o Orelhudo já responde em orelhudo.<sua-conta>.workers.dev. Para usar um endereço seu, o domínio precisa estar na sua conta Cloudflare.

  1. Adicione o domínio ao wrangler.jsonc:

    "routes": [
      { "pattern": "orelhudo.exemplo.com", "custom_domain": true }
    ]

    Se preferir não mexer no arquivo, adicione o domínio pelo painel da Cloudflare, em Workers & Pages › orelhudo › Settings › Domains & Routes.

  2. Atualize o APP_URL no .env.production para o novo endereço.

  3. Troque o callback no provedor OIDC para https://orelhudo.exemplo.com/auth/callback.

  4. Publique de novo com make deploy. A Cloudflare cria o registro DNS e o certificado.

Importar bookmarks

Do navegador ou de um arquivo HTML

Exporte os favoritos do navegador no formato HTML: Chrome, Firefox, Safari e Edge têm essa opção no gerenciador de favoritos. Depois, importe o arquivo no Orelhudo. As pastas viram coleções.

Pela API, o mesmo arquivo vai no corpo de POST /api/v1/import:

curl -H "Authorization: Bearer $TOKEN" -H "content-type: text/html" \
  --data-binary @favoritos.html https://orelhudo.exemplo.com/api/v1/import

Do Linkwarden

Em Configurações › Importar de outro serviço, escolha “Linkwarden” e informe o endereço da instância e uma chave de API. No Linkwarden, a chave fica em Settings › Access Tokens.

Exportar

Tudo o que você dobrou sai de volta em HTML de favoritos por GET /api/v1/export, pronto para abrir em qualquer navegador.

Rodar localmente

make run

Na primeira vez, o comando instala as dependências, cria o .dev.vars com um SESSION_SECRET aleatório, aplica as migrations no D1 local e abre o Orelhudo em localhost:5173.

O .dev.vars gerado vem com DEV_FAKE_OIDC=1: um login de mentira, que aceita qualquer e-mail e só funciona em localhost. D1, R2, fila e Browser Run são simulados pelo Wrangler, e os dados ficam em .wrangler/state.

ComandoO que faz
make testTestes de integração no runtime do Workers
make typecheckChecagem de tipos
make buildBuild da interface e do Worker
make typesRegenera os tipos depois de mudar bindings