|
| 1 | +--- |
| 2 | +author: rescript-association |
| 3 | +date: "2026-04-28" |
| 4 | +previewImg: /blog/retreat-recap-2026-group-01.avif |
| 5 | +articleImg: /blog/retreat-recap-2026-group-01.avif |
| 6 | +title: ReScript Retreat 2026 Recap |
| 7 | +description: | |
| 8 | + Thirteen ReScript contributors met in Vienna to work on the compiler, build system, standard library, AI-assisted coding, and the wider ecosystem. |
| 9 | +--- |
| 10 | + |
| 11 | +The ReScript Retreat 2026 has concluded. |
| 12 | +This year, thirteen developers from around the world came together in Vienna to work on the ReScript compiler and ecosystem. |
| 13 | +For three full days we worked from a large office close to the city center, focusing on the language, tooling, standard library, documentation, and the developer experience around AI-assisted coding. |
| 14 | + |
| 15 | +As with previous retreats, the goal was simple: give contributors uninterrupted time together. |
| 16 | +ReScript is still built by people spread across different countries, companies, and time zones. |
| 17 | +Meeting in person helps us unblock long-running issues, compare ideas quickly, and turn plans into working pull requests while everyone has the same context. |
| 18 | + |
| 19 | +## Kickoff |
| 20 | + |
| 21 | +On the first day, we started by discussing the current state of the ReScript compiler and ecosystem. |
| 22 | +Before diving into working groups, Robin Ricard from [Jane Street](https://www.janestreet.com/) joined us for a presentation and a technical exchange. |
| 23 | +We had very good discussions about JavaScript compilation challenges, and Robin showed us some of the tools he is building at Jane Street. |
| 24 | +He also presented [OxCaml](https://oxcaml.org/) and showcased the Bonsai web framework. |
| 25 | + |
| 26 | +<Image |
| 27 | + src="/blog/retreat-recap-2026-jane-street-talk.avif" |
| 28 | + caption="Robin Ricard from Jane Street presenting at the ReScript Retreat" |
| 29 | + withShadow={true} |
| 30 | +/> |
| 31 | + |
| 32 | +Those conversations were a useful reminder that, while ReScript has diverged significantly from the OCaml ecosystem over the years, we still share several goals: strong static typing, predictable compilation, and tooling that can support large codebases and agentic development workflows. |
| 33 | + |
| 34 | +## Working Groups |
| 35 | + |
| 36 | +After the kickoff, we identified blockers and improvements that would have the highest impact for ReScript users. |
| 37 | +We then split into four working groups. |
| 38 | + |
| 39 | +<figure className="mt-8 mb-12 md:-mx-16"> |
| 40 | + <div className="grid gap-4 md:grid-cols-3"> |
| 41 | + <img |
| 42 | + className="h-full w-full rounded-md object-cover shadow-md" |
| 43 | + src="/blog/retreat-recap-2026-work-01.avif" |
| 44 | + alt="ReScript contributors working together during the retreat" |
| 45 | + /> |
| 46 | + <img |
| 47 | + className="h-full w-full rounded-md object-cover shadow-md" |
| 48 | + src="/blog/retreat-recap-2026-work-02.avif" |
| 49 | + alt="ReScript contributors discussing implementation details at a table" |
| 50 | + /> |
| 51 | + <img |
| 52 | + className="h-full w-full rounded-md object-cover shadow-md" |
| 53 | + src="/blog/retreat-recap-2026-work-03.avif" |
| 54 | + alt="ReScript contributors collaborating in the retreat office" |
| 55 | + /> |
| 56 | + </div> |
| 57 | + <figcaption className="mt-4 text-14 text-gray-60 md:ml-16"> |
| 58 | + Contributors split into focused groups to work on the compiler, build |
| 59 | + system, Web API bindings, iterators, and AI-assisted coding. |
| 60 | + </figcaption> |
| 61 | +</figure> |
| 62 | + |
| 63 | +### Web API Bindings |
| 64 | + |
| 65 | +One group focused on the experimental ReScript Web API bindings. |
| 66 | +Compile times had become longer than we wanted, and the package had grown broad enough that splitting it up made sense. |
| 67 | +The group worked on moving the bindings into multiple focused packages, such as DOM, Fetch, and Storage, under a dedicated npm organization. |
| 68 | + |
| 69 | +This work pairs with feature-gated source directories in the build system, which let large libraries expose optional parts of their source tree only when needed. |
| 70 | +For broad packages like Web API bindings, this is important: users should not pay compile-time costs for browser APIs they never import. |
| 71 | +Together, these changes should make the packages easier to maintain, faster to compile, and more practical to adopt incrementally. |
| 72 | + |
| 73 | +### Build System |
| 74 | + |
| 75 | +Another group returned to the build system. |
| 76 | +There was a long-standing issue where the build system locked its build state while a watcher was running. |
| 77 | +That meant a second build, for example one triggered by an AI agent or another parallel tool, could fail because the lock file prevented it from proceeding. |
| 78 | + |
| 79 | +We prioritized this over several other build-system improvements because it directly affects modern development workflows. |
| 80 | +The group also worked on performance improvements and better terminal output. |
| 81 | + |
| 82 | +### Iterators |
| 83 | + |
| 84 | +Another group focused on iterator and iterable support in the standard library. |
| 85 | +The immediate goal was to make the type definitions line up better with JavaScript's iteration protocols, including generator values. |
| 86 | +This work supports the new `for...of` and `for await...of` syntax and makes interop with iterable JavaScript APIs more predictable. |
| 87 | + |
| 88 | +### AI-Assisted Coding |
| 89 | + |
| 90 | +The final group explored how ReScript can become better suited for AI-assisted coding. |
| 91 | +One idea was an "AI mode": a strict linter that can run as a separate phase after regular compilation and type checking. |
| 92 | +The goal is to catch patterns that are technically valid but undesirable in generated or agent-edited code, and to give agents tighter feedback loops when working inside a ReScript project. |
| 93 | + |
| 94 | +We also worked on documentation and project generation improvements, since high-quality examples and predictable project structure are especially important when tools need to understand a codebase quickly. |
| 95 | + |
| 96 | +## Talks |
| 97 | + |
| 98 | +On the second day, several contributors presented work they had prepared before the retreat. |
| 99 | +The talks covered both concrete ecosystem projects and larger compiler or language experiments: |
| 100 | + |
| 101 | +- Dmitry Zakharov: ReScript & Sury. |
| 102 | + - [Slides](https://docs.google.com/presentation/d/176TePKFT6HzmLvApyvaEMpngm4poM7zW2F4Fr-wDPzM/edit?slide=id.g2ce4b81d49a_0_45#slide=id.g2ce4b81d49a_0_45) |
| 103 | + - [Sury](https://github.com/DZakh/sury) |
| 104 | +- Gabriel Nordeborn: ResX, PHP meets JSX and type safety. |
| 105 | + - [ResX](https://github.com/zth/res-x) |
| 106 | +- Jaap Frolich: Rewriting the compiler in Rust and comptime evaluation. |
| 107 | + - [Presentation](https://gist.github.com/jfrolich/c05970987e17e46ca78996226bd318f3) |
| 108 | +- Woonki Moon: ReScript Comptime PoC, a lighter metaprogramming alternative to PPX. |
| 109 | + - [Design doc](https://github.com/mununki/rescript/blob/poc-comptime/docs/comptime_design.md) |
| 110 | + - [Slides](https://rescript-comptime-ppt.pages.dev/) |
| 111 | + - [Examples](https://github.com/mununki/rescript-comptime-poc) |
| 112 | +- Paul Tsnobiladzé: ReScript-Shadcn, shadcn for ReScript and rescript-react. |
| 113 | + - [Slides](https://tsnobip.github.io/rescript-shadcn-presentation) |
| 114 | + - [Demo source](https://github.com/tsnobip/rescript-shadcn-presentation/) |
| 115 | +- Bernardo Gurgel: Signals All The Way Down, reactive UIs with Xote and ReScript Signals. |
| 116 | + - [Xote](https://xote.dev/) |
| 117 | + - [ReScript Signals](https://brnrdog.github.io/rescript-signals/) |
| 118 | + - [ReSlides](https://github.com/brnrdog/reslides) |
| 119 | + - [Demo](https://brnrdog.github.io/reslides) |
| 120 | + |
| 121 | +We also live-streamed the talks on YouTube. |
| 122 | + |
| 123 | +<Video |
| 124 | + src="https://www.youtube.com/embed/f7rQBpQpxnA" |
| 125 | + caption="Recording of the ReScript Retreat 2026 talks" |
| 126 | +/> |
| 127 | + |
| 128 | +After the talks, we continued with the working groups and wrapped up that work on the third day. |
| 129 | + |
| 130 | +## Results |
| 131 | + |
| 132 | +By the end of the retreat, a number of features and improvements had been implemented. These are now available in [`13.0.0-alpha.4`](https://github.com/rescript-lang/rescript/releases/tag/v13.0.0-alpha.4). |
| 133 | + |
| 134 | +### Compiler |
| 135 | + |
| 136 | +- Added support for `for...of` and `for await...of` loops. |
| 137 | + |
| 138 | + ```res |
| 139 | + let arr = [1, 2, 3] |
| 140 | + let count = ref(0) |
| 141 | +
|
| 142 | + for _ of arr { |
| 143 | + count := count.contents + 1 |
| 144 | + } |
| 145 | +
|
| 146 | + let consume = async iterable => { |
| 147 | + for await item of iterable { |
| 148 | + let result = await Promise.resolve(item + 1) |
| 149 | + Console.log(result) |
| 150 | + } |
| 151 | + } |
| 152 | + ``` |
| 153 | + |
| 154 | +- Added `break` and `continue` for use in loops. |
| 155 | + |
| 156 | + ```res |
| 157 | + for i in 0 to 10 { |
| 158 | + switch i { |
| 159 | + | 3 => continue |
| 160 | + | 8 => break |
| 161 | + | _ => work() |
| 162 | + } |
| 163 | + } |
| 164 | + ``` |
| 165 | + |
| 166 | +- Added dictionary spread support. |
| 167 | + |
| 168 | + ```res |
| 169 | + let foo = dict{ |
| 170 | + "a": 1, |
| 171 | + "b": 2, |
| 172 | + } |
| 173 | +
|
| 174 | + let baz = dict{ |
| 175 | + "b": 4, |
| 176 | + "c": 5, |
| 177 | + } |
| 178 | +
|
| 179 | + let result = dict{...foo, "b": 3, ...baz, "d": 6} |
| 180 | + ``` |
| 181 | + |
| 182 | +### Standard Library |
| 183 | + |
| 184 | +- Fixed iterator and iterable type definitions. |
| 185 | +- Added generator type definitions. |
| 186 | +- Added `Dict.assignMany`. |
| 187 | +- Added `Dict.concat`. |
| 188 | +- Added `Dict.concatMany`. |
| 189 | +- Added `Dict.concatAll`. |
| 190 | +- Added `Array.concatAll`. |
| 191 | + |
| 192 | +### Build System |
| 193 | + |
| 194 | +- Added a `--prod` flag to the build, watch, and clean commands. This skips dev dependencies and dev sources, enabling builds in environments where dev packages are not installed. |
| 195 | +- Added feature-gated source directories, so packages can include optional slices of their source tree at build time and large libraries can avoid compiling unused areas by default. |
| 196 | +- Solved the long-standing issue where rebuilds were blocked while watchers were already running. |
| 197 | +- Improved watch output and added a `--clear-screen` option. |
| 198 | +- Preserved warnings across atomic-save full rebuilds and incremental watch builds. |
| 199 | +- Restored backward compatibility for `bsconfig.json`. |
| 200 | +- Improved build scheduling so larger projects can rebuild more efficiently. In some tests, this was around 30% faster. |
| 201 | + |
| 202 | +### Ecosystem |
| 203 | + |
| 204 | +- Split the Web API bindings into multiple packages, including DOM, Fetch, and Storage, and moved them into a dedicated npm organization. |
| 205 | +- Released `rescript-react-signals`, a specialized package for using `rescript-signals` together with React. |
| 206 | + |
| 207 | +## Discussions |
| 208 | + |
| 209 | +Naturally, a lot of retreat time was also spent discussing how ReScript should move forward. |
| 210 | +Some topics are not ready to become language features yet, but the in-person format helped us clarify tradeoffs and narrow down possible directions. |
| 211 | + |
| 212 | +We had a long discussion about early returns. |
| 213 | +The feature is tricky because it sits directly between readability, expression-oriented control flow, and practical ergonomics in longer functions. |
| 214 | +No final decision was made, but the discussion clarified what any proposal would need to address. |
| 215 | + |
| 216 | +We also discussed generator functions. |
| 217 | +There is clear value in being able to bind to JavaScript generators well, but it is still unclear whether ReScript needs full generator syntax beyond interop support. |
| 218 | + |
| 219 | +Another recurring topic was a bindings management platform. |
| 220 | +The work around `rescript-shadcn`, presented by Paul Tsnobiladzé, is already a step in that direction. |
| 221 | +We are still exploring prototypes for a larger repository and CLI-based workflow for finding and fetching bindings. |
| 222 | + |
| 223 | +## What's Next |
| 224 | + |
| 225 | +We are aiming to release ReScript 13 in late summer. |
| 226 | +The current goals include removing legacy namespaces such as `Js` and `Dom`, with Web API functionality moving toward the newer package structure. |
| 227 | +We also want ReScript 13 to include dedicated linting support for AI-assisted coding. |
| 228 | + |
| 229 | +In the full v13 release, `Jsx.component` will be an abstract type. |
| 230 | +This better models React components that are not plain functions, such as memoized or lazy components, and gives clearer errors when a regular function is used where JSX expects a component. |
| 231 | + |
| 232 | +Other candidates include source map support, immutable arrays, and additional record ergonomics, such as record rest destructuring. |
| 233 | +In the meantime, we expect some of the smaller retreat results, mostly build-system fixes and polish, to make their way into a ReScript `12.3.0` release. |
| 234 | +As always, the exact release contents will depend on implementation progress, review, and migration risk. |
| 235 | + |
| 236 | +## Sponsors |
| 237 | + |
| 238 | +<Image |
| 239 | + externalLink="https://www.janestreet.com" |
| 240 | + src="/partners/jane-street.svg" |
| 241 | + size="small" |
| 242 | + className="[&_img]:w-1/2 [&_img]:rounded-md [&_img]:bg-white [&_img]:p-6" |
| 243 | + caption="Retreat sponsor" |
| 244 | +/> |
| 245 | + |
| 246 | +We want to thank [Jane Street](https://www.janestreet.com/) for sponsoring the retreat and helping make another event possible next year. |
| 247 | +We appreciated the technical exchange with Robin Ricard and the chance to compare notes with people working on related ML-family tooling. |
| 248 | + |
| 249 | +<Image |
| 250 | + externalLink="https://www.cca.io" |
| 251 | + src="/lp/cca-io-color.svg" |
| 252 | + size="small" |
| 253 | + className="[&_img]:rounded-md [&_img]:bg-white [&_img]:p-6" |
| 254 | + caption="Long-term project sponsor" |
| 255 | +/> |
| 256 | + |
| 257 | +[Control Center Apps](https://www.cca.io/) returned as a sponsor this year as well. |
| 258 | +Thank you for your continued support of the ReScript project. |
| 259 | + |
| 260 | +<Image |
| 261 | + externalLink="https://www.ketryx.com" |
| 262 | + src="/partners/ketryx.svg" |
| 263 | + size="small" |
| 264 | + className="[&_img]:w-1/2 [&_img]:rounded-md [&_img]:bg-white [&_img]:p-6" |
| 265 | + caption="Venue sponsor" |
| 266 | +/> |
| 267 | + |
| 268 | +We also want to thank [Ketryx](https://www.ketryx.com/) for providing this year's venue. |
| 269 | +The office is close to the center of Vienna, and the modern equipment, including height-adjustable desks, was very appreciated throughout the retreat. |
| 270 | + |
| 271 | +Finally, thanks to [OpenAI](https://openai.com/) for the generous "Codex for OSS" sponsorship. |
| 272 | +This was the first retreat where every developer had at least three months of access, and it contributed directly to the productivity of the working groups. |
| 273 | + |
| 274 | +## Acknowledgements |
| 275 | + |
| 276 | +Thank you to all attendees. |
| 277 | +This accelerated way of developing a programming language would not be possible without contributors willing to travel, discuss difficult tradeoffs, review each other's work, and spend several focused days improving ReScript together. |
| 278 | + |
| 279 | +The attendees were very happy with the outcome. |
| 280 | +We felt productive, the working groups made concrete progress, and several longer-running topics are now much closer to being ready for users. |
| 281 | + |
| 282 | +Attendees: |
| 283 | +[@brnrdog](https://github.com/brnrdog), |
| 284 | +[@Bushuo](https://github.com/Bushuo), |
| 285 | +[@cknitt](https://github.com/cknitt), |
| 286 | +[@fhammerschmidt](https://github.com/fhammerschmidt), |
| 287 | +[@jfrolich](https://github.com/jfrolich), |
| 288 | +[@jderochervlk](https://github.com/jderochervlk), |
| 289 | +[@JonoPrest](https://github.com/JonoPrest), |
| 290 | +[@mununki](https://github.com/mununki), |
| 291 | +[@rolandpeelen](https://github.com/rolandpeelen), |
| 292 | +[@rricard](https://github.com/rricard), |
| 293 | +[@ryyppy](https://github.com/ryyppy), |
| 294 | +[@tsnobip](https://github.com/tsnobip), |
| 295 | +and [@zth](https://github.com/zth). |
| 296 | + |
| 297 | +<figure className="mt-8 mb-12 md:-mx-16"> |
| 298 | + <div className="grid gap-4 md:grid-cols-2"> |
| 299 | + <img |
| 300 | + className="h-full w-full rounded-md object-cover shadow-md" |
| 301 | + src="/blog/retreat-recap-2026-group-03.avif" |
| 302 | + alt="The ReScript team gathered at the 2026 retreat in Vienna" |
| 303 | + /> |
| 304 | + <img |
| 305 | + className="h-full w-full rounded-md object-cover shadow-md" |
| 306 | + src="/blog/retreat-recap-2026-group-02.avif" |
| 307 | + alt="The ReScript team celebrating at the 2026 retreat in Vienna" |
| 308 | + /> |
| 309 | + </div> |
| 310 | + <figcaption className="mt-4 text-14 text-gray-60 md:ml-16"> |
| 311 | + The ReScript team at the 2026 retreat in Vienna. |
| 312 | + </figcaption> |
| 313 | +</figure> |
0 commit comments