Skip to content

Troubleshooting

Abdulkader Safi edited this page Aug 18, 2026 · 1 revision

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.

Blocks render unstyled

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.

Every image is broken

In the builder, on the live site, or both. The public disk has no symlink:

php artisan storage:link

If 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.

The page has no title, description or Open Graph tags

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.

Background and spacing controls do nothing

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 preview does not update as I type

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.

The preview reloads the whole iframe, or loses my scroll position

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>

Clicking a section in the preview does not select it

The block's root element is not carrying the block id. Use the shared attribute bag:

<section {{ $shared->class(['px-6 py-16']) }}>

The preview 500s but the live page is fine

A custom layout is reading a variable the preview does not have. Guard it:

@php $page = $page ?? null; @endphp

Atelier passes $blocks, $page, $locale, $title and $preview to both, so this is usually something else your layout assumes.

robots.txt shows the wrong thing

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.

The sitemap looks like a wall of text in the browser

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.

"no such table: atelier_page_revisions" (or _redirects)

An upgrade added a table and the migrations were not published:

php artisan vendor:publish --tag=filament-atelier-migrations
php artisan migrate

New 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.

A nested URL serves the wrong page

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.

Renaming a slug broke every inbound link

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.

A page 404s that should not

Check, in this order:

  1. Is it published? A draft 404s by design.
  2. Does it have a slug for that locale? Each locale has its own, and an empty one makes the page unreachable in that language.
  3. 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 atelier

The panel has no Pages item

The 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 section picker is empty

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.

An uploaded image saves but the block shows nothing

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); @endphp

Use Media::upload() in the schema and Media::url() in the view. See Blocks.

Rich text renders as an array, or as JSON

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.

Two people editing a page overwrite each other

Known and unsolved. The builder autosaves every change with no conflict detection, so the last write wins silently. One editor per page for now.

Still stuck

  • php artisan route:list | grep atelier shows the routes are registered
  • php artisan about confirms the package is discovered
  • Check for a stale public/hot file 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.

Clone this wiki locally