Clone from template
A new product starts from a clone of template/. The clone is a working application the moment it boots — admin and app panels, Filament Shield, Media Drive, Passport, the first-run installer, and Reverb are already wired. From there the clone adds brand, public HTML, and CMS roles; the CMS itself comes from the docs-stack plugins, required through Composer.
What the clone owns
Per ADR 0006 and ADR 0008, the clone — not the template, not the plugins — owns everything a customer sees that is specific to this product:
- Brand — logo, panel colors,
APP_NAME, mail from-name, HTML titles - Public HTML —
resources/views/site/*, CSS, the landing/docs/blog chrome - Business names — copy, footer, header links, public menu text
- Public routes —
routes/web.phpplusPublicPageController(/,/docs,/blog,/sitemap.xml) - CMS Shield roles — the
editor/authormatrix in the clone'sRoleSeeder - Optional
Subscribermodel — newsletter v1, not a plugin yet
What the clone does NOT own
CMS tables and Filament resources live in the plugins. Do not copy a plugin's migrations or resource classes into the clone. Require the plugin through Composer and let it register its own resources on the panel. A clone that duplicates posts, docs, or their resources has forked the CMS — the exact failure mode ADR 0008 exists to prevent.
Steps
# 1. Clone the published template
git clone https://github.com/Qcentic-Edge/qcentic-edge-template my-product
cd my-product
# 2. Copy the dev env file and fill in APP_KEY
cp .env.docker.dev.example .env.docker.dev
# 3. Bring the stack up (sqld, MinIO, Vite, Reverb)
docker compose -f docker-compose.dev.yml --env-file .env.docker.dev up -d
# 4. First-run installer — migrate, seed, first super_admin
# open http://localhost:8090/install
Then require the docs-stack plugins, migrate, and seed the CMS role matrix:
docker compose -f docker-compose.dev.yml --env-file .env.docker.dev exec app \
composer require qcentic-edge/filament-seo qcentic-edge/filament-blog \
qcentic-edge/filament-docs qcentic-edge/filament-admin-bar
docker compose -f docker-compose.dev.yml --env-file .env.docker.dev exec app php artisan migrate
docker compose -f docker-compose.dev.yml --env-file .env.docker.dev exec app php artisan db:seed --class=RoleSeeder
Wire the plugins in the panel provider, add the public routes, and render them with the clone's Blade. The full plugin list and ->plugin() block are on Enable docs stack; the route/controller shape is on Public HTML recipe.
Flow
flowchart LR
A[template<br/>substrate] --> B[clone]
B --> C[+brand<br/>+Blade<br/>+routes<br/>+roles]
C --> D[product]
B -.require.-> E[docs-stack plugins]
E --> D
The substrate evolves in template/; the product look lives only in the clone; the plugins supply the CMS. Three repos, three concerns.