Skip to content

Instantly share code, notes, and snippets.


Erin eritbh

View GitHub Profile


A sample interaction awaiter that specifically only cares about button interactions with globally unique custom IDs.

Can be modified to respond differently to other conditions (i.e. only letting a specific user click the button, or handling other sorts of components). If that's what you want to do, you'll want to modify the buttons data structure to hold information about your custom conditions, and add logic within the interactionCreate listener to only call the associated resolver function when necessary.

This is a naive implementation, with several potential issues:

  • listening is a global variable, not directly associated with the client the listener is being added to (though you really shouldn't have multiple clients in your project anyway so it's probably fine)
  • Using an object for buttons means that only one person can listen for a specific customID at a time; this code will just overwrite the old listener if it's called a second time with the same ID, causing the ol
eritbh /
Created Jan 19, 2022
Run desktop applications under WSL and display them with VcXsrv

First setup:

  • Install VcXsrv (

  • Launch it (shows up in windows search as "XLaunch"), it will prompt you for some configuration

    • "Select display settings" sets how you want your WSL applications to be presented on the desktop, set these options however you like
    • "Select how to start clients" can be left at "Start no client"
    • On the "Extra settings" screen, tick "Disable access control" (or, if you don't trust your local network, have fun figuring out X authorities I guess)
    • Save your configuration to a file - this will be handy later
View Deal with Illustrator SVG

Dealing with Illustrator SVG Fonts

tldr: using specific save settings in illustrator and a script, we can generate an SVG file that uses embedded CSS web fonts and can have its text content edited dynamically (this just solves the font display problem, not the text alignment discrepancies introduced by the way text is layed out in the SVG, that will have to wait). Check it out - all the fonts in this processed SVG image show up just fine in Firefox and are being loaded from embedded data: URIs rather than system fonts.


This is how I'm saving my illustrator file:

image image

eritbh / op-add-identities
Last active Jul 2, 2022
1password SSH identity management helpers
View op-add-identities
echo "Signing into 1password..."
eval $(op signin $@)
items=($(op list items | jq '.[] | select(.templateUuid == "110") | .uuid' --raw-output))
for uuid in "${items[@]}"; do
item_data="$(op get item "$uuid")"
private_key="$(echo "$item_data" | jq '.details.sections[0].fields[] | select(.t == "ssh private key") | .v' --raw-output)"
item_title="$(echo "$item_data" | jq '.overview.title' --raw-output)"
eritbh /
Last active Feb 13, 2022
Setting up a new deploy user and automating deployment tasks through Github Actions

Continuous deployment with Github Actions and systemd services

This is a collection of templates/scripts I use to set up CD systems for my projects.

For each project I deploy, I create a user and a systemd service. The user account's home directory is where the project lives, and the systemd service defines how it's run and ensures that it stays running after failure or reboot. The user is given sudo permission only to interact with its own service, via a /etc/sudoers.d supplement. The user account isn't accessible via password auth, but it does have an SSH key that can be used to log into the account and automate updates. automates this process. It creates a new user, configures its sudo and SSH permissions, generates an SSH key for it, and creates a template systemd service. After running the script, all I have to do is clone the project into the deploy user's home directory and configure the systemd service to run the project.

The actual CD is handled by a Github Actions workflow

View -etc-systemd-system-animeawards.service
Description=Web: Anime Awards Site
View Ariake Dark.xccolortheme
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "">
<plist version="1.0">
<string>0.960784 0.980392 1 1</string>
<string>JetBrainsMono-Bold - 12.0</string>
<string>0.72549 0.745098 0.835294 1</string>
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJ/z3GFDb69oD3Ww+cEbpLUkLI1OWpGULEEitbLDo3wbvbi9A3YGmpDRGnXAgs4DpOW91XxZldDuR/7HbhAO2OPY/EgcJgVk+SPdL1bSoIIAAWJacPLk+qvgcUZk1Gf7NXD7NiT0HJHj9BVdHePzCYxavt6z8NoVGl0iCF1FbjwxyEi1cr9KFUS+QOg33TUclVIap1ypyO/MeVNZ9XogT4Z1MQIeHRKkYZMq1kfvWQZOzBYM3Gu84fn2fTyRfZCde0IHVAVZtTDm8PMBYy0ukKL0OtSHzi0BEg6pTnAL0ZkCmDpBLOCM1pwoYR+4u9azp/RBp0CAmrbFHiFPjUXhJ1 george@piina.local


The classic programming exercise.

The Rules

For every integer in some range:

  • Print "fizz" if the number is divisible by 3
  • Print "buzz" if the number is divisible by 5
View Reddit Anime max width + background.css
* /r/anime custom page width + background userstyle/RES snippet
* by /u/geo1088
* public domain
* If you use this style, please don't send modmails when it breaks
* Instead, message /u/geo1088 directy:
* <>