Sirius is a lightweight, expressive, and fast HTTP & WebSocket backend framework built entirely with Dart. Designed for simplicity, performance, and developer productivity, it provides powerful routing, middleware, and request validation features for building modern backend APIs.
- Simple and chainable routing (GET, POST, PUT, PATCH, DELETE)
- Grouped route management
- Middleware support (before & after)
- WebSocket integration
- Powerful and extensible request validation
- Nested object and list validation support
- Easy-to-use request & response handling
- Built with
dart:io
for performance
Add this to your pubspec.yaml
:
dependencies:
sirius_backend: ^1.0.17
Then run:
dart pub get
import 'package:sirius_backend/sirius_backend.dart';
void main() async {
final sirius = Sirius();
sirius.get('/hello', (req) async {
return Response.send({'message': 'Hello from Sirius!'});
});
await sirius.start(port: 3000);
}
sirius.get('/users', getUsersHandler);
sirius.post('/users', createUserHandler);
sirius.put('/users/:id', updateUserHandler);
sirius.delete('/users/:id', deleteUserHandler);
sirius.group('/api', (group) {
group.get('/status', (req) async => Response.send({'ok': true}));
});
sirius.useBefore(AuthMiddleware());
sirius.useAfter(LoggerMiddleware());
sirius.get('/secure',
(req) async => Response.send('Authorized'),
useBefore: [AuthMiddleware()]
);
class AuthMiddleware extends Middleware {
@override
Future<Response> handle(Request request) async {
final token = request.headerValue('authorization');
if (token == 'valid-token') {
request.passData = {'userId': 123};
return Response.next();
}
return Response.send({'error': 'Unauthorized'}, status: 401);
}
}
final id = request.pathVariable('id');
final name = request.jsonValue('name');
final headers = request.headers;
final method = request.method;
final userData = request.receiveData; // from middleware
final validator = Validator(request.getAllFields(), {
'name': ValidationRules(required: required(message: "Name is required")),
'age': ValidationRules(minNumber: minNumber(18)),
});
if (!validator.validate()) {
return Response.send(validator.getAllErrors, status: 400);
}
'address': ValidationRules(
dataType: dataType(DataTypes.MAP),
childMap: {
'street': ValidationRules(required: required()),
'zip': ValidationRules(minLength: minLength(5)),
},
)
'items': ValidationRules(
dataType: dataType(DataTypes.LIST),
childList: [
ValidationRules(required: required(message: "Item name is required")),
],
)
sirius.webSocket('/chat', (socket) {
socket.listen((msg) {
socket.add('Echo: $msg');
});
});
return Response.send({"message": "Success"});
return Response.send({"error": "Unauthorized"}, status: 401);
return Response.next(); // used inside middleware
You can define reusable validation rules like:
ValidationRules(
required: required(),
dataType: dataType(DataTypes.STRING),
minLength: minLength(3),
maxLength: maxLength(50),
inList: inList(["admin", "user"]),
)
- Sirius is built using Dart's native
dart:io
server. - Intended for REST APIs, internal tools, and WebSocket-based microservices.
- Fully typed, with customizable validation and extensible middleware patterns.
MIT License. Feel free to use and modify.