A free, open-source Flutter app for QR code scanning and generation.
Contributions, bug reports, and feature requests are welcome!
- Scan QR codes using your camera or from a gallery image
- Generate QR codes for text, URLs, Wi-Fi, contacts, events, locations, email, phone, WhatsApp, Instagram, and more
- Offline-first history — syncs to the cloud when online
- Multi-language support (English, Spanish, French, Portuguese)
- Anonymous usage analytics via PostHog (opt-out available in settings)
- Code push updates via Shorebird
- Flutter (≥ 3.3.3)
- An Appwrite project (cloud or self-hosted)
- Optional: a PostHog project for analytics
git clone https://github.com/oluwasniper/Stagen.git
cd Stagen
flutter pub getcp .env.example .envFill in .env with your own values:
| Variable | Description |
|---|---|
APPWRITE_ENDPOINT |
Your Appwrite API URL (e.g. https://fra.cloud.appwrite.io/v1) |
APPWRITE_PROJECT_ID |
Found in Appwrite Console → Project Settings |
APPWRITE_PROJECT_NAME |
Display name (optional) |
POSTHOG_API_KEY |
PostHog project API key — leave empty to disable analytics |
POSTHOG_HOST |
PostHog host (https://us.i.posthog.com by default) |
.envis gitignored and never committed. See.env.examplefor a template.
make run
# or
flutter run --dart-define-from-file=.envmake build-android # APK (release)
make build-ios # iOS (release)This app requires an Appwrite project with a database and collection. You will need to create:
- Database ID:
scagen_db - Collection ID:
qr_records - Collection attributes:
| Attribute | Type | Required |
|---|---|---|
data |
String | Yes |
type |
String (scanned / generated) |
Yes |
qrType |
String | Yes |
label |
String | No |
userId |
String | No |
createdAt |
String (ISO 8601) | Yes |
Set collection permissions to allow read/write for authenticated users (including anonymous sessions).
cp .vscode/launch.json.example .vscode/launch.jsonThis pre-configures debug, profile, and release launch targets with --dart-define-from-file=.env so you can use the VS Code Run panel directly.
- Fork the repo and create a branch from
main - Make your changes
- Open a pull request with a clear description of what you changed and why
Please keep PRs focused — one feature or fix per PR.
Open an issue and include:
- Device / OS version
- Steps to reproduce
- What you expected vs. what happened
To make the Wi-Fi picker/connected-SSID fallback work reliably on iPhone, complete these steps in Xcode for ios/Runner.xcworkspace:
- Open
Runnertarget → Signing & Capabilities. - Add capability: Access WiFi Information.
- Ensure location permission text exists in
ios/Runner/Info.plist:NSLocationWhenInUseUsageDescription
- On device, allow Location While Using App and keep Location Services on.
Troubleshooting:
- No network appears in picker — Confirm location permission and Access WiFi Information capability.
- Only connected network shown — Expected on some iOS versions; the app falls back to the connected SSID.
- SSID shows as unknown — Toggle Wi-Fi off/on and reconnect.
- Works in debug but not release/TestFlight — Verify capabilities are present in the release signing profile.
- Simulator differs from real device — Test SSID features on a physical iPhone.
- Highlight text in another app → tap Process text → choose Scagen
- Scagen opens the Generate flow, auto-detects the best QR type, and prefills the form.
Scagen accepts text via custom URL scheme:
scagen://process-text?text=<urlencoded text>
Use an iOS Shortcut or share extension to forward selected text into Scagen.
MIT © oluwasniper and sonofnos