/oss · 29 merged

lightpanda-io/browser

A fast web browser that runs without a screen, made for bots and AI agents that read websites.

the project on GitHub (opens in a new tab)
  1. 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)

  2. 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)

  3. 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)

  4. 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)

  5. 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)

  6. 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)

  7. 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)

  8. 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)

  9. 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)

  10. 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)

  11. 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. 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)

  13. 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)

  14. 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)

  15. 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)

  16. 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)

  17. 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)

  18. 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)

  19. 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)

  20. 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)

  21. 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)

  22. 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)

  23. 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)

  24. 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)

  25. 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)

  26. 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)

  27. 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)

  28. 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)

  29. 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