English-only Tableau static site: Corex components, theme/mode toggles, and the same contrast pipeline as the SaaS template.
Related: multi-locale variant at github.com/corex-ui/soonex_i18n. Corex docs on Hex: installation, API, Events, Tableau + Corex.
- Elixir ~> 1.15
- Node.js (for
npm installinassets/)
cd soonex
mix deps.get
mix designex corex
cd assets && npm install && cd ..
mix tableau.server- Dev site:
http://localhost:4999(home at/). - Production output:
MIX_ENV=prod mix build→_site/. - Set
SOONEX_PUBLIC_URLfor your real origin; otherwise the demo default ishttps://corex-ui.github.io/soonex.
With MIX_ENV=dev, Corex MCP listens at http://localhost:4004/corex/mcp (Tableau stays on 4999). Configure your editor using .cursor/mcp.json as an example.
Rebuild assets: mix assets.build.
- Brand / SEO:
lib/layouts/root_layout.ex,lib/pages/root_index_page.ex. - Themes:
lib/soonex/theme.ex—data-themeon<html>must match imports inassets/css/site.css. - Content: home sections in
lib/pages/home/, composed bylib/pages/home_page.ex. - Posts / data:
_posts/,_data/, optionaltitle/descriptionin YAML; see_posts/2026-05-08-docs.md.
MDX-style Tableau extras (tags, include_dir, sitemap) are summarized in Tableau data, tags, and static extras in the longer notes below.
- Commit or branch (no undo).
- From the repo root:
mix project.rename your_otp_app(snake_case). Seelib/mix/tasks/project.rename.ex. - Run
mix formatandmix compile. _posts/*.md: only the YAMLlayout:line is rewritten; post bodies stay as-is.
assets/js/site.jsimportscorex/*; Esbuild resolves viaNODE_PATHincludingdeps(config/config.exs).- Run
mix designex corexafter upgrading Corex. - Local Corex checkout:
{:corex, path: "../../corex"}inmix.exs, thenmix deps.get. - Client UI:
assets/js/theme.js,assets/js/mode.js; landing motion underassets/js/landing*.js.
- GitHub Actions:
.github/workflows/pages.yml. In the repo, set Pages Source to GitHub Actions. - Clear
_site/when permalinks change (rm -rf _site) so stale paths are not published. - 404:
lib/pages/not_found_page.exemits_site/404.htmlfor static hosts.mix tableau.server404 behavior is still Tableau’s default.
@data: YAML (etc.) under_data/merged into the page assigns (e.g.@data["facts"]["headline"]).- Tags: enabled in
config/config.exs; index at/tagsvialib/pages/tags_index_page.ex. - Static passthrough:
static/viainclude_dironconfig :tableau, :config. - Sitemap: optional
sitemap:onuse Tableau.Pageor in post front matter.
Drafts and WIP live in _drafts and _wip (see config/dev.exs / config/prod.exs).