> ## Documentation Index
> Fetch the complete documentation index at: https://realsite.ca/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Objects

> The data your Liquid can reach: site, listing, media, posts, areas.

## site

Available everywhere.

| Property | Notes |
| - | - |
| `site.name` | Site name |
| `site.agent_name` | Falls back to the site name |
| `site.tagline` | The shared profile statement used by agent homepage openings |
| `site.phone` / `site.email` | |
| `site.brokerage_name` / `site.office_phone` / `site.office_address` | |
| `site.about` | The owner's biography; shared across themes rather than duplicated per homepage |
| `site.headshot_url` / `site.headshot_srcset` | Portrait URL and responsive sources when an uploaded headshot is available; handle a missing portrait |
| `site.logo_url` / `site.header_brand` | The uploaded logo, and `"logo"` or `"name"`: which the header should show |
| `site.social_links` | Array of URLs |
| `site.nav` | The owner's menu: `label`, `url`, `new_tab` |
| `site.agents` | Team roster: `name`, `role`, `phone`, `email`, `bio`, `photo_url`, `website_url` |
| `site.posts` | Published posts, newest first — see [posts](#posts) |
| `site.areas` | Array of published area **names** (strings), for example `"Wolseley"` |
| `site.area_links` | Published area links: `name`, `url` |

## listing

One listing (`listing` in `listing.liquid`, items of `listings` elsewhere).

| Property | Notes |
| - | - |
| `listing.key` | Stable id; `listing.url` = `/listings/<key>` |
| `listing.mls_number` | |
| `listing.price` | Number — pair with the [`money`](/docs/developers/filters#money) filter |
| `listing.address` / `city` / `province` / `postal_code` | |
| `listing.neighbourhood` | Subdivision name when the feed carries it |
| `listing.beds` / `baths` / `sqft` / `year_built` | |
| `listing.property_type` / `property_sub_type` | |
| `listing.remarks` | Public remarks, cleaned |
| `listing.status` / `listing.sold` | `"active"` or `"sold"` / boolean |
| `listing.photos` | Array of [media](#media), photos only (a video the feed sends is not in here); `listing.first_photo` |
| `listing.rooms` | Room dimensions from the feed |
| `listing.spec_groups` | The full spec sheet, grouped for display |
| `listing.latitude` / `longitude` | For maps |
| `listing.virtual_tour_url` | The board's tour link, or a video the feed sent as media |
| `listing.office_name` / `listing.board` | Attribution — display rules matter here |

## media

| Property | Notes |
| - | - |
| `photo.url` | Full-size |
| `photo.variant_url: 800` | Width-constrained variant |
| `photo.position` / `photo.category` | Feed ordering and kind |

## posts

`site.posts` is available on the homepage and yields hashes with `title`,
`slug`, `url`, `meta_description` and `published_on`. The platform
`blog-posts` section is a working example.

The `posts` array in `blog` and the `post` hash in `post` additionally provide
`body` and `published_at_iso`. Do not assume those full article fields exist
on each item of `site.posts`.

## settings

Theme-wide settings from `config/settings_schema.json`, merged with the
owner's saved values: `{{ settings.tagline }}`, `{{ settings.accent }}`,
etc. Section-local settings live on `section.settings` instead.

## Recipes

Working patterns from the shipped themes.

**A listing card grid** — loop, photo variant, price, sold state:

```liquid theme={null}
<div class="listing-grid">
  {% for item in listings %}
    <a class="card" href="{{ item.url }}">
      {% if item.first_photo %}
        <img src="{{ item.first_photo | image_url: width: 800 }}"
             alt="{{ item.address }}, {{ item.city }}" loading="lazy">
      {% endif %}
      <span class="price">{{ item.price | money }}</span>
      <span class="address">{{ item.address }}</span>
      {% if item.sold %}<span class="badge">Sold</span>{% endif %}
      <span class="meta">{{ item.beds }} bed · {{ item.baths }} bath
        {%- if item.sqft %} · {{ item.sqft }} sq ft{% endif %}</span>
    </a>
  {% endfor %}
</div>
```

**Recent posts, three newest** — `site.posts` is available everywhere,
so a homepage can carry the blog:

```liquid theme={null}
{% assign recent = site.posts | slice: 0, 3 %}
{% for post in recent %}
  <a href="{{ post.url | safe_url | escape }}">
    <h3>{{ post.title | escape }}</h3>
    <p>{{ post.meta_description | escape }}</p>
    <time>{{ post.published_on | escape }}</time>
  </a>
{% endfor %}
```

**An area selector that feeds the valuation form** — published areas
become options, and the lead arrives tagged with the neighbourhood:

```liquid theme={null}
{% form 'valuation' %}
  <select name="area" aria-label="Your neighbourhood">
    {% for area in site.areas %}
      <option value="{{ area | escape }}">{{ area | escape }}</option>
    {% endfor %}
  </select>
  <label>Street address<input type="text" name="address" autocomplete="street-address" required></label>
  <label>Email<input type="email" name="email" autocomplete="email" required></label>
  <button type="submit">What's it worth?</button>
{% endform %}
```

For linked neighbourhood guides, use `site.area_links` instead:

```liquid theme={null}
{% for area in site.area_links %}
  <a href="{{ area.url | safe_url | escape }}">{{ area.name | escape }}</a>
{% endfor %}
```

**Active-nav state** — `current_path` against the owner's menu:

```liquid theme={null}
{% for item in site.nav %}
  <a href="{{ item.url }}"
     {% if item.url == current_path %}class="active"{% endif %}
     {% if item.new_tab %}target="_blank" rel="noopener"{% endif %}>
    {{ item.label }}
  </a>
{% endfor %}
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.