README Generation & Asset Management

February 15, 2026 ยท View on GitHub

This document explains how the README and its visual assets are generated and maintained. It's mostly a reference document for development purposes, written and maintained by the coding agents who write most of the code, with some commentary sprinkled in.

Overview

The repository implements a "multi-list" pattern, with one centralized "list" (which is effectively a kind of backend) and numerous "views" that are strictly generated from the central data source. In that sense, it's maybe the only "full-stack" Awesome list on GitHub - maybe that's a sign that it's a silly thing to do, but I figured if I was going to spend so much time maintaining a list, I had better do something interesting with it. To my knowledge, it's one of the few "full-stack applications" that's entirely hosted on GitHub.com (i.e. not a GitHub Pages site). (Yes, there are others. And yes, calling this an "application" is obviously a little bit of a stretch.)

  • THE_RESOURCES_TABLE.csv - The master data file containing all resources (repo root)
  • acc-config.yaml - Global configuration (root style, style selector settings)
  • templates/categories.yaml - Category and subcategory definitions
  • scripts/readme/generate_readme.py - The generator script (class-based architecture)
  • scripts/readme/helpers/readme_config.py - Config loader and style path helpers
  • scripts/readme/helpers/readme_utils.py - Shared parsing/anchor utilities
  • scripts/readme/helpers/readme_assets.py - SVG asset writers (badges, TOC rows, headers)
  • scripts/readme/markup/ - Markdown/HTML renderers by style
  • scripts/readme/svg_templates/ - SVG renderers used by the generator
  • assets/ - SVG visual assets (badges, headers, dividers, etc.)

The multi-list is maintained via a single source of truth, combined with generators that take templates (which implement the various styles), and generate all the READMEs. The complexity is mostly self-inflicted, and is an artefact of platform-specific features of GitHub.

Generated README Styles

StylePrimary OutputTemplateDescription
Extra (Visual)README_ALTERNATIVES/README_EXTRA.mdREADME_EXTRA.template.mdFull visual theme with SVG badges, CRT-style TOC
ClassicREADME_ALTERNATIVES/README_CLASSIC.mdREADME_CLASSIC.template.mdPlain markdown with collapsible sections
AwesomeREADME_ALTERNATIVES/README_AWESOME.mdREADME_AWESOME.template.mdClean awesome-list style
FlatREADME_ALTERNATIVES/README_FLAT_*.mdBuilt-in template (optional templates/README_FLAT.template.md)44 table views (category ร— sort combinations)

All styles are always generated under README_ALTERNATIVES/. The root_style is additionally written to README.md.

Etymology

  • Classic: The style of the list as it was initially maintained and iterated upon, before the "multi-list" pattern was adopted.
  • Extra: Heightened visual style, consisting almost entirely of SVG assets - "extra" does not mean "additional", it means extra.
  • Flat: Lacks internal structure or visual hierarchy; the "flat" views are basically just a dump of the CSV data with shields.io badges - information-dense and straightforward. This was implemented due to a single user's request, but it became a more interesting problem when the user asked for dynamic table features like sorting and filtering. This is "not possible" with Markdown, which is why I decided to do it - since you can't have any JavaScript on a README, the sorting and filtering functionality is simulated by generating every permutation of Sort x Filter as a separate file, and so the table operations become navigation.
  • Awesome: The style that is more or less compliant with the Awesome List style guide.

Generation runs in two phases:

  1. Generate all styles under README_ALTERNATIVES/.
  2. Generate README.md using the configured root_style.

If everything lived at the repo root, this would be a very easy thing to build, but then the user would have to scroll a lot before they even hit the first h1. So the whole complexity is due to the necessity of supporting multiple generated README files at two different paths. I'm not even sure if many people enjoy the "Flat" view, and without the 44 permutations, it probably wouldn't be a big deal at all to just put everything at the root... Hm. Nevertheless, I'm grateful to that user for giving me the opportunity to learn some new things, and to build this ridiculous Titanic just to host a list, and I hope the "curiosity" of it compensates for any aesthetic crimes that I've committed in building it.

