A levelsio-style PHP micro-stack template. Raw PHP, SQLite, no framework, no build step. Clone it, copy a config file, and you have passwordless auth, Stripe payments, and a deploy pipeline ready to go.
A starting point for a small subscription web app that one person can run on one cheap VPS. It favors plain functions, prepared statements, and boring infrastructure over abstractions. Everything you need fits in a handful of files you can read in an afternoon.
- PHP 8.3+
- SQLite with transactional, versioned schema migrations
- CSS
- Email: pluggable transport (log file in dev, Resend in prod)
- Payments: Stripe Checkout
- Auth: passwordless (magic links and Google OAuth),
- PWA: installable manifest, app icons, and static-asset service worker
- Deploy: Hetzner VPS , nginx plus PHP-FPM plus certbot, Cloudflare in front
- CI: GitHub Actions plus rsync
cp src/config/config.example.php src/config/config.php
php -S 127.0.0.1:8000 -t public scripts/router.phpOpen http://127.0.0.1:8000. With the default config,
email is written to logs/mail.log (so magic links work without any mail server),
and the Stripe and Google buttons stay hidden until you add keys.
Before shipping a clone, edit the committed src/config/app.php, replace the
placeholder assets, and run:
php scripts/check-customization.phpSee docs/CUSTOMIZE.md for the complete checklist.
docs/CUSTOMIZE.mdfor the required changes after cloning.docs/DEVELOPMENT.mdfor local setup, conventions, and how to add a page or table.docs/DEPLOY.mdfor provisioning a Hetzner box and shipping to it.docs/GROWTH.mdfor optional product ideas deliberately left out of the core.
Feature set and philosophy inspired by Pieter Levels' book MAKE (https://readmake.com).
MIT. Use it, change it, ship it.