{"id":29799999,"url":"https://github.com/thesinghaman/studora","last_synced_at":"2026-04-11T01:35:35.538Z","repository":{"id":306823675,"uuid":"1026560855","full_name":"thesinghaman/studora","owner":"thesinghaman","description":"A cross-platform college community app for students to buy, sell, and negotiate items within campus using real-time messaging.","archived":false,"fork":false,"pushed_at":"2025-07-27T19:53:40.000Z","size":26896,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-27T21:38:20.684Z","etag":null,"topics":["appwrite","dart","flutter","lucide-react","nextjs","react","typescript"],"latest_commit_sha":null,"homepage":"https://studora.shop","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thesinghaman.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-07-26T06:12:08.000Z","updated_at":"2025-07-27T19:55:28.000Z","dependencies_parsed_at":"2025-07-27T21:50:20.602Z","dependency_job_id":null,"html_url":"https://github.com/thesinghaman/studora","commit_stats":null,"previous_names":["thesinghaman/studora"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/thesinghaman/studora","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thesinghaman%2Fstudora","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thesinghaman%2Fstudora/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thesinghaman%2Fstudora/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thesinghaman%2Fstudora/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thesinghaman","download_url":"https://codeload.github.com/thesinghaman/studora/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thesinghaman%2Fstudora/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267489780,"owners_count":24095804,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-28T02:00:09.689Z","response_time":68,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["appwrite","dart","flutter","lucide-react","nextjs","react","typescript"],"created_at":"2025-07-28T09:00:49.097Z","updated_at":"2026-04-11T01:35:35.527Z","avatar_url":"https://github.com/thesinghaman.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🎓 Studora\n\n\u003e A modern, cross-platform college marketplace application empowering students to buy, sell, rent, and report lost \u0026 found items within their campus community.\n\n[![Flutter](https://img.shields.io/badge/Flutter-3.8.1-02569B?logo=flutter)](https://flutter.dev)\n[![Appwrite](https://img.shields.io/badge/Appwrite-Backend-F02E65?logo=appwrite)](https://appwrite.io)\n[![Firebase](https://img.shields.io/badge/Firebase-FCM-FFCA28?logo=firebase)](https://firebase.google.com)\n[![License](https://img.shields.io/badge/License-Custom-blue.svg)](LICENSE)\n\n---\n\n## 📋 Table of Contents\n\n- [Overview](#-overview)\n- [Features](#-features)\n- [Tech Stack](#-tech-stack)\n- [Architecture](#-architecture)\n- [Prerequisites](#-prerequisites)\n- [Installation](#-installation)\n- [Configuration](#-configuration)\n  - [Appwrite Setup](#1-appwrite-setup)\n  - [Firebase Setup](#2-firebase-setup)\n  - [Appwrite Functions](#3-appwrite-functions-deployment)\n- [Project Structure](#-project-structure)\n- [Running the App](#-running-the-app)\n- [Contributing](#-contributing)\n- [License](#-license)\n\n---\n\n## 🌟 Overview\n\n**Studora** is a comprehensive campus marketplace solution designed specifically for college communities. Students can seamlessly buy and sell items, rent equipment, list lost \u0026 found items, and communicate through real-time messaging—all within a secure, college-verified environment.\n\n### 🎯 Key Highlights\n\n- **Real-Time Messaging**: Built-in chat system for negotiation and communication\n- **Multi-Category Support**: Marketplace, Rentals, Lost \u0026 Found\n- **Image Management**: Upload, crop, and manage item photos\n- **Push Notifications**: Firebase Cloud Messaging integration\n- **Offline Support**: Local caching with GetStorage and Hive\n- **Cross-Platform**: iOS and Android Support\n\n---\n\n## ✨ Features\n\n### 🛍️ Marketplace\n\n- Browse and search items by category\n- Post items for sale with multiple images\n- Price negotiation through integrated chat\n- Wishlist functionality\n- Filter by condition, price range, and category\n\n### 🏠 Rentals\n\n- List items for rent with daily/monthly rates\n- Set rental periods and availability\n- Manage rental requests\n\n### 🔍 Lost \u0026 Found\n\n- Report lost items with descriptions and photos\n- Browse found items by category\n- Contact finders directly through messaging\n\n### 💬 Real-Time Messaging\n\n- One-on-one chat with automatic conversation creation\n- Image sharing in messages\n- Read receipts and typing indicators\n- Message notifications\n\n### 👤 User Profile\n\n- Manage personal listings\n- Update profile information and avatar\n- Block users and report content\n\n---\n\n## 🛠️ Tech Stack\n\n### Frontend (Flutter App)\n\n- **Framework**: Flutter 3.8.1+\n- **State Management**: GetX\n- **Local Storage**: Hive, GetStorage\n- **Networking**: Appwrite SDK\n- **UI Components**: Custom Material Design\n- **Image Handling**: image_picker, image_cropper, cached_network_image\n\n### Backend (Appwrite)\n\n- **Authentication**: Email/Password\n- **Database**: NoSQL Collections\n- **Storage**: Cloud Storage for images\n- **Realtime**: WebSocket subscriptions\n- **Functions**: Dart serverless functions (Single Monolithic Function)\n\n### Push Notifications\n\n- **Service**: Firebase Cloud Messaging (FCM)\n- **Local Notifications**: flutter_local_notifications\n\n---\n\n## 🏗️ Architecture\n\n```\n┌─────────────────────────────────────────────────────────────┐\n│                     Flutter Mobile App                      │\n│  ┌────────────┐  ┌────────────┐  ┌────────────────────┐     │\n│  │   UI Layer │  │ Controllers│  │  Services/Repos    │     │\n│  │   (Views)  │◄─┤   (GetX)   │◄─┤ (Business Logic)   │     │\n│  └────────────┘  └────────────┘  └────────────────────┘     │\n│                                            ▲                │\n└────────────────────────────────────────────┼────────────────┘\n                                             │\n                        ┌────────────────────┴──────────────────┐\n                        │         Appwrite Backend              │\n                        │  ┌──────────┐  ┌─────────────────┐    │\n                        │  │ Database │  │    Storage      │    │\n                        │  ├──────────┤  ├─────────────────┤    │\n                        │  │ Auth     │  │  Cloud Functions│    │\n                        │  ├──────────┤  ├─────────────────┤    │\n                        │  │ Realtime │  │   Permissions   │    │\n                        │  └──────────┘  └─────────────────┘    │\n                        └───────────────────────────────────────┘\n                                             ▲\n                        ┌────────────────────┴──────────────────┐\n                        │         Firebase                      │\n                        │  ┌──────────────────────────────┐     │\n                        │  │ Cloud Messaging (Push)       │     │\n                        │  └──────────────────────────────┘     │\n                        └───────────────────────────────────────┘\n```\n\n---\n\n## 📦 Prerequisites\n\nBefore you begin, ensure you have the following installed:\n\n- **Flutter SDK**: `\u003e= 3.8.1` ([Install Flutter](https://flutter.dev/docs/get-started/install))\n- **Dart SDK**: `\u003e= 3.8.1`\n- **Android Studio** or **VS Code** with Flutter extensions\n- **Xcode** (for iOS development on macOS)\n- **Node.js**: `\u003e= 18.x` (for local Appwrite Functions development)\n- **GitHub Account**: For hosting Appwrite Functions repositories\n- **Firebase CLI** (optional): For Firebase configuration\n\n---\n\n## 🚀 Installation\n\n### 1. Clone the Repository\n\n```bash\ngit clone https://github.com/thesinghaman/studora.git\ncd studora\n```\n\n### 2. Install Flutter Dependencies\n\n```bash\ncd studora-app\nflutter pub get\n```\n\n### 3. Install Appwrite Functions Dependencies\n\n```bash\ncd ../appwrite-functions\n\n# Install dependencies for all functions\nfor dir in */; do\n  cd \"$dir\"\n  npm install\n  cd ..\ndone\n```\n\n---\n\n## ⚙️ Configuration\n\n### 1. Appwrite Setup\n\n#### Step 1: Create Appwrite Project\n\n1. Go to [Appwrite Console](https://cloud.appwrite.io)\n2. Create a new project\n3. Note down your **Project ID** and **Endpoint URL**\n\n#### Step 2: Create Database \u0026 Collections\n\nCreate a database with the following collections:\n\n| Collection Name  | Purpose                           |\n| ---------------- | --------------------------------- |\n| `users`          | User profiles and metadata        |\n| `items`          | Marketplace \u0026 rental listings     |\n| `lostFoundItems` | Lost \u0026 found reports              |\n| `categories`     | Item categories                   |\n| `conversations`  | Chat conversations                |\n| `messages`       | Chat messages                     |\n| `countries`      | Supported countries               |\n| `colleges`       | College list with domains         |\n| `reports`        | User reports \u0026 content moderation |\n| `supportTickets` | User support requests             |\n| `legalDocuments` | Terms, Privacy Policy             |\n\n#### Step 3: Configure Collections Schema\n\n**Users Collection** (`users`):\n\n```javascript\n{\n  userId: string (required),\n  userName: string (required),\n  email: string (required),\n  collegeId: string (required),\n  rollNumber: string,\n  hostel: string,\n  dateJoined: datetime,\n  fcmToken: string,\n  userAvatarUrl: string,\n  userAvatarFileId: string,\n  wishlist: string[] (array),\n  blockedUsers: string[] (array),\n  reportedContent: string[] (array),\n  isOnline: boolean,\n  lastSeen: datetime,\n  showReadReceipts: boolean\n}\n```\n\n**Items Collection** (`items`):\n\n```javascript\n{\n  itemId: string (required),\n  title: string (required),\n  description: string,\n  price: number,\n  rentalPrice: number,\n  categoryId: string,\n  categoryType: string, // 'sale' or 'rental'\n  condition: string,\n  imageUrls: string[] (array),\n  imageFileIds: string[] (array),\n  sellerId: string,\n  sellerName: string,\n  sellerAvatarUrl: string,\n  collegeId: string,\n  status: string, // 'available', 'sold', 'rented'\n  createdAt: datetime,\n  updatedAt: datetime,\n  viewCount: number\n}\n```\n\n**Conversations Collection** (`conversations`):\n\n```javascript\n{\n  conversationId: string (required),\n  participants: string[] (array), // user IDs\n  participantNames: object,\n  participantAvatars: object,\n  lastMessage: string,\n  lastMessageType: string,\n  lastMessageTime: datetime,\n  unreadCounts: object,\n  relatedItem: object,\n  createdAt: datetime,\n  updatedAt: datetime\n}\n```\n\n**Messages Collection** (`messages`):\n\n```javascript\n{\n  messageId: string (required),\n  conversationId: string,\n  senderId: string,\n  text: string,\n  messageType: string, // 'text', 'image', 'system'\n  imageUrls: string[] (array),\n  imageFileIds: string[] (array),\n  readBy: string[] (array),\n  createdAt: datetime\n}\n```\n\n\u003e **Note**: Create indexes on frequently queried fields for better performance.\n\n#### Step 4: Create Storage Bucket\n\n1. Navigate to **Storage** in Appwrite Console\n2. Create a bucket named `items-images`\n3. Configure permissions:\n   - Read: `any()`\n   - Create: `users()`\n   - Update: `users()`\n   - Delete: `users()`\n\n#### Step 5: Configure Environment Variables\n\nCreate a `.env` file in the `studora-app/` directory and add your Appwrite configuration:\n\n```dotenv\n# Appwrite Configuration\nPROJECT_ENDPOINT=https://cloud.appwrite.io/v1\nPROJECT_ID=YOUR_PROJECT_ID\nAPPWRITE_DATABASE_ID=YOUR_DATABASE_ID\n\n# Collection IDs\nLEGAL_DOCUMENTS_COLLECTION_ID=YOUR_COLLECTION_ID\nCOUNTRIES_COLLECTION_ID=YOUR_COLLECTION_ID\nCOLLEGES_COLLECTION_ID=YOUR_COLLECTION_ID\nUSERS_COLLECTION_ID=YOUR_COLLECTION_ID\nITEMS_COLLECTION_ID=YOUR_COLLECTION_ID\nLOST_FOUND_ITEMS_COLLECTION_ID=YOUR_COLLECTION_ID\nCATEGORIES_COLLECTION_ID=YOUR_COLLECTION_ID\nCONVERSATIONS_COLLECTION_ID=YOUR_COLLECTION_ID\nMESSAGES_COLLECTION_ID=YOUR_COLLECTION_ID\nREPORTS_COLLECTION_ID=YOUR_COLLECTION_ID\nSUPPORT_TICKETS_COLLECTION_ID=YOUR_COLLECTION_ID\n\n# Storage Bucket ID\nITEMS_IMAGES_BUCKET_ID=YOUR_BUCKET_ID\n\n# Function ID (will be filled after deploying functions)\nSTUDORA_BACKEND_FUNCTION_ID=\n```\n\n---\n\n### 2. Firebase Setup\n\n#### Step 1: Create Firebase Project\n\n1. Go to [Firebase Console](https://console.firebase.google.com)\n2. Create a new project\n3. Add Android and iOS apps\n\n#### Step 2: Configure Android\n\n1. Download `google-services.json`\n2. Place it in `studora-app/android/app/`\n3. Ensure `build.gradle` includes Firebase plugin\n\n#### Step 3: Configure iOS\n\n1. Download `GoogleService-Info.plist`\n2. Place it in `studora-app/ios/Runner/`\n3. Update Xcode project settings\n\n#### Step 4: Generate Firebase Options\n\n```bash\ncd studora-app\n\n# Install FlutterFire CLI\ndart pub global activate flutterfire_cli\n\n# Configure Firebase\nflutterfire configure\n```\n\nThis will create `lib/firebase_options.dart` with your Firebase configuration.\n\n#### Step 5: Enable Cloud Messaging \u0026 Download Service Account\n\n1. In Firebase Console, navigate to **Cloud Messaging**\n2. Enable Firebase Cloud Messaging API\n3. Go to **Project Settings** → **Service Accounts**\n4. Click **Generate New Private Key**\n5. Download the JSON file (e.g., `serviceAccountKey.json`)\n6. **Save this file securely** - you'll need to upload it to Appwrite for push notifications\n\n---\n\n### 3. Appwrite Functions Deployment\n\nThe backend logic is consolidated into a single Dart function (`studora-backend`) for easier maintenance and deployment.\n\n#### Step 1: Push Backend to GitHub\n\nEnsure your `studora-backend` directory is committed and pushed to your GitHub repository.\n\n```bash\ngit add studora-backend/\ngit commit -m \"Add Dart Backend\"\ngit push origin main\n```\n\n#### Step 2: Connect Function in Appwrite Console\n\n1. Go to **Appwrite Console** → **Functions** → **Create Function**\n2. Click **Connect Git Repository**\n3. Authorize GitHub if not already connected\n4. Select your repository (e.g., `studora`)\n5. **Production Branch**: `main`\n6. **Root Directory**: `studora-backend`\n7. **Runtime**: Select `Dart 3.0` (or latest available)\n8. **Entrypoint**: `lib/main.dart`\n9. **Build Settings**:\n   - Build Command: `dart pub get`\n10. Click **Connect**\n\nAppwrite will automatically deploy the function from GitHub. Any future commits to the connected branch will trigger automatic redeployment.\n\n#### Step 3: Configure Environment Variables\n\nIn the Appwrite Console for your function, go to **Settings** → **Environment Variables** and add:\n\n- `APPWRITE_DATABASE_ID`: Your Database ID\n- `APPWRITE_USERS_COLLECTION_ID`: Users Collection ID\n- `APPWRITE_ITEMS_COLLECTION_ID`: Items Collection ID\n- `APPWRITE_CHATS_COLLECTION_ID`: Chats Collection ID\n- `APPWRITE_MESSAGES_COLLECTION_ID`: Messages Collection ID\n- ... (Add other collection IDs as needed)\n\n#### Step 4: Configure Push Notifications\n\nTo enable Firebase Cloud Messaging in Appwrite:\n\n1. Go to **Appwrite Console** → **Messaging** → **Providers**\n2. Click **Add Provider** → **FCM**\n3. **Upload Service Account JSON**:\n   - Click **Upload** and select your Firebase `serviceAccountKey.json` file\n   - This file is required for Appwrite to send push notifications\n4. Click **Create**\n\n#### Step 5: Update Function ID in App\n\nAfter deployment, copy the function ID from Appwrite Console and update your `.env` file in `studora-app/`:\n\n```dotenv\nSTUDORA_BACKEND_FUNCTION_ID=YOUR_FUNCTION_ID\n```\n\n---\n\n## 📁 Project Structure\n\n```\nstudora/\n├── studora-app/                    # Flutter mobile application\n│   ├── lib/\n│   │   ├── main.dart              # App entry point\n│   │   ├── firebase_options.dart  # Firebase configuration\n│   │   └── app/\n│   │       ├── bindings/          # GetX dependency injection\n│   │       ├── config/            # App configuration\n│   │       │   ├── navigation/    # Routes and pages\n│   │       │   └── theme/         # App theming\n│   │       ├── data/\n│   │       │   ├── models/        # Data models\n│   │       │   ├── providers/     # API providers\n│   │       │   └── repositories/  # Business logic layer\n│   │       ├── modules/           # Feature modules\n│   │       │   ├── auth/          # Authentication\n│   │       │   ├── home/          # Home dashboard\n│   │       │   ├── marketplace/   # Item listings\n│   │       │   ├── messages/      # Chat functionality\n│   │       │   ├── profile/       # User profile\n│   │       │   └── ...\n│   │       ├── services/          # Core services\n│   │       │   ├── appwrite_service.dart\n│   │       │   ├── notification_service.dart\n│   │       │   ├── logger_service.dart\n│   │       │   └── storage_service.dart\n│   │       └── shared_components/ # Reusable widgets \u0026 utils\n│   ├── android/                   # Android native code\n│   ├── ios/                       # iOS native code\n│   └── pubspec.yaml              # Flutter dependencies\n│\n├── studora-backend/               # Dart serverless backend\n│   ├── lib/\n│   │   ├── actions/              # Individual business logic actions\n│   │   │   ├── create_message.dart\n│   │   │   ├── get_public_listings.dart\n│   │   │   └── ...\n│   │   ├── utils/                # Backend utilities\n│   │   └── main.dart             # Main entry point (Router)\n│   └── pubspec.yaml              # Backend dependencies\n│\n└── README.md                      # This file\n```\n\n---\n\n## 🏃 Running the App\n\n### Development Mode\n\n```bash\ncd studora-app\n\n# Run on Android emulator/device\nflutter run\n\n# Run on iOS simulator/device (macOS only)\nflutter run\n\n# Run on Chrome (Web)\nflutter run -d chrome\n```\n\n### Production Build\n\n#### Android APK\n\n```bash\nflutter build apk --release\n```\n\nOutput: `build/app/outputs/flutter-apk/app-release.apk`\n\n#### iOS IPA\n\n```bash\nflutter build ios --release\n```\n\nThen use Xcode to archive and export IPA.\n\n### Debug Tips\n\n- Use `flutter doctor` to check for any setup issues\n- Enable verbose logging: `flutter run -v`\n- Check Appwrite logs in Console for backend issues\n- View Firebase logs in Firebase Console for FCM issues\n\n---\n\n## 🤝 Contributing\n\nWe welcome contributions! Please follow these steps:\n\n1. **Fork the repository**\n2. **Create a feature branch**\n   ```bash\n   git checkout -b feature/amazing-feature\n   ```\n3. **Commit your changes**\n   ```bash\n   git commit -m 'Add amazing feature'\n   ```\n4. **Push to the branch**\n   ```bash\n   git push origin feature/amazing-feature\n   ```\n5. **Open a Pull Request**\n\n---\n\n## 📄 License\n\nThis project is licensed under a **Custom Non-Commercial License**.\n\n**You are allowed to:**\n\n- ✅ View, study, and learn from the source code\n- ✅ Use the software for personal and educational purposes\n- ✅ Fork the repository for learning and experimentation\n\n**You are NOT allowed to:**\n\n- ❌ Sell, sublicense, or commercialize the software\n- ❌ Redistribute the software or substantial portions of it\n- ❌ Use it in any commercial product or service\n\nSee the [LICENSE](LICENSE) file for complete terms and conditions.\n\nFor commercial licensing inquiries, please contact the author.\n\n---\n\n## 🙏 Acknowledgments\n\n- **Flutter Team** - For the amazing framework\n- **Appwrite Team** - For the powerful backend solution\n- **Firebase Team** - For reliable push notifications\n- **GetX Community** - For state management insights\n\n---\n\n## 📧 Contact \u0026 Support\n\n- **Author**: Aman Singh\n- **GitHub**: [@thesinghaman](https://github.com/thesinghaman)\n- **Repository**: [studora](https://github.com/thesinghaman/studora)\n\nFor issues and feature requests, please use the [GitHub Issues](https://github.com/thesinghaman/studora/issues) page.\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n**Made with ❤️ for college communities**\n\n⭐ Star this repo if you find it helpful!\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthesinghaman%2Fstudora","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthesinghaman%2Fstudora","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthesinghaman%2Fstudora/lists"}