Honey Butter

Let’s Build a Website Like It’s 2002 (But Smarter) – Part 1: Building Our Site Content with JSON

Categories

The Return of the Mighty Static Site

Before WordPress, before React, before everything needed a build step, a database, and 37 dependencies, websites were…simple. From the birth of the web up through the early 2000s, most sites were just files on a server. HTML, CSS, maybe some JavaScript. That was it.

Then CMS platforms arrived, WordPress exploded, and web development became incredibly powerful. And don’t get me wrong – it’s exciting. The modern web is wild.

But here’s the question I keep coming back to: If a site is mostly static, why does it need React or WordPress behind it at all? Often, it doesn’t.

For sites that don’t change daily – or even weekly – a full CMS can feel like massive overkill. It adds complexity, maintenance, security risk, and performance overhead that simply isn’t necessary.

So in this tutorial, I want to walk you through building a semi-static website – one that’s fast, secure, easy to maintain, and still takes advantage of modern CSS and JavaScript. No database. No CMS. No plugin anxiety. Just files. On a server. Like the old days – but smarter. It may look daunting and a lot of work, but once you get it set up, you won’t have to touch the php files again unless you add additional pages or functionality.

What We’re Building (And Why)

We’re going to build a simple provider website using a data-driven static approach – without relying on frameworks or build tools. To keep things grounded, we’ll work from a realistic (but fictitious) brief and build out a full set of standard pages: a landing/disclaimer page, About, Gallery, Rates, FAQ, Contact, Wishlist, and a Thank You page shown after form submission.

Our site for ficticious provider, Emily Valentina.

Ev2
Ev2
Ev2
Ev2
Ev2
Ev2

Here’s the idea:

  • All site content lives in one JSON file
  • PHP reads that file and injects content into templates
  • Pages are assembled server-side, once per request
  • No database
  • No admin panel
  • No plugins
  • Very little to break

The result?

  • Fast
  • Secure
  • Easy to understand
  • Easy to maintain

Once the site is launched, you rarely need to touch the core code again. Updates mean editing one JSON file or uploading images via FTP.

The Tech Stack

This is a conscious return to old-school methods, and I’m more than a little giddy about it. We’ll use:

  • PHP – to assemble pages and parse data
  • JSON – as a lightweight, file-based “database”
  • HTML – clean, semantic markup
  • Modern CSS – Grid, variables, responsive layouts
  • JavaScript – minimal, purposeful enhancements
  • LibrariesGSAP (robust JavaScript animation library), jQuery UI (easy to implement tabs and accordions), Fancybox (JavaScript lightbox functionality for our gallery images)

Hosting & Requirements

You can absolutely build this locally on Mac or Windows, as long as PHP is enabled. But to go live, you’ll need:

  • A basic web host
  • PHP support (almost all shared hosting has this)
  • FTP access

Nothing fancy. This site has extremely low overhead. I typically recommend:

  • TMD Hosting (solid performance, inexpensive, free domain)
  • DreamHost

Expect around $5–6/month.

Folder Structure

Here’s the basic structure we’ll use:

/root
  /includes
    header.php
    footer.php
    functions.php
  /css
  /js
  /images
  /data
    content.json
  index.php
  about.php
  gallery.php
  rates.php
  faq.php
  contact.php
  wishlist.php
  thank-you.php

Building Our Site Content with JSON

As mentioned earlier, we intentionally house all site content in one place – content.json – to keep updates simple, consistent, and maintainable. JSON is the most effective format for achieving this.

What Is JSON, Really?

JSON (JavaScript Object Notation) is just a simple way to store information in a format that both people and computers can understand. It organizes content into clear labels and lists – kind of like a neatly structured outline. It’s very underrated, but it’s used everywhere on the web, powering site content, settings, APIs, and data that needs to move cleanly between systems.

At the top of the JSON file, we’ll store site-wide metadata:

  • Site name
  • Location
  • Tagline
  • Contact email
  • From email (for send our Contact form)
  • Meta description (we’ll add this content later)
  • SEO keywords (we’ll add these later)
  • URL

