borkdude

plurigrid's avatarfrom plurigrid

Guidance for selecting the right ClojureScript runtime across scripting, browser, Node, and embedded use.

⭐1stars🔀2forks📁View on GitHub🕐Updated Jan 9, 2026

When & Why to Use This Skill

The Borkdude skill provides expert guidance on selecting and implementing the optimal ClojureScript runtime for diverse execution environments. It helps developers navigate the ecosystem of tools created by Michiel Borkent, including Babashka, SCI, Cherry, and Squint, ensuring the right balance between startup speed, bundle size, and feature compatibility for scripting, web, and embedded use cases.

Use Cases

  • Architectural Decision Making: Using the runtime matrix and decision tree to choose between Squint for minimal JS bundles or Cherry for full ClojureScript macro support.
  • DevOps and Scripting: Implementing Babashka (bb) for high-performance shell scripts and build automation to replace slow-starting JVM-based tools or complex Bash scripts.
  • Embedded Logic: Integrating SCI (Small Clojure Interpreter) to provide secure, sandboxed evaluation for plugin systems, configuration DSLs, or interactive REPLs within existing applications.
  • Web Development: Deploying Scittle for browser-based scripting without a build step, or using nbb for Node.js environments requiring seamless npm integration.
nameborkdude
descriptionGuidance for selecting the right ClojureScript runtime across scripting, browser, Node, and embedded use.
sourcelocal
licenseUNLICENSED

Borkdude Skill: ClojureScript Runtime Selection

Status: ✅ Production Ready Trit: 0 (ERGODIC - runtime neutral) Principle: Right tool for context Author: Michiel Borkent (@borkdude)


Overview

Borkdude provides guidance for selecting the appropriate ClojureScript runtime based on execution context. Named after Michiel Borkent, creator of Babashka, SCI, Cherry, Squint, and other Clojure tools.

Runtime Matrix

Runtime Context JVM Node Browser REPL
Babashka Scripting ✗ ✗ ✗ ✓
SCI Embedded ✓ ✓ ✓ ✓
Cherry Compiler ✗ ✓ ✓ ✓
Squint Compiler ✗ ✓ ✓ ✓
Scittle Browser ✗ ✗ ✓ ✓
nbb Node ✗ ✓ ✗ ✓

Decision Tree

Start
  │
  ├── Need fast startup? ─────────► Babashka (bb)
  │
  ├── Browser target?
  │     ├── Minimal bundle? ──────► Squint
  │     ├── Full ClojureScript? ──► Cherry  
  │     └── Script tag? ──────────► Scittle
  │
  ├── Node scripting? ────────────► nbb
  │
  └── Embedded interpreter? ──────► SCI

Commands

# Babashka (scripting)
bb script.clj

# nbb (Node)
npx nbb script.cljs

# Squint (compile to JS)
npx squint compile src/main.cljs

# Cherry (compile with macros)
npx cherry compile src/main.cljs

# Scittle (browser)
# <script src="https://cdn.jsdelivr.net/npm/scittle@0.6.15/dist/scittle.js"></script>

SCI (Small Clojure Interpreter)

Embedded interpreter for sandboxed evaluation:

(require '[sci.core :as sci])

(def ctx (sci/init {:namespaces {'user {'foo (fn [] "bar")}}}))

(sci/eval-string* ctx "(user/foo)")
;; => "bar"

Cherry vs Squint

Feature Cherry Squint
ClojureScript compat High Medium
Bundle size Larger Smaller
Macros Full support Limited
Interop CLJS-style JS-native
Target audience CLJS developers JS developers

Babashka Pods

Extend Babashka with pods:

(require '[babashka.pods :as pods])

(pods/load-pod 'org.babashka/go-sqlite3 "0.1.0")
(require '[pod.babashka.go-sqlite3 :as sqlite])

(sqlite/execute! "test.db" ["CREATE TABLE users (id INTEGER PRIMARY KEY)"])

Integration with Music Topos

;; Use Babashka for scripts
(ns ruler.propagate
  (:require [babashka.fs :as fs]))

;; Use SCI for embedded color evaluation
(def color-ctx
  (sci/init {:namespaces 
             {'gay {'color-at (fn [idx] (gay/color-at idx))}}}))

When to Use Each

Babashka

  • Shell scripts
  • Build automation
  • CLI tools
  • Data processing

SCI

  • Sandboxed evaluation
  • Plugin systems
  • Configuration DSLs
  • Interactive REPLs

Cherry

  • Full CLJS features in browser
  • Macro-heavy code
  • CLJS library compat

Squint

  • Minimal JS output
  • JS-first interop
  • Small bundles

Scittle

  • Browser scripting
  • No build step
  • Quick prototypes

nbb

  • Node.js scripting
  • npm library access
  • Server scripts

Example: Skill Propagation

#!/usr/bin/env bb
;; .ruler/propagate.clj

(require '[babashka.fs :as fs]
         '[clojure.string :as str])

(defn propagate-skill! [skill-name]
  (let [source (str ".ruler/skills/" skill-name "/SKILL.md")
        content (slurp source)]
    (doseq [agent ["codex" "claude" "cursor"]]
      (let [target (str "." agent "/skills/" skill-name "/SKILL.md")]
        (fs/create-dirs (fs/parent target))
        (spit target content)))))

(propagate-skill! "unworld")

Skill Name: borkdude Type: Runtime Selection / ClojureScript Tooling Trit: 0 (ERGODIC) Runtimes: Babashka, SCI, Cherry, Squint, Scittle, nbb