Changelog

July 24, 2026 ยท View on GitHub

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

2.11.0 - 2026-07-24

๐Ÿž Bug Fixes

  • (all) Eliminate dead bindings left by CE/inline lowering (#4837) (9f694e97)
  • (beam) Make reflection metadata agree with record/union codegen (#4849) (ec6a3df0)
  • (js/ts) Resolve generic params when reflecting erased union fields (#4851) (619d7afd)
  • (js/ts,python) Inline Option/ValueOption combinators to avoid closures and allocations (#4836) (61cac646)

โšก Performance Improvements

  • (all) Lower constant ยฑ1 step ranges to counted for-loops (#4838) (ab28daec)

View changes on Github

2.10.0 - 2026-07-22

๐Ÿš€ Features

  • (beam) Render %A in F# syntax instead of dumping Erlang terms (#4814) (218e0c40)

๐Ÿž Bug Fixes

  • (beam) Correct char-to-string conversion and console Unicode encoding (#4812) (df8e01d6)
  • (beam) Isolate each top-level effect's variables in main/0 (#4815) (8d708633)
  • (beam) Decode UTF-8 codepoints in ToCharArray and related String functions (b2ce3067)

View changes on Github

2.9.0 - 2026-07-17

๐Ÿš€ Features

๐Ÿž Bug Fixes

  • (python) Make class declarations and references agree on type names (#4807) (ae4b910b)

View changes on Github

2.8.0 - 2026-07-16

๐Ÿš€ Features

  • (beam) Support Environment.CurrentDirectory and GetEnvironmentVariable (#4801) (55b9d560)

  • (beam) Support setting Environment.CurrentDirectory (#4783) (7b2a262f)

  • (rust) Various codegen and runtime improvements (#4781) (ae10cd2c)

    • Cast bool to integer types; support ** via .powf
    • Add Decimal.IsInteger/IsEvenInteger/IsOddInteger/IsCanonical
    • Fix two-switch decision trees dispatching to the wrong target
    • Fix reference-typed match bindings panicking via mem::zeroed
    • Fix string and non-ident option pattern matches emitting invalid Rust match arms
    • Fix Convert.ToXxx(bool)
    • Fix Char.ToUpper/ToLower truncating multi-char case mappings
    • Fix Random.nextDouble panic message
    • Fix Map.find/tryFind panicking on reference-typed values

๐Ÿž Bug Fixes

  • (all) Skip translating unreachable branch of constant-condition if/then/else (#4799) (53c06de1)

View changes on Github

2.7.0 - 2026-07-15

๐Ÿš€ Features

  • (js/ts) Add System.IO.Directory support (Exists, CreateDirectory) (#4798) (6568f35e)
  • (js/ts/python/beam) Preserve member calls and pattern matches in quotations (#4780) (55482e6b)

๐Ÿž Bug Fixes

  • (beam) Make Assert.AreEqual/NotEqual raise, and stop emitting reflection calls for erased types (#4775) (d9711d4c)

View changes on Github

2.6.2 - 2026-07-13

๐Ÿž Bug Fixes

  • (beam) Make F# reflection work on the Beam target (#4766) (b15b280d)
  • (beam) Give sized integers .NET fixed-width semantics (#4769) (2ed39630)
  • (beam) Qualify Erlang module names by their OTP app (#4770) (5516c8d8)
  • (beam) Entry point argv and exit code, bigint from float, option reflection (#4772) (ea915541)

View changes on Github

2.6.1 - 2026-07-11

๐Ÿž Bug Fixes

  • (beam) Order discriminated union comparison by declaration order (#4761) (3597a582)
  • (beam) Preserve function-value identity for PhysicalEquality (#4762) (727673f3)
  • (js/ts) Don't drop unsupported jsOptions statements when inlining as POJO (#4754) (4cbc44fc)
  • (python) Propagate [] return value as process exit code (#4763) (a8d9bf5f)

View changes on Github

2.6.0 - 2026-07-09

๐Ÿž Bug Fixes

  • (all) Include original exception message when loading a Fable plugin fails (#4739) (659e73a4)
  • (all) Add Seq.enumerateTryWith for try/with in seq, list, array comprehensions (#4750) (448c90d7)
  • (js/ts) Represent union cases with no fields as singletons (3f6e618e)
  • (python) Represent union cases with no fields as singletons (0211b4cc)
  • (python) Emit forward reference for self-referencing static union members (#4752) (452b85f2)
  • (python) Match .NET NaN and signed-zero semantics in comparison, min and max (383bb93c)
  • (python) LastIndexOf(value, startIndex) off-by-one on inclusive boundary (bad6bcac)

โšก Performance Improvements

  • (python) Use native operators for int64/uint64 arithmetic (#4727) (f062d668)
  • (python) Rewrite hot Seq combinators as native Python generators (#4728) (73e0eab9)
  • (python) Read union case fields directly instead of rebuilding Array (#4725) (e4eaa80b)

View changes on Github

2.5.0 - 2026-07-05

๐Ÿš€ Features

  • (all) Allow [<Emit>] on StringEnum cases (#4711) (0b1f61ee)
  • (js/ts) Optimize printfn with constant string to console.log (#4718) (2d6d083a)
  • (js/ts) Add Path.Combine support (b1b1e273)
  • (js/ts) Add System.IO.Path and System.IO.File API support (ec99fac5)
  • (js/ts/python) Warn on duplicate attached member names (#4715) (fd06aa64)
  • (js/ts/python) Add Environment and Console.Error support (6e082f95)
  • (py) Add Path.Combine support (4c901c65)
  • (python) Add Directory.Exists, Directory.CreateDirectory (f4b4eabc)
  • (ts) [] interfaces extend parent [] type (#4717) (4f4243cd)

๐Ÿž Bug Fixes

  • Generate an error on erased union case typed as obj (#4710) (bf2134d5)
  • (all) Include return type in overload suffix for op_Implicit/op_Explicit (#4712) (a6846010)
  • (js/ts) DateTime.ToString() and %A are now consistent across all DateTimeKind values (#4714) (de98b0e4)
  • (python) Accept allowAccessToPrivateRepresentation in FSharpType.IsUnion/IsRecord/GetUnionCases (#4722) (7f915f1d)
  • (ts) Strip byref annotation from compiler-generated copy-update locals (#4716) (1e072ed2)

โšก Performance Improvements

  • Split Fable.Transforms into per-target projects for faster incremental builds (#4720) (260c962f)

View changes on Github

2.4.0 - 2026-06-30

๐Ÿš€ Features

  • (all) Add Compiler.is* target detection flags for conditional branching (#4692) (621dea31)
  • (js/ts) Map task { } to Promise (97f54d36)

๐Ÿž Bug Fixes

  • (all) Pass raw value for optional arguments of native bindings (#4688) (a4c75483)
  • (all) Support .NET format specifiers and alignment in interpolated strings (#4695) (7c50a3af)
  • (all) Error on inline function referencing private value (#4701) (cea6806e)
  • (beam) Support module-level mutable variables via process dictionary (#4676) (535b9af0)
  • (beam) Namespace module-level mutable state keys by module (#4683) (1ec28ab1)
  • (js) Respect StringComparison in String.IndexOf/LastIndexOf (#4681) (7cb92d52)
  • (js/ts) Decompress F#-compressed signature data in fcs-fable (#4684) (62bfc612)
  • (js/ts) Implicit DateTime to DateTimeOffset conversion (#4697) (fcbd9b91)
  • (js/ts) Hoist emitJsStatement imports with trailing comments (#4702) (e820eb72)
  • (js/ts) Uncurry mutable module value alias calls (#4703) (0de0d218)
  • (js/ts) Pass TypeInfo to getRecordFields to handle None fields in anonymous records (#4704) (c977d78b)
  • (js/ts/python) Drop allowAccessToPrivateRepresentation arg from reflection calls (#4689) (ec3cded7)
  • (ts) Use declared type-param names in object expression generic methods (#4685) (1c3e7d99)
  • (ts) Use signature type-param names when implementing generic interface methods (#4686) (03e5deee)
  • (ts) Bound enum-constrained type parameters with extends number (#4687) (15daf624)
  • (ts) Keep enclosing type parameters in scope for nested members (#4691) (f5723a2d)
  • (ts) Re-declare class type params on generic static attached members (#4696) (2da50780)
  • (ts) Filter class type params from attached let-binding methods (#4700) (d3a6a1dd)

View changes on Github

2.3.0 - 2026-06-24

๐Ÿš€ Features

  • (all) Support Exception.InnerException across all targets (#4677) (c9b3ee24)

๐Ÿž Bug Fixes

  • (beam) Make immutable class instances process-portable (#4670) (182eebef)

View changes on Github

2.2.0 - 2026-06-16

๐Ÿš€ Features

  • (beam) Add !^ erased-cast operator to BeamInterop (#4659) (206776b)

๐Ÿž Bug Fixes

  • Add type specifiers to interpolated strings (#4646) (512ae4d)
  • (all) Align invalidArg error message with .NET format (#4662) (e672eb7)
  • (beam) Preserve element type through Option.Value for interface dispatch (#4661) (e5521b6)
  • (python) Emit wildcard default for union or-patterns (#4649) (#4653) (c96f0ec)

View changes on Github

2.1.0 - 2026-06-10

๐Ÿš€ Features

  • (beam) Support Erlang/BEAM target in standalone compiler (#4644) (30310e4)

๐Ÿž Bug Fixes

  • (beam) Collapse array-literal process-dict ref round-trips in FFI/Emit calls (#4626) (234ee08)
  • (beam) Make Emit $N substitution a single left-to-right pass (#4631) (48af8db)
  • (js/ts) Throw an error when trying to set non-property memeber inside of jsOptions (#4624) (2d9673f)
  • (python) Avoid union case field name collision with Union.name (#4647) (ff5df24)
  • (python) Make [] union static members work (#4634) (#4636) (15eb83e)

View changes on Github

2.0.1 - 2026-05-28

๐Ÿž Bug Fixes

  • [JS/TS/Tests] Remove mocha to resolve package vulnerabilities (#4604) (092324b)
  • [Rust] Update hashing and datetime tests (#4613) (9d39037)
  • (all) Duplicate LetRec bindings during inline expansion (#4592) (62612a5)
  • (all) Fix super call in multi-level generic class hierarchy using wrong mangled name (#4414) (db1d4d2)
  • (js/ts) Fix JSX props with long string values causing compile error (fixes #3839) (#4545) (d828a46)
  • (js/ts) Add support for match clauses in JSX.create (#4620) (616edca)
  • (js/ts) Don't spread last arg in String.Concat call (#4621) (3de580e)
  • (js/ts) Inline AttachMembers members at call sites (#4622) (63bcd3d)
  • (python) Avoid duplicate captured argument in hoisted guards (#4610) (#4611) (90aec48)

View changes on Github

2.0.0 - 2026-04-21

  • Fable 5.0.0

2.0.0-rc.7 - 2026-04-07

  • Fable 5.0.0-rc.7

2.0.0-rc.6 - 2026-03-31

  • Fable 5.0.0-rc.6

2.0.0-rc.5 - 2026-03-20

  • Fable 5.0.0-rc.5

2.0.0-rc.4 - 2026-03-19

  • Fable 5.0.0-rc.4

2.0.0-rc.3 - 2026-03-10

  • Fable 5.0.0-rc.3

2.0.0-rc.2 - 2026-03-03

  • Fable 5.0.0-rc.2

2.0.0-rc.1 - 2026-02-26

  • Fable 5.0.0-rc.1

2.0.0-beta.15 - 2026-02-13

  • Fable 5.0.0-alpha.24

2.0.0-beta.14 - 2026-02-03

  • Fable 5.0.0-alpha.23

2.0.0-beta.13 - 2025-12-26

  • Fable 5.0.0-alpha.22

2.0.0-beta.12 - 2025-12-15

  • Fable 5.0.0-alpha.21

2.0.0-beta.11 - 2025-12-08

  • Fable 5.0.0-alpha.20

2.0.0-beta.10 - 2025-12-04

  • Fable 5.0.0-alpha.19

2.0.0-beta.9 - 2025-12-03

  • Fable 5.0.0-alpha.18

2.0.0-beta.8 - 2025-11-27

  • Fable 5.0.0-alpha.17

2.0.0-beta.7 - 2025-11-25

  • Fable 5.0.0-alpha.16

2.0.0-beta.6 - 2025-11-19

  • Fable 5.0.0-alpha.15

2.0.0-beta.5 - 2025-07-25

  • Fable 5.0.0-alpha.14

2.0.0-beta.4 - 2025-05-04

  • Fable 5.0.0-alpha.13 - 2025-05-04

2.0.0-beta.3 - 2025-03-14

  • Fable 5.0.0-alpha.12

2.0.0-beta.2 - 2025-03-03

  • Fable 5.0.0-alpha.11

2.0.0-beta.1 - 2025-02-16

  • Fable 5.0.0-alpha.10
  • Replace FABLE_COMPILER_4 with FABLE_COMPILER_5 as the compiler directive

1.12.0 - 2024-11-19

  • Fable 4.24.0

1.11.0 - 2024-10-28

  • Fable 4.23.0

1.10.0 - 2024-10-02

  • Fable 4.22.0

1.9.0 - 2024-09-19

  • Fable 4.21.0

1.9.0 - 2024-09-04

  • Fable 4.20.0

1.8.1 - 2024-06-17

  • Fable 4.19.3

1.8.0 - 2024-06-13

Changed

  • Fable 4.19.1

1.7.0 - 2024-06-10

Changed

  • Fable 4.19.0

1.6.0 - 2024-05-23

Fixed

  • Make dirname-filename-esm a dependency instead of a devDependency

Changed

  • Fable 4.18.0

1.5.0 - 2024-03-20

Changed

  • Fable 4.17.0

1.4.0 - 2024-03-20

Changed

  • Fable 4.16.0

1.3.0 - 2024-03-18

Changed

  • Fable 4.15.0

1.2.0 - 2024-03-01

Changed

  • Fable 4.14.0

1.1.0 - 2024-02-20

Changed

  • Fable 4.13.0

1.0.0 - 2024-02-12

  • Release stable version

1.0.0-beta-001 - 2024-02-12

Changed

  • First release as part of @fable-org scope
  • Released as part of Fable 4.12.0