🍇 Vinebound Tools Dashboard

Everything you need to manage and improve the site — works offline.

All Tools

🔍

Vineyard Validator

Checks all published vineyards for broken website URLs, dead booking links, missing fields (coordinates, copy, opening hours), and content changes on their live sites.

✓ Free — URL checks & missing fields 💰 ~0.5p per vineyard with copy — content change detection (optional toggle)
Needs CMS server
Start the CMS server
cd ~/Desktop/vinebound-site && node cms/server.js
🔗

Internal Link Suggester

Scans all published content for unlinked vineyard mentions, guide topics, county references, and review ↔ listing gaps. Approve and apply links directly to Google Sheets.

✓ Free — systematic audit 💰 ~1–4p per page — AI suggestions (optional)
Needs CMS server
1 — Start the CMS server
cd ~/Desktop/vinebound-site && node cms/server.js
2 — Open in browser
http://localhost:3001/links.html
âœī¸

CMS (Content Editor)

Edit vineyard listings, blog posts, and guides. AI-assisted editing, image management, email inbox, and site build trigger.

✓ Free — browsing, editing, publishing 💰 ~1–3p per request — AI edit / rewrite features
Needs CMS server
Start the CMS server
cd ~/Desktop/vinebound-site && node cms/server.js
Open in browser
http://localhost:3001
🍷

Vineyard Data Extractor

Extract structured data from vineyard websites — opening hours, booking links, contact details, facilities — ready to add to the vineyards sheet.

💰 ~2–5p per vineyard — uses Claude to read and extract from each site
Needs review server
Start the review server
cd ~/Desktop/vinebound-site && node vineyard-information-gathering/review-server.js
Open in browser
http://localhost:7842
🏆

Vineyard Rankings

Fetches Google Maps ratings and review counts for all published vineyards, calculates a Bayesian-weighted score, ranks them, and writes currentRank, rankChange, googleMapRatings, and googleMapReviews back to vineyards.csv. Place IDs are cached so subsequent runs are fast (~1 min). History saved to data/rankings-history.json.

💰 ~$0.001 per vineyard — Google Places API (first run only per vineyard) ✓ Free after first run — uses cached Place IDs
CLI only
Run rankings (live — updates vineyards.csv)
cd ~/Desktop/vinebound-site && npm run rankings
Preview only — no files written
cd ~/Desktop/vinebound-site && npm run rankings:dry
Re-fetch all Place IDs (e.g. after adding new vineyards)
cd ~/Desktop/vinebound-site && npm run rankings -- --force
To exclude a vineyard (hotel, golf course etc) — set in vineyards.csv
rankingExcluded = TRUE
📋

Google Sheets CLI

Read and write any sheet directly from the terminal. Used by Claude to manage all site content.

✓ Free — Google Sheets API has no cost at this scale
CLI only
Read a sheet
cd ~/Desktop/vinebound-site && node scripts/sheets.js read <spreadsheetId> <tabName>
List tabs in a spreadsheet
cd ~/Desktop/vinebound-site && node scripts/sheets.js tabs <spreadsheetId>
🌐

Local Site Preview

Build and preview the Eleventy site locally before deploying. Reflects the latest Google Sheets data.

✓ Free
Needs Eleventy
Start local preview
cd ~/Desktop/vinebound-site && npm start
Open in browser
http://localhost:8085
🗓

Events Coverage

Shows which vineyards have active events, which had events in the past, and which have none. Flags blind spots (no event URL, no Gmail contact). Export any selection as CSV. Add events directly to the sheet.

Needs CMS server
✓ Coverage data — free 💰 Event URL AI check — ~0.5p per URL
Start the CMS server (if not already running)
cd ~/Desktop/vinebound-site && node cms/server.js
📄

This Dashboard

Works offline. No server needed. Open directly from Finder or bookmark in your browser.

No server needed
File location — drag to your browser bookmarks bar
~/Desktop/vinebound-site/tools-dashboard.html

