John Koster
@johnmkoster.bsky.social
Doing things with Laravel and Statamic
Look at how the AST dramatically changes once I enable the options that contain the extension 🔥
November 10, 2025 at 2:32 PM
Look at how the AST dramatically changes once I enable the options that contain the extension 🔥
Some progress from the weekend. Forte's error recovery and extensibility models are now extremely overpowered.
Here's a short code example without a custom extension I wrote to test:
Here's a short code example without a custom extension I wrote to test:
November 10, 2025 at 2:32 PM
Some progress from the weekend. Forte's error recovery and extensibility models are now extremely overpowered.
Here's a short code example without a custom extension I wrote to test:
Here's a short code example without a custom extension I wrote to test:
A fun look at something I've been chipping away at: leveling up the View Scaffolding feature in #statamic
It generates templates, taking your blueprints and field configuration into consideration!
It generates templates, taking your blueprints and field configuration into consideration!
October 26, 2025 at 10:29 PM
A fun look at something I've been chipping away at: leveling up the View Scaffolding feature in #statamic
It generates templates, taking your blueprints and field configuration into consideration!
It generates templates, taking your blueprints and field configuration into consideration!
Another fun preview. Got timelines working for Livewire AJAX requests - and the timeline entries get associated with the live DOM tree (hovering over a view in this image highlights that node in the page):
October 26, 2025 at 12:30 AM
Another fun preview. Got timelines working for Livewire AJAX requests - and the timeline entries get associated with the live DOM tree (hovering over a view in this image highlights that node in the page):
A quick progress update on my Alpine, Blade and Livewire dev tool project!
I've been working hard on improving visualizations, adding features that I've always wanted (like hovering over an SVG element and seeing what it looks like), as well as some client-side performance monitoring!
I've been working hard on improving visualizations, adding features that I've always wanted (like hovering over an SVG element and seeing what it looks like), as well as some client-side performance monitoring!
October 25, 2025 at 6:58 PM
A quick progress update on my Alpine, Blade and Livewire dev tool project!
I've been working hard on improving visualizations, adding features that I've always wanted (like hovering over an SVG element and seeing what it looks like), as well as some client-side performance monitoring!
I've been working hard on improving visualizations, adding features that I've always wanted (like hovering over an SVG element and seeing what it looks like), as well as some client-side performance monitoring!
And of course, log tailing, in your browser:
September 28, 2025 at 11:12 PM
And of course, log tailing, in your browser:
This is one of my favorite things: being able to pause/resume wire:polls.
September 28, 2025 at 11:12 PM
This is one of my favorite things: being able to pause/resume wire:polls.
An inspector panel also provides an overview of all detected Alpine and Livewire attributes:
September 28, 2025 at 11:12 PM
An inspector panel also provides an overview of all detected Alpine and Livewire attributes:
The tool also supports bi-directional state management for Alpine and Livewire. Switch between component states, and even edit the state in arbitrary ways (fun to see what breaks if you throw in unexpected values haha)
September 28, 2025 at 11:12 PM
The tool also supports bi-directional state management for Alpine and Livewire. Switch between component states, and even edit the state in arbitrary ways (fun to see what breaks if you throw in unexpected values haha)
The tool opens in a new tab or window - this way I don't have to worry about adding too much stuff to the DOM, or modals covering the debug tool. Here is a demo of it being able to detect regular Blade components, and pull up the source for them directly in the tool:
September 28, 2025 at 11:12 PM
The tool opens in a new tab or window - this way I don't have to worry about adding too much stuff to the DOM, or modals covering the debug tool. Here is a demo of it being able to detect regular Blade components, and pull up the source for them directly in the tool:
I'm in the weeds.
September 5, 2025 at 2:00 AM
I'm in the weeds.
Took a short break from PHP tonight to write some TypeScript. Threw together a quick language server implementation; it's fun to see Forte's diagnostics appearing next to the Laravel Extension's!
August 31, 2025 at 4:23 AM
Took a short break from PHP tonight to write some TypeScript. Threw together a quick language server implementation; it's fun to see Forte's diagnostics appearing next to the Laravel Extension's!
Implemented another built-in transformer. This one tidies passed values to certain directives, smoothing out a few papercuts 💅
August 30, 2025 at 11:43 PM
Implemented another built-in transformer. This one tidies passed values to certain directives, smoothing out a few papercuts 💅
Small proof of concept! The logic could be made smarter over time, and this information would be relatively trivial to pull into the VS Code extension, etc.
Going to keep chipping away at things!
Going to keep chipping away at things!
August 30, 2025 at 10:07 PM
Small proof of concept! The logic could be made smarter over time, and this information would be relatively trivial to pull into the VS Code extension, etc.
Going to keep chipping away at things!
Going to keep chipping away at things!
And another quick example - Forte can also be used to make existing Blade features play nice together.
This example demonstrates using it to allow the PHP directive with arguments, and the block-style to exist in the same file:
This example demonstrates using it to allow the PHP directive with arguments, and the block-style to exist in the same file:
August 30, 2025 at 7:06 PM
And another quick example - Forte can also be used to make existing Blade features play nice together.
This example demonstrates using it to allow the PHP directive with arguments, and the block-style to exist in the same file:
This example demonstrates using it to allow the PHP directive with arguments, and the block-style to exist in the same file:
Here's a small preview of the Forte feature I'm currently working on: Enclaves.
In this demo, I'm using them to add support for server-side conditional elements and loops.
In this demo, I'm using them to add support for server-side conditional elements and loops.
August 30, 2025 at 5:56 PM
Here's a small preview of the Forte feature I'm currently working on: Enclaves.
In this demo, I'm using them to add support for server-side conditional elements and loops.
In this demo, I'm using them to add support for server-side conditional elements and loops.
The next obvious thing to experiment with was relative performance data - visually see where the time is going!
August 29, 2025 at 1:44 AM
The next obvious thing to experiment with was relative performance data - visually see where the time is going!
I built a thing that lets you peek into the #laravel Blade that was used to render a page. It tracks component hierarchy, includes, etc. - works with Blade components, Flux, etc.
All without runtime overhead! Might continue this experiment in the future
All without runtime overhead! Might continue this experiment in the future
August 28, 2025 at 10:23 PM
I built a thing that lets you peek into the #laravel Blade that was used to render a page. It tracks component hierarchy, includes, etc. - works with Blade components, Flux, etc.
All without runtime overhead! Might continue this experiment in the future
All without runtime overhead! Might continue this experiment in the future
Another experiment testing out node swapping - I'm collecting a rather large amount of these experiments 😅
August 27, 2025 at 12:05 AM
Another experiment testing out node swapping - I'm collecting a rather large amount of these experiments 😅
Another random experiment to make sure the AST produced by Forte is useful.
This one was really fun to make!
This one was really fun to make!
August 26, 2025 at 10:27 PM
Another random experiment to make sure the AST produced by Forte is useful.
This one was really fun to make!
This one was really fun to make!
I'm pretty happy with the AST traverser and visitor. Now, it's just fine-tuning some of the APIs.
Laravel's LazyCollection is super useful here:
Laravel's LazyCollection is super useful here:
August 23, 2025 at 11:08 PM
I'm pretty happy with the AST traverser and visitor. Now, it's just fine-tuning some of the APIs.
Laravel's LazyCollection is super useful here:
Laravel's LazyCollection is super useful here:
This is the before/after of the Blade template once Forte is done with it:
August 23, 2025 at 9:18 PM
This is the before/after of the Blade template once Forte is done with it:
Chipping away at Forte's Blade AST infrastructure.
It's adding the Blade directives/rewriting some HTML before handing it off to Laravel's compiler.
Not saying you should do this... but you could lol
It's adding the Blade directives/rewriting some HTML before handing it off to Laravel's compiler.
Not saying you should do this... but you could lol
August 23, 2025 at 9:15 PM
Chipping away at Forte's Blade AST infrastructure.
It's adding the Blade directives/rewriting some HTML before handing it off to Laravel's compiler.
Not saying you should do this... but you could lol
It's adding the Blade directives/rewriting some HTML before handing it off to Laravel's compiler.
Not saying you should do this... but you could lol
Forte Phase 0 is officially complete! 🥳
Private invites going out soon 🗡️
Private invites going out soon 🗡️
August 22, 2025 at 5:17 AM
Forte Phase 0 is officially complete! 🥳
Private invites going out soon 🗡️
Private invites going out soon 🗡️
Feeling much more confident in Forte's parser now. This test takes an already gnarly template and breaks it up, reverses it, randomizes it - just absolutely wrecks it and shoves it through the parser.
An excellent way to find subtle whitespace bugs and infinite loops.
An excellent way to find subtle whitespace bugs and infinite loops.
August 17, 2025 at 3:20 AM
Feeling much more confident in Forte's parser now. This test takes an already gnarly template and breaks it up, reverses it, randomizes it - just absolutely wrecks it and shoves it through the parser.
An excellent way to find subtle whitespace bugs and infinite loops.
An excellent way to find subtle whitespace bugs and infinite loops.