88ab5b917e
Renames the Python package directory, CLI command, env var prefix, docker-compose service/container/image, Postgres role/db, and all visible branding. Marketing form is "Fabled Steward". Clean break from the previous rebrand: drops the fabledscryer→roundtable import shim in __init__.py and the FABLEDSCRYER_* env var fallback in config.py and migrations/env.py. Env vars are now STEWARD_* only. Heads-up for existing deployments: - Postgres user/db renamed fabledscryer → steward in docker-compose.yml. Existing volumes need the role/db renamed inside Postgres, or override POSTGRES_USER/POSTGRES_DB to keep the old names. - Host-agent systemd unit is now steward-agent.service. Existing agents keep running under the old name; reinstall to switch. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
162 lines
7.3 KiB
Markdown
162 lines
7.3 KiB
Markdown
# Steward Rebrand — Design
|
||
|
||
**Date:** 2026-04-13
|
||
**Status:** Approved for planning
|
||
|
||
## 1. Identity
|
||
|
||
**Name:** Steward (dropping the "Fabled" prefix).
|
||
|
||
**Why the change:** The old name `FabledScryer` framed the app as a single seer peering into one crystal ball. The actual product is a gathering point — hosts, metrics, alerts, plugins, and dashboards from across the homelab converge here. "Steward" captures that: a place where the realm's tools and information meet.
|
||
|
||
**Name conflict check:**
|
||
- *Steward Software* — a Progress ABL tooling vendor. Different demographic, no overlap.
|
||
- *Fabled.gg* — a virtual tabletop product. Closest concern, and the reason the "Fabled" prefix is dropped entirely to avoid confusion inside the tabletop/fantasy space.
|
||
|
||
**Umbrella:** `fabledsword.com` remains the family umbrella domain; `git.fabledsword.com` remains the plugin catalog host. Steward becomes one product under that umbrella.
|
||
|
||
**Tone:** Heraldic / Arthurian register. The steward is the gathering place of those who keep watch over the realm.
|
||
|
||
## 2. Visual System
|
||
|
||
### Palette — Pewter & Gold
|
||
|
||
Design tokens (map to CSS custom properties in `base.html` `:root`):
|
||
|
||
| Token | Value | Role |
|
||
|---|---|---|
|
||
| `--bg-0` | `#131315` | Page background (near-black, no blue cast) |
|
||
| `--bg-1` | `#1d1d20` | Card / panel background |
|
||
| `--bg-2` | `#24242a` | Hover / elevated surface |
|
||
| `--border` | `#30303a` | Default border |
|
||
| `--border-accent` | `#c8a840` | Gold accent border (focus, active) |
|
||
| `--text-0` | `#d4d0c0` | Primary text (warm parchment) |
|
||
| `--text-1` | `#b8b8b0` | Secondary text |
|
||
| `--text-2` | `#8a8a92` | Tertiary / pewter text |
|
||
| `--gold` | `#c8a840` | Brand gold |
|
||
| `--pewter` | `#8a8a92` | Brand pewter |
|
||
|
||
No purple. No steel blue. Backgrounds are neutral near-black; text is warm parchment; the only chromatic accents are gold and pewter.
|
||
|
||
### Buttons — full action palette
|
||
|
||
| Role | Color | Use |
|
||
|---|---|---|
|
||
| Primary | Gold (`#c8a840`) | Main CTA, submit, confirm |
|
||
| Success | Green | Positive state changes, "all clear" |
|
||
| Danger | Crimson | Destructive / warning actions |
|
||
| Secondary | Pewter (`#8a8a92`) | Cancel, neutral |
|
||
|
||
Exact green/crimson hues finalized in implementation; must sit harmoniously next to gold and against the near-black background.
|
||
|
||
### Logo — Heraldic Seal (crown & table)
|
||
|
||
Locked SVG (24×24 viewBox, solid gold fills only):
|
||
|
||
```html
|
||
<!-- Seal: gold rim -->
|
||
<circle cx="12" cy="12" r="10.5" fill="none" stroke="#c8a840" stroke-width="1.5"/>
|
||
<!-- Faint pewter wash -->
|
||
<circle cx="12" cy="12" r="9.3" fill="#8a8a92" opacity="0.1"/>
|
||
<!-- Crown above, five points -->
|
||
<path d="M7 10 L7 5.8 L9 7.8 L10.5 5 L12 7.2 L13.5 5 L15 7.8 L17 5.8 L17 10 Z" fill="#c8a840"/>
|
||
<!-- Table: filled ellipse tabletop + two legs -->
|
||
<ellipse cx="12" cy="15.5" rx="5.2" ry="1" fill="#c8a840"/>
|
||
<rect x="9.6" y="15.5" width="1" height="3.8" fill="#c8a840"/>
|
||
<rect x="13.4" y="15.5" width="1" height="3.8" fill="#c8a840"/>
|
||
```
|
||
|
||
Reads as a heraldic seal: gold rim, faint pewter wash, five-point crown, solid-gold elliptical table with two legs. No inner detail to clutter at small sizes. Legible from 22px nav icon to 200px marketing size.
|
||
|
||
### Typography
|
||
|
||
**EB Garamond** via Google Fonts. Used for the wordmark, headings, and body. Warm, classical, matches the heraldic register without being costume-y. Replaces Libertinus Serif.
|
||
|
||
### Background
|
||
|
||
Candlelit glow — a soft, warm radial wash behind the main content area. Replaces the animated star field. Static (no animation) to stay calm and low-distraction.
|
||
|
||
### Wordmark
|
||
|
||
"Steward" in EB Garamond, gold (`#c8a840`), paired with the seal mark to the left in the nav header.
|
||
|
||
## 3. Voice & Copy
|
||
|
||
**Strategy:** plain, functional UI copy. Themed flavor appears only at the edges — places where a little atmosphere costs nothing and rewards exploration.
|
||
|
||
**Plain (no flavor):**
|
||
- Host list, alert list, plugin settings, forms, tables, error validation
|
||
- Button labels ("Save", "Delete", "Add host")
|
||
- Column headers, tooltips, help text
|
||
|
||
**Themed (heraldic flavor):**
|
||
- **Login screen** — brief atmospheric tagline below the wordmark
|
||
- **Empty states** — "No hosts yet. Summon one to the table." style, one line each
|
||
- **404 / 500 pages** — themed error messages with clear recovery actions
|
||
- **Dashboard hero title** — **"Under Watch, Under Care"** (optional, can be disabled)
|
||
|
||
**Not used:** themed language in validation errors, confirmation dialogs, or anywhere the user is trying to accomplish a task. Flavor must never get in the way of understanding what's happening.
|
||
|
||
## 4. Rename Mechanics
|
||
|
||
**Code & packaging**
|
||
- `fabledscryer/` package directory → `steward/`
|
||
- All `from fabledscryer...` / `import fabledscryer...` → `steward`
|
||
- `pyproject.toml`: project name, CLI entry point (`fabledscryer = "fabledscryer.cli:main"` → `steward = "steward.cli:main"`), tool sections
|
||
- `__init__.py` package metadata
|
||
|
||
**Runtime config**
|
||
- Env vars: `FABLEDSCRYER_*` → `STEWARD_*`
|
||
- Residual `FABLEDNETMON_*` env vars removed
|
||
- Config dir: `~/.config/fabledscryer` → `~/.config/steward` (one-shot copy on first boot)
|
||
- Log file names, systemd unit names if any
|
||
|
||
**Container & deploy**
|
||
- `Dockerfile` labels, workdir
|
||
- `docker-compose.yml` service name, image tag, volume names, `container_name`
|
||
- Published image: `fabledscryer:latest` → `steward:latest`
|
||
|
||
**Database**
|
||
- Alembic `script_location` and any customized version table
|
||
- Table prefixes (if any — confirm via grep during implementation)
|
||
- Rename migration only if prefixed tables exist
|
||
|
||
**Templates & UI**
|
||
- `base.html` wordmark, `<title>`, meta tags
|
||
- Hardcoded "FabledScryer" strings in templates, flash messages, emails
|
||
- Favicon / app icon assets
|
||
|
||
**Docs & repo**
|
||
- README, CONTRIBUTING, `docs/`
|
||
- Forgejo repo rename (redirect preserves old URL)
|
||
- Local directory rename (optional)
|
||
|
||
**Preserved (not renamed)**
|
||
- `fabledsword.com` umbrella domain
|
||
- `git.fabledsword.com` plugin catalog host
|
||
- Plugin repo names
|
||
|
||
## 5. Sequencing
|
||
|
||
Staged so `main` stays runnable between PRs.
|
||
|
||
**PR 1 — Visual reskin (no rename)**
|
||
New palette tokens, locked logo SVG, EB Garamond font swap, candlelit glow background, themed edge copy (login, empty states, 404/500, dashboard hero "Under Watch, Under Care"). Still named FabledScryer internally. Ships independently, low risk.
|
||
|
||
**PR 2 — Python package rename**
|
||
`fabledscryer/` → `steward/`, all imports, `pyproject.toml` name + entry point, `__init__.py` metadata. Docker/config untouched. Package installable as `steward` locally.
|
||
|
||
**PR 3 — Config & env vars**
|
||
`FABLEDSCRYER_*` → `STEWARD_*` with a short-lived fallback reader (accept both, warn on old) so self-hosters don't break mid-upgrade. Config dir migration on first boot. Drop `FABLEDNETMON_*` residue.
|
||
|
||
**PR 4 — Container & deploy**
|
||
`Dockerfile`, `docker-compose.yml` service/image/volume/container names. Published image tag switch. Template wordmark + `<title>` + meta (the last user-visible string flip).
|
||
|
||
**PR 5 — Repo & docs**
|
||
README, docs, CONTRIBUTING. Forgejo repo rename. Local directory rename (optional).
|
||
|
||
**PR 6 — Cleanup (after one release cycle)**
|
||
Remove env var fallback shim from PR 3. Remove config dir migration code.
|
||
|
||
**Rationale:** reskin first is safe and visible; package rename is the mechanical core; config/container flips are the breaking-change moments gated behind the fallback shim; docs last so they reflect final state.
|