commit 2f744811fc1224576ce752a647146c9302b3e278 Author: root Date: Fri Aug 7 10:40:57 2026 -0400 Initial commit: MSD backend API, docs, mockups, README diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..4b26ca0 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,15 @@ +# Moore Sunny Daze Changelog + +## 2026-07 + +### Added +- **Project brief** — property details for Maravilla 1403 (Miramar Beach, FL): 3BR/2BA, sleeps 8, owners Tim & Ashley Moore +- **Migration plan** — phased GoDaddy-to-Cloudflare domain transfer, Wix-to-custom direct-booking migration, email migration strategy +- **Anti-VRBO playbook** — strategy to move from platform-dependent bookings to direct reservations +- **Beach Direct product strategy** — white-label vacation rental website + booking system concept with 3 pricing tiers and no per-booking fees +- **Stripe reservation system** plan — calendar + payment integration for direct bookings +- **Email migration** documentation for moving from Gmail to branded domain email + +### Added +- **Theme mockups** (3 variants): theme-a-existing-style, theme-b-sunny-bold, theme-c-coastal-elegant +- **Admin dashboard mockup** — reservation management UI design diff --git a/README.md b/README.md new file mode 100644 index 0000000..58d45cb --- /dev/null +++ b/README.md @@ -0,0 +1,103 @@ +# Moore Sunny Daze + +**Direct-booking vacation rental site for Maravilla 1403, Miramar Beach FL.** + +| | | +|---|---| +| **Owners** | Tim & Ashley Moore | +| **Property** | Maravilla 1403 — 3BR/2BA, sleeps 8 | +| **Location** | Miramar Beach, FL 32550 | +| **Status** | 🚧 In Development | +| **Deployment** | Core (152.53.33.195) | + +## Architecture + +``` +mooresunnydaze.com +├── / (landing page) → /var/www/mooresunnydaze/index.html +├── /admin/ (dashboard) → /var/www/mooresunnydaze/admin.html +├── /api/* (booking API) → 127.0.0.1:8911 (FastAPI) +└── /stripe-webhook (payments) → 127.0.0.1:8911 +``` + +## Tech Stack + +| Layer | Tech | +|---|---| +| Frontend | Single-file HTML/CSS/JS (Coastal Elegant theme) | +| Backend | FastAPI + uvicorn (Python) | +| Database | SQLite | +| Payments | Stripe Checkout | +| Proxy | Caddy (reverse proxy + SSL) | +| Process | systemd | + +## API Endpoints + +### Public + +| Method | Path | Description | +|--------|------|-------------| +| GET | `/api/health` | Health check | +| GET | `/api/property` | Property details | +| GET | `/api/availability?month=YYYY-MM` | Booked dates for month | +| POST | `/api/quote` | Calculate price for dates | +| POST | `/api/booking` | Create booking → Stripe checkout | +| GET | `/api/booking/{id}` | View booking details | + +### Admin (Authorization: Bearer {key}) + +| Method | Path | Description | +|--------|------|-------------| +| GET | `/api/admin/stats` | Dashboard stats | +| GET | `/api/admin/bookings` | All bookings | +| GET | `/api/admin/guests` | Guest directory | +| PATCH | `/api/admin/booking/{id}` | Update booking status | +| POST | `/api/admin/block-date` | Block a date | +| DELETE | `/api/admin/block-date` | Unblock a date | + +### Stripe + +| Method | Path | Description | +|--------|------|-------------| +| POST | `/stripe-webhook` | Stripe webhook (test mode) | +| POST | `/stripe-webhook-live` | Stripe webhook (live mode) | + +## Pricing + +| Season | Dates | Nightly Rate | +|--------|-------|-------------| +| Peak | May 15 – Aug 15, holiday weeks | $295 | +| Off-peak | All other dates | $225 | +| Cleaning fee | Flat | $150 | +| Pet fee | Per stay | $50 | +| Minimum stay | | 3 nights | + +## Deployment + +```bash +# Quick start (test) +/opt/mooresunnydaze/venv/bin/uvicorn server:app --host 127.0.0.1 --port 8911 --app-dir /opt/mooresunnydaze + +# Production deploy +bash /tmp/deploy-msd.sh +``` + +## Environment + +Copy `.env.example` to `.env` and fill in: + +| Variable | Description | +|----------|-------------| +| `STRIPE_SECRET_KEY` | Stripe API secret key | +| `STRIPE_WEBHOOK_SECRET` | Stripe webhook signing secret | +| `MSD_ADMIN_API_KEY` | Admin dashboard auth key | + +## Related Projects + +- **Beach Direct** — Commercial product built from this reference implementation. See `docs/beach-direct-project.md`. + +## Domain + +- Current: `mooresunnydaze.com` (Wix, DNS: 185.230.63.x) +- Target: Transfer from GoDaddy → Cloudflare, point to Core (152.53.33.195) +- Migration plan: `docs/migration-plan.md` diff --git a/docs/anti-vrbo-playbook.md b/docs/anti-vrbo-playbook.md new file mode 100644 index 0000000..b534dcb --- /dev/null +++ b/docs/anti-vrbo-playbook.md @@ -0,0 +1,88 @@ +# Anti-VRBO Playbook — Beating Vacation Rental Site Bot Protection + +## Test Results (Aug 1, 2026) + +| Site | Protection | Camofox Result | Notes | +|------|-----------|---------------|-------| +| **Airbnb** | Cloudflare + custom | **BEATEN** ✓ | Full page load, 5.7KB body, all content extracted. Camofox + DataImpulse proxy cleared Cloudflare with zero issues. | +| **VRBO** | Imperva/Incapsula | **BLOCKED** ✗ | "Bot or Not?" challenge wall. Imperva blocks at the application layer even after Cloudflare passthrough. Challenge doesn't auto-resolve even after 45s wait. | +| **Booking.com** | Akamai | **Untested** | — | +| **Vacasa** | Unknown | **Untested** | — | +| **Evolve** | Unknown | **Untested** | — | + +## VRBO / Imperva — What We Tried + +### Failed Approaches +1. **Direct camofox navigation** — Landed on "Bot or Not?" challenge page with Imperva session ID +2. **Extended wait (45s)** — Challenge regenerates but never auto-resolves +3. **Snapshot inspection** — Imperva challenge page has almost zero interactive elements; just a logo link + +### Why Imperva Is Harder Than Cloudflare +- Cloudflare challenges happen at the edge (before the page loads) and Camoufox's C++-level fingerprint spoofing clears them +- Imperva challenges happen at the application layer AFTER the page loads — they inject their own JS that runs fingerprinting on top of whatever the browser reports +- Imperva's SDK (`window._Incapsula_Resource`) does behavioral analysis: mouse movements, scroll patterns, timing +- The challenge ID changes on every request (different UUID each time), suggesting it's stateless at the edge but stateful in their backend + +## Strategies to Beat VRBO + +### Strategy 1: Headful Browser with Human Emulation (Most Promising) +Instead of headless camofox, use a real Chrome/Chromium with CDP and emulate realistic human behavior: +``` +1. Launch Chrome with puppeteer-real-browser or nodriver +2. Navigate to VRBO +3. Inject human-like mouse movements (bezier curves, not straight lines) +4. Random scrolls and hover events +5. Wait for Imperva challenge to auto-resolve (usually 5-15s in a real browser) +6. Extract data once page loads normally +``` + +### Strategy 2: VRBO API Reverse Engineering +VRBO's frontend calls internal APIs. If we can find the endpoints: +- Search: `vrbo.com/api/v1/search?...` +- Property details: `vrbo.com/api/v1/properties/1313017` +- Calendar: `vrbo.com/api/v1/properties/1313017/calendar` + +Many of these may have weaker bot protection than the HTML pages. Imperva primarily protects the SSR HTML; API calls may use simpler auth. + +### Strategy 3: Browserbase / Anchor (Cloudflare Web Bot Auth) +If VRBO opts into Cloudflare's Bot Verifier program, Browserbase/Anchor can get a signed "verified bot" token. But this only works if VRBO explicitly allows it — unlikely for a booking site. + +### Strategy 4: Alternative Data Sources +Since Airbnb works perfectly with camofox, and most vacation rentals cross-list: +- **Airbnb** (working): Property details, pricing, reviews, calendar, photos +- **Google Travel / Hotel search**: Aggregates VRBO listings +- **VRBO via Google cache**: `webcache.googleusercontent.com/search?q=cache:vrbo.com/1313017` + +### Strategy 5: Proxy Rotation + Fingerprint Diversity +Imperva may be flagging specific DataImpulse IP ranges. Try: +- Different proxy providers (SOAX, Bright Data, IPRoyal) +- Different geolocations +- Different Camoufox fingerprint profiles +- Session-level IP rotation + +## Recommended Approach for Moore Sunny Daze + +**Short-term (now):** Use Airbnb data since camofox clears it consistently. All the same content is there — Tim's listing is synced across platforms. + +**Medium-term (this week):** Implement Strategy 1 (headful browser with human emulation) specifically for VRBO. This is the most reliable path. + +**Long-term (product):** Build a unified scraper that tries Airbnb first, falls back to headful browser for VRBO, and caches results. This becomes the "Competitive Intelligence" feature of Beach Direct — show owners how their property compares to nearby listings on ALL platforms. + +## Airbnb Data We Successfully Extracted + +From the Airbnb listing (camofox, Aug 1 2026): +- Full property description +- 47 amenities list +- 5.0 rating across all categories (cleanliness, accuracy, check-in, communication, location, value) +- 4 reviews with text +- Calendar availability for Aug-Sep 2026 +- Host: Ashley, 1 year hosting +- Property photos from Airbnb CDN +- Pricing: shown after date selection (requires interaction) + +## Next Steps +1. [x] Confirm camofox beats Airbnb +2. [x] Document VRBO Imperva failure +3. [ ] Test headful browser approach for VRBO +4. [ ] Test Booking.com, Vacasa, Evolve +5. [ ] Build unified scraper module for Beach Direct diff --git a/docs/email-migration.md b/docs/email-migration.md new file mode 100644 index 0000000..9ab86a2 --- /dev/null +++ b/docs/email-migration.md @@ -0,0 +1,85 @@ +# Moore Sunny Daze — Email Migration: Gmail → MXroute + +## Current State +- Tim & Ashley use a @gmail.com address for rental inquiries +- Business correspondence mixed with personal email +- No professional domain-based email + +## Target State +- **Email:** reservations@mooresunnydaze.com (or hello@, stay@ — TBD) +- **Platform:** Germaine's MXroute account +- **Access:** Webmail (Roundcube) + IMAP/SMTP for phone/desktop + +## Steps + +### 1. Create mailbox on MXroute +```bash +# Via MXroute DirectAdmin (Germaine's account) +# Add new mailbox: reservations@mooresunnydaze.com +# Generate strong password, save to Vaultwarden +``` + +### 2. Configure DNS at Cloudflare +After domain transfer is complete, add MX records: +``` +Type Name Content Priority TTL +MX @ mx1.mxroute.com 10 120 +MX @ mx2.mxroute.com 20 120 +TXT @ v=spf1 include:mxroute.com ~all 120 +``` + +### 3. Add DKIM (if MXroute provides it) +- Get DKIM record from MXroute control panel +- Add as TXT record in Cloudflare DNS + +### 4. Add DMARC (optional but recommended) +``` +Type Name Content +TXT _dmarc v=DMARC1; p=none; rua=mailto:g@germainebrown.com +``` + +### 5. Test email delivery +```bash +# Send test from external account +echo "test" | mail -s "Test" reservations@mooresunnydaze.com + +# Verify receipt in Roundcube +# Send reply back + +# Check SPF/DKIM/DMARC at mail-tester.com +``` + +### 6. Migrate existing emails (if needed) +- Google Takeout export of Gmail mailbox +- Import to MXroute via IMAP migration tool +- OR: set up Gmail forwarding for 90 days + +### 7. Configure on Tim & Ashley's devices +- iPhone: Settings → Mail → Add Account → Other → IMAP + - Server: mail.mxroute.com + - IMAP port: 993 (SSL) + - SMTP port: 587 (STARTTLS) or 465 (SSL) +- Desktop: same IMAP settings in Apple Mail / Outlook / Thunderbird + +### 8. Update all listings +- VRBO/Airbnb contact email → reservations@mooresunnydaze.com +- Facebook page contact → reservations@mooresunnydaze.com +- New website contact → reservations@mooresunnydaze.com +- Business cards/signage if any + +### 9. Transition period (90 days) +- Set Gmail auto-reply: "We've moved! Please email reservations@mooresunnydaze.com" +- Forward Gmail → MXroute for 90 days +- After 90 days: remove forwarding, keep Gmail for personal use only + +## Email addresses to set up +| Address | Purpose | Who accesses | +|---------|---------|-------------| +| reservations@ | Booking inquiries, guest communication | Tim & Ashley | +| stay@ | Alternative booking alias | Tim & Ashley | +| tim@ | Owner direct | Tim | +| ashley@ | Owner direct | Ashley | + +## Cost +- **$0 additional** — included in Germaine's existing MXroute plan +- Domain email hosting = free with our hosting diff --git a/docs/migration-plan.md b/docs/migration-plan.md new file mode 100644 index 0000000..500829b --- /dev/null +++ b/docs/migration-plan.md @@ -0,0 +1,99 @@ +# Moore Sunny Daze — Migration Plan + +- **Mockups:** https://mockup.iamgmb.com/mooresunnydaze/ — three theme options + admin dashboard +- **Deployment standard:** mockup.iamgmb.com for prototypes/design review, proposals.iamgmb.com for business documents + +## Current State +| Asset | Provider | Details | +|-------|----------|---------| +| Domain | GoDaddy | mooresunnydaze.com | +| Website | Wix | mooresunnydaze.com, Wix-built | +| Email | Gmail | @gmail.com (exact address TBD) | +| Booking | VRBO + Airbnb | vrbo.com/1313017, Airbnb listing | +| Social | Facebook | facebook.com/mooresunnydaze | + +## Phase 1: Domain Transfer (GoDaddy → Cloudflare) +**Timeline:** 5-7 days (ICANN-mandated transfer lock) + +### Steps +1. **Unlock domain at GoDaddy** + - GoDaddy Dashboard → Domain Settings → Turn off "Domain Lock" + +2. **Get authorization code from GoDaddy** + - Domain Settings → Transfer domain away → Copy auth code + - Auth code valid for 15 days + +3. **Initiate transfer at Cloudflare** + - Cloudflare Dashboard → Domain Registration → Transfer Domains + - Enter mooresunnydaze.com + auth code + - Cost: $10.46 (.com transfer, adds 1 year to registration) + +4. **Approve transfer** + - GoDaddy sends confirmation email → approve + - Optional: expedite by accepting at GoDaddy immediately + +5. **Wait for transfer** (5 days typical) + - Cloudflare auto-copies existing DNS records + - Nameservers switch to Cloudflare automatically + +6. **Verify DNS** + - Check all records propagated + - Enable DNSSEC (free at Cloudflare) + - Keep proxy off until site is deployed (grey cloud) + +## Phase 2: Website Migration (Wix → Us) +**Timeline:** After domain transfer + 24hr DNS propagation + +### Steps +1. **Build new site** on our infrastructure + - Serve from Core via Caddy + - Domain: mooresunnydaze.com (A record → 152.53.33.195) + - Static HTML landing page (single file) + booking portal pages + +2. **DNS cutover** + - Update A record for mooresunnydaze.com → Core IP + - Add www CNAME → mooresunnydaze.com + - Keep proxy off initially for Caddy ACME cert issuance + +3. **SSL certificate** + - Caddy auto-obtains Let's Encrypt cert on first request + - Verify: curl -sI https://mooresunnydaze.com → 200 + +4. **Enable Cloudflare proxy** (optional, after cert valid) + - Toggle orange cloud on A record + - Switch to Full (strict) SSL in Cloudflare dashboard + +5. **Post-migration cleanup** + - Cancel Wix subscription (wait until site live + verified) + - Export any Wix blog/content if needed + - Archive old Wix design as reference + +## Phase 3: Email Migration (Gmail → MXroute) +See separate email migration plan. + +## Phase 4: Booking System (VRBO/Airbnb → Direct) +### Short-term (keep both) +- Link "Book Now" to our own booking page +- Keep VRBO/Airbnb listings live during transition +- Add "Book Direct & Save" messaging on our site + +### Long-term (go direct) +- Build Stripe-integrated reservation system +- Remove/downgrade VRBO listing once direct bookings established +- Leverage existing Facebook following for direct booking marketing +- Offer returning guest discounts for direct bookings + +## Phase 5: Ongoing +- Nightly backups to S3 via hermes-backup +- Uptime monitoring via Uptime Kuma +- SSL auto-renewal via Caddy +- Monthly domain renewal check (Cloudflare auto-renew) + +## Risk Mitigation +| Risk | Mitigation | +|------|-----------| +| DNS propagation delay | Start transfer on Monday, complete before weekend | +| Wix SSL break during DNS cutover | Keep Wix site active until new cert issued | +| Email downtime during MX switch | Configure MXroute first, then change MX records | +| Booking loss during transition | Keep VRBO/Airbnb live for 60 days minimum | +| Domain transfer rejection | Verify domain unlocked + WHOIS privacy off at GoDaddy | diff --git a/docs/product-strategy-beach-direct.md b/docs/product-strategy-beach-direct.md new file mode 100644 index 0000000..2c28f2b --- /dev/null +++ b/docs/product-strategy-beach-direct.md @@ -0,0 +1,85 @@ +# Moore Sunny Daze — Product Strategy: Beach Direct + +## The Opportunity +Every vacation rental owner using VRBO/Airbnb pays 10-15% in platform fees. Tim's property is booked solid in peak season and has a 5.0-star rating with a growing following. This is the perfect profile for going direct. + +But the real opportunity is bigger: **this is a repeatable playbook** for ANY vacation rental owner who wants to escape platform fees without losing bookings. + +## Phase 1: Tim's Site (the blueprint) +Build Moore Sunny Daze as the reference implementation: +- Beautiful landing page with real photos +- Direct booking with Stripe (saves 10-15% vs VRBO) +- Admin dashboard for Tim to manage reservations +- Email marketing for returning guests +- Social media integration (Facebook following → direct bookings) + +## Phase 2: Beach Direct — The Product + +### What it is +A white-label vacation rental website + booking system for property owners who want to go direct. + +### Target Customer +- Owns 1-3 vacation rental properties +- Listed on VRBO/Airbnb but frustrated with fees +- Has some existing guest following (social, email list) +- Wants a professional direct-booking website +- Doesn't want to manage complex tech + +### Core Features +| Feature | Description | +|---------|-------------| +| Property Site | Single-page or multi-page custom site with their photos | +| Direct Booking | Calendar + Stripe payment integration | +| Admin Dashboard | Manage reservations, guest messages, availability | +| Guest CRM | Past guest database, email collection | +| Smart Pricing | Seasonal rates, minimum stays, holiday pricing | +| Email Automation | Booking confirmations, pre-arrival info, post-stay review request | +| Channel Sync | (v2) Sync availability calendar with VRBO/Airbnb to prevent double-booking | +| Analytics | Booking trends, revenue, guest sources | + +### Pricing Model +| Tier | Setup Fee | Monthly | Features | +|------|-----------|---------|----------| +| Starter | $997 | $47/mo | Landing page, basic booking, admin dashboard | +| Pro | $2,497 | $97/mo | + Email automation, guest CRM, smart pricing | +| Full Service | $3,997 | $197/mo | + Channel sync, analytics, priority support | + +*No per-booking fees — flat monthly only. This is the key differentiator vs VRBO.* + +### Tech Stack +- Frontend: Single-file HTML/CSS/JS (or SvelteKit for dashboard) +- Backend: FastAPI on Core/app1 (Python) +- Payments: Stripe Connect (direct to owner's bank) +- Database: SQLite per property (simple, portable) +- Email: Resend or Postmark for transactional +- Hosting: Included in monthly fee + +### Go-to-Market +1. **Tim's site** = first case study +2. **Cold outreach** to VRBO-listed owners in Destin/Miramar Beach area +3. **"Save $X,XXX/year" calculator** on our landing page +4. **Facebook groups** — vacation rental owner communities +5. **Referral program** — Tim refers other owners, gets free months + +### Revenue Math (per 10 clients at Pro tier) +- Setup: 10 × $2,497 = $24,970 (one-time) +- Monthly: 10 × $97 = $970/mo recurring +- Annual: $36,610 + +### Differentiators vs VRBO/Airbnb +| | VRBO/Airbnb | Beach Direct | +|---|-------------|-------------| +| Booking fee | 10-15% per booking | $0 per booking | +| Guest data | Platform owns it | Owner owns it | +| Branding | Platform-branded | Owner's brand | +| Pricing control | Algorithm-influenced | Full control | +| Guest relationship | Platform-mediated | Direct relationship | +| Email marketing | Not allowed | Built in | + +## Next Steps +1. Complete Tim's reference implementation +2. Document the build process as a playbook +3. Register beachdirect.io or similar domain +4. Build our own sales landing page +5. Target first 5 beta clients (free/discounted for testimonials) +6. Launch to Destin/Miramar Beach market diff --git a/docs/stripe-reservation-system.md b/docs/stripe-reservation-system.md new file mode 100644 index 0000000..1807aae --- /dev/null +++ b/docs/stripe-reservation-system.md @@ -0,0 +1,205 @@ +# Moore Sunny Daze — Reservation System with Stripe + +## Architecture Overview + +``` +Guest Browser → Landing Page → Check Availability → Book → Stripe Checkout → Confirmation + ↑ + Admin Dashboard (Tim) +``` + +## Components + +### 1. Public Booking Flow +``` +Landing Page (mooresunnydaze.com) + → "Check Availability" button + → Availability calendar (fetches from API) + → Select dates → guest count → price quote + → Guest details form (name, email, phone, # guests, pet?) + → Stripe Checkout (embedded or redirect) + → Confirmation page + email +``` + +### 2. Backend API (FastAPI on Core/app1) +| Endpoint | Method | Purpose | +|----------|--------|---------| +| `/api/availability` | GET | Get booked dates for a month | +| `/api/quote` | POST | Calculate price for selected dates | +| `/api/booking` | POST | Create booking (pending payment) | +| `/api/booking/{id}/confirm` | POST | Confirm after Stripe payment | +| `/api/booking/{id}` | GET | View booking details | +| `/api/guest/{email}` | GET | Lookup returning guest | + +### 3. Database Schema (SQLite) +```sql +-- Guests +CREATE TABLE guests ( + id TEXT PRIMARY KEY, + name TEXT NOT NULL, + email TEXT UNIQUE NOT NULL, + phone TEXT, + notes TEXT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +-- Bookings +CREATE TABLE bookings ( + id TEXT PRIMARY KEY, + guest_id TEXT REFERENCES guests(id), + check_in DATE NOT NULL, + check_out DATE NOT NULL, + guests_count INTEGER NOT NULL, + nightly_rate REAL NOT NULL, + cleaning_fee REAL DEFAULT 150, + total REAL NOT NULL, + status TEXT DEFAULT 'pending', -- pending, confirmed, cancelled, completed + stripe_session_id TEXT, + stripe_payment_intent TEXT, + notes TEXT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +-- Blocked Dates +CREATE TABLE blocked_dates ( + date DATE PRIMARY KEY, + reason TEXT -- 'booking_XYZ', 'maintenance', 'owner' +); + +-- Rate Rules +CREATE TABLE rate_rules ( + id TEXT PRIMARY KEY, + name TEXT, + start_date DATE, + end_date DATE, + nightly_rate REAL, + min_nights INTEGER DEFAULT 3 +); +``` + +## Stripe Integration + +### Setup +1. Tim creates Stripe account (stripe.com) +2. Connects business bank account +3. We get API keys from Stripe Dashboard +4. Store in `.env` on server + +### Payment Flow +```python +# 1. Create Stripe Checkout Session +session = stripe.checkout.Session.create( + payment_method_types=['card'], + line_items=[{ + 'price_data': { + 'currency': 'usd', + 'product_data': { + 'name': f'Moore Sunny Daze — {nights} nights', + 'description': f'{check_in} to {check_out}, {guests} guests' + }, + 'unit_amount': int(total * 100), # cents + }, + 'quantity': 1 + }], + mode='payment', + success_url='https://mooresunnydaze.com/booking/confirmed?session_id={CHECKOUT_SESSION_ID}', + cancel_url='https://mooresunnydaze.com/booking/cancelled', + customer_email=guest_email, + metadata={ + 'booking_id': booking_id, + 'property': 'moore-sunny-daze' + } +) + +# 2. Redirect to session.url +# 3. Stripe webhook → mark booking confirmed +``` + +### Webhook Handling +```python +@app.post("/stripe-webhook") +async def stripe_webhook(request: Request): + payload = await request.body() + sig = request.headers.get('stripe-signature') + event = stripe.Webhook.construct_event(payload, sig, WEBHOOK_SECRET) + + if event['type'] == 'checkout.session.completed': + session = event['data']['object'] + booking_id = session['metadata']['booking_id'] + mark_booking_confirmed(booking_id) + send_confirmation_email(booking_id) + add_blocked_dates(booking_id) + + return {"status": "ok"} +``` + +## Deployment + +### Server +- Deploy on Core (152.53.33.195) as systemd service +- Port: 8910 (internal) +- Caddy reverse proxy: `mooresunnydaze.com/api/* → localhost:8910` + +### Filesystem +``` +/opt/mooresunnydaze/ +├── server.py # FastAPI app +├── db.sqlite # SQLite database +├── .env # STRIPE_SECRET_KEY, etc +├── requirements.txt # fastapi, uvicorn, stripe, aiosqlite +└── templates/ # Email templates +``` + +### systemd Service +```ini +# /etc/systemd/system/mooresunnydaze.service +[Unit] +Description=Moore Sunny Daze Booking API +After=network.target + +[Service] +Type=simple +User=root +WorkingDirectory=/opt/mooresunnydaze +ExecStart=/opt/mooresunnydaze/venv/bin/uvicorn server:app --host 127.0.0.1 --port 8910 +Restart=always + +[Install] +WantedBy=multi-user.target +``` + +## Admin Features +1. **Calendar view** — booked/available/blocked dates +2. **Booking management** — confirm, cancel, view details +3. **Guest directory** — past guests, contact info, stay history +4. **Rate management** — seasonal pricing, minimum stays +5. **Block dates** — maintenance, owner use +6. **Revenue reports** — monthly/annual totals +7. **Email templates** — confirmation, pre-arrival, post-stay + +## Pricing Integration +Tim's property is currently listed at ~$295/night (peak season, from Airbnb). We'd implement: +- **Base rate:** $295/night peak, $225/night off-peak +- **Cleaning fee:** $150 flat +- **Pet fee:** $50 (if applicable) +- **Minimum stay:** 3 nights +- **Holiday premium:** +20% for major holidays + +## Comparison: Direct vs VRBO +| | VRBO (current) | Direct (our system) | +|---|---|---| +| 3-night stay @ $295 | $885 + VRBO fee (~$130) | $885 (no fee) | +| Guest pays | ~$1,015 | $885 | +| Owner receives | ~$885 - VRBO 5% host fee | $885 - Stripe 2.9% | +| Owner net | ~$840 | ~$859 | +| **Savings to guest** | — | **$130 (13%)** | +| **Savings to owner** | — | **~$19/stay + guest relationship** | + +## Next Steps +1. ✅ Design complete +2. Set up Stripe account for Tim +3. Build FastAPI backend +4. Deploy on Core +5. Wire up booking widget on landing page +6. Test end-to-end booking flow +7. Go live diff --git a/mockups/admin-dashboard.html b/mockups/admin-dashboard.html new file mode 100644 index 0000000..d2337a9 --- /dev/null +++ b/mockups/admin-dashboard.html @@ -0,0 +1,398 @@ + + + + + +Moore Sunny Daze — Admin Dashboard + + + + + + + + +
+ + +
+
+

