# Crystal changelog > A programming language with Ruby-like syntax and compile-time type checking. - Vendor: Crystal Language - Category: Languages & Runtimes - Official site: https://crystal-lang.org - Tracked by: What's New (https://whatsnew.fyi/product/crystal) - Harvested from: GitHub (crystal-lang/crystal) - Entries below: 10 (newest first) What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. ## Releases ### 1.21.0 - Date: 2026-07-16 - Version: 1.21.0 - Original notes: https://github.com/crystal-lang/crystal/releases/tag/1.21.0 - Permalink: https://whatsnew.fyi/product/crystal/releases/1.21.0 - **removed** — Disable automatic fallback to legacy PCRE - **changed** — Release Execution Contexts - **added** — Add %W percent string array literals with interpolation - **added** — Add TypeNode#all_methods that includes the type's ancestor's methods - **added** — Align long-only options in OptionParser help - **added** — Make Channel(T) an Iterator(T) - **added** — Add support for OpenSSL 4.0 - **added** — Support OpenSSL 4.x DLLs on Windows MSVC - **added** — Add Socket#sendfile (and Crystal::EventLoop::Socket#sendfile) - **added** — Add HTTP::WebSocket#receive as a synchronous call - **added** — Add Crystal::EventLoop::FileDescriptor#pread - **added** — Add without_main flag - **changed** — OpenBSD: use kqueue event loop by default - **added** — Support nested root properties in JSON::Field - **added** — Add URI::Params::Field(ignore:), ignore_serialize, ignore_deserialize - **added** — Allow chaining #should, #should_not expectations - **added** — Expose Path#kind - **added** — Add splat overloads for Process.capture, .run and .new - **added** — Add Process::Status.[] constructor - **added** — Add String#present? - **added** — Add UUID.v6 and .v8 generators ###### Breaking changes ###### stdlib - _(runtime)_ Release: Execution Contexts ([#17100], [#17104], thanks @ysbaddaden) - _(text)_ Disable automatic fallback to legacy `PCRE` ([#16924], thanks @straight-shoota) [#16924]: https://github.com/crystal-lang/crystal/pull/16924 [#17100]: https://github.com/crystal-lang/crystal/pull/17100 [#17104]: https://github.com/crystal-lang/crystal/pull/17104 ###### Features ###### lang - Add `%W` percent string array literals with interpolation ([#16919], thanks @straight-shoota) - _(macros)_ Add `TypeNode#all_methods` that includes the type's ancestor's methods ([#16902], thanks @Blacksmoke16) [#16902]: https://github.com/crystal-lang/crystal/pull/16902 [#16919]: https://github.com/crystal-lang/crystal/pull/16919 ###### stdlib - _(cli)_ Align long-only options in OptionParser help ([#16914], thanks @kojix2) - _(collection)_ Make `Channel(T)` an `Iterator(T)` ([#16916], thanks @jgaskins) - _(crypto)_ Add support for OpenSSL 4.0 ([#16839], thanks @straight-shoota) - _(crypto)_ Support OpenSSL 4.x DLLs on Windows MSVC ([#17116], thanks @HertzDevil) - _(networking)_ **[experimental]** Add `Socket#sendfile` (and `Crystal::EventLoop::Socket#sendfile`) ([#16665], [#17133], thanks @ysbaddaden, @straight-shoota) - _(networking)_ Add `HTTP::WebSocket#receive` as a synchronous call ([#16689], thanks @jgaskins) - _(runtime)_ Add `Crystal::EventLoop::FileDescriptor#pread` ([#17068], thanks @ysbaddaden) - _(runtime)_ Add `without_main` flag ([#17074], thanks @kojix2) - _(runtime)_ OpenBSD: use kqueue event loop by default ([#17123], thanks @ysbaddaden) - _(serialization)_ Support nested `root` properties in `JSON::Field` ([#17016], thanks @tcoatswo) - _(serialization)_ Add `URI::Params::Field(ignore:)`, `ignore_serialize`, `ignore_deserialize` ([#17029], thanks @trypsynth) - _(specs)_ Allow chaining `#should`, `#should_not` expectations ([#17020], thanks @straight-shoota) - _(system)_ Expose `Path#kind` ([#16917], thanks @Sija) - _(system)_ Add splat overloads for `Process.capture`, `.run` and `.new` ([#16975], thanks @straight-shoota) - _(system)_ Add `Process::Status.[]` constructor ([#17003], thanks @straight-shoota) - _(text)_ Add `String#present?` ([#16930], thanks @Sija) - _(text)_ Add `UUID.v6` and `.v8` generators ([#17010], thanks @trypsynth) [#16665]: https://github.com/crystal-lang/crystal/pull/16665 [#16689]: https://github.com/crystal-lang/crystal/pull/16689 [#16839]: https://github.com/crystal-lang/crystal/pull/16839 [#16914]: https://github.com/crystal-lang/crystal/pull/16914 [#16916]: https://github.com/crystal-lang/crystal/pull/16916 [#16917]: https://github.com/crystal-lang/crystal/pull/16917 [#16930]: https://github.com/crystal-lang/crystal/pull/16930 [#16975]: https://github.com/crystal-lang/crystal/pull/16975 [#17003]: https://github.com/crystal-lang/crystal/pull/17003 [#17010]: https://github.com/crystal-lang/crystal/pull/17010 [#17016]: https://github.com/crystal-lang/crystal/pull/17016 [#17020]: https://github.com/crystal-lang/crystal/pull/17020 [#17029]: https://github.com/crystal-lang/crystal/pull/17029 [#17068]: https://github.com/crystal-lang/crystal/pull/17068 [#17074]: https://github.com/crystal-lang/crystal/pull/17074 [#17116]: https://github.com/crystal-lang/crystal/pull/17116 [#17123]: https://github.com/crystal-lang/crystal/pull/17123 [#17133]: https://github.com/crystal-lang/crystal/pull/17133 ###### compiler - _(cli)_ Classify compiler exit reasons ([#17028], thanks @straight-shoota) - _(debugger)_ Improve proc debug metadata ([#16830], thanks @skuznetsov) - _(debugger)_ Emit debug metadata for constants and class vars ([#16831], thanks @skuznetsov) - _(debugger)_ Improve LLDB collection formatters ([#16832], thanks @skuznetsov) - _(parser)_ Add `ASTNode#inspect` ([#16699], thanks @straight-shoota) - _(parser)_ Parse `MacroVar` with empty expressions: `%var{}` ([#16772], thanks @straight-shoot _[Truncated at 4000 characters — full notes: https://github.com/crystal-lang/crystal/releases/tag/1.21.0]_ ### 1.20.3 - Date: 2026-07-02 - Version: 1.20.3 - Original notes: https://github.com/crystal-lang/crystal/releases/tag/1.20.3 - Permalink: https://whatsnew.fyi/product/crystal/releases/1.20.3 - **security** — add max_nesting to YAML::PullParser - **security** — add alias vs anchor ratio check to YAML::PullParser - **changed** — memoize anchor name in YAML::PullParser ###### Bugfixes ###### stdlib - _(serialization)_ **[security]** add `max_nesting` to `YAML::PullParser` ([#17107], thanks @ysbaddaden) - _(serialization)_ **[security]** add alias vs anchor ratio check to `YAML::PullParser` ([#17109], thanks @ysbaddaden) [#17107]: https://github.com/crystal-lang/crystal/pull/17107 [#17109]: https://github.com/crystal-lang/crystal/pull/17109 ###### Refactor ###### stdlib - _(serialization)_ `YAML::PullParser`: memoize anchor name ([#17108], thanks @ysbaddaden) [#17108]: https://github.com/crystal-lang/crystal/pull/17108 ###### Infrastructure - Add changelog for 1.20.3 ([#17110], thanks @ysbaddaden) [#17110]: https://github.com/crystal-lang/crystal/pull/17110 ### 1.20.2 - Date: 2026-05-15 - Version: 1.20.2 - Original notes: https://github.com/crystal-lang/crystal/releases/tag/1.20.2 - Permalink: https://whatsnew.fyi/product/crystal/releases/1.20.2 - **fixed** — Simplify Sync::Mutex#synchronize proc type constraints - **fixed** — Range#sample eventually loses randomness ###### Bugfixes ###### stdlib - _(concurrency)_ **[regression]** Simplify `Sync::Mutex#synchronize` proc type constraints ([#16904], [#16937], thanks @ysbaddaden) - _(runtime)_ `Range#sample` eventually loses randomness ([#16909], thanks @ysbaddaden) [#16904]: https://github.com/crystal-lang/crystal/pull/16904 [#16909]: https://github.com/crystal-lang/crystal/pull/16909 [#16937]: https://github.com/crystal-lang/crystal/pull/16937 ###### Infrastructure - Changelog for 1.20.2 ([#16945], thanks @straight-shoota) [#16945]: https://github.com/crystal-lang/crystal/pull/16945 ### 1.20.1 - Date: 2026-04-29 - Version: 1.20.1 - Original notes: https://github.com/crystal-lang/crystal/releases/tag/1.20.1 - Permalink: https://whatsnew.fyi/product/crystal/releases/1.20.1 - **fixed** — Fix issues in OpenSSL Kernel TLS - **changed** — OpenSSL Kernel TLS support should be opt-in - **added** — Add HTTP::Headers#to_json and #to_yaml - **fixed** — Range#sample eventually loses randomness - **fixed** — Don't parse debug sections from bare threads - **fixed** — Fix lexing macro delimiter state inside literals - **fixed** — Revert "Refactor Formatter code for simplification" ###### Bugfixes ###### stdlib - _(crypto)_ Fix issues in OpenSSL Kernel TLS ([#16888], thanks @ysbaddaden) - _(crypto)_ OpenSSL Kernel TLS support should be opt-in ([#16897], thanks @ysbaddaden) - _(networking)_ **[regression]** Add `HTTP::Headers#to_json` and `#to_yaml` ([#16890], thanks @straight-shoota) - _(runtime)_ **[regression]** `Range#sample` eventually loses randomness ([#16853], thanks @ysbaddaden) - _(runtime)_ don't parse debug sections from bare threads ([#16877], thanks @ysbaddaden) [#16853]: https://github.com/crystal-lang/crystal/pull/16853 [#16877]: https://github.com/crystal-lang/crystal/pull/16877 [#16888]: https://github.com/crystal-lang/crystal/pull/16888 [#16890]: https://github.com/crystal-lang/crystal/pull/16890 [#16897]: https://github.com/crystal-lang/crystal/pull/16897 ###### compiler - _(parser)_ **[regression]** Fix lexing macro delimiter state inside literals ([#16892], thanks @straight-shoota) [#16892]: https://github.com/crystal-lang/crystal/pull/16892 ###### tools - _(formatter)_ **[regression]** Revert "Refactor `Formatter` code for simplification" ([#16885], thanks @straight-shoota) [#16885]: https://github.com/crystal-lang/crystal/pull/16885 ###### Refactor ###### stdlib - _(runtime)_ Refactor `Exception::CallStack` for better boundaries ([#16896], thanks @straight-shoota) [#16896]: https://github.com/crystal-lang/crystal/pull/16896 ###### Infrastructure - Changelog for 1.20.1 ([#16898], thanks @straight-shoota) [#16898]: https://github.com/crystal-lang/crystal/pull/16898 ### 1.19.2 - Date: 2026-04-27 - Version: 1.19.2 - Original notes: https://github.com/crystal-lang/crystal/releases/tag/1.19.2 - Permalink: https://whatsnew.fyi/product/crystal/releases/1.19.2 - **security** — HTTP::Server is no longer vulnerable to request smuggling - **fixed** — Range#sample eventually loses randomness ###### Security ###### stdlib - _(networking)_ `HTTP::Server` is no longer vulnerable to request smuggling ([#16862], thanks @ysbaddaden) [#16862]: https://github.com/crystal-lang/crystal/pull/16862 ###### Bugfixes ###### stdlib - **[regression]** `Range#sample` eventually loses randomness ([#16866], thanks @straight-shoota, @ysbaddaden) [#16866]: https://github.com/crystal-lang/crystal/pull/16866 ###### Infrastructure - Changelog for 1.19.2 ([#16893], thanks @ysbaddaden) - _(ci)_ Drop `update: true` from `msys2/setup-msys` ([#16868], thanks @straight-shoota) [#16893]: https://github.com/crystal-lang/crystal/pull/16893 [#16868]: https://github.com/crystal-lang/crystal/pull/16868 ### 1.20.0 - Date: 2026-04-17 - Version: 1.20.0 - Original notes: https://github.com/crystal-lang/crystal/releases/tag/1.20.0 - Permalink: https://whatsnew.fyi/product/crystal/releases/1.20.0 - **security** — Fix HTTP::Server is no longer vulnerable to request smuggling - **added** — Add #select and #reject to HashLiteral and NamedTupleLiteral in macros - **changed** — Refine error message for unsupported named arguments in macros - **added** — Add short option bundling for OptionParser - **added** — Add Kernel TLS support to custom OpenSSL::BIO - **added** — Add IO#read_greedy - **added** — Add FileUtils#rm_f - **added** — Add IO::PrefixSuffixBuffer for capturing truncated streams - **changed** — Support LLVM 22.1 and 23.0 - **added** — Add Sec-WebSocket-Protocol checks to HTTP::WebSocket::Protocol - **added** — Add support for Sec-WebSocket-Protocol to HTTP::WebSocketHandler - **added** — Add HTTP::Response#content_type and #content_length as convenient accessors - **added** — Detect OAuth error in payload - **added** — Add Fiber::ExecutionContext::ThreadPool - **added** — Add Pointer#align_up and #align_down - **changed** — Detach execution context scheduler from running thread during blocking syscall - **added** — Forward API docs for properties in record macro - **added** — Add Crystal::Lock - **added** — Add io_uring event loop for Linux - **changed** — Use FdLock on all targets - **added** — Add Process.new with args instead of command, args - **added** — Add Process.run(args) without command - **added** — Add Process.run? - **added** — Add Process.capture - **added** — Add StringScanner#scan, #check, and #skip overloads for Int - **added** — Add StringScanner#peek_behind - **added** — Add convenience methods to StringScanner - **changed** — Improve cursor window format in StringScanner#inspect - **changed** — Prefer modern linker (mold or lld) - **added** — Add @[TargetFeature] annotation - **added** — Parse ProcNotation with empty arg parenthesis: () -> - **added** — Add --base-path for crystal docs - **fixed** — Fix decode gzip MTIME as UInt32 - **changed** — OpenSSL sockets shouldn't flush on read - **fixed** — Fix typo in digest.cr - **fixed** — Fix MIME.parse_media_type invalid character check ###### Security ###### stdlib - _(networking)_ Fix `HTTP::Server` is no longer vulnerable to request smuggling ([GHSA-wqh5-7w63-pm68]) [GHSA-wqh5-7w63-pm68]: https://github.com/crystal-lang/crystal/security/advisories/GHSA-wqh5-7w63-pm68 ###### Features ###### lang - _(macros)_ Add `#select` and `#reject` to `HashLiteral` and `NamedTupleLiteral` ([#16558], thanks @Blacksmoke16) - _(macros)_ Refine error message for unsupported named arguments in macros ([#16576], thanks @hahwul) [#16558]: https://github.com/crystal-lang/crystal/pull/16558 [#16576]: https://github.com/crystal-lang/crystal/pull/16576 ###### stdlib - _(cli)_ Add short option bundling for `OptionParser` ([#16770], thanks @Qard) - _(crypto)_ Add Kernel TLS support to custom `OpenSSL::BIO` ([#16646], thanks @ysbaddaden) - _(files)_ Add `IO#read_greedy` ([#16535], thanks @BlobCodes) - _(files)_ Add `FileUtils#rm_f` ([#12832], thanks @zw963) - _(files)_ Add `IO::PrefixSuffixBuffer` for capturing truncated streams ([#16774], thanks @straight-shoota) - _(llvm)_ Support LLVM 22.1 and 23.0 ([#16631], thanks @HertzDevil) - _(networking)_ Add `Sec-WebSocket-Protocol` checks to `HTTP::WebSocket::Protocol` ([#16600], [#16671], thanks @antondalgren, @straight-shoota) - _(networking)_ Add support for `Sec-WebSocket-Protocol` to `HTTP::WebSocketHandler` ([#16574], thanks @antondalgren) - _(networking)_ Add `HTTP::Response#content_type` and `#content_length` as convenient accessors ([#16712], thanks @CTC97) - _(networking)_ Detect `OAuth` error in payload ([#16634], [#16828], thanks @jgaskins, @Sija) - _(runtime)_ Add `Fiber::ExecutionContext::ThreadPool` ([#15885], [#16750], thanks @ysbaddaden) - _(runtime)_ Add `Pointer#align_up` and `#align_down` ([#16585], thanks @BlobCodes) - _(runtime)_ Detach execution context scheduler from running thread during blocking syscall ([#15871], [#16679], thanks @ysbaddaden) - _(runtime)_ Forward API docs for properties in `record` macro ([#16172], [#16834], thanks @Vici37, @ysbaddaden) - _(runtime)_ Add `Crystal::Lock` ([#16768], thanks @ysbaddaden) - _(runtime)_ Add io_uring event loop (linux) ([#16264], thanks @ysbaddaden) - _(system)_ Use `FdLock` on all targets ([#16569], thanks @ysbaddaden) - _(system)_ Add `Process.new` with `args` instead of `command, args` ([#16681], thanks @straight-shoota) - _(system)_ Add `Process.run(args)` without `command` ([#16739], thanks @straight-shoota) - _(system)_ Add `Process.run?` ([#16738], thanks @straight-shoota) - _(system)_ Add `Process.capture` ([#16773], thanks @straight-shoota) - _(text)_ Add `StringScanner#scan`, `#check`, and `#skip` overloads for `Int` ([#16557], thanks @jneen) - _(text)_ Add `StringScanner#peek_behind` ([#16593], thanks @jneen) - _(text)_ Add convenience methods to `StringScanner` ([#16595], thanks @jneen) - _(text)_ Improve cursor window format in `StringScanner#inspect` ([#16594], thanks @jneen) [#12832]: https://github.com/crystal-lang/crystal/pull/12832 [#15871]: https://github.com/crystal-lang/crystal/pull/15871 [#15885]: https://github.com/crystal-lang/crystal/pull/15885 [#16172]: https://github.com/crystal-lang/crystal/pull/16172 [#16264]: https://github.com/crystal-lang/crystal/pull/16264 [#16535]: https://github.com/crystal-lang/crystal/pull/16535 [#16557]: https://github.com/crystal-lang/crystal/pull/16557 [#16569]: https://github.com/crystal-lang/crystal/pull/16569 [#16574]: https://github.com/crystal-lang/crystal/pull/16574 [#16585]: https://github.com/crystal-lang/crystal/pull/16585 [#16593]: https://github.com/crystal-lang/crystal/pull/16593 [#16594]: https://github.com/crystal-lang/crystal/pull/16594 [#16595]: https://github.com/crystal-lang/crystal/pull/16595 [#16600]: https://github.com/crystal-lang/crystal/pull/16600 [#16631]: https://github.com/crystal-lang/crystal/pull/16631 [#16634]: https://github.com/crystal-lang/crystal/pull/16634 [#16646]: https://github.com/crystal-lang/crystal/p _[Truncated at 4000 characters — full notes: https://github.com/crystal-lang/crystal/releases/tag/1.20.0]_ ### 1.19.1 - Date: 2026-01-20 - Version: 1.19.1 - Original notes: https://github.com/crystal-lang/crystal/releases/tag/1.19.1 - Permalink: https://whatsnew.fyi/product/crystal/releases/1.19.1 - **fixed** — Fix kqueue timer duration calculation in concurrency - **fixed** — Fix time calculations in IOCP and Monitor thread in concurrency ###### Bugfixes ###### stdlib - _(concurrency)_ **[regression]** Fix kqueue timer duration calculation ([#16581], thanks @skuznetsov) - _(concurrency)_ **[regression]** time calculations in IOCP and Monitor thread ([#16583], thanks @ysbaddaden) [#16581]: https://github.com/crystal-lang/crystal/pull/16581 [#16583]: https://github.com/crystal-lang/crystal/pull/16583 ###### Infrastructure - Changelog for 1.19.1 ([#16590], thanks @ysbaddaden) [#16590]: https://github.com/crystal-lang/crystal/pull/16589 ### 1.19.0 - Date: 2026-01-15 - Version: 1.19.0 - Original notes: https://github.com/crystal-lang/crystal/releases/tag/1.19.0 - Permalink: https://whatsnew.fyi/product/crystal/releases/1.19.0 - **removed** — Require OpenSSL 1.1.1+ or LibreSSL 3+ - **added** — Add compiler flag values to macros - **added** — Add yielding variant of StringLiteral#gsub - **added** — Support StringLiteral#split(RegexLiteral) - **added** — Add StringLiteral#match - **changed** — Make all overloads of ArrayLiteral#[] return nil on out of bounds - **added** — Add NamedTuple#reverse_merge - **changed** — Pad Hash#inspect, Tuple#inspect before { from first element - **added** — Add Set#map! - **added** — Add Hash#transform_keys! - **changed** — Enhance error message for Hash#[] when key is wrong type for default block - **added** — Add Sync::Mutex and Sync::RWLock - **added** — Add Sync::ConditionVariable - **added** — Import Sync::Exclusive and Sync::Shared - **added** — Add OpenSSL::SSL::Context::Server#on_server_name for SNI - **changed** — Loosen type restrictions in StaticFileHandler helper methods from File to IO - **added** — Add IPSocket#ipv6_only - **added** — Expose flags hint for getaddrinfo - **added** — Add Int.from_digits as inverse of Int#digits - **added** — Add BigInt.from_digits - **added** — Add Int#tdivmod ###### Breaking changes ###### stdlib - _(crypto)_ Require OpenSSL 1.1.1+ or LibreSSL 3+ ([#16480], thanks @ysbaddaden) [#16480]: https://github.com/crystal-lang/crystal/pull/16480 ###### Features ###### lang - _(macros)_ **[breaking]** Add compiler flag values ([#16310], thanks @straight-shoota) - _(macros)_ Add yielding variant of `StringLiteral#gsub` ([#16378], thanks @Blacksmoke16) - _(macros)_ Support `StringLiteral#split(RegexLiteral)` ([#16423], thanks @HertzDevil) - _(macros)_ Add `StringLiteral#match` ([#16464], thanks @HertzDevil) - _(macros)_ Make all overloads of `ArrayLiteral#[]` return `nil` on out of bounds ([#16453], thanks @HertzDevil) [#16310]: https://github.com/crystal-lang/crystal/pull/16310 [#16378]: https://github.com/crystal-lang/crystal/pull/16378 [#16423]: https://github.com/crystal-lang/crystal/pull/16423 [#16464]: https://github.com/crystal-lang/crystal/pull/16464 [#16453]: https://github.com/crystal-lang/crystal/pull/16453 ###### stdlib - _(collection)_ Add `NamedTuple#reverse_merge` ([#16229], thanks @andrykonchin) - _(collection)_ Pad `Hash#inspect`, `Tuple#inspect` before `{` from first element ([#16245], thanks @andrykonchin) - _(collection)_ Add `Set#map!` ([#16271], thanks @andrykonchin) - _(collection)_ Add `Hash#transform_keys!` ([#16280], thanks @andrykonchin) - _(collection)_ Enhance error message for `Hash#[]` when key is wrong type for default block ([#16442], thanks @Blacksmoke16) - _(concurrency)_ Add `Sync::Mutex` and `Sync::RWLock` ([#16399], thanks @ysbaddaden) - _(concurrency)_ Add `Sync::ConditionVariable` ([#16440], thanks @ysbaddaden) - _(concurrency)_ Import `Sync::Exclusive` and `Sync::Shared` ([#16487], thanks @ysbaddaden) - _(crypto)_ Add `OpenSSL::SSL::Context::Server#on_server_name` for SNI ([#16452], [#16525], thanks @carlhoerberg, @straight-shoota) - _(networking)_ Loosen type restrictions in `StaticFileHandler` helper methods from `File` to `IO` ([#16238], thanks @andrykonchin) - _(networking)_ Add `IPSocket#ipv6_only` ([#16347], thanks @stakach) - _(networking)_ Expose `flags` hint for `getaddrinfo` ([#16528], thanks @stakach) - _(numeric)_ Add `Int.from_digits` as inverse of `Int#digits` ([#16237], [#16566], thanks @andrykonchin, @ysbaddaden) - _(numeric)_ Add `BigInt.from_digits` ([#16259], thanks @HertzDevil) - _(numeric)_ Add `Int#tdivmod` ([#16258], thanks @andrykonchin) - _(runtime)_ Add `Proc#[]` as alias to `#call` ([#16220], thanks @andrykonchin) - _(runtime)_ Add `#unshift`, `#pop` and `#pop?` to `Crystal::PointerLinkedList` ([#16287], thanks @ysbaddaden) - _(runtime)_ Add `Random.next_bool` and `.next_int` ([#16297], thanks @ysbaddaden) - _(runtime)_ Add `Random#split` and `#split_internal` API for splittable PRNGs ([#16342], [#16495], thanks @ysbaddaden) - _(runtime)_ Add `Pointer#fill` ([#16338], thanks @straight-shoota) - _(runtime)_ Add `Crystal::PointerLinkedList#first?` ([#16400], thanks @ysbaddaden) - _(runtime)_ Ensure single reader and writer to system fd on Unix ([#16209], thanks @ysbaddaden) - _(runtime)_ Protect `Box.unbox` from dereferencing null pointer ([#16514], thanks @straight-shoota) - _(runtime)_ Register execution context schedulers with the event loop ([#16519], thanks @ysbaddaden) - _(runtime)_ Add `Fiber::ExecutionContext::Scheduler.current?` ([#16521], thanks @ysbaddaden) - _(runtime)_ Move execution context event loop lock to each event loop ([#16520], thanks @ysbaddaden) - _(serialization)_ Support deserialization of YAML anchors of value types ([#16186], thanks @HertzDevil) - _(serialization)_ Add end locations to scalars and aliases in `YAML::Nodes.parse` ([#16187], thanks @HertzDevil) - _(serialization)_ Set `JSON::SerializableError#attribute` when appropriate ([#16158], thanks @spuun) - _(serialization)_ Support large JSON files ([#16211], thanks @RX14) - _(serialization)_ Add `YAML::Nodes.parse_all` ([#16247], thanks @HertzDevil) - _(specs)_ Rescale execution c _[Truncated at 4000 characters — full notes: https://github.com/crystal-lang/crystal/releases/tag/1.19.0]_ ### 1.18.2 - Date: 2025-10-21 - Version: 1.18.2 - Original notes: https://github.com/crystal-lang/crystal/releases/tag/1.18.2 - Permalink: https://whatsnew.fyi/product/crystal/releases/1.18.2 - **fixed** — Revert type restriction for IO#read_bytes - **fixed** — Fix Fiber::ExecutionContext.default_workers_count to avoid taking into account unsupported values ###### Bugfixes ###### stdlib - _(files)_ **[regression]** Revert type restriction for `IO#read_bytes` ([#16231], thanks @straight-shoota) - _(runtime)_ Fix `Fiber::ExecutionContext.default_workers_count` to avoid taking into account unsupported values ([#16227], thanks @Sija) [#16231]: https://github.com/crystal-lang/crystal/pull/16231 [#16227]: https://github.com/crystal-lang/crystal/pull/16227 ###### Infrastructure - Changelog for 1.18.2 ([#16243], thanks @matiasgarciaisaia) [#16243]: https://github.com/crystal-lang/crystal/pull/16243 ### 1.18.1 - Date: 2025-10-17 - Version: 1.18.1 - Original notes: https://github.com/crystal-lang/crystal/releases/tag/1.18.1 - Permalink: https://whatsnew.fyi/product/crystal/releases/1.18.1 - **fixed** — Revert adding type restrictions on HTTP::WebSocket#send etc. - **fixed** — Fix allow space after base type in enum def ###### Bugfixes ###### stdlib - _(networking)_ **[regression]** Revert adding type restrictions on `HTTP::WebSocket#send` etc. ([#16218], thanks @straight-shoota) [#16218]: https://github.com/crystal-lang/crystal/pull/16218 ###### compiler - _(parser)_ **[regression]** Fix allow space after base type in enum def ([#16217], thanks @straight-shoota) [#16217]: https://github.com/crystal-lang/crystal/pull/16217 ###### Infrastructure - Changelog for 1.18.1 ([#16224], thanks @matiasgarciaisaia) [#16224]: https://github.com/crystal-lang/crystal/pull/16224