Troubleshooting

Click any issue to expand it. Each one includes a prompt you can copy and paste directly to Claude.

đŸšĢ The CMS server won't start â–ŧ

Usually caused by port 3001 already being in use, or a missing environment variable.

  1. Run lsof -i :3001 in Terminal to see what's using port 3001
  2. If something is running there, kill it: lsof -ti :3001 | xargs kill -9
  3. Make sure you're running the command from ~/Desktop/vinebound-site
  4. Check the .env file exists and has ANTHROPIC_API_KEY and Google credentials
Prompt to ask Claude
The Vinebound CMS server won't start. I'm running node cms/server.js from the project folder. The error message is: [paste error here]. Can you help me fix it?
🔗 The internal link suggester shows no suggestions â–ŧ

The audit ran but returned 0 results. Most likely the vineyard copy has no longDescriptions, or all suggestions have already been applied.

  1. Check the stats bar — does it show vineyards and posts loaded?
  2. Open browser DevTools (Cmd+Option+I) → Console tab for error messages
  3. Try the Network tab and look for a failed request to /api/links/audit
Prompt to ask Claude
The internal link suggester at localhost:3001/links.html is returning 0 suggestions after running the audit. The stats bar shows [X] vineyards, [X] posts, [X] guides. Can you check the audit logic and tell me why no suggestions are being found?
📊 A sheet change isn't showing on the live site â–ŧ

Content changes to Google Sheets only go live after a Netlify deploy. The site is not live-synced.

  1. Go to app.netlify.com and check the latest deploy status
  2. If no deploy has happened since the change, trigger one manually from the Netlify dashboard
  3. If a deploy ran but the content is wrong, check the sheet directly — the value may have saved incorrectly
Prompt to ask Claude
I updated a Google Sheet but the change isn't appearing on the live site. The sheet is [name the sheet]. I changed [describe the change]. Netlify last deployed at [time]. Can you help me work out what's wrong?
đŸ’Ĩ The Netlify build is failing â–ŧ

Build failures are usually caused by bad HTML in a sheet field, a missing slug, or a template error.

  1. Check the Netlify deploy log for the error message — it usually points to a specific file or data issue
  2. Try running npm start locally to reproduce the error
  3. If you recently updated a sheet, check for unescaped quotes or broken HTML in the content
Prompt to ask Claude
The Netlify build is failing. Here is the error from the deploy log: [paste error]. I last made these changes: [describe changes]. Can you help me find and fix the cause?
â†Šī¸ I need to undo a sheet change â–ŧ

Google Sheets keeps version history for 30 days. You can restore any previous version.

  1. In the sheet: File → Version history → See version history
  2. Find the version before your change and click "Restore this version"
  3. After restoring, trigger a new Netlify deploy to push it live
Prompt to ask Claude
I need to undo a change I made to the [name] sheet. The change was [describe it]. Can you help me identify the exact row and field so I can restore it, or update it to the correct value?
🔑 Google Sheets authentication is failing â–ŧ

OAuth tokens expire. If the sheets CLI or CMS stops being able to read/write sheets, the refresh token needs regenerating.

  1. Run node scripts/sheets.js read 11QNw1yUXW322XVOLyc9Mq-cacLx8YDbj8WnUAEtPnkE blog-content
  2. If you get an auth error, the token has expired
  3. Run node cms/scripts/setup-google-auth.js and follow the prompts
Prompt to ask Claude
Google Sheets authentication is failing when I try to run the sheets CLI or CMS. The error is: [paste error]. Can you walk me through regenerating the Google OAuth credentials?
🤖 The AI features aren't working (CMS, link suggester) â–ŧ

AI features use the Anthropic API. If they fail silently or return errors, the API key is the first thing to check.

  1. Check .env contains ANTHROPIC_API_KEY=sk-ant-...
  2. Check your Anthropic usage at console.anthropic.com
  3. Restart the CMS server after updating .env
