מסמכים

יומן שינויים · CHANGELOG

כל השינויים המשמעותיים באתר - תכונות חדשות, תיקוני אבטחה, עדכוני מאגרי מידע - מסודרים כרונולוגית. מקור: CHANGELOG.he.md. תעדכון גם באנגלית לקהילת המפתחים. תוכן טכני - חזרה לדף הבית.

יומן שינויים

כל השינויים המשמעותיים ב-OpenCarIL מתועדים כאן.

מבנה על-פי Keep a Changelog. גרסאות על-פי Semantic Versioning. לפני 1.0 = לא יציב.

הגרסה האנגלית (יעד ל-GitHub וקהילת מפתחים): CHANGELOG.md.

[Unreleased]

נוספו

  • חיפוש דגמים בעברית באמצעות טבלת תעתיקים מאוצרת (web/src/lib/model-aliases.ts). ה-data.gov.il שומר שמות דגמים באנגלית (FOCUS, COROLLA, MAZDA 3) אבל תוצרות בעברית, ולכן שאילתות עבריות לדגמים החזירו אפס תוצאות. ה-typeahead עכשיו מרחיב טוקנים עבריים לקבוצות OR של ("פוקוס"* OR "FOCUS"*) בשאילתת ה-FTS, כולל תעתיקים מרובי-מילה (לנד קרוזר, מזדה 3). כולל ~120 השמות המסחריים הפופולריים, מכסה ~90% מהרכבים הרשומים.
  • תפריט המבורגר + מגירת ניווט מחליקה (RTL-תקין), מטרות מגע 44x44 בכל בקרות ה-header/drawer, נעילת גלילת body בזמן שהמגירה פתוחה. MobileNotice הותאם מ"האתר עובד יותר טוב במחשב" לרמז לגבי תפריט ☰ (מפתח סגירה עודכן מ-v1 ל-v2).
  • ערוץ יצירת קשר: nx1xlab.dev/contact נוסף ב-/about לצד GitHub Issues, במבוא של /roadmap, ובמגירת הנייד.
  • דפי /changelog ו-/roadmap - קובצי המקור .md נטענים בזמן הבנייה דרך marked (עם סניטיזציה). מקושרים מה-footer של האתר.
  • /og/generic?title=…&subtitle=… - כרטיס OG פרמטרי ב-SVG לכל ראוט שלא היה לו עיצוב OG דינמי (/dataset/*, /stats*, /about, /compare/*, /changelog, /roadmap).
  • ממיר ITM ← WGS84 ב-lib/itm.ts. מפת /stats/cities שואבת קואורדינטות ממאגר יישובי הלמ"ס (1,484 יישובים). כיסוי קפץ מ-~90% (JSON מובנה של 80 ערים) ל-99%.
  • פיצול תיעוד לצורך פרסום קוד פתוח: docs-internal/ (לא בגיט) מכיל את RUNBOOK.md, CLAUDE.md, work-status.md. מסמכי מדיניות ציבוריים רועננו (SECURITY.md, CONTRIBUTING.md, CODE_OF_CONDUCT.md), נוספו תבניות issue ו-PR.
  • /api/latest-release - פרוקסי ל-GitHub Releases API, עם קאש ב-isolate. מפעיל את התג "גרסה חדשה זמינה" בכותרת כאשר הבניה שרצה מפגרת אחרי main.
  • דף /credits - כל תלות זמן-ריצה ובנייה עם רישיון SPDX, בנוסף לייחוס מקורות המידע (data.gov.il, למ"ס).
  • /api/health?bindings=1 - בדיקת opt-in המדווחת האם ה-bindings של הגבלת הקצב (API_RATE_LIMIT, SEARCH_RATE_LIMIT, PLATE_GATE) אכן חוברו בסביבת הייצור. מאשר שמגבילי ה-scraping אינם נכשלים-פתוח בשקט על יעד הפריסה. כבוי כברירת מחדל כדי לא לחשוף את מבנה ה-bindings.
  • JSON-LD מסוג Organization לכל האתר (שם, לוגו, sameAs למאגר ב-GitHub), בנוסף לאות רעננות dateModified הניתן לקריאה במכונה על סכימות WebSite ו-Dataset (עמודי /dataset/*), הנשען על חותמת ה-ETL last_fetch_utc (זמן הרענון היומי, לא זמן הבנייה).
  • JSON-LD מסוג BreadcrumbList על /plate/[n].
  • /og/generic.png - גרסת PNG (satori + resvg-wasm) של כרטיס ה-OG הגנרי ב-SVG, כדי שתצוגות הקישור ירונדרו ב-X, Discord, LinkedIn, Facebook ו-WhatsApp-IL, שכולם משמיטים og:image מסוג SVG.
  • <lastmod> על כל כתובת ב-sitemap.xml, מזמן הרענון האמיתי של ה-ETL - אות הרעננות/הסריקה-מחדש העיקרי ש-Google באמת משתמש בו.
  • og:site_name ו-og:locale (he_IL) נפלטים לכל האתר; נוסף שדה Policy: ל-security.txt.

שונו

  • renovate.json הועבר ל-.github/renovate.json (מיקום סטנדרטי). זמן ההמתנה (cooldown) הועלה מ-7 ימים ל-14 ימים גלובלית.
  • daily-etl.yml פוצל ל-build (ללא סודות Cloudflare, contents:read) ול-deploy (עם סודות CF, contents:write). deploy מאמת את ה-artifact לפני שום פקודת wrangler: בדיקת allowlist על datasets.generated.ts, sanity על גדלי קבצי SQL, cap על גודל bundle.
  • docs/DEPLOY.md - פוצל למסלול "GH Actions בלבד" ולמסלול "CF Git integration", עם אזהרה מפורשת "אל תפעיל את שניהם".
  • CHANGELOG ו-ROADMAP רועננו לקריאות ציבורית. ניתוח מפורט וממצאי audit הועברו ל-docs-internal/work-status.md.
  • משתני סביבה CF_* שמועברים ל-wrangler שונו ל-CLOUDFLARE_* כדי להתאים לתיעוד של wrangler.
  • כל ה-bindings של Cloudflare (D1, שלושת מגבילי הקצב, סודות Turnstile ו-Sentry) אוחדו לטיפוס App.Platform יחיד; הוסרו ממשקי ה-binding הכפולים וה-casts (as) שסטו מהסביבה האמיתית. בנוסף תוקנה הערה ישנה שתיארה את המגבילים כ-[[ratelimits]] בעוד הם מוגדרים כ-[[unsafe.bindings]].
  • דיווח שגיאות ל-Sentry ב-handleError עכשיו נדחה דרך ctx.waitUntil בייצור במקום לחסום את תגובת השגיאה על ה-import הדינמי והאתחול של Sentry.

אבטחה

  • /compare/[plates] ו-/plate/[n]/report עכשיו מוגנים באותו Turnstile + rate limit כמו /plate/[n]. סוגר נתיב scraping של כל המרשם (ממצא pentester ברמת HIGH).
  • step-security/harden-runner מוצמד ל-SHA בכל ה-workflows (היה מוצמד לתג בלבד - cicd HIGH).
  • סגירת מחלקת באגים של prototype-chain lookup במקור הקודגן (DATASETS_BY_ID מאותחל עם Object.create(null)).
  • FTS5 typeahead הוקשח: catch מצומצם (היה catch-all), cap על אורך שאילתה וכמות מונחים.
  • CSP במצב nonce: 'unsafe-inline' הוסר מ-script-src.
  • {@html} ב-/changelog ו-/roadmap עובר סניטיזציה בזמן הבנייה - tokens של HTML גולמי הופכים לטקסט נראה במקום קוד מבוצע.
  • מחרוזות placeholder בזמן פריסה ב-wrangler.toml מתועדות ומוגנות ב-grep הגהיינה של ה-CI, כך שלא יישלחו לפרודקשן כפי שהן.
  • 4 סקריפטים שכללו נתיבי WSL אישיים בקוד קשיח (/tech-projects/*) נמחקו.

תוקנו

  • כל עמודה על /plate/[n] מציגה כעת תווית בעברית. 53 עמודות שנותרו בקטלוג WLTP (סימני ADAS, פילוגי פליטה, טכנולוגיית הנעה) שהוצגו בשם הגולמי - קיבלו תרגומים ב-etl/src/etl/datasets.py.
  • דף השגיאה האנגלי של ברירת המחדל של SvelteKit הוחלף ב-+error.svelte בעברית (עם מיפוי קוד → תווית עברית).
  • 21 הודעות throw error() תורגמו לעברית.
  • Canonical URLs: היה מוצמד ל-/ ב-app.html בכל ראוט (מה שגורם ל-Google לאחד את כל הכתובות לדף הבית). עכשיו מוזרק פר-ראוט דרך +layout.svelte.
  • תגיות OG ב-/plate/[n], /manufacturer/[cd] ובדף המודל הוחלפו מ-SVG לגרסת .png - WhatsApp-IL לא מציג og:image בפורמט SVG.
  • ל-sitemap נוספו /stats/cities, /feed/recalls.atom, /changelog, /roadmap.
  • <h1> כפול על /plate/[n]/report הוחלף ל-<div>.
  • Typeahead מוסיף עכשיו aria-activedescendant - דפוס ה-combobox של WAI-ARIA לא היה מיושם.
  • /plate/[n] כלל רק <title> ב-<head> - עכשיו נפלטים <meta name="description"> ו-og:description הבנויים מרשומת הרכב, והשדה manufacturer ב-JSON-LD מסוג Vehicle הוא Organization תקין (במקום מחרוזת פשוטה).
  • שבעת עמודי ה-OG הגנרי (/about, /stats, /stats/cities, /dataset/*, /changelog, /roadmap, /credits) הוחלפו מ-og:image מסוג SVG ל-PNG החדש (image/png, 1200x630).
  • JSON-LD מסוג Dataset על /dataset/[slug] נושא עכשיו את קישור ה-sameAs למקור ב-data.gov.il/CKAN, כפי שהובטח בהערה אך מעולם לא נפלט בפועל.
  • סורקים מוגבלי-קצב כבר לא מקבלים מעטפת אתגר ריקה עם סטטוס 200 על /plate/[n] ו-/compare/[plates]: בוטים מאומתים (אות bot-management של Cloudflare, עם גיבוי רשימת-היתר של User-Agent) עוקפים את שער הלוחית, ומסלול האתגר האנושי מחזיר עכשיו 429 אמיתי עם Retry-After, כדי שסורקי חיפוש/AI ייסוגו במקום לאנדקס עמוד ריק.
  • עמוד הדגם (/manufacturer/[cd]/model/[dcd]) חסר og:image:width/ og:image:height - נוספו.
  • לשדה החיפוש בכותרת/הירו לא היה שם נגיש (placeholder בלבד) - נוסף aria-label.
  • /compare/[plates] מוגדר עכשיו noindex, follow (אין לאנדקס כתובות קומבינטוריות בלתי-חסומות).

[0.1.0] - שחרור ראשוני

מערך הפיצ'רים שהיה קיים בזמן פתיחת הריפו כקוד פתוח. היסטוריית ה-pre-1.0 המלאה (רשומות פנימיות, ממצאי audit, שיקולי refactor) נמצאת ב-docs-internal/work-status.md.

נתונים

  • צנרת ETL מעל 25 מאגרי משרד התחבורה מ-data.gov.il (~14 מיליון רשומות, 2.6 GB SQLite). ריענון יומי דרך GitHub Actions cron.
  • טבלאות precompute: _manufacturer_summary, _global_baselines, _stats_snapshot, _insights_snapshot, _vehicles_fts.
  • מאגר יישובים של הלמ"ס (1,484 רשומות) מעשיר את /stats/cities.

האתר

  • ממשק בעברית בלבד, RTL.
  • /plate/[n] - חיפוש חוצה-מאגרים על מספר רכב, כולל ציר בעלויות, אגרת רישוי שנתית, סטטיסטיקת צי, זיהוי ריקולים, תג סטטוס, שבבי שינויי מבנה ונזק.
  • /plate/[n]/report - דוח מלא ידידותי להדפסה.
  • /compare/[plates] - השוואה של 2 עד 5 רכבים.
  • /manufacturer/[cd] ותת-דפי דגמים, דפדפן מאגרים ב-/dataset/[slug] עם פילטרים ו-pagination.
  • /stats ו-/stats/cities עם footer של provenance לכל פנל.
  • פידי Atom של ריקולים ב-/feed/recalls.atom (גלובלי) ופר-יצרן ב- /feed/recalls/[tcd].atom.
  • Typeahead מבוסס FTS5 (עברית + לטינית, ~3 מ"ש חם).

SEO / GEO

  • Canonical URL פר-ראוט.
  • גרף JSON-LD: WebSite + SearchAction על דף הבית, Dataset על כל /dataset/[slug], Vehicle על דפי רכב, BreadcrumbList על דפי יצרן ודגם.
  • כרטיסי OG דינמיים ב-/og/plate/[n], /og/mfr/[cd] (SVG + PNG), /og/generic?title=….
  • מדיניות מפורשת ל-crawlers של AI ב-robots.txt, קובץ llms.txt.

אבטחה

  • CSP במצב nonce, HSTS, X-Frame-Options DENY, COOP/CORP same-origin, Permissions-Policy מורחב.
  • שער Cloudflare Turnstile על ראוטים שנוגעים ברכב, עם מונה פר-IP.
  • Cloudflare Rate Limiting על /api/*, /search, /dataset/*, /plate/, /compare/, /manufacturer/.
  • Hook של handleError עם ייבוא עצל של Sentry.
  • כל GitHub Actions מוצמדים ל-SHA. harden-runner במצב block עם רשימות egress מותאמות.
  • קונפיגורציית Renovate עם המתנה של 14 ימים, dependency dashboard, התראות חולשות.