Back to Portfolio

El Gran Jardin

Restaurant website & staff admin console — Denver, CO

Live — built by Howarth Tech Solutions
Visit elgranjardindenver.com
elgranjardindenver.com
El Gran Jardin restaurant website homepage screenshot

Overview

El Gran Jardin is a 7-page static marketing website and staff-operated admin console built for a family-run restaurant in Denver, CO. The public site covers the full customer journey — menu (with 33 real dish photos), happy hour, daily specials, About, Order Online, and Contact — with structured data and local-SEO foundations. All pages meet WCAG 2.1 AA and are served from a Caddy file server with automatic TLS renewal.

Behind the scenes, a separate SSR admin console at admin.elgranjardindenver.com gives non-technical staff a zero-config publishing workflow: upload a promotional flyer, let Claude’s vision API extract the events table, review and edit the rows, then click Publish — triggering a git commit/push and a host-side systemd path unit that rebuilds and rsyncs the static site automatically. One-click Undo performs a git revert + push. Staff never touch a terminal or a file system.

7
Public Pages
33
Dish Photos
−46%
Image Page Weight
WCAG AA
Accessibility

Tech Stack

Two cooperating Astro services on a single VPS — a static public site and a containerized SSR admin console.

Astro 4 (SSG)
7-page static public site
Astro 4 (SSR)
Staff admin console
TypeScript / JavaScript
End-to-end
Docker
Unprivileged admin container
Caddy
Reverse proxy + automatic TLS
Claude API
Vision extraction + promo generation
Resend
Magic-link auth email
GA4 + Schema.org JSON-LD
Analytics & local-SEO foundations
Architecture Highlight

The admin console is a fully independent SSR Astro app running in a resource-capped Docker container, reverse-proxied by Caddy on its own subdomain with its own Let’s Encrypt cert. Public traffic never reaches the container. On Publish, the admin pushes a git commit to the static site repo, and a host-side systemd .path unit watches for that commit and executes build-in-container.sh (node:20-alpine), then rsyncs the output to the live doc root — zero manual server steps for staff.

Key Features

A full customer-facing site plus a staff publishing system that requires no technical knowledge to operate.

🍳

33-Dish Photo Menu

  • Real dish photography optimized to WebP/AVIF
  • Menu page weight cut from 28 MB to 15 MB
  • No quality loss at any viewport size
  • Explicit width/height on every image to eliminate layout shift
📤

AI-Powered Flyer Publishing

  • Upload a promotional flyer → Claude vision extracts the events table
  • Staff reviews and edits extracted rows before anything goes live
  • Publish triggers a git commit/push + automated site rebuild
  • One-click Undo performs a git revert + push
🖉

Manual Edit Tools

  • Load and edit live events, daily specials, and happy hour schedules
  • Edit channel links and homepage specials strip in-browser
  • Republish without uploading a flyer
  • All edits go through the same two-phase preview/publish safety
🎨

AI Promo-Image Creator

  • Generates themed promotional images and captions via Claude API
  • Publishable to the homepage specials strip with one click
  • Staff-editable before any content goes live
  • Keeps promotional content fresh without a graphic designer
🔑

Passwordless Admin Login

  • Magic-link email via Resend
  • Staff allowlist-gated — no open registration
  • No passwords to lose, reset, or share
  • Session scoped to a single subdomain
🔎

Local-SEO Foundations

  • Schema.org JSON-LD: Restaurant, Menu, LocalBusiness
  • Sitemap and robots.txt
  • 15-channel visibility audit delivered at launch
  • Post-launch citation and review campaign in progress
elgranjardindenver.com/menu
El Gran Jardin menu page showing dish photos

Technical Highlights

The engineering that makes a non-technical staff member a safe, independent content publisher.

Automated Publish Pipeline

Staff clicks Publish → the admin console commits the content update and pushes to the static site repo → a host-side systemd .path unit fires, runs build-in-container.sh inside a node:20-alpine container, and rsyncs the output to the live doc root. Zero manual server steps at any point in the workflow.

🛡

Two-Phase Publish Safety

A mandatory Preview dry-run must succeed before the Publish button unlocks. Server-side validation re-runs before any git operation. AI extraction is never auto-published — it always goes through a staff review step. One-click Undo is a git revert + push, so every publish is fully reversible.

🔒

SSR Admin on an Unprivileged Container

The Astro SSR admin runs in a resource-capped Docker container bound to 127.0.0.1:4321, reverse-proxied by Caddy with its own Let’s Encrypt cert on the admin subdomain. Public ingress never reaches the container directly. The admin surface is completely separated from the static public site.

🤖

Claude API Integration for AI Workflows

Flyer images are routed to Claude vision to extract structured event rows into an editable table. The same Claude API generates themed promotional images and captions for the homepage specials strip. Both outputs are staff-editable before any content goes live — the AI accelerates the workflow without removing human review.

📈

Production-Gated Analytics

gtag.js is injected only when import.meta.env.PROD is true, so dev and preview traffic never pollutes the live GA4 stream. The restaurant team gets clean, actionable analytics from day one.

🖼

Optimized Asset Pipeline

33 dish photos were converted and compressed in-repo. WebP/AVIF dual-format delivery drops the menu page from 28 MB to 15 MB — a 46% reduction — without any perceptible quality loss. Every image carries explicit width/height attributes to eliminate cumulative layout shift.

What This Project Demonstrates

Full-cycle client engagement from requirements through a live, AI-augmented publishing system.

🤖
Claude API Integration
Vision extraction and promo generation wired into a staff-facing workflow with human review gates
Automated Rebuild Pipeline
Git push → systemd path unit → containerized build → rsync, with no manual server steps
🔒
Security-Layered Admin
Magic-link auth, unprivileged container, server-side re-validation before every git operation
🏠
Local-SEO Delivery
Schema.org Restaurant/Menu/LocalBusiness markup, 15-channel visibility audit, citation campaign
📷
Asset Optimization
33 dish photos from source to WebP/AVIF, −46% menu page weight, zero layout shift
👥
Non-Technical Client Delivery
A restaurant owner can delegate content publishing safely, without any terminal or file-system access

Need a site your staff can manage without touching a terminal?

El Gran Jardin is what it looks like when a marketing site and a staff publishing system are built together — structured data, AI-assisted workflows, and a rebuild pipeline that keeps a non-technical team independent. If your business needs the same, let’s talk.

Get In Touch Visit the Site

Frequently asked questions

What is the El Gran Jardin admin console?

A separate SSR Astro app that lets non-technical restaurant staff publish events, specials, and promotional content without touching a terminal — staff upload a flyer, Claude vision extracts the events table, staff reviews the rows, then clicks Publish to trigger an automated static-site rebuild and rsync.

Can you build a content-managed site for a restaurant or small business?

Yes — a static public site with a staff-facing admin console is a good fit for businesses that need a fast, secure public presence with simple content updates. See our web design & development service.

How does the automated rebuild pipeline work?

When staff click Publish, the admin console commits the content change and pushes to the static site repo. A host-side systemd path unit watches for the commit, runs a containerized Astro build, and rsyncs the output to the live doc root — typically completing in under a minute, with no manual server steps.

Related services & work

Want something like this built?

Tell us what you have in mind and we'll come back with an approach and a flat quote — no obligation.

Get a free quote See more work