We define it once, and use it everywhere. Here’s the code:

  "site_meta": {
    "name": "Emily Valentina",
    "location": "New York City",
    "tagline": "Refined, discreet companionship for exceptional moments",
    "email": "contact@meetemilyvalentina.com",
    "from_email": "donotreply@meetemilyvalentina.com",
    "meta_description": "",
    "site_keywords": "",
    "site_url": "https://meetemilyvalentina.com"
  }

Navigation & Social Links

Navigation lives in JSON too:

  • Main navigation
  • Social icons (Instagram, X, Bluesky, wishlist links, etc.)

Change it in one place – updates everywhere automatically.

  "main_navigation": [
    { "label": "About Me", "url": "about.php" },
    { "label": "Gallery", "url": "gallery.php" },
    { "label": "Rates", "url": "rates.php" },
    { "label": "FAQs", "url": "faqs.php" },
    { "label": "Contact", "url": "contact.php" },
    { "label": "Wishlist", "url": "wishlist.php" }
  ],
  "social_navigation": [
    { "label": "X", "url": "https://x.com" },
    { "label": "Instagram", "url": "https://instagram.com" },
    { "label": "Bluesky", "url": "https://bsky.app/" },
    { "label": "Wishlist", "url": "https://throne.com/" }
  ]

The social navigation JSON is intentionally flexible – any key/value pair can be used. We can also extend it to include image paths for custom social icons.

Landing Page

  • Sets the “legal” copy 😉
  • Continue Button Text (you my want to change that down the road)
  • Page we want to send the user to
 "landing": {
    "featured_img": {
  "src": "img/ev-18.jpg",
  "alt": "alt text goes here"
},
    "landing_text": "<p>By entering you are verifying that you are 18 or older and assume responsibility for where and how you view this site.</p>",
    "landing_button": "Continue",
    "landing_link": "about.php"
  }

Page-Specific Content

Each page has its own dedicated section in our JSON file. We’ll also standardize the data structure, ensuring every section includes a featured image, a page header, and an SEO-friendly meta description (we’ll add these later).

About Me + Stats

  • Custom content blocks
  • Images paired with text
  • Slightly more complex structure
  • Stats data that lives on the page but might need to be used in other places

The content array in this section allows us to define multiple content blocks for the page, each pairing HTML text with an associated image so PHP can loop through and render them consistently. You’ll also notice I’ve created a node for her stats – that also includes an image pairing.

"about": {
    "header": "About Me",
    "featured_img": {
    "src": "img/ev-1.jpg",
    "alt": "alt text goes here"
  },
  "meta_description": "",
    "sections": [
      {
        "text": "<p class='intro'>I believe the most meaningful connections are built on genuine presence, thoughtful conversation, and a shared sense of respect.</p>\n<p>There's something rare and deeply satisfying about being fully engaged with another person - listening without distraction, laughing without pretense, and allowing the moment to unfold naturally.</p>\n<p>Whether we're lingering over a quiet dinner, enjoying a glass of wine and easy conversation, or stepping out together for an unforgettable evening, my intention is always the same: to create an experience that feels effortless, comfortable, and real. I value chemistry that grows organically, where attraction is paired with warmth and ease rather than expectation.</p>",
        "img": {
          "src": "img/ev-6.jpg",
          "alt": "alt text goes here"
        }
      },
      {
        "text": "<p>Time spent together should feel like a pause from the outside world - a space where you can relax, be yourself, and enjoy the simple pleasure of good company. I take pride in being attentive and intuitive, reading the rhythm of the moment and meeting you there, whether that means playful energy or calm sophistication.</p><p>Above all, I believe the best encounters leave you feeling seen, appreciated, and pleasantly unhurried - like something special happened, not because it was planned, but because it was shared.</p>",
        "img": {
          "src": "img/ev-10.jpg",
          "alt": "alt text goes here"
        }
      }
    ]
  },
  "stats": {
    "header": "My Specifics",
    "stats_img": {
      "src": "img/ev-13.jpg",
      "alt": "alt text goes here"
    },
    "stats_values": [
      { "label": "Age", "value": "28" },
      { "label": "Height", "value": "5'4" },
      { "label": "Weight", "value": "105 lbs" },
      { "label": "Eyes", "value": "Brown" },
      { "label": "Hair", "value": "Curly Brown" },
      { "label": "Measurements", "value": "34B-26-34" }
    ]
  }

