diff --git a/src/img/2025/acadia-mitts.jpg b/src/img/2025/acadia-mitts.jpg new file mode 100644 index 0000000..8959f15 Binary files /dev/null and b/src/img/2025/acadia-mitts.jpg differ diff --git a/src/img/2025/aggregator-wireframes.jpg b/src/img/2025/aggregator-wireframes.jpg new file mode 100644 index 0000000..5d32d4c Binary files /dev/null and b/src/img/2025/aggregator-wireframes.jpg differ diff --git a/src/img/2025/angle-brackets-uwu.jpg b/src/img/2025/angle-brackets-uwu.jpg new file mode 100644 index 0000000..92fd80d Binary files /dev/null and b/src/img/2025/angle-brackets-uwu.jpg differ diff --git a/src/img/2025/azure-locations.jpg b/src/img/2025/azure-locations.jpg new file mode 100644 index 0000000..12dcd67 Binary files /dev/null and b/src/img/2025/azure-locations.jpg differ diff --git a/src/img/2025/bouquet.jpg b/src/img/2025/bouquet.jpg new file mode 100644 index 0000000..ef83c87 Binary files /dev/null and b/src/img/2025/bouquet.jpg differ diff --git a/src/img/2025/brooke-scarf.jpg b/src/img/2025/brooke-scarf.jpg new file mode 100644 index 0000000..11039a4 Binary files /dev/null and b/src/img/2025/brooke-scarf.jpg differ diff --git a/src/img/2025/brooke-suspenders.jpg b/src/img/2025/brooke-suspenders.jpg new file mode 100644 index 0000000..6c2d549 Binary files /dev/null and b/src/img/2025/brooke-suspenders.jpg differ diff --git a/src/img/2025/clustered-brown-mushrooms.jpg b/src/img/2025/clustered-brown-mushrooms.jpg new file mode 100644 index 0000000..3cfa7cc Binary files /dev/null and b/src/img/2025/clustered-brown-mushrooms.jpg differ diff --git a/src/img/2025/dragon-mask.jpg b/src/img/2025/dragon-mask.jpg new file mode 100644 index 0000000..7e09989 Binary files /dev/null and b/src/img/2025/dragon-mask.jpg differ diff --git a/src/img/2025/fix-your-hearts-print.jpg b/src/img/2025/fix-your-hearts-print.jpg new file mode 100644 index 0000000..f9a5457 Binary files /dev/null and b/src/img/2025/fix-your-hearts-print.jpg differ diff --git a/src/img/2025/handcombed-jacobs.jpg b/src/img/2025/handcombed-jacobs.jpg new file mode 100644 index 0000000..51baab4 Binary files /dev/null and b/src/img/2025/handcombed-jacobs.jpg differ diff --git a/src/img/2025/icelandic-lamb.jpg b/src/img/2025/icelandic-lamb.jpg new file mode 100644 index 0000000..ad82dec Binary files /dev/null and b/src/img/2025/icelandic-lamb.jpg differ diff --git a/src/img/2025/keffiyah-nets.jpg b/src/img/2025/keffiyah-nets.jpg new file mode 100644 index 0000000..9d11235 Binary files /dev/null and b/src/img/2025/keffiyah-nets.jpg differ diff --git a/src/img/2025/kestrel-zine.jpg b/src/img/2025/kestrel-zine.jpg new file mode 100644 index 0000000..aa20f88 Binary files /dev/null and b/src/img/2025/kestrel-zine.jpg differ diff --git a/src/img/2025/leather-wrap-bracelets.jpg b/src/img/2025/leather-wrap-bracelets.jpg new file mode 100644 index 0000000..547fe90 Binary files /dev/null and b/src/img/2025/leather-wrap-bracelets.jpg differ diff --git a/src/img/2025/light-grey-jacobs.jpg b/src/img/2025/light-grey-jacobs.jpg new file mode 100644 index 0000000..68aed53 Binary files /dev/null and b/src/img/2025/light-grey-jacobs.jpg differ diff --git a/src/img/2025/loon-print.jpg b/src/img/2025/loon-print.jpg new file mode 100644 index 0000000..a98e866 Binary files /dev/null and b/src/img/2025/loon-print.jpg differ diff --git a/src/img/2025/mushrooms-and-moss.jpg b/src/img/2025/mushrooms-and-moss.jpg new file mode 100644 index 0000000..015d0b7 Binary files /dev/null and b/src/img/2025/mushrooms-and-moss.jpg differ diff --git a/src/img/2025/on-the-shoulders.jpg b/src/img/2025/on-the-shoulders.jpg new file mode 100644 index 0000000..5ce3068 Binary files /dev/null and b/src/img/2025/on-the-shoulders.jpg differ diff --git a/src/img/2025/petrichor-handspun.jpg b/src/img/2025/petrichor-handspun.jpg new file mode 100644 index 0000000..0c520c5 Binary files /dev/null and b/src/img/2025/petrichor-handspun.jpg differ diff --git a/src/img/2025/pink-yellow-flowers.jpg b/src/img/2025/pink-yellow-flowers.jpg new file mode 100644 index 0000000..6b955a5 Binary files /dev/null and b/src/img/2025/pink-yellow-flowers.jpg differ diff --git a/src/img/2025/rockery.jpg b/src/img/2025/rockery.jpg new file mode 100644 index 0000000..c1c4166 Binary files /dev/null and b/src/img/2025/rockery.jpg differ diff --git a/src/img/2025/scrap-patches.jpg b/src/img/2025/scrap-patches.jpg new file mode 100644 index 0000000..9f2c2d6 Binary files /dev/null and b/src/img/2025/scrap-patches.jpg differ diff --git a/src/img/2025/shelf-mushrooms.jpg b/src/img/2025/shelf-mushrooms.jpg new file mode 100644 index 0000000..528ac60 Binary files /dev/null and b/src/img/2025/shelf-mushrooms.jpg differ diff --git a/src/img/2025/shoelace-bag.jpg b/src/img/2025/shoelace-bag.jpg new file mode 100644 index 0000000..5d1faa6 Binary files /dev/null and b/src/img/2025/shoelace-bag.jpg differ diff --git a/src/img/2025/sideways-canvas.jpg b/src/img/2025/sideways-canvas.jpg new file mode 100644 index 0000000..0fcc40a Binary files /dev/null and b/src/img/2025/sideways-canvas.jpg differ diff --git a/src/img/2025/solstice-2025.jpg b/src/img/2025/solstice-2025.jpg new file mode 100644 index 0000000..b780789 Binary files /dev/null and b/src/img/2025/solstice-2025.jpg differ diff --git a/src/img/2025/textures-unite.jpg b/src/img/2025/textures-unite.jpg new file mode 100644 index 0000000..87b6f5b Binary files /dev/null and b/src/img/2025/textures-unite.jpg differ diff --git a/src/posts/2025/2025-01-19-kestrel-zine.md b/src/posts/2025/2025-01-19-kestrel-zine.md new file mode 100644 index 0000000..26cd405 --- /dev/null +++ b/src/posts/2025/2025-01-19-kestrel-zine.md @@ -0,0 +1,11 @@ +--- +title: kestrel zine +image: + src: 2025/kestrel-zine.jpg + alt: "A 5 photo collage showing the front and back cover as well as 3 full spreads of a folded zine about Kestrel, my dog, who is a 65lb Malinois with a goofy smile and floppy ears. it is printed in two layers of color, blue and orange, and each image depicts Kestrel in various posts... alert and watchful, resting, looking mopey, wearing a sweatshirt." +tags: + - gallery + - print + - zine + - highlight +--- diff --git a/src/posts/2025/2025-01-19-loon.md b/src/posts/2025/2025-01-19-loon.md new file mode 100644 index 0000000..f1bcf27 --- /dev/null +++ b/src/posts/2025/2025-01-19-loon.md @@ -0,0 +1,10 @@ +--- +title: loon +image: + src: 2025/loon-print.jpg + alt: "A print of a loon rearing up with wings spread" +tags: + - gallery + - print +--- + diff --git a/src/posts/2025/2025-01-31-trans-charity.md b/src/posts/2025/2025-01-31-trans-charity.md new file mode 100644 index 0000000..999dbb4 --- /dev/null +++ b/src/posts/2025/2025-01-31-trans-charity.md @@ -0,0 +1,74 @@ +--- +title: give to trans orgs and people +image: + src: 2025/bouquet.jpg + alt: "Image unrelated to post. A close up on a flower bouquet in shades of purple, pink, and white. Centered is a large, almost soft-looking pink flower that is still partially closed up." +tags: + - reference + - gender +--- + +This is a collation of responses to a fediverse post I made. + +For reference, I also have a list set up at [/give](/give) that lists a number of great nonprofits. + +## Collections + +- [17 Black-Led LGBTQ+ Services and Groups You Can Support Right Now](https://www.marieclaire.com/politics/a32827051/black-lgbtq-organizations-groups/){target="_blank" rel="external"} +- [Black Trans-Led Organizations](https://blackaids.org/black-trans-organizations/){target="_blank" rel="external"} +- [Donate to These Orgs to Support Black Trans People](https://www.vice.com/en/article/tony-mcdade-nina-pop-how-to-help/){target="_blank" rel="external"} + +## Orgs + +- [Advocates for Trans Equality (A4TE)](https://transequality.org){target="_blank" rel="external"} (formerly National Center for Transgender Equality (NCTE) and Transgender Legal Defense and Education Fund (TLDEF)) +- [Black Trans Fund](https://groundswellfund.org/funds/black-trans-fund/){target="_blank" rel="external"} +- [For the Gworls](https://www.forthegworls.party/home){target="_blank" rel="external"} +- [Gays and Lesbians Living in a Transgender Society (GLITS)](https://www.glitsinc.org){target="_blank" rel="external"} +- [Gender Justice League](https://www.genderjusticeleague.org){target="_blank" rel="external"} +- [HRT- Harm Reduction Toolkit](https://www.omprakash.org/global/distribute-aid/crowdfund/hrt---harm-reduction-toolkit){target="_blank" rel="external"} +- [Lambda Legal](https://lambdalegal.org){target="_blank" rel="external"} +- [Point of Pride](https://www.pointofpride.org){target="_blank" rel="external"} +- [Project Rainbow Turtle](https://www.gofundme.com/f/help-fund-project-rainbow-turtles-mission){target="_blank" rel="external"} +- [Trans Justice Funding Project](https://www.transjusticefundingproject.org/){target="_blank" rel="external"} - also worth looking at their **grantees** for further ideas +- [Trans Lifeline](https://translifeline.org/){target="_blank" rel="external"} +- [Trans Rescue](https://transrescue.org){target="_blank" rel="external"} +- [Trans Youth Emergency Project](https://southernequality.org/tyep/){target="_blank" rel="external"} +- [TransFamily Support Services](https://transfamilysos.org){target="_blank" rel="external"} +- [Transgender Law Center](https://transgenderlawcenter.org){target="_blank" rel="external"} +- [True Colors United](https://truecolorsunited.org){target="_blank" rel="external"} + +## People + +If you are listed here and would like to be removed, just [get in touch with me](/contact). + +### Aldercone Studio + +- [liberapay/heckinTech](https://liberapay.com/heckinTech/){target="_blank" rel="external"} +- [buymeacoffee/Aldercone](https://buymeacoffee.com/aldercone/membership){target="_blank" rel="external"} +- [ko-fi/aldercone](https://ko-fi.com/aldercone){target="_blank" rel="external"} +- [patreon/aldercone](https://www.patreon.com/aldercone){target="_blank" rel="external"} + +### héctor + +- [ko-fi/binomech](https://ko-fi.com/binomech){target="_blank" rel="external"} + +### Luke Orion + +- [hyperfollow/LukeOrion](https://hyperfollow.com/LukeOrion){target="_blank" rel="external"} + +### Pixel + +- [liberapay/Pixouls](https://liberapay.com/Pixouls/){target="_blank" rel="external"} + +### Taj + +- [ko-fi/erosdiscordia](https://ko-fi.com/erosdiscordia){target="_blank" rel="external"} + +## Credit + +Thank you to these wonderful folks (and many more who chose to remain uncredited) for the links/orgs: + +- [Athena](https://parthen.online){target="_blank" rel="external"} +- [a.tony](https://wenotfreeyet.itch.io){target="_blank" rel="external"} +- [mika](https://birdon.social/@sqrl_23){target="_blank" rel="external"} +- [Nora](https://nora.zone){target="_blank" rel="external"} diff --git a/src/posts/2025/2025-02-03-trans-networks.md b/src/posts/2025/2025-02-03-trans-networks.md new file mode 100644 index 0000000..e969b00 --- /dev/null +++ b/src/posts/2025/2025-02-03-trans-networks.md @@ -0,0 +1,26 @@ +--- +title: networks of trans care +image: + src: 2025/mushrooms-and-moss.jpg + alt: "Image unrelated to post. Close up on a cluster of orange-brown mushrooms on a mossy tree trunk." +tags: + - reference + - gender +--- + +These are collated USA-based resources I have found while seeking out trans surgical care networks. + +## Doulas + +- [Eli Lawliet](https://www.thegenderdoula.com/meet-the-gender-doula){target="_blank" rel="external"} +- [Ken McGee](https://b3ptco.com){target="_blank" rel="external"} (Seattle) + +## Surgical care networks + +- [t4t caregiving](https://www.t4tcaregiving.org){target="_blank" rel="external"} +- [Quest House](https://questhousesf.org){target="_blank" rel="external"} (San Francisco) +- [Queer Care](https://queercareinc.bigcartel.com){target="_blank" rel="external"} + +## Other support + +- [Trans Youth Emergency Project](https://southernequality.org/tyep/){target="_blank" rel="external"} diff --git a/src/posts/2025/2025-03-20-fix-your-hearts.md b/src/posts/2025/2025-03-20-fix-your-hearts.md new file mode 100644 index 0000000..20db684 --- /dev/null +++ b/src/posts/2025/2025-03-20-fix-your-hearts.md @@ -0,0 +1,9 @@ +--- +title: fix your hearts +image: + src: 2025/fix-your-hearts-print.jpg + alt: "2 copies of the same print, one in black ink and one in dark teal. The print is text that reads 'fix your hearts or die', with the text shaped into a somewhat long and narrow heart." +tags: + - gallery + - print +--- diff --git a/src/posts/2025/2025-05-14-azure-locations.md b/src/posts/2025/2025-05-14-azure-locations.md new file mode 100644 index 0000000..d10e0ce --- /dev/null +++ b/src/posts/2025/2025-05-14-azure-locations.md @@ -0,0 +1,343 @@ +--- +title: azure locations and file crawling +image: + src: 2025/azure-locations.jpg + alt: "A Linux terminal. There is a fun rainbow flag in ascii art at the top, and then the user has called a command asking Azure for a list of resources applicable to a specific resource type" +tags: + - reference + - software + - highlight +--- +{% raw %} +## context + +Azure is Microsoft's cloud offering. Each possible resource that can be deployed in Azure has a location it's deployed in, such as "East US" or "Italy." While some resources can be deployed in all locations, other resources have location constraints. + +It's common, when deploying, to have a whole ecosystem of resources that will work together. However, this introduces a problem: which locations work for all resources in a deployment? + +Let's dig in. (Want just the outcome? Check the [summary](#summary).) + +### bicep + +[Bicep](https://learn.microsoft.com/azure/azure-resource-manager/bicep/overview?tabs=bicep) is a language for describing Azure resources. A Bicep file sets out a series of resources with preset or parameterized properties in order to deploy said resources. + +A minimal Bicep file that creates a resource group might look like this: + +```bicep +param resourceGroupName string = 'myResourceGroup' +param location string = "westus2" + +resource resourceGroup 'Microsoft.Resources/resourceGroups@2022-09-01' = { + name: resourceGroupName + location: location +} +``` + +This is easy to start parsing - I can use `grep` to find that `Microsoft.Resources/resourceGroups@2022-09-01` string and go from there. + +#### nesting + +However, minimal is uncommon. As stated above, deployments of multiple resources are much more common. + +When working with large deployments, certain resources may be needed more than once. You can repeat your earlier storage account declaration, or, instead, you can template out how to deploy a storage account with given parameters, then reuse that template. This is called a `module`, and it's fundamental to organizing Bicep files. + +Let's say this is our file structure. Ignore the lack of parameter files or READMEs, this is just an example. + +```txt +. +|--infra + |--env + | |--dev + | | |--main.bicep + | |--prod + | |--main.bicep + |--modules + |--rg + | |--main.bicep + |--vm + | |--modules + | | |--network.bicep + | | |--virtual-machine.bicep + | |--main.bicep + |--kv + |--modules + | |--role-assignment.bicep + | |--key-vault.bicep + |--main.bicep +``` + +Bicep files use relative references for local modules, so `infra/env/dev/main.bicep` references `../../modules/vm/main.bicep`, which references `./modules/network.bicep`. While the directory structure in this example *could* be flattened, my point is: modules can nest, and each module refers relatively to the module(s) it relies on. + +## finding all resources + +Okay, let's backtrack. From a given Bicep file, we want: + +1. All referenced resource types +1. All referenced modules + +### grep + +Resources and modules both have patterns in how they are declared. Thankfully, they're pretty simple regexes. `grep` will spit out lines in a file that match a given regex. + +```sh +# this gets us strings like +# resource resourceGroup 'Microsoft.Resources/resourceGroups@2022-09-01' = { +grep -E "^resource " "$file" + +# this gets us strings like +# module vm '../../modules/vm/main.bicep' = { +grep -E "^module " "$file" +``` + +### cut + +From there, let's use `cut` to strip off the parts we don't want. + +```sh +# this gets us strings like +# Microsoft.Resources/resourceGroups +grep -E "^resource " "$file" \ + | cut -d "'" -f 2 - \ + | cut -d "@" -f 1 - + +# this gets us strings like +# ../../modules/vm/main.bicep +grep -E "^module " "$file" \ + | cut -d "'" -f 2 - +``` + +These calls are a little opaque. `-d` sets a **delimiter** (what to split on). `-f` picks a **field** to return, numbered from 1. + +### mapfile + +We'll save these values to variables. `mapfile` reads a file, putting each line into a new array element. `-t` **trims** newline characters. The `<`s do some redirection, and yes, the space between them *matters*. + +```sh +mapfile -t resources < <(grep -E "^resource " "$file" \ + | cut -d "'" -f 2 - \ + | cut -d "@" -f 1 -) +mapfile -t modules < <(grep -E "^module " "$file" \ + | cut -d "'" -f 2 -) +``` + +### dirname (& more) + +We can't just stop there. We need to search each module in turn. Using `dirname`, we can get the directory of the file we're searching, then append the relative module path. + +```sh +get_resources () { + # ... grep, cut, etc ... + + directory=$(dirname "$file") + + for module in "${modules[@]}" + do + mapfile -t -O "${#resources[@]}" resources < <(get_resources "$directory/$module") + done +} +``` + +A lot just happened there besides `dirname`. `{modules[@]}` is all the array elements (as opposed to just `$modules`, which evaluates to the first element). `${#modules[@]}`, on the other hand - note the pound sign - is the number of elements in the array. + +Additionally, `mapfile` usually writes from index 0 onwards. But with the `-O` argument, we can specify an **origin**. By setting the starting point to the length of the array, we append to the array rather than writing over existing data. + +Finally, we got some recursion going! `get_resources` calls `get_resources` for every module found. + +### the get_resources function + +So far, our code looks like this: + +```sh +get_resources () { + mapfile -t resources < <(grep -E "^resource " "$file" \ + | cut -d "'" -f 2 - \ + | cut -d "@" -f 1 -) + mapfile -t modules < <(grep -E "^module " "$file" \ + | cut -d "'" -f 2 -) + + directory=$(dirname "$file") + + for module in "${modules[@]}" + do + mapfile -t -O "${#resources[@]}" resources < <(get_resources "$directory/$module") + done + + for resource in "${resources[@]}"; do; echo "$resource"; done +} +``` + +That last one-liner just returns our results. Note that we don't just `echo "${resources[@]}"` - this results in a space-delimited string and it'll be helpful later to have a newline-delimited string. + +## finding locations + +Now we need to use these resource types to get available locations. First, actually call our function from above. We'll assume we're in a directory with a top-level `main.bicep` file. + +```sh +mapfile -t resources < <(get_resources "main.bicep") +``` + +### sort + +Does sorting matter? Not really, but `sort` has a useful feature, `-u`, which returns **u**nique items (aka, it deduplicates). Looking up the same resource type twice slows us down. + +```sh +mapfile -t resources < <(get_resources "main.bicep" | sort -u) +``` + +`sort` is one reason it helps to have newlines as delimiters - it expects that. + +### az + +We'll use `az` to list *all* the locations - just to give ourselves a starting point. You could also use the locations for the first resource type. + +```sh +mapfile -t locations < <(az account list-locations --query "[].displayName" \ + --out tsv) +``` + +We can then use an `az` command to find available locations for a given resource type: + +```sh +mapfile -t newLocations < <(az provider show --namespace "$namespace" \ + --query "resourceTypes[?resourceType=='$resourceType'].locations | [0]" \ + --out tsv) +``` + +`--out tsv` means we will get a list with no decoration whatsoever - it's vital for programmatic handling of `az` command output. + +### cut (again) + +We'll need to get those `$namespace` and `$resourceType` variables. `cut` comes back in handy: + +```sh +# remember, $resource is something like Microsoft.Resources/resourceGroups + +# this gets us strings like +# Microsoft.Resources +namespace=$(echo "$resource" | cut -d "/" -f 1 -) + +# this gets us strings like +# resourceGroups +resourceType=$(echo "$resource" | cut -d "/" -f 2 -) +``` + +### comm + +Okay, we can get locations. How do we handle finding their intersection? + +`comm` to the rescue. It finds **common** lines between two *sorted* files. Its default output is three columns - lines only in file 1, lines only in file 2, and lines common to both. We can suppress the first two columns with `-12`. + +`comm` expects files, so we'll reuse our redirection `<(someCommand)` from earlier. + +```sh +mapfile -t locations < <(comm -12 \ + <(for location in "${locations[@]}"; do echo "$location"; done) \ + <(for location in "${newLocations[@]}"; do echo "$location"; done) ) +``` + +`comm` also likes newline-delimited input, so we're again looping through the array rather than echoing all values at once. + +### catching errors + +With functionality as it is, many deployments will come back with 0 locations available. Turns out some basic resource types, like role assignments, don't have locations. So let's filter those. + +```sh +if [[ ${#newLocations[@]} -eq 0 ]] +then + # handle +fi +``` + +### tee + +We'll print the locations to the shell. We can even use `tee` to print them to a file for good measure: + +```sh +for location in "${locations[@]}"; do echo "$location"; done | tee locations.txt +``` + +### the location code + +Here's our code for this section: + +```sh +mapfile -t resources < <(get_resources "main.bicep" | sort -u) + +mapfile -t locations < <(az account list-locations --query "[].displayName" \ + --out tsv) + +for resource in "${resources[@]}" +do + namespace=$(echo "$resource" | cut -d "/" -f 1 -) + resourceType=$(echo "$resource" | cut -d "/" -f 2 -) + + mapfile -t newLocations < <(az provider show --namespace "$namespace" \ + --query "resourceTypes[?resourceType=='$resourceType'].locations | [0]" \ + --out tsv) + + if [[ ${#newLocations[@]} -eq 0 ]] + then + continue + fi + + mapfile -t locations < <(comm -12 \ + <(for location in "${locations[@]}"; do echo "$location"; done) \ + <(for location in "${newLocations[@]}"; do echo "$location"; done) ) +done + +for location in "${locations[@]}"; do echo "$location"; done | tee locations.txt +``` + +--- + +## summary + +Here's our final script: + +```sh +# Recursively crawls bicep files to find all referenced resources +get_resources () { + mapfile -t resources < <(grep -E "^resource " "$file" \ + | cut -d "'" -f 2 - \ + | cut -d "@" -f 1 -) + mapfile -t modules < <(grep -E "^module " "$file" \ + | cut -d "'" -f 2 -) + + directory=$(dirname "$file") + + for module in "${modules[@]}" + do + mapfile -t -O "${#resources[@]}" resources < <(get_resources "$directory/module") + done + + for resource in "${resources[@]}"; do echo "$resource"; done +} + +# Execution starts here +mapfile -t resources < <(get_resources "main.bicep" | sort -u) + +mapfile -t locations < <(az account list-locations --query "[].displayName" \ + --out tsv) + +for resource in "${resources[@]}" +do + namespace=$(echo "$resource" | cut -d "/" -f 1 -) + resourceType=$(echo "$resource" | cut -d "/" -f 2 -) + + mapfile -t newLocations < <(az provider show --namespace "$namespace" \ + --query "resourceTypes[?resourceType=='$resourceType'].locations | [0]" \ + --out tsv) + + if [[ ${#newLocations[@]} -eq 0 ]] + then + continue + fi + + mapfile -t locations < <(comm -12 \ + <(for location in "${locations[@]}"; do echo "$location"; done) \ + <(for location in "${newLocations[@]}"; do echo "$location"; done) ) +done + +for location in "${locations[@]}"; do echo "$location"; done | tee locations.txt +``` +{% endraw %} diff --git a/src/posts/2025/2025-05-15-redirections.md b/src/posts/2025/2025-05-15-redirections.md new file mode 100644 index 0000000..5d15de2 --- /dev/null +++ b/src/posts/2025/2025-05-15-redirections.md @@ -0,0 +1,110 @@ +--- +title: redirections +image: + src: 2025/angle-brackets-uwu.jpg + alt: "Ascii art of an emoticon with pinched eyes and a small mouth made with two angle brackets." +tags: + - reference + - software +--- + +## baseline + +```sh +cat tempest.md +``` + +```txt +You do look, my son, in a moved sort, +As if you were dismay'd: be cheerful, sir. +Our revels now are ended. These our actors, +As I foretold you, were all spirits and +Are melted into air, into thin air: +And, like the baseless fabric of this vision, +The cloud-capp'd towers, the gorgeous palaces, +The solemn temples, the great globe itself, +Ye all which it inherit, shall dissolve +And, like this insubstantial pageant faded, +Leave not a rack behind. We are such stuff +As dreams are made on, and our little life +Is rounded with a sleep. +``` + +## direct + +`grep` takes a file or files as an argument. + +```sh +grep "'d" tempest.md +``` + +```txt +As if you were dismay'd: be cheerful, sir. +The cloud-capp'd towers, the gorgeous palaces, +``` + +## redirect + +If there's no files, or if `-` is passed as an argument, `grep` reads from standard input. `<` reads a file into standard input (this is shorthand for `0<`, `0` being the file descriptor of `stdin`). + +```sh +grep "'d" < tempest.md +# or +grep "'d" - < tempest.md +``` + +```txt +As if you were dismay'd: be cheerful, sir. +The cloud-capp'd towers, the gorgeous palaces, +``` + +## re-redirect + +`<(command)` creates a file descriptor for the output of `command`. + +```sh +grep "'d" - < <(cat tempest.md) +``` + +```txt +As if you were dismay'd: be cheerful, sir. +The cloud-capp'd towers, the gorgeous palaces, +``` + +(In this case, you could substitute `cat tempest.md | grep "'d" -` but `<(command)` is handy for cases where commands don't take `stdin`, or need to take in multiple files (such as [`comm`](/azure-locations#comm)). + +## re-re-redirect + +`cat` can also take `stdin` when given `-` or no arguments. + +```sh +grep "'d" < <(cat < tempest.md) +# or +grep "'d" < <(cat - < tempest.md) +``` + +```txt +As if you were dismay'd: be cheerful, sir. +The cloud-capp'd towers, the gorgeous palaces, +``` + +## conclusion + +it's `<`s all the way down. + +--- + +## postscript: heredoc + +```sh +grep "'d" << tempest.md +heredoc> oh are we interactive now +heredoc> what am i 'doing' anyway +heredoc> tempest.md +``` + +```txt +what am i 'doing' anyway +``` + +(`<<` starts an ephemeral document or `heredoc`. The first argument given is the delimiter, and is more commonly `EOF` (**e**nd **o**f **f**ile).) diff --git a/src/posts/2025/2025-05-18-textures-unite.md b/src/posts/2025/2025-05-18-textures-unite.md new file mode 100644 index 0000000..3628e22 --- /dev/null +++ b/src/posts/2025/2025-05-18-textures-unite.md @@ -0,0 +1,14 @@ +--- +title: textures unite +image: + src: 2025/textures-unite.jpg + alt: "a largely unseen person holds up an expansive knitted shawl, built in 6 sections of different textures and colors. in the background, trees and dappled sunlight." +tags: + - gallery + - knit + - highlight +--- + +[pattern by stephen west](https://www.westknits.com/products/textures-unite){target="_blank" rel="external"}. + +[yarn from hazelknits](https://www.hazelknits.com){target="_blank" rel="external"}. diff --git a/src/posts/2025/2025-05-26-art-shows.md b/src/posts/2025/2025-05-26-art-shows.md new file mode 100644 index 0000000..242c797 --- /dev/null +++ b/src/posts/2025/2025-05-26-art-shows.md @@ -0,0 +1,29 @@ +--- +title: art shows and events +image: + src: 2025/pink-yellow-flowers.jpg + alt: "Image unrelated to post. A cluster of small, four-petaled flowers, varying in color between a purpley-pink and yellow." +--- + +## 2023 + +- [Vashon Summer Arts Fest](https://gallery.vashoncenterforthearts.org/event-works.php?eventId=22954&event=Summer+Arts+Fest){target="_blank" rel="external"} (displayed artist) +- [T4T: All Trans and Nonbinary Drag Show](https://www.kremwerk.com/upcoming/2023/12/09/t4t-all-trans-and-non-brinary-drag-show){target="_blank" rel="external"} (vendor) + +## 2024 + +- [Cutiefest April](https://cutiefoundation.com){target="_blank" rel="external"} (vendor) +- [Stanza 2024: Non-binary](https://www.pushpullseattle.com/news/stanza-2024-non-binary){target="_blank" rel="external"} (displayed artist) +- [VIVA Spring Tour](https://vivartists.com/viva/events/spring-tour-2024/){target="_blank" rel="external"} (vendor) +- [VIVA Holiday Tour](https://vivartists.com/viva/events/holiday-tour-2024/){target="_blank" rel="external"} (vendor) + +## 2025 + +- [Seattle Erotic Art Festival](https://www.seaf.art){target="_blank" rel="external"} (displayed artist) +- [VIVA Spring Tour](https://vivartists.com/viva/events/spring-tour-2025/){target="_blank" rel="external"} (vendor) +- [Seattle Zine Fest](https://www.instagram.com/seattle.zine.fest){target="_blank" rel="external"} (vendor) +- [Solstice Market at Beall Greenhouses](https://beall-greenhouses-market.pages.dev/events/2025-solstice){target="_blank" rel="external"} (vendor, web and print marketing) + +## 2026 + +- [Imbolc Celebration & Market at Beall Greenhouses](https://beall-greenhouses-market.pages.dev/events/2026-imbolc){target="_blank" rel="external"} (vendor, web marketing) diff --git a/src/posts/2025/2025-05-26-keffiyah-nets.md b/src/posts/2025/2025-05-26-keffiyah-nets.md new file mode 100644 index 0000000..8d7e680 --- /dev/null +++ b/src/posts/2025/2025-05-26-keffiyah-nets.md @@ -0,0 +1,143 @@ +--- +title: keffiyah fishing net pattern +image: + src: 2025/keffiyah-nets.jpg + alt: "a knitted swatch. it's mostly white yarn, but a grid of dark red- purple- green yarn that looks like a chain link fence is built into it. the diagonal lines are achieved with floats of yarn from one row, then picked up and knit into several rows later." +tags: + - reference + - knit +--- + +## give + +this pattern is offered at no cost, but I highly encourage giving to Palestinian relief work. + +- [Palestine Children's Relief Fund](https://www.pcrf.net){target="_blank" rel="external"} + +## abbreviations + +| abbr | term | +| --- | --- | +| **MC** | main color (light in swatch shown) | +| **CC** | contrast color (dark in swatch shown) | +| **RS** | right side | +| **WS** | wrong side | +| **k** | knit | +| **sl** | slip | +| **wyif** | with yarn in front | +| **p** | purl | + +## techniques + +### knit into a float + +in this pattern, you will be creating floats on the front of the work, then picking them up and knitting into them 3 rows later. **Do this as part of the stitch you are working, not instead of!** You should have the same number of stitches afterwards. + +when you pick up a float, you want it to sit **in front of the worked stitch, and untwisted.** To achieve this, I have been catching the float on my right needle by dipping the needle down and under the float, from the front to the back. From there, I work the stitch, then slip the float over the new stitch on my right needle. + +## knit flat + +### cast on + +knit flat, the pattern repeat uses 6n + 1 stitches. In the swatch shown, I cast on 29 stitches - 2 on each side for selvedge, then 25 -- 6 \* 4 + 1. To simplify things, I'll write the pattern for the swatch, selvedge and all - but please adapt as you see fit. + +with MC, cast on 29 stitches. + +### establish the pattern + +- **row 0 (WS):** with MC, knit to last stitch, sl1 wyif +- **row 1 (RS):** + - with MC, k2 + - [with CC, k1; with MC, k5] \* 4, then with CC, k1 + - with MC, k1, sl1 wyif +- **row 2 (WS):** + - with MC, k1, p1 + - [with CC, k1 and leave working yarn on RS; with MC, p5] \* 4, then with CC, k1 and bring working yarn back to WS + - with MC, p1, sl1 wyif + +### pattern repeat + +- **row 3 (RS):** with MC, knit to last stitch, sl1 wyif +- **row 4 (WS):** with MC, k1, purl to last stitch, sl1 wyif +- **row 5 (RS):** + - with MC, k5 + - [with CC, k1 into the float from 3 rows below; with MC, k5] \* 4 + - with MC, k4, sl1 wyif +- **row 6 (RS):** + - with MC, k1, p4 + - [with CC, k1 and leave working yarn on RS; with MC, p5] \* 4 -- on the last repeat, move working yarn back to WS before purling + - with MC, p4, sl1 wyif +- **rows 7-8:** repeat rows 3-4 +- **row 9 (RS):** + - with MC, k2 + - [with CC, k1 into the float from 3 rows below; with MC, k5] \* 4, then with CC, k1 + - with MC, k1, sl1 wyif +- **row 10 (WS):** + - with MC, k1, p1 + - [with CC, k1 and leave working yarn on RS; with MC, p5] \* 4, then with CC, k1 and bring working yarn back to WS + - with MC, p1, sl1 wyif + +### close the pattern + +end after rows 5 or 9 of the pattern repeat. replace row 6 or 10 with the following: + +- **row 6 alteration:** + - with MC, k1, p4 + - [with CC, k1; with MC, p5] \* 4 + - with MC, p4, sl1 wyif +- **row 10 alteration:** + - with MC, k1, p1 + - [with CC, k1; with MC, p5] \* 4, then with CC, k1 + - with MC, p1, sl1 wyif + +to end my swatch, I did the following: + +- **row (RS):** with MC, knit to last stitch, sl1 wyif +- **row (WS):** with MC, k1, purl to last stitch, sl1 wyif +- **row (RS):** with MC, bind off + +## knit in the round + +### cast on + +with MC, cast on a multiple of 6 stitches. knit in plain stockinette until you are ready to start the pattern. + +### establish the pattern + +- **row 1:** + - [with CC, k1; with MC, k5] repeat to last 6 stitches + - with CC, k1 and leave working yarn on RS; with MC, k5 +- **row 2:** + - [with CC, p1 and leave working yarn on RS; with MC, k5] repeat to last 6 stitches + - with CC, p1 and move working yarn to WS; with MC, k5 + +### pattern repeat + +- **rows 3-4:** with MC, knit all stitches +- **row 5:** + - with MC, k3 + - [with CC, k1 into the float from 3 rows below; with MC, k5] repeat to last 3 stitches + - with CC, k1 and leave working yarn on RS; with MC, k2 +- **row 6:** + - with MC, k3 + - [with CC, p1 and leave working yarn on RS; with MC, k5] repeat to last 3 stitches + - with CC, p1 and moving working yarn to WS; with MC, k2 +- **rows 7-8:** repeat rows 3-4 +- **row 9:** + - [with CC, k1 into the float from 3 rows below; with MC, k5] repeat to last 6 stitches + - with CC, k1 into the float from 3 rows below and leave working yarn on RS; with MC, k5 +- **rows 10:** + - [with CC, p1 and leave working yarn on RS; with MC, k5] repeat to last 6 stitches + - with CC, p1 and move working yarn to WS; with MC, k5 + +### close the pattern + +end after rows 5 or 9 of the pattern repeat. replace row 6 or 10 with the following: + +- **row 6 alteration:** + - with MC, k3 + - [with CC, p1; with MC, k5] repeat to last 3 stitches + - with CC, p1; with MC, k2 +- **row 10 alteration:** [with CC, p1; with MC, k5] repeat for all stitches + +with MC, knit in plain stockinette until you want to bind off, then bind off. diff --git a/src/posts/2025/2025-05-26-scrap-patches.md b/src/posts/2025/2025-05-26-scrap-patches.md new file mode 100644 index 0000000..6d77787 --- /dev/null +++ b/src/posts/2025/2025-05-26-scrap-patches.md @@ -0,0 +1,9 @@ +--- +title: scrap patches +image: + src: 2025/scrap-patches.jpg + alt: "a collage of 4 images, each showing a fabric patch created by collaging 5 or 6 scraps of fabric and joining them with a simple running stitch in white thread. patches of running stitch go back and forth both horizontally and vertically." +tags: + - gallery + - patch +--- diff --git a/src/posts/2025/2025-07-13-sideways-canvas.md b/src/posts/2025/2025-07-13-sideways-canvas.md new file mode 100644 index 0000000..c6b39f6 --- /dev/null +++ b/src/posts/2025/2025-07-13-sideways-canvas.md @@ -0,0 +1,13 @@ +--- +title: sideways canvas shirt +image: + src: 2025/sideways-canvas.jpg + alt: "someone's torso in a knitted short sleeve shirt. the front is teal, and the bit of back we can see is mustard yellow. looking closely, it's notable that the stitches are turned 90 degrees from a standard knit garment." +tags: + - gallery + - knit +--- + +Pattern: [Sideways Canvas](https://www.ravelry.com/patterns/library/sideways-canvas-hand){target="_blank" rel="external"} + +Yarn: [De Rerum Natura *Antigone*](https://www.dererumnatura.fr/en/yarns/136-antigone.html){target="_blank" rel="external"} diff --git a/src/posts/2025/2025-07-16-on-the-shoulders.md b/src/posts/2025/2025-07-16-on-the-shoulders.md new file mode 100644 index 0000000..35fdd19 --- /dev/null +++ b/src/posts/2025/2025-07-16-on-the-shoulders.md @@ -0,0 +1,12 @@ +--- +title: on the shoulders of giants +image: + src: 2025/on-the-shoulders.jpg + alt: "ok so. five image collage showing the front, 3 inner spreads, and back of a riso-printed zine in green and light blue. it's called 'on the shoulders of giants' and it's about a knitting technique I learned from Stephen west and how I built on that technique. it talks about joining two adjacent panels without seaming, instead knitting the second panel onto the selvedge of the first. then it uses that technique to approach two panels knit with significantly different weights of yarn" +tags: + - gallery + - zine + - knit +--- + +Riso printed! diff --git a/src/posts/2025/2025-07-26-acadia-mitts.md b/src/posts/2025/2025-07-26-acadia-mitts.md new file mode 100644 index 0000000..acc42ea --- /dev/null +++ b/src/posts/2025/2025-07-26-acadia-mitts.md @@ -0,0 +1,11 @@ +--- +title: acadia mitts +image: + src: 2025/acadia-mitts.jpg + alt: "a hand wearing a knitted fingerless mitten. it's knit in a slubby, almost tweedy yarn, with the body being blue grey stockinette and the cuffs and tips a vibrant green rib." +tags: + - gallery + - knit +--- + +Yarn: [The Fibre Co. Acadia](https://thefibreco.com/products/acadia){target="_blank" rel="external"} diff --git a/src/posts/2025/2025-07-26-wrap-bracelets.md b/src/posts/2025/2025-07-26-wrap-bracelets.md new file mode 100644 index 0000000..f6867c0 --- /dev/null +++ b/src/posts/2025/2025-07-26-wrap-bracelets.md @@ -0,0 +1,10 @@ +--- +title: wrap bracelets +image: + src: 2025/leather-wrap-bracelets.jpg + alt: "two wrists, each wearing a black leather wrap bracelet. the upper bracelet is a thin strap wrapped 3 times around the wrist. the lower bracelet wraps twice, with a thicker strap, and has carefully placed spikes that avoid the wrap spots." +tags: + - gallery + - leather +--- + diff --git a/src/posts/2025/2025-09-05-brooke-suspenders.md b/src/posts/2025/2025-09-05-brooke-suspenders.md new file mode 100644 index 0000000..f538a46 --- /dev/null +++ b/src/posts/2025/2025-09-05-brooke-suspenders.md @@ -0,0 +1,11 @@ +--- +title: brooke's suspenders +image: + src: 2025/brooke-suspenders.jpg + alt: "a two image collage showing the front and back of a person, neck to waist. she's wearing leather suspenders with a button attachment, buckles for adjustment, and a stitched diamond where the straps cross in the back." +tags: + - gallery + - leather +--- + +for our 3 year anniversary :) diff --git a/src/posts/2025/2025-09-08-designing-a-bag.md b/src/posts/2025/2025-09-08-designing-a-bag.md new file mode 100644 index 0000000..a066246 --- /dev/null +++ b/src/posts/2025/2025-09-08-designing-a-bag.md @@ -0,0 +1,34 @@ +--- +title: designing a bag +image: + src: 2025/shoelace-bag.jpg + alt: "a 3-image collage showcasing a leather crossbody bag. the leather body is brown and fairly simple. up the narrow sides, rope is laced through grommets in a style resembling a shoe lacing. the rope forms the handle and loops seamlessly through the other side of the bag, joining in one point in a figure-8 follow-through knot. At the bottom corners, there are small diagonal lines of stitching to give the bag a small lip around the base and ensure small objects don't slide out." +tags: + - reference + - leather + - software +--- + +## begin by testing + +the first step in any design is small tests. For leatherwork, this usually means working with paper - cheaper than leather, but with some of the same inflexibility. + +## build up from basic facts + +my grommets, laid out on paper, spaced out cleanly at 1/2" away from edges and 1" apart. My tablet is ~10"x8". I started with these facts. + +## template, template, template + +don't measure out the same spacing any more than you have to. Templating is your friend for both ease of use and regularity. + +## mind the order of your work + +the corners should be stitched before lacing in order to get into tight spaces easily. Grommets are set most easily before the work is 3-dimensional. It's cleanest to cut before grommets are installed so as to work on a smooth and level surface. Hold all this in your mind when choosing your next move, and ensure you don't step on your own toes. + +## consider v2 + +even if you won't be making one, what would you do differently? Where does your design fail? Where does it *succeed?* + +## take notes + +easier said than done. diff --git a/src/posts/2025/2025-09-14-intro-to-wireframing.md b/src/posts/2025/2025-09-14-intro-to-wireframing.md new file mode 100644 index 0000000..11991db --- /dev/null +++ b/src/posts/2025/2025-09-14-intro-to-wireframing.md @@ -0,0 +1,11 @@ +--- +title: intro to wireframing +image: + src: 2025/aggregator-wireframes.jpg + alt: "a figma page with 4 major sections titled aggregator, aggregator mobile, aggregator color, and aggregator mobile color. each section has 7 pages in it - all sections pretty clearly have the same 7 pages, with the mobile sections shown on mobile screens and the color sections in a rainbow of pastels rather than grayscale." +tags: + - gallery + - software +--- + +learning figma! isn't it fun! diff --git a/src/posts/2025/2025-11-13-dragon-mask.md b/src/posts/2025/2025-11-13-dragon-mask.md new file mode 100644 index 0000000..c324aef --- /dev/null +++ b/src/posts/2025/2025-11-13-dragon-mask.md @@ -0,0 +1,12 @@ +--- +title: dragon mask +image: + src: 2025/dragon-mask.jpg + alt: "lee (a white person with glasses and a side shave) holds up a leather dragon mask in black and dark green. ze sticks hir tongue out at it." +tags: + - gallery + - leather + - highlight +--- + +pattern by [PaintYee](https://www.etsy.com/listing/831499316/pdf-pattern-leather-dragon-mask){target="_blank" rel="external"} diff --git a/src/posts/2025/2025-11-23-favorite-git-flag.md b/src/posts/2025/2025-11-23-favorite-git-flag.md new file mode 100644 index 0000000..eeeb4b7 --- /dev/null +++ b/src/posts/2025/2025-11-23-favorite-git-flag.md @@ -0,0 +1,57 @@ +--- +title: my favorite git flag +image: + src: 2025/shelf-mushrooms.jpg + alt: "Picture unrelated to post. Creamy beige shelf mushrooms on a mossy tree trunk." +tags: + - reference + - software +--- + +do you have a favorite git flag? I do. let's talk about `git add -p`. + +## the p stands for partial + +okay, it totally doesn't. it's short for `--patch`. but 'partial' is my mental trick because it makes a little more sense to me, and it might help you remember it too. + +also, [TIL](https://xkcd.com/1053/){target="_blank" rel="external"}: this command is a shortcut to the `patch` subcommand of the `--interactive` flag - a flag I have never in my life used. wild the things you learn when you read the documentation. + +## the primary purpose + +a classic scenario: you've realized your uncommitted work doesn't just encapsulate one change, and it's not so easily split as to be separable per-file. `git add -p` instead lets you choose to stage changes chunk-by-chunk, or, as `git` terms it, hunk-by-hunk. + +### hunks + +...are not perfect. you can split hunks, but only so much, and there's going to be cases where your changes are *so* mixed in as to be inseparable. + +## a secondary purpose + +I use `-p` almost every time I use `git add`, not because I know I will need to split up my work, but to review what changes I made. + +## a tertiary purpose + +the output from `git add -p` highlights extraneous trailing spaces! + +## how it works + +every hunk `-p` shows you comes with the following single-character choices: + +### y and n + +**yes** and **no** respectively. either add the hunk, or don't. + +### q + +**quit**. exit the whole `-p` process. + +### a and d + +I rarely use these two. that said, I try to remember these two as **all** and **done**. stage all of the hunks in the current file, or be done with the current file. + +### s + +only shows up sometimes, because it lets you **split** the current hunk. if unsplittable, you won't see this option. + +### e + +**edit**. [read the documentation for manually editing](https://git-scm.com/docs/git-add#_editing_patches){target="_blank" rel="external"} if curious because I don't use this and can't advise on it. diff --git a/src/posts/2025/2025-12-02-brooke-scarf.md b/src/posts/2025/2025-12-02-brooke-scarf.md new file mode 100644 index 0000000..7c1490f --- /dev/null +++ b/src/posts/2025/2025-12-02-brooke-scarf.md @@ -0,0 +1,19 @@ +--- +title: brooke's scarf +image: + src: 2025/brooke-scarf.jpg + alt: "A diaphanous knit lacework scarf draped over the back of a chair. It is split down the long way into two colors - one tinted orange and one tinted mint blue. Both colors, the orange and the blue, are held double with the same variegated gray, making the piece more cohesive. The yarn overs in the lacework create airy repeating holes." +tags: + - gallery + - knit +--- + +## pattern + +[Open Air Wrap by Purl Soho](https://www.purlsoho.com/create/2014/05/22/whits-knits-open-air-wrap/){target="_blank" rel="external"} + +## yarns + +- Hedgehog Fibres Kidsilk Lace in Goblin +- ITO Sensai in Pale Blue +- Rowan Kidsilk Haze in Mineral diff --git a/src/posts/2025/2025-12-02-siblinghood.md b/src/posts/2025/2025-12-02-siblinghood.md new file mode 100644 index 0000000..2ad1ccc --- /dev/null +++ b/src/posts/2025/2025-12-02-siblinghood.md @@ -0,0 +1,115 @@ +--- +title: siblinghood of the traveling greeting card +image: + src: 2025/rockery.jpg + alt: "Image unrelated to post. A surprisingly neat pile of rounded beach rocks, mainly speckly grey-white-bluish ones, with trees in the background." +tags: + - reference + - stationery +--- + +welcome to the siblinghood of the traveling greeting card. it now has a home at [siblinghood.quest](https://siblinghood.quest){target="_blank" rel="external"}. + +originated on the fediverse - see the [#siblinghoodOfTheTravelingGreetingCard hashtag](https://flipping.rocks/tags/siblinghoodOfTheTravelingGreetingCard){target="_blank" rel="external"} - with original idea thanks to [noctiluca@scholar.social](https://scholar.social/@noctiluca){:target="_blank"} + +## table of contents + +- [objective](#objective) +- [outline](#outline) + - [timeline](#timeline) + - [participants](#participants) + - [on randomization](#on-randomization) + - [card guidelines](#card-guidelines) + - [address privacy](#address-privacy) +- [what I'll need from participants](#what-ill-need-from-participants) + - [signing the card](#signing-the-card) + - [mailing it back out](#mailing-it-back-out) + - [status checks](#status-checks) +- [what I'll send participants](#what-ill-send-participants) + - [guidelines](#guidelines) + - [recipient and loop order assignment](#recipient-and-loop-order-assignment) + - [reminders](#reminders) +- [I want in!](#i-want-in) + +## objective + +send a greeting card around the world. maybe more than one. we'll see. + +## outline + +from a group of participants, a random list will be formed. every person is given the address of the next person in the list (the last person receives the first person's address). first person picks a greeting card, signs it, and sends it to their designated recipient; that person receives, signs, sends on, etc. + +this continues on to the last person, who finally signs and sends back to the first, closing the loop and ending the adventure. the first person gets to keep the card they originally sent out. + +if we want to, this can be easily re-run - add folks who want to be added, drop folks who want to be dropped, scramble the list, and start again. + +### timeline + +accepting new applications for this first round until **December 15th, 2025**. After the 15th, you may still put in for future rounds, but be aware future rounds are not confirmed yet and will not be confirmed for at least 6 months most likely. + +your marching orders (recipient address, order in loop) will arrive by email no later than **January 1st, 2026**. + +### participants + +any number, but in the case of signups reaching 26 or greater people, the cohort will be split. Why 26? I'd like this to not run significantly longer than a year, and I'm *very loosely* estimating that each person will add 2 weeks to the timeline. + +**update:** we closed signups at 32 participants and will be running two loops! Don't worry, that doesn't change what you as participants do. + +### on randomization + +I will edit the list as needed to accommodate any mailing restrictions. I will also re-roll if I am placed first on the list. + +### card guidelines + +4x6 inches/10x15 centimeters minimum size recommended so there is space for everyone to sign. please nothing wildly vulgar, I guess? + +you are allowed to include stickers or similar flat items for future recipients if you so desire. Please ensure your package meets weight guidelines for flat mail (in the US, forever/international stamped mail must be under 1oz; outside of the US please look into local guidelines - if you're struggling to be sure let me know and I'll do my best to help). + +### address privacy + +the only people who will see your address are: + +- me +- the person who is sending directly to you +- if you put a return address (which I really would recommend), your recipient + +## what I'll need from participants + +### signing the card + +Sign in any way you find meaningful. Please don't hog the card space - remember that as many as ~2 dozen people will be signing it! + +**IMPORTANT!** Only put a name, nickname, doodle, fedi handle, etc. on the card that you are comfortable having displayed publicly. In any posts that I make, it will not be directly connected to you. However, as this likely has a small cohort, please be aware that how you sign could be tied back to your fedi account. + +### mailing it back out + +This will require a fresh envelope and stamp(s) as needed for postage. + +### status checks + +this is, at the end of the day, pretty flexible, but what I would *really, really like* is: + +- 2 emails, one on receipt and one on re-sending. This allows me to check in on progress and ensure the card doesn't get too stalled, or lost. +- more optionally, but fun for seeing how things are going: a picture of the card (**not** the envelope!) + +## what I'll send participants + +### guidelines + +all guidelines (which you can always find here!) will be repeated over email so you have a local copy. They may *additionally* be ported over to a standalone site if we find we want somewhere not-on-this-website for pictures and travel deets (don't worry, no addresses. Nothing more specific than country or state). + +### recipient and loop order assignment + +each participant will be sent the name and address of the next person in the loop. They will *also* be sent their place in the loop, numbered from **0**. + +### reminders + +I'll be doing my level best to track the card's movement, so as it is sent around (assuming I get check-ins from y'all! please help me out here!) I will send out reminders to folks to either check their mail or make sure the card gets sent out again. Some folks have specifically asked for this support and I don't want to let them down, so more communication is always better. + +## I want in! + +read all that? too long, didn't bother? either way. + +[sign up for the siblinghood of the traveling greeting card](https://airtable.com/appdoHZsRDUzgYu9q/pagsr9LVAqKx29gDl/form){target="_blank" rel="external"} + +(if airtable is for any reason inaccessible to you, please [reach out directly](/contact)) diff --git a/src/posts/2025/2025-12-02-stationery-exchange.md b/src/posts/2025/2025-12-02-stationery-exchange.md new file mode 100644 index 0000000..946c235 --- /dev/null +++ b/src/posts/2025/2025-12-02-stationery-exchange.md @@ -0,0 +1,47 @@ +--- +title: stationery exchange +image: + src: 2025/clustered-brown-mushrooms.jpg + alt: "Picture unrelated to post. A tight close-up on a cluster of tannish brown mushrooms." +tags: + - reference + - stationery +--- + +do you, like me, have a stash of greeting cards and stickers you'll never use? Too many notebooks and pens? + +let's do a stationery exchange! You'll still have too much stationery, but some will be new to you. + +originated on the fediverse - see the [#stationeryExchange hashtag](https://flipping.rocks/tags/stationeryExchange){target="_blank" rel="external"}. + +## outline + +similar to a Secret Santa (but not holiday-oriented), each participant is assigned a recipient. Participants assemble an envelope or package (estimate around $20-25 in value (not incl. shipping), but you are *highly encouraged* to pull from your own supplies, thrift, or make things yourself before buying new) and send to their recipients. + +because of international shipping prices, participants will opt in to broad location categories that they are able to ship to (US, EU, and rest of world). You are encouraged to provide more detail about your shipping abilities in a free text field following the opt-in question - if you'd like to check where you are unable to send mail to, try [postcrossing's postal monitor](https://www.postcrossing.com/postal-monitor){target="_blank" rel="external"}. I will do my absolute best to accommodate shipping restrictions and needs. If you are unable to be matched with a gifter and/or a giftee I will reach out. + +### timeline + +sign up form will close on **December 15th, 2025**. Participants will receive their giftee's details by **January 1st, 2026**. + +ship-by date of **February 15th, 2026**, giving participants **1 and a half months** to prepare and send their package. Packages will be expected to arrive by **March 15th, 2026**. If any recipient hasn't received a package by that time, I will follow up with their designated gifter. + +reach out if you need flexibility regarding timeline! + +### shipping + +if you are struggling with shipping costs, please feel free to put together a flat envelope with things such as greeting cards and stickers rather than more 3-dimensional items. + +if you are shipping **ink**, please be aware that liquids often have specific shipping rules. Look up the relevant rules for your location. + +if you are in the US, I quite recommend [Pirate Ship](https://www.pirateship.com){target="_blank" rel="external"} which can help you get discounted rates with USPS and other services. You must make an account, but there is no fee for doing so. + +### backups + +in the event of a drop-out or other issue, I will be providing one or two backup gifts. Participants may also opt-in to being backups as well to take some load off me. If backups are needed, I will cover the first one, then round-robin a randomized list of those who have opted in to backups. + +## let's do it! + +[sign up for the stationery exchange](https://airtable.com/appdTQoPQRBcMTPk7/pagT8xLSSk6XPC6eJ/form){target="_blank" rel="external"} + +(if airtable is for any reason inaccessible to you, please [reach out directly](/contact)) diff --git a/src/posts/2025/2025-12-21-happy-solstice-2025.md b/src/posts/2025/2025-12-21-happy-solstice-2025.md new file mode 100644 index 0000000..1eb6334 --- /dev/null +++ b/src/posts/2025/2025-12-21-happy-solstice-2025.md @@ -0,0 +1,11 @@ +--- +title: happy solstice 2025 +image: + src: 2025/solstice-2025.jpg + alt: "front and back of our solstice card from this year, designed in postcard format. long alt incoming... front - 4 picture collage. 1 - i'm standing in the woods, looking to one side, wearing an elaborate knit scarf. 2 - silhouetted thistle-like flowers in front of a pink-purple sky. 3 - my wife brooke crouches down to draw a heart in charcoal on a beach log, with 'L + B' written inside. 4 - brooke stands on a driftwood-covered beach looking hella cool in mirrored shades. our dog kes stands in front of her and looks off to one side eagerly. overlaid is the words 'happy solstice' in cursive. back - split down the center like the back of a postcard. on the left side, a 5 picture collage. 1 - i stand on a rock at the edge of a calm alpine lake. overlaid is the words 'lee, brooke, kestrel, & the flock' in print lettering. 2 - an early spring fern curl. 3 - our six ducks, all facing to the left, not in a row but still very organized. 4 - brooke grins at the camera while hugging kestrel's head. kestrel looks maybe a bit distraught. 5 - silhouette of a heron in flight across an early morning blue sky. on the address side, i've added a dahlia to represent the stamp, and written 'you!' in the field that would normally hold the mailing address." +tags: + - gallery + - highlight +--- + +Happy Solstice to you and yours. diff --git a/src/posts/2025/2025-12-28-handcombed-jacobs.md b/src/posts/2025/2025-12-28-handcombed-jacobs.md new file mode 100644 index 0000000..de4cdfc --- /dev/null +++ b/src/posts/2025/2025-12-28-handcombed-jacobs.md @@ -0,0 +1,11 @@ +--- +title: handcombed jacobs handspun +image: + src: 2025/handcombed-jacobs.jpg + alt: "a skein of dark grey handspun yarn" +tags: + - gallery + - yarn +--- + +Fiber: Jacobs wool that I scoured and combed myself. diff --git a/src/posts/2025/2025-12-28-icelandic-lamb.md b/src/posts/2025/2025-12-28-icelandic-lamb.md new file mode 100644 index 0000000..37261d7 --- /dev/null +++ b/src/posts/2025/2025-12-28-icelandic-lamb.md @@ -0,0 +1,11 @@ +--- +title: icelandic lamb handspun +image: + src: 2025/icelandic-lamb.jpg + alt: "a skein of black handspun yarn" +tags: + - gallery + - yarn +--- + +Fiber: Icelandic Lamb from Skagit Woolen Works diff --git a/src/posts/2025/2025-12-28-light-grey-jacobs.md b/src/posts/2025/2025-12-28-light-grey-jacobs.md new file mode 100644 index 0000000..8872b60 --- /dev/null +++ b/src/posts/2025/2025-12-28-light-grey-jacobs.md @@ -0,0 +1,11 @@ +--- +title: light grey jacobs handspun +image: + src: 2025/light-grey-jacobs.jpg + alt: "a skein of light grey handspun yarn" +tags: + - gallery + - yarn +--- + +Fiber: Jacobs (light grey) from Skagit Woolen Works diff --git a/src/posts/2025/2025-12-28-petrichor-handspun.md b/src/posts/2025/2025-12-28-petrichor-handspun.md new file mode 100644 index 0000000..d4ace8e --- /dev/null +++ b/src/posts/2025/2025-12-28-petrichor-handspun.md @@ -0,0 +1,11 @@ +--- +title: petrichor handspun +image: + src: 2025/petrichor-handspun.jpg + alt: "3 skeins of handspun yarn, 2 large and 1 small. the large ones are a rich earth-tone blend of reds, pinks, browns, and hints of green and gold. the smaller skein is similar but with a decidedly greener hue" +tags: + - gallery + - yarn +--- + +Fiber: Malabrigo Nube in colorway petrichor