A lightweight, high-performance Reactive Web Framework built from scratch

One API Library.
Every Language. Every Platform.

“ The world's most universal way to call APIs — beyond boundaries, beyond frameworks, beyond limits. ”

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.

Java 21+ Kotlin Python 3.10+ .NET 8+ (C#) Android (Java/Kotlin) iOS (Swift/SwiftUI) JS / TS Flutter Kotlin Multiplatform
~2 MB JAR Size
< 100ms Startup Time
Zero Framework Overhead
8 Platforms Java, Kotlin, Python, .NET, iOS, JS, Flutter & KMP

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 21+

Java JVM

Spring WebFlux / Jersey
Heavy reflection, annotation magic (15+ annotations), long 2s-5s classpath startup scans.
EtherFlow Advantage
Sub-100ms instant boot, zero annotation magic, clean functional `RouterFunction` & ~2MB JAR.
Kotlin / KMP

Kotlin Multiplatform

Ktor / Spring Kotlin
Complex plugin pipelines, heavy server dependencies for mobile & web client builds.
EtherFlow Advantage
Native `Mono` & Coroutine primitives, shared cross-platform reactive client without bloat.
Python 3.10+

Python Core

FastAPI / Requests / RxPY
Event loop mismatches, thread blocking risks in sync clients, heavy ORM & framework boilerplate.
EtherFlow Advantage
Native Reactive Streams & asyncio integration with zero-overhead lightweight client & server primitives.
.NET 8+ (C#)

.NET / C#

ASP.NET Core / System.Reactive
Heavy DI registration pipelines, verbose middleware configuration, large runtime assembly footprint.
EtherFlow Advantage
Sub-millisecond startup, direct Task/IAsyncEnumerable reactive bindings, lightweight zero-magic framework.
Android (Java)

Android Java

Volley / AsyncTasks / Retrofit
Manual callbacks, main-thread blocking risks, boilerplated response wrappers.
EtherFlow Advantage
Non-blocking `Mono` reactive streams directly on Android Java with thread-safe UI callbacks.
Android (Kotlin)

Android Kotlin

OkHttp + Custom State
Manual coroutine lifecycle management and multi-step UI state conversions.
EtherFlow Advantage
Direct Jetpack Compose integration via `produceHttpState` and automatic state handling.
iOS (Swift)

iOS Swift Core

RxSwift / URLSession
Manual mapping layers, asymmetric async APIs between iOS front-end and JVM back-end.
EtherFlow Advantage
Unified Reactive Streams & native Swift `async/await` Task streaming across iOS & server.
iOS (SwiftUI)

iOS SwiftUI

Combine + URLSession
Complex publisher pipelines, manual thread dispatches, and multi-layer state mapping.
EtherFlow Advantage
Direct `@StateObject` & `@Published` reactive bindings with automatic UI main-actor dispatching.
JS / TS

JS & TypeScript

Axios / RxJS
Inconsistent error propagation, heavy polyfills, mismatched async patterns across environments.
EtherFlow Advantage
Identical reactive API on Node.js & Browser, non-blocking stream handling with zero overhead.
Flutter

Flutter & Dart

Dio / HTTP Packages
Custom stream wrappers, boilerplated JSON converters, multi-step state management overhead.
EtherFlow Advantage
Out-of-the-box non-blocking JSON codec integration & lightweight reactive client streams.

See the Startup Speed

Experience the difference between heavy framework startup scans and EtherFlow's instant boot.

bash — server-benchmark
Time: 0.00s

Select a simulation above to start booting the servers...

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.

01
Add Dependency
Add EtherFlow to your build file
build.gradle.kts
// 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
02
Build & Run
Compile and launch your project
bash
// 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