尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Property intelligence for the Spanish coast. Scores every new-build on discount-to-market, rental yield and developer quality, refreshed by autonomous daily jobs. Live at avenaterminal.com.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Daily observation of the Spanish coastal new-build market — what was listed, what moved, and what quietly disappeared.
Live: avenaterminal.com · Open data: /open-data · mirror · CC BY 4.0 · DOI 10.5281/zenodo.19520064
Spanish coastal new-build listing data is ephemeral. A unit is listed, repriced two or three times, and then vanishes from the feed — sold, withdrawn, or quietly reshuffled by the developer. No public registry records any of that at listing level. Once a listing changes, its previous state is gone.
The Spanish land registry publishes transactions, but with a long lag, no listing identity, and no asking price — so it cannot answer the question that actually matters to a buyer: was this unit reduced before it sold, and by how much?
So this system writes that history down, once a day, and never stops. The value is not the code — it is the fact that the series exists and cannot be backfilled. A competitor starting today is 70 days behind permanently, and money will not close the gap.
Measured 2026-10-13. These are derived live from the database by
scripts/capability-stats.ts, which refuses to emit zeros rather than report a
failed read as an empty result.
| Observation days, unbroken | 70 (2026-08-05 → 2026-10-13) |
| Units observed | 2,287 |
| Price moves recorded | 657 |
| Delistings (absorption) | 276 |
| Relistings | 42 |
| Live book | 2,039 across 69 towns |
Depth is measured as distinct prices per unit, never as row count. An earlier version of this pipeline wrote ~394,000 rows that contained zero price changes — a capped write loop re-inserting the same frozen snapshot nightly. Row counts in this domain lie; the genuine series starts the day the pipeline was repointed at the live feed.
Listing XML feed (~98 MB)
└─ parse-feed.js fingerprints the payload, refuses a short read
└─ public/data.json the book, committed nightly
├─ pricing-history cron → price_snapshots (per ref, per day)
│ → sold_properties (delisting ledger)
└─ build-open-dataset.ts → public/open-data/* → public mirror
Two things in that chain are worth more than the rest:
The diff is gated. Delisting and price-move detection only runs against a
prior snapshot no older than four days, and only when the two books overlap by
at least 50%. A broken feed therefore cannot mass-flag 2,000 units as sold. The
gate reports trusted_prior: false and writes nothing rather than writing
something plausible.
The scheduler is not trusted. GitHub's cron landed its 05:10 slot between 06:15 and 06:43 for five consecutive nights, and the upstream feed intermittently refuses GitHub Actions egress entirely (a fresh runner 43 minutes later gets straight through). A conditional backstop workflow with 37 tests covers both. It has since carried the capture through a 21-day unattended stretch and an 8-day one with zero missed nights.
scripts/avm-backtest.ts, re-measured on every change, committed to
public/model-stats.json:
| metric | value |
|---|---|
| Median absolute error | 15.82% |
| MAPE | 21.81% |
| RMSE | 43.28% |
| Within ±10% | 34.2% |
| Within ±20% | 59.5% |
| n | 2,039 |
Both caveats are published alongside every figure, because without them the numbers are not true:
This section exists because the site previously claimed "±3% RMSE on backtest" with no backtest in existence. Building one produced a worse number and exposed a real model bug. A defensible 15.82% is worth more than an invented 3%.
Every serious outage here has had one shape: a missing or failed value silently becoming a zero, so a broken system looks like a working one with nothing to report.
Real instances, all fixed:
parse-feed downloaded 0 MB, threw, and exited 0 — a green check on a dead feed.catch stored an empty result, overwriting a
healthy ~33% measured rate with a fabricated 0.00% for six days.if (!error) count += chunk and took the prior snapshot
as the global max date, discarding it whenever that max was today — so any
re-run diffed against nothing and reported price_moves: 0 while real moves
went unlogged.createClient(process.env.URL!, ...) at module top level.
The ! is a lie when the variable is absent. Production had the vars, so every
preview deployment broke — and the signal that a branch was broken was itself
broken.success on every run for 57 consecutive days while
transmitting nothing, because the no-op branch returned a bare 200.So the house rules are: a failed read returns null, never 0; a published
count is derived, never a literal; an absent credential throws instead of
falling back; and a run that did nothing says skipped, not success.
Several tests assert the bug, not just the fix — test-hf-push-reporting.ts
includes the exact pre-fix payload and asserts it still derives to success, so
the test demonstrably catches the regression rather than only documenting the
repair.
All four must pass before anything reaches main:
npx tsc --noEmit # clean
npx tsx scripts/test-concierge.ts # all pass
npx tsx scripts/avm-backtest.ts # median error must not regress
npm run build:preview-sim # full build with every secret UNSET
The last one exists because production has environment variables that preview deployments do not, so a green production build proves nothing about a branch.
npm install
export FEED_URL="<listing feed URL>" # required; no fallback, throws if unset
node parse-feed.js # refresh public/data.json
npm run dev
FEED_URL is a credential — the feed has no other authentication — so it lives
in the environment and never in the source.
Next.js (App Router) · TypeScript strict · Tailwind v4 · Vercel · Supabase · 65 scheduled jobs · GitHub Actions for the capture path.
Code: see repository. Data under public/open-data/: CC BY 4.0 — free to
use with attribution to Avena Terminal (avenaterminal.com).