Aether enables developers to deploy WebAssembly functions to edge nodes without managing infrastructure. Edge nodes run functions in sandboxed WASI contexts while the Control Plane manages function registration, node coordination, and notifications.
|
Low-Latency Execution
Sandboxed Security
|
Smart Orchestration
Developer Friendly
|
graph TB
Client[Client Request] -->|POST /execute| Edge[Edge Runtime]
Edge -->|Load WASM| Cache[Module Cache]
Edge -->|Execute| WASM[WASM Sandbox]
WASM -->|stdout| Result[Function Output]
Edge -.->|Notify| Control[Control Plane]
Control -->|Manage| Registry[Function Registry]
Control -->|Coordinate| Nodes[Edge Nodes]
style Edge fill:#4CAF50
style Control fill:#2196F3
style WASM fill:#FF9800
┌─────────┐ ┌──────────────┐ ┌─────────────┐
│ Client │────▶│ Edge Runtime │────▶│ WASM Engine │
└─────────┘ └──────────────┘ └─────────────┘
│ │
│ ▼
│ ┌─────────────┐
│ │ Output │
│ └─────────────┘
▼
┌──────────────┐
│Control Plane │
│ (Metadata) │
└──────────────┘
Flow Description:
- Client Request → Edge Runtime (
/execute) - Edge Runtime (AppState) → Loads & executes WASM function with runtime limits
- Function Execution → WASM module runs sandboxed; output captured via stdout memory pipes
- Control Plane (AppControl) → Receives notifications, manages function registry, node metadata
Note: Control Plane manages metadata only — execution stays at the edge for optimal performance.
The edge execution engine that runs WASM functions with strict resource controls.
#[derive(Clone)]
pub struct AppState {
func_dir: PathBuf,
module_cache: Arc<Mutex<HashMap<String, Arc<Module>>>>,
engine: Engine,
exec_timeout: Duration, // Default: 3s
memory_limit_bytes: usize, // Default: 16MB
}Capabilities:
- WASI context creation & sandboxing
- Compiled module caching
- Configurable memory & timeout limits
- Health monitoring endpoints
Endpoints: /execute, /health
Central orchestration system for function and node management.
#[derive(Clone)]
pub struct AppControl {
pub db: Arc<Db>, // Sled persistence
pub func_dir: PathBuf, // Function storage
pub http_client: reqwest::Client, // Node communication
}Responsibilities:
- Function metadata storage
- Edge node registry
- Event notification system
- Persistent state management
Endpoints: /register, /api/functions, /callback
- Rust 1.70+ and Cargo
- WASM target:
rustup target add wasm32-wasi
# Clone the repository
git clone https://github.com/ezvalorazetho/aether-edge.git
cd aether-edge
# Build the project
cargo build --release|
Control Plane (Port 9090) cargo run --bin aether-controlManages function registry and node coordination. |
Edge Node (Port 9091) cargo run --bin aether-engineExecutes WASM functions at the edge. |
curl -X POST http://127.0.0.1:9090/api/functions \
-H "Content-Type: application/json" \
-d '{
"name": "hello_world",
"wasm_b64": "<BASE64_ENCODED_WASM>"
}'Response:
{
"status": "success",
"function_id": "hello_world",
"deployed_at": "2025-10-27T10:30:00Z"
}curl -X POST http://127.0.0.1:9091/execute \
-H "Content-Type: application/json" \
-d '{
"function": "hello_world",
"input": {
"msg": "Hello from Aether!"
}
}'Response:
{
"output": "Hello from Aether!",
"execution_time_ms": 1.23,
"memory_used_kb": 145
}curl http://127.0.0.1:9090/api/functions/manifestResponse:
{
"functions": [
{
"name": "hello_world",
"size_kb": 45,
"uploaded_at": "2025-10-27T10:30:00Z"
}
]
}| Endpoint | Method | Description | Request Body |
|---|---|---|---|
/register |
POST | Register edge node | {"node_id": "edge-01", "url": "..."} |
/api/functions |
POST | Upload WASM function | {"name": "...", "wasm_b64": "..."} |
/api/functions/manifest |
GET | List all functions | - |
/callback |
POST | Receive node notifications | {"event": "...", "data": {...}} |
| Endpoint | Method | Description | Request Body |
|---|---|---|---|
/execute |
POST | Execute WASM function | {"function": "...", "input": {...}} |
/health |
GET | Runtime health check | - |
[runtime]
exec_timeout = "3s" # Maximum execution time
memory_limit = "16MB" # Max memory per module
cache_size = 100 # Number of cached modules
[server]
host = "0.0.0.0"
port = 9091[database]
path = "./data/control.db" # Sled DB location
[server]
host = "0.0.0.0"
port = 9090
[registry]
node_timeout = "30s" # Node heartbeat timeout# Build control plane
docker build -t aether-control -f Dockerfile.control .
# Build edge runtime
docker build -t aether-edge -f Dockerfile.edge .
# Run with docker-compose
docker-compose up -d- Configure firewall rules (9090, 9091)
- Set up HTTPS with reverse proxy (nginx/caddy)
- Configure resource limits in production
- Enable logging and monitoring
- Set up automatic node registration
- Implement authentication layer
| Metric | Value | Conditions |
|---|---|---|
| Cold Start | < 5ms | Cached module |
| Execution | ~1-2ms | Simple function |
| Throughput | 10k req/s | Single node |
| Memory | 16MB | Per function |
Benchmarked on: Intel i7, 16GB RAM, NVMe SSD
We welcome contributions! Here's how you can help:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Follow Rust best practices and idioms
- Add tests for new features
- Update documentation as needed
- Ensure
cargo clippypasses - Run
cargo fmtbefore committing
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.
If you find Aether useful, consider supporting the development:
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Crate: crates.io/crates/aether-edge
Built with Rust 🦀
Aether - Lightweight, Fast, Serverless-Ready Edge Computing
