wyattowalsh docs
Getting StartedConfiguration

Configuration

ProjectConfig drives every generator. All settings live in config.yaml.

Overview

All generators are driven by a single ./config.yaml file loaded via load_config() from scripts/config.py. The root type is ProjectConfig — a Pydantic v2 model that validates every field at load time.

Generate defaults
uv run readme config generate-default --path ./config.yaml
View current config as YAML
uv run readme config view --path ./config.yaml --output-format yaml
Re-save (validate + round-trip)
uv run readme config save --path ./config.yaml

Config files are serialized with mode="json" to produce clean, safe-loadable YAML — no Python-object YAML tags from Pydantic's HttpUrl type.

ProjectConfig

The root config model maps to these top-level keys in config.yaml:

config.yaml
banner_settings:           # BannerSettings
qr_code_settings:          # QRCodeSettings
v_card_data:               # VCardDataModel
word_cloud_settings:       # WordCloudSettingsModel
readme_sections_settings:  # ReadmeSectionsSettings

BannerSettings

FieldTypeDefaultNotes
titlestr"Your Name"Main heading in the banner
subtitlestr"Software Engineer & AI Enthusiast"Subheading
output_pathstr.github/assets/img/banner.svgWhere the light-mode SVG is written
widthint1200Canvas width in pixels
heightint630Canvas height in pixels
optimize_with_svgoboolTrueRun SVGO optimizer after generation

QRCodeSettings

FieldTypeDefaultNotes
output_filenamestr"qr.png"Output filename
output_dirstr.github/assets/imgOutput directory
default_background_pathstr|nullnullOptional SVG embedded behind QR
default_scaleint25Module size in pixels
error_correctionstr"H"L / M / Q / H

WordCloudSettingsModel

FieldTypeDefaultNotes
output_dirstr.github/assets/imgOutput directory
output_filenamestr"word_cloud.png"Default filename
promptstr|null"My Tech Skills: Python, JavaScript, Cloud, AI, DevOps, SQL, React"Default prompt for curating keywords
stopwordslist[str]|null[]Additional stopwords

Two word-cloud config models

WordCloudSettingsModel in config.py is the top-level YAML config. WordCloudSettings in word_clouds.py is the internal generator config with extra="forbid". Don't confuse them — the first accepts unknown keys, the second rejects them.

ReadmeSectionsSettings

Dynamic README configuration lives under readme_sections_settings in config.yaml. This includes the README path, social links, featured repos, blog feed settings, and nested SVG card controls under svg.

skills.yaml is loaded separately via load_skills() and is not a top-level key in ProjectConfig.

VCardDataModel

Contact card data embedded in the QR code. Fields map directly to vCard 3.0 properties:

FieldDefault
displayname"Your Name"
email_internet""
url_worklist of TypedUrl objects
org, title, fn, tel_work_voicePersonal details

AppSettings (env-driven)

Settings in scripts/config.py is a pydantic-settings BaseSettings — values are read from environment variables:

Env VarDefaultPurpose
LOG_LEVEL"INFO"Loguru sink level
DEBUG_MODEFalseExtra verbose logging
LOG_ROTATION"10 MB"Log file rotation policy
LOG_RETENTION"10 days"Log retention period

Use uv run readme show-settings to see all current env-driven settings and their values.