# Changelog 1.13

## [1.13.3] (2024-09-18)

[1.13.3]: https://github.com/crystal-lang/crystal/releases/1.13.3

### Bugfixes

#### stdlib

- **[regression]** Fix use global paths in macro bodies ([#14965], thanks @straight-shoota)
- _(system)_ **[regression]** Fix `Process.exec` stream redirection on Windows ([#14986], thanks @HertzDevil)
- _(text)_ **[regression]** Fix `String#index` and `#rindex` for `Char::REPLACEMENT` ([#14937], thanks @HertzDevil)

[#14965]: https://github.com/crystal-lang/crystal/pull/14965
[#14986]: https://github.com/crystal-lang/crystal/pull/14986
[#14937]: https://github.com/crystal-lang/crystal/pull/14937

### Infrastructure

- Changelog for 1.13.3 ([#14991], thanks @straight-shoota)
- _(ci)_ Enable runners from `runs-on.com` for Aarch64 CI ([#15007], thanks @straight-shoota)

[#14991]: https://github.com/crystal-lang/crystal/pull/14991
[#15007]: https://github.com/crystal-lang/crystal/pull/15007

## [1.13.2] (2024-08-20)

[1.13.2]: https://github.com/crystal-lang/crystal/releases/1.13.2

### Bugfixes

#### stdlib

- _(collection)_ Fix explicitly clear deleted `Hash::Entry` ([#14862], thanks @HertzDevil)

[#14862]: https://github.com/crystal-lang/crystal/pull/14862

#### compiler

- _(codegen)_ Fix `ReferenceStorage(T)` atomic if `T` has no inner pointers ([#14845], thanks @HertzDevil)
- _(codegen)_ Fix misaligned store in `Bool` to union upcasts ([#14906], thanks @HertzDevil)
- _(interpreter)_ Fix misaligned stack access in the interpreter ([#14843], thanks @HertzDevil)

[#14845]: https://github.com/crystal-lang/crystal/pull/14845
[#14906]: https://github.com/crystal-lang/crystal/pull/14906
[#14843]: https://github.com/crystal-lang/crystal/pull/14843

### Infrastructure

- Changelog for 1.13.2 ([#14914], thanks @straight-shoota)

[#14914]: https://github.com/crystal-lang/crystal/pull/14914

## [1.13.1] (2024-07-12)

[1.13.1]: https://github.com/crystal-lang/crystal/releases/1.13.1

### Bugfixes

#### stdlib

- _(serialization)_ **[regression]** Revert "Optimize JSON parsing a bit" ([#14804], thanks @straight-shoota)

[#14804]: https://github.com/crystal-lang/crystal/pull/14804

### Infrastructure

- Changelog for 1.13.1 ([#14806], thanks @straight-shoota)

[#14806]: https://github.com/crystal-lang/crystal/pull/14806

## [1.13.0] (2024-07-09)

[1.13.0]: https://github.com/crystal-lang/crystal/releases/1.13.0

### Features

#### lang

- Allow rescuing exceptions that include a module ([#14553], thanks @Blacksmoke16)
- _(macros)_ Allow assignment to `_` inside macro expressions ([#14452], thanks @HertzDevil)

[#14553]: https://github.com/crystal-lang/crystal/pull/14553
[#14452]: https://github.com/crystal-lang/crystal/pull/14452

#### stdlib

- _(collection)_ Add `Array#insert_all` ([#14486], thanks @summer-alice)
- _(collection)_ Improve compile time error for `#sort(&block : T, T -> U)` ([#14693], thanks @beta-ziliani)
- _(concurrency)_ Add `WaitGroup` synchronization primitive ([#14167], thanks @ysbaddaden)
- _(concurrency)_ Allow `Atomic`s of pointer types ([#14401], thanks @HertzDevil)
- _(concurrency)_ Add `Thread.new` yields itself ([#14543], thanks @ysbaddaden)
- _(concurrency)_ Add support for `Atomic(Bool)` ([#14532], thanks @ysbaddaden)
- _(concurrency)_ Add `Thread.sleep(Time::Span)` ([#14715], thanks @ysbaddaden)
- _(files)_ Implement `IO#tty?` in Win32 ([#14421], thanks @HertzDevil)
- _(files)_ Implement `File.readable?` and `.writable?` in Win32 ([#14420], thanks @HertzDevil)
- _(files)_ Make `File.readable?` and `.writable?` follow symlinks on Windows ([#14514], thanks @HertzDevil)
- _(llvm)_ Add some missing `LLVM::Context` bindings ([#14612], thanks @ysbaddaden)
- _(llvm)_ Do not strip the macOS target triple ([#14466], thanks @hovsater)
- _(log)_ Support `UInt32` and `UInt64` in Log Context ([#14459], thanks @toddsundsted)
- _(macros)_ Add AST node methods for macro-related nodes ([#14492], thanks @HertzDevil)
- _(macros)_ Support short blocks in `#[]` operator call's macro interpolation ([#14523], thanks @HertzDevil)
- _(macros)_ Add macro methods for `Select` ([#14600], thanks @HertzDevil)
- _(macros)_ Add `TypeNode#private?`, `#public?` and `#visibility` ([#11696], thanks @Hadeweka)
- _(macros)_ Add `StringLiteral#to_utf16` ([#14676], thanks @ysbaddaden)
- _(networking)_ Relax type restriction of handlers in `HTTP::Server.new` to `Indexable(HTTP::Handler)` ([#14413], thanks @hugopl)
- _(networking)_ **[security]** OpenSSL: don't change default cipher suites ([#14655], thanks @ysbaddaden)
- _(networking)_ Allow parsing cookies with space in the value ([#14455], thanks @anton7c3)
- _(runtime)_ Add `EventLoop::Socket` module ([#14643], thanks @straight-shoota)
- _(runtime)_ Add `EventLoop::FileDescriptor` module ([#14639], thanks @straight-shoota)
- _(runtime)_ Add `Crystal::Tracing` for runtime tracing ([#14659], thanks @ysbaddaden)
- _(system)_ **[security]** **[breaking]** Disable implicit execution of batch files on Windows ([#14557], thanks @straight-shoota)
- _(system)_ Add `EventLoop#run(blocking)` and `EventLoop#interrupt` ([#14568], thanks @ysbaddaden)
- _(system)_ Add `Crystal::System::Time.ticks` ([#14620], thanks @ysbaddaden)
- _(system)_ Add `Crystal::System::Thread.current_thread?`, `#scheduler?` ([#14660], thanks @ysbaddaden)
- _(system)_ Protect fork/exec on targets that don't support atomic CLOEXEC ([#14674], thanks @ysbaddaden)
- _(system)_ Add `Crystal::System.panic` ([#14733], thanks @ysbaddaden)
- _(text)_ Add `Regex::MatchOptions` overload for `String#index!` ([#14462], thanks @HertzDevil)
- _(text)_ Add `StringPool#get?` ([#14508], thanks @HertzDevil)
- _(text)_ Add `pkg_config` names for `pcre2` and `pcre` ([#14584], thanks @straight-shoota)
- _(text)_ Add UUID v7 ([#14732], thanks @jgaskins)
- _(time)_ Add `Time::Error` ([#14743], thanks @Blacksmoke16)

[#14486]: https://github.com/crystal-lang/crystal/pull/14486
[#14693]: https://github.com/crystal-lang/crystal/pull/14693
[#14167]: https://github.com/crystal-lang/crystal/pull/14167
[#14401]: https://github.com/crystal-lang/crystal/pull/14401
[#14543]: https://github.com/crystal-lang/crystal/pull/14543
[#14532]: https://github.com/crystal-lang/crystal/pull/14532
[#14715]: https://github.com/crystal-lang/crystal/pull/14715
[#14421]: https://github.com/crystal-lang/crystal/pull/14421
[#14420]: https://github.com/crystal-lang/crystal/pull/14420
[#14514]: https://github.com/crystal-lang/crystal/pull/14514
[#14612]: https://github.com/crystal-lang/crystal/pull/14612
[#14466]: https://github.com/crystal-lang/crystal/pull/14466
[#14459]: https://github.com/crystal-lang/crystal/pull/14459
[#14492]: https://github.com/crystal-lang/crystal/pull/14492
[#14523]: https://github.com/crystal-lang/crystal/pull/14523
[#14600]: https://github.com/crystal-lang/crystal/pull/14600
[#11696]: https://github.com/crystal-lang/crystal/pull/11696
[#14676]: https://github.com/crystal-lang/crystal/pull/14676
[#14413]: https://github.com/crystal-lang/crystal/pull/14413
[#14655]: https://github.com/crystal-lang/crystal/pull/14655
[#14455]: https://github.com/crystal-lang/crystal/pull/14455
[#14643]: https://github.com/crystal-lang/crystal/pull/14643
[#14639]: https://github.com/crystal-lang/crystal/pull/14639
[#14659]: https://github.com/crystal-lang/crystal/pull/14659
[#14557]: https://github.com/crystal-lang/crystal/pull/14557
[#14568]: https://github.com/crystal-lang/crystal/pull/14568
[#14620]: https://github.com/crystal-lang/crystal/pull/14620
[#14660]: https://github.com/crystal-lang/crystal/pull/14660
[#14674]: https://github.com/crystal-lang/crystal/pull/14674
[#14733]: https://github.com/crystal-lang/crystal/pull/14733
[#14462]: https://github.com/crystal-lang/crystal/pull/14462
[#14508]: https://github.com/crystal-lang/crystal/pull/14508
[#14584]: https://github.com/crystal-lang/crystal/pull/14584
[#14732]: https://github.com/crystal-lang/crystal/pull/14732
[#14743]: https://github.com/crystal-lang/crystal/pull/14743

#### compiler

- _(codegen)_ Add compiler flags `-Os` and `-Oz` to optimize binary size ([#14463], thanks @ysbaddaden)
- _(codegen)_ Add compiler support for AVR architecture (Arduino) ([#14393], thanks @ysbaddaden)

[#14463]: https://github.com/crystal-lang/crystal/pull/14463
[#14393]: https://github.com/crystal-lang/crystal/pull/14393

#### tools

- _(formatter)_ Allow new formatter styles for trailing comma and whitespace around proc literal ([#14726], thanks @Blacksmoke16)

[#14726]: https://github.com/crystal-lang/crystal/pull/14726

### Bugfixes

#### lang

- _(macros)_ Fix parsing of non-trailing `if` bodies inside macro expressions ([#14505], thanks @HertzDevil)
- _(macros)_ Drop parentheses around `->` inside certain comma-separated lists ([#14506], thanks @HertzDevil)
- _(macros)_ Fix indentation of `Select` nodes' macro interpolation ([#14510], thanks @HertzDevil)
- _(macros)_ Fix indentation of parenthesized `Expressions#to_s` ([#14511], thanks @HertzDevil)

[#14505]: https://github.com/crystal-lang/crystal/pull/14505
[#14506]: https://github.com/crystal-lang/crystal/pull/14506
[#14510]: https://github.com/crystal-lang/crystal/pull/14510
[#14511]: https://github.com/crystal-lang/crystal/pull/14511

#### stdlib

- _(collection)_ **[regression]** Ensure `Enumerable#to_a` and `Enumerable#tally` properly retain return type of `T` ([#14447], thanks @Blacksmoke16)
- _(collection)_ **[breaking]** Never raise `IndexError` in `#[]?(Range)` ([#14444], thanks @HertzDevil)
- _(collection)_ **[breaking]** Fix `Set#to_a(&)` ([#14519], thanks @meatball133)
- _(collection)_ Fix `Hash#rehash` to reset `@first` ([#14606], thanks @straight-shoota)
- _(collection)_ Fix macro interpolation in `NamedTuple#from` ([#14790], thanks @HertzDevil)
- _(collection)_ **[regression]** Fix regression with `NamedTuple.new` when using key with a hyphen ([#14785], thanks @Blacksmoke16)
- _(files)_ Allow `#fsync` and `#flock_*` on `IO::FileDescriptor` ([#14432], thanks @HertzDevil)
- _(files)_ Make `IO::FileDescriptor#tty?` return false for NUL on Windows ([#14509], thanks @HertzDevil)
- _(files)_ Fix blockless `IO::FileDescriptor` echo and raw mode methods ([#14529], thanks @HertzDevil)
- _(files)_ Remove target path's forward slashes in `File.symlink` on Windows ([#14522], thanks @HertzDevil)
- _(files)_ Fix `IO#same_content?` accepting prefix on second stream ([#14664], thanks @straight-shoota)
- _(files)_ Fix overflow in `File#read_at` for large offsets on Windows ([#14708], thanks @HertzDevil)
- _(files)_ Fix `IO::FileDescriptor.new` for closed fd ([#14697], thanks @straight-shoota)
- _(files)_ Fix `IO::Delimited` reading into limited slice with peek ([#14772], thanks @straight-shoota)
- _(files)_ Fix `Compress::Gzip` extra field ([#14550], thanks @kojix2)
- _(log)_ delete source from builder cache when finalize ([#14475], thanks @ysbaddaden)
- _(networking)_ Fix `Socket#close` error handling on Windows ([#14517], thanks @HertzDevil)
- _(networking)_ Set UTF-8 charset on directory listing in `HTTP::StaticFileHandler` ([#14546], thanks @alexkutsan)
- _(networking)_ Don't pass socket file descriptors to subprocesses on Unix (`SOCK_CLOEXEC`) ([#14632], thanks @carlhoerberg)
- _(networking)_ **[security]** OpenSSL: don't set default ECDH curve ([#14656], thanks @ysbaddaden)
- _(networking)_ **[security]** OpenSSL: deprecate Mozilla's TLS Server recommendation ([#14657], thanks @ysbaddaden)
- _(networking)_ use `SOCK_CLOEXEC` with `FD_CLOEXEC` fallback ([#14672], thanks @ysbaddaden)
- _(networking)_ **[regression]** Fix regression on `Socket#connect` timeout type restriction ([#14755], thanks @straight-shoota)
- _(networking)_ Drop default timeout for `Socket#connect` on Windows ([#14756], thanks @straight-shoota)
- _(networking)_ don't hardcode alpn protocol byte size (OpenSSL) ([#14769], thanks @ysbaddaden)
- _(numeric)_ Fix `BigRational#format` ([#14525], thanks @meatball133)
- _(numeric)_ **[regression]** Restore leading zero in exponent for `printf("%e")` and `printf("%g")` ([#14695], thanks @straight-shoota)
- _(runtime)_ Fix enable docs for builtin constants ([#14571], thanks @straight-shoota)
- _(runtime)_ Fix `GC.malloc` for `gc_none` to clear memory ([#14746], thanks @straight-shoota)
- _(serialization)_ Fix JSON discriminator for Bool `false` value ([#14779], thanks @dammer)
- _(specs)_ Fix relative file paths in spec output ([#14725], thanks @straight-shoota)
- _(system)_ Fix using `System.retry_with_buffer` with stack buffer ([#14615], thanks @straight-shoota)
- _(system)_ Harmonize close on exec for `Socket` & `FileDescriptor` on Windows ([#14634], thanks @ysbaddaden)
- _(system)_ Use `dup3` and `pipe2` to set `O_CLOEXEC` when available ([#14673], thanks @ysbaddaden)
- _(system)_ Fix calls to `retry_with_buffer` when big buffer is necessary ([#14622], thanks @BlobCodes)
- _(system)_ Fix `Process.run` with closed IO ([#14698], thanks @straight-shoota)
- _(system)_ Prefer `strerror_r` over `strerror` for thread-safe errno ([#14764], thanks @ysbaddaden)
- _(text)_ Make `String#sub` raise `IndexError` if index is equal to size ([#14458], thanks @HertzDevil)
- _(text)_ Fix `libpcre2` version detection not working for `-RC{N}` versions ([#14478], thanks @Frityet)
- _(text)_ Fix `Regex#inspect` with non-literal-compatible options ([#14575], thanks @straight-shoota)
- _(text)_ Fix ECR escape sequences containing `-` ([#14739], thanks @HertzDevil)

[#14447]: https://github.com/crystal-lang/crystal/pull/14447
[#14444]: https://github.com/crystal-lang/crystal/pull/14444
[#14519]: https://github.com/crystal-lang/crystal/pull/14519
[#14606]: https://github.com/crystal-lang/crystal/pull/14606
[#14790]: https://github.com/crystal-lang/crystal/pull/14790
[#14785]: https://github.com/crystal-lang/crystal/pull/14785
[#14432]: https://github.com/crystal-lang/crystal/pull/14432
[#14509]: https://github.com/crystal-lang/crystal/pull/14509
[#14529]: https://github.com/crystal-lang/crystal/pull/14529
[#14522]: https://github.com/crystal-lang/crystal/pull/14522
[#14664]: https://github.com/crystal-lang/crystal/pull/14664
[#14708]: https://github.com/crystal-lang/crystal/pull/14708
[#14697]: https://github.com/crystal-lang/crystal/pull/14697
[#14772]: https://github.com/crystal-lang/crystal/pull/14772
[#14550]: https://github.com/crystal-lang/crystal/pull/14550
[#14475]: https://github.com/crystal-lang/crystal/pull/14475
[#14517]: https://github.com/crystal-lang/crystal/pull/14517
[#14546]: https://github.com/crystal-lang/crystal/pull/14546
[#14632]: https://github.com/crystal-lang/crystal/pull/14632
[#14656]: https://github.com/crystal-lang/crystal/pull/14656
[#14657]: https://github.com/crystal-lang/crystal/pull/14657
[#14672]: https://github.com/crystal-lang/crystal/pull/14672
[#14755]: https://github.com/crystal-lang/crystal/pull/14755
[#14756]: https://github.com/crystal-lang/crystal/pull/14756
[#14769]: https://github.com/crystal-lang/crystal/pull/14769
[#14525]: https://github.com/crystal-lang/crystal/pull/14525
[#14695]: https://github.com/crystal-lang/crystal/pull/14695
[#14571]: https://github.com/crystal-lang/crystal/pull/14571
[#14746]: https://github.com/crystal-lang/crystal/pull/14746
[#14779]: https://github.com/crystal-lang/crystal/pull/14779
[#14725]: https://github.com/crystal-lang/crystal/pull/14725
[#14615]: https://github.com/crystal-lang/crystal/pull/14615
[#14634]: https://github.com/crystal-lang/crystal/pull/14634
[#14673]: https://github.com/crystal-lang/crystal/pull/14673
[#14622]: https://github.com/crystal-lang/crystal/pull/14622
[#14698]: https://github.com/crystal-lang/crystal/pull/14698
[#14764]: https://github.com/crystal-lang/crystal/pull/14764
[#14458]: https://github.com/crystal-lang/crystal/pull/14458
[#14478]: https://github.com/crystal-lang/crystal/pull/14478
[#14575]: https://github.com/crystal-lang/crystal/pull/14575
[#14739]: https://github.com/crystal-lang/crystal/pull/14739

#### compiler

- _(codegen)_ Fix create new `target_machine` for every program ([#14694], thanks @straight-shoota)
- _(codegen)_ Make `ReferenceStorage(T)` non-atomic if `T` is non-atomic ([#14730], thanks @HertzDevil)
- _(codegen)_ Detect and error on failed codegen process ([#14762], thanks @ysbaddaden)
- _(codegen)_ Fix stats and progress issues in codegen ([#14763], thanks @ysbaddaden)
- _(debugger)_ Fix LLDB `crystal_formatters.py` for Python 3 ([#14665], thanks @zw963)
- _(parser)_ Disallow assignments to calls with parentheses ([#14527], thanks @HertzDevil)
- _(parser)_ Fix parser validate UTF-8 on first input byte ([#14750], thanks @straight-shoota)
- _(semantic)_ Fix type def reopening type from parent namespace ([#11208], thanks @straight-shoota)
- _(semantic)_ Fix `Crystal::Path#to_macro_id` for global path ([#14490], thanks @straight-shoota)
- _(semantic)_ Fix `Class#===` on metaclass ([#11162], thanks @makenowjust)

[#14694]: https://github.com/crystal-lang/crystal/pull/14694
[#14730]: https://github.com/crystal-lang/crystal/pull/14730
[#14762]: https://github.com/crystal-lang/crystal/pull/14762
[#14763]: https://github.com/crystal-lang/crystal/pull/14763
[#14665]: https://github.com/crystal-lang/crystal/pull/14665
[#14527]: https://github.com/crystal-lang/crystal/pull/14527
[#14750]: https://github.com/crystal-lang/crystal/pull/14750
[#11208]: https://github.com/crystal-lang/crystal/pull/11208
[#14490]: https://github.com/crystal-lang/crystal/pull/14490
[#11162]: https://github.com/crystal-lang/crystal/pull/11162

#### tools

- _(docs-generator)_ Fix generate docs for builtins `HOST_TRIPLE` and `TARGET_TRIPLE` ([#14570], thanks @straight-shoota)
- _(docs-generator)_ Decode URI component for search functionality in docs ([#14645], thanks @nobodywasishere)
- _(formatter)_ Fix formatting for short block inside `#[]` operator call ([#14526], thanks @HertzDevil)
- _(formatter)_ Fix formatter to skip trailing comma for single-line parameters ([#14713], thanks @Blacksmoke16)

[#14570]: https://github.com/crystal-lang/crystal/pull/14570
[#14645]: https://github.com/crystal-lang/crystal/pull/14645
[#14526]: https://github.com/crystal-lang/crystal/pull/14526
[#14713]: https://github.com/crystal-lang/crystal/pull/14713

### Chores

#### stdlib

- _(collection)_ Drop obsolete workaround in `Range#reverse_each` ([#14709], thanks @yxhuvud)
- _(concurrency)_ Add `WaitGroup` to `docs_main.cr` ([#14624], thanks @straight-shoota)
- _(files)_ **[deprecation]** Move `File.readable?`, `.writable?`, `.executable?` to `File::Info` ([#14484], thanks @straight-shoota)
- _(networking)_ Drop `Crystal::System::Socket#system_send` ([#14637], thanks @straight-shoota)
- _(networking)_ Add type restriction `host : String` in `TCPSocket` and `Addrinfo` ([#14703], thanks @straight-shoota)
- _(runtime)_ Fix abstract def parameter name in `LibEvent::EventLoop#send_to` ([#14658], thanks @straight-shoota)
- _(runtime)_ **[breaking]** Drop unused methods in `IO::Evented` ([#14666], thanks @straight-shoota)
- _(runtime)_ Drop `IO::Overlapped` ([#14704], thanks @straight-shoota)

[#14709]: https://github.com/crystal-lang/crystal/pull/14709
[#14624]: https://github.com/crystal-lang/crystal/pull/14624
[#14484]: https://github.com/crystal-lang/crystal/pull/14484
[#14637]: https://github.com/crystal-lang/crystal/pull/14637
[#14703]: https://github.com/crystal-lang/crystal/pull/14703
[#14658]: https://github.com/crystal-lang/crystal/pull/14658
[#14666]: https://github.com/crystal-lang/crystal/pull/14666
[#14704]: https://github.com/crystal-lang/crystal/pull/14704

#### compiler

- _(codegen)_ **[breaking]** Remove `CRYSTAL_LIBRARY_RPATH` and delay-load helper ([#14598], thanks @HertzDevil)

[#14598]: https://github.com/crystal-lang/crystal/pull/14598

### Performance

#### stdlib

- _(collection)_ Optimize `Hash` for repeated removals and insertions ([#14539], thanks @HertzDevil)
- _(runtime)_ Remove unnecessary explicit memory barriers on ARM ([#14567], thanks @ysbaddaden)
- _(serialization)_ Optimize JSON parsing a bit ([#14366], thanks @asterite)
- _(text)_ Use wrapping arithmetic for `Int::Primitive#unsafe_chr` ([#14443], thanks @HertzDevil)
- _(text)_ Optimize `String#index(Char)` and `#rindex(Char)` for invalid UTF-8 ([#14461], thanks @HertzDevil)
- _(text)_ Optimize `String#to_utf16` ([#14671], thanks @straight-shoota)

[#14539]: https://github.com/crystal-lang/crystal/pull/14539
[#14567]: https://github.com/crystal-lang/crystal/pull/14567
[#14366]: https://github.com/crystal-lang/crystal/pull/14366
[#14443]: https://github.com/crystal-lang/crystal/pull/14443
[#14461]: https://github.com/crystal-lang/crystal/pull/14461
[#14671]: https://github.com/crystal-lang/crystal/pull/14671

### Refactor

#### stdlib

- Remove unnecessary calls to `#unsafe_as(UInt64)` etc. ([#14686], thanks @straight-shoota)
- _(crypto)_ Replace calls to `StaticArray(UInt8, 1)#unsafe_as(UInt8)` ([#14685], thanks @straight-shoota)
- _(files)_ Remove calls to `LibC._setmode` ([#14419], thanks @HertzDevil)
- _(files)_ Use file handles directly instead of C file descriptors on Win32 ([#14501], thanks @HertzDevil)
- _(files)_ Refactor win32 `System::FileDescriptor#unbuffered_{read,write}` ([#14607], thanks @straight-shoota)
- _(files)_ Extract `#system_read` and `#system_write` for `FileDescriptor` and `Socket` ([#14626], thanks @straight-shoota)
- _(files)_ Drop unused slice parameters of `#evented_*` methods ([#14627], thanks @straight-shoota)
- _(networking)_ Refactor use `IO#read_byte` instead of `#read_char` in `HTTP::ChunkedContent` ([#14548], thanks @straight-shoota)
- _(runtime)_ `Thread` owns its current fiber (instead of `Crystal::Scheduler`) ([#14554], thanks @ysbaddaden)
- _(runtime)_ Use `Fiber#enqueue` ([#14561], thanks @ysbaddaden)
- _(runtime)_ Add `Crystal::EventLoop.current` ([#14559], thanks @ysbaddaden)
- _(runtime)_ Add `Fiber.suspend` ([#14560], thanks @ysbaddaden)
- _(runtime)_ Remove `OverlappedOperation#synchronous` ([#14663], thanks @straight-shoota)
- _(runtime)_ Rename `Crystal::Iocp` to `Crystal::IOCP` ([#14662], thanks @straight-shoota)
- _(runtime)_ Unify `EventLoop.create` ([#14661], thanks @straight-shoota)
- _(serialization)_ Replace `type` declarations for void pointers with `alias` in `libxml2` ([#14494], thanks @straight-shoota)
- _(serialization)_ Refactor `JSON::Any#size` to use two branches instead of three ([#14533], thanks @meatball133)
- _(specs)_ Move `Spec` context state into `Spec::CLI` ([#14259], thanks @HertzDevil)
- _(system)_ Update `WinError#to_errno` ([#14515], thanks @HertzDevil)
- _(system)_ Rename `Crystal::System.print_error(fmt, *args, &)` to `printf` ([#14617], thanks @ysbaddaden)
- _(system)_ Refactor `Crystal::System.retry_with_buffer` calling `#to_slice` ([#14614], thanks @straight-shoota)
- _(system)_ Extract system implementation of `UNIXSocket.pair` as `Crystal::System::Socket.socketpair` ([#14675], thanks @ysbaddaden)
- _(system)_ Remove calls to `Pointer.new(Int)` ([#14683], thanks @straight-shoota)
- _(system)_ Cleanup for `IOCP::OverlappedOperation` ([#14723], thanks @straight-shoota)
- _(system)_ Refactor `IOCP::OverlappedOperation` internalize `handle` and `wait_for_completion` ([#14724], thanks @straight-shoota)

[#14686]: https://github.com/crystal-lang/crystal/pull/14686
[#14685]: https://github.com/crystal-lang/crystal/pull/14685
[#14419]: https://github.com/crystal-lang/crystal/pull/14419
[#14501]: https://github.com/crystal-lang/crystal/pull/14501
[#14607]: https://github.com/crystal-lang/crystal/pull/14607
[#14626]: https://github.com/crystal-lang/crystal/pull/14626
[#14627]: https://github.com/crystal-lang/crystal/pull/14627
[#14548]: https://github.com/crystal-lang/crystal/pull/14548
[#14554]: https://github.com/crystal-lang/crystal/pull/14554
[#14561]: https://github.com/crystal-lang/crystal/pull/14561
[#14559]: https://github.com/crystal-lang/crystal/pull/14559
[#14560]: https://github.com/crystal-lang/crystal/pull/14560
[#14663]: https://github.com/crystal-lang/crystal/pull/14663
[#14662]: https://github.com/crystal-lang/crystal/pull/14662
[#14661]: https://github.com/crystal-lang/crystal/pull/14661
[#14494]: https://github.com/crystal-lang/crystal/pull/14494
[#14533]: https://github.com/crystal-lang/crystal/pull/14533
[#14259]: https://github.com/crystal-lang/crystal/pull/14259
[#14515]: https://github.com/crystal-lang/crystal/pull/14515
[#14617]: https://github.com/crystal-lang/crystal/pull/14617
[#14614]: https://github.com/crystal-lang/crystal/pull/14614
[#14675]: https://github.com/crystal-lang/crystal/pull/14675
[#14683]: https://github.com/crystal-lang/crystal/pull/14683
[#14723]: https://github.com/crystal-lang/crystal/pull/14723
[#14724]: https://github.com/crystal-lang/crystal/pull/14724

#### compiler

- _(codegen)_ Add `Program#size_t` and `Target#size_bit_width` ([#14442], thanks @ysbaddaden)
- _(parser)_ Replace `Crystal::Select::When` with `Crystal::When` ([#14497], thanks @HertzDevil)

[#14442]: https://github.com/crystal-lang/crystal/pull/14442
[#14497]: https://github.com/crystal-lang/crystal/pull/14497

### Documentation

#### stdlib

- _(collection)_ Fix doc for `Set#proper_superset_of?` ([#14516], thanks @meatball133)
- _(collection)_ Fix result formatting in code example for `Indexable#[]?` ([#14721], thanks @meatball133)
- _(concurrency)_ Fix example for `WeakRef` by removing `ref.value` call ([#10846], thanks @hugopl)
- _(networking)_ Improve API docs for `Socket#send` ([#14638], thanks @straight-shoota)
- _(networking)_ Add documentation for `HTTP::WebSocket#stream` ([#14537], thanks @meatball133)
- _(numeric)_ Add documentation for complex methods inside Number ([#14538], thanks @meatball133)
- _(runtime)_ Add documentation for standard streams blocking behaviour ([#14577], thanks @straight-shoota)
- _(serialization)_ Fix docs for `CSV::Builder#row(&)` ([#14736], thanks @philipp-classen)
- _(system)_ **[breaking]** Undocument `IO::Evented` ([#14749], thanks @straight-shoota)
- _(system)_ Fix code example for `Process.on_terminate` ([#14798], thanks @philipp-classen)
- _(text)_ Fix docs for `Char#ascii_number?` stating wrong minimum base ([#14521], thanks @meatball133)
- _(text)_ Enhance documentation for regex options `NO_UTF_CHECK` ([#14542], thanks @straight-shoota)

[#14516]: https://github.com/crystal-lang/crystal/pull/14516
[#14721]: https://github.com/crystal-lang/crystal/pull/14721
[#10846]: https://github.com/crystal-lang/crystal/pull/10846
[#14638]: https://github.com/crystal-lang/crystal/pull/14638
[#14537]: https://github.com/crystal-lang/crystal/pull/14537
[#14538]: https://github.com/crystal-lang/crystal/pull/14538
[#14577]: https://github.com/crystal-lang/crystal/pull/14577
[#14736]: https://github.com/crystal-lang/crystal/pull/14736
[#14749]: https://github.com/crystal-lang/crystal/pull/14749
[#14798]: https://github.com/crystal-lang/crystal/pull/14798
[#14521]: https://github.com/crystal-lang/crystal/pull/14521
[#14542]: https://github.com/crystal-lang/crystal/pull/14542

### Specs

#### stdlib

- Remove incorrect uses of `describe` ([#14757], thanks @HertzDevil)
- _(files)_ Add spec for `Compress::Gzip::Writer` with `extra` ([#14788], thanks @straight-shoota)
- _(runtime)_ Add specs for `Pointer::Appender` ([#14719], thanks @straight-shoota)
- _(text)_ Add test helper for `normalize/regex_spec` ([#14545], thanks @straight-shoota)

[#14757]: https://github.com/crystal-lang/crystal/pull/14757
[#14788]: https://github.com/crystal-lang/crystal/pull/14788
[#14719]: https://github.com/crystal-lang/crystal/pull/14719
[#14545]: https://github.com/crystal-lang/crystal/pull/14545

### Infrastructure

- Changelog for 1.13.0 ([#14712], thanks @straight-shoota)
- Update previous Crystal release 1.12.1 ([#14480], thanks @straight-shoota)
- Highlight regression bugfixes in changelog ([#14474], thanks @straight-shoota)
- Write release version to `src/VERSION` in `update-changelog` and `release-update` ([#14547], thanks @straight-shoota)
- Fix `shell.nix` use `llvmPackages.bintools` with wrapper for rpath config ([#14583], thanks @straight-shoota)
- Add `src/SOURCE_DATE_EPOCH` to release tree ([#14574], thanks @straight-shoota)
- Update distribution-scripts ([#14562], thanks @straight-shoota)
- Update distribution-scripts ([#14594], thanks @straight-shoota)
- Use `boehmgc` package from nixpkgs in `shell.nix` ([#14591], thanks @straight-shoota)
- Simplify LLVM dependency in `shell.nix` ([#14590], thanks @straight-shoota)
- Fix nixpkgs `pkg-config` name in `shell.nix` ([#14593], thanks @straight-shoota)
- Update previous Crystal release 1.12.2 ([#14647], thanks @straight-shoota)
- Update distribution-scripts ([#14648], thanks @straight-shoota)
- Update distribution-scripts ([#14714], thanks @straight-shoota)
- Update distribution-scripts ([#14776], thanks @straight-shoota)
- Fix changelog generator increase topic priority for `infrastructure` ([#14781], thanks @straight-shoota)
- Remove `SetShouldExit` in Powershell wrapper ([#13769], thanks @straight-shoota)
- _(ci)_ Run `primitives_spec` with the interpreter on CI ([#14438], thanks @HertzDevil)
- _(ci)_ Add LLVM 18 to LLVM CI ([#14565], thanks @HertzDevil)
- _(ci)_ Update to Ruby 3 in macOS circleCI runner ([#14777], thanks @straight-shoota)
- _(ci)_ Distribute `shards.pdb` on Windows ([#14415], thanks @HertzDevil)
- _(ci)_ Drop Windows CI workaround for 1.12.0-dev ([#14483], thanks @HertzDevil)

[#14712]: https://github.com/crystal-lang/crystal/pull/14712
[#14480]: https://github.com/crystal-lang/crystal/pull/14480
[#14474]: https://github.com/crystal-lang/crystal/pull/14474
[#14547]: https://github.com/crystal-lang/crystal/pull/14547
[#14583]: https://github.com/crystal-lang/crystal/pull/14583
[#14574]: https://github.com/crystal-lang/crystal/pull/14574
[#14562]: https://github.com/crystal-lang/crystal/pull/14562
[#14594]: https://github.com/crystal-lang/crystal/pull/14594
[#14591]: https://github.com/crystal-lang/crystal/pull/14591
[#14590]: https://github.com/crystal-lang/crystal/pull/14590
[#14593]: https://github.com/crystal-lang/crystal/pull/14593
[#14647]: https://github.com/crystal-lang/crystal/pull/14647
[#14648]: https://github.com/crystal-lang/crystal/pull/14648
[#14714]: https://github.com/crystal-lang/crystal/pull/14714
[#14776]: https://github.com/crystal-lang/crystal/pull/14776
[#14781]: https://github.com/crystal-lang/crystal/pull/14781
[#13769]: https://github.com/crystal-lang/crystal/pull/13769
[#14438]: https://github.com/crystal-lang/crystal/pull/14438
[#14565]: https://github.com/crystal-lang/crystal/pull/14565
[#14777]: https://github.com/crystal-lang/crystal/pull/14777
[#14415]: https://github.com/crystal-lang/crystal/pull/14415
[#14483]: https://github.com/crystal-lang/crystal/pull/14483
