Skip to content
CAI
Software that uses CAICheck a score

ForNeVeR/fornever.me

43.7

Weak · 3 October 2026

571

lines of production code

F#

with C#

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a personal website and blog engine, now implemented as a dynamic ASP.NET Core application with bilingual support for English and Russian content. It serves static posts, presentation slides, and RSS feeds, utilizing Razor Pages for rendering and Markdig for Markdown processing. The architecture includes server-side syntax highlighting via Jint and a dedicated frontend build pipeline using Webpack 5.

How it got here

2014–2015 — Migration to ASP.NET Core

6 changes.

The project underwent a complete engine rewrite, migrating from the Haskell-based Hakyll static site generator to a dynamic ASP.NET Core application using Razor Pages and F\#. This transition involved replacing legacy templates with a modular architecture, introducing server-side code highlighting via Jint, and updating all core dependencies and tooling. Comprehensive test suites and new data models were implemented to support the new functionality and ensure stability.

2016–2017 — frontend build infrastructure and content expansion

5 changes.

This period focused on establishing a formalized frontend build pipeline using Webpack 5 and migrating styles to LESS, thereby separating client-side asset management from the main application. Concurrently, the project expanded its static content by adding presentation submodules and introduced automation scripts for versioning and talk preparation to streamline the release process.

2018–2025 — ASP.NET Core migration

7 changes.

The project underwent a comprehensive migration from the Freya framework to ASP.NET Core, rewriting the Razor pages, controllers, and Markdown processing modules. This effort introduced bilingual support, modernized the RSS feed generation, and established new core abstractions for post rendering and testing utilities.

Features

Added new presentation content to the website

The website now includes three new static content sections for presentations: 'modern-programming', 'net-core-slides', and 'talk-javascriptservices'. These are added as submodules under the wwwroot/talks directory, making the associated slide decks and talk materials available to users.

ForneverMind/wwwroot/talks · high confidence

Introduce PostArchiveModel for post archiving

A new model type, PostArchiveModel, has been added to the application's data layer. This model serves as the structural container for archived posts, holding an array of PostMetadata objects. This change supports the broader effort to migrate the archiving functionality away from the previous Freya-based implementation.

ForneverMind/models · high confidence

Introduce dedicated frontend build infrastructure with Webpack 5

The ForneverMind.Frontend project now includes a formalized build pipeline using Webpack 5 to compile client-side LESS styles and JavaScript, as well as a bundled server-side entry point. A new MSBuild project file (ForneverMind.Frontend.proj) orchestrates the build by invoking npm install and npm run scripts (debug/release) during the build process, ensuring that frontend assets are generated before the main application builds. This change establishes the foundational tooling for frontend asset management, separating the build logic from the main application structure.

ForneverMind.Frontend · high confidence

New integration test utilities for web application testing

Added a new IntegrationTestUtil module to the test framework, providing helper functions to spin up a WebApplicationFactory for integration tests. This allows tests to easily configure the web host, access services, and make HTTP requests against the application in a controlled environment.

ForneverMind.TestFramework · high confidence

Removals

Removal of legacy Hakyll blog templates

The site's legacy template structure has been removed, specifically deleting the default layout, post detail, post list, and archive templates. This eliminates the previous XHTML-based presentation layer and its associated navigation and content rendering logic.

templates · high confidence

Behavioural changes

Add deployment configuration and license metadata

The deploy directory now includes an appsettings.json file that sets the application's base URL to https://fornever.me, alongside a corresponding license file (appsettings.json.license) that applies the MIT license to this configuration file via SPDX identifiers.

deploy · high confidence

Automated versioning and talk preparation scripts added

New PowerShell scripts have been introduced to streamline the build and release process. Get-Version.ps1 determines the application version by parsing git tags (refs/tags/v\*) or falling back to the version defined in the ForneverMind.fsproj file for non-release builds. Prepare-Talks.ps1 automates the setup of presentation content by cleaning the target directory and running dependency installation (via Yarn or npm) for specific talk projects (modern-programming, net-core-slides, git-basics, and talk-javascriptservices), including error handling and assertions to ensure directories are not empty.

Scripts · high confidence

Introduce Jint-based server-side code highlighting

The application now uses the Jint JavaScript engine to perform syntax highlighting for code blocks on the server side, replacing previous client-side or alternative server-side approaches. This change introduces a new \CodeHighlightModule\ that initializes a Jint engine, loads a \server.js\ script, and exposes a \Highlight\ method for processing code snippets with language support. The module is registered in the DI container and integrated into the request pipeline, with logging added to track initialization and processing times. This shift aims to improve performance and reduce memory footprint by leveraging Jint's efficient execution model.

ForneverMind · high confidence

Introduce core abstractions and models for the new post rendering system

The core library now defines the foundational types and interfaces for the new post rendering architecture, replacing the previous Freya-based implementation. This includes the \IPostRenderer\ and \IPostsProvider\ interfaces for handling post data and rendering, along with supporting models like \PostModel\, \PostMetadata\, and \LanguageLinks\. A new \FileSystem\ module utilizing the \TruePath\ library provides path validation utilities, establishing the structural basis for how posts are processed and served.

ForneverMind.Core · high confidence

License metadata added for site images

