Skip to content

Repository files navigation

Silo Website

The project site for Silo — a self-hosted media server. Built with Astro, deployed to GitHub Pages, AGPL-3.0-or-later.

Local development

bun install
bun run dev      # → http://localhost:4321
bun run build    # → dist/
bun run preview  # serves the built dist/

Node 20+ also works; Bun is preferred for parity with the site's build tooling.

Project layout

src/
├── components/    one .astro file per page section + small reusables
├── content/docs/  Starlight docs content — Markdown under docs/
├── data/          content + config — edit copy here, not in templates
│   ├── siteConfig.ts   site-wide constants (name, license, repo names)
│   ├── pillars.ts      infrastructure pillars (section 01)
│   ├── features.ts     feature grid (section 02)
│   ├── clients.ts      native clients + Jellyfin-compat list (section 04)
│   ├── faq.ts          FAQ items (section 05)
│   └── releases.ts     build-time fetch of latest GitHub releases
├── layouts/       base layout — head, fonts, shell
├── pages/         file-based routing — index.astro is the homepage
└── styles/global.css   the entire design system

Editing content

To change Edit
Site name, license, repo URLs src/data/siteConfig.ts
Infrastructure pillar copy src/data/pillars.ts
Feature card copy + chips src/data/features.ts
Client list (native or compat) src/data/clients.ts
FAQ items src/data/faq.ts
Hero subhead, status bar nav src/components/Hero.astro, StatusBar.astro
Architecture diagrams src/components/Deployment.astro
Documentation pages src/content/docs/docs/*.md
Colors, spacing, typography src/styles/global.css

Almost every copy change is a data-file edit, not a markup edit. That's deliberate — the components don't need to be touched unless the layout itself changes.

Documentation

Docs are built with Astro Starlight and served under /docs. Add or edit Markdown files in src/content/docs/docs/.

The extra nested docs/ directory is intentional: Starlight routes pages from src/content/docs/, so nesting the public docs there gives the site the /docs URL prefix while keeping everything in the same Astro project.

Release links on client cards

The client cards in section 04 link to the latest release of each app repo (silo-server, silo-apple, silo-android). These are fetched from the GitHub API at build time by src/data/releases.ts and baked into the static HTML — no client-side JS, no runtime API calls. Cards show a plain status (shipping or beta) and never a version number.

The data is refreshed on three triggers:

  1. Every push to main
  2. Every 6 hours via a scheduled workflow
  3. Every time a sibling repo publishes a release (cross-repo dispatch)

If the API is unreachable or rate-limited at build time, cards fall back to the repo home page instead. The build never fails for this reason.

Cross-repo release dispatch

When a release is published in silo-server, silo-apple, or silo-android, the site rebuilds automatically. Wire it up by adding this workflow to each app repo:

# .github/workflows/notify-website.yml
name: Notify website
on:
  release:
    types: [published]

jobs:
  notify:
    runs-on: ubuntu-latest
    steps:
      - name: Trigger website rebuild
        env:
          GH_TOKEN: ${{ secrets.WEBSITE_DISPATCH_TOKEN }}
        run: |
          gh api repos/Silo-Server/siloserver.org/dispatches \
            --method POST \
            -f event_type=release-published \
            -f client_payload[repo]=${{ github.repository }} \
            -f client_payload[tag]=${{ github.event.release.tag_name }}

This needs a WEBSITE_DISPATCH_TOKEN secret on each app repo — a fine- grained GitHub PAT scoped to siloserver.org with Contents: Read and Actions: Read & Write permissions. Standard pattern, set once per repo.

The 6-hour cron is a fallback for missed dispatches and edits that happen outside a release (changed README, added a new app, etc).

Deployment

GitHub Pages, configured by .github/workflows/deploy.yml. The repo is named siloserver.org and the canonical domain is https://siloserver.org, configured via public/CNAME.

If you ever change hosting or domain, override the build with repo variables (vars.SITE, vars.BASE_PATH) — the workflow honors both, so the same code deploys to a different URL shape without code changes.

Design system

The site uses an industrial-datasheet aesthetic: warm paper surfaces, ink hairline tables, blueprint figures, and a single dark "instrument console" panel in the hero. Three typefaces (loaded from Google Fonts at runtime):

  • Big Shoulders — display, condensed industrial
  • Archivo — body
  • IBM Plex Mono — code, spec labels, status

Colors live as CSS custom properties at the top of src/styles/global.css. The official horizontal wordmark is rendered by BrandLockup and the downloadable originals live under public/brand/. Three skewed bars in blue, red, and orange recur as a decorative (non-logo) motif via SiloBars. The Starlight docs are themed to match via src/styles/docs.css.

License & Trademarks

The site's source is licensed AGPL-3.0-or-later, matching the rest of the Silo project. See LICENSE.

The Silo name, logo, and wordmark are trademarks of Silo Media L.L.C. and are not covered by the AGPL. You're free to fork and redistribute the code, but forks and redistributions must not use the Silo brand as their identity and must remove or replace the brand assets. See TRADEMARK.md for what's permitted — including referential use like "compatible with Silo."

Contributing

Read CONTRIBUTING.md before opening a pull request. Site-wide design, navigation, deployment, and product-claim changes should start as an issue.

About

Project site for Silo — a self-hosted media server on modern infra (Go + Postgres + gRPC).

Topics

Resources

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages