No updates detected yet. GitHub releases will appear here.
Today's Taiwan wholesale vegetable & fruit prices, at a glance — plus an estimated traditional-market retail band so you can sanity-check a stall's price while standing in front of it.
翻訳待ち
Loading the full README. The saved excerpt is shown below.
Today's Taiwan wholesale vegetable & fruit prices, at a glance — plus an estimated traditional-market retail band so you can sanity-check a stall's price while standing in front of it. Open the app and immediately see a calm, MUJI-inspired board of the produce people buy most — green when cheaper, clay when pricier, priced per catty (台斤). Three questions the board answers without typing: what does this cost today, is that cheap for this crop (against its own recent norm), and which variety am I actually being quoted when one crop trades at two very different prices.Read the full README ↗
Today's Taiwan wholesale vegetable & fruit prices, at a glance — plus an estimated traditional-market retail band so you can sanity-check a stall's price while standing in front of it. Open the app and immediately see a calm, MUJI-inspired board of the produce people buy most — green when cheaper, clay when pricier, priced per catty (台斤).
Three questions the board answers without typing: what does this cost today, is that cheap for this crop (against its own recent norm), and which variety am I actually being quoted when one crop trades at two very different prices.
Note on language: the UI is in Traditional Chinese (its audience); code, comments, and this documentation are in English.
元/台斤 (the market convention;
1 catty = 600 g). The MOA source is 元/公斤, converted on the client (×0.6).約 44 元/台斤) — that is what a
shopper transacts at. The measured wholesale closing average and the reference
band sit under it (市場 35–55・批發 14.6), and the drawer shows the markup
the estimate adds. The estimate is never presented as a quoted price — see §4.
Comparisons ranked for the shopper (「同類更划算的選擇」) use the same market
basis, because a crop that is cheaper at auction can be dearer at the stall.↓ 7.0% tracks the wholesale average, the
only measured series, and is labelled 批發較昨日 in the drawer. The band is
rounded to NT$5, so it would read as frozen against small real moves.↓ 便宜了 (cheaper), clay ↑ 變貴了 (pricier),
grey → 持平 (flat), compared with the previous trading day. Arrows + text back
up the colour so it never relies on colour alone.↓ 7.0% compares with the previous trading day. The sage badge
「比近月便宜 23%」 compares today's wholesale price with the median of that
crop's own last 28 trading days, and 「划算優先」 sorts the board by it so the
day's real bargains sit on top. Only the discount side gets a badge — the
change column already covers the pricier side. See §5.#/i/高麗菜, #/?f=葉菜類&sort=value),
because the way this board spreads is one shopper pasting today's price into
a LINE group — and a link that opens the home screen instead of that price is
not worth pasting. The drawer is a history entry too, so the Android back key
closes it rather than leaving the app; a link to a crop that is out of season
today says 「今日無交易資料」 and lands on the board instead of erroring.
A typed word reaches the hash once its debounce settles — one word, not one
keystroke, and with replaceState, so the board you are looking at is always
the board your URL describes without typing filling up the back button.MOA open-data API ──▶ GAS refresh (4-hourly trigger) ──▶ CacheService + chunked
(single-date and board → the day's prices ScriptProperties
range queries) history → 28 trading days → baseline (§5)
│
GET /exec │
▼
Frontend (GitHub Pages) ◀── validate ◀── GitHub Actions (deploy-pages)
data/board.json, published runs when a crawl lands (the
inside the bundle's own artifact backend dispatches it), on
│ push, and 2-hourly as fallback
▼
Browser: localStorage (paints first) ──▶ data/board.json ──▶ GAS /exec
authoritative only when the mirror
while < 6 h old is stale or missing
This is the beginning of the README. Read the rest at the original. Read the full README ↗