COMMON — Community Resource Sharing Platform
A community-based resource-sharing platform that enables residents to discover, lend, and borrow underutilized items. Built around the idea of Share more. Own less. Access together.
Live: https://joincommon-beta.vercel.app/ · Status: Beta
Repository: GitHub
1. Problem & Users
Many households own items that are only used occasionally, such as tools, cameras, projectors, and other equipment. Meanwhile, people in their neighborhoods may need those same items but have little reason to purchase them permanently.
Traditional rental services are not always suitable for resource sharing at the neighborhood level. On the other hand, borrowing through private conversations or group chats often makes it difficult to discover available items, coordinate borrowing arrangements, and keep track of returns.
COMMON is designed for residents within local communities who want to make better use of shared resources, reduce unnecessary purchases, and build stronger social connections.
2. Role & Scope
I worked as the Founder & Full-Stack Developer, taking responsibility for the project from initial product concept and planning through technical implementation.
Areas of responsibility:
- Defining the product concept and core user flows
- Designing and developing the frontend interface
- Implementing authentication and community-based features
- Designing database structures and relationships
- Developing borrowing request workflows and status management
- Integrating the frontend with Supabase
- Implementing database functions for critical operations
- Deploying the beta application through Vercel
The project focuses on establishing the core foundation of a resource-sharing platform. Large-scale community management, operational moderation, and real-world usage validation remain part of its future development.
3. Key Decisions
Community-first, Not Marketplace-driven
COMMON was designed with communities at the center of the user experience, rather than as a simple collection of item listings.
Users can discover resources within their own communities, creating a more collaborative sharing experience compared to conventional marketplaces or rental services.
Owner Approval for Borrowing Requests
Every borrowing request requires approval from the item owner before it can proceed.
This approach gives owners control over when and to whom their items are lent, rather than relying on an automatic reservation system.
Separating Item and Borrowing Statuses
Item availability is managed separately from borrowing request statuses to maintain data consistency and give each entity a clearly defined responsibility within the system.
Item statuses:
availableborrowedunavailable
Borrowing request statuses:
pendingapprovedrejectedcancelledreturnedoverdue
This separation provides a clearer foundation for managing inventory availability and the borrowing lifecycle independently.
Database-Level Business Logic
Critical operations do not rely entirely on frontend state changes.
I implemented PostgreSQL functions to handle borrowing status transitions, centralizing business rules, improving consistency, and reducing the risk of invalid data modifications.
Supabase as the Backend Foundation
Supabase was chosen as the backend foundation because it provides PostgreSQL and authentication within a single platform.
This approach enables the implementation of core features without having to build and maintain a separate backend infrastructure from the beginning.
4. Architecture
COMMON follows a web application architecture with Supabase serving as its primary backend platform.
System flow:
User → Next.js Application → Authentication & Application Logic → Supabase
Core components:
- Frontend: Next.js, React, TypeScript, and Tailwind CSS
- Authentication: Supabase Auth
- Database: PostgreSQL
- Backend Operations: Supabase RPC and PostgreSQL functions
- Deployment: Vercel
Core Borrowing Flow
- Users discover available items within their communities.
- Users submit borrowing requests.
- Item owners review incoming requests.
- Owners approve or reject the requests.
- Once approved, the borrowing period is managed by the system.
- After an item is returned, the borrowing status is updated accordingly.
Database Operations
Critical operations are handled through PostgreSQL functions:
approve_borrow_requestreject_borrow_requestcancel_borrow_requestreturn_borrowed_item
The approval process also uses a database-level exclusion constraint to prevent overlapping borrowing periods for the same item.
This approach helps preserve data integrity, including when multiple borrowing requests are submitted concurrently.
5. Challenges & Trade-offs
Maintaining Borrowing Status Consistency
The borrowing lifecycle involves multiple users and several status transitions. Updating item statuses and borrowing request statuses independently could lead to data inconsistencies.
To address this, I separated item statuses from borrowing request statuses and moved critical operations into database functions, allowing state changes to be managed through centralized business logic.
Preventing Overlapping Borrowing Schedules
Multiple users may submit requests for the same item with overlapping borrowing periods.
Frontend validation alone is insufficient because requests can occur concurrently. I implemented a database-level exclusion constraint to help prevent conflicts between approved borrowing periods.
Balancing Flexibility and Complexity
Community features, resource discovery, and borrowing workflows can introduce significant system complexity.
I prioritized the core resource-sharing experience as the foundation before introducing additional features whose requirements had not yet been validated.
Infrastructure and Deployment
The beta frontend is deployed through Vercel, with Supabase serving as the backend.
This approach keeps the infrastructure lightweight and supports continuous development without the overhead of independently managing server infrastructure.
6. Results & Proof
- Successfully deployed a publicly accessible beta application
- Implemented core item discovery and borrowing workflows
- Integrated Supabase for authentication and data persistence
- Implemented database functions to handle critical borrowing operations
- Applied database-level constraints to maintain borrowing schedule consistency
Live: https://joincommon-beta.vercel.app/
Repository: https://github.com/Hamzahzahh09/COMMON
Quantitative metrics such as active users, registered communities, completed borrowing transactions, and retention rates are not yet available or verified.
7. Lessons Learned
COMMON taught me that building a full-stack application is not just about implementing features. It also requires maintaining data integrity, managing state transitions, handling access control, and considering how users interact with the system in real-world scenarios.
Throughout this project, I gained practical experience in relational database design, implementing database-level business logic, and connecting frontend workflows with backend operations.
One of the most important lessons was that critical business logic should not rely entirely on the client. Using database functions and constraints provides a more consistent and reliable foundation for application behavior.
If I continue developing COMMON, my next priorities would be conducting usability testing with real communities, improving the onboarding experience, introducing monitoring, and evaluating whether the platform genuinely helps residents share resources more effectively.