Public marketing site for Cassette, a native iOS and macOS client for Subsonic and OpenSubsonic music servers.
Live at https://mathieudubart.github.io/cassette-web/.
- Astro 6 (static output) with strict TypeScript
- Tailwind CSS v4 via
@tailwindcss/vite, with the design tokens declared insrc/styles/global.cssunder@theme - Inter Variable self-hosted through
@fontsource-variable/inter(no Google Fonts call, no third-party request) - No client framework — vanilla TS for the rare bit of interactivity
- Node.js ≥ 22.12 (Astro 6 requirement)
- npm 10+
npm install
npm run devDev server runs on http://localhost:4321/cassette-web/ (the trailing /cassette-web/ comes from the base set in astro.config.mjs).
npm run build
npm run previewStatic output is generated in dist/.
Every push to main triggers .github/workflows/deploy.yml, which builds the site with withastro/action@v3 (pinned to Node 22) and publishes via actions/deploy-pages@v4.
One-time repo setup before the first deploy can succeed:
- Open
Settings → Pageson the repo. - Under Build and deployment → Source, select
GitHub Actions(not "Deploy from a branch").
If the repo is private, GitHub Pages requires a Pro/Team/Enterprise plan; otherwise make the repo public.
To use a custom domain (e.g. cassette.mathieu-dubart.fr):
- Add a
CNAMEfile inpublic/containing the bare domain (one line, no protocol). - In
astro.config.mjs, setsiteto the new origin and changebaseto/. - In
Settings → Pages, enter the same domain in Custom domain. - Configure DNS — for an apex domain add
Arecords pointing to GitHub Pages IPs (185.199.108.153,185.199.109.153,185.199.110.153,185.199.111.153); for a subdomain, add aCNAMErecord pointing to<username>.github.io.
cassette-web/
├── public/
│ ├── favicon.svg
│ └── images/
│ └── cassette-wow-loop.svg # nav + footer logo
├── src/
│ ├── layouts/
│ │ └── Layout.astro # html shell, SEO meta, JSON-LD, IO reveal script
│ ├── pages/
│ │ └── index.astro # composes the sections
│ ├── components/
│ │ ├── Hero.astro # implemented
│ │ └── Footer.astro # implemented
│ └── styles/
│ └── global.css # Tailwind import + @theme tokens + base styles
├── .github/workflows/deploy.yml
├── astro.config.mjs
├── package.json
└── tsconfig.json
All colors, fonts, and warm shadows are declared as Tailwind v4 theme variables in src/styles/global.css. Use them via the generated utility classes (bg-bg-primary, text-accent-primary, border-border-subtle, shadow-warm-md, etc.).
Add the reveal class (and optionally reveal-delay-100|200|300|400) to any element. Layout.astro runs an IntersectionObserver that adds is-visible once it enters the viewport. prefers-reduced-motion skips the animation.
- Layout, SEO, JSON-LD
- Design system (palette, typography, shadows, reduced-motion)
- Hero
- Footer
- Features
- Server compatibility
- Open source / values
- FAQ
MPL-2.0, matching the Cassette app.