Marketing + landing site for JellyRock, a Jellyfin client for Roku. Deployed at jellyrock.app.
| Piece | Choice | Why |
|---|---|---|
| Framework | Astro 5 | Static-first, islands architecture, great DX. |
| Styling | Tailwind CSS 3 | Utility-first, matches starter template. |
| Starter | Forked from AstroWind | Good opinionated defaults; we stripped blog/pricing/services/landing variants. |
| Icons | astro-icon with Tabler + Flat Color sets |
Inline SVGs, zero runtime cost. |
| Images | Astro <Image> + sharp |
Build-time optimization + responsive srcset. |
| Shared UI | jellyrock/shared-ui |
Header/footer/tokens shared with docs + API reference sites. |
| Analytics | Umami (self-hosted) | Privacy-respecting; see src/components/common/Analytics.astro. |
| Hosting | Caddy file_server on the JellyRock VPS |
See jellyrock/infra. |
Note
The Dockerfile, netlify.toml, vercel.json, and nginx/ dir are legacy
AstroWind artifacts kept only while we verify nothing depends on them.
They are not part of the deploy pipeline.
push to main ─▶ .github/workflows/deploy.yml
│
├─ npm ci
├─ npm run build (Astro → dist/)
└─ rsync dist/ → VPS:/opt/jellyrock/homepage/
│
└─ Caddy serves jellyrock.app
Required repo secrets (org-level, shared with sibling deploy repos):
DEPLOY_SSH_KEY— private key authorized on VPSjellyrock@VPS_KNOWN_HOSTS— pre-verifiedssh-keyscanoutputVPS_HOST,VPS_USER— deploy target
npm ci
npm run dev # http://localhost:4321
npm run build # production build → dist/
npm run preview # preview the build
npm run check # astro-check + eslint + prettier
npm run fix # eslint --fix + prettier --writeOn the first build, src/utils/fetch-shared-ui.ts
shallow-clones jellyrock/shared-ui
into src/shared-ui/. No setup required — this is the same path CI uses.
If you're actively editing shared-ui (nav data, tokens, the header/footer
components) and want edits to hot-reload in this site without a
commit-push-rebuild cycle, clone it as a sibling directory:
git clone https://github.com/jellyrock/shared-ui.git ../shared-uiWhen ../shared-ui/ exists, the fetch script symlinks src/shared-ui/ to it
instead of cloning. Vite then picks up every save instantly. Remove the sibling
(or rm -rf src/shared-ui) to go back to the clone-from-GitHub default.
Caution
The symlink points at your local working tree — you can ship a build
referencing shared-ui commits that aren't pushed yet. Always push
shared-ui before pushing consumer sites that depend on the change.
| Task | File(s) |
|---|---|
| Edit hero, install steps, CTAs | src/pages/index.astro, src/pages/install.astro |
| Edit features list | src/data/features.ts — single source of truth, rendered on /features and the home page |
| Add/replace screenshots | Drop .png in src/assets/images/jellyrock/screenshots/. They are auto-discovered via import.meta.glob in src/pages/screenshots.astro |
| Change screenshot sort order | Filenames are sorted alphabetically by glob. Prefix with 01-, 02-, ... to force order, or sort in code — see src/pages/screenshots.astro:10 |
| Update donate / contact / privacy / terms | src/pages/donate.astro, src/pages/contact.astro, src/pages/privacy.md, src/pages/terms.md |
| Swap Umami website ID | src/components/common/Analytics.astro |
| Change header/footer links | Edit in jellyrock/shared-ui (affects all sites) |
| Update branding assets | src/assets/images/jellyrock/branding/ |
screenshots.astro currently globs *.png. For a mixed gallery:
- Drop
.mp4/.webmfiles alongside the PNGs. - Broaden the glob to
*.{png,mp4,webm}and branch on extension to render<video autoplay muted loop playsinline>vs<Image>. - For YouTube embeds, use
astro-embed(already a dep) —<YouTube id="..." />.
Keep file sizes tight (prefer .webm @ 720p, <2 MB) since videos bypass Astro's
image pipeline.
We inherited AstroWind's structure; deltas worth knowing about:
- Removed
src/pages/[...blog],[...landing],pricing,services— JellyRock doesn't sell anything or blog (yet). - Replaced Google Analytics + Splitbee integrations with a single self-hosted Umami snippet.
- Replaced bundled header/footer with shared components from
jellyrock/shared-uiviasrc/layouts/PageLayout.astro. - Features are authored in TypeScript (
src/data/features.ts) instead of YAML frontmatter.
MIT — JellyRock-authored code plus retained AstroWind copyright notice from the upstream template.