mgbrowser
Burning magnesium periodic-table tile: 12, Mg, 24.305

v0.9.33 Experimental Preview · Source preview

mgbrowser

A browser written from the ground up in Rust.

Linux x86_64 · X11 / XWayland · glibc 2.35+ · No Rust toolchain needed

curl -fsSL https://mgbrowser.org/install.sh | bash

Modern-web compatibility is poor. This is a technology preview, not a daily browser. Do not use it for banking, sensitive authenticated browsing, or arbitrary hostile websites.

v0.9.33 source preview: Correct rounded rendering while scrolling and downloaded font base selection. Search/sign-in backgrounds and tiny metadata separators keep their intended height after scrolling, including fractional display scale. Italic-first font stylesheets no longer make ordinary text italic; inline nowrap navigation labels keep one line. Same-input Google News comparisons at 1280×800 and 1024×768 confirm compact headers; full real-site visual acceptance remains in progress. Scope and limits ↗

v0.9.31: Beacon API, WebIDL host method-override/expando semantics, Navigation Timing & Annex B compatibility. W3C navigator.sendBeacon(url, data?) (<= 64 KiB HTTP/HTTPS validation across strings, URLSearchParams, and BufferSource), WebIDL mutable operation overrides and expandos across navigator/console/history/DOM wrappers while preserving read-only IDL data attributes, performance.timing & performance.navigation, ECMA-262 Annex B String.prototype.substr/trimLeft/trimRight and Date.prototype.toGMTString, and same-origin iframe.contentWindow intrinsics. Scope and limits ↗

v0.9.30: Responsive CSS Grid, shadows/gradients/transforms, HTML5 Canvas 2D, ES modules, Wikipedia sprite/JS parity & desktop session UX. Named CSS Grid lines ([line-name]), fit-content(), and repeat(auto-fill | auto-fit, ...) (rendering MDN Web Docs in full styled layout), generalized min-content/max-content/fit-content box sizing, box-shadow & text-shadow Gaussian blur, multi-stop (2..=16) linear/repeating-linear/radial/repeating-radial gradients, 2D transform, clip/clip-path: inset(... round ...), color: transparent text alpha, CSS background-position/size sprite clipping, SVG <style> + internal <use href="#id">, and text-overflow: ellipsis — advancing honest WPT static reftests to 558 PASS / 391 FAIL / 62 UNSUPPORTED of 1,011 (+17 passes, 0 losses) with 16/16 files (79/79 subtests) on the Window lane; pure-Rust HTML5 <canvas> 2D engine (Path2D, transforms, gradients, shadows, compositing, bitmap text, ImageData, LZ77+Huffman PNG toDataURL/toBlob, and live DOM pixel projection); browser-hosted ES <script type="module">, window.Image, 2,048 browser listeners, MutationObserver, ResizeObserver, IntersectionObserver, and CustomElementRegistry (window.customElements); @font-face unicode-range subset filtering, large-page (> 1 MiB) CDP utility worlds (news.google.com, en.wikipedia.org), zero-diagnostic Wikipedia portal rendering (www.wikipedia.org), and honest Linux desktop User-Agent (www.npr.org); plus independent per-tab page zoom (25%..=500%, Alt+=/Alt+-/Alt+0, Ctrl+MouseWheel), persistent 0o600 localStorage, and tab session snapshot & restore. Scope and limits ↗

