Post

Um favorito para pedir o TL;DR de qualquer página ao ChatGPT

Se preferir começar por um resumo, peça um TL;DR ao ChatGPT ou ao Claude.

Um bookmarklet que pega a URL aberta, monta um pedido de resumo e prepara uma conversa no ChatGPT, além da versão usada nos meus sites Jekyll.

Eu mantenho nos meus sites um link que oferece ao leitor a opção de começar por um resumo do texto. O arquivo HTML que deu origem a este post contém uma variação portátil dessa ideia: em vez de funcionar apenas nos meus artigos, ela usa a página que estiver aberta no navegador.

É um bookmarklet, um favorito cujo endereço começa com javascript:. Quando acionado, ele pega location.href, coloca a URL em um prompt e o abre em uma nova aba do ChatGPT.

O código não copia o conteúdo da página e não chama a API da OpenAI. Ele envia ao ChatGPT o endereço público e o pedido de leitura. Essa diferença importa: o resultado ainda depende de o ChatGPT conseguir acessar a página.

Em um navegador desktop, mostre a barra de favoritos e arraste o botão abaixo para ela:

TL;DR → ChatGPT

Depois:

  1. abra o artigo que pretende resumir;
  2. clique em TL;DR → ChatGPT nos favoritos;
  3. revise o prompt aberto no ChatGPT;
  4. envie a mensagem.

Se o navegador não aceitar o arrasto, crie um favorito comum, edite-o e cole o código da próxima seção no campo destinado à URL. Clicar no botão nesta própria página também funciona como exemplo: a página atual será a URL incluída no prompt.

O endereço completo do favorito

Este é o bookmarklet em uma única linha, no formato que precisa ser salvo como URL:

1
javascript:(()=>{const u=location.href;const p=`Por favor, abra esta URL com busca na web e leia o artigo completo:\n\n${u}\n\nDepois de ler o conteúdo real do artigo:\n1) Resuma os cinco pontos mais importantes e a conclusão.\n2) Explique quais detalhes, dados e insights eu perco por não ler o artigo completo.\n3) Sugira uma boa pergunta de follow-up para continuar a conversa sobre o artigo.`;window.open('https://chatgpt.com/?q='+encodeURIComponent(p),'_blank','noopener')})()

Uma versão HTML arrastável usa exatamente esse endereço no atributo href:

1
<a href="javascript:(()=>{const u=location.href;const p=`Por favor, abra esta URL com busca na web e leia o artigo completo:\n\n${u}\n\nDepois de ler o conteúdo real do artigo:\n1) Resuma os cinco pontos mais importantes e a conclusão.\n2) Explique quais detalhes, dados e insights eu perco por não ler o artigo completo.\n3) Sugira uma boa pergunta de follow-up para continuar a conversa sobre o artigo.`;window.open('https://chatgpt.com/?q='+encodeURIComponent(p),'_blank','noopener')})()">TL;DR → ChatGPT</a>

Uma URL javascript: executa código no contexto da página atual. A documentação da MDN recomenda não usar esse esquema para navegação comum e observa que políticas de segurança podem bloqueá-lo. Aqui ele tem uma finalidade deliberadamente restrita: ser instalado pelo próprio usuário como favorito. Eu não instalaria um bookmarklet sem antes ler seu código.

O que acontece quando clico

A versão expandida é mais fácil de inspecionar:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const articleUrl = window.location.href;

const prompt = `Por favor, abra esta URL com busca na web e leia o artigo completo:

${articleUrl}

Depois de ler o conteúdo real do artigo:
1) Resuma os cinco pontos mais importantes e a conclusão.
2) Explique quais detalhes, dados e insights eu perco por não ler o artigo completo.
3) Sugira uma boa pergunta de follow-up para continuar a conversa sobre o artigo.`;

const chatgptUrl =
  `https://chatgpt.com/?q=${encodeURIComponent(prompt)}`;

window.open(chatgptUrl, '_blank', 'noopener');

O encodeURIComponent() impede que espaços, acentos, quebras de linha e caracteres como & sejam interpretados como partes separadas da URL. A referência da função descreve justamente seu uso para codificar um valor que será colocado em uma query string.

O terceiro argumento de window.open() usa noopener, impedindo que a nova aba receba uma referência para a janela de origem. A opção faz parte dos recursos documentados de window.open().

O prompt pede três resultados. Além dos cinco pontos e da conclusão, ele solicita os detalhes perdidos pela leitura abreviada e uma pergunta para continuar a conversa. Esse segundo item evita fingir que um TL;DR equivale ao artigo inteiro.

Um exemplo com URL fixa

Dentro de um site, a URL do artigo já é conhecida. Não é necessário capturar a aba atual. Este link abre o mesmo prompt para “Publicando apps Python no Nomad sem Docker”:

Abrir o exemplo no ChatGPT ↗

O destino é formado por duas partes:

1
https://chatgpt.com/?q=[PROMPT CODIFICADO]

O exemplo não chama um endpoint de API e não executa processamento no gpupo.com. O navegador apenas abre uma URL do ChatGPT contendo o prompt.

Como isso está implementado nos meus sites

O gpupo.com e o site da BP Strat usam o mesmo desenho para oferecer um TL;DR em todas as páginas de determinados layouts. No gpupo.com, o leitor pode escolher entre ChatGPT e Claude. Os dois links partem do mesmo prompt e mudam apenas a URL de destino. Na BP Strat, a implementação continua apontando para o Claude.

No gpupo.com, o código está diretamente em _layouts/post.html. Todo conteúdo com layout: post recebe o link. Na BP Strat, a lógica foi extraída para _includes/tldr-claude.html; os layouts de posts e documentos reutilizam o include e informam se o conteúdo é um “artigo” ou um “documento”.

Nos dois casos, Liquid monta o prompt durante o build do Jekyll. No gpupo.com, o componente com as duas opções pode ser escrito assim:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{% assign canonical_url = page.url | absolute_url %}
{% capture tldr_prompt %}
Por favor, abra esta URL com busca na web e leia o artigo completo:
{{ canonical_url }}

Depois de ler o conteúdo real do artigo:
1) Resuma os cinco pontos mais importantes e a conclusão.
2) Explique quais detalhes, dados e insights o leitor perde por não ler o artigo completo.
3) Sugira uma boa pergunta de follow-up para continuar a conversa sobre o artigo.
{% endcapture %}

{% assign encoded_prompt = tldr_prompt | strip | url_encode %}
{% assign chatgpt_tldr_url =
  'https://chatgpt.com/?q=' | append: encoded_prompt %}
{% assign claude_tldr_url =
  'https://claude.ai/new?q=' | append: encoded_prompt %}

Se preferir começar por um resumo, peça um TL;DR ao
<a href="{{ chatgpt_tldr_url }}" target="_blank" rel="noopener noreferrer">ChatGPT</a>
ou ao
<a href="{{ claude_tldr_url }}" target="_blank" rel="noopener noreferrer">Claude</a>.

O filtro absolute_url combina a URL e o baseurl configurados no site com o caminho da página. O url_encode faz no build o trabalho que encodeURIComponent() faz no navegador. Esses filtros estão descritos na documentação do Jekyll.

Esse desenho tem um componente global e não exige JavaScript para o link de cada artigo. Se o prompt mudar, a alteração fica no layout ou no include, não em todos os posts. O bookmarklet continua separado porque precisa descobrir em tempo de execução qual página o usuário abriu, inclusive fora dos meus sites.

O limite que deixei explícito

O protótipo que originou este post usa o parâmetro ?q= como conveniência de interface. Em uma consulta feita em 11 de agosto de 2026, a documentação oficial da OpenAI não apresentou um contrato público que o defina como API estável.

Por isso eu o trataria como uma integração descartável. Se o formato mudar, o favorito e o componente dos sites precisarão ser ajustados. Para uma integração controlada por contrato, autenticação, erros e respostas estruturadas, o caminho é a API oficial, não uma URL da interface do ChatGPT.

Também não usaria o favorito com páginas privadas. A URL e o prompt são enviados ao ChatGPT. Páginas que exigem autenticação, bloqueiam acesso automatizado ou não estão publicadas podem não ser lidas. Se a resposta não demonstrar contato com o conteúdo real, resta copiar o trecho relevante ou fornecer o arquivo diretamente em uma conversa.