<!DOCTYPE html>
A continuously updated data platform for Israeli supermarket prices, promotions, and stores — from raw government-regulated feeds, through scraped product enrichment (images, ingredients, nutrition), to a queryable PostgreSQL + PostGIS database exposed by a documented REST API and a web interface.
Metziah collects and processes the XML feeds published by Israeli supermarket chains under the 2014 Price Transparency regulations (Reshumot 7442). It supports multiple feed protocols and data sources, normalizes heterogeneous data, reconciles full snapshots with incremental updates, tracks file state and load dependencies, and provides monitoring, inspection, analytics, and daily promotion notifications. Products are then enriched with metadata scraped from retailer websites, and the whole catalog is served through a FastAPI service.
The current pipeline processes 15,000+ feed files per day, covering approximately 2,369 stores, 550,000 unique products, 30.9 million promotion items*, and 33 supermarket chains. The enrichment layer adds ~48,000 scraped products, ~48,000 product images, and 16,000+ products with parsed nutrition facts.
*The promotion count reflects records published by retailers and may be inflated by the way some publishers represent and repeat promotion data.
psycopg connections rather than mocked
database interactions.
/api/v1) + HTMX websiteEnrichment pipeline
The API is a read-only FastAPI service under /api/v1 with
interactive Swagger docs at /docs and an OpenAPI schema at
/openapi.json. It serves the whole catalog, so a product
appears whether or not it has been enriched. List endpoints take
limit and offset and return
items, total, limit, and
offset.
| Endpoint | Description |
|---|---|
GET /health | Health check |
GET /stats | Catalog totals: stores, brands, fresh products |
GET /categories/packaged | Packaged-product categories with counts and subcategories |
GET /products?category= | Enriched packaged products in a category |
GET /products/search?q= | Search enriched products, each with its cheapest price and store count |
GET /products/unenriched?q= | Browse or search products that have no enrichment |
GET /products/{barcode} | Full detail for any barcode: product, prices per store, promotions, enrichment and nutrition |
GET /fresh/categories | Fresh-product categories (produce, butcher, fish, bakery) |
GET /fresh/categories/{id}/subcategories | Subcategories of a fresh category |
GET /fresh/products?subcategory_id= | Fresh products in a subcategory, cheapest first |
GET /fresh/products/detail | A fresh product's price and active promotions in every store |
GET /fresh/search?q= | Search fresh (unbarcoded) products by name or item code |
The web interface also serves product images at
/img/{item_code}, with a placeholder when none exists.
git clone https://github.com/gzappaa/metziah
pip install -r requirements.txt
.env.dev and .env.test.
make setup
or
make setup-test
ENV=dev python -m downloaders.scheduler
make enrich-prod
ENV=prod uvicorn api.main:app --reload,
then open http://localhost:8000/docs
make test
docker compose --env-file .env.dev up -d
(production adds an api service with
--env-file .env.prod)
Feed access is based on Israel's 2014 Price Transparency regulations (Reshumot 7442), which require supermarket chains to publish machine-readable price and promotion data.
13,000 Hebrew lemmas. 150,000 unique word forms. Every conjugation, every root, every translation — queryable in milliseconds.
A production-ready REST API and web interface built on top of a custom-scraped Hebrew vocabulary dataset. Search words by meaning (in English), by Hebrew form, by root, by part of speech, or by Latin transcription — with fuzzy matching powered by PostgreSQL trigrams. Each result returns the full conjugation table, bilingual example sentences, and a real-world frequency score from Israeli songs, news, and YouTube.
Spin up the entire stack — Postgres, data import, and API — with a single docker compose up.
deep mode that reaches inside conjugation cellskatav or catav, get שָלוֹם back. Exact matches surface first, trigram fallback handles typos and transliteration variants/api/*) and a server-rendered HTML web UI sharing the same query layerGET /api/search?query=peace&type=meaning
GET /api/search?query=כתב&type=word&deep=true
GET /api/search?query=katavti&type=transcription
GET /api/lemmas/{uuid} → full conjugation tables + sentences + frequency
GET /api/browse?page=2 → paginated alphabetical index
// GET /api/lemmas/{uuid}
{
"hebrew": "כָתַב",
"transcription": "katav",
"meaning": "to write",
"root": { "display": "כ - ת - ב" },
"conj_tables": [ ... ],
"sentences": [
{ "sentence": "הוא כתב מכתב.", "translation": "He wrote a letter." }
],
"sources": { "songs": 12, "news": 34, "youtube": 5, "total": 51 }
}
git clone https://github.com/gzappaa/hebrew_vocab_hub_APIpython DATABASE/setup_data.py (downloads dataset, creates env files)docker compose up --build → API live at http://localhost:8000cd API && pytest / cd DATABASE && pytestDoes Hebrew vocabulary follow Zipf's law? Do songs, news, and YouTube really speak differently? Is a word's frequency predictable from how many domains it shows up in?
The analysis and reporting layer built on top of hebrew_vocab_hub_API's dataset — three Jupyter notebooks covering exploratory analysis, cross-source vocabulary comparison, and a statistical test of linguistic patterns, followed by an Excel workbook and a Power BI dashboard built from the same queries.
01_eda.ipynb → dataset structure, POS distribution, Zipf's law check 02_source_comparison.ipynb → vocabulary overlap + LLM semantic register labeling 03_linguistic_patterns.ipynb → source coverage vs. word frequency, limitations & bias excel/hebrew_vocab_hub_report.xlsx → 9-sheet export, same data source as the dashboard powerbi/hebrew-vocab-hub-analysis.pbix + .pdf
git clone https://github.com/gzappaa/hebrew-vocab-hub-analysispip install -r requirements.txt.env at the same Postgres instance used by hebrew_vocab_hub_APInotebooks/, or regenerate the Excel workbook: python scripts/generate_workbook.pyA data pipeline that builds a structured Hebrew vocabulary dataset from multiple real-world Israeli sources — dictionary entries, song lyrics, news articles, and YouTube comments — and outputs a single unified JSON ready for use in language learning APIs, apps, or databases.
The core challenge was building a robust multi-source data pipeline across heterogeneous Hebrew data sources, dealing with rate limits, API restrictions, and inconsistent web structures, while ensuring ethical scraping practices and data normalization in a language outside my full fluency.
Full code and instructions are available at: https://github.com/gzappaa/hebrew_vocab_hub
~13,000 Hebrew words, each entry containing meanings with niqqudot, transcription, root, part of speech, full conjugation/declension tables, bilingual example sentences, and real-world frequency across songs, news, and YouTube.
{
"word": "חברה",
"multiple_meanings": true,
"meanings": [
{ "hebrew": "חֶבְרָה", "transcription": "chevra", "meaning": "company, society", ... },
{ "hebrew": "חֲבֵרָה", "transcription": "chavera", "meaning": "girlfriend; female friend", ... }
],
"sentences": [
{ "sentence": "החברה הזו גדולה.", "translation": "This company is big.", "source": "reverso" }
],
"sources": { "songs": 12, "news": 45, "youtube": 8, "total": 65 }
}
The dataset is PostgreSQL JSONB-ready — insert the whole document into a jsonb column and index on word.
git clone https://github.com/gzappaa/hebrew_vocab_hubpip install -r requirements.txt && playwright install chromiummake bootstrapmake dailymake testThis project is a modular, reproducible, and testable pipeline for scraping, processing, and analyzing book data from Books to Scrape. It collects book information, cleans and analyzes the data, downloads cover images, and generates PDF and Excel reports.
Full code and instructions are available at: https://github.com/gzappaa/Automated-Book-Data-Pipeline
UPC_title.jpg.git clone https://github.com/gzappaa/Automated-Book-Data-Pipelinepip install -r requirements.txtpython -m src.scraperdocker build -t book-pipeline . and docker run --rm -v ${PWD}/data:/app/data book-pipelineAll prices are numeric only (no € symbol), but amounts are in euros. All data outputs (JSON, PDFs, Excel, images) are saved in the data/ folder.
You can include some screenshots of PDFs, Excel sheets, or cover images here to make it more visual.
</body> </html>