Gallery

  • List of images
  • Lightbox functionality
  • Fully data-driven

This is a simple gallery that displays all images in a single group, but it can easily be extended to support multiple galleries using tabbed navigation.

  "gallery": {
    "header": "Gallery",
    "featured_img": {
    "src": "img/ev-21.jpg",
    "alt": "alt text goes here"
  },
  "meta_description": "",
  "images": [
  { "src": "img/ev-1.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-2.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-3.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-4.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-5.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-6.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-7.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-8.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-9.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-10.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-11.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-12.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-13.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-14.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-15.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-16.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-17.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-19.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-20.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-21.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-22.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-23.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-24.jpg", "alt": "alt text goes here" }
]
}

Rates

  • Duration
  • Description
  • Price
  • Associated imagery
  • Booking notes

Here, the content and image pairings are handled a bit differently than on the About page, as the offerings are generated through a loop rather than rendered as static HTML. Offerings we’ll use in another place on the site later so keep that in mind!

"rates": {
  "header": "Rates",
  "featured_img": {
    "src": "img/ev-8.jpg",
    "alt": "alt text goes here"
  },
  "meta_description": "",
  "currency": "USD",
  "disclaimer": "<p><strong>All time is reserved exclusively for you</strong>, ensuring an unhurried and focused experience from beginning to end. Rates reflect the time we share, my attentive presence, and a commitment to discretion and privacy at all times.</p>",
  "rates_img_1": { "src": "img/ev-14.jpg", "alt": "alt text goes here" },
  "rates_img_2": { "src": "img/ev-3.jpg", "alt": "alt text goes here" },
  "offerings": [
    { "duration": "1 Hour", "rate": 900, "description": "Perfect for a brief escape or relaxed introduction." },
    { "duration": "2 Hours", "rate": 1400, "description": "Ideal for dinner dates or unhurried conversation." },
    { "duration": "3 Hours", "rate": 1900, "description": "A generous window to settle in and enjoy a more connected experience." },
    { "duration": "4 Hours (Evening)", "rate": 2200, "description": "An immersive experience designed to unfold naturally." },
    { "duration": "8 Hours (Overnight)", "rate": 3800, "description": "An intimate overnight arrangement with space to truly unwind." },
    { "duration": "12 Hours", "rate": 5200, "description": "A half-day experience offering depth, comfort, and continuity." },
    { "duration": "16 Hours (Day Date)", "rate": 6500, "description": "An unhurried day together, ideal for travel, events, or exploration." },
    { "duration": "Full Day (24 Hours)", "rate": 8500, "description": "A complete day of attentive, discreet companionship." }
  ],
  "rates_details": [
  { "item": "I recommend booking at least 1–2 weeks in advance." },
  { "item": "An additional travel fee may apply depending on location." },
  { "item": "For new suitors, I recommend engagements of four hours or more." },
  { "item": "All considerations are for my time and companionship only." },
  { "item": "Last-minute requests may be accommodated when availability permits." },
  { "item": "Travel outside of New York City is available upon request." },
  { "item": "Privacy and discretion are always respected and expected." },
  { "item": "Rates are subject to change for special events or high-demand dates." },
  { "item": "Clear communication helps ensure a seamless and enjoyable experience." }
]
}

FAQ

  • Repeating question/answer pairs
  • PHP loops
  • JavaScript accordion animation

FAQs are where JSON really shines. Because the data is naturally repetitive – question, answer, question, answer – it maps perfectly to a simple, loopable JSON structure.

You might notice <p> tags baked into the answer data, and that’s by design. FAQs rarely fit into a single sentence, and allowing HTML gives us the flexibility to handle more thoughtful, multi-paragraph responses cleanly.

