Skip to content
CAI
Software that uses CAICheck a score

eproxus/kraft

56.9

Weak · 17 September 2026

2.1k

lines of production code

Erlang

primary language

1

measurement over time

CAI band scale
CAI lens gauges

What this system is

Kraft is a web framework for Erlang/OTP that facilitates the development of HTTP and WebSocket-based applications. It provides built-in support for real-time communication, RESTful APIs, and template rendering with caching capabilities. The system includes example applications demonstrating blog, chat, and API patterns, along with tooling for static analysis and modern CSS styling.

Features

Add Kraft REST API example with client-side templating

The examples/rest directory now provides a complete REST API demonstration using the Kraft framework. It includes an Erlang application that serves a static frontend and an API endpoint returning JSON data. The frontend leverages htmx (v1.4.1) for asynchronous requests and integrates Mustache (v4.2.0) via the htmx client-side-templates extension to render the API response directly in the browser.

examples/rest · high confidence

Add Kraft WebSocket example application

The examples/ws directory now includes a complete demonstration application for Kraft's WebSocket capabilities. It provides three distinct endpoints: a raw text handler at /raw/ws, a JSON handler at /json/ws, and a JSON-RPC handler at /jsonrpc/ws, each with corresponding static HTML pages for browser-based testing. The example also configures automatic ping intervals for the JSON-RPC connection and demonstrates error handling and asynchronous responses within the JSON-RPC protocol.

examples/ws · high confidence

Add Kraft blog example application

A new example application demonstrating a blog built with Kraft has been added to the examples directory. It includes the necessary source files for the application supervision tree, ETS-based data storage for posts and pages, and controller modules for the index, post, and page routes. The example also provides a README with instructions for setting up Tailwind CSS styles and a rebar.config to manage dependencies.

examples/blog · high confidence

Add Kraft chat example with WebSocket support

A new chat example application is added to the examples/chat directory, demonstrating real-time communication using Kraft's WebSocket capabilities. The example includes an Elixir/Erlang backend (chat, chat\_room, chat\_sup modules) that manages a shared process group for broadcasting messages, and a frontend using Mustache templates and the htmx library (version 1.4.1) to handle WebSocket connections and UI updates without page reloads.

examples/chat · high confidence

Add Kraft examples index application

A new example application has been added to serve as a central index for the Kraft framework. It runs on port 8090 and provides a static HTML page listing links to other example applications (Blog, Web Socket, Chat, REST API, TODO) as well as dedicated routes to demonstrate error handling, including a 404, a 500 error with a generated stack trace, and a missing template scenario.

examples/index · high confidence

Add blog example with dark mode support

Introduces a new blog example application in the examples/blog/priv/web directory, featuring a default theme built with Tailwind CSS v4.1.4. The implementation includes static assets and Mustache templates for the home page, individual posts, and static pages, all styled to support both light and dark color schemes via CSS media queries.

examples/blog/priv/web · high confidence

Added example configuration with info-level logging

An example configuration file has been added to the project, setting the kernel logger level to 'info'. This provides users with a reference configuration that enables more detailed logging output by default.

config · high confidence

Introduces configurable template and render caching with ETS backend

