Files
FabledSteward/docs/superpowers/specs/2026-04-13-rebrand-design.md
T
bvandeusen 88ab5b917e chore: rename project Roundtable → Steward
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>
2026-04-25 16:20:14 -04:00

7.3 KiB
Raw Blame History

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):

<!-- 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:lateststeward: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.