You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
MyBiz.Fit is a SaaS landing page platform for SMBs. Each tenant gets a unique landing page at mybiz.fit/<tenant-slug>.
How it works
Tenant signs up via chat widget
↓
You (or agent) create two files:
1. data/tenants/<slug>.yaml ← tenant config
2. content/<slug>/_index.md ← front matter only
↓
Hugo builds the site
↓
Page is live at mybiz.fit/<slug>
Single file per tenant at data/tenants/<slug>.yaml.
Complete schema
# ══════════════════════════════════════════════# THEME# ══════════════════════════════════════════════theme: "dark-amber"# Required. Preset name from data/themes/.# Options:# Original: dark-amber, dark-ocean, dark-forest,# dark-rose, dark-crimson, dark-violet, dark-lime,# dark-orange, dark-magenta, dark-gold, dark-teal,# dark-neon, dark-lavender, dark-olive,# light-minimal, light-ocean, light-warm, light-lavender# OpenCode: dark-opencode, dark-tokyonight, dark-catppuccin,# dark-nord, dark-gruvbox, dark-dracula, dark-kanagawa,# dark-one-dark, dark-everforest, dark-ayu, dark-matrix,# dark-rosepine,# light-opencode, light-tokyonight, light-catppuccin,# light-nord, light-gruvbox, light-dracula, light-kanagawa,# light-one-dark, light-everforest, light-ayu, light-rosepineaccent: null # Optional. Hex color to override theme accent.# null = use theme default.# Example: "#e63946"accent2: null # Optional. Secondary accent (lighter variant).# null = use theme default.# Example: "#ff6b6b"# ══════════════════════════════════════════════# BUSINESS INFO# ══════════════════════════════════════════════business:
name: "string"# Required. Displayed in nav, footer, chat widget.tagline: "string"# Required. Hero headline.description: "string"# Required. Hero body text (1-2 sentences).heroImage: "/path/to/image.jpg"# Optional. Path relative to /static/.# Example: "/joes-pizza/images/hero.jpg"# ══════════════════════════════════════════════# SECTION TOGGLES# ══════════════════════════════════════════════# Set each to true/false. Disabled sections won't render.sections:
hero: true # Always recommended: trueservices: true # Service offerings, menu items, etc.video: false # YouTube video embedgallery: false # Photo gallery gridabout: true # About section with description + imagecontact: true # Contact info cards (address, phone, email, hours)testimonials: false # Customer reviews with star ratingsbranches: false # Multiple locations with map linksproducts: false # Product catalog with images and pricescta: true # Call-to-action banner# ══════════════════════════════════════════════# SECTION DATA# ══════════════════════════════════════════════# Only fill in data for sections set to true above.# ── Services ──services:
- name: "Service Name"# Required per itemdescription: "Short description"# Required per itemicon: "🔧"# Emoji icon for the card# ── Video ──video:
youtubeId: "dQw4w9WgXcQ"# 11-character YouTube video IDtitle: "Video Title"# Displayed as section headline# ── Gallery ──gallery:
- "/path/to/image1.jpg"# Array of image paths (relative to /static/)
- "/path/to/image2.jpg"# ── About ──about:
title: "About Us"# Section headlinedescription: "Longer description"# Body textimage: "/path/to/about.jpg"# Optional. Displayed alongside text.# ── Branches ──branches:
- name: "Main Office"# Required per itemaddress: "123 Main St, City, ST 12345"phone: "(555) 123-4567"mapUrl: "https://maps.google.com/?q=..."# Optional. "View on Map →" link.# ── Products ──products:
- name: "Product Name"# Required per itemprice: "$29.99"# Display price (string, supports any format)description: "Product description"image: "/path/to/product.jpg"# Optional. Product photo.# ── CTA ──cta:
text: "Ready to Order?"# CTA headlinebutton: "Chat with Us"# Button labelaction: "chat"# "chat" = opens chat widget, or a full URL# ── Contact ──contact:
address: "123 Main St, City, ST 12345"phone: "(555) 123-4567"email: "hello@business.com"hours: "Mon-Fri 9am-5pm, Sat 10am-2pm"# ── Testimonials ──testimonials:
- name: "Customer Name"# Required per itemtext: "What they said..."# Required per itemrating: 5# 1-5 stars (integer)# ══════════════════════════════════════════════# CHAT WIDGET# ══════════════════════════════════════════════chat:
welcome: "Hi! How can I help you today?"# Welcome message in chat widgetcompanyName: null # null = use business.name# ══════════════════════════════════════════════# SPECIAL REQUESTS# ══════════════════════════════════════════════# Free-form narrative for anything not covered above.# Agents: Use this field for custom fonts, layout changes, brand guidelines, etc.specialRequests: |null
Minimal tenant example
theme: "dark-amber"business:
name: "Joe's Pizza"tagline: "Fresh Pizza, Delivered Fast"description: "Authentic Italian pizza made with imported ingredients."sections:
hero: trueservices: truecontact: truecta: trueservices:
- name: "Delivery"description: "Hot pizza to your door in 30 minutes"icon: "🛵"cta:
text: "Ready to Order?"button: "Chat with Us"action: "chat"contact:
phone: "(555) 123-4567"chat:
welcome: "Hi! Want to order a pizza?"
Content file
content/<slug>/_index.md — minimal, just front matter:
If tenant sets accent: "#ff0000", it overrides the theme's accent color. The accent2 and accentRGB still come from the theme unless also overridden.
# Tenant overrides accent onlytheme: "dark-amber"accent: "#ff0000"# → accent2 stays #ffcf57 (from dark-amber)# → accentRGB stays "255,176,0" (from dark-amber)# Tenant overrides boththeme: "dark-amber"accent: "#ff0000"accent2: "#ff6666"# → accentRGB still comes from theme ("255,176,0")# → This may cause visual mismatch — override accentRGB too if needed
3.5 OpenCode Theme Reference
The OpenCode themes use authentic palettes from the OpenCode project. Each theme's colors are mapped from OpenCode's palette tokens to MyBiz.Fit's color fields.
Color Token Mapping
OpenCode Token
MyBiz.Fit Field
Notes
neutral (dark bg)
colors.bg
Primary background
neutral (light bg)
colors.bg
Primary background
ink (text)
colors.text
Primary text color
primary
colors.accent
Buttons, links, highlights
accent
colors.accent2
Secondary accent, hover states
text-weak
colors.muted
Secondary text
—
colors.bg2
Derived: ~8% lighter than bg
—
colors.dim
Derived: between muted and line
—
colors.panel
Derived: rgba(accentRGB, 0.06)
—
colors.line
Derived: rgba(255,255,255,0.08) dark / rgba(0,0,0,0.08) light
Templates provide defaults. Tenant YAML always overrides.
6. Prompt Template for Agents
Location: prompts/tenant-config.yaml
Agent workflow
1. User describes their business
2. Agent reads prompts/tenant-config.yaml
3. Agent fills in all fields:
- businessType → determines template
- theme → user's preference or suggested based on business type
- business.* → from user description
- sections.* → enable/disable based on business needs
- services/products → from user description
- cta.* → from business type defaults
- contact.* → from user
- chat.* → auto-generated welcome message
4. Agent writes:
- data/tenants/<slug>.yaml (filled-in config)
- content/<slug>/_index.md (front matter only)
5. Page is live at mybiz.fit/<slug>