Development
Development Setup
What you need
- Linux with systemd and Podman 5.3+
lpod(see Podman Quadlet for how to install it)- Optional: VS Code or Zed with the Podman SDK extension
Setup
cd ~/projects
git clone git@github.com:francoism90/stry.git
cd stry
composer install
cp .env.example .env
php artisan key:generate
Choose a preset for the app image (see Podman Quadlet for the full list of services):
developmentmounts your working copy into the container, so your changes show up right away. Use this for everyday work.productionuses the same image as production, with the code built in. Use this to test a production build locally.
php artisan podman:setup --preset=development
# or: --preset=production
lpod install development/app.quadlets --replace
lpod install development/pgsql.quadlets --replace
# ...and so on for every service (see podman.md)
Set PODMAN_DEFAULT_PRESETS in .env to a comma-separated list, for example PODMAN_DEFAULT_PRESETS=development,devcontainer,s3, so you don't have to pass --preset to every podman:setup run.
Before you store .env with lpod stry secrets, set APP_ENV=local, APP_DEBUG=true and PWA_ENABLED=false, plus any other local settings you need.
When it's running, the app is available at http://localhost:8000. You don't need a reverse proxy locally. See Reverse Proxy if you want to test the subdomain routing used in production.
Once the containers are up, install the dependencies and seed the database:
lpod stry shell
composer install
php artisan storage:link
php artisan migrate --seed
php artisan scout:sync --import
pnpm install
The development preset runs the Vite dev server in its own container (vite.quadlets), next to stry. You don't need to run pnpm dev yourself:
lpod install development/vite.quadlets --replace
Admin account
For testing, you can seed a super-admin user:
lpod stry a db:seed --class=AdminSeeder
Only use this seeder for testing. Never run it in production. See the security checklist.
You can also create an admin interactively, without the seeder: lpod stry artisan users:create --super-admin (see CLI Interaction).
VS Code Dev Containers
The devcontainer preset builds an image for the Dev Containers extension, so you can develop stry inside a container. This is separate from the development and production presets above, which run the app as a service. With stry running, open the project:
code ~/projects/stry
.devcontainer/devcontainer.json connects to the systemd-stry network and gives you PHP IntelliSense, debugging and a terminal inside the container. Generate the configs, then symlink the one you want. Use a symlink rather than a copy, so it stays up to date when you run podman:generate again:
php artisan podman:generate devcontainer
mkdir -p .devcontainer
ln -sf ../podman/devcontainer/runtimes/devcontainer-ai.json .devcontainer/devcontainer.json
stry uses the -ai config by default, which adds the Claude Code and Codex CLIs to the base image. There are four configs in total: prebuilt or built locally, each with or without the AI CLIs. See Devcontainer in the package docs for the others.
~/.claude.json must exist as a file on your machine before the first launch. Otherwise Podman creates an empty directory with that name instead.
After changing the preset, generate the configs again and run Dev Containers: Rebuild Container.
Laravel IDE Helper
lpod stry artisan ide-helper:generate
lpod stry artisan ide-helper:meta
lpod stry artisan ide-helper:models --nowrite
AI-assisted development
Laravel Boost is set up as an MCP server. In VS Code, open the Command Palette (Ctrl+Shift+P or Cmd+Shift+P), choose MCP: List Servers and start laravel-boost.
The -ai devcontainer config (see above) also installs the claude and codex CLIs. Your ~/.claude and ~/.codex folders are mounted into the container, so you stay logged in after a rebuild. Use either CLI together with Boost, which gives it Laravel-specific context such as routes, the database schema, config and Tinker.
Testing and code quality
lpod stry artisan test
lpod stry artisan test --filter=testMethodName
lpod stry bin pint
lpod stry bin larastan
Admin services
Available when you're logged in as a super-admin:
| Service | URL | Description |
|---|---|---|
| Horizon | http://localhost:8000/horizon |
Monitor and manage queues |
| Telescope | http://localhost:8000/telescope |
Debugging tool (only in development) |
Troubleshooting
- A container won't start: run
journalctl --user -u stry -f. Look for a missing or invalidstry-envsecret, or another process using port 8000, 5173 or 6001. - Permission errors: run
chown -R 1000:1000 ~/projects/stry/storage. Use your ownPODMAN_QUADLET_UIDandGIDif you changed them. - Assets don't build: run
rm -rf bootstrap/ssr && lpod stry npm run build. - Tests fail with
could not translate host name "systemd-stry-pgsql": you ranphp artisan teston your machine instead of inside the container network. Start the containers withlpod stry up, then runlpod stry artisan test.
Next steps
- CLI Interaction for stry's Artisan commands
- Application Configuration for app settings
