Skip to content

Configuration

Abdulkader Safi edited this page Aug 18, 2026 · 3 revisions

Configuration

Everything lives in config/atelier.php, published with:

php artisan vendor:publish --tag=filament-atelier-config

Every key has a working default, so publishing the config is optional until you want to change something. Republishing after an upgrade never overwrites your file, which means new keys fall back to their packaged defaults rather than appearing in your copy.

Reference

Key Default What it does
locales en, ar Which languages exist. The first is the default and has no URL prefix.
layout atelier::layouts.site The Blade layout wrapping rendered blocks, used when a page names none.
tokens [] Design token overrides, merged over the shipped set.
preview.debounce 500 Milliseconds after typing stops before the preview refreshes.
preview.link_expiry_minutes 1440 How long a shareable preview link stays valid.
preview.widths null, 820, 390 Pixel widths for the desktop, tablet and mobile switcher.
media.disk public Disk for uploads. Must be publicly readable.
media.directory atelier Folder within that disk.
revisions.keep 20 Snapshots kept per page, pruned on every publish.
robots.disallow_panel /admin Panel path to disallow in robots.txt. null leaves it crawlable.

locales

'locales' => [
    'en' => ['label' => 'English', 'dir' => 'ltr'],
    'ar' => ['label' => 'العربية', 'dir' => 'rtl'],
],

Order matters: the first entry is the default locale and lives at /{slug} with no prefix, the editor opens on it, and a missing translation falls back to it. label is what the language switcher shows, dir drives dir="rtl" and the Arabic font swap.

Swapping the order is how you change which language is the default. Put ar first and Arabic serves from /{slug} while English moves to /en/{slug}, with nothing else to change. On a site that already has pages that rewrites every URL and writes no redirects, because the slugs themselves did not change. See Bilingual and RTL.

⚠️ Decide before creating pages. Changing the set later means migrating the per-locale maps inside every block tree. A single locale is fine, and the switcher hides itself. See Bilingual and RTL.

layout

The site-wide shell. Point it at your own Blade view to give a client site its own navigation and footer, and include atelier::partials.meta and atelier::partials.tokens in it or you silently lose the head and every design token.

For several shells with a per-page choice, register them instead. See Layouts.

tokens

Overrides merge group key by group key over Safi\Atelier\Tokens::defaults():

'tokens' => [
    'color' => ['primary' => '#0f766e'],
    'font' => ['arabic' => '"IBM Plex Sans Arabic", sans-serif'],
],

Anything omitted keeps its shipped value. See Design tokens.

preview.debounce

How long the editor waits after the last keystroke before refreshing the iframe. Lower feels more immediate and costs a render per keystroke burst; higher feels laggy. 500ms is the tuned value, and a twelve-section page renders in about 16ms, so the render is not what you are trading against.

preview.widths

'widths' => [
    'desktop' => null,   // null means unconstrained
    'tablet' => 820,
    'mobile' => 390,
],

Fixed pixel widths, not percentages of the pane, so "mobile" means the same thing on your laptop and your external monitor.

media.disk

Must be publicly readable. With the default public disk you also need:

php artisan storage:link

Without the symlink every image in the builder and on the live site is broken, with nothing in the log to say why.

On S3, make sure objects are publicly readable. Atelier uploads with public visibility, so a bucket policy that blocks public reads gives you working uploads and 403ing images.

revisions.keep

Snapshots kept per page, pruned on every publish. Set it to 0 or a negative number to disable pruning entirely and keep everything, which is fine for a site that publishes occasionally and a growing table for one that does not.

See Publishing.

robots.disallow_panel

The panel path written into /robots.txt as a Disallow: line. Set it to your actual panel path if it is not /admin, or null to leave the panel crawlable.

⚠️ Laravel ships a real public/robots.txt, and a file on disk is served before any route runs, so this only takes effect once you delete that file. See SEO.

Registered in code, not config

Three things are registered in your panel provider rather than the config file, because they are code:

AtelierPlugin::make()
    ->blocks(DefaultBlocks::all())       // block types
    ->layouts([...])                     // shells a page can pick
    ->sitemap([...]);                    // URLs from outside Atelier
  • Blocks, the section types the client can add
  • Layouts, the shells wrapped around them
  • SEO, extra sitemap URLs from your own models

Not in config at all

Settings → Site details in the panel holds the organisation behind the site: its name, logo, social profiles, address, opening hours and contact points. That is client-owned data which changes without a deploy, so it lives in the database rather than in a file. It feeds the structured data on every page. See Structured data.

Publishing views

php artisan vendor:publish --tag=filament-atelier-views

Copies every package Blade view into resources/views/vendor/atelier/, where your edits override the shipped ones. Useful for changing what a shipped block renders, and a fork you then maintain against every upgrade, so prefer writing your own block.

Rebuild your CSS afterwards: published views live in your app, so the @source line pointing at the vendor directory no longer covers them.

Clone this wiki locally