Skip to main content
The starter kit separates source from package. You edit both, but only the package is installed.

What ends up installed

Building copies everything in static/ to BUILD_DIR, adds the compiled CSS and JS under assets/, and writes .vite/manifest.json. The installed theme looks like this:
Files listed in extra.public are then copied to public/e/acme/aurora/, which is what the browser actually loads.

What each part does

Only composer.json and templates/index.twig are required by the application. Layouts, sections and snippets are conventions that make a theme easier to maintain.

Naming conventions

  • Templates are pages: one file per route.
  • Sections are page-sized blocks, included from a template: {% include "@theme/sections/hero.twig" %}.
  • Snippets are fragments used in several places, often with variables: {% include "@theme/snippets/plan.twig" with { plan } %}.
  • Layouts are extended, not included: {% extends "@theme/layouts/theme.twig" %}.
Every path starts with @theme/, which points at the active theme’s installed directory.

PHP inside a theme

A theme that only renders the landing page needs no PHP. Add static/src/ when you want extra pages: Anything under static/src/ must be covered by the PSR-4 map in composer.json, and the package must be installed with Composer so the classes autoload. See Custom pages.

Translations

Catalogs live at static/locale/{code}/LC_MESSAGES/theme.po, in the theme domain. The starter ships catalogs for the locales Aikeedo supports. See Theme localization.