-
Notifications
You must be signed in to change notification settings - Fork 0
Troubleshooting
Almost everything that goes wrong with Atelier fails silently. The page renders, nothing errors, and something is quietly missing. This page is the list, ordered by how often it catches people.
Everything works, the markup is right, and it looks like raw HTML.
Tailwind never scanned the package's views. It scans source files and has no idea your vendor directory exists.
/* resources/css/app.css */
@source '../../vendor/safi/filament-atelier/resources/views/**/*.blade.php';Then npm run build. This is the single most common problem, and there is nothing in the
console or the log to point at it.
In the builder, on the live site, or both. The public disk has no symlink:
php artisan storage:linkIf images work locally and 403 on S3, the bucket is blocking public reads. Atelier uploads with public visibility; a bucket policy that overrides that gives you successful uploads and unreadable images.
You pointed atelier.layout at your own Blade view and did not include the meta partial.
<head>
@include('atelier::partials.meta')
...
</head>Symptoms: the browser tab shows the URL, share cards are blank, and previews are no longer
noindex. The page itself looks perfect. See Layouts.
Same cause, other partial. Without it every var(--atelier-*) resolves to nothing, so the
inline styles those controls emit reference variables that do not exist. Arabic also loses
its font stack.
@vite(['resources/css/app.css'])
@include('atelier::partials.tokens')It has to come after your stylesheet.
The field is not reactive. Add a debounce to it in the block's schema():
TextInput::make('heading')->live(debounce: 400)Without ->live(), a field only refreshes the preview when focus leaves it. Every field in
a block that should update live needs it, individually.
Your custom layout is missing the canvas hook. The editor swaps the contents of that element rather than reloading the document:
<main data-atelier-canvas>
{!! $blocks !!}
</main>The block's root element is not carrying the block id. Use the shared attribute bag:
<section {{ $shared->class(['px-6 py-16']) }}>A custom layout is reading a variable the preview does not have. Guard it:
@php $page = $page ?? null; @endphpAtelier passes $blocks, $page, $locale, $title and $preview to both, so this is
usually something else your layout assumes.
Laravel ships a real public/robots.txt, and the web server serves a file on disk before
Laravel runs. Delete it to use Atelier's, or copy the Sitemap: line into yours.
That is the browser rendering, not the file. The XML is valid and correctly typed. Since
v0.1.6 a stylesheet renders it as a table; hard-reload if you are seeing a cached copy. Use
view-source: to see the raw XML.
An upgrade added a table and the migrations were not published:
php artisan vendor:publish --tag=filament-atelier-migrations
php artisan migrateNew tables always ship as new migration files, never as edits to one that already ran, so this is safe and copies only what is new. The changelog names the releases that need it.
Fixed in v0.1.2. Before that, /services/web-design returned 200 with the services page
rendered, because the route discarded everything after the first path segment. Upgrade.
Fixed in v0.1.5, which writes a 301 from the old slug automatically. On an older version the old URL simply 404s, and the redirect is not backfilled: only slug changes made after upgrading are recorded.
Check, in this order:
- Is it published? A draft 404s by design.
- Does it have a slug for that locale? Each locale has its own, and an empty one makes the page unreachable in that language.
- Is another route winning? Atelier's catch-all is registered last, so any route your app
defines takes precedence, including the welcome route on
/in a fresh Laravel app.
php artisan route:list | grep atelierThe plugin is not registered on that panel:
->plugins([
AtelierPlugin::make()->blocks(DefaultBlocks::all()),
])Check you edited the provider for the panel you are actually logged into. An app with an admin panel and a client panel has two.
The plugin is registered but no blocks are:
AtelierPlugin::make()->blocks(DefaultBlocks::all())->blocks() with an empty array registers nothing, and the picker has nothing to offer.
Almost always a custom block calling Storage::url() directly. FileUpload state is an
array keyed by uuid while editing and [] when empty, so it is not reliably a string.
@php $src = \Safi\Atelier\Media::url($attributes['image'] ?? null); @endphpUse Media::upload() in the schema and Media::url() in the view. See Blocks.
Same root cause, different field. Filament's rich editor holds a TipTap document while editing, and it only becomes HTML after dehydration. If you are writing to the tree yourself, go through the form's dehydrated state rather than reading the Livewire property.
Known and unsolved. The builder autosaves every change with no conflict detection, so the last write wins silently. One editor per page for now.
-
php artisan route:list | grep ateliershows the routes are registered -
php artisan aboutconfirms the package is discovered - Check for a stale
public/hotfile pointing Vite at a dev server that is not running, which makes every asset fail to load - Open an issue with your Laravel, Filament and Atelier versions
For a suspected security issue, do not open a public issue. See the security policy.
Building
Running a site
Reference