The medium is the message.
The goal of this project is not accuracy. I value accuracy in so far as it allows us to harness the uncanniness of familiarity.
But, for example, my goal is not for you to be able to take screenshots that can trick people.
Or, for example, I do not intend to implement a Liquid-Glass-ified version of the UI (though if someone does want to take that on and create multiple UI "skins" (Different iOS versions, WhatsApp, etc) submit a PR.)
npm run setupThis installs dependencies, creates the .env file, generates an app key, creates the SQLite database, and runs migrations with seed data.
npm run devThis starts both the frontend (http://localhost:3000) and the backend API (http://localhost:8000) together.
Troubleshooting: If you change any config files (in backend/config/) and the changes don't take effect:
cd backend && php artisan config:clearEmails are logged instead of sent. View them with:
tail -f backend/storage/logs/laravel.logWhen you request a magic link, the verification URL will appear in this log.
While the backend is running, you can preview each email template in the browser at:
http://localhost:8000/preview/mail/magic-linkhttp://localhost:8000/preview/mail/submission-acceptedhttp://localhost:8000/preview/mail/submission-changes-requestedhttp://localhost:8000/preview/mail/submission-rejected
These routes render each template with fake data and are defined in backend/routes/web.php.
SQLite database is at backend/database/database.sqlite.
# Reset database and seed with test data
npm run db:seedThis creates test users, and sample threads in every status (submitted, accepted, changes_requested, rejected, published). The seeded admin account is admin@example.com.
# Reset database without test data
cd backend && php artisan migrate:fresh
# Grant admin access to an existing user
cd backend && php artisan tinker
>>> User::where('email', 'your@email.com')->update(['is_admin' => true]);npm install
npm test
# write formatting changes
npm run format
# check formatting (CI-style)
npm run format:check