02 — Personal Project · Flutter Mobile Development · Full-Stack
Friend.ship
Role
Group Project
Stack
Flutter · Supabase · Dart
Platform
Android (iOS-ready)
Type
Social Event Coordination
~30
Dart source files
6
Core CRUD modules
4
Auth + social screens
3
Supported cities
01 — Overview

Social planning
with a real backend,
not another chat thread.

Friend.ship is a cross-platform mobile application built with Flutter and Dart that enables users to create, discover, and coordinate social events with their friend groups. Backed by Supabase (PostgreSQL), it delivers real-time event management, a bidirectional social graph, group-based planning, and an invite system powered by WhatsApp deep links and QR codes.

The application was designed from the ground up to feel social-first: users discover events nearby, see what their friends are organising, join friend groups, and track their activity through a gamified trophy system — all within a clean, responsive mobile interface.

Structurally, the codebase is built for maintainability from day one — repository pattern, Provider-based state management, and component-based UI that survives feature growth without a rewrite. Built collaboratively with a small team, applying Agile practices and version control discipline throughout.

💡 Why This Exists
Coordinating social plans with friends means juggling WhatsApp, Instagram DMs, and half-finished calendar invites. There is no single source of truth. Friend.ship is a product answer to that friction — a focused planning layer that sits on top of existing social connections without replacing how people communicate. Built because the problem was real, not hypothetical.

02 — Problem Solved
💬
No centralised event hub
Friends scatter plans across WhatsApp, Instagram, and text messages with no single source of truth. Events get lost in threads and chats from days ago.
🔍
No easy friend discovery
Adding contacts requires sharing phone numbers or social handles manually. There is no frictionless way to find and connect with people you already know.
👥
No group planning tools
Creating events for a specific friend circle required building them individually per contact. Group coordination had no dedicated infrastructure to support it.
📅
No personal event tracking
Users had no way to track upcoming commitments or past social activity in one place. Attendance confirmation lived in message threads, not a calendar.

03 — Technology Stack
Flutter / Dart
Frontend Framework
Cross-platform mobile development targeting Android first, iOS-ready. Component-based widget library keeps screens composable and screens maintainable as features grow.
Supabase
PostgreSQL Backend
Real-time DB, auth, and file storage on PostgreSQL. Row-level security rules enforced at the database level. Collections for users, events, groups, and friend relationships.
Supabase Auth
Authentication
Email/password login with session persistence and secure sign-out. Auth callbacks handled through uni_links for cross-app deep link navigation.
Provider Pattern
State Management
Reactive UI updates decoupled from Supabase streams. Global AppBarProvider and UserData singleton manage shared app state without prop drilling.
Google Maps / uni_links
Deep Linking & Geo
Custom URI schemes (miapp://) for cross-app navigation. Location-based event discovery with geolocation support for Valencia, Alicante, and Castellón.
qr_flutter / calendar_view
Utilities
QR code generation for frictionless friend invitations. Day-view calendar with colour-coded entries distinguishing own events from friend events.

04 — Key Features
Event management
Full CRUD Event Lifecycle
Create → discover → detail view → edit → delete with full Supabase persistence. Events tagged to cities with 4 category filters: Music, Party, Gastronomy, and Adventure.
Social graph
Bidirectional Friend System
Users share a unique deep link via WhatsApp or display a QR code. The receiver taps to open the app and confirm the friend connection — no phone numbers needed.
Group planning
Friend Groups & Group Events
Create named groups, add members, and publish group-specific events tied to the group identity. Membership validated server-side through Supabase RLS.
Calendar
Personal Event Calendar
Day-view calendar that auto-updates on event creation. Color-coded entries distinguish your own events from ones friends have created and invited you to.
Gamification
Trophy & Reward System
Trophy system rewarding event creation milestones at 1, 25, and 50 events, displayed on the user profile. Reward logic that encourages active participation.
Resilience
Offline-Resilient Design
Supabase cache and Flutter state management ensure graceful degradation during connectivity issues. Critical data stays available and syncs on reconnection.

05 — Architecture Decisions
Repository Pattern
All database queries centralised in the Consultas class — data access fully abstracted from UI logic. The architecture is migration-proof: swapping Supabase for another backend requires no UI rewrites.
Supabase RLS Security
Row-level security enforced at database level, not client-side. Event edit/delete restricted to creators. Group events tied to group ownership. No trust placed in the frontend.
Provider State Layer
Reactive UI updates decoupled from Supabase streams via Provider. A global AppBarProvider and UserData singleton manage shared state across screens without tight coupling.
Deep Link Routing
Custom URI schemes (miapp://) and Supabase auth callbacks handled through uni_links. Cross-app navigation works seamlessly — WhatsApp invite taps open the app at the right screen.
Component-Based UI
Reusable widget library — EventoWidget, GroupsWidget, FiltroWidget — keeps screens composable. New screens are assembled, not written from scratch. Maintenance cost stays low.
Real-Time Sync
Calendar auto-updates on event creation. Group membership reflected instantly across connected clients. Supabase real-time streams propagate changes without polling.

06 — Feature Validation
Event Creation
Full CRUD flow — create, view, edit, delete — with Supabase persistence verified end-to-end.
Friend System
Bidirectional friend graph via WhatsApp deep link, QR code, and URI scheme confirmed working on device.
Real-Time Sync
Calendar auto-updates on event creation. Group membership changes reflected instantly across sessions.
Scalability
Supabase PostgreSQL backend validated for concurrent multi-user access with no degradation in query response times.
Auth Flow
Email/password login, session persistence across app restarts, and secure sign-out tested end-to-end.
Role Access
Event edit/delete restricted to creator. Group events tied to group ownership. All enforced at database level via Supabase RLS.

07 — Future Roadmap
01
ML Event Matching
Recommend events based on user history and social graph connections — personalised discovery without manual browsing.
02
iOS Expansion
Leverage Flutter's cross-platform capabilities for App Store deployment. Core architecture already supports it.
03
In-App Messaging
Real-time group chat tied to friend groups and events — keeping all coordination in one place.
04
Push Notifications
Firebase FCM integration for event reminders and friend request alerts. Keep users engaged without them opening the app first.
05
Map Integration
Google Maps embedded view for visualising event locations geographically — pinning where things are happening, not just listing them.
06
Expanded Coverage
Extend location support beyond the initial 3 cities. Configurable city onboarding to let communities self-organise.

08 — Skills Demonstrated
Full-Stack Mobile Dev
Flutter, Dart, and Supabase backend integration built end-to-end as part of a team. From auth to real-time sync to QR-based invites.
Real-Time Data Sync
Supabase streams and reactive UI patterns. Calendar and group membership updates propagate instantly — no polling, no stale state.
Social Feature Design
Bidirectional friend graphs, QR invite flows, group membership, and deep link routing — a complete social layer built from scratch.
Auth & Security
Supabase RLS enforced at database level. Role-based access with zero trust in client-side checks. Session management tested end-to-end.
System Architecture
Repository pattern, Provider state layer, and component-based UI design that survives feature growth and backend migrations.
Gamification Design
Trophy and reward system with milestone-based logic. Engagement mechanics that encourage participation without disrupting the core UX.