summaryrefslogtreecommitdiff
path: root/src/operationnull
diff options
context:
space:
mode:
authorbdunahu <bdunahu@operationnull.com>2026-08-21 20:54:39 -0400
committerbdunahu <bdunahu@operationnull.com>2026-08-21 21:04:14 -0400
commit30731133aff475f100cea7fac18017505a400c38 (patch)
treecdc2ae3deccd2eba960889288f0743ef12dabb94 /src/operationnull
parent959447a73ef7bd79b12dcf259ee8c3c1941f10df (diff)
Move contact, blog to index. Rewrite index, structural changes.HEADmaster
Diffstat (limited to 'src/operationnull')
-rw-r--r--src/operationnull/index.scm104
-rw-r--r--src/operationnull/pages.scm161
-rw-r--r--src/operationnull/site.scm7
-rw-r--r--src/operationnull/theme.scm69
-rw-r--r--src/operationnull/utils.scm14
5 files changed, 168 insertions, 187 deletions
diff --git a/src/operationnull/index.scm b/src/operationnull/index.scm
new file mode 100644
index 0000000..3c9e673
--- /dev/null
+++ b/src/operationnull/index.scm
@@ -0,0 +1,104 @@
+;; SPDX-License-Identifier: CC-BY-SA-4.0
+;; Copyright 2026 bdunahu <bdunahu@operationnull.com>
+(define-module (operationnull index)
+ #:use-module (srfi srfi-19)
+ #:use-module (haunt builder blog)
+ #:use-module (haunt html)
+ #:use-module (haunt page)
+ #:use-module (haunt post)
+ #:use-module (haunt utils)
+ #:use-module (operationnull utils)
+ #:use-module (operationnull theme)
+ #:export (index-page))
+
+(define %about
+ `(div (h1 "Hello!")
+ (div (@ (class "c"))
+ (p "My name is Benjamin (often 'bdunahu'), and this is my
+personal site!")
+ (p "I obtained my masters at the "
+ (a (@ (href "https://www.cics.umass.edu/"))
+ "University of Massachusetts Amherst")
+ ", where I studied computer science. I now do security scanning on
+Linux-based operating systems. I am part of the "
+ (a (@ (href "https://github.com/umacabal/umaring"))
+ "umass webring")
+ ". Try it and pretend the majority of the internet doesn't
+exist!"))))
+
+(define %contact
+ `(div (h2 "Contact")
+ (div (@ (class "c"))
+ (p "I don't mind real humans contacting me:")
+ (ul (@ (class "ul-nb"))
+ (li (b "Email: ") "bdunahu @ this domain")
+ (li (b "IRC: ") "@ bdunahu @ libera.chat")
+ (li (b "matrix: ") "@bdunahu:tchncs.de")
+ (li (b "signal: ") "bdunahu.29"))
+ (p "If you want to send an encryped email:")
+ (ul (@ (class "ul-nb"))
+ (li (code "\
+curl -sL https://operationnull.com/assets/bdunahu.pub | gpg --import"))
+ (li "fingerprint "
+ (code "\
+5550 5CA6 9DE5 D342 7F31 F9AE 5F86 6C65 2A34 C996"))))))
+
+(define (make-blog-preview site posts)
+ `(div (h2 "Recent Posts "
+ (a (@ (href "/atom.xml"))
+ (img (@ (class "feed-icon")
+ (src "/assets/feed.png")))))
+ (div (@ (class "c"))
+ (ul (@ (class "ul-nb"))
+ ,(map (lambda (post)
+ (let ((uri (post-uri site post)))
+ `(li (a (@ (href ,uri))
+ ,(post-ref post 'title))
+ " - "
+ ,(date->string (post-date post)
+ "~B ~d, ~Y"))))
+ (take-up-to 5 (posts/reverse-chronological posts))))
+ (a (@ (href "/posts/"))
+ "see all..."))))
+
+(define %extras
+ `(div (h2 "Some stuff I do:")
+ (div (@ (class "c"))
+ (p "I recently did some independent work at the UMass Plasma
+lab related to a specialized python asyncio profiler, similar to the "
+ (a (@ (href "https://github.com/plasma-umass/coz"))
+ "Coz profiler")
+ ", but for the event loop. It worked okay, but required a constant
+workload across the profiling experiments to have actionable results.
+It was still a great learning
+experience!")
+ (p "I previously worked on my own C compiler after working on a
+from-scratch compiler in coursework. I used this second compiler to
+learn the basics of guile scheme. This website is written in scheme;
+and my computing environments are similarly configured using "
+ (a (@ (href "https://guix.gnu.org/"))
+ "GuixSD")
+ ". I started contributing patches and packages. I have a little
+experience with Arch (Parabola) and Debian in maintaining this server.
+Someday, I may host my web, mail, IRC bouncer, etc. with scheme and
+Guix too, but that requires downtime and a lot of work on top of the
+work already put in.")
+ (p "I write, sometimes technical papers for research and classwork, but
+also enjoy creative writing. I try to practice the fiction genre and
+freewrite daily.")
+ (p "I also read a lot of Sword and Sorcery. My favorite series
+is the Morlock Ambrosius series by James Enge. While the protagonists
+in these stories are capable enough of saving the world, what makes it
+interesting is the lack of heroism and the reality that they are their
+own worst enemy, ("
+ (a (@ (href "https://www.oldmoonpublishing.com/evil-honey"))
+ "if not the secondary antagonist")
+ ")."))))
+
+(define (index-content site posts)
+ `(article ,%about ,%contact ,(make-blog-preview site posts) ,%extras))
+
+(define (index-page site posts)
+ (make-page "index.html"
+ (base-template site "home" (index-content site posts))
+ sxml->html))
diff --git a/src/operationnull/pages.scm b/src/operationnull/pages.scm
index dbb7c64..8a1bfe8 100644
--- a/src/operationnull/pages.scm
+++ b/src/operationnull/pages.scm
@@ -1,89 +1,13 @@
;; SPDX-License-Identifier: CC-BY-SA-4.0
;; Copyright 2026 bdunahu <bdunahu@operationnull.com>
(define-module (operationnull pages)
- #:export (index-content
- contact-content
- e404
- gold-content
+ #:use-module (operationnull utils)
+ #:export (e404
recommend-content))
-(define index-content
- '(article (h1 "Hello!")
- (div (@ (class "c"))
- (p "My name is Benjamin (often 'bdunahu'), and this is my
-personal site!")
- (p "I am currently attending my final semester at the "
- (a (@ (href "https://www.cics.umass.edu/"))
- "University of Massachusetts Amherst")
- ", where I am studying computer science. I am part of the "
- (a (@ (href "https://github.com/umacabal/umaring"))
- "umass webring")
- ". Try it and pretend the majority of the internet doesn't
-exist!"))
- (h1 "Some stuff I do:")
- (div (@ (class "c"))
- (p "Some programming, of course; I like experimenting with and
-building tools for existing software.")
- (p "I recently did some independent work at the UMass Plasma
-lab related to a specialized python asyncio profiler. In the case of asyncio,
-developers are in charge of having their tasks share resources. If you make a
-mistake (i.e., by having a task not yield to other tasks), traditional profilers
-may not find it, because they are concerned with ranking code by total execution
-time, not considering the delicate timing between all tasks competing to run on
-the same thread. My profiler 'Nemesis', would randomly select synchronous logic
-to speedup during execution similar to the "
- (a (@ (href "https://github.com/plasma-umass/coz"))
- "Coz profiler")
- " and measure the average latency changes of all other tasks
-to report on real optimization impacts. This worked okay, but was
-limited in usefulness since it required a constant workload across the
-experiments to have actionable results. It was still a great learning
-experience!")
- (p "I previously worked on my own C compiler after working on a
-from-scratch compiler in coursework. I used this second compiler to
-learn the basics of guile scheme. This website is written in scheme;
-and my computing environments are similarly configured using"
- (a (@ (href "https://guix.gnu.org/"))
- "GuixSD")
- ". I recently started contributing patches and packages. I
-have a little experience with Arch (Parabola) and Debian in
-maintaining this server. Someday, I may host my web, mail, IRC
-bouncer, etc. with scheme and Guix too, but that requires downtime and
-a lot of work on top of the work already put in.")
- (p "I write, sometimes technical papers for research
-and classwork, but also enjoy creative writing. I do "
- (a (@ (href "/gold.html"))
- "poetry")
- " occasionally. Though I prefer plot and character
-design (likely cultivated from many hours playing dungeons and
-dragons), and am currently focused on a series of short stories
-featuring a timeline in which the goddess Freya is spiteful in the
-aftermath of the "
- (a (@ (href "https://en.wikipedia.org/wiki/%C3%86sir%E2%80%93Vanir_War"))
- "Aesir-Vanir war")
- ". It's been suggested she's the same seer who was
-mistreated (if that's how you should call burned to death three times)
-by the Aesir due to envy. Since she is essentially traded as a hostage
-to the Aesir in the aftermath of the war, why shouldn't she be using
-her seer magic venomously behind their backs? It's currently set in
-Midgard, Jotunheim, and the passages in-between, following her
-shamelessly unhelpful servants.")
- (p "I also read a lot of Sword and Sorcery. My favorite series
-is the Morlock Ambrosius series by James Enge; but you can read more about
-things I find cool"
- (a (@ (href "/recommend.html"))
- "here")
- ". While the protagonists in these stories are capable enough
-of saving the world, what makes it interesting is the lack of heroism and the
-reality that they are their own worst enemy, ("
- (a (@ (href "https://www.oldmoonpublishing.com/evil-honey"))
- "if not the secondary antagonist")
- ")."))))
-
(define recommend-content
'(article (h1 "Cool Stuff in Categories")
- (p "Limited to 10 or less per category, and ordered alphabetically,
-to make the process easier.")
+ (p "Things I use and recommend.")
(h2 "Books & Series")
(div (@ (class "c"))
(ul (li "Bram Stoker - Dracula")
@@ -100,19 +24,19 @@ to make the process easier.")
))
(h2 "Music")
(div (@ (class "c"))
- (ul ;; (li "Agalloch - She Painted Fire Across The Skyline (Part 2)")
- (li "Blind Guardian - Harvest Of Sorrow")
+ (ul ;
+ (li "Blind Guardian - Fly")
(li "Catamenia - Coldbound")
(li "Dool - Oweynagat")
- ;; (li "Empyrium - The Franconian Woods In Winter's Silence")
- (li "Enshine - Dual Existance")
+ (li "Empyrium - The Franconian Woods In Winter's Silence")
+ ;; (li "Enshine - Dual Existance")
(li "Eternal Tears of Sorrow - The River Flows Frozen")
(li "Evanescence - Imaginary")
- ;; (li "In Flames - Pinball Map")
- ;; (li "Moonspell - Wolfshade")
+ (li "Lunatic Soul - Monsters")
(li "Palmreader - Hold/Release")
- (li "Suldusk - Solus Ipse")
- (li "TOOL - Rosetta Stoned")
+ ;; (li "Osi and the Jupiter - Much Wisdom is Such Grief")
+ (li "Suldusk - Anthesis")
+ ;; (li "TOOL - Rosetta Stoned")
(li "Vylet Pony - The Wallflower Equation")))
(h2 "Software")
(div (@ (class "c"))
@@ -122,71 +46,16 @@ to make the process easier.")
(li "guix")
(li "mpv (media player)")
(li "nsxiv (image viewer)")
- (li "rcirc")
+ (li "rcirc (irc client)")
(li "tor")
(li "yt-dlp")
- (li "zathura (pdf viewer)")))))
-
-(define contact-content
- '(article (h1 "Messengers")
- (div (@ (class "c"))
- (b "IRC: ") "@ bdunahu @ libera.chat"
- (br)
- (b "matrix: ") "@bdunahu:tchncs.de"
- (br)
- (b "signal: ") "bdunahu.29")
- (h1 "Email")
+ (li "zathura (pdf viewer)")))
+ (h2 "Favorite LLM Client?")
(div (@ (class "c"))
- "bdunahu @ this domain"
- (ul (@ (style "font-size: 80%;"))
- (p "If you know how/want to send encrypted email:")
- (ul (code "curl -sL https://operationnull.com/assets/bdunahu.pub | gpg --import")
- (br)
- "Fingerprint: "
- (code "5550 5CA6 9DE5 D342 7F31 F9AE 5F86 6C65 2A34 C996"))))))
+ (p "no. no no no no"))))
(define e404
'(article (h1 "403/404 Error")
(div (@ (class "c"))
(p "The requested page does not exist, or you do not have
access."))))
-
-(define gold-content
- '(article (h1 "Shape God")
- (div (@ (class "date"))
- "Written on Feb 12, 2024, updated June 30th, 2025 by bdunahu")
- (br)
- (div (p (@ (class "verse"))
- "An abiding ash snares its feathered lord;"
- (br)
- "the first bears shelter, the second shadow."
- (br)
- "Darkness thrashes in envy, a callous cord;"
- (br)
- "life seldom slaughters the serf of gallows."
- (br)
- (br)
- "In sacred wellspring bearing a kingdom,"
- (br)
- "lowly ancients bargain poison and vice."
- (br)
- "A madman need savor his wisdom;"
- (br)
- "to take lore for sight is a witless price."
- (br)
- (br)
- "Wanderer impaled by most faithless knife"
- (br)
- "tarnished talons adrift the bleeding red,"
- (br)
- "from the icy fibers of self-suffered life"
- (br)
- "our king --- "
- (i "war-maker! all-hater!")
- " --- has fed."
- (br)
- (br)
- "In burst fetters terror comes to bite,"
- (br)
- "and thus conclude the coward's futile plight."
- (br)))))
diff --git a/src/operationnull/site.scm b/src/operationnull/site.scm
index 203478f..2806d12 100644
--- a/src/operationnull/site.scm
+++ b/src/operationnull/site.scm
@@ -9,13 +9,14 @@
#:use-module (haunt reader)
#:use-module (haunt reader commonmark)
#:use-module (haunt site)
+ #:use-module (operationnull index)
#:use-module (operationnull pages)
#:use-module (operationnull static)
#:use-module (operationnull theme)
#:export (main-site))
(define %blog-collection
- `(("Recent Posts" "/posts/index.html" ,posts/reverse-chronological)))
+ `(("All Posts" "/posts/index.html" ,posts/reverse-chronological)))
(define main-site
(site #:title "operationnull.com"
@@ -25,10 +26,8 @@
#:default-metadata
'((author . "bdunahu"))
#:readers (list commonmark-reader)
- #:builders (list (static-page index-content "index.html" "home")
- (static-page contact-content "/contact.html" "contact")
+ #:builders (list index-page
(static-page e404 "/404.html" "404 Error")
- (static-page gold-content "/gold.html" "Shape God")
(static-page recommend-content "/recommend.html" "cool stuff in categories")
(static-directory "content/assets" "assets")
(blog #:theme main-theme
diff --git a/src/operationnull/theme.scm b/src/operationnull/theme.scm
index 752b9c2..806faec 100644
--- a/src/operationnull/theme.scm
+++ b/src/operationnull/theme.scm
@@ -8,7 +8,9 @@
#:use-module (haunt site)
#:use-module (ice-9 match)
#:use-module (srfi srfi-19)
- #:export (main-theme))
+ #:use-module (operationnull utils)
+ #:export (main-theme
+ base-template))
(define %cc-by-sa-link
'(a (@ (href "https://creativecommons.org/licenses/by-sa/4.0/"))
@@ -21,11 +23,7 @@
(div (@ (class "intro-main"))
(div (@ (class "intro-left"))
(nav
- (div (ul (li (a (@ (href "/contact.html"))
- "contact"))
- (li (a (@ (href "/posts/"))
- "blog"))
- (li (a (@ (href "https://git.operationnull.com/"))
+ (div (ul (li (a (@ (href "https://git.operationnull.com/"))
"git"))
(li (a (@ (href "https://codeberg.org/bdunahu"))
"codeberg"))
@@ -72,34 +70,35 @@
`(link (@ (rel "stylesheet")
(href ,(string-append "/assets/" name ".css")))))
+(define (base-template site title body)
+ `((doctype "html")
+ (head
+ (meta (@ (http-equiv "Content-Type") (content "text/html; charset=UTF-8")))
+ (meta (@ (http-equiv "Content-Language") (content "en")))
+ (meta (@ (name "viewport")
+ (content "width=device-width, initial-scale=1")))
+ (meta (@ (name "description")
+ (content "bdunahu's personal website")))
+ (meta (@ (name "author") (content "bdunahu")))
+ ;; (link (@ (rel "icon")
+ ;; (type "image/x-icon")
+ ;; (href "/assets/favicon.ico")))
+ (title ,(string-append title " — " (site-title site)))
+ ,(stylesheet "site")
+ ,(stylesheet "xtra"))
+ ,%intro
+ (body
+ (div (@ (class "container"))
+ ,body))
+ ,%footer))
+
(define main-theme
(theme #:name "bdunahu"
- #:layout
- (lambda (site title body)
- `((doctype "html")
- (head
- (meta (@ (http-equiv "Content-Type") (content "text/html; charset=UTF-8")))
- (meta (@ (http-equiv "Content-Language") (content "en")))
- (meta (@ (name "viewport")
- (content "width=device-width, initial-scale=1")))
- (meta (@ (name "description")
- (content "bdunahu's personal website")))
- (meta (@ (name "author") (content "bdunahu")))
- ;; (link (@ (rel "icon")
- ;; (type "image/x-icon")
- ;; (href "/assets/favicon.ico")))
- (title ,(string-append title " — " (site-title site)))
- ,(stylesheet "site")
- ,(stylesheet "xtra"))
- ,%intro
- (body
- (div (@ (class "container"))
- ,body))
- ,%footer))
+ #:layout base-template
#:post-template
(lambda (post)
`((article
- (h3 (@ (class "title")),(post-ref post 'title))
+ (h1 (@ (class "title")),(post-ref post 'title))
(div (@ (class "date"))
,(date->string (post-date post)
"created: ~B ~d, ~Y"))
@@ -114,23 +113,19 @@
,(post-sxml post)))))
#:collection-template
(lambda (site title posts prefix)
- (define (post-uri post)
- (string-append prefix "/" (site-post-slug site post) ".html"))
-
- `(article (h2 ,title
+ `(article (h1 ,title
(a (@ (href "/atom.xml"))
(img (@ (class "feed-icon") (src "/assets/feed.png")))))
,(map (lambda (post)
- (let ((uri (post-uri post)))
- `(article (@ (class "summary"))
+ (let ((uri (post-uri site post)))
+ `(div (@ (class "summary"))
(h3 (a (@ (href ,uri))
,(post-ref post 'title)))
(div (@ (class "date"))
,(date->string (post-date post)
"~B ~d, ~Y"))
(div (@ (class "post"))
- ,(first-paragraph post))
- (a (@ (href ,uri)) "more..."))))
+ ,(first-paragraph post)))))
posts)))
#:pagination-template
(lambda (site body previous-page next-page)
diff --git a/src/operationnull/utils.scm b/src/operationnull/utils.scm
new file mode 100644
index 0000000..39889ea
--- /dev/null
+++ b/src/operationnull/utils.scm
@@ -0,0 +1,14 @@
+;; SPDX-License-Identifier: CC-BY-SA-4.0
+;; Copyright 2026 bdunahu <bdunahu@operationnull.com>
+(define-module (operationnull utils)
+ #:use-module (ice-9 ftw)
+ #:use-module (ice-9 regex)
+ #:use-module (srfi srfi-2)
+ #:use-module (haunt site)
+ #:export (post-uri
+ get-art-metadata
+ collect-arts-in))
+
+(define (post-uri site post)
+ (string-append "/posts/" (site-post-slug site post) ".html"))
+