Skip to main content

Create and manage a Ghostty terminal welcome screen

Project description

💀 Welchost

welcome + ghost — a macOS CLI that creates and manages a welcome screen for the Ghostty terminal.

Welchost generates a banner that greets you every time you open Ghostty: big pyfiglet ASCII art, solid colors or gradients, an optional border and flanking ornaments, and system info (user, host, OS, uptime, …).

Ghostty launches
  → ~/.zshrc sources ~/.config/ghostty/welcome.zsh
    → welcome.zsh runs python3 ~/.config/ghostty/welcome_banner.py
      → banner renders in your terminal

For users

Install

# Homebrew (macOS)
brew install scoobynko/welchost/welchost

# or pipx / PyPI
pipx install welchost

Usage

welchost            # launch the interactive TUI (themes + custom wizard)
welchost config     # same as above
welchost preview    # render the current banner to stdout
welchost reset      # remove all welchost files and the .zshrc injection
welchost version    # print version

Run welchost, pick a template or build your own in the wizard, save, then open a new Ghostty window to see it. Re-run welchost any time to edit.

What it manages

Welchost owns three files in ~/.config/ghostty/:

  • welchost.toml — your config, the single source of truth
  • welcome.zsh — thin shell shim (generated)
  • welcome_banner.py — the renderer (generated)

It never touches Ghostty's own config file, and it injects exactly one guarded line into ~/.zshrc between sentinel markers (backed up before any edit). The banner only runs in an interactive Ghostty shell.

Uninstall

welchost reset      # removes the generated files and the ~/.zshrc block
pipx uninstall welchost   # or: brew uninstall welchost

For contributors

Contributions welcome. The project is macOS-only (Ghostty + zsh) and targets Python 3.11+.

Setup

git clone https://github.com/scoobynko/welchost
cd welchost
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pre-commit install        # ruff + conventional-commit hooks

Develop safely with --dev

Add --dev (or set WELCHOST_DEV=1) to run fully sandboxed against ./dev-home/ — it never touches your real ~/.config/ghostty/ or ~/.zshrc, skips the Ghostty check, and enables hot-reload of the TUI.

welchost --dev            # sandboxed TUI
welchost --dev reset      # wipes ./dev-home/ only
welchost --dev doctor     # diagnostics: Ghostty, env, and install-chain health

doctor is a development-only diagnostic: it's hidden from the user-facing CLI and refuses to run outside --dev / WELCHOST_DEV=1.

Test & lint

pytest                    # full suite
ruff check src tests      # lint
ruff format src tests     # format

Architecture

Strict one-way dependency: tui → core, never the reverse.

src/welchost/
├── detect.py      # where files go + Ghostty/env detection + DEV mode
├── config.py      # WelchostConfig dataclass ↔ welchost.toml
├── themes.py      # built-in templates (plain data)
├── ornaments.py   # flanking ASCII ornaments (plain data)
├── generator.py   # render templates + manage the ~/.zshrc sentinel
├── render.py      # banner rendering (shared by preview + generated script)
├── cli.py         # Typer entry point
├── tui/           # Textual UI (depends on core)
└── templates/     # welcome.zsh.j2, welcome_banner.py.j2

The full specification lives in CLAUDE.md — read it before making non-trivial changes.

Contributing workflow

  • main is protected: changes land via pull request with passing CI (lint + tests on Python 3.11/3.12/3.13). No direct pushes or force-pushes.
  • Conventional commits are required (enforced by commitlint / pre-commit): feat:, fix:, chore:, docs:, test:, refactor:, perf:, ci:.
  • Keep the core Textual-free; never hardcode paths (use detect); all user output goes through a Rich Console.

Releases (automated — don't bump versions by hand)

On merge to main, python-semantic-release reads the conventional commits, bumps the version (feat: → minor, fix: → patch, feat!:/BREAKING CHANGE: → major), tags it, publishes to PyPI, and updates the Homebrew formula.

License

MIT © Welchost Contributors

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

welchost-1.1.0.tar.gz (56.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

welchost-1.1.0-py3-none-any.whl (46.6 kB view details)

Uploaded Python 3

File details

Details for the file welchost-1.1.0.tar.gz.

File metadata

  • Download URL: welchost-1.1.0.tar.gz
  • Upload date:
  • Size: 56.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for welchost-1.1.0.tar.gz
Algorithm Hash digest
SHA256 4d287336c873f4301f2b9195acba1616c61fda0babd2dd88e19b7c0e640d06cf
MD5 3b918bd73c174d728c49ed30006ff575
BLAKE2b-256 cdcf1480b41a24ed111f642a52e26449770aa9311e5d7705a30aba9d1d2486af

See more details on using hashes here.

File details

Details for the file welchost-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: welchost-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 46.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for welchost-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7eeb399fe81699cc764d208b2a887e617ba02e6657f4e53072c6bb4dfb69196e
MD5 f6f4f5c8c0919cc2cb28790bb2810486
BLAKE2b-256 44ab27b95b7d47da1cdb44f0bad8c2573920f27ef65df37a7f84c5b277ad9bb0

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page