openvibers/openvibe.food CHANGELOG.md

CHANGELOG.md

main 3.6 KB · 47 lines · markdown

1# Changelog
2
3What changed in OpenVibe.Food, newest first. Each site also publishes its patch notes at /updates.
4
5## 0.2.0 — 2026-10-08
6
7The product: everything food, in one service. The food tools move here from OpenVibe.Tools, without the Walmart page
8scraping 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
35Also:
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