From 24a03827c8e531f0b8ef804511381e7306fd0804 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Sat, 12 Jul 2025 00:24:10 -0400 Subject: [PATCH 01/26] Remove external dependency --- .forgejo/workflows/build_and_deploy_site.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.forgejo/workflows/build_and_deploy_site.yml b/.forgejo/workflows/build_and_deploy_site.yml index 5e26418..1359084 100644 --- a/.forgejo/workflows/build_and_deploy_site.yml +++ b/.forgejo/workflows/build_and_deploy_site.yml @@ -15,11 +15,8 @@ jobs: submodules: true # Fetch Hugo themes (true OR recursive) fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod - - name: Setup Hugo - uses: peaceiris/actions-hugo@v3 - with: - hugo-version: "0.119.0" - # extended: true + - name: Setup + run: apt-get install hugo -y - name: Build run: hugo --minify From da797997c04c4c04044a5a39fb53538510dbd5f1 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Sat, 12 Jul 2025 00:25:32 -0400 Subject: [PATCH 02/26] Downgrade checkout --- .forgejo/workflows/build_and_deploy_site.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/build_and_deploy_site.yml b/.forgejo/workflows/build_and_deploy_site.yml index 1359084..b8e48ce 100644 --- a/.forgejo/workflows/build_and_deploy_site.yml +++ b/.forgejo/workflows/build_and_deploy_site.yml @@ -10,7 +10,7 @@ jobs: deploy: runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v2 with: submodules: true # Fetch Hugo themes (true OR recursive) fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod From ededbf5cfa364bc3c5da81821fc7facb9f1b30cb Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Sat, 12 Jul 2025 00:24:10 -0400 Subject: [PATCH 03/26] Fix issues with workflow syntax --- .forgejo/workflows/build_and_deploy_site.yml | 31 ++++++++++++++++---- .gitmodules | 2 +- .hugo_build.lock | 0 3 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 .hugo_build.lock diff --git a/.forgejo/workflows/build_and_deploy_site.yml b/.forgejo/workflows/build_and_deploy_site.yml index 5e26418..fc92005 100644 --- a/.forgejo/workflows/build_and_deploy_site.yml +++ b/.forgejo/workflows/build_and_deploy_site.yml @@ -16,13 +16,34 @@ jobs: fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod - name: Setup Hugo - uses: peaceiris/actions-hugo@v3 - with: - hugo-version: "0.119.0" - # extended: true + run: | + wget https://github.com/gohugoio/hugo/releases/download/v0.147.8/hugo_0.147.8_linux-amd64.tar.gz + tar -xzf hugo_0.147.8_linux-amd64.tar.gz + chmod +x hugo + mkdir -p ~/bin + mv hugo ~/bin/ + echo "~/bin" >> $GITHUB_PATH - name: Build run: hugo --minify + - name: Setup SSH + run: | + echo "Setting up SSH..." + mkdir -p ~/.ssh + if [ -z "${{ secrets.SSH_PRIVATE_KEY }}" ]; then + echo "ERROR: SSH_PRIVATE_KEY secret is not set!" + exit 1 + fi + echo "SSH_PRIVATE_KEY secret is present" + echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa + chmod 600 ~/.ssh/id_rsa + chmod 700 ~/.ssh + echo "SSH key saved and permissions set" ssh-keyscan -H alexselimov.com >> ~/.ssh/known_hosts + echo "Host key added to known_hosts" + # Test SSH connection + echo "Testing SSH connection..." + ssh -o StrictHostKeyChecking=no -o BatchMode=yes root@alexselimov.com "echo 'SSH connection successful'" || echo "SSH connection failed" + - name: Deploy - run: rsync -azvr public/* root@smokey:/var/www/alexselimov.com/ + run: rsync -azvr public/* root@alexselimov.com:/var/www/alexselimov.com/ diff --git a/.gitmodules b/.gitmodules index f320301..9502d96 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "themes/hugo-theme-terminal"] path = themes/hugo-theme-terminal - url = https://github.com/panr/hugo-theme-terminal.git + url = https://forge.alexselimov.com/aselimov/Terminal-Hugo-Theme.git diff --git a/.hugo_build.lock b/.hugo_build.lock new file mode 100644 index 0000000..e69de29 From 006468e868a86146d504d9cea680880b308f4028 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Mon, 14 Jul 2025 00:37:13 +0000 Subject: [PATCH 04/26] Debian upgrade post --- posts/debian_upgrade.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 posts/debian_upgrade.md diff --git a/posts/debian_upgrade.md b/posts/debian_upgrade.md new file mode 100644 index 0000000..5a27a6c --- /dev/null +++ b/posts/debian_upgrade.md @@ -0,0 +1,21 @@ +--- +title: "The folly of Debian major version upgrades"" +date: 2025-07-13T20:35:50-05:00 +topics: ['git', 'matrix', 'self-host'] + +--- + +I recently realized that my web server was still on Debian Buster, **2 whole major versions behind** the latest Debian version. Normally this kind of thing wouldn't matter to me except that my matrix-synapse server was unable to federate with matrix synapse servers running newer versions. I normally run rolling release distributions on my local machines (I use Void btw) and it had been a long time since I tried this kind of upgrade. I went in hopeful that it would be straightforward. + + **This is a reminder to backup consistently.** + +Of course after thinking everything went fine, I tried to install a new package and libcrypt ends up getting removed leaving me unable to login to my server. Luckily I had backed up before this which saved all of my bespoke configurations. I'm sure no one noticed the down time but I did use this as an opportunity to make the followjng changes: + +- matrix-synapse upgrade to dendrite for better performance. +- Gitea to forgejo just to try something different. +- Properly set up actions to auto build and deploy site on push. +- Rework website and swap to the [terminal hugo theme](https://forge.alexselimov.com/aselimov/Terminal-Hugo-Theme) + +So far, I have positive opinions of all of my changes and highly recommend dendrite and forgejo. + +**Note to self: Never consider it upgrading Debian version. Always structure it as a migration to newer Debian version to avoid downtime** \ No newline at end of file From 669c977ed023c05f2889647d9b15c42772db12e2 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Mon, 14 Jul 2025 00:42:16 +0000 Subject: [PATCH 05/26] Correct path to debian upgrade post --- content/posts/debian_upgrade.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 content/posts/debian_upgrade.md diff --git a/content/posts/debian_upgrade.md b/content/posts/debian_upgrade.md new file mode 100644 index 0000000..e10470c --- /dev/null +++ b/content/posts/debian_upgrade.md @@ -0,0 +1,20 @@ +--- +title: "The folly of Debian major version upgrades" +date: 2025-07-13T20:35:50-05:00 + topics: ['git', 'matrix', 'self-host'] +--- + +I recently realized that my web server was still on Debian Buster, **2 whole major versions behind** the latest Debian version. Normally this kind of thing wouldn't matter to me except that my matrix-synapse server was unable to federate with matrix synapse servers running newer versions. I normally run rolling release distributions on my local machines (I use Void btw) and it had been a long time since I tried this kind of upgrade. I went in hopeful that it would be straightforward. + +**This is a reminder to backup consistently.** + + Of course after thinking everything went fine, I tried to install a new package and libcrypt ends up getting removed leaving me unable to login to my server. Luckily I had backed up before this which saved all of my bespoke configurations. I'm sure no one noticed the down time but I did use this as an opportunity to make the followjng changes: + +- matrix-synapse upgrade to dendrite for better performance. +- Gitea to forgejo just to try something different. +- Properly set up actions to auto build and deploy site on push. +- Rework website and swap to the [terminal hugo theme](https://forge.alexselimov.com/aselimov/Terminal-Hugo-Theme) + +So far, I have positive opinions of all of my changes and highly recommend dendrite and forgejo. + + **Note to self: Never consider it upgrading Debian version. Always structure it as a migration to newer Debian version to avoid downtime** \ No newline at end of file From a367a49a9636413156ce54ef1c6c9fb59a1e1868 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Sun, 13 Jul 2025 21:56:54 -0400 Subject: [PATCH 06/26] Fix various issues and re-style framed banner --- content/_index.md | 17 +++++++------- content/cv.md | 3 +-- content/posts/debian_upgrade.md | 6 ++--- hugo.toml | 29 ++++++++++++++--------- posts/debian_upgrade.md | 21 ----------------- static/public.key | 41 +++++++++++++++++++++++++++++++++ themes/hugo-theme-terminal | 2 +- 7 files changed, 73 insertions(+), 46 deletions(-) delete mode 100644 posts/debian_upgrade.md create mode 100644 static/public.key diff --git a/content/_index.md b/content/_index.md index e26619b..48284a9 100644 --- a/content/_index.md +++ b/content/_index.md @@ -5,14 +5,15 @@ date: 2022-10-03T14:17:10-04:00 layout: index --- +
+     _    _             ____       _ _                      
+    / \  | | _____  __ / ___|  ___| (_)_ __ ___   _____   __
+   / _ \ | |/ _ \ \/ / \___ \ / _ \ | | '_ ` _ \ / _ \ \ / /
+  / ___ \| |  __/>  <   ___) |  __/ | | | | | | | (_) \ V /
+ /_/   \_\_|\___/_/\_\ |____/ \___|_|_|_| |_| |_|\___/ \_/
+
+ + I am a materials scientist and software developer proficient in Rust, Fortran, C++, Java, and Python. I have extensive experience with Unix operating systems on both high performance computing resources and on my personal computer (check out [Void Linux](https://voidlinux.org)). I currently work at [UKG](https://www.ukg.com) as a Java Backend Engineer. -This website is a place for me to post about a range of topics from professional news, to tech tutorials, to recipes I enjoy very much. Checkout some of my recent posts below or find them all organized by tags [here](/posts). - -I also designed and manage a few websites for family members, so check them out: - -[alexanderselimov.com](https://alexanderselimov.com) - -[iberoamericanliterarysociety.com](https://iberoamericanliterarysociety.com) - **Checkout some posts below and thanks for stopping by!** diff --git a/content/cv.md b/content/cv.md index 48a18bf..ea36e8c 100644 --- a/content/cv.md +++ b/content/cv.md @@ -7,9 +7,8 @@ Alex Selimov ================== -**aselimov3@gatech.edu · [https://alexselimov.com](https://alexselimov.com)** +**alex@alexselimov.com · [https://alexselimov.com](https://alexselimov.com)** -[{{< fontawesome class="fa-solid fa-download" >}}PDF version](/AlexSelimovCV.pdf) ## Education - **Georgia Institute of Technology** (North Avenue, Atlanta, GA 30332)\ diff --git a/content/posts/debian_upgrade.md b/content/posts/debian_upgrade.md index e10470c..704bb1d 100644 --- a/content/posts/debian_upgrade.md +++ b/content/posts/debian_upgrade.md @@ -1,7 +1,7 @@ --- title: "The folly of Debian major version upgrades" -date: 2025-07-13T20:35:50-05:00 - topics: ['git', 'matrix', 'self-host'] +date: 2025-07-13T08:35:50-05:00 +topics: ["git", "matrix", "self-host"] --- I recently realized that my web server was still on Debian Buster, **2 whole major versions behind** the latest Debian version. Normally this kind of thing wouldn't matter to me except that my matrix-synapse server was unable to federate with matrix synapse servers running newer versions. I normally run rolling release distributions on my local machines (I use Void btw) and it had been a long time since I tried this kind of upgrade. I went in hopeful that it would be straightforward. @@ -17,4 +17,4 @@ I recently realized that my web server was still on Debian Buster, **2 whole maj So far, I have positive opinions of all of my changes and highly recommend dendrite and forgejo. - **Note to self: Never consider it upgrading Debian version. Always structure it as a migration to newer Debian version to avoid downtime** \ No newline at end of file + **Note to self: Never consider it upgrading Debian version. Always structure it as a migration to newer Debian version to avoid downtime** diff --git a/hugo.toml b/hugo.toml index 2a85f9b..80318f5 100644 --- a/hugo.toml +++ b/hugo.toml @@ -8,7 +8,7 @@ unsafe = true [params] contentTypeName = "posts" -showMenuItems = 5 +showMenuItems = 3 postsToShowOnIndex = 3 fullWidthTheme = false centerTheme = true @@ -18,13 +18,12 @@ tag = "tags" topic = "topics" [languages] -[languages.en] + +[languages.en.params] title = "Alex Selimov" subtitle = "" keywords = "" copyright = "© Alex Selimov" - -[languages.en.params] menuMore = "Show more" readMore = "Read more" readOtherPosts = "Read other posts" @@ -35,17 +34,25 @@ logoHomeLink = "/" [languages.en.menu] [[languages.en.menu.main]] -identifier = "about" -name = "[About Me]" -url = "/about" -weight = 10 -[[languages.en.menu.main]] identifier = "cv" name = "[CV]" url = "/cv" -weight = 10 +weight = 1 [[languages.en.menu.main]] identifier = "git" name = "[Git]" url = "https://forge.alexselimov.com/aselimov" -weight = 10 +weight = 1 +[[languages.en.menu.main]] +identier = "linkedIn" +name = "[LinkedIn]" +url = "https://www.linkedin.com/in/alex-selimov/" +weight = 2 +[[languages.en.menu.main]] +identier = "Scholar" +name = "[Google Scholar]" +url = "https://scholar.google.com/citations?user=w6unVk8AAAAJ&hl=en&oi=ao" +[[languages.en.menu.main]] +identifier = "gpg" +name = "[GPG public key]" +url = "./public.key" diff --git a/posts/debian_upgrade.md b/posts/debian_upgrade.md deleted file mode 100644 index 5a27a6c..0000000 --- a/posts/debian_upgrade.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: "The folly of Debian major version upgrades"" -date: 2025-07-13T20:35:50-05:00 -topics: ['git', 'matrix', 'self-host'] - ---- - -I recently realized that my web server was still on Debian Buster, **2 whole major versions behind** the latest Debian version. Normally this kind of thing wouldn't matter to me except that my matrix-synapse server was unable to federate with matrix synapse servers running newer versions. I normally run rolling release distributions on my local machines (I use Void btw) and it had been a long time since I tried this kind of upgrade. I went in hopeful that it would be straightforward. - - **This is a reminder to backup consistently.** - -Of course after thinking everything went fine, I tried to install a new package and libcrypt ends up getting removed leaving me unable to login to my server. Luckily I had backed up before this which saved all of my bespoke configurations. I'm sure no one noticed the down time but I did use this as an opportunity to make the followjng changes: - -- matrix-synapse upgrade to dendrite for better performance. -- Gitea to forgejo just to try something different. -- Properly set up actions to auto build and deploy site on push. -- Rework website and swap to the [terminal hugo theme](https://forge.alexselimov.com/aselimov/Terminal-Hugo-Theme) - -So far, I have positive opinions of all of my changes and highly recommend dendrite and forgejo. - -**Note to self: Never consider it upgrading Debian version. Always structure it as a migration to newer Debian version to avoid downtime** \ No newline at end of file diff --git a/static/public.key b/static/public.key new file mode 100644 index 0000000..4af9c07 --- /dev/null +++ b/static/public.key @@ -0,0 +1,41 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +oOzx0x0y7ELQVGJVtpxqVxLcA58xJCE34I+h +=5X5g +-----END PGP PUBLIC KEY BLOCK----- diff --git a/themes/hugo-theme-terminal b/themes/hugo-theme-terminal index 4e2b017..7cd0b57 160000 --- a/themes/hugo-theme-terminal +++ b/themes/hugo-theme-terminal @@ -1 +1 @@ -Subproject commit 4e2b01779a5d2cc1b869c6bce1edf4676a4684b9 +Subproject commit 7cd0b57a0276349b9f107afb48f692e72f0d931a From 9b143cf6ceb74ade1716e5f82cb90bbf65ae0230 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Mon, 14 Jul 2025 05:45:10 -0400 Subject: [PATCH 07/26] Update banner --- content/_index.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/content/_index.md b/content/_index.md index 48284a9..5b3d9ee 100644 --- a/content/_index.md +++ b/content/_index.md @@ -16,4 +16,6 @@ layout: index I am a materials scientist and software developer proficient in Rust, Fortran, C++, Java, and Python. I have extensive experience with Unix operating systems on both high performance computing resources and on my personal computer (check out [Void Linux](https://voidlinux.org)). I currently work at [UKG](https://www.ukg.com) as a Java Backend Engineer. -**Checkout some posts below and thanks for stopping by!** +**Checkout recent posts below or posts organized by topic [here](/topics)** + +**Thanks for stopping by!** From 80b2eab45ebde6eaa3010d51b76265d5c2824fa4 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Fri, 1 Aug 2025 23:39:58 +0000 Subject: [PATCH 08/26] Add AI post --- content/posts/misc_thoughts_ai.md | 32 +++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 content/posts/misc_thoughts_ai.md diff --git a/content/posts/misc_thoughts_ai.md b/content/posts/misc_thoughts_ai.md new file mode 100644 index 0000000..ff1b25b --- /dev/null +++ b/content/posts/misc_thoughts_ai.md @@ -0,0 +1,32 @@ +--- +title: "Misc thoughts on AI +date: 2025-08-01T07:36:00-4:00 +topics: ['AI', 'Software development', 'LLMs'] + +--- + +## AI has become a very useful tool for me + +If you know me personally, you know that I've been pretty slow on the LLM/GenAI uptake. At this point, however, if you are a software developer that isn't integrating GenAI tools into your workflow I think you are probably going to be left behind. I've been playing around with these tools a lot more lately and I've come to a few conclusions. + +1. Models that can be run locally (I've used a lot of different Ollama models) are mainly just ok. The best results I've had is with Gemma3:27b on an m4 macbook. Haven't tried qwen3 coder yet. +2. The amazing metrics you see referenced require 100b+ models that are not going to be feasible to run locally for most people. +3. Your application matters a lot. I find that these tools are extremely useful for java spring boot microservices but a lot less useful for scientific projects in Rust. +4. I really enjoy using the expensive LLM tools provided at work and enjoy using the free version of tools less. +5. Claude has given me the best performance so far. + +I'm still debating which subscription to get for personal projects. I know Claude is my favorite, but it's also much more expensive. I also have a newborn right now and not much time for side projects, so I'm delaying the decision. + +## AI has NOT become an irreplaceable tool + +I am not a vibe coder and don't think I will ever give in to the vibes. Even when I prompt claude code to make changes, I always know exactly what I want done and how I want it done. Many times I'll make the changes myself because it's faster than trying to prompt Claude. LLMs have definitely improved my efficiency but I would be fine if all the GPUs in the world suddenly melted down. I'm not a viber for a couple reasons: + +1. I enjoy coding and problem solving. +2. I'm not convinced models are capable enough to be fully trusted. +3. I want to keep my own skillset because the future of AI is uncertain to me + +## How does the economics of AI work? + +From my very limited understanding, the fact that major AI companies are still requiring funding rounds indicates that AI is currently not profitable. That makes sense to me since ChatGPT and Claude are available for free even though inference is certainly not free. I think the significant portion of cost is due to model training. It seems like model training costs won't be stopping anytime soon as companies race towards general and then "super" intelligence. I'm not convinced either of those are a given. As a result either prices will have to increase or ads will be introduced to recuperate investor money. I'm also not sure how this applies to providers of open weight models. Those prices can seem more reasonable, but are those subsidized as well? Finally, the current datacenter power consumption for model training seems entirely unsustainable. If I recall correctly, Elon Musk is powering some of his datecenter with a constant flow of diesel fuel jnto generators. The scale of everything at the moment seems to border absurdity. I think we are in for a bumpy ride for the next few years as the impact of GenAI technology and infrastructure works itself out. + +Please let me know if I'm wrong about anything or with better predictions! \ No newline at end of file From 5f2c9d19f7e31323d0ed48cdaa72b9366254a48d Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Fri, 1 Aug 2025 23:44:47 +0000 Subject: [PATCH 09/26] Fix missing quotes --- content/posts/misc_thoughts_ai.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/posts/misc_thoughts_ai.md b/content/posts/misc_thoughts_ai.md index ff1b25b..9a9376f 100644 --- a/content/posts/misc_thoughts_ai.md +++ b/content/posts/misc_thoughts_ai.md @@ -1,5 +1,5 @@ --- -title: "Misc thoughts on AI +title: "Misc thoughts on AI" date: 2025-08-01T07:36:00-4:00 topics: ['AI', 'Software development', 'LLMs'] From 24eb85816fbd0f597004fa3e21d4163764940ca7 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Fri, 1 Aug 2025 23:47:13 +0000 Subject: [PATCH 10/26] Fix date --- content/posts/misc_thoughts_ai.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/posts/misc_thoughts_ai.md b/content/posts/misc_thoughts_ai.md index 9a9376f..0976361 100644 --- a/content/posts/misc_thoughts_ai.md +++ b/content/posts/misc_thoughts_ai.md @@ -1,6 +1,6 @@ --- title: "Misc thoughts on AI" -date: 2025-08-01T07:36:00-4:00 +date: 2025-08-01T07:45:26-04:00 topics: ['AI', 'Software development', 'LLMs'] --- From 3e48d1318864384002b581e5d30e8035b535dc84 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Fri, 1 Aug 2025 23:03:24 -0400 Subject: [PATCH 11/26] Fix typos --- content/posts/misc_thoughts_ai.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/posts/misc_thoughts_ai.md b/content/posts/misc_thoughts_ai.md index 0976361..e3c0415 100644 --- a/content/posts/misc_thoughts_ai.md +++ b/content/posts/misc_thoughts_ai.md @@ -27,6 +27,6 @@ I am not a vibe coder and don't think I will ever give in to the vibes. Even whe ## How does the economics of AI work? -From my very limited understanding, the fact that major AI companies are still requiring funding rounds indicates that AI is currently not profitable. That makes sense to me since ChatGPT and Claude are available for free even though inference is certainly not free. I think the significant portion of cost is due to model training. It seems like model training costs won't be stopping anytime soon as companies race towards general and then "super" intelligence. I'm not convinced either of those are a given. As a result either prices will have to increase or ads will be introduced to recuperate investor money. I'm also not sure how this applies to providers of open weight models. Those prices can seem more reasonable, but are those subsidized as well? Finally, the current datacenter power consumption for model training seems entirely unsustainable. If I recall correctly, Elon Musk is powering some of his datecenter with a constant flow of diesel fuel jnto generators. The scale of everything at the moment seems to border absurdity. I think we are in for a bumpy ride for the next few years as the impact of GenAI technology and infrastructure works itself out. +From my very limited understanding, the fact that major AI companies are still requiring funding rounds indicates that AI is currently not profitable. That makes sense to me since ChatGPT and Claude are available for free even though inference is certainly not free. I think the significant portion of cost is due to model training. It seems like model training costs won't be stopping anytime soon as companies race towards general and then "super" intelligence. I'm not convinced either of those are a given. As a result either prices will have to increase or ads will be introduced to recuperate investor money. I'm also not sure how this applies to providers of open weight models. Those prices can seem more reasonable, but are those subsidized as well? Finally, the current datacenter power consumption for model training seems entirely unsustainable. If I recall correctly, Elon Musk is powering some of his datacenters with a constant flow of diesel fuel into generators because he can't get enough power from the power grid. The scale of everything at the moment seems to border absurdity. I think we are in for a bumpy ride for the next few years as the impact of GenAI technology and infrastructure works itself out. -Please let me know if I'm wrong about anything or with better predictions! \ No newline at end of file +Please let me know if I'm wrong about anything or with better predictions! From 7bb4b03b673f3473e147ff7771f52cd34745dd6f Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Fri, 1 Aug 2025 23:06:13 -0400 Subject: [PATCH 12/26] Fix typos and do one sentence one line --- content/posts/misc_thoughts_ai.md | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/content/posts/misc_thoughts_ai.md b/content/posts/misc_thoughts_ai.md index e3c0415..4139f8c 100644 --- a/content/posts/misc_thoughts_ai.md +++ b/content/posts/misc_thoughts_ai.md @@ -7,7 +7,10 @@ topics: ['AI', 'Software development', 'LLMs'] ## AI has become a very useful tool for me -If you know me personally, you know that I've been pretty slow on the LLM/GenAI uptake. At this point, however, if you are a software developer that isn't integrating GenAI tools into your workflow I think you are probably going to be left behind. I've been playing around with these tools a lot more lately and I've come to a few conclusions. +If you know me personally, you know that I've been pretty slow on the LLM/GenAI uptake. +At this point, however, if you are a software developer that isn't integrating GenAI tools into your workflow I think you are probably going to be left behind. +I've been playing around with these tools a lot more lately, and I've come to a few conclusions. + 1. Models that can be run locally (I've used a lot of different Ollama models) are mainly just ok. The best results I've had is with Gemma3:27b on an m4 macbook. Haven't tried qwen3 coder yet. 2. The amazing metrics you see referenced require 100b+ models that are not going to be feasible to run locally for most people. @@ -15,11 +18,18 @@ If you know me personally, you know that I've been pretty slow on the LLM/GenAI 4. I really enjoy using the expensive LLM tools provided at work and enjoy using the free version of tools less. 5. Claude has given me the best performance so far. -I'm still debating which subscription to get for personal projects. I know Claude is my favorite, but it's also much more expensive. I also have a newborn right now and not much time for side projects, so I'm delaying the decision. +I'm still debating which subscription to get for personal projects. +I know Claude is my favorite, but it's also much more expensive. +I also have a newborn right now and not much time for side projects, so I'm delaying the decision. + ## AI has NOT become an irreplaceable tool -I am not a vibe coder and don't think I will ever give in to the vibes. Even when I prompt claude code to make changes, I always know exactly what I want done and how I want it done. Many times I'll make the changes myself because it's faster than trying to prompt Claude. LLMs have definitely improved my efficiency but I would be fine if all the GPUs in the world suddenly melted down. I'm not a viber for a couple reasons: +I am not a vibe coder and don't think I will ever give in to the vibes. +Even when I prompt claude code to make changes, I always know exactly what I want done and how I want it done. +Many times I'll make the changes myself because it's faster than trying to prompt Claude. +LLMs have definitely improved my efficiency, but I would be fine if all the GPUs in the world suddenly melted down. +I'm not a viber for a couple reasons: 1. I enjoy coding and problem solving. 2. I'm not convinced models are capable enough to be fully trusted. @@ -27,6 +37,17 @@ I am not a vibe coder and don't think I will ever give in to the vibes. Even whe ## How does the economics of AI work? -From my very limited understanding, the fact that major AI companies are still requiring funding rounds indicates that AI is currently not profitable. That makes sense to me since ChatGPT and Claude are available for free even though inference is certainly not free. I think the significant portion of cost is due to model training. It seems like model training costs won't be stopping anytime soon as companies race towards general and then "super" intelligence. I'm not convinced either of those are a given. As a result either prices will have to increase or ads will be introduced to recuperate investor money. I'm also not sure how this applies to providers of open weight models. Those prices can seem more reasonable, but are those subsidized as well? Finally, the current datacenter power consumption for model training seems entirely unsustainable. If I recall correctly, Elon Musk is powering some of his datacenters with a constant flow of diesel fuel into generators because he can't get enough power from the power grid. The scale of everything at the moment seems to border absurdity. I think we are in for a bumpy ride for the next few years as the impact of GenAI technology and infrastructure works itself out. +From my very limited understanding, the fact that major AI companies are still requiring funding rounds indicates that AI is currently not profitable. +That makes sense to me since ChatGPT and Claude are available for free even though inference is certainly not free. +I think the significant portion of cost is due to model training. +It seems like model training costs won't be stopping anytime soon as companies race towards general and then "super" intelligence. +I'm not convinced either of those are a given. +As a result, prices will have to increase or ads will be introduced to recuperate investor money. +I'm also not sure how this applies to providers of open weight models. +Those prices can seem more reasonable, but are those subsidized as well? Finally, the current datacenter power consumption for model training seems entirely unsustainable. +If I recall correctly, Elon Musk is powering some of his datacenters with a constant flow of diesel fuel into generators because he can't get enough power from the power grid. +The scale of everything at the moment seems to border absurdity. +I think we are in for a bumpy ride for the next few years as the impact of GenAI technology and infrastructure works itself out. + Please let me know if I'm wrong about anything or with better predictions! From 4aed6233d252fb1d97e849fde0d349bf77a7e427 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Mon, 25 Aug 2025 14:22:22 -0400 Subject: [PATCH 13/26] Update CV --- content/cv.md | 104 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 62 insertions(+), 42 deletions(-) diff --git a/content/cv.md b/content/cv.md index ea36e8c..1bed2bb 100644 --- a/content/cv.md +++ b/content/cv.md @@ -6,9 +6,70 @@ date: 2022-10-04T23:35:54-04:00 Alex Selimov ================== - **alex@alexselimov.com · [https://alexselimov.com](https://alexselimov.com)** +## Skills + +- Programming Languages: Python, C++, Rust, Java, Fortran, Bash +- Algorithm design, data structure design, runtime complexity analysis +- High Performance Computing: Message Passing Interface (MPI), OpenMP, C++17 parallelism, Rayon, Python multithreading +- Proficient in Linux environments on desktop, personal server, and computing cluster architectures. +- Knowledge of product development tools such as git, Docker, CI/CD pipelines, JIRA, and Agile workflow. +- Expertise with development and profiling tools: Valgrind, gdb, gprof, Intel VTune profiler, tau profiler. +- Technical writing abilities which resulted in 8 published journal articles and creation of software specifications/documentation. + + +## Experience + +**UKG**, Atlanta\ +*Software Engineer (May 2025 -- Present)* + +- Worked as backend engineer on notifications as a service using a microservice architecture built on top Java, SpringBoot, Kafka, RabbitMQ, MongoDB, Splunk, and Grafana technologies. +- Implemented improved observability for services to reduce service downtime. +- Acted as a Security Champion and addressed security vulnerabilities in existing code based on SAST and SCA scans performed using CXOne Checkmarx. +- Led implementation of testing services for web push notification services. +- Assisted in development of MCP server and LLM chatbot proof-of-concept to act as an internal assistant for providing support to other UKG teams. + +**SpaceWorks Enterprises**, Atlanta\ +*Senior Software Developer (January 2024 -- April 2025)* + +- Lead development and maintainer role for commercial off-the-shelf (COTS) software products as well as NASA and NAVAIR programs in Rust and Python. +- Led development of modular and extensible simulation libraries for modeling applications including multi-body six-degree-of-freedom simulations, state-space linear simulations for control system design, differential evolution optimization, among others. +- Improved mesh based calculations from **~1 hour to ~1 minute** per analysis through improved data structure and algorithm design. +- Implemented multi-threading for accelerating simulation analysis and for asynchronous execution. +- Developed equilibrium gas composition solver for different stages of a rocket engine cycle with **order-of-magnitude improved speed compared to legacy approach**. +- Product owner for COTS product including final approval of merge requests, interfacing with customers for sales and technical support, and helping to develop software roadmaps. +- Developed and maintained CI/CD pipelines for COTS products using Gitlab runners and docker containers. +- Mentored junior developers in idiomatic Rust and software architecture. + +**Third Wave Systems**, Minnesota\ +*Computational Mechanics Engineer (December 2022 -- January 2024)* + +- Worked in an Agile team on a variety of projects requiring fast context switching to implement cutting edge functionality in C++, Fortran, and Python. +- Worked on large legacy C++ FEA code bases to add new functionality as well as address subtle legacy bugs resulting from race conditions, invalid memory access, and incorrect usage of programming language built-ins. +- Refactored core solvers utilizing an Octree data structure for adaptive mesh refinement, utilizing OpenMP and C++17 built in multi-threading, resulting in **90% reduction in simulation time**. +- Implemented improved force models for drilling through addition of analytical equations for elastic indentation, **which reduced error by 10% relative to experiments**. +- Led team members in implementation of machine learning analysis in Python requiring accurate effort estimation and selection of functionality based on effort/risk to reward. +- Mentored junior developers in idiomatic Python and machine learning concepts. +- Automated manual simulation creation and analysis workflows using Python, leveraging active learning based adaptive sampling, to reduce manual effort by engineers and **reduce usage of compute resources by ~80%**. + +**McDowell Research Group**, Dr. David McDowell, Georgia Tech\ +*Graduate Research Assistant (August 2017 -- December 2022)* + +- Developed and extended Concurrent Atomistic-Continuum (CAC) simulation toolkit involving the development of a coupled finite element method and classical many-body molecular dynamics simulation tool in C++ and Fortran. +- Developed a series of Python pipelines for analyzing simulations and visualization of simulation results. +- Refactored significant portions of the code to **reduce simulation run times by 60%** through design of new algorithms and improved implementation of communication subroutines utilizing MPI. +- Profiled and tuned software performance for high performance computing clusters including implementing code structure changes enabling improved compiler optimizations and addressing MPI communication bottlenecks. +- Worked independently on self-guided research topics while also collaborating with external sources such as Sandia National Lab and University of Florida. +- **Authored three published journal articles and four conference presentations**. + +**Mechanics of Materials Organization**, Dr. Xiaowang Zhou., Sandia National Lab\ +*Intern - Engineering Sciences Summer institute (May 2021 -- August 2021)* + +- Restructured simulation toolkit codebase to abide by an object-oriented programming paradigm to ease addition of functionality. +- Worked on the development of finite temperature CAC simulations through design of novel finite elements. +- Developed methods for pressure controlled CAC simulations. + ## Education - **Georgia Institute of Technology** (North Avenue, Atlanta, GA 30332)\ @@ -31,44 +92,3 @@ Alex Selimov Funding Source: Extreme Science and Engineering Discovery Environment (XSEDE)\ Project Title: Concurrent atomistic-continuum simulations of extended scale defect interactions in heterogeneous microstructures (TG-MSS150010)\ Funding Period: Jan 1, 2019 - June 30, 2022 - -## Research Experience -**McDowell Research Group**, Dr. David McDowell, Georgia Tech\ -*Graduate Research Assistant (August 2017 -- Present)* - -- Worked on the development and extension of the Concurrent Atomistic-Continuum method for running massively parallel coarse-grained atomistic simulations of dislocation interactions with interfaces and other defect structures in nanolaminate and stainless steel materials. -- Improved parallel implementation and tuned calculation algorithms of in-house simulation suite obtaining runtime reductions of 66%. Also contributed to a fork of LAMMPS implementing the CAC simulation method. -- Implemented the finite element method to solve conservation law field equations to enable reductions in degrees-of-freedom leading to reduced computational cost. -- Tested various metrics to numerically characterize atomic interface structure of metallic semi-coherent interfaces and applied machine learning methods to track the interface structure evolution with loading. -- Modeled solute distributions in diffuse Cu/Ni semi-coherent interfaces and their effect on the glide of interface misfit dislocations and overall interface properties. -- Investigated the sequential interactions between dislocations and obstacles in various systems to quantify evolving obstacle strength and interaction mechanisms. - -**Mechanics of Materials Organization**, Dr. Xiaowang Zhou, Sandia National Lab\ -*Intern - Engineering Sciences Summer institute (May 2021 -- Aug 2021)* - -- Studied the barrier strength of grain boundaries with embedded helium bubbles to improve hardening predictions of irradiated stainless steel materials, collaboration continued beyond internship period. -- Extended molecular dynamics barostat algorithms to coarse-grained regions for pressure relaxation. -- Worked on CAC capabilities for high temperature dynamics simulations through development of new finite element types and extension of neighboring codes for cluster potentials. - -**AeroStructures Lab**, Dr. Seetha Raghavan, UCF\ -*Research Assistant (September 2013 -- December 2016)* - -- Utilized photoluminescence spectroscopy and piezospectroscopy for the characterization of material and mechanical properties in ceramic and composite materials. -- Worked on collaborative project with Imperial College London (Dr. Ambrose Taylor’s Research Group) for the testing and characterization of novel hybrid carbon fiber reinforced polymer (HCFRP) composites. -- Worked on collaborative project with German Aerospace Center (DLR) to study stress development in thermally grown oxide layers of thermal barrier coatings. - -**Pollock Research Group**, Dr. Tresa Pollock, UCSB \ -*RISE Undergraduate Intern, NSF funded REU (June -- August 2015)* - -- Studied Magnesium-zinc alloys to determine methods for texture weakening for improvement of material properties through analyzing presence of intermetallic particles. -- Utilized scanning electron microscopy to take secondary electron images, backscatter electron images, and to analyze crystallographic texture through electron backscatter diffraction -- Prepared image analysis tools to determine volume fraction of intermetallic particles from SEM images for comparison to grain size distribution of samples with Matlab. - -## Skills - -- Programming in Fortran, C, and C++ with additional expertise utilizing the Message Passing Interface (MPI) for implementation of parallel and scalable simulation tools. -- Programming in MATLAB, HTML, and CSS. -- Data analysis and pipeline creation using Python with Numpy, Scipy, Scikit-Learn, Pandas, and Tkinter modules. Additional familiarity with Jupyter Notebooks. -- Expertise in atomistic simulations using LAMMPS with Molecular Statics, Molecular Dynamics, and Monte-Carlo methods. -- Expertise with Linux software environment and building applications for use with computing cluster architectures. -- Familiarity with software development methodologies including test case design and CI/CD pipelines. From a7826395f9adf505af23f306671ef20dfad44704 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Thu, 4 Sep 2025 19:59:35 -0400 Subject: [PATCH 14/26] Add post about cuda --- content/posts/cuda_on_void.md | 1 + content/posts/nvidia_cuda_sleep_issue.md | 77 ++++++++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 content/posts/nvidia_cuda_sleep_issue.md diff --git a/content/posts/cuda_on_void.md b/content/posts/cuda_on_void.md index ca6ab46..d8af9d3 100644 --- a/content/posts/cuda_on_void.md +++ b/content/posts/cuda_on_void.md @@ -1,6 +1,7 @@ --- title: "Getting CUDA toolkit installed on Void Linux" date: 2025-04-15T10:45:26-04:00 +topics: [software development, CUDA] --- This is a short post (mainly for myself) to remember how I got CUDA installed on Void Linux. diff --git a/content/posts/nvidia_cuda_sleep_issue.md b/content/posts/nvidia_cuda_sleep_issue.md new file mode 100644 index 0000000..1e9ceb6 --- /dev/null +++ b/content/posts/nvidia_cuda_sleep_issue.md @@ -0,0 +1,77 @@ ++++ +title = "NVIDIA graphics card faulting after sleep/wake cycle on Void Linux" +date = "2025-09-04T19:44:19-04:00" +topics: [software development, CUDA] ++++ + +I run Void Linux on a Thinkpad T480 with Integrated Intel graphics and a discrete Nvidia MX150. I've decided to start working with more CUDA development and was running into an issue where my Nvidia GPU would suddenly stop being detected by CUDA applications. The only way I could figure out to get it back online was by rebooting my computer. Eventually I became so frustrated that I decided to dive in and find a solution. + +## The Problem + +Here's what I was experiencing: + +- GPU appeared normal in `nvidia-smi` +- All NVIDIA kernel modules were loaded correctly +- Device files in `/dev/nvidia*` existed with proper permissions +- But testing CUDA availability using Pytorch, by running the following command would return FAlSE: + +```python + python -c "import torch; print(torch.cuda.is_available())" +``` + +The root cause was eventually found in the kernel logs (`dmesg`): + +``` +NVRM: Xid (PCI:0000:01:00): 31, pid=1596, name=modprobe, Ch 00000003, +intr 10000000. MMU Fault: ENGINE HOST6 HUBCLIENT_HOST faulted @ 0x1_01010000. +Fault is of type FAULT_PDE ACCESS_TYPE_READ + +NVRM: Xid (PCI:0000:01:00): 154, GPU recovery action changed from 0x0 (None) +to 0x2 (Node Reboot Required) +``` + +## The Root Cause + +The issue stems from NVIDIA GPU memory management during sleep/resume cycles. When the system suspends: + +1. The GPU's memory mappings and contexts can become corrupted +2. The GPU's Memory Management Unit (MMU) enters a faulted state +3. While the driver stack appears to reload correctly, the GPU hardware itself is in an inconsistent state +4. CUDA runtime fails to initialize because it can't establish proper memory contexts + +This seems to be common on mobile NVIDIA GPUs (like the MX series) in laptops with hybrid graphics setups running Linux. +At least, I've seen a few postings about this. + +## The Solution + +The fix is to add these parameters to your kernel command line in `/etc/default/grub`: + +```bash +GRUB_CMDLINE_LINUX_DEFAULT="... nvidia-drm.modeset=1 nvidia.NVreg_PreserveVideoMemoryAllocations=1" +``` + +Then update GRUB: + +```bash +sudo update-grub +``` + +And reboot to apply the changes. + +### What These Parameters Do + +- **`nvidia-drm.modeset=1`**: Enables kernel mode setting for the NVIDIA driver, providing better integration with the display subsystem and more robust power management +- **`nvidia.NVreg_PreserveVideoMemoryAllocations=1`**: Tells the NVIDIA driver to preserve GPU memory allocations across suspend/resume cycles, preventing the MMU faults + +## Why This Works + +These parameters ensure that: + +1. GPU memory contexts are properly preserved during sleep +2. The kernel's display management system maintains better control over the GPU state +3. Memory mappings remain consistent across suspend/resume cycles +4. The GPU's MMU doesn't enter the faulted state that breaks CUDA + +## Conclusion + +Haven't had an issue since making this fix! Hopefully someone else can benefit from this as well! From 6eea6701366b8aae1f04690a2bcd3185767c980e Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Thu, 4 Sep 2025 20:02:28 -0400 Subject: [PATCH 15/26] Fix toml header --- content/posts/nvidia_cuda_sleep_issue.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/posts/nvidia_cuda_sleep_issue.md b/content/posts/nvidia_cuda_sleep_issue.md index 1e9ceb6..461b01e 100644 --- a/content/posts/nvidia_cuda_sleep_issue.md +++ b/content/posts/nvidia_cuda_sleep_issue.md @@ -1,7 +1,7 @@ +++ title = "NVIDIA graphics card faulting after sleep/wake cycle on Void Linux" date = "2025-09-04T19:44:19-04:00" -topics: [software development, CUDA] +topics = ["software development", "CUDA"] +++ I run Void Linux on a Thinkpad T480 with Integrated Intel graphics and a discrete Nvidia MX150. I've decided to start working with more CUDA development and was running into an issue where my Nvidia GPU would suddenly stop being detected by CUDA applications. The only way I could figure out to get it back online was by rebooting my computer. Eventually I became so frustrated that I decided to dive in and find a solution. From 25bc25ec46ed8d93b3880b15066f397b62bac61a Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Sat, 6 Sep 2025 00:13:21 -0400 Subject: [PATCH 16/26] Add post about mac style copy paste --- content/posts/mac_style_copy_paste.md | 49 +++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 content/posts/mac_style_copy_paste.md diff --git a/content/posts/mac_style_copy_paste.md b/content/posts/mac_style_copy_paste.md new file mode 100644 index 0000000..bbcb0c8 --- /dev/null +++ b/content/posts/mac_style_copy_paste.md @@ -0,0 +1,49 @@ ++++ +title = "Mac style copy/paste on Void Linux" +date = "2025-09-05T23:49:40-04:00" +topics = ["software development", "linux", "configurations"] ++++ + +Another quick post that may be useful to somebody else. +I've been working at UKG for about 4 months now. +In my work I use a Mac laptop. +I've tried my best to unify my configurations between my personal Linux system and the Mac dev machine provided by UKG to reduce headaches when having to switch from professional to personal projects. +This even went as far as trying to configure OpenBox to be more like the MacOS desktop environment (HA a big failed endeavour). +While I ultimately found peace with differences in desktop environments, there was another thing I found very hard to deal with. + +## Differences in Keybindings!! + +I made a lot of changes and compromises when setting up my Mac system and configuring my personal machine. +One notable change was swapping my main modkey for `dwm` from `Meta` to `Alt` to better mimic the Mac setup. +I tried doing the reverse of swapping `Option` and `Cmd` in Mac, but that was a really rough time. +I've also tried to keep many other keybindings, associated with things like moving windows or changing workspaces, consistent. +One thing that was causing endless headaches was copy and paste. +I don't know the exact count of times I've pressed `Alt+C` or `Alt+V` at home in vain, but it is certainly significant. +As a result I spent some time to figure out how to do this. + +## Final Solution + +I configure my `dwm` specific keybindings in my `config.h`, but for everything else I use `sxhkd`. +This allows me to more easily reload keybindings instead of having to cycle `dwm` and lose all of my window placements. +I highly recommend this kind of setup. +My final solution, added to my `sxhkdrc` is: + +``` + +alt + c + xclip -selection primary -o | xclip -selection clipboard -i + alt + v + sh -c 'xclip -selection clipboard -o | xclip -selection primary -i && xdotool click 2' +``` + + +I tried several other ways, most notable being just trying to send `Ctrl+C` when I pressed `Alt+C`, but nothing else worked. + +## How it works + +A quick description of how it works: + +- `Alt+C` takes the primary selection and copies it to the clipboard +- `Alt+V` takes the clipboard and copies it to the primary selection and then emulates a middle mouse button click to paste. + +I was hoping for a more elegant solution but ¯\_(ツ)_/¯ From ced57a697fba3a369eca86acb0409637a8e3672c Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Wed, 10 Sep 2025 23:18:02 -0400 Subject: [PATCH 17/26] st_to_ghostty post --- content/posts/st_to_ghostty.md | 66 ++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 content/posts/st_to_ghostty.md diff --git a/content/posts/st_to_ghostty.md b/content/posts/st_to_ghostty.md new file mode 100644 index 0000000..32c4284 --- /dev/null +++ b/content/posts/st_to_ghostty.md @@ -0,0 +1,66 @@ +--- +title: "Say goodbye to st and say hello to ghostty" +date: 2025-09-10T23:16:26-04:00 +topics: [software development, linux, tools] +--- + +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 ++++++++++ +``` From 1c5cdb3b975c517655dad52ab7661ef2c3e7a4fa Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Tue, 23 Sep 2025 22:09:07 -0400 Subject: [PATCH 18/26] Post about PPV --- archetypes/posts.md | 5 +++++ content/posts/ppv.md | 52 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 archetypes/posts.md create mode 100644 content/posts/ppv.md diff --git a/archetypes/posts.md b/archetypes/posts.md new file mode 100644 index 0000000..205fc90 --- /dev/null +++ b/archetypes/posts.md @@ -0,0 +1,5 @@ +--- +title: "{{ replace .Name "-" " " | title }}" +date: {{ .Date }} +topics: [] +--- diff --git a/content/posts/ppv.md b/content/posts/ppv.md new file mode 100644 index 0000000..7ab56ac --- /dev/null +++ b/content/posts/ppv.md @@ -0,0 +1,52 @@ +--- +title: "Pillars, Pipelines, and Vaults System by August Bradley" +date: 2025-09-23T21:22:45-04:00 +topics: ["life optimization", "productivity", "self-reflection"] + +--- + +## What motivated me to try it + +I somehow recently accidentally stumbled across the Pillars, Pipelines, and Vaults (PPV) system by August Bradley. +In a nutshell, this system is a way to align your daily efforts to the pursuit of goals that contribute to core areas of your life (the pillars). +As a husband and the father of a toddler and an infant, the free time that I previously had in excess has been scarce. +My routines and schedules were extremely disrupted as I transitioned from my life as a PhD student to working a 9-5 and raising a family (my first child was born exactly one week after my dissertation defense). +These routines never truly recovered. +As a result, when I do come across some free time I find that I often don't know what to do with it. +I also am guilty of jumping from project to project without focus, leaving things half finished or skills incompletely developed. + +## I've tried a few different methods for improving focus and alignment, but nothing ever really stuck. + +I've been learning about the PPV system and have noticed some positive effects already. +Primarily around self-reflection, ensuring daily tasks are aligned to what is important, and ensuring that my effort towards things important to me is getting tracked. +I'm halfway through the [PPV playlist](https://www.youtube.com/playlist?list=PLAl0gPKnL3V8s7dPXoo07mYnuErhWVk8b) and have started building out my personal PPV system. +So far I recommend it. +I definitely think that it needs per-user customization as I am not August Bradley, and his priorities won't directly translate to me. +But some of the overarching concepts I find extremely useful: + +- You should define a small set of "pillars" that hold up your life (e.g. career, family, learning, personal projects, etc...) +- Ensure that your daily actions and goals are aligned to those pillars +- The action zone concept is fairly genius and has certainly led to improved focus for me. + + +## I, of course, am not actually implementing these systems in Notion directly + +Instead, I found a FOSS alternative called [anytype](https://anytype.io/). +I tried some other FOSS options like AppFlowy and AFFiNE. +AFFiNE struggled from: + +- UI that was cramming in their AI service everywhere, and it couldn't be disabled. +- Some concerns about how their telemetry works, [see this github issue](https://github.com/toeverything/AFFiNE/issues/6920) + +AppFlowy was pretty clean but I wasn't able to get the self-hosted AppFlowy-Cloud setup. +I've yet to self-host a node for anytype. +It uses a P2P protocol to synchronize spaces between devices which seems to make the self-hosting more complex. +I plan to upload an additional guide if I find it difficult to set-up. + +## Conclusion + +If you haven't heard about PPV, definitely check it out [here](https://www.youtube.com/playlist?list=PLAl0gPKnL3V8s7dPXoo07mYnuErhWVk8b)! +It isn't for everyone, but I've seen the benefits already in my limited time using it. +I may do a dive into my personal flavor of PPV and how I deviated from the original once it is fully completed. +Hopefully this is helpful to someone! + From 2519b96a86cb4fcdfb66b92f79ab675bffc09890 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Mon, 2 Mar 2026 14:56:56 -0500 Subject: [PATCH 19/26] Refactor site to new theme --- .gitmodules | 6 +- assets/auto-theme.css | 156 ++ content/_index.md | 17 +- content/about.md | 25 +- content/projects.md | 20 + hugo.toml | 113 +- layouts/index.html | 19 + layouts/partials/custom_head.html | 2 + layouts/partials/footer.html | 4 + layouts/partials/header.html | 6 + layouts/partials/nav.html | 4 + layouts/shortcodes/code.html | 6 + scripts/generate_triangulated_mesh.py | 235 +++ static/mesh.svg | 2058 +++++++++++++++++++++++++ themes/hugo-bearcub | 1 + themes/hugo-theme-terminal | 1 - 16 files changed, 2590 insertions(+), 83 deletions(-) create mode 100644 assets/auto-theme.css create mode 100644 content/projects.md create mode 100644 layouts/index.html create mode 100644 layouts/partials/custom_head.html create mode 100644 layouts/partials/footer.html create mode 100644 layouts/partials/header.html create mode 100644 layouts/partials/nav.html create mode 100644 layouts/shortcodes/code.html create mode 100644 scripts/generate_triangulated_mesh.py create mode 100644 static/mesh.svg create mode 160000 themes/hugo-bearcub delete mode 160000 themes/hugo-theme-terminal diff --git a/.gitmodules b/.gitmodules index 9502d96..4d81b35 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ -[submodule "themes/hugo-theme-terminal"] - path = themes/hugo-theme-terminal - url = https://forge.alexselimov.com/aselimov/Terminal-Hugo-Theme.git +[submodule "themes/hugo-bearcub"] + path = themes/hugo-bearcub + url = https://github.com/clente/hugo-bearcub diff --git a/assets/auto-theme.css b/assets/auto-theme.css new file mode 100644 index 0000000..37a5355 --- /dev/null +++ b/assets/auto-theme.css @@ -0,0 +1,156 @@ +:root { + --size: 0.96rem; + --spacing: calc(var(--size) * 2); +} + +body { + font-family: "Nunito", "Avenir Next", "Avenir", "Segoe UI", "Helvetica Neue", + Helvetica, Arial, sans-serif; + font-size: calc(var(--size) * 1.6); + line-height: 1.45; + padding: 0 2.8rem 2.8rem; +} + +header, +main, +footer { + max-width: 66ch; +} + +header, +footer { + position: relative; +} + +.mesh-wrap { + position: relative; + left: 50%; + width: 100vw; + transform: translateX(-50%); + pointer-events: none; + overflow: hidden; +} + +.mesh-image { + display: block; + width: auto; + height: auto; + max-width: none; + position: absolute; + left: 50%; + transform: translateX(-50%); +} + +.mesh-wrap-top { + height: 100px; + margin-bottom: 0.6rem; +} + +.mesh-image-top { + top: 0; +} + +.footer-copy { + padding-top: 0.5rem; +} + +h1, +h2, +h3, +h4 { + font-weight: 600; +} + +h1 { + font-size: calc(var(--size) * 3.4); +} + +h2 { + font-size: calc(var(--size) * 2.8); +} + +.title h1 { + font-size: calc(var(--size) * 2.9); +} + +nav a, +a.blog-tags { + margin-right: calc(var(--spacing) / 2.8); +} + +a { + text-decoration: none; +} + +a:hover, +a:focus-visible { + text-decoration: underline; +} + +ul.blog-posts li { + margin-bottom: 0.2rem; +} + +li { + margin-block-start: calc(var(--spacing) / 2.8); +} + +@media (prefers-color-scheme: light) { + body { + background-color: #ffffff; + color: #1f2328; + } + + h1, + h2, + h3, + h4, + h5, + h6, + strong, + b { + color: #111827; + } + + a { + color: #0969da; + } + + a:visited, + ul.blog-posts li a:visited { + color: #8250df; + } + + textarea, + input { + background-color: #f6f8fa; + color: #1f2328; + border: 1px solid #d0d7de; + } + + table, + th, + td { + border-color: #d0d7de; + } + + code { + color: #24292f; + background-color: #f6f8fa; + } + + pre code { + background-color: #f6f8fa; + } + + blockquote { + border-left-color: #8c959f; + color: #57606a; + } + + figcaption > p, + .helptext { + color: #57606a; + } + +} diff --git a/content/_index.md b/content/_index.md index 5b3d9ee..fe664fb 100644 --- a/content/_index.md +++ b/content/_index.md @@ -1,21 +1,14 @@ --- title: "" -framed: true date: 2022-10-03T14:17:10-04:00 layout: index --- +# Hi I'm Alex Selimov. -
-     _    _             ____       _ _                      
-    / \  | | _____  __ / ___|  ___| (_)_ __ ___   _____   __
-   / _ \ | |/ _ \ \/ / \___ \ / _ \ | | '_ ` _ \ / _ \ \ / /
-  / ___ \| |  __/>  <   ___) |  __/ | | | | | | | (_) \ V /
- /_/   \_\_|\___/_/\_\ |____/ \___|_|_|_| |_| |_|\___/ \_/
-
+I write about software engineering, Linux, and practical workflows. +I currently work at [UKG](https://www.ukg.com) as a Java Backend Engineer. -I am a materials scientist and software developer proficient in Rust, Fortran, C++, Java, and Python. I have extensive experience with Unix operating systems on both high performance computing resources and on my personal computer (check out [Void Linux](https://voidlinux.org)). I currently work at [UKG](https://www.ukg.com) as a Java Backend Engineer. +My background is in materials science and scientific computing, and I build in Rust, Java, Python, C++, and Fortran. -**Checkout recent posts below or posts organized by topic [here](/topics)** - -**Thanks for stopping by!** +You can also browse posts by topic [here](/topics). diff --git a/content/about.md b/content/about.md index e957768..d85d80e 100644 --- a/content/about.md +++ b/content/about.md @@ -1,21 +1,10 @@ -+++ -title = "About" -date = "2019-01-25" -author = "Radek" -+++ +--- +title: "About" +date: 2026-03-02 +--- -# Hi there +I am a software engineer with a background in materials science and scientific computing. -My name is Radek and I'm the author of this theme. I made it to help you present your ideas easier. +I currently work at UKG as a Java Backend Engineer. My interests span backend systems, developer tooling, Linux workflows, and performance-oriented programming. -We all know how hard is to start something on the web, especially these days. You need to prepare a bunch of stuff, configure them and when that’s done — create the content. - -This theme is pretty basic and covers all of the essentials. All you have to do is start typing! - -The theme includes: - -- fully customizable color schemes generated by [**terminal.css**](https://panr.github.io/terminal-css/). -- great reading experience thanks to [**Fira Code**](https://github.com/tonsky/FiraCode). -- nice code highlighting thanks to [**PrismJS**](https://prismjs.com) that matches the theme's color scheme. - -So, there you have it... enjoy! +I write here about practical engineering lessons, tools I use, and projects I build. diff --git a/content/projects.md b/content/projects.md new file mode 100644 index 0000000..7af14bf --- /dev/null +++ b/content/projects.md @@ -0,0 +1,20 @@ +--- +title: "Projects" +date: 2026-03-02 +--- + +This page highlights selected projects across software engineering and technical research. + +## Current Focus + +- Backend and platform engineering with Java and distributed systems. +- Rust-based tools and utilities for local workflows. +- Practical automation and scripting on Linux. + +## Selected Work + +- Open source and personal utilities. +- Technical writing and implementation notes. +- Simulation and scientific computing work from prior research roles. + +More detailed project write-ups will be added here over time. diff --git a/hugo.toml b/hugo.toml index 80318f5..55295b4 100644 --- a/hugo.toml +++ b/hugo.toml @@ -1,58 +1,73 @@ -baseurl = "https://www.alexselimov.com/" -languageCode = "en-us" -theme = "hugo-theme-terminal" -pagination.pagerSize = 5 +baseURL = "https://www.alexselimov.com/" +languageCode = "en-US" +theme = "hugo-bearcub" +defaultContentLanguage = "en" +copyright = "© Alex Selimov" +enableRobotsTXT = true -[markup.goldmark.renderer] -unsafe = true +[pagination] +pagerSize = 5 -[params] -contentTypeName = "posts" -showMenuItems = 3 -postsToShowOnIndex = 3 -fullWidthTheme = false -centerTheme = true +[markup] + [markup.goldmark.renderer] + unsafe = true + [markup.highlight] + lineNos = true + lineNumbersInTable = false + noClasses = false [taxonomies] -tag = "tags" -topic = "topics" + tag = "tags" + topic = "topics" [languages] + [languages.en] + title = "Alex Selimov" + languageName = "en-US" + languageCode = "en-US" + [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 -[languages.en.params] -title = "Alex Selimov" -subtitle = "" -keywords = "" -copyright = "© Alex Selimov" -menuMore = "Show more" -readMore = "Read more" -readOtherPosts = "Read other posts" +[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 -[languages.en.params.logo] -logoText = "Alex Selimov" -logoHomeLink = "/" + [[params.popularPosts]] + title = "Say goodbye to st and say hello to ghostty" + url = "/posts/st_to_ghostty/" + [[params.popularPosts]] + title = "Getting CUDA toolkit installed on Void Linux" + url = "/posts/cuda_on_void/" + [[params.popularPosts]] + title = "Rust is pretty good (Short thoughts on Rust)" + url = "/posts/thoughts_on_rust/" + [[params.popularPosts]] + title = "My nvim/tmux workflow" + url = "/posts/tmux_and_nvim/" + [[params.popularPosts]] + title = "Fighting the web obesity crisis using Hugo and Skeleton CSS" + url = "/posts/web_obesity/" -[languages.en.menu] -[[languages.en.menu.main]] -identifier = "cv" -name = "[CV]" -url = "/cv" -weight = 1 -[[languages.en.menu.main]] -identifier = "git" -name = "[Git]" -url = "https://forge.alexselimov.com/aselimov" -weight = 1 -[[languages.en.menu.main]] -identier = "linkedIn" -name = "[LinkedIn]" -url = "https://www.linkedin.com/in/alex-selimov/" -weight = 2 -[[languages.en.menu.main]] -identier = "Scholar" -name = "[Google Scholar]" -url = "https://scholar.google.com/citations?user=w6unVk8AAAAJ&hl=en&oi=ao" -[[languages.en.menu.main]] -identifier = "gpg" -name = "[GPG public key]" -url = "./public.key" + [params.author] + name = "Alex Selimov" diff --git a/layouts/index.html b/layouts/index.html new file mode 100644 index 0000000..833cae1 --- /dev/null +++ b/layouts/index.html @@ -0,0 +1,19 @@ +{{ define "main" }} + + {{ .Content }} + +

My most recent posts

+
    + {{ $max := default 3 .Site.Params.postsToShowOnIndex }} + {{ $posts := where .Site.RegularPages "Section" "posts" }} + {{ range first $max $posts.ByDate.Reverse }} +
  • + {{ .Title }} +
  • + {{ end }} +
+ +

All posts →

+ +
+{{ end }} diff --git a/layouts/partials/custom_head.html b/layouts/partials/custom_head.html new file mode 100644 index 0000000..74a4f70 --- /dev/null +++ b/layouts/partials/custom_head.html @@ -0,0 +1,2 @@ +{{ $autoTheme := resources.Get "auto-theme.css" | minify }} + diff --git a/layouts/partials/footer.html b/layouts/partials/footer.html new file mode 100644 index 0000000..e0d702a --- /dev/null +++ b/layouts/partials/footer.html @@ -0,0 +1,4 @@ + diff --git a/layouts/partials/header.html b/layouts/partials/header.html new file mode 100644 index 0000000..804be55 --- /dev/null +++ b/layouts/partials/header.html @@ -0,0 +1,6 @@ + + +

{{ .Site.Title }}

+ diff --git a/layouts/partials/nav.html b/layouts/partials/nav.html new file mode 100644 index 0000000..5a7ea58 --- /dev/null +++ b/layouts/partials/nav.html @@ -0,0 +1,4 @@ +{{ range .Site.Menus.main.ByWeight }} + {{ .Name }} +{{ end }} +RSS diff --git a/layouts/shortcodes/code.html b/layouts/shortcodes/code.html new file mode 100644 index 0000000..47be546 --- /dev/null +++ b/layouts/shortcodes/code.html @@ -0,0 +1,6 @@ +{{ .Page.Store.Set "hasCodeBlock" true }} +{{ $lang := .Get "language" | default "" }} +{{ with .Get "title" }} +

{{ . }}

+{{ end }} +{{ highlight (trim .Inner "\r\n") $lang "" }} diff --git a/scripts/generate_triangulated_mesh.py b/scripts/generate_triangulated_mesh.py new file mode 100644 index 0000000..fa36ce1 --- /dev/null +++ b/scripts/generate_triangulated_mesh.py @@ -0,0 +1,235 @@ +#!/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'', + f'', + *elements, + *circles, + "", + ] + ) + + 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/mesh.svg b/static/mesh.svg new file mode 100644 index 0000000..a2cc8d6 --- /dev/null +++ b/static/mesh.svg @@ -0,0 +1,2058 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/themes/hugo-bearcub b/themes/hugo-bearcub new file mode 160000 index 0000000..1d12a76 --- /dev/null +++ b/themes/hugo-bearcub @@ -0,0 +1 @@ +Subproject commit 1d12a76549445b767fa02902caf30cec7ceaecf9 diff --git a/themes/hugo-theme-terminal b/themes/hugo-theme-terminal deleted file mode 160000 index 7cd0b57..0000000 --- a/themes/hugo-theme-terminal +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 7cd0b57a0276349b9f107afb48f692e72f0d931a From 06d25a7baf8debb56a42307dad07ba1d3ff78e56 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Mon, 2 Mar 2026 15:00:37 -0500 Subject: [PATCH 20/26] Fix workflow --- .forgejo/workflows/build_and_deploy_site.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.forgejo/workflows/build_and_deploy_site.yml b/.forgejo/workflows/build_and_deploy_site.yml index fc92005..4521658 100644 --- a/.forgejo/workflows/build_and_deploy_site.yml +++ b/.forgejo/workflows/build_and_deploy_site.yml @@ -17,8 +17,8 @@ jobs: - name: Setup Hugo run: | - wget https://github.com/gohugoio/hugo/releases/download/v0.147.8/hugo_0.147.8_linux-amd64.tar.gz - tar -xzf hugo_0.147.8_linux-amd64.tar.gz + wget https://github.com/gohugoio/hugo/releases/download/v0.147.8/hugo_extended_0.147.8_linux-amd64.tar.gz + tar -xzf hugo_extended_0.147.8_linux-amd64.tar.gz chmod +x hugo mkdir -p ~/bin mv hugo ~/bin/ @@ -39,7 +39,8 @@ jobs: echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa chmod 700 ~/.ssh - echo "SSH key saved and permissions set" ssh-keyscan -H alexselimov.com >> ~/.ssh/known_hosts + echo "SSH key saved and permissions set" + ssh-keyscan -H alexselimov.com >> ~/.ssh/known_hosts echo "Host key added to known_hosts" # Test SSH connection echo "Testing SSH connection..." From a36f14bfeaa1a0fb0866f3b73aeaa60e0c41327b Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Mon, 2 Mar 2026 16:11:35 -0500 Subject: [PATCH 21/26] Update profile and about page --- content/about.md | 19 ++++++++++++++++--- content/projects.md | 22 +++++++++++----------- static/profile.webp | Bin 0 -> 89892 bytes 3 files changed, 27 insertions(+), 14 deletions(-) create mode 100644 static/profile.webp diff --git a/content/about.md b/content/about.md index d85d80e..761324a 100644 --- a/content/about.md +++ b/content/about.md @@ -1,10 +1,23 @@ --- title: "About" date: 2026-03-02 +hideDate: true --- -I am a software engineer with a background in materials science and scientific computing. -I currently work at UKG as a Java Backend Engineer. My interests span backend systems, developer tooling, Linux workflows, and performance-oriented programming. +{{< img src="/profile.jpeg" max-width="250px" >}} -I write here about practical engineering lessons, tools I use, and projects I build. +## Quick Facts + +- Father of two and husband of one +- **Scientific and Backend** Software Developer +- Computational Materials Science PhD from Georgia Tech +- **Favorite programming language is Rust 🦀** + +## Technical knowledge + +- **Programming Languages:** Rust, Fortran, Python, C++, Java, Typescript +- **Parallel Programming:** MPI, OpenMP, Rayon, etc... +- **Good at Algorithm design, performance tuning** +- **AI:** Did work with Active Learning and traditional models (small data) before ChatGPT. +- **LLMs:** Messing around with them, use codex mainly, planning a write up on my thoughts. diff --git a/content/projects.md b/content/projects.md index 7af14bf..927e9a7 100644 --- a/content/projects.md +++ b/content/projects.md @@ -1,20 +1,20 @@ --- title: "Projects" -date: 2026-03-02 +hideDate: true --- -This page highlights selected projects across software engineering and technical research. +Here are some of the projects I am working or have worked on: -## Current Focus +**Business Projects** -- Backend and platform engineering with Java and distributed systems. -- Rust-based tools and utilities for local workflows. -- Practical automation and scripting on Linux. +- [exaQueue <- HPC as a Service platform](https://exaQueue.io) -## Selected Work +**Scientific** -- Open source and personal utilities. -- Technical writing and implementation notes. -- Simulation and scientific computing work from prior research roles. +- [CAC <- Implementation of the Concurrent Atomistic Continuum method](https://forge.alexselimov.com/aselimov/CAC) +- [CACmb <- Model build for CAC](https://forge.alexselimov.com/aselimov/CACmb) -More detailed project write-ups will be added here over time. +**Random** + +- [neovim configs](https://forge.alexselimov.com/aselimov/neovim) +- [PaperPicker <- Use local llms to find relevant arxiv papers](https://github.com/aselimov/PaperPicker.git) diff --git a/static/profile.webp b/static/profile.webp new file mode 100644 index 0000000000000000000000000000000000000000..6d505c2f33306a65cce6087633fbb721e7534034 GIT binary patch literal 89892 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 z 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 literal 0 HcmV?d00001 From e6f60f3b92f0b762e16cf129329bed110729a83f Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Mon, 2 Mar 2026 19:39:34 -0500 Subject: [PATCH 22/26] Move all edits to theme --- .gitignore | 1 + assets/auto-theme.css | 156 ------------------------ layouts/index.html | 19 --- layouts/page/presentation.html | 5 - layouts/partials/custom_head.html | 2 - layouts/partials/footer.html | 4 - layouts/partials/header.html | 6 - layouts/partials/nav.html | 4 - layouts/shortcodes/code.html | 6 - layouts/shortcodes/fontawesome.html | 1 - layouts/shortcodes/img.html | 6 - layouts/shortcodes/presentations.html | 6 - layouts/shortcodes/publications.html | 5 - layouts/shortcodes/recent-articles.html | 0 themes/hugo-bearcub | 2 +- 15 files changed, 2 insertions(+), 221 deletions(-) delete mode 100644 assets/auto-theme.css delete mode 100644 layouts/index.html delete mode 100644 layouts/page/presentation.html delete mode 100644 layouts/partials/custom_head.html delete mode 100644 layouts/partials/footer.html delete mode 100644 layouts/partials/header.html delete mode 100644 layouts/partials/nav.html delete mode 100644 layouts/shortcodes/code.html delete mode 100644 layouts/shortcodes/fontawesome.html delete mode 100644 layouts/shortcodes/img.html delete mode 100644 layouts/shortcodes/presentations.html delete mode 100644 layouts/shortcodes/publications.html delete mode 100644 layouts/shortcodes/recent-articles.html diff --git a/.gitignore b/.gitignore index 46f5006..501a56b 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ public/* +resources/* diff --git a/assets/auto-theme.css b/assets/auto-theme.css deleted file mode 100644 index 37a5355..0000000 --- a/assets/auto-theme.css +++ /dev/null @@ -1,156 +0,0 @@ -:root { - --size: 0.96rem; - --spacing: calc(var(--size) * 2); -} - -body { - font-family: "Nunito", "Avenir Next", "Avenir", "Segoe UI", "Helvetica Neue", - Helvetica, Arial, sans-serif; - font-size: calc(var(--size) * 1.6); - line-height: 1.45; - padding: 0 2.8rem 2.8rem; -} - -header, -main, -footer { - max-width: 66ch; -} - -header, -footer { - position: relative; -} - -.mesh-wrap { - position: relative; - left: 50%; - width: 100vw; - transform: translateX(-50%); - pointer-events: none; - overflow: hidden; -} - -.mesh-image { - display: block; - width: auto; - height: auto; - max-width: none; - position: absolute; - left: 50%; - transform: translateX(-50%); -} - -.mesh-wrap-top { - height: 100px; - margin-bottom: 0.6rem; -} - -.mesh-image-top { - top: 0; -} - -.footer-copy { - padding-top: 0.5rem; -} - -h1, -h2, -h3, -h4 { - font-weight: 600; -} - -h1 { - font-size: calc(var(--size) * 3.4); -} - -h2 { - font-size: calc(var(--size) * 2.8); -} - -.title h1 { - font-size: calc(var(--size) * 2.9); -} - -nav a, -a.blog-tags { - margin-right: calc(var(--spacing) / 2.8); -} - -a { - text-decoration: none; -} - -a:hover, -a:focus-visible { - text-decoration: underline; -} - -ul.blog-posts li { - margin-bottom: 0.2rem; -} - -li { - margin-block-start: calc(var(--spacing) / 2.8); -} - -@media (prefers-color-scheme: light) { - body { - background-color: #ffffff; - color: #1f2328; - } - - h1, - h2, - h3, - h4, - h5, - h6, - strong, - b { - color: #111827; - } - - a { - color: #0969da; - } - - a:visited, - ul.blog-posts li a:visited { - color: #8250df; - } - - textarea, - input { - background-color: #f6f8fa; - color: #1f2328; - border: 1px solid #d0d7de; - } - - table, - th, - td { - border-color: #d0d7de; - } - - code { - color: #24292f; - background-color: #f6f8fa; - } - - pre code { - background-color: #f6f8fa; - } - - blockquote { - border-left-color: #8c959f; - color: #57606a; - } - - figcaption > p, - .helptext { - color: #57606a; - } - -} diff --git a/layouts/index.html b/layouts/index.html deleted file mode 100644 index 833cae1..0000000 --- a/layouts/index.html +++ /dev/null @@ -1,19 +0,0 @@ -{{ define "main" }} - - {{ .Content }} - -

My most recent posts

-
- -

All posts →

- - -{{ end }} diff --git a/layouts/page/presentation.html b/layouts/page/presentation.html deleted file mode 100644 index 9eda755..0000000 --- a/layouts/page/presentation.html +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/layouts/partials/custom_head.html b/layouts/partials/custom_head.html deleted file mode 100644 index 74a4f70..0000000 --- a/layouts/partials/custom_head.html +++ /dev/null @@ -1,2 +0,0 @@ -{{ $autoTheme := resources.Get "auto-theme.css" | minify }} - diff --git a/layouts/partials/footer.html b/layouts/partials/footer.html deleted file mode 100644 index e0d702a..0000000 --- a/layouts/partials/footer.html +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/layouts/partials/header.html b/layouts/partials/header.html deleted file mode 100644 index 804be55..0000000 --- a/layouts/partials/header.html +++ /dev/null @@ -1,6 +0,0 @@ - - -

{{ .Site.Title }}

- diff --git a/layouts/partials/nav.html b/layouts/partials/nav.html deleted file mode 100644 index 5a7ea58..0000000 --- a/layouts/partials/nav.html +++ /dev/null @@ -1,4 +0,0 @@ -{{ range .Site.Menus.main.ByWeight }} - {{ .Name }} -{{ end }} -RSS diff --git a/layouts/shortcodes/code.html b/layouts/shortcodes/code.html deleted file mode 100644 index 47be546..0000000 --- a/layouts/shortcodes/code.html +++ /dev/null @@ -1,6 +0,0 @@ -{{ .Page.Store.Set "hasCodeBlock" true }} -{{ $lang := .Get "language" | default "" }} -{{ with .Get "title" }} -

{{ . }}

-{{ end }} -{{ highlight (trim .Inner "\r\n") $lang "" }} diff --git a/layouts/shortcodes/fontawesome.html b/layouts/shortcodes/fontawesome.html deleted file mode 100644 index 7e68a9c..0000000 --- a/layouts/shortcodes/fontawesome.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/layouts/shortcodes/img.html b/layouts/shortcodes/img.html deleted file mode 100644 index 86148b3..0000000 --- a/layouts/shortcodes/img.html +++ /dev/null @@ -1,6 +0,0 @@ -
- -
diff --git a/layouts/shortcodes/presentations.html b/layouts/shortcodes/presentations.html deleted file mode 100644 index 9e7e7d8..0000000 --- a/layouts/shortcodes/presentations.html +++ /dev/null @@ -1,6 +0,0 @@ -
    - {{ 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 deleted file mode 100644 index ce11be6..0000000 --- a/layouts/shortcodes/publications.html +++ /dev/null @@ -1,5 +0,0 @@ -
    - {{ range .Site.Data.publications }} -
  • {{ .authors }} ({{ .year }}). {{ .title }}. {{ .journal }} {{ .volume }}, {{ .pages }} {{ with .link }} [Link]{{ end }}
  • -{{ end }} -
diff --git a/layouts/shortcodes/recent-articles.html b/layouts/shortcodes/recent-articles.html deleted file mode 100644 index e69de29..0000000 diff --git a/themes/hugo-bearcub b/themes/hugo-bearcub index 1d12a76..ef8f417 160000 --- a/themes/hugo-bearcub +++ b/themes/hugo-bearcub @@ -1 +1 @@ -Subproject commit 1d12a76549445b767fa02902caf30cec7ceaecf9 +Subproject commit ef8f417c6c8f62702df76293ebe0bbccb424c16d From 533ba0827688ac62b36e57444110585b4725b953 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Mon, 2 Mar 2026 19:40:08 -0500 Subject: [PATCH 23/26] Use my custom theme --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index 4d81b35..094f5d7 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "themes/hugo-bearcub"] path = themes/hugo-bearcub - url = https://github.com/clente/hugo-bearcub + url = https://forge.alexselimov.com/aselimov/hugo-bearcub.git From d91bf71f018810aa85fb1b6cac76764df5aa4c56 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Mon, 2 Mar 2026 19:46:59 -0500 Subject: [PATCH 24/26] Update about --- content/about.md | 6 ++- content/cv.md | 2 +- hugo.toml | 110 +++++++++++++++++++++++------------------------ 3 files changed, 61 insertions(+), 57 deletions(-) diff --git a/content/about.md b/content/about.md index 761324a..883f52b 100644 --- a/content/about.md +++ b/content/about.md @@ -5,7 +5,7 @@ hideDate: true --- -{{< img src="/profile.jpeg" max-width="250px" >}} +{{< img src="/profile.webp" max-width="250px" >}} ## Quick Facts @@ -21,3 +21,7 @@ hideDate: true - **Good at Algorithm design, performance tuning** - **AI:** Did work with Active Learning and traditional models (small data) before ChatGPT. - **LLMs:** Messing around with them, use codex mainly, planning a write up on my thoughts. + +## Curriculum Vitae + +[Click here for my CV](/cv.html) diff --git a/content/cv.md b/content/cv.md index 1bed2bb..b6bd688 100644 --- a/content/cv.md +++ b/content/cv.md @@ -1,6 +1,6 @@ --- title: "" -date: 2022-10-04T23:35:54-04:00 +hideDate: true --- Alex Selimov diff --git a/hugo.toml b/hugo.toml index 55295b4..427c2e3 100644 --- a/hugo.toml +++ b/hugo.toml @@ -6,68 +6,68 @@ copyright = "© Alex Selimov" enableRobotsTXT = true [pagination] -pagerSize = 5 +pagerSize = 10 [markup] - [markup.goldmark.renderer] - unsafe = true - [markup.highlight] - lineNos = true - lineNumbersInTable = false - noClasses = false +[markup.goldmark.renderer] +unsafe = true +[markup.highlight] +lineNos = true +lineNumbersInTable = false +noClasses = false [taxonomies] - tag = "tags" - topic = "topics" +tag = "tags" +topic = "topics" [languages] - [languages.en] - title = "Alex Selimov" - languageName = "en-US" - languageCode = "en-US" - [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 +[languages.en] +title = "Alex Selimov" +languageName = "en-US" +languageCode = "en-US" +[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] - 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 +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 = 10 - [[params.popularPosts]] - title = "Say goodbye to st and say hello to ghostty" - url = "/posts/st_to_ghostty/" - [[params.popularPosts]] - title = "Getting CUDA toolkit installed on Void Linux" - url = "/posts/cuda_on_void/" - [[params.popularPosts]] - title = "Rust is pretty good (Short thoughts on Rust)" - url = "/posts/thoughts_on_rust/" - [[params.popularPosts]] - title = "My nvim/tmux workflow" - url = "/posts/tmux_and_nvim/" - [[params.popularPosts]] - title = "Fighting the web obesity crisis using Hugo and Skeleton CSS" - url = "/posts/web_obesity/" +[[params.popularPosts]] +title = "Say goodbye to st and say hello to ghostty" +url = "/posts/st_to_ghostty/" +[[params.popularPosts]] +title = "Getting CUDA toolkit installed on Void Linux" +url = "/posts/cuda_on_void/" +[[params.popularPosts]] +title = "Rust is pretty good (Short thoughts on Rust)" +url = "/posts/thoughts_on_rust/" +[[params.popularPosts]] +title = "My nvim/tmux workflow" +url = "/posts/tmux_and_nvim/" +[[params.popularPosts]] +title = "Fighting the web obesity crisis using Hugo and Skeleton CSS" +url = "/posts/web_obesity/" - [params.author] - name = "Alex Selimov" +[params.author] +name = "Alex Selimov" From 0149d910981d7c7e0d8c8eccb8d870455cbc45a9 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Mon, 2 Mar 2026 19:47:36 -0500 Subject: [PATCH 25/26] Latest version of theme --- themes/hugo-bearcub | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/hugo-bearcub b/themes/hugo-bearcub index ef8f417..f166dea 160000 --- a/themes/hugo-bearcub +++ b/themes/hugo-bearcub @@ -1 +1 @@ -Subproject commit ef8f417c6c8f62702df76293ebe0bbccb424c16d +Subproject commit f166deabfb2e6fd76926c342b6c30ea450bd0744 From 4330e0b9bdeb63173ce418ee083fea2cbcb07974 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Mon, 2 Mar 2026 20:28:54 -0500 Subject: [PATCH 26/26] Fix colors --- static/mesh.svg | 2058 ------------------------------------------- themes/hugo-bearcub | 2 +- 2 files changed, 1 insertion(+), 2059 deletions(-) delete mode 100644 static/mesh.svg diff --git a/static/mesh.svg b/static/mesh.svg deleted file mode 100644 index a2cc8d6..0000000 --- a/static/mesh.svg +++ /dev/null @@ -1,2058 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/themes/hugo-bearcub b/themes/hugo-bearcub index f166dea..ce5baa5 160000 --- a/themes/hugo-bearcub +++ b/themes/hugo-bearcub @@ -1 +1 @@ -Subproject commit f166deabfb2e6fd76926c342b6c30ea450bd0744 +Subproject commit ce5baa572d9c7060b0b812ed03f054f71b9066a4