Dynamic QR behavior
Dynamic projects encode `/r/:slug`. Editing the project updates the stored destination and keeps the slug stable so printed QR codes continue to work.
The local app uses SQLite through Prisma. For production, set `DATABASE_URL` to a managed Postgres database, set `NEXT_PUBLIC_APP_URL` to the public app URL, and set `IP_HASH_SALT` to a private random value.
Dynamic projects encode `/r/:slug`. Editing the project updates the stored destination and keeps the slug stable so printed QR codes continue to work.
Each `/r/:slug` visit creates a scan event with timestamp, referrer, hashed IP, browser, OS, and device category. Raw IP addresses are not stored.
No paid services are required for local use. Production deployment needs only hosting and a database. Geo country/region lookup is omitted until a privacy-safe external provider is configured.