Dashboard Overview

+
Aug 2026
+
+ +
+
+
Upcoming Bookings
+
4
+
Next: Aug 22-25
+
+
+
Revenue (Month)
+
$8,240
+
+12% vs last month
+
+
+
Occupancy Rate
+
82%
+
August 2026
+
+
+
Avg Nightly Rate
+
$295
+
Peak season pricing
+
+
+ +
+
+
+

Upcoming Reservations

+ 4 +
+ + + + + + + + + + + + + + + + + + + + +
GuestCheck-InCheck-OutGuestsTotalStatus
Sarah JohnsonAug 22Aug 256$885Confirmed
Mark DavidsonAug 30Sep 24$1,180Confirmed
Rachel KimSep 5Sep 88$885Pending
Thompson FamilySep 12Sep 175$1,475Confirmed
+
+ +
+
+

Recent Guests

+
+
+
JD
+
+
James & Dana Miller
+
Aug 8-11 · 4 guests · ★★★★★
+
+
+
+
CW
+
+
Chris Williams
+
Aug 1-4 · 2 guests · ★★★★★
+
+
+
+
BR
+
+
Brittany & Robert Chen
+
Jul 25-28 · 6 guests · ★★★★☆
+
+
+
+
KP
+
+
Kevin Porter
+
Jul 18-22 · 3 guests · ★★★★★
+
+
+
+ +
+
+

