Skip to content

v3.0.0 — Type-safe full-stack RPC, powered by Serde.FS

Latest

Choose a tag to compare

@JordanMarr JordanMarr released this 09 Jun 18:57
· 11 commits to main since this release
a465a9e

This release moves the template's client ⇄ server layer over to Serde.FS (https://github.com/serde-fs/Serde.FS), giving you end-to-end, compile-time type safety across the network
boundary — with no hand-written HTTP and no manual JSON.

✨ Highlights

  • 🔗 End-to-end type-safe RPC. Define your API once as an [] F# interface in Shared. The server implements it; the client calls it like a local async function. Change the contract and both ends update on the next build — any mismatch is a compile error, not a runtime surprise.
  • ⚡ Auto-generated Fable client via Serde.FS.Json.Fable (https://www.nuget.org/packages/Serde.FS.Json.Fable). Just referencing the package turns on client generation — a fully-typed proxy is written into fable-generated/ on every build. No attributes, no config, no fetch/JSON plumbing.
  • 🪶 No web framework required. The server is plain ASP.NET Core + Serde.FS.Json.AspNet. No Giraffe, Saturn, or controllersMapRpcApi is just an endpoint-routing extension. Need a REST endpoint too? Drop a minimal-API app.MapGet right alongside it; the two surfaces coexist on one host.
  • 🧊 Reflection-free, deterministic serialization. Codecs are generated at compile time — AOT/WASM-friendly, tree-shakeable, and predictable.
  • 📚 Revamped README that documents the full-stack flow end to end.

🧩 The whole contract → server → client flow

// Shared — define it once
[<RpcApi>]
type IServerApi =
  abstract member GetCatFacts: PageSize * PageNumber -> Async<CatFact list>
// WebApi — implement & map it (plain ASP.NET Core)
app.MapRpcApi<IServerApi>(ServerApi())
// WebLit — call the generated, typed proxy
let api = SerdeGenerated.Fable.IServerApiFableClient.create "/"
let! facts = api.GetCatFacts(pageSize, pageNumber)

⚠️ Breaking changes

  • The RPC stack has moved from Fable.Remoting to Serde.FS. Projects generated from this template now use the Serde.FS RPC layer; the Fable.Remoting.Client dependency has been removed.
    There's no in-place migration for apps already scaffolded from 2.x — this affects newly generated projects.
  • With huge thanks to Fable.Remoting, which powered the template's RPC layer for years and made the full-stack F# experience great long before this.

📦 Getting started

dotnet new install fable-lit-fullstack-template
dotnet new fable-lit-fullstack -n MyApp
cd MyApp && npm install && npm run dev

Requirements: .NET 10 SDK · Serde.FS 1.0.0-beta.2.