toolup-forge
An open-source F# full-stack SDK for production multi-tenant analytical applications.
toolup-forge is an open-source F# full-stack SDK for building production multi-tenant analytical applications. Giraffe over ASP.NET Core for the server, Fable + Elmish + Feliz for the client, Fable.Remoting for type-safe wire — F# end to end with no DTO duplication.
Status: pre-release (
0.x.y). SemVer-on-0.x— minor bumps may include breaking changes.1.0.0ships once the surface is stable.
What it gives you
- Multi-tenant by construction. Scope isolation, RBAC, per-tenant data scoping, and audit trail are first-class — see Surfaces and Composition roots.
- AI-augmented as a peer. Agent loop, SSE streaming, tool registry, prompt caching, conversation persistence — drop in a provider companion and the LLM is wired. See AI concepts.
- Schema-driven modules.
FormSchema+WorkflowDefinition+ a 4-file module convention collapses CRUD-heavy intake and approval flows. See Forms concepts. - Companion packages isolate vendors. No paid-by-default dependencies. Every cloud / vendor integration sits behind an interface, swappable per deployment. See the companion catalogue.
- Sector-agnostic. The SDK ships infrastructure; you bring domain.
Get started in 60 seconds
Add the coordinated meta-manifest to your Directory.Packages.props:
<PropertyGroup>
<ToolUpSdkVersion>0.4.0</ToolUpSdkVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="ToolUp.Sdk" />
</ItemGroup>
Reference what you need in each consuming .fsproj:
<PackageReference Include="ToolUp.Platform.Server" />
<PackageReference Include="ToolUp.Platform.Client" />
Minimum server composition root:
open ToolUp.Platform
[<EntryPoint>]
let main _ =
ServerApp.empty
|> ServerApp.withConfig { ServerConfig.defaults with Port = 5000 }
|> ServerApp.run
That serves on http://localhost:5000. Add modules with ServerApp.addModules, swap in providers with ServerApp.withAuth / withStorage, layer on AIServerApp / RAGServerApp for AI/RAG. The full walkthrough is in Getting started, and a runnable end-to-end example is at samples/HelloWorld/.
Pick your shape
| You want | Compose with | Read |
|---|---|---|
| A pure API service | ToolUp.Platform.Server only |
Composition roots |
| A full-stack app (SAFE-style) | Platform.Server + Platform.Client |
Architecture |
| Add an AI assistant | + ToolUp.AI.{Server,Client} + a provider |
AI getting started |
| Retrieval-augmented generation | + ToolUp.RAG + ToolUp.KnowledgeBase |
RAG getting started |
| Schema-driven forms | + ToolUp.Forms.{Server,Client} |
Forms getting started |
| Booking with concurrency lock | + ToolUp.Scheduling.{Server} |
Scheduling getting started |
| Public-facing SSR pages | + ToolUp.PublicRendering |
This site is built with it — source |
| A serverless host | + ToolUp.Platform.Core + the AWS Lambda adapter |
Composition roots |
Why F#
The SDK is opinionated about F# all the way down. Shared types cross the client/server boundary via Fable.Remoting without DTO duplication. Modules are pure-MVU on the client (no in-memory state between calls), pure-handler on the server. The whole stack — server, client (via Fable), build (via FAKE) — is one language. The reasons are written up at Why toolup-forge.
Built with toolup-forge
This site is server-side-rendered F# using the ToolUp.PublicRendering companion (every page you're reading right now comes through Giraffe.ViewEngine). The source is on GitHub at toolup-forge/toolup-forge-io — same Apache 2.0 licence as the SDK itself.
If you ship something with toolup-forge, we'd like to hear about it — open a discussion at github.com/ToolUp-Forge/toolup-forge/discussions.
Source + licence
- Source:
github.com/ToolUp-Forge/toolup-forge - NuGet: GitHub Packages — ToolUp-Forge
- Licence: Apache 2.0
- Contributing: see Contributing and the DCO sign-off requirement