Install Flutter and Android Studio, create a Flutter app, add the supabase_flutter package with your project URL and anon key, build sign-in and a list screen backed by a table with row-level security, run it on an emulator and build an APK to share. Everything is free; publishing to the Play Store costs a one-time fee.
Tools you need
The 10 steps
Install Flutter and Android Studio
Follow the Flutter install guide for your OS, install Android Studio with an emulator, and run flutter doctor until it reports no blocking issues.
Create the app
flutter create my_list_app, then flutter run on the emulator to confirm the counter app works.
Create a Supabase project and table
Create a free project. In the SQL editor create an items table with id, user_id (default auth.uid()), title, done and created_at; enable row-level security and add a policy that lets users read and write only their own rows.
Add the package
Add supabase_flutter to pubspec.yaml and run flutter pub get. In main.dart, call Supabase.initialize(url: ..., anonKey: ...) before runApp. Keep keys in a config file that is ignored by Git, or use --dart-define.
Build sign-in
A screen with an email field that calls supabase.auth.signInWithOtp(email: ...), and a listener on onAuthStateChange that moves to the list screen when signed in. Set the deep link or site URL in Supabase Auth settings for the magic link.
Build the list screen
Load items with supabase.from('items').select(), add with insert, toggle done with update, and delete. Use a FutureBuilder or a simple state class.
Make it feel like an app
Add pull-to-refresh, an empty state and a floating action button. Keep one accent colour and system fonts.
Test on a device
Enable developer mode on an Android phone, connect by USB and flutter run. Fix anything that only shows on a real device, such as keyboard overlap.
Build the APK
flutter build apk --release. Share the file from build/app/outputs/flutter-apk/ through a GitHub Release so others can install it.
Document
Screenshots, a short demo video, the data model and the row-level security policy in the README.
Make it yours
- Offline cache with a local database and sync on reconnect.
- Push notifications with Firebase Cloud Messaging (free).
- Photo attachments using Supabase Storage.
Troubleshooting
| Problem | Fix |
|---|---|
| Magic link opens the browser but not the app | Configure a deep link (app scheme) in Android and add it to Supabase redirect URLs. |
| Insert fails | The policy requires a signed-in user and user_id must default to auth.uid(). |
| Emulator is slow | Enable hardware acceleration in Android Studio or test on a real phone. |
Frequently asked questions
Can I publish the app for free?
You can build and share an APK for free. Publishing on Google Play needs a developer account with a one-time fee; the Apple App Store needs a yearly fee and a Mac.
Flutter or React Native?
Both work with Supabase. Flutter has a simpler setup for beginners; React Native suits people who already know React.
Is Supabase enough as a backend?
For most student apps, yes: auth, database, storage and row-level security without writing a server.
Learn this with mentors
Programmes for builders and engineers with admissions open: live classes, mentors and project work.