Prompt to ask Claude
The AI features in the Vinebound CMS aren't working. When I try to use them the error is: [paste error]. Can you help me diagnose whether it's an API key issue, a code issue, or something else?

Sheets Reference

All the spreadsheet IDs and tab names in one place. Copy any ID to use with the CLI.

Collection Spreadsheet ID Tab name(s) Key fields
Blog posts
Grapevine
11QNw1yUXW322XVOLyc9Mq-cacLx8YDbj8WnUAEtPnkE ⎘ blog-content statusslugtitlebody_html
Vineyards
Main data
1bEM9fpwuQyHO50ScZ5pLZfs4mpYVAGJbxvhat1mr7Is ⎘ Published
vineyards_copy
publishedslugnamelongDescription
Events 1_6i3krVo6ML6grp-fgJhLsV1yS07fQ_7_oGmjIwIqLE ⎘ Make.com Data Entry moderation_statusstart_date
Guides
Theme & region
1NQQHzbuRzrKUEbdncADbNt7l8klHptwv4mtXAkvVePA ⎘ Published publishedslugtypefull_text
Area Guides 1kgGwk2hZ8MfcHJfcq6mQrgEiHgtc0-H_ptKLx77HXF8 ⎘ Published publishedsluglevelcounty
Filter config 1yTjBNgpJS12gDCyDbSbLAtuHwvQdeghGG-BKFKh0LLg ⎘ filter_config Map filter settings — do not edit without asking

Common CLI commands

Read all blog posts
cd ~/Desktop/vinebound-site && node scripts/sheets.js read 11QNw1yUXW322XVOLyc9Mq-cacLx8YDbj8WnUAEtPnkE blog-content
Read all published vineyards
cd ~/Desktop/vinebound-site && node scripts/sheets.js read 1bEM9fpwuQyHO50ScZ5pLZfs4mpYVAGJbxvhat1mr7Is Published
Read vineyard copy (descriptions)
cd ~/Desktop/vinebound-site && node scripts/sheets.js read 1bEM9fpwuQyHO50ScZ5pLZfs4mpYVAGJbxvhat1mr7Is vineyards_copy

Useful Prompts

Copy any prompt and paste it to Claude to get started quickly.

Content tasks

Add a new blog post (draft)
Add a new draft blog post to Grapevine with the title "[TITLE]", slug "[SLUG]", date today, excerpt "[EXCERPT]", and the following body content: [PASTE CONTENT]
Publish a draft post
Find the Grapevine blog post with slug "[SLUG]" and update its status to published.
Update vineyard copy
Update the shortDescription and longDescription for the vineyard with slug "[SLUG]" in the vineyards_copy sheet. Here's the new copy: [PASTE COPY]
Add an event
Add a new approved event to the events sheet. Vineyard: [NAME], slug: [SLUG], event title: [TITLE], type: [Tour & Tasting / Seasonal / Festival], start date: [YYYY-MM-DD], county: [COUNTY], postcode: [POSTCODE], description: [SHORT DESCRIPTION]

SEO & linking tasks

Run an internal link audit
Run the internal link audit on the Vinebound site and tell me how many suggestions it finds, grouped by type. Then walk me through the highest-priority ones.
Get AI link suggestions for a specific page
Give me AI-powered internal link suggestions for the [blog post / vineyard listing / guide] with slug "[SLUG]". List the anchor text, target URL, and the sentence it should go in.
Check which vineyards have no editorial copy
Read the vineyards_copy sheet and the Published vineyards sheet, then list all published vineyards that are missing a longDescription. Show slug and name.

Diagnostics

Check what's published
Read the blog-content sheet and tell me how many posts are published vs draft, listing all their slugs and titles.
Find a specific vineyard row
Find the row for the vineyard named "[NAME]" in the Published vineyards sheet and show me all its fields, including the row index number I'd need to update it.
Check for duplicate slugs
Read the Published vineyards sheet and check for any duplicate slug values. List any duplicates you find with their row numbers.