Creating thoughtfully-engineered, finely-crafted, and well-tested software.

A software engineer with over a decade of experience - this website is for sharing technical articles, and my own side-projects related to software engineering. I hope you enjoy it!

What to expect:

  • Weekly devlog updates
  • Monthly technical articles
  • Occasional software releases
Support Me on Ko-Fi!

FEATURED PROJECTS

view all projects →

No data yet...

(Check back later!)

LATEST ARTICLES

view all articles →
An Osaka toy from Azumanga Daioh sitting under a kotatsu with a strange cat at a desk next to her.

10 Things to Check on Your Static Website Before Launch

Though it’s taken me longer than expected, sigseis.dev is mostly done - with only a few remaining missing features and polish work. With this site being mostly finished, I thought it would be fun to write up a little article about some things you should check on your static sites! At least while it’s still fresh in my own mind. UPDATE: 2026/08/04 - Added a section about “Optimizing Content Delivery”, dropped the “Sticky Headings” to be bonus content, and a small bit of text on tabindex in the accessibility section.
Read More...
A Chiyo toy from Azumanga Daioh standing at the front of a classroom.

How to Organize Rust Modules for Maintainability

Today I’d like to talk a bit about how I like to organize my Rust projects. In particular, I’d like to talk about modules (you cannot talk about project organization without talking about modules). First, I’ll define what modules are, and give a brief explanation for how they work. After that, I’ll explain my recommended approach for organizing modules in Rust.
Read More...

LATEST DEVLOGS

view all devlogs →

LOG 010

2026/08/07

★ Typed Identifiers

  • Continued experimenting with the typed identifiers API.

  • Refactored and deduped the various part types (Fragment, Word, Segment).

  • Created a Case trait to dedupe how we reformat character profiles.

  • Finished adding functionality to convert between different identifiers via the ConvertCase trait.

  • Started adding comprehensive integration tests to validate the functionality.

I thought this would be an easy and quick crate, and I’ve grossly underestimated how complicated generalized typed identifiers are.

I’m still not done with this, and it’s still not ready to share. But I can show you what it looks like currently (note: crate is the stand-in for the final crate name, which is currently undecided):

use crate::{casing, delimiter, profile, Ident};

// A lower_snake_case identifier using the Unicode XID profile.
type LowerSnakeIdent = Ident<
    casing::Lower,
    delimiter::LowLine,
    profile::Unicode,
>;

// Only allows lower_snake identifiers.
let ident = LowerSnakeIdent::new("example_snake")?;
assert!(LowerSnakeIdent::new("example-kebab").is_err());
assert!(LowerSnakeIdent::new("exampleCamel").is_err());

// You can easily extract segments of the identifier.
// Prints:
// * Word(Word("example"))
// * Delimiter(LowLine)
// * Word(Word("snake"))
println!("{ident} segments:");
for segment in ident.segments() {
    println!("* {segment:?}");
}

// You can also easily convert to other identifiers.
//
// The type here is `IdentBuf<UpperCamel, LowLine, Unicode>`,
// but you can test against strings (`PartialEq` works against `&str`).
assert_eq!(ident.to_upper_camel()?, "ExampleSnake");

LOG 009

2026/07/31

★ Typed Identifiers

  • Continued experimenting with the typed identifiers API.

  • Created a Profile trait for allowing users to configure the allowable character profile.

  • Created a Delimiter trait for allowing users to configure the allowable identifier delimiters.

  • Added some default profiles (unicode & ascii), as well as delimiters (hyphen minus, low bar, etc).

  • Documented the parts types and added doc tests where reasonable.

It’s taking a bit longer than I’d like to finish this typed identifiers crate, but I’m pretty happy with the direction it’s heading. I know that if I don’t follow this through now, I’ll have trouble following it through in the future.

I will give it another week. It’s not the most exciting project to release, but I’m happy with the direction it’s heading.

LOG 008

2026/07/24

★ Typed Identifiers

  • Split some of the utility functions I had into a helper crate for identifier parsing.

  • Added the ability to split identifiers into parts (fragments, segments, words, etc).

  • Added more functionality so that I can turn it into a more feature-complete crate (trimming, splitting, appending, etc).

  • Documented the current functionality and added unit tests for everything.

This crate is to have typed identifiers that I can work with in Rust, and for easily and safely converting cases. The main thing it does differently from similar libraries is that it actually has types that exist for the various identifier formats (LowerCamelIdentifier, UpperSnakeIdentifier, etc) instead of just having conversion functions.

This is needed for some future projects I have.