Skip to content
View Ernest12287's full-sized avatar
πŸ˜™
Lets ship sth new
πŸ˜™
Lets ship sth new

Block or report Ernest12287

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Content in all repositories owned by your account will be closed.
Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
Ernest12287/README.md
Pease Ernest - Ernest Tech House

Typing SVG

WhatsApp Telegram Discord npm Email

Profile views


πŸ‘‹ Hey, I'm Ernest

I build things that most people look at and say "you can't do that." Then I do it, and then I write the documentation nobody asked for.

A year ago I was making websites. Today I'm writing a browser engine in C++. Somewhere in between, I got curious about how things actually work underneath, and I never recovered.

πŸ”­ Currently building LucyN, my own browser engine for Nothing Browser. Headless pipeline done, window + painter next
🌱 Currently learning Zig, harder C++, and how far down the rabbit hole goes
🧠 Philosophy Don't use the abstraction. Read the protocol. Go to the source.
🦸 Hero SaltyAom, creator of Elysia.js. Obsessed admirer, no shame.
😀 Toxic relationship I hate Bun. I use Bun. We're working on it.
🌍 Based in Kenya πŸ‡°πŸ‡ͺ

πŸ•³οΈ How I fell down the rabbit hole

flowchart LR
    A["🌐 Made websites"] --> B["πŸ€” How does JSX become HTML?"]
    B --> C["βš›οΈ Tried building a React-like thing: too hard, shelved"]
    C --> D["πŸ’¬ whatsapp-web.js and a pile of WhatsApp bots"]
    D --> E["πŸ•ΉοΈ Discovered you can control a browser and scrape"]
    D --> K["πŸ“‘ Learned Baileys, then wanted the direct way it talks"]
    K --> L["🎯 Rule of life: go to the source"]
    E --> F["🧱 Cloudflare: blocked, blocked, blocked"]
    F --> G["🐷 Built Nothing Browser on Qt6"]
    G --> H["😀 Injecting JS into Qt was painful"]
    H --> I["πŸ”§ Built my own engine: LucyN"]
    L --> I
Loading

πŸš€ What I've built

🌐 Nothing Browser

Does nothing... except everything that matters.

Qt6 C++ Chromium Latest release Platforms

A scraper-first browser for API reverse engineering, web scraping and automation research. Most browsers hide the web from you; this one exposes it.

Nothing Browser: scraper-first browser built on Qt6 + Chromium
Nothing Browser, Phase 1 (Qt6 + Chromium WebEngine)

  • πŸ” Full network inspector: every request, response, WebSocket frame, cookie and storage write
  • πŸ“€ One-click export to Python requests, curl_cffi, cURL, JS fetch or raw HTTP
  • 🎭 Engine-level fingerprint spoofing (UA, WebGL vendor, screen, hardware)
  • πŸ”Œ Community plugin system, in-app auto-updates, zero telemetry
Phase Engine Status
Phase 1 Qt6 + Chromium WebEngine βœ… Shipped (v0.1.9)
Phase 2 LucyN: my own engine, API and client πŸ”¨ In development, replaces the old automation library

πŸ“¦ Repo Β· πŸ“š Docs Β· πŸ“₯ Releases


πŸ‘» LucyN: the new phase of Nothing Browser

We don't care about beauty. We care about stealth, capture and truth.

C++ C QuickJS SDL2 libcurl Status

The next phase of Nothing Browser: my own engine, its own API and client, and everything around it, built from the ground up because injecting JS into Qt kept fighting me. It replaces Chromium and the old automation library. One goal: be invisible.

No Qt. No Chromium. No CDP. No remote debugging ports. No automation flags. No difference between headless and headful. The engine always presents itself as a real, human-operated browser, because as far as it's concerned, it always is. No multi-gigabyte toolchains either: Gumbo, QuickJS, stb and Mongoose live in the repo as plain vendored source.

libcurl ──▢ Moonbug ──▢ NULLBYTE ──▢ TinyElysia ──▢ Dashboard
 (fetch)    (capture)     (sign)       (serve)
    β”‚
    β–Ό
 HTML ──▢ Gumbo ──▢ DOM ◀──▢ QuickJS (DOM bridge)

