Skip to content
CAI
Software that uses CAICheck a score

CompositionalIT/SAFE-Dojo

40.9

Weak · 24 September 2026

728

lines of production code

F#

primary language

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a self-study educational repository designed to demonstrate the SAFE (Saturn, Fable, ASP.NET, Elmish) stack on .NET 8. It provides a scaffolded full-stack application that integrates a Vite-based F\# frontend with a Saturn-based API server to fetch and display location, crime, and weather data. The codebase serves as a modernized reference implementation, replacing legacy build tools and sample projects with a structured multi-project layout for learning purposes.

Features

Initial server scaffolding with SAFE stack and API endpoints

The server project has been initialized using the SAFE (Saturn, Fable, ASP.NET, Elmish) template, introducing a new API layer built on Fable.Remoting and Saturn. This change adds the core server files (Api.fs, DataAccess.fs, Server.fs) which define the application's entry point and expose endpoints for calculating distances from London, retrieving crime reports, and fetching weather data. The implementation utilizes FSharp.Data for JSON parsing to interact with external services like postcodes.io, data.police.uk, and open-meteo.com, while enforcing postcode validation on all incoming requests.

src/Server · high confidence

Introduce shared data models and API contracts for weather, location, and crime data

Added a new Shared module defining core domain types including LatLong, Location, LocationResponse, CrimeResponse, and WeatherResponse, along with a WeatherType discriminated union that maps WMO weather codes to specific weather conditions and icons. The module also exposes an IDojoApi interface for client-server communication and a postcode validation helper using Regex, establishing the shared contract between the client and server layers.

src/Shared · high confidence

SAFE Dojo client application scaffolded with Vite, Feliz, and PigeonMaps

The src/Client directory now contains the initial SAFE Dojo student exercise, providing a complete Elmish-based frontend scaffold. The application uses Vite for build tooling (replacing Webpack) and Feliz with Bulma for the UI, integrating PigeonMaps for map visualization, Recharts for crime data bar charts, and SweetAlert for error handling. The entry point (App.fs) initializes the Elmish program, while Index.fs defines the core model, message handling for postcode lookups, and view components for displaying location, crime statistics, and map markers. The setup includes a Vite configuration for API proxying and a set of Paket dependencies to support these libraries.

src/Client · high confidence

Removals

Removal of legacy SaturnSample application code

The legacy SaturnSample application has been removed from the codebase. This change deletes the entire \src/SaturnSample\ directory, including the F\# source files for the server configuration, routing, database wrappers, and HTML templates, as well as the associated static assets (CSS/JS) and dependency references. Users will no longer have access to this specific sample implementation.

src/SaturnSample · high confidence

Behavioural changes

SAFE Dojo upgraded to .NET 8 and modernized build infrastructure

The SAFE Dojo self-study repository has been upgraded to target .NET 8.0 (global.json) and replaced the legacy FAKE build scripts (build.fsx, build.cmd, build.sh) with a new Build.fs project using FAKE 5. The client-side build tooling has switched from webpack to Vite, enabling hot module replacement for the Fable/Elmish frontend. The solution structure was reorganized from a single SaturnSample project to a multi-project SAFE layout (Shared, Server, Client) with a dedicated Build project, and Azure deployment is now handled via the Farmer library.

(repo-wide) · high confidence

Dependencies

Upgrade to SAFE v5 and .NET 8

The project has been upgraded to the SAFE v5 template, migrating the build and runtime targets from .NET Core 2.0 to .NET 8. This change replaces the legacy Saturn and Simple.Migrations dependencies with modern equivalents like Fable.Remoting.Giraffe, Feliz, and Expecto, and switches the JavaScript build tooling from Webpack to Vite. The solution structure has been simplified by removing the old SaturnSample project and renaming the Migrations project to Shared, while adopting 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 41.

Lenses

  • Code Health 100
  • Architecture 69
  • Maturity 45
  • Readiness 17
  • Security 85

Changes since last survey

  • 300 commits — 273 feature/other, 27 fixes

By area

  • (root) — 130 commits
  • (repo) — 87 commits
  • src/Client — 57 commits
  • src/Server — 18 commits
  • src/Shared — 4 commits
  • .config/dotnet-tools.json — 2 commits
  • .vscode/launch.json — 1 commit
  • .vscode/tasks.json — 1 commit

Notable commits

  • fix: Final updates to build scripts. Removed build.(sh|cmd) as no longer needed with FAKE 5 and fixed jsPackageManager env var in build.fsx
  • fix: Fix
  • fix: Fix Temperature record field
  • fix: Fix Thunder bug
  • fix: Fix Thunder bug
  • fix: Fix build (missing tests target)
  • fix: Fix build.
  • fix: Fix input should not be null for postcode
  • fix: Fix instructions
  • fix: Fix task # bookmark
  • fix: Fix task bookmark
  • fix: Fix task bookmark
  • fix: Fixed Api.fs name case in Instructions.md
  • fix: Fixed a dead link to Fulma library
  • fix: Fixed spacing on weather tile
  • fix: Fixes #52.
  • fix: Merge branch 'master' into net6-fix
  • fix: Merge pull request #161 from CompositionalIT/net6-fix
  • fix: Merge pull request #177 from CompositionalIT/fix-readme-dotnet-version
  • fix: Merge pull request #37 from xdaDaveShaw/minor-fixes
  • …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

CompositionalIT/SAFE-Dojo 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 24 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 78e18e7197355cfad2c38d1aac7a8d42144a94c0 — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-5f8d0eb43fd7.