A zero-dependency PHP 8.3+ framework. Under 240KB. No Composer. It doesn't use Regex. It just works.
use Aether\Kernel\Application;
$app = Application::create(__DIR__);
$app->get('/users/{id}', 'UserController@show');
$app->run();
No abstractions on top of abstractions. Just raw PHP 8.3.
Regex routers are lazy. We use a compressed prefix tree. O(K) lookup. No regex anywhere.
DB queries and HTTP requests automatically suspend the fiber. No callback hell. It just handles concurrent requests on one thread.
Reflection at runtime is slow. We compile your attributes down to static factory functions before deploying.
If you put request state in a persistent service, you leak data. The container forces scope separation so you don't mess it up.
It boots once. It handles thousands of requests without re-initializing. Recycle it when your code inevitably leaks memory.
Cross-process cache without hitting the disk. Because reading files on every request is dumb.
No YAML. No XML. No parsing docblocks like it's 2012. Native PHP 8 attributes only.
No Composer. Period. I don't need to download 30MB of node_modules... wait, wrong language. Still banned.
Stop writing 40 lines of XML to register a controller.
<?php
declare(strict_types: 1);
namespace App\Controllers;
use Aether\Attributes\Controller;
use Aether\Attributes\Get;
use Aether\Http\Request;
use Aether\Http\Response;
#[Controller(prefix: '/api')]
final class UserController
{
#[Get(path: '/users/{id}', name: 'users.show')]
public function show(Request $request): Response
{
$id = $request->getRouteParam('id');
return Response::json([
'user' => ['id' => $id],
]);
}
}
// Manual route registration
$app->get('/users', 'UserController@index');
$app->get('/users/{id}', 'UserController@show');
$app->post('/users', 'UserController@store');
// Route groups with shared prefix and middleware
$app->group('/api/v1', function ($router) {
$router->get('/tasks', 'TaskController@index');
$router->post('/tasks', 'TaskController@create');
}, middleware: ['AuthMiddleware']);
// Wildcard catch-all
$app->get('/files/{path*}', 'FileController@serve');
final class TimingMiddleware implements MiddlewareInterface
{
public function handle(
Request $request,
callable $next,
): Response {
$start = hrtime(true);
$response = $next($request);
$ms = (hrtime(true) - $start) / 1_000_000;
return $response
->withHeader('X-Response-Time', $ms . 'ms');
}
}
// Fiber-aware database query
// Suspends the current fiber during I/O
$users = $db->query(
'SELECT * FROM users WHERE active = ?',
[1],
);
// Fiber-aware HTTP client
$response = $http->get('https://api.example.com/data');
// Non-blocking JSON POST
$result = $http->postJson(
'https://api.example.com/webhook',
['event' => 'user.created'],
);
No marketing fluff. Just technical trade-offs.
| Framework | Language | Architecture | Pros | Cons |
|---|---|---|---|---|
| AETHER | PHP 8.3+ | Resident / AOT | Sub-0.1ms boot, zero deps, O(K) routing, low RAM. | Tiny ecosystem, high entry bar for beginners. |
| Laravel | PHP | Req / Resp | Massive ecosystem, best-in-class DX, huge community. | Heavy bloat, slow startup, reflection-heavy. |
| Fastify | JS / TS | Event Loop | Low overhead, JSON-first, high throughput. | Dependency heavy, single-threaded bottlenecks. |
| Go (Fiber) | Go | Binary | Compiled speed, extreme concurrency, type-safe. | Pointer complexity, verbose error handling. |
| Rust (Axum) | Rust | Binary | Memory safety, fastest possible throughput. | Brutal learning curve, long compile times. |
| Spring Boot | Java | JVM | Enterprise stability, infinite features. | Huge memory usage (500MB+ idle), slow boot. |
* Comparison based on standard "Hello World" to "Small Microservice" benchmarks. Results vary by workload.
Four modules. One job each.
Persistent workers, state-safe DI, shmop cache, signal handling
Compiled prefix tree, O(K) matching, zero regex, AOT serialization
Event loop scheduler, async DB, async HTTP, non-blocking sockets
PHP 8 Attributes, AOT hydrators, static factory generation
Just clone it. It's not hard.
# Clone the framework
git clone https://github.com/kisalnelaka/aether.git myapp
cd myapp
# Start the development server
php -S localhost:8080 example/app.php
# Compile routes and hydrators for production
php bin/aether aot:compile
If you open an issue without reading these, I'm closing it.
System design, module breakdown, memory model
Radix tree, dynamic params, wildcards, groups
Service scopes, bindings, AOT hydrators
Async I/O, scheduler, database, HTTP client
Attribute scanning, compilation, output formats
All commands with usage examples
Build a complete REST API step by step
Code standards, submission process