SAFE-Stack/SAFE-template
62.4
Adequate · 17 September 2026
539
lines of production code
F#
with TypeScript
1
measurement over time
What this system is
This system is a collection of F\#-based SAFE stack templates that provide scaffolding for full-stack web applications. It offers two distinct project structures—a default template featuring a Todo management feature with in-memory storage, and a minimal template serving as a lightweight baseline. The system manages the build pipeline, testing infrastructure, and dependency updates for both the .NET server and Vite-based client sides.
How it got here
2017–2018 — Migration to .NET 8 and Vite
4 changes.
The project modernized its stack by migrating from .NET 6 and Fable/Elmish to .NET 8 and React with Vite, removing legacy Suave server scaffolding. This transition included updating dependencies to SAFE 5 and Expecto 9, while introducing integration tests to verify the new build and execution workflows.
2020 — SAFE template modernization to .NET 8
9 changes.
The project upgraded its default and minimal templates to target .NET 8, replacing Webpack with Vite for client-side builds and restructuring the solution into Shared, Server, and Client components. This period introduced modernized UI styling with Tailwind CSS, implemented basic server-side APIs for todo management, and added corresponding unit tests to ensure stability.
Features
Initial server implementation with in-memory storage and API
The server component is introduced with a new entry point and a basic API structure. It utilizes the SAFE.Server framework to expose endpoints for retrieving and adding todo items. Todo data is stored in-memory using a module-local ResizeArray, and the addTodo endpoint returns the full list of todos upon successful addition, ensuring the client receives the complete current state rather than a mix of local and remote data.
Content/default/src/Server · high confidence
Introduction of minimal SAFE server sample
A new minimal server implementation has been added to the Content/minimal/src/Server location, utilizing the Saturn and Giraffe frameworks to serve a simple 'Hello from SAFE!' text response at the /api/hello route. This change includes a corresponding Shared module defining the route constant, establishing a lightweight baseline for the SAFE stack.
Content/minimal/src/Server · high confidence
Shared domain model and API contract for Todo management
A new Shared module introduces the core Todo data structure (containing an ID and description) along with validation and creation helpers, and defines the ITodosApi interface specifying methods to retrieve and add todos. This establishes the shared contract between client and server components for the Todo feature.
Content/default/src/Shared · high confidence
Removals
Removed legacy Fable/Elmish client and Suave server scaffolding
The project has removed the previous client-side implementation built with Fable, Elmish, and React, along with its associated build configuration (webpack.config.js) and dependency references (paket.references). Additionally, the Suave-based web server (Program.fs) that previously served the client application has been deleted. This change eliminates the entire legacy full-stack scaffolding for this location.
src/Client, src/Server · high confidence
Behavioural changes
Default template UI refreshed with Tailwind CSS and Vite build tooling
The default SAFE template's client-side UI has been redesigned to provide a modern, responsive first impression for new users. The visual layer now uses Tailwind CSS for styling, replacing previous approaches, and includes a new background image with glass-morphism effects, improved typography, and mobile-friendly viewport settings. Under the hood, the build pipeline has migrated from Webpack to Vite (configured in vite.config.mts) to improve development experience, and the client application structure has been updated to use Feliz for rendering within the Elmish loop.
Content/default/src/Client · high confidence
Default template upgraded to .NET 8 and Vite
The default SAFE template now targets .NET 8.0, requiring the .NET SDK 8.0 and Node 18+ for development. The client-side build toolchain has migrated from Webpack to Vite, which is invoked via Fable in the new \Build.fs\ script. The project structure has been reorganized into a solution with \Shared\, \Server\, and \Client\ projects, and the build system now uses FAKE targets for bundling, running, and testing.
Content/default · high confidence
Minimal template now uses Vite for client-side builds
The minimal template has switched its client-side build tooling from the previous setup to Vite. This change introduces a new Vite configuration (vite.config.mts) that serves the client on port 8080 and proxies API requests to the server, while ignoring .fs files during watch mode to prevent full page refreshes. The entry point is now index.html, which loads the compiled client code (client.fs.js) as a module, and the application logic has been moved to Client.fs, replacing the previous Elmish-based architecture with a simpler promise-based fetch pattern.
Content/minimal/src/Client · high confidence
Minimal template updated to .NET 8 and Node 18
The minimal SAFE template now targets .NET SDK 8.0 (enforced via global.json) and requires Node 18 and NPM 9, as specified in the updated README. The project structure has been refreshed with a new solution file (SAFE.App.sln) containing Shared, Server, and Client projects, alongside new .gitignore and .npmrc files to manage build artifacts and enforce engine strictness.
Content/minimal · high confidence
SAFE Template v5.2.1: Tailwind config update and dependency bumps
The SAFE Template package (v5.2.1) updates the default Tailwind CSS configuration to exclude scanning node\_modules for content, improving build performance. It also includes dependency updates for Vite (up to 5.4.8 in the default template) and other packages, along with fixes to release notes generation and moving package.json files to the Client source directory.
(repo-wide) · high confidence
Test coverage
Add template integration tests for Normal and Minimal templates; Added client and shared unit tests for the SAFE template; Added server-side unit tests for Todo storage.
Dependencies
Upgrade templates to .NET 8 and update dependencies
The default and minimal templates now target .NET 8, replacing previous versions like .NET 6 and .NET Core 2.0/2.2. This update includes a comprehensive refresh of dependencies: the .NET side now uses SAFE 5, Expecto 9, and FAKE 5/6, while the client side has migrated from Webpack to Vite and updated React to version 18. The build system has also been modernized, moving from legacy scripts to a dedicated Build.fsproj that leverages Paket for dependency management.
(dependencies) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Baseline
- First survey — no prior run to compare against. CAI 62.
Lenses
- Code Health 100
- Architecture 69
- Maturity 61
- Readiness 59
- Security 61
Changes since last survey
- 300 commits — 271 feature/other, 29 fixes
By area
- Content/default — 112 commits
- (repo) — 89 commits
- (root) — 54 commits
- Content/minimal — 26 commits
- tests/Tests.fs — 7 commits
- .github/workflows — 5 commits
- .config/dotnet-tools.json — 2 commits
- Content/.template.config — 2 commits
- .paket/Paket.Restore.targets — 1 commit
- tests/Pests.fsproj — 1 commit
- tests/Tests.fsproj — 1 commit
Notable commits
- fix: Fix bug issue #615 in Client.Tests.fs
- fix: Fix default template client test
- fix: Fix dev-time server URL (https -> http)
- fix: Fix failing build because of NPM version
- fix: Fix template content exclude paths
- fix: Merge pull request #560 from Tom-Sloboda/fix-failing-test
- fix: Merge pull request #578 from SAFE-Stack/fix-fantomas
- fix: Merge pull request #579 from SAFE-Stack/release-fixes
- fix: Merge pull request #581 from SAFE-Stack/fix-tests
- fix: Merge pull request #608 from SAFE-Stack/fix-hmr
- fix: Merge pull request #610 from SAFE-Stack/fix-nuget-push
- fix: Merge pull request #664 from chezuma/chz-fix-default-tailwind-config
- fix: Revert "Try older ubuntu agent"
- fix: Revert accidental change to template name
- fix: Some fixes to the release script to allow it to run on my machine
- fix: Upgrade FSharp.Core and fix test project warnings
- fix: chore: revert template.json change
- fix: fix capitalization
- fix: fix readme
- fix: fix tests that did not run on default after switch to vite
- …and 280 more
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
SAFE-Stack/SAFE-template was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 17 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 57254663126f8981958c6781706c5d99db385e05 — the exact code this score is about.
- Scored under rubric-2026.09.13 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-d1ef6c0bd534.