Monthly Revenue

+
+
+
+
+ Jul +
+
+
+ Aug +
+
+
+ Sep +
+
+
+ Oct +
+
+
+
+
+ + +
+
+

Reservation Calendar

+
+ + August 2026 + +
+
+
+
+
Sun
Mon
Tue
Wed
Thu
Fri
Sat
+
1
2
3
4
5
6
7
+
8
9
10
11
12
13
14
+
15
16
17
18
19
20
21
+
22
23
24
25
26
27
28
+
29
30
31
+
+
+ Booked + Available +
+
+
+ + +
+
+

Guest Directory

+ +
+
+ + + + + + + + + +
NameEmailLast StayTotal StaysRating
James & Dana Millerjdmiller@gmail.comAug 8-11, 20263★★★★★
Chris Williamschris.williams@yahoo.comAug 1-4, 20261★★★★★
Brittany & Robert Chenbrittchen@gmail.comJul 25-28, 20262★★★★☆
Kevin Porterkporter@outlook.comJul 18-22, 20261★★★★★
Sarah Johnsonsjohnson@gmail.comUpcoming: Aug 224★★★★★
+
+
+ + +
+
+

All Bookings

+ +
+
+ + + + + + + + + + +
IDGuestCheck-InCheck-OutNightsGuestsTotalStatus
#1042Sarah JohnsonAug 22Aug 2536$885Confirmed
#1041Mark DavidsonAug 30Sep 234$1,180Confirmed
#1040Rachel KimSep 5Sep 838$885Pending
#1039Thompson FamilySep 12Sep 1755$1,475Confirmed
#1038James MillerAug 8Aug 1134$885Completed
#1037Chris WilliamsAug 1Aug 432$750Completed
+
+
+ + +
+
+

