motely-wasm
v15.1.3
Published
Balatro seed searcher — JAML filter language, SIMD-vectorized, NativeAOT-LLVM WASM. Runs in browsers, Node, Deno, Bun, Vercel Edge. Single-threaded (no COEP/SharedArrayBuffer required).
Maintainers
Readme
motely-wasm
Find Balatro seeds with JAML filters — Jimbo's Ante Markup Language. SIMD-vectorized seed search (Motely engine, C# → NativeAOT-LLVM WASM). Browser + Node.
Install
npm install motely-wasmBoot & Search
import motely, { MotelyWasm, MotelyWasmEvents } from "motely-wasm";
await motely.boot();
const jaml = `
name: Blueprint Copy Engine
deck: Red
stake: White
must:
- rareJoker: Blueprint
antes: [1, 2, 3]
should:
- rareJoker: Brainstorm
score: 80
`;
// Events are mutable handler slots — assign your callback, do not call .subscribe().
MotelyWasmEvents.notifyResult = (seed, score, tallyColumns) => console.log(seed, score, tallyColumns);
MotelyWasmEvents.notifyProgress = (seedsSearched, matchingSeeds) => { /* … */ };
MotelyWasmEvents.notifyComplete = (status, totalSeedsSearched, matchingSeeds) => { /* … */ };
const search = MotelyWasm.startRandomSearch(jaml, 10000);
// later: search.cancel();CDN Delivery (recommended for MCP Apps / single-file bundles)
Every published version of motely-wasm is mirrored to a public CDN:
https://cdn.seedfinder.app/motely-wasm/<version>/index.mjsUse this when your build can't (or shouldn't) bundle the WASM payload inline — for example:
- MCP Apps bundled as a single HTML resource: dynamic
import(cdn)keeps the HTML small and the browser caches the engine across tool invocations. - Vercel Functions / Cloudflare Workers: dynamic import avoids bundling ~11MB of WASM into every deployment artifact.
- CDN-hosted static sites: one cached copy of the engine per version, shared across all pages.
Example — load the engine from CDN inside a Web Worker:
// searchWorker.ts
const mod = await import(/* @vite-ignore */
`https://cdn.seedfinder.app/motely-wasm/12.4.1/index.mjs`);
await mod.default.boot();
const { MotelyWasm, MotelyWasmEvents } = mod;Version must be pinned explicitly — the CDN serves immutable, versioned paths for long-term caching (Cache-Control: max-age=31536000).
Content Security Policy
When embedding in a sandboxed iframe (MCP Apps), allow both script loading and fetch/import:
script-src https://cdn.seedfinder.app
connect-src https://cdn.seedfinder.appFor MCP App servers using @modelcontextprotocol/ext-apps:
{
ui: {
csp: {
resourceDomains: ["https://cdn.seedfinder.app"],
connectDomains: ["https://cdn.seedfinder.app"],
},
},
}Build
NativeAOT-LLVM + SIMD. Verify "LLVM compilation to IR finished" in build output.
<BootsharpLlvm>true</BootsharpLlvm>
<WasmEnableSIMD>true</WasmEnableSIMD>
<EmccFlags>-msimd128</EmccFlags>The MONO_WASM: prefix in console logs is Bootsharp's glue log string — this is not a Mono runtime build. Motely is NativeAOT-LLVM.
Release Verification
Before publishing, verify the generated package, not a stale local wrapper:
dotnet publish Motely.Wasm/Motely.Wasm.csproj -c Release
cd Motely.Wasm/e2e
npm install ../../motely-wasm/motely-wasm-<version>.tgz
node release-smoke.mjs
node jamlyzer-preview-smoke.mjsThe release smoke must prove:
motely-wasm/package.jsonversion equalsMotelyWasm.getVersion()MotelyWasm.getJamlSchema().versionequals the package version- the schema does not expose removed aliases such as
mixedJoker - generated Bootsharp exports boot and execute from the packed artifact
License
MIT
