Stackr is a single Laravel app that serves a React SPA with a same-origin REST API (Sanctum cookie auth, SQLite). This guide covers a fresh install.
- PHP 8.4 (ext:
openssl,mbstring,bcmath,curl) - Composer 2
- Node 20+ / npm
- SQLite
- (Optional) DDEV — the app runs at
https://omniflow.ddev.site
composer install
npm install
npm run build # builds the SPA into public/buildWith DDEV:
ddev start
ddev composer install
npm install && npm run build # build assets on the host; DDEV serves public/buildcp .env.example .env # if you don't have a .env yet
php artisan key:generateKey settings (already set for DDEV):
DB_CONNECTION=sqlite— the database file isdatabase/database.sqliteSESSION_DRIVER=database,CACHE_STORE=databaseAPP_URL=https://omniflow.ddev.site
Optional features:
- Push notifications — generate VAPID keys and add them to
.env:php artisan tinker --execute="print_r(Minishlink\WebPush\VAPID::createVapidKeys());"VAPID_PUBLIC_KEY=... VAPID_PRIVATE_KEY=... VAPID_SUBJECT=mailto:you@example.com
- Due reminders (push) need the scheduler running (a cron entry):
The scheduler fires
* * * * * cd /path/to/app && php artisan schedule:run >> /dev/null 2>&1tasks:notify-dueevery 15 minutes.
You do not need to seed the database. Open the app — with no database yet, a first-run wizard appears automatically and walks you through:
- Database — click Run migrations (creates all tables). If the browser
can't run it, run
php artisan migrate --force(orddev artisan migrate --force) and click re-check. - Account — create the first (owner) account.
- Import — optionally restore a Stackr JSON backup, or Skip to start empty.
When it finishes you land in the app, logged in. The wizard never shows again once an account exists.
The setup endpoints (
GET /api/setup/status,POST /api/setup/migrate) are session-free so they work before the database exists.migrateis refused once any account exists.
If you prefer the terminal instead of the wizard:
php artisan migrate --force
# then open the app and register the first account,
# or import a backup from Settings → Data → Import backupTo wipe everything and get the fresh first-run experience again:
php artisan db:wipe # drops all tables → wizard starts from step 1
# or, to keep the schema but remove all data:
php artisan migrate:fresh # empty, migrated database → wizard starts at "Account"- Export: Settings → Data → Export backup (.json) — downloads everything (projects, tasks, tags, perspectives, comments).
- Import: the setup wizard (step 3) or Settings → Data → Import backup. Importing replaces all current data with the backup.
php artisan test # or: ddev artisan test