diff --git a/Makefile b/Makefile
new file mode 100644
index 000000000..dd20fe591
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,52 @@
+PREFIX := /usr/local
+
+SOURCES = $(shell find src -not -path 'src/theme*' -type f -name '*.md')
+MANPAGES = $(subst src/,book/mandoc/,$(patsubst %.md,%.7,$(SOURCES)))
+UTILS = book/void-docs book/void-docs.1
+
+all: void-book void-docs mandoc
+
+install: all
+ install -Dm0755 book/void-docs $(DESTDIR)$(PREFIX)/bin/void-docs
+ install -Dm0644 book/void-docs.1 $(DESTDIR)$(PREFIX)/share/man/man1/void-docs.1
+
+ install -Dm0644 book/typst/book.pdf $(DESTDIR)$(PREFIX)/share/doc/void/handbook.pdf
+
+ cp -r src/ $(DESTDIR)$(PREFIX)/share/doc/void/markdown
+ rm -fr $(DESTDIR)$(PREFIX)/share/doc/void/markdown/theme
+
+ cp -r book/html $(DESTDIR)$(PREFIX)/share/doc/void/html
+
+ cp -r book/mandoc $(DESTDIR)$(PREFIX)/share/doc/void/mandoc
+
+void-docs: $(UTILS)
+
+$(UTILS): book/%: res/%.in book
+ sed -e "s,@PREFIX@,$(PREFIX)," $< >$@
+
+void-book: $(SOURCES) book/typst/handbook-cover.svg
+ mdbook build
+
+book/typst/handbook-cover.svg: res/handbook-cover.svg book/typst
+ cp -a $< $@
+
+mandoc: $(MANPAGES)
+
+book/mandoc/%.7: src/%.md book/mandoc
+ @mkdir -p $(@D)
+ lowdown -T man -m "title: $(*F)" -m "date: $$(git log --pretty='%cs' -1 $< 2>/dev/null || date -d @$$SOURCE_DATE_EPOCH +%F)" \
+ -m "section: 7" -m "source: The Void Linux Handbook" -m "volume: The Void Linux Handbook" -s -o $@ $<
+
+book:
+ mkdir -p book
+
+book/typst: book
+ mkdir -p book/typst
+
+book/mandoc: book
+ mkdir -p book/mandoc
+
+clean:
+ rm -rf book
+
+.PHONY: all install void-docs void-book mandoc clean
diff --git a/README.md b/README.md
index d1cba8e7d..bdfb947af 100644
--- a/README.md
+++ b/README.md
@@ -7,20 +7,15 @@ the same protocol as the packages tree. For details, please read
## Building
-The [res/build.sh](./res/build.sh) script builds HTML, roff and PDF versions of
-the Void documentation and the `void-docs.1` man page. It requires the following
-Void packages:
+The `Makefile` builds HTML, roff and PDF versions of the Void documentation and
+the `void-docs.1` man page. It requires the following Void packages:
- `mdBook`
- `findutils`
- `lowdown` (version 0.8.1 or greater)
-- `texlive`
-- `perl`
-- `perl-File-Which`
-- `perl-JSON`
-- `librsvg-utils`
+- `mdbook-typst`
+- `mdbook-linkcheck`
- `python3-md2gemini`
In order to build and install these files, set the `PREFIX` and `DESTDIR`
-environment variables to appropriate values and run `res/build.sh` followed by
-`res/install.sh`.
+variables to appropriate values and run `make` to build, and `make install` to install.
diff --git a/book.toml b/book.toml
index c29daced6..278114c78 100644
--- a/book.toml
+++ b/book.toml
@@ -1,7 +1,7 @@
[book]
authors = ["The Void Linux Team"]
src = "src"
-title = "Void Linux Handbook"
+title = "The Void Linux Handbook"
[output.html]
theme = "src/theme"
@@ -15,9 +15,50 @@ edit-url-template = "https://github.com/void-linux/void-docs/edit/master/{path}"
"/config/gnupg.html" = "/config/openpgp.html#gnupg"
"/installation/guides/arm-devices/platforms.html" = "/installation/guides/arm-devices/raspberry-pi.html"
-[output.latex]
+[output.typst]
optional = true
+[output.typst.output]
+format = "pdf"
+
+[output.typst.style]
+paper = "us-letter"
+text-font = "Libertinus Serif"
+link-color = "black"
+# XXX: needs fix for zeros showing up
+# heading-numbering = "1.1"
+
+[output.typst.advanced]
+typst-markup-header = """
+#let voidgreen = rgb("#478061")
+#set page(paper: "us-letter")
+#align(center + horizon)[
+ #image("handbook-cover.svg")
+ #title()
+]
+#pagebreak()
+#set page(
+ header: [_The Void Linux Handbook_],
+ numbering: "1",
+)
+#set par(justify: true)
+#set table(
+ stroke: (x, y) => if y != 0 { 0.5pt } else { voidgreen },
+ fill: (x, y) => if y == 0 { voidgreen },
+)
+#show table.cell.where(y: 0): it => {
+ set text(white)
+ strong(it)
+}
+#show raw.where(block: false): box.with(fill: luma(240), inset: (x: 3pt, y: 0pt), outset: (y: 3pt), radius: 2pt)
+#show raw.where(block: true): box.with(fill: luma(240), inset: 8pt, radius: 3pt)
+// XXX: needs fix for zeros showing up
+#let skip_zeros(..args) = {
+ numbering("1.1", ..args.pos().filter((i) => i != 0))
+}
+#set heading(numbering: skip_zeros)
+"""
+
[output.gemini]
optional = true
@@ -26,16 +67,13 @@ optional = true
follow-web-links = true
exclude = [
'kernel\.org',
- 'ntp\.org',
'\.onion',
'localhost',
- 'userbase\.kde\.org',
- 'sjtu\.edu\.cn',
- 'mirrors\.cnnic\.cn',
- 'void\.webconverger\.org',
- 'mirror\.vofr\.net',
- 'void\.chililinux\.com',
- 'voidlinux\.com\.br',
'reddit\.com',
'raspberrypi\.com',
+ 'xnux\.eu',
+ 'canonical\.com',
+ 'freedesktop\.org',
+ 'libressl\.org',
]
+user-agent = "Mozilla/5.0"
diff --git a/check.sh b/check.sh
index 9a77d43e6..30fb2a897 100755
--- a/check.sh
+++ b/check.sh
@@ -3,13 +3,13 @@
# reset variable so it doesn't use the environment one
MISSING=
-echo -n "Checking for mdbook-linkcheck ... "
+printf "Checking for mdbook-linkcheck ... "
if ! command -v mdbook-linkcheck; then
MISSING="$MISSING mdbook-linkcheck"
echo "not found"
fi
-echo -n "Checking for vmdfmt ... "
+printf "Checking for vmdfmt ... "
if ! command -v vmdfmt; then
MISSING="$MISSING vmdfmt"
echo "not found"
@@ -17,14 +17,14 @@ fi
if [ "$MISSING" ]; then
- echo -n "Checking for xbps-install ... "
+ printf "Checking for xbps-install ... "
if ! command -v xbps-install; then
echo "not found"
echo "Please manually install: $MISSING"
exit 1
fi
- echo -n "Checking for sudo ... "
+ printf "Checking for sudo ... "
if command -v sudo; then
SU_CMD='sudo'
else
@@ -39,14 +39,14 @@ if [ "$MISSING" ]; then
fi
fi
- echo "\nTrying to install ${MISSING## } ... "
+ printf "\nTrying to install %s ... " "${MISSING## }"
$SU_CMD xbps-install $MISSING
echo
# Check whether executables are now present.
-
+
for i in $MISSING; do
- if ! command -v $i 2>&1 >/dev/null; then
+ if ! command -v "$i" >/dev/null 2>&1; then
UNAVAILABLE="$UNAVAILABLE $i"
fi
done
@@ -60,7 +60,7 @@ fi
vmdfmt -l -w src/
-if command -v mdbook 2>&1 >/dev/null; then
+if command -v mdbook >/dev/null 2>&1; then
echo "Building book and checking links with mdbook ..."
mdbook build
else
diff --git a/res/README.md b/res/README.md
deleted file mode 100644
index 7031b5195..000000000
--- a/res/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-The original cover variants, as suggested by @argosatcore on GitHub,
-are available in the `handbook-cover-variants.svg` file.
diff --git a/res/build.sh b/res/build.sh
deleted file mode 100755
index 22f3a7574..000000000
--- a/res/build.sh
+++ /dev/null
@@ -1,92 +0,0 @@
-#!/bin/sh
-# uses PREFIX and BUILD_MANPAGES from environment
-: "${PREFIX:=/usr/local}"
-: "${BUILD_MANPAGES:=1}"
-
-set -e
-PATH="$PWD/res:$PATH"
-
-if [ -z "$SOURCE_DATE_EPOCH" ]; then
- export SOURCE_DATE_EPOCH=$(git log --pretty='%ct' -1)
- if [ -z "$SOURCE_DATE_EPOCH" -a "$BUILD_MANPAGES" = 1 ]; then
- echo "git or SOURCE_DATE_EPOCH are needed to build man pages!"
- exit 1
- fi
-fi
-
-# Build HTML mdbook
-echo "Building mdBook"
-mdbook build
-
-if [ "$BUILD_MANPAGES" = "1" ]; then
- # Build mandoc version
- echo "Building man pages"
- cd src
-
- find . -type d -exec mkdir -p "../mandoc/{}" \;
-
- find . -type f -name "*.md" -exec sh -c \
- 'file="{}"; filew="${file%.md}"; \
- man_date="$(git log --pretty=%cs -1 "$file" 2>/dev/null || date -d "@$SOURCE_DATE_EPOCH" +%F)";
- lowdown -Tman \
- ${man_date:+-m "date: $man_date"} \
- -m "title: ${filew##*/}" \
- -m "section: 7" -m "source: Void Docs" -m "volume: Void Docs" \
- -s -o "../mandoc/${filew}.7" "$file"' \;
-
- cd -
-fi
-
-# Build script
-echo "Building void-docs script and man page"
-sed -e "s,@PREFIX@,$PREFIX," res/void-docs.in > res/void-docs
-sed -e "s,@PREFIX@,$PREFIX," res/void-docs.1.in > res/void-docs.1
-
-# Build PDF
-
-echo "Building PDF"
-
-## Temporarily add OpenType version of Latin Modern to font cache.
-
-mkdir -p ~/.fonts
-TMP_FONTDIR=$(mktemp -d -p ~/.fonts)
-cp /usr/share/texmf-dist/fonts/opentype/public/lm/* $TMP_FONTDIR
-fc-cache
-
-## Create cover page using Latin Modern text.
-
-rsvg-convert \
- --dpi-x 300 \
- --dpi-y 300 \
- res/handbook-cover.svg > res/handbook-cover.png
-
-## Letter version
-
-pdflatex \
- -output-directory=book/latex/ \
- -jobname=handbook-letter \
- book/latex/handbook.tex \
- >/dev/null
-pdflatex \
- -output-directory=book/latex/ \
- -jobname=handbook-letter \
- book/latex/handbook.tex \
- >/dev/null
-
-## A4 version
-
-sed -ie "s/\\documentclass\[letterpaper\]{article}/\\documentclass[a4paper]{article}/" \
- book/latex/handbook.tex
-pdflatex -output-directory=book/latex/ \
- -jobname=handbook-a4 \
- book/latex/handbook.tex \
- >/dev/null
-pdflatex -output-directory=book/latex/ \
- -jobname=handbook-a4 \
- book/latex/handbook.tex \
- >/dev/null
-
-## Remove temporary font directory
-
-rm -rf $TMP_FONTDIR
-fc-cache
diff --git a/res/handbook-cover-variants.svg b/res/handbook-cover-variants.svg
deleted file mode 100644
index 5f2c34694..000000000
--- a/res/handbook-cover-variants.svg
+++ /dev/null
@@ -1,1319 +0,0 @@
-
-
diff --git a/res/handbook-cover.svg b/res/handbook-cover.svg
index 8d0abdc5f..35e8a7c2c 100644
--- a/res/handbook-cover.svg
+++ b/res/handbook-cover.svg
@@ -1,126 +1,64 @@
diff --git a/res/install.sh b/res/install.sh
deleted file mode 100755
index 9142db937..000000000
--- a/res/install.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/sh
-# uses PREFIX and DESTDIR from environment
-: "${PREFIX:=/usr/local}"
-
-set -e
-
-DOC=${DESTDIR}${PREFIX}/share/doc/void
-mkdir -p $DOC/
-
-cp -r src/ $DOC/markdown
-rm -fr $DOC/markdown/theme
-
-cp -r book/html $DOC/html
-
-cp -r mandoc/ $DOC/mandoc
-
-install -Dm0644 res/void-docs.1 ${DESTDIR}${PREFIX}/share/man/man1/void-docs.1
-install -Dm0755 res/void-docs ${DESTDIR}${PREFIX}/bin/void-docs
-install -Dm0644 book/latex/handbook-a4.pdf ${DESTDIR}${PREFIX}/share/doc/void/handbook.pdf
diff --git a/res/mdbook-latex b/res/mdbook-latex
deleted file mode 100755
index e2bb888dc..000000000
--- a/res/mdbook-latex
+++ /dev/null
@@ -1,389 +0,0 @@
-#!/usr/bin/perl
-
-use strict;
-use warnings;
-
-use Cwd;
-use JSON;
-
-my $data;
-{
- local $/;
- undef $/;
- $data = <>;
-}
-my $json = JSON->new->decode($data);
-my $sections = $json->{book}->{sections};
-
-my $date = `date '+%d %B %Y'`;
-chomp $date;
-
-my $latex;
-my %code_inline;
-my $code_inline_index = 0;
-my %codeblocks;
-my $codeblock_index = 0;
-
-# Opening.
-
-$latex .= "\\documentclass[letterpaper]{article}\n";
-$latex .= "\\usepackage[margin=4cm]{geometry}\n";
-$latex .= "\\usepackage[T1]{fontenc}\n";
-$latex .= "\\fontfamily{lmodern}\n";
-$latex .= "\\selectfont\n";
-$latex .= "\\usepackage{graphicx}\n";
-$latex .= "\\usepackage{hyperref}\n";
-$latex .= "\\usepackage{listings}\n";
-$latex .= "\\lstdefinestyle{void}{\n";
-$latex .= " basicstyle=\\ttfamily,\n";
-$latex .= " breaklines=true,\n";
-$latex .= " showstringspaces=false,\n";
-$latex .= " aboveskip=\\bigskipamount,\n";
-$latex .= " belowskip=\\bigskipamount,\n";
-$latex .= "}\n";
-$latex .= "\\def\\code#1{\\texttt{#1}}\n";
-$latex .= "\\begin{document}\n";
-$latex .= "\\newgeometry{margin=2cm}\n";
-$latex .= "\\begin{titlepage}\n";
-$latex .= " \\includegraphics[width=160mm,height=230mm]{res/handbook-cover.png}\n";
-$latex .= "\\end{titlepage}\n";
-$latex .=" \\restoregeometry\n";
-$latex .= "\\title{Void Handbook}\n";
-$latex .= "\\date{$date}\n";
-$latex .= "\\maketitle\n";
-$latex .= "\\setcounter{tocdepth}{5}\n";
-$latex .= "\\tableofcontents\n";
-$latex .= "\\begin{sloppypar}\n"; # Ugly; need to find better solution
-
-# Contents.
-
-foreach my $i (@$sections) {
- process_json($i);
-}
-
-# Postprocessing.
-
-$latex =~ s/config-network-wpa\\_supplicant/config-network-wpa_supplicant/g;
-$latex =~ s/config-network-wpa_supplicant-the-wpa\\_supplicant-service/config-network-wpa_supplicant-the-wpa_supplicant-service/g;
-$latex =~ s/(handbook-codeblock-\d+)/$codeblocks{$1}/eg;
-$latex =~ s/(handbook-codeinline-\d+)/$code_inline{$1}/eg;
-
-# Closing.
-
-$latex .= "\\end{sloppypar}\n";
-$latex .= "\\end{document}\n";
-
-open(my $fh, ">", "handbook.tex")
- or die "Can't open handbook.tex for writing: $!";
-print $fh $latex;
-close($fh)
- or die "Couldn't close handbook.tex after writing: $!";
-
-exit 0;
-
-sub process_json {
-
- my $i = shift;
- my $type = ref($i);
- if ($type eq 'HASH') {
- if (defined $i->{content}) {
- process_content($i->{path},$i->{content});
- }
- if (defined $i->{Chapter}) {
- process_json($i->{Chapter});
- }
- if (defined $i->{sub_items}) {
- foreach my $j ($i->{sub_items}) {
- process_json($j);
- }
- }
- }
- if ($type eq 'ARRAY') {
- foreach my $j (@{$i}) {
- process_json($j);
- }
- }
-}
-
-sub process_content {
-
- my $path = shift;
- my $content = shift;
- my $base = convert_path_to_hypertarget_base($path);
-
- # Create sections.
- $content =~ s/^# ([^\n]+)/create_sectioning("section",$1,$base)/eg;
-
- # Create subsections.
- $content =~ s/\n## ([^\n]+)/create_sectioning("subsection",$1,$base)/eg;
-
- # Create subsubsections.
- $content =~ s/\n### ([^\n]+)/create_sectioning("subsubsection",$1,$base)/eg;
-
- # Create paragraphs.
- $content =~ s/\n#### ([^\n]+)/create_sectioning("paragraph",$1,$base)/eg;
-
- # Create subparagraphs.
- $content =~ s/\n##### ([^\n]+)/create_sectioning("subparagraph",$1,$base)/eg;
-
- # Create codeblocks.
- $content =~ s/```\n(.+?)\n```/create_codeblock($1)/esg;
-
- # Create internal links.
- $content =~ s/\[([^]]+?)\]\(((?:\..?.+?)|(?:#.+?))\)/create_internal_link($1,$2,$path)/esg;
-
- # Create external links.
- $content =~ s/<(http[^>]+)>/\\href{$1}{$1}/sg; # bare links
- $content =~ s/\[([^]]+?)\]\((.+?)\)/\\href{$2}{$1}/sg;
-
- # Create lists.
- $content =~ s/\n\n(- .+?)\n(?:\n|\z)/create_list($1)/esg;
-
- # Create numbered lists.
- $content =~ s/\n\n(\d+\. .+?)\n(?:\n|\z)/create_numbered_list($1)/esg;
-
- # Create blockquotes.
- $content =~ s/((^>(?:\s*\n|[^\n]+))+)/create_blockquote($1)/emsg;
-
- # Bold text.
- $content =~ s/\*\*([^*]+)\*\*/{\\bfseries $1}/sg;
-
- # Escape LaTeX special characters.
- $content =~ s/#/'\#'/eg;
- $content =~ s/\$/'\$'/eg;
- $content =~ s/_/'\_'/eg;
- $content =~ s/~/'\~'/eg;
- $content =~ s/&/'\&'/eg;
- $content =~ s/\^/'\^'/eg;
-
- # Create tables.
- $content =~ s/((?:(?:\| +[^|]+ +\| +(?:[^|]+ +\|)+\n)|(?:\|-[^\n]+\n))+)/create_table($1)/esg;
-
- # Create inline code.
- $content =~ s/(?: |\n)`([^`]+)`/create_code_inline($1)/esg;
-
- $latex .= $content;
-
-}
-
-sub convert_heading_to_fragment {
-
- my $heading = shift;
-
- $heading =~ s/ /-/g;
- $heading =~ s/\.//g;
- $heading =~ s/\(|\)//g;
- $heading =~ s/(.+)/lc($1)/e;
-
- return $heading;
-
-}
-
-sub convert_path_to_hypertarget_base {
-
- my $base = shift;
-
- if ($base =~ m|index.md|) {
- $base =~ m|(.+/index).md|;
- $base = $1;
- $base =~ s|/|-|g;
- } else {
- $base =~ m|(.+).md|;
- $base = $1;
- $base =~ s|/|-|g;
- }
-
- return $base;
-
-}
-
-sub create_blockquote {
-
- my $blockquote = shift;
- my $result;
-
- $blockquote =~ s/>//g;
- $blockquote =~ s/\n//g;
-
- $result .= "\\begin{quote}\n";
- $result .= $blockquote;
- $result .= "\\end{quote}\n";
-
- return $result;
-
-}
-
-sub create_codeblock {
-
- my $codeblock = shift;
- my $label;
- my $result;
-
- $codeblock_index++;
- $label = 'handbook-codeblock-' . $codeblock_index;
-
- $result .= "\\begin{lstlisting}[style=void]\n";
- $result .= $codeblock;
- $result .= "\n\\end{lstlisting}\n";
-
- $codeblocks{$label} = $result;
-
- # Mark places in document where codeblock will be re-inserted
- # during postprocessing.
- return $label;
-
-}
-
-sub create_code_inline {
-
- my $code = shift;
- my $label;
- my $result;
-
- $code_inline_index++;
- $label = 'handbook-codeinline-' . $code_inline_index;
-
- $result = " \\code{$code}";
-
- $code_inline{$label} = $result;
-
- # Mark places in document where code will be re-inserted
- # during postprocessing.
- return $label;
-
-}
-
-sub create_internal_link {
-
- my $text = shift;
- my $destination = shift;
- my $current_section = shift;
- my $current_directory;
- my $base;
- my $fragment;
- my $hypertarget;
- my $result;
-
- if ($destination =~ /^#/) {
- $base = $current_section . $destination;
- $base =~ s|.md#.+$||;
- } else {
- $current_section =~ m|^(.+/)|;
- $current_directory = $1;
- $base = $destination;
- $base =~ m|^(.+\.md)|;
- $base = $1;
- $base = $current_directory . $base;
- $base = Cwd::abs_path("../../src/" . $base);
- $base =~ s|^.+/src/||;
- $base =~ s|.md||;
- }
- $base =~ s|/|-|g;
-
- if ($destination =~ /#/) {
- $destination =~ m|#(.+)$|;
- $fragment = "-" . $1;
- } else {
- $fragment = "";
- }
-
- $text =~ s/\n/ /;
- $hypertarget = $base . $fragment;
- $result = "\\hyperlink{$hypertarget}{$text}";
-
- return $result;
-
-}
-
-sub create_list {
-
- my $list = shift;
- my $result;
-
- $result .= "\n\\begin{itemize}\n";
- $list =~ s/^- /\\item /mg;
- $result .= $list;
- $result .= "\n\\end{itemize}\n";
-
- return $result;
-
-}
-
-sub create_numbered_list {
-
- my $list = shift;
- my $result;
-
- $result .= "\n\\begin{enumerate}\n";
- $list =~ s/^\d+\. /\\item /mg;
- $result .= $list;
- $result .= "\n\\end{enumerate}\n";
-
- return $result;
-
-}
-
-sub create_sectioning {
-
- my $type = shift;
- my $text = shift;
- my $name = shift;
- my $result;
-
- if ($type ne "section") {
- $name = $name . "-" . convert_heading_to_fragment($text);
- $result .= "\n\\hypertarget{";
- $result .= $name;
- $result .= "}{}";
- $result .= "\n\\$type\{$text\}\n";
- } else {
- $result .= "\n\\newpage\n";
- $result .= "\n\\hypertarget{";
- $result .= $name;
- $result .= "}{}";
- $result .= "\n\\$type\{$text\}\n";
- }
-
- return $result;
-
-}
-
-sub create_table {
-
- my $table = shift;
- my $result;
- my @lines;
- my $header;
- my @body;
- my $column_count;
-
- @lines = split(/\n/, $table);
- $header = $lines[0];
- $header =~ s/[^|]//g;
- $column_count = length($header) - 1;
-
- $result .= "\n\\bigskip";
- $result .= "\n\\begin{tabular}{ | ";
- $result .= "l | " x ($column_count - 1);
- $result .= "l | }\n";
- $result .= "\\hline\n";
- $header = $lines[0];
- $header =~ s/^\|//;
- $header =~ s/\|/&/g;
- $header =~ s/&$//;
- $result .= $header;
- $result .= "\\\\ \\hline \\hline\n";
- shift @lines;
- foreach my $line (@lines) {
- if ($line !~ /^\|-/) {
- $line =~ s/^\|//;
- $line =~ s/\|/&/g;
- $line =~ s/&$//;
- $result .= $line;
- $result .= "\\\\ \\hline\n";
- }
- }
- $result .= "\n\\end{tabular}\n";
- $result .= "\n\\bigskip\n";
-
-}
diff --git a/src/config/date-time.md b/src/config/date-time.md
index 4f7c71578..e47cb95ee 100644
--- a/src/config/date-time.md
+++ b/src/config/date-time.md
@@ -54,7 +54,7 @@ service](../config/services/index.md#managing-services) for it, either through
its own service or the `ntpd` service managed by
[xbps-alternatives(1)](https://man.voidlinux.org/xbps-alternatives.1).
-### NTP
+### ISC NTP
NTP is the official reference implementation of the Network Time Protocol.
diff --git a/src/config/graphical-session/graphics-drivers/nvidia.md b/src/config/graphical-session/graphics-drivers/nvidia.md
index a75f03dc0..a8c031e9e 100644
--- a/src/config/graphical-session/graphics-drivers/nvidia.md
+++ b/src/config/graphical-session/graphics-drivers/nvidia.md
@@ -21,9 +21,9 @@ which is primarily useful on older cards with specialized fixed function
hardware (the `modesetting` driver will accelerate 2D using OpenGL via GLAMOR).
When in doubt, it's a good idea to try `xf86-video-nouveau` first.
-Note: `xf86-video-nouveau` is usually installed by default if you use the `xorg`
-metapackage. If you use `xorg-minimal`, you will need to install it manually,
-either directly or through `xorg-video-drivers`.
+> Note: `xf86-video-nouveau` is usually installed by default if you use the
+> `xorg` metapackage. If you use `xorg-minimal`, you will need to install it
+> manually, either directly or through `xorg-video-drivers`.
## nvidia (Proprietary Driver)
diff --git a/src/config/network/firewalls.md b/src/config/network/firewalls.md
index 5a0309e76..40fc8eba3 100644
--- a/src/config/network/firewalls.md
+++ b/src/config/network/firewalls.md
@@ -78,7 +78,7 @@ This adds a core-service which restores the ruleset in `/etc/nftables.conf`.
### Applying the rules at runtime
The `nftables` package provides the `nftables` service, which uses rules from
-`/etc/nftables.conf`. Once you [enable](../services/index.md#enabling-service)
+`/etc/nftables.conf`. Once you [enable](../services/index.md#enabling-services)
the `nftables` service, to load the rules, run:
```
diff --git a/src/installation/guides/arm-devices/raspberry-pi.md b/src/installation/guides/arm-devices/raspberry-pi.md
index 1a64e946b..53460f9e0 100644
--- a/src/installation/guides/arm-devices/raspberry-pi.md
+++ b/src/installation/guides/arm-devices/raspberry-pi.md
@@ -12,7 +12,7 @@ functionality.
The [command line](../../../config/kernel.md#cmdline) parameters passed to the
kernel are in the `/boot/cmdline.txt` file. Some of the relevant parameters are
documented in the [official
-documentation](https://www.raspberrypi.com/documentation/computers/configuration.html#the-kernel-command-line).
+documentation](https://www.raspberrypi.com/documentation/computers/configuration.html#kernel-command-line-cmdline-txt).
## Supported Models
diff --git a/src/installation/guides/fde.md b/src/installation/guides/fde.md
index f177ea1ea..727c51cde 100644
--- a/src/installation/guides/fde.md
+++ b/src/installation/guides/fde.md
@@ -52,9 +52,9 @@ LUKS2 is only partially supported by GRUB; specifically, only the PBKDF2 key
derivation function is
[implemented](https://git.savannah.gnu.org/cgit/grub.git/commit/?id=365e0cc3e7e44151c14dd29514c2f870b49f9755),
which is *not* the default KDF used with LUKS2, that being Argon2i ([GRUB Bug
-59409](https://savannah.gnu.org/bugs/?59409)). LUKS encrypted partitions using
-Argon2i (as well as the other KDF) can *not* be decrypted. For that reason, this
-guide only recommends LUKS1 be used.
+59409](https://web.archive.org/web/20250320141758/https://savannah.gnu.org/bugs/?59409)).
+LUKS encrypted partitions using Argon2i (as well as the other KDF) can *not* be
+decrypted. For that reason, this guide only recommends LUKS1 be used.
Keep in mind the encrypted volume will be `/dev/sda2` on EFI systems, since
`/dev/sda1` is taken up by the EFI partition.
diff --git a/src/installation/live-images/prep.md b/src/installation/live-images/prep.md
index 2a0235a34..3ddf48aea 100644
--- a/src/installation/live-images/prep.md
+++ b/src/installation/live-images/prep.md
@@ -39,8 +39,8 @@ umount: /dev/sdX: not mounted.
The [dd(1)](https://man.voidlinux.org/man1/dd.1) command can be used to copy a
live image to a storage device. Using `dd`, write the live image to the device:
-**Warning**: this will destroy any data currently on the referenced device.
-Exercise caution.
+> **Warning**: this will destroy any data currently on the referenced device.
+> Exercise caution.
```
# dd bs=4M if=/path/to/void-live-ARCH-DATE-VARIANT.iso of=/dev/sdX