# Themes
BroadcastChannel always loads its complete **Base** theme. A theme selection is either Base alone or Base plus one CSS override loaded through `HEADER_INJECT`. Overrides change presentation only: BroadcastChannel still owns the routes, complete Telegram feed, reactions, comments, media, search, RSS, and other product behavior.
There is no `THEME` environment variable, theme registry, browser-side theme switcher, or automatic Bear CSS download. Load only one override at a time; combining overrides produces conflicting cascade rules.
## Built-in themes
Use one of these exact `.env` configurations:
| Theme | Light and dark behavior | `HEADER_INJECT` |
| ---------------- | ----------------------------------- | ----------------------------------------------------------------------------- |
| Base | Follows the system preference | Leave unset or use `HEADER_INJECT=` |
| Sepia | Fixed light, warm-paper palette | `HEADER_INJECT=''` |
| Aria | Follows the system preference | `HEADER_INJECT=''` |
| Terminal Amber | Fixed dark, amber accent | `HEADER_INJECT=''` |
| Terminal Green | Fixed dark, green accent | `HEADER_INJECT=''` |
| Terminal Cyan | Fixed dark, cyan accent | `HEADER_INJECT=''` |
| Terminal Magenta | Fixed dark, magenta accent | `HEADER_INJECT=''` |
| HN News | Fixed light, full-post news feed | `HEADER_INJECT=''` |
| TG Channel | Fixed light, single-column messages | `HEADER_INJECT=''` |
| ZAE | Fixed light, compact document sheet | `HEADER_INJECT=''` |
Aria uses a neutral, system-sans presentation with light and dark palettes, a dashed square-line grid wash, and larger media radii. Sepia uses a fixed light palette and system-sans typography. All four Terminal variants use the same square, fixed-dark, Fira Code–first monospace design (loaded from Google Fonts when available); only their background, surface, accent, muted, border, and visited-link palettes differ.
HN News is a compact, utilitarian full-post feed with a warm light canvas, orange accent, dense metadata, and a story-title hierarchy above each available post title; it does not collapse posts into summaries. TG Channel uses a cool page backdrop and one centered message column with the real channel avatar repeated for each entry, its channel title, and message time; it has no right-side profile card. ZAE uses a light, compact document sheet with a reduced identity header, technical toolbar, restrained rules, and monospace accents. These three themes deliberately fix `color-scheme: light`; they do not switch with the system preference.
Each is an independent visual interpretation for BroadcastChannel, not a source adaptation or an official theme. No source code, CSS, fonts, or assets from Hacker News, Telegram, or Zed are bundled. See [NOTICE.md](./NOTICE.md) for provenance and non-affiliation details.
`/themes/terminal-base.css` is an internal shared stylesheet imported by the four Terminal entry files. Do not load it directly: it has no standalone palette. There is no `/themes/terminal.css` entry point.
## Platform configuration
In `.env` files, use one of the quoted assignments in the table above. In the Cloudflare Workers, Netlify, or Vercel environment-variable dashboard, set the key to `HEADER_INJECT` and paste only the raw value, without the outer shell quotes. For example:
```html
```
For Docker or another shell command, quote the complete assignment so the shell does not interpret the HTML:
```bash
docker run -e 'HEADER_INJECT=' …
```
Relative `/themes/...` URLs are served by the deployed BroadcastChannel site on every supported platform. Redeploy or restart after changing the environment variable.
Fixed-light examples:
```env
HEADER_INJECT=''
```
```env
HEADER_INJECT=''
```
```env
HEADER_INJECT=''
```
## Custom CSS
Host a normal CSS file at a URL you control and load it instead of a built-in override:
```env
HEADER_INJECT=''
```
Base exposes the Bear-style variables `--width`, `--font-main`, `--font-secondary`, `--font-scale`, `--background-color`, `--heading-color`, `--text-color`, `--link-color`, `--visited-color`, `--code-background-color`, `--code-color`, and `--blockquote-color`. `--width` is the maximum content width; the body's horizontal padding is added outside it. If a custom theme changes that padding, it must set the internal `--body-padding-inline` to the same value so the outer maximum remains correct.
Base provides a limited Bear-compatible public shell and CSS surface by reusing Bear's palette, typography variables, `--width` semantics, and selected hooks: `body.home`, `body.post`, `body.page`, `header > a.title > h1`, `header > nav`, `main`, `footer`, `.tags`, `pre.code`, and inbound `.highlight`. The content DOM is BroadcastChannel-specific and includes `body.feed`, `ol.posts-feed`, `.post-entry`, `p.tags.post-tags`, reactions, comments, and Telegram widgets. It is not a strict Bear DOM superset.
Compatibility is intentionally limited, not official or 100% Bear compatibility. BroadcastChannel preserves complete Telegram posts rather than Bear's `ul.blog-posts` title list, does not add `/blog` or `/feed` routes, keeps the post-detail heading visually hidden, and does not synthesize a Subscribe form. A CSS override must preserve those feed capabilities and accessible content rather than replacing the product DOM.
In Base, `--visited-color` is used only for visited post permalinks on feed pages. Override themes may intentionally define broader visited-link states.
## Security and responsibility
`HEADER_INJECT` is a trusted-administrator raw HTML boundary, not a safe CSS-only field. It can inject arbitrary document-head content and must never contain untrusted or user-controlled input. Site administrators are responsible for the license, security, privacy, and accessibility of external stylesheets.