ionide/Fornax
60.4
Adequate · 17 September 2026
2.3k
lines of production code
F#
primary language
1
measurement over time
What this system is
Fornax is a static site generator built with F\# and .NET 8 that processes various content types such as Markdown, Sass, and Less into HTML and CSS. It provides a CLI for building and watching sites with live browser refresh, supporting custom loaders and generators for flexible content transformation. The system includes a default blog template with pagination and mobile-friendly layouts, along with sample scripts demonstrating configuration and asset processing.
Features
Add sample loaders for custom configuration and post processing
The samples/loaders directory now includes two new F\# script samples: customloader.fsx, which demonstrates how to inject global site configuration values, and postloader.fsx, which shows how to parse Markdown posts with front-matter metadata (title, author, published date, tags) and convert them to HTML using Markdig, including error handling for individual file loads.
samples/loaders · high confidence
Add sample style assets and font definitions
The samples/style area now includes a new fonts.scss file that defines @font-face rules for Noto Sans (regular, bold, italic, and bold italic) using various web font formats, and a new style.less file containing a basic CSS rule for a .div element.
samples/style · high confidence
Added JavaScript sample file
A new sample JavaScript file (sampleJsFile.js) has been added to the samples directory, containing a basic variable assignment.
samples/js · high confidence
Fornax CLI tooling and FSI reference resolution introduced
The Fornax static site generator now includes its core CLI implementation (Fornax.fs), providing commands for building, watching (with configurable ports), and scaffolding new sites via templates. Watch mode features live browser refresh over WebSockets and clears the generator cache on file changes. The tooling adds FSI (F\# Scripting Interactive) reference resolution (FSIRefs.fs) to support dynamic loader and generator evaluation, including logic to detect .NET SDK/runtime versions and resolve assembly paths. Additionally, the web server now supports serving .webp images, and console output is color-coded for information, errors, and success messages.
src/Fornax · high confidence
Introduction of CSS property model types
The core model layer now includes a comprehensive set of discriminated union types representing CSS properties (such as Flex, Grid, Border, and Margin) within the new Model module. This change establishes the foundational data structures required to represent style attributes in the application's internal model, enabling subsequent components to utilize these typed definitions for rendering and configuration.
src/Fornax.Core · high confidence
New sample demonstrating global generator configuration
A new sample file (samples/config.fsx) has been added that demonstrates how to configure global generators within the application. This example shows how to define a configuration object specifying various generators for processing different file types, including LESS to CSS, SCSS to CSS, Markdown posts to HTML, static files, and an index page generation triggered once.
samples · high confidence
New sample generators for static files, Sass, Less, and posts
The samples/generators directory now includes several new generator scripts that demonstrate how to process different content types. The staticfile generator reads and outputs raw file content, while the Sass and Less generators invoke external compilers (sass and dotless) to transform stylesheets. Additionally, a post generator is provided which loads post data, renders it into HTML, and optionally injects a WebSocket script for live browser refresh, controlled by a disableLiveRefresh configuration flag.
samples/generators · high confidence
Behavioural changes
Migrate build system to .NET 8 and project-based FAKE
Fornax now requires the .NET 8 SDK to build and run, replacing previous .NET 6 and .NET 5 targets. The legacy Paket-based FAKE build scripts (build.fsx, build.sh, build.cmd) have been removed and replaced with a project-based FAKE build pipeline (Build.fs, build.fsproj) that uses .NET global tools. This change also updates the FAKE dependency to version 6.1.4 and relaxes the FSharp.Core requirement to version 6.0.7 or newer.
(repo-wide) · high confidence
New Fornax blog template with post paging and mobile layout
The default Fornax template has been refactored to support paginated blog posts, allowing users to configure the number of posts per page via the global loader. The home page now splits posts into chunks and generates navigation links (Previous/Next) for multi-page browsing. Additionally, the layout has been improved for mobile devices, and the post generator now supports summarizing content using the \\<!--more--\>\ marker to display excerpts on the index page while showing full content on individual post pages.
src/Fornax.Template · high confidence
Test coverage
Added unit tests for HTML element rendering and CSS properties
Added a new test project (Fornax.Core.UnitTests) with Expecto-based tests verifying the string representation of HTML elements and CSS properties. The tests cover standard and custom HTML elements with various combinations of properties (strings, floats, booleans) and children (including void elements like \<br/\> and \<img/\>), ensuring correct serialization for both simple and nested structures.
test · high confidence
Dependencies
Migrate to .NET 8 and SDK-style project management
The project has been upgraded from .NET Framework 4.5 to .NET 8, switching from the classic project format to the modern SDK-style format. This change introduces centralized package version management via Directory.Packages.props, removes the legacy Paket dependency files, and updates core dependencies such as FSharp.Core to version 8.0.100 and FAKE to 6.1.4. The main Fornax CLI tool is now configured as a packable .NET 8 executable with the command name 'fornax'.
(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 60.
Lenses
- Code Health 92
- Architecture 100
- Maturity 51
- Readiness 52
- Security 76
Changes since last survey
- 234 commits — 209 feature/other, 25 fixes
By area
- (root) — 95 commits
- src/Fornax — 71 commits
- src/Fornax.Template — 22 commits
- src/Fornax.Core — 13 commits
- .github/workflows — 4 commits
- (repo) — 3 commits
- .paket/Paket.Restore.targets — 3 commits
- samples/generators — 3 commits
- test/Fornax.Core.UnitTests — 3 commits
- samples/config.fsx — 2 commits
- samples/loaders — 2 commits
- samples/post — 2 commits
- samples/sample-generate.fsx — 2 commits
- .config/dotnet-tools.json — 1 commit
- logo/Fornax.png — 1 commit
- logo/logo.png — 1 commit
- samples/generator.fsx — 1 commit
- samples/js — 1 commit
- samples/post.md — 1 commit
- samples/posts — 1 commit
Notable commits
- fix: Fix #63: Support file with spaces in the name
- fix: Fix CLI arguments
- fix: Fix README header image (#13)
- fix: Fix .less generation
- fix: Fix Generator.evaluate
- fix: Fix bug in injectWebsocketCode (post generator)
- fix: Fix folder generation
- fix: Fix for a once generator running when not found
- fix: Fix restore for release.yml
- fix: Fix sample
- fix: Fix sample
- fix: Fix to avoid crash in waach mode when files are changing in .git repo.
- fix: Fix void elements
- fix: Fix watch mode
- fix: Minor readme grammatical fixes (#83)
- fix: Misc fixes (#80)
- fix: Post list fixes
- fix: Small fix to changelog
- fix: Small fix to model
- fix: Small fix to the model
- …and 214 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
ionide/Fornax 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 a743d1c8b8bffc0195b06691caad7fba24625a80 — 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.