Property Settings

+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ +
+ + + + diff --git a/mockups/theme-a-existing-style.html b/mockups/theme-a-existing-style.html new file mode 100644 index 0000000..e11d608 --- /dev/null +++ b/mockups/theme-a-existing-style.html @@ -0,0 +1,604 @@ + + + + + +Moore Sunny Daze — Maravilla 1403 | Miramar Beach, FL + + + + + + + + +
+
+
+

Maravilla 1403 · Miramar Beach, Florida

+

Your Sunny Beach
Escape Awaits

+

3BR / 2BA · Sleeps 8 · Gated Beachfront Community
2.5 acres of sugar-white sand on the Emerald Coast

+ 🏖️ Book Your Stay +
+
+ +
+
+ + +
+
+
+
+ +

Moore Sunny Daze

+

Come make family memories at our beautiful beachfront condo in Maravilla — a gated resort community on Miramar Beach. With 3 bedrooms, 2 baths, and room for up to 8 guests, it's the perfect home base for your Emerald Coast getaway.

+

Wake up to Gulf views from the private balcony, spend your days on our 2.5 acres of private sugar-white sand beach, and unwind in one of two sparkling pools. Whether you're here for the beaches, the dining, or just some quality family time — Moore Sunny Daze delivers.

+
+ 🛏️ 3 Bedrooms + 🛁 2 Baths + 👨‍👩‍👧‍👦 Sleeps 8 + 🏖️ Beachfront + 🐕 Dog Friendly +
+
+
+ Living room at Moore Sunny Daze +
+
+
+
+ + +
+
+ +

