- Remove _fetch_pixabay_api_image() function entirely
- Tier 6 (Pixabay) removed from _enrich_one_item — falls through to Pexels
- Re-enrich all items across Tokyo, Kyoto, Osaka, London with Pixabay-free pipeline
- Update all docstrings and tier references
- Zero Pixabay URLs remaining in cache for these cities
Source breakdown after repair:
Tokyo: 123 Wikimedia + 4 Pexels/Unsplash
Kyoto: 120 Wikimedia + 13 Pexels/Unsplash
Osaka: 96 Wikimedia + 37 Pexels/Unsplash
London: 110 Wikimedia + 23 Pexels/Unsplash
fix: upgrade Philosopher's Path (cherry blossoms) and Arashiyama Bamboo Grove (sunset) to premium Wikimedia photos
- Re-enriched 79 items that were cached with empty image_url in llm_cache
- Updated llm_cache to serve cached responses with real photos
- Updated image_cache with new Wikimedia/Unsplash/Pixabay entries
- Zero empty entries for Tokyo (111), Kyoto (105), Osaka (142)
- Zero empty entries in LLM cache for these three cities
fix: restore 5 missing Tokyo cache entries, upgrade Pixabay to Wikimedia
- Re-enriched 5 Tokyo items that were accidentally cleared from cache:
Kitanomaru Park, Odaiba Seaside Park, Kiyosumi Shirakawa,
Asakusa Nakamise Dori → now Wikimedia images
Omoide Yokocho → Pixabay (no Wikimedia alternative)
- Upgraded Koryuji, Myoshinji, Tofukuji (Kyoto) from Pixabay to Wikimedia
- No empty entries across Tokyo/Kyoto/Osaka
- Total cache: 5636 entries, all non-empty
- After Pixabay returns an image, re-check English Wikipedia and
Wikidata tiers in case they were rate-limited on first pass
- Added multi-language Wikipedia tier (fr/de/es/it/ja) as Tier 2
- Fixed cache check to skip empty-string entries (re-try failed items)
- Cache: non-empty URLs only — empty cache entries no longer block retries
chore: remove progress log from tracking (should always be gitignored)
Adds _translate_items_deep() which translates attraction text fields
using Google Translate via the deep-translator library. Uses
ThreadPoolExecutor (15 workers) to parallelize HTTP calls — translates
19 items × 4 fields (76 texts) in ~3-6s instead of ~45s.
Falls back to existing LLM translation for unsupported languages.
Existing JP/TC cache is preserved.
v0.1.24 — Fix Dockerfile: copy cache files to .cache/ not root
- Consolidate 4 JSON cache files into .cache/ folder
- Update all path references in recommender.py and 3 scripts
- Update README.md with new cache paths
v0.1.21 — Remove hermes docs from repo, dark theme fix, Tokyo default
- Remove hermes-plan.md, hermes-progress-log.md, .hermes-commit-approved from git tracking
- dark_theme.py: remove CSS @media fallback + JS polling, first card auto-expand on stack
- streamlit_app.py: default city changed to Tokyo
- .gitignore: consolidate 8 log patterns into single *.log, add .repair_progress.json
- recommender.py: expand docstrings on _geocode_city and _parse_json_response
- streamlit_app.py: warn user when all results fail location verification
- setInterval every 1s checks if narrow/wide state changed
- Catches cases where resize/MutationObserver events don't propagate
through nested iframe sandbox on huggingface.co/spaces/...
- Only triggers update when state actually changes (no unnecessary work)
Add @media (max-width: 768px) fallback for HF Spaces iframe stacking
- Stacking JS uses window.parent which fails when app is embedded
in a sandboxed cross-origin iframe (HF Spaces)
- Added CSS @media fallback to stack columns + hide map at ≤768px
- JS still handles card collapsing, search controls 4-row layout,
and responsive panel heights when it can reach the parent
- Added [data-testid="stAppViewContainer"] padding/margin: 0
- Added section.main margin/padding: 0
- Increased .main > div:first-child margin-top from -8px to -20px
- This removes the ~25px gap Streamlit inserts at the page top
- Removed max-height: 120px on .card-img in @media (max-width: 480px)
- The 16/9 aspect-ratio container was ~219px tall at full-width on iPhone
but the image was capped at 120px, revealing grey background below
- Images now fill the full aspect-ratio container correctly
- Separated collapseCards() from updateStack()
- MutationObserver now only calls updateStack() (layout: map hide/show,
search controls) — NEVER collapses cards
- collapseCards() only fires on load and resize, not on every DOM mutation
- This prevents the MutationObserver from instantly re-collapsing a card
the user just tapped to expand
- FLEX_PANELS_JS now checks for stack-columns class on body
- In narrow mode, cards container height set to 'auto' (no scroll cap)
- In narrow mode, max-height set to 'none' so all 6 cards are visible
- Parent LayoutWrapper height also cleared for consistency
- Changed stacking threshold from screen.width*0.50 to fixed 768px
breakpoint (old formula gave ~195px on iPhone — stacking never fired)
- Added MutationObserver to re-run stacking when Streamlit injects cards
and map via websocket after page load
- Map now hidden via inline JS style.setProperty in addition to CSS
- Card collapse retriggers on DOM mutations, not just window.load
v0.1.16 — Prewarm all 12 remaining cities (61/61 now cached)