ALL DEVLOGS

LOG 021

2026/10/23

★ Error Handling

  • Researched and started working on my next crate (an error handling crate).

  • Developed an implementation for the error handling traits and types.

  • Made a proc-macro for deriving traits on error types (#[derive(ErrorCode)]).

  • Made a proc-macro attribute for appending context information on failing a function (#[error(...)]).

  • Started writing my next article (mostly I'll focus on that next week).

My next crate is a pretty obscure kind of error handling crate.

It will be useful for crates which don’t usually wish to carry error details (like in production, for instance), but can benefit from being configured to do so for debug builds, or for testing, or during development of new features.

I’m still not sure what to call the crate, and it’s kind of hard to summarize how it works… I think you’ll just have to wait until I release an alpha to get a look at it.

Next week I’ll prioritize working on my next article.

LOG 020

2026/10/16

★ Typed Identifiers

  • Released 0.0.3 of the typed-ident crate (full release notes)!

  • Allows conversion traits to bind to typed results (#38).

  • Cleaned up formatting options to make the traits more approachable (#40)

  • Updated documentation in preparation for the new release (#42)

  • And other usability improvements for the typed-ident API.

This will be the last update to typed-ident for a while.

I still want to add spanned identifiers. That’s my most wanted feature, and arguably the main reason that I even developed the crate in the first place. However, I think it would be best to first have a crate that plans on using the feature before continuing to develop it - so that I can dogfood the design a bit locally.

The crate is in a really good place right now though. It may have a few small design or usability issues, but I think it needs to be used a bit to find them.

Next week, I’ll start preparing the next crate I plan on publishing.

LOG 019

2026/10/09

★ Typed Identifiers

  • Released a new article on the basics of Rust declarative macros.

  • Added the ability to iterate over Words and WordIndices for Fragment types.

  • Cleaned up and simplified the module hierarchy in typed-ident.

  • Did analysis on weird characters that don't change case in Unicode (see KNOWN_ODDITIES).

  • Cleaned up constants, and fixed a bug where documentation wasn't tagging feature-specific items.

This week I spent a bit of time editing and releasing my latest article - I think it went well!

It’s still not perfect, but I hope it’s helpful to some, and it seems to be well-received. I appreciate everyone who read and gave feedback, and I’ll try to make future articles even better!

Other than that, just a lot of clean-up work in typed-ident. Looking at what’s left to do, it’s not as much as I had feared. I think it may be possible that I am able to release v0.0.3 later next week.

No promises though, it’ll realistically be released when ready.

LOG 018

2026/10/02

★ Static Site Generator

  • Completely rewrote the Markdown parser so that I could reuse it in various places.

  • All articles now have an auto-generated table of contents after the brief.

  • Articles now use proper annotation styles for notes, warnings, tips, etc.

  • sigseis.dev now supports displaying project pages and updates.

  • A bug with the relative date pillboxes was fixed for devlogs (sometimes they would not appear).

  • Wrote an article for Rust declarative macros which will release early next week.

This took almost my entire week, there was a lot to change just to get a table of contents to be able to generate on the site.

Truth be told, I didn’t want to spend forever perfecting my static site generator, so I just do what I need. Because of that, some parts of it are a tiny bit hacky. So when I decide I want a feature like this, I sometimes have to look at the implementation and come to terms with the fact that it needs written properly before I can get what I want.

I have more I would like to do with this website. But I think I’m going to get v0.0.3 of typed-ident released first, then maybe I’ll come back to this and clean it up a bit more.

Of note, the CSS is pretty bad, it needs some attention. But I don’t want to spend time on the CSS until I fix other usability issues on the site. So I’m going to ask for feedback from various webdev communities and see if there’s anything I should improve or change first.

Anyhow, next week please look forward to a new article serving as an introduction to Rust declarative macros! I plan to continue the articles, specifically focusing on macros, until I’ve said all I want to say about them. Next week, I’ll get back to work on typed-ident as well. I’m looking forward to it!

LOG 017

2026/09/25

★ Static Site Generator

  • Working on a refactor to improve the Markdown parsing.

  • Working on updating the code to use the new Markdown parser.

  • Adding functionality so that I can list projects on my website.

  • Adding functionality to improve the navigability of long articles.

I was hoping this would only take a week, but it turns out that rewriting the markdown parser is a little harder than I originally anticipated.

The new Markdown parser works now, but I haven’t switched the code to using it just yet. It’s a little too soon, and I’d like to spend some more time testing it.

I’ll continue working on it into next week. After I’m done updating this website, I’ll get back to work on typed-ident.

LOG 016

2026/09/18

★ Typed Identifiers

  • Released 0.0.2 of the typed-ident crate!

  • Added variants for CasedCamelIdent, CasedHybridIdent, CasedKebabIdent and CasedSnakeIdent (#1)

  • Generated title case and combination character mappings to improve correctness and efficiency (#6)

  • Greatly improved documentation, and updated to match the 0.0.2 release (#2)

  • Cleaned up the FragmentBuf API substantially using traits (#5)

There’s still more to work on before I’ll feel good about moving on from typed-ident, but this is really heading in a nice direction.

I strongly recommend taking a look at the newly-revised documentation. There’s still a few issues, and some things that I caught right after publishing (like always), but I think it’s still a big jump in quality.

In particular, I think the new presets documentation makes understanding the presets a lot easier.

Now it’s time to move on to 0.0.3 work!

LOG 015

2026/09/11

★ Typed Identifiers

  • Publicly released the typed-ident crate alpha

  • Wrote and released a retrospective article on typed-ident

  • Found a design issue just after publishing (at least it's still alpha)

  • Started working on a fix for the design issue in question (#1)

typed-ident has been released!!

It’s only alpha, and I’m thankful for that, because just after publishing I noticed an issue.

The details are present in the GitHub issue that I filed, but the TL;DR is that the uncased types don’t enforce a consistent casing. So SnakeIdent doesn’t have to be either upper or lower case, it can be a mixture of cases.

I knew that this was the case, and originally I had convinced myself that it made sense. But now that I have the crate published, I don’t feel that way any longer. So I’m trying to fix it so that there’s a more strict stance on this.

I’ll still provide the mixed-case variants, they just may be named differently.

LOG 014

2026/09/04

★ Out Sick

  • Fixed a design issue found during documentation.

  • Finished cleaning up benchmarks, examples, and rough unit tests.

  • Fell ill again in the middle of the week, so I'll publish next week.

I originally had a trip planned for this upcoming week, but I’ll have to cancel it and move it to another date.

I suppose the upside is I’ll be able to release this crate next week, instead of having to wait until returning from my trip. I’m going to finish recovering and then sometime early next week I’ll finally publish this thing.

Next week I’ll write a little retrospective too, that’ll be my article for the month.

LOG 013

2026/08/28

★ Typed Identifiers

  • Fully documented the remainder of the crate.

  • Created benchmarks using Criterion, and fixed some optimization issues.

  • Cleaned up the implementation a bit more, and some small rename operations.

  • Cleaning up the tests and ensuring decent test coverage for the initial release.

  • Fixed a small design issue with the identifier conversion traits.

I’m basically done, just cleaning up testing and documentation at this point.

There’s certainly more that could be done, but I think I want to get a 0.0.1 release out there, that way others can actually see what I’m working on (as opposed to me just talking about it in devlog updates).

I think it’ll release sometime next week - please look forward to it!

LOG 012

2026/08/21

★ Typed Identifiers

  • Fully documented the syntax and core modules.

  • Cleaned up various marker traits (SubsetOf, SingleCharGraphemes, etc).

  • Cleaned up the trait interface, and finalized the names for all the types.

  • Added an optional Strict profile, which hardens the enforcement of identifier formats.

  • Added more doctests, specifically around SubsetOf, to ensure things are working properly.

The API has been finalized!

I might change around some things (for instance, I’m currently debating if I want to put the syntax module under core), but for the most part it’s complete - just needs more documentation.

It changed a tiny bit from the last time I posted an example, so let’s take another look:

use crate::syntax::{boundary, delimiter, profile};
use crate::{Conversion, Ident, Chunk};

// A lower_snake_case identifier using the Unicode XID profile.
type LowerSnakeIdent = Ident<
    boundary::None,
    delimiter::LowLine,
    profile::Lower<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:
// * Chunk(Chunk("example"))
// * Delimiter(LowLine)
// * Chunk(Chunk("snake"))
println!("{ident} segments:");
for segment in ident.segments() {
    println!("* {segment:?}");
}

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

LOG 011

2026/08/14

★ Prototyping

  • Continued prototyping the major project I'm working on.

  • Experimented with some new ideas with traits that I think will improve the API.

  • A little work on typed identifiers, but mostly adding tests and documentation.

  • A little bit of deduplication work, moving common impls into declarative macros.

I don’t feel at liberty to share the main project I’m prototyping, still. But I can give you all a little sneak peek at how testing is done for the typed identifiers crate!

I’m pretty proud of how it works:

  • I have some files that dictate certain valid and invalid identifiers.
  • At runtime, the data is expanded in a stress integration test.
  • Each “test identifier” is visited, and based on the data, we attempt different operations, and validate against the test data.

Here’s an example for what this test data looks like (not actually in YAML format, just shown that way for example):

- name: "CaféPatron"
kebab: true
snake: true
camel: true
upper_camel: true
segments:
- !Chunk "Café"
- !Boundary Camel
- !Boundary Hat
- !Chunk "Patron"

This entry says:

  1. There’s a valid identifier that can parse as mixed-case kebab, mixed-case snake, mixed-case camel, or upper-camel.
  2. Based on how the identifier is configured to respect chunk boundaries, it may or may not break apart Café from Patron (if CAMEL or HAT boundary options are enabled, specifically).
  3. Tests segmentation using all combinations of options, and ensures that they return ["CaféPatron"] or ["Café", "Patron"] as expected.
  4. Tests that case conversion works and respects chunk boundaries (e.g., when converting to another case, we have the same number of chunks, though they may now be slightly reformatted).

It also validates some inverse properties. For example, we cannot parse this as LowerSnakeIdent (according to the data), so we will validate that.

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.

LOG 007

2026/07/17

★ Prototyping

  • Continued prototyping the major project I'm working on.

  • Starting to break the project up into sub-projects that I will release as helper crates.

  • Some slight cleanup of the articles that I've written so far.

I’m changing when I publish the monthly articles - instead of publishing them at the end of the month, I’m going to start publishing them on the first Monday of the month. This is so that the articles don’t intersect with the weekly devlogs, and because I think that most people probably aren’t reading technical articles over the weekend.

This means the next article will be on August 3rd - please look forward to it!

LOG 006

2026/07/10

★ Out Sick

  • I was sick all week... Take care and stay healthy!

LOG 005

2026/07/03

★ Static Site Generator

  • General improvements to the site; canonicalized redirects, added aria support, better image handling, JPEG-XL support, inlining critical JS, deferred non-critical JS, user's default theme preference taken into account.

  • Improved the articles page to have better style, sticky headings, anchor link support, better word counting, reading time estimates.

  • Updated cache busting to use file hashes instead of modified times (that felt cleaner to me).

  • Fixed a bug where cached content was not properly marked as immutable in the response header.

  • Added proper support for article tags (with a tags page to view similar articles).

  • Started writing the next article I plan on publishing (not finished yet).

I didn’t want to work on this more, but it’s hard to look at a list of future improvements and not want to work to fix them now. I feel pretty happy with this update, despite not initially wanting to do it!

LOG 004

2026/06/26

★ Static Site Generator

  • Changed how static asset cache busting was done (the original method did not work on all browsers).

  • Added the ability to generate different sized and format images for efficient image presentation.

  • Added support for articles, as well as article selection (different from devlogs formatting).

  • Fixed some bugs where the site wasn't presenting properly (weird CSS, etc).

There’s definitely more to do here, but I’m really getting annoyed with how much time I’m spending on this website. I’m hoping this week will be the last time I have to spend significant effort on it.

LOG 003

2026/06/19

★ Prototyping

  • Spent most of my time working on a prototype for a project that I'm getting off the ground.

  • Added open graph and meta elements to the site to make it present clearer on social media.

  • Some small bug fixes and improvements to the website (colors, layouts, organization, etc).

  • Backend site generator improvements (code cleanup and logic deduplication).

I made an invasive change to the devlogs. If you were subscribed to the RSS feed, the old devlogs may register as new again (sorry about that). I’ll try to avoid that in the future, but it felt like a necessary change.

LOG 002

2026/06/12

★ Static Site Generator

  • Many bugs on the site have been ironed out.

  • Populated the "Home" and "About" page.

  • Wrote an article for the end of the month (to test article formatting).

  • Published the website for the first time!

I’m sure I’ll find little bugs here and there - but this website is not where I want to be spending the majority of my time. I’d much rather spend it on actual software project.

LOG 001

2026/06/05

★ Static Site Generator

  • The site generator is working, but it's not quite ready for production yet.

  • Lots of fundamental features are present (cache busting, header, devlogs, theme selection, etc.)

  • Did a bit of work on the prototype for the first major software project I'll be releasing.

I originally planned on having the site live by this date, but I’d rather hold off a while longer so that I can properly test it. Over the next week I’m going to continue working on the site, as well as begin drafting my first long-form article that I’ll post at the end of the month.