The framework now supports caching for templates and rendered content to improve performance. A new \kraft\_cache\ behavior defines the interface, implemented by \kraft\_cache\_ets\ which uses Erlang ETS tables. The cache is configured via the \kraft\ application environment (e.g., \cache =\> \#{template =\> {kraft\_cache\_ets, \#{memory =\> infinity, age =\> {minute, 5}}}}\), allowing users to set memory limits, item age, and cleanup intervals. The \kraft\_dev\ module integrates with this cache during development to handle template reloading and removal, ensuring the cache stays in sync with file changes.

src · high confidence

Behavioural changes

Blog example uses Tailwind CSS v4 with on-demand build

The blog example now styles its UI using Tailwind CSS v4. The styles are defined in a single CSS file that imports the Tailwind framework and specifies the source directory, and the build process is configured to generate styles on demand via a Makefile symlink.

examples/blog/priv/styles · high confidence

Enforce code analysis and formatting on commit

A new pre-commit hook has been added to the repository that automatically runs \rebar3 analyze\ and \rebar3 fmt --check\ before allowing a commit. This ensures that all code changes meet the project's static analysis standards and formatting guidelines, preventing unanalyzed or improperly formatted code from being committed.

.githooks · high confidence

Migrate to Tailwind CSS v4 build system

The styles build process has been updated to use Tailwind CSS v4, replacing the previous v3 configuration. The explicit \tailwind.config.js\ file has been removed in favor of the new \@import "tailwindcss"\ directive in \kraft.css\, and a new Makefile has been introduced to manage the CSS compilation and watch tasks.

priv/styles · high confidence

Redesigned error pages with dark mode support and improved stack trace readability

The web application's error handling UI has been completely overhauled to provide a modern, responsive experience with full dark mode support. The previous static 404 and 500 templates have been replaced with a unified layout system that dynamically renders error details, including a new, highly readable stack trace view in the footer that formats module, function, and file paths with clickable links. The design now adapts to the user's system preferences, switching between light and dark color schemes for backgrounds, text, and borders. Additionally, the CSS asset path has been updated to reflect the new Tailwind v4.1.4 build, ensuring consistent styling across all error states.

priv/web · high confidence

Todo example now uses Tailwind CSS and htmx for the UI

The todo example has been updated to use a modern frontend stack. It now includes Tailwind CSS (v3.4.3) with the DaisyUI and Typography plugins for styling, replacing previous approaches. Additionally, htmx (v1.9.12) is bundled as a static asset to enable asynchronous, partial page updates without writing custom JavaScript. A Makefile and configuration files have been added to build the CSS from source templates.

examples/todo · high confidence

Upgrade to Erlang 27 and OTP 27 requirement

Kraft now requires Erlang/OTP 27.0 or later, making it incompatible with earlier OTP versions. This change accompanies an upgrade to Cowboy 2.17.0 and the replacement of the jsx library with the built-in OTP JSON module for JSON handling.

(repo-wide) · high confidence

Dependencies

Upgrade Tailwind CSS and update styling dependencies

The project's styling tooling has been upgraded from Tailwind CSS 2.1.2 to 3.3.1. This change replaces the previous dependency set (which included autoprefixer, postcss, and postcss-import) with a modern configuration that includes the @tailwindcss/forms and @tailwindcss/typography plugins, as well as the daisyui component library. Users will benefit from the latest Tailwind features and pre-built UI components while the underlying build process is streamlined.

(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 57.

Lenses

  • Code Health 98
  • Architecture 99
  • Maturity 50
  • Readiness 50
  • Security 93
  • Accessibility 52

Changes since last survey

  • 178 commits — 161 feature/other, 17 fixes

By area

  • (root) — 43 commits
  • .github/workflows — 19 commits
  • src/kraft.erl — 19 commits
  • examples/blog — 17 commits
  • priv/web — 12 commits
  • priv/styles — 9 commits
  • examples/chat — 7 commits
  • examples/ws — 7 commits
  • src/kraft_conn.erl — 6 commits
  • src/kraft_instance.erl — 6 commits
  • examples/index — 5 commits
  • src/kraft.app.src — 4 commits
  • src/kraft_handler.erl — 4 commits
  • src/kraft_dev.erl — 3 commits
  • examples/rest — 2 commits
  • src/kraft_controller.erl — 2 commits
  • src/kraft_file.erl — 2 commits
  • src/kraft_template.erl — 2 commits
  • src/kraft_ws_jsonrpc.erl — 2 commits
  • examples/todo — 1 commit

Notable commits

  • fix: Fix Dialyzer warnings
  • fix: Fix broken routes for multiple apps (fix #1)
  • fix: Fix chat example not serving static files
  • fix: Fix crash when producing missing_template error
  • fix: Fix dispatch overwrite
  • fix: Fix missing Kraft dependency in example
  • fix: Fix response headers
  • fix: Fix response type specification
  • fix: Fix stack trace alignment
  • fix: Fix type specs for kraft_ws_jsonrpc behavior
  • fix: Fix xref warnings
  • fix: Implement automatic web socket ping (fix #3)
  • fix: build(version): change vsn from fixed to semver
  • fix: ci(renovate): Fix Renovate errors
  • fix: ci(renovate): Fix regex matching
  • fix: fix(kraft_rest): correctly generate 4XX responses
  • fix: fix(license): Use correct license identifier
  • change: Add Erlang 23 to CI
  • change: Add Erlang 26 to CI test matrix
  • change: Add GitHub Actions continuous integration
  • …and 158 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

eproxus/kraft 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 12dcfe904527db0e258f0ba54bb9224cd277f9fd — 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.