/oss · 28 merged

Effect-TS/effect

A toolkit programmers use to build reliable apps in TypeScript, a popular programming language.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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