Requirements
GENNAI's authoring environment runs on Docker. Make sure your machine has the following:
- Docker (Docker Desktop or Docker Engine)
- Docker Compose v2 (the
docker composecommand) - Git
On startup, containers for the admin (Laravel 12), the front end (Next.js 14) and the database (MySQL) come up. Because the public site is made of static files, you don't need a PHP or database server to serve it.
Installation
Clone the repository and run the installer.
git clone <repository URL> my-media
cd my-media
./install.shThe installer prepares the configuration files, then builds and starts the Docker containers. The first run takes a few minutes to build the images. When it finishes, the setup wizard URL (…/setup) is shown in the terminal.
If the ports clash with other services, you can change them with options.
./install.sh --site-id my-media --cms-port 48080 --frontend-port 43000 --db-port 43306./install.sh --help to see all available options.Setup wizard
Open the displayed URL in your browser to start the 8-step wizard. Follow the on-screen instructions.
- 1
Site basics
Register the foundational details of your site, such as its name and public URL.
- 2
Administrator
Create the administrator account used to sign in to the admin.
- 3
Operator information and publishing rules
Set your operator information and rules such as banned words for public pages.
- 4
Theme and brand
Choose a theme and set your logo and brand colors.
- 5
Analytics (GA4, GTM, Search Console)
Set up web analytics and search performance tracking.
- 6
Referral CTA
Set the referral destination for readers and the button text.
- 7
Plugins
Choose the plugins you want and enable them.
- 8
Review and finish
Review your settings and complete the setup.
Writing and publishing articles
Once the wizard is done, create articles from the admin. Publishing works like this:
- Create and edit articles and parts in the admin
- Run a build to export the entire site as static HTML (Next.js static export)
- At the end of the build, every page is checked automatically (banned words, 404 page, internal links)
- Deploy the HTML that passed the checks to a static host such as S3 + CloudFront
Plugin basics
A plugin consists of two halves: the Laravel side (admin and API) and the Next.js side (public site). Plugins can be enabled or disabled from the admin, and disabled plugins are left out of the site.
laravel/plugins/<id>/ # Laravel side (required)
frontend/src/plugins/<id>/ # Next.js side (optional)You can generate a scaffold with a command.
docker compose exec laravel php artisan plugin:make my-feature --frontendAdd --frontend to also scaffold the Next.js side. Use --name="Display name" to set the name shown in the admin.
Theme basics
A theme bundles all the files that affect the look into a single directory. Themes can be switched in the admin.
frontend/themes/my-theme/
├── theme.json # Theme name, version, parts to swap
├── tokens.css # Design tokens: colors, spacing, typography
├── overrides.css # Optional: CSS overrides for components
└── components/ # Optional: swap parts such as the header and footerThe quickest start is to copy the default theme's tokens.css and change the values. Whether to show an ad disclosure (PR label), and its wording, is set in the admin's site settings; themes can change how it looks.
Working with AI agents
Articles, parts, tasks and the wiki can be operated through an HTTP API (MCP). Give an AI agent a token issued in the admin, and it can create and update articles and organize tasks.
The automatic pre-publish checks apply equally to changes made through the API, which makes it easy to combine agents with a workflow where people do the final review.
Want to talk about adoption or migration?
From setting up your environment to how you run things day to day, feel free to get in touch.
Talk to us