Configuration (acc-config.yaml)

The acc-config.yaml file at the repository root controls global README generation settings.

Root Style

The readme.root_style setting determines which README style is additionally written to the repo root (README.md). All styles are always generated in README_ALTERNATIVES/.

readme:
  root_style: extra  # Options: extra, classic, awesome, flat

Changing this value and regenerating will:

  • Write the new root style to README.md
  • Keep all styles (including the root) in README_ALTERNATIVES/
  • Update the style selector links to reflect which style is root

Style Selector Configuration

The styles section defines each README style's metadata for the style selector:

styles:
  extra:
    name: Extra                    # Display name for badge alt text
    badge: badge-style-extra.svg   # Badge filename in assets/
    highlight_color: "#6a6a8a"     # Border color when selected
    filename: README_EXTRA.md

  classic:
    name: Classic
    badge: badge-style-classic.svg
    highlight_color: "#c9a227"
    filename: README_CLASSIC.md
  # ... other styles

filename is the README variant filename under README_ALTERNATIVES/ used for selector links and references.

The style_order list controls the left-to-right order of badges in the selector:

style_order:
  - extra
  - classic
  - flat
  - awesome

Quick Reference

TaskAutomated?What to do
Add a new resourceYesAdd row to CSV, run make generate
Add a new categoryYesUse make add-category or edit categories.yaml
Add a new subcategoryYesEdit categories.yaml, run make generate-toc-assets, run generator
Update resource infoYesEdit CSV, run make generate
Customize asset styleManualEdit generator templates or asset files

Backups (README Outputs)

The README generators create a backup of the existing output file before overwriting it.

  • Location: .myob/backups/ at repo root
  • Naming: {basename}.{YYYYMMDD_HHMMSS}.bak (e.g., README.md.20250105_154233.bak)
  • Behavior: only created when the target file already exists
  • Coverage: applies to README outputs written by scripts/readme/generate_readme.py
  • Retention: keeps the most recent backup per output file; older backups are pruned

Adding a New Resource

This process is now handled entirely by GitHub workflows. Due to the intricate, not-at-all-over-engineered design mistakes choices, having people submit PRs became unmanageable. Instead, all of the data that goes into a resource entry is processed as a "form" using GitHub's Issue form templates. That makes the shape of an Issue predictable, and the different fields are machine-readable. Since the resources table is the single source of truth for the list entries, the goal is just to get the necessary data points into the CSV, and everything else is controlled by the template/generator system. This eliminated any problems around merge conflicts, stale resource PRs, etc. (Trying to fix merge conflicts in a CSV file is not a good way to spend an afternoon.) The state of resource recommendation Issues is managed by (i) labels (pending-validation, validation-passed, approved, etc.), which indicate the current state; (ii) "slash commands" (/approve, /request-changes, etc.), which trigger a workflow that transitions the state (if they're written by the maintainer). This is a simplified piecture of what the GitHub bot does once a resource is approved:

  1. Edit THE_RESOURCES_TABLE.csv - Add a new row with these columns:
    • Display Name - The resource name shown in the README
    • Primary Link - URL to the resource (usually GitHub)
    • Author Name - Creator's name (optional but recommended)
    • Author Link - URL to author's profile
    • Description - Brief description of the resource
    • Category - Must match a category name in categories.yaml
    • Sub-Category - Must match a subcategory in categories.yaml
    • Active - Set to TRUE to include in README
    • Removed From Origin - Set to TRUE if the original repo/resource was deleted

The reason for the last field is due to the fact that (i) well, it's good to know if you're sharing a link that's dead; (ii) for a while, I was maintaing copies of the third-party authors' resources on the list (when it was licensed in a way that allowed me to do that), but that was when the resource were usually a bit of plaintext. Most entries are full repositories, and re-hosting entire repositories is out of scope. That directory is still present, but it's not currently maintained, and may become deprecated.

  1. Run the generator:

    make generate
    # or directly:
    python3 scripts/readme/generate_readme.py
    
  2. What gets auto-generated:

    • assets/badge-{resource-name}.svg - Theme-adaptive badge with initials box
    • Entry in all README styles

