One API Library.
Every Language. Every Platform.
A lightweight, high-performance Reactive Web Framework for Java, Kotlin, Python, .NET, iOS, JS, Flutter & Kotlin Multiplatform — built from scratch with zero magic, sub-100ms startup, and a 2 MB footprint.
Engineered for Transparency & Performance
A lightweight toolkit built from scratch that puts control back in the hands of Java, Kotlin, Python, .NET, iOS, JS, Flutter & Multiplatform developers.
Custom Reactive Engine
From-scratch implementation of the Reactive Streams specification. High-performance, lightweight publishers (Mono & Flux) with custom schedulers.
Zero-Dependency Core
Build embedded servers on Netty or native runtimes. No XML configs, no dependency scanning, and minimal runtime memory footprint.
Functional Routing DSL
Type-safe routing DSL (`RouterFunction` / `Router`) for elegant, clean, and declarative HTTP endpoints.
Cross-Platform Reactive Client
Call REST APIs seamlessly across Java, Kotlin, Python, .NET, iOS (Swift), JS/TS, Flutter & Kotlin Multiplatform using unified reactive streams.
WebSockets & Streaming
Full bi-directional WebSocket sessions (`WebSocketSession`) & chunked binary video/audio streams (`Flow
UI State Integration
Built-in UI state helpers (`rememberHttpClient`, `produceHttpState`, `@StateObject`) for Jetpack Compose & SwiftUI.
Built-in Codecs
Out-of-the-box non-blocking JSON serialization and deserialization across Java, Kotlin, Python, .NET, JS & Swift.
Multipart & Binary Transfer
Effortless multipart file uploads (`addFilePart`) with progress tracking and direct file downloads (`downloadTo`).
Native Front Controller
Designed with a clear architecture based on a native DispatcherHandler, custom WebFilters, and CORS exception mapping.
Framework & Language Comparison
A transparent look at why EtherFlow outperforms traditional frameworks across every target platform.
| Aspect | Spring / Heavy Frameworks | EtherFlow |
|---|---|---|
| Dependencies | Spring Context, Beans, Web, Reactor Core, Netty, Jackson (hundreds of transient classes) | Zero-overhead, minimal core dependencies |
| Startup Time | 2.0 - 5.0 seconds (due to classpath scanning) | < 100ms |
| Jar / Binary footprint | ~15 - 30 MB | ~2 MB |
| Complexity | Deep hierarchies, proxy-based AOP, 15+ annotations | Simple compose interfaces, no reflection magic |
| Multiplatform Support | JVM Server-only | Java, Kotlin, Python, .NET, Android, iOS (SwiftUI), JS, Flutter & KMP Support |
| Debugging Stack | Extremely long, complex AOP and bean instantiation proxies | Short, direct, understandable stack traces |
Why EtherFlow Wins Across Programming Languages
How EtherFlow simplifies development compared to ecosystem defaults:
Java JVM
Kotlin Multiplatform
Python Core
.NET / C#
Android Java
Android Kotlin
iOS Swift Core
iOS SwiftUI
JS & TypeScript
Flutter & Dart
See the Startup Speed
Experience the difference between heavy framework startup scans and EtherFlow's instant boot.
Clean, Declarative API
Write type-safe functional routes and reactive clients for Java 21+, Kotlin, Python, .NET, iOS, JS, Flutter & KMP.
import io.etherflow.core.Mono;
import io.etherflow.client.WebClient;
import io.etherflow.server.netty.NettyServer;
import io.etherflow.web.function.*;
// 1. Call API reactively using EtherFlow WebClient
WebClient client = WebClient.builder().baseUrl("https://api.etherflow.io").build();
Mono<User> userMono = client.get()
.uri("/users/1")
.retrieve()
.bodyToMono(User.class);
userMono.subscribe(user -> System.out.println("Loaded: " + user.getName()));
// 2. Expose endpoint on Netty Server
RouterFunction routes = RouterFunction.route()
.GET("/users/{id}", req -> Mono.just(ServerResponse.ok("{\"status\":\"active\"}")))
.build();
NettyServer.create(8080, routes).start();
import io.etherflow.client.kmp.HttpClient
import io.etherflow.core.Mono
// Kotlin Multiplatform API Call (JVM, Android, iOS, JS)
val client = HttpClient {
baseUrl("https://api.etherflow.io")
}
suspend fun loadUser(): User {
// Non-blocking typed GET call
return client.get("/users/1").executeAs<User>()
}
// Bi-directional WebSocket session
client.webSocket("wss://echo.etherflow.io") {
send("Hello EtherFlow!")
incoming.collect { frame -> println("Received: ${frame.text}") }
}
import asyncio
from etherflow import WebClient, NettyServer, Router
# 1. Non-blocking Reactive API Client in Python
client = WebClient(base_url="https://api.etherflow.io")
async def fetch_user():
user = await client.get("/users/1").to_mono()
print(f"Loaded: {user['name']}")
# 2. Lightweight Reactive HTTP Server
router = Router().get("/users/{id}", lambda req: {"status": "active"})
NettyServer.create(port=8080, routes=router).start()
using System;
using EtherFlow.Client;
using EtherFlow.Server;
// 1. Reactive API Client in C# / .NET 8
var client = new EtherFlowClient("https://api.etherflow.io");
var user = await client.GetAsync<User>("/users/1");
Console.WriteLine($"Loaded: {user.Name}");
// 2. Functional Server Routing
var router = Router.Create()
.Get("/users/{id}", req => ServerResponse.Ok(new { status = "active" }));
await NettyServer.ListenAsync(8080, router);
import io.etherflow.client.EtherFlowClient;
import io.etherflow.core.Mono;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
// Android Java Activity API Call
public class MainActivity extends AppCompatActivity {
private EtherFlowClient client = new EtherFlowClient("https://api.etherflow.io");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Non-blocking API GET request on Android Java
client.get("/users/1")
.retrieve()
.bodyToMono(User.class)
.subscribe(user -> {
runOnUiThread(() -> showUser(user));
}, error -> {
Log.e("EtherFlow", "Android Java API Error", error);
});
}
}
import io.etherflow.client.kmp.HttpClient
import io.etherflow.client.compose.produceHttpState
import androidx.compose.runtime.Composable
import androidx.compose.material3.Text
// Jetpack Compose & Android Kotlin Integration
val client = HttpClient {
baseUrl("https://api.etherflow.io")
}
@Composable
fun UserProfileScreen(userId: String) {
// Produce reactive HTTP state in Jetpack Compose
val userState by produceHttpState {
client.get("/users/$userId").executeAs<User>()
}
when (val state = userState) {
is HttpState.Success -> Text("Hello ${state.data.name}")
is HttpState.Loading -> CircularProgressIndicator()
is HttpState.Error -> Text("Error: ${state.message}")
}
}
import Foundation
import EtherFlowClient
// Pure Swift Native Async API Client
final class NetworkManager {
private let client = EtherFlowClient(baseUrl: "https://api.etherflow.io")
func fetchUserProfile(id: Int) async throws -> User {
let response = try await client.get(url: "/users/\(id)").execute()
guard response.isSuccess else {
throw APIError.serverError(response.statusCode)
}
return try JSONDecoder().decode(User.self, from: response.data)
}
func streamVideoChunks(path: String) async throws {
let stream = try await client.get(url: path).stream()
for try await chunk in stream.chunks {
print("Received chunk: \(chunk.count) bytes")
}
}
}
import SwiftUI
import EtherFlowClient
// 1. SwiftUI ViewModel State Manager
@MainActor
class UserProfileViewModel: ObservableObject {
@Published var user: User? = nil
@Published var isLoading = false
private let client = EtherFlowClient(baseUrl: "https://api.etherflow.io")
func loadUserProfile(userId: Int) {
isLoading = true
Task {
do {
let response = try await client.get(url: "/users/\(userId)").execute()
if response.isSuccess {
self.user = try JSONDecoder().decode(User.self, from: response.data)
}
} catch { print(error.localizedDescription) }
self.isLoading = false
}
}
}
// 2. SwiftUI View Screen Component
struct UserProfileView: View {
@StateObject private var viewModel = UserProfileViewModel()
let userId: Int
var body: some View {
VStack {
if viewModel.isLoading {
ProgressView("Loading Profile...")
} else if let user = viewModel.user {
Text(user.name).font(.title).bold()
Text(user.email).font(.subheadline).foregroundColor(.secondary)
}
}
.onAppear { viewModel.loadUserProfile(userId: userId) }
}
}
import { EtherFlowClient } from 'etherflow-client';
// Call API in Node.js or Web Browser
const client = new EtherFlowClient({ baseUrl: 'https://api.etherflow.io' });
// Reactive stream subscription
client.get<User>('/users/1')
.subscribe({
next: (user) => console.log('User:', user.name),
error: (err) => console.error('API Error:', err)
});
import 'package:etherflow_client/etherflow_client.dart';
final client = EtherFlowClient(baseUrl: 'https://api.etherflow.io');
Future<void> fetchUser() async {
// Non-blocking Reactive API Call in Flutter
final user = await client.get('/users/1').asMono<User>();
print('Loaded: ${user.name}');
// Stream chunked video bytes
client.stream('/video/chunked').listen((chunk) {
print('Received ${chunk.length} bytes');
});
}
Getting Started
Pick your platform and integrate EtherFlow into your project in seconds.
// Server Meta-POM (Netty + Jackson Core)
implementation("io.etherflow:etherflow-starter-webflux:0.1.0")
// KMP Client (Android, iOS, JS, JVM)
implementation("io.etherflow:etherflow-client-kmp:0.1.0")
// Compose Multiplatform UI Helpers
implementation("io.etherflow:etherflow-client-compose:0.1.0")
# Install via pip
pip install etherflow
# Or add with Poetry
poetry add etherflow
// Install via dotnet CLI
dotnet add package EtherFlow.Client --version 0.1.0
dotnet add package EtherFlow.Server --version 0.1.0
// app/build.gradle (Android Java Project)
dependencies {
implementation 'io.etherflow:etherflow-client:0.1.0'
implementation 'com.squareup.okhttp3:okhttp:4.12.0'
}
// app/build.gradle.kts (Android Jetpack Compose)
dependencies {
implementation("io.etherflow:etherflow-client-kmp:0.1.0")
implementation("io.etherflow:etherflow-client-compose:0.1.0")
}
// shared/build.gradle.kts (Kotlin Multiplatform Module)
kotlin {
sourceSets {
commonMain.dependencies {
implementation("io.etherflow:etherflow-client-kmp:0.1.0")
implementation("io.etherflow:etherflow-client-compose:0.1.0")
}
}
}
// Package.swift or Xcode SPM
dependencies: [
.package(url: "https://github.com/kvarun701/EtherFLow.git", from: "0.1.0")
]
// Target Dependency
.product(name: "EtherFlowClient", package: "EtherFLow")
# Install via npm
npm install etherflow-client
# Or install via pnpm / yarn
pnpm add etherflow-client
yarn add etherflow-client
# pubspec.yaml
dependencies:
flutter:
sdk: flutter
etherflow_client: ^0.1.0
// Sync Gradle and compile
./gradlew build
// Run EtherFlow server
./gradlew :app:run
# Run your EtherFlow Python server
python -m etherflow run
# Or use uvicorn-compatible startup
python app.py
// Build and run your .NET project
dotnet build
dotnet run
<uses-permission android:name="android.permission.INTERNET" />
// Sync Gradle in Android Studio
// Clean & Rebuild → Run on device
<uses-permission android:name="android.permission.INTERNET" />
// Sync Gradle KTS
// Build Jetpack Compose app → Run
// Build all KMP targets
./gradlew :shared:build
// Embed iOS Framework for Xcode
./gradlew :shared:embedAndSignAppleFrameworkForXcode
// Resolve SPM dependencies
swift build
// Or Command+B in Xcode
// then import EtherFlowClient in Swift files
# Build for production
npm run build
# Or with pnpm / yarn
pnpm build
yarn build
# Fetch dependencies
flutter pub get
# Launch on device
flutter run