Obrok is an open source web application that scrapes product data from nearby market chains and helps users plan affordable meals from real store inventory.
It combines a React frontend, an Express and MongoDB backend, OSRM routing, and a VitePress documentation site.
Documentation | Website | Environment Templates | License
Students looking for affordable meals usually have to jump between market flyers, store searches, recipe ideas, and map tools. That workflow is fragmented, hard to compare, and not especially useful when the real question is what meal can be made from products that are actually available nearby.
Obrok brings those pieces together. It collects product data from nearby chains, lets users search ingredients directly, and includes an AI recipe decomposition flow that turns meal searches into ingredient lists tied to real markets.
- Scraped product data from nearby market chains
- AI recipe decomposition for meal-oriented search and ingredient-based results
- Ingredient-level search across chains, markets, and products
- Interactive map browsing for markets and nearby locations
- Route-aware travel estimates to selected markets through OSRM
- Reporting, insights, feature flags, and supporting admin flows
- Self-hosted development and deployment with Docker Compose
- Maintained engineering documentation for architecture and operations
apps/clientcontains the React frontend built with Viteapps/servercontains the Express API, data workflows, and background jobsapps/docscontains the VitePress documentation siteapps/nginxcontains the production reverse proxy configurationdata/mapstores OSRM routing data used by the map service
The fastest way to run the project locally is through Docker Compose.
- Install Docker and Docker Compose.
- Configure the root
.envfile andapps/client/.envusing ENV_TEMPLATES.md. - Prepare OSRM data under
data/map.
docker compose -f docker-compose.dev.yml up --build- Frontend:
http://localhost:3500 - Backend API:
http://localhost:5000 - OSRM:
http://localhost:5001 - Docs:
http://localhost:5173
Project documentation lives in apps/docs and is published at docs.obrok.net. It covers architecture, backend modules, frontend flows, deployment, and engineering patterns.
cd apps/docs
npm install
npm run docs:devdocker compose -f docker-compose.dev.yml build docs
docker compose -f docker-compose.dev.yml up docscd apps/docs
npm run docs:build
npm run docs:previewThe repository is structured as a small monorepo with separate client, server, docs, and infrastructure directories.
For day-to-day development:
- Use
docker-compose.dev.ymlto run the full stack locally - Keep route data under
data/mapup to date before testing routing behavior - Use
apps/docsfor architecture and operational documentation updates alongside code changes
Production runs behind Nginx with TLS handled by Let's Encrypt via Certbot. The production stack is defined in docker-compose.prod.yml.
For a new VPS, bootstrap certificates and start the stack with:
./init-ssl.shThe script creates temporary certificates, starts Nginx, requests real certificates, reloads the web server, and brings the application online.
Deployments are triggered from GitHub Actions on published releases.
- Push the required changes.
- Create a GitHub release.
- Tag the release using the existing Calendar Versioning pattern, for example
v2026.03.13.1. - Publish the release.
The deployment workflow connects to the VPS, pulls the tagged revision, rebuilds the docs site, injects the release version into the frontend environment, and recreates the production containers.
Contributions should keep code, deployment behavior, and documentation aligned. If a change affects architecture, flows, or operations, update the relevant docs in apps/docs as part of the same change set.
This project is licensed under the terms in LICENSE.