Adding a New Category

  1. Use the interactive tool:

    make add-category
    # or with arguments:
    make add-category ARGS='--name "My Category" --prefix mycat --icon "๐ŸŽฏ"'
    

    Note: make add-category uses scripts/categories/add_category.py (experimental). It rewrites templates/categories.yaml via PyYAML and updates .github/ISSUE_TEMPLATE/recommend-resource.yml, so review the diff after running it.

  2. Or manually edit templates/categories.yaml:

    categories:
      - id: my-category
        name: My Category
        icon: "๐ŸŽฏ"
        description: Description of this category
        order: 10
        subcategories:
          - id: general
            name: General
    
  3. Run the generator:

    make generate
    
  4. What gets auto-generated:

    • assets/header_{category}.svg - Dark mode category header (CRT style)
    • assets/header_{category}-light-v3.svg - Light mode category header
    • assets/subheader_{subcat}.svg - Subcategory header (when resources exist)
    • Section in all README styles
  5. Regenerate subcategory TOC SVGs (if subcategories were added):

    make generate-toc-assets
    

    This creates/updates assets/toc-sub-{subcat}.svg and assets/toc-sub-{subcat}-light-anim-scanline.svg files for all subcategories.

  6. What needs manual creation:

    • assets/toc-row-{category}.svg and assets/toc-row-{category}-light-anim-scanline.svg - TOC row assets (category-level)
    • Card assets if using the EXTRA style navigation grid

Adding a New Subcategory

Subcategories can be added to any category.

  1. Edit templates/categories.yaml:

    categories:
      - id: tooling
        name: Tooling
        subcategories:
          - id: general
            name: General
          - id: my-new-subcat    # Add new subcategory
            name: My New Subcat
    
  2. Regenerate subcategory TOC SVGs:

    make generate-toc-assets
    

    This creates/updates the toc-sub-*.svg and toc-sub-*-light-anim-scanline.svg files in assets/ for all subcategories.

  3. Run the generator - Subcategory headers are auto-generated alongside the README content

If You Change Category IDs or Names

Update these locations:

  1. templates/categories.yaml - Category definitions
  2. Card-grid anchors in templates/README_EXTRA.template.md (they use trailing - anchors)
  3. Any static assets that embed text (for example, card SVGs)

Adding a New README Style

  1. Create a template file in templates/ (for example, README_NEWSTYLE.template.md)
  2. Add a generator class extending ReadmeGenerator under scripts/readme/generators/
  3. Register the class in STYLE_GENERATORS in scripts/readme/generate_readme.py
  4. Create a style selector badge in assets/badge-style-newstyle.svg
  5. Add the style to acc-config.yaml:
    • Add an entry under styles: with name, badge, highlight_color, filename
    • Add the style ID to style_order:
  6. Ensure your template includes {{STYLE_SELECTOR}}

Generator Architecture

The generator uses a class-based architecture with the Template Method pattern. Generator classes live under scripts/readme/generators/ and are wired in scripts/readme/generate_readme.py:

ReadmeGenerator (ABC)
โ”œโ”€โ”€ VisualReadmeGenerator      โ†’ README_ALTERNATIVES/README_EXTRA.md
โ”œโ”€โ”€ MinimalReadmeGenerator     โ†’ README_ALTERNATIVES/README_CLASSIC.md
โ”œโ”€โ”€ AwesomeReadmeGenerator     โ†’ README_ALTERNATIVES/README_AWESOME.md
โ””โ”€โ”€ ParameterizedFlatListGenerator โ†’ README_ALTERNATIVES/README_FLAT_*.md (44 files)

The `root_style` also gets an additional copy written to `README.md`.

Category Management

Categories can be managed via scripts/categories/category_utils.py (experimental):

from scripts.categories.category_utils import category_manager

