Not released yet. PeltyCMS is under development and not released yet; these docs describe the upcoming release and may change.
PeltyCMS Developer docs
User docsDevelopers
v0.1.0

Developer docs/Guides

Plugins in other languages

Any language that can build a WASI preview 2 component for the WIT world can be used to write an addon. Rust is the language we test. pelty-cli addon wasm-scaffold --lang c|tinygo writes starter templates for C and TinyGo. These templates are not compiled in CI. The scaffold labels them as untested, so treat them as a starting point.

#C (wasi-sdk + wit-bindgen)

crates/pelty-cli/src/wasm_scaffold.rs · C_MAINC
// UNTESTED template. Generate bindings first:
//   wit-bindgen c --world pelty-addon path/to/pelty.wit
// then build with wasi-sdk:
//   clang --target=wasm32-wasip2 -mexec-model=reactor -o addon.wasm main.c pelty_addon.c pelty_addon_component_type.o
#include "pelty_addon.h"
#include <string.h>

static void set(pelty_addon_string_t *s, const char *v) { pelty_addon_string_dup(s, v); }

void exports_pelty_addon_addon_describe(pelty_addon_string_t *ret) { set(ret, "{\"id\":\"__PROVIDES__\",\"name\":\"__NAME__\"}"); }

bool exports_pelty_addon_addon_call(pelty_addon_string_t *op, pelty_addon_string_t *input, pelty_addon_string_t *ret, pelty_addon_string_t *err) {
    (void)op; (void)input; (void)ret;
    set(err, "unknown op");
    return false;
}

bool exports_pelty_addon_addon_on_event(pelty_addon_string_t *name, pelty_addon_string_t *payload, pelty_addon_string_t *err) {
    (void)name; (void)payload; (void)err;
    return true;
}

#TinyGo

crates/pelty-cli/src/wasm_scaffold.rs · GO_MAINGo
// UNTESTED template. Generate bindings first:
//   go run go.bytecodealliance.org/cmd/wit-bindgen-go generate -o internal path/to/pelty.wit
// then build:
//   tinygo build -target=wasip2 --wit-package path/to/pelty.wit --wit-world pelty-addon -o addon.wasm .
package main

import (
	"go.bytecodealliance.org/cm"
	addon "__MODULE__/internal/pelty/addon/addon"
)

func init() {
	addon.Exports.Describe = func() string { return `{"id":"__PROVIDES__","name":"__NAME__"}` }
	addon.Exports.Call = func(op string, input string) cm.Result[string, string, string] {
		return cm.Err[cm.Result[string, string, string]]("unknown op " + op)
	}
	addon.Exports.OnEvent = func(name string, payload string) cm.Result[string, struct{}, string] {
		return cm.OK[cm.Result[string, struct{}, string]](struct{}{})
	}
}

func main() {}

#Rust template

crates/pelty-cli/src/wasm_scaffold.rs · RUST_LIBRust
//! Generated by `pelty-cli addon wasm-scaffold`.
use pelty_addon_sdk::serde_json;

struct PeltyAddon;
impl pelty_addon_sdk::Guest for PeltyAddon {
    fn describe() -> String {
        serde_json::json!({ "id": "__PROVIDES__", "name": "__NAME__" }).to_string()
    }
    fn call(op: String, _input: String) -> Result<String, String> {
        Err(format!("unknown op {op}"))
    }
    fn on_event(_name: String, _payload: String) -> Result<(), String> {
        Ok(())
    }
}
pelty_addon_sdk::export!(PeltyAddon with_types_in pelty_addon_sdk);