Select list of personal projects in alphabetical order.
Click any of the project names to jump to their sections.
- after - Echo string after process death (C) (OpenBSD).
- hidlock - Lock screen on HID attach (Shell) (OpenBSD).
- humin - Convert seconds to human-readable date (C).
- nlcc - Compile NIST LWC entries into executable (C).
- page - Secret storage using age encryption (Go).
- pledgeme - pledge(2) arbitrary programs (C) (OpenBSD).
- recreg - Record region of an X11 screen (Shell).
- reprose - Basic Go package server (Go).
- sghs - Shitty Go HTTP Server (Go).
- shite - Static site generation scripts in
- stsd - Secure Time Sync Daemon (Go).
- subc - Subcommands package (Go).
- wslcheck - Package that can test whether it is running on WSL (Go).
- yubilock - Lock X11 screen on YubiKey detach (Shell) (OpenBSD).
after is an
OpenBSD-specific program that echoes a string after a
process has died.
In traditional interactve Unix-like shell usage if you wanted to echo something after a program is finished running you’d do:
$ program; echo "finished!".
But what if you’ve already started
don’t want to stop it, but still want to run some other code after it
finishes? That’s what
after is for:
$ after -n program -e "finished!"
You can use
after’s output to run shell commands. For instance, if you
wanted to shutdown your machine after your
program is finished:
$ after -n program -e "shutdown -p now" | sh
The only reason
after is OpenBSD-specific is because at the time I mainly
hidlock is an OpenBSD-specific hotplugd(8) script that locks all X displays when a new Human Interface Device is detected by hotplugd(8).
Essentially it aims to protect against HID attacks in which malicious HIDs
are used to inject keystrokes into users machines - with hidlock the display
is locked as soon as the HID is attached - this way any injected keystrokes
get sent straight to the lockscreen and nowhere near the user’s environment.
See the project’s README for screenshots and a more in-depth explanation.
Inspired by human - which prints number in human-readable format - humin is a simple CLI program to convert seconds to human readable time. It’s one of my first publicly published C programs and so it isn’t very good. The conversion logic is not very efficient and possibly just plain wrong. I have plans to rewrite it from scratch. Simply put this is what it can do:
$ humin 10000 02:46:40 $ humin 100000 01 days 03:46:40
nlcc was written while on semester break for University as part of a cryptography research project. For this project a small team of us students were tasked with researching an analysing one of the contenders for NIST’s Lightweight Cryptography Competition.
We had to narrow down candidates in order to choose a single algorithm to
The competition entires’ C implementation code had to adhere to a specific API/spec. I figured I could use this to create a plug-and-play program that would allow any one of the entires to be compiled into a CLI executable - that’s what
nlcc is. It allows the user to specify inputs for the cipher’s
AEAD paramaters through the command-line; it performs both encryption and
decryption and shows a summary of the algorithm inputs:
$ ./nlcc -k ./file -m "testing message" -a "adadadadad" Key = ffffffffffffffffffffffffffffffff (128) Nonce = 000000000000000000000000 (96) AD = 61646164616461646164 (80) PT = 74657374696e67206d657373616765 ("testing message") (120) CT = 87e649bf2c3e6c83cbb1ee7120c419a1f58b03b0386258
A command-line password manager written in Go that uses the
age encryption algorithm for storing secrets
$EDITOR to edit entries, supports decrypting+copying secrets to the
clipboard, random string password generation.
I used this as my main password manager for a long time (utilising Termux on Android to use it on my phone). Its inspired by many other CLI password managers including its predecessor, cpass.
I’ve switched to Bitwarden for password management these days, but I spent a lot of time building and “perfecting” page for my own use.
A super small command-line program to pledge(2) arbitrary programs on OpenBSD. See the README for more info.
recreg is a small ffmpeg script that makes recording a specific region of an X11 screen a little less painful:
rr 260x320+0+760 bottom_right_corner.mkv
reprose is a super basic Go package server that essentially just redirects go-get requests to git repos. It powers go.zakaria.org.
Shitty Go HTTP Server - a super simple Go HTTP fileserver for just serving files. Supports TLS too, if you’ve got the cert files for it.
A collection of shell scripts used to generate this static site.
It uses standard Unix stuff like
sed, and uses lowdown to convert
Markdown into HTML.
Very opinionated, you probably don’t want to use it
Secure Time Sync Daemon. A system daemon that uses HTTP date headers over TLS (HTTPS) to set system date as opposed to NTP. Why not NTP? See the README.
A super small, super simple subcommand package for Go. It wraps the standard
flag package and uses FlagSets to create arbitrary “subcommands” for CLI
projects. It’s used by
Go package that tests whether you’re running on WSL based on the kernel
version string. It’s used in
page to know whether to use
yubilock is another hotplugd(8) script similar to hidlock, except it locks the display when a YubiKey device is removed.
List of open-source projects I have contributed to in some capacity.
Spelling mistakes/formatting changes not included.