Cansei, então estou escrevendo um navegador
(adayinthelifeof.nl)- Uma experiência pessoal de evitar notícias acabou levando a notícias de tecnologia, e, após sentir impotência diante de mudanças negativas repetidas, a pessoa decidiu criar seu próprio navegador
- No Hacker News, continuou encontrando tendências como atualizações indesejadas, aumento de assinaturas, coleta de dados pessoais, discussões sobre proibição de criptografia e controle do ecossistema de navegadores
- Desta vez, em vez de apenas evitar, tentou uma pequena reação como programador, criando e publicando código
- Reconhece que é improvável que o projeto seja concluído ou se torne um navegador popular, e admite que pode ser interrompido em breve se não receber ajuda
- Espera que um projeto de navegador aberto e não comercial inspire outras pessoas e leve a mais projetos alternativos
Como evitar notícias levou ao desenvolvimento de um navegador
- Há cerca de 10 anos, ao visitar clientes com frequência de carro, costumava ouvir a Business News Radio (BNR) ou a Radio 1, da Holanda, mas um dia desligou o rádio e percebeu que não queria mais ouvir notícias
- Sentia que as notícias repetiam apenas coisas ruins, como guerras e corrupção, e via que, como indivíduo, não tinha como resolver esses problemas
- Depois disso, passou a evitar ouvir, assistir e procurar notícias na internet; quando o jornal das 8 começava, trocava de canal ou saía do cômodo onde as notícias estavam passando
- Considerava que as notícias importantes acabariam chegando por outras pessoas e, em vez de notícias gerais, passou a acompanhar apenas alguns subreddits do Reddit e notícias de tecnologia de forma limitada
A mesma sensação de impotência se repetiu nas notícias de tecnologia
- Cerca de 98% das notícias de tecnologia vinham do Hacker News, do Y Combinator, mas com o tempo voltou a crescer a mesma sensação que já tinha sentido com as notícias gerais 10 anos antes
- Os problemas que encontrava repetidamente eram atualizações indesejadas, promessas quebradas, aumento de assinaturas, aquisições por empresas e tentativas de coletar ainda mais dados pessoais
- Também vê como parte do mesmo problema o movimento de governos tentando proibir a criptografia sob o pretexto de combater criminosos sexuais que exploram crianças
- Os navegadores se tornam um alvo especialmente importante, já que são onde quase todas as pessoas no mundo passam parte do seu tempo
- Se o próprio navegador exibir anúncios, bloqueadores de anúncios voltados para anúncios de sites podem ter dificuldade para reagir
- Já houve casos de extensões exclusivas para um navegador específico tornarem mais difícil usar certos sites em outros navegadores, e acredita que, se surgir uma forma de evitar problemas de monopólio, isso pode voltar a se repetir
Por que decidiu fazer um navegador e por que tem expectativas baixas
- Desta vez, em vez de apenas evitar, concluiu que, como programador, podia desenvolver um navegador por conta própria e compartilhar o código
- Há dois motivos para ter decidido criar um navegador
- Uma tentativa de empurrar de volta, ainda que de uma forma muito pequena
- Um motivo pessoal: há muito tempo queria tentar construir um navegador por conta própria
- Não tem grandes expectativas para o projeto
- Não espera que seja concluído
- Acredita que pode morrer em breve se ninguém ajudar
- Não espera que se torne um navegador dominante capaz de derrubar os grandes navegadores existentes
- O que espera é que ele permaneça aberto com objetivo não comercial e que outras pessoas se inspirem para criar seus próprios projetos
- O andamento do projeto pode ser visto no post de progresso no codemusings.nl
- O repositório do projeto está em jaytaph/gosub-browser
1 comentários
Opiniões do Hacker News
Sou o OP. Obrigado pelos comentários positivos/negativos/neutros e, para acrescentar algumas coisas: é verdade que já existem muitos projetos de navegador para os quais se pode contribuir e que isso seria mais eficiente, mas aí acabamos com apenas alguns poucos navegadores. Eu quero que existam muitos navegadores, para que as pessoas tenham opções.
Este é claramente um projeto pessoal. Eu teria começado mesmo que não fosse só por estar de saco cheio da indústria de tecnologia, mas estou irritado com a sensação de impotência de que não dá para mudar nada, e esta é a minha forma de tentar fazer algo. Não espero que um navegador de verdade fique pronto. Espero que as pessoas olhem para o meu código e riam, ou tirem ideias melhores dele. Por exemplo, se o algoritmo do tokenizador e do parser de HTML5 for explicado passo a passo, como no site do whatwg, fica mais fácil para qualquer um escrever seu próprio parser de HTML5. Se Google ou Microsoft usarem seu domínio de mercado para criar um HTML5 customizado em formato fechado, algo como ghtml, quem conseguiria impedir? O motivo de eu querer começar do zero é entender melhor as dificuldades técnicas lá de baixo.
Também concordo com o que foi dito sobre a miséria das “notícias”. Em guerra psicológica, isso é chamado de desmoralização (sapping). Antigamente, o inimigo fazia propaganda para quebrar a vontade de resistir e deixar as pessoas impotentes; um exemplo clássico foi Lord Haw-Haw. https://en.wikipedia.org/wiki/Lord_Haw-Haw
Hoje, os canais de notícias mainstream e os gigantes da tecnologia parecem tentar manter as pessoas presas em um estado permanente de desespero e ansiedade. O discurso sobre tecnologia também parece um poço de cinismo, evasão, negação, resignação e impotência aprendida; fiz muitas entrevistas e análises de sentimento recentemente, e os resultados foram terríveis. Dá a sensação de que a própria palavra “tech” está virando sinônimo de “resistir é inútil”. Fazer alguma coisa, não porque se espera sucesso, mas para dar o exemplo e preservar a própria sanidade, é a reação mais positiva e humana possível.
Para colocar no estilo de Linus Torvalds: quando você faz algo com a postura de “não estou tentando criar algo grande e profissional como o GNU, é para mim”, dá para realizar muito mais com muito menos esforço. Assim, você pode fazer concessões pragmáticas e chegar a algo útil para si, seja para aprendizado ou para uso real, com muito menos esforço do que ao tentar criar um “produto”. Muitos dos meus projetos pessoais também começaram ao encontrar pequenos projetos pessoais desse tipo, reaproveitar partes deles e depois seguir em direções completamente diferentes. É muito mais fácil pegar um projeto pequeno que seja “bom o bastante” do que reduzir ou adaptar uma fera enorme e cheia de recursos. Grande parte da complexidade de um navegador vem da necessidade de dar suporte a todos os sites e a todos os cenários de uso, mas, se eu o crio para mim mesmo, posso me concentrar em fazer funcionar suficientemente bem os sites com os quais me importo, e o problema diminui bastante. Gostaria que mais pessoas tentassem projetos “impossíveis”. Mesmo que o todo não seja imediatamente útil para outras pessoas, partes dele podem ser úteis e, às vezes, como no Linux, algo maior nasce de um pequeno projeto pessoal.
Se as pessoas usassem em algo construtivo ao menos metade do tempo que gastam dizendo que o projeto de alguém é uma perda de tempo inútil, o mundo teria muito mais projetos legais e interessantes. É melhor falhar em algo ousado e ambicioso do que nem sequer tentar.
Não é preciso implementar todos os recursos de um navegador web moderno. Você não precisa de Battery API, Gamepad API, USB e coisas do tipo; basta focar no HTML, CSS e JS importantes. No pior dos casos, você aprenderá algo novo. Boa sorte com o projeto.
A fala “não espero nada, nem espero terminar, é um projeto que morrerá logo se não houver ninguém para ajudar, não espero que vire um navegador dominante que derrube os gigantes do mercado” lembra o primeiro anúncio do Linux que Linus publicou em comp.os.minix.
Era o texto que começava com “Olá a todos que usam minix. Estou criando um sistema operacional livre para clones AT 386(486). É só um hobby, então não será grande e profissional como o gnu…”, dizia que ele tinha portado bash e gcc, que algo prático parecia poder sair em alguns meses, e pedia que as pessoas dissessem quais recursos queriam, embora ele não prometesse implementá-los. No fim, ele também dizia que não havia nenhum código do minix, que havia um sistema de arquivos multithread, mas sem portabilidade, e que provavelmente não teria suporte a nada além de discos rígidos AT.
Ninguém sabe até onde um projeto pode chegar. E, se você está fazendo por seus próprios motivos, de certa forma isso nem importa.
Não estou acostumado a ver um clima tão negativo no HN em relação a navegadores e à web aberta. Independentemente de dar certo ou não, vejo isso como uma tentativa muito valiosa
Mesmo que o resultado seja apenas um navegador meio incompleto, não sujeito às motivações das gigantes de tecnologia, ele pode ser útil se um dia chegar o momento em que precisemos deixar de depender do Firefox. Gosto muito do Firefox e espero que esse dia nunca chegue, mas percebi que, ao acessar a web, meu navegador é uma espécie de gargalo. Existem outros sites para ver o mesmo conteúdo, e outras marcas de computadores que posso usar, mas no meio sempre está o Firefox. Há outros navegadores, claro, mas em geral parecem baseados no Googlium, ou qualquer que seja o nome disso hoje. Então desejo boa sorte, espero que dê certo e pretendo assinar o feed RSS para acompanhar o projeto de vez em quando
Também há provas de que é possível. O Ladybird foi criado do zero e, originalmente, até a biblioteca padrão de C++ era feita por eles; depois de 3 a 4 anos de trabalho em meio período, agora até roda o Discord, ainda que lentamente. Hoje também há desenvolvedores em tempo integral. Pelo cargo.lock, o GoSub não parece estar tentando implementar tudo do zero; coisas como decodificadores de imagem provavelmente usarão soluções prontas, então ele pode ter potencial para crescer mais rápido
Hoje, “escrever um navegador do zero” significa, na prática, algo próximo de implementar um sistema operacional portátil dentro de uma caixa — isto é, a plataforma web — e torná-lo compatível com as coisas que o Google decidiu adicionar ao próprio navegador
Navegadores têm um volume enorme de recursos e APIs, e acompanhar as mudanças constantes de funcionalidades e o domínio do Google é tão difícil que nem a Microsoft conseguiu. Um projeto pessoal relacionado é o Tersenet. https://github.com/runvnc/tersenet
Ele é mais um conceito, com quase nenhuma implementação, mas os requisitos foram escolhidos intencionalmente para que as pessoas consigam implementá-lo. É muito menos complexo que um navegador web completo. Também há uma discussão relacionada com o GPT-4. https://chat.openai.com/share/16d02b78-f876-4c87-949a-a60b4f...
O projeto Gemini, que existe de fato e é prático, também tem relação. https://geminiprotocol.net/ Ele inspirou a ideia do Tersenet
WebSQL, IndexedDB, service workers, WebGL, WebGPU, WebBluetooth, WebRTC e afins podem simplesmente ser tratados como inexistentes. 99% dos sites reais, aqueles que não são “apps” web, não perderiam funcionalidades
Pessoalmente, eu gostaria de ver mais motores alternativos além da monocultura do Blink e de seu parente WebKit, e além do Gecko/Quantum. Algo para ocupar o lugar que o KHTML tinha antes de ser absorvido pelo WebKit, ou simplesmente mais uma opção open source para experimentar
Seria bom se as muitas pessoas que concordam com essa ideia chegassem a um subconjunto que usariam, e eu ficaria satisfeito mesmo com um navegador que não fizesse tudo que o navegador do Google faz. Eu uso o uMatrix desativando boa parte dos recursos do Google, nunca coloco domínios google.com na lista de permissões, e sigo provando que o mundo não acaba por causa disso. Os sites que não funcionam são uma minoria relativa
A grande maioria dos sites não quer seguir tecnologias publicitárias recém-criadas especificamente para o Google, AMP, DRM e coisas do tipo
Talvez a Mozilla e outros precisem criar uma “VM” JavaScript independente que todos possam usar
Como alguém que decidiu escrever o próprio navegador sem saber absolutamente nada sobre como navegadores “de verdade” funcionam, inclusive criando um mecanismo de layout customizado, eu diria: simplesmente faça
Ver um site sendo renderizado pelo seu próprio código é extremamente gratificante, por mais bagunçados que estejam o código ou a saída. Meu projeto tem cerca de dois anos e meio e agora renderiza o HN e blogs simples de forma razoável. Se ele é objetivamente melhor que o w3m, que eu originalmente queria substituir? Não necessariamente, então ainda volto ao w3m para algumas tarefas. Mesmo assim, ele acabou sendo útil para trabalhos que eu nem imaginava, aprendi muito sobre programação, e é legal simplesmente ver que funciona. https://sr.ht/~bptato/chawan
Criar um navegador significa criar um motor de renderização e um motor de layout. Não é impossível, mas é uma tarefa bem grande.
Mas há muitas outras iniciativas com mais chance de dar frutos. Dá para portar o Servo para o Nyxt Browser, ou fazer um fork de WebKit/Servo/Gecko e remover os padrões web invasivos e prejudiciais ao usuário que empresas de publicidade injetaram nos últimos 10 anos. Se essas são coisas que você teria de fazer de qualquer forma ao criar tudo do zero, é melhor começar por uma comunidade existente que já esteja disposta a trabalhar junto do que começar do chão
O Gecko é praticamente a definição de um monólito, então é impossível remover a superfície de ataque; até o Tor usa um esquema ruim de substituição por stubs que quebra a cada mudança de API interna ou de bridge. Ainda assim, acompanhar o upstream sozinho é impossível, então são necessários contribuidores e mantenedores. Do ponto de vista de cibersegurança, documentei a superfície de ataque tanto quanto possível e anotei o trabalho restante e o que, no fim, precisa ser removido. https://github.com/tholian-network/retrokit/blob/main/SECURI...
Talvez eu esteja sendo bem subjetivo, porque quero usar o RetroKit como webview do meu Browser Stealth. O Browser Stealth funciona como proxy de filtragem, scraper e cache descentralizado. https://github.com/tholian-network/stealth No momento estou reescrevendo em golang
Ela precisa ser combinada com um motor de layout de texto como https://github.com/pop-os/cosmic-text, e ainda não dá suporte a todos os recursos. Entre os principais recursos atualmente ausentes estão
float,display: inline-block,box-sizing: content-boxeposition: static. Mas já dá suporte a Block, Flexbox e CSS Grid, e estamos adicionando maisÉ algo grande, sim, mas não chega a ser a coisa mais impossível para uma pequena equipe dedicada
Você pode começar renderizando sites HTML razoavelmente simples, não há pressa, e também não existe uma regra rígida dizendo que é preciso implementar todos os cantos do padrão. Navegadores web e a web são gloriosamente humanos
Se você pegar motores existentes, conectá-los e modularizar o suficiente para poder trocá-los a qualquer momento, ainda assim é um navegador de verdade. Pessoalmente, acho que as pessoas aqui se concentram demais nas engrenagens internas; na prática, além de renderização/layout/scripting, também precisamos de interfaces e outros componentes melhores
Torço por você. Continue tentando.
Implementei em Python uma parte minúscula do algoritmo ORC Solver e usei wxWidgets para renderização. Usei a API de intervalo de texto do wxWidgets para calcular a largura do texto. O white paper do ORC Solver está aqui. https://yuejiang-nj.github.io/Publications/2020CHI_ORCSolver...
Estou pensando em como implementar branch and bound, então seria bom ter informações relacionadas. Para ver algoritmos de composição tipográfica, acho que terei de estudar a base de código do TeX, e usar a biblioteca JavaScript Masonry para bin packing de layout também foi muito interessante
“Se querem meu HTML, eu lhes darei! Procurem! Deixei tudo que há no mundo lá”
“E assim os hackers partiram rumo à HyperText Line em busca de seus sonhos, e o mundo entrou na verdadeira Grande Era dos Navegadores!”
Durante anos acreditei que navegadores eram uma montanha intransponível, mas agora parece que cada vez mais pessoas acreditam que conseguimos fazer isso. Numa análise de 2 segundos, esse movimento aparece porque os novos criadores de navegadores não querem imitar e competir com os monstros gigantes existentes, mas sim mudar a web. Gosto disso
Sobre a parte política do texto: o mundo está quebrado, e é cansativo ler apenas notícias sobre coisas quebradas. Mas acho que se desligar da realidade e se tornar “apolítico” é desistir da humanidade — ou seja, desistir dos próprios filhos e sobrinhos, dos filhos dos seus melhores amigos.
Não é preciso mudar o mundo; pequenas mudanças na própria comunidade já bastam. Especialmente como programadores, o que criamos pode afetar milhares de pessoas no mundo inteiro e mudar rumos. Às vezes penso se a situação seria diferente se todos investissem apenas 3% a 5% do tempo em apoiar a comunidade e em algum tipo de atividade.
Nada do que eu leio nas notícias mudaria a forma como voto — e esse talvez seja, na verdade, o melhor motivo para acompanhar notícias.
Para colocar em palavras, eu desisti do mundo. Mas os filhos dos outros não são minha responsabilidade. Faço tanto quanto os outros para fazer “a coisa certa”, mas não mais do que isso. Antes eu me preocupava com essas coisas, tentava reduzir minha pegada individual e pensava em sustentabilidade e nas gerações futuras, mas perdi a esperança. Parecia lutar contra a maré. Hoje só tento garantir que minha pegada não seja maior que a média e tratar bem as pessoas ao meu redor.
Se Rust for obrigatório, acho que seria mais proveitoso aprender contribuindo com o Servo e começando com PRs pequenos. https://github.com/servo/servo
Dito isso, eu entendo, porque já fiz projetos “do zero” por achar difícil ler uma base de código existente ou por pensar que eu poderia fazer melhor. Cada um tem seu jeito.
Da mesma forma, o Servo foi projetado para substituir partes do navegador Firefox, então precisava se encaixar em buracos “com formato de Gecko”. Por exemplo, em vários lugares ele usa strings UTF-16 por compatibilidade com o restante do Firefox. Hoje, talvez fosse possível reescrever o Servo em Rust moderno para torná-lo menor, mais enxuto e talvez mais rápido.