.
-[^4]: [Google is defaulting to AI mode for search](https://blog.google/products-and-platforms/products/search/search-io-2026/#powerful-ai)
-
-
diff --git a/content/posts/st_to_ghostty.md b/content/posts/st_to_ghostty.md
deleted file mode 100644
index 786bcab..0000000
--- a/content/posts/st_to_ghostty.md
+++ /dev/null
@@ -1,70 +0,0 @@
----
-title: "Say goodbye to st and say hello to ghostty"
-date: 2025-09-10T23:16:26-04:00
-tags: [software development, linux, tools]
----
-
-{{< callout >}}
-First version of this post was generated with LLMs before manual revision. See [this link](/posts/ai_confession/) for more details.
-{{< /callout >}}
-
-I've been a suckless software user for a long time because the software was superior to a lot of other options out there.
-If you have never experienced the blazing fast speed of `st` opening, you are definitely missing out.
-Sadly it was time for me to leave `st` behind and move on to a new terminal that I think offers a lot of benefits.
-
-## Why I Liked st
-
-- **Speed.** `st` launches instantly
-- **Config as code is cool.** That combined with the patching culture really provides some fun puzzles. Who knew reading your terminal source code to fix a broken patch could be so fun.
-- **DWM swallow patch compatibility.** If you use the swallow patch, st works flawlessly.
-
-## Why I Switched to ghostty
-
-- **Time constraints.** Two kids means no time to debug patches and code when I want modern features like ligatures.
-- **Modern niceties.** Ligatures and images in terminal are supported out of the box. I spent way too long trying to unsuccessfully get sixel support in st.
-- **Cross-platform config.** Same configuration file on both Linux and work Mac. Reduces burden of swapping dev environments.
-- **Swallowing compatibility.** Unlike WezTerm and others, ghostty plays nice with DWM's swallow patch. Since WezTerm uses existing terminals to create new terminals, the process tree for the swallow patch gets messed up. This leads to the wrong terminal windows getting swallowed which is very frustrating.
-- **Fast enough.** Noticeably slower to start than st but faster than everything else I've tried.
-
-
-I definitely think I'm losing cool points by swapping from my handcrafted `st` build, but priorities change and the `ghostty` guy is pretty cool.
-Hopefully this doesn't commence my slide down the slippery slope straight into an Apple Store *shudder*.
-
-```
- ==**=*x=====================ox*=**==xo
- ox==**=*x ox*=**==xo
- ++**+= =+**++
- ==== ~+%$@@@@@@@@@@@@@@$%+~ ====
- ===+ x%@@@@@$$$$$$$$$$$$$$$$@@@@@%x +===
- ===+ +@@@@$$$$$$$$$$$$$$$$$$$$$$$$$$@@@@+ +===
- ++=+ %@@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@@% +=++
- ox== %@@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@@% ==xx
- ==+x x@@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@@x x+==
-xx== %@$$$$@@@@$$$$$$$$$$$$$$$$$$$$@@@@$$$$$$$$$$$$$$@% ==xo
-++++ %@$$$@@+~o=@@@@$$$$$$$$$$$$$$@@+~o*@@@@$$$$$$$$$$$@% ++++
-==+· x@$$$$$ ~*@@@@$$$$$$$$$$% o*@@@@$$$$$$$$@x ·+==
-== @$$$$$$ ~*@@@$$$$$$$% o%@@@$$$$$$@ ==
-== $$$$$$$@=· =$$$$$$$@@= *$$$$$$$ ==
-== ·@$$$$$$$@@@@+ $$$$$$$$$@@@@x $$$$$$@· ==
-== ·@$$$$$$@$x o$$$$$$$@@$x x$$$$$$@· ==
-== ·@$$$$$$ x$@@$$$$$$$$ +$@@$$$$$$@· ==
-== ·@$$$$@$ x%@@@@$$$$$$$$@% x$@@@@$$$$$$$$@· ==
-== ·@$$$$$@$~ x%@@@@$$$$$$$$$$$$$@%· x%@@@@$$$$$$$$$$$$@· ==
-== ·@$$$$$$@@@@@@$$$$$$$$$$$$$$$$$$@@@@@@$$$$$$$$$$$$$$$$@· ==
-== ·@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@· ==
-== ·@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@· ==
-== ·@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@· ==
-== ·@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@· ==
-== ·@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@· ==
-== ·@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@· ==
-== ·@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@· ==
-== ·@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@· ==
-== ~$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$~ ==
-== @@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$@@ ==
-==+· %@@@$$$$$$$$@@@$$$@@@@$$$$$$$$@@@@$$$@@@$$$$$$$$@@@% ·+==
-x+== +$@@@@@@@$+ o%@@@@@@@@*~ =$@@@@@@@$+ ==xx
- ===+ +===
- ==== ==%%++ ++%%== ====
- ++**=***++==%***==++***%**++++*=%**=++==***%==++**%=**++
- x+++==++++ x+++++==++xx ++++++++++
-```
diff --git a/content/posts/thoughts_on_rust.md b/content/posts/thoughts_on_rust.md
index 1e27405..ba70e96 100644
--- a/content/posts/thoughts_on_rust.md
+++ b/content/posts/thoughts_on_rust.md
@@ -1,7 +1,7 @@
---
title: "Rust is pretty good (Short thoughts on Rust)"
date: 2024-04-09T21:31:01-04:00
-tags: ['rust', 'Opinions', 'software development']
+topics: ['rust', 'Opinions', 'software development']
---
In my current position I've had to swap to full time Rust development.
diff --git a/content/posts/tmux_and_nvim.md b/content/posts/tmux_and_nvim.md
index 8b43690..c336f25 100644
--- a/content/posts/tmux_and_nvim.md
+++ b/content/posts/tmux_and_nvim.md
@@ -1,7 +1,7 @@
---
title: "My nvim/tmux workflow"
date: 2024-03-04T21:44:00-05:00
-tags: [software development, neovim, tmux]
+topics: [software development, neovim, tmux]
---
At my previous employment I was forced to use a windows system.
diff --git a/content/posts/upvoters.md b/content/posts/upvoters.md
deleted file mode 100644
index e61232e..0000000
--- a/content/posts/upvoters.md
+++ /dev/null
@@ -1,49 +0,0 @@
----
-title: "Upvoters - Small rust back-end for anonymous likes on static blogs"
-date: 2026-03-21T22:47:50-04:00
-tags: ["Rust", "Hugo", "Web Design", "Self-Host"]
----
-
-## Long Story Short
-
-I wrote a little system called [upvoters](https://github.com/aselimov/upvoters) in Rust to handle anonymous upvotes, and it's compatible with Hugo!
-In fact, you should see a little chevron at the bottom of this post to upvote if you like it.
-Check it out if you need something like it!
-
-## Motivation
-
-I've been working on some website refactors/design changes lately.
-My taste has been influenced recently.
-I may at some point write something about my taste evolution.
-The tl;dr for that article is that I came across an article on [Armin Ronacher's blog](https://lucumr.pocoo.org/about/) and was hugely affected.
-I've been trying to use my little piece of internet land to serve an aesthetic, technical, and minimal blog and his site is what I wish mine was.
-
-While I don't have all of Armin's experience or skills, I thought I could at least try to give off a similar vibe with my own site.
-I use Hugo to generate my static blog, so my first try was searching through existing Hugo themes to get a starting point.
-The rest of the story I think works better as an enumeration:
-
-1. Came across the [hugo-bearcub theme](https://github.com/clente/hugo-bearcub) by clente.
-2. Looked up [Bear Blog](https://bearblog.dev/).
-3. Looked up the creator of Bear Blog, [Herman Martinus](https://herman.bearblog.dev/).
-4. Read through some of his posts and noticed his little anonymous upvote button.
-5. Thought the anonymous upvote button was super cool and wanted my own.
-
-## Upvoters
-
-I then spent a couple hours putting together `upvoters`, a little Rust web server to handle this functionality.
-I picked postgres for the db because I run this site (and a few other services like email, matrix, [forgejo](https://forge.alexselimov.com), etc...) using a VPS that already had a postgres setup.
-Probably could've just done SQLite to make it easier on everyone but didn't think about that until later.
-
-This service just tracks votes in a single table with the following important variables in the schema:
-
-1. `slug`: A unique identifier for each post that is just created from the URL.
-2. `voter_id`: A unique identifier for each voter.
-
-Since this is just a personal blog, and exact upvote count doesn't matter, the `voter_id` is a UUID assigned to each user as a cookie upon the first vote.
-Obviously all it takes to "break" the system is clearing your cookies.
-This would allow you to upvote the same post multiple times but the only risk there is me getting delusions of grandeur.
-
-## Getting started with it
-
-I wrote some instructions in the [upvoters](https://github.com/aselimov/upvoters) readme, but also feel free to email me if you need help setting it up!
-
diff --git a/content/posts/valgrind-artix-linux.md b/content/posts/valgrind-artix-linux.md
index 3d327a1..78443d3 100644
--- a/content/posts/valgrind-artix-linux.md
+++ b/content/posts/valgrind-artix-linux.md
@@ -1,7 +1,7 @@
---
title: "Gettting Valgrind working on Artix Linux"
date: 2023-08-29T21:38:32-04:00
-tags: ['software development', 'linux', 'Artix']
+topics: ['software development', 'linux', 'Artix']
---
I'm currently working on developing an implementation of the Concurrent Atomistic-Continuum method using C++ and CUDA to accelerate calculations.
diff --git a/content/posts/web_obesity.md b/content/posts/web_obesity.md
index d2af9d8..03f75de 100644
--- a/content/posts/web_obesity.md
+++ b/content/posts/web_obesity.md
@@ -2,7 +2,7 @@
title: "Fighting the web obesity crisis using Hugo and Skeleton CSS"
date: 2023-02-12T12:45:48-05:00
toc: true
-tags: ["css","web design","hugo", 'self-host']
+topics: ["css","web design","hugo", 'self-host']
---
diff --git a/content/projects.md b/content/projects.md
deleted file mode 100644
index 6a1d437..0000000
--- a/content/projects.md
+++ /dev/null
@@ -1,19 +0,0 @@
----
-title: "Projects"
-hideDate: true
-hideUpvotes: true
-hideReply: true
----
-
-Here are some of the projects I am working or have worked on:
-
-**Scientific**
-
-- [CAC ← Implementation of the Concurrent Atomistic Continuum method](https://forge.alexselimov.com/aselimov/CAC)
-- [CACmb ← Model builder for CAC (inspired by atomsk)](https://forge.alexselimov.com/aselimov/CACmb)
-
-**Random**
-
-- [neovim configs](https://forge.alexselimov.com/aselimov/neovim)
-- [PaperPicker ← Use local llms to find relevant arxiv papers](https://github.com/aselimov/PaperPicker.git)
-- [upvoters ← Rust backend with postgres to handle anonymous upvotes on this blog](https://forge.alexselimov.com/aselimov/upvoters)
diff --git a/favicon.svg b/favicon.svg
deleted file mode 100644
index 54cfd79..0000000
--- a/favicon.svg
+++ /dev/null
@@ -1,66 +0,0 @@
-
-
-
-
diff --git a/go.mod b/go.mod
deleted file mode 100644
index 0045681..0000000
--- a/go.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-module forge.alexselimov.com/aselimov/AlexSelimov.com
-
-go 1.26.2
-
-require (
- forge.alexselimov.com/aselimov/hugo-bearcub v0.0.0-20260615200242-92ea370e40f3 // indirect
- forge.alexselimov.com/aselimov/hugo-unified-git-activity v0.0.0-20260516002153-e07b96c2faf3 // indirect
-)
diff --git a/go.sum b/go.sum
deleted file mode 100644
index 05158e2..0000000
--- a/go.sum
+++ /dev/null
@@ -1,8 +0,0 @@
-forge.alexselimov.com/aselimov/hugo-bearcub v0.0.0-20260516000128-2c2a275a9564 h1:7RVGiz6nIvTb/ERQ0u9MjTLA/Yq2Xjun1/zZyTbHxMw=
-forge.alexselimov.com/aselimov/hugo-bearcub v0.0.0-20260516000128-2c2a275a9564/go.mod h1:L550lxcgzgIei1w3dKvOTnga43J9NBtkzo7i3wl7chc=
-forge.alexselimov.com/aselimov/hugo-bearcub v0.0.0-20260615194920-3ced4c68855b h1:YPq765quE4Q+nZJ2IEjNXERiQgP4HufL648b5CKi2MQ=
-forge.alexselimov.com/aselimov/hugo-bearcub v0.0.0-20260615194920-3ced4c68855b/go.mod h1:L550lxcgzgIei1w3dKvOTnga43J9NBtkzo7i3wl7chc=
-forge.alexselimov.com/aselimov/hugo-bearcub v0.0.0-20260615200242-92ea370e40f3 h1:Ex9Av1wBpWXRCyYGFdZqBzxuc2In/t27o4kKLSoRckY=
-forge.alexselimov.com/aselimov/hugo-bearcub v0.0.0-20260615200242-92ea370e40f3/go.mod h1:L550lxcgzgIei1w3dKvOTnga43J9NBtkzo7i3wl7chc=
-forge.alexselimov.com/aselimov/hugo-unified-git-activity v0.0.0-20260516002153-e07b96c2faf3 h1:9NkGN2Vz1FtztG3lpb2F+MRv7m72Nzno7kRIMvdyau8=
-forge.alexselimov.com/aselimov/hugo-unified-git-activity v0.0.0-20260516002153-e07b96c2faf3/go.mod h1:YcxJyQNzPOmoJ/9LYHlPrZLVqMI25izS4j+lMqJgXH0=
diff --git a/hugo.toml b/hugo.toml
index a0e5f63..2a85f9b 100644
--- a/hugo.toml
+++ b/hugo.toml
@@ -1,20 +1,17 @@
-baseURL = "https://www.alexselimov.com/"
-languageCode = "en-US"
-theme = "forge.alexselimov.com/aselimov/hugo-bearcub"
-defaultContentLanguage = "en"
-copyright = "© Alex Selimov"
-enableRobotsTXT = true
+baseurl = "https://www.alexselimov.com/"
+languageCode = "en-us"
+theme = "hugo-theme-terminal"
+pagination.pagerSize = 5
-[pagination]
-pagerSize = 10
-
-[markup]
[markup.goldmark.renderer]
unsafe = true
-[markup.highlight]
-lineNos = true
-lineNumbersInTable = false
-noClasses = false
+
+[params]
+contentTypeName = "posts"
+showMenuItems = 5
+postsToShowOnIndex = 3
+fullWidthTheme = false
+centerTheme = true
[taxonomies]
tag = "tags"
@@ -23,53 +20,32 @@ topic = "topics"
[languages]
[languages.en]
title = "Alex Selimov"
-languageName = "en-US"
-languageCode = "en-US"
+subtitle = ""
+keywords = ""
+copyright = "© Alex Selimov"
+
+[languages.en.params]
+menuMore = "Show more"
+readMore = "Read more"
+readOtherPosts = "Read other posts"
+
+[languages.en.params.logo]
+logoText = "Alex Selimov"
+logoHomeLink = "/"
+
[languages.en.menu]
[[languages.en.menu.main]]
-identifier = "home"
-name = "Home"
-url = "/"
-weight = 1
-[[languages.en.menu.main]]
-identifier = "projects"
-name = "Projects"
-url = "/projects/"
-weight = 2
-[[languages.en.menu.main]]
identifier = "about"
-name = "About"
-url = "/about/"
-weight = 3
-
-[params.heatmap]
-caption = "This is my unified git heatmap from my Forgejo and Github"
-color_empty_light = "#e8e4dc"
-color_empty_dark = "#2a2a2a"
-color_max = "#7a5010"
-color_high = "#C47E1A"
-color_mid = "#EF9F27"
-color_low = "#F7C46A"
-[params]
-description = "Alex Selimov personal site and blog."
-title = "Alex Selimov"
-favicon = "favicon.png"
-images = ["og-image.png"]
-dateFormat = "2006-01-02"
-hideUntranslated = false
-themeStyle = "herman"
-generateSocialCard = true
-postsToShowOnIndex = 5
-upvotes = true
-upvoteApi = "https://www.alexselimov.com/api"
-numBest = 5
-
-[params.author]
-name = "Alex Selimov"
-email = "alex@alexselimov.com"
-
-[module]
-[[module.imports]]
-path = 'forge.alexselimov.com/aselimov/hugo-bearcub'
-[[module.imports]]
-path = 'forge.alexselimov.com/aselimov/hugo-unified-git-activity'
+name = "[About Me]"
+url = "/about"
+weight = 10
+[[languages.en.menu.main]]
+identifier = "cv"
+name = "[CV]"
+url = "/cv"
+weight = 10
+[[languages.en.menu.main]]
+identifier = "git"
+name = "[Git]"
+url = "https://forge.alexselimov.com/aselimov"
+weight = 10
diff --git a/layouts/page/presentation.html b/layouts/page/presentation.html
new file mode 100644
index 0000000..9eda755
--- /dev/null
+++ b/layouts/page/presentation.html
@@ -0,0 +1,5 @@
+
diff --git a/layouts/partials/custom_head.html b/layouts/partials/custom_head.html
deleted file mode 100644
index d0d59f9..0000000
--- a/layouts/partials/custom_head.html
+++ /dev/null
@@ -1,4 +0,0 @@
-{{ $autoTheme := resources.Get "auto-theme.css" | minify }}
-
-
-
diff --git a/layouts/shortcodes/callout.html b/layouts/shortcodes/callout.html
deleted file mode 100644
index 03dbc3f..0000000
--- a/layouts/shortcodes/callout.html
+++ /dev/null
@@ -1 +0,0 @@
-{{ .Inner | markdownify }}
diff --git a/layouts/shortcodes/fontawesome.html b/layouts/shortcodes/fontawesome.html
new file mode 100644
index 0000000..7e68a9c
--- /dev/null
+++ b/layouts/shortcodes/fontawesome.html
@@ -0,0 +1 @@
+
diff --git a/layouts/shortcodes/img.html b/layouts/shortcodes/img.html
new file mode 100644
index 0000000..86148b3
--- /dev/null
+++ b/layouts/shortcodes/img.html
@@ -0,0 +1,6 @@
+
+
+
diff --git a/layouts/shortcodes/presentations.html b/layouts/shortcodes/presentations.html
new file mode 100644
index 0000000..9e7e7d8
--- /dev/null
+++ b/layouts/shortcodes/presentations.html
@@ -0,0 +1,6 @@
+
+ {{ range .Site.Data.presentations }}
+ - {{ .authors }} ({{ .date }}) {{ .title }}. {{ .conference }} {{ with .link }}
+ [Link]{{ end }}
+ {{ end }}
+
diff --git a/layouts/shortcodes/publications.html b/layouts/shortcodes/publications.html
new file mode 100644
index 0000000..ce11be6
--- /dev/null
+++ b/layouts/shortcodes/publications.html
@@ -0,0 +1,5 @@
+
+ {{ range .Site.Data.publications }}
+ - {{ .authors }} ({{ .year }}). {{ .title }}. {{ .journal }} {{ .volume }}, {{ .pages }} {{ with .link }} [Link]{{ end }}
+{{ end }}
+
diff --git a/.hugo_build.lock b/layouts/shortcodes/recent-articles.html
similarity index 100%
rename from .hugo_build.lock
rename to layouts/shortcodes/recent-articles.html
diff --git a/scripts/generate_triangulated_mesh.py b/scripts/generate_triangulated_mesh.py
deleted file mode 100644
index fa36ce1..0000000
--- a/scripts/generate_triangulated_mesh.py
+++ /dev/null
@@ -1,235 +0,0 @@
-#!/usr/bin/env python3
-"""Generate a triangulated mesh graphic as an SVG file.
-
-Example:
- python scripts/generate_triangulated_mesh.py --width 1920 --height 1080 --output mesh.svg
-"""
-
-from __future__ import annotations
-
-import argparse
-import math
-import random
-from dataclasses import dataclass
-from pathlib import Path
-
-
-@dataclass(frozen=True)
-class Point:
- x: float
- y: float
-
-
-def clamp(value: float, low: float, high: float) -> float:
- return max(low, min(high, value))
-
-
-def parse_args() -> argparse.Namespace:
- parser = argparse.ArgumentParser(description="Generate a triangulated mesh SVG.")
- parser.add_argument("--width", type=int, required=True, help="Graphic width in pixels.")
- parser.add_argument("--height", type=int, required=True, help="Graphic height in pixels.")
- parser.add_argument(
- "--output",
- type=Path,
- default=Path("triangulated-mesh.svg"),
- help="Output SVG path (default: triangulated-mesh.svg)",
- )
- parser.add_argument(
- "--cell-size",
- type=float,
- default=120.0,
- help="Approximate grid cell size in pixels when x/y step are not set.",
- )
- parser.add_argument(
- "--x-step",
- type=float,
- default=None,
- help="Horizontal point spacing in pixels (overrides --cell-size on x-axis).",
- )
- parser.add_argument(
- "--y-step",
- type=float,
- default=None,
- help="Vertical point spacing in pixels (overrides --cell-size on y-axis).",
- )
- parser.add_argument(
- "--jitter",
- type=float,
- default=0.35,
- help="Point jitter amount as a fraction of cell size (0.0-0.5).",
- )
- parser.add_argument(
- "--seed",
- type=int,
- default=None,
- help="Random seed for reproducible output.",
- )
- parser.add_argument(
- "--stroke",
- type=float,
- default=1.25,
- help="Edge stroke width in pixels.",
- )
- parser.add_argument(
- "--dot-radius",
- type=float,
- default=1.9,
- help="Vertex dot radius in pixels.",
- )
- parser.add_argument(
- "--line-color",
- type=str,
- default="#334155",
- help="Edge color as hex (default: #334155).",
- )
- parser.add_argument(
- "--dot-color",
- type=str,
- default="#0f172a",
- help="Dot color as hex (default: #0f172a).",
- )
- parser.add_argument(
- "--background",
- type=str,
- default="#f8fafc",
- help="Background color as hex (default: #f8fafc).",
- )
- return parser.parse_args()
-
-
-def build_points(
- width: int,
- height: int,
- x_step: float,
- y_step: float,
- jitter_frac: float,
- rng: random.Random,
-) -> list[list[Point]]:
- cols = max(2, math.ceil(width / x_step) + 1)
- rows = max(2, math.ceil(height / y_step) + 1)
-
- points: list[list[Point]] = []
- jitter = clamp(jitter_frac, 0.0, 0.5) * min(x_step, y_step)
-
- for row in range(rows):
- y = (height * row) / (rows - 1)
- row_points: list[Point] = []
- for col in range(cols):
- x = (width * col) / (cols - 1)
-
- # Keep border anchored to make the mesh fill the canvas cleanly.
- if 0 < row < rows - 1 and 0 < col < cols - 1:
- x += rng.uniform(-jitter, jitter)
- y_jittered = y + rng.uniform(-jitter, jitter)
- else:
- y_jittered = y
-
- row_points.append(Point(x=clamp(x, 0.0, float(width)), y=clamp(y_jittered, 0.0, float(height))))
- points.append(row_points)
-
- return points
-
-
-def generate_triangles(points: list[list[Point]], rng: random.Random) -> list[tuple[Point, Point, Point]]:
- triangles: list[tuple[Point, Point, Point]] = []
- rows = len(points)
- cols = len(points[0]) if rows else 0
-
- for row in range(rows - 1):
- for col in range(cols - 1):
- p00 = points[row][col]
- p10 = points[row][col + 1]
- p01 = points[row + 1][col]
- p11 = points[row + 1][col + 1]
-
- if rng.random() < 0.5:
- triangles.append((p00, p10, p11))
- triangles.append((p00, p11, p01))
- else:
- triangles.append((p00, p10, p01))
- triangles.append((p10, p11, p01))
-
- return triangles
-
-
-def svg_polygon(points: tuple[Point, Point, Point], stroke: str, stroke_width: float) -> str:
- pts = " ".join(f"{p.x:.2f},{p.y:.2f}" for p in points)
- return (
- f''
- )
-
-
-def write_svg(
- width: int,
- height: int,
- triangles: list[tuple[Point, Point, Point]],
- stroke_width: float,
- dot_radius: float,
- line_color: str,
- dot_color: str,
- background: str,
- output: Path,
- points: list[list[Point]],
-) -> None:
- elements: list[str] = []
-
- for tri in triangles:
- elements.append(svg_polygon(tri, stroke=line_color, stroke_width=stroke_width))
-
- circles: list[str] = []
- for row in points:
- for p in row:
- circles.append(f'')
-
- svg = "\n".join(
- [
- '',
- f'",
- ]
- )
-
- output.parent.mkdir(parents=True, exist_ok=True)
- output.write_text(svg, encoding="utf-8")
-
-
-def main() -> None:
- args = parse_args()
-
- if args.width <= 0 or args.height <= 0:
- raise SystemExit("--width and --height must be positive integers")
-
- if args.cell_size <= 1:
- raise SystemExit("--cell-size must be > 1")
-
- x_step = args.x_step if args.x_step is not None else args.cell_size
- y_step = args.y_step if args.y_step is not None else args.cell_size
-
- if x_step <= 1 or y_step <= 1:
- raise SystemExit("--x-step and --y-step must be > 1")
-
- rng = random.Random(args.seed)
- points = build_points(args.width, args.height, x_step, y_step, args.jitter, rng)
- triangles = generate_triangles(points, rng)
- write_svg(
- args.width,
- args.height,
- triangles,
- args.stroke,
- args.dot_radius,
- args.line_color,
- args.dot_color,
- args.background,
- args.output,
- points,
- )
-
- print(f"Generated {len(triangles)} triangles -> {args.output}")
-
-
-if __name__ == "__main__":
- main()
diff --git a/static/favicon.png b/static/favicon.png
index f6b7405..3d9a71a 100644
Binary files a/static/favicon.png and b/static/favicon.png differ
diff --git a/static/profile.webp b/static/profile.webp
deleted file mode 100644
index e46ba1b..0000000
Binary files a/static/profile.webp and /dev/null differ
diff --git a/static/public.key b/static/public.key
deleted file mode 100644
index 4af9c07..0000000
--- a/static/public.key
+++ /dev/null
@@ -1,41 +0,0 @@
------BEGIN PGP PUBLIC KEY BLOCK-----
-
-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
-oOzx0x0y7ELQVGJVtpxqVxLcA58xJCE34I+h
-=5X5g
------END PGP PUBLIC KEY BLOCK-----
diff --git a/static/terminal.css b/static/terminal.css
index d31310d..619e112 100644
--- a/static/terminal.css
+++ b/static/terminal.css
@@ -1,5 +1,5 @@
:root {
--background: #191919;
--foreground: #eceae5;
- --accent: #EF9F27;
+ --accent: #88ae68;
}
diff --git a/themes/hugo-bearcub b/themes/hugo-bearcub
deleted file mode 160000
index 17c78a6..0000000
--- a/themes/hugo-bearcub
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 17c78a6bcdc956b4cb720bcf23ef483d3f416a62
diff --git a/themes/hugo-theme-terminal b/themes/hugo-theme-terminal
new file mode 160000
index 0000000..4e2b017
--- /dev/null
+++ b/themes/hugo-theme-terminal
@@ -0,0 +1 @@
+Subproject commit 4e2b01779a5d2cc1b869c6bce1edf4676a4684b9