Read this in English or Português (BR).
Horse keeps a small core. Almost everything you'd associate with a "web framework" — JSON parsing, CORS, JWT, compression, logging — lives in separate, opt-in middleware packages. This page catalogues the official ones (maintained by HashLoad) and the community list.
For how middleware actually works, see Middleware.
For a more maintainable ecosystem, the official middleware lives in separate repositories rather than the Horse core. Install with Boss:
boss install <repo>| Middleware | What it does | Delphi | Lazarus |
|---|---|---|---|
| horse/jhonson | Parses JSON request bodies, serialises JSON responses | ✔️ | ✔️ |
| horse/basic-auth | HTTP Basic authentication | ✔️ | ✔️ |
| horse/cors | Cross-Origin Resource Sharing headers + preflight | ✔️ | ✔️ |
| horse/stream | application/octet-stream body handling |
✔️ | ✔️ |
| horse/jwt | JSON Web Token authentication | ✔️ | ✔️ |
| horse/exception | Convert raised exceptions to consistent JSON error responses | ✔️ | ✔️ |
| horse/logger | Per-request access log | ✔️ | ✔️ |
| horse/compression | gzip / deflate response compression | ✔️ | ✔️ |
uses
Horse,
Horse.Jhonson,
Horse.CORS,
Horse.HandleException,
Horse.Logger,
Horse.JWT;
begin
THorse
.Use(Horse.HandleException.New) // outermost — turn errors into clean responses
.Use(Horse.Logger.New) // log every request
.Use(CORS) // CORS headers + OPTIONS preflight
.Use(Jhonson) // parse JSON bodies
.Use(JWT('secret')); // require a valid token (innermost)
// routes …
THorse.Listen(9000);
end.Registration order matters — see Middleware.
These are not maintained by HashLoad but are listed here because they're commonly used. The list grows over time — open a PR against this doc if yours should be here.
| Middleware | Description | Delphi | Lazarus |
|---|---|---|---|
| bittencourtthulio/etag | ETag generation | ✔️ | ✔️ |
| bittencourtthulio/paginate | List response pagination | ✔️ | ✔️ |
| bittencourtthulio/cachecontrol | Cache-Control response headers | ✔️ | ❌ |
| gabrielbaltazar/gbswagger | Swagger / OpenAPI generation | ✔️ | ❌ |
| willhubner/socketIO | Socket.IO server | ✔️ | ❌ |
| dliocode/ratelimit | Rate limiting | ✔️ | ❌ |
| dliocode/slowdown | Progressive request delay | ✔️ | ❌ |
| giorgiobazzo/upload | File upload helpers | ✔️ | ❌ |
| dliocode/query | Query-string DSL helpers | ✔️ | ❌ |
| CarlosHe/healthcheck | /healthz endpoint |
✔️ | ❌ |
| CarlosHe/staticfiles | Static file serving | ✔️ | ❌ |
| CachopaWeb/horse-server-static | Static file serving (alternative) | ✔️ | ✔️ |
| arvanus/horse-exception-logger | Exception logging | ✔️ | ✔️ |
| claudneysessa/Horse-CSResponsePagination | Response pagination | ✔️ | ❌ |
| claudneysessa/Horse-XSuperObjects | XSuperObject integration | ✔️ | ❌ |
| andre-djsystem/horse-bearer-auth | Bearer-token authentication | ✔️ | ✔️ |
| andre-djsystem/horse-manipulate-request | Request mutation helpers | ✔️ | ✔️ |
| andre-djsystem/horse-manipulate-response | Response mutation helpers | ✔️ | ✔️ |
| antoniojmsjr/Horse-IPGeoLocation | IP geolocation lookup | ✔️ | ❌ |
| antoniojmsjr/Horse-XMLDoc | XML documentation generation | ✔️ | ❌ |
| isaquepinheiro/horse-jsonbr | JSON helpers | ✔️ | ❌ |
| IagooCesaar/Horse-JsonInterceptor | JSON request/response interceptor | ✔️ | ❌ |
| dliocode/horse-datalogger | Structured data logger | ✔️ | ❌ |
| weslleycapelari/horse-documentation | Auto-generated API docs | ✔️ | ❌ |
| weslleycapelari/horse-validator | Request payload validation | ✔️ | ❌ |
| regyssilveira/horse-rate-limit | Rate limiting control with support for multiple backends and storages | ✔️ | ✔️ |
| regyssilveira/horse-compression-v2 | High-performance response compression with Gzip, Deflate, and Brotli support | ✔️ | ✔️ |
| regyssilveira/horse-static | High-performance static file serving with Range, Cache, and SPA Fallback support | ✔️ | ✔️ |
| regyssilveira/horse-dto | Auto-binding and declarative validation middleware | ✔️ | ✔️ |
| regyssilveira/horse-rbac | Role-Based Access Control (RBAC) and scopes middleware | ✔️ | ✔️ |
| regyssilveira/horse-schema-validation | Request payload schema validation middleware | ✔️ | ✔️ |
| regyssilveira/horse-multipart | Multipart/form-data request body parser middleware | ✔️ | ✔️ |
| regyssilveira/horse-helmet | Security headers middleware for HTTP response protection | ✔️ | ✔️ |
| regyssilveira/horse-ssl-redirect | Redirection of insecure HTTP requests to HTTPS with proxy and localhost bypass support | ✔️ | ✔️ |
| regyssilveira/horse-crud | Automatic and dynamic CRUD routes generation middleware for Horse framework from decorated entities | ✔️ | ✔️ |
| regyssilveira/horse-request-id | Request ID (Correlation ID) generation and tracking middleware for the Horse framework ecosystem | ✔️ | ✔️ |
| regyssilveira/horse-sanitize | Middleware to sanitize request parameters from the Horse ecosystem against XSS and harmful injections | ✔️ | ✔️ |
These are middlewares focused on application observability, metrics, and tracing:
| Middleware | Description | Delphi | Lazarus |
|---|---|---|---|
| marcobreveglieri/horse-prometheus-metrics | Prometheus metrics endpoint | ✔️ | ❌ |
| regyssilveira/horse-opentelemetry | OpenTelemetry integration for distributed tracing | ✔️ | ✔️ |
| regyssilveira/horse-prometheus | Prometheus integration for metrics collection | ✔️ | ✔️ |
Beyond middleware, the community has produced alternative transport Providers — the layer Horse uses to own the socket and parse HTTP. This is a separate axis from the middleware list above (see Providers & Application types for the full conceptual model). The actively maintained third-party Providers are:
| Provider | Description | License | Repository |
|---|---|---|---|
| horse-provider-crosssocket | Async IOCP / epoll / kqueue transport. Replaces the default Indy Provider with Delphi-Cross-Socket. Installation is manual (mirrors mORMot2): clone winddriver/Delphi-Cross-Socket + cnpack/cnvcl and add search paths. Supported alternative for mTLS users or single-dependency convenience: freitasjca/Delphi-Cross-Socket v1.0.3 (bundles CnPack + mTLS APIs). Targets high-concurrency deployments. Activated by HORSE_PROVIDER_CROSSSOCKET. Requires Delphi 10.2+ / FPC 3.2+. Baseline test score: 80 passed / 1 failed (the documented Set-Cookie multi-value Horse-core limitation). |
MIT | freitasjca/horse-provider-crosssocket |
| horse-provider-mormot | Async IOCP / epoll transport. Replaces the default Indy Provider with mORMot2's THttpServer — pure Pascal, no compiled C deps for standard HTTP. Optional swap to THttpApiServer for Windows kernel-mode http.sys. Activated by HORSE_PROVIDER_MORMOT. Compatible with Delphi 7 through 12.3 Athens and FPC 3.2+. Ships cross-product convenience units for Console, VCL, Daemon (Windows TService + POSIX runner), Lazarus LCL, and FPC HTTPApplication. |
MIT | freitasjca/horse-provider-mormot |
Both Providers use the same hybrid-interface architecture (IHorseRawRequest / IHorseRawResponse), so every Horse middleware works unchanged under either. The two Provider defines are mutually exclusive — exactly one transport per build.
See Providers & Application types for when to switch off the default Indy transport, the compatibility matrix vs. each Application type, and how to combine the two choices.
- Publish your package with a Boss-compatible
boss.json. - Open a PR against
doc/middleware-ecosystem.mdadding a row in the appropriate table. - Confirm it compiles on the matrix you're claiming (Delphi / Lazarus).
There's no exclusivity — anyone can publish a Horse-compatible package without coordination.
- Middleware — the model, how to write your own, registration order.
- Providers — middleware works across all transports; this is why.