Public marketing site for Nexow β describe what you need, get live widgets on a canvas. This repository is the nexow.ai website: landing pages, features, plans, community, connectors, legal docs, and the blog.
Copyright Β© 2026 Nexow, Inc.
Open source under the Apache License 2.0. Ownership, trademarks,
and brand stay with Nexow, Inc. Forks and reuse must keep the
NOTICE attribution. See TRADEMARKS.md.
The product application is not this repo. It runs at x.nexow.ai.
- Astro 7 β static site generation, near-zero client JS
- Tailwind CSS v4 (
@tailwindcss/vite) with a custom brand token system - @astrojs/sitemap β i18n sitemap with
hreflangalternates - @astrojs/mdx + content collections β the blog
- Self-hosted variable fonts (Space Grotesk, Inter, JetBrains Mono)
- Bun as the package manager (
bun.lock)
- 17 locales β English at
/, others at/{lang}/, withhreflang, canonical tags, and an i18n sitemap - Full marketing site β home, features, community, connectors, plans, about, blog, changelog, help, legal, privacy, security
- SEO β per-page titles and descriptions, Open Graph + Twitter cards,
canonical URLs, JSON-LD (
Organization,WebSite,SoftwareApplication,FAQPage,BlogPosting) - GEO β
llms.txtfor answer engines and an AI-crawler-friendlyrobots.txt - Design β hybrid light hero + dark product showcases, scroll-reveal (progressively enhanced; content is visible without JS)
Requires Node.js 22.16+ (see .nvmrc) and Bun 1.2+.
bun install
bun run content:sync # generate the Astro content store
bun run dev # http://localhost:4321
bun run build # static output in ./dist
bun run preview # preview the production build
bun run check # astro + TypeScript diagnostics
bun run test # vitest (syncs content first)
bun run test:e2e # Playwright (builds first)
bun run deploy:dev # Cloudflare Pages, `dev` branch
bun run deploy:stg # Cloudflare Pages, `stg` branch
bun run deploy:prod # Cloudflare Pages, `main` (nexow.ai).env is committed encrypted with git-crypt. On a new machine, install git-crypt and run git-crypt unlock ~/.config/git-crypt/nexow.ai/nexow-web.key once. The working tree stays plaintext; the blob in git is ciphertext. Plaintext .env.* overrides stay gitignored, and the key file is never committed.
src/
components/ UI, page bodies, landing sections
content/blog/<lang>/ blog posts (Markdown / MDX)
i18n/ locales, legal copy, routing helpers
layouts/ Layout.astro, BlogPost.astro
lib/ shared TypeScript
pages/ EN at root, other locales under /{lang}/
styles/global.css Tailwind v4 theme + design tokens
public/ logos, favicons, og.png, robots.txt, llms.txt
scripts/ asset generators, content-store, release back-merge
tests/ unit, integration, build, e2e
.github/workflows/ CI, Deploy, Release, promote, sync
CHANGELOG.md generated by semantic-release β do not edit
- Copy lives in
src/i18n/locales/<lang>.ts. English is the source of truth β new strings must be added to every locale. - Legal documents live in
src/i18n/legal-en.tsandsrc/i18n/legal/<lang>.ts. - Blog posts are Markdown/MDX under
src/content/blog/<lang>/. Use matching slugs across locales sohreflangaligns. - Brand tokens (colors, fonts) live in
src/styles/global.cssunder@theme.
bun run scripts/optimize-assets.mjs # resize logos + favicons
bun run scripts/make-og.mjs # regenerate public/og.pngStatic output in dist/ β Cloudflare Pages via the Deploy workflow
(wrangler pages deploy --project-name=nexow-web). Production site is
set in astro.config.mjs to https://nexow.ai.
| Branch | Pages branch | Role |
|---|---|---|
dev |
dev |
Integration preview |
stg |
stg |
Staging, production-gate preview |
main |
main |
Production β nexow.ai |
Release commits include [skip actions] so they do not loop Deploy /
Release. After a stable cut on main, Release dispatches Deploy
explicitly.
Work lands only along this path:
feature/* β PR β dev β PR β stg β clone β main
Who can open a PR
- Into
dev: any feature branch. - Into
stg: onlydev. The Branch promotion workflow closes anything else. - Into
main: onlystg. Anything else is closed.
No direct commits on main or stg. .husky/pre-push rejects
git push to those branches. Open a dev β stg PR instead.
After dev β stg merges, Sync stg to main clones stg onto
main with a merge commit (chore: promote stg to main). This org does
not let GitHub Actions open PRs, so the clone is a bot push, not a
stg β main pull request. Site code stays identical. main may then
add a chore(release): commit; that version bump comes back onto dev
on the next release back-merge.
CI is split so a dev review is not blocked by Playwright:
| Event | What runs |
|---|---|
PR into dev |
Typecheck only (bun run check) |
PR into stg |
Typecheck + coverage + build + built-output tests + Playwright |
Push to stg / main |
No suite β already gated on the stg PR. Deploy (and the main release) proceed from that result. |
Native GitHub rulesets / classic branch protection need Pro/Team on a
private repo (this org is on Free), so the hook + workflows are the
enforce path. After upgrading, add matching rulesets (block direct
pushes / force-pushes on main and stg, require the promotion check)
so the server rejects them too.
Releases are commit-driven via
semantic-release β there is no
manual changelog or version bump. Commit messages follow
Conventional Commits (feat:,
fix:, chore:, β¦) and are linted locally by husky + commitlint.
Version math lives in .releaserc.cjs.
| Promote | Bump | Example |
|---|---|---|
dev (every releasable push) |
+0.0.1 patch, as a prerelease | 0.1.0 β 0.1.1-dev.1 β 0.1.1-dev.2 |
stg β main (the clone) |
+0.1.0 minor, stable | 0.1.0 β 0.2.0 |
stg does not cut a version of its own. The +0.1.0 happens when Sync
stg to main clones stg onto main and Release runs there.
devis the prerelease line. GitHub Releases are marked Pre-release. Further pushes on the same patch keep incrementing the-dev.Nsuffix until the next +0.0.1.mainis the stable line. That +0.1.0 publishes on the default channel, then back-mergesmainintodevso both branches share the same baseline.package.json/CHANGELOG.mdconflicts during that back-merge are resolved in CI by keepingdev's package contents while adoptingmain's released version.
While the site is pre-1.0, neither line cuts a major. Reserve
1.0.0 for a deliberate stable launch β change .releaserc.cjs when
you are ready to promote majors again.
Never edit CHANGELOG.md by hand. The public /changelog page is a
separate marketing surface (release blog posts), not this file.
We welcome issues and pull requests. Please read CONTRIBUTING.md (also at contribution.md) before you start.
By contributing you agree to the CLA: copyright in your contribution is assigned to Nexow, Inc. so this project stays company property while remaining Apache-2.0.
Copyright 2026 Nexow, Inc.
Licensed under the Apache License, Version 2.0.
| Legal entity | Nexow, Inc. |
| Brand | nexow.ai Β· x.nexow.ai |
| Address | 2810 N Church St STE 89080, Wilmington, DE 19802, United States |
| License | Apache License 2.0 |
| Required notice | NOTICE β must ship with every fork and redistributed copy |
| Trademarks | TRADEMARKS.md β not licensed |
The Apache License grants a copyright and patent license to use this Work. It does not transfer ownership of the project, and it does not grant rights in the Nexow name, logo, or other marks.
If you fork or reuse this repository, keep LICENSE and NOTICE, credit
Nexow, Inc., and do not present your fork as an official Nexow product.
Suggested credit:
Based on nexow-web by Nexow, Inc. (https://nexow.ai)
Copyright 2026 Nexow, Inc. Licensed under Apache-2.0.
- General, support and partnerships: admin@nexow.ai
- Legal pages: nexow.ai/legal