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.
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.
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.
# 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.
// The whole declaration.
module! {
name: "match",
version: "0.1.0",
bifs: { "hammingDistance" => hamming },
}
$ rustcfml ext build .
✓ match-0.1.0-macos-aarch64.rcx