Voltar para o blog
BunAPIsSide Project

Wikipedia local com Bun: o que existe a 30 minutos de você

24 de outubro de 2026·7 min de leitura·Diego Horvatti

Você mora há anos no mesmo bairro e provavelmente não sabe metade do que tem na Wikipedia sobre ele. O Ed Jefferson resolveu isso com um projeto pequeno e muito bem pensado: a Local Wikipedia, uma Wikipedia local que mostra só artigos sobre coisas a meia hora de caminhada de onde você está. Nada de guerra mundial, nada de celebridade. Só a praça, a igreja velha, a estação desativada e aquela fábrica que virou condomínio.

A ideia é tão simples que dá vontade de fazer a sua versão no fim de semana. Então vamos fazer, com Bun.

O que é a Wikipedia local do Ed Jefferson

O site pega a sua localização e lista os artigos da Wikipedia que têm coordenadas geográficas perto de você. O recorte é humano: o que dá para alcançar andando em uns 30 minutos. A 5 km/h, isso dá algo na faixa de 2,5 km.

Parece bobo. Não é. A Wikipedia tem centenas de milhares de artigos com coordenadas, e a maioria deles nunca aparece para você porque ninguém pesquisa "a ponte de ferro da rua de trás". O projeto inverte a lógica: em vez de você ir atrás do conteúdo, o conteúdo vem do lugar onde você já está.

Testei mentalmente com o meu bairro e já sei o que vai acontecer. Vai aparecer um artigo de três linhas sobre um posto de gasolina que fechou em 1987. E eu vou ler inteiro.

Os melhores side projects resolvem uma curiosidade, não um mercado.

Como funciona por baixo: a API de geosearch

A parte técnica é quase toda da Wikimedia. A API do MediaWiki tem um módulo chamado geosearch que recebe uma coordenada e um raio e devolve os artigos marcados naquela área. Sem chave, sem cadastro.

Os parâmetros que importam:

  • gscoord: latitude e longitude separadas por |.
  • gsradius: raio em metros, até 10.000.
  • gslimit: quantos resultados, até 500.

Uma chamada para o centro de São Paulo fica assim:

https://pt.wikipedia.org/w/api.php?action=query&list=geosearch&gscoord=-23.5505|-46.6333&gsradius=2500&gslimit=50&format=json

A resposta vem com título, pageid, coordenadas e a distância em metros até o ponto. Ou seja: o backend de uma Wikipedia local já existe. Você só precisa de uma camada fina por cima.

Um detalhe que muita gente ignora: a Wikimedia pede que todo cliente mande um User-Agent identificável, com um contato. Se você esquecer, pode tomar bloqueio. É educação básica com uma API gratuita que sustenta meio mundo.

Montando a sua versão com Bun

Aqui o Bun brilha, porque o projeto inteiro cabe em um arquivo, sem dependência nenhuma. fetch nativo, servidor HTTP nativo, TypeScript rodando direto.

const cache = new Map<string, { at: number; data: unknown }>()
const TTL = 1000 * 60 * 60 // 1 hora

async function nearby(lat: number, lon: number) {
  // ponytail: arredonda para ~1 km, protege privacidade e melhora o cache
  const key = `${lat.toFixed(2)}|${lon.toFixed(2)}`
  const hit = cache.get(key)
  if (hit && Date.now() - hit.at < TTL) return hit.data

  const url = new URL('https://pt.wikipedia.org/w/api.php')
  url.search = new URLSearchParams({
    action: 'query',
    list: 'geosearch',
    gscoord: key,
    gsradius: '2500',
    gslimit: '100',
    format: 'json',
  }).toString()

  const res = await fetch(url, {
    headers: { 'User-Agent': 'wiki-local/1.0 (contato@seudominio.com)' },
  })
  const data = (await res.json()).query.geosearch
  cache.set(key, { at: Date.now(), data })
  return data
}

Bun.serve({
  port: 3000,
  routes: {
    '/api/perto': async (req) => {
      const { searchParams } = new URL(req.url)
      const lat = Number(searchParams.get('lat'))
      const lon = Number(searchParams.get('lon'))
      if (!Number.isFinite(lat) || !Number.isFinite(lon)) {
        return new Response('lat/lon inválidos', { status: 400 })
      }
      return Response.json(await nearby(lat, lon))
    },
  },
})

Roda com bun run server.ts e pronto. No front, um navigator.geolocation.getCurrentPosition chama esse endpoint e você renderiza uma lista. Dá para fazer em HTML puro, sem framework.

Por que ter um backend, se a API da Wikipedia aceita chamada direta do navegador? Três motivos práticos:

  • Cache: dez pessoas no mesmo bairro viram uma chamada só para a Wikimedia.
  • User-Agent: o navegador não deixa você controlar esse header direito.
  • Privacidade: o servidor só vê coordenada arredondada, e a Wikimedia nem isso.

