- netlify.toml: Configure cargo build --release and run compiler.
Publish directory set to public/.
- static/_headers: Add security headers (X-Frame-Options, CSP, etc.)
and cache control for static assets (1 year for css/images,
1 hour for HTML, 1 hour for feed).
- src/feed.rs: New module with generate_atom_feed() that produces
Atom 1.0 XML from blog posts. Uses config.base_url for absolute
entry URLs. Includes xml_escape() helper.
- src/main.rs: Wire mod feed and call generate_feed() after blog
index generation. Outputs to public/feed.xml.
- src/templates.rs: Add <link rel="alternate" type="application/atom+xml">
autodiscovery link to page head using config.base_url.
Feed includes title, author, updated timestamp, and entries with
title, link, id, updated, and summary for each blog post.
- Cargo.toml: Add toml and serde dependencies
- site.toml: New config with title, author, base_url
- src/config.rs: SiteConfig struct with load() function
- src/error.rs: Add Error::Config for parse errors
- src/main.rs: Load site.toml, thread config and page paths
through generators
- src/templates.rs: Use config.title in nav/titles,
config.author in footer, config.base_url for canonical URLs.
All three config fields verified in generated HTML output.
- src/content.rs: output_path() now returns slug.html instead of
slug/index.html for regular content.
- src/templates.rs: All hrefs use explicit .html extension.
Nav links point to index.html, blog.index.html, about.html.
Blog post links use ./slug.html format.
- src/main.rs: Adjust depth values (root=0, blog posts=1).
No more directory-per-page overhead. file:// navigation works
without directory listings. True suckless structure.
- src/templates.rs: Add depth parameter to all template functions.
Add relative_prefix() helper that generates "./", "../", "../..", etc.
All hrefs now use relative paths instead of absolute.
Unit test for relative_prefix() added.
- src/main.rs: Pass depth to templates based on output location.
Root=0, blog index/pages=1, blog posts=2.
Navigation works correctly when viewed via file:// protocol.
Site is now IPFS-compatible.
- Cargo.toml: Add tree-sitter-highlight + grammar crates
(rust, bash, json). TOML dropped due to API incompatibility.
- src/highlight.rs: Language enum, highlight_code() function,
4 unit tests covering parsing and HTML generation.
- Uses static HTML_ATTRS array for zero-allocation rendering.
Add minimal e2e pipeline to transform content → HTML:
- src/error.rs: Custom error types with thiserror
- src/content.rs: YAML frontmatter parsing via gray_matter
- src/render.rs: Markdown → HTML via pulldown-cmark
- src/templates.rs: Maud templates for base layout and posts
- src/main.rs: Pipeline orchestrator
All 15 blog posts successfully rendered to public/blog/*/index.html.
Added thiserror and walkdir dependencies.
Added public/ and DepMap fragment to .gitignore and AGENTS.md.