v0.9.29: Pinned Playwright 1.58.2 automation, HTTP decompression, cross-origin/@import CSS & real-site compatibility. Unmodified playwright-core 1.58.2 passes across both chromium.connectOverCDP (HTTP + WebSocket) and chromium.launch (--remote-debugging-pipe + --headless), with real Target.setAutoAttach, isolated utility worlds even under --disable-scripts, locator fill/click, screenshots, HTTP 404 response events, and download streaming; pure-Rust HTTP gzip/deflate/br decompression, responsive <picture>/srcset and data:image/* decoding, credential-free cross-origin HTTPS <link rel="stylesheet"> and bounded @import loading; legacy -moz-border-radius aliasing and Chromium-aligned DevTools Console css-parse filtering; Stylo style="..." and xmlns:xlink on inline <svg> with large-viewBox and viewBox-only container-width sizing; CSS Grid grid-template-areas / grid-area 2-column desktop layout (Wikipedia Vector 2022), inline position: relative containing-block fallback, and flex-item BFC float isolation (lobste.rs); plus Annex B <!--/--> script comments, DOM wrapper expandos, reflected HTML attributes, document.currentScript, document.write, and blank/srcdoc <iframe> subdocuments. Scope and limits ↗

v0.9.28: HTML forms, interactive controls & modern DOM/Web Platform APIs. Standalone and form-associated controls (checkbox, radio, <select> dropdown popup, <button>, <textarea>, <label>, <details>, <dialog>, <div onclick>); Stylo CSS3 querySelector/querySelectorAll/matches/closest and CSS.supports; DocumentFragment, DOMParser, outerHTML, insertAdjacentHTML, { capture, once, passive, signal }, AbortController, and CustomEvent; URL, URLSearchParams, TextEncoder/TextDecoder, atob/btoa, ChaCha20 crypto.getRandomValues/randomUUID, performance.now, setInterval, requestAnimationFrame, queueMicrotask, structuredClone, and matchMedia; live getComputedStyle & getBoundingClientRect/scrollTo; localStorage/sessionStorage, HttpOnly-isolated document.cookie, history.pushState/replaceState/popstate, and parent-brokered same-origin fetch() & XMLHttpRequest over the seccomp-confined VERSION = 9 page worker. Scope and limits ↗

v0.9.27: CSS layout fidelity, rounded corners, Appendix E stacking & +189 WPT passes. Anti-aliased border-radius rendering and rounded overflow clipping, full CSS 2.1 Appendix E stacking contexts and z-index paint order, position: absolute hypothetical static positions across block/inline/flex/grid and position: sticky clamping, direction: rtl, CSS Sizing 4 aspect-ratio, flex/grid calc(% + px), CSS 2.1 float/clear, overflow: auto | scroll and table-cell clipping, general ::before/::after pseudo-elements, visibility: collapse, and CSSOM container-query length units — advancing honest WPT static reftests from 339 to 528 PASS / 421 FAIL / 62 UNSUPPORTED of 1,011 and WPT Window parsing to 16/16 files (79/79 subtests). Scope and limits ↗

v0.9.26: Desktop browser UX, Omnibox, Find in Page, persistent History & Downloads. Omnibox URL/search classification (DuckDuckGo, Google, Wikipedia) with live autocomplete dropdown; built-in chrome://newtab, chrome://history, chrome://bookmarks, chrome://downloads, chrome://settings, and chrome://version pages; Find in Page (Ctrl+F / F3 / Shift+F3) with match highlights and scroll-into-view; persistent user-local Browsing History (Ctrl+H) and Clear Browsing Data (Ctrl+Shift+Delete); pure-Rust File Downloads (Content-Disposition: attachment, <a download>, Ctrl+S Save Page, Ctrl+J); toggleable Bookmarks Bar (Ctrl+Shift+B); Hard Reload (Ctrl+Shift+R), Stop Loading (Escape), and View Page Source (Ctrl+U); plus Ctrl+Shift+T Reopen Closed Tab, Ctrl+N New Window, Ctrl+1..9 tab jump, middle-click background link open & tab close, tab-strip context menu, mouse buttons 8/9 Back/Forward, and F11 fullscreen. Scope and limits ↗

v0.9.25: App-wide X11 clipboard, text selection, and Cut / Copy / Paste. Pure-Rust X11 CLIPBOARD and PRIMARY selection ownership and retrieval across every surface: click/drag or Ctrl+C / right-click on DevTools Console rows to copy full untruncated JS errors and stack traces (plus copy() sync); full cursor/selection editing, Cut/Copy/Paste, and middle-click PRIMARY paste in the > REPL, DevTools inputs, Address bar (Paste and go), and page <input> fields (with strict password-field copy/cut protection); drag/double-click/Ctrl+A text selection and Ctrl+C copy on web pages; and copy actions across Elements, Sources, Network, Performance, Application, and About. Scope and limits ↗

v0.9.24: Six-panel Chromium-style DevTools workspace. Built-in Elements (Styles, Computed, Box Model, live element.style DOM/CSS editing), Console (19-method console.* API in the isolated Boa worker, interactive > JS REPL, Command Line API $_, $0..$4, $$(), table(), copy(), inspect(), inline object trees), Sources, Network (4-tab Headers/Response/Preview/Timing inspector with secret redaction, Disable cache, Preserve log), Performance (64-frame 60 FPS sparkline), and Application (session cookies, TLS/sandbox security, resources), with Right/Bottom docking, draggable splitter resize, and interactive Element Picker (↖ / Ctrl+Shift+C). Scope and limits ↗

v0.9.23: Google News interactive links/scroll, script-admission preflight, and WOFF/WOFF2 web fonts. Oversize documents (> 1 MiB wire HTML or > 4,096-byte URL) cleanly skip default-mode script worker startup so Google News scrolls, clicks links without SCRIPT_* errors, and renders 12-column /stories/ (Full coverage) pages in full styled layout; pure-Rust WOFF1/WOFF2 @font-face decoding with synthetic bold/italic renders downloadable web fonts on sites such as badge.nyx.ms and sl.ush.fund. Scope and limits ↗ · Contract ↗

v0.9.22: Google News visual parity and styled Topic destination. Outer-box linear calc(percent + px), empty-element :before background images, multiplied subtree opacity, borderless input control painting, Material icon ligatures (chevron_right to ›), and positioned/stacking/grid-measurement optimizations render both the Google News homepage and the 9,997-node Headlines Topic destination page in full styled layout without fallback across 1280x800, default 1100x727, and 1024x768 viewports. Scope and limits ↗ · Contract ↗

v0.9.21: native target control. CDP creates, activates and closes real native tabs through the existing workspace owner, with genuinely empty blank documents and explicit failures for unsupported options. Published as v0.9.21 at 321e1e87e47e76102d5cc3a4d010acc24d3eff72. All eight required exact-source CI/hosting checks and normal tagged publication pass. The command above delivers v0.9.21: public install/reinstall, actual v0.9.20 update/no-op, thirteen native helpers, two Runtime proofs, the new Target proof, eight layout proofs and both frozen worker suites pass. All58 additive public images were inspected. Both reviewed WPT scores remain unchanged. Autoattachment and ordinary Playwright remain unsupported. The high-severity undici build-tool dependency alert remains unresolved. Scope and limits ↗ · Public closeout ↗

v0.9.20: worker-backed Runtime. Bounded main-world evaluation, real closure/object handles, own-property inspection and release use the existing restricted page worker. Published as v0.9.20 at 28413873dc1c19cae537af9158899760c40dc7f7. All eight required exact-source CI/hosting checks and tagged publication pass. That public installer verification delivered v0.9.20: install/reinstall, actual v0.9.19 update/no-op, thirteen existing native helpers, two Runtime proofs, eight layout proofs and both frozen worker suites pass. All50 additive public images were inspected. Both separately reviewed WPT scores remain unchanged; no general Playwright compatibility is claimed. A separate Dependabot build-tool update failed security_update_not_possible; the undici constraint remains unresolved, not a passing check. Scope and limits ↗ · Public closeout ↗

v0.9.19: auto-width inline heights. Inline-block/flex/grid lines account for their real child allocation, enclosing borders and following flow. Existing width selection, percentage-height definiteness, struts and limits stay fixed. Published as v0.9.19 at 9179426360904f01ab3b4394f7699c7ba4c70da9. Full Rust/JSPLAN, both reviewed WPT lanes, all eight required exact-source CI/hosting checks and tagged publication pass. Public install/reinstall, actual v0.9.18 update/no-op, thirteen existing native helpers, eight additive native/CDP proofs and both frozen worker suites pass; all36 additive public images were inspected. That installer verification delivered v0.9.19. A separate Dependabot build-tool update failed with an unresolved dependency constraint. Scope and limits ↗ · Public closeout ↗

v0.9.18: scripted empty links. Painted anchors no longer need text to follow their post-handler href and document base. The selected URL is checked before DOM edits and observer results commit; cancellation, forms and existing limits are preserved. Published as v0.9.18 at 0d79fa66ae3e91de7aaf2c868f09589a3f898312. Exact-source CI/site, release assets, checksum-verified public install/reinstall and an actual v0.9.17 upgrade/no-op pass. Thirteen existing public native helpers, six additive native/CDP proofs and both frozen public-worker suites pass; all 28 additive public images were inspected. That public installer verification delivered v0.9.18; the command follows the latest published release. Scope and limits ↗ · Public closeout ↗

v0.9.17: declaration editing methods. Modern element.style.setProperty, removeProperty and getPropertyPriority use the existing Rust declaration parser and real DOM attribute. Published as v0.9.17 at 6b3c36f37aaa33bc2941d7a5bfa1eed2d48cc73b. Exact-source CI/site, release assets, checksum-verified public install/reinstall and an actual v0.9.16 upgrade/no-op pass. Thirteen existing public native helpers, all four separate geometry/method native/CDP proofs and both frozen public-worker suites pass; all sixteen additive public images were inspected. That public installer verification delivered v0.9.17. These methods do not complete CSSOM or add WPT passes. Scope and limits ↗ · Public closeout ↗

v0.9.16: definite-width atomic inline sizing. Ordinary inline-blocks and normal-flow inline-flex/grid containers share outer allocation: padding, borders and signed margins count once; percentages use the containing width, and definite overflow keeps its width. Inner flex/grid formatting and baseline algorithms are unchanged. Published as v0.9.16 at 8ce13a3786501b376dbd594b07cacfddf3d604f6. Exact-source CI/site, checksum-verified public install/reinstall and actual v0.9.15 upgrade pass. Both frozen public-worker suites, thirteen existing native helpers and physical/atomic 1x/2x native/CDP proofs pass, with all twelve layout images inspected. The installer selects the latest actually published release. Public closeout ↗ · Scope and limits ↗

v0.9.15: physical flex/grid left/right placement. Published as v0.9.15 at 7e13cca45c525921a5072a00eab658cf2782d4e9. Local regressions and the separate reviewed score lanes retain two additional original reftest matches. Exact-source CI/site, public install/update, existing native/CDP helpers and the separate public physical-layout proof are verified. See the public closeout. The installer selects the latest actually published release. Scope, evidence and limits ↗

Current compatibility targets. Real reddit.com and news.google.com should load and look as expected. Faithful signed-out desktop reading comes first, with same-input reference comparisons and fresh public-binary navigation. Neither target is complete. Acceptance criteria ↗

Measured standards progress. The full-cohort gate retains the initial 24 passing WPT flexbox reftests and the complete pinned 1,011-test selection below, including failures and unsupported cases. Scores are freshly measured on every commit; a larger corpus is not a browser improvement. Authored error/timer/rejection/message/lifecycle controls add no upstream or JavaScript testharness passes.

v0.9.6 corrects bounded classic external script loading and shares resource admission across CSS, fonts, images and scripts. The Performance Dashboard reports completed browser paints, actual cache reuse and retained payload. Frame/style snapshots share immutable storage and render uncached above their 16 MiB/8 MiB payload bounds. These are per-Browser cache limits, not total memory ceilings or a scrolling-speed guarantee. Performance scope ↗

Hover links to preview destinations in the bottom-left status strip; right-click or Ctrl+click links to open in a new tab. Right-click Inspect element, press F12 for diagnostics, or press Ctrl+Shift+P for Performance. Use mgbrowser --profile <URL> for a headless report. Ctrl+T opens a tab; drag tabs into windows or left/right groups. Themes, sizing, bookmarks and update progress with Restart now remain.

Run the command once to get automatic updates. Installed builds check on startup and daily; restart to use a new version. Menu → About shows version, compile time and commit. Use --no-auto-update to disable background checks. HTTP pages keep a red title/address strip in both themes; Ctrl+L selects the location. Pure-Rust Boa ECMAScript runs inline and classic external page scripts by default (use --disable-scripts to opt out).

Measured compatibility

Web Platform Tests

The complete reviewed v0.9.32 and current-source measurements retain static coverage at 558 PASS / 391 FAIL / 62 UNSUPPORTED of 1,011 (all 558 protected passes and 949 runnable cases preserved), while the separate Window lane passes 16 / 16 files and 79 / 79 final subtests (100%). Neither lane is full browser conformance or a score run on the installed binary.

558 / 1011 selected tests passing

Fail: 391 · Unsupported: 62 · Errors: 0 · Timeouts: 0 · Crashes: 0.

A pinned flexbox reftest selection using the real Rust browser navigation, resource and rendering path. This is a selected subset, not the full Web Platform Tests suite or JavaScript testharness coverage. These are current-source measurements, not a score for the installed release.

Pages reruns this selection and checks the recorded score before publishing a commit. Unsupported cases stay in the denominator.

Method and limitations ↗ · Full results and tested commit ↗

Reproducibility fingerprints

Upstream WPT: 84daed4ae966d9624bed22f43587c79283ad1fea

Corpus SHA-256: d8c4bd6aacd93d964c10302e63b9c42576d785a055848772f9f71b2436f8075d

Browser source SHA-256: f193392c2fc0aa19a74e545dcac65599811032891fa68508c6eee713c72861b9

Separate Window parsing tests

16 / 16 selected Window files passing

File outcomes: Fail: 0 · Timeouts: 0 · Precondition failed: 0 · Unsupported: 0 · Errors: 0 · Crashes: 0 · Pending: 0.

Observed final subtests: Pass: 79 / 79 observed final rows; Fail: 0 · Timeouts: 0 · Not run: 0 · Precondition failed: 0.

Final inventories observed for 16 / 16 files. Every selected file has an observed final inventory. Source-declared calls: 79; this is not a result denominator. Result prefixes without Completion are not counted as final inventory.

A fixed upstream flexbox declared-value parsing cohort using the real Browser and unchanged Window testharness. These are current-source measurements, not a score for the installed release. The separate static reftest selection is not added to these totals. This is not the full WPT suite or complete Window compatibility.

Window method and limitations ↗ · Full Window report and tested commit ↗

Case artifact paths and hashes in that report identify retained CI evidence; those paths are not public URLs.

Window reproducibility fingerprints

Upstream WPT: 84daed4ae966d9624bed22f43587c79283ad1fea

Window manifest SHA-256: 5223099747ed3b1669f311faa5007abb2c037bebb90aa7411b67c6470b4518d0

Evaluated source SHA-256: 435f6d7c83f8251cc31dd247e17faff05216576f43e576f9c41249294809573e

The historical first baseline failed at missing style.getPropertyValue(), before CSS comparisons. The v0.9.14 declaration bridge improves the unchanged selection to fifteen passing files and 77 passing final subtests; two flex-valid sign/container-unit calc assertions remain failing. The genuinely cold CI build and separate exact-source reports retain the existing limits and full inventories.

Try the browser we have

Small. Original. Experimental.

Own HTML parsing, measurement and rendering, with Rust Stylo for CSS and Taffy for bounded flex/grid sizing. PNG/JPEG/GIF and restricted static SVG images use Rust codecs. Verified HTTPS with experimental RustCrypto TLS. Pure-Rust Boa JavaScript runs in a restricted child process by default; partial CDP controls real browser input.

The installer checks SHA-256, installs to ~/.local/bin without sudo, and adds an Mg desktop launcher. Try mgbrowser https://news.google.com/ or Hacker News.

A few practical details

Open a page.

Run inside an X11 or XWayland desktop. A DejaVu or Liberation font is required; otherwise set MGBROWSER_FONT to a TrueType/OpenType font file. Follow the installer’s PATH instruction if shown.

Ctrl+L edits the address, Enter navigates, Tab moves between fields, Alt+Left goes back. Use --help for options. Developer guide ↗

Reusable Rust components

Butane. Sparkle. Chassis.

Butane embeds Boa with bounded execution policy and preserves our original interpreter as a test baseline. Sparkle handles HTML, DOM, layout and painting. Chassis brings browser services and optional controls; mg-browser supplies the desktop and platform integration.

The libraries have standalone examples and support rendering without a window. V8/WebKit drop-in compatibility, Tauri integration and a ThermiteOS port remain future work. Architecture and embedding guide ↗

The Butane JavaScript plan ↗ remains a longer roadmap. Boa now executes inline, classic external, and browser-hosted ES module (type="module" + importmap) page scripts under an explicit process-contained profile ↗. Comprehensive cooperative resource control, cross-origin dynamic module graphs, and full React/Vue browser applications remain open. The initial experiment results ↗ remain separate evidence.

Read before browsing

Known limitations

Research and validation

Implementation and evidence

Feature contracts, daily logs and reusable agent skills keep experiments reviewable. The proposed autoresearch evaluator, broader CSS/images and full CDP remain future work. This preview does not complete the formal Linux MVP gates. The bounded typed Window observer has separate worker and Browser acceptance; continuous static and Window scoring use separate current-source reports and manual ratchets.

v0.9.14 adds parser-backed modern style declarations. Focused declaration, binding, quota/fatal and fresh/retained-worker checks and full local debug/release regressions pass; the frozen JSPLAN comparison retains all 364 reviewed outcomes. The independently reviewed Window measurement reports 15/16 passing files and 77/79 passing actual final subtests, with two assertion failures retained in flex-valid.html. Its manually strengthened ratchet protects the fifteen passing files. Input bytes and resource limits remain unchanged. See the dated log for separate publication, public install/update and native/CDP verification. Full CSSOM, Window readiness and F-016/F-026/MVP remain open. CSSOM scope and deferred interfaces ↗

v0.9.15 adds bounded physical justify-content:left/right placement. The complete unchanged static cohort gains only two genuine column-case reference matches: 319 pass, 630 fail and 62 unsupported of 1,011. All old passes and runnable cases remain protected; the five other initially targeted cases still fail pixel comparisons. Explicit Safe/reversed-flex, RTL/writing-mode and viewport limitations remain. New authored controls do not enter either upstream denominator. Physical alignment contract ↗

MVP plan · Queued lifecycle contract and scope · Observer scope and evidence · Contribute

Built in the open

Evidence over promises.

Modern page, Promise, retained-event and GC/lifecycle tests accompany the Boa integration. The original engine's assertions and 26 native/26 CDP fixture journeys remain a separate research baseline. Exact release and public-install receipts live in the dated work log; local fixtures are not broad web compatibility.

Feature specification · Daily logs · Skills

Our collaboration workflow draws from Recurse.

Project status

Latest work log: . Status comes from the repository’s feature specification.