harshith99 Claude Sonnet 4.6 commited on
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 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: '<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).',
 
 
 
 
 
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 &amp; 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>