Northstar Browser 1.0.8 released!
Today, 16 September 2026, we are pleased to announce the release of Northstar 1.0.8. Northstar is the free-software edition of the Nordstjernen project: a single-window, single-page, single-process desktop browser built from the same clean-room C engine, licensed under the GNU General Public License, version 3 or later. It runs on Linux, macOS and Windows.
This is the largest CSS release the engine has had. Transitions and animations run on every property and are driven from script through a Web Animations surface, border-image is implemented, the background and border shorthands are parsed and serialized the way the CSSOM specifies, position: fixed stays anchored to the viewport, flexbox and grid layout are rebuilt against their specifications, and text selection finally highlights the text it is on. Across the same 37 css/ areas of the Web Platform Tests, the engine goes from 42,482 to 46,653 of 68,725 subtests.
Northstar Browser version 1.0.8 is available now as a source release. Read the full release notes here, or jump straight to the downloads.
It ships alongside Nordstjernen 1.0.24, the source-available flagship built from the same engine.
« About the Northstar Browser · Back to nordstjernen.org
about:start page — the sky-and-earth splash introduced in 1.0.7, with a scattering atmosphere and a settled earth below it. more screenshots »highlights
- Transitions and animations run on every property. The animation engine keeps one run per
animation-nameentry, so an element plays several@keyframesanimations at once, each with its own duration, delay, timing function, iteration count, direction, fill mode and play state; lengths, percentages,calc()mixes, numbers, colours, shadow lists and transform lists interpolate, and the in-flight value shows ingetComputedStyleand drives layout. Theanimationandtransitionlonghands are real properties, and the shorthands parse per comma-separated item against their full grammar. WPTcss/css-transitionsgoes from 149 to 2282 of 2504 subtests, andcss/css-animationsfrom 191 to 803 of 976. - A Web Animations surface.
Element.animate()drives the same keyframe runs from script, anddocument.getAnimations()andelement.getAnimations()returnCSSTransitionandCSSAnimationobjects withcurrentTime,startTime,playState, thereadyandfinishedpromises, andplay,pause,finishandcancel.animationstart,animationiteration,animationend,transitionrun,transitionstart,transitionendand the cancel events fire by phase. border-image, and shorthands the CSSOM can read back. The fiveborder-imagelonghands parse against the css-backgrounds grammar and paint draws the nine-slice border from aurl()image or a gradient, soborder-image: linear-gradient(…) 1, the common gradient-border idiom, shows a gradient frame. Thebackgroundshorthand is parsed layer by layer, every layer setting all eight longhands andbackground-attachment: fixedpositioned against the viewport.style.border,style.background,style.borderRadiusandcssTextare rebuilt from their longhands in canonical order. WPTcss/css-backgroundsparsing:background-*168 → 330 of 350,border-*-shorthand27 → 89 of 96,box-shadow-*25 → 82 of 82;css/css-transformsparsing 190 → 318 of 336.position: fixedstays anchored to the viewport. Layout placed fixed elements against the initial containing block and nothing translated them by the scroll offset, so a fixed header, cookie bar or modal overlay scrolled away with the document. Paint now offsets a fixed box by the viewport origin, hit-testing applies the same offset so clicks land on it, and mouse events carry viewport-relativeclientX/clientY.position: stickyboxes are hit-tested where they paint.- Flexbox and grid rebuilt against the specifications. Flexible lengths resolve the way css-flexbox-1 §9.7 describes, column containers wrap, and the automatic minimum size of a flex item is what browsers use, taking WPT
css/css-flexboxfrom 1465 to 1997 of 3670. Absolutely positioned boxes inside a grid take their containing block from the grid lines,repeat(auto-fit)collapses empty tracks,rtlgrids lay out from the right, andgetComputedStylereports used track sizes. - lexbor v3.0.1, whose URL parser no longer loses the prefix of a long path, query or host; and three memory-safety fixes described below.
layout and CSS
- A table’s max-content and min-content widths are measured column by column, as css-tables-3 §4.4 requires: each column takes the widest cell it holds, the columns are summed once with the border spacing, and captions widen the result. They used to be the sum of every row, so a table nested in a cell, a floated infobox and a table inside a flex or grid item reported several times their real width.
transformis validated function by function against css-transforms, and thescale,rotateandtranslateproperties,transform-origin,perspective-originandtransform-boxfollow their grammars and serialize canonically.- A colour in the specified style serializes the way CSS Color 4 requires, and the deprecated CSS2 system colours map to their CSS Color 4 replacements.
box-shadowandtext-shadowserialize in canonical order and reject the forms the grammar excludes. - Gradients are parsed against the CSS Images 4 grammar;
image-set()is validated option by option; thecontentproperty,font-family,background-positionandobject-positionvalidate and serialize canonically; container queries evaluate the full condition grammar; andattr()substitutes at cascade time on every property, per css-values-5. stretch,-webkit-fill-availableand-moz-availableare real sizing keywords; grid items with horizontal margins are no longer too narrow by their margin sum; a canvas element’swidthandheightattributes map toaspect-ratio; and an absolutely positioned box with both insets set honoursjustify-selfandalign-self.@propertyhonours itssyntaxdescriptor andCSS.registerPropertyexists, with a registered property computing its value; viewport units inside a frame measure that frame; nested style rules are exposed through the CSSOM withCSSStyleRuleinheriting fromCSSGroupingRule; and the CSS tokenizer decides what starts an identifier the way CSS Syntax does. A hang in the CSS parser on an at-rule inside a declaration list is fixed.- The page itself snaps.
scroll-snap-typereached 1.0.7 on scroll containers only; the document scroller now snaps too, from the wheel, the scrollbar and the keyboard, withscroll-paddingon the root insetting the viewport snapport.
the browser
- Text selection that behaves. The highlight is drawn where the text is drawn, so it follows scroll offsets, transforms and clips, and goes down before the glyphs so
::selectioncan carry an opaque background.user-selectand::selectionare read from where the style is; copied text reads like the page; double-click selects a word and triple-click the block; andgetSelection(),execCommandandclipboard.writeTextreach the real selection and the system clipboard. - The user decides what runs. An Enable JavaScript toggle in Settings parses pages with scripting disabled, so
noscriptcontent renders, and skips script execution entirely. Popup blocking follows Firefox 1:window.openonly navigates within five seconds of a real user gesture. - The classic browser, restored.
view-source:withCtrl+U;Ctrl+Enter,Shift+EnterandCtrl+Shift+Entercompleting a bare name to.com,.netand.org;Ctrl+Shift+RandCtrl+F5reloading past the cache;Ctrl+Dbookmarking the page; the status bar reading Done;about:mozilla,about:configandabout:book. - Forms and the DOM follow the specification. When several options of a single-choice
<select>carryselected, the last one wins;showPicker(),stepUp(),stepDown(), label association and constraint validation follow the HTML spec; liveHTMLCollectionandNodeListsemantics follow WebIDL;document.getElementByIdrespects shadow boundaries; and every dispatched event carries acomposedflag. - A faster DOM. Lazy
composedPath(), node-level listener filtering, fast paths forcreateElement, attributes,classList,textContentand simple-selectormatches()andclosest(), and subtreegetElementByIdthrough the document’s id index.
memory safety
- lexbor v3.0.1, up from v3.0.0. A URL component longer than its stack buffer was copied into fresh heap storage without the bytes already written, so a long path, query or host could lose its prefix; IDNA conversion had the same missing copy, an unfinished
:contains()selector could be freed twice, and the multi-byte decoders now stop at the end of a full output buffer. - Fixed a use-after-free in the
MutationObserverdelivery loop: the job queued raw observer pointers, so a callback that disconnected and dropped a later observer left the loop calling through freed memory. The queue now holds a reference on each observer for the duration of the drain. - Fixed a use-after-free of the session URL when a timer, event or
requestAnimationFramecallback navigated.OfflineAudioContext.startRendering()bounds the graph walk so a node wired into its own inputs cannot hang the browser. A read past the end of a linked stylesheet’s bytes is fixed. - Raw pointers into page-owned
ArrayBuffers are no longer held across a call back into JavaScript:putImageData,AnalyserNode’s byte getters and theAudioBufferSourceNoderenderer fetch the backing bytes last, so a getter that transfers or resizes the buffer meanwhile cannot leave the engine writing through a freed pointer — the type-confusion class behind CVE-2026-85046. docs/cve-2026-85046.md records why that CVE does not apply to Northstar; see also the analysis on this site.
web platform tests
Third pass of 1.0.8, over the same 37 css/ areas with a 6-second timeout: 42,482 → 46,653 of 68,725 subtests. css/css-transitions 149 → 2282 of 2504, css/css-animations 191 → 803 of 976, css/css-sizing 745 → 1320 of 2444, css/css-align 3025 → 3247, css/css-values 3599 → 3739, css/css-lists 136 → 256 of 274, css/css-overflow 300 → 365, css/css-nesting 20 → 84 of 117, css/css-easing 32 → 84 of 156, css/css-position 267 → 297, css/css-flexbox 1465 → 1997 of 3670, css/css-tables 330 → 334 of 787. The full table is in docs/compliance.md.
known limitations
- Web Audio renders mono, and
AudioParamautomation curves are ignored — a parameter reads as its current value for the whole render. - The stop button ends the loading state and marks the frame stale, but does not abort the network request behind it.
<video>plays MPEG-1 only. There is no MPEG-4 or H.264 decoder, and no Media Source Extensions, so streaming video sites do not play.- Flex layout is horizontal-only: vertical writing modes are not covered.
about Northstar
Free software. Northstar is licensed under the GNU GPL, version 3 or later — use it, read it, change it, share it.
One process, one page. All rendering happens in a single compact process — about 160,000 lines of original C, excluding the vendored WAMR, Wuffs and audio decoders — prioritizing auditability. On Linux it runs behind a Landlock filesystem sandbox (plus PR_SET_NO_NEW_PRIVS) with a default-deny seccomp syscall filter. No JIT.
Standards-first. The same engine lineage as Nordstjernen: lexbor v3.0.1 for HTML/CSS, quickjs-ng v0.16.2 for JavaScript, ns-pango for text, WAMR for WebAssembly, Wuffs for image decoding. Modern CSS (flex, grid, transforms, transitions and animations, gradients, scroll snap, container queries), Shadow DOM, custom elements, the Navigation API, service workers and WebExtensions. Behaviour is measured against the spec text, section by section.
What it leaves out. Compared with Nordstjernen: no multi-window browsing, no per-tab renderer processes, no WebGL or WebGPU, no embedded PDF viewer. Audio playback (MP3, MP2, Ogg Opus/Vorbis) is included, and video is MPEG-1 only — an ISO standard whose patents have expired, so it costs no dependency and no licence, but also not a format the modern web serves.
It sends no telemetry and no update pings, and includes no AI-style web APIs.
Read the full Northstar documentation, or see the comparison of Nordstjernen and Northstar on the home page.
news
16 SEP 2026 ·
Northstar 1.0.8 released — transitions and animations on every property with a Web Animations API, border-image, the background shorthand parsed layer by layer, position: fixed that stays put, and lexbor 3.0.1.
Release notes »
16 SEP 2026 · Nordstjernen 1.0.24 released — flexbox and grid rebuilt against the specifications, the page itself scroll-snaps, printing in process-per-tab mode, text selection that behaves, and a painted about:start. Announcement » · Release notes »
8 AUG 2026 · Northstar 1.0.7 released — printing, a rebuilt about:start sky and earth, CSS Scroll Snap, frames that talk to their parent, and quickjs-ng 0.16.1. Announcement » · Release notes »
8 AUG 2026 ·
Nordstjernen 1.0.23 released — printing with @page and print stylesheets, correct offsetLeft/offsetTop, CSS Scroll Snap, and quickjs-ng 0.16.1.
Announcement » ·
Release notes »
31 JUL 2026 · Northstar 1.0.6 released — a rebuilt grid, an indexed CSS cascade, faster text through ns-pango, Web Audio that renders, and relative colour syntax. Announcement » · Release notes »
28 JUL 2026 · Northstar 1.0.5 released — in-engine SVG, WebP/APNG, MPEG-1 video playback, and much better HTML, CSS and JavaScript compatibility. Announcement » · Release notes »
download
Latest tagged release: Northstar 1.0.8 — released 16 September 2026, as source. full release notes »
| Source | 1.0.8.tar.gz · 1.0.8.zip |
|---|---|
| Binaries | The most recent prebuilt packages — a Windows zip, a portable Linux zip, an AppImage and a Debian package — are from Northstar 1.0.7. |
| macOS | build from source with meson — see the build instructions |
| All releases | github.com/nordstjernen-web/northstar-browser/releases |
To build 1.0.8, unpack the source archive and follow the
build instructions — on Debian or Ubuntu that is
the listed development packages, then meson setup builddir and meson compile -C builddir.
Full instructions are in the
README and
docs/building.md.