summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDuncan Wilkie <antigravityd@gmail.com>2023-06-26 10:15:27 -0500
committerDuncan Wilkie <antigravityd@gmail.com>2023-06-26 10:15:27 -0500
commite1b7e1f50709c89b7b6448bd86999a5a562f0e1b (patch)
tree1cfd616033378ab4bcfa6991a3b64cb6ca0e38d0
Start over cleanly
-rw-r--r--assets/css/style.css115
-rw-r--r--assets/image/by-sa.svg74
-rw-r--r--assets/image/combgeo.pngbin0 -> 665470 bytes
-rw-r--r--assets/image/rss.pngbin0 -> 10214 bytes
-rw-r--r--assets/pubkey.txt87
-rw-r--r--assets/webfonts/IBMPlexMono-Bold.otfbin0 -> 64980 bytes
-rw-r--r--assets/webfonts/IBMPlexMono-ExtraLight.otfbin0 -> 62672 bytes
-rw-r--r--assets/webfonts/IBMPlexMono-ExtraLightItalic.otfbin0 -> 68008 bytes
-rw-r--r--assets/webfonts/IBMPlexMono-Italic.otfbin0 -> 68472 bytes
-rw-r--r--assets/webfonts/IBMPlexMono-Light.otfbin0 -> 62708 bytes
-rw-r--r--assets/webfonts/IBMPlexMono-LightItalic.otfbin0 -> 69008 bytes
-rw-r--r--assets/webfonts/IBMPlexMono-Medium.otfbin0 -> 64364 bytes
-rw-r--r--assets/webfonts/IBMPlexMono-MediumItalic.otfbin0 -> 70436 bytes
-rw-r--r--assets/webfonts/IBMPlexMono-Regular.otfbin0 -> 62364 bytes
-rw-r--r--assets/webfonts/IBMPlexMono-SemiBold.otfbin0 -> 64412 bytes
-rw-r--r--assets/webfonts/IBMPlexMono-SemiBoldItalic.otfbin0 -> 70496 bytes
-rw-r--r--assets/webfonts/IBMPlexMono-Text.otfbin0 -> 63652 bytes
-rw-r--r--assets/webfonts/IBMPlexMono-TextItalic.otfbin0 -> 71884 bytes
-rw-r--r--assets/webfonts/IBMPlexMono-Thin.otfbin0 -> 61056 bytes
-rw-r--r--assets/webfonts/IBMPlexMono-ThinItalic.otfbin0 -> 65916 bytes
-rw-r--r--assets/webfonts/IBMPlexSans-Bold.otfbin0 -> 104048 bytes
-rw-r--r--assets/webfonts/IBMPlexSans-BoldItalic.otfbin0 -> 110620 bytes
-rw-r--r--assets/webfonts/IBMPlexSans-ExtraLightItalic.otfbin0 -> 111188 bytes
-rw-r--r--assets/webfonts/IBMPlexSans-Italic.otfbin0 -> 109708 bytes
-rw-r--r--assets/webfonts/IBMPlexSans-Light.otfbin0 -> 104336 bytes
-rw-r--r--assets/webfonts/IBMPlexSans-LightItalic.otfbin0 -> 111284 bytes
-rw-r--r--assets/webfonts/IBMPlexSans-Medium.otfbin0 -> 105964 bytes
-rw-r--r--assets/webfonts/IBMPlexSans-MediumItalic.otfbin0 -> 112452 bytes
-rw-r--r--assets/webfonts/IBMPlexSans-Regular.otfbin0 -> 102728 bytes
-rw-r--r--assets/webfonts/IBMPlexSans-SemiBold.otfbin0 -> 106020 bytes
-rw-r--r--assets/webfonts/IBMPlexSans-SemiBoldItalic.otfbin0 -> 113264 bytes
-rw-r--r--assets/webfonts/IBMPlexSans-Text.otfbin0 -> 104476 bytes
-rw-r--r--assets/webfonts/IBMPlexSans-TextItalic.otfbin0 -> 112408 bytes
-rw-r--r--assets/webfonts/IBMPlexSans-Thin.otfbin0 -> 99856 bytes
-rw-r--r--assets/webfonts/IBMPlexSans-ThinItalic.otfbin0 -> 105708 bytes
-rw-r--r--assets/webfonts/IBMPlexSerif-Bold.otfbin0 -> 110916 bytes
-rw-r--r--assets/webfonts/IBMPlexSerif-BoldItalic.otfbin0 -> 118840 bytes
-rw-r--r--assets/webfonts/IBMPlexSerif-ExtraLight.otfbin0 -> 111256 bytes
-rw-r--r--assets/webfonts/IBMPlexSerif-ExtraLightItalic.otfbin0 -> 117320 bytes
-rw-r--r--assets/webfonts/IBMPlexSerif-Italic.otfbin0 -> 118184 bytes
-rw-r--r--assets/webfonts/IBMPlexSerif-Light.otfbin0 -> 110820 bytes
-rw-r--r--assets/webfonts/IBMPlexSerif-LightItalic.otfbin0 -> 118348 bytes
-rw-r--r--assets/webfonts/IBMPlexSerif-Medium.otfbin0 -> 112192 bytes
-rw-r--r--assets/webfonts/IBMPlexSerif-MediumItalic.otfbin0 -> 121188 bytes
-rw-r--r--assets/webfonts/IBMPlexSerif-Regular.otfbin0 -> 109648 bytes
-rw-r--r--assets/webfonts/IBMPlexSerif-SemiBold.otfbin0 -> 112936 bytes
-rw-r--r--assets/webfonts/IBMPlexSerif-SemiBoldItalic.otfbin0 -> 121352 bytes
-rw-r--r--assets/webfonts/IBMPlexSerif-Text.otfbin0 -> 111588 bytes
-rw-r--r--assets/webfonts/IBMPlexSerif-TextItalic.otfbin0 -> 121104 bytes
-rw-r--r--assets/webfonts/IBMPlexSerif-Thin.otfbin0 -> 105832 bytes
-rw-r--r--assets/webfonts/IBMPlexSerif-ThinItalic.otfbin0 -> 110732 bytes
-rw-r--r--assets/webfonts/SIL Open Font License.txt45
-rw-r--r--assets/webfonts/iosevka-regular.ttfbin0 -> 8523444 bytes
-rw-r--r--assets/webfonts/iosevka-regular.woff2bin0 -> 1149164 bytes
-rw-r--r--assets/webfonts/iosevka.css630
-rw-r--r--dnw/static-pages.scm178
-rw-r--r--dnw/tags.scm65
-rw-r--r--dnw/theme.scm127
-rw-r--r--dnw/utils.scm37
-rw-r--r--haunt.scm45
-rw-r--r--org/test.org19
-rw-r--r--posts/test.html42
-rw-r--r--posts/test.html~42
63 files changed, 1506 insertions, 0 deletions
diff --git a/assets/css/style.css b/assets/css/style.css
new file mode 100644
index 0000000..3f0accd
--- /dev/null
+++ b/assets/css/style.css
@@ -0,0 +1,115 @@
+html {
+ background-color: #0f1011;
+}
+
+pre {
+ font-family: Iosevka;
+ background-color: #292b2b;
+ border-radius: 0.5rem;
+ padding: 1rem;
+ overflow-x: auto;
+}
+
+h1 {
+ font-size: 1.7rem;
+}
+
+h2 {
+ font-size: 1.2rem;
+}
+
+section {
+ padding-top: 1rem;
+}
+
+body {
+ background-color: #1d1f21;
+ font-family: IBM Plex Sans;
+ color: #c5c8c6;
+ max-width: 54rem;
+ margin: 0.5rem auto;
+ position: relative;
+ padding: 1rem;
+ border-radius: 4px;
+ line-height: 150%;
+}
+
+header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ border-bottom: 5px double #292b2b;
+}
+
+header ul {
+ list-style-type: none;
+ border-left: 5px double #292b2b;
+ padding-left: 1rem;
+}
+
+
+header a img {
+ max-width: 8rem;
+}
+
+
+footer {
+ margin-top: 2rem;
+ border-top: 5px double #292b2b;
+ color: #898b8a;
+ font-size: 80%;
+ line-height: 100%;
+}
+
+footer div {
+ display: flex;
+ align-items: center;
+}
+footer img {
+ height: 1.6rem;
+ padding-left: 1rem;
+}
+
+
+img,
+picture,
+video {
+ max-width: 100%;
+}
+
+a {
+ outline: none;
+}
+
+a:link {
+ color: #81a2be;
+}
+
+a:visited {
+ color: #b294bb;
+}
+
+a:focus {
+ text-decoration: none;
+ background: #5a5b5a;
+
+}
+
+a:hover {
+ text-decoration: none;
+ background: #3f3f3f;
+}
+
+a:active {
+ color: #de935f;
+}
+
+.rss-icon {
+ max-width: 1.3rem;
+ padding-left: 0.7rem;
+}
+
+#addressbook {
+ text-align: center;
+ border-bottom: 5px double #292b2b;
+}
diff --git a/assets/image/by-sa.svg b/assets/image/by-sa.svg
new file mode 100644
index 0000000..60b44e3
--- /dev/null
+++ b/assets/image/by-sa.svg
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://web.resource.org/cc/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="120" height="42" id="svg2759" sodipodi:version="0.32" inkscape:version="0.45+devel" version="1.0" sodipodi:docname="by-sa.svg" inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs id="defs2761"/>
+ <sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#8b8b8b" borderopacity="1" gridtolerance="10000" guidetolerance="10" objecttolerance="10" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="1" inkscape:cx="179" inkscape:cy="89.569904" inkscape:document-units="px" inkscape:current-layer="layer1" width="120px" height="42px" inkscape:showpageshadow="false" inkscape:window-width="1198" inkscape:window-height="624" inkscape:window-x="488" inkscape:window-y="401"/>
+ <metadata id="metadata2764">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1">
+ <g transform="matrix(0.9937807,0,0,0.9936694,-177.69409,-74.436409)" id="g287" inkscape:export-filename="/mnt/hgfs/Bov/Documents/Work/2007/cc/identity/srr buttons/big/by-sa.png" inkscape:export-xdpi="300.23013" inkscape:export-ydpi="300.23013">
+ <path id="path3817_2_" nodetypes="ccccccc" d="M 182.23532,75.39014 L 296.29928,75.59326 C 297.89303,75.59326 299.31686,75.35644 299.31686,78.77344 L 299.17721,116.34033 L 179.3569,116.34033 L 179.3569,78.63379 C 179.3569,76.94922 179.51999,75.39014 182.23532,75.39014 z" style="fill:#aab2ab"/>
+
+ <g id="g5908_2_" transform="matrix(0.872921,0,0,0.872921,50.12536,143.2144)">
+
+ <path id="path5906_2_" cx="296.35416" ry="22.939548" cy="264.3577" type="arc" rx="22.939548" d="M 187.20944,-55.6792 C 187.21502,-46.99896 180.18158,-39.95825 171.50134,-39.95212 C 162.82113,-39.94708 155.77929,-46.97998 155.77426,-55.66016 C 155.77426,-55.66687 155.77426,-55.67249 155.77426,-55.6792 C 155.76922,-64.36054 162.80209,-71.40125 171.48233,-71.40631 C 180.16367,-71.41193 187.20441,-64.37842 187.20944,-55.69824 C 187.20944,-55.69263 187.20944,-55.68591 187.20944,-55.6792 z" style="fill:#ffffff"/>
+
+ <g id="g5706_2_" transform="translate(-289.6157,99.0653)">
+ <path id="path5708_2_" d="M 473.88455,-167.54724 C 477.36996,-164.06128 479.11294,-159.79333 479.11294,-154.74451 C 479.11294,-149.69513 477.40014,-145.47303 473.9746,-142.07715 C 470.33929,-138.50055 466.04281,-136.71283 461.08513,-136.71283 C 456.18736,-136.71283 451.96526,-138.48544 448.42003,-142.03238 C 444.87419,-145.57819 443.10158,-149.81537 443.10158,-154.74451 C 443.10158,-159.6731 444.87419,-163.94049 448.42003,-167.54724 C 451.87523,-171.03375 456.09728,-172.77618 461.08513,-172.77618 C 466.13342,-172.77618 470.39914,-171.03375 473.88455,-167.54724 z M 450.76657,-165.20239 C 447.81982,-162.22601 446.34701,-158.7395 446.34701,-154.74005 C 446.34701,-150.7417 447.80529,-147.28485 450.72125,-144.36938 C 453.63778,-141.45288 457.10974,-139.99462 461.1383,-139.99462 C 465.16683,-139.99462 468.66848,-141.46743 471.64486,-144.41363 C 474.47076,-147.14947 475.88427,-150.59069 475.88427,-154.74005 C 475.88427,-158.85809 474.44781,-162.35297 471.57659,-165.22479 C 468.70595,-168.09546 465.22671,-169.53131 461.1383,-169.53131 C 457.04993,-169.53131 453.59192,-168.08813 450.76657,-165.20239 z M 458.52106,-156.49927 C 458.07074,-157.4809 457.39673,-157.9715 456.49781,-157.9715 C 454.90867,-157.9715 454.11439,-156.90198 454.11439,-154.763 C 454.11439,-152.62341 454.90867,-151.55389 456.49781,-151.55389 C 457.54719,-151.55389 458.29676,-152.07519 458.74647,-153.11901 L 460.94923,-151.94598 C 459.8993,-150.0805 458.32417,-149.14697 456.22374,-149.14697 C 454.60384,-149.14697 453.30611,-149.64367 452.33168,-150.63653 C 451.35561,-151.62994 450.86894,-152.99926 450.86894,-154.7445 C 450.86894,-156.46008 451.37123,-157.82159 452.37642,-158.83013 C 453.38161,-159.83806 454.63347,-160.34264 456.13423,-160.34264 C 458.35435,-160.34264 459.94407,-159.46776 460.90504,-157.71978 L 458.52106,-156.49927 z M 468.8844,-156.49927 C 468.43353,-157.4809 467.77292,-157.9715 466.90201,-157.9715 C 465.28095,-157.9715 464.46988,-156.90198 464.46988,-154.763 C 464.46988,-152.62341 465.28095,-151.55389 466.90201,-151.55389 C 467.95304,-151.55389 468.68918,-152.07519 469.10925,-153.11901 L 471.36126,-151.94598 C 470.31301,-150.0805 468.74007,-149.14697 466.64358,-149.14697 C 465.02587,-149.14697 463.73095,-149.64367 462.75711,-150.63653 C 461.78494,-151.62994 461.29773,-152.99926 461.29773,-154.7445 C 461.29773,-156.46008 461.79221,-157.82159 462.78061,-158.83013 C 463.76843,-159.83806 465.02588,-160.34264 466.55408,-160.34264 C 468.77027,-160.34264 470.35776,-159.46776 471.3154,-157.71978 L 468.8844,-156.49927 z"/>
+
+ </g>
+
+ </g>
+
+ <path d="M 297.29639,74.91064 L 181.06688,74.91064 C 179.8203,74.91064 178.80614,75.92529 178.80614,77.17187 L 178.80614,116.66748 C 178.80614,116.94922 179.03466,117.17822 179.31639,117.17822 L 299.04639,117.17822 C 299.32813,117.17822 299.55713,116.94922 299.55713,116.66748 L 299.55713,77.17188 C 299.55713,75.92529 298.54297,74.91064 297.29639,74.91064 z M 181.06688,75.93213 L 297.29639,75.93213 C 297.97998,75.93213 298.53565,76.48828 298.53565,77.17188 C 298.53565,77.17188 298.53565,93.09131 298.53565,104.59034 L 215.4619,104.59034 C 212.41698,110.09571 206.55077,113.83399 199.81835,113.83399 C 193.083,113.83399 187.21825,110.09913 184.1748,104.59034 L 179.82666,104.59034 C 179.82666,93.09132 179.82666,77.17188 179.82666,77.17188 C 179.82664,76.48828 180.38329,75.93213 181.06688,75.93213 z" id="path294"/>
+
+ <g enable-background="new " id="g296">
+ <path d="M 265.60986,112.8833 C 265.68994,113.03906 265.79736,113.16504 265.93115,113.26172 C 266.06494,113.35791 266.22119,113.42969 266.40088,113.47608 C 266.58154,113.52296 266.76807,113.54639 266.96045,113.54639 C 267.09033,113.54639 267.22998,113.53565 267.3794,113.51368 C 267.52784,113.4922 267.66749,113.44972 267.79835,113.3877 C 267.92823,113.32569 268.03761,113.23975 268.12355,113.13086 C 268.21144,113.02197 268.25441,112.88379 268.25441,112.71533 C 268.25441,112.53515 268.19679,112.38916 268.08156,112.27685 C 267.9673,112.16455 267.81594,112.07177 267.62941,111.99658 C 267.44386,111.92236 267.23195,111.85693 266.9966,111.80078 C 266.76027,111.74463 266.52101,111.68262 266.27883,111.61377 C 266.02981,111.55176 265.78762,111.47559 265.55129,111.38525 C 265.31594,111.29541 265.10402,111.17822 264.9175,111.03515 C 264.73098,110.89208 264.58059,110.71337 264.46535,110.49853 C 264.35109,110.28369 264.29347,110.02392 264.29347,109.71923 C 264.29347,109.37646 264.36671,109.07958 264.51222,108.82763 C 264.6587,108.57568 264.85011,108.36572 265.08644,108.19726 C 265.32179,108.02929 265.58937,107.90478 265.8882,107.82372 C 266.18605,107.74315 266.48488,107.70263 266.78273,107.70263 C 267.13136,107.70263 267.46535,107.74169 267.78566,107.81982 C 268.105,107.89746 268.39015,108.02392 268.6382,108.19824 C 268.88722,108.37256 269.08449,108.59521 269.23097,108.86621 C 269.37648,109.13721 269.44972,109.46582 269.44972,109.85156 L 268.02784,109.85156 C 268.01514,109.65234 267.97315,109.4873 267.90284,109.35693 C 267.83155,109.22607 267.73682,109.12353 267.61964,109.04834 C 267.50148,108.97412 267.36671,108.9209 267.21534,108.89014 C 267.063,108.85889 266.89796,108.84326 266.71827,108.84326 C 266.60108,108.84326 266.48292,108.85596 266.36573,108.88037 C 266.24757,108.90576 266.14112,108.94922 266.04542,109.01123 C 265.94874,109.07373 265.86964,109.15137 265.80812,109.24463 C 265.7466,109.33838 265.71535,109.45654 265.71535,109.59961 C 265.71535,109.73047 265.73976,109.83643 265.78957,109.91699 C 265.83937,109.99804 265.93801,110.07275 266.08352,110.14111 C 266.22903,110.20947 266.43118,110.27832 266.68899,110.34668 C 266.9468,110.41504 267.28372,110.50244 267.70071,110.60791 C 267.82473,110.63281 267.99661,110.67822 268.21731,110.74365 C 268.43801,110.80908 268.65676,110.91308 268.87454,111.05615 C 269.09231,111.1997 269.27981,111.39111 269.43899,111.63037 C 269.59719,111.87012 269.67629,112.17676 269.67629,112.55029 C 269.67629,112.85547 269.61672,113.13867 269.49856,113.3999 C 269.3804,113.66162 269.20461,113.8872 268.97122,114.07666 C 268.73782,114.26709 268.44876,114.41455 268.10403,114.52051 C 267.75833,114.62647 267.35794,114.6792 266.90481,114.6792 C 266.53762,114.6792 266.18118,114.63379 265.83547,114.54346 C 265.49074,114.45313 265.18508,114.31104 264.92043,114.11768 C 264.65676,113.92432 264.4468,113.67774 264.29055,113.37891 C 264.13528,113.07959 264.06106,112.7251 264.06692,112.31397 L 265.4888,112.31397 C 265.48877,112.53809 265.52881,112.72803 265.60986,112.8833 z" id="path298" style="fill:#ffffff"/>
+
+ <path d="M 273.8667,107.8667 L 276.35986,114.53076 L 274.8374,114.53076 L 274.33349,113.04638 L 271.84033,113.04638 L 271.31787,114.53076 L 269.84326,114.53076 L 272.36377,107.8667 L 273.8667,107.8667 z M 273.95068,111.95264 L 273.11084,109.50928 L 273.09229,109.50928 L 272.22315,111.95264 L 273.95068,111.95264 z" id="path300" style="fill:#ffffff"/>
+
+ </g>
+
+ <g enable-background="new " id="g302">
+ <path d="M 239.17821,107.8667 C 239.49559,107.8667 239.78563,107.89502 240.04735,107.95068 C 240.30907,108.00683 240.53368,108.09863 240.72118,108.22607 C 240.9077,108.35351 241.05321,108.52295 241.15575,108.73437 C 241.25829,108.94579 241.31005,109.20703 241.31005,109.51806 C 241.31005,109.854 241.23388,110.13329 241.08056,110.35742 C 240.92822,110.58154 240.70165,110.76465 240.40283,110.90771 C 240.81494,111.02587 241.12256,111.23291 241.32568,111.5288 C 241.5288,111.82469 241.63037,112.18114 241.63037,112.59814 C 241.63037,112.93408 241.56494,113.22509 241.43408,113.47119 C 241.30322,113.7168 241.12646,113.91748 240.90576,114.07324 C 240.68408,114.229 240.43115,114.34424 240.14795,114.41845 C 239.86377,114.49365 239.57275,114.53075 239.27295,114.53075 L 236.03662,114.53075 L 236.03662,107.86669 L 239.17821,107.86669 L 239.17821,107.8667 z M 238.99071,110.56201 C 239.25243,110.56201 239.46727,110.5 239.63622,110.37597 C 239.80419,110.25146 239.88817,110.05029 239.88817,109.77099 C 239.88817,109.61572 239.85985,109.48828 239.80419,109.38915 C 239.74755,109.28954 239.67333,109.21239 239.57958,109.15624 C 239.48583,109.10058 239.37841,109.06151 239.25731,109.04003 C 239.13524,109.01806 239.00926,109.00732 238.8784,109.00732 L 237.50535,109.00732 L 237.50535,110.56201 L 238.99071,110.56201 z M 239.07664,113.39014 C 239.22019,113.39014 239.35691,113.37647 239.48777,113.34815 C 239.61863,113.32032 239.73484,113.27344 239.83445,113.2085 C 239.93406,113.14307 240.01316,113.0542 240.07273,112.94239 C 240.1323,112.83058 240.1616,112.68751 240.1616,112.51319 C 240.1616,112.17139 240.06492,111.92725 239.87156,111.78126 C 239.6782,111.63527 239.42234,111.56202 239.10496,111.56202 L 237.50535,111.56202 L 237.50535,113.39014 L 239.07664,113.39014 z" id="path304" style="fill:#ffffff"/>
+
+ <path d="M 241.88914,107.8667 L 243.53269,107.8667 L 245.09324,110.49854 L 246.64402,107.8667 L 248.27781,107.8667 L 245.80418,111.97315 L 245.80418,114.53077 L 244.33543,114.53077 L 244.33543,111.93604 L 241.88914,107.8667 z" id="path306" style="fill:#ffffff"/>
+
+ </g>
+
+ <g id="g6316_1_" transform="matrix(0.624995,0,0,0.624995,391.2294,176.9332)">
+
+ <path id="path6318_1_" cx="475.97119" ry="29.209877" cy="252.08646" type="arc" rx="29.209877" d="M -175.0083,-139.1153 C -175.00204,-129.7035 -182.62555,-122.06751 -192.03812,-122.06049 C -201.44913,-122.05341 -209.08512,-129.67774 -209.09293,-139.09028 C -209.09293,-139.09809 -209.09293,-139.10749 -209.09293,-139.1153 C -209.09919,-148.52784 -201.47413,-156.1623 -192.06311,-156.17011 C -182.65054,-156.17713 -175.01456,-148.55207 -175.0083,-139.14026 C -175.0083,-139.13092 -175.0083,-139.1239 -175.0083,-139.1153 z" style="fill:#ffffff"/>
+
+ <g id="g6320_1_" transform="translate(-23.9521,-89.72962)">
+ <path id="path6322_1_" d="M -168.2204,-68.05536 C -173.39234,-68.05536 -177.76892,-66.25067 -181.35175,-62.64203 C -185.02836,-58.90759 -186.86588,-54.48883 -186.86588,-49.38568 C -186.86588,-44.28253 -185.02836,-39.89416 -181.35175,-36.22308 C -177.67673,-32.55114 -173.29859,-30.71521 -168.2204,-30.71521 C -163.07974,-30.71521 -158.62503,-32.56677 -154.85312,-36.26996 C -151.30307,-39.78558 -149.52652,-44.15827 -149.52652,-49.38568 C -149.52652,-54.6123 -151.33432,-59.03265 -154.94843,-62.64203 C -158.5625,-66.25067 -162.98599,-68.05536 -168.2204,-68.05536 z M -168.17352,-64.69519 C -163.936,-64.69519 -160.33752,-63.20221 -157.37655,-60.21466 C -154.38748,-57.25836 -152.89214,-53.64899 -152.89214,-49.38568 C -152.89214,-45.09186 -154.35466,-41.52856 -157.28438,-38.69653 C -160.36876,-35.64727 -163.99849,-34.12304 -168.17351,-34.12304 C -172.34856,-34.12304 -175.94701,-35.63244 -178.96892,-38.64965 C -181.9908,-41.66918 -183.50176,-45.24657 -183.50176,-49.38567 C -183.50176,-53.52398 -181.97518,-57.13414 -178.92205,-60.21465 C -175.9939,-63.20221 -172.41107,-64.69519 -168.17352,-64.69519 z"/>
+
+ <path id="path6324_1_" d="M -176.49548,-52.02087 C -175.75171,-56.71856 -172.44387,-59.22949 -168.30008,-59.22949 C -162.33911,-59.22949 -158.70783,-54.90448 -158.70783,-49.1372 C -158.70783,-43.50982 -162.57194,-39.13793 -168.39383,-39.13793 C -172.39856,-39.13793 -175.98297,-41.60277 -176.63611,-46.43877 L -171.93292,-46.43877 C -171.7923,-43.92778 -170.1626,-43.04418 -167.83447,-43.04418 C -165.1813,-43.04418 -163.4563,-45.50908 -163.4563,-49.27709 C -163.4563,-53.22942 -164.94693,-55.32244 -167.74228,-55.32244 C -169.79074,-55.32244 -171.55948,-54.57787 -171.93292,-52.02087 L -170.56418,-52.02789 L -174.26734,-48.32629 L -177.96894,-52.02789 L -176.49548,-52.02087 z"/>
+
+ </g>
+
+ </g>
+
+ <g id="g313">
+ <circle cx="242.56226" cy="90.224609" r="10.8064" id="circle315" sodipodi:cx="242.56226" sodipodi:cy="90.224609" sodipodi:rx="10.8064" sodipodi:ry="10.8064" style="fill:#ffffff"/>
+
+ <g id="g317">
+ <path d="M 245.68994,87.09766 C 245.68994,86.68116 245.35205,86.34424 244.93603,86.34424 L 240.16357,86.34424 C 239.74755,86.34424 239.40966,86.68115 239.40966,87.09766 L 239.40966,91.87061 L 240.74071,91.87061 L 240.74071,97.52295 L 244.3579,97.52295 L 244.3579,91.87061 L 245.68993,91.87061 L 245.68993,87.09766 L 245.68994,87.09766 z" id="path319"/>
+
+ <circle cx="242.5498" cy="84.083008" r="1.63232" id="circle321" sodipodi:cx="242.5498" sodipodi:cy="84.083008" sodipodi:rx="1.63232" sodipodi:ry="1.63232"/>
+
+ </g>
+
+ <path clip-rule="evenodd" d="M 242.53467,78.31836 C 239.30322,78.31836 236.56641,79.4458 234.32715,81.70215 C 232.0293,84.03516 230.88086,86.79736 230.88086,89.98633 C 230.88086,93.1753 232.0293,95.91846 234.32715,98.21338 C 236.625,100.50781 239.36133,101.65527 242.53467,101.65527 C 245.74756,101.65527 248.53272,100.49853 250.88819,98.18359 C 253.10889,95.98681 254.21827,93.2539 254.21827,89.98632 C 254.21827,86.71874 253.08936,83.95751 250.83057,81.70214 C 248.57178,79.4458 245.80615,78.31836 242.53467,78.31836 z M 242.56396,80.41797 C 245.2124,80.41797 247.46142,81.35156 249.31103,83.21875 C 251.18115,85.06592 252.11572,87.32227 252.11572,89.98633 C 252.11572,92.66992 251.20068,94.89746 249.36963,96.66699 C 247.4419,98.57275 245.17334,99.52539 242.56397,99.52539 C 239.9546,99.52539 237.70557,98.58252 235.81739,96.6958 C 233.92774,94.80957 232.98389,92.57324 232.98389,89.98633 C 232.98389,87.3999 233.93799,85.14404 235.84619,83.21875 C 237.67676,81.35156 239.9165,80.41797 242.56396,80.41797 z" id="path323" style="fill-rule:evenodd"/>
+
+ </g>
+
+</g>
+ </g>
+</svg> \ No newline at end of file
diff --git a/assets/image/combgeo.png b/assets/image/combgeo.png
new file mode 100644
index 0000000..091b9ef
--- /dev/null
+++ b/assets/image/combgeo.png
Binary files differ
diff --git a/assets/image/rss.png b/assets/image/rss.png
new file mode 100644
index 0000000..ac88b1e
--- /dev/null
+++ b/assets/image/rss.png
Binary files differ
diff --git a/assets/pubkey.txt b/assets/pubkey.txt
new file mode 100644
index 0000000..5b3c4f9
--- /dev/null
+++ b/assets/pubkey.txt
@@ -0,0 +1,87 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQINBGSCLcEBEAD0C6Jswl1PYYprKghiZuj7bQrSZfK9HtAGQfJRb1FyrHAsxen8
+8IXJFQKYDugcwNZyqR/6vbs2rgfddiH0zwIgGbIBHSj6Zs8qG6TExbqwor+MqHrj
+UOrBJnW825A5SlVDMI2095Ff+9KAh1eZPd05en3u6e/ScC2mdNo1KfnFcnBqM3tC
+lOc+Gzn0bKvUTrxVtzgAoVb5WjilWWNiEgrn1UImQq6DtQjC4dOMYvLjjRc84Uii
+zTk2UhDtOTYkPXXUthT4af+b4ZiLH/6KupAwYAtwbF4TNkx+4uCy6nB15wLhJVok
+R9jTXDaeVDEkjzlsbD/PB5JeSXqXjLWzYLn6yWtCWQDuwkTVvquQEdk1hV1nCPaB
+IYHevRDQl62C2CTVmXTQjspyIE/XJQlKG7Cawodjicq16RRIdEXMsUgkj7znfntE
+gqoPac/RiTTtWVKCKtU1iQTkx3ze4MNDGxL4fMrcruR+tzxjWsshHaNfAqPSbWvt
+lG3pOrpO6sgbsdSDfrO/2YX7BSAzuEuQ4QfWw/edpG1jwxz9CIy8I6rwYFx8+Ldp
+Nu/GGuRX9GutenZhsukoVuq8NgGGhRGyG17W+C7KwoKfHNwHMkXQd7PXHZaKeJFW
+6r2G/k5C4ygW13Ke3IJVAU+PrSrXWHeysvxzLQDwCiJTgd40pDBiTEL1NwARAQAB
+tCdEdW5jYW4gV2lsa2llIDxkdW5jYW5ud2lsa2llQGdtYWlsLmNvbT6JAlQEEwEK
+AD4WIQSmO9ugtPtuqx0aZmUCnO87qSImdAUCZIItwQIbAwUJA8JnAAULCQgHAgYV
+CgkICwIEFgIDAQIeAQIXgAAKCRACnO87qSImdEoXD/wIYkekt7ofWiM4OgJapSQr
+xCjIUzets3AEfCG39Kuig5SSalpfJXEUgYc69iwwRoHgFSbMSOc6K3chhATgprn2
+UiYtEZPiDrG7tXgdU04RiMvAfd+E1psOZs7KZKihkm7OwJynLvkx3i7bO0fjJKZe
+jgejp6ioCy9IZPlC/Ez0UNb6Upb5OHiB1/gSHPzl0TAsIfN5KaGCjF3Lf2KbUmlh
+P1C1oZwxAz7WlqZLZxLNYpPRxJhjMx8BQMkfLyUVsnEsY/ZCrWRe6lwY/7gcsPCI
+gkv2kYWnudtZiTynopItjIh9HCAQ9OFDFx9CD3eFiW4OTkS7DM/VwtpunMxOOWGx
+2y3gdYUYB4ypS2NGBAowblMEwt6F4GEWDcByX+yCVz8Ix9AwlZiVpkl8CugBosP7
+F70+mmdmaMDF1Dw8Ed/FyvSoWmIZcutc3WN6i/5xD90QEBiFAilmBItshXl/3+pB
+pzRSS7FTCwfqJgyzOzNks6vTYzCumGB2M3rsARdGl7t/MQNFV3AnuZQ2n6adySLj
+Gx0Wza/I/vkwK0AboqI3yfXysF2vVWRuo+8t1V9G96E93eQk5MRSBMelsQGR7VDV
+7V3Br2q8gLaWce3p+Lz/33rriYdQelj9LhoqWbVDC4VAkrdxIPtFza0LO9yVhRse
+zdnVei7N/JkMrRpFGANoTbkCDQRkgi5GARAA9Ht86wzJiNGPh6C8Jc+sexdwQgeZ
+fplU3xw3DIulhydrVmr/Yps7Fc12qT+iJsE9V+eXCmC4SkdeTDKBpQSV+/GkWEJO
+IHStLeCcLjYXwU9O5mvWlzeydR3vN1hJ7OBupCWs5jFf+mzET9WclSIxM7SRXHll
+zGgt1Xj9WWLxno8S/5yw32rSisGYMKRBWqoCvfKqvWRPvikrpmUP22TpkrcNLEW4
+/l5Tm0giEy9g+272k5tJ2NWd//A6syr2H8gCGlXMf5LVkXRKg/rASYEJRiq4r35Q
+A2LoMc7N8ceqppsqoVOFBr4km8jev85DgC/sdJCSkrK8v7kLq6olCU3sJ+l3ibR3
+2J5AlJ2mnWrB0kRUZwfEuVjmF81+ApF1K2bcwsagaUnVXe60rmck8+RvECobj/rJ
+kAyt2LJClyaxJB9F/eaCZKePC3KXsszJQWQF4IwImL0Eh+4b3jjVx4hV+8z3BwDd
+lR7U2gmE6bqeisqOKyeJ1s31UDtrK+dFF4UPvkykL6K9ollha80daxk42XrMPETH
+o60/R8wyfdfLI8dUJYtCxF1ikgNDDYLvXTOHri+vmCTPj+cC/xAwbXU/QwEjpotY
+MrPxwKRpBqlDkVP1zGe2jdUEyLTvgn0UDqQgF/E8xzHNGW1Bncu/gjHdywjGfY46
+xFwa06hmx0m9yBkAEQEAAYkEcgQYAQoAJhYhBKY726C0+26rHRpmZQKc7zupIiZ0
+BQJkgi5GAhsCBQkB4TOAAkAJEAKc7zupIiZ0wXQgBBkBCgAdFiEEsConUY2O5fhQ
+relTRaqkTVPLa9sFAmSCLkYACgkQRaqkTVPLa9uI3w/8CyRGrhw0zbMLytAChE9a
+uHLE5oqp96sbR63Kln3KDGmXnsYjf6MM9dXPc/Inu3uCgdVDsTVJaP652ofgOREQ
+DzLd9vlFh9zY8aTq7OUckx6UEnuUK7geU15oyhgA5rePQ+9viIFjphF6OgzWa6Bg
+n+h8/wk8nJ2CYDDaMkBp8oUJ75MD5aKcGGPB1A7Y8ZxgPbXHEqWkHFMpeNNLi9dH
+FmrtX3gUHbAkSJO+twJw6uGoARJ1FHYtksrLZ75kJnU7w+A4EhqgfkR6r6IIIXIe
+2skk15jovZtSCShB9YH5/DtB419v8qOFGDDQ2922F59zn31hw7nba8vckjEhQfdT
+JgSBJ2u2QMluK+14ObneJb/qOej3e8z2opNezadJt1xYgLip0l59LTn3Zmj5jJas
+OZk47e27oVK5N6fWq3GCJ/lCXQBxi9bRlKrLkZs7FcbvVMryfmMp4YGax5ZiTdHb
+SCpwX4FCmdwTYaihQLA0gCr9RvjkSBdwdkZhMvzF40sGTNM34yWLZ68PnvQVbmZy
+hQxJqy0AIc26kqe166JWSsoYV+W3KrptI8wSKOMmdlNumw1VTEUsaKwO4Q/qBQB+
+QTVV6DaG7YOy5w7Svlg1fxr4QYK3PtLyjGItr6yg0NaC1mOV1Mr2cH6hMkZx9FVb
+d3VJTeNBGNKVsci3VuGiZ9ybZA/+IAQVQ504NrQa7ydeTAnjifXmh9KDcfWloQLO
+beSm5FaEluZ5JYNz4XlAeF20Qpz86eHDmIeSBiS0ku8Pq0hLrOOg9tcvko+aU7th
+mMCms2xbzAkUgj4OSxSMjuoH3OhJkyZTR90rsaS1YEnbsVwE+Ii8n4lz7N1qoduz
+yxKcgBDXQWuIiWuRZHw3BXAzYS/nCGo66E+GrV4lbgkrTyMlolMXRbZzcyTHxGk1
+4ZX5mUDvjv3XEoGYyXITVMQSZTy3iN/pWSNP8fFcdUAZnWlFcu874ZDVhc0xr89V
+c45tv9q7q51w7nwjuyxuaQ/Ief9WOlN1vhOnKxI3klEHrkpFdMJ+KwMZWovAjr+u
+yuTnQ+p2se68Jy9kBysxw8MkqTMBHqrifNiIZe0CpizCPAL9wF52znIvqc2mvvbX
+KR5by5nX6hMy6+ESaykwKJm6gyE5gWdFEzVmJrIR0kcQLIbkcWRj4wgDT5gDuTDV
+UtzsfR5jxo2Mb9OTifErUB40fHutpMCI1OpAGPZOO4MJ5dFMDsjP8fex4+aIlHIM
+7dojTzptkn7mFQFkyYh5kEGBqlO3QUIHSUc2YbDKm9amzNCdJ92NWTxGquayC7RQ
+qcuB+aYBPskpfOXtOOvMfTDzGUrOq5lsq3V3wCDPmaHszY1oG//EV3tLc96EpYTo
+1tjDmzO5Ag0EZIIupQEQAKRLTQgPUQugdcMZ8xLYzNfT+t88Rqoy0g+oA5Ze8a9o
+f5LJom/bvsGJT7h+HK2lmQr0gP5WLv6uNethiDoSZqNCCejUJdGGyaw0hDB5cfvu
+Vkoj82sylIROH+EqOnNfAYuNgEi/h3XlFByfZgr5BLOBtA1cUGOEtGXLx3IV2uyP
+81nAu5iVJ+TTuO9XoypBP25zMXl8emFekz1rARwvMYITJnEsiY5JQuWLPZh5w5af
+boTr/P5KDBbNdVM7r/YgCKVv1mPOfnW8BhrbCzQPNdWLLmIsXnxvHh2O/AJbd6SF
+rOZxZotRMT49hUCRVzUXebhTgZ4cXiIWo0v0D9o/xAEejvPuiClJa7QE0CJ4g9eO
+3jX0P938iIRTFKeASrWts7Ajf74tf7wyHA0teSJ0/gr0tCaBqdxsVwLRAu/CQfgu
+uUEKfYkqIJilWUgEdfcz8daE9ZwZAdilAk3SAU9INnT3NlTb0g9Ope7kg0IaPXYQ
+j+CSeSUMRw1vdJhV3I+hxJhjAHWzFPxMI0rcu6EF3t4fTt3/gVaCpRvDvCeyk5S3
++ZtLbetvkz7l7Uu+oHuy0xgNfUUL9Im7aT6C51nQ6DEcpe2eDGz3DIY7TwoaLoNB
+xg95JYlvLWbQqycc1uvUlJGWPLYFEwBKGFmD6xfrIdqn+iLp7ZenQDl4PKcq1ICT
+ABEBAAGJAjwEGAEKACYWIQSmO9ugtPtuqx0aZmUCnO87qSImdAUCZIIupQIbDAUJ
+AeEzgAAKCRACnO87qSImdH9GD/9QemZUgcQAhLDevJcWTGBJCWzEknD6mBSEew1V
+0JGFdUWIot8fowOJB9T5K30pj9V5EH2RU4gPv0iQg9mxzolVH8gCLCHGPT/167K9
+a7wqaXbavzknk/Igw6j++kiiSAeGihT5zjVphHDE9YwRlJAKEXHhJWozBtsEZIKU
+JziIT0+Vo0GhEP1pH5gCMKQDsfqJS2uYwcR5I/jDiZVwazWIzQ++RUlX6DYBAXvN
+P35DP215FZSzBDKCb/B7XRcwxFYTgWEVdI/SqMLZ/BJUOq0AloimNR5mjf5vjdCg
+gNGjDEAShRaWSqAd5rEnUauKs3zdc+CFsjLeEM4cgJt+qDs3JIyT009+EByujFXE
+5Br6K8oC2ymG9LGH6Wtd5axdxJyrg1iFc6p4D7LE67qVo3AHlWuzwnCC8p4OPLpD
+js3Z2NLE36/eBdyVL52tqEXVZOcVufimJfkuP9hiRRFfl61eHviAW9QZ/qQBadZC
+lMnU3/1vgQ4gj2KVyNYP/R6+N9ND5PToYCA6AJlbBQNTkSQPKnjEq7P36bz6PBKi
+WAsPrzBP19OlcnSgNsLQe89WWN1+ZQ2paqgduwilA3B8mTfzjuXfDmqs57M4Qfcl
+rSLqbeu4mOtQCy8dZhwZ2DJW/ScWULtWZObrtSypew5BJ/5Xv3cONosAez162/d8
+/AmRzA==
+=/EIQ
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/assets/webfonts/IBMPlexMono-Bold.otf b/assets/webfonts/IBMPlexMono-Bold.otf
new file mode 100644
index 0000000..7e66954
--- /dev/null
+++ b/assets/webfonts/IBMPlexMono-Bold.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexMono-ExtraLight.otf b/assets/webfonts/IBMPlexMono-ExtraLight.otf
new file mode 100644
index 0000000..fbdfa03
--- /dev/null
+++ b/assets/webfonts/IBMPlexMono-ExtraLight.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexMono-ExtraLightItalic.otf b/assets/webfonts/IBMPlexMono-ExtraLightItalic.otf
new file mode 100644
index 0000000..1e6adac
--- /dev/null
+++ b/assets/webfonts/IBMPlexMono-ExtraLightItalic.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexMono-Italic.otf b/assets/webfonts/IBMPlexMono-Italic.otf
new file mode 100644
index 0000000..f317f41
--- /dev/null
+++ b/assets/webfonts/IBMPlexMono-Italic.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexMono-Light.otf b/assets/webfonts/IBMPlexMono-Light.otf
new file mode 100644
index 0000000..22bacee
--- /dev/null
+++ b/assets/webfonts/IBMPlexMono-Light.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexMono-LightItalic.otf b/assets/webfonts/IBMPlexMono-LightItalic.otf
new file mode 100644
index 0000000..ce0e9a3
--- /dev/null
+++ b/assets/webfonts/IBMPlexMono-LightItalic.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexMono-Medium.otf b/assets/webfonts/IBMPlexMono-Medium.otf
new file mode 100644
index 0000000..0af3d17
--- /dev/null
+++ b/assets/webfonts/IBMPlexMono-Medium.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexMono-MediumItalic.otf b/assets/webfonts/IBMPlexMono-MediumItalic.otf
new file mode 100644
index 0000000..3b57c72
--- /dev/null
+++ b/assets/webfonts/IBMPlexMono-MediumItalic.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexMono-Regular.otf b/assets/webfonts/IBMPlexMono-Regular.otf
new file mode 100644
index 0000000..588d66a
--- /dev/null
+++ b/assets/webfonts/IBMPlexMono-Regular.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexMono-SemiBold.otf b/assets/webfonts/IBMPlexMono-SemiBold.otf
new file mode 100644
index 0000000..d66f44c
--- /dev/null
+++ b/assets/webfonts/IBMPlexMono-SemiBold.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexMono-SemiBoldItalic.otf b/assets/webfonts/IBMPlexMono-SemiBoldItalic.otf
new file mode 100644
index 0000000..7603bac
--- /dev/null
+++ b/assets/webfonts/IBMPlexMono-SemiBoldItalic.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexMono-Text.otf b/assets/webfonts/IBMPlexMono-Text.otf
new file mode 100644
index 0000000..14aa0fd
--- /dev/null
+++ b/assets/webfonts/IBMPlexMono-Text.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexMono-TextItalic.otf b/assets/webfonts/IBMPlexMono-TextItalic.otf
new file mode 100644
index 0000000..d894c4e
--- /dev/null
+++ b/assets/webfonts/IBMPlexMono-TextItalic.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexMono-Thin.otf b/assets/webfonts/IBMPlexMono-Thin.otf
new file mode 100644
index 0000000..5d22e93
--- /dev/null
+++ b/assets/webfonts/IBMPlexMono-Thin.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexMono-ThinItalic.otf b/assets/webfonts/IBMPlexMono-ThinItalic.otf
new file mode 100644
index 0000000..3229d91
--- /dev/null
+++ b/assets/webfonts/IBMPlexMono-ThinItalic.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSans-Bold.otf b/assets/webfonts/IBMPlexSans-Bold.otf
new file mode 100644
index 0000000..c795df4
--- /dev/null
+++ b/assets/webfonts/IBMPlexSans-Bold.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSans-BoldItalic.otf b/assets/webfonts/IBMPlexSans-BoldItalic.otf
new file mode 100644
index 0000000..de2a35d
--- /dev/null
+++ b/assets/webfonts/IBMPlexSans-BoldItalic.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSans-ExtraLightItalic.otf b/assets/webfonts/IBMPlexSans-ExtraLightItalic.otf
new file mode 100644
index 0000000..11548fe
--- /dev/null
+++ b/assets/webfonts/IBMPlexSans-ExtraLightItalic.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSans-Italic.otf b/assets/webfonts/IBMPlexSans-Italic.otf
new file mode 100644
index 0000000..f611fea
--- /dev/null
+++ b/assets/webfonts/IBMPlexSans-Italic.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSans-Light.otf b/assets/webfonts/IBMPlexSans-Light.otf
new file mode 100644
index 0000000..f1777dd
--- /dev/null
+++ b/assets/webfonts/IBMPlexSans-Light.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSans-LightItalic.otf b/assets/webfonts/IBMPlexSans-LightItalic.otf
new file mode 100644
index 0000000..2cf8e23
--- /dev/null
+++ b/assets/webfonts/IBMPlexSans-LightItalic.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSans-Medium.otf b/assets/webfonts/IBMPlexSans-Medium.otf
new file mode 100644
index 0000000..98dac81
--- /dev/null
+++ b/assets/webfonts/IBMPlexSans-Medium.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSans-MediumItalic.otf b/assets/webfonts/IBMPlexSans-MediumItalic.otf
new file mode 100644
index 0000000..6cbc4c9
--- /dev/null
+++ b/assets/webfonts/IBMPlexSans-MediumItalic.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSans-Regular.otf b/assets/webfonts/IBMPlexSans-Regular.otf
new file mode 100644
index 0000000..3ab142d
--- /dev/null
+++ b/assets/webfonts/IBMPlexSans-Regular.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSans-SemiBold.otf b/assets/webfonts/IBMPlexSans-SemiBold.otf
new file mode 100644
index 0000000..c0a3f53
--- /dev/null
+++ b/assets/webfonts/IBMPlexSans-SemiBold.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSans-SemiBoldItalic.otf b/assets/webfonts/IBMPlexSans-SemiBoldItalic.otf
new file mode 100644
index 0000000..8d20318
--- /dev/null
+++ b/assets/webfonts/IBMPlexSans-SemiBoldItalic.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSans-Text.otf b/assets/webfonts/IBMPlexSans-Text.otf
new file mode 100644
index 0000000..a2c6fc1
--- /dev/null
+++ b/assets/webfonts/IBMPlexSans-Text.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSans-TextItalic.otf b/assets/webfonts/IBMPlexSans-TextItalic.otf
new file mode 100644
index 0000000..d95c0bc
--- /dev/null
+++ b/assets/webfonts/IBMPlexSans-TextItalic.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSans-Thin.otf b/assets/webfonts/IBMPlexSans-Thin.otf
new file mode 100644
index 0000000..11c6d1a
--- /dev/null
+++ b/assets/webfonts/IBMPlexSans-Thin.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSans-ThinItalic.otf b/assets/webfonts/IBMPlexSans-ThinItalic.otf
new file mode 100644
index 0000000..f1d8564
--- /dev/null
+++ b/assets/webfonts/IBMPlexSans-ThinItalic.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSerif-Bold.otf b/assets/webfonts/IBMPlexSerif-Bold.otf
new file mode 100644
index 0000000..57395d7
--- /dev/null
+++ b/assets/webfonts/IBMPlexSerif-Bold.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSerif-BoldItalic.otf b/assets/webfonts/IBMPlexSerif-BoldItalic.otf
new file mode 100644
index 0000000..2d30983
--- /dev/null
+++ b/assets/webfonts/IBMPlexSerif-BoldItalic.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSerif-ExtraLight.otf b/assets/webfonts/IBMPlexSerif-ExtraLight.otf
new file mode 100644
index 0000000..b6b6f88
--- /dev/null
+++ b/assets/webfonts/IBMPlexSerif-ExtraLight.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSerif-ExtraLightItalic.otf b/assets/webfonts/IBMPlexSerif-ExtraLightItalic.otf
new file mode 100644
index 0000000..ba4337d
--- /dev/null
+++ b/assets/webfonts/IBMPlexSerif-ExtraLightItalic.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSerif-Italic.otf b/assets/webfonts/IBMPlexSerif-Italic.otf
new file mode 100644
index 0000000..b2fd2fe
--- /dev/null
+++ b/assets/webfonts/IBMPlexSerif-Italic.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSerif-Light.otf b/assets/webfonts/IBMPlexSerif-Light.otf
new file mode 100644
index 0000000..c54e1b6
--- /dev/null
+++ b/assets/webfonts/IBMPlexSerif-Light.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSerif-LightItalic.otf b/assets/webfonts/IBMPlexSerif-LightItalic.otf
new file mode 100644
index 0000000..6dd3287
--- /dev/null
+++ b/assets/webfonts/IBMPlexSerif-LightItalic.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSerif-Medium.otf b/assets/webfonts/IBMPlexSerif-Medium.otf
new file mode 100644
index 0000000..9ad590e
--- /dev/null
+++ b/assets/webfonts/IBMPlexSerif-Medium.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSerif-MediumItalic.otf b/assets/webfonts/IBMPlexSerif-MediumItalic.otf
new file mode 100644
index 0000000..59faca8
--- /dev/null
+++ b/assets/webfonts/IBMPlexSerif-MediumItalic.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSerif-Regular.otf b/assets/webfonts/IBMPlexSerif-Regular.otf
new file mode 100644
index 0000000..bd13427
--- /dev/null
+++ b/assets/webfonts/IBMPlexSerif-Regular.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSerif-SemiBold.otf b/assets/webfonts/IBMPlexSerif-SemiBold.otf
new file mode 100644
index 0000000..44f111e
--- /dev/null
+++ b/assets/webfonts/IBMPlexSerif-SemiBold.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSerif-SemiBoldItalic.otf b/assets/webfonts/IBMPlexSerif-SemiBoldItalic.otf
new file mode 100644
index 0000000..d306645
--- /dev/null
+++ b/assets/webfonts/IBMPlexSerif-SemiBoldItalic.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSerif-Text.otf b/assets/webfonts/IBMPlexSerif-Text.otf
new file mode 100644
index 0000000..7cb4d5b
--- /dev/null
+++ b/assets/webfonts/IBMPlexSerif-Text.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSerif-TextItalic.otf b/assets/webfonts/IBMPlexSerif-TextItalic.otf
new file mode 100644
index 0000000..8f791a9
--- /dev/null
+++ b/assets/webfonts/IBMPlexSerif-TextItalic.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSerif-Thin.otf b/assets/webfonts/IBMPlexSerif-Thin.otf
new file mode 100644
index 0000000..5ce4224
--- /dev/null
+++ b/assets/webfonts/IBMPlexSerif-Thin.otf
Binary files differ
diff --git a/assets/webfonts/IBMPlexSerif-ThinItalic.otf b/assets/webfonts/IBMPlexSerif-ThinItalic.otf
new file mode 100644
index 0000000..4551d7a
--- /dev/null
+++ b/assets/webfonts/IBMPlexSerif-ThinItalic.otf
Binary files differ
diff --git a/assets/webfonts/SIL Open Font License.txt b/assets/webfonts/SIL Open Font License.txt
new file mode 100644
index 0000000..f6b53f4
--- /dev/null
+++ b/assets/webfonts/SIL Open Font License.txt
@@ -0,0 +1,45 @@
+# IBM Plex Typeface
+
+Copyright © 2017 IBM Corp. with Reserved Font Name "Plex"
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment.
+
+"Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission.
+
+5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. \ No newline at end of file
diff --git a/assets/webfonts/iosevka-regular.ttf b/assets/webfonts/iosevka-regular.ttf
new file mode 100644
index 0000000..2cbe2ad
--- /dev/null
+++ b/assets/webfonts/iosevka-regular.ttf
Binary files differ
diff --git a/assets/webfonts/iosevka-regular.woff2 b/assets/webfonts/iosevka-regular.woff2
new file mode 100644
index 0000000..3c0ab84
--- /dev/null
+++ b/assets/webfonts/iosevka-regular.woff2
Binary files differ
diff --git a/assets/webfonts/iosevka.css b/assets/webfonts/iosevka.css
new file mode 100644
index 0000000..c16095e
--- /dev/null
+++ b/assets/webfonts/iosevka.css
@@ -0,0 +1,630 @@
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 100;
+ font-stretch: normal;
+ font-style: normal;
+ src: url('ttf/iosevka-thin.ttf') format('truetype'), url('woff2/iosevka-thin.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 100;
+ font-stretch: expanded;
+ font-style: normal;
+ src: url('ttf/iosevka-extendedthin.ttf') format('truetype'), url('woff2/iosevka-extendedthin.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 100;
+ font-stretch: normal;
+ font-style: oblique;
+ src: url('ttf/iosevka-thinoblique.ttf') format('truetype'), url('woff2/iosevka-thinoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web Oblique';
+ font-display: swap;
+ font-weight: 100;
+ font-stretch: normal;
+ src: url('ttf/iosevka-thinoblique.ttf') format('truetype'), url('woff2/iosevka-thinoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 100;
+ font-stretch: expanded;
+ font-style: oblique;
+ src: url('ttf/iosevka-extendedthinoblique.ttf') format('truetype'), url('woff2/iosevka-extendedthinoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web Oblique';
+ font-display: swap;
+ font-weight: 100;
+ font-stretch: expanded;
+ src: url('ttf/iosevka-extendedthinoblique.ttf') format('truetype'), url('woff2/iosevka-extendedthinoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 100;
+ font-stretch: normal;
+ font-style: italic;
+ src: url('ttf/iosevka-thinitalic.ttf') format('truetype'), url('woff2/iosevka-thinitalic.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 100;
+ font-stretch: expanded;
+ font-style: italic;
+ src: url('ttf/iosevka-extendedthinitalic.ttf') format('truetype'), url('woff2/iosevka-extendedthinitalic.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 200;
+ font-stretch: normal;
+ font-style: normal;
+ src: url('ttf/iosevka-extralight.ttf') format('truetype'), url('woff2/iosevka-extralight.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 200;
+ font-stretch: expanded;
+ font-style: normal;
+ src: url('ttf/iosevka-extendedextralight.ttf') format('truetype'), url('woff2/iosevka-extendedextralight.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 200;
+ font-stretch: normal;
+ font-style: oblique;
+ src: url('ttf/iosevka-extralightoblique.ttf') format('truetype'), url('woff2/iosevka-extralightoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web Oblique';
+ font-display: swap;
+ font-weight: 200;
+ font-stretch: normal;
+ src: url('ttf/iosevka-extralightoblique.ttf') format('truetype'), url('woff2/iosevka-extralightoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 200;
+ font-stretch: expanded;
+ font-style: oblique;
+ src: url('ttf/iosevka-extendedextralightoblique.ttf') format('truetype'), url('woff2/iosevka-extendedextralightoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web Oblique';
+ font-display: swap;
+ font-weight: 200;
+ font-stretch: expanded;
+ src: url('ttf/iosevka-extendedextralightoblique.ttf') format('truetype'), url('woff2/iosevka-extendedextralightoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 200;
+ font-stretch: normal;
+ font-style: italic;
+ src: url('ttf/iosevka-extralightitalic.ttf') format('truetype'), url('woff2/iosevka-extralightitalic.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 200;
+ font-stretch: expanded;
+ font-style: italic;
+ src: url('ttf/iosevka-extendedextralightitalic.ttf') format('truetype'), url('woff2/iosevka-extendedextralightitalic.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 300;
+ font-stretch: normal;
+ font-style: normal;
+ src: url('ttf/iosevka-light.ttf') format('truetype'), url('woff2/iosevka-light.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 300;
+ font-stretch: expanded;
+ font-style: normal;
+ src: url('ttf/iosevka-extendedlight.ttf') format('truetype'), url('woff2/iosevka-extendedlight.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 300;
+ font-stretch: normal;
+ font-style: oblique;
+ src: url('ttf/iosevka-lightoblique.ttf') format('truetype'), url('woff2/iosevka-lightoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web Oblique';
+ font-display: swap;
+ font-weight: 300;
+ font-stretch: normal;
+ src: url('ttf/iosevka-lightoblique.ttf') format('truetype'), url('woff2/iosevka-lightoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 300;
+ font-stretch: expanded;
+ font-style: oblique;
+ src: url('ttf/iosevka-extendedlightoblique.ttf') format('truetype'), url('woff2/iosevka-extendedlightoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web Oblique';
+ font-display: swap;
+ font-weight: 300;
+ font-stretch: expanded;
+ src: url('ttf/iosevka-extendedlightoblique.ttf') format('truetype'), url('woff2/iosevka-extendedlightoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 300;
+ font-stretch: normal;
+ font-style: italic;
+ src: url('ttf/iosevka-lightitalic.ttf') format('truetype'), url('woff2/iosevka-lightitalic.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 300;
+ font-stretch: expanded;
+ font-style: italic;
+ src: url('ttf/iosevka-extendedlightitalic.ttf') format('truetype'), url('woff2/iosevka-extendedlightitalic.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 400;
+ font-stretch: normal;
+ font-style: normal;
+ src: url('ttf/iosevka-regular.ttf') format('truetype'), url('woff2/iosevka-regular.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 400;
+ font-stretch: expanded;
+ font-style: normal;
+ src: url('ttf/iosevka-extended.ttf') format('truetype'), url('woff2/iosevka-extended.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 400;
+ font-stretch: normal;
+ font-style: oblique;
+ src: url('ttf/iosevka-oblique.ttf') format('truetype'), url('woff2/iosevka-oblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web Oblique';
+ font-display: swap;
+ font-weight: 400;
+ font-stretch: normal;
+ src: url('ttf/iosevka-oblique.ttf') format('truetype'), url('woff2/iosevka-oblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 400;
+ font-stretch: expanded;
+ font-style: oblique;
+ src: url('ttf/iosevka-extendedoblique.ttf') format('truetype'), url('woff2/iosevka-extendedoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web Oblique';
+ font-display: swap;
+ font-weight: 400;
+ font-stretch: expanded;
+ src: url('ttf/iosevka-extendedoblique.ttf') format('truetype'), url('woff2/iosevka-extendedoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 400;
+ font-stretch: normal;
+ font-style: italic;
+ src: url('ttf/iosevka-italic.ttf') format('truetype'), url('woff2/iosevka-italic.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 400;
+ font-stretch: expanded;
+ font-style: italic;
+ src: url('ttf/iosevka-extendeditalic.ttf') format('truetype'), url('woff2/iosevka-extendeditalic.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 500;
+ font-stretch: normal;
+ font-style: normal;
+ src: url('ttf/iosevka-medium.ttf') format('truetype'), url('woff2/iosevka-medium.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 500;
+ font-stretch: expanded;
+ font-style: normal;
+ src: url('ttf/iosevka-extendedmedium.ttf') format('truetype'), url('woff2/iosevka-extendedmedium.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 500;
+ font-stretch: normal;
+ font-style: oblique;
+ src: url('ttf/iosevka-mediumoblique.ttf') format('truetype'), url('woff2/iosevka-mediumoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web Oblique';
+ font-display: swap;
+ font-weight: 500;
+ font-stretch: normal;
+ src: url('ttf/iosevka-mediumoblique.ttf') format('truetype'), url('woff2/iosevka-mediumoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 500;
+ font-stretch: expanded;
+ font-style: oblique;
+ src: url('ttf/iosevka-extendedmediumoblique.ttf') format('truetype'), url('woff2/iosevka-extendedmediumoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web Oblique';
+ font-display: swap;
+ font-weight: 500;
+ font-stretch: expanded;
+ src: url('ttf/iosevka-extendedmediumoblique.ttf') format('truetype'), url('woff2/iosevka-extendedmediumoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 500;
+ font-stretch: normal;
+ font-style: italic;
+ src: url('ttf/iosevka-mediumitalic.ttf') format('truetype'), url('woff2/iosevka-mediumitalic.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 500;
+ font-stretch: expanded;
+ font-style: italic;
+ src: url('ttf/iosevka-extendedmediumitalic.ttf') format('truetype'), url('woff2/iosevka-extendedmediumitalic.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 600;
+ font-stretch: normal;
+ font-style: normal;
+ src: url('ttf/iosevka-semibold.ttf') format('truetype'), url('woff2/iosevka-semibold.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 600;
+ font-stretch: expanded;
+ font-style: normal;
+ src: url('ttf/iosevka-extendedsemibold.ttf') format('truetype'), url('woff2/iosevka-extendedsemibold.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 600;
+ font-stretch: normal;
+ font-style: oblique;
+ src: url('ttf/iosevka-semiboldoblique.ttf') format('truetype'), url('woff2/iosevka-semiboldoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web Oblique';
+ font-display: swap;
+ font-weight: 600;
+ font-stretch: normal;
+ src: url('ttf/iosevka-semiboldoblique.ttf') format('truetype'), url('woff2/iosevka-semiboldoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 600;
+ font-stretch: expanded;
+ font-style: oblique;
+ src: url('ttf/iosevka-extendedsemiboldoblique.ttf') format('truetype'), url('woff2/iosevka-extendedsemiboldoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web Oblique';
+ font-display: swap;
+ font-weight: 600;
+ font-stretch: expanded;
+ src: url('ttf/iosevka-extendedsemiboldoblique.ttf') format('truetype'), url('woff2/iosevka-extendedsemiboldoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 600;
+ font-stretch: normal;
+ font-style: italic;
+ src: url('ttf/iosevka-semibolditalic.ttf') format('truetype'), url('woff2/iosevka-semibolditalic.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 600;
+ font-stretch: expanded;
+ font-style: italic;
+ src: url('ttf/iosevka-extendedsemibolditalic.ttf') format('truetype'), url('woff2/iosevka-extendedsemibolditalic.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 700;
+ font-stretch: normal;
+ font-style: normal;
+ src: url('ttf/iosevka-bold.ttf') format('truetype'), url('woff2/iosevka-bold.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 700;
+ font-stretch: expanded;
+ font-style: normal;
+ src: url('ttf/iosevka-extendedbold.ttf') format('truetype'), url('woff2/iosevka-extendedbold.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 700;
+ font-stretch: normal;
+ font-style: oblique;
+ src: url('ttf/iosevka-boldoblique.ttf') format('truetype'), url('woff2/iosevka-boldoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web Oblique';
+ font-display: swap;
+ font-weight: 700;
+ font-stretch: normal;
+ src: url('ttf/iosevka-boldoblique.ttf') format('truetype'), url('woff2/iosevka-boldoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 700;
+ font-stretch: expanded;
+ font-style: oblique;
+ src: url('ttf/iosevka-extendedboldoblique.ttf') format('truetype'), url('woff2/iosevka-extendedboldoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web Oblique';
+ font-display: swap;
+ font-weight: 700;
+ font-stretch: expanded;
+ src: url('ttf/iosevka-extendedboldoblique.ttf') format('truetype'), url('woff2/iosevka-extendedboldoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 700;
+ font-stretch: normal;
+ font-style: italic;
+ src: url('ttf/iosevka-bolditalic.ttf') format('truetype'), url('woff2/iosevka-bolditalic.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 700;
+ font-stretch: expanded;
+ font-style: italic;
+ src: url('ttf/iosevka-extendedbolditalic.ttf') format('truetype'), url('woff2/iosevka-extendedbolditalic.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 800;
+ font-stretch: normal;
+ font-style: normal;
+ src: url('ttf/iosevka-extrabold.ttf') format('truetype'), url('woff2/iosevka-extrabold.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 800;
+ font-stretch: expanded;
+ font-style: normal;
+ src: url('ttf/iosevka-extendedextrabold.ttf') format('truetype'), url('woff2/iosevka-extendedextrabold.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 800;
+ font-stretch: normal;
+ font-style: oblique;
+ src: url('ttf/iosevka-extraboldoblique.ttf') format('truetype'), url('woff2/iosevka-extraboldoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web Oblique';
+ font-display: swap;
+ font-weight: 800;
+ font-stretch: normal;
+ src: url('ttf/iosevka-extraboldoblique.ttf') format('truetype'), url('woff2/iosevka-extraboldoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 800;
+ font-stretch: expanded;
+ font-style: oblique;
+ src: url('ttf/iosevka-extendedextraboldoblique.ttf') format('truetype'), url('woff2/iosevka-extendedextraboldoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web Oblique';
+ font-display: swap;
+ font-weight: 800;
+ font-stretch: expanded;
+ src: url('ttf/iosevka-extendedextraboldoblique.ttf') format('truetype'), url('woff2/iosevka-extendedextraboldoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 800;
+ font-stretch: normal;
+ font-style: italic;
+ src: url('ttf/iosevka-extrabolditalic.ttf') format('truetype'), url('woff2/iosevka-extrabolditalic.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 800;
+ font-stretch: expanded;
+ font-style: italic;
+ src: url('ttf/iosevka-extendedextrabolditalic.ttf') format('truetype'), url('woff2/iosevka-extendedextrabolditalic.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 900;
+ font-stretch: normal;
+ font-style: normal;
+ src: url('ttf/iosevka-heavy.ttf') format('truetype'), url('woff2/iosevka-heavy.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 900;
+ font-stretch: expanded;
+ font-style: normal;
+ src: url('ttf/iosevka-extendedheavy.ttf') format('truetype'), url('woff2/iosevka-extendedheavy.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 900;
+ font-stretch: normal;
+ font-style: oblique;
+ src: url('ttf/iosevka-heavyoblique.ttf') format('truetype'), url('woff2/iosevka-heavyoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web Oblique';
+ font-display: swap;
+ font-weight: 900;
+ font-stretch: normal;
+ src: url('ttf/iosevka-heavyoblique.ttf') format('truetype'), url('woff2/iosevka-heavyoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 900;
+ font-stretch: expanded;
+ font-style: oblique;
+ src: url('ttf/iosevka-extendedheavyoblique.ttf') format('truetype'), url('woff2/iosevka-extendedheavyoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web Oblique';
+ font-display: swap;
+ font-weight: 900;
+ font-stretch: expanded;
+ src: url('ttf/iosevka-extendedheavyoblique.ttf') format('truetype'), url('woff2/iosevka-extendedheavyoblique.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 900;
+ font-stretch: normal;
+ font-style: italic;
+ src: url('ttf/iosevka-heavyitalic.ttf') format('truetype'), url('woff2/iosevka-heavyitalic.woff2') format('woff2');
+}
+
+@font-face {
+ font-family: 'Iosevka Web';
+ font-display: swap;
+ font-weight: 900;
+ font-stretch: expanded;
+ font-style: italic;
+ src: url('ttf/iosevka-extendedheavyitalic.ttf') format('truetype'), url('woff2/iosevka-extendedheavyitalic.woff2') format('woff2');
+}
diff --git a/dnw/static-pages.scm b/dnw/static-pages.scm
new file mode 100644
index 0000000..578e009
--- /dev/null
+++ b/dnw/static-pages.scm
@@ -0,0 +1,178 @@
+
+
+(define-module (dnw static-pages)
+ #:use-module (ice-9 match)
+ #:use-module (ice-9 rdelim)
+ #:use-module (ice-9 popen)
+ #:use-module (dnw utils)
+ #:use-module (dnw theme)
+ #:use-module (dnw tags)
+ #:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-19)
+ #:use-module (sxml simple)
+ #:use-module (haunt page)
+ #:use-module (haunt utils)
+ #:use-module (haunt post)
+ #:use-module (haunt html)
+ #:export (index-page
+ me-page
+ friends-page
+ influences-page))
+
+;; TODO: tags-template
+;; building index-page
+(define about
+ `(section (@ (id "about"))
+ (div
+ (p "My name is Duncan. I live below the Mason-Dixon.")
+ (p "I write down thoughts I think are interesting here."))))
+
+(define (recents site posts)
+ `(section (@ (id "recent"))
+ (div
+ (h1 "Recent Posts"
+ ,(hyperlink "/feed.xml" (image "rss.png" "RSS Feed Icon" "rss-icon")))
+ (div (@ (class "post-listing"))
+ ,(map (lambda (post)
+ (post-header site post))
+ (take-up-to 10 (posts/reverse-chronological posts))))
+ ,(hyperlink "/posts" "All Posts"))))
+
+(define (index-content site posts)
+ `(,about ,(recents site posts)))
+
+(define (index-page site posts)
+ (make-page "/index.html"
+ (base-template site (index-content site posts) #:title "Home ")
+ sxml->html))
+
+(define me
+ `((section (@ (id "addressbook"))
+ (ul (p "GPG: " ,(hyperlink "/assets/pubkey.txt" "A63B DBA0 B4FB 6EAB 1D1A 6665 029C EF3B A922 2674")))
+ (ul (p "Email: (rot13 \"qaj@shapgbevny.klm\")")
+ (p "Matrix: (rot13 \"synzvajnyehf@zngevk.bet\")")
+ (p "IRC: (rot13 \"SynzvaJnyehf@yvoren.pung\")"))
+ (ul (p "Nostr: npub1a706jyq9hljs08fsr7ejzr3g4l33fpwnadxp63hmjp6tshfvlcqs6z3w29"))
+ (ul (p "Github: " ,(hyperlink "https://github.com/Antigravityd" "Antigravityd")))) ;; TODO: consider moving to Sourcehut.
+ (section (@ (id "prose"))
+ (h1 "About Me")
+ (p "My name is Duncan. I am 20, and have lived most of my life in rural Arkansas. I graduated in 2023 from LSU, cum laude, "
+ "with dual degrees in math and physics, and have at various times been employed as a dishwasher, maintainence guy, tutor, "
+ "data science intern, embedded developer, and research scientist. I am currently unemployed.")
+ (p "Had I my druthers, I would like to be able to make a career out of decentralized science, "
+ "doing physics research and teaching not dependent on the state or the university system and their insidious pollution"
+ "of the discipline. "
+ "In the interim, I'm in no way above contributing to society more directly. Hire me; I'll learn anything. I have a "
+ ,(hyperlink "/assets/cv.pdf" "terrible CV") " you can read.")
+ (h1 "Academic Interests")
+ (h2 "Physical Science")
+ (p "I've planned on studying physics since I was 5. I enjoy studing almost anything that's natural and dead, "
+ "and all my other interests are largely subsidiary to this. "
+ "I like the areas where physics intersects with math, particularly when it does so in mathematically-exciting ways. "
+ "I also " (emph "loved") " my classes about emergent phenomena: thermodynamic, statistical, and condensed-matter physics. "
+ "I spent the latter half of my time working under Jeff Chancellor's Space Radiation Transport and Applied Nuclear Physics "
+ "(SpaRTAN physics) research group, doing embedded design of radiation detectors and writing improvements for transport code.")
+ (h2 "Mathematics")
+ (p "I view math primarily as a tool for physical science and philosophy in general. "
+ "Accordingly, I want to get to the frontier of the discipline as fast as possible: I probably will need to make new tools. "
+ "The only domain that seems not to have borne much practical fruit, except as a " (emph "target") " for developing "
+ "\"real\" tools, is number theory. "
+ "However, I particularly like topology/geometry and algebra, and would prefer if analysis and discrete math borrowed "
+ "as many of its tools and methods as possible.")
+ (h2 "Computation")
+ (p "Fundamentally, computer science is a branch of mathematics, in my view. "
+ "I am interested in ways to compute as abstractly, efficiently, securely, and correctly as possible. "
+ "As such, I enjoy functional and logic programming languages, which succeed by representing computation in maximally "
+ "mathematical form, using the abstractions that have been most useful in a general context. "
+ "I like writing things in Haskell and Lisp. I have written many things in Python, C, and Fortran. "
+ "I didn't enjoy it (although Fortran was much better than expected—prefered to C). "
+ "I would like to learn Rust to replace the latter two, and also Lean for formal verification of mathematics and programs. "
+ "Julia as a scripting language is also intriguing, for projects consumed by people allergic to parentheses. "
+ "Software that is not " ,(hyperlink "https://gnu.org/philosophy" "Free") " might as well not be software at all. "
+ "I use GNU Emacs for almost everything.")
+ (h2 "Engineering")
+ (p "For all of the above, you have to build real, material things. "
+ "Physical science requires the construction of detectors, accelerators, and whatnot; "
+ "mathematics needs blackboards, chalk, printing presses, and a society to ignore; "
+ "and computation needs computers and network technology. "
+ "This is predominantly electrical work—designing silicon, circuits, wire protocols, radios, and so on. "
+ "I've done a fair bit of this. "
+ "However, that electrical work is predicated on things like power generation, structures to protect the electronics, etc. "
+ "So, I aspire to learn \"real\" CAD at some point, and understand these things too. ")
+ (h2 "Praxeology")
+ (p "There simply is not enough time in a person's life for autarkic, first-principles generation of every part of every thing "
+ "one's primary interests depend on. "
+ "It is critically important to understand and verify those steps, but it is necessary to outsource their production. "
+ "In order to understand the principles under which this outsourcing occurs, why it's even possible at all, "
+ "and how it need not be vicious, one must study the category of action. "
+ "Austrian economics, and more generally praxeology, does so correctly. "
+ "The critical error of conventional economics, as with many social- and life-science disciplines, "
+ "is thoughtless application of the methods of physical science, without careful consideration of whether the philosophical "
+ "conditions the correctness of those methods depend are present. "
+ "These fail spectacularly in analysis of action: the wants and desires of humans are not immutable, comparable quantities. "
+ "However, Austrian economists tend to thoughtlessly reject methodological precision due to superficial association "
+ "with these historical fallacies. "
+ "A mathematical, in the truest sense, grounding for the reasoning of Mises, Rothbard, and Hoppe "
+ "is a longstanding pet project of mine. ")
+ (h2 "Foundations: Philosophy and Theology")
+ (p "All of this again rests on some foundational definitions and propositions about the nature of reality, truth, reason, mind, "
+ "beauty, and morality. "
+ "Very recently, I've become acutely interested in these foundations, particularly the philosophy of mathematics and science. "
+ "I am metaphysically an ardent platonist, and believe that analysis of the problem of perception in a platonist context "
+ "contains parts identifiable with mathematics and science. "
+ "This analysis, however, carries little further: I am attracted to methodological anarchy, which holds "
+ "that there is no essential distinction between practice, philosophy, teaching, and history of science (and mathematics)."
+ "Anything and everything there is fair game—and many scientific revolutions are the result of such foundational assaults.")
+ (p "That the philosophical tradition which created the modern world emerged almost exclusively out of Abrahamic religion, "
+ "and that its sustaining manifestation is almost exclusively owed to Protestant Christians, carries tremedous weight with me."
+ " I see no essential difference between these theological premises and philosophy, save methodology—"
+ "the former implemented in story, and the latter rhetoric—and accordingly extend foundational interest to Christiandom.")
+ (h2 "Blind Spots")
+ (p "I don't know much about linguistics and aesthetics/art (save the mere verneer to which all men are exposed). "
+ "These are similarly foundational, as philosophy can only be communicated through language, and must be bootstrapped "
+ "by the beautiful (usually stories). "
+ "I would like to learn these things, but am not taking active measures in any capacity to do so at the moment.")
+ (h1 "Anti-Interests")
+ (p "I dislike: OOP, Javascript, the Intel Management Engine, almost all TV and movies, number theory, measure theory, "
+ "drugs, the War on Drugs, appeals to authority, the Federal Reserve System, occupational licensure, and collectivism.")
+ (h1 "Touching Grass")
+ (p "I listen to (.*)core, rock and metal from the 60s–80s, microtonal and avant-garde jazz and classical, and old standards. "
+ "I all-too-seldom go outside: when I remember I enjoy it, I resistance train, hike, (spin|fly) fish, (snow|water) ski, "
+ "climb, and mountaineer. "
+ "I read high fantasy and sci-fi obsessively for about 10 years, and occasionally go back through "
+ "the Tolkein, Jordan, and Sanderson novels I love. "
+ "I watch a lot of football and baseball; my Tigers picked up a ring in each while I was there."))))
+
+
+(define (me-page site posts)
+ (make-page "/pages/me.html"
+ (base-template site me #:title "Me")
+ sxml->html))
+
+(define friends
+ `((h1 "Friends")
+ (p "Blogs/websites of people and corporations I know firsthand, as friends, colleagues, or employers. ")
+ (table
+ (tbody
+ (tr (td ,(hyperlink "https://atlantis-industries.com" "Atlantis Industries")) (td "Worked on retainer with them for a year."))
+ (tr (td ,(hyperlink "https://spartanphysics.com/" "SpaRTAN Physics")) (td "Lab I spent half my undergrad in."))
+ (tr (td ,(hyperlink "https://www.lsu.edu/physics/people/faculty/chancellor.php" "Jeff Chancellor"))
+ (td "My undergrad advisor, founder and CTO of Atlantis and director of SpaRTAN Physics."))))))
+
+(define (friends-page site posts)
+ (make-page "/pages/friends.html"
+ (base-template site friends #:title "Friends")
+ sxml->html))
+
+(define influences
+ `((h1 "Influences")
+ (p "Anything and everything I can think of that's affected how I think. ")
+ (h2 "Blogs")
+ (h2 "Books and Monographs")
+ (h2 "Scholarly Articles")
+ (h2 "Videos and Talks")))
+
+(define (influences-page site posts)
+ (make-page "/pages/influences.html"
+ (base-template site influences #:title "Influences")
+ sxml->html))
diff --git a/dnw/tags.scm b/dnw/tags.scm
new file mode 100644
index 0000000..0c00354
--- /dev/null
+++ b/dnw/tags.scm
@@ -0,0 +1,65 @@
+
+(define-module (dnw tags)
+ #:use-module (dnw theme)
+ #:use-module (haunt post)
+ #:use-module (srfi srfi-1)
+ #:use-module (haunt html)
+ #:use-module (haunt post)
+ #:use-module (haunt page)
+ #:use-module (haunt utils)
+ #:use-module (ice-9 match)
+ #:export (group-by-tag
+ count-tags
+ tag-uri
+ tags->page
+ tag-description
+ desc-alist))
+
+(define (group-by-tag posts)
+ "Given a lisp of haunt posts generate a list grouping tags with the
+posts associated with it."
+ (let ((table (make-hash-table)))
+ (for-each (lambda (post)
+ (let ((tags (post-ref post 'tags)))
+ (for-each (lambda (tag)
+ (let ((current (hash-ref table tag)))
+ (if current
+ (hash-set! table tag (cons post current))
+ (hash-set! table tag (list post)))))
+ tags)))
+ posts)
+ (hash-fold alist-cons '() table)))
+
+
+(define (count-tags posts)
+ "Return a list of tags associated with their count in descending
+order."
+ (sort (map (lambda (tag)
+ (list (car tag) (length (cdr tag))))
+ (group-by-tag posts))
+ (lambda (a b) (> (cadr a) (cadr b)))))
+
+
+(define (tag-uri tag)
+ "Given a TAG return the page that contains only posts associated
+with that TAG."
+ (string-append "/posts/tag/" tag ".html"))
+
+
+(define (tags->page site posts)
+ (flat-map (match-lambda
+ ((tag . posts)
+ (make-page (tag-uri tag)
+ (base-template site (tags-template site posts #:title tag)
+ #:title tag)
+ sxml->html)))
+ (group-by-tag posts)))
+
+(define (tag-description tag descalist)
+ (let ((desc (assoc tag descalist)))
+ (if desc
+ `(p ,(cdr desc))
+ '(p "No description."))))
+
+(define desc-alist
+ '(("Test" . "This is a test of the tag description feature.")))
diff --git a/dnw/theme.scm b/dnw/theme.scm
new file mode 100644
index 0000000..69688bc
--- /dev/null
+++ b/dnw/theme.scm
@@ -0,0 +1,127 @@
+
+
+(define-module (dnw theme)
+ #:use-module (ice-9 match)
+ #:use-module (srfi srfi-19)
+ #:use-module (haunt site)
+ #:use-module (haunt post)
+ #:use-module (haunt utils)
+ #:use-module (dnw utils)
+ #:use-module (dnw tags)
+ #:use-module (haunt builder blog)
+ #:export (dnw-haunt-theme
+ base-template
+ post-header
+ tags-template))
+
+(define stylesheets '("style.css"))
+
+(define nav-bar-tabs '(("Me" "/pages/me.html")
+ ("Friends" "/pages/friends.html")
+ ("Influences" "/pages/influences.html")
+ ("Projects" "/posts/tag/Project.html")))
+
+(define dnw-title "Through the Heart of Every Man")
+
+(define header
+ `(header
+ ,(hyperlink "/" (image "combgeo.png" "home"))
+ (h1 ,dnw-title)
+ (nav (ul
+ ,@(map (lambda (tuple)
+ `(li ,(apply hyperlink (reverse tuple))))
+ nav-bar-tabs)))))
+
+(define footer
+ `(footer
+ (div
+ (p "© 2023 Duncan Wilkie")
+ ,(image "by-sa.svg"
+ "Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) Logo"))
+ (p "Unless otherwise specified, the text and images on this site are free culture works available under the "
+ ,(hyperlink "https://creativecommons.org/licenses/by-sa/4.0/"
+ "Creative Commons Attribution Share-Alike 4.0 International")
+ " license.")
+ (p "This website is built with "
+ ,(hyperlink "http://haunt.dthompson.us/" "Haunt")
+ ", a static site generator written in "
+ ,(hyperlink "https://gnu.org/software/guile" "Guile Scheme")
+ ". The source code is available "
+ ,(hyperlink "https://github.com/Antigravityd/functorial.xyz" "here")
+ ".")))
+
+(define* (base-template site body #:key title)
+ `((doctype html)
+ (html (@ (lang "en")))
+ (head
+ ,(if (null? title)
+ `(title title)
+ `(title ,(string-join (list title dnw-title) " — ")))
+ (meta (@ (charset "utf-8")))
+ (meta (@ (name "viewport")
+ (content "width=device-width, initial_scale=1")))
+ ,@(map (lambda (file-name) (stylesheet file-name)) stylesheets)
+ (meta (@ (name "HandheldFriendly") (content "True")))
+ (meta (@ (name "author") (content "Duncan Wilkie")))
+ (meta (@ (name "subject") (content "Ravings of a Madman")))
+ (meta (@ (name "medium") (content "blog")))
+ (meta (@ (name "og:title") (content ,title))))
+ (body (@ (class ""))
+ ,header
+ ,body
+ ,footer)))
+
+(define (post-meta post)
+ `(p ,(let ((tgs (post-ref post 'tags))
+ (datestr (date->string (post-date post) "~e ~B ~Y")))
+ (if tgs
+ `(,(string-append datestr " | ")
+ (span (@ (class "tags"))
+ ,(map (lambda (tag)
+ `(span
+ ,(hyperlink (tag-uri tag) tag)
+ " "))
+ tgs)))
+ datestr))))
+
+(define (post-header site post)
+ `(div (@ (id "post"))
+ (div (@ (class "title"))
+ (h2 ,(hyperlink (post-uri site post)
+ (post-ref post 'title))))
+ (div (@ (class "subtitle"))
+ ,(post-meta post))))
+
+(define (post-template post)
+ `((h1 ,(post-ref post 'title))
+ ,(post-meta post)
+ ,(post-sxml post)))
+
+(define* (tags-template site posts #:key title)
+ `((section (@ (id "posts"))
+ (div (@ (class "container"))
+ (h1 "Tagged #" ,title)
+ ,(tag-description title desc-alist)
+ (div (@ (class "post-listing"))
+ ,(map (lambda (post)
+ (post-header site post))
+ (posts/reverse-chronological posts)))))))
+
+(define (collection-template site title posts prefix)
+ `((section (@ (id "posts"))
+ (div (@ (class "container"))
+ (h1 "All Posts"
+ ,(hyperlink "/feed.xml" (image "rss.png" "RSS Feed Icon" "rss-icon")))
+ (div (@ (class "post-listing"))
+ ,(map (lambda (post) (post-header site post))
+ (posts/reverse-chronological posts)))))))
+
+(define dnw-haunt-theme
+ (theme #:name "Through the Heart of Every Man"
+ #:layout
+ (lambda (site title body)
+ (base-template
+ site body
+ #:title dnw-title))
+ #:post-template post-template
+ #:collection-template collection-template))
diff --git a/dnw/utils.scm b/dnw/utils.scm
new file mode 100644
index 0000000..e25ed97
--- /dev/null
+++ b/dnw/utils.scm
@@ -0,0 +1,37 @@
+
+;; Shameless "borrowing" of SXML conveniences from jakob.space and bendersteed.tech.
+;; A few modifications and a few additions.
+
+(define-module (dnw utils)
+ #:use-module (ice-9 match)
+ #:use-module (srfi srfi-1)
+ #:use-module (haunt site)
+ #:export
+ (hyperlink
+ image
+ stylesheet
+ script
+ post-uri))
+
+(define (hyperlink target text)
+ `(a (@ (href ,target)) ,text))
+
+(define* (image file-name #:optional description class)
+ (let ((src (string-append "/assets/image/" file-name)))
+ (if description
+ (if class
+ `(img (@ (src ,src) (alt ,description) (title ,description) (class ,class)))
+ `(img (@ (src ,src) (alt ,description) (title ,description))))
+ (if class
+ `(img (@ (src ,src) (class ,class)))
+ `(img (@ (src ,src)))))))
+
+(define (stylesheet file-name)
+ `(link (@ (rel "stylesheet") (href ,(format #f "/assets/css/~a" file-name)))))
+
+(define (script file-name)
+ (let ((src (string-append "/assets/js/" file-name)))
+ `(script (@ (src ,src)))))
+
+(define (post-uri site post)
+ (string-append "/posts/" (site-post-slug site post) ".html"))
diff --git a/haunt.scm b/haunt.scm
new file mode 100644
index 0000000..44cfd4d
--- /dev/null
+++ b/haunt.scm
@@ -0,0 +1,45 @@
+;; The main Haunt entry-point for my site.
+
+(use-modules (haunt site)
+ (haunt post)
+ (haunt asset)
+ (haunt reader)
+ (haunt builder blog)
+ (haunt builder atom)
+ (haunt builder assets)
+ (haunt publisher rsync)
+ (dnw theme)
+ (dnw tags)
+ (dnw static-pages)
+ (srfi srfi-19)
+ (srfi srfi-26))
+
+
+(define (org-string->date str)
+ "Convert STR, a string in Org format, into a SRFI-19 date object."
+ (catch 'misc-error
+ (lambda () (string->date str "<~Y-~m-~d ~a ~H:~M>"))
+ (lambda (key . parameters) (string->date str "<~Y-~m-~d ~a>"))))
+
+(register-metadata-parser! 'date org-string->date)
+
+(site #:title "Through the Heart of Every Man"
+ #:domain "functorial.xyz"
+ #:default-metadata
+ '((author . "Duncan Wilkie")
+ (email . "dnw@functorial.xyz"))
+ #:readers (list html-reader)
+ #:builders (list (blog
+ #:theme dnw-haunt-theme
+ #:prefix "/posts")
+ index-page
+ me-page
+ friends-page
+ influences-page
+ tags->page
+ (atom-feed #:blog-prefix "/posts")
+ (atom-feeds-by-tag)
+ (static-directory "assets"))
+ #:publishers (list (rsync-publisher #:destination "/var/www/functorial"
+ #:user "publish"
+ #:host "functorial.xyz")))
diff --git a/org/test.org b/org/test.org
new file mode 100644
index 0000000..cc586c5
--- /dev/null
+++ b/org/test.org
@@ -0,0 +1,19 @@
+# -*- after-save-hook: (ox-haunt-export-to-html); -*-
+
+#+TITLE: Building a Site with Haunt
+#+TAGS: Programming, Lisp, Web, Emacs, Org
+#+DATE: <2023-06-23 Fri>
+
+Hello! This is my first post on this website, which I've created over the last several days with the static site generator [[https:dthompson.us/projects/haunt][Haunt]]. It's my first time really delving into Web tech; I think for pedagogical purposes it was a really effective choice: I know Scheme already from reading SICP and my use of Guix, and Haunt is sufficiently minimal, low-level, and little-used that I learn a good bit of HTML syntax and have to style things with CSS. Conversely, it does enough that it'll be really easy to maintain once up-and-running with it, much moreso than writing bare HTML.
+
+* An Overview of Haunt
+
+Haunt, fundamentally, views websites as programs (according to the manual). The actual facts on the ground are a little rockier: the documentation hasn't been updated in a /long/ time, and there are undocumented releases on the git repository with extensive, new convenience featues that seem very basic. The fundamental object is the =site=: a record containing all of the top-level information about the website. Among them are a list of "builder" procedures which synthesize individual pages of the website from input, Scheme code, and external files. The outputs of these builders are "page" objects (something which the command line tells me is deprecated in favor of "serialized-artifacts," which aren't documented anywhere), which are copied into the output directory. There are also "readers," which take as input "posts," blog posts written in a sensible markup format, and output pages representing the posts, alongside corresponding modifications to the site to present a correct aggregation of those posts. Useful, and only in the latest v0.3.0 release, is the =publisher= argument, which takes a description of how to copy all output pages to a remote. The only method currently is rsync, but that's all that's much better than nothing.
+
+The CLI is bare: =haunt build= to produce output pages, =haunt serve= to pop the output on localhost:8080 (with =--watch= to refresh on file changes), and =haunt publish= to run the publisher on what's been =haunt build='ed most recently.
+
+Styling is manual, with CSS, unless you would like to build CSS inline style propagation logic into SHTML and rewrite all the Haunt default logic to use it (good idea!). If you decide to also use Haunt, be sure to
+
+* What I'm Doing With This Site
+
+Succinctly, writing about anything and everything which takes my fancy. Some of it may not be for you; I will likely write a fair bit about libertarian politics and Christianity. But that should be orthogonal to the rest of it. Take what you like, and leave the rest.
diff --git a/posts/test.html b/posts/test.html
new file mode 100644
index 0000000..6304857
--- /dev/null
+++ b/posts/test.html
@@ -0,0 +1,42 @@
+title: Building a Site with Haunt
+date: <2023-06-23 Fri>
+tags: Programming, Lisp, Web, Emacs, Org
+---
+<div id="table-of-contents" role="doc-toc">
+<h2>Table of Contents</h2>
+<div id="text-table-of-contents" role="doc-toc">
+<ul>
+<li><a href="#org8ccaa76">1. An Overview of Haunt</a></li>
+<li><a href="#org0a85fbd">2. What I'm Doing With This Site</a></li>
+</ul>
+</div>
+</div>
+<p>
+Hello! This is my first post on this website, which I've created over the last several days with the static site generator <a href="https:dthompson.us/projects/haunt">Haunt</a>. It's my first time really delving into Web tech; I think for pedagogical purposes it was a really effective choice: I know Scheme already from reading SICP and my use of Guix, and Haunt is sufficiently minimal, low-level, and little-used that I learn a good bit of HTML syntax and have to style things with CSS. Conversely, it does enough that it'll be really easy to maintain once up-and-running with it, much moreso than writing bare HTML.
+</p>
+
+<div id="outline-container-org8ccaa76" class="outline-2">
+<h2 id="org8ccaa76"><span class="section-number-2">1.</span> An Overview of Haunt</h2>
+<div class="outline-text-2" id="text-1">
+<p>
+Haunt, fundamentally, views websites as programs (according to the manual). The actual facts on the ground are a little rockier: the documentation hasn't been updated in a <i>long</i> time, and there are undocumented releases on the git repository with extensive, new convenience featues that seem very basic. The fundamental object is the <code>site</code>: a record containing all of the top-level information about the website. Among them are a list of "builder" procedures which synthesize individual pages of the website from input, Scheme code, and external files. The outputs of these builders are "page" objects (something which the command line tells me is deprecated in favor of "serialized-artifacts," which aren't documented anywhere), which are copied into the output directory. There are also "readers," which take as input "posts," blog posts written in a sensible markup format, and output pages representing the posts, alongside corresponding modifications to the site to present a correct aggregation of those posts. Useful, and only in the latest v0.3.0 release, is the <code>publisher</code> argument, which takes a description of how to copy all output pages to a remote. The only method currently is rsync, but that's all that's much better than nothing.
+</p>
+
+<p>
+The CLI is bare: <code>haunt build</code> to produce output pages, <code>haunt serve</code> to pop the output on localhost:8080 (with <code>--watch</code> to refresh on file changes), and <code>haunt publish</code> to run the publisher on what's been <code>haunt build</code>'ed most recently.
+</p>
+
+<p>
+Styling is manual, with CSS, unless you would like to build CSS inline style propagation logic into SHTML and rewrite all the Haunt default logic to use it (good idea!). If you decide to also use Haunt, be sure to
+</p>
+</div>
+</div>
+
+<div id="outline-container-org0a85fbd" class="outline-2">
+<h2 id="org0a85fbd"><span class="section-number-2">2.</span> What I'm Doing With This Site</h2>
+<div class="outline-text-2" id="text-2">
+<p>
+Succinctly, writing about anything and everything which takes my fancy. Some of it may not be for you; I will likely write a fair bit about libertarian politics and Christianity. But that should be orthogonal to the rest of it. Take what you like, and leave the rest.
+</p>
+</div>
+</div>
diff --git a/posts/test.html~ b/posts/test.html~
new file mode 100644
index 0000000..c992573
--- /dev/null
+++ b/posts/test.html~
@@ -0,0 +1,42 @@
+title: Building a Site with Haunt
+date: <2023-06-23 Fri>
+tags: Programming, Lisp, Web, Emacs, Org
+---
+<div id="table-of-contents" role="doc-toc">
+<h2>Table of Contents</h2>
+<div id="text-table-of-contents" role="doc-toc">
+<ul>
+<li><a href="#org20e7ea5">1. An Overview of Haunt</a></li>
+<li><a href="#org0bd00ee">2. What I'm Doing With This Site</a></li>
+</ul>
+</div>
+</div>
+<p>
+Hello! This is my first post on this website, which I've created over the last several days with the static site generator <a href="https:dthompson.us/projects/haunt">Haunt</a>. It's my first time really delving into Web tech; I think for pedagogical purposes it was a really effective choice: I know Scheme already from reading SICP and my use of Guix, and Haunt is sufficiently minimal, low-level, and little-used that I learn a good bit of HTML syntax and have to style things with CSS. Conversely, it does enough that it'll be really easy to maintain once up-and-running with it, much moreso than writing bare HTML.
+</p>
+
+<div id="outline-container-org20e7ea5" class="outline-2">
+<h2 id="org20e7ea5"><span class="section-number-2">1.</span> An Overview of Haunt</h2>
+<div class="outline-text-2" id="text-1">
+<p>
+Haunt, fundamentally, views websites as programs (according to the manual). The actual facts on the ground are a little rockier: the documentation hasn't been updated in a <i>long</i> time, and there are undocumented releases on the git repository with extensive, new convenience featues that seem very basic. The fundamental object is the <code>site</code>: a record containing all of the top-level information about the website. Among them are a list of "builder" procedures which synthesize individual pages of the website from input, Scheme code, and external files. The outputs of these builders are "page" objects (something which the command line tells me is deprecated in favor of "serialized-artifacts," which aren't documented anywhere), which are copied into the output directory. There are also "readers," which take as input "posts," blog posts written in a sensible markup format, and output pages representing the posts, alongside corresponding modifications to the site to present a correct aggregation of those posts. Useful, and only in the latest v0.3.0 release, is the <code>publisher</code> argument, which takes a description of how to copy all output pages to a remote. The only method currently is rsync, but that's all that's much better than nothing.
+</p>
+
+<p>
+The CLI is bare: <code>haunt build</code> to produce output pages, <code>haunt serve</code> to pop the output on localhost:8080 (with <code>--watch</code> to refresh on file changes), and <code>haunt publish</code> to run the publisher on what's been <code>haunt build</code>'ed most recently.
+</p>
+
+<p>
+Styling is manual, with CSS, unless you would like to build CSS inline style propagation logic into SHTML and rewrite all the Haunt default logic to use it (good idea!).
+</p>
+</div>
+</div>
+
+<div id="outline-container-org0bd00ee" class="outline-2">
+<h2 id="org0bd00ee"><span class="section-number-2">2.</span> What I'm Doing With This Site</h2>
+<div class="outline-text-2" id="text-2">
+<p>
+Succinctly, writing about anything and everything which takes my fancy. Some of it may not be for you; I will likely write a fair bit about libertarian politics and Christianity. But that should be orthogonal to the rest of it. Take what you like, and leave the rest.
+</p>
+</div>
+</div>