| { | |
| 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 "" | |
| ''; | |
| }; | |
| } | |
| ); | |
| } | |