A second-hand marketplace for buyers and sellers.
List items. Make offers. Trade with confidence.
Buying and selling used goods is messy. Listings live across scattered marketplaces, communication happens in DMs that get lost, offers are tracked in screenshots, and trust between strangers is hard to establish. Sellers struggle to surface their items and buyers can't easily negotiate or browse confidently.
Thryft brings the full second-hand trade flow into a single mobile-first app: list items with photos, browse and filter by category, send offers, chat with a built-in assistant, manage orders and reviews, and keep a wishlist — all backed by secure authentication and a real-time database.
| Feature | Description |
|---|---|
| 🛍️ Browse & Search | Category-based browsing, keyword search, and a flexible filter system |
| 📸 Create Listings | Photo upload via image picker, category tagging, and price setting |
| 💬 Make Offers | Send, receive, accept, or decline offers on listings |
| 🛒 Cart & Orders | Add items to cart, place orders, and track sold items |
| ❤️ Wishlist | Save listings to revisit later |
| ⭐ Reviews | Leave and read reviews to build seller trust |
| 🤖 Navigation Assistant | In-app chat assistant to help users find their way around |
| 🔔 Notifications | In-app notification feed with unread badges |
| 🔐 Secure Auth | Email/password authentication with password reset via Supabase |
| 👤 Profiles | Public seller profiles, account settings, and listing management |
Framework Flutter 3 (Dart ^3.9.2)
State Management Provider
Routing go_router
Auth & Database Supabase (PostgreSQL + Row Level Security)
Images image_picker
Local Storage shared_preferences
Config flutter_dotenv (.env)
Platforms Android · iOS · Web · Windows · macOS · Linux
thryft/
├── android/ · ios/ · web/ · windows/ · macos/ · linux/ # Platform targets
├── assets/
│ └── images/ # Logo, banners, product imagery
├── lib/
│ ├── main.dart # App entry point
│ ├── router.dart # go_router route definitions
│ ├── models/
│ │ ├── product.dart # Listing/product model
│ │ ├── offer_model.dart # Buyer/seller offers
│ │ ├── chat_message.dart # Assistant chat messages
│ │ └── notification_model.dart # In-app notifications
│ ├── providers/ # Provider-based state
│ │ ├── cart_provider.dart
│ │ ├── create_listing_provider.dart
│ │ ├── wishlist_provider.dart
│ │ ├── offer_provider.dart
│ │ ├── search_provider.dart
│ │ ├── notification_provider.dart
│ │ ├── assistant_chat_provider.dart
│ │ ├── navigation_assistant.dart
│ │ ├── navigation_map.dart
│ │ └── chat_service.dart
│ ├── repositories/ # Data access (Supabase)
│ │ ├── auth_repository.dart
│ │ ├── listing_repository.dart
│ │ ├── create_listing_repository.dart
│ │ ├── order_repository.dart
│ │ └── trust_info_repository.dart
│ ├── services/
│ │ └── auth_validation.dart # Email/password validation
│ ├── screens/ # ~27 screens (home, auth, product
│ │ # detail, cart, offers, orders,
│ │ # reviews, profile, settings, …)
│ └── widgets/ # Reusable UI components
│ ├── header.dart · footer.dart · app_drawer.dart
│ ├── hero_banner.dart · category_section.dart
│ ├── product_card.dart · product_carousel.dart
│ ├── standard_product_grid.dart · search_dropdown.dart
│ ├── filter_system.dart · making_offer_system.dart
│ └── notification_badge.dart
├── test/ # Unit & widget tests
├── pubspec.yaml # Dependencies
├── .env # Supabase keys (not committed)
└── .env.test # Test Supabase keys for integration tests (not committed)
- Flutter SDK 3.x (Dart
^3.9.2) - A Supabase project (URL + anon key)
- An IDE with Flutter support — Android Studio, VS Code, or IntelliJ
- Platform tooling for your target (Android SDK / Xcode / Chrome / etc.)
git clone https://github.com/setap-4c/thryft.git
cd thryftflutter pub getCreate a .env file in the project root:
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_ANON_KEY=your-anon-keyThe .env file is loaded at startup via flutter_dotenv and is declared as an asset in pubspec.yaml.
Integration tests run against a separate Supabase test project so they never touch production data. To run them, create a .env.test file in the project root (next to pubspec.yaml) with the test project's credentials:
TEST_SUPABASE_URL=https://your-test-project.supabase.co
TEST_SUPABASE_ANON_KEY=your-test-anon-key
TEST_SUPABASE_SERVICE_KEY=your-test-service-role-keySee .env.test.example for the full template. Credentials for the shared team test project can be obtained from George / the team password manager. The service_role key bypasses Row Level Security and must be kept secret — .env.test is gitignored.
If .env.test is missing, integration test suites are skipped automatically rather than failing.
# Pick a connected device / emulator / browser
flutter devices
# Run
flutter run # default device
flutter run -d chrome # web
flutter run -d windows # Windows desktop# Unit & widget tests && integration tests (require .env.test — see above)
cd thryft; flutter test --dart-define-from-file=.env.test -j 1Thryft uses Supabase (PostgreSQL) with Row Level Security. The core entities accessed via the repository layer:
-- Users (managed by Supabase Auth + profile table)
users
├── id (uuid, PK)
├── email (text)
├── display_name (text)
└── created_at (timestamptz)
-- Marketplace listings
listings
├── id (uuid, PK)
├── seller_id (uuid, FK → users.id)
├── title (text)
├── description (text)
├── price (numeric)
├── category (text)
├── image_url (text)
├── status (text) -- active / sold / removed
└── created_at (timestamptz)
-- Offers on listings
offers
├── id (uuid, PK)
├── listing_id (uuid, FK → listings.id)
├── buyer_id (uuid, FK → users.id)
├── amount (numeric)
├── status (text) -- pending / accepted / declined
└── created_at (timestamptz)
-- Orders, reviews, notifications, wishlists
orders · reviews · notifications · wishlistsSign up / Log in
↓
Browse home feed ─┬─→ Search + filter
├─→ Open product detail
├─→ Add to wishlist / cart
└─→ Send offer to seller
↓
Seller accepts offer → Order created
↓
Buyer pays / collects → Review left on seller
↓
Notifications update both parties at each step
| Member | GitHub |
|---|---|
| Joyee Hing | up2245819 / Joyeehing |
| Konstantinos Savva | up2219830 / kotsiossav |
| Georgios Papageorgiou | up2227777 / geopadev |
| Abigail Hinchliffe | up2205638 / AbigailHinchliffe |
| Connor Watkin | up2306089 / Corezsl |
| Chrystalla Tambouri | up2257593 / ChrystallaT1 |
This project is developed for the SETAP module at the University of Portsmouth. All rights reserved by the contributing team.
Buy less new. Trade more good.