diff --git a/content/articles/_index.md b/content/articles/_index.md
new file mode 100644
index 0000000..bc3438a
--- /dev/null
+++ b/content/articles/_index.md
@@ -0,0 +1,7 @@
++++
+title = 'Articles'
+date = 2025-12-23T08:30:00-07:00
+draft = false
++++
+
+Tempor est exercitation ad qui pariatur quis adipisicing aliquip nisi ea consequat ipsum occaecat. Nostrud consequat ullamco laboris fugiat esse esse adipisicing velit laborum ipsum incididunt ut enim. Dolor pariatur nulla quis fugiat dolore excepteur. Aliquip ad quis aliqua enim do consequat.
diff --git a/content/articles/post-1.md b/content/articles/post-1.md
new file mode 100644
index 0000000..54f4f32
--- /dev/null
+++ b/content/articles/post-1.md
@@ -0,0 +1,14 @@
++++
+title = 'Post 1'
+date = 2025-12-23T09:00:00-07:00
+tags = ['red']
+draft = false
++++
+
+Tempor proident minim aliquip reprehenderit dolor et ad anim Lorem duis sint eiusmod. Labore ut ea duis dolor. This is a [link](http://git.samanthony.xyz) within body text. Incididunt consectetur proident qui occaecat incididunt do nisi Lorem. Tempor do laborum elit laboris excepteur eiusmod do. Eiusmod nisi excepteur ut amet pariatur adipisicing Lorem.
+
+Occaecat nulla excepteur dolore excepteur duis eiusmod ullamco officia anim in voluptate ea occaecat officia. Cillum sint esse velit ea officia minim fugiat. Elit ea esse id aliquip pariatur cupidatat id duis minim incididunt ea ea. Anim ut duis sunt nisi. Culpa cillum sit voluptate voluptate eiusmod dolor. Enim nisi Lorem ipsum irure est excepteur voluptate eu in enim nisi. Nostrud ipsum Lorem anim sint labore consequat do.
+
+Tempor proident minim aliquip reprehenderit dolor et ad anim Lorem duis sint eiusmod. Labore ut ea duis dolor. Incididunt consectetur proident qui occaecat incididunt do nisi Lorem. Tempor do laborum elit laboris excepteur eiusmod do. Eiusmod nisi excepteur ut amet pariatur adipisicing Lorem.
+
+Occaecat nulla excepteur dolore excepteur duis eiusmod ullamco officia anim in voluptate ea occaecat officia. Cillum sint esse velit ea officia minim fugiat. Elit ea esse id aliquip pariatur cupidatat id duis minim incididunt ea ea. Anim ut duis sunt nisi. Culpa cillum sit voluptate voluptate eiusmod dolor. Enim nisi Lorem ipsum irure est excepteur voluptate eu in enim nisi. Nostrud ipsum Lorem anim sint labore consequat do.
diff --git a/content/articles/tools-i-use.md b/content/articles/tools-i-use.md
new file mode 100644
index 0000000..952d782
--- /dev/null
+++ b/content/articles/tools-i-use.md
@@ -0,0 +1,74 @@
++++
+title = 'Tools I Use'
+date = '2026-01-02T15:24:53-03:30'
+tags = []
+draft = true
++++
+
+Here is a list of some of the tools I use day-to-day.
+
+
+# Software
+
+- [Gentoo Linux](https://www.gentoo.org/) ---
+ One of the most solid barebones Linux distros I know of.
+ I use it on my desktop and laptop computers.
+- [OpenBSD](https://www.openbsd.org/) ---
+ Secure server operating system.
+ I use it to serve this website.
+
+ Unlike a GNU/Linux distro, OpenBSD is a single homogeneous system.
+ Everything makes sense and the documentation is really good.
+ Reminds me of [Plan 9](https://plan9.io/plan9/) in that respect.
+
+- [Acme](http://acme.cat-v.org/) ---
+ Originally developed for Plan 9, Acme is [Rob Pike's](https://commandcenter.blogspot.com/) user interface for programmers.
+ It's what we now call an IDE.
+ I'm writing this article in Acme right now.
+
+ Every piece of text in Acme can be a executed or piped into/out-of a script.
+ Very powerful.
+- [Dwm](https://dwm.suckless.org/) ---
+ Nice tiling window manager for X11.
+ Goes well with other Suckless accoutrements.
+- [Syncthing](https://syncthing.net/) ---
+ Syncthing is a sort of distributed filesystem.
+ I use it to synchronize files between my laptop, desktop, and phone.
+
+
+# Hardware
+
+- [Thinkpad T420s](https://www.thinkwiki.org/wiki/Category:T420s) ---
+ I've had this laptop for a few years now; no complaints.
+
+ I replaced the hard drive with an SSD and threw some extra DDR3 in there.
+ The 10+ year old 4-thread Sandy Bridge i5 is actually fine.
+ I'm waiting for someone to make a [serious multithreaded](https://netlib.org/utk/papers/advanced-computers/tera.html) RISC-V CPU, but unfortunately everyone seems to be obsessed with high clock speeds and out-of-order-execution chips that use as much die space and power as possible.
+ That [Esperanto ET-SoC-1](https://youtu.be/LmUu-lN7D0k) looked promising, but apparently they went out of business or something?
+
+ Anyway, the T420s has a sturdy magnesium frame, a good keyboard, and a three-button touchpad which is essential for Acme and CAD programs---I don't know how people live without one.
+
+- iPod mini 1G ---
+ Hard to find a phone with a headphone jack these days.
+ The mini has one, as well as physical buttons and a touch rotary encoder---much nicer than using a touchscreen imo.
+ I want to get a full size iPod 1G with the physical scroll wheel at some point.
+
+ I replaced the battery with a new one and replaced the tiny (both physically and in terms of storage space) hard drive with a 128GB SD card.
+ Running [RockBox](https://www.rockbox.org/).
+ Works mint.
+
+- Casio F-91W ---
+ Cheap wristwatch that keeps time---what can I say?
+ If it's good enough for [al-Qaeda](https://en.wikipedia.org/wiki/Casio_F-91W#Usage_in_terrorism) then it's good enough for me.
+
+ Supposedly this is the most-sold watch in the world.
+ Casio has been making it since 1989.
+
+- [USBtin](https://www.fischl.de/usbtin/) ---
+ Simple USB-to-CAN interface by Thomas Fischl.
+ Works with [SocketCAN](https://docs.kernel.org/networking/can.html).
+ Used to test and debug systems that incorporate a CAN bus, like [this](http://git.samanthony.xyz/can-gauge-interface.git/).
+
+- [Espotek Labrador](https://espotek.com/labrador/) ---
+ Combined oscilloscope, signal generator, power supply, logic analyzer, and multimeter.
+ Obviously a tiny $30 board is not as good as real lab equipment, but it's small and cheap and good enough for now.
diff --git a/go.mod b/go.mod
deleted file mode 100644
index a128ff8..0000000
--- a/go.mod
+++ /dev/null
@@ -1,5 +0,0 @@
-module git.samanthony.xyz/samanthony.xyz
-
-go 1.18
-
-require golang.org/x/sys v0.0.0-20220412211240-33da011f77ad
diff --git a/go.sum b/go.sum
deleted file mode 100644
index 7f2d82d..0000000
--- a/go.sum
+++ /dev/null
@@ -1,2 +0,0 @@
-golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0=
-golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
diff --git a/htdocs/base.html b/htdocs/base.html
deleted file mode 100644
index f96c9c7..0000000
--- a/htdocs/base.html
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-
-
-
-
- {{ define "title" }}samanthony.xyz{{ end }}
- {{ template "title" }}
-
-
-
- {{ define "style" }}{{ end }}
- {{ template "style" }}
-
-
-
-
-
-
- {{ template "body_content" }}
-
-
-
-
-
What Can We Do?
-
-
-
-
- Start your own website where you can complain about stuff too! Anyone can
- and everyone should. With
- all the information that's out there
- it's never been easier to help fix the Web by creating your own site.
-{{ end }}
diff --git a/htdocs/software/index.html b/htdocs/software/index.html
deleted file mode 100644
index ecf8d95..0000000
--- a/htdocs/software/index.html
+++ /dev/null
@@ -1,20 +0,0 @@
-{{ define "title" }}
-
- Get a copy of the source code with
- git clone git://samanthony.xyz/samanthony.xyz.git.
-
-
- The site uses HTML templates to avoid tedium and for the ability to make
- small changes across the entire site without editing multiple files. It uses
- the html/template package included in Go's standard library.
-
-
- A server is required to serve these templates. Once again Go provides with
- the built in http package. This makes writing a web server extremely easy.
- All you have to do is write a function to handle incoming requests and call
- http.ListenAndServe(). Painless.
-
-
- Since I'm running OpenBSD, TLS can be dealt with external to the webserver
- by using relayd. As an aside, I encourage anyone looking for an operating
- system to give OpenBSD a look. It's been an absolute pleasure to work with
- so far. As long as you don't expect it to be exactly like a Linux-based
- system (it's not), then not only is it more secure, but also
- easier to use than something Linux-based. Even for a noob like
- myself. Sane design and good documentation go a long way.
-
-
- Inspiration was taken from httpd and the server runs chroot'd. When
- serving content it also drops down to an unprivileged user with setuid.
-
+{{- end }}
diff --git a/util.go b/util.go
deleted file mode 100644
index 5910a9f..0000000
--- a/util.go
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
-Copyright 2022 Sam Anthony
-
-This file is part of samanthony.xyz.
-
-samanthony.xyz is free software: you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free Software
-Foundation, either version 3 of the License, or (at your option) any later
-version.
-
-samanthony.xyz is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-samanthony.xyz. If not, see .
-*/
-
-package main
-
-import (
- "bufio"
- "errors"
- "fmt"
- "golang.org/x/sys/unix"
- "log"
- "os"
- "runtime"
- "strconv"
- "strings"
-)
-
-func uidOf(user string) (int, error) {
- passwdFile, err := os.Open("/etc/passwd")
- if err != nil {
- return -1, err
- }
- defer passwdFile.Close()
-
- scanner := bufio.NewScanner(passwdFile)
- scanner.Split(bufio.ScanLines)
- for scanner.Scan() {
- line := scanner.Text()
-
- parsed := strings.Split(line, ":")
-
- name := parsed[0]
-
- if name == user {
- uid, err := strconv.Atoi(parsed[2])
- if err != nil {
- return -1, err
- }
- return uid, nil
- }
- }
- return -1, errors.New(fmt.Sprintf("user '%s' not in /etc/passwd", user))
-}
-
-func gidOf(group string) (int, error) {
- groupFile, err := os.Open("/etc/group")
- if err != nil {
- return -1, err
- }
- defer groupFile.Close()
-
- scanner := bufio.NewScanner(groupFile)
- scanner.Split(bufio.ScanLines)
- for scanner.Scan() {
- line := scanner.Text()
-
- parsed := strings.Split(line, ":")
-
- name := parsed[0]
-
- if name == group {
- gid, err := strconv.Atoi(parsed[2])
- if err != nil {
- return -1, err
- }
- return gid, nil
- }
- }
- return -1, errors.New(fmt.Sprintf("group '%s' not in /etc/group", group))
-}
-
-func dropPerms(uid, gid int) error {
- if runtime.GOOS != "linux" {
- if err := unix.Setgid(gid); err != nil {
- return errors.New(fmt.Sprintf("setgid(%d): %v", gid, err))
- }
- if err := unix.Setuid(uid); err != nil {
- return errors.New(fmt.Sprintf("setuid(%d): %v", uid, err))
- }
- return nil
- } else {
- // setuid/setgid has supposedly been fully supported on Linux
- // since go 1.16 but I can't seem to get it to work properly.
- log.Print("setgid not supported on Linux, skipping.")
- log.Print("setuid not supported on Linux, skipping.")
- return nil
- }
-}
--
cgit v1.2.3