20 Oct 2026
Text decoding now keeps the encoding a page asked for
- What was broken
- When text started with certain marker bytes, the browser quietly switched to a different text encoding than the one the page asked for. Chrome only drops a marker that matches the chosen encoding.
- What I changed
- The browser now sticks to the requested encoding and only removes a matching marker, the way Chrome does.
- Why it matters
- Pages that decode bytes into text get the same result as in Chrome, instead of garbled or wrongly shortened text.
see the code, #4076 ↗ (opens in a new tab)
20 Oct 2026
Cursor positions in text boxes now count characters like Chrome does
- What was broken
- Where the cursor or selection sat in a text box was counted in raw bytes. Accents and emoji take several bytes, so scripts saw wrong positions and could place the cursor inside a character.
- What I changed
- Positions are now counted the way web pages count them, and a position inside a character moves to its start.
- Why it matters
- Scripts that work with selections get correct results for accents and emoji.
see the code, #4066 ↗ (opens in a new tab)
20 Oct 2026
Text boxes now report their length and fix line breaks
- What was broken
- A multi-line text box had no length value, and it kept Windows-style line breaks in what it returned. Chrome reports a length and turns every line break into a plain one.
- What I changed
- The browser now reports the length the way Chrome does and cleans up line breaks when a value is set.
- Why it matters
- Scripts that read text boxes get the same answers as in Chrome.
see the code, #4059 ↗ (opens in a new tab)
19 Oct 2026
Non-breaking spaces in attribute values now print as in Chrome
- What was broken
- When a page was turned back into HTML, a non-breaking space in text was written safely, but in an attribute value it was written raw. Chrome writes it safely in both places.
- What I changed
- Attribute values now get the same treatment as text, so the output matches Chrome.
- Why it matters
- Saved or compared page markup is the same as what Chrome produces.
see the code, #4058 ↗ (opens in a new tab)
19 Oct 2026
A form's list of fields includes every kind of field
- What was broken
- When a script asked a form for its fields, Lightpanda left out fieldsets, outputs and embedded objects, so counts and positions differed from real browsers.
- What I changed
- I made the list include those three kinds too, in page order, the way the HTML standard and Chrome do.
- Why it matters
- Scripts that walk a form by position or by name get the same fields in Lightpanda as in Chrome.
see the code, #4051 ↗ (opens in a new tab)
18 Oct 2026
Dropdown options know their position
- What was broken
- In Lightpanda, asking a dropdown option for its position in the list gave nothing, while real browsers give a number.
- What I changed
- I added the position, counted the same way browsers count it, including options inside groups.
- Why it matters
- Scripts that read which option is which work the same in Lightpanda as in Chrome.
see the code, #4039 ↗ (opens in a new tab)
18 Oct 2026
Pages can ask for the window size and position
- What was broken
- Lightpanda had no outer window size or screen position. Pages that use them, like the common code that centers a popup, broke with an error or got nonsense numbers.
- What I changed
- I added them. The outer size matches the page size, since there is no window frame, and the position is the top left corner.
- Why it matters
- Pages that place popups or check the window size work the same as in a regular browser.
see the code, #4038 ↗ (opens in a new tab)
15 Oct 2026
Sliders and color pickers start with their default value
- What was broken
- A slider or color picker on a web form with no starting value was empty instead of its default, the middle of the range or black. Forms sent an empty field.
- What I changed
- I made these fields start at their default, and go back to it when a form is reset.
- Why it matters
- Forms filled in by Lightpanda send the same values a regular browser would.
see the code, #3980 ↗ (opens in a new tab)
15 Oct 2026
Form fields are checked as valid or invalid the way browsers do
- What was broken
- Web pages can style or find form fields that are filled in wrong. Lightpanda only noticed empty required fields, so a bad email address or a number below the limit counted as valid.
- What I changed
- I made it use every rule a field has, like format, pattern, limits and custom messages, and leave out disabled fields.
- Why it matters
- Scripts and tests that look for invalid fields get the same answer as in Chrome.
see the code, #3979 ↗ (opens in a new tab)
14 Oct 2026
Typing in a box now tells the page the value changed
- What was broken
- Pages often wait for a 'changed' signal before they check, save or filter what was typed. Chrome sends it when you leave the box or press Enter. This browser never sent it, so those pages never saw the typed text.
- What I changed
- The browser now remembers the value from before the typing and sends the signal on leaving the box or pressing Enter, if the value is different, as Chrome does.
- Why it matters
- Forms that check or save what you type now work for bots too.
see the code, #3952 ↗ (opens in a new tab)
14 Oct 2026
Filter and sort forms now send the new choice
- What was broken
- When a form like 'sort by' was sent from a page whose address already held choices, the browser added the new choice instead of replacing the old one. With a '#' in the address, the form was never sent.
- What I changed
- The browser now swaps the old choices for the form's and keeps the '#' part at the end, as the web standard says and Chrome does.
- Why it matters
- Bots that filter, sort or search through forms land on the page they asked for.
see the code, #3951 ↗ (opens in a new tab)
12 Oct 2026
Searches for forms and links now ignore letter case, like Chrome
- What was broken
- Pages often write things like method="POST". Searching the page for forms with method=post found nothing, though Chrome finds them, so bots missed forms and links.
- What I changed
- For the attributes where the web standard says case doesn't matter, the search now ignores it.
- Why it matters
- Bots and test tools find the same parts of a page that Chrome does.
see the code, #3911 ↗ (opens in a new tab)
12 Oct 2026
A '?' after the '#' in a link no longer changes the address
- What was broken
- Many web apps put a '?' after the '#' in their links. The browser read it as part of the real address, so edited links went somewhere else and servers were told text meant to stay in the browser.
- What I changed
- The browser now only looks for the '?' before the '#', like Chrome does.
- Why it matters
- Links in these apps go where they should, and the private part of the address stays private.
see the code, #3910 ↗ (opens in a new tab)
11 Oct 2026
Saved logins now survive being restored
- What was broken
- Programs that save a logged-in session and load it later got back a logged-out one. The browser misread the login cookies' 'no end date' mark as 'expired' and dropped them.
- What I changed
- The browser now keeps those cookies until the session ends, as Chrome does.
- Why it matters
- Bots can log in once and reuse that login, instead of ending up signed out.
see the code, #3895 ↗ (opens in a new tab)
10 Oct 2026
Dropdown choices now send clean text
- What was broken
- Dropdown choices kept the extra spaces and line breaks from the page's source code. Forms sent the server garbled values, and picking a choice by name found nothing.
- What I changed
- The browser now trims and squeezes that extra space, as the web standard says.
- Why it matters
- Servers get the same form answers they would get from Chrome.
see the code, #3896 ↗ (opens in a new tab)
9 Oct 2026
Ctrl+A now selects all the text in a box
- What was broken
- Pressing Ctrl+A in a text box did nothing. Programs that clear a field by selecting all and typing over it ended up with the old text plus the new.
- What I changed
- The browser now selects everything in the box on Ctrl+A, like Chrome on Linux.
- Why it matters
- A common way scripts clear and refill form fields now works.
see the code, #3874 ↗ (opens in a new tab)
9 Oct 2026
A missing table feature no longer breaks page searches
- What was broken
- Pages couldn't ask a table for its rows. Playwright, a popular tool for driving browsers, needs that, so on some pages with tables every search for a heading or button crashed.
- What I changed
- I added the list of rows, in the order the web standard sets out.
- Why it matters
- Playwright scripts that find links, buttons and headings by what they are now work on those pages.
see the code, #3873 ↗ (opens in a new tab)
8 Oct 2026
Error messages from a page now reach the program
- What was broken
- When code run on a page failed, the program controlling the browser got an empty error message, or just 'undefined', instead of the real one Chrome gives.
- What I changed
- The browser now labels page objects correctly, so real errors keep their message.
- Why it matters
- Developers see what actually went wrong instead of a blank error.
see the code, #3831 ↗ (opens in a new tab)
7 Oct 2026
The browser's own tests stop hiding failures
- What was broken
- In the project's test suite, a test that crashed after its first check passed still counted as passed. One test had been quietly skipping its later checks this way.
- What I changed
- I made a crash anywhere in a test count as a failure, and fixed the test it had been hiding.
- Why it matters
- Behind-the-scenes work, but future bugs can't slip past tests that only look like they passed.
see the code, #3819 ↗ (opens in a new tab)
7 Oct 2026
Deleting a cookie now actually deletes it
- What was broken
- Sites often delete a cookie (a small note a site stores in the browser) by giving it a 1970 expiry date ending in 'UTC'. The browser misread that, so the cookie stayed.
- What I changed
- I taught the browser to read dates ending in 'UTC', so those cookies are removed as in Chrome.
- Why it matters
- Log-out and cookie-consent code that clears cookies this way now works.
see the code, #3818 ↗ (opens in a new tab)
5 Oct 2026
Custom page elements are now told apart by name
- What was broken
- Sites can invent their own element types, like a 'card'. Asked for 'the second card', the browser lumped all invented types together and picked the wrong one, or none.
- What I changed
- The browser now treats each invented element name as its own type, as Chrome does.
- Why it matters
- Scripts that pick the first, second or last of a kind of item now get the right one.
see the code, #3762 ↗ (opens in a new tab)
5 Oct 2026
Searches inside news feeds and drawings now find items
- What was broken
- Programs looking up parts of a page by name came up empty in two cases: inside RSS news feeds, and for some drawing elements with capital letters in their names.
- What I changed
- I made the browser match those names properly; one small upper/lowercase difference from Chrome is left.
- Why it matters
- Scripts that read news feeds or graphics on a page now find what is there.
see the code, #3761 ↗ (opens in a new tab)
3 Oct 2026
A space before a closing bracket is no longer an error
- What was broken
- Page lookups like 'every odd item in a list' failed with an error if there was a space before the closing bracket, even though the rules allow it.
- What I changed
- The browser now skips spaces there, as the styling rules allow.
- Why it matters
- Small fix. Valid page code written with extra spaces no longer stops with an error.
see the code, #3722 ↗ (opens in a new tab)
3 Oct 2026
Clearing text no longer writes the word 'null'
- What was broken
- When a page cleared an element's text by setting it to 'nothing' (null), the browser showed the word 'null' instead of empty text.
- What I changed
- The browser now treats 'nothing' as empty text, as the web standard says.
- Why it matters
- Small fix, but pages no longer show a stray 'null' where text should be blank.
see the code, #3721 ↗ (opens in a new tab)
3 Oct 2026
The page clock now reports the real date
- What was broken
- A page asking when it was opened got the time since the computer started, not the real date and time, so its date math was off by decades.
- What I changed
- The browser now records the real clock time when a page opens and reports that.
- Why it matters
- Page scripts that log or measure time get correct timestamps.
see the code, #3720 ↗ (opens in a new tab)
3 Oct 2026
Timers with a negative delay now go off
- What was broken
- A page timer set with a negative or very large delay was misread as about 49 days, so it never went off. Chrome runs it right away.
- What I changed
- The browser now treats such delays as zero, as the web standard says.
- Why it matters
- Page code that schedules work this way now runs instead of silently waiting.
see the code, #3719 ↗ (opens in a new tab)
3 Oct 2026
The browser now knows which fields can be typed in
- What was broken
- Asked which form fields can be typed into, the browser also counted checkboxes and disabled boxes, and said no field was read-only.
- What I changed
- I made it follow the web standard's rules for what counts as editable.
- Why it matters
- Scripts and page styles that treat locked fields differently now see the same fields Chrome does.
see the code, #3718 ↗ (opens in a new tab)
3 Oct 2026
Saving a page's code no longer drops template parts
- What was broken
- Pages can hold hidden 'template' blocks used to build content later. When the browser turned a page back into code, those blocks came out empty.
- What I changed
- The browser now writes out what is inside templates, as the web standard says.
- Why it matters
- Saved copies of pages, including the browser's own page-dump command, keep all their content.
see the code, #3717 ↗ (opens in a new tab)
3 Oct 2026
Backspace, Tab and the arrow keys work now
- What was broken
- When a program typed on a page, keys that don't type a letter (Backspace, Delete, arrows, Escape) were silently ignored. Pressing Backspace in a text box deleted nothing.
- What I changed
- The browser now handles those key presses the same way Chrome does.
- Why it matters
- Scripts that fill in forms behave the same here as in a normal browser.
see the code, #3716 ↗ (opens in a new tab)
← every project