{ description = "Synapse Agriculture — WASM-native farm stack development environment"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; rust-overlay.url = "github:oxalica/rust-overlay"; flake-utils.url = "github:numtide/flake-utils"; }; outputs = { self, nixpkgs, rust-overlay, flake-utils }: flake-utils.lib.eachDefaultSystem (system: let overlays = [ (import rust-overlay) ]; pkgs = import nixpkgs { inherit system overlays; }; # Rust stable with WASM targets. # Two targets, two purposes: # wasm32-unknown-unknown → bare WASM for MCU (wasm3) and browser # wasm32-wasip1 → WASI preview 1 for gateway/host (wasmtime) rustToolchain = pkgs.rust-bin.stable.latest.default.override { extensions = [ "rust-src" "rust-analyzer" ]; targets = [ "wasm32-unknown-unknown" "wasm32-wasip1" ]; }; in { devShells.default = pkgs.mkShell { buildInputs = with pkgs; [ # ── Rust compilation ────────────────────────────────────── rustToolchain # ── WASM runtimes ───────────────────────────────────────── wasmtime # Full WASI + Component Model runtime # Tests gateway/host modules with all capabilities # ── WASM binary tools ───────────────────────────────────── binaryen # wasm-opt: aggressive size optimization # wasm-opt -Oz -o small.wasm big.wasm # Critical for MCU — can cut binaries 40-60% wabt # wasm2wat / wat2wasm: bytecode inspection # When something breaks, read the WAT wasm-tools # Bytecode Alliance multi-tool: # validate, component lower, strip, compose # component lower = component → core wasm for MCU # ── Web frontend ────────────────────────────────────────── trunk # Dev server for Leptos/Yew WASM apps # Handles wasm-bindgen, assets, hot reload wasm-pack # WASM npm package builder (JS interop) wasm-bindgen-cli # ── Size profiling ──────────────────────────────────────── twiggy # WASM code size profiler # twiggy top module.wasm — largest functions # twiggy dominators module.wasm — dep graph # RP2350 budget: ~400KB for module + heap # ── Build deps ──────────────────────────────────────────── cmake # For building wasm3 from source pkg-config openssl # ── Dev workflow ────────────────────────────────────────── cargo-watch # cargo watch -x test — auto-test on save ]; shellHook = '' echo "" echo " ┌──────────────────────────────────────────────┐" echo " │ Synapse Agriculture — WASM Dev Environment │" echo " └──────────────────────────────────────────────┘" echo "" echo " Rust: $(rustc --version 2>/dev/null || echo 'loading...')" echo " wasmtime: $(wasmtime --version 2>/dev/null || echo 'loading...')" echo " wasm-opt: $(wasm-opt --version 2>/dev/null || echo 'loading...')" echo "" echo " Build targets:" echo " wasm32-unknown-unknown → MCU (wasm3) + browser" echo " wasm32-wasip1 → gateway/host (wasmtime)" echo "" echo " Quick start:" echo " cargo test all native tests" echo " cargo build -p synapse-sensor --target wasm32-unknown-unknown --release" echo " wasm-opt -Oz -o opt.wasm target/.../synapse_sensor.wasm" echo " twiggy top opt.wasm size check" echo "" ''; }; } ); }