All notable changes to Floe will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.5.3 (2026-04-19)
0.5.2 (2026-04-19)
- re-trigger release-please for contextual lambda typing fix (ec476a2)
0.5.1 (2026-04-19)
- [#1229] override cross linker so release builds don't break on missing clang (#1230) (94b7c25)
- [#1231] drop let from VSCode invalid keyword list (#1233) (2bedafd)
0.5.0 (2026-04-19)
- [#1214] binding + arrow redesign — def-form functions, single
->arrow (#1223) - [#1208] type system redesign — universal
=,=>in type positions,OneOf/Intersect(#1222)
- [#1192] ship @floeorg/esbuild-plugin (#1193) (f71289c)
- [#1200] make
usea contextual keyword + object-destructure bindings (#1207) (f5a7acb) - [#1208] type system redesign — universal
=,=>in type positions,OneOf/Intersect(#1222) (530e701) - [#1214] binding + arrow redesign — def-form functions, single
->arrow (#1223) (5490630) - [#1224] add floe-doc-check for syntax-checking docs samples (#1225) (090717f)
- [#1194] expose Router.fetch so
export default appworks under Workers (#1196) (f1c845f) - [#1197] resolve overloaded method return types via _chain_call probes (#1205) (78aada0)
- [#1198] cover trailing newlines in LSP format TextEdit range (#1199) (07cab1f)
- [#1209] instantiate + unify generics in bare-identifier pipes (#1216) (29a73e3)
- [#1210] build @floeorg/* integrations on pnpm install (#1212) (9d3c607)
- [#1211] preserve generic args on Foreign type references (#1213) (86c5958)
0.4.8 (2026-04-18)
- [#1051] Add |>? pipe-unwrap operator (#1053) (4620cad)
- [#1052] Add async fn sugar to hide Promise<T> return type (#1056) (29e342f)
- [#1055] Load ambient types from tsconfig (lib, types, @types/*) (#1081) (3b4ffea)
- [#1068] Nominal typing for Floe-defined types, structural at foreign boundaries (#1070) (52fb843)
- [#1072] Add trait-constrained generics for dependency injection (#1083) (ad2b76b)
- [#1104] add pretty.rs Document combinator pretty-printer (#1128) (db5a425)
- [#1105] add parse time infrastructure (line_numbers + ModuleExtra) (#1129) (ac4242e)
- [#1111] add ModuleInterface fingerprint cache for incremental check (#1156) (83d8a4c)
- [#1113] add Problems accumulator, ExprKind::Invalid, diagnostic sorting (#1136) (0824caf)
- [#1118] add Hindley Milner unification with hydrator and typed vars (#1150) (28fa334)
- [#1158] thread per-dep resolve cache through LSP import resolution (#1161) (a2cc5bf)
- [#1177] recognize TS built-in utility types in bridge aliases (#1190) (496d258)
- [#1178] support tagged template literals (#1191) (e6cacd0)
- [#1179] ship @floeorg/hono shim and fix pipe resolution precedence (#1184) (9210f76)
- require import { for Trait } and support block-level export for (#1090, #1089) (#1172) (de34ed2)
- [#1039] Scope return type mismatch error to last expression instead of whole function (#1040) (614b54e)
- [#1042] Show only mismatched fields when object type arguments mismatch (#1043) (355a3b1)
- [#1044] Hint when untrusted import result is used without unwrapping (#1045) (b39d459)
- [#1046] Show normal type mismatch for untrusted Results (#1047) (1ed9f9b)
- [#1054] reject bare type name used as value expression (#1057) (c43ba1f)
- [#1059] Split Type::Unknown into Type::Error and Type::Unknown (#1063) (6ff3d53)
- [#1060] Separate value and type namespaces in checker environment (#1064) (b157cd2)
- [#1061] Default-deny in checker for unhandled expressions and items (#1065) (469514c)
- [#1067] Validate trait method parameter types and return types in checker (#1069) (1fa2359)
- [#1071] Validate self parameter presence in trait method implementations (#1077) (60e85cf)
- [#1073] Error when trait name is used in a type position (#1078) (2a9ac32)
- [#1074] Remove dot-call syntax for for-block methods (#1079) (d50d390)
- [#1076] Add snapshot tests for Unknown type propagation errors (#1080) (68d934a)
- [#1114] return Type::Error instead of Type::Unknown after diagnostics (#1137) (424e443)
- [#1115] error on calls through Unknown typed callee (#1138) (d714380)
- [#1127] reject array destructuring on tuple values (#1164) (204c19b)
- [#1133] rename tagged-union discriminator from
tagto__tag(#1165) (2636c19) - [#1134] reorder named arguments into declared parameter order (#1163) (8770b43)
- [#1135] enforce positional vs named variant fields (#1173) (010dabd)
- [#1148] remove .. paths from release-please config (#1149) (cd23d7f)
- [#1168] stop silently unwrapping Result when piped into stdlib (#1171) (ef43384)
- [#1169] reject dot-access on trait methods via generic bound (#1170) (d1dcbf5)
- [#1174] allow PascalCase field names in record type declarations (#1180) (8e2e9a6)
- [#1175] accept inline object-type literals as type arguments (#1181) (8eeea1d)
- [#632] bidirectional type inference for Ok/Err from function return type (#1141) (f0b1359)
- tighten trait and for-block method validation (#1085, #1086, #1087) (#1167) (7e247ab)
0.4.7 (2026-04-04)
0.4.6 (2026-04-04)
- [#1013] Type-based chain probes for Drizzle builder pattern (#1018) (d5df9de)
- [#1020] Format for-blocks and trait declarations (#1023) (9d0a25b)
- [#1021] Accept npm subtypes in function arguments (#1022) (1e476af)
- [#1021] Chain probes for self.field patterns and type expansion (#1024) (528730d)
- [#1025] Full-chain probes for select().from(table) generic propagation (#1026) (f8b8ff6)
0.4.5 (2026-04-04)
- [#1013] Resolve chained method calls on complex npm types (#1017) (d42e89c)
- [#1014] validate generic type argument arity (#1015) (c6c0c8a)
0.4.4 (2026-04-04)
0.4.3 (2026-04-04)
- [#1003] Floe integration plugin ecosystem (#1008) (dbb4338)
- [#995] Support re-export syntax (#1009) (28c4a78)
- [#976] Error when named import does not exist in module (#1000) (3d60062)
- [#978] Make tsgo required when importing from .ts files (#999) (94a6933)
- [#994] Formatter preserves string union types instead of deleting them (#996) (3e66961)
0.4.2 (2026-04-04)
- [#987] Load ambient types from TypeScript lib definitions (#992) (2d50e7b)
- [#990] Vite plugin reads from .floe/ output (#991) (56caf88)
- [#982] Error on bridge type syntax without TS import reference (#988) (6c056c9)
- Use npx npm@latest for provenance publish (#993) (3a89aef)
0.4.1 (2026-04-04)
- [#985] Parser errors on hyphenated JSX attribute names like aria-label (#986) (04b7080)
- Remove unnecessary npm upgrade from release workflow (#983) (52031bf)
0.4.0 (2026-04-04)
- [#979] Remove auto-await from untrusted async imports (#980)
- [#977] Improve tsgo probe for object destructuring type resolution (#981) (b0d988d)
- Match arm block IIFEs missing return on last expression (#974) (9c725fa)
- Nested fn declarations not inferred as async with Promise.await (#971) (266de21)
0.3.0 (2026-04-03)
- [#963] [#964] Replace trusted with throws, remove try keyword (#965)
0.2.1 (2026-04-02)
- [#949] [#950] Add Promise.tryAwait and warn on try-on-Promise (#951) (3c7e0ab)
- [#955] Trusted propagation through member access (#962) (4af489e)
- [#958] Smart try - auto-await Promises, remove Promise.tryAwait (#959) (a237da3)
- [#953] Warn when try wraps a Floe function call (#961) (c6034ca)
- [#957] Preserve type args in inlined probe for local-const member calls (#960) (84a98d7)
- include suggestion in TryOnPromise warning message (c92d158)
0.2.0 (2026-04-02)
- [#944] Replace async/await keywords with Promise.await stdlib function (#947)
0.1.43 (2026-04-02)
- [#930] useCallback return type shows unknown when tsgo returns any for callback body (#931) (24595b5)
- [#932] Warn when a binding resolves to unknown type (#943) (ffe92ee)
- [#933] Formatter destroys object destructuring rename syntax (#934) (6a78e57)
- [#935] Checker accepts non-Option/Result/Array values in stdlib calls without error (#940) (9a8e804)
0.1.42 (2026-04-02)
- [#919] LSP hover shows type var instead of resolved type for render prop params (#921) (32469e5)
- [#919] Route _jsxc children probes through specifier map (#923) (355c3f5)
- [#926] JSX props are not type-checked against component prop types (#929) (46852d8)
- [#927] LSP completions missing for resolved Foreign types (#928) (6b45426)
0.1.41 (2026-04-01)
- [#914] Render prop callback params get wrong types from tsgo (#918) (5cc53b0)
- [#915] No error on property access of function type (#916) (fd1408e)
0.1.40 (2026-04-01)
0.1.39 (2026-04-01)
- [#909] Record fields with defaults should be optional in generated TypeScript types (#910) (0c30c31)
- Replace fictional stdlib calls in pipes example with real syntax (3738fe0)
0.1.38 (2026-04-01)
- [#870] LSP hover shows wrong type for literal patterns in match (#882) (32d2406)
- [#871] Warn on binding patterns for finite exhaustive types in match (#885) (d08c293)
- [#887] Treat type-only TS exports as Foreign instead of Unknown (#890) (0c36ed1)
- [#888] Resolve non-exported TS interfaces referenced in probe output (#892) (0bf8bb6)
- [#889] Fix typeof resolution, per-field probes, and pipe type var substitution (#891) (aaaceb3)
- [#893] Prefer checker inference over Unknown probes and register npm type defs (#894) (babd601)
- [#898] Use resolve_type_to_concrete for object destructured bindings (#899) (f2a2aff)
- Replace sort_by with sortBy in homepage and README (fc08ee7)
0.1.37 (2026-04-01)
- [#869] Checker does not type-check literal patterns in match (#874) (fae7c90)
- [#877] Emit async IIFEs for match arms containing await (#879) (ace8d28)
0.1.36 (2026-04-01)
- [#834] Checker does not validate tuple pattern arity in match (#836) (80af889)
- [#842] Checker does not validate variant pattern field count in match (#856) (6a1daaa)
- [#849] Probe generator misses consts inside use <- callbacks (#851) (cc08f15)
- [#852] Infer callback parameter types for stdlib calls (#855) (78faf7e)
- [#853] Propagate async context through use <- desugaring (#857) (d783e1c)
- [#867] Wrap tsgo probe type in Result when expression has try (#868) (1dafae1)
- rename Cloudflare Pages project to floe-site (69176e0)
- use npm as packageManager for wrangler-action (00fbd68)
- use npx for wrangler install to avoid pnpm lockfile conflict (b0c35cc)
- use npx wrangler directly instead of wrangler-action (30d6e7f)
0.1.35 (2026-04-01)
- [#812] Duplicate import names should error (#833) (2e3d97e)
- [#819] Use explicit type args for unresolved generic DTS functions (#820) (60028ec)
- reorder type definitions so User is defined before Status (e7c24ae)
- use single props object for React component examples in docs (e8a8f86)
0.1.34 (2026-03-31)
- [#804] Suggest try await instead of await try when Result wraps Promise (#813) (e377ed6)
- [#806] Object literals with variant values inferred as unknown (#808) (b8c3b50)
- [#811] Reject non-type values in type annotations (#814) (1ecfeec)
0.1.33 (2026-03-31)
- [#758] Add Record.get to stdlib for dynamic key access on plain objects (#794) (6ec22d2)
- [#799] Show default values for optional parameters in function signatures (#801) (e0ea91a)
- [#733] Dot shorthand works as general function arguments (#793) (92baa16)
- [#734] Checker silently accepts unknown where concrete types are expected (#800) (e50cdbc)
- [#795] Remove throwing unwrap functions, add or/values/partition helpers (#798) (f3cc9a7)
0.1.32 (2026-03-31)
- [#767] Add positional union variant fields and newtype paren syntax (#777) (62f5d67)
- [#771] Refactor Option from compiler intrinsic to regular union type (#786) (c74e699)
- [#772] Refactor Result from compiler intrinsic to regular union type (#788) (973e591)
- [#778] Formatter drops keyword member names after dot (#782) (052c86a)
- [#779] Imported TS functions with optional params incorrectly require all arguments (#783) (92e7f95)
- [#781] Imported TS union types resolve to unknown instead of strict union (#787) (dbb94e3)
- use pnpm install in docs deploy workflow (9664f5d)
0.1.31 (2026-03-31)
- [#755] [#756] Support destructured parameters with type annotations and error on unsupported syntax (#759) (548b139)
- [#757] break multiline JSX arrow bodies onto indented lines (#764) (6de16f8)
- [#760] Render prop callback parameters inferred as function type instead of individual params (#766) (87c2aa8)
- [#762] Extract shared destructure resolution helper and fix silent Unknown in arrow params (#765) (8e7ed73)
0.1.30 (2026-03-31)
0.1.29 (2026-03-31)
0.1.28 (2026-03-31)
0.1.27 (2026-03-30)
0.1.26 (2026-03-30)
- [#597] Enforce boolean-only operands for &&, ||, and ! (#689) (157cd6a)
- [#690] Support Record<K, V> from TS interop as Map with bracket-access codegen (#698) (fe30639)
- [#585] Go-to-definition not working for tsconfig path alias imports (#688) (a4e88a1)
- [#593] For-block methods resolve via member access (#699) (22a8e78)
- [#600] Foreign type member access too lenient (#697) (ba0240d)
- [#607] Pipe does not support qualified for-block syntax (#700) (7c5e2f6)
- [#635] Probe resolves chained calls without intermediate const (#696) (a3e0d12)
- [#686] await in non-async function should be a compile error (#687) (876afe8)
- [#691] floe fmt should skip files with parse errors (#694) (c2b77d3)
- [#693] Bracket access is completely unchecked (#695) (4c84a53)
- [#701] Dot-access completions fall through to global symbols (#704) (abafa83)
- [#705] Dot-access completions do not resolve record type fields (#713) (3e355db)
0.1.25 (2026-03-30)
- [#676] Add Option, Result, Promise stdlib and Array.mapResult (#682) (68e36aa)
- [#679] Support destructuring rename syntax (#684) (9712df3)
0.1.24 (2026-03-30)
- [#651] Change opaque type syntax from = to { } (#659) (76130d6)
- [#652] Restrict & intersection to = type aliases only (#663) (36b113b)
- [#584] Member access hover shows resolved field types (#667) (b78aab2)
- [#641] LSP hover shows nothing for record types with spreads (#662) (004e58b)
- [#648] Codegen emits value import for type-only exports used in for-block params (#658) (2702e5d)
0.1.23 (2026-03-30)
- [#594] Vite plugin resolves .fl file when .ts file was intended for extensionless imports (#655) (c22a1c9)
- [#644] Codegen name collision for same-named functions in different for-blocks (#647) (18dd0f9)
0.1.22 (2026-03-29)
0.1.21 (2026-03-29)
0.1.20 (2026-03-29)
- [#616] Support string literal type arguments (#634) (f21a977)
- [#618] Record spread with generic types and formatter fixes (#628) (9e3db72)
- [#592] Prevent tsgo probe from emitting stray .d.ts files (#609) (fc96cf8)
- [#612] Probe inlining drops intermediate member access in chained calls (#613) (cb79b72)
- [#614] Use inlined probe results for destructured const bindings (#620) (b84512b)
- [#615] Intersection type fails after generic type application (#619) (1b8e7f0)
- [#621] Probe counter blocks reuse of same-named probes across functions (#622) (e848ed1)
- [#623] Async fn return type check does not unwrap Promise (#626) (afb4776)
- [#624] Expand opaque named types via per-field probe destructuring (#627) (e9f9c81)
- [#629] Unify Result types with unknown params across match arms (#633) (f90b284)
0.1.19 (2026-03-29)
- [#553] LSP hover on None shows concrete type from context (#579) (94d85cd)
- [#580] Await on Promise with union return type and foreign type member access (#582) (56643ce)
- [#583] Match pattern narrowing and object destructuring for foreign types (#587) (1e94055)
- [#590] Emit import type for type-only npm import specifiers (#591) (f4ffe05)
- [#595] Lexer does not support unicode escape sequences in strings (#598) (65c8ac3)
- [#602] [#603] Pipe map lambda inference and for-block import of foreign types (#604) (caadcc9)
0.1.18 (2026-03-29)
0.1.17 (2026-03-29)
- [#562] Allow concrete values to be assignable to Option<T> (#570) (22c23fe)
- [#564] Forward tsconfig paths to probe and parse JSONC tsconfig files (#573) (4f1185f)
0.1.16 (2026-03-29)
- [#542] Add typeof operator in type positions (#566) (97bf3ec)
- [#548] Support tsconfig paths aliases in import resolution (#568) (9d32dc2)
- [#547] Resolve typeof for relative TS imports with inferred return types (#561) (9d129da)
- [#552] Show type info on hover for lambda parameters (#563) (0f52812)
0.1.15 (2026-03-29)
- [#507] LSP hover on 'from' keyword shows Array.from instead of import syntax (#531) (95eaef6)
- [#533] LSP completion gaps - dot-access fields, import paths, context suppression (#535) (78251c1)
- [#536] Resolve correct for-block overload based on receiver type (#539) (09b454a)
- [#537] Resolve typeof function types from npm imports (#549) (588f91a)
- [#538] Validate argument count for stdlib method calls (#541) (379f613)
- [#540] Console.log/warn/error/info/debug should be variadic (#545) (d119510)
- [#550] LSP test script sleeps full timeout on every collect_notifications call (#551) (7c74d16)
0.1.14 (2026-03-29)
- [#294] Add mock<T> compiler built-in for test data generation (#473) (3614d2f)
- [#422] Generate .d.ts stubs so TS resolves .fl imports (#429) (95c0f12)
- [#475] Add default values for type fields (#479) (57bd5b8)
- [#498] Output compiled files to .floe/ directory instead of alongside source (#502) (3821854)
- [#499] Auto-detect x?: T | null in .d.ts imports as Settable<T> (#508) (7e166a7)
- [#509] Add Date module to stdlib (#517) (e8fc12a)
- [#511] Resolve types from local .ts/.tsx files imported in .fl files (#515) (257a27a)
- add LSP hover and integration tests for generic functions (95728e9)
- docs and syntax highlighting for generic functions (719381c)
- [#384] Preserve user blank lines between statements in blocks (906028f)
- [#403] Improve LSP hover information across the board (03e512b)
- [#404] Checker - validate named arguments in function calls (cb2e1e6)
- [#407] Formatter preserves trusted keyword and destructured params (b6ff269)
- [#480] Fix docs build and Open VSX publish CI failures (#481) (c95af9c)
- [#486] Widen vite-plugin peer dependency to support Vite 7 and 8 (#487) (27eae45)
- [#489] Bundle VS Code extension with esbuild, fix icon, add restart command (#490) (abc9beb)
- [#491] Support JSX comments {/* ... */} (#497) (974f37f)
- [#492] Fix JSX formatter to add newlines around match expressions and multi-line tag children (#500) (a7ac4d5)
- [#494] Add resolveId hook to vite plugin for .fl import resolution (#495) (963c97e)
- [#501] Tell Vite that compiled .fl output is TypeScript (#505) (4fd6475)
- [#506] LSP resolves tsconfig path aliases instead of reporting false errors (#510) (2facdc6)
- [#512] Vite plugin cross-version type compatibility and .d.fl.ts output (#514) (be4cb66)
- [#512] Write .d.fl.ts next to source and emit from --emit-stdout (#519) (1dfda9d)
- [#516] For-block functions from different types clash when both imported (#518) (3b418cb)
- [#520] Option match uses null checks, probe preserves nullability (#523) (ef5ee9b)
- [#521] Formatter deletes // comments inside blocks (#522) (389d6e0)
- [#525] Break after -> in match arms when JSX body has multiline props (#528) (f48ac28)
- add id-token permission for npm trusted publishing (#445) (5eec3f0)
- add VS Code icon, fix npm publish, bump action versions (#451) (7133ba2)
- correct ignoreDeprecations value to 6.0 for TypeScript 7 (#440) (505d6fb)
- formatter preserves trusted keyword and destructured params (4387307)
- formatter preserves tuple index access and add pnpm install reminder (f46f6e6)
- improve LSP hover information across the board (a9adeb7)
- npm trusted publishing and Open VSX publisher/LICENSE (#453) (1507f92)
- pass tag name to release workflow for correct ref checkout (#448) (019745a)
- preserve user blank lines between statements in blocks (99bc8ed)
- stop release workflow from overwriting release-please changelog (#430) (b7d5d14)
- trigger release workflow directly from release-please (#444) (3ff34a2)
- use plain v* tags instead of floe-v* for releases (#425) (bc53113)
- validate named argument labels in function calls (778395d)
- VS Code extension publisher and engine version for Open VSX (#447) (5475113)
0.1.13 (2026-03-29)
- [#520] Option match uses null checks, probe preserves nullability (#523) (ef5ee9b)
- [#521] Formatter deletes // comments inside blocks (#522) (389d6e0)
0.1.12 (2026-03-28)
- [#498] Output compiled files to .floe/ directory instead of alongside source (#502) (3821854)
- [#499] Auto-detect x?: T | null in .d.ts imports as Settable<T> (#508) (7e166a7)
- [#509] Add Date module to stdlib (#517) (e8fc12a)
- [#511] Resolve types from local .ts/.tsx files imported in .fl files (#515) (257a27a)
- [#492] Fix JSX formatter to add newlines around match expressions and multi-line tag children (#500) (a7ac4d5)
- [#501] Tell Vite that compiled .fl output is TypeScript (#505) (4fd6475)
- [#506] LSP resolves tsconfig path aliases instead of reporting false errors (#510) (2facdc6)
- [#512] Vite plugin cross-version type compatibility and .d.fl.ts output (#514) (be4cb66)
- [#512] Write .d.fl.ts next to source and emit from --emit-stdout (#519) (1dfda9d)
- [#516] For-block functions from different types clash when both imported (#518) (3b418cb)
0.1.11 (2026-03-28)
- [#486] Widen vite-plugin peer dependency to support Vite 7 and 8 (#487) (27eae45)
- [#489] Bundle VS Code extension with esbuild, fix icon, add restart command (#490) (abc9beb)
- [#491] Support JSX comments {/* ... */} (#497) (974f37f)
- [#494] Add resolveId hook to vite plugin for .fl import resolution (#495) (963c97e)
0.1.10 (2026-03-28)
0.1.9 (2026-03-28)
0.1.8 (2026-03-28)
0.1.7 (2026-03-28)
0.1.6 (2026-03-28)
0.1.5 (2026-03-28)
- add id-token permission for npm trusted publishing (#445) (5eec3f0)
- trigger release workflow directly from release-please (#444) (3ff34a2)
- VS Code extension publisher and engine version for Open VSX (#447) (5475113)
0.1.4 (2026-03-28)
0.1.3 (2026-03-28)
0.1.2 (2026-03-28)
- add LSP hover and integration tests for generic functions (95728e9)
- docs and syntax highlighting for generic functions (719381c)
- [#384] Preserve user blank lines between statements in blocks (906028f)
- [#403] Improve LSP hover information across the board (03e512b)
- [#404] Checker - validate named arguments in function calls (cb2e1e6)
- [#407] Formatter preserves trusted keyword and destructured params (b6ff269)
- formatter preserves trusted keyword and destructured params (4387307)
- formatter preserves tuple index access and add pnpm install reminder (f46f6e6)
- improve LSP hover information across the board (a9adeb7)
- preserve user blank lines between statements in blocks (99bc8ed)
- use plain v* tags instead of floe-v* for releases (#425) (bc53113)
- validate named argument labels in function calls (778395d)
0.1.1 (2026-03-28)
- add LSP hover and integration tests for generic functions (95728e9)
- docs and syntax highlighting for generic functions (719381c)
- [#384] Preserve user blank lines between statements in blocks (906028f)
- [#404] Checker - validate named arguments in function calls (cb2e1e6)
- [#407] Formatter preserves trusted keyword and destructured params (b6ff269)
- formatter preserves trusted keyword and destructured params (4387307)
- formatter preserves tuple index access and add pnpm install reminder (f46f6e6)
- preserve user blank lines between statements in blocks (99bc8ed)
- validate named argument labels in function calls (778395d)
- Pipe operator (
|>) with first-arg default and_placeholder - Exhaustive pattern matching with
matchexpressions - Result (
Ok/Err) and Option (Some/None) types ?operator for Result/Option unwrapping- Tagged unions with multi-depth matching
- Branded and opaque types
- Type constructors with named arguments and defaults
- Pipe lambdas (
|x| expr) and dot shorthand (.field) - JSX support with inline match and pipe expressions
- Language server with diagnostics, completions, and go-to-definition
- Code formatter (
floe fmt) - Vite plugin for dev/build integration
- VS Code extension with syntax highlighting and LSP
- Browser playground (WASM)
floe initproject scaffoldingfloe watchfor auto-recompilation