Repository navigation
Releases: monolithiclab/gomddoc
Releases · monolithiclab/gomddoc
Release list
v0.2.1
Highlights
- Line-icon dark mode toggle. The default theme's toggle shows monochrome moon/sun icons drawn in the
button's text colour instead of the colourful emoji, andtheme-toggle.mjsfills an empty toggle button with
the same icons. The downloadable themes ocean, midnight and nord match from gomddoc-themes.
Changelog
Features
- feat(theme): line-icon dark mode toggle instead of emoji
Documentation
- docs(roadmap): gomddoc-website migrated with v0.2.0
v0.2.0
Highlights
- Page annotations. Select text on a rendered page, attach a note, and copy every note of the page as Markdown
that names the source file (relative to the repository root) and quotes each passage, ready to paste into an LLM
harness. Notes stay in the browser'slocalStorage. On by default, including ingomddoc buildoutput: a public
static site gains the annotation UI and its pages name their repo-relative source path. Turn it off with
theme.features.annotations: false(GOMDDOC_SITE_THEME_FEATURES_ANNOTATIONS=false) or per page with
features: {annotations: false}. See the guide's "Annotating a Page". - Localized client strings in every theme. Code copy buttons, search, color chips and annotations read their UI
text from<script type="application/json" data-gmd-i18n="…">blocks emitted byscripts-shared. The seven
downloadable themes now show these strings in the page's language (they were always English). Theme scripts can
add their own namespace (guide: Internationalization). - Built with Go 1.26.10 (GO-2026-6809,
crypto/x509).
Upgrade notes
- Renamed locale keys:
copy→code_copy_label,copied→code_copy_done,aria_copy_code→
code_copy_aria. Rename them in.gomddoc/locales/*.yml; the old names are ignored. - New locale keys:
search_label(the search dialog;aria_searchnow only labels the header button),
search_query,search_results,color_chip_label,color_chip_done, plus theannotation*keys. A fully
translated site shows the default language for these until it adds them. - Plural variants:
_zero,_one,_two,_fewand_manyare reserved suffixes, chosen by each language's
plural rules. Variant strings take%d. A site key ending in one of these suffixes is now treated as a plural
variant by.T. - The
data-*attributes on<html>are no longer read. Themes that inline the shared modules themselves
(instead of callingscripts-shared) must loadcode-copy.mjs,search.mjs,gmd-color-chip.mjsand
gmd-annotations.mjswith<script type="module">and emit their blocks withi18nStrings. - Static hosts must serve
.mjsas JavaScript (_assets/gmd-i18n.mjs); the modules import it. - Per-page
features:frontmatter overrides now work (they were ignored). Tag pages honour the site's feature
toggles. Generated directory listings no longer carry a JSON-LDdateModified.
Changelog
Features
- feat(annotations): annotation UI in the default theme
- feat(annotations): core anchoring, export and storage module with Vitest gate
- feat(i18n): code copy, search and color chips read namespaced blocks
- feat(i18n): gmd-i18n.mjs helper for namespaced client strings
- feat(template): i18nStrings namespaces and CLDR plural variants
- feat(template): repo-relative SourcePath in the page context
Bug fixes
- fix(annotations): bold markers outside quote whitespace, escape headings
- fix(annotations): copy fallback, admonition titles, shortcut layouts, cross-tab sync
- fix(annotations): follow the page colour scheme
- fix(annotations): persistent live region, feature-detected define, anchoring fallback
- fix(annotations): plural count label through tn
- fix(annotations): plural labels, focus fallbacks, modal popover
- fix(config): read per-page feature overrides from YAML frontmatter
- fix(i18n): own string values only, plural rules per document
- fix(make): test-ui hints at a missing Chrome; spec amendments
- fix(server): git-URL subdir source prefix, no Stat for file pages
- fix(template): _one labels only from the page language
Documentation
- docs(agents): point plans at docs/plans, merge the network note, state the vulncheck scope
- docs(annotations): README, guide index, components table, funcMap and static builds
- docs(i18n): example namespaces, D51 format, fallback wording
- docs(i18n): namespaced client strings in the guide, architecture and decisions
- docs(i18n): upgrade notes, module inlining and static hosting
- docs(plans): annotations execution notes
- docs(plans): client-side strings execution notes
- docs(plans): client-side strings plan
- docs(roadmap): annotations shipped, follow-ups parked
- docs(specs): annotations UI on custom elements, Popover API and dialog
- docs(specs): annotations may span skipped elements
- docs(specs): client-side page annotations design and plan
- docs(specs): move specs and plans out of docs/superpowers, date prefix YYYYMMDD.
- docs(specs): namespaced JSON data blocks for client-side strings
Other
- build(go): toolchain go1.26.10 for GO-2026-6809 (crypto/x509)
- build(make): binary name from go.mod, not the directory
- build(make): canonical common.go.mk with TEST_FLAGS, GOLANGCI_ARGS and GORACE
- build(make): sync common.go.mk (CI_EXTRA hook)
- build(make): sync common.go.mk (deferred CI_EXTRA)
- ci(workflow): key the UI cache on make ui-inputs-hash
- refactor(annotations): custom elements, Popover API and Invoker Commands
- refactor(annotations): labels through the shared i18n helper
- refactor(annotations): lighter selection handling and one action helper
- refactor(annotations): sourceless pages and bundle-derived label keys
- refactor(i18n): shared test block helper, sturdier contract test, no CSS.escape
- refactor(pipeline): normalise frontmatter once, clean git subdirs, one source prefix
- refactor(server): providers report the served file
- test(annotations): Playwright end-to-end and axe checks, UI suite in CI
- test(annotations): per-page override through the real renderer, e2e tidy-ups
v0.1.4
Changelog
Bug fixes
- fix(build): end published page URLs in a slash, matching the static host
- fix(build): write redirect stubs as directories so static hosts redirect
Documentation
- docs(agents): let sessions tag releases, CI still publishes them
- docs(agents): rename CLAUDE.md to AGENTS.md
- docs(claude): let agents commit their own work
- docs(claude): rewrite CLAUDE.md to the lab template
- docs(decisions): number and date every entry
- docs(guide): align every guide page with the implementation
- docs(license): set the commercial licensing contact address
- docs(plans): end every plan with its execution notes
- docs(readme): cut the README to the lab shape and link the guide
- docs(review): re-verify open findings and add the documentation-audit bugs
- docs(reviews): move the root REVIEW.md to docs/reviews/
- docs(roadmap): carry the codebase review's open findings
- docs(roadmap): move docs/roadmap.md to the root ROADMAP.md
- docs(specs): move specs and plans under docs/superpowers with the lab names
- docs(specs,plans): record implementation status and divergences
- docs(themes): label the bundled default theme with gomddoc's licence
- docs: bring architecture, decisions, roadmap, README and CLAUDE.md up to date
Other
- build(deps): bump the lint tools' gRPC to 1.83.2
- build(docker): pin the runtime image to distroless static-debian13 by digest
- build(go): pin toolchain go1.26.9 for the standard-library vulnerabilities
- build(lint): run golangci-lint alone with the lab config
- build(make): adopt the lab's common.mk and go.mk fragments
- build(make): follow the lab skills' rename to lab-go-app
- build(make): rename go.mk to common.go.mk
- ci(release): converge the release on the lab's canonical pipeline
- ci(workflows): run exactly make ci, least privilege everywhere
v0.1.3
Changelog
Features
- feat(capabilities): assemble one self-description report
- feat(cli): add gomddoc doctor
- feat(cli): add gomddoc help to read the guide in the terminal
- feat(cli): convert the Kong model for the capabilities report
- feat(cli): info describes gomddoc from the capabilities report; add schema
- feat(config): Inspect loads a site collecting every problem
- feat(config): ValidateAll reports every invalid value
- feat(config): derive a settings schema from struct tags
- feat(config): project a JSON Schema for config.yml
- feat(diag): one finding type and code catalogue for doctor and the logs
- feat(docs): embed the user guide in the binary
- feat(doctor): frontmatter and page metadata checks
- feat(doctor): report unknown config keys and env vars
- feat(doctor): theme and exclude checks
- feat(mcp): add gomddoc_doctor
- feat(mcp): add gomddoc_guide over the embedded guide
- feat(mcp): add the learn_gomddoc onboarding prompt
- feat(mcp): serve gomddoc's self-docs from gomddoc mcp
- feat(mcp): serve the capabilities report and config schema under gomddoc://
- feat(metadata): declare the special frontmatter fields
- feat(server): report redirect_from problems instead of dropping them
- feat(template): list a theme's feature keys and CSS vars by template scan
Bug fixes
- fix(capabilities): report "not inspected" instead of "not found"
- fix(ci): remove the standalone vulncheck job, calling a target I deleted
- fix(config): derive the default title from the content dir, not the cwd
- fix(config): let --dir-index beat the config file
- fix(config): log env warnings even when config.yml fails to load
- fix(config): no "default": null for exclude in the JSON Schema
- fix(deps): pin a toolchain patch to clear stdlib govulncheck findings
- fix(diag): Dedupe no longer merges distinct problems on one key
- fix(diag): keep serve's unreadable-path log at Warn
- fix(doctor): report a missing directory as unreachable, not a bad config
- fix(mcp): skip fenced code when finding section headings
- fix(template): scan the templates the renderer resolves, not the theme dir
Documentation
- docs(plans): gomddoc doctor implementation plan
- docs(review): record --domain validation and duplicate-anchor findings
- docs(specs): gomddoc doctor spec (self-documentation sub-spec 2)
- docs(specs): self-documentation spec, plan, and parked theme manifest
- docs: document gomddoc doctor
- docs: document gomddoc's self-description surface
- docs: note internal/guide and the new packages in the structure maps
Other
- ci(release): release the pushed tag, not git's highest one at HEAD
- ci(release): sign checksums as a Sigstore bundle for cosign v3
- refactor(config): Normalize reports replaced values as findings
- refactor(config): env overrides report unparseable values as findings
- refactor(guide): one package for the embedded guide's topics
- refactor(metadata): expose the frontmatter block
- refactor(resolve): report path collisions as findings
- refactor(text): move section extraction out of internal/mcp
- refactor(text): move the "did you mean" matcher out of doctor
- test(docs): hold the guide to the env vars and keys gomddoc reads
v0.1.2
Changelog
Features
- feat(seo): emit JSON-LD datePublished/dateModified from one freshness rule
Bug fixes
- fix(cli): resolve version from build info when ldflags are absent
- fix(build): derive Page.Path from the resolver, not the file path
- fix(config): reject unknown keys in config.yml instead of dropping them
- fix(config): wire the six advertised GOMDDOC_SERVER_* environment variables
- fix(deps): bump golang.org/x/crypto and go-git to close known CVEs
- fix(deps): bump vulnerable modules and gate CI on govulncheck
- fix(dist): fail closed on missing checksum tool, verify cosign signature
- fix(errors): stop discarding the reason a git URL, tree or marshal failed
- fix(locale): recognise script and region language directories
- fix(metadata): deep-copy pages out of the index, alias only by contract
- fix(metadata): give "is this a known tag" one answer
- fix(misc): close the five §10.7 Misc findings
- fix(pipeline): stop indexing language directories into the default pipeline
- fix(provider): honor the io/fs error contract in both fs.FS implementations
- fix(provider): serialise git tree access behind a single exclusive lock
- fix(resolve): honour exclude patterns when building clean-URL mappings
- fix(search,renderer): remove two latent panics from the request path
- fix(seo): give each page its own meta description
- fix(seo): robots.txt names the sitemap that was actually published
- fix(server): bind admin port to loopback and gate pprof behind auth
- fix(server): revalidate the cached sitemap, feed and robots.txt
- fix(server): serve one themed error page per language scope
- fix(template): make renderer errors name the theme that failed
- fix(theme): resolve content links through contentURL, unfork head-meta
- fix(themes): :not(:defined) selectors named an element that never existed
Documentation
- docs(build): correct the output-layout rules, and pin the stub shape
- docs(godoc): give every package a doc comment, enforced by ST1000
- docs(observability): --admin-port does not move health off the main port
- docs(review): record 15th-pass findings
- docs(review): trim REVIEW.md to open findings, sync roadmap with reality
- docs(roadmap): add content annotations → agent handoff
- docs(roadmap): fold the canonical-URL fix into the v0.1.2 release item
- docs(seo): date the competitive analysis instead of rewriting it
- docs(seo): mark sitemap-index.xml build-only, and pin serve's lack of it
- docs: correct drifted claims and pin the translation-key list
- docs: correct the serve flag table and the Docker/k8s examples
- docs: correct the theme count and the architecture.md route/middleware drift
- docs: replace the dead custom-renderer interface with a real guide
- docs: replace the nonexistent
navigationtemplate function
Other
- build(make): fold govulncheck into
make lintaslint-vulncheck - ci: pin every action to a commit SHA and goreleaser to an exact range
- lint(ci): move golangci-lint to v2, unbreaking it under the current Go toolchain
- perf(enricher): bound related-docs work to the result size, not the corpus
- perf(mcp): share the pipeline's nav generator with get_table_of_contents
- perf(provider): resolve git paths once and stop decoding blobs to stat them
- perf(search): fold snippet bodies once, not once per window
- perf(search): merge sorted posting lists instead of mapping them per query
- perf(server): compress and count every user-facing route
- perf(server): decide before copying, and stop poisoning the buffer pool
- perf(template): generate breadcrumbs once per page
- refactor: correct comments that describe code that is not there, gate shadowing
- refactor: delete dead code and the chains its removal exposed
- test(concurrency): cover every lazy cache from cold and concurrent
- test(degradation): cover the silent skip paths and stop losing language counters
- test(mcp): cover ExcludePatterns end to end and widen the fixture's restricted-path matrix
- test(renderer): pin the heading-slug algorithm and both parsers against it
- test: make sitemap, feed, and static-build assertions falsifiable
v0.1.1
Changelog
Features
- feat(dist): add install script and fail fast on a bad tap token
v0.1.0
Changelog
Features
- feat(assets): implement OverlayFS for layered asset management
- feat(config): implement SiteConfig with YAML and env var support
- feat(config): skip filesystem validation for Git URLs
- feat(main): integrate Git provider via factory function
- feat(provider): add Git URL parsing with IsGitURL helper
- feat(provider): add Git-specific sentinel errors
- feat(provider): add GitProvider with complete Provider implementation
- feat(provider): add NewProvider factory function
- feat(provider): add gitFileInfo and gitDirEntry implementations
- feat(renderer): implement YAML front matter support
- feat(security): add middleware to block hidden files and directories
- feat(template): implement TemplateCache interface and update context
- feat: add MIME type normalization utilities
- feat: add ServerConfig with DirIndex support
- feat: add breadcrumb navigation to markdown rendering
- feat: add comprehensive config validation for port, directory, and timeouts
- feat: add configurable HTTP server timeouts for security hardening
- feat: add error handling foundation with sentinel errors
- feat: complete handler refactor with content negotiation and rendering
- feat: define core renderer interfaces
- feat: define core renderer interfaces
- feat: future-proof provider interface with io.Closer implementation
- feat: implement HTTP Accept header negotiation
- feat: implement MarkdownRenderer with context support
- feat: implement PassthroughRenderer with wildcard MIME support
- feat: implement directory listing generation utilities
- feat: remove deprecated processor package
- feat: restructure to interface-driven architecture with performance optimizations
- feat: specify mime-based renderers logic
- feat: support inline mermaid graph in the default theme layout
- feat: update Provider interface to return MIME types and handle directories
Bug fixes
- fix(build): marshal sitemap-index.xml instead of string-building (REVIEW §9.2)
- fix(i18n): serve per-language content instead of 404 (REVIEW §9.1)
- fix(mcp): tab-aware heading indentation check (REVIEW §9.4)
- fix(metadata): deep-copy AllPages inner references (REVIEW §9.8)
- fix(provider): accept any fs.FS, not just fs.StatFS (REVIEW §9.7)
- fix(resolve): return defensive copy from AllMappings (REVIEW §9.8)
- fix(search): truncate query on a rune boundary (REVIEW §9.4)
- fix(see-also): cap related-docs list (REVIEW §9.4)
- fix(see-also): resolve related-page links via contentURL (REVIEW §9.2)
- fix(server): guard nil LocaleBundle in per-language loop (REVIEW §9.4)
- fix(tags): normalize page tag chips like the index (REVIEW §9.4)
- fix(tooling): show proper error on format error
- fix: add renderer import in provider tests for MIME type registration
- fix: add sentinel errors and structured error types for better error handling
- fix: define constants for maximum configurable values
- fix: fix configuration envvar override
- fix: improve HTMLRenderer dependency injection pattern
- fix: resolve race condition in TitleCase by creating new Caser per call
- fix: sort OverlayFS ReadDir results for consistent output
- fix: suppress false positive gosec G710 in ExtensionRedirect
- fix: transform breadcrumbs from map to array
- fix: update renderer to support Context cancelation
Documentation
- docs: add comprehensive user guide
- docs: add thread-safety documentation to DefaultRegistry and HTMLRenderer
- docs: add yaml front matter metadata to all documentation files
- docs: comprehensive documentation for renderer system
- docs: conclude 14th review pass; sync REVIEW.md + roadmap
- docs: document unbounded template cache limitations
- docs: fix documentation drift (REVIEW §9.6)
- docs: reconcile roadmap + record 14th review pass
- docs: update configuration guide with exhaustive options
- docs: update documentation with all recent changes
- docs: update roadmap to reflect strategic pivot towards git-native viewer
Other
- Convert NewHandler to use HandlerConfig options struct
- Fix NormalizeMimeType case inconsistency between fast and slow paths
- Fix byte position mismatches in search snippet Unicode handling
- Separate config Validate from Normalize
- Add --dir-index flag to preview subcommand for quick directory listings
- Add --domain flag to serve, build, and preview commands
- Add --force flag to guard build output directory
- Add .worktrees/ to .gitignore
- Add sequential page links from navigation tree
- Add API language resolution and multi-language search dispatch
- Add Atom feed generation for serve and build modes
- Add BCP 47 language detection from directory names and URL paths
- Add CSS value sanitization for theme variables
- Add ETag/304 Not Modified HTTP caching support
- Add ErrEmptyDefaultIndex sentinel to replace duplicated error string
- Add ErrProviderClosed sentinel error for closed provider operations
- Add HTTP Basic Auth with htpasswd file support
- Add JSON-LD structured data with Schema.org markup (Phase 9b)
- Add KaTeX math rendering support for inline and block math
- Add MCP Streamable HTTP endpoint at /_mcp/ on serve and preview (Phase 10b)
- Add MCP server for AI-native documentation access (Phase 10a)
- Add Makefile install target
- Add OverlayProvider for static asset fallback and consolidate packages
- Add PathResolver for extensionless URL mapping
- Add Prometheus metrics middleware and /metrics endpoint (WU-10)
- Add RelatedDocs field to template PageContext
- Add RenderTagPage and tags-list partial
- Add RenderTagsIndex and tags-index partial
- Add StripExtensions config field with .md default
- Add StripFrontmatter tests, bringing coverage from 0% to 100%
- Add TagPageHandler for /tags/{tag}
- Add TagsIndexHandler for /tags/
- Add Unwrap method to statusRecorder for ResponseWriter chain
- Add an info subcommand
- Add auto-navigation sidebar with collapsible directory tree
- Add auto-port assignment with --port :auto flag
- Add benchmark suite and pprof endpoint (Phase 4)
- Add built-in en-US locale file with all UI strings
- Add byPath index to metadata.Index for O(1) page lookup
- Add client-side search UI with modal, keyboard navigation, and Ctrl+K shortcut (Phase 5)
- Add comprehensive i18n guide (13-internationalization.md), document web components strategy in theming guide, add admin port and theme variables sections to configuration, expand observability with Go runtime metrics, update SEO with Atom feeds and hreflang, and add multi-language coverage across search, deployment, API reference, and markdown extensions docs. Remove outdated Kubernetes/Docker Compose examples and Grafana section from observability. Fix language default from "en" to "en-US", correct Prometheus scrape target, and update middleware chain. Remove dead ServerConfig.GitSSHKey field from architecture doc.
- Add comprehensive test suite and fix path handling
- Add config.NewFromDir for non-server config loading
- Add configurable HTML lang attribute with per-page override
- Add configurable exclude patterns for file serving
- Add content enricher pipeline (Phase 6b)
- Add contentURL template function for absolute content paths
- Add context.Context to Provider interface methods
- Add copy-to-clipboard button for code blocks
- Add dark/light mode toggle button to navigation
- Add debug logging for non-ErrNotExist errors in OverlayFS.ReadDir
- Add dedicated admin port for metrics and pprof endpoints
- Add defaultIndex validation in SiteConfig.Validate()
- Add design spec: see-also section (tag components sub-spec 2 of 3)
- Add design spec: tag chips, listing, and index pages
- Add design spec: tag: search syntax (tag components sub-spec 3 of 3)
- Add direct snippet function tests with Unicode edge cases
- Add disk-based Git storage factory to prevent OOM on large repos
- Add en-US locale string for see-also section heading
- Add en-US locale strings for tag pages and chips
- Add enrichment data to markdown passthrough renderer
- Add env var support to build and preview subcommands
- Add extension redirect middleware and resolver-based path resolution
- Add full-text search engine with inverted index and API endpoint (Phase 5)
- Add generic feature toggles system replacing one-off ColorChips and HasSearch
- Add git flags to preview, build, and mcp for consistent CLI
- Add gomddoc build command for static site generation
- Add gomddoc init subcommand to scaffold .gomddoc/ config
- Add gomddoc preview subcommand for quick local documentation preview
- Add gzip response compression middleware
- Add health check endpoints for liveness and readiness probes
- Add i18n support to TemplateContext: T(), Lang(), Languages()
- Add implementation plan for build sentinel file
- Add implementation plan for path traversal fixes
- Add implementation plan: see-also section
- Add implementation plan: tag chips, listing, and index pages
- Add inline color chip rendering for backtick-wrapped hex codes
- Add integration tests and fix uncommitted changes from parallel tasks
- Add integration tests for i18n: detection, routing, API, hreflang
- Add locale bundle for i18n string resolution
- Add metadata indexing with JSON API for tags
- Add missing t.Parallel(), improve test assertions and cleanup
- Add multi-language pipeline setup with per-language provider instances
- Add multi-language static site build with per-language output
- Add multi-stage Dockerfile and deployment documentation
- Add page layout selection via frontmatter layout field
- Add per-page robots meta tag with sitemap noindex exclusion
- Add pre-launch SEO: canonical URLs, sitemap, robots.txt, Open Graph (Phase 9a)
- Add pretty URL output and extension redirects in build mode
- Add provider-agnostic asset overlay to support Git repo theme overrides
- Add redirect_from frontmatter support for URL red...