Room to Relax

+

Four comfortable sleeping spaces — perfect for families and groups of up to 8.

+
+
+ King suite bedroom +
+ 🛏️ Primary Suite +

King Suite with Private Bath

+

Spacious king bedroom with en-suite bathroom and private balcony access — wake up to Gulf breezes.

+
+
+
+ Second king bedroom +
+ 🛏️ Second Bedroom +

King with Bath Access

+

Comfortable king bedroom with direct access to a full bathroom — restful and private.

+
+
+
+ Bunk room +
+ 👧 Kids' Favorite +

Bunk Room

+

Fun bunk beds with hallway bath access — the kids will love it!

+
+
+
+ Living room with sleeper sofa +
+ 🛋️ Living Room +

Queen Sleeper Sofa

+

New queen sleeper sofa in the living room — comfortable extra sleeping for two.

+
+
+
+
+
+ + +
+
+
+
+ Kitchen and dining area +
+
+ +

Fully Equipped
Kitchen & Living

+

Cook like you're at home in our fully equipped kitchen with modern appliances, spacious countertops, and a dining area for family meals. The open-concept living room flows seamlessly to the balcony — perfect for gathering after a day at the beach.

+
+ 🍳 Full Kitchen + 📺 WiFi + TV + ❄️ Central A/C + 🅿️ Free Parking +
+
+
+
+
+ + +
+
+ +