License files have been added for numerous images in the site's static assets, explicitly declaring copyright ownership and licensing terms. Most images are now marked with an MIT license and copyright held by Friedrich von Never, while one image (2025-09-08.clojure.png) is declared under the CC0-1.0 license with copyright held by Evgeniy Andreev.

ForneverMind/wwwroot/images · high confidence

Migrate Markdown processing to Markdig with table support

The Markdown module has been rewritten to use the Markdig library instead of the previous Freya-based implementation. This change introduces support for pipe tables in rendered content and replaces the custom HTML rendering logic with Markdig's pipeline, including a custom code block renderer that integrates with the existing syntax highlighting service. The migration also updates file path handling to use TruePath and ensures consistent UTF-8 encoding during markdown processing.

ForneverMind/Markdown · high confidence

Migrate RSS feed generation to ASP.NET Core

The application now uses new ASP.NET Core controllers to serve RSS feeds, replacing the previous implementation. The PagesController handles the root URL by redirecting to the default language path, while the RssController generates RSS 2.0 feeds using the WilderMinds.RssSyndication library. Users can now access language-specific feeds at /{language}/rss.xml and a combined feed at /rss.xml, with the response headers correctly including the last modification date of the most recent post.

ForneverMind/Controllers · high confidence

Migrate Razor pages from Freya to ASP.NET Core with bilingual support

The Razor layer has been rewritten to use native ASP.NET Core Razor Pages, replacing the previous Freya-based implementation. This introduces a structured base model for handling language-specific navigation links and separate layout templates for English and Russian content. The site now serves distinct pages for the index, archive, talks, contacts, and individual posts in both languages, along with dedicated 404 error pages for each locale.

ForneverMind.Razor · high confidence

Migrate frontend styles to LESS and update layout

The project has switched from plain CSS to LESS for styling, consolidating styles into modular files (contact, fonts, layout, posts, styles, syntax) imported via a main entry point. This migration includes updating the site layout width from 600px to 770px, refining the header navigation and logo positioning, and applying a flexbox layout to the footer. Additionally, code blocks and syntax highlighting are now styled using the 'agate' theme from highlight.js, and inline code is made bold for better readability.

ForneverMind.Frontend/style · high confidence

Migrate site engine from Hakyll to ASP.NET Core with .NET 10

The site engine has been completely rewritten from the Haskell-based Hakyll static site generator to a dynamic ASP.NET Core application using Razor Pages and F\#. This change upgrades the runtime to .NET 10 (SDK 10.0.401) and requires Node.js 22 for the frontend build process. The new architecture introduces a modular solution structure (ForneverMind, Core, Frontend, Razor) and utilizes git submodules for managing talk content, replacing the previous file-based template system.

(repo-wide) · high confidence

Test coverage

Added comprehensive test suite for site functionality

Added unit and integration tests covering the code highlighting module, Markdown parsing (including metadata, tables, and code blocks), route resolution for index, archive, contact, talks, and post pages, RSS feed generation, and 404 error handling.

ForneverMind.Tests · high confidence

Dependencies

Add PowerShell as a local .NET tool

The project now includes a local .NET tool configuration that installs PowerShell (pwsh) version 7.6.6. This ensures a consistent PowerShell environment is available within the project's context, accompanied by a license file specifying the MIT license for the configuration.

.config · high confidence

Update project dependencies and tooling versions

This change updates the versions of several key dependencies across the project. The .NET application now uses Jint 4.16.4 for JavaScript execution, Markdig 1.4.0 for Markdown processing, and WilderMinds.RssSyndication 1.7.1 for RSS generation. The frontend build relies on css-loader ^7.0.0, highlight.js ^10.4.1, mini-css-extract-plugin ^2.8.0, and webpack-cli ^7.0.0. Test infrastructure has been updated to use Microsoft.NET.Test.Sdk 18.10.1, xunit 2.9.3, and xunit.runner.visualstudio 4.0.0. Additionally, the TruePath library is referenced in version 1.12.0 for path handling.

(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

Score

  • CAI 44 → 44 (+0.1)
  • Rubric changed (rubric-2026.09.15 → rubric-2026.10.1) — scores are not directly comparable.

Lenses

  • Code Health 75 → 75 (+0.0)
  • Architecture 96 → 99 (+3.0)
  • Maturity 54 → 54 (+0.0)
  • Readiness 68 → 68 (+0.0)
  • Security 23 → 23 (+0.0)
  • Accessibility 62 → 62 (+0.0)

Resolved (3)

  • Documentation: no contributor guidance (README.md)
  • Documentation: no installation or build instructions (README.md)
  • Documentation: no usage examples (README.md)

Changes since last survey

  • 4 commits — 4 feature/other, 0 fixes

By area

  • ForneverMind/ForneverMind.fsproj — 3 commits
  • .github/workflows — 1 commit

Notable commits

  • change: Update dependency Jint to 4.16.3
  • change: Update dependency Jint to 4.16.4
  • change: Update dependency Markdig to 1.4.0
  • change: Update dependency ubuntu to v26

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

ForNeVeR/fornever.me 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 3 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 3d72405468a859a7d678ad47f22a0059ee64f18f — the exact code this score is about.
  • Scored under rubric-2026.10.1 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-4f4226d619ea.