devtools.directory is a fully static site. There is no server, no database, and no runtime.
content/*.md + data/abstracts/*.yaml
β
βΌ
Hugo (build)
β
βΌ
public/ β static HTML + CSS + JS + index.json
β
βΌ
GitHub Pages β served on every push to main
Hugo reads all Markdown files, resolves cross-references by slug, runs templates, and writes static HTML. The entire site rebuilds in ~60ms.
No server-side queries. All filtering happens in the browser via two mechanisms:
1. data-* attributes β every content card has its metadata embedded as HTML attributes at build time:
<div class="tool-item"
data-language="python"
data-frameworks="django fastapi"
data-type="library"
data-pricing="free">JavaScript reads these attributes and toggles filter-hidden on each element. Instant, zero network requests.
2. JSON index β Hugo generates /index.json at build time containing all tools with their full metadata. Any page can fetch('/index.json') for cross-section queries.
For larger datasets (10k+ items), the upgrade path is Pagefind β run pagefind --site public after the Hugo build, add one <script> tag, and you get full-text binary search.
data/abstracts/*.yaml defines the shape of every content type. Templates read these files to:
- Know which fields to render and how
- Validate required fields and emit warnings
- Resolve inheritance (
frameworkmergestool's fields before its own)
The schema is read at Hugo template render time β no separate build step or code generation.
All relationships are plain slug strings in frontmatter, resolved at render time:
{{/* Find the language page for a tool */}}
{{ $langPage := .Site.GetPage (printf "/languages/%s/" .Params.language) }}
{{/* Find all tools that reference a framework */}}
{{ range where .Site.RegularPages "Section" "tools" }}
{{ if in .Params.frameworks $frameworkSlug }}...{{ end }}
{{ end }}
If a referenced slug has no content file, the reference is silently skipped β no 404, no build error.
devtools.directory/
βββ content/ β all Data and List content files
βββ data/
β βββ abstracts/ β schema definitions
β βββ categories.yaml
βββ layouts/ β Hugo HTML templates
β βββ partials/ β shared components (header, footer, tool-card, validate-abstract)
β βββ tools/
β βββ languages/
β βββ frameworks/
β βββ stacks/
β βββ ...
βββ static/
β βββ css/main.css β One Dark Pro theme
βββ hugo.toml β Hugo config
βββ .github/
βββ workflows/
βββ deploy.yml β build + deploy on push to main