20 Oct 2026
YAML text blocks no longer swallow comments
- What was broken
- In a YAML text block, a comment line placed less indented than the text was treated as part of the text. A commented-out step in a CI script could end up running.
- What I changed
- I made the first line of the block set its indentation, so a less indented comment ends the block.
- Why it matters
- Commented-out lines stay comments, and the text keeps its real indentation.
see the code, #9581 ↗ (opens in a new tab)
19 Oct 2026
Empty quoted names in config files are now accepted
- What was broken
- TOML allows a setting name written as empty quotes. The reader rejected it with an error, so some valid config files would not load.
- What I changed
- Empty quoted names are now allowed. Names written without quotes still have to contain something.
- Why it matters
- Valid config files load, and real mistakes are still caught.
see the code, #9538 ↗ (opens in a new tab)
19 Oct 2026
Config values can no longer be changed by later sections
- What was broken
- In TOML config files, a value written in curly braces or a list written in full is final. The reader let later sections add keys to them, so broken files were quietly accepted.
- What I changed
- The reader now remembers which values are final and reports an error when a later section tries to extend one.
- Why it matters
- Invalid config files are caught right away instead of producing odd settings.
see the code, #9537 ↗ (opens in a new tab)
19 Oct 2026
Config text with quotes before a closing triple quote now loads
- What was broken
- TOML config files may hold long text in triple quotes, with one or two quotes just before the end. The reader closed the text too early and failed, even on the format's own examples.
- What I changed
- The reader now treats the last three quotes as the end, so the quotes before them stay in the text.
- Why it matters
- Valid config files that end a long text with quotes load instead of failing.
see the code, #9532 ↗ (opens in a new tab)
19 Oct 2026
UTF-16 files now get a clear error from the XML reader
- What was broken
- The XML reader only handles UTF-8 files. A UTF-16 file failed with a message about a broken file, which sent people looking for damage that was not there.
- What I changed
- The reader now spots the marker at the start of a UTF-16 file and says plainly that this encoding is not supported.
- Why it matters
- People know to convert the file instead of hunting for a corrupt one.
see the code, #9531 ↗ (opens in a new tab)
18 Oct 2026
Text read from a socket keeps characters that arrive in pieces
- What was broken
- When a character like an accent or an emoji was split across two network packets, Effect's socket reader turned it into broken replacement symbols.
- What I changed
- I made it decode the incoming bytes as one stream, so a character split across packets is put back together.
- Why it matters
- Apps that read text over TCP get the exact text that was sent.
see the code, #9487 ↗ (opens in a new tab)
17 Oct 2026
Reading a large backlog of messages at once no longer crashes
- What was broken
- Effect has a message channel that many listeners can read from. Asking it for a large backlog in one go, around 130,000 messages or more, crashed with a stack overflow error.
- What I changed
- I changed how it gathers the messages so the list size no longer matters.
- Why it matters
- Apps that fall behind can catch up on their messages in one step without crashing.
see the code, #9446 ↗ (opens in a new tab)
15 Oct 2026
A streamed response that fails halfway is no longer sent as complete
- What was broken
- When the stream behind a Node server response failed after it had started, the server closed the response normally. Clients got a shorter body that looked whole, so a failed export could be saved as if it had finished.
- What I changed
- The server now cuts the connection when the stream fails after the headers went out, so the client sees an aborted transfer.
- Why it matters
- A broken download shows up as an error instead of a quietly cut-off file.
see the code, #9255 ↗ (opens in a new tab)
15 Oct 2026
Very large whole numbers no longer break tracing exports
- What was broken
- The library sent every whole number as a 64-bit integer. A bigger one, like a 64-bit hash, made the collector reject the whole batch, or wrap the number to a negative one.
- What I changed
- I made numbers that fit still go as integers, bigger ones go as decimals, and very large exact numbers go as text so no digits are lost.
- Why it matters
- Spans and logs with big IDs or hashes now reach the collector intact.
see the code, #9199 ↗ (opens in a new tab)
15 Oct 2026
Tracing data with NaN or infinity is no longer thrown away
- What was broken
- When the library sent monitoring data as JSON, a number like NaN or infinity was written as null. The collector receiving it could not read that and rejected the whole batch, so every metric sent with it was lost.
- What I changed
- I made it write those numbers as the strings the format expects, "NaN", "Infinity" and "-Infinity".
- Why it matters
- One odd value, like a ratio before the first request, no longer drops all the other monitoring data.
see the code, #9198 ↗ (opens in a new tab)
14 Oct 2026
Command-line options can now take a value or go without one
- What was broken
- Many command-line tools have options like --color that work alone or with a value, as in --color=always. Apps built with the toolkit could not offer options like that, and users had asked for it.
- What I changed
- A new setting lets an option work alone or with a value after '='. Used alone, it never swallows the next word, and help text and tab completion show it the right way.
- Why it matters
- Programmers can build commands that behave like familiar tools such as ls and grep.
see the code, #9145 ↗ (opens in a new tab)
14 Oct 2026
Routes under a prefix with a variable get the right address
- What was broken
- Apps can group routes under a prefix such as one per customer name. The toolkit cut a fixed number of characters off the address, so handlers saw garbled paths and file serving answered not found.
- What I changed
- The prefix is now removed one path part at a time, so its length no longer matters.
- Why it matters
- Grouped routes and static files under a variable prefix work as written.
see the code, #9118 ↗ (opens in a new tab)
13 Oct 2026
One short tracing id no longer drops a whole batch of traces
- What was broken
- Some tracing tools send a short 64-bit request id. The toolkit passed it on as is, the trace collector rejected the whole batch, and traces for every other request in it were lost too.
- What I changed
- Short ids are now padded to full length where the full form is required, the same way the tracing standard's own tools do it.
- Why it matters
- Teams mixing older and newer tracing tools keep all their traces.
see the code, #9117 ↗ (opens in a new tab)
13 Oct 2026
Live updates no longer lose text after a carriage return
- What was broken
- Servers built with the toolkit can push live updates to a browser. Text with a lone carriage return, which progress bars use, was sent as one line, so the browser lost everything after the first return.
- What I changed
- Every kind of line break now starts a new line in the update, the way the format expects.
- Why it matters
- Progress output and other text reach the browser whole.
see the code, #9096 ↗ (opens in a new tab)
13 Oct 2026
Settings that refer to other settings now fill in correctly
- What was broken
- In a settings file, one setting can use another. The toolkit read the filled-in text again, so it could turn into a different, missing setting. A line that used itself, like extending PATH, crashed the app.
- What I changed
- Each setting is now filled in once, and the text that was filled in is never read again.
- Why it matters
- Settings come out the way the file says, and a common PATH line no longer crashes the app.
see the code, #9095 ↗ (opens in a new tab)
12 Oct 2026
Reading a stream in chunks no longer loses an item
- What was broken
- A common way to split a stream of data, for example a file's header from its body, read one item too far and threw it away. Every chunk after the first lost its first item.
- What I changed
- The split now stops right at the item that ends the chunk, so the next chunk starts with the right one.
- Why it matters
- Programs that split data this way get all of it, not most of it.
see the code, #9049 ↗ (opens in a new tab)
12 Oct 2026
Adding hours now works across clock changes
- What was broken
- Adding hours or minutes to a time was done on the clock face. On the nights clocks go back or forward, adding one minute could jump back almost an hour, and adding 24 hours gave only 23.
- What I changed
- Hours, minutes and seconds are now added as real time passed, while days, months and years still follow the calendar.
- Why it matters
- Timers and schedules built with the toolkit stay right on the two nights a year the clocks change.
see the code, #9048 ↗ (opens in a new tab)
11 Oct 2026
Data files saved on Windows now read correctly on Node
- What was broken
- Some Windows tools put an invisible mark at the start of a file. Data sent with that mark was rejected by apps running on Node, while the same app on other platforms read it fine.
- What I changed
- Node now drops the invisible mark when it reads text, the same way the other platforms already did.
- Why it matters
- An app gives the same answer wherever it runs, and files from Windows tools just work.
see the code, #9014 ↗ (opens in a new tab)
11 Oct 2026
Uploads with long or odd file names no longer fail
- What was broken
- A web server built with the toolkit saves each uploaded file under its own name. A long Chinese or Japanese name, or a name of just '.' or '..', made the whole upload fail with a server error.
- What I changed
- Long names are now cut to fit the disk's real limit, keeping the extension, and '.' and '..' are saved under a safe name.
- Why it matters
- People can upload files named in any language, and an odd name can't break the upload.
see the code, #9013 ↗ (opens in a new tab)
10 Oct 2026
Monitoring no longer repeats old lowest and highest values
- What was broken
- When an app sent timing reports in intervals, each report claimed the smallest and largest values since startup, not for that interval. Dashboards showed values that never happened then.
- What I changed
- After the first report, I leave those two values out, as the project's other reporting tool already does.
- Why it matters
- Charts for each time window show only what happened in that window.
see the code, #8987 ↗ (opens in a new tab)
10 Oct 2026
Speed reports now count every slow request
- What was broken
- Apps can report how long things take, sorted into ranges like 'under 10 ms'. With custom ranges, anything above the top range went uncounted; with built-in ranges, the top range appeared twice.
- What I changed
- I made all three reporting tools handle both kinds of range lists the same, correct way.
- Why it matters
- Dashboards built on these reports show true numbers again, such as the typical response time.
see the code, #8986 ↗ (opens in a new tab)
9 Oct 2026
An AI's 'thinking' now arrives in one piece, not hundreds
- What was broken
- With Ollama (which runs AI models on your own computer), a model's thinking came back chopped into hundreds of pieces, one per word, and its answer started before it finished thinking.
- What I changed
- I made the library ignore the empty answer text Ollama sends along with each bit of thinking.
- Why it matters
- Chat apps built on it keep a clean history and show thinking and answers in the right order.
see the code, #8952 ↗ (opens in a new tab)
7 Oct 2026
Overlapping groups of items no longer lose items at the end
- What was broken
- A tool that splits a list into overlapping groups (like 1-2-3, then 3-4-5) dropped items from the last, shorter group: 5 and 6 came out as just 6.
- What I changed
- The last group now keeps all its items, matching what the library's older version did.
- Why it matters
- Programs that process data in overlapping windows no longer quietly lose data at the end.
see the code, #8878 ↗ (opens in a new tab)
7 Oct 2026
Settings with '=' in their value are no longer cut short
- What was broken
- Settings written as name=value pairs lost everything after a second '=' sign. A login key for a monitoring service lost its ending, so the service refused the app's data.
- What I changed
- I split each pair at the first '=' only, so the rest of the value stays intact.
- Why it matters
- Apps can send their performance data to monitoring services that require a login.
see the code, #8877 ↗ (opens in a new tab)
7 Oct 2026
Forms that send a single item in a list now work
- What was broken
- If a form field could hold a list, like tags, and only one item was sent, the server rejected the request with an error. Two or more items worked.
- What I changed
- The server now accepts a single item and treats it as a list of one.
- Why it matters
- The library's own sending and receiving sides now agree, so these requests stop failing.
see the code, #8858 ↗ (opens in a new tab)
6 Oct 2026
Data streams no longer freeze when one part stops early
- What was broken
- A program can split a stream of data into groups and read each one separately. If one reader stopped early, the whole program froze once that group's backlog filled up.
- What I changed
- When a reader finishes, its group is now closed, so extra items for it are dropped instead of piling up.
- Why it matters
- Programs that only need part of the data no longer hang forever.
see the code, #8857 ↗ (opens in a new tab)
6 Oct 2026
Windows-saved settings files no longer get a stray line break
- What was broken
- TOML is another settings-file format. In files saved on Windows, every multi-line text value started with an extra line break that shouldn't be there.
- What I changed
- I made the reader skip the Windows-style line break too, as it already did for the usual one.
- Why it matters
- The same settings file now gives the same result no matter which computer saved it.
see the code, #8753 ↗ (opens in a new tab)
6 Oct 2026
Multi-line text in settings files keeps the right ending
- What was broken
- YAML is a common format for settings files. When reading a block of multi-line text from one, the library added or dropped line breaks at the end, against the format's official rules.
- What I changed
- I made it follow the official rules for line breaks at the end of a block, with tests for each case.
- Why it matters
- Text read from settings files now comes out exactly as the file says.
see the code, #8752 ↗ (opens in a new tab)
← every project