A single-product landing page with hero, features, screenshots, pricing, reviews, and call-to-action.
swift run sitekit new my-app --blueprint AppLanding
cd my-app
swift run Site serve # preview at http://localhost:8080Edit Content/Data/Landing.yaml for all the page content. Ships with the violet color scheme + professional font pairing – change them in Theme/theme.yaml (see references/themes.md).
Choose AppLanding when your site is a dedicated landing page for a single app or product. Good for:
- iOS/macOS app marketing pages
- SaaS product landing pages
- Developer tool showcases
- Single-product companies
For a multi-app portfolio, see Portfolio. For a site with blog + app showcase, see IndieDev.
- App name and base URL? (e.g. "TranslateKit", "https://translatekit.app")
- App Store URL? (for download badges and CTA buttons)
- App Store bundle ID? (for fetching metadata via iTunes Lookup API)
- Which sections do you need? hero (required), features, featureShowcase, testimonials, pricing, appStoreReviews, trustedBy, faq, cta, techSpecs
- Color scheme preference? (violet, teal, indigo, etc.)
- Font pairing preference? (professional, modern, geometric, etc.)
- Languages? (for multilingual landing pages)
- Landing page with configurable sections (all data-driven from Landing.yaml)
- Static pages (Privacy, Imprint/Terms)
- Sitemap, robots.txt, llms.txt
- Open Graph / SEO metadata
- Favicon: the blueprint ships an SVG icon (
Theme/images/favicon.svg, declared intheme.yaml); for the full PNG set (apple-touch-icon, favicon.ico) add pre-generated files underContent/Assets/Favicons/(the build logs the ImageMagick recipe when absent)
(Multilingual sites add cross-locale redirects – see the Multilingual variation.)
Default theme: ships colorScheme: violet + fontPairing: professional (in Theme/theme.yaml) – top nav with logo, footer with social links.
You can fetch app metadata automatically using the iTunes Lookup API:
https://itunes.apple.com/lookup?bundleId=BUNDLE_ID
No authentication required. Key fields in the response:
trackName– app nameartworkUrl512– app icon (change512to1024for high-res)averageUserRating– star ratinguserRatingCount– number of ratingsformattedPrice– price displayscreenshotUrls– iPhone screenshots
For App Store download badges, use Apple Marketing Tools: https://tools.applemediaservices.com/app-store/
For structured data, add schema.org/MobileApplication JSON-LD in your LandingPageRenderer (via PageShell.wrap(..., head:)) – SiteKit does not auto-emit it for landing pages.
name: "MyApp"
baseURL: "https://myapp.com"
description: "Short description for SEO and social sharing"
contentDirectory: "Content"
outputDirectory: "_Site"
sections: []
navigation:
logo:
image: "/assets/theme/images/app-logo.webp"
text: "MyApp"
items:
- title: "Features"
url: "/#features"
- title: "Pricing"
url: "/#pricing"
- title: "FAQ"
url: "/#faq"
showSearch: false
showThemeToggle: true
footer:
copyrightName: "Your Name"
startYear: 2026
social:
- platform: "github"
url: "https://github.com/yourname"
- platform: "mastodon"
url: "https://mastodon.social/@yourname"
rel: "me"
links:
- title: "Privacy"
url: "/privacy/"
- title: "Imprint"
url: "/impressum/"// Sources/Site/Main.swift
import SiteKit
@main struct Site {
static func main() throws {
try SiteBuilder.portfolio(configPath: "SiteConfig.yaml")
.replacing(HomePageRenderer.self, with: LandingPageRenderer())
.run()
}
}There is no SiteBuilder.appLanding() factory – AppLanding is SiteBuilder.portfolio() with a custom LandingPageRenderer (in your site's Sources/) replacing the default home page. The renderer loads Content/Data/Landing.yaml and produces the landing-page HTML. (For structured data, the LandingPageRenderer can inject schema.org/MobileApplication JSON-LD via PageShell.wrap(..., head:) – SiteKit provides the hook but does not auto-emit that schema.)
Content/
├── Data/
│ └── Landing.yaml # All landing page section data
├── Pages/
│ ├── Privacy.md
│ └── Impressum.md
└── Assets/
└── Images/
├── AppIcon.webp
├── AppStoreBadge.svg
└── Features/ # Feature screenshots
All sections are optional except hero and appStoreURL:
appStoreURL: "https://apps.apple.com/app/id1234567890"
hero:
title: "Your App Name"
subtitle: "One compelling line about what your app does"
features:
- title: "Feature One"
description: "What this feature does for the user"
imagePath: "/assets/images/Features/Feature1.webp"
featureBanner:
title: "The Headline Feature"
subtitle: "Longer description of your killer feature"
ctaText: "Try It Free"
videoPath: "/assets/videos/demo.mp4"
testimonials:
- name: "Jane Developer"
handle: "@jane"
avatarPath: "/assets/images/Testimonials/jane.webp"
quote: "This app changed my workflow completely."
row: 1
pricing:
title: "Simple Pricing"
subtitle: "Start free, upgrade when you're ready"
ctaText: "Download Now"
tiers:
- name: "Free"
monthlyPrice: "$0"
features: ["Feature A", "Feature B"]
- name: "Pro"
badge: "Popular"
monthlyPrice: "$9.99"
features: ["Everything in Free", "Feature C", "Feature D"]
highlighted: true
appStoreReviews:
- quote: "Best app in its category!"
author: "Happy User"
location: "United States"
trustedBy:
- name: "Big App"
url: "https://bigapp.com"
iconPath: "/assets/images/TrustedBy/bigapp.webp"
faq:
- question: "How does it work?"
answer: "Simple explanation of your app."
cta:
title: "Ready to Get Started?"
buttonText: "Download Free"- Without pricing: Remove the
pricingsection from Landing.yaml. - Without testimonials: Remove
testimonials– feature grid fills the space. - Multilingual: Add
Landing.de.yaml,Landing.ja.yamletc. with translated content. Add alocalizationblock to SiteConfig.yaml. For cross-locale redirects, also add the redirect renderers toMain.swift(they're not in.portfolio()'s default set):Document per-language voice and rules in.renderer(LanguageRedirectRenderer()) .renderer(HTMLRedirectPageRenderer()) .renderer(CloudflareRedirectsRenderer())
Guidelines/Translations.md(the default location read by thelocalizationskill – override vialocalization.styleGuidePathif you keep the file elsewhere). Note: German marketing copy should typically use informal "du" (not formal "Sie") for indie/startup sites. - Multiple CTAs: The
appStoreURLis used throughout. For Google Play, add agooglePlayURLfield to your custom data model. - Custom sections: The
LandingPageRendererandLandingDatamodel live in your site's Sources/ – add or remove sections freely.