Everything You Need

+

Maravilla offers resort-style amenities for the whole family — all just steps from your door.

+
+
+ 🏊 +

2 Pools

+

One heated in winter

+
+
+ ♨️ +

Hot Tub

+

Open year-round

+
+
+ 🏖️ +

Private Beach

+

2.5 acres of white sand

+
+
+ 🎾 +

Tennis & Pickleball

+

2 courts, 1 lined for pickleball

+
+
+ 🏀 +

Basketball

+

Full court

+
+
+ 🍖 +

BBQ Grills

+

Poolside grilling

+
+
+ 💪 +

Fitness Center

+

Stay active on vacation

+
+
+ 🐕 +

Dog Friendly

+

Bring your furry family

+
+
+ 🔑 +

Self Check-In

+

Keypad entry

+
+
+ 🪑 +

Beach Service

+

4 chairs + 2 umbrellas

+
+
+
+
+ + +
+
+ +

Pool, Beach & Beyond

+

From the pool deck to the sugar-white shoreline — every angle is postcard-worthy.

+
+ Maravilla pool + Miramar Beach view +
+
+
+ + +
+
+ +

Beach Service Included

+

Available mid-March through late October — set up and waiting for you every morning.

+
+
+
4
+
Beach Chairs
+
+
+
2
+
Umbrellas
+
+
+
2.5
+
Acres Private Beach
+
+
+
+
+ + +
+
+
+ +

