Listings
Adding a business
Everything we need to put a Northside business on the map: the details, the image, and a few words about them.
01
Fields
Each business is one file in src/content/places/. The filename becomes the page address, so gangbusters-pottery.mdlives at /places/gangbusters-pottery. Use lowercase words joined by hyphens.
nameRequiredThe business name as they write it, including capitals and symbols.
Shows on · Card title, page title, map pin label
Example
Gangbusters Pottery
categoriesRequiredOne or more categories from the list below. The first one sets the map pin color.
Shows on · Card kicker, map filters, pin color
Example
retail
stroll_participationOptionalYAML list of stroll ids this business joined. Each value is exactly YYYY-winter or YYYY-summer, for example 2025-winter. A typo fails the build. Add an id only when the business was on that stroll.
Shows on · That stroll’s event-page map and participant list
Example
- 2025-winter
addressRequiredFull street address with suite or unit, city, state, and ZIP.
Shows on · Card, place page, map popup
Example
724 N Wallace Ave Suite 3, Bozeman, MT 59715
google_place_idOptionalGoogle Maps Place ID (starts with ChIJ). Opens the exact Business Profile. Look it up with `node --experimental-strip-types scripts/lookup-google-place-ids.ts`, or paste from Google’s Place ID Finder.
Shows on · “Open in Google Maps” on the place page; map card address link
Example
ChIJx_4gNslFRVMRhnSy42kbbJQ
lat / lngRequiredDecimal coordinates for the front door, to six places. In Google Maps, right-click the spot and click the numbers to copy them.
Shows on · Map pin position
Example
45.687424 / -111.028207
statusOptionallive (default), draft, or archived. draft only appears in local/preview builds (astro dev or PUBLIC_INCLUDE_DRAFTS=1). archived keeps the place page for history but drops the map pin; set successor to the place id it became.
Shows on · Map / directory visibility; archived pages show a Former business note
Example
live
successorOptionalFor archived listings only: the place file id of the business this one became (no .md).
Shows on · “Continues as …” link on the archived place page
Example
a-show-of-hands
websiteOptionalFull URL starting with https://. Use the business’s own site, not a social profile.
Shows on · Website pill, place page, map popup
Example
https://www.gangbusterspottery.com/
phoneOptionalThe public business number, written the way you’d say it.
Shows on · Place page, map popup (tap to call)
Example
(406) 548-1438
emailOptionalA public inbox, not a personal address.
Shows on · Place page, map popup (opens mail)
Example
hello@gangbusterspottery.com
private_contactsOptionalMember-only people behind the business. YAML list of name plus optional email and phone. Prefixed private_ so it never shows on the public site; unlock it at /member/contacts after re-encrypting the directory.
Shows on · Members contact directory only (password required)
Example
- name: Jane Doe email: jane@example.com phone: (406) 555-0100
instagram_handleOptionalThe handle only: no @, no link. Use a YAML list when a business has more than one. Instagram is the primary social link.
Shows on · Instagram pill(s)
Example
gangbusterspottery
threads_handleOptionalThe handle only: no @, no link. Add when Threads is how people find them (especially if the website is thin).
Shows on · Threads pill
Example
medium.gallery.bzn
pinterest_handleOptionalThe handle only: no @, no link. Useful for makers and shops that actually pin.
Shows on · Pinterest pill
Example
gangbusterspottery
02
Categories
Pick what most people come in for. Add a second category only when it’s a real part of the business, like a gallery that’s also a nonprofit.
- Food & Drink
food-drink - Retail
retail - Services
services - Arts & Culture
arts-culture - Fitness & Wellness
fitness-wellness - Nonprofit
nonprofit - Other
other
03
Images
One image per business, saved as cover in a folder named after the listing file, next to it insrc/content/places/. It’s optional. Without one, the card shows the business’s first letter instead.
Photo
Format
JPG or WebP
Size
At least 1200 × 800px, landscape
Cropped to 3:2 on cards and the place page, so keep the subject near the center.
Logo
Format
Square PNG
Size
At least 640 × 640px
Shown whole, never cropped. Use a transparent or white background.
Do
- Use the storefront, the work, or the people. Real photos of the district beat stock photos.
- Get the owner’s permission, and note who took the photo if they want credit.
- Name the file after the listing file: gangbusters-pottery.md pairs with gangbusters-pottery.jpg.
Don’t
- Don’t use screenshots of a website or social post.
- Don’t add text, borders, or filters on top of the photo.
- Don’t use a wide logo as a PNG. It will be cropped. Save it as a JPG photo instead, or ask for a square version.
04
Description
One to three sentences below the details, shown on the business’s page. Say what they make or do, and anything a neighbor would want to know before walking over.
Like this
“Fine charcuterie, hand-crafted from locally sourced Montana ingredients. In the historic Bon-Ton Flour Mill building.”
Not like this
“Bozeman’s premier destination for world-class artisanal experiences. Your one-stop shop for all things amazing!”
05
Template
Copy this into a new file and replace the details. Delete any optional line the business doesn’t have.
src/content/places/gangbusters-pottery.md---
name: Gangbusters Pottery
categories:
- retail
address: 724 N Wallace Ave Suite 3, Bozeman, MT 59715
google_place_id: ChIJZ6Fb0mlERVMRxG6XTxj4chc
website: https://www.gangbusterspottery.com/
phone: (406) 555-0123
email: hello@gangbusterspottery.com
private_contacts:
- name: Jane Doe
email: jane@example.com
phone: (406) 555-0100
instagram_handle: gangbusterspottery
pinterest_handle: gangbusterspottery
lat: 45.687424
lng: -111.028207
---
Handmade porcelain by Ryan Mitchell. Since 2012, functional pieces for everyday use.06
Checklist
Before a listing goes live.
- Name, address, and at least one category
- Coordinates for the front door, checked on the map
- google_place_id when you can find their Google listing
- Website, phone, email, and social handles, if they have them
- private_contacts for the members directory, if you have them
- A photo or square logo, with permission to use it
- One to three sentences about what they do
- The owner has seen the listing and is happy with it
- If private_contacts changed: run make encrypt (needs MEMBER_CONTACTS_PASSWORD in .env) and commit the blob