jeffersongoncalves/filament-additional-information
A Filament plugin for adding extra information to your admin panel. Attach custom additional-information sections and fields to resources and pages, keeping supplementary details organized and easy to manage alongside your main content.
Install
composer require jeffersongoncalves/filament-additional-information:^1.0
Pin the constraint explicitly. Version 1.0.0 is the first tagged release and it is the Filament v3 line — filament/filament ^3.0, PHP ^8.1|^8.2|^8.3, Laravel ^10|^11. Composer will refuse to resolve it on a Filament v4 or Laravel 12 app, which is the desired outcome: fail at install, not at page render.
There is no migration, no config file, and no publish step announced. Laravel package auto-discovery registers the service provider; verify with php artisan about or by checking vendor/jeffersongoncalves/filament-additional-information/composer.json for the extra.laravel.providers entry.
Where to look first
README.md — it should show the one-line make() usage and the exact namespace.src/ — this package is small. Open the class returned by make() before using it; you will want to know exactly which attributes it renders and whether the factory accepts arguments (entries, columns, label).composer.json — double-check the constraints against your app. 1.0.0 will not install alongside Filament v4, PHP 8.4, or Laravel 12. If you are on any of those, stop here and read the "escape hatch" section below.First use case
Drop the section at the bottom of a ViewRecord page infolist:
use Filament\Infolists\Infolist;
use JeffersonGoncalves\FilamentAdditionalInformation\AdditionalInformation; // verify namespace
public function infolist(Infolist $infolist): Infolist
{
return $infolist->schema([
Section::make('Order details')->schema([
TextEntry::make('reference'),
TextEntry::make('total')->money('usd'),
]),
AdditionalInformation::make(),
]);
}
That should render created_at / updated_at (and any other timestamps it bundles) without you writing four TextEntry::make(...)->dateTime() lines per resource. If you have five resources with a "View" page, that is the entire value proposition — write it once, reuse it.
Standard placement — a shared "audit footer"
The package shines as a convention, not a one-off. Put it last, full width, on every ViewRecord page:
AdditionalInformation::make()
->columnSpanFull()
->visible(fn () => auth()->user()->can('viewAudit', $this->getRecord())),
Wrapping it in ->visible() is worth the extra line: timestamps are metadata, and exposing updated_at to every user leaks activity patterns on sensitive records.
Normalising it across the app
Rather than repeating the same fluent chain, add a thin app-level factory so you can change behaviour globally later:
// app/Filament/Support/AuditSection.php
class AuditSection
{
public static function make(): Section
{
return AdditionalInformation::make()
->columnSpanFull()
->columns(2);
}
}
Swap the package for your own Section here in one commit if the dependency becomes a liability. Given the hard Filament v3 ceiling, this indirection is now the single most valuable thing you can add — it is the difference between a one-file migration and a find-and-replace across every resource when you move to v4.
Combining with your own entries
If the factory returns a Section (the README's wording implies it composes one), you have two integration routes:
getEntries() or a schema() array you can array_merge). Check the source — if entries are built inside a private method, do not fight it; use append.If the factory takes arguments
Many small Filament packages follow the make(array $entries = ['created_at', 'updated_at']) shape. If so, use it to handle models that carry domain timestamps:
AdditionalInformation::make(['created_at', 'updated_at', 'published_at', 'archived_at']);
Only pass attributes that exist on the model — infolist entries resolve via $record->getAttribute(), and a typo yields a blank row rather than an error, which is a silent failure worth guarding against in a test.
Resource table pages need a different component
This is infolist-only. For a table column on a ListRecords page, keep using TextColumn::make('updated_at')->since()->sortable(). Do not try to reuse the section there — the APIs are unrelated.
Pin the ecosystem, not just the package
Because 1.0.0 caps at Filament ^3.0 / Laravel ^11, the realistic failure mode is not the package breaking — it is a sibling upgrade breaking the package's install. Lock your Filament major deliberately:
"filament/filament": "^3.0",
"jeffersongoncalves/filament-additional-information": "^1.0"
If you run a dependency-upgrade bot, exclude this package from automated Laravel/Filament major bumps, or you will get a red PR that looks like a package bug.
Filament v4 is a hard stop, not a caveat
1.0.0 requires filament/filament ^3.0. On v4 the install fails at Composer resolution (infolist naming changed, Infolist::schema() vs components(), namespace shifts in Filament\Infolists). The release notes say "branch 1.x" — read that as: the maintainer is treating v3 as a maintenance line, and v4 support would arrive as a new major (^2.0) if at all. Do not assume an upgrade path exists until it is tagged.
Same story for the runtime floor: PHP ^8.1|^8.2|^8.3 excludes 8.4, and Laravel ^10|^11 excludes 12. On a fresh 2026 Laravel app, this package simply will not install.
Verify the API before writing docs for your team
One star, zero dependents, and this is the first tagged release — so no Stack Overflow answers, no blog posts, no second opinion. Read the class. Confirm the namespace and whether make() is static on a Section subclass or a service that returns one. If the README is stale relative to the release, trust src/.
Timezone confusion is the #1 support ticket
Filament formats entries server-side using the app timezone unless told otherwise. Two failure modes:
APP_TIMEZONE unset → UTC stored, UTC displayed, users see "wrong" times.FilamentTimezone::set() (v3) differs from app.timezone → the infolist and the table show different times for the same record.Set one timezone source of truth and assert it in a test:
Carbon::setTestNow('2026-06-24 12:00:00');
$this->actingAs($admin)->get(OrderResource::getUrl('view', ['record' => $order]))
->assertSee('Jun 24, 2026 12:00');
Nulls render as blanks, not errors
updated_at is never null on a normal Eloquent record, but deleted_at, published_at, email_verified_at frequently are. If the package lets you supply extra timestamps, either filter them (array_filter(fn ($a) => $record->{$a} !== null)) or set a placeholder on the underlying entry. Blank rows look like bugs to reviewers.
created_at === updated_at on fresh records
Every record's first view shows identical values; someone will file a bug. Either accept it, or hide updated_at until $record->updated_at->gt($record->created_at).
Hardcoded English labels
A 1.0.0 release from a single maintainer usually ships without translations. If you need Portuguese/Spanish labels, check for a vendor:publish tag first:
php artisan vendor:publish --provider="JeffersonGoncalves\FilamentAdditionalInformation\FilamentAdditionalInformationServiceProvider"
If no tag exists, subclass and override the label rather than editing vendor code.
Extension point: subclass, don't patch
The correct extension seam is a subclass in your app:
class AuditSection extends AdditionalInformation
{
protected function getLabel(): string
{
return __('admin.audit_information');
}
}
Never edit vendor/. With a single maintainer and no fork network, an accidental composer update will silently revert your changes.
Escape hatch: vendor the file
The whole package is almost certainly under 100 lines — and now we know it is welded to Filament v3. If you are on v4, or planning to be within the next year, copying the class into app/Filament/Components/ and dropping the dependency is the pragmatic call. You own ~60 lines of Section + TextEntry code, and your v4 migration becomes a normal refactor rather than a blocked dependency. For a component this small, owning the code is often cheaper than waiting on an unmaintained package's roadmap — especially with zero dependents to signal future maintenance.
Debugging checklist
composer why-not first; the package, not your app, is the constraint.->schema([...]) of an infolist, not a form, and that the page actually uses an infolist (ViewRecord, not EditRecord).dd($record->getAttributes()).How can I help you explore Laravel packages today?