"faqs": {
    "header": "FAQs",
    "featured_img": {
    "src": "img/ev-11.jpg",
    "alt": "alt text goes here"
  },
  "meta_description": "",
    "faqs_img": {
      "src": "img/ev-5.jpg",
      "alt": "alt text goes here"
    },
    "items": [
      { "question": "How do I arrange a meeting?", "answer": "<p>Please reach out via email with a brief introduction, preferred date, time, and location.</p>" },
      { "question": "Do you offer travel?", "answer": "<p>Yes. Travel arrangements are available with advance notice and planning.</p>" },
      { "question": "Is discretion guaranteed?", "answer": "<p>Absolutely. Privacy and respect are fundamental to every engagement.</p>" },
      { "question": "Do you see first-time clients?", "answer": "<p>Yes — respectful, well-mannered introductions are always welcome.</p>" },
      { "question": "How far in advance should I book?", "answer": "<p>I recommend reaching out at least one to two weeks in advance to ensure availability, especially for evenings or extended engagements.</p>" },
      { "question": "What locations do you see clients in?", "answer": "<p>Engagements are available in select hotels, private residences, or agreed-upon locations, depending on comfort and discretion.</p>" },
      { "question": "Are longer engagements available?", "answer": "<p>Yes. Extended dates, overnights, and day-long arrangements are available with advance planning.</p>"},
      { "question": "Do you require a deposit?", "answer": "<p>For certain engagements, a deposit may be requested to confirm and reserve time exclusively for you.</p>"},
      { "question": "What is your cancellation policy?", "answer": "<p>Life happens. I appreciate as much notice as possible should plans need to change, as my time is reserved exclusively once confirmed.</p>"}
    ]
  }

Contact & Thank You

  • Time & age picker guidance for the contact form fields
  • Thank You page confirmation message and accompanying image
  • Note: The Thank You page does not include a featured image. This ensures the confirmation message is visible immediately on page load, without being pushed below the fold.
   "contact": {
    "header": "Contact",
    "featured_img": {
    "src": "img/ev-24.jpg",
    "alt": "alt text goes here"
  },
  "time_picker": {
      "start": "10:00 AM",
      "end": "11:30 PM",
      "step_minutes": 30
    },
    "age_picker": {
      "min_age": "18",
      "max_age": "80"
    },
  "meta_description": "",
  "intro_text": "",
  "submit_button_label": "Submit"
},
 "thank_you": {
    "header": "Thank You",
    "thank_you_text": "<p class='intro'>Your information has been received</p><p>I appreciate you taking the time to connect. I'll review your details and be in touch soon if we're a good fit to move forward.</p><p>In the meantime, you're welcome to keep up with me on my social channels, where I occasionally share thoughts, travel moments, and updates. It's a lovely way to get a feel for my world while you wait.</p><p>I look forward to speaking with you soon.</p><p>— Emily</p>",
    "thank_you_img": {
    "src": "img/ev-4.jpg",
    "alt": "alt text goes here"
  }
}

Wishlist

  • Images
  • Descriptions
  • External links

This is another case where I kept functionality intentionally minimal due to time, but the wishlist page is well-suited for expansion – gift categories and tabbed navigation could be added with ease.

