Developer: Chahinez Boutemine (Scaphix)
Match_up is a modern dating platform built with Django, designed to help people meet and connect in a simple, stress-free way. The goal was to keep things easy and intuitive — users can create profiles, upload photos, browse other profiles, and interact securely without being overwhelmed by unnecessary features.
I chose to build a dating app mainly because the idea sounded fun and genuinely interesting to implement. Dating platforms are very user-focused, which made this project a great way to think about real user journeys, design choices, and how people actually interact with an app. What started as a “simple” portfolio project quickly turned into a much bigger challenge than expected.
Along the way, I ran into several problems I didn’t anticipate at all — from authentication logic to handling user data and edge cases — many of which went well beyond the original scope of what I planned to build. While challenging at times, these hurdles pushed me to learn more about Django, problem-solving, and building something that feels realistic and usable. Overall, match_up became a project that was not only enjoyable to work on, but also a strong learning experience that helped me grow as a developer.
source: match_up amiresponsive
Important
match_up is built with Django, leveraging django-allauth for secure authentication and Cloudinary for reliable image storage.
Purpose
- Provide users with a safe, welcoming platform to create profiles and discover potential romantic matches.
- Enable authenticated users to browse profiles, express interest through likes, and connect when there's mutual interest.
- Facilitate meaningful connections through a mutual matching system that creates matches when two users like each other.
- Maintain user privacy and data security throughout the discovery, matching, and connection process.
Primary User Needs
- New users need an easy registration and profile creation process to get started quickly.
- Active users need the ability to browse profiles, express interest (like) or pass, and receive notifications when mutual matches occur.
- Users need to review their liked profiles and manage their connections through a dedicated matches page.
- Users need confidence that their data is secure and their privacy is protected.
- Users need clear visual feedback when interacting with profiles and seamless navigation throughout the platform.
Business Goals
- Foster a growing community of engaged users seeking relationships through mutual connections.
- Build trust through secure authentication, data handling, and transparent matching system.
- Provide a smooth, intuitive user experience that encourages profile completion and active engagement.
- Facilitate successful connections by ensuring users can easily discover, evaluate, and connect with potential matches.
Features (see below)
The MVP focuses on the essential user journey: Sign Up → Create Profile → Browse → Like/Pass → Match (For detailed user flow, refer to Structure).
- Authentication & Onboarding
- Sign up/login via Django-allauth
- Redirect to profile creation after signup
- Required fields: age (18+), gender, bio
- Optional fields: location, profile photo
- User Profiles
- One-to-one relationship with User model
- Fields: age (18+), gender, bio, location, optional profile picture
- Simple profile view and edit functionality
- Separate views:
ProfileDetail(view others by ID) andProfileAbout(current user's own profile)
- Discovery & Matching Flow
- Browse feed/list of compatible profiles
- Like or pass (dislike) actions via POST endpoints
- Prevent users from liking themselves
- Exclude already interacted profiles from feed (passed, liked, or matched)
- Matching System
- Mutual likes automatically create a Match record
- Simple "Matches" list showing all mutual matches
- Match creation handled via signals when both users like each other
- User Interface
- Clean, responsive base template
- Auth-aware navigation (shows login/logout based on authentication state)
- Basic profile browsing UI
- Flash messages for user feedback
- Admin & Development Tools
- Admin interface with filters and search
- Seed data management commands for local testing
- Profile validation and edge case handling
Information Architecture
- Navigation Menu:
- Links to Home, My Profile, Discover, Liked Profiles, Matches, and Logout.
- Contextual redirects for unauthenticated users to signup/login.
- Liked Profiles link appears conditionally when user has liked profiles.
- Hierarchy:
- Home page with call-to-action to get started.
- Discover page for browsing and interacting with profiles (like/pass).
- Profile detail views with comprehensive user information and photos.
- Matches page displaying mutual matches.
- Liked Profiles page showing all one-way likes for review.
- Profile management pages (create, edit, delete).
User Flow
- Unauthenticated users land on home page → view features → register for account.
- New users complete registration → redirected to profile creation.
- Users create profile → add photo, bio, interests, location, and demographics.
- Users browse profiles on Discover page → view profile cards → like or pass on profiles.
- When user likes a profile that has already liked them → automatic match created → user redirected to Matches page with notification.
- Users view their matches → see mutual connections → access detailed profile views.
- Users can review all profiles they've liked on Liked Profiles page → revisit and view details.
- Users can view detailed profile information from any page → navigate back to previous page seamlessly.
- Users manage their profile → edit or delete as needed throughout their journey.
Content Requirements
- User registration and authentication system (Django Allauth).
- Profile creation with photos (Cloudinary), bio, interests, and demographic information (age, gender, location).
- Profile management (create, update, delete) with comprehensive editing capabilities.
- Profile discovery and browsing system showing profiles users haven't interacted with yet.
- Like and Pass functionality allowing users to express interest or skip profiles.
- Mutual matching system that automatically creates matches when two users like each other.
- Matches page displaying all mutual matches with match details.
- Liked profiles page showing all one-way likes for review and revisiting.
- Detailed profile view with full information display and navigation back to previous page.
- New match notifications with automatic redirect to matches page when a mutual match occurs.
- Visual feedback animations (fade-out effects) when liking or passing on profiles.
- Responsive design for seamless experience across mobile, tablet, and desktop devices.
Wireframes (see below)
Visual Design Elements
- Colours (see below)
- Typography (see below)
I used coolors.co to generate my color palette.
#FFF9F8neutral backgrounds for clean design.#FF5A7Aprimary accent color for call-to-action buttons.#FF2F9Bsecondary accent for hover states and highlights.#C7A7FFtertiary color for subtle elements.#1A1A1dark text for readability.
- Poppins was used for primary headers and titles.
- Inter was used for all body text.
- Montserrat was used for secondary content.
- Font Awesome icons were used throughout the site for visual clarity and user guidance.
To follow best practice, wireframes were developed for mobile, tablet, and desktop sizes using Balsamiq.
| Page | Mobile | Tablet | Desktop |
|---|---|---|---|
| Home | ![]() |
![]() |
![]() |
| Register | ![]() |
![]() |
![]() |
| Login | ![]() |
![]() |
![]() |
| Edit/Delete Profile | ![]() |
![]() |
![]() |
| Browse Profiles | ![]() |
![]() |
![]() |
| Liked Profiles | ![]() |
![]() |
![]() |
- Epic 1 : User Accounts & Profiles
- Epic 2 : Browsing Users & Rating
- Epic 3: Chat & Messaging
I've decomposed my Epics into User Stories for prioritizing and implementing them. Using this approach, I was able to apply "MoSCoW" prioritization and labels to my User Stories within the Issues tab.
- Must Have: guaranteed to be delivered - required to Pass the project.
- Should Have: adds significant value, but not vital.
- Could Have: has small impact if left out.
- Future Log: not a priority for this iteration - future features.
- Messaging: Real-time chat functionality allowing matched users to communicate directly within the platform.
- Tracking unread matches: Showing notifications for new matches even if user wasn't redirected, with persistent indicators across the application.
- Search & Filters: Advanced filtering by age, location, interests, and gender to help users find more relevant matches.
- Profile Verification: Phone or identity verification badges to increase trust and authenticity on the platform.
- Safety Features: Block user and report features for community safety and user protection.
- Activity Tracking: Show last seen status or activity level to indicate user engagement.
- Advanced Analytics: Dashboard for users showing profile views, match history, and interaction statistics.
- SEO Optimization: Implement features for SEO, such as meta tags, custom URLs, and keywords for better search engine ranking.
- Convert Contact to an individual app and model.
- Convert FAQs to an individual app and model.
Entity Relationship Diagrams (ERD) help visualize database architecture before and during development.
I have used Mermaid to generate an interactive ERD of my project.
Summary of Diagram:
Shows four entities: User, Profile, Like, Match, and Message. Relationships: Each Profile is associated to exactly one User (1:1). Like and Match both reference two User foreign keys, modeling user-to-user relationships. Each Message is sent from a User and belongs to a Match. This gives you a solid visual of the relationships and main fields in your data model! You can add further fields or constraints as needed.
erDiagram
direction TB
Profile ||--|| User : "has"
Like }o--|| User : "from_user"
Like }o--|| User : "to_user"
Match }o--|| User : "user1"
Match }o--|| User : "user2"
Message }o--|| Match : "belongs to"
Message }o--|| User : "sender"
User {
int id PK
string username
}
Profile {
int id PK
int user_id FK "references User"
string bio
int age "18-100"
string gender "M/F/O"
string location
string profile_picture "ImageField"
datetime created_at
datetime updated_at
boolean is_profile_complete
}
Like {
int id PK
int from_user_id FK
int to_user_id FK
string action "like/dislike"
datetime created_at
}
Match {
int id PK
int user1_id FK
int user2_id FK
datetime created_at
boolean is_active
}
Message {
int id PK
int match_id FK
int sender_id FK
string content
datetime created_at
boolean is_read
datetime read_at
}
GitHub Projects served as an Agile tool for this project. Through it, EPICs, User Stories, issues/bugs, and Milestone tasks were planned, then subsequently tracked on a regular basis using the Kanban project board.
GitHub Issues served as an another Agile tool. There, I managed my User Stories and Milestone tasks, and tracked any issues/bugs.
| Link | Screenshot |
|---|---|
![]() |
|
![]() |
Note
For all testing, please refer to the TESTING.md file.
Note
For the developpement process and Bugs documentation, please refer to the DEBUGGING.md file.
The live deployed application can be found deployed on Heroku.
This project uses Heroku, a platform as a service (PaaS) that enables developers to build, run, and operate applications entirely in the cloud.
Deployment steps are as follows, after account setup:
- Select New in the top-right corner of your Heroku Dashboard, and select Create new app from the dropdown menu.
- Your app name must be unique, and then choose a region closest to you (EU or USA), then finally, click Create App.
- From the new app Settings, click Reveal Config Vars, and set your environment variables to match your private
env.pyfile.
Important
This is a sample only; you would replace the values with your own if cloning/forking this repository.
| Key | Value |
|---|---|
CLOUDINARY_URL |
user-inserts-own-cloudinary-url |
DATABASE_URL |
user-inserts-own-postgres-database-url |
DISABLE_COLLECTSTATIC |
1 |
SECRET_KEY |
any-random-secret-key |
Heroku needs some additional files in order to deploy properly:
You can install this project's requirements.txt using:
pip3 install -r requirements.txt
If you have your own packages that have been installed, then the requirements file needs updated using:
pip3 freeze --local > requirements.txt
The Procfile can be created with the following command:
echo web: gunicorn match_up.wsgi > Procfile
The .python-version file tells Heroku the specific version of Python to use when running your application.
3.12(or similar)
For Heroku deployment, follow these steps to connect your own GitHub repository to the newly created app:
Either (recommended):
- Select Automatic Deployment from the Heroku app.
Or:
- In the Terminal/CLI, connect to Heroku using this command:
heroku login -i - Set the remote for Heroku:
heroku git:remote -a app_name(replaceapp_namewith your app name) - After performing the standard Git
add,commit, andpushto GitHub, you can now type:git push heroku main
The project should now be connected and deployed to Heroku!
This project uses the Cloudinary API to store media assets online.
To obtain your own Cloudinary API key:
- Create an account and log in to Cloudinary.
- For "Primary Interest", choose Programmable Media for image and video API.
- On your Cloudinary Dashboard, copy your API Environment Variable.
- Be sure to remove the leading
CLOUDINARY_URL=as part of the API value; this is the key.cloudinary://123456789012345:AbCdEfGhIjKlMnOpQrStuVwXyZa@1a2b3c4d5)
- This goes into your
env.pyfile and Heroku Config Vars as the keyCLOUDINARY_URL.
This project uses a Code Institute PostgreSQL Database for the Relational Database with Django.
Caution
- PostgreSQL databases by Code Institute are only available to CI Students.
- You must acquire your own PostgreSQL database through some other method if you plan to clone/fork this repository.
- Code Institute students are allowed a maximum of 8 databases.
- Databases are subject to deletion after 18 months.
To obtain a PostgreSQL database from Code Institute, I followed these steps (CI students only):
- Submitted my email address to the CI PostgreSQL Database link above.
- An email was sent to me with my new Postgres Database.
- The Database connection string will resemble:
postgres://<db_username>:<db_password>@<db_host_url>/<db_name>
- You can use the above URL with Django; simply paste it into your
env.pyfile and Heroku Config Vars asDATABASE_URL.
Other options:
- Option 1: Use a third-party provider like Heroku PostgreSQL or Railway.
- Option 2: UseAmazon RDS for managed database hosting.
Note
: superuser must be recreated after database resets.
Caution
Default db.sqlite3 DB should not be included in Git, It’s a generated, environment-specific file; committing it causes various issues: Issues:
- Causes merge conflicts
- Exposes local data
- File becomes stale when switching database backends
- Increases repository size unnecessarily
Note
Recommended: Add db.sqlite3 (and other local database files) to .gitignore and remove it from Git history if already tracked. Keep only migration files under version control.
This project uses WhiteNoise to serve static files on Heroku.
To include WhiteNoise in your own projects:
- Install the package:
pip install whitenoise - Update requirements:
pip freeze --local > requirements.txt - Edit
settings.pyand add toMIDDLEWARE:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
# other middleware
]This project can be cloned or forked to make a local copy on your own system.
You will need to install packages from requirements.txt:
pip3 install -r requirements.txt
Create a new file called env.py at the root-level with environment variables:
import os
os.environ["SECRET_KEY"]= "any-random-secret-key"
os.environ.setdefault("DATABASE_URL", "user-inserts-own-postgres-database-url")
os.environ["CLOUDINARY_URL"]="user-inserts-own-cloudinary-url"To run locally:
- Start the Django app:
python3 manage.py runserver - Stop the app:
CTRL+C(Windows/Linux) or⌘+C(Mac) - Make migrations:
python3 manage.py makemigrationsthenpython3 manage.py migrate - Create a superuser:
python3 manage.py createsuperuser - Run the app again:
python3 manage.py runserver
- Go to the GitHub repository.
- Click the green "Code" button and select your preferred clone method (HTTPS, SSH, or GitHub CLI).
- Copy the URL to your clipboard.
- Open your terminal and type:
git clone https://www.github.com/Scaphix/match_up.git - Press "Enter" to create your local clone.
- Log in to GitHub and navigate to the GitHub Repository.
- Click the "Fork" button in the top-right corner.
- You now have a copy of the repository in your own GitHub account!
There are no significant differences between the local development version and the deployed version on Heroku. The application functions consistently across both environments with the same features and user experience.
| Source | Notes |
|---|---|
| Django Documentation | Official Django framework documentation |
| django-allauth | User authentication and account management |
| Bootstrap Documentation | Responsive framework and components |
| Cloudinary API Docs | Cloud image storage and management |
| Stack Overflow | Troubleshooting and debugging assistance |
| ChatGPT | Help with code logic and explanations |
| Code Institute | Django and full-stack development education |
| Django Recipe Sharing Tutorial | Tutorial from developper Dee Mc |
| Source | Notes |
|---|---|
| Font Awesome | Icons used throughout the site |
| Google AI Studio | Background images and visual assets |
| Favicon.io | Site favicon generation |
-
I would like to thank my Code Institute mentors, Tim Nelson for his valuable guidance and constructive feedback throughout this project, including during the holiday period.
-
I would like to thank my husband for his help and support throughout the development of this project.























