# Get all categories
categories = category_manager.get_categories_for_readme()

# Get category by name
cat = category_manager.get_category_by_name("Tooling")

Template Placeholders

Templates use {{PLACEHOLDER}} syntax for dynamic content. Key placeholders:

PlaceholderDescriptionGenerator Method
{{ASSET_PATH('file.svg')}}Tokenized asset path resolved per output locationresolve_asset_tokens()
{{STYLE_SELECTOR}}"Pick Your Style" badge row linking to all README variantsget_style_selector()
{{REPO_TICKER}}Animated SVG ticker showing featured projectsgenerate_repo_ticker()
{{ANNOUNCEMENTS}}Latest announcements from templates/announcements.yamlload_announcements()
{{WEEKLY_SECTION}}Latest additions sectiongenerate_weekly_section()
{{TABLE_OF_CONTENTS}}Table of contentsgenerate_toc()
{{BODY_SECTIONS}}Main resource listingsgenerate_section_content()
{{FOOTER}}Footer template contentload_footer()

Template content outside these placeholders is treated as manual copy and is not regenerated.

Asset references use token placeholders (e.g. {{ASSET_PATH('logo.svg')}}) that are resolved after templating based on the destination README path. Resolution walks upward to the repo root (pyproject.toml) and computes a relative path to /assets for each output file.

Generated outputs are prefixed with <!-- GENERATED FILE: do not edit directly --> as a reminder that edits belong in templates and source data.

Repo Ticker System

The repo ticker displays an animated scrolling banner of featured Claude Code projects with live GitHub stats.

Components

FilePurpose
scripts/ticker/fetch_repo_ticker_data.pyFetches GitHub stats for tracked repos
scripts/ticker/generate_ticker_svg.pyGenerates animated SVG tickers
data/repo-ticker.csvCurrent repo stats (stars, forks, deltas)
data/repo-ticker-previous.csvPrevious stats for delta calculation

Generated Tickers

ThemeOutput FileUsed By
Dark (CRT)assets/repo-ticker.svgExtra style (dark mode)
Light (Vintage)assets/repo-ticker-light.svgExtra style (light mode)
Awesomeassets/repo-ticker-awesome.svgAwesome style

Ticker Generation

# Fetch latest repo stats (requires GITHUB_TOKEN)
python scripts/ticker/fetch_repo_ticker_data.py

# Generate ticker SVGs from current data
python scripts/ticker/generate_ticker_svg.py

The tickers:

  • Sample 10 random repos from the CSV
  • Display repo name, owner, stars, and daily delta
  • Animate with seamless horizontal scrolling
  • Use theme-appropriate styling (CRT glow for dark, muted colors for awesome)

Asset Types

Auto-Generated Assets

AssetFilename PatternGenerator Function
Resource badgesbadge-{name}.svgscripts/readme/svg_templates/badges.py:generate_resource_badge_svg()
Entry separatorsentry-separator-light-animated.svgscripts/readme/svg_templates/dividers.py:generate_entry_separator_svg()
Category headers (dark/light)header_{cat}.svg, header_{cat}-light-v3.svgscripts/readme/helpers/readme_assets.py:ensure_category_header_exists()
Subcategory headerssubheader_{subcat}.svgscripts/readme/helpers/readme_assets.py:create_h3_svg_file()
Section dividers (light)section-divider-light-manual-v{1,2,3}.svgscripts/readme/svg_templates/dividers.py:generate_section_divider_light_svg()
Desc boxes (light)desc-box-{top,bottom}-light.svgscripts/readme/svg_templates/dividers.py:generate_desc_box_light_svg()
Sort badgesbadge-sort-{type}.svgscripts/readme/helpers/readme_assets.py:generate_flat_badges()
Category filter badgesbadge-cat-{slug}.svgscripts/readme/helpers/readme_assets.py:generate_flat_badges()
Repo tickersrepo-ticker*.svggenerate_ticker_svg() / generate_awesome_ticker_svg()
Subcategory TOC rowstoc-sub-{subcat}.svg, toc-sub-{subcat}-light-anim-scanline.svgscripts/readme/helpers/readme_assets.py:regenerate_sub_toc_svgs() via make generate-toc-assets
Style selector badgesbadge-style-{style}.svgManual

