Skip to main content
Wildo.ai Coming soon

Marketing site and brand

Give your product its own public website

A public website introduces the product before someone enters the application. Wildo provides the page, language and configuration contracts; you author the story, sections and visual experience.

One product has an application workspace and a separate public website, sharing brand identity

Give your product its own public website

A public website introduces the product before someone enters the application. Wildo provides the page, language and configuration contracts; you author the story, sections and visual experience.

The site lives beside the application with its own routes and deployment surface, while drawing on the same accepted brand.

Example — A product site in two languages

A team publishes a home page, pricing and contact pages in English and French. Both languages use the same site origin and product identity, with wording written for each audience.

For engineers

The application declares a STATIC_WEBSITE service in wildo.saas.config.ts. Its service-root wildo.website.config.ts owns the canonical origin and locale routes. This selected Wonder Todos declaration also separates the application and backend origins:

export default defineWebsiteConfig({
  publicOrigin: MARKETING_SITE_URL,
  appOrigin: 'https://app.wonder-todos.com',
  // Backend API origin the anonymous-capture forms (lead + draft-note) POST to.
  // Production default; local dev overrides to http://localhost:4241 via
  // `resolveWebsiteApiOrigin` (src/api-origin.ts). Threaded to the React island
  // through `WebsiteRuntimeContext.apiOrigin` by the contact `.astro` page.
  apiOrigin: 'https://api.wonder-todos.com',
  csp: {
    enabled: true,
    reportOnly: true,
  },
  defaultLocale: AvailableLanguage.EN,
  locales: [
    { locale: AvailableLanguage.EN, path: 'en' },
    { locale: AvailableLanguage.FR, path: 'fr' },
  ],
});

defineWebsiteConfig is exported by @wildo-ai/saas-website. MARKETING_SITE_URL and AvailableLanguage are the application’s existing constant and shared language enum. The loader discovers this file from the declared service path; an arbitrary config elsewhere does not participate.

Join configuration to the page

The site context combines this configuration with the page registry, chrome and design tokens. Each Astro route loads its page runtime, language pack and page manifest, then renders the application’s page component. Static output and interactive React islands are distinct: hydrate the interactions that need browser state, and keep application-runtime imports out of the public site’s bundle.

Register each page, its sections and expected translation keys together. Language declaration alone does not create a translated route or write its copy. The application owns those files, the public content and deployment; this is not a repository-independent content management system.

Building a B2B product or an internal tool?

Wildo is not self-service yet. Tell us what you have in mind and we will say plainly whether it fits, and what happens next.