A surplus-food marketplace that helps restaurants turn unsold food into affordable meals instead of waste.
Kairos is the evolution of the original Food Connect project. It connects restaurants with customers looking for discounted surplus food, giving restaurants a way to recover value from unsold meals while helping customers find affordable food.
Kairos has two main user roles:
- Customers can browse available surplus-food listings, search and filter them, claim food, and receive a confirmation code for pickup.
- Restaurant owners can create food listings, upload food images, manage their listings, view claims/revenue statistics, and verify customer confirmation codes.
Restaurant
│
│ Lists surplus food
▼
Kairos
│
│ Customers browse & claim
▼
Customer
│
│ Shows confirmation code
▼
Restaurant verifies pickup
- Account registration and login
- Browse available food listings
- Search by food, restaurant, or category
- Sort by:
- Newest
- Price: Low to High
- Price: High to Low
- Distance
- Filter by:
- Category
- Delivery availability
- Pickup availability
- Maximum price
- Claim available food
- Receive a unique confirmation code
- View previously claimed food
- View pickup information
- Owner account registration
- Restaurant profile creation
- Restaurant dashboard
- Create surplus-food listings
- Upload food images
- Set price and quantity
- Set pickup time
- Enable delivery/pickup options
- View active and claimed listings
- Track meals saved
- Track revenue earned
- Delete listings
- Verify customer confirmation codes
- HTML
- CSS
- JavaScript
- Tailwind CSS
- Remix Icon
- Supabase
- PostgreSQL database
- Authentication
- Storage
- Database API
Kairos currently uses three main application tables:
user_profilesrestaurantsfood_listings
Food images are stored in the food-images Supabase Storage bucket.
auth.users
│
├── user_profiles
│ └── user_type: user | owner
│
├── restaurants
│ └── owner_id
│
└── food_listings
├── created_by
└── claimed_by
A food listing contains information such as:
- Restaurant name
- Description
- Price
- Category
- Quantity
- Pickup time
- Delivery availability
- Pickup availability
- Distance
- Image URL
- Availability status
- Claiming user
- Confirmation code
- Creation/update timestamps
Kairos uses Supabase Authentication with email/password login.
During registration, users select either:
Customer
or
Restaurant Owner
The selected role is stored in the user's profile and determines which dashboard they receive after authentication.
When a customer claims a listing:
- Kairos checks the authenticated user.
- The selected listing is marked unavailable.
- The customer is recorded as the claimant.
- A confirmation code is generated.
- The claim is saved locally for the customer's claim history.
- The restaurant owner can verify the confirmation code.
Example:
Food Listing
↓
Customer clicks "Claim Now"
↓
Listing becomes unavailable
↓
Confirmation Code generated
↓
Customer shows code at restaurant
↓
Restaurant verifies code
The project is intentionally lightweight and uses a frontend-first architecture.
Kairos/
├── index.html
├── app.js
├── config.js
├── styles.css
├── README.md
└── sql queries.txt
File names may differ depending on the current deployment/repository structure.
Kairos initializes a Supabase client using the project URL and Supabase anonymous key.
The application expects a configuration similar to:
const SUPABASE_URL = 'YOUR_SUPABASE_URL';
const SUPABASE_ANON_KEY = 'YOUR_SUPABASE_ANON_KEY';Never commit a Supabase service-role key or other privileged secret to the frontend.
For a public browser application, the Supabase anonymous key is intended to be used client-side, while database permissions should be enforced through Supabase security policies.
Because Kairos is a browser-based application, it can be run locally using a simple static web server.
For example:
git clone <your-repository-url>
cd KairosThen serve the project with any static development server.
You can also use VS Code's Live Server extension for local development.
Kairos is designed to be deployed as a static frontend connected to Supabase.
A typical deployment looks like:
GitHub
│
▼
Static Hosting
│
└──────────────► Supabase
├── Auth
├── PostgreSQL
└── Storage
Suitable static hosting platforms include:
- Netlify
- Vercel
- GitHub Pages (if the application configuration supports it)
After deployment, configure the Supabase authentication redirect/site URLs to match the deployed domain.
Kairos uses Supabase Row Level Security (RLS) policies in its database design to restrict access based on authenticated users and ownership.
Before using the application with real customer or restaurant data, make sure the intended RLS policies are enabled and tested.
The frontend should never contain privileged Supabase credentials such as a service-role key.
Kairos was created around three simple goals:
- Reduce food waste by giving surplus food another opportunity to be sold.
- Help customers save money by providing discounted food.
- Help restaurants recover value from food that might otherwise go unsold.
Possible future improvements include:
- Location-based restaurant discovery
- Real-time listing updates
- Online payments
- Push notifications
- Restaurant verification
- Better delivery integration
- Food expiry management
- Ratings and reviews
- Analytics for restaurants
- Demand prediction
- Surplus-food prediction and intelligent discount recommendations
Kairos is an MVP/prototype project.
The core customer and restaurant-owner workflows are implemented, including authentication, food listing management, claiming, and confirmation-code verification.
The project is currently focused on making the existing application publicly accessible and easy to demonstrate.
Kairos is currently a personal project. If you want to experiment with the project:
- Fork the repository.
- Create a feature branch.
- Make your changes.
- Test the customer and owner workflows.
- Open a pull request.
No open-source license has been selected yet.
Turning surplus food into an opportunity.