Appreciation post for Laravel
In my 9-5 I am a .NET / React developer. I run a small side gig building web apps for smaller clients where my primary tech stack is Laravel with React + Inertia.
My developer experience coming from ASP.NET to Laravel is immeasurably better. What would take multiple dev teams in a corporate environment months to build in .NET, I can build in a week or just a few days in Laravel.
Need a message queue? It’s in the box.
Need real-time communication with your frontend? In the box.
Don’t want to duplicate your validation rules in your frontend and backend? Laravel has it.
Need an events system, mail service, notifications pattern? Just read the docs.
I love Laravel because they champion what’s new and innovative in the open source community. The documentation is outstanding, the community has tons of resources and is generally focused on making the framework as powerful as possible for us.
I hope adoption at the enterprise & startup levels increases, because this framework is doing so much more than the others.
https://redd.it/1prdyb0
@r_php
In my 9-5 I am a .NET / React developer. I run a small side gig building web apps for smaller clients where my primary tech stack is Laravel with React + Inertia.
My developer experience coming from ASP.NET to Laravel is immeasurably better. What would take multiple dev teams in a corporate environment months to build in .NET, I can build in a week or just a few days in Laravel.
Need a message queue? It’s in the box.
Need real-time communication with your frontend? In the box.
Don’t want to duplicate your validation rules in your frontend and backend? Laravel has it.
Need an events system, mail service, notifications pattern? Just read the docs.
I love Laravel because they champion what’s new and innovative in the open source community. The documentation is outstanding, the community has tons of resources and is generally focused on making the framework as powerful as possible for us.
I hope adoption at the enterprise & startup levels increases, because this framework is doing so much more than the others.
https://redd.it/1prdyb0
@r_php
Reddit
From the laravel community on Reddit
Explore this post and more from the laravel community
Hunting down exploited sites in shared hosting for not-for-profit association
I'm trying my best to figure out the ways of cleaning out different kinds of webshells and what not that seem to be dropped though exploited Wordpress plugins or just some other PHP software that has an RCE.
Cannot really keep people from running out-of-date software without a huge toll on keeping signatures in check, so what's the best way to do this? We seem to get frequent abuse reports about someone attacking 3rd party wordpress sites though our network (which trace back to the servers running our shared webhosting and PHP)
I was thinking of auditd, but not sure if that's a good way as we have thousands of users which not everyone is running PHP, but all sites are configured for it. Is hooking specific parts of like connect/open_file_contents or something of those lines a good approach? I have a strong feeling that may break a lot of things.
Some information on the environment:
\- grsecurity
\- Custom kernel patch that prevents normal users from accessing other user's files, no matter the UNIX permissions
\- Apache with PHP-FPM and each shared hosting user has their own pool per PHP version (3 major versions are usually supported but only one is active for each vhost)
https://redd.it/1projdo
@r_php
I'm trying my best to figure out the ways of cleaning out different kinds of webshells and what not that seem to be dropped though exploited Wordpress plugins or just some other PHP software that has an RCE.
Cannot really keep people from running out-of-date software without a huge toll on keeping signatures in check, so what's the best way to do this? We seem to get frequent abuse reports about someone attacking 3rd party wordpress sites though our network (which trace back to the servers running our shared webhosting and PHP)
I was thinking of auditd, but not sure if that's a good way as we have thousands of users which not everyone is running PHP, but all sites are configured for it. Is hooking specific parts of like connect/open_file_contents or something of those lines a good approach? I have a strong feeling that may break a lot of things.
Some information on the environment:
\- grsecurity
\- Custom kernel patch that prevents normal users from accessing other user's files, no matter the UNIX permissions
\- Apache with PHP-FPM and each shared hosting user has their own pool per PHP version (3 major versions are usually supported but only one is active for each vhost)
https://redd.it/1projdo
@r_php
Reddit
From the PHP community on Reddit
Explore this post and more from the PHP community
Is there more to php than web dev?
That's basically my question, can you use php anywhere else other than in web development? If so, can someone share these other fields
https://redd.it/1ps0dpe
@r_php
That's basically my question, can you use php anywhere else other than in web development? If so, can someone share these other fields
https://redd.it/1ps0dpe
@r_php
Reddit
From the PHP community on Reddit
Explore this post and more from the PHP community
I built a simple inventory system in Laravel – feedback welcome
I built a simple Laravel inventory system for small businesses.
Looking for feedback from developers.
Check it from here
https://redd.it/1ps264g
@r_php
I built a simple Laravel inventory system for small businesses.
Looking for feedback from developers.
Check it from here
https://redd.it/1ps264g
@r_php
Codester
StockPilot - Simple Inventory Management System
StockPilot - Simple Inventory Management System. A simple and efficient inventory management system with product, customer, supplier, sales, purchases, and stock tracking features
A Week of Symfony #990 (December 15–21, 2025)
https://symfony.com/blog/a-week-of-symfony-990-december-15-21-2025?utm_medium=feed&utm_source=Symfony%20Blog%20Feed
https://redd.it/1ps2yyq
@r_php
https://symfony.com/blog/a-week-of-symfony-990-december-15-21-2025?utm_medium=feed&utm_source=Symfony%20Blog%20Feed
https://redd.it/1ps2yyq
@r_php
Symfony
A Week of Symfony #990 (December 15–21, 2025) (Symfony Blog)
This week, we published an article about how we controlled 1,200 screens in real time with Symfony during SymfonyCon Amsterdam 2025. We also celebrated a new SymfonyCasts course on building Symfony bu…
Supercharging Laravel CI/CD Pipeline: From 9 Minutes to 2 Minutes with Pre-built MySQL Images and Parallel Testing
https://medium.com/@oguzhankrcb/supercharging-laravel-ci-cd-pipeline-from-9-minutes-to-2-minutes-with-pre-built-mysql-images-and-16a16e073a42
https://redd.it/1ps6jwt
@r_php
https://medium.com/@oguzhankrcb/supercharging-laravel-ci-cd-pipeline-from-9-minutes-to-2-minutes-with-pre-built-mysql-images-and-16a16e073a42
https://redd.it/1ps6jwt
@r_php
Medium
Supercharging Laravel CI/CD Pipeline: From 9 Minutes to 2 Minutes with Pre-built MySQL Images and Parallel Testing
When your test suite grows to hundreds of tests, CI/CD pipeline performance becomes critical. In this article, I’ll walk you through how I…
Supercharging Laravel CI/CD Pipeline: From 9 Minutes to 2 Minutes with Pre-built MySQL Images and Parallel Testing
https://medium.com/@oguzhankrcb/supercharging-laravel-ci-cd-pipeline-from-9-minutes-to-2-minutes-with-pre-built-mysql-images-and-16a16e073a42
https://redd.it/1ps6kco
@r_php
https://medium.com/@oguzhankrcb/supercharging-laravel-ci-cd-pipeline-from-9-minutes-to-2-minutes-with-pre-built-mysql-images-and-16a16e073a42
https://redd.it/1ps6kco
@r_php
Medium
Supercharging Laravel CI/CD Pipeline: From 9 Minutes to 2 Minutes with Pre-built MySQL Images and Parallel Testing
When your test suite grows to hundreds of tests, CI/CD pipeline performance becomes critical. In this article, I’ll walk you through how I…
Would a pure php template engine be useful?
Lately I'm thinking about a template engine that just wraps html in classes, so you would write
making it would be as simple as
I see some cool features: auto complete for html tags and parameters, template is testable, would be easy to create for example a Product class that extends or wraps Div and can be reused, should be easy to cache as everything is stringable.
The drawbacks I see are that could be not super easy to read and you need some architectural knowledge to not create a super huge class or countless not-easy-to-find sparse mini templates. Probably a tool to translate from html to this would be useful. also, I don't know how it would scale with speed and memory, as you will have several classes nested into each other.
What do you think? Would it be useful or just a waste of time?
https://redd.it/1ps9837
@r_php
Lately I'm thinking about a template engine that just wraps html in classes, so you would write
(new Html(lang: 'en'))(
(new Head())(...),
(new Body(class: 'xxx', data: ['xxx':'yyy'])( ...))
)
making it would be as simple as
class Html implements \Stringable {
public $lang;
public function __construct(public Head $head, public Body $body) {}
public function __toString {
return "<html lang=\"{$this->lang}\">{$this->head}{$this->body}<html>";
}
}
I see some cool features: auto complete for html tags and parameters, template is testable, would be easy to create for example a Product class that extends or wraps Div and can be reused, should be easy to cache as everything is stringable.
The drawbacks I see are that could be not super easy to read and you need some architectural knowledge to not create a super huge class or countless not-easy-to-find sparse mini templates. Probably a tool to translate from html to this would be useful. also, I don't know how it would scale with speed and memory, as you will have several classes nested into each other.
What do you think? Would it be useful or just a waste of time?
https://redd.it/1ps9837
@r_php
Reddit
From the PHP community on Reddit
Explore this post and more from the PHP community
Weekly /r/Laravel Help Thread
Ask your Laravel help questions here. To improve your chances of getting an answer from the community, here are some tips:
What steps have you taken so far?
What have you tried from the documentation?
Did you provide any error messages you are getting?
Are you able to provide instructions to replicate the issue?
Did you provide a code example?
Please don't post a screenshot of your code. Use the code block in the Reddit text editor and ensure it's formatted correctly.
For more immediate support, you can ask in the official Laravel Discord.
Thanks and welcome to the r/Laravel community!
https://redd.it/1pscozl
@r_php
Ask your Laravel help questions here. To improve your chances of getting an answer from the community, here are some tips:
What steps have you taken so far?
What have you tried from the documentation?
Did you provide any error messages you are getting?
Are you able to provide instructions to replicate the issue?
Did you provide a code example?
Please don't post a screenshot of your code. Use the code block in the Reddit text editor and ensure it's formatted correctly.
For more immediate support, you can ask in the official Laravel Discord.
Thanks and welcome to the r/Laravel community!
https://redd.it/1pscozl
@r_php
Laravel
Installation - Laravel 12.x - The PHP Framework For Web Artisans
Laravel is a PHP web application framework with expressive, elegant syntax. We’ve already laid the foundation — freeing you to create without sweating the small things.
A guide on dockerizing a Laravel + Inertia (React) app
Hey everyone!
I wrote a guide on dockerizing a Laravel + Inertia (React) application, it covers local development with Docker Compose, handling permissions and queues properly, multi-stage builds for a production image, testing the production image locally, and using Docker Compose with prebuilt images for deployment.
Feedback is welcome, hope you guys find it useful!
Link : https://aabidk.dev/blog/dockerizing-a-laravel-and-inertia-app/
https://redd.it/1psds71
@r_php
Hey everyone!
I wrote a guide on dockerizing a Laravel + Inertia (React) application, it covers local development with Docker Compose, handling permissions and queues properly, multi-stage builds for a production image, testing the production image locally, and using Docker Compose with prebuilt images for deployment.
Feedback is welcome, hope you guys find it useful!
Link : https://aabidk.dev/blog/dockerizing-a-laravel-and-inertia-app/
https://redd.it/1psds71
@r_php
aabidk.dev
Dockerizing a Laravel and Inertia App
Containerizing a Laravel, React and Inertia.js application for development and production environments.
Fixing “Malformed UTF-8 characters” in Laravel
https://hansvl.nl/blog/2025-12-10-fixing-malformed-utf-8-characters-exceptions-in-laravel/
https://redd.it/1psdtdh
@r_php
https://hansvl.nl/blog/2025-12-10-fixing-malformed-utf-8-characters-exceptions-in-laravel/
https://redd.it/1psdtdh
@r_php
Hans
Fixing “Malformed UTF-8 characters” in Laravel
Malformed UTF-8 characters, possibly incorrectly encoded
If you have ever seen this exception, chances are that you are saving byte strings to the database using a package like laravel-model-uuid.
A byte string is arbitrary byte data formatted as a string;…
If you have ever seen this exception, chances are that you are saving byte strings to the database using a package like laravel-model-uuid.
A byte string is arbitrary byte data formatted as a string;…
How We Built Laravel Wrapped
https://laravel.com/blog/how-we-built-laravel-wrapped
https://redd.it/1psjinu
@r_php
https://laravel.com/blog/how-we-built-laravel-wrapped
https://redd.it/1psjinu
@r_php
Laravel
How We Built Laravel Wrapped - Laravel - The PHP Framework For Web Artisans
Learn how Laravel's team built Laravel Wrapped in two weeks: aggregating data across products, generating 55K AI summaries, and shipping with Cloud's speed.
I work for a small to medium sized Japanese company and all our products use Laravel. However, I noticed something with the coding styles of my coworkers and want to ask if this is normal in other teams and companies. It's about coding style in a Laravel project.
You see, my coworkers never use collections at all. I want to emphasize the word "never." I understand not everything, collections and its functions should be used, but having researched about Laravel, it has felt weird for me that my coworkers never use it in any situation. My coworkers almost always use query builder and in every query they write regardless if it's eloquent or query builder, always call toArray() function after calling get(), and exclusively use arrays and array functions together with foreach loops.
Meanwhile, I've come across the Laravel Way and started using Eloquent and collections and its functions. I still use arrays and query builder but only in what I believe to be necessary situations.
Is this raw PHP style of coding in Laravel prevalent? Would you consider this irrelevant since it's all preference at the end of the day or is it wrong coding style when using Laravel?
https://redd.it/1pskj9x
@r_php
You see, my coworkers never use collections at all. I want to emphasize the word "never." I understand not everything, collections and its functions should be used, but having researched about Laravel, it has felt weird for me that my coworkers never use it in any situation. My coworkers almost always use query builder and in every query they write regardless if it's eloquent or query builder, always call toArray() function after calling get(), and exclusively use arrays and array functions together with foreach loops.
Meanwhile, I've come across the Laravel Way and started using Eloquent and collections and its functions. I still use arrays and query builder but only in what I believe to be necessary situations.
Is this raw PHP style of coding in Laravel prevalent? Would you consider this irrelevant since it's all preference at the end of the day or is it wrong coding style when using Laravel?
https://redd.it/1pskj9x
@r_php
Reddit
From the laravel community on Reddit
Explore this post and more from the laravel community
Weekly Ask Anything Thread
Feel free to ask any questions you think may not warrant a post. Asking for help here is also fine.
https://redd.it/1psq6cx
@r_php
Feel free to ask any questions you think may not warrant a post. Asking for help here is also fine.
https://redd.it/1psq6cx
@r_php
Reddit
From the symfony community on Reddit
Explore this post and more from the symfony community
Help! React CV layout breaks when exporting to PDF (Tried html2canvas and dompdf)
Hi everyone,
I’m building a CV generator in React. The UI looks perfect on the frontend, but I’m struggling to export it to PDF.
I first tried html2canvas (with jsPDF), but the quality was blurry and the scaling was off. Then I tried dompdf on the backend, but it doesn't support modern CSS (Flexbox/Grid), so the layout completely falls apart.
Does anyone have a proven way to get a "What You See Is What You Get" (WYSIWYG) PDF export from a React component? I need it to respect my exact CSS. Thanks!
https://redd.it/1pst80w
@r_php
Hi everyone,
I’m building a CV generator in React. The UI looks perfect on the frontend, but I’m struggling to export it to PDF.
I first tried html2canvas (with jsPDF), but the quality was blurry and the scaling was off. Then I tried dompdf on the backend, but it doesn't support modern CSS (Flexbox/Grid), so the layout completely falls apart.
Does anyone have a proven way to get a "What You See Is What You Get" (WYSIWYG) PDF export from a React component? I need it to respect my exact CSS. Thanks!
https://redd.it/1pst80w
@r_php
Reddit
From the PHP community on Reddit
Explore this post and more from the PHP community
Weekly help thread
Hey there!
This subreddit isn't meant for help threads, though there's one exception to the rule: in this thread you can ask anything you want PHP related, someone will probably be able to help you out!
https://redd.it/1pst3z3
@r_php
Hey there!
This subreddit isn't meant for help threads, though there's one exception to the rule: in this thread you can ask anything you want PHP related, someone will probably be able to help you out!
https://redd.it/1pst3z3
@r_php
Reddit
From the PHP community on Reddit
Explore this post and more from the PHP community
Spikard v0.5.0 Released
Hi peeps,
I'm glad to announce that [Spikard](https://github.com/Goldziher/spikard) v0.5.0 has been released. This is the first version I consider fully functional across all supported languages.
## What is Spikard?
Spikard is a *polyglot web toolkit* written in Rust and available for multiple languages:
- Rust
- Python (3.10+)
- TypeScript (Node/Bun)
- TypeScript (WASM - Deno/Edge)
- PHP (8.2+)
- Ruby (3.4+)
## Why Spikard?
I had a few reasons for building this:
I am the original author of [Litestar](https://litestar.dev/) (no longer involved after v2), and I have a thing for web frameworks. Following the work done by [Robyn](https://github.com/sparckles/Robyn) to create a Python framework with a Rust runtime (Actix in their case), I always wanted to experiment with that idea.
I am also the author of [html-to-markdown](https://github.com/Goldziher/html-to-markdown). When I rewrote it in Rust, I created bindings for multiple languages from a single codebase. That opened the door to a genuinely polyglot web stack.
Finally, there is the actual pain point. I work in multiple languages across different client projects. In Python I use Litestar, Sanic, FastAPI, Django, Flask, etc. In TypeScript I use Express, Fastify, and NestJS. In Go I use Gin, Fiber, and Echo. Each framework has pros and cons (and some are mostly cons). It would be better to have one standard toolkit that is correct (standards/IETF-aligned), robust, and fast across languages.
That is what Spikard aims to be.
## Why "Toolkit"?
The end goal is a toolkit, not just an HTTP framework. Today, Spikard exposes an HTTP framework built on [axum](https://github.com/tokio-rs/axum) and the Tokio + Tower ecosystems in Rust, which provides:
1. An extremely high-performance core that is robust and battle-tested
2. A wide and deep ecosystem of extensions and middleware
This currently covers HTTP use cases (REST, JSON-RPC, WebSockets) plus OpenAPI, AsyncAPI, and OpenRPC code generation.
The next step is to cover queues and task managers (RabbitMQ, Kafka, NATS) and CloudEvents interoperability, aiming for a full toolkit. A key inspiration here is [Watermill](https://watermill.io/) in Go.
## Current Features and Capabilities
- REST with typed routing (e.g. `/users/{id:uuid}`)
- JSON-RPC 2.0 over HTTP and WebSocket
- HTTP/1.1 and HTTP/2
- Streaming responses, SSE, and WebSockets
- Multipart file uploads, URL-encoded and JSON bodies
- Tower-HTTP middleware stack (compression, rate limiting, timeouts, request IDs, CORS, auth, static files)
- JSON Schema validation (Draft 2020-12) with structured error payloads (RFC 9457)
- Lifecycle hooks (`onRequest`, `preValidation`, `preHandler`, `onResponse`, `onError`)
- Dependency injection across bindings
- Codegen: OpenAPI 3.1, AsyncAPI 2.x/3.x, OpenRPC 1.3.2
- Fixture-driven E2E tests across all bindings (400+ scenarios)
- Benchmark + profiling harness in CI
Language-specific validation integrations:
- Python: msgspec (required), with optional detection of Pydantic v2, attrs, dataclasses
- TypeScript: Zod
- Ruby: dry-schema / dry-struct detection when present
- PHP: native validation with PSR-7 interfaces
- Rust: serde + schemars
## Roadmap to v1.0.0
**Core:**
- Protobuf + protoc integration
- GraphQL (queries, mutations, subnoscriptions)
- Plugin/extension system
**DX:**
- MCP server and AI tooling integration
- Expanded documentation site and example apps
**Post-1.0 targets:**
- HTTP/3 (QUIC)
- CloudEvents support
- Queue protocols (AMQP, Kafka, etc.)
## Benchmarks
We run continuous benchmarks + profiling in CI. Everything is measured on GitHub-hosted machines across multiple iterations and normalized for relative comparison.
Latest comparative run (2025-12-20, Linux x86_64, AMD EPYC 7763 2c/4t, 50 concurrency, 10s, oha):
- spikard-rust: 55,755 avg RPS (1.00 ms avg latency)
- spikard-node: 24,283 avg RPS (2.22 ms avg latency)
- spikard-php: 20,176 avg RPS (2.66 ms avg latency)
- spikard-python: 11,902 avg RPS (4.41 ms avg latency)
- spikard-wasm: 10,658 avg RPS (5.70 ms avg latency)
-
Hi peeps,
I'm glad to announce that [Spikard](https://github.com/Goldziher/spikard) v0.5.0 has been released. This is the first version I consider fully functional across all supported languages.
## What is Spikard?
Spikard is a *polyglot web toolkit* written in Rust and available for multiple languages:
- Rust
- Python (3.10+)
- TypeScript (Node/Bun)
- TypeScript (WASM - Deno/Edge)
- PHP (8.2+)
- Ruby (3.4+)
## Why Spikard?
I had a few reasons for building this:
I am the original author of [Litestar](https://litestar.dev/) (no longer involved after v2), and I have a thing for web frameworks. Following the work done by [Robyn](https://github.com/sparckles/Robyn) to create a Python framework with a Rust runtime (Actix in their case), I always wanted to experiment with that idea.
I am also the author of [html-to-markdown](https://github.com/Goldziher/html-to-markdown). When I rewrote it in Rust, I created bindings for multiple languages from a single codebase. That opened the door to a genuinely polyglot web stack.
Finally, there is the actual pain point. I work in multiple languages across different client projects. In Python I use Litestar, Sanic, FastAPI, Django, Flask, etc. In TypeScript I use Express, Fastify, and NestJS. In Go I use Gin, Fiber, and Echo. Each framework has pros and cons (and some are mostly cons). It would be better to have one standard toolkit that is correct (standards/IETF-aligned), robust, and fast across languages.
That is what Spikard aims to be.
## Why "Toolkit"?
The end goal is a toolkit, not just an HTTP framework. Today, Spikard exposes an HTTP framework built on [axum](https://github.com/tokio-rs/axum) and the Tokio + Tower ecosystems in Rust, which provides:
1. An extremely high-performance core that is robust and battle-tested
2. A wide and deep ecosystem of extensions and middleware
This currently covers HTTP use cases (REST, JSON-RPC, WebSockets) plus OpenAPI, AsyncAPI, and OpenRPC code generation.
The next step is to cover queues and task managers (RabbitMQ, Kafka, NATS) and CloudEvents interoperability, aiming for a full toolkit. A key inspiration here is [Watermill](https://watermill.io/) in Go.
## Current Features and Capabilities
- REST with typed routing (e.g. `/users/{id:uuid}`)
- JSON-RPC 2.0 over HTTP and WebSocket
- HTTP/1.1 and HTTP/2
- Streaming responses, SSE, and WebSockets
- Multipart file uploads, URL-encoded and JSON bodies
- Tower-HTTP middleware stack (compression, rate limiting, timeouts, request IDs, CORS, auth, static files)
- JSON Schema validation (Draft 2020-12) with structured error payloads (RFC 9457)
- Lifecycle hooks (`onRequest`, `preValidation`, `preHandler`, `onResponse`, `onError`)
- Dependency injection across bindings
- Codegen: OpenAPI 3.1, AsyncAPI 2.x/3.x, OpenRPC 1.3.2
- Fixture-driven E2E tests across all bindings (400+ scenarios)
- Benchmark + profiling harness in CI
Language-specific validation integrations:
- Python: msgspec (required), with optional detection of Pydantic v2, attrs, dataclasses
- TypeScript: Zod
- Ruby: dry-schema / dry-struct detection when present
- PHP: native validation with PSR-7 interfaces
- Rust: serde + schemars
## Roadmap to v1.0.0
**Core:**
- Protobuf + protoc integration
- GraphQL (queries, mutations, subnoscriptions)
- Plugin/extension system
**DX:**
- MCP server and AI tooling integration
- Expanded documentation site and example apps
**Post-1.0 targets:**
- HTTP/3 (QUIC)
- CloudEvents support
- Queue protocols (AMQP, Kafka, etc.)
## Benchmarks
We run continuous benchmarks + profiling in CI. Everything is measured on GitHub-hosted machines across multiple iterations and normalized for relative comparison.
Latest comparative run (2025-12-20, Linux x86_64, AMD EPYC 7763 2c/4t, 50 concurrency, 10s, oha):
- spikard-rust: 55,755 avg RPS (1.00 ms avg latency)
- spikard-node: 24,283 avg RPS (2.22 ms avg latency)
- spikard-php: 20,176 avg RPS (2.66 ms avg latency)
- spikard-python: 11,902 avg RPS (4.41 ms avg latency)
- spikard-wasm: 10,658 avg RPS (5.70 ms avg latency)
-
GitHub
GitHub - Goldziher/spikard: Rust-powered, multi-language web toolkit with bindings for Python, Typenoscript, Ruby and PHP.
Rust-powered, multi-language web toolkit with bindings for Python, Typenoscript, Ruby and PHP. - Goldziher/spikard
spikard-ruby: 8,271 avg RPS (6.50 ms avg latency)
Full artifacts for that run are committed under `snapshots/benchmarks/20397054933` in the repo.
## Development Methodology
Spikard is, for the most part, "vibe coded." I am saying that openly. The tools used are Codex (OpenAI) and Claude Code (Anthropic). How do I keep quality high? By following an outside-in approach inspired by TDD.
The first major asset added was an extensive set of fixtures (JSON files that follow a schema I defined). These cover the range of HTTP framework behavior and were derived by inspecting the test suites of multiple frameworks and relevant IETF specs.
Then I built an E2E test generator that uses the fixtures to generate suites for each binding. That is the TDD layer.
On top of that, I follow BDD in the literal sense: Benchmark-Driven Development. There is a profiling + benchmarking harness that tracks regressions and guides optimization.
With those in place, the code evolved via ADRs (Architecture Decision Records) in `docs/adr`. The Rust core came first; bindings were added one by one as E2E tests passed. Features were layered on top of that foundation.
## Getting Involved
If you want to get involved, there are a few ways:
1. Join the [Kreuzberg Discord](https://discord.gg/wb8SEWvM)
2. Use Spikard and report issues, feature requests, or API feedback
3. Help spread the word (always helpful)
4. Contribute: refactors, improvements, tests, docs
https://redd.it/1psv4y8
@r_php
Full artifacts for that run are committed under `snapshots/benchmarks/20397054933` in the repo.
## Development Methodology
Spikard is, for the most part, "vibe coded." I am saying that openly. The tools used are Codex (OpenAI) and Claude Code (Anthropic). How do I keep quality high? By following an outside-in approach inspired by TDD.
The first major asset added was an extensive set of fixtures (JSON files that follow a schema I defined). These cover the range of HTTP framework behavior and were derived by inspecting the test suites of multiple frameworks and relevant IETF specs.
Then I built an E2E test generator that uses the fixtures to generate suites for each binding. That is the TDD layer.
On top of that, I follow BDD in the literal sense: Benchmark-Driven Development. There is a profiling + benchmarking harness that tracks regressions and guides optimization.
With those in place, the code evolved via ADRs (Architecture Decision Records) in `docs/adr`. The Rust core came first; bindings were added one by one as E2E tests passed. Features were layered on top of that foundation.
## Getting Involved
If you want to get involved, there are a few ways:
1. Join the [Kreuzberg Discord](https://discord.gg/wb8SEWvM)
2. Use Spikard and report issues, feature requests, or API feedback
3. Help spread the word (always helpful)
4. Contribute: refactors, improvements, tests, docs
https://redd.it/1psv4y8
@r_php
Discord
Join the Kreuzberg.dev Discord Server!
Kreuzberg started as an open-source project building a faster, more flexible Document Intelligence for RAG developers. Join us to share ideas and feedback, and learn from others in the community. | 61
Spikard v0.5.0 Released
Hi peeps,
I'm glad to announce that [Spikard](https://github.com/Goldziher/spikard) v0.5.0 has been released. This is the first version I consider fully functional across all supported languages.
## What is Spikard?
Spikard is a *polyglot web toolkit* written in Rust and available for multiple languages:
- Rust
- Python (3.10+)
- TypeScript (Node/Bun)
- TypeScript (WASM - Deno/Edge)
- PHP (8.2+)
- Ruby (3.4+)
## Why Spikard?
I had a few reasons for building this:
I am the original author of [Litestar](https://litestar.dev/) (no longer involved after v2), and I have a thing for web frameworks. Following the work done by [Robyn](https://github.com/sparckles/Robyn) to create a Python framework with a Rust runtime (Actix in their case), I always wanted to experiment with that idea.
I am also the author of [html-to-markdown](https://github.com/Goldziher/html-to-markdown). When I rewrote it in Rust, I created bindings for multiple languages from a single codebase. That opened the door to a genuinely polyglot web stack.
Finally, there is the actual pain point. I work in multiple languages across different client projects. In Python I use Litestar, Sanic, FastAPI, Django, Flask, etc. In TypeScript I use Express, Fastify, and NestJS. In Go I use Gin, Fiber, and Echo. Each framework has pros and cons (and some are mostly cons). It would be better to have one standard toolkit that is correct (standards/IETF-aligned), robust, and fast across languages.
That is what Spikard aims to be.
## Why "Toolkit"?
The end goal is a toolkit, not just an HTTP framework. Today, Spikard exposes an HTTP framework built on [axum](https://github.com/tokio-rs/axum) and the Tokio + Tower ecosystems in Rust, which provides:
1. An extremely high-performance core that is robust and battle-tested
2. A wide and deep ecosystem of extensions and middleware
This currently covers HTTP use cases (REST, JSON-RPC, WebSockets) plus OpenAPI, AsyncAPI, and OpenRPC code generation.
The next step is to cover queues and task managers (RabbitMQ, Kafka, NATS) and CloudEvents interoperability, aiming for a full toolkit. A key inspiration here is [Watermill](https://watermill.io/) in Go.
## Current Features and Capabilities
- REST with typed routing (e.g. `/users/{id:uuid}`)
- JSON-RPC 2.0 over HTTP and WebSocket
- HTTP/1.1 and HTTP/2
- Streaming responses, SSE, and WebSockets
- Multipart file uploads, URL-encoded and JSON bodies
- Tower-HTTP middleware stack (compression, rate limiting, timeouts, request IDs, CORS, auth, static files)
- JSON Schema validation (Draft 2020-12) with structured error payloads (RFC 9457)
- Lifecycle hooks (`onRequest`, `preValidation`, `preHandler`, `onResponse`, `onError`)
- Dependency injection across bindings
- Codegen: OpenAPI 3.1, AsyncAPI 2.x/3.x, OpenRPC 1.3.2
- Fixture-driven E2E tests across all bindings (400+ scenarios)
- Benchmark + profiling harness in CI
Language-specific validation integrations:
- Python: msgspec (required), with optional detection of Pydantic v2, attrs, dataclasses
- TypeScript: Zod
- Ruby: dry-schema / dry-struct detection when present
- PHP: native validation with PSR-7 interfaces
- Rust: serde + schemars
## Roadmap to v1.0.0
**Core:**
- Protobuf + protoc integration
- GraphQL (queries, mutations, subnoscriptions)
- Plugin/extension system
**DX:**
- MCP server and AI tooling integration
- Expanded documentation site and example apps
**Post-1.0 targets:**
- HTTP/3 (QUIC)
- CloudEvents support
- Queue protocols (AMQP, Kafka, etc.)
## Benchmarks
We run continuous benchmarks + profiling in CI. Everything is measured on GitHub-hosted machines across multiple iterations and normalized for relative comparison.
Latest comparative run (2025-12-20, Linux x86_64, AMD EPYC 7763 2c/4t, 50 concurrency, 10s, oha):
- spikard-rust: 55,755 avg RPS (1.00 ms avg latency)
- spikard-node: 24,283 avg RPS (2.22 ms avg latency)
- spikard-php: 20,176 avg RPS (2.66 ms avg latency)
- spikard-python: 11,902 avg RPS (4.41 ms avg latency)
- spikard-wasm: 10,658 avg RPS (5.70 ms avg latency)
-
Hi peeps,
I'm glad to announce that [Spikard](https://github.com/Goldziher/spikard) v0.5.0 has been released. This is the first version I consider fully functional across all supported languages.
## What is Spikard?
Spikard is a *polyglot web toolkit* written in Rust and available for multiple languages:
- Rust
- Python (3.10+)
- TypeScript (Node/Bun)
- TypeScript (WASM - Deno/Edge)
- PHP (8.2+)
- Ruby (3.4+)
## Why Spikard?
I had a few reasons for building this:
I am the original author of [Litestar](https://litestar.dev/) (no longer involved after v2), and I have a thing for web frameworks. Following the work done by [Robyn](https://github.com/sparckles/Robyn) to create a Python framework with a Rust runtime (Actix in their case), I always wanted to experiment with that idea.
I am also the author of [html-to-markdown](https://github.com/Goldziher/html-to-markdown). When I rewrote it in Rust, I created bindings for multiple languages from a single codebase. That opened the door to a genuinely polyglot web stack.
Finally, there is the actual pain point. I work in multiple languages across different client projects. In Python I use Litestar, Sanic, FastAPI, Django, Flask, etc. In TypeScript I use Express, Fastify, and NestJS. In Go I use Gin, Fiber, and Echo. Each framework has pros and cons (and some are mostly cons). It would be better to have one standard toolkit that is correct (standards/IETF-aligned), robust, and fast across languages.
That is what Spikard aims to be.
## Why "Toolkit"?
The end goal is a toolkit, not just an HTTP framework. Today, Spikard exposes an HTTP framework built on [axum](https://github.com/tokio-rs/axum) and the Tokio + Tower ecosystems in Rust, which provides:
1. An extremely high-performance core that is robust and battle-tested
2. A wide and deep ecosystem of extensions and middleware
This currently covers HTTP use cases (REST, JSON-RPC, WebSockets) plus OpenAPI, AsyncAPI, and OpenRPC code generation.
The next step is to cover queues and task managers (RabbitMQ, Kafka, NATS) and CloudEvents interoperability, aiming for a full toolkit. A key inspiration here is [Watermill](https://watermill.io/) in Go.
## Current Features and Capabilities
- REST with typed routing (e.g. `/users/{id:uuid}`)
- JSON-RPC 2.0 over HTTP and WebSocket
- HTTP/1.1 and HTTP/2
- Streaming responses, SSE, and WebSockets
- Multipart file uploads, URL-encoded and JSON bodies
- Tower-HTTP middleware stack (compression, rate limiting, timeouts, request IDs, CORS, auth, static files)
- JSON Schema validation (Draft 2020-12) with structured error payloads (RFC 9457)
- Lifecycle hooks (`onRequest`, `preValidation`, `preHandler`, `onResponse`, `onError`)
- Dependency injection across bindings
- Codegen: OpenAPI 3.1, AsyncAPI 2.x/3.x, OpenRPC 1.3.2
- Fixture-driven E2E tests across all bindings (400+ scenarios)
- Benchmark + profiling harness in CI
Language-specific validation integrations:
- Python: msgspec (required), with optional detection of Pydantic v2, attrs, dataclasses
- TypeScript: Zod
- Ruby: dry-schema / dry-struct detection when present
- PHP: native validation with PSR-7 interfaces
- Rust: serde + schemars
## Roadmap to v1.0.0
**Core:**
- Protobuf + protoc integration
- GraphQL (queries, mutations, subnoscriptions)
- Plugin/extension system
**DX:**
- MCP server and AI tooling integration
- Expanded documentation site and example apps
**Post-1.0 targets:**
- HTTP/3 (QUIC)
- CloudEvents support
- Queue protocols (AMQP, Kafka, etc.)
## Benchmarks
We run continuous benchmarks + profiling in CI. Everything is measured on GitHub-hosted machines across multiple iterations and normalized for relative comparison.
Latest comparative run (2025-12-20, Linux x86_64, AMD EPYC 7763 2c/4t, 50 concurrency, 10s, oha):
- spikard-rust: 55,755 avg RPS (1.00 ms avg latency)
- spikard-node: 24,283 avg RPS (2.22 ms avg latency)
- spikard-php: 20,176 avg RPS (2.66 ms avg latency)
- spikard-python: 11,902 avg RPS (4.41 ms avg latency)
- spikard-wasm: 10,658 avg RPS (5.70 ms avg latency)
-
GitHub
GitHub - Goldziher/spikard: Rust-powered, multi-language web toolkit with bindings for Python, Typenoscript, Ruby and PHP.
Rust-powered, multi-language web toolkit with bindings for Python, Typenoscript, Ruby and PHP. - Goldziher/spikard