openvibers/openvibe.food CHANGELOG.md
CHANGELOG.md
| 1 | # Changelog |
| 2 | |
| 3 | What changed in OpenVibe.Food, newest first. Each site also publishes its patch notes at /updates. |
| 4 | |
| 5 | ## 0.2.0 — 2026-10-08 |
| 6 | |
| 7 | The product: everything food, in one service. The food tools move here from OpenVibe.Tools, without the Walmart page |
| 8 | scraping that source also did. |
| 9 | |
| 10 | - **Find food near you** (`/near`, `GET /api/v1/places`): a place name (geocoded with Nominatim) or coordinates in, |
| 11 | food banks, soup kitchens, community fridges, free pantry boxes and budget grocery stores out of OpenStreetMap |
| 12 | (Overpass), with distance, address, opening hours, operator, phone, website and a link back to the object on OSM. |
| 13 | Every result page carries the OpenStreetMap attribution and the ODbL link ODbL requires. |
| 14 | - **Inside the OSM usage policies** (`server/food/upstream.js`): we identify with `FOOD_OSM_USER_AGENT`, at most one |
| 15 | request a second per host (calls to a host queue behind each other), every answer cached in `food_geo_cache` for |
| 16 | 7 days, and only small `around:` radius queries — never a bulk download. |
| 17 | - **Meal planner** (`/plan`, `POST /api/v1/plans`): for one person, a couple or a group, 1–14 days, covering the six |
| 18 | USDA MyPlate food groups from the ported food list, with a shopping list, the cheapest store per line, and an |
| 19 | estimated cost. Deterministic; a budget is a hard cap. Signed-in people can save plans (`food_plans`). |
| 20 | - **Food database** (`/foods`, `/foods/:slug`, `GET /api/v1/foods[/:slug]`): the 42-item list ported from |
| 21 | OpenVibe.Tools' grocery source, with nutrition per serving and per 100 g (derived from the pack size the item's own |
| 22 | name states — and left out, not guessed, when it states no weight), the typical price band, and the chain-by-chain |
| 23 | comparison. Server-rendered and in the sitemap. |
| 24 | - **Pantry** (`/pantry`, `GET`/`PUT /api/v1/pantry`): signed-in people keep what is in their cupboard (`food_pantry`) |
| 25 | and get a deterministic "what can I make" against ten basic recipes written for this service — clearly labelled |
| 26 | basic suggestions, no model call anywhere in this version. |
| 27 | - **Discovery**: the sitemap now carries every food page, `/near`, `/plan` and `/foods`; llms.txt and llms-full.txt |
| 28 | list the same set; a pantry and a saved plan are never crawled. |
| 29 | - **Capabilities and limits**: `food.place.read`, `food.food.read`, `food.plan.read|write`, `food.pantry.read|write`; |
| 30 | the place search has the tightest per-caller budget because it spends OpenStreetMap's shared request budget. |
| 31 | - **Tests**: a stand-in Nominatim + Overpass (`test/helpers/osm.js`) — the suite never calls the internet — covering |
| 32 | the results and the attribution, the one-request-a-second queue, cache hits, the per-caller limit on the search, the |
| 33 | meal-plan arithmetic, the pantry match, signed-in saves, anonymous refusals and the escaping of an OSM name. |
| 34 | |
| 35 | Also: |
| 36 | |
| 37 | - `test/skeleton.test.js` now skips itself inside a generated service. It asserts that the skeleton's generator |
| 38 | rewrites its placeholders, which a generated service has none of; it was already failing before this change. |
| 39 | - `test/helpers/boot.js` points the two OSM hosts at a closed local port unless a test names a stand-in, so no test |
| 40 | can reach the real Nominatim or Overpass. |
| 41 | - The home page's CSS budget was raised from 16.5 to 18 KB: the product's own pages brought their stylesheet with them |
| 42 | (search and plan forms, place cards, the pantry tick list). |
| 43 | |
| 44 | ## 0.1.0 — 2026-10-08 |
| 45 | |
| 46 | - **First release:** the service starts from the OpenVibe skeleton — sign-in with OpenVibe.Network (OAuth 2 + PKCE), server-rendered pages through the OpenVibe Frame, the `/api/v1` mount with per-caller limits, crawl artifacts, PostgreSQL migrations, the deploy files and the test suite. |
| 47 |