Manipula is a Clojure/CLJS automation workbench for scripted UI flows. It combines:
- a Kit + Integrant backend
- a Reagent + Shadow CLJS frontend
- a WebSocket-driven scenario runner
robotand Playwright helpers for browser and desktop automation- a small scenario DSL authored as SCI-evaluated Clojure/EDN
The scenarios bundled in this repo are focused on wallet and dApp automation flows such as MetaMask, Stargate, WooFi, Bungee, Layer3, Matcha, and OmniBTC.
Maintab: load a scenario fromresources/public/automation, edit it, run it, and resume from a specific step.Devtab: test snippets, stream mouse/color info, and generate screen patterns for checks.Docstab: in-app reference for the scenario language.Difftab: compare text inside the frontend.
INFO.md: repo structure, architecture, and developer notesresources/public/markdown/metalang.md: lightweight intro to the scenario language
Prerequisites:
- JDK 17+
- Clojure CLI
- Node.js / npm
Start a dev REPL:
clj -M:devThen start or reload the system from the user namespace:
(go)
(reset)The app serves HTTP on http://localhost:3000 by default.
For frontend assets, run Shadow CLJS in a separate shell:
npx shadow-cljs watch appor:
make shadowThe page expects /js/app.js from the Shadow build. If the CLJS bundle is missing, start the watcher or build the frontend first.
Scenarios are compiled in two steps:
- SCI evaluates the source as Clojure data/code.
clojure.specvalidates the resulting action tree.
Supported action types include:
:group:open:keyboard:click:mouse-move:mouse-rifle:scroll:to-clipboard
Supported checks include:
:pattern:!pattern:opened!:focused:lang-eng:screen-size
Scenarios can also:
- reuse actions by
:name - skip failures with
:safe - repeat groups with
:repeat-unless - repeat from inside a group with
:regroup
Shared helpers live in resources/public/automation/common/stdlib.edn.
Run tests:
clj -M:testBuild the uberjar:
clj -T:build allBuild the container image:
docker build -t manipula .- Only one scenario can run at a time.
- There are a few stale build/key-management hooks in the repo; see
INFO.mdbefore changing build or secret-handling code.