Skip to main content
The benson.vc site follows Hugo’s standard directory structure with customizations for the Congo theme. This guide explains the purpose of each directory and important files.

Overview

Here’s the complete directory structure:
benson/
├── archetypes/          # Content templates
├── assets/              # Source files for processing
├── config/              # Site configuration
│   └── _default/        # Default configuration files
├── content/             # All content (markdown files)
├── i18n/                # Internationalization translations
├── layouts/             # HTML templates and overrides
│   ├── _default/        # Default layout templates
│   ├── partials/        # Reusable template components
│   └── shortcodes/      # Custom shortcodes
├── public/              # Generated static site (build output)
├── resources/           # Cached processed resources
├── static/              # Static files (copied as-is)
├── themes/              # Theme directory (unused with modules)
├── .hugo_build.lock     # Build lock file
├── go.mod               # Hugo module dependencies
├── go.sum               # Module checksums
└── hugo.toml            # Legacy config (use config/ instead)

Directory details

archetypes/

Templates for new content created with hugo new.
archetypes/
└── default.md           # Default content template
When you run hugo new content/posts/my-post/index.md, Hugo uses archetypes/default.md as the template, pre-populating frontmatter fields.

assets/

Source files that need processing (SCSS, JavaScript, images). The Congo theme processes these during build.
assets/
├── css/
└── js/
Files here are processed by Hugo Pipes for:
  • SCSS compilation
  • Asset minification
  • Image processing
  • Fingerprinting for cache busting

config/

The primary configuration directory. This project uses the modular configuration approach instead of a single hugo.toml.
config/
└── _default/
    ├── config.toml      # Main site configuration
    ├── languages.en.toml # English language settings
    ├── markup.toml      # Markdown rendering options
    ├── menus.en.toml    # Navigation menu structure
    ├── module.toml      # Hugo module configuration
    └── params.toml      # Theme-specific parameters
Key files:

config.toml

Core site settings (config/_default/config.toml:1-18):
baseURL = "https://benson.vc/"
defaultContentLanguage = "en"
enableRobotsTXT = true
summaryLength = 0

[pagination]
  pagerSize = 10

theme = "congo"
googleAnalytics = "G-RS2TMEY2KX"

[outputs]
  home = ["HTML", "RSS", "JSON"]

module.toml

Hugo module configuration (config/_default/module.toml:1-5):
[hugoVersion]
  extended = false
  min = "0.87.0"

[[imports]]
  path = "github.com/jpanther/congo/v2"
This imports the Congo theme v2.11.0 via Go modules.

content/

All your Markdown content files. This is where you write posts and pages.
content/
├── posts/
│   └── on-the-proliferation-of-artifical-intelligence/
│       └── index.md
└── things-to-do-in-san-francisco/
    └── index.md
Content organization:
  • Each post/page can be a single .md file or a directory with index.md
  • Using directories (leaf bundles) allows you to co-locate images and resources
  • Directory names become URL slugs (e.g., posts/my-post//posts/my-post/)

i18n/

Internationalization translation files. Used for multi-language support with the Congo theme.
i18n/
└── en.yaml              # English translations (if overriding theme defaults)

layouts/

Custom templates that override or extend the Congo theme’s layouts.
layouts/
├── _default/
│   └── baseof.html      # Base template override
├── index.html           # Homepage template
├── partials/
│   ├── about-me.html    # Custom about section
│   ├── angel-investments.html # Investment portfolio display
│   ├── article-link.html # Article link component
│   ├── head.html        # Custom <head> modifications
│   ├── header/
│   │   └── basic.html   # Header customization
│   ├── home/
│   │   └── profile.html # Homepage profile section
│   ├── logo.html        # Custom logo
│   ├── recent-articles.html # Recent posts display
│   └── schema.html      # Structured data (SEO)
└── shortcodes/
    └── figure.html      # Custom figure shortcode
How overrides work: Hugo looks for templates in this order:
  1. layouts/ (your custom templates)
  2. Theme’s layouts/ (from Congo module)
This allows you to selectively override specific templates without modifying the theme.

public/

Generated directory - contains the built static site. Do not edit files here directly.
public/
├── index.html
├── posts/
├── css/
├── js/
├── images/
└── ...
Generated by running:
  • hugo - production build
  • hugo server - serves from memory (doesn’t write here)
This directory should be:
  • Excluded from version control
  • Used as your deployment source
  • Regenerated for each build

resources/

Generated directory - Hugo’s cache for processed assets.
resources/
└── _gen/
    ├── assets/
    └── images/
Can be safely deleted to force reprocessing. Typically excluded from version control.

static/

Static files copied directly to public/ without processing.
static/
├── favicon.ico
├── robots.txt
├── images/
└── files/
Files here are served at the root URL. For example:
  • static/favicon.icohttps://benson.vc/favicon.ico
  • static/images/logo.pnghttps://benson.vc/images/logo.png
Use this for:
  • Favicons
  • Root-level files (robots.txt, sitemap.xml)
  • Files that don’t need processing

themes/

Traditionally for theme files, but unused in this project because the Congo theme is loaded via Hugo modules (see go.mod).

Important files

go.mod and go.sum

Hugo module dependencies (go.mod:1-6):
module github.com/andrewbenson/benson

go 1.21.6

require github.com/jpanther/congo/v2 v2.11.0 // indirect
These files:
  • Define the Congo theme dependency (v2.11.0)
  • Are managed by hugo mod commands
  • Ensure reproducible builds
  • Lock dependency versions (go.sum contains checksums)
Common commands:
# Update all modules
hugo mod get -u

# Update specific module
hugo mod get -u github.com/jpanther/congo/v2

# View dependency graph
hugo mod graph

# Clean module cache
hugo mod clean

hugo.toml

Legacy root configuration file (hugo.toml:1-4). This project uses config/_default/ instead, making this file largely redundant:
baseURL = 'https://example.org/'
languageCode = 'en-us'
title = 'My New Hugo Site'
The actual configuration is in config/_default/config.toml. You can safely ignore or remove this file.

.hugo_build.lock

Build lock file created by Hugo. Should be excluded from version control (it’s in .gitignore).

.gitignore

Specifies files to exclude from Git:
.DS_Store
Consider adding:
public/
resources/
.hugo_build.lock

Configuration cascade

Hugo’s configuration follows a specific hierarchy:
  1. Root config: hugo.toml (legacy, mostly unused here)
  2. Default config: config/_default/*.toml (primary configuration)
  3. Environment config: config/production/*.toml or config/development/*.toml (optional)
  4. Command line: Flags passed to hugo or hugo server
Later sources override earlier ones.

Build outputs

When you run hugo, the build process:
  1. Reads configuration from config/_default/
  2. Loads the Congo theme module
  3. Processes content from content/
  4. Applies templates from layouts/ and theme
  5. Processes assets from assets/
  6. Copies files from static/
  7. Generates output to public/
The generated public/ directory contains:
  • HTML pages
  • Processed CSS and JavaScript
  • Optimized images
  • RSS feed (index.xml)
  • JSON search index (for theme search)
  • Sitemap (sitemap.xml)

Next steps

Now that you understand the project structure:

Build docs developers (and LLMs) love