// landing.jsx — public marketing surface: the company overview and the docs page. // Loaded from index.html as an ordered `text/babel` classic script (position 3 of 8). // Classic scripts share one global scope — see docs/engineering/Patterns.md §9. function LandingPage({ siteConfig }) { const nav = siteConfig?.nav || []; const hero = siteConfig?.sections?.hero || {}; const mdmUrl = siteConfig?.mdm_url || MDM_URL_FALLBACK; // Hero defaults — used when no admin config exists. const heroBadge = hero.badge || "ZenMDM now available"; const heroTitle = hero.title || "Infrastructure tools for"; const heroTitleAccent = hero.title_accent || "modern IT"; const heroSubtitle = hero.subtitle || "The open, declarative-first Apple-only MDM that scales from indie start-ups to MSPs, delivers instant OS support, privacy-safe BYOD, and deep telemetry you own, all at half the cost of incumbents."; const heroCTAPrimary = hero.cta_primary || "Explore ZenMDM →"; const heroCTAPrimaryHref = hero.cta_primary_href || mdmUrl; const heroCTASecondary = hero.cta_secondary || "View all products"; const heroCTASecondaryHref = hero.cta_secondary_href || "#products"; const [hoveredProduct, setHoveredProduct] = useState(null); const [apiProducts, setApiProducts] = useState(null); useEffect(() => { fetch(`${API_BASE}/community/products`) .then(r => { if (!r.ok) throw new Error(r.status); return r.json(); }) .then(d => { if (d.products && d.products.length > 0) setApiProducts(d.products); }) .catch(err => console.warn("fetch failed:", err)); }, []); const rawProducts = apiProducts || DEFAULT_PRODUCTS; const products = rawProducts.map(p => ({ ...p, id: p.slug, desc: p.description, href: productHref(p, mdmUrl), features: productFeatures(p), })); return (
{heroSubtitle}
{p.desc}
Free for up to 5 devices — forever. No credit card. No trial expiry. Scale to unlimited when you're ready.
Signups are disabled currently
Everything you need to deploy, configure, and automate ZenMDM.