Maravilla Resort

+

A gated beachfront community on Miramar Beach — where the Emerald Coast shines brightest.

+
+
+
🏘️
+

Gated Community

+

Secure, private access for residents and guests only.

+
+
+
🏖️
+

2.5 Acre Private Beach

+

Sugar-white sand stretching along the Gulf — never crowded.

+
+
+
📍
+

Prime Location

+

On Scenic Gulf Drive between Destin Harbor and 30A — close to everything.

+
+
+
🌅
+

Gulf Views

+

Stunning sunsets from your private balcony — every evening is a show.

+
+
+
+
+ + +
+
+ +

Nearby Restaurants & Attractions

+

Everything you need within a few miles — from casual beach eats to upscale dining and shopping.

+
+ + + +
+
+
🦞
Pompano Joe'sBeachfront seafood, casual
+
🐟
Captain Dave'sFresh Gulf seafood
+
🍔
Surf HutBeachside burgers & drinks
+
🦀
Kenny D'sLocal seafood favorite
+
🍝
Mama Clemenza'sItalian breakfast & brunch
+
🍷
BijouxUpscale New Orleans seafood
+
🧀
Vin'Tij Food & WineWine bar at Grand Blvd
+
🌺
Tommy BahamaIsland-inspired dining
+
+ + +
+
+ + +
+
+
+ Tim & Ashley Moore +
+ +

Tim & Ashley Moore

+

Welcome to our family's beach retreat!

+

We fell in love with Miramar Beach years ago and are thrilled to share our slice of paradise with you. Our goal is simple: give your family the kind of beach vacation that turns into a tradition. We've stocked the condo with everything you need, partnered with the best beach service on the coast, and are always just a message away.

+

"Come soak up the sun and make some memories. That's what Moore Sunny Daze is all about."

+

— Tim & Ashley

+
+
+
+
+ + +
+
+ +

Book Your Stay at Moore Sunny Daze

+

Maravilla 1403 · Miramar Beach, FL · 3BR / 2BA · Sleeps 8 · Dog Friendly

+ 🏖️ Check Availability on VRBO +

Also available on Airbnb — 5.0 ⭐ · 3-night minimum

+
+
+ + + + + +🏖️ Book Now + + + + + \ No newline at end of file diff --git a/mockups/theme-b-sunny-bold.html b/mockups/theme-b-sunny-bold.html new file mode 100644 index 0000000..470c0ec --- /dev/null +++ b/mockups/theme-b-sunny-bold.html @@ -0,0 +1,789 @@ + + + + + +Moore Sunny Daze — Maravilla 1403 | Miramar Beach Vacation Rental + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
🏖️ Maravilla 1403 • Miramar Beach, FL
+

