A source-available full-stack platform to locate stores selling Ciao Kombucha near you.
February 2026 Update: The backend has been consolidated into the Next.js frontend application for improved performance, simpler deployment, and better developer experience. The
backend/folder now only contains Python data management scripts.
Kombuciao is a complete full-stack web application that helps you quickly find where to buy Ciao Kombucha. The application uses geolocation to show you nearby stores with available flavors, powered by an active community of Squeezos.
- πΊοΈ Interactive map with geolocation
- π Address or city search
- πͺ Filtering by available flavors
- π± Responsive interface for mobile and desktop
- β‘ Real-time data on availability
- π₯ Community reporting system
- π³οΈ Voting on reports to maintain reliability
- π Geospatial data with MongoDB
- π Automatic import of BANCO data
Kombuciao is a modern full-stack Next.js application with integrated backend functionality:
- Next.js 15 with App Router - Full-stack framework
- React 19 and TypeScript - UI and type safety
- Next.js API Routes - RESTful API endpoints
- MongoDB + Mongoose - Database and ODM
- Tailwind CSS - Modern styling
- Leaflet - Interactive maps
- shadcn/ui - Beautiful components
- Python scripts for importing BANCO data
- pymongo - Direct MongoDB access for bulk operations
- Github Actions workflow for automated store data updates
Store information comes from the Base Nationale des Commerces Ouverte (BANCO), a French public database. I cannot modify this data directly.
Information about flavor availability is based on community reports. Each user can:
- Report flavor availability at a store
- Vote on existing reports
- Contribute to maintaining reliable information
- Node.js 18+
- Python 3.7+
- MongoDB (local or Atlas)
- npm, yarn, pnpm or bun
- Clone the repository:
git clone https://github.com/atinyshrimp/kombuciao.git
cd kombuciao- Set up the frontend (includes API):
cd frontend
npm install- Configure environment variables:
Create frontend/.env:
MONGODB_URI="your_mongodb_connection_string"
API_KEY="your_secure_api_key"- Set up Python for data import:
cd ../backend
python -m venv venv
venv\Scripts\activate # Windows
# or: source venv/bin/activate # macOS/Linux
pip install -r requirements.txtCreate backend/.env:
MONGODB_URI="your_mongodb_connection_string"- Import store data:
python scripts/banco_to_mongo.py- Start the development server:
cd ../frontend
npm run dev- Open your browser:
- Application: http://localhost:3000
- API endpoints available at
/api/*
- Framework: Next.js 15 with App Router
- Runtime: React 19
- Language: TypeScript 5
- Styling: Tailwind CSS 4
- Database: MongoDB with Mongoose ODM
- Maps: Leaflet + React Leaflet
- UI Components: shadcn/ui (Radix UI)
- Icons: Lucide React
- Notifications: Sonner
- State Management: React Context
- Language: Python 3.7+
- Data Processing: pandas
- Database: pymongo
- HTTP: requests
- Progress: tqdm
kombuciao/
βββ frontend/ # Next.js full-stack application
β βββ app/
β β βββ api/ # API routes (backend endpoints)
β β β βββ stores/ # Store CRUD operations
β β β βββ reports/ # Report & voting system
β β βββ page.tsx # Main page
β β βββ layout.tsx # Root layout
β βββ components/ # React components
β β βββ cards/ # Store cards
β β βββ features/ # Feature components
β β βββ map/ # Map components
β β βββ ui/ # UI components (shadcn)
β βββ lib/
β β βββ server/ # Server-side code
β β β βββ config/ # DB connection
β β β βββ models/ # MongoDB schemas
β β β βββ controllers/ # Business logic
β β β βββ middleware/ # Auth & validation
β β βββ utils.ts # Client utilities
β βββ types/ # TypeScript types
βββ backend/ # Data management scripts
β βββ scripts/
β β βββ banco_to_mongo.py # Import BANCO data
β β βββ update_types.py # Update store types
β βββ requirements.txt # Python dependencies
βββ README.md # This file
All API endpoints are now integrated into Next.js at /api/*:
GET /api/stores- List stores with geospatial filters
Query parameters:lat,lng: Geographic coordinates for proximity searchradius: Search radius in meters (default: 5000)name: Filter by store name (case-insensitive)flavor: Filter by available flavors (can use multiple)onlyAvailable: Show only stores with recent reports (boolean)page,pageSize: Pagination parameters
GET /api/stores/stats- Get store statisticsGET /api/stores/:id- Get store detailsPOST /api/stores- Create a store (requires API key)PUT /api/stores/:id- Update a store (requires API key)DELETE /api/stores/:id- Delete a store (requires API key)
GET /api/reports- List availability reports
Query parameters:storeId:since:page,pageSize: Pagination parameters
GET /api/reports/:id- Get specific reportPOST /api/reports- Create a report (requires API key)POST /api/reports/:id/vote- Vote on report (requires API key)DELETE /api/reports/:id/vote/:voteId- Delete vote (requires API key)DELETE /api/reports/:id- Delete a report (requires API key)
Protected endpoints (POST, DELETE) require an x-api-key header. The API key is stored securely server-side and never exposed to the browser.
This applies only for external requests.
{
name: String,
address: { street, postcode, city },
location: { type: "Point", coordinates: [lng, lat] },
openingHours: String,
types: [String],
createdAt: Date,
updatedAt: Date
}{
store: ObjectId,
flavors: [String],
description: String,
votes: [{
voterId: String,
type: "confirm" | "deny",
createdAt: Date
}],
createdAt: Date,
updatedAt: Date
}- Deploy the frontend directory (contains everything)
- Set environment variables in Vercel dashboard:
MONGODB_URI=your_mongodb_connection_string API_KEY=your_secure_api_key - That's it! The API is bundled with the frontend.
cd frontend
npm run build
npm startThe application serves both the frontend and API from a single process.
Contributions are welcome! Feel free to:
- Fork the project
- Create a feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'feat: add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
Kombuciao's relevance depends on community engagement. You can contribute by:
- Reporting flavor availability at stores
- Voting on existing reports
- Reporting bugs or suggesting improvements
- Contributing to the source code
This project is distributed under the Polyform Noncommercial 1.0.0 license.
- β Personal and educational use
- β Open source development contributions
- β Non-commercial research and development
- β Use by non-profit organizations
- β Use in a commercial context
- β Integration into paid products or services
- β Use by for-profit companies
- β Direct or indirect monetization
See LICENSE for more information.
- GitHub: Issues
- BANCO for store data
- Ciao Kombucha for inspiration
- The Squeezos community for contributions
Made with β€οΈ for the Squeezos