Soonex is a launch page kit for Phoenix teams. It builds a coming-soon site as static HTML with Tableau, styles it with Corex design tokens, and hydrates accessible Corex components in the browser.
Live demo: corex-ui.github.io/soonex
There is also a multi-locale variant: corex-ui/soonex_i18n.
- Landing page: hero with launch countdown, tech marquee, live component preview, capabilities grid, workflow tabs, proof section, journal highlights, FAQ, and a closing waitlist band.
- Four themes:
neo,uno,duo, andleo, each with light and dark modes generated from color seeds inconfig :corex_design. Visitors can switch them in Template Options. - Waitlist form: email, role select, and opt-in switch with toast feedback. It stores nothing until you connect a provider.
- Journal: Markdown posts with cover images, tags, RSS (
/feed.xml), sitemap, and pagination. - Accessibility panel: text size, contrast, motion, focus ring, and link underline, saved in the visitor's browser.
- Cookie consent and privacy page: optional categories stay off unless the visitor allows them.
- No Node toolchain: Tailwind v4 and esbuild run as Mix tasks. There is no
package.json.
- Erlang/OTP 28 and Elixir 1.19 (pinned in
.tool-versions; the project supports Elixir~> 1.17and CI also runs 1.17 and 1.18) - Hex packages
corex,corex_design, andcorex_mcpat~> 0.2 - Linux only:
inotify-toolsfor live reload in the dev server - For
mix test: Google Chrome and a matchingchromedriver
git clone https://github.com/corex-ui/soonex.git
cd soonex
mix setup
mix serverOpen http://localhost:4999. The dev server watches lib/, _posts/, _data/, and assets/ and reloads on change.
In development, Corex MCP also runs at http://localhost:4004/corex/mcp. See .cursor/mcp.json for an editor configuration example.
| Command | What it does |
|---|---|
mix setup |
Fetch dependencies and build Corex design CSS |
mix server |
Check that ports 4999 and 4004 are free, then start the Tableau dev server |
mix assets.build |
Rebuild Corex design CSS, Tailwind, and esbuild output |
mix corex.design.build |
Regenerate design tokens and component CSS after changing config :corex_design |
MIX_ENV=prod mix build |
Production build into _site/ with minified CSS and JavaScript |
mix test |
Build the site, then run the Wallaby axe accessibility check on the home page |
mix credo |
Lint |
mix soonex.gen.post My title |
Create a new post in _posts/ |
config/config.exs Tableau, Tailwind, esbuild, and config :corex_design (themes)
lib/pages/home_page.ex Home page section order
lib/pages/home/ One module per home section (hero, logos, showcase, features, ...)
lib/layouts/ Root layout, nav, footer, post layout, Shell and Section helpers
lib/soonex/launch.ex Launch date used by the hero badge and countdown
assets/css/ Tailwind entry, fonts, and small host helpers
assets/js/site.js Corex hook registration, theme and mode persistence, waitlist toast
extra/ Static files copied to the site root (images, fonts, favicons)
_posts/ Journal posts (Markdown)
test/ Wallaby accessibility test
- Logo lockup:
lib/layouts/brand.exandextra/images/logo.svg - Page titles and meta descriptions:
lib/layouts/root_layout.ex - Open Graph image:
extra/images/og.svg
Change @target in lib/soonex/launch.ex. The hero badge and countdown both read it.
Each theme in config :corex_design (in config/config.exs) accepts seeds, colors.light and colors.dark, dimensions.radius, dimensions.font, and typography, plus top-level scales. After editing, run:
mix corex.design.buildKeep styling in Corex ui-* modifiers and design tokens in HEEx. assets/css/hosts.css and assets/css/chrome.css only hold small layout helpers.
Sections live in lib/pages/home/ and are composed in lib/pages/home_page.ex. Shared spacing and type classes are in lib/layouts/shell.ex, and lib/layouts/section.ex provides the block component with :root, :surface, :inverse, and :photo tones.
Photos live in extra/images/photos/ and post covers in extra/images/covers/.
The form is in lib/pages/home/waitlist.ex and the toast in assets/js/waitlist.js. Point the form at your email provider or endpoint before launch; field names are waitlist[email], waitlist[role], and waitlist[notes].
Posts are Markdown files in _posts/ with layout: Soonex.PostLayout. Front matter supports title, date, permalink, description, image, image_alt, tags, and sitemap. The post Writing in the journal shows every supported Markdown feature. In development only, draft posts in _drafts/ and work-in-progress pages in _wip/ are rendered too, along with future-dated posts.
The accessibility panel is configured in lib/soonex/accessibility.ex, and cookie consent in lib/soonex/cookie_consent.ex. Update lib/pages/privacy_page.ex for your jurisdiction.
- Set
SOONEX_PUBLIC_URLto your production origin. Subpaths such ashttps://example.github.io/my-launchare supported; asset paths are prefixed automatically. Without it, builds usehttps://corex-ui.github.io/soonex. - Run
MIX_ENV=prod mix build. If you changed permalinks, delete_site/first. - Publish
_site/to any static host.lib/pages/not_found_page.exgenerates404.html.
For GitHub Pages, .github/workflows/deploy.yml deploys on pushes to main after CI passes. Set Settings > Pages > Source to GitHub Actions.
- Commit your work first; the rename cannot be undone automatically.
- Run
mix project.rename your_app(snake_case). Seelib/mix/tasks/project.rename.ex. - Run
mix formatandmix compile.
Only the layout: line in _posts/*.md is rewritten; post bodies are left as they are.
Port 4999 is already in use. mix server and mix test both use port 4999. Find and stop the other process, then retry:
ss -ltnp 'sport = :4999' # Linux
lsof -nP -iTCP:4999 -sTCP:LISTEN # macOSLive reload does not work on Linux. Install inotify-tools and restart the dev server.
Wallaby cannot start a session. Chrome and chromedriver must match versions. You can point at specific binaries with WALLABY_CHROME_BINARY and WALLABY_CHROMEDRIVER_PATH.
Styles look stale after a Corex upgrade. Run mix corex.design.build; generated CSS lives in assets/corex/ (gitignored).
Photography is from Unsplash under the Unsplash License.
| File | Photographer |
|---|---|
photos/hero.jpg |
Andrew Kliatskyi |
photos/texture.jpg |
Adrien Olichon |
photos/ribbons.jpg |
Milad Fakurian |
photos/closing.jpg |
Pawel Czerwinski |
covers/waves.jpg |
Milad Fakurian |
covers/spectrum.jpg |
Milad Fakurian |
covers/haze.jpg |
MagicPattern |
covers/dusk.jpg |
Martin Martz |
covers/orbit.jpg |
Martin Martz |
covers/current.jpg |
Martin Martz |
Tool logos in extra/images/tech/ come from Simple Icons (CC0), except tableau.jpg, which is the Tableau project logo.
This repository does not include a license file yet. Add one before you redistribute a fork.