Demo trading UI: Hyper (server-rendered reactive HTML + SSE), Missionary (ap simulators), streamed in-memory positions and trades.
- JDK 21+ (Hyper uses virtual threads)
- Clojure CLI
clojure -X:runServices are defined in resources/services.edn and started via modular / juxt.clip.
Configuration:
resources/config.edn— web server port, token/OAuth2, loggingresources/users.edn— local user accounts (hashed passwords)
Open:
- http://localhost:3000/trading — full-page positions and trades tables
- http://localhost:3000/layout — Golden Layout v2 workspace with panel tabs
Tables update live over SSE as the simulators tick.
nREPL listens on port 9100 when the app is running.
token compares login passwords against pre-hashed values in users.edn (blake2b-128 hex). Passwords are not hashed on each app start.
To add or change a user:
- Edit
resources/users.ednwith plain-text:passwordvalues. - Run
clojure -X:hash-usersonce to write hashes back to the file. - Start the app with
clojure -X:run.
clojure -M:test| Layer | Library |
|---|---|
| Web | Hyper |
| Reactive sim | Missionary |
| Layout | Golden Layout v2 |
| Services | modular |
No database in v1 — simulators write to positions* and trades* atoms; Hyper watches push HTML updates to the browser.