The engine ends where you decide

An extension is Rust compiled against the engine's ABI and shipped as a single .rcx file. Drop it in a directory and its functions arrive as ordinary built-ins: no fork of the engine, no waiting for a release, and nothing to install on the host.

Published by the project

Maintained in the RustCFML organisation, built for every platform the engine runs on, and installed the same way.

Browser v0.1.0

A real headless browser inside the engine. JavaScript executes, CSS lays out, and you get screenshots and PDFs back, with no Chrome, no Selenium and no JVM. Built on Obscura, an independent browser engine written in Rust.

About 40 MB, because it carries V8 and a complete layout and paint engine. Needs the engine at v0.685.5 or newer.

Download for your platform

Source and documentation

Typst v0.1.0

Document generation backed by Typst, the modern answer to LaTeX. A fluent Document() builder covers page setup, rich text, tables from a query, footnotes and a table of contents, or a designer owns a .typ template and CFML supplies only the data.

A library rather than a subprocess: roughly 6 ms to compile a two-page invoice and 2 ms to export the PDF. Apache-2.0 throughout.

Download for your platform

Source and documentation

Installing one

Take the file for your platform from a release and install it. Each archive carries the library for one platform only, so the name tells you which you have.

Installing with --user puts it alongside the engine for everything you run. The alternative is to drop the file in your application's extensions/ directory and commit it, which keeps the dependency with the code that needs it.

Loading, versions and troubleshooting

install
# One file, no build step, no host dependencies.
$ rustcfml ext install typst-0.1.0-macos-aarch64.rcx --user
  ✓ typst 0.1.0 installed

$ rustcfml ext list
  browser  0.1.0
  typst    0.1.0

// document.cfm: now they are just functions.
pdf = Document().heading( "Invoice" ).render()

Write one, and have it listed here

Declaring an extension is one macro: name it, list the functions it exports, and build. Anything in the Rust ecosystem is then a CFML built-in away, which is how both extensions above exist without a line of them living in the engine.

Community extensions are welcome on this page. Publish the .rcx files for each platform on a release, say which engine version you need, and open an issue on the website repository to have it added.

src/lib.rs
// The whole declaration.
module! {
    name: "match",
    version: "0.1.0",
    bifs: { "hammingDistance" => hamming },
}
$ rustcfml ext build .
  ✓ match-0.1.0-macos-aarch64.rcx