Moonbug capture dashboard showing live requests, timing breakdown and wire-order headers
Moonbug, live: every request the engine makes, with timing and headers in wire order

βœ… Built and tested

  • πŸ•ΈοΈ Moonbug: LucyN is the HTTP client, so it captures decrypted traffic natively, with a DNS / connect / TLS / first-byte timing breakdown and headers in wire order. No MITM certs, no proxy, nothing a page can reach
  • πŸ” NULLBYTE: HMAC-SHA256 signing, so captured traffic can be proven untampered
  • 🧩 TinyElysia: HTTP + WebSocket server in C/C++ (Elysia-inspired, zero Bun), serving a live capture dashboard on localhost
  • 🌳 DOM + QuickJS bridge: document, fetch, XHR, cookies, timers and per-origin storage, enough to scrape JS-rendered pages with no pixels
  • πŸ’‰ LucyScript: userscripts injected through a shell page, with @run-at start|end, plus before/after DOM snapshots and diffs
  • 🎭 Identity profiles: one consistent "person" per session (UA, client hints, platform values, Chrome header order). Consistency beats randomness
  • ⬇️ Streaming downloads straight to disk, using the same identity and cookie jar
  • πŸ”Œ JS client over newline-delimited JSON on stdio: visit, extract, eval, click, waitFor, cookies and downloads. No TCP port, nothing the page can see
  • πŸ“¦ Portable by design: all data lives in nothing-data/ next to the binary. Delete the folder and the browser forgets everything

πŸ”¨ Coming next

  • πŸ‘» Ghostful Mode: no fake headless, just a real SDL window with the curtains drawn
  • πŸ–ΌοΈ SoftwarePainter, block/inline layout and basic flexbox
  • πŸ›‘οΈ Built-in ad blocker at the request layer, cookie persistence
  • 🧬 curl-impersonate TLS/HTTP2 fingerprinting (the dashboard honestly flags requests as NOT impersonating until it lands), fingerprint hardening and process isolation
import Lucyn from "nothing-browser";

const a = new Lucyn({ profile: "chrome", moonbug: true });

a.moonbug.onRequest(r => console.log(r.status, r.url, r.sig));   // the wiretap, from JS

const { status, title } = await a.visit("https://books.toscrape.com");
console.log(status, title);
await a.close();

The rendering promise: did it render? βœ… Is it pretty? πŸ’© Can I scrape it? πŸ‘»

Stealth is a measured result, not a claim: the test plan is tls.peet.ws, bot.sannysoft.com, CreepJS and BrowserLeaks, and every failing check becomes a ticket. Named after LucyN. She knows why. πŸ‘€


🎬 NothingMovieStore

Kotlin Android TMDB Status

Your midnight cinema, always open. A free Android app for movies, series and anime: adless streaming, offline downloads, a native video player, TMDB metadata, live channels, and weekly Saturday patches. Rebuilt from scratch in 100% native Kotlin because the old version kept crashing and I refused to ship something that falls over.

NothingMovieStore: Movie list NothingMovieStore: Home library NothingMovieStore: Movie details NothingMovieStore: Season details

🌐 Website Β· πŸ’¬ Telegram


πŸ› οΈ Tech I use

Systems and languages
Tooling
Backend


πŸ“Š Stats

GitHub stats

Contribution snake


Thanks for visiting
Part of the Nothing Ecosystem Β· Built in Kenya πŸ‡°πŸ‡ͺ

Pinned Loading

  1. Ernest-V2 Ernest-V2 Public

    bot

    JavaScript 5 10

  2. BunElysiaReact/BERTUI BunElysiaReact/BERTUI Public

    Lightning-fast React dev server powered by Bun and Elysia

    JavaScript 14 3

  3. BunElysiaReact/Bunnyx BunElysiaReact/Bunnyx Public

    The Bridge Between BertUI and Elysia

    TypeScript

  4. ernest-tech-house-co-operation/nothing-browser ernest-tech-house-co-operation/nothing-browser Public

    nothing browser headless library

    JavaScript 28 2

  5. react-native-torrent-streamer react-native-torrent-streamer Public

    Forked from ghondar/react-native-torrent-streamer

    Torrent Streamer for react-native

    Java 1