"wishlist": {
  "header": "Wishlist",
  "featured_img": {
    "src": "img/ev-19.jpg",
    "alt": "alt text goes here"
  },
  "meta_description": "",
  "intro_text": "<p><strong>Your time and presence are always more than enough - gifts are never expected.</strong> That said, for those who genuinely enjoy giving, this wishlist exists simply as a small guide. Each item reflects little comforts and pleasures I love, thoughtfully chosen and always appreciated, but never required.</p>",
  "items": [
    {
      "thumbnail": "img/ivory-silk-robe.jpg",
      "title": "Ivory Silk Robe",
      "description": "There's something irresistible about the feel of silk against bare skin. I love pieces like this that make slow mornings and quiet evenings feel a little more indulgent.",
      "purchase_link": "https://example.com/ivory-silk-robe"
    },
    {
      "thumbnail": "img/santal-33.jpg",
      "title": "Le Labo Santal 33",
      "description": "Scent is memory. This fragrance feels warm, intimate, and quietly confident - something that lingers long after the moment has passed.",
      "purchase_link": "https://example.com/santal-33"
    },
    {
      "thumbnail": "img/cashmere-blanket.jpg",
      "title": "Cashmere Throw Blanket",
      "description": "Perfect for curling up with a glass of wine and a good conversation. Soft textures matter to me—they set the tone for comfort and closeness.",
      "purchase_link": "https://example.com/cashmere-throw"
    },
    {
      "thumbnail": "img/french-lace-lingerie.jpg",
      "title": "French Lace Lingerie Set",
      "description": "Beautiful lingerie is as much about how it makes me feel as how it looks. This kind of craftsmanship feels timeless and feminine.",
      "purchase_link": "https://example.com/french-lace-lingerie"
    },
    {
      "thumbnail": "img/leather-bound-journal.jpg",
      "title": "Leather-Bound Journal",
      "description": "I love writing—thoughts, ideas, little moments I don't want to forget. A beautiful journal makes reflection feel intentional.",
      "purchase_link": "https://example.com/leather-journal"
    },
    {
      "thumbnail": "img/airpods.jpg",
      "title": "Apple AirPods Max",
      "description": "Music helps me reset. Whether I'm traveling or unwinding, a private soundscape is my favorite kind of escape.",
      "purchase_link": "https://example.com/noise-canceling-headphones"
    },
    {
      "thumbnail": "img/french-heels.jpg",
      "title": "Classic Black Designer Heels",
      "description": "A great pair of heels changes posture, confidence, and mood. These are timeless - elegant without trying too hard.",
      "purchase_link": "https://example.com/black-designer-heels"
    },
    {
      "thumbnail": "img/chocolates.jpg",
      "title": "Artisan Chocolate Collection",
      "description": "A small pleasure, but a meaningful one. I adore rich, well-made chocolate - especially when shared slowly.",
      "purchase_link": "https://example.com/artisan-chocolate"
    },
    {
      "thumbnail": "img/silk-sheets.jpg",
      "title": "Silk Pillowcase Set",
      "description": "Little luxuries matter. Silk pillowcases feel incredible and make every night feel just a bit more special.",
      "purchase_link": "https://example.com/silk-pillowcases"
    }
  ]
}

Footer

The footer is fully controllable through data – even the copyright language and site credit. The year is pulled in automatically with PHP, so you don’t have to think about it again when January rolls around.

  "footer": {
    "copyright": "All Rights Reserved. MeetEmilyValentina.com",
    "site_credit": "Honey Butter",
    "site_credit_link": "https://honey-butter.com"
  },

CSS/JS Files

This next bit could absolutely be hard-coded into the templates, and for some projects that would be fine – but the intent in this tutorial is to expose as much as possible through the JSON layer and keep the templates purely structural. I’ve also included a small set of CSS files I use on nearly every project: a lightweight browser reset and a set of layout utilities that make grid and flex layouts easy to implement. They’re simple, composable, and worth getting familiar with – we’ll cover those later as well.

  "css_files": [
    { "url": "https://steady-mosquito.static.domains/css/hb-reset.css" },
    { "url": "https://steady-mosquito.static.domains/css/hb-layout-utilities-v1.css" },
    { "url": "css/main.css" }
  ],
  "javascript_files": [
    { 
      "url": "https://code.jquery.com/jquery-3.7.1.min.js",
      "integrity": "sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=",
      "crossorigin": "anonymous"
    },
        { 
          "url": "https://code.jquery.com/ui/1.14.1/jquery-ui.min.js", 
          "integrity": "sha256-AlTido85uXPlSyyaZNsjJXeCs07eSv3r43kyCVc8ChI=", 
          "crossorigin": "anonymous"
        },
    { "url": "js/main.js" }
  ]

Our Final JSON

