@lssm-tech/bundle.marketing
Marketing composition bundle for the public ContractSpec site: category-defining substrate narrative, technical product/templates/examples pages, support pages, and email-facing marketing helpers.
What It Provides
- Marketing page bodies consumed by
@lssm-tech/app.web-landing
- Platform-neutral landing story, navigation, page, and examples-entry data consumed by web and Expo shells
- Scenario/template browsing and preview surfaces used on
/templates
- Support and program pages such as contact, contribute, cofounder, and design-partner
- Email/contact helpers and marketing-adjacent utilities
Architecture
src/components/marketing/ owns the public marketing narratives, section composition, and page-level stories.
src/content/ owns React-free story data shared by web and mobile shells.
src/content/companyos-marketing-contracts.ts owns the CompanyOS marketing MarketingSiteContract instances consumed by the web app. It imports the shared @lssm-tech/lib.contracts-spec/marketing validators, keeps CompanyOS copy in the bundle, and declares the route narrative, section sequence, density, deep-dive routes, CTAs, and evidence refs for /, /product, /solutions, /solutions/ai-ops-automation-sprint, /platform/managed-contractspec, /autonomous-companies, and /pricing.
src/components/templates/ owns template browsing, preview, and template-to-CLI/Studio flows. Preview content uses the shared example preview host from @lssm-tech/module.examples/runtime so UI-backed and fallback examples stay aligned with docs and sandbox.
src/libs/email/ owns contact/newsletter/waitlist actions and helpers used by marketing surfaces.
src/index.ts is the root public entrypoint.
The important boundary:
@lssm-tech/lib.design-system owns reusable marketing atoms, molecules, sections, and the typed landing-page section sequence.
bundle.marketing owns story/content mapping, icon lookup, and product-specific page composition.
- Existing
./components/marketing/sections/* subpaths remain compatibility shims over design-system components.
- CompanyOS contract pages use one render path:
MarketingPageContract → design-system MarketingPageSection[] adapter → existing marketing landing primitives. The bundle supplies content and page contracts; the design system adapts generic presentation props; apps retain route metadata, structured data, canonical URLs, and Next.js shell concerns.
- App packages own routing, metadata, OG, shell, and public delivery.
Template preview workflow
bundle.marketing stays a thin consumer of @lssm-tech/module.examples preview metadata:
/templates actions should be derived from supportsInlineExamplePreview() and the shared preview surface, not bundle-local allowlists.
- Rich preview content belongs in the example package
./ui export or an explicitly approved module/examples adapter; marketing should not duplicate domain preview implementations.
- Keep fallback CTAs to docs, sandbox, LLMS, and source links for examples that are discoverable but not inline-preview enabled.
- Preview data must remain deterministic and provider-free; no marketing preview should require live backends, provider credentials, or network execution.
Public Entry Points
- Root export
. through src/index.ts
./content for platform-neutral landing story data and CTA helpers
./content/companyos-marketing-contracts for CompanyOS marketing page/site contracts and validation helpers
./i18n for a small marketing copy runtime used by app metadata and locale-provider composition
./components/marketing/* for landing, product, pricing, contact, contribute, cofounder, and design-partner surfaces
./components/marketing/NewsletterSignup for the localized newsletter form (marketing.newsletter.* keys); hosts inject the NewsletterSignupAction server action and keep its binding
./components/templates/* for templates browsing and preview surfaces
./libs/email/* for marketing contact/newsletter/waitlist helpers
Marketing route contract system
src/content/marketing-route-contracts.ts exposes exact, generated, and runtime-family MarketingPageContract registries for the CompanyOS and ContractSpec public marketing route groups. Adapter-rendered pages keep using the full contract renderer; bespoke pages consume the same route contract system through an inert design-system boundary so existing page copy stays owned by the current components.
CompanyOS "Room for the real work" campaign pages
Three audience landing pages, rendered by @lssm-tech/app.web-application-monolith under its marketing layout. That layout applies CampaignThemeScope (the companyos.design.room-for-work campaign theme from @lssm-tech/bundle.managed-companyos/design, fixed light mode) to every marketing route. A visitor's saved workspace design is never read or changed.
./content/companyos-campaign: React-free en/fr/es page content. COMPANYOS_CAMPAIGN_ROUTES maps each CampaignAudience to its route: owners → /for-owners, trades → /for-trades, intake → /for-client-intake. getCompanyOsCampaignPage(audience, locale) resolves the content for a normalized locale and throws for an audience without registered content. All three audiences have registered content in en, fr and es; each file is still marked draft_for_native_review from specs/companyos-visual-growth. The audience and content types are exported as types.
./components/companyos-campaign: the page compositions CompanyOsOwnersPage, CompanyOsTradesPage and CompanyOsIntakePage, the shared sections (CampaignComparison, CampaignEvidencePanel, CampaignFaq, CampaignClose, CampaignFilm, CampaignFilmView, CampaignSplitSection, CampaignStoryBand, CampaignWalkthrough, CampaignStill) and the design atoms (CampaignCta, CampaignHeading, CampaignLabel, HandoverFrame).
- Route contracts:
createCompanyOsOwnersContract, createCompanyOsTradesContract and createCompanyOsClientIntakeContract (src/content/companyos-assistant/contracts-campaign.ts) build each page's MarketingPageContract from the same content, with route taken from COMPANYOS_CAMPAIGN_ROUTES. They are composed into the CompanyOS marketing site contract.
- Campaign films:
src/content/companyos-campaign/media.ts lists each film and locale explicitly. A locale without media is null and the player renders a text alternative, never another language. videoSrc stays null until an approved export is on first-party storage.
Audience routing is a presentation and copy choice only. CampaignAudience is never persisted as a role, permission or preference and never changes what a visitor may access.
Do not add prices, dates, SLAs, certifications or early-stage offer labels to campaign pages without an approved claim-ledger entry.
CompanyOS v2 assistant site
The CompanyOS public site (companyos.run, hosted by @lssm-tech/app.web-application-monolith) presents CompanyOS as the company's personal assistant installed under the customer's control (spec: specs/companyos-restyle-v2).
./content/companyos-assistant: React-free en/fr/es story data for /, /on-premises, /content-assistance, /pricing and /example; COMPANYOS_ASSISTANT_ROUTES; withCompanyOsLocaleHref; contract builders (contracts-home.ts, contracts-pages.ts, contracts-pricing.ts) composed into companyos.marketing.site. Editorial strings use for line breaks and *text* for the serif emphasis.
./components/companyos-assistant: page compositions (CompanyOsAssistantHomePage, CompanyOsOnPremisesPage, CompanyOsContentAssistancePage, CompanyOsPricingPage, CompanyOsExampleWorkspacePage) and shared sections. Every section carries data-marketing-section equal to its contract section id; page tests assert the match.
- Styling uses semantic design tokens only, so pages follow the active design pack (CompanyOS defaults to
companyos.design.calm-assistant).
- Examples are illustrative: no account, inbox, model or calendar is connected and nothing is sent or published. Do not add prices, dates, SLAs, certifications or early-stage offer labels without an approved claim-ledger entry.
Local Commands
bun run dev — contractspec-bun-build dev
bun run build — contractspec-bun-build build
bun run lint — bun run lint:fix
bun run lint:check — biome check .
bun run lint:fix — biome check --write --unsafe --only=nursery/useSortedClasses . && biome check --write .
bun run typecheck — tsgo --noEmit
bun run publish:pkg — bun publish --tolerate-republish --ignore-scripts --verbose
bun run publish:pkg:canary — bun publish:pkg --tag canary
bun run clean — rm -rf dist
bun run build:bundle — contractspec-bun-build transpile
bun run build:types — contractspec-bun-build types
bun run prebuild — contractspec-bun-build prebuild
Notes
- Keep the bundle focused on page storytelling and marketing interaction flows. Do not move shell/routing concerns here.
- Public positioning in this package must stay aligned with root docs and
@lssm-tech/app.web-landing.
- If the page story changes materially, update the package docs and the public LLM-facing docs so human-facing and agent-facing descriptions do not drift.
Design-system marketing foundation split
Generic full-page marketing UI now lives in @lssm-tech/lib.design-system. The marketing bundle keeps product story/content ownership and exposes compatibility wrappers for existing section subpaths such as CtaButtonRow, MarketingHero, MarketingCtaBand, ProseSection, and IconGridSection.
Consumers can keep using the bundle section subpaths while new product pages should compose content into design-system MarketingPageSection objects when they need full landing-page foundations.