5.0 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
LinkBeam is a static site generator for creating personal link-in-bio pages (similar to Linktree). It reads a YAML configuration file containing user profile information, links, and social media, then generates a themed HTML page using Go templates.
CI/CD Pipeline
The project uses Gitea Actions for continuous integration and deployment.
Workflows
-
CI Pipeline (
.gitea/workflows/ci.yml):- Runs on push to main/develop and pull requests
- Lint: golangci-lint, go fmt, go vet
- Test: Run tests with race detection and coverage
- Build: Multi-platform builds (Linux, Windows, macOS) for amd64, 386, arm64, armv7
- Docker: Build multi-arch Docker images
-
Docker Publish (
.gitea/workflows/docker-publish.yml):- Triggered on version tags (v*)
- Builds and pushes Docker images to container registry
- Multi-architecture: linux/amd64, linux/arm64, linux/arm/v7
-
Release (
.gitea/workflows/release.yml):- Triggered on semver tags (v*..)
- Creates GitHub/Gitea releases with binaries for all platforms
- Generates SHA256 checksums for verification
Local Testing
# Check version
./linkbeam -v
# or: ./linkbeam --version
# Test Docker build
docker build -t linkbeam:test .
# Run Docker container
docker run -v $(pwd)/config.yaml:/app/config/config.yaml \
-v $(pwd)/dist:/app/dist \
linkbeam:test
# Test with docker-compose
docker-compose up
Development Commands
Pre-commit Setup
This project uses pre-commit hooks for code quality. First-time setup:
# Install pre-commit hooks
make install-hooks
# or: pre-commit install
# Run all hooks manually
make pre-commit
# or: pre-commit run --all-files
The hooks automatically run on commit and check: go fmt, goimports, go vet, golangci-lint, go test, go mod tidy, YAML syntax, and more.
Building and Running
# Build binary (outputs to dist/linkbeam)
make build
# or: go build -o dist/linkbeam cmd/linkbeam/main.go
# Run with example config
make run-example
# or: go run cmd/linkbeam/main.go --config internal/config/testdata/config.yaml
# Run with custom config (long flags)
./linkbeam --config config.yaml --template templates/base.html --output dist/index.html
# Run with custom config (short flags)
./linkbeam -c config.yaml -t templates/base.html -o dist/index.html
# Run all tests
make test
# or: go test -v ./...
# Run tests for a specific package
go test ./internal/config
go test ./internal/generator
# Run a single test function
go test -v -run TestLoad ./internal/config
# Clean build artifacts
make clean
CLI Options
-c, --config: Path to config YAML file (default: "config.yaml")-t, --template: Path to HTML template (default: "templates/base.html")-o, --output: Path to output HTML file (default: "dist/index.html")-v, --version: Print version information
Output
The dist/ directory contains both build artifacts and generated site:
dist/linkbeam- Compiled binarydist/index.html- Main HTML pagedist/themes/- Copied CSS theme files
Architecture
Two-Layer Structure
-
Config Layer (
internal/config/):- Loads and validates YAML configuration files
- Defines data structures:
Config,Link,Social - Validates theme (must be "light" or "dark") and required fields (name cannot be empty)
- Config validation happens automatically during
config.Load()
-
Generator Layer (
internal/generator/):- HTML Generation: Orchestrates template rendering using Go's
html/templateGenerateSite(cfg, templatePath, outPath)- Creates HTML from templates
- Asset Management: Copies CSS themes and static files to output directory
CopyAssets(distDir, themeDirs...)- Copies theme files to dist/themes/
- Text Rendering: Plain-text representation for debugging
RenderUserPage(cfg)- Returns text-based preview of the page
- HTML Generation: Orchestrates template rendering using Go's
Configuration Format
The config YAML structure in internal/config/testdata/config.yaml:
name: User's display name (required)bio: Short biography textavatar: Path to avatar imagetheme: "light" or "dark" (validated)links[]: Array of link objects withtitle,url,iconsocials[]: Array of social media links withplatform,url,icon
Templates
Templates in templates/ use Go template syntax:
base.html: Main page template with theme support (data-theme="{{ .Theme }}")- Template receives the entire
Configstruct as data - Access config fields with
{{ .Name }},{{ .Bio }}, etc. - Iterate over links with
{{- range .Links }}
Testing Strategy
- Tests use table-driven patterns and dependency injection
cmd/linkbeam/main_test.go: Mocks the config loader and captures stdout- Config tests validate YAML parsing and business rules
- Generator tests verify file creation and template execution
- All tests use the testdata in
internal/config/testdata/config.yaml