{
  "site_meta": {
    "name": "Emily Valentina",
    "location": "New York City",
    "tagline": "Refined, discreet companionship for exceptional moments",
    "email": "contact@meetemilyvalentina.com",
    "from_email": "donotreply@meetemilyvalentina.com",
    "meta_description": "",
    "site_keywords": "",
    "site_url": "https://meetemilyvalentina.com"
  },
  "main_navigation": [
    { "label": "About Me", "url": "about.php" },
    { "label": "Gallery", "url": "gallery.php" },
    { "label": "Rates", "url": "rates.php" },
    { "label": "FAQs", "url": "faqs.php" },
    { "label": "Contact", "url": "contact.php" },
    { "label": "Wishlist", "url": "wishlist.php" }
  ],
  "social_navigation": [
    { "label": "X", "url": "https://x.com" },
    { "label": "Instagram", "url": "https://instagram.com" },
    { "label": "Bluesky", "url": "https://bsky.app/" },
    { "label": "Wishlist", "url": "https://throne.com/" }
  ],
  "landing": {
    "featured_img": {
  "src": "img/ev-18.jpg",
  "alt": "Landing image"
},
    "landing_text": "<p>By entering you are verifying that you are 18 or older and assume responsibility for where and how you view this site.</p>",
    "landing_button": "Continue",
    "landing_link": "about.php"
  },
  "about": {
    "header": "About Me",
    "featured_img": {
    "src": "img/ev-1.jpg",
    "alt": "alt text goes here"
  },
  "meta_description": "",
    "sections": [
      {
        "text": "<p class='intro'>I believe the most meaningful connections are built on genuine presence, thoughtful conversation, and a shared sense of respect.</p>\n<p>There's something rare and deeply satisfying about being fully engaged with another person - listening without distraction, laughing without pretense, and allowing the moment to unfold naturally.</p>\n<p>Whether we're lingering over a quiet dinner, enjoying a glass of wine and easy conversation, or stepping out together for an unforgettable evening, my intention is always the same: to create an experience that feels effortless, comfortable, and real. I value chemistry that grows organically, where attraction is paired with warmth and ease rather than expectation.</p>",
        "img": {
          "src": "img/ev-6.jpg",
          "alt": "alt text goes here"
        }
      },
      {
        "text": "<p>Time spent together should feel like a pause from the outside world - a space where you can relax, be yourself, and enjoy the simple pleasure of good company. I take pride in being attentive and intuitive, reading the rhythm of the moment and meeting you there, whether that means playful energy or calm sophistication.</p><p>Above all, I believe the best encounters leave you feeling seen, appreciated, and pleasantly unhurried - like something special happened, not because it was planned, but because it was shared.</p>",
        "img": {
          "src": "img/ev-10.jpg",
          "alt": "alt text goes here"
        }
      }
    ]
  },
  "stats": {
    "header": "My Specifics",
    "stats_img": {
      "src": "img/ev-13.jpg",
      "alt": "alt text goes here"
    },
    "stats_values": [
      { "label": "Age", "value": "28" },
      { "label": "Height", "value": "5'4" },
      { "label": "Weight", "value": "105 lbs" },
      { "label": "Eyes", "value": "Brown" },
      { "label": "Hair", "value": "Curly Brown" },
      { "label": "Measurements", "value": "34B-26-34" }
    ]
  },
  "gallery": {
    "header": "Gallery",
    "featured_img": {
    "src": "img/ev-21.jpg",
    "alt": "alt text goes here"
  },
  "meta_description": "",
  "images": [
  { "src": "img/ev-1.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-2.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-3.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-4.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-5.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-6.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-7.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-8.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-9.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-10.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-11.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-12.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-13.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-14.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-15.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-16.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-17.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-19.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-20.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-21.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-22.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-23.jpg", "alt": "alt text goes here" },
  { "src": "img/ev-24.jpg", "alt": "alt text goes here" }
]

  },
"rates": {
  "header": "Rates",
  "featured_img": {
    "src": "img/ev-8.jpg",
    "alt": "alt text goes here"
  },
  "meta_description": "",
  "currency": "USD",
  "disclaimer": "<p><strong>All time is reserved exclusively for you</strong>, ensuring an unhurried and focused experience from beginning to end. Rates reflect the time we share, my attentive presence, and a commitment to discretion and privacy at all times.</p>",
  "rates_img_1": { "src": "img/ev-14.jpg", "alt": "alt text goes here" },
  "rates_img_2": { "src": "img/ev-3.jpg", "alt": "alt text goes here" },
  "offerings": [
    { "duration": "1 Hour", "rate": 900, "description": "Perfect for a brief escape or relaxed introduction." },
    { "duration": "2 Hours", "rate": 1400, "description": "Ideal for dinner dates or unhurried conversation." },
    { "duration": "3 Hours", "rate": 1900, "description": "A generous window to settle in and enjoy a more connected experience." },
    { "duration": "4 Hours (Evening)", "rate": 2200, "description": "An immersive experience designed to unfold naturally." },
    { "duration": "8 Hours (Overnight)", "rate": 3800, "description": "An intimate overnight arrangement with space to truly unwind." },
    { "duration": "12 Hours", "rate": 5200, "description": "A half-day experience offering depth, comfort, and continuity." },
    { "duration": "16 Hours (Day Date)", "rate": 6500, "description": "An unhurried day together, ideal for travel, events, or exploration." },
    { "duration": "Full Day (24 Hours)", "rate": 8500, "description": "A complete day of attentive, discreet companionship." }
  ],
  "rates_details": [
  { "item": "I recommend booking at least 1–2 weeks in advance." },
  { "item": "An additional travel fee may apply depending on location." },
  { "item": "For new suitors, I recommend engagements of four hours or more." },
  { "item": "All considerations are for my time and companionship only." },
  { "item": "Last-minute requests may be accommodated when availability permits." },
  { "item": "Travel outside of New York City is available upon request." },
  { "item": "Privacy and discretion are always respected and expected." },
  { "item": "Rates are subject to change for special events or high-demand dates." },
  { "item": "Clear communication helps ensure a seamless and enjoyable experience." }
]
},
"faqs": {
    "header": "FAQs",
    "featured_img": {
    "src": "img/ev-11.jpg",
    "alt": "alt text goes here"
  },
  "meta_description": "",
    "faqs_img": {
      "src": "img/ev-5.jpg",
      "alt": "alt text goes here"
    },
    "items": [
      { "question": "How do I arrange a meeting?", "answer": "<p>Please reach out via email with a brief introduction, preferred date, time, and location.</p>" },
      { "question": "Do you offer travel?", "answer": "<p>Yes. Travel arrangements are available with advance notice and planning.</p>" },
      { "question": "Is discretion guaranteed?", "answer": "<p>Absolutely. Privacy and respect are fundamental to every engagement.</p>" },
      { "question": "Do you see first-time clients?", "answer": "<p>Yes — respectful, well-mannered introductions are always welcome.</p>" },
      { "question": "How far in advance should I book?", "answer": "<p>I recommend reaching out at least one to two weeks in advance to ensure availability, especially for evenings or extended engagements.</p>" },
      { "question": "What locations do you see clients in?", "answer": "<p>Engagements are available in select hotels, private residences, or agreed-upon locations, depending on comfort and discretion.</p>" },
      { "question": "Are longer engagements available?", "answer": "<p>Yes. Extended dates, overnights, and day-long arrangements are available with advance planning.</p>"},
      { "question": "Do you require a deposit?", "answer": "<p>For certain engagements, a deposit may be requested to confirm and reserve time exclusively for you.</p>"},
      { "question": "What is your cancellation policy?", "answer": "<p>Life happens. I appreciate as much notice as possible should plans need to change, as my time is reserved exclusively once confirmed.</p>"}
    ]
  },
   "contact": {
    "header": "Contact",
    "featured_img": {
    "src": "img/ev-24.jpg",
    "alt": "alt text goes here"
  },
  "time_picker": {
      "start": "10:00 AM",
      "end": "11:30 PM",
      "step_minutes": 30
    },
    "age_picker": {
      "min_age": "18",
      "max_age": "80"
    },
  "meta_description": "",
  "intro_text": "",
  "submit_button_label": "Submit"
},
 "thank_you": {
    "header": "Thank You",
    "thank_you_text": "<p class='intro'>Your information has been received</p><p>I appreciate you taking the time to connect. I'll review your details and be in touch soon if we're a good fit to move forward.</p><p>In the meantime, you're welcome to keep up with me on my social channels, where I occasionally share thoughts, travel moments, and updates. It's a lovely way to get a feel for my world while you wait.</p><p>I look forward to speaking with you soon.</p><p>— Emily</p>",
    "thank_you_img": {
    "src": "img/ev-4.jpg",
    "alt": "alt text goes here"
  }
},
  "wishlist": {
  "header": "Wishlist",
  "featured_img": {
    "src": "img/ev-19.jpg",
    "alt": "alt text goes here"
  },
  "meta_description": "",
  "intro_text": "<p><strong>Your time and presence are always more than enough - gifts are never expected.</strong> That said, for those who genuinely enjoy giving, this wishlist exists simply as a small guide. Each item reflects little comforts and pleasures I love, thoughtfully chosen and always appreciated, but never required.</p>",
  "items": [
    {
      "thumbnail": "img/ivory-silk-robe.jpg",
      "title": "Ivory Silk Robe",
      "description": "There's something irresistible about the feel of silk against bare skin. I love pieces like this that make slow mornings and quiet evenings feel a little more indulgent.",
      "purchase_link": "https://example.com/ivory-silk-robe"
    },
    {
      "thumbnail": "img/santal-33.jpg",
      "title": "Le Labo Santal 33",
      "description": "Scent is memory. This fragrance feels warm, intimate, and quietly confident - something that lingers long after the moment has passed.",
      "purchase_link": "https://example.com/santal-33"
    },
    {
      "thumbnail": "img/cashmere-blanket.jpg",
      "title": "Cashmere Throw Blanket",
      "description": "Perfect for curling up with a glass of wine and a good conversation. Soft textures matter to me—they set the tone for comfort and closeness.",
      "purchase_link": "https://example.com/cashmere-throw"
    },
    {
      "thumbnail": "img/french-lace-lingerie.jpg",
      "title": "French Lace Lingerie Set",
      "description": "Beautiful lingerie is as much about how it makes me feel as how it looks. This kind of craftsmanship feels timeless and feminine.",
      "purchase_link": "https://example.com/french-lace-lingerie"
    },
    {
      "thumbnail": "img/leather-bound-journal.jpg",
      "title": "Leather-Bound Journal",
      "description": "I love writing—thoughts, ideas, little moments I don't want to forget. A beautiful journal makes reflection feel intentional.",
      "purchase_link": "https://example.com/leather-journal"
    },
    {
      "thumbnail": "img/airpods.jpg",
      "title": "Apple AirPods Max",
      "description": "Music helps me reset. Whether I'm traveling or unwinding, a private soundscape is my favorite kind of escape.",
      "purchase_link": "https://example.com/noise-canceling-headphones"
    },
    {
      "thumbnail": "img/french-heels.jpg",
      "title": "Classic Black Designer Heels",
      "description": "A great pair of heels changes posture, confidence, and mood. These are timeless - elegant without trying too hard.",
      "purchase_link": "https://example.com/black-designer-heels"
    },
    {
      "thumbnail": "img/chocolates.jpg",
      "title": "Artisan Chocolate Collection",
      "description": "A small pleasure, but a meaningful one. I adore rich, well-made chocolate - especially when shared slowly.",
      "purchase_link": "https://example.com/artisan-chocolate"
    },
    {
      "thumbnail": "img/silk-sheets.jpg",
      "title": "Silk Pillowcase Set",
      "description": "Little luxuries matter. Silk pillowcases feel incredible and make every night feel just a bit more special.",
      "purchase_link": "https://example.com/silk-pillowcases"
    }
  ]
},
  "footer": {
    "copyright": "All Rights Reserved. MeetEmilyValentina.com",
    "site_credit": "Honey Butter",
    "site_credit_link": "https://honey-butter.com"
  },
    "css_files": [
    { "url": "https://steady-mosquito.static.domains/css/hb-reset.css" },
    { "url": "https://steady-mosquito.static.domains/css/hb-layout-utilities-v1.css" },
    { "url": "css/main.css" }
  ],
  "javascript_files": [
    { 
      "url": "https://code.jquery.com/jquery-3.7.1.min.js",
      "integrity": "sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=",
      "crossorigin": "anonymous"
    },
        { 
          "url": "https://code.jquery.com/ui/1.14.1/jquery-ui.min.js", 
          "integrity": "sha256-AlTido85uXPlSyyaZNsjJXeCs07eSv3r43kyCVc8ChI=", 
          "crossorigin": "anonymous"
        },
    { "url": "js/main.js" }
  ]
}

Let’s Recap

We’ve created a single JSON file – content.json – that drives all of the content for our site. That’s the magic here: one place to edit text and data, and the site updates automatically – no digging through complex templates or touching a bunch of code.

What’s Next

Now that our content is set, it’s time to translate that JSON into something a web browser can actually read. This is where PHP and HTML come in. In Part 2, we’ll use them to build out our pages. In Part 3, PHP steps back in to power the contact form and handle submitted data. Then we’ll make everything look purty with CSS in Part 4, and finally bring it all to life with JavaScript animations in Part 5.

So strap in!