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ço | Para quê | Limite do plano free |
|---|---|---|
| Workers + Static Assets | API e interface | 100 mil req/dia, 10 ms de CPU por invocação |
| D1 | Dados e busca | 5 GB, 5 milhões de leituras/dia, 100 mil escritas/dia |
| R2 | Cópias das páginas (texto legível, screenshot, PDF) | 10 GB |
| Queues | Fila de arquivamento | 10 mil operações/dia (cerca de 3 por link) |
| Browser Run | Screenshot e PDF | 10 min/dia, 3 navegadores simultâneos |
| Cron Trigger | Tenta de novo os arquivamentos pendentes, de hora em hora | Grátis |
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…).
Baixe o código e instale as dependências. O primeiro
make runjá instala tudo e sobe uma versão local para você conferir.make runEntre na sua conta Cloudflare pelo Wrangler.
npx wrangler loginCrie o arquivo
.env.productiona partir de.dev.vars.example. Nele, deixeDEV_FAKE_OIDC=0, preencha o provedor OIDC e definaAPP_URLcom 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.comRegistre o callback no provedor OIDC:
<APP_URL>/auth/callbackPublique.
make deployO deploy faz o build, envia as variáveis de
.env.productioncomo 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 owrangler.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ável | Padrão | Descrição |
|---|---|---|
SESSION_SECRET | obrigatória | Chave do cookie de sessão, com 32 caracteres ou mais. |
OIDC_ISSUER | obrigatória | URL do issuer. O Orelhudo lê /.well-known/openid-configuration. |
OIDC_CLIENT_ID | obrigatória | Client ID registrado no provedor. |
OIDC_CLIENT_SECRET | vazio | Vazio = cliente público, só com PKCE. |
OIDC_SCOPES | openid email profile | |
OIDC_PROVIDER_NAME | SSO | Nome no botão da tela de login: “Continuar com …”. |
APP_URL | origem da requisição | Base do redirect <APP_URL>/auth/callback. |
SESSION_TTL_DAYS | 30 | Duração da sessão, em dias. |
ALLOWED_EMAILS | vazio | E-mails liberados, separados por vírgula. Vazio = qualquer usuário do provedor. |
ALLOWED_DOMAINS | vazio | O mesmo, por domínio do e-mail. |
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ável | Padrão | Descrição |
|---|---|---|
ARCHIVE_SCREENSHOT | true | Guarda um screenshot de cada página. |
ARCHIVE_PDF | true | Guarda um PDF de cada página. |
ARCHIVE_CRON_BATCH | 4 | Links reenfileirados a cada hora pelo cron. 0 desliga. |
ARCHIVE_MAX_BYTES | 10000000 | Tamanho 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.
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.
Atualize o
APP_URLno.env.productionpara o novo endereço.Troque o callback no provedor OIDC para
https://orelhudo.exemplo.com/auth/callback.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.
- Aceita arquivos de até 5 MB.
- Pode importar de novo quando quiser: URLs já salvas são ignoradas, e coleções existentes são reaproveitadas.
- Os links importados não passam pela fila na hora. O cron vai fazendo as cópias aos poucos, para não estourar a cota diária.
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.
- Vêm coleções (com a hierarquia), links, tags, descrições e datas.
- Links fixados e as cópias feitas pelo Linkwarden não vêm. O Orelhudo refaz as cópias aos poucos, pelo cron.
- Sem chave, só as coleções públicas são importadas. As que estavam dentro de uma coleção privada ficam na raiz.
- A chave é usada só durante a importação e não é gravada.
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.
| Comando | O que faz |
|---|---|
make test | Testes de integração no runtime do Workers |
make typecheck | Checagem de tipos |
make build | Build da interface e do Worker |
make types | Regenera os tipos depois de mudar bindings |