# Changelog 1.19

## [1.19.1] (2026-01-20)

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

### 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] (2026-01-14)

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

### 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 context in spec runner with `CRYSTAL_WORKERS` ([#16444], [#16471], thanks @straight-shoota, @ysbaddaden)
- _(system)_ Add `Process.debugger_present?` for Windows and Linux ([#16248], thanks @HertzDevil)
- _(system)_ Implement `execvpe_impl` ([#16322], [#16344], thanks @straight-shoota)
- _(system)_ Add `::exit(Process::Status)` ([#16436], thanks @straight-shoota)
- _(system)_ Standardize system error codes for `File::Error` ([#16024], thanks @straight-shoota)
- _(system)_ Add `Path#relative?` ([#16473], thanks @Sija)
- _(text)_ PCRE2: use thread local for jit stack and match data ([#16175], thanks @ysbaddaden)
- _(text)_ Support 0X, 0O, 0B prefixes in string to integer conversion ([#16226], thanks @andrykonchin)
- _(text)_ Add `String#each_line` parameter `remove_empty` ([#16232], thanks @andrykonchin)
- _(time)_ Add `weeks` parameter to `Time::Span.new` ([#16208], thanks @Sija)
- _(time)_ Treat GMT as a legacy alias of UTC ([#16292], thanks @straight-shoota)
- _(time)_ Add `/etc/zoneinfo` to zoneinfo lookup paths ([#16463], thanks @straight-shoota)
- _(time)_ Add support for `$TZDIR` ([#16466], thanks @straight-shoota)
- _(time)_ Add `Time::Instant` ([#16490], thanks @straight-shoota)
- _(time)_ **[breaking]** Adjust monotonic clocks to include suspended time with precision ([#16516], thanks @straight-shoota)

[#16229]: https://github.com/crystal-lang/crystal/pull/16229
[#16245]: https://github.com/crystal-lang/crystal/pull/16245
[#16271]: https://github.com/crystal-lang/crystal/pull/16271
[#16280]: https://github.com/crystal-lang/crystal/pull/16280
[#16442]: https://github.com/crystal-lang/crystal/pull/16442
[#16399]: https://github.com/crystal-lang/crystal/pull/16399
[#16440]: https://github.com/crystal-lang/crystal/pull/16440
[#16487]: https://github.com/crystal-lang/crystal/pull/16487
[#16452]: https://github.com/crystal-lang/crystal/pull/16452
[#16525]: https://github.com/crystal-lang/crystal/pull/16525
[#16238]: https://github.com/crystal-lang/crystal/pull/16238
[#16347]: https://github.com/crystal-lang/crystal/pull/16347
[#16528]: https://github.com/crystal-lang/crystal/pull/16528
[#16237]: https://github.com/crystal-lang/crystal/pull/16237
[#16566]: https://github.com/crystal-lang/crystal/pull/16566
[#16259]: https://github.com/crystal-lang/crystal/pull/16259
[#16258]: https://github.com/crystal-lang/crystal/pull/16258
[#16220]: https://github.com/crystal-lang/crystal/pull/16220
[#16287]: https://github.com/crystal-lang/crystal/pull/16287
[#16297]: https://github.com/crystal-lang/crystal/pull/16297
[#16342]: https://github.com/crystal-lang/crystal/pull/16342
[#16495]: https://github.com/crystal-lang/crystal/pull/16495
[#16338]: https://github.com/crystal-lang/crystal/pull/16338
[#16400]: https://github.com/crystal-lang/crystal/pull/16400
[#16209]: https://github.com/crystal-lang/crystal/pull/16209
[#16514]: https://github.com/crystal-lang/crystal/pull/16514
[#16519]: https://github.com/crystal-lang/crystal/pull/16519
[#16521]: https://github.com/crystal-lang/crystal/pull/16521
[#16520]: https://github.com/crystal-lang/crystal/pull/16520
[#16186]: https://github.com/crystal-lang/crystal/pull/16186
[#16187]: https://github.com/crystal-lang/crystal/pull/16187
[#16158]: https://github.com/crystal-lang/crystal/pull/16158
[#16211]: https://github.com/crystal-lang/crystal/pull/16211
[#16247]: https://github.com/crystal-lang/crystal/pull/16247
[#16444]: https://github.com/crystal-lang/crystal/pull/16444
[#16471]: https://github.com/crystal-lang/crystal/pull/16471
[#16248]: https://github.com/crystal-lang/crystal/pull/16248
[#16322]: https://github.com/crystal-lang/crystal/pull/16322
[#16344]: https://github.com/crystal-lang/crystal/pull/16344
[#16436]: https://github.com/crystal-lang/crystal/pull/16436
[#16024]: https://github.com/crystal-lang/crystal/pull/16024
[#16473]: https://github.com/crystal-lang/crystal/pull/16473
[#16175]: https://github.com/crystal-lang/crystal/pull/16175
[#16226]: https://github.com/crystal-lang/crystal/pull/16226
[#16232]: https://github.com/crystal-lang/crystal/pull/16232
[#16208]: https://github.com/crystal-lang/crystal/pull/16208
[#16292]: https://github.com/crystal-lang/crystal/pull/16292
[#16463]: https://github.com/crystal-lang/crystal/pull/16463
[#16466]: https://github.com/crystal-lang/crystal/pull/16466
[#16490]: https://github.com/crystal-lang/crystal/pull/16490
[#16516]: https://github.com/crystal-lang/crystal/pull/16516

#### compiler

- _(codegen)_ Build compiler with `-Dexecution_context` ([#16447], [#16502], thanks @ysbaddaden, @straight-shoota)
- _(interpreter)_ Support `->LibX.fun_name` in the interpreter ([#16194], thanks @ysbaddaden)
- _(semantic)_ Add error message to `CrystalPath::NotFoundError` ([#16365], thanks @willhbr)
- _(semantic)_ Retain original location for errors in `included`, `extended` hooks ([#13261], thanks @Blacksmoke16)

[#16447]: https://github.com/crystal-lang/crystal/pull/16447
[#16502]: https://github.com/crystal-lang/crystal/pull/16502
[#16194]: https://github.com/crystal-lang/crystal/pull/16194
[#16365]: https://github.com/crystal-lang/crystal/pull/16365
[#13261]: https://github.com/crystal-lang/crystal/pull/13261

#### tools

- _(docs-generator)_ Add optional sanitizer to docs generator ([#14646], [#16251], thanks @nobodywasishere, @straight-shoota)

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

### Bugfixes

#### lang

- _(macros)_ Fix nested sigil delimiter parsing inside macros ([#16266], thanks @HertzDevil)

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

#### stdlib

- Fix `OptionParser` subcommand help to respect custom `summary_indent` ([#16334], thanks @kojix2)
- _(collection)_ Fix `Hash` methods to retain `compare_by_identity` flag ([#16356], thanks @andrykonchin)
- _(collection)_ Fix Hash methods and retaining default value ([#16374], thanks @andrykonchin)
- _(files)_ Fix condition for no-op `lock_write` to work without sockets ([#16304], thanks @straight-shoota)
- _(networking)_ Fix `HTTP::Cookie` parsing trailing semicolons ([#16328], thanks @alexkutsan)
- _(networking)_ **[breaking]** Make `#flush` in `WebSocket#stream` a no-op to not send wrongly frames ([#16539], thanks @spuun)
- _(runtime)_ **[deprecation]** Add thread safety to default random ([#16174], [#16568], thanks @ysbaddaden)
- _(runtime)_ default execution context is `Parallel` ([#16367], thanks @ysbaddaden)
- _(runtime)_ `Crystal::PointerLinkedList#each` stops iterating when deleting head ([#16401], thanks @ysbaddaden)
- _(runtime)_ closing system fd is thread unsafe ([#16289], thanks @ysbaddaden)
- _(runtime)_ `Crystal::System::Process#rwlock` with Crystal < 1.7 (UNIX) ([#16482], thanks @ysbaddaden)
- _(runtime)_ urandom initialization isn't thread safe + refactor ([#16479], thanks @ysbaddaden)
- _(runtime)_ execution context queue stress tests failures ([#16472], thanks @ysbaddaden)
- _(runtime)_ don't use `Time.monotonic` in `Fiber::ExecutionContext::Monitor` ([#16500], thanks @ysbaddaden)
- _(runtime)_ thread safety of `Exception::Callstack` ([#16504], thanks @ysbaddaden)
- _(runtime)_ actually clear memory using gc_none on unix ([#16562], thanks @BlobCodes)
- _(serialization)_ memory leak in `XML.parse` and `XML.parse_html` methods ([#16414], thanks @ysbaddaden)
- _(serialization)_ memory leak in `XML::Document#finalize` ([#16418], thanks @toddsundsted)
- _(serialization)_ memory leak in `XML::Node#content=` ([#16419], thanks @toddsundsted)
- _(serialization)_ Fix use after unlink in `XML::Node` ([#16432], thanks @toddsundsted)
- _(specs)_ Resolve inconsistent use of `#inspect` in `expect_raises` ([#16265], [#16375], thanks @andrykonchin, @straight-shoota)
- _(system)_ Create `argv` before `fork` ([#16286], [#16321], thanks @straight-shoota)
- _(system)_ Pass `envp` to `execvpe` ([#16340], thanks @straight-shoota)
- _(system)_ Move `make_envp` before `fork` ([#16351], thanks @straight-shoota)
- _(system)_ Replace `Dir.cd` with a non-raising alternative in pre-exec ([#16352], [#16369], thanks @straight-shoota)
- _(system)_ Fix reset directory if `Process.exec` fails ([#16383], thanks @straight-shoota)
- _(system)_ Fix reorder `Process.lock_write` outside of `.block_signals` ([#16465], thanks @straight-shoota)
- _(system)_ Disable process cancellation during `fork` ([#16446], thanks @straight-shoota)

[#16334]: https://github.com/crystal-lang/crystal/pull/16334
[#16356]: https://github.com/crystal-lang/crystal/pull/16356
[#16374]: https://github.com/crystal-lang/crystal/pull/16374
[#16304]: https://github.com/crystal-lang/crystal/pull/16304
[#16328]: https://github.com/crystal-lang/crystal/pull/16328
[#16539]: https://github.com/crystal-lang/crystal/pull/16539
[#16174]: https://github.com/crystal-lang/crystal/pull/16174
[#16568]: https://github.com/crystal-lang/crystal/pull/16568
[#16367]: https://github.com/crystal-lang/crystal/pull/16367
[#16401]: https://github.com/crystal-lang/crystal/pull/16401
[#16289]: https://github.com/crystal-lang/crystal/pull/16289
[#16482]: https://github.com/crystal-lang/crystal/pull/16482
[#16479]: https://github.com/crystal-lang/crystal/pull/16479
[#16472]: https://github.com/crystal-lang/crystal/pull/16472
[#16500]: https://github.com/crystal-lang/crystal/pull/16500
[#16504]: https://github.com/crystal-lang/crystal/pull/16504
[#16562]: https://github.com/crystal-lang/crystal/pull/16562
[#16414]: https://github.com/crystal-lang/crystal/pull/16414
[#16418]: https://github.com/crystal-lang/crystal/pull/16418
[#16419]: https://github.com/crystal-lang/crystal/pull/16419
[#16432]: https://github.com/crystal-lang/crystal/pull/16432
[#16265]: https://github.com/crystal-lang/crystal/pull/16265
[#16375]: https://github.com/crystal-lang/crystal/pull/16375
[#16286]: https://github.com/crystal-lang/crystal/pull/16286
[#16321]: https://github.com/crystal-lang/crystal/pull/16321
[#16340]: https://github.com/crystal-lang/crystal/pull/16340
[#16351]: https://github.com/crystal-lang/crystal/pull/16351
[#16352]: https://github.com/crystal-lang/crystal/pull/16352
[#16369]: https://github.com/crystal-lang/crystal/pull/16369
[#16383]: https://github.com/crystal-lang/crystal/pull/16383
[#16465]: https://github.com/crystal-lang/crystal/pull/16465
[#16446]: https://github.com/crystal-lang/crystal/pull/16446

#### compiler

- _(cli)_ chore: correct progress step count to 14 ([#16269], thanks @miry)
- _(codegen)_ Fix System V ABI for arrays of packed structs with misaligned fields ([#16314], thanks @HertzDevil)
- _(debugger)_ Fix debug info for closured variables ([#16393], thanks @HertzDevil)
- _(interpreter)_ interpreter handles `self` in inlined method with arguments ([#16307], thanks @cyangle)
- _(interpreter)_ interpreter `typeof` should return concrete type ([#16379], thanks @cyangle)
- _(interpreter)_ Fix variable shadowing bug in interpreter ([#16335], thanks @cyangle)
- _(interpreter)_ interpreter musn't reuse dead fiber stacks ([#16518], thanks @ysbaddaden)
- _(parser)_ Fix internal error if multi-assign RHS has splats ([#16182], thanks @HertzDevil)
- _(parser)_ Fix regex delimiter detection in syntax highlighter ([#16394], thanks @HertzDevil)
- _(parser)_ Merge adjacent StringLiterals before yielding ([#16427], thanks @Blacksmoke16)
- _(parser)_ Fix `Call#end_location` w/ named arguments off-by-one error ([#16542], thanks @Sija)
- _(parser)_ Fix incorrect location for parenthesized union AST nodes ([#16552], thanks @Sija)
- _(semantic)_ Fix instantiation of abstract generic structs in virtual type lookup ([#16513], thanks @Blacksmoke16)
- _(semantic)_ Fix variables assigned inside `&&` conditions with method calls incorrectly got `Nil` added to their type ([#16512], thanks @Blacksmoke16)

[#16269]: https://github.com/crystal-lang/crystal/pull/16269
[#16314]: https://github.com/crystal-lang/crystal/pull/16314
[#16393]: https://github.com/crystal-lang/crystal/pull/16393
[#16307]: https://github.com/crystal-lang/crystal/pull/16307
[#16379]: https://github.com/crystal-lang/crystal/pull/16379
[#16335]: https://github.com/crystal-lang/crystal/pull/16335
[#16518]: https://github.com/crystal-lang/crystal/pull/16518
[#16182]: https://github.com/crystal-lang/crystal/pull/16182
[#16394]: https://github.com/crystal-lang/crystal/pull/16394
[#16427]: https://github.com/crystal-lang/crystal/pull/16427
[#16542]: https://github.com/crystal-lang/crystal/pull/16542
[#16552]: https://github.com/crystal-lang/crystal/pull/16552
[#16513]: https://github.com/crystal-lang/crystal/pull/16513
[#16512]: https://github.com/crystal-lang/crystal/pull/16512

#### tools

- _(docs-generator)_ Fix doc generation when nesting multiple `:inherit:` directives ([#16443], thanks @Blacksmoke16)
- _(docs-generator)_ Fix some doc inconsistencies for macros ([#16561], thanks @Blacksmoke16)
- _(formatter)_ Fix incorrect formatting of multi-line macro expression with comment as first line ([#16429], thanks @Blacksmoke16)
- _(formatter)_ Add multi-line formatting support to `Generic` formatter visitor ([#16430], thanks @Blacksmoke16)

[#16443]: https://github.com/crystal-lang/crystal/pull/16443
[#16561]: https://github.com/crystal-lang/crystal/pull/16561
[#16429]: https://github.com/crystal-lang/crystal/pull/16429
[#16430]: https://github.com/crystal-lang/crystal/pull/16430

### Chores

#### lang

- _(macros)_ **[deprecation]** Deprecate single-letter macro fresh variables with indices ([#16267], thanks @HertzDevil)
- _(macros)_ **[deprecation]** Deprecate macro fresh variables with constant names ([#16293], thanks @HertzDevil)

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

#### stdlib

- _(macros)_ **[deprecation]** Deprecate `StringLiteral#split(ASTNode)` for non-separator arguments ([#16439], thanks @HertzDevil)
- _(time)_ **[deprecation]** Deprecate `Time#inspect(io, *, with_nanoseconds)` ([#16416], thanks @straight-shoota)
- _(time)_ **[deprecation]** Deprecate `Time.monotonic` ([#16545], thanks @straight-shoota)

[#16439]: https://github.com/crystal-lang/crystal/pull/16439
[#16416]: https://github.com/crystal-lang/crystal/pull/16416
[#16545]: https://github.com/crystal-lang/crystal/pull/16545

#### compiler

- _(cli)_ Error when trying to build aarch64 with LLVM 12 and below ([#15018], thanks @straight-shoota)

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

#### other

- Update copyright year ([#16550], thanks @HertzDevil)
- Remove redundant `begin`/`end` blocks ([#16554], thanks @straight-shoota)

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

### Performance

#### stdlib

- Avoid calling `times.map` ([#16422], thanks @HertzDevil)
- _(runtime)_ Skip initialization of `Pointer.malloc` with zero value ([#16333], thanks @straight-shoota)
- _(runtime)_ Call `Pointer.malloc(size, value)` in `Slice.new(size, value)` ([#16358], thanks @straight-shoota)

[#16422]: https://github.com/crystal-lang/crystal/pull/16422
[#16333]: https://github.com/crystal-lang/crystal/pull/16333
[#16358]: https://github.com/crystal-lang/crystal/pull/16358

#### compiler

- Group temporary variables by file name: splats ([#16242], thanks @HertzDevil)
- _(codegen)_ **[regression]** Only define the type name table in the main LLVM module ([#16260], thanks @HertzDevil)
- _(codegen)_ Allow closures to use atomic allocation ([#16360], thanks @HertzDevil)

[#16242]: https://github.com/crystal-lang/crystal/pull/16242
[#16260]: https://github.com/crystal-lang/crystal/pull/16260
[#16360]: https://github.com/crystal-lang/crystal/pull/16360

### Refactor

#### stdlib

- Refactor flag and value parsing into a separate method ([#16300], thanks @straight-shoota)
- _(cli)_ Refactor `OptionParser#parse` ([#16233], thanks @kojix2)
- _(cli)_ Simplify `OptionParser#handle_flag` with guard clauses ([#16309], thanks @kojix2)
- _(files)_ Fix: don't flush twice in `File#truncate` (UNIX) ([#16395], thanks @ysbaddaden)
- _(llvm)_ simplify target initialization and support more targets ([#16437], thanks @ysbaddaden)
- _(log)_ `Log::Metadata` should put parent entries first on extend (like `Hash#merge`) ([#16098], thanks @spuun)
- _(networking)_ Split `HTTP::Headers#get(Key)` into undocumented overload ([#16283], thanks @straight-shoota)
- _(networking)_ Remove internal type `OAuth::Params` ([#16319], thanks @AnandRaj2224)
- _(runtime)_ Refactor `Crystal::DWARF::LineNumbers::Sequence` ([#16214], thanks @HertzDevil)
- _(runtime)_ Extract `Crystal::EventLoop#shutdown` from `#close` ([#16288], [#16366], thanks @ysbaddaden)
- _(runtime)_ Prefer `Random::Secure.random_bytes` ([#16298], thanks @ysbaddaden)
- _(runtime)_ Set default `random` arg to `nil` instead of `Random::DEFAULT` ([#16299], thanks @ysbaddaden)
- _(runtime)_ Drop `EventLoop#after_fork_before_exec` ([#16332], thanks @straight-shoota)
- _(runtime)_ Cleanup node on `Crystal::PointerLinkedList#delete` ([#16398], thanks @ysbaddaden)
- _(runtime)_ Add `Fiber::Stack#size` ([#16420], thanks @ysbaddaden)
- _(runtime)_ Fix: `new_thread` spec helper must return isolated context (not thread) ([#16421], thanks @ysbaddaden)
- _(runtime)_ Fix: always use getrandom on Linux and Android >= 28 ([#16478], thanks @ysbaddaden)
- _(system)_ Extract `Crystal::System::Env.each_pointer` on Unix ([#16200], thanks @straight-shoota)
- _(system)_ Refactor internal `Crystal::System::Process#fork` on UNIX ([#16191], [#16373], thanks @ysbaddaden, @straight-shoota)
- _(system)_ Use `execvpe` when available ([#16294], [#16311], thanks @straight-shoota)
- _(system)_ Add `Env.make_envp` ([#16320], [#16384], thanks @straight-shoota)
- _(system)_ Fix pre-exec for closed file descriptor ([#16359], thanks @straight-shoota)
- _(system)_ Move `prepare_args` into system implementation internals ([#16362], thanks @straight-shoota)
- _(system)_ Extract `unix/spawn.cr` as a separate file ([#16388], thanks @straight-shoota)
- _(system)_ Extract internal `Process.block_signals` helper ([#16402], thanks @straight-shoota)
- _(system)_ Rename target `aarch64-android` to `aarch64-linux-android` ([#16409], thanks @straight-shoota)
- _(text)_ Simplify `String#byte_slice(Int)` and `String#byte_slice?(Int)` ([#16235], thanks @andrykonchin)
- _(time)_ Use `clock_gettime` on darwin ([#16492], thanks @straight-shoota)
- _(time)_ Add `Crystal::System::Time.instant` ([#16506], thanks @straight-shoota)
- _(time)_ Replace `Time.monotonic` with `Time.instant` [follow-up #16490] ([#16498], thanks @straight-shoota)
- _(time)_ remove extraneous method definition for `Time::Span#sign` ([#16553], thanks @plambert)

[#16300]: https://github.com/crystal-lang/crystal/pull/16300
[#16233]: https://github.com/crystal-lang/crystal/pull/16233
[#16309]: https://github.com/crystal-lang/crystal/pull/16309
[#16395]: https://github.com/crystal-lang/crystal/pull/16395
[#16437]: https://github.com/crystal-lang/crystal/pull/16437
[#16098]: https://github.com/crystal-lang/crystal/pull/16098
[#16283]: https://github.com/crystal-lang/crystal/pull/16283
[#16319]: https://github.com/crystal-lang/crystal/pull/16319
[#16214]: https://github.com/crystal-lang/crystal/pull/16214
[#16288]: https://github.com/crystal-lang/crystal/pull/16288
[#16366]: https://github.com/crystal-lang/crystal/pull/16366
[#16298]: https://github.com/crystal-lang/crystal/pull/16298
[#16299]: https://github.com/crystal-lang/crystal/pull/16299
[#16332]: https://github.com/crystal-lang/crystal/pull/16332
[#16398]: https://github.com/crystal-lang/crystal/pull/16398
[#16420]: https://github.com/crystal-lang/crystal/pull/16420
[#16421]: https://github.com/crystal-lang/crystal/pull/16421
[#16478]: https://github.com/crystal-lang/crystal/pull/16478
[#16200]: https://github.com/crystal-lang/crystal/pull/16200
[#16191]: https://github.com/crystal-lang/crystal/pull/16191
[#16373]: https://github.com/crystal-lang/crystal/pull/16373
[#16294]: https://github.com/crystal-lang/crystal/pull/16294
[#16311]: https://github.com/crystal-lang/crystal/pull/16311
[#16320]: https://github.com/crystal-lang/crystal/pull/16320
[#16384]: https://github.com/crystal-lang/crystal/pull/16384
[#16359]: https://github.com/crystal-lang/crystal/pull/16359
[#16362]: https://github.com/crystal-lang/crystal/pull/16362
[#16388]: https://github.com/crystal-lang/crystal/pull/16388
[#16402]: https://github.com/crystal-lang/crystal/pull/16402
[#16409]: https://github.com/crystal-lang/crystal/pull/16409
[#16235]: https://github.com/crystal-lang/crystal/pull/16235
[#16492]: https://github.com/crystal-lang/crystal/pull/16492
[#16506]: https://github.com/crystal-lang/crystal/pull/16506
[#16498]: https://github.com/crystal-lang/crystal/pull/16498
[#16553]: https://github.com/crystal-lang/crystal/pull/16553

### Documentation

#### lang

- _(annotations)_ Fix `@[Deprecated]` doc comment ([#16302], thanks @jgaskins)

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

#### stdlib

- _(collection)_ Clarify `Set`'s enumeration order ([#16274], thanks @HertzDevil)
- _(concurrency)_ Add docs for `Sync` namespace ([#16565], thanks @ysbaddaden)
- _(crypto)_ Remove outdated performance hint in `Bcrypt` docs ([#16536], thanks @BlobCodes)
- _(macros)_ Fix invalid runtime types in macro docs ([#16534], thanks @BlobCodes)
- _(networking)_ Add type restrictions to `OAuth::Consumer#get_authorize_uri` ([#16285], thanks @straight-shoota)
- _(numeric)_ Improve docs for `Int` to mention `Int128` and `UInt128` ([#16529], thanks @HCLarsen)
- _(runtime)_ Use `to_slice` for presentation in `Pointer` doc examples ([#16345], thanks @straight-shoota)
- _(system)_ Add type restrictions to process ([#16065], thanks @Vici37)
- _(text)_ Document `String#split(Regex)`'s capture group behavior ([#16207], thanks @HertzDevil)
- _(text)_ Add type restrictions to regex directory ([#16066], thanks @Vici37)

[#16274]: https://github.com/crystal-lang/crystal/pull/16274
[#16565]: https://github.com/crystal-lang/crystal/pull/16565
[#16536]: https://github.com/crystal-lang/crystal/pull/16536
[#16534]: https://github.com/crystal-lang/crystal/pull/16534
[#16285]: https://github.com/crystal-lang/crystal/pull/16285
[#16529]: https://github.com/crystal-lang/crystal/pull/16529
[#16345]: https://github.com/crystal-lang/crystal/pull/16345
[#16065]: https://github.com/crystal-lang/crystal/pull/16065
[#16207]: https://github.com/crystal-lang/crystal/pull/16207
[#16066]: https://github.com/crystal-lang/crystal/pull/16066

### Specs

#### lang

- _(macros)_ Enhance specs for `flag?` macro ([#16336], thanks @straight-shoota)

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

#### stdlib

- _(collection)_ Add specs for `Slice.new` ([#16424], thanks @straight-shoota)
- _(concurrency)_ Fix thread name expectation with parallel execution context ([#16517], thanks @straight-shoota)
- _(crypto)_ Fix: remove 1 second sleep in openssl/ssl/server spec ([#16454], thanks @ysbaddaden)
- _(files)_ Add specs for `IO#read_bytes` with converter ([#16250], thanks @straight-shoota)
- _(networking)_ Fix TCP specs to accept `EAI_NODATA` instead of `EAI_NONAME` for unresolvable hostname ([#16496], thanks @straight-shoota)
- _(system)_ Add specs for `Process.run` ([#16306], [#16325], thanks @straight-shoota)
- _(time)_ Update zoneinfo to TZDB version 2025c ([#16501], thanks @straight-shoota)

[#16424]: https://github.com/crystal-lang/crystal/pull/16424
[#16517]: https://github.com/crystal-lang/crystal/pull/16517
[#16454]: https://github.com/crystal-lang/crystal/pull/16454
[#16250]: https://github.com/crystal-lang/crystal/pull/16250
[#16496]: https://github.com/crystal-lang/crystal/pull/16496
[#16306]: https://github.com/crystal-lang/crystal/pull/16306
[#16325]: https://github.com/crystal-lang/crystal/pull/16325
[#16501]: https://github.com/crystal-lang/crystal/pull/16501

#### compiler

- _(semantic)_ Drop `assert_expand_second` and `assert_expand_third` helpers ([#16244], thanks @HertzDevil)

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

### Infrastructure

- Changelog for 1.19.0 ([#16510], thanks @ysbaddaden)
- Update previous Crystal release 1.18.1 ([#16212], thanks @matiasgarciaisaia)
- Fix shellcheck violations ([#16221], thanks @straight-shoota)
- Fix markdownlint violations ([#16222], [#16252], thanks @straight-shoota)
- Merge `release/1.18`@`1.18.2` into `master` ([#16246], thanks @straight-shoota)
- Enable ameba rule `Lint/SpecFilename` ([#16223], thanks @straight-shoota)
- Encourage +1 reactions on issues and PRs for prioritization ([#16241], thanks @straight-shoota)
- Update previous Crystal release 1.18.2 ([#16249], thanks @straight-shoota)
- Add `devenv` ([#16263], thanks @straight-shoota)
- Add `ameba` to `git-hooks` ([#16276], [#16295], thanks @straight-shoota)
- Add `devenv` profile `lint` ([#16291], thanks @straight-shoota)
- Update distribution-scripts ([#16301], thanks @straight-shoota)
- Makefile: Extract variable `COMPILER_FLAGS` ([#16349], [#16372], thanks @straight-shoota)
- Fix `shell.nix` on Linux ([#16346], thanks @straight-shoota)
- Build compiler with `-Dpreview_mt` ([#16380], thanks @straight-shoota)
- Update `devenv.lock` ([#16386], thanks @github-actions)
- Update `devenv.lock` ([#16408], thanks @github-actions)
- Drop committed `.envrc` ([#16462], thanks @straight-shoota)
- Add git-hook to ensure changing both `Makefile` and `Makefile.win` at the same time ([#16503], thanks @straight-shoota)
- Makefile: Use simply expanded variables to avoid costly duplicate evaluation ([#16509], thanks @straight-shoota)
- Fix `scripts/update-shards.sh` ([#16524], thanks @straight-shoota)
- Update distribution-scripts ([#16530], thanks @straight-shoota)
- Update shards 0.20.0 ([#16523], thanks @straight-shoota)
- Update typos 1.38.1 ([#16219], thanks @straight-shoota)
- Build snap arm64 target + drop publish_snap target ([#16491], thanks @ysbaddaden)
- _(ci)_ Update darwin jobs in circleci to `m4pro.medium` resource class ([#16389], thanks @straight-shoota)
- _(ci)_ Update xcode to 26.0.1 on circleci ([#16201], thanks @straight-shoota)
- _(ci)_ Update korthout/backport-action action to v3.4.1 ([#16215], thanks @renovate)
- _(ci)_ **[security]** Pin GitHub action uses to commit hash ([#16253], thanks @straight-shoota)
- _(ci)_ Add lint workflow running `pre-commit` ([#16275], [#16296], thanks @straight-shoota)
- _(ci)_ Fix issues in GHA workflows ([#16282], thanks @straight-shoota)
- _(ci)_ Update GH Actions ([#16290], thanks @renovate)
- _(ci)_ Update crate-ci/typos action to v1.39.0 ([#16326], thanks @renovate)
- _(ci)_ Refactor matrix configuration in Linux workflow ([#16331], thanks @straight-shoota)
- _(ci)_ Reduce smoke tests to building only `std_spec` ([#16337], thanks @straight-shoota)
- _(ci)_ Merge gnu and musl tests into a single matrix ([#16341], thanks @straight-shoota)
- _(ci)_ Fix `pull_request` trigger for `smoke` workflow ([#16343], thanks @straight-shoota)
- _(ci)_ Update GH Actions ([#16385], thanks @renovate)
- _(ci)_ Add workflow `update-devenv` ([#16387], thanks @straight-shoota)
- _(ci)_ Update GH Actions ([#16434], thanks @renovate)
- _(ci)_ Update distribution-scripts ([#16411], thanks @straight-shoota)
- _(ci)_ Run smoke tests on docker images ([#16441], thanks @straight-shoota)
- _(ci)_ Update actions/checkout digest to 8e8c483 ([#16474], thanks @renovate)
- _(ci)_ Remove `test_dist_linux_on_docker` job ([#16410], thanks @straight-shoota)
- _(ci)_ Push docker images directly to registry ([#16488], thanks @straight-shoota)
- _(ci)_ Enable multiarch docker builds ([#16493], thanks @straight-shoota)
- _(ci)_ Run multi-threading test job with execution context ([#16339], thanks @straight-shoota)
- _(ci)_ build linux aarch64 tarballs ([#16330], thanks @ysbaddaden)

[#16510]: https://github.com/crystal-lang/crystal/pull/16510
[#16212]: https://github.com/crystal-lang/crystal/pull/16212
[#16221]: https://github.com/crystal-lang/crystal/pull/16221
[#16222]: https://github.com/crystal-lang/crystal/pull/16222
[#16252]: https://github.com/crystal-lang/crystal/pull/16252
[#16246]: https://github.com/crystal-lang/crystal/pull/16246
[#16223]: https://github.com/crystal-lang/crystal/pull/16223
[#16241]: https://github.com/crystal-lang/crystal/pull/16241
[#16249]: https://github.com/crystal-lang/crystal/pull/16249
[#16263]: https://github.com/crystal-lang/crystal/pull/16263
[#16276]: https://github.com/crystal-lang/crystal/pull/16276
[#16295]: https://github.com/crystal-lang/crystal/pull/16295
[#16291]: https://github.com/crystal-lang/crystal/pull/16291
[#16301]: https://github.com/crystal-lang/crystal/pull/16301
[#16349]: https://github.com/crystal-lang/crystal/pull/16349
[#16372]: https://github.com/crystal-lang/crystal/pull/16372
[#16346]: https://github.com/crystal-lang/crystal/pull/16346
[#16380]: https://github.com/crystal-lang/crystal/pull/16380
[#16386]: https://github.com/crystal-lang/crystal/pull/16386
[#16408]: https://github.com/crystal-lang/crystal/pull/16408
[#16462]: https://github.com/crystal-lang/crystal/pull/16462
[#16503]: https://github.com/crystal-lang/crystal/pull/16503
[#16509]: https://github.com/crystal-lang/crystal/pull/16509
[#16524]: https://github.com/crystal-lang/crystal/pull/16524
[#16530]: https://github.com/crystal-lang/crystal/pull/16530
[#16523]: https://github.com/crystal-lang/crystal/pull/16523
[#16219]: https://github.com/crystal-lang/crystal/pull/16219
[#16491]: https://github.com/crystal-lang/crystal/pull/16491
[#16389]: https://github.com/crystal-lang/crystal/pull/16389
[#16201]: https://github.com/crystal-lang/crystal/pull/16201
[#16215]: https://github.com/crystal-lang/crystal/pull/16215
[#16253]: https://github.com/crystal-lang/crystal/pull/16253
[#16275]: https://github.com/crystal-lang/crystal/pull/16275
[#16296]: https://github.com/crystal-lang/crystal/pull/16296
[#16282]: https://github.com/crystal-lang/crystal/pull/16282
[#16290]: https://github.com/crystal-lang/crystal/pull/16290
[#16326]: https://github.com/crystal-lang/crystal/pull/16326
[#16331]: https://github.com/crystal-lang/crystal/pull/16331
[#16337]: https://github.com/crystal-lang/crystal/pull/16337
[#16341]: https://github.com/crystal-lang/crystal/pull/16341
[#16343]: https://github.com/crystal-lang/crystal/pull/16343
[#16385]: https://github.com/crystal-lang/crystal/pull/16385
[#16387]: https://github.com/crystal-lang/crystal/pull/16387
[#16434]: https://github.com/crystal-lang/crystal/pull/16434
[#16411]: https://github.com/crystal-lang/crystal/pull/16411
[#16441]: https://github.com/crystal-lang/crystal/pull/16441
[#16474]: https://github.com/crystal-lang/crystal/pull/16474
[#16410]: https://github.com/crystal-lang/crystal/pull/16410
[#16488]: https://github.com/crystal-lang/crystal/pull/16488
[#16493]: https://github.com/crystal-lang/crystal/pull/16493
[#16339]: https://github.com/crystal-lang/crystal/pull/16339
[#16330]: https://github.com/crystal-lang/crystal/pull/16330
