To add onto this list (unless I missed it), I would recommend interpreter, compiler and assembler. An interpreter is a fun way to learn a new language and can be done creatively and artistically which allows you to exercise the art of programming in expressive ways. Lexing for optimal string manipulation and parsing, AST construction for fun ways of building and creating the grammar and interpretation which can be done any number of ways.
Also, it’s not as hard as it seems if compilers in college was your last attempt in this area.
- crafting interpreters
- writing and interpreter/compiler in Go
Both good books on the domain for an amateur compiler writer.
For lower level assembler and chip design stuff/logic gates etc. obviously I recommend Nand2Tetris