+ Your Sunny + Beach Escape Awaits +

+

+ A vibrant 3-bedroom condo in the gated Maravilla resort — 2.5 acres of private sugar-white sand, two pools, and endless Gulf views. +

+ +
+
+ + + + +
+
+ + +
+
+
+
+ 🛏️ +
0
+
Bedrooms
+
+
+ 🚿 +
0
+
Bathrooms
+
+
+ 👨‍👩‍👧‍👦 +
0
+
Sleeps
+
+
+ +
0
+
Star Rating
+
+
+
+
+ + +
+
+
+ +

Room to Relax & Unwind

+

Three beautifully appointed bedrooms plus a queen sleeper sofa — comfortably sleeping 8 guests.

+
+
+ +
+
+ Primary King Suite + PRIMARY +
+
+

King Suite

+
🛏️ King Bed
+
Private en-suite bath • Balcony access
+
+
+ +
+
+ Second King Bedroom + GUEST +
+
+

King Guest Room

+
🛏️ King Bed
+
Direct access to full bath
+
+
+ +
+
+ Bunk Room + KIDS +
+
+

Bunk Room

+
🛏️ Bunk Beds
+
Shared hallway bath • Perfect for kids
+
+
+ +
+
+
🛋️
+
+

Living Room Sleeper

+

Brand-new queen sleeper sofa — comfortable for 2 additional guests

+
+
+
+
🌅
+
+

Private Balcony

+

Sip your morning coffee with Gulf breezes and sunset views

+
+
+
+
+
+
+ + +
+
+ Kitchen & Dining +
+ INTERIOR +

Fully Equipped Kitchen

+

Modern appliances & everything you need to cook for the crew

+
+
+
+ Living Room +
+ LIVING +

Open-Concept Living

+

Spacious living area with Gulf views & brand-new sleeper sofa

+
+
+
+ + +
+
+
+
+

2.5 Acres of Private Sugar-White Sand

+

Step out of your condo and onto one of Florida's most beautiful beaches. Beach service included — 4 chairs and 2 umbrellas ready for you.

+
+
+
2.5
+
Private Acres
+
+
+
4
+
Beach Chairs
+
+
+
2
+
Umbrellas
+
+
+
+
+
+ + +
+
+
+ +

Everything You Need for the Perfect Stay

+

Maravilla has it all — pools, sports, fitness, and more. Here's what's waiting for you.

+
+
+
+ 🏊 +

2 Resort Pools

+

One heated in winter — swim year-round

+
+
+ ♨️ +

Hot Tub

+

Soak under the stars after a beach day

+
+
+ 🎾 +

Tennis & Pickleball

+

2 tennis courts, 1 lined for pickleball

+
+
+ 🏀 +

Basketball Court

+

Shoot hoops with the family

+
+
+ 🍖 +

BBQ Grills

+

Cook out by the pool — grills provided

+
+
+ 💪 +

Fitness Center

+

Stay active with resort gym access

+
+
+ 🐕 +

Dog Friendly

+

Bring your furry family member along!

+
+
+ 🔑 +

Self Check-In

+

Keypad entry — arrive on your schedule

+
+ +
+ 📶 +

Free WiFi

+

High-speed internet throughout the condo

+
+
+ 🚗 +

Free Parking

+

Ample parking right at the building

+
+
+ ❄️ +

Central A/C

+

Stay cool after a day in the Florida sun

+
+
+
+
+ + +
+
+
+ +

Explore Miramar Beach

+

Between Destin Harbor and iconic 30A — the best of the Emerald Coast at your doorstep.

+
+
+
+
+ Beach +
+
+ 🏖️ BEACH +

James Lee Beach

+

Direct beach access from Maravilla — walk out your door onto soft white sand and emerald water.

+
+
+
+
+ Destin Harbor +
+
+ 🎣 FISHING +

Destin Harbor

+

World's Luckiest Fishing Village — charter a boat, stroll the boardwalk, or dine with harbor views.

+
+
+
+
+ 30A +
+
+ 🛣️ SCENIC DRIVE +

Highway 30A

+

Scenic coastal highway with boutique towns, art galleries, and award-winning dining.

+
+
+
+ +
+

🍽️ Nearby Restaurants

+
+
Pompano Joe'sSeafood • Beachfront
+
Captain Dave'sSeafood • Gulf Views
+
Surf HutCasual • Beach Bar
+
Kenny D'sAmerican • Family
+
Mama Clemenza'sItalian Breakfast
+
BijouxUpscale Seafood
+
Vin'Tij Wine BarWine & Dining
+
Tommy BahamaIsland-Inspired
+
+
+ +
+

🛍️ Shopping Nearby

+

+ Winn-Dixie & Wal-Mart for groceries • Grand Blvd shopping district • Silver Sands Premium Outlets • Sandestin Outlet Mall — all within 3 miles +

+
+
+
+ + +
+
+

Ready for Your Sunny Escape?

+

3-night minimum stay. Peak summer dates book solid — reserve your slice of paradise today.

+ + ☀️ Book Now on VRBO + + +
+
5.0 ★ on Airbnb
+
Instant Booking
+
Beach Service Included
+
Free Cancellation Window
+
+
+
+ + +
+
+
+ Tim & Ashley Moore +

Tim & Ashley Moore

+

Your Hosts

+

"We fell in love with Miramar Beach and can't wait to share our slice of paradise with you. Whether it's your first visit or your tenth, we're committed to making your stay unforgettable."

+
+
+
+ + +