Spaces:
Runtime error
Runtime error
Commit Β·
7d20eac
1
Parent(s): 44d956c
UX: Docker nudge on landing, FAQ item, Ollama-aware tour step
Browse files- Add `.demo-docker-note` strip inside `#demo-hero` linking to GitHub repo for self-hosting with Docker
- Add FAQ item "Can I run this fully offline and free with Docker?" (after AI models FAQ)
- Tour model-picker step (`model-card`) is now Ollama-aware: on hosted (`OLLAMA_ENABLED=false`) the Ollama option is omitted; `body` can be string or function
- Update README.md and CLAUDE.md to document all three changes
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- CLAUDE.md +2 -1
- README.md +2 -1
- web/static/app.css +14 -0
- web/static/tour.js +7 -2
- web/templates/index.html +6 -0
CLAUDE.md
CHANGED
|
@@ -86,7 +86,8 @@ Key JS functions:
|
|
| 86 |
- `showSubTab(name)` β switches sub-panels (roulette / browse); auto-spins roulette on first visit
|
| 87 |
- `updateTabBadges()` β sets badge counts and stat strip
|
| 88 |
- `_closeFeedback()` β closes `#feedback-overlay`; also wired to Escape key and overlay-click. Submit handler constructs `FEEDBACK_REPO/issues/new?labels=enhancement&title=β¦&body=β¦` and opens it. `FEEDBACK_REPO` const at bottom of `app.js`.
|
| 89 |
-
- `startTour()` / `endTour()` β guided demo tour (defined in `tour.js`); Escape key closes the tour at any step. Injects `DEMO_ROWS` (8 hardcoded places) into `allRows`/`currentJobId`/`lastJobCost`, calls `renderStats`/`populateFilterDropdowns`/`applyFilters`/`updateTabBadges`, pre-fills the roulette pick card directly, then restores all state on exit. Triggered by `βΆ Watch demo` in `#demo-hero` (placed between `.header` and `#top-nav` in the HTML).
|
|
|
|
| 90 |
|
| 91 |
KML parser convention: folder nesting = country (outer) β city (inner); `<coordinates>` order is
|
| 92 |
**lng,lat,alt**; description CDATA uses `" Β· "` separator for category Β· cuisine Β· price.
|
|
|
|
| 86 |
- `showSubTab(name)` β switches sub-panels (roulette / browse); auto-spins roulette on first visit
|
| 87 |
- `updateTabBadges()` β sets badge counts and stat strip
|
| 88 |
- `_closeFeedback()` β closes `#feedback-overlay`; also wired to Escape key and overlay-click. Submit handler constructs `FEEDBACK_REPO/issues/new?labels=enhancement&title=β¦&body=β¦` and opens it. `FEEDBACK_REPO` const at bottom of `app.js`.
|
| 89 |
+
- `startTour()` / `endTour()` β guided demo tour (defined in `tour.js`); Escape key closes the tour at any step. Injects `DEMO_ROWS` (8 hardcoded places) into `allRows`/`currentJobId`/`lastJobCost`, calls `renderStats`/`populateFilterDropdowns`/`applyFilters`/`updateTabBadges`, pre-fills the roulette pick card directly, then restores all state on exit. Triggered by `βΆ Watch demo` in `#demo-hero` (placed between `.header` and `#top-nav` in the HTML). Step 2 (model-card) is **Ollama-aware**: `body()` checks `document.body.dataset.ollamaEnabled === 'true'`; hosted build omits Ollama. Tour `body` field can be a string or a `function()` (called at render time by `goToStep`).
|
| 90 |
+
- `#demo-hero` includes a `.demo-docker-note` strip (full-width row with `flex: 0 0 100%`, separated by border-top) that links to the GitHub repo for self-hosting with Docker. Only meaningful on the hosted build (Docker users already have the app).
|
| 91 |
|
| 92 |
KML parser convention: folder nesting = country (outer) β city (inner); `<coordinates>` order is
|
| 93 |
**lng,lat,alt**; description CDATA uses `" Β· "` separator for category Β· cuisine Β· price.
|
README.md
CHANGED
|
@@ -310,7 +310,8 @@ The UI lets you:
|
|
| 310 |
- **β FAQ** β system pipeline diagram, About The Belagurian, and answers to common questions
|
| 311 |
- After extraction completes, the app automatically jumps to Explore β Roulette and spins immediately
|
| 312 |
- **Pipeline timing note** β the progress card shows a persistent note ("usually 5β10 min β the bar may appear stuck during AI extraction") so users don't abandon a running job
|
| 313 |
-
- **βΆ Watch demo** β a hero card below the header launches a 6-step guided tour (Escape or β to exit at any step) with 8 pre-loaded real-world places (Tokyo, London, Paris, LA, Bangkokβ¦). The demo injects dummy data so users see a fully populated Roulette result, a Browse grid with a live Leaflet map, and the download bar β without uploading anything
|
|
|
|
| 314 |
- **π‘ Suggest a feature** β a floating pill button (bottom-right, always visible) opens a modal; fills in a GitHub issue title + details and opens a pre-filled `issues/new` URL in a new tab. Collapses to emoji-only on narrow screens; safe-area-inset aware for iOS Safari
|
| 315 |
- **Preview pins on a map** β an in-app Leaflet/OpenStreetMap map renders every geocoded place so you can sanity-check for misplaced pins before exporting. Follows your active filters; pins link back to the original reel
|
| 316 |
- **Filter and search** β text search by name/city, country, category, and cuisine dropdowns, multi-select price range chips, "missing pins" toggle, and a **π΄ Food only** toggle (on by default) that limits Browse and Roulette to food/drink places (Restaurant, Bar, Cafe, Bakery, Market) β all client-side with instant results
|
|
|
|
| 310 |
- **β FAQ** β system pipeline diagram, About The Belagurian, and answers to common questions
|
| 311 |
- After extraction completes, the app automatically jumps to Explore β Roulette and spins immediately
|
| 312 |
- **Pipeline timing note** β the progress card shows a persistent note ("usually 5β10 min β the bar may appear stuck during AI extraction") so users don't abandon a running job
|
| 313 |
+
- **βΆ Watch demo** β a hero card below the header launches a 6-step guided tour (Escape or β to exit at any step) with 8 pre-loaded real-world places (Tokyo, London, Paris, LA, Bangkokβ¦). The demo injects dummy data so users see a fully populated Roulette result, a Browse grid with a live Leaflet map, and the download bar β without uploading anything. The model-picker step is Ollama-aware: Ollama is only mentioned on Docker/local (where `OLLAMA_ENABLED=true`), not on the hosted build
|
| 314 |
+
- **π³ Docker self-host nudge** β a slim note below the hero card links to the GitHub repo for users who want fully free, offline extraction via Docker
|
| 315 |
- **π‘ Suggest a feature** β a floating pill button (bottom-right, always visible) opens a modal; fills in a GitHub issue title + details and opens a pre-filled `issues/new` URL in a new tab. Collapses to emoji-only on narrow screens; safe-area-inset aware for iOS Safari
|
| 316 |
- **Preview pins on a map** β an in-app Leaflet/OpenStreetMap map renders every geocoded place so you can sanity-check for misplaced pins before exporting. Follows your active filters; pins link back to the original reel
|
| 317 |
- **Filter and search** β text search by name/city, country, category, and cuisine dropdowns, multi-select price range chips, "missing pins" toggle, and a **π΄ Food only** toggle (on by default) that limits Browse and Roulette to food/drink places (Restaurant, Bar, Cafe, Bakery, Market) β all client-side with instant results
|
web/static/app.css
CHANGED
|
@@ -1146,6 +1146,20 @@
|
|
| 1146 |
font-size: 0.78rem;
|
| 1147 |
color: var(--muted);
|
| 1148 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1149 |
|
| 1150 |
.btn-tour {
|
| 1151 |
flex: 0 0 auto;
|
|
|
|
| 1146 |
font-size: 0.78rem;
|
| 1147 |
color: var(--muted);
|
| 1148 |
}
|
| 1149 |
+
.demo-docker-note {
|
| 1150 |
+
flex: 0 0 100%;
|
| 1151 |
+
font-size: 0.74rem;
|
| 1152 |
+
color: var(--muted);
|
| 1153 |
+
text-align: center;
|
| 1154 |
+
border-top: 1px solid var(--border);
|
| 1155 |
+
padding-top: 9px;
|
| 1156 |
+
margin: 2px 0 0;
|
| 1157 |
+
}
|
| 1158 |
+
.demo-docker-note a {
|
| 1159 |
+
color: var(--text);
|
| 1160 |
+
text-decoration: none;
|
| 1161 |
+
}
|
| 1162 |
+
.demo-docker-note a:hover { text-decoration: underline; }
|
| 1163 |
|
| 1164 |
.btn-tour {
|
| 1165 |
flex: 0 0 auto;
|
web/static/tour.js
CHANGED
|
@@ -75,7 +75,12 @@
|
|
| 75 |
{
|
| 76 |
id: 'model-card',
|
| 77 |
title: 'π€ Pick your AI',
|
| 78 |
-
body
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 79 |
},
|
| 80 |
{
|
| 81 |
id: 'run-btn-wrap',
|
|
@@ -257,7 +262,7 @@
|
|
| 257 |
_overlay.style.display = 'block';
|
| 258 |
|
| 259 |
document.getElementById('tour-title').textContent = s.title;
|
| 260 |
-
document.getElementById('tour-body').innerHTML = s.body;
|
| 261 |
document.getElementById('tour-counter').textContent = (n + 1) + ' / ' + STEPS.length;
|
| 262 |
document.getElementById('tour-back').style.display = n === 0 ? 'none' : '';
|
| 263 |
document.getElementById('tour-next').style.display = s.last ? 'none' : '';
|
|
|
|
| 75 |
{
|
| 76 |
id: 'model-card',
|
| 77 |
title: 'π€ Pick your AI',
|
| 78 |
+
body() {
|
| 79 |
+
const hasOllama = document.body.dataset.ollamaEnabled === 'true';
|
| 80 |
+
return hasOllama
|
| 81 |
+
? '<strong>Claude API</strong> (bring your Anthropic key) Β· <strong>Ollama</strong> (free, runs 100% on-device) Β· <strong>Free chatbot</strong> (paste into ChatGPT or Claude.ai β no key needed).'
|
| 82 |
+
: '<strong>Claude API</strong> (bring your Anthropic key, fast & accurate) Β· <strong>Free chatbot</strong> (paste into ChatGPT or Claude.ai β no API key needed).';
|
| 83 |
+
},
|
| 84 |
},
|
| 85 |
{
|
| 86 |
id: 'run-btn-wrap',
|
|
|
|
| 262 |
_overlay.style.display = 'block';
|
| 263 |
|
| 264 |
document.getElementById('tour-title').textContent = s.title;
|
| 265 |
+
document.getElementById('tour-body').innerHTML = typeof s.body === 'function' ? s.body() : s.body;
|
| 266 |
document.getElementById('tour-counter').textContent = (n + 1) + ' / ' + STEPS.length;
|
| 267 |
document.getElementById('tour-back').style.display = n === 0 ? 'none' : '';
|
| 268 |
document.getElementById('tour-next').style.display = s.last ? 'none' : '';
|
web/templates/index.html
CHANGED
|
@@ -29,6 +29,7 @@
|
|
| 29 |
<span>See what your saved posts become β real examples, no upload needed.</span>
|
| 30 |
</div>
|
| 31 |
<button class="btn-tour" onclick="startTour()">βΆ Watch demo</button>
|
|
|
|
| 32 |
</div>
|
| 33 |
|
| 34 |
<!-- ββ Top navigation (always visible) βββββββββββββββββββββββββ -->
|
|
@@ -471,6 +472,11 @@
|
|
| 471 |
<p>Three paths: <strong>Claude API</strong> (bring your own Anthropic key β Haiku is fast and cheap), <strong>Ollama</strong> (fully local, $0, needs the Ollama app running), or the <strong>free chatbot mode</strong> where you paste posts into ChatGPT or Claude.ai manually and bring the results back here. No API key required for the latter two.</p>
|
| 472 |
</details>
|
| 473 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 474 |
<details class="faq-item">
|
| 475 |
<summary>Why are some places missing map pins?</summary>
|
| 476 |
<p>Geocoding only succeeds when all three validation gates pass: country match, city match, and proximity check. If a place name is ambiguous or the caption doesn't include enough location context, the coordinates are left blank rather than guessing. You can fix missing pins manually via the Browse panel β click a card to edit it.</p>
|
|
|
|
| 29 |
<span>See what your saved posts become β real examples, no upload needed.</span>
|
| 30 |
</div>
|
| 31 |
<button class="btn-tour" onclick="startTour()">βΆ Watch demo</button>
|
| 32 |
+
<p class="demo-docker-note">π³ Want free, fully offline extraction? <a href="https://github.com/harshithbelagur/instagram-restaurant-mapper" target="_blank" rel="noopener">Self-host with Docker β</a></p>
|
| 33 |
</div>
|
| 34 |
|
| 35 |
<!-- ββ Top navigation (always visible) βββββββββββββββββββββββββ -->
|
|
|
|
| 472 |
<p>Three paths: <strong>Claude API</strong> (bring your own Anthropic key β Haiku is fast and cheap), <strong>Ollama</strong> (fully local, $0, needs the Ollama app running), or the <strong>free chatbot mode</strong> where you paste posts into ChatGPT or Claude.ai manually and bring the results back here. No API key required for the latter two.</p>
|
| 473 |
</details>
|
| 474 |
|
| 475 |
+
<details class="faq-item">
|
| 476 |
+
<summary>Can I run this fully offline and free with Docker?</summary>
|
| 477 |
+
<p>Yes β with the <strong>local Docker version</strong>. Clone the <a href="https://github.com/harshithbelagur/instagram-restaurant-mapper" target="_blank" rel="noopener">GitHub repo β</a>, then run <code>docker compose up</code>. Everything runs on your machine: Ollama handles AI extraction for free (llama3.2 downloads automatically on first run, ~2 GB), Nominatim geocodes locally, and nothing leaves your laptop. You get a third AI option in the UI β <strong>π¦ Ollama (free, local)</strong>.</p>
|
| 478 |
+
</details>
|
| 479 |
+
|
| 480 |
<details class="faq-item">
|
| 481 |
<summary>Why are some places missing map pins?</summary>
|
| 482 |
<p>Geocoding only succeeds when all three validation gates pass: country match, city match, and proximity check. If a place name is ambiguous or the caption doesn't include enough location context, the coordinates are left blank rather than guessing. You can fix missing pins manually via the Browse panel β click a card to edit it.</p>
|