Classic cocktail lounge website for Harlow's Bar, based in Valencia, Spain.
- Interactive menu with allergen indicators (egg, dairy, etc.), flavor profiles, sorting, and filtering
- Responsive design for mobile-first experience
- Fast loading and optimized for cell networks
- SEO-friendly markup and image handling
- Multilingual support (English, Spanish)
This is a Single Page Application (SPA) using Vue Router with history mode. To ensure proper routing and SEO indexing, the DigitalOcean App Platform configuration must include the catchall_document setting.
static_sites:
- build_command: npm run build
environment_slug: node-js
error_document: index.html
catchall_document: index.html # ← CRITICAL for SPA routing & SEO
github:
branch: master
deploy_on_push: true
repo: CodyManshack/harlows-website
index_document: index.html
name: harlows-website
output_dir: dist/spa
source_dir: /- Without it: Deep links like
/en/menureturn HTTP 404, breaking SEO and Google indexing - With it: All SPA routes return HTTP 200 with
index.html, allowing:- Vue Router to handle client-side navigation
- Google to properly crawl and index all pages
- Direct links to work correctly
Via DigitalOcean Control Panel:
- Go to Apps → Your App → Settings tab
- Click on the
harlows-websitestatic site component - Scroll to "Custom Pages" section
- Set Catchall to
index.html - Click Save
Via App Spec (recommended):
- Include the
catchall_document: index.htmlline in your app spec YAML - Update via doctl CLI or API, or commit the spec file to your repo
After deployment, verify the catchall is working:
curl -I https://harlows.bar/en/menuShould return:
HTTP/2 200 OK
If you see 404 Not Found, the catchall document is not configured correctly.
- Crop source image to 1:1 ratio
- Resize to our img src set using the
img_optimize.ps1script `img_optimize.ps1 "~/Downloads/Aviation.png" aviation
img_optimize requires imagemagick to be installed
- Copy newly created directory into the
/public/cocktailsfolder - Add the folder name to the menu item in
menu.js