Pre-Made Assets (Manual)

AssetPurpose
section-divider-alt2.svgDark mode section divider
desc-box-{top,bottom}.svgDark mode description boxes
toc-row-*.svgCategory-level TOC row assets (light variants use -light-anim-scanline)
toc-header*.svgTOC header assets (light variants use -light-anim-scanline)
card-*.svgTerminal Navigation grid cards
badge-style-*.svgStyle selector badges
Hero banners, logosTop-of-README branding

Visual Styles

Light Mode: "Vintage Technical Manual"

  • Muted brown/sepia tones (#5c5247, #3d3530)
  • Coral accent (#c96442)
  • "Layered drafts" effect - doubled lines, ghost shadows
  • L-shaped corner brackets
  • Tick marks and circle clusters

Dark Mode: "CRT Terminal"

  • Green phosphor colors (#33ff33, #66ff66)
  • Scanline overlay effect
  • Subtle glow filter
  • Monospace fonts
  • Animated flicker effects

Generator Functions

Key SVG renderers in scripts/readme/svg_templates/:

# Badge for each resource entry
generate_resource_badge_svg(display_name, author_name)

# Category section header
generate_category_header_light_svg(title, section_number)

# Horizontal dividers between sections
generate_section_divider_light_svg(variant)  # 1, 2, or 3

# Description box frames
generate_desc_box_light_svg(position)  # "top" or "bottom"

# TOC directory listing rows
generate_toc_row_svg(directory_name, description)
generate_toc_row_light_svg(directory_name, description)
generate_toc_sub_svg(directory_name, description)

Key markup helpers in scripts/readme/markup/:

# Style selector (dynamically generated)
generate_style_selector(current_style, output_path, repo_root=None)

Key asset writers in scripts/readme/helpers/readme_assets.py:

# Flat list badges (writes SVGs using scripts/readme/svg_templates/badges.py)
generate_flat_badges(assets_dir, sort_types, categories)

# Regenerate subcategory TOC SVGs for the Visual (Extra) style
regenerate_sub_toc_svgs(categories, assets_dir)

Standalone TOC asset script (scripts/readme/helpers/generate_toc_assets.py):

# Regenerate subcategory TOC SVGs from categories.yaml
make generate-toc-assets
# or directly:
python -m scripts.readme.helpers.generate_toc_assets

Key functions in scripts/ticker/generate_ticker_svg.py:

# Standard ticker (dark/light themes)
generate_ticker_svg(repos, theme="dark")  # or "light"

# Awesome-style ticker (clean, minimal)
generate_awesome_ticker_svg(repos)

Animated Elements

Entry Separator (entry-separator-light-animated.svg)

  • Pulsating dots that ripple outward then contract back in
  • 3 core dots always visible
  • 9 rings of dots animate with staggered timing
  • 2.5 second cycle

TOC Rows

  • Subtle opacity flicker on directory names
  • Hover highlight pulse animation

File Structure

This tree is auto-generated from tools/readme_tree/config.yaml (update with make docs-tree).

awesome-claude-code//
โ”œโ”€โ”€ THE_RESOURCES_TABLE.csv  # Master data file
โ”œโ”€โ”€ acc-config.yaml  # Root style + selector config
โ”œโ”€โ”€ README.md  # Generated root README (root_style)
โ”œโ”€โ”€ README_ALTERNATIVES/  # All generated README variants
โ”‚   โ”œโ”€โ”€ README_EXTRA.md  # Generated (Extra style, always)
โ”‚   โ”œโ”€โ”€ README_CLASSIC.md  # Generated (Classic style)
โ”‚   โ”œโ”€โ”€ README_AWESOME.md  # Generated (Awesome list style)
โ”‚   โ””โ”€โ”€ README_FLAT_*.md  # Generated (44 flat list views)
โ”œโ”€โ”€ templates/  # README templates and supporting YAML
โ”‚   โ”œโ”€โ”€ categories.yaml  # Category definitions
โ”‚   โ”œโ”€โ”€ announcements.yaml  # Announcements content
โ”‚   โ”œโ”€โ”€ README_EXTRA.template.md  # Extra style template
โ”‚   โ”œโ”€โ”€ README_CLASSIC.template.md  # Classic style template
โ”‚   โ”œโ”€โ”€ README_AWESOME.template.md  # Awesome style template
โ”‚   โ”œโ”€โ”€ footer.template.md  # Shared footer
โ”‚   โ””โ”€โ”€ resource-overrides.yaml  # Manual resource overrides
โ”œโ”€โ”€ scripts/
โ”‚   โ”œโ”€โ”€ readme/  # README generation pipeline
โ”‚   โ”‚   โ”œโ”€โ”€ generate_readme.py  # Generator entrypoint
โ”‚   โ”‚   โ”œโ”€โ”€ generators/  # README generator classes by style
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ base.py  # ReadmeGenerator base + shared helpers
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ visual.py  # Extra (visual) README generator
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ minimal.py  # Classic README generator
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ awesome.py  # Awesome list README generator
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ flat.py  # Flat list README generator
โ”‚   โ”‚   โ”œโ”€โ”€ helpers/  # Config/utils/assets helpers for README generation
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ readme_assets.py
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ readme_config.py
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ readme_utils.py
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ generate_toc_assets.py
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ readme_paths.py
โ”‚   โ”‚   โ”œโ”€โ”€ markup/  # Markdown/HTML renderers by style
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ awesome.py
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ flat.py
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ minimal.py
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ shared.py
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ visual.py
โ”‚   โ”‚   โ””โ”€โ”€ svg_templates/  # SVG renderers used by the generator
โ”‚   โ”‚       โ”œโ”€โ”€ badges.py
โ”‚   โ”‚       โ”œโ”€โ”€ dividers.py
โ”‚   โ”‚       โ”œโ”€โ”€ headers.py
โ”‚   โ”‚       โ””โ”€โ”€ toc.py
โ”‚   โ”œโ”€โ”€ ticker/  # Repo ticker generation scripts
โ”‚   โ”‚   โ”œโ”€โ”€ generate_ticker_svg.py  # Repo ticker SVG generator
โ”‚   โ”‚   โ””โ”€โ”€ fetch_repo_ticker_data.py  # GitHub stats fetcher
โ”‚   โ”œโ”€โ”€ categories/  # Category management scripts
โ”‚   โ”‚   โ”œโ”€โ”€ category_utils.py  # Category management
โ”‚   โ”‚   โ””โ”€โ”€ add_category.py  # Category addition tool
โ”‚   โ””โ”€โ”€ resources/  # Resource maintenance scripts
โ”‚       โ”œโ”€โ”€ sort_resources.py  # CSV sorting (used by generator)
โ”‚       โ”œโ”€โ”€ resource_utils.py  # CSV append + PR content helpers
โ”‚       โ”œโ”€โ”€ create_resource_pr.py
โ”‚       โ”œโ”€โ”€ detect_informal_submission.py
โ”‚       โ”œโ”€โ”€ download_resources.py
โ”‚       โ””โ”€โ”€ parse_issue_form.py
โ”œโ”€โ”€ assets/  # SVG badges, headers, dividers
โ”‚   โ”œโ”€โ”€ badge-*.svg  # Resource badges (auto-generated)
โ”‚   โ”œโ”€โ”€ header_*.svg  # Category headers
โ”‚   โ”œโ”€โ”€ section-divider-*.svg  # Section dividers
โ”‚   โ”œโ”€โ”€ desc-box-*.svg  # Description boxes
โ”‚   โ”œโ”€โ”€ toc-*.svg  # TOC elements
โ”‚   โ”œโ”€โ”€ subheader_*.svg  # Subcategory headers
โ”‚   โ”œโ”€โ”€ badge-sort-*.svg  # Flat list sort badges
โ”‚   โ”œโ”€โ”€ badge-cat-*.svg  # Flat list category badges
โ”‚   โ”œโ”€โ”€ badge-style-*.svg  # Style selector badges
โ”‚   โ”œโ”€โ”€ repo-ticker*.svg  # Animated repo tickers
โ”‚   โ””โ”€โ”€ entry-separator-*.svg  # Entry separators
โ”œโ”€โ”€ data/  # Generated ticker data
โ”‚   โ”œโ”€โ”€ repo-ticker.csv  # Current repository stats
โ”‚   โ””โ”€โ”€ repo-ticker-previous.csv  # Previous stats (for deltas)
โ””โ”€โ”€ docs/
    โ””โ”€โ”€ README-GENERATION.md  # This file

Makefile Commands

make generate            # Generate all READMEs (sorts CSV first)
make generate-toc-assets # Regenerate subcategory TOC SVGs (after adding subcategories)
make add-category        # Interactive category addition
make sort                # Sort resources in CSV
make validate            # Validate all resource links
make docs-tree           # Update README-GENERATION tree block

Environment Variables

VariablePurpose
GITHUB_TOKENAvoid GitHub API rate limiting during validation

Troubleshooting

Badge not appearing

  • Check the resource name doesn't have special characters that break filenames
  • Verify the CSV row has all required columns
  • Ensure Active is set to TRUE

New category not showing

  • Ensure category is added to templates/categories.yaml
  • Check for typos between CSV Category column and categories.yaml name
  • Run make generate after changes

Assets look wrong after regeneration

  • The ensure_*_exists() functions only create files if they don't exist
  • To regenerate an asset, delete it first then run the generator
  • Or edit the generator template and manually update existing files

Dark mode assets missing

  • Dark mode dividers, TOC header, and card assets are manual
  • Use existing dark mode assets as templates

README style not generating

  • Check that the template file exists in templates/
  • Verify the generator class is registered in STYLE_GENERATORS in scripts/readme/generate_readme.py

Path Resolution System

The generator uses a dynamic path resolution system to handle relative paths correctly across different README locations. This section documents the key assumptions and behaviors.

Core Assumptions

These assumptions are tested in tests/test_style_selector_paths.py:

AssumptionDescription
Single root READMEExactly one style is copied to README.md (the root_style)
Alternatives path is fixedREADME_ALTERNATIVES/ is a fixed directory under the repo root
Assets at rootThe assets/ folder is a direct child of the repo root
Repo root discoveryPaths resolve from the repo root discovered by finding pyproject.toml
Flat entry pointFlat style links to README_FLAT_ALL_AZ.md as its entry point

Path Prefix Rules

LocationAsset PrefixLink to RootLink to Alternatives
Root (README.md)assets/./README_ALTERNATIVES/file.md
Alternatives../assets/../file.md (same folder)

Key Properties

# In ReadmeGenerator base class:

is_root_style    # True if this style matches config's root_style
resolved_output_path  # Default output path (under README_ALTERNATIVES/)
alternative_output_path  # Path under README_ALTERNATIVES/ for this style
# Root generation uses generate(output_path="README.md")

How Root Style Changes Work

When acc-config.yaml changes from root_style: extra to root_style: awesome:

  1. Awesome README is also written to README.md

    • Asset paths use assets/
    • Links to other styles use README_ALTERNATIVES/file.md
  2. All alternatives remain in README_ALTERNATIVES/

    • Asset paths remain ../assets/
    • Style selector links update to reflect the new root

Breaking Changes to Avoid

These changes would break the path resolution system:

  • Changing README_ALTERNATIVES/ location: Output paths and selector targets are hardcoded to README_ALTERNATIVES/
  • Renaming assets/ folder: All asset path prefixes would break
  • Having multiple root READMEs: Only one style can be root_style
  • Nested alternative folders: All alternatives must be in the same flat folder