Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
148 commits
Select commit Hold shift + click to select a range
04297f2
Initial commit
XtremeOwnageDotCom Jul 20, 2026
3098706
Merge remote-tracking branch 'origin/main'
Jul 20, 2026
e93117c
Add client-side syntax highlighting (highlight.js) for code blocks
Jul 20, 2026
703ddf9
Add built-in sitemap.xml and redirects plugin (fixes /discord)
Jul 20, 2026
c1dcd45
Render tag index into pages with <!-- material/tags --> marker
Jul 20, 2026
9b3efcc
Hierarchical tag index, page date footer, and real git-revision dates
Jul 20, 2026
8be9983
Add 'exclude' config option to omit include-only files from discovery
Jul 20, 2026
27c1275
Blog post metadata header (date/read-time/categories) + folder-derive…
Jul 20, 2026
07d7b4d
Add prev/next page navigation in footer (navigation.footer)
Jul 20, 2026
e576b5c
Add GitHub Actions CI (build + test); use cross-platform paths in CLI…
Jul 20, 2026
5c4f3c8
Dev server: auto-select a free port if requested one is busy; update …
Jul 20, 2026
560e147
Fix PluginHost dropping plugin-injected assets; add inline-script sup…
Jul 20, 2026
b77c1c3
Fix code blocks: stop Scriban re-indenting <pre>; add line numbers to…
Jul 21, 2026
09a7df2
Add social cards (ImageSharp OG images), abbreviations plugin, code-b…
Jul 21, 2026
0cd670f
Consolidate plan/TODO.md from all plan files (docs/packaging, tags di…
Jul 21, 2026
cba3a64
Untrack plan/ (planning dir, gitignored)
Jul 21, 2026
69ca074
Fix images: rewrite relative image/resource links to source-based out…
Jul 21, 2026
6e64d68
Match Material blog post layout: author card, metadata sidebar, tag c…
Jul 21, 2026
5d0a719
Fix front-matter tail leak with CRLF line endings
Jul 21, 2026
034ae4e
Make search teasers concise: page doc text = intro only
Jul 21, 2026
5051cb4
Fix blog excerpts and add Archive/Categories listing sidebar
Jul 21, 2026
10c90f8
Update footer wording to credit Netdocs as an MkDocs-Material derivative
Jul 21, 2026
a43aefc
Add per-page tags_title override for the tags page
Jul 21, 2026
3dcb11d
Implement file-filter: env-driven label include/exclude
Jul 21, 2026
b753972
Add Netdocs documentation site (built with Netdocs itself)
Jul 21, 2026
b8eaf2d
Add GitHub Pages publish workflow for the docs site
Jul 21, 2026
c7c816d
Add Dockerfile and GHCR image publish workflow
Jul 21, 2026
d19cbed
Add .deb/.rpm packaging via nfpm and release workflow
Jul 21, 2026
4ddb923
Implement typeset: smart typography via Markdig SmartyPants
Jul 21, 2026
da8985f
Implement table-reader: embed CSV/delimited data as Markdown tables
Jul 21, 2026
ee71912
Re-enable NuGet audit and update packages to patched versions
Jul 21, 2026
bd2a078
Publish standard build env flags and enforce strict mode
Jul 21, 2026
b57ed0e
Load external plugins from ./plugins/*.dll
Jul 21, 2026
0b8a417
Render emoji as Twemoji SVG images
Jul 21, 2026
e2bdf10
Add blog author pages and multi-author post display
Jul 21, 2026
30f5171
Add keyboard keys and CriticMarkup inline extensions
Jul 21, 2026
10c99ea
Port the fileuri and ebay macros to a real plugin
Jul 21, 2026
729caa5
Support pymdownx.highlight fence options and inlinehilite
Jul 21, 2026
cc4a55c
Add breadcrumbs, section index links, and blog prev/next navigation
Jul 21, 2026
1ea2b25
Add golden-file tests for the Markdown pipeline
Jul 21, 2026
2e9d9b3
Add an incremental render cache for the Markdown step
Jul 21, 2026
32dfa1a
Document porting Material Jinja overrides to Scriban
Jul 21, 2026
799f4bb
Make the search index config tunable and document the lunr trade-off
Jul 21, 2026
ac22a15
Add git-sync watch daemon with incremental output writes
Jul 21, 2026
6124871
Replace blog-specific ebay macro with a neutral button example
Jul 21, 2026
d2b5f12
deps: Bump Markdig from 0.42.0 to 1.3.2
dependabot[bot] Jul 21, 2026
4e385ab
deps: Bump YamlDotNet from 16.3.0 to 18.1.0
dependabot[bot] Jul 21, 2026
3099d82
deps: Bump Microsoft.NET.Test.Sdk, xunit and xunit.runner.visualstudio
dependabot[bot] Jul 21, 2026
bd01b29
Add build lifecycle diagram and events/callbacks reference docs
Jul 21, 2026
35afe2a
README: add honest why-use disclaimer and feature comparison
Jul 21, 2026
6def733
deps: Bump Microsoft.Extensions.Configuration and 7 others
dependabot[bot] Jul 21, 2026
ba750cf
Add community docs, issue/PR templates, and versioning guide
Jul 21, 2026
ac18258
Add .editorconfig and dotnet format lint check in CI
Jul 21, 2026
fed8166
Add configurable slugify (case, separator, ascii)
Jul 21, 2026
48aa1cf
README: add badges, install/download guide, fix internal path refs
Jul 21, 2026
b1347cf
docs: lead installation with prebuilt downloads over from-source
Jul 21, 2026
7d93d62
blog: make post categories clickable links to category pages
Jul 21, 2026
ecc42a4
theme: hide right TOC sidebar on blog listing and post pages
Jul 21, 2026
e53dfc8
theme: link section tabs to their section index (fixes Blog tab going…
Jul 21, 2026
610559e
Merge pull request #6 from XtremeOwnage/dependabot/nuget/YamlDotNet-1…
XtremeOwnageDotCom Jul 21, 2026
2f5575b
Merge pull request #4 from XtremeOwnage/dependabot/nuget/Markdig-1.3.2
XtremeOwnageDotCom Jul 21, 2026
08ec676
Merge branch 'main' into dependabot/nuget/microsoft-extensions-d81271…
XtremeOwnageDotCom Jul 21, 2026
99caf91
Update YamlDotNet package version
XtremeOwnageDotCom Jul 21, 2026
f9d549c
Merge pull request #1 from XtremeOwnage/dependabot/nuget/microsoft-ex…
XtremeOwnageDotCom Jul 21, 2026
ce182a8
Merge pull request #2 from XtremeOwnage/dependabot/nuget/test-baf225a703
XtremeOwnageDotCom Jul 21, 2026
078f43c
feat: add filesystem/git deploy targets and HTML minify option
Jul 21, 2026
b2de785
theme: re-run highlight.js and mermaid on instant navigation
Jul 21, 2026
c202d1e
readme: add prominent Documentation badge and link
Jul 21, 2026
2e6bd12
ci: cross-platform release binaries, drop redundant package refs, fix…
Jul 21, 2026
568e94e
theme: sticky footer + render footer social icons as SVGs
Jul 21, 2026
6c4611d
feat(plugin): b64 image embedding (pymdownx.b64)
Jul 21, 2026
c33b039
docs: add derivative-work attributions
Jul 21, 2026
f4401b7
fix(markdown): render block math as a math div, not a code block
Jul 21, 2026
7755788
feat(plugin): arithmatex math rendering (pymdownx.arithmatex parity)
Jul 21, 2026
20c8987
fix(links): make rewritten internal links base-path safe
Jul 21, 2026
862c7c1
docs: document snippet sections, footnotes, emoji, and code-annotatio…
Jul 21, 2026
52a26cd
test: add dedicated per-plugin test files for snippets and abbreviations
Jul 21, 2026
eb5ce74
feat(theme): config-extensible social icons
Jul 21, 2026
c9977eb
feat(cli): add import command to convert mkdocs.yml to appsettings.json
Jul 21, 2026
278ec4f
docs: publish performance benchmarks vs mkdocs-material
Jul 21, 2026
5a49994
docs: add Migrating from MkDocs guide for XO blog workflows
Jul 21, 2026
596dc9b
feat(optimize): add CSS and JS minification toggles
Jul 21, 2026
796c599
feat(deploy): add S3 deploy target
Jul 21, 2026
5df84b5
feat(optimize): add WebP image conversion with picture fallback
Jul 21, 2026
fe4f62b
docs: document redirect_maps carry-over during mkdocs import
Jul 21, 2026
083ad95
docs: explain incremental build/deploy caching strategy
Jul 21, 2026
45c3b2e
feat(ci): add reusable Netdocs GitHub Action
Jul 21, 2026
b706bcc
feat(snippets): inline parameterized includes + default <root>/snippe…
Jul 21, 2026
e836920
fix(theme): embed Material theme so single-file builds are self-conta…
Jul 21, 2026
88c7e40
fix(action): make release-binary download robust (fixes curl exit 23)
Jul 21, 2026
628c7de
ci: only build release binaries/images on full semver tags
Jul 21, 2026
369082a
fix(action): download binary to workspace disk + add df diagnostics
Jul 21, 2026
33581b1
perf(release): compress single-file binaries (~104MB -> ~53MB)
Jul 21, 2026
927f75c
feat(action): run Netdocs from its published container image
Jul 21, 2026
a022fb8
ci: add action self-test that builds docs-site via the container action
Jul 21, 2026
e97155b
ci: temporary deploy-test to validate full action+peaceiris chain
Jul 21, 2026
f31cfb0
fix(social): don't crash when no font is available; ship a font in th…
Jul 21, 2026
77f01a8
ci(selftest): assert social cards are generated in-container
Jul 21, 2026
732adf4
fix(table-reader): resolve read_csv paths relative to the page directory
Jul 21, 2026
410e8d6
fix(search): populate page-level teaser text and preserve block HTML
Jul 21, 2026
fc11528
fix(theme): keep full site nav on blog pages, move blog widgets to ri…
Jul 21, 2026
19c6e30
fix(blog): resolve .md links in post excerpts to published URLs
Jul 21, 2026
1276940
fix(theme): match prod blog layout — nav left, post meta strip on top
Jul 21, 2026
b1f88d7
feat(plugins): add affiliate-links plugin for auto disclosure footnotes
Jul 21, 2026
acf0a9d
docs: document table-reader and affiliate-links plugins
Jul 21, 2026
2adcf80
feat(theme): add light/dark palette toggle; default docs to dark
Jul 21, 2026
90936c2
docs: surface mkdocs import and deploy paths from getting-started
Jul 21, 2026
23a4ae1
docs: document plugin defaults and a recommended plugin set
Jul 21, 2026
4a8b5ed
docs: add live-rendered admonitions & tabs reference page
Jul 21, 2026
2b8b487
docs: add measured mkdocs-material benchmark comparison
Jul 21, 2026
4e90f87
fix(blog): remove stray breadcrumb bullet and dead nav chevron
Jul 21, 2026
e9070a6
fix(blog): render post metadata as a stable self-contained header
Jul 21, 2026
c2507a1
feat(blog): show category links and reading time on post listings
Jul 21, 2026
3b22256
Add content-hash cache-busting for local assets
Jul 21, 2026
bd4da4b
fix(theme): make code highlighting readable in dark mode
Jul 21, 2026
2c3f43e
docs(affiliate-links): recommend plain links over affiliate snippets
Jul 21, 2026
84f4279
chore: drop stray verification screenshot; ignore scratch _*.png
Jul 21, 2026
251bb1f
fix(theme): render top-level nav inline for a single-row header
Jul 21, 2026
de53097
fix(theme): restore __md_* inline helpers to fix search, palette & in…
Jul 22, 2026
e7d147f
fix(theme): move blog post metadata into the left sidebar
Jul 22, 2026
a414640
fix(theme): clean active-nav underline, align breadcrumb, hide sideba…
Jul 22, 2026
5356c69
fix(theme): correct code-block line numbers; add code-blocks reference
Jul 22, 2026
8ca7933
fix(social): ensure each card's parent directory exists before write
Jul 22, 2026
c6f6474
Fix double border on fenced code blocks
Jul 22, 2026
e7751df
Improve code-block highlighting: legible hl_lines + more languages
Jul 22, 2026
b4eeb8a
Add toc.integrate and unlink content tabs
Jul 22, 2026
8b71eb0
docs: document supported syntax-highlighting languages
Jul 22, 2026
aaf902c
Add elevation shadow to code blocks
Jul 22, 2026
9d21b3d
Fix code-block spacing, copy-button pin, and side padding
Jul 22, 2026
739dae0
Fix mismatched YAML body under JSON title in code-blocks doc
Jul 22, 2026
8621bba
Remove navigation.path breadcrumb from docs-site config
Jul 22, 2026
35780a0
Clean up integrated TOC nesting in the left nav
Jul 22, 2026
a7773d4
Make the code-block syntax highlighter swappable
Jul 22, 2026
8cdb0bf
Make macros user-extensible: config variables + docs
Jul 22, 2026
aeffd86
Generate social cards during serve by default
Jul 22, 2026
99b2b57
Restructure docs IA into task-oriented sections
Jul 22, 2026
b967da4
Reorganise docs nav into Setup/Writing docs/Deployment sections
Jul 22, 2026
3b836f2
Document the typeset plugin and deploy/optimize config
Jul 22, 2026
a33628a
Document + test abbreviations code-block safety
Jul 22, 2026
69fad37
Add URI-form modes to fileuri() macro
Jul 22, 2026
49e99e7
Add UserDefinedMacro base class for easy custom macros
Jul 22, 2026
fc0425f
Allow configurable plugin preprocessor order
Jul 22, 2026
4ad85fb
Expand RSS plugin: Atom, images, per-post overrides, options
Jul 22, 2026
0576a16
Track CDN front-end libraries with Dependabot
Jul 22, 2026
b703638
Split theme layout into smaller overridable partials
Jul 22, 2026
09598cc
Rename affiliate-links plugin to link-notes + add regex matching
Jul 22, 2026
3153443
Add calculator plugin (interactive `calc forms in Markdown)
Jul 22, 2026
a22296e
deps: Bump SixLabors.ImageSharp and SixLabors.ImageSharp.Drawing
dependabot[bot] Jul 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Build output
site/
dist/
artifacts/

# .NET
bin/
obj/

# Local
.venv/
56 changes: 56 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
root = true

[*]
charset = utf-8
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
indent_size = 2

[*.{cs,csx}]
indent_size = 4

[*.{csproj,props,targets,slnx,xml}]
indent_size = 2

[*.{yml,yaml}]
indent_size = 2

[*.md]
trim_trailing_whitespace = false

# C# conventions
[*.cs]
# Namespaces
csharp_style_namespace_declarations = file_scoped:warning

# 'this.' not required
dotnet_style_qualification_for_field = false:suggestion
dotnet_style_qualification_for_property = false:suggestion
dotnet_style_qualification_for_method = false:suggestion
dotnet_style_qualification_for_event = false:suggestion

# Language keywords over BCL type names
dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
dotnet_style_predefined_type_for_member_access = true:suggestion

# var preferences (codebase uses var freely)
csharp_style_var_for_built_in_types = true:suggestion
csharp_style_var_when_type_is_apparent = true:suggestion
csharp_style_var_elsewhere = true:suggestion

# Modern C# expression styles
csharp_style_expression_bodied_methods = when_on_single_line:suggestion
csharp_style_expression_bodied_properties = true:suggestion
csharp_prefer_braces = when_multiline:suggestion
csharp_using_directive_placement = outside_namespace:suggestion
dotnet_sort_system_directives_first = true

# Usings
dotnet_diagnostic.IDE0005.severity = suggestion

# New line preferences
csharp_new_line_before_open_brace = all
csharp_new_line_before_else = true
csharp_new_line_before_catch = true
csharp_new_line_before_finally = true
47 changes: 47 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
name: Bug report
description: Something isn't working as expected
labels: ["bug"]
body:
- type: markdown
attributes:
value: |
Thanks for the report! Netdocs is a spare-time project, so please be patient.
A minimal reproduction dramatically increases the odds of a fix.
- type: textarea
id: what-happened
attributes:
label: What happened?
description: What did you do, what did you expect, and what happened instead?
placeholder: When I build a site with ..., I expected ..., but got ...
validations:
required: true
- type: textarea
id: repro
attributes:
label: Steps to reproduce
description: Commands, a snippet of `appsettings.json`, and/or the Markdown involved.
render: shell
validations:
required: true
- type: input
id: version
attributes:
label: Netdocs version / commit
placeholder: v1.0.0 or commit sha
validations:
required: true
- type: input
id: os
attributes:
label: OS / .NET version
placeholder: Windows 11 / .NET 11
validations:
required: false
- type: textarea
id: logs
attributes:
label: Relevant logs
description: Output of the failing command, ideally with `--verbose`.
render: shell
validations:
required: false
8 changes: 8 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Discord
url: https://static.xtremeownage.com/discord
about: Questions, ideas, or just saying hi (tag the maintainer).
- name: Security vulnerability
url: https://github.com/XtremeOwnage/Netdocs/security/advisories/new
about: Please report vulnerabilities privately, not as public issues.
32 changes: 32 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: Feature request
description: Suggest an idea or enhancement
labels: ["enhancement"]
body:
- type: textarea
id: problem
attributes:
label: What problem does this solve?
description: The use case or pain point behind the request.
validations:
required: true
- type: textarea
id: proposal
attributes:
label: Proposed solution
description: What you'd like Netdocs to do. Config/CLI/API sketches welcome.
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: Alternatives considered
description: Other approaches, or how you work around this today.
validations:
required: false
- type: input
id: mkdocs-parity
attributes:
label: Material for MkDocs equivalent (if any)
description: A link helps, since Netdocs targets near drop-in compatibility.
validations:
required: false
13 changes: 13 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,16 @@ updates:
interval: "weekly"
commit-message:
prefix: "ci"

# Front-end JS/CSS libraries loaded from a CDN, tracked via /package.json.
# Dependabot flags new releases here; a maintainer then bumps the matching CDN
# URL in the theme templates / plugins. See
# docs-site/docs/development/frontend-dependencies.md.
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
open-pull-requests-limit: 10
commit-message:
prefix: "deps(frontend)"

24 changes: 24 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<!-- Thanks for contributing! Keep PRs focused on one logical change. -->

## What & why

<!-- What does this change and why? Link any related issue: Fixes #123 -->

## Type of change

- [ ] Bug fix
- [ ] New feature
- [ ] Documentation
- [ ] Refactor / chore

## Checklist

- [ ] `dotnet format Netdocs.slnx --verify-no-changes` passes
- [ ] `dotnet build Netdocs.slnx -c Release` succeeds
- [ ] `dotnet test Netdocs.slnx -c Release` passes
- [ ] Added/updated tests for the change
- [ ] Updated docs under `docs-site/docs/**` if behavior changed

## Notes for reviewers

<!-- Anything worth calling out: trade-offs, follow-ups, screenshots, etc. -->
49 changes: 49 additions & 0 deletions .github/workflows/action-selftest.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
name: Action Self-Test

# Exercises the composite action end-to-end (container pull + docker run) against
# the repo's own docs-site, so the exact path consumers hit is observable in CI.
on:
push:
branches: [main]
paths:
- "action.yml"
- ".github/workflows/action-selftest.yml"
workflow_dispatch:

permissions:
contents: read

jobs:
selftest:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Build docs-site via the Netdocs action
uses: ./
with:
command: build
config: docs-site/appsettings.json

- name: Verify output
shell: bash
run: |
set -euo pipefail
out="docs-site/site"
if [ ! -d "${out}" ]; then
echo "::error::Expected build output at ${out} was not produced." >&2
exit 1
fi
count="$(find "${out}" -name '*.html' | wc -l)"
echo "Generated ${count} HTML pages in ${out}."
test "${count}" -gt 0

# The social plugin is enabled on docs-site; confirm cards were rendered
# inside the container (this is the path that previously crashed on a
# missing font).
cards="$(find "${out}/assets/social" -name '*.png' 2>/dev/null | wc -l)"
echo "Generated ${cards} social card(s)."
test "${cards}" -gt 0
30 changes: 30 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
name: CI

on:
push:
branches: [main]
pull_request:
branches: [main]

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
global-json-file: global.json

- name: Restore
run: dotnet restore Netdocs.slnx

- name: Format check (lint)
run: dotnet format Netdocs.slnx --verify-no-changes --no-restore

- name: Build
run: dotnet build Netdocs.slnx -c Release --no-restore

- name: Test
run: dotnet test Netdocs.slnx -c Release --no-build --verbosity normal
47 changes: 47 additions & 0 deletions .github/workflows/docker.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
name: Docker

on:
push:
branches: [main]
# Full semver tags only; the moving `v1` alias tag should not rebuild images.
tags: ["v[0-9]+.[0-9]+.[0-9]+"]
workflow_dispatch:

permissions:
contents: read
packages: write

env:
IMAGE: ghcr.io/${{ github.repository }}

jobs:
image:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Log in to GHCR
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Docker metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.IMAGE }}
tags: |
type=ref,event=branch
type=ref,event=tag
type=sha
type=raw,value=latest,enable={{is_default_branch}}

- name: Build and push
uses: docker/build-push-action@v6
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
49 changes: 49 additions & 0 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
name: Docs

on:
push:
branches: [main]
workflow_dispatch:

permissions:
contents: read
pages: write
id-token: write

concurrency:
group: pages
cancel-in-progress: true

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # git-revision-date needs full history

- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
global-json-file: global.json

- name: Build docs site
run: >-
dotnet run --project src/Netdocs.Cli -c Release --
build --prod --config docs-site/appsettings.json

- name: Upload Pages artifact
uses: actions/upload-pages-artifact@v3
with:
path: docs-site/site

deploy:
needs: build
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
Loading
Loading