O Map em memória tem limite óbvio: reiniciou o processo, perdeu o cache, e ele cresce sem teto. Para um side project, tudo bem. Se virar coisa séria, troca por Redis ou por uma tabela no PostgreSQL com índice nas coordenadas arredondadas.

Por que importa a privacidade da localização

Esse é o ponto que separa um projeto legal de um projeto responsável. Localização exata é dado sensível. Com quatro casas decimais você identifica a casa de alguém. Com duas, você identifica um bairro.

Para uma Wikipedia local, duas casas decimais bastam. Um erro de uns 1,1 km num raio de 2,5 km não muda quase nada no resultado. Mas muda bastante o que vaza no seu log de acesso.

Se você for publicar algo assim, vale também:

  • Não logar lat e lon brutos.
  • Pedir a localização só quando a pessoa clicar num botão, nunca no carregamento da página.
  • Oferecer um campo de busca por endereço para quem não quer compartilhar GPS.

É o tipo de cuidado que custa cinco minutos e evita uma dor de cabeça enorme com LGPD depois.

Linha reta não é caminhada

Aqui mora a pegadinha. O gsradius mede distância em linha reta. Só que ninguém anda em linha reta. Tem rio, tem viaduto, tem avenida sem faixa de pedestre.

Na prática, um ponto a 2 km em linha reta pode estar a 40 minutos de caminhada. Se você quiser ser fiel à promessa de "meia hora a pé", tem dois caminhos:

  1. Aproximação honesta: use um raio menor, tipo 2 km, e aceite a imprecisão.
  2. Rota de verdade: passe os resultados por um serviço de roteamento como OSRM ou Valhalla, no perfil de pedestre, e filtre pelo tempo real.

A segunda opção é muito mais cara. Cem artigos viram cem cálculos de rota, ou uma chamada de matriz se o serviço suportar. Para um projeto de curiosidade, eu ficaria com a primeira. A graça está em descobrir, não em cronometrar.

Se quiser ordenar por distância no seu lado, a fórmula de haversine resolve em poucas linhas, mas repara que a própria API já devolve o campo dist. Não reescreva o que já vem pronto.

O que esse projeto ensina para quem escreve código

Eu gosto da Local Wikipedia por um motivo que tem pouco a ver com geografia. Ela é um lembrete de que produto bom pode ser um recorte, não uma plataforma.

O Ed não construiu uma enciclopédia. Ele pegou uma API pública, aplicou um filtro com significado humano e entregou. Sem conta, sem onboarding, sem notificação pedindo para você voltar.

A gente, desenvolvedor, tem mania de começar side project pelo docker-compose.yml. Monorepo, autenticação, fila, painel de admin. Três semanas depois, nenhuma linha resolve o problema que motivou a ideia. Esse projeto é o contrário disso, e o Bun combina bem com essa mentalidade: um arquivo, zero npm install, sobe em milissegundos.

Também tem uma lição sobre dado aberto. A Wikipedia guarda coordenadas há anos, editadas por voluntários, e quase ninguém usa isso de forma criativa. Tem muito projeto esperando para ser feito em cima de APIs que já existem e são de graça. Antes de pensar em raspar site ou pagar API cara, vale olhar o que a Wikimedia, o OpenStreetMap e os portais de dados abertos do governo já entregam.

Vale a pena fazer a sua?

Vale, e não pela utilidade. Vale porque é o exercício perfeito: API externa, cache, cuidado com privacidade, uma decisão de produto clara e um resultado que você mostra para qualquer pessoa na mesa do bar.

Minha opinião sincera: esse tipo de projeto ensina mais do que mais um clone de to-do list com dezessete bibliotecas. Você mexe com dado real, toma decisão de trade-off e termina num fim de semana. E ainda descobre que o terreno baldio da esquina tem artigo próprio.

Se você curte projetos assim, pequenos e com propósito, dá uma olhada no que eu ando construindo em meus projetos.

Resumo para o LinkedIn

Morei anos no mesmo bairro sem saber metade do que a Wikipedia conta sobre ele.

O Ed Jefferson criou a Local Wikipedia, que mostra só os artigos sobre lugares a 30 minutos de caminhada de você. A praça, a estação desativada, a fábrica que virou condomínio.

O melhor é que o backend já existe. A API de geosearch da Wikimedia é gratuita e não pede chave. Com Bun, a sua versão cabe em um arquivo e não precisa de nenhuma dependência.

O cuidado de verdade fica na privacidade: arredondar a localização para duas casas decimais protege o usuário e ainda melhora o cache.

Projeto pequeno ensina mais do que mais um clone de to-do list. Você trabalha com dado real e decide trade-offs, tudo num fim de semana.

Escrevi o passo a passo completo no blog. Quem aí já topou com um artigo inesperado sobre o próprio bairro?

#Bun #TypeScript #SideProjects #OpenData #DesenvolvimentoWeb