This repository (
a, codename Squirrel) is the next-generation evolution of the original Atome Ruby framework and is still under active development. It is a work in progress, but not a mere proof of concept: it serves as the base for the fully functional solution. The roadmap includes a FreeBSD boot mode leveraging jails to provide connected, shareable environments that sync seamlessly online/offline (with robust conflict resolution), plus the same unified, agnostic object system that made classic Atome unique. Atome (Squirrel version) is a full-stack, cross-platform creation framework aimed at building entire ecosystems: from multimedia operating-system-like experiences, audio/video editors, web apps, and services, down to tiny personal utilities or educational playgrounds. Hybrid agnostic and multi purpose-first toolkit that mixes Vanilla JS + Squirrel UI DSL, a Node/Fastify toolchain, and a Rust/Tauri runtime to target web, desktop,mobile and even AUv3 hosts with a single codebase.
Squirrel provides a declarative UI DSL (expressed as plain JavaScript) that drives custom components, WaveSurfer integrations, and drag-and-drop workflows. The authoring syntax is intentionally Ruby-like (symbols, method blocks, box/text primitives) but compiles down to vanilla JS so it can run everywhere. The desktop shell is powered by Tauri 2, which embeds both a Rust (Axum) micro server and the Node/Fastify stack so that the same /api/uploads and static assets work across dev servers, packaged apps, and AUv3 extensions. A shared iPlug2 pipeline keeps the DSP core consistent between AUv3 and WebAudio Module (WAM) builds.
| Layer | Purpose | Default ports / paths |
|---|---|---|
Squirrel Frontend (src/application) |
Builds views via $() helpers and DSL-generated components. |
Runs inside the browser, the Tauri webview, or WKWebView for AUv3. |
Fastify server (server/server.js) |
Serves static files during development, exposes /api/uploads backed by src/assets/uploads, handles DB access (SQLite/libSQL via ADOLE). |
http://127.0.0.1:3001 |
Axum server in Tauri (src-tauri/src/server) |
Mirrors the same API when the app runs inside Tauri, persisting uploads under the sandbox (~/Library/Containers/.../uploads). |
http://127.0.0.1:3000 |
Tauri host (src-tauri) |
Launches the Axum server, makes sure Fastify is running (spawning it if needed), and exposes the port to the frontend. | Native desktop bundle. |
DSP / AUv3 / WAM (src/core, src/au, src/web, src-Auv3) |
Shared C++ DSP core compiled via the root CMake superbuild, surfaced either as an AUv3 (iPlug2) or as a WebAudio Module bridge. | Depends on the chosen target. |
- Declarative UI DSL β Build interfaces entirely in JS using Squirrel selectors (no raw HTML/CSS edits).
- Drag & drop uploads β
src/application/aBox/index.jsstreams blobs to/api/uploads, refreshes metadata, and offers one-click downloads. - Multi-runtime parity β Fastify (Node) and Axum (Rust) implement the same endpoints, so Tauri/AUv3 and the browser stay aligned.
- Audio tooling β GSAP animations, Tone.js helpers, and the shared iPlug2 DSP core.
- Automation scripts β
run.shinstalls deps, configures SQLite paths, launches Fastify + Tauri, or builds production bundles.
- Node.js 18+ and npm
- Rust toolchain +
@tauri-apps/cli - macOS toolchain for AUv3 (Xcode 15+, Command Line Tools, codesigning identities)
- CMake + Ninja/Make for the DSP superbuild
- SQLite3 (included by default on macOS/Linux) β
run.shauto-configures the database path brew install ripgrepis convenient for searching (optional)
npm installnpm run start:serverThis serves src/ at http://127.0.0.1:3001, exposes /api/uploads, and uses src/assets/uploads as the storage root.
npm run tauri devTauri embeds the Axum server on port 3000, points the webview to the same src/ assets, and spawns Fastify if it is not already running.
./run.sh # installs deps (if needed), starts Fastify + Tauri
./run.sh --force-deps # forces dependency reinstall before launch
./run.sh --prod # builds frontend + tauri bundle, mounts the dmgrun.sh also ensures SQLITE_PATH exists by using database_storage/adole.db as the default database location. For cloud deployments, set LIBSQL_URL and LIBSQL_AUTH_TOKEN for Turso.
npm run build # rollup build for npm package
npm run build:cdn # minimized UMD bundle for CDN
npm run build:all # npm + CDN builds
npm run tauri build # production desktop bundle (also invoked by ./run.sh --prod)npm run test # vitest
npm run scan:components
npm run check:syntaxDragDrop.createDropZoneinsrc/application/aBox/index.jscollects dropped files.- Each file is sent as
application/octet-streamwith anX-Filenameheader to/api/uploads. - The server (Fastify or Axum) sanitizes the filename, resolves collisions, writes to disk, and responds with
{ success: true, file }. fetchUploadsMetadatapolls/api/uploadsto rebuild the list; clicking an entry triggers/api/uploads/:filefor download.
Storage paths
- Fastify (Node): saves under
src/assets/uploadsrelative to the repo root.- Tauri/Axum: saves under the appβs sandbox (
~/Library/Containers/.../uploads). When the UI runs inside AUv3 or the packaged app, inspect that path instead of the repo folder.
src/
βββ application/ # Squirrel UI modules (aBox, intuition toolbox, etc.)
βββ assets/ # Shared media + uploads (dev)
βββ core/ # DSP building blocks shared with AUv3/WAM
βββ squirrel/ # Spark runtime, component registry
βββ js/, css/, web/ # Third-party libs bundled with the UI
βββ index.html # Entry point consumed by Squirrel (never edited directly)
src-tauri/
βββ src/main.rs # Tauri bootstrap + server launch
βββ src/server/ # Axum router, uploads handler, static serving
src-Auv3/ # iPlug2 AUv3 host + Swift UI bridge
server/server.js # Fastify server used outside of Tauri
scripts_utils/ # Helper scripts run by run.sh (dependencies, Fastify, Tauri)
documentations/ # Detailed guides (AUv3, deployment, squirrel usage, etc.)
Problems solving/, audit&bench/, R&D/ # Notes, experiments, benchmark reports
- The DSL authoring style mirrors
box,text, and other primitives (documentations/using_squirrel.md). src-tauri/src/server/mod.rsdemonstrates how nodes are parsed, sanitized, and exposed to the frontend.- The Rust snippet below shows the simplified data flow used in the docs:
pub fn parse_dsl() -> Vec<String> {
let mut node = Node::new("note", "text");
node.set("content", json!("β Edit me inline"));
node.set("editable", json!(true));
vec![node.to_js()]
}The generated JS is still plain ES modules and ends up calling helpers like createNode or $() so it can run unchanged whether the app is embedded in a browser, in Tauri, or inside the AUv3 WebView.
- The root
CMakeLists.txtbuilds shared targets:dsp_core,ring_buffer,disk_reader. src/auexposes the DSP parameters to iPlug2;src/webexposes the same graph to a WebAudio Module stub, andsrc-Auv3/iplug/AUViewController.swiftrenders the Squirrel UI via WKWebView.auv3.sh,build_PWA_app.sh, andscripts_utils/run_fastify.sh/run_tauri.shautomate packaging for each runtime.- Known limitations (see
Problems solving/): disk streaming is a placeholder, time-stretch hooks exist but need concrete implementations, and the WAM glue is still minimal.
documentations/auv3_deployment.mdβ steps to package and notarize the AUv3 build.documentations/auv3_webview_audio_injection.mdβ explains audio injection between WKWebView and the DSP core.documentations/button_usage.md,components.mdβ showcase the Squirrel component DSL.documentations/tempo_regression_fix.md,Problems solving/*.mdβ recent fixes and investigation logs.
Keep the README in sync with these guides when the build, runtime ports, or upload behavior change.