finity-labs/fin-codex
Finity Labs' fin-codex is a Laravel/PHP package offering a clean, framework-friendly foundation for Codex integrations. It provides configuration, service bindings, and a simple API so you can add codex-based features to your application with minimal setup.
This release is a maintenance patch (v0.5.6) — no new APIs, no breaking changes — but it is the release to be on if you run Filament 4.15+/5.10+, because the previous version silently broke tab switching on the article list.
Minimal path to a working install:
composer require finity-labs/fin-codex
php artisan vendor:publish --tag="fin-codex-config"
php artisan vendor:publish --tag="fin-codex-migrations"
php artisan migrate
Then register the plugin on your panel:
public function panel(Panel $panel): Panel
{
return $panel
->plugin(FinCodexPlugin::make());
}
Where to look first:
First use case: create an article, attach files through the Files tab, then click back and forth between tabs. On v0.5.5 with Filament 4.15/5.10 the Files tab would show the previous tab's table on the switching request; v0.5.6 fixes exactly that, so it is also the fastest smoke test after upgrading.
Upgrade-and-verify workflow. Treat this release as "pin Filament, bump fin-codex, click the tabs." If you are on Filament < 4.15 nothing changes functionally, but upgrading is still recommended because the test-suite fix means the package now validates against 4.12.6 through 5.10.x rather than a narrow markup snapshot.
Schema composition over schema branching. The fix encodes a pattern worth copying in your own custom pages: keep both the table and the nested file component in the schema at all times, and decide which one is visible as the schema renders (a ->visible(fn () => ...) closure), rather than conditionally adding components based on $this->activeTab. Conditional inclusion forces the schema to be built from Livewire state that is not yet updated when the page hydrates.
// Preferred: both components exist, visibility is resolved at render
Tabs::make()->tabs([
Tab::make('Files')->schema([
$this->table, // always present
$this->fileTable, // always present
]),
]);
Extending the resource. Subclass the article resource or its list page and override table() / getHeaderActions() as usual; because the page keeps the nested component mounted rather than swapping it in, overrides survive tab switches instead of being re-registered mid-request.
Testing pattern. This release explicitly moved the package's own suite off Filament's private markup and onto stable state assertions. Adopt the same discipline in your app tests:
// Do this — stable, version-agnostic
livewire(ListArticles::class)
->call('setActiveTab', 'files')
->assertSee('your-file-id')
->assertSeeHtml('id="your-relation-manager-id"');
// Not this — breaks on Filament point releases
->assertSeeHtml('fi-tabs-strip') // wrapper element changed in 4.15.2 / 5.10.2
Assert on the ids fin-codex emits, which tab panel has content, and which relation manager is mounted — those held from 4.12.6 through 5.10.x.
Integration tip. If you render the codex list inside your own page or a panel widget, mount it once and toggle tabs internally; do not re-mount the component per tab, or you reintroduce the hydration-ordering problem the release just fixed.
php artisan optimize:clear (and any Filament component cache) is a legitimate first step when behaviour differs between php artisan serve and a queued/Octane worker.How can I help you explore Laravel packages today?