Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
20f87d209f | ||
|
|
cd6d75fa48 | ||
|
|
230e86bf7c | ||
|
|
32b055f328 | ||
|
|
438d1a67e2 | ||
|
|
cd7f525bac | ||
|
|
6933f11630 | ||
|
|
62dab04ee9 | ||
|
|
e60d191e09 | ||
|
|
efe79ff639 | ||
|
|
4be20cccb3 | ||
|
|
aba74f280e | ||
|
|
0125216d96 | ||
|
|
6ee81d8784 | ||
|
|
2bfe616195 | ||
|
|
f9d8123b9d | ||
|
|
c7ef4c701a | ||
|
|
d8f3ea3430 | ||
|
|
a9b96e567e | ||
|
|
bc1a51a4d5 | ||
|
|
16c3ef1e26 | ||
|
|
efe153191a | ||
|
|
8c2c2231ac | ||
|
|
62b1e448ea | ||
|
|
d53198e1aa | ||
|
|
c6ec6b8f48 | ||
|
|
75909355ba | ||
|
|
d5660455bd | ||
|
|
7df4c1ff8e | ||
|
|
d6c2bb9aa9 | ||
|
|
604a6787f4 | ||
|
|
980cd0b3a6 | ||
|
|
5be42a4ff3 | ||
|
|
25c8e56a76 | ||
|
|
8752eeb904 | ||
|
|
b1135beddb | ||
|
|
84160a0574 | ||
|
|
557308f3f9 | ||
|
|
382419e6d6 | ||
|
|
66df77c32c | ||
|
|
a3e0ba5037 | ||
|
|
51d836c71b | ||
|
|
67e70e68ab | ||
|
|
b31e683786 | ||
|
|
1bb26176ba | ||
|
|
a000d1c1b9 | ||
|
|
cf26b06e3d | ||
|
|
5acda53f58 | ||
|
|
f2bc045735 | ||
|
|
3b1c5ffa88 | ||
|
|
0882fcda41 | ||
|
|
7d042abe1d | ||
|
|
f5bbda1f14 |
No files matched your search
@@ -1,6 +1,9 @@
|
||||
kind: pipeline
|
||||
type: docker
|
||||
name: default
|
||||
trigger:
|
||||
branch:
|
||||
- main
|
||||
|
||||
steps:
|
||||
- name: build
|
||||
|
||||
@@ -85,10 +85,9 @@ main {
|
||||
width: 60vw;
|
||||
max-width: 1000px;
|
||||
margin: 0 auto;
|
||||
scroll-margin-top: 7rem;
|
||||
}
|
||||
|
||||
@media (max-width: 1050px) {
|
||||
@media (max-width: 1100px) {
|
||||
main {
|
||||
width: 75vw;
|
||||
}
|
||||
@@ -114,10 +113,6 @@ h1 {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
h2, h3, h4, h5, h6 {
|
||||
scroll-margin-top: 5rem;
|
||||
}
|
||||
|
||||
h2 {
|
||||
margin-top: 2rem;
|
||||
font-size: 2.35rem;
|
||||
@@ -129,8 +124,11 @@ h3 {
|
||||
}
|
||||
|
||||
@media (max-width: 650px) {
|
||||
h1 { font-size: 2.95rem; }
|
||||
h2 { font-size: 1.9rem; }
|
||||
h1 {
|
||||
margin-top: 1.5rem;
|
||||
font-size: 2.25rem;
|
||||
}
|
||||
h2 { font-size: 1.8rem; }
|
||||
h3 { font-size: 1.4rem; }
|
||||
}
|
||||
|
||||
@@ -242,7 +240,7 @@ dd {
|
||||
blockquote {
|
||||
margin: .5rem 0;
|
||||
padding: 0 1rem;
|
||||
border-radius: .25rem 1rem 1rem .25rem;
|
||||
border-radius: .5rem;
|
||||
line-height: 1.25;
|
||||
border-left: .5rem solid var(--color-pink);
|
||||
}
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
#toc {
|
||||
float: right;
|
||||
margin: 1rem 0 1.5rem 1.5rem;
|
||||
/* 23rem is the width of the words 'table of contents' in my header font */
|
||||
/* yes, it's a bit hacky */
|
||||
width: min(calc(100% - 1.5rem), 23rem);
|
||||
width: fit-content;
|
||||
max-width: 55%;
|
||||
}
|
||||
|
||||
@media (max-width: 850px) {
|
||||
@media (max-width: 900px) {
|
||||
#toc {
|
||||
float: unset;
|
||||
margin-top: 2rem;
|
||||
margin-left: .5rem;
|
||||
width: calc(100% - .5rem);
|
||||
max-width: unset;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
background: var(--color-bg);
|
||||
border-radius: .5rem;
|
||||
cursor: pointer;
|
||||
padding-inline-end: .25rem;
|
||||
}
|
||||
|
||||
#toc summary:focus-visible {
|
||||
@@ -51,40 +52,43 @@
|
||||
top: -1.25rem;
|
||||
}
|
||||
|
||||
/* my baby my child my `tree` list style */
|
||||
#toc ol,
|
||||
#toc li {
|
||||
margin-block: 0;
|
||||
list-style: none;
|
||||
/* `tree` style toc */
|
||||
#toc nav > ol {
|
||||
margin-inline: 1rem;
|
||||
}
|
||||
|
||||
#toc ol {
|
||||
margin-left: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
#toc li {
|
||||
border-left: .095rem solid var(--color-pink);
|
||||
margin-left: 1.5rem;
|
||||
line-height: 1.15;
|
||||
text-indent: 1.22rem hanging;
|
||||
position: relative;
|
||||
padding-inline-start: 1em;
|
||||
list-style: none;
|
||||
margin-block: 0;
|
||||
margin-left: .35rem;
|
||||
}
|
||||
|
||||
#toc li::before,
|
||||
#toc li::after {
|
||||
display: block;
|
||||
position: absolute;
|
||||
box-sizing: border-box;
|
||||
inset-block: 0 auto;
|
||||
inset-inline: 0 auto;
|
||||
inline-size: .75em;
|
||||
border-inline-start: .1rem solid var(--color-pink);
|
||||
}
|
||||
|
||||
#toc li::before {
|
||||
content: '├─';
|
||||
color: var(--color-pink);
|
||||
position: relative;
|
||||
left: -.34rem;
|
||||
block-size: .5lh;
|
||||
border-block-end: .1rem solid var(--color-pink);
|
||||
content: "";
|
||||
}
|
||||
|
||||
#toc li:last-child {
|
||||
border-left-color: transparent;
|
||||
}
|
||||
|
||||
#toc li:last-child::before {
|
||||
/* Technically, we could use this content for all of them, but doing the full
|
||||
bar for the non-last-childs keeps the border a *smidge* more consistent for
|
||||
different levels of magnification */
|
||||
content: '└─';
|
||||
#toc li:not(:last-child)::after {
|
||||
block-size: 100%;
|
||||
content: "";
|
||||
}
|
||||
|
||||
/* underlines are unnecessary in this context */
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
|
||||
.job-details a {
|
||||
font-size: 1rem;
|
||||
font-family: var(--font-family);
|
||||
}
|
||||
|
||||
.job p {
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { HtmlBasePlugin } from "@11ty/eleventy";
|
||||
import { eleventyImageTransformPlugin } from "@11ty/eleventy-img";
|
||||
import eleventyNavigationPlugin from "@11ty/eleventy-navigation";
|
||||
import { feedPlugin } from "@11ty/eleventy-plugin-rss";
|
||||
@@ -107,6 +108,9 @@ export default async function(eleventyConfig) {
|
||||
}
|
||||
});
|
||||
|
||||
/* HTML base */
|
||||
eleventyConfig.addPlugin(HtmlBasePlugin);
|
||||
|
||||
/* Images */
|
||||
eleventyConfig.addPlugin(eleventyImageTransformPlugin, {
|
||||
// output image formats
|
||||
|
||||
@@ -50,45 +50,45 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@11ty/eleventy": {
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-3.1.2.tgz",
|
||||
"integrity": "sha512-IcsDlbXnBf8cHzbM1YBv3JcTyLB35EK88QexmVyFdVJVgUU6bh9g687rpxryJirHzo06PuwnYaEEdVZQfIgRGg==",
|
||||
"version": "3.1.6",
|
||||
"resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-3.1.6.tgz",
|
||||
"integrity": "sha512-ZlSiR1PLdS2lv7TelBgWAhcvMiLNZkPBlLEb+lh7kGYZ+Mk0bo9qcYgVsewvw9W7Em0RH3wd01h5fAstNDh0zA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@11ty/dependency-tree": "^4.0.0",
|
||||
"@11ty/dependency-tree-esm": "^2.0.0",
|
||||
"@11ty/dependency-tree": "^4.0.2",
|
||||
"@11ty/dependency-tree-esm": "^2.0.4",
|
||||
"@11ty/eleventy-dev-server": "^2.0.8",
|
||||
"@11ty/eleventy-plugin-bundle": "^3.0.6",
|
||||
"@11ty/eleventy-plugin-bundle": "^3.0.7",
|
||||
"@11ty/eleventy-utils": "^2.0.7",
|
||||
"@11ty/lodash-custom": "^4.17.21",
|
||||
"@11ty/posthtml-urls": "^1.0.1",
|
||||
"@11ty/recursive-copy": "^4.0.2",
|
||||
"@11ty/posthtml-urls": "^1.0.3",
|
||||
"@11ty/recursive-copy": "^4.0.4",
|
||||
"@sindresorhus/slugify": "^2.2.1",
|
||||
"bcp-47-normalize": "^2.3.0",
|
||||
"chokidar": "^3.6.0",
|
||||
"debug": "^4.4.1",
|
||||
"debug": "^4.4.3",
|
||||
"dependency-graph": "^1.0.0",
|
||||
"entities": "^6.0.1",
|
||||
"filesize": "^10.1.6",
|
||||
"gray-matter": "^4.0.3",
|
||||
"iso-639-1": "^3.1.5",
|
||||
"js-yaml": "^4.1.0",
|
||||
"js-yaml": "^4.1.1",
|
||||
"kleur": "^4.1.5",
|
||||
"liquidjs": "^10.21.1",
|
||||
"luxon": "^3.6.1",
|
||||
"markdown-it": "^14.1.0",
|
||||
"liquidjs": "^10.27.0",
|
||||
"luxon": "^3.7.2",
|
||||
"markdown-it": "^14.2.0",
|
||||
"minimist": "^1.2.8",
|
||||
"moo": "^0.5.2",
|
||||
"moo": "0.5.2",
|
||||
"node-retrieve-globals": "^6.0.1",
|
||||
"nunjucks": "^3.2.4",
|
||||
"picomatch": "^4.0.2",
|
||||
"picomatch": "^4.0.4",
|
||||
"please-upgrade-node": "^3.2.0",
|
||||
"posthtml": "^0.16.6",
|
||||
"posthtml": "^0.16.7",
|
||||
"posthtml-match-helper": "^2.0.3",
|
||||
"semver": "^7.7.2",
|
||||
"slugify": "^1.6.6",
|
||||
"tinyglobby": "^0.2.14"
|
||||
"semver": "^7.8.1",
|
||||
"slugify": "^1.6.9",
|
||||
"tinyglobby": "^0.2.16"
|
||||
},
|
||||
"bin": {
|
||||
"eleventy": "cmd.cjs"
|
||||
@@ -270,9 +270,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@11ty/posthtml-urls": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@11ty/posthtml-urls/-/posthtml-urls-1.0.2.tgz",
|
||||
"integrity": "sha512-0vaV3Wt0surZ+oS1VdKKe0axeeupuM+l7W/Z866WFQwF+dGg2Tc/nmhk/5l74/Y55P8KyImnLN9CdygNw2huHg==",
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@11ty/posthtml-urls/-/posthtml-urls-1.0.3.tgz",
|
||||
"integrity": "sha512-1YvhnkaNlFnnJic1rBMWmTC2adbuy+JQiBfl1Hecr1Wjjik1pQZmGyk/eC9zKX/FQv52s2Nht1Gi/UwhYqrBeg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -286,15 +286,15 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@11ty/recursive-copy": {
|
||||
"version": "4.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@11ty/recursive-copy/-/recursive-copy-4.0.3.tgz",
|
||||
"integrity": "sha512-SX48BTLEGX8T/OsKWORsHAAeiDsbFl79Oa/0Wg/mv/d27b7trCVZs7fMHvpSgDvZz/fZqx5rDk8+nx5oyT7xBw==",
|
||||
"version": "4.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@11ty/recursive-copy/-/recursive-copy-4.0.4.tgz",
|
||||
"integrity": "sha512-oI7m8pa7/IAU/3lqRU9vjBbs20iKFo7x+1K9kT3aVira6scc1X9MjBdgLCHzLJeJ7iB6wydioA+kr9/qPnvmlQ==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"errno": "^1.0.0",
|
||||
"junk": "^3.1.0",
|
||||
"maximatch": "^0.1.0",
|
||||
"minimatch": "^3.1.5",
|
||||
"slash": "^3.0.0"
|
||||
},
|
||||
"engines": {
|
||||
@@ -999,49 +999,6 @@
|
||||
"dev": true,
|
||||
"license": "Python-2.0"
|
||||
},
|
||||
"node_modules/array-differ": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
|
||||
"integrity": "sha512-LeZY+DZDRnvP7eMuQ6LHfCzUGxAAIViUBliK24P3hWXL6y4SortgR6Nim6xrkfSLlmH0+k+9NYNwVC2s53ZrYQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/array-union": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
|
||||
"integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"array-uniq": "^1.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/array-uniq": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
|
||||
"integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/arrify": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
|
||||
"integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/asap": {
|
||||
"version": "2.0.6",
|
||||
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
|
||||
@@ -2356,22 +2313,6 @@
|
||||
"url": "https://github.com/fb55/entities?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/maximatch": {
|
||||
"version": "0.1.0",
|
||||
"resolved": "https://registry.npmjs.org/maximatch/-/maximatch-0.1.0.tgz",
|
||||
"integrity": "sha512-9ORVtDUFk4u/NFfo0vG/ND/z7UQCVZBL539YW0+U1I7H1BkZwizcPx5foFv7LCPcBnm2U6RjFnQOsIvN4/Vm2A==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"array-differ": "^1.0.0",
|
||||
"array-union": "^1.0.1",
|
||||
"arrify": "^1.0.0",
|
||||
"minimatch": "^3.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/mdurl": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz",
|
||||
@@ -2860,9 +2801,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/semver": {
|
||||
"version": "7.7.4",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
|
||||
"integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
|
||||
"version": "7.8.5",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
|
||||
"integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"bin": {
|
||||
@@ -2974,9 +2915,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/slugify": {
|
||||
"version": "1.6.6",
|
||||
"resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz",
|
||||
"integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==",
|
||||
"version": "1.6.9",
|
||||
"resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.9.tgz",
|
||||
"integrity": "sha512-vZ7rfeehZui7wQs438JXBckYLkIIdfHOXsaVEUMyS5fHo1483l1bMdo0EDSWYclY0yZKFOipDy4KHuKs6ssvdg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
@@ -3024,14 +2965,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/tinyglobby": {
|
||||
"version": "0.2.15",
|
||||
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
|
||||
"integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
|
||||
"version": "0.2.17",
|
||||
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
|
||||
"integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"fdir": "^6.5.0",
|
||||
"picomatch": "^4.0.3"
|
||||
"picomatch": "^4.0.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12.0.0"
|
||||
|
||||
|
Before Width: | Height: | Size: 5.6 MiB After Width: | Height: | Size: 1.3 MiB |
|
Before Width: | Height: | Size: 1.2 MiB After Width: | Height: | Size: 259 KiB |
|
Before Width: | Height: | Size: 315 KiB After Width: | Height: | Size: 240 KiB |
|
Before Width: | Height: | Size: 1.2 MiB After Width: | Height: | Size: 234 KiB |
|
After Width: | Height: | Size: 102 KiB |
|
After Width: | Height: | Size: 98 KiB |
|
Before Width: | Height: | Size: 341 KiB After Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 3.2 MiB After Width: | Height: | Size: 524 KiB |
|
Before Width: | Height: | Size: 2.5 MiB After Width: | Height: | Size: 351 KiB |
|
Before Width: | Height: | Size: 3.0 MiB After Width: | Height: | Size: 1.2 MiB |
|
Before Width: | Height: | Size: 2.7 MiB After Width: | Height: | Size: 428 KiB |
|
After Width: | Height: | Size: 96 KiB |
|
Before Width: | Height: | Size: 1.2 MiB After Width: | Height: | Size: 447 KiB |
|
Before Width: | Height: | Size: 2.5 MiB After Width: | Height: | Size: 1001 KiB |
|
After Width: | Height: | Size: 538 KiB |
|
Before Width: | Height: | Size: 372 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 203 KiB After Width: | Height: | Size: 92 KiB |
|
After Width: | Height: | Size: 292 KiB |
|
After Width: | Height: | Size: 391 KiB |
|
After Width: | Height: | Size: 411 KiB |
|
After Width: | Height: | Size: 397 KiB |
|
After Width: | Height: | Size: 457 KiB |
|
After Width: | Height: | Size: 383 KiB |
|
After Width: | Height: | Size: 395 KiB |
|
After Width: | Height: | Size: 458 KiB |
|
After Width: | Height: | Size: 517 KiB |
|
After Width: | Height: | Size: 375 KiB |
|
After Width: | Height: | Size: 598 KiB |
|
After Width: | Height: | Size: 580 KiB |
|
Before Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 47 KiB |
@@ -47,7 +47,7 @@ layout: base.njk
|
||||
|
||||
<div class="job">
|
||||
<div class="two-col job-details">
|
||||
<h3>Freelance Web Developer</h3>
|
||||
<h3 id="freelance-web-developer">Freelance Web Developer</h3>
|
||||
<p class="col2"><time datetime="2026-01">January 2026</time> – Present</p>
|
||||
</div>
|
||||
|
||||
@@ -64,6 +64,17 @@ layout: base.njk
|
||||
a clean and minimalist homepage for the District Dharma collective,
|
||||
built in Eleventy with a Mattrbld content management system to allow
|
||||
for easy editing by the client.
|
||||
<blockquote class="testimonial">
|
||||
Being of a generation that didn't grow up with technology, I was a little
|
||||
nervous going into this project, but Lee made it easy. He was patient and
|
||||
completely non-judgmental with my simple questions, quick to respond by
|
||||
email, and open to my feedback throughout. He built exactly what I
|
||||
envisioned for our meditation group's website, and his estimate was the
|
||||
final cost. When he asked what he could improve, I honestly couldn't come
|
||||
up with anything. He delivered what he promised and was easy to reach the
|
||||
whole way through. If you want someone skilled who will also make the
|
||||
process feel comfortable, I can't recommend him highly enough.
|
||||
</blockquote>
|
||||
</li>
|
||||
<li>
|
||||
<strong>My Liberation Work Has Been Damn Ableist: A Landworker Memoir
|
||||
@@ -147,7 +158,7 @@ layout: base.njk
|
||||
datetime="2025-07">July 2025</time></p>
|
||||
</div>
|
||||
|
||||
<h3>Software Development Engineer I & II</h3>
|
||||
<h3 id="software-development-engineer-i-ii">Software Development Engineer I & II</h3>
|
||||
|
||||
<p>
|
||||
Worked on green- and brown-field projects with customers, solving emerging
|
||||
@@ -184,7 +195,7 @@ layout: base.njk
|
||||
<p class="col2"><time datetime="2023-10">October 2023</time> – Present</p>
|
||||
</div>
|
||||
|
||||
<h3>Co-owner and artist</h3>
|
||||
<h3 id="co-owner-and-artist">Co-owner and artist</h3>
|
||||
|
||||
<p>
|
||||
Maintains website, storefront, and inventory for a diverse set of artistic
|
||||
@@ -210,7 +221,7 @@ layout: base.njk
|
||||
datetime="2017-12">December 2017</time></p>
|
||||
</div>
|
||||
|
||||
<h3>Undergraduate Programming Mentor</h3>
|
||||
<h3 id="undergraduate-programming-mentor">Undergraduate Programming Mentor</h3>
|
||||
|
||||
<p>
|
||||
Helped students debug and develop in Python and learn core programming
|
||||
@@ -227,7 +238,7 @@ layout: base.njk
|
||||
datetime="2017-08">August 2017</time></p>
|
||||
</div>
|
||||
|
||||
<h3>Software Development Engineering Intern</h3>
|
||||
<h3 id="software-development-engineering-intern">Software Development Engineering Intern</h3>
|
||||
<p>
|
||||
Developed a chatbot add-on for the Azure Android application.
|
||||
</p>
|
||||
@@ -239,7 +250,7 @@ layout: base.njk
|
||||
|
||||
<div class="job">
|
||||
<div class="two-col job-details">
|
||||
<h3>FediLearns (<a
|
||||
<h3 id="fedilearns">FediLearns (<a
|
||||
href="https://fedilearns.fyi" target="_blank">fedilearns.fyi</a>)</h3>
|
||||
<p class="col2"><time datetime="2026-04">April 2026</time> – Present
|
||||
</p>
|
||||
@@ -254,7 +265,7 @@ layout: base.njk
|
||||
|
||||
<div class="job">
|
||||
<div class="two-col job-details">
|
||||
<h3>Siblinghood of the Traveling Greeting Card (<a
|
||||
<h3 id="siblinghood-of-the-traveling-greeting-card">Siblinghood of the Traveling Greeting Card (<a
|
||||
href="https://siblinghood.quest"
|
||||
target="_blank">siblinghood.quest</a>)</h3>
|
||||
<p class="col2"><time datetime="2025-11">November 2025</time> – Present
|
||||
@@ -269,13 +280,13 @@ layout: base.njk
|
||||
|
||||
<div class="job">
|
||||
<div class="two-col job-details">
|
||||
<h3>FediZineFest (<a href="https://fedizinefest.fyi"
|
||||
<h3 id="fedizinefest">FediZineFest (<a href="https://fedizinefest.fyi"
|
||||
target="_blank">fedizinefest.fyi</a>)</h3>
|
||||
<p class="col2"><time datetime="2023-12">December 2023</time> – Present</p>
|
||||
</div>
|
||||
|
||||
<p>Creates and runs a global event for zine artists on the fediverse, now kicking
|
||||
off its third year. Coordinates website, physical material shipping and
|
||||
<p>Creates and runs a global event for zine artists on the fediverse, now in its
|
||||
third year. Coordinates website, physical material shipping and
|
||||
logistics, payment, and marketing for a 40–50 person project. Leads a small team
|
||||
and delegates appropriate responsibilities.</p>
|
||||
</div>
|
||||
@@ -295,7 +306,7 @@ layout: base.njk
|
||||
|
||||
<div class="job">
|
||||
<div class="two-col job-details">
|
||||
<h3>Rescue Trans Rescue (<a href="https://rescue-trans-rescue.quest"
|
||||
<h3 id="rescue-trans-rescue">Rescue Trans Rescue (<a href="https://rescue-trans-rescue.quest"
|
||||
target="_blank">rescue-trans-rescue.quest</a>)</h3>
|
||||
<p class="col2"><time datetime="2024">2024</time></p>
|
||||
</div>
|
||||
@@ -307,7 +318,7 @@ layout: base.njk
|
||||
|
||||
<hr>
|
||||
|
||||
<h2 class="centered upper">Education</h2>
|
||||
<h2 class="centered upper" id="education">Education</h2>
|
||||
|
||||
<p class="centered">
|
||||
<b>Bachelor of Science — Computer Science</b>
|
||||
|
||||
@@ -30,6 +30,10 @@ tags:
|
||||
|
||||
- [Ten Thousand](https://xkcd.com/1053/) by Randall Munroe
|
||||
|
||||
## Movies
|
||||
|
||||
- [To Wong Foo, Thanks for Everything! Julie Newmar](https://www.imdb.com/title/tt0114682/)
|
||||
|
||||
## Short fiction
|
||||
|
||||
- [Why Don't We Just Kill the Kid in the Omelas Hole](https://clarkesworldmagazine.com/kim_02_24/) by Isabel J. Kim
|
||||
|
||||
@@ -9,5 +9,3 @@ tags:
|
||||
- gender
|
||||
- patch
|
||||
---
|
||||
|
||||
Limited number available for free in my [square shop](https://riverside-refuge.square.site/product/tooled-leather-pronoun-patch/91) with the code "FREEPATCH"
|
||||
@@ -7,9 +7,3 @@ tags:
|
||||
- gallery
|
||||
- leather
|
||||
---
|
||||
|
||||
Made a few variations of this; check out the shop for more details and options:
|
||||
|
||||
- [fixed o-ring bracelet](https://riverside-refuge.square.site/product/fixed-o-ring-bracelet/108)
|
||||
- [swappable o-ring bracelet](https://riverside-refuge.square.site/product/swappable-o-ring-bracelet/102)
|
||||
- [premade o-ring bracelets](https://riverside-refuge.square.site/product/premade-o-ring-bracelets/106)
|
||||
@@ -7,5 +7,3 @@ tags:
|
||||
- gallery
|
||||
- print
|
||||
---
|
||||
|
||||
currently offering these free [in the shop](https://riverside-refuge.square.site/product/tiny-personal-pet-portrait-stamp/111) with the code FREESTAMP
|
||||
@@ -11,6 +11,8 @@ tags:
|
||||
|
||||
alrighty, this one's a real doozy. Strap in.
|
||||
|
||||
and as always, if you find an error or have feedback, please [let me know](/contact).
|
||||
|
||||
## versioning
|
||||
|
||||
have you ever tried to revert to a previous version of a document in MS Office or Google Docs and found that your revision history is cluttered with small changes that by all rights should be grouped into one set of edits, but they aren't, and it's tedious to pick through all the versions?
|
||||
@@ -30,7 +32,7 @@ this walkthrough is best suited for people who want to use `git` in single-perso
|
||||
|
||||
this walkthrough also focuses on the "happy path," without much discussion of troubleshooting. I may write more on the topic in the future, but we're already over *4,500 words*, so we're calling it a day.
|
||||
|
||||
finally, I wrote this walkthrough primarily with knowledge from using **WSL** [more on this later] on **Windows** and with **Zed** as my text editor. While I've tried to cover my bases with other OSes and options, there's a solid chance I'm missing things!
|
||||
finally, I wrote this walkthrough primarily with knowledge from using **WSL** [more on this later] on **Windows** and with **Zed** as my text editor, and I've since lightly reviewed from **Linux Mint** with **Gram** as my text editor. While I've tried to cover my bases with other OSes and options, there's a solid chance I'm missing things!
|
||||
|
||||
that all said, let's get (git?) into it!
|
||||
|
||||
@@ -58,10 +60,10 @@ a CLI a way to interact with your computer and with software in text-only form.
|
||||
|
||||
if you want to use the `git` CLI, you'll need a terminal. You've got a couple options here:
|
||||
|
||||
- on Linux or Mac, you should have one built in! This is the easy path, congrats :) Even better, `git` generally ships with these systems, so there's no installation required. Search for an application called 'Terminal' or similar
|
||||
- on Linux or Mac, you should have one built in! This is the easy path, congrats :) Even better, `git` generally ships with these systems (or is a one-liner install such as `apt install git`). Search for an application called 'Terminal' or similar
|
||||
- note that I don't have a Mac and have never used one. I can't guarantee that everything operates the same over there - there may be discrepancies I don't know about
|
||||
- on Windows, there's two options
|
||||
- [`git` for Windows](https://gitforwindows.org/) packages a Linux-like terminal with a `git` GUI. This may be slightly friendlier for people who aren't at all familiar with Linux. If choosing `git` for Windows, [see my installation instructions below](#git-for-windows)
|
||||
- [`git` for Windows](https://gitforwindows.org/) packages a Linux-like terminal with a `git` GUI. This is probably the friendlier option to get started with. If choosing `git` for Windows, [see my installation instructions below](#git-for-windows)
|
||||
- I use [Windows Subsystem for Linux, or WSL](https://learn.microsoft.com/en-us/windows/wsl/install), which gives you a Linux distribution within Windows. It's pretty smooth sailing at this point, but there's some idiosyncracies to conquer - like the fact that your *Windows* files and your *Linux* files are stored in different places. If choosing WSL, [see my usage notes below](#wsl)
|
||||
- both of the Windows options listed work with [Windows Terminal](https://apps.microsoft.com/detail/9n0dx20hk701) which offers a nicer-looking terminal experience than the basic command prompt. If you're going to keep working with what you set up today, I recommend it!
|
||||
|
||||
@@ -83,7 +85,7 @@ you can open `git` for Windows via the start menu by searching for 'git bash.' I
|
||||
while *installing* WSL is a single command, here's a couple notes about getting started once *inside* WSL:
|
||||
|
||||
- don't be concerned that you can't see anything when you type or paste your password! Since it's sensitive information, this is intentional. You'll notice this pattern a couple of times while following this walkthrough
|
||||
- `Ctrl+C` and `Ctrl+V` won't work like they do on Windows. If you want to copy/paste, right-click (there won't be a context menu, it'll just happen)
|
||||
- `Ctrl+C` and `Ctrl+V` won't work like they do on Windows. If you want to copy/paste, use `Shift+Ctrl+C` and `Shift+Ctrl+V`
|
||||
- if you're downloading a text editor like the ones mentioned above, you'll still follow the *Windows* instructions
|
||||
|
||||
you'll also need to be careful of a few things regarding text editors to make them work with WSL:
|
||||
@@ -354,14 +356,16 @@ let's head on over to [Codeberg](https://codeberg.org/) First off, we'll make an
|
||||
|
||||
now we'll make a new project using the `+` in the upper right. Choose 'New repository,' then pick a repository name. You can leave the other settings be.
|
||||
|
||||
with the project created, Codeberg will tell us three things we can do: clone the repository, create a new repository, or push an existing repository. We'll push an existing one.
|
||||
with the project created, Codeberg will tell us three things we can do: clone the repository, create a new repository, or push an existing repository. We'll push an existing one. Codeberg says we can do this:
|
||||
|
||||
```sh
|
||||
git remote add origin https://codeberg.org/inherentlee/testing.git
|
||||
git remote add origin https://codeberg.org/inherentlee/git-intro.git
|
||||
git push -u origin main
|
||||
```
|
||||
|
||||
first, we'll add a remote. Across from the project title, we should see a button that says `Code` with a dropdown indicator. It'll offer a few choices, the first two being SSH and HTTPS. I'll talk about SSH in a bit, but let's try HTTPS first. Copy that URL; we're about to use it in a command.
|
||||
ok, let's break that down.
|
||||
|
||||
first, we'll add a remote. Across from the project title, we should see a button that says `Code` with a dropdown indicator. It'll offer a few choices, the first two being SSH and HTTPS. I'll talk about SSH in a bit, but let's try HTTPS first. Copy that URL; we're about to use it in a command. (You can also directly copy from the instructions we read above, but those won't be available after you've added code to the Codeberg project.)
|
||||
|
||||
> tip: the remote can be named whatever you want! Traditionally, it's called `origin`, but if it's easier for you to remember, you might call it `codeberg` or maybe `remote`
|
||||
|
||||
@@ -432,7 +436,7 @@ running `ssh-keygen` will take us through a series of prompts. Assuming we don't
|
||||
|
||||
when you choose a passphrase, *write it down*. If you lose it, there is no recourse. You will have to generate a new SSH key.
|
||||
|
||||
after generation, we will have two files at the location specified by the tool (or the custom location we chose). Generally, that's the folder `.ssh` in our home directory. If we navigate to that directory (`cd $HOME/.ssh`) and look at the files (`ls`), we'll see files named `id_rsa` and `id_rsa.pub`. The one that ends with `.pub` is the *public* key.
|
||||
after generation, we will have two files at the location specified by the tool (or the custom location we chose). Generally, that's the folder `.ssh` in our home directory. If we navigate to that directory (`cd $HOME/.ssh`) and look at the files (`ls`), we'll see files named `id_rsa` and `id_rsa.pub` (or maybe `id_ed25519` and `id_ed25519.pub` or something else). The one that ends with `.pub` is the *public* key.
|
||||
|
||||
#### an alias...
|
||||
|
||||
@@ -488,7 +492,7 @@ in order for all this to be useful, we need to tell Codeberg about our SSH key.
|
||||
|
||||
### `git push`, take two
|
||||
|
||||
we can now call `git push` again and again now without having to repeat our credentials every time. We can also call `git pull` for our private repositories.
|
||||
whether we're using HTTPS or SSH, we can now call `git push` again and again now without having to repeat our credentials every time. We can also call `git pull` for our private repositories.
|
||||
|
||||
## summary
|
||||
|
||||
|
||||
@@ -138,11 +138,11 @@ I have written [further thoughts on Framer accessibility](/framer-accessibility)
|
||||
|---|---|---|
|
||||
| Semantic HTML | Template tested uses somewhat reasonable semantic HTML. Choice of what is considered a heading is a bit curious | 2 |
|
||||
| Keyboard navigation | Template tested has custom tab focus styling. Cannot be further edited, but custom that fits the theme is pretty standout. Skip link included in at least some templates. | 3 |
|
||||
| Reading order | Imperfect and can't be edited by user. Block-based layout is a little too freeform to ensure proper reading order, so the user should be careful where they add things. Early testing indicates that reading order is determined by the *first* place a block is placed, and is never re-assessed by the builder. | 1 |
|
||||
| Text alternatives | Supported. | 3 |
|
||||
| Reading order | Imperfect and can't be edited by user. Block-based layout is a little too freeform to ensure proper reading order, so the user should be careful where they add things. It's a little unclear where the reading order follows from, because it doesn't always map to the blocks. | 1 |
|
||||
| Text alternatives | Supported, but not for everything - for example event pictures don't support alt text. | 2 |
|
||||
| Color | Dark mode requires custom code or a plugin and seems *extremely* painful to accomplish. | 1 |
|
||||
| Other | This isn't an accessibility consideration, but *christ* is Squarespace a pain to work with. | 1 |
|
||||
| | | **11** |
|
||||
| | | **10** |
|
||||
|
||||
## Startup
|
||||
|
||||
@@ -243,10 +243,10 @@ Overall, I explored 11 builders, couldn't test 1 due to OS restrictions, and hav
|
||||
| Startup | 13 |
|
||||
| Blocs** | 12 |
|
||||
| Framer* | 12 |
|
||||
| Squarespace* | 11 |
|
||||
| Univer.se | 11 |
|
||||
| Cowsites | 10 |
|
||||
| Showit | 10 |
|
||||
| Squarespace* | 10 |
|
||||
| Wobble Web | 10 |
|
||||
| Kiki | 9 |
|
||||
| mmm.page | 9 |
|
||||
|
||||
@@ -8,10 +8,11 @@ tags:
|
||||
- gallery
|
||||
- zine
|
||||
- leather
|
||||
draft: true
|
||||
---
|
||||
|
||||
This page contains textual representation of and supplementary material for my Leatherworking Tools zine (purchase link to be added in the future), including links to all tools and additional information as needed.
|
||||
This page contains textual representation of and supplementary material for my Leatherworking Tools zine, including links to all tools and additional information as needed.
|
||||
|
||||
The Leatherworking Tools zine has been created for [FediZineFest 2026-2027](/fedizinefest-2026-2027) and will be part of the physical and digital bundles. For digital material, there will be a home-printable version and a version for reading on digital devices. If you want the delightfully illustrated zine itself, [buy a bundle now](https://ko-fi.com/inherentlee/shop/fedizinefest2026_2027).
|
||||
|
||||
## On tool links
|
||||
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
---
|
||||
title: fediZineFest 2026-2027
|
||||
image:
|
||||
src: 2026/fedizinefest.png
|
||||
alt: the logo of FediZineFest 2026-2027 which is a 4 by 4 grid of blocky letters reading fedi zine fest 26-27, randomly colored with the 26-27 palette.
|
||||
tags:
|
||||
- reference
|
||||
- zine
|
||||
---
|
||||
|
||||
FediZineFest returns for for its third run in 2026-2027. View the [FediZineFest site](https://fedizinefest.fyi), or [buy zine bundles](https://ko-fi.com/inherentlee/shop/fedizinefest2026_2027).
|
||||
@@ -1,217 +0,0 @@
|
||||
---
|
||||
title: tree-style table of contents
|
||||
layout: post-with-toc.njk
|
||||
image:
|
||||
src: 2026/tree-styling-0.png
|
||||
alt: "screenshot of the table of contents for a blog post (this blog post, in fact). it's been styled so that the output resembles the hierarchical file system output from the shell program 'tree.'"
|
||||
tags:
|
||||
- reference
|
||||
- software
|
||||
---
|
||||
|
||||
I have a shiny new Table of Contents (hereafter ToC) section for some of my posts (like this one)! And for fun and profit, it's styled like the output of [`tree`](https://en.wikipedia.org/wiki/Tree_(command)). I want to lay out the CSS I used for this. Fair warning, there's some hyper-specific border widths and positioning that *probably* should be a `calc()` function of some kind.
|
||||
|
||||
I drew inspiration from this [StackOverflow issue regarding tree styling for lists](https://stackoverflow.com/questions/14423671/best-method-for-displaying-a-tree-list-using-css-only-no-images-or-js-example).
|
||||
|
||||
## `tree`
|
||||
|
||||
Just for reference, here's some sample `tree` output:
|
||||
|
||||
```txt
|
||||
.
|
||||
├── footer.njk
|
||||
├── head-content.njk
|
||||
├── header.njk
|
||||
├── layouts
|
||||
│ ├── base.njk
|
||||
│ ├── page-lists.njk
|
||||
│ ├── page.njk
|
||||
│ ├── post.njk
|
||||
│ ├── post-with-toc.njk
|
||||
│ └── tag-redirect.njk
|
||||
├── pagination.njk
|
||||
├── postlist.njk
|
||||
└── webring.njk
|
||||
```
|
||||
|
||||
(You'll note that there are gaps between the verticals of each line. That's due to the line-height on the page, but in a standard terminal those vertical lines would be contiguous.)
|
||||
|
||||
## HTML
|
||||
|
||||
Our ToC uses the following HTML structure:
|
||||
|
||||
```html
|
||||
<aside id="toc">
|
||||
<details>
|
||||
<summary><h2>table of contents</h2></summary>
|
||||
<nav>
|
||||
<ol>
|
||||
<li><a>h2 1</a></li>
|
||||
<li><a>h2 2</a>
|
||||
<ol>
|
||||
<li><a>h3 2a</a></li>
|
||||
<li><a>h3 2b</a></li>
|
||||
</ol>
|
||||
</li>
|
||||
<li><a>h2 3</a></li>
|
||||
<!-- etc -->
|
||||
</ol>
|
||||
</nav>
|
||||
</details>
|
||||
</aside>
|
||||
```
|
||||
|
||||
We can ignore the `<aside>`, `<details>`, and `<nav>` components - we're going to focus on the `<ol>`s and `<li>`s.
|
||||
|
||||
## CSS
|
||||
|
||||
Despite referencing a StackOverflow issue above, I never like to just copy-paste a chunk of StackOverflow code into place. I don't like extraneous CSS, and sometimes there's stuff mixed in there that just isn't necessary. Let's build from the ground up.
|
||||
|
||||
### remove styling that will be in the way
|
||||
|
||||
By default, my lists have a lot of space around them for legibility when reading longer list items. We'll be accomplishing the vertical bars with borders here, so it's critical we not have any block-oriented spacing on `<ol>`s and `<li>`s. We're also going to take the numeric `list-style` off.
|
||||
|
||||
```css
|
||||
#toc ol,
|
||||
#toc li {
|
||||
margin-block: 0;
|
||||
list-style: none;
|
||||
}
|
||||
```
|
||||
|
||||
### start the structure with borders
|
||||
|
||||
The `tree`-like structure will be accomplished with both symbols (stolen directly from the tree output) and borders. Let's throw some borders on.
|
||||
|
||||
```css
|
||||
#toc li {
|
||||
border-left: .095rem solid var(--color-pink);
|
||||
}
|
||||
```
|
||||
|
||||

|
||||
|
||||
Those are super off. First, they're tabbed too far in to the left; second, there's *no* space between the border and the list item. We're going to fix the first thing by removing left margins on the `<ol>`s. The second is where we pull in the most critical piece of infrastructure.
|
||||
|
||||
```css
|
||||
#toc ol {
|
||||
margin-left: 0;
|
||||
}
|
||||
```
|
||||
|
||||
### `li::before`
|
||||
|
||||
We're going to use a character from the `tree` output and place it before our list items.
|
||||
|
||||
```css
|
||||
#toc li::before {
|
||||
content: '├─';
|
||||
color: var(--color-pink);
|
||||
}
|
||||
```
|
||||
|
||||
Notably, without additional positioning, the bars will be spaced away from the border. We want them to overlap perfectly.
|
||||
|
||||

|
||||
|
||||
```css
|
||||
#toc li::before {
|
||||
position: relative;
|
||||
left: -.34rem; /* I fiddled a lot and this is where I landed */
|
||||
}
|
||||
```
|
||||
|
||||

|
||||
|
||||
### adjust left margins
|
||||
|
||||
Right now, the vertical lines don't nest nicely underneath the level above. Let's change our margins. I also adjusted the line height very slightly, because I noticed on some levels of magnification that the tree line leader characters weren't actually meeting.
|
||||
|
||||
```css
|
||||
#toc li {
|
||||
margin-left: 1.5rem;
|
||||
line-height: 1.15;
|
||||
}
|
||||
```
|
||||
|
||||

|
||||
|
||||
### fix those pesky last children
|
||||
|
||||
You've probably noticed that the last children in the tree output had a bend rather than the T-shape we've been using. We'll want to remove the border from the last children and change the character we're using.
|
||||
|
||||
```css
|
||||
#toc li:last-child {
|
||||
border-left-color: transparent;
|
||||
}
|
||||
|
||||
#toc li:last-child::before {
|
||||
/* Technically, we could use this content for all of them, but doing the full
|
||||
bar for the non-last-childs keeps the border a *smidge* more consistent for
|
||||
different levels of magnification */
|
||||
content: '└─';
|
||||
}
|
||||
```
|
||||
|
||||
With that, it starts to look complete!
|
||||
|
||||

|
||||
|
||||
### but what about really, really, really, really, REALLY long headers?
|
||||
|
||||
What about line wrapping? It looks pretty bad right now.
|
||||
|
||||

|
||||
|
||||
(And for the record, this happens for middle children too, it's not just a last child issue.)
|
||||
|
||||
We can fix this with a hanging indent.
|
||||
|
||||
```css
|
||||
#toc li {
|
||||
text-indent: 1.22rem hanging; /* Again, I fiddled */
|
||||
}
|
||||
```
|
||||
|
||||

|
||||
|
||||
## summary
|
||||
|
||||
Here's the final collected CSS:
|
||||
|
||||
```css
|
||||
#toc ol,
|
||||
#toc li {
|
||||
margin-block: 0;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
#toc ol {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
#toc li {
|
||||
border-left: .095rem solid var(--color-pink);
|
||||
margin-left: 1.5rem;
|
||||
line-height: 1.15;
|
||||
text-indent: 1.22rem hanging;
|
||||
}
|
||||
|
||||
#toc li::before {
|
||||
content: '├─';
|
||||
color: var(--color-pink);
|
||||
position: relative;
|
||||
left: -.34rem;
|
||||
}
|
||||
|
||||
#toc li:last-child {
|
||||
border-left-color: transparent;
|
||||
}
|
||||
|
||||
#toc li:last-child::before {
|
||||
/* Technically, we could use this content for all of them, but doing the full
|
||||
bar for the non-last-childs keeps the border a *smidge* more consistent for
|
||||
different levels of magnification */
|
||||
content: '└─';
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,55 @@
|
||||
---
|
||||
title: intro to the fediverse
|
||||
layout: post-with-toc.njk
|
||||
image:
|
||||
src: 2026/madrone-bark.jpg
|
||||
alt: "Image unrelated to post. A close up shot of the curling, shedding bark of the madrone tree. The shedding bark is a beautiful rusty brown, and the tree underneath light green."
|
||||
tags:
|
||||
- reference
|
||||
---
|
||||
|
||||
this is a casual introduction to the fediverse (mastodon et al.) I wrote for a friend. I have shared it a few times, so I'm putting it here for ease of reference.
|
||||
|
||||
## general
|
||||
|
||||
the general style of fedi is microblogging (and sometimes more macroblogging). There's posts (image/video/audio and polls supported) and hashtags. Depending on your server, your post character limit will vary - some servers allow posts as long as you would ever want, but servers that haven't customized their post limit will be at 500 if I recall correctly. My favorite features of fedi are a) it is not corporate-run and b) there are **no ads!**
|
||||
|
||||
usernames are @user@server. Your server determines things like your post limit, what your UI looks like, who your mods are, and what rules you have to follow. Most of the UIs are pretty similar, so don't worry about that - just know that if you hop servers the interface may be a new color or have a few small changes. (You can also on mobile use an app - I don't recommend the "main" mastodon app. I use tusky on android and like it. Idk about apple, maybe ask for recs.)
|
||||
|
||||
## servers
|
||||
|
||||
all servers can, in theory, talk to each other. It's like email, using gmail doesn't mean you can only communicate with other gmail users. **However,** in practice, some servers have "defederated" from others, or have limitations in place that mean you'll review notifications from people on that server before accepting them. "Defederation" basically just means blocking - when two servers are connected, we say they are "federated" - this is where the "fed" part of "fediverse" comes from. (Mastodon, on the other hand, is just one of many apps that make up the fediverse.)
|
||||
|
||||
by and large, all (good) servers have defederated from the really trashy ones that host bigoted shit. But there's some borderline cases. For example, the "main" mastodon server run by the people who develop mastodon - mastodon.social - is huge and has signups totally open to anyone with no review. That means it is very vulnerable to waves of spam or rather unfriendly content. Because of this, some very solid servers consider limiting or blocking mastodon.social (or already have) despite its relevance as a huge presence in the fediverse.
|
||||
|
||||
because of the size, I would **never** recommend signing up with mastodon.social. Your moderation experience is likely to be **terrible**. Being on a smaller server allows you to have a more personal relationship with your mods!
|
||||
|
||||
speaking of your mods, they are usually moderating and paying for the server at no cost to the users, and it's good practice to chuck them some change every once and a while.
|
||||
|
||||
## moving between servers
|
||||
|
||||
you can migrate between servers, and your old account will point visitors over to your new account - but be aware that **your posts don't migrate with you**. This is very annoying for many people. The posts won't go away (they're still attached to the old account), but you won't be able to continue to edit them or see notifications for them. If you're really attached to a particular post, I recommend re-making it on the new account.
|
||||
|
||||
## other benefits and community norms
|
||||
|
||||
you can edit posts! You can pin posts to your profile! And if you're invested in digital privacy, you can set a deletion timeline for your posts (with granular settings like "posts with at least this many likes/boosts don't get deleted" and similar rules). You can also set your account up so you have to manually approve people before they can follow you (because of this, it's a good idea to fill in some basic profile info before following people - a lot of people who manually approve followers will deny requests from empty profiles).
|
||||
|
||||
image/video/audio content supports alt text and I highly recommend writing it, as many users won't boost posts that lack alt text. Depending on what software your server is running, you may or may not be able to set alt text for your profile/header photos - this is a newer feature that not all servers have yet, so I would recommend adding alt text for those pictures somewhere in your profile even if you are able to set it.
|
||||
|
||||
posts also include a content warning or subject field, and it's generally good practice to use it for sensitive topics - some people also just use it more like an actual subject field. Some common abbreviations for CWs are "mh/ph" - mental health/physical health - and "pol" - politics. Idk why people abbreviate their CWs when the character limits are often so big.
|
||||
|
||||
## choosing a server
|
||||
|
||||
choosing a server can be daunting. It's helpful to look at things like the rules and the size of the moderation team compared to the size of the userbase. The server name can be part of your choice! That's a tiny but fun benefit of unique servers. For example, I am at [flipping.rocks](https://flipping.rocks) and we love the outdoors, critters, etc. It's not as crafty of a server, but my photography and general love of nature fits in really well (and often you don't need to "fit" a server really - it's just nice to have a theme).
|
||||
|
||||
I generally recommend that people use their first 3-6 months looking at other servers and listening to the folks around them about whether they like their server. You may feel right at home in your starting server, or you may find something you like better, in which case you can learn how to migrate (happy to help).
|
||||
|
||||
## getting started
|
||||
|
||||
your feed will be oh so empty! There is no "algorithm" in the sense that we think of one in other corporate-run social medias. What you see is the posts/boosts of people you follow, as well as hashtags you follow, in reverse chronological order.
|
||||
|
||||
I recommend a few things to get started:
|
||||
|
||||
- make a post with the hashtag #introduction as well as #hashtags of your interests, and say hi! That lets people meet you and introduce themselves
|
||||
- check out the "local" feed for your server and see who is around on there to follow
|
||||
- use tools like [communitywiki.org/trunk](https://communitywiki.org/trunk) or [fedi.directory/](https://fedi.directory/) to find people based on topic
|
||||
@@ -0,0 +1,337 @@
|
||||
---
|
||||
title: sticker vendors
|
||||
layout: post-with-toc.njk
|
||||
image:
|
||||
src: 2026/fern-curl.jpg
|
||||
alt: Image unrelated to post. The tip of a fern curling in such a way as to make a complete circle with fronds spreading outwards.
|
||||
tags:
|
||||
- reference
|
||||
- sticker
|
||||
---
|
||||
|
||||
I made a spreadsheet of sticker vendors so you don't have to. And also ordered a bunch of sample packs, so you don't have to (and because I get very very into doing my research, and sample packs are very cheap).
|
||||
|
||||
I priced out **3"x3" holographic die-cut vinyl stickers** from US-based sticker vendors at three price points: 100 (or nearest above 100), 200 (or nearest above 200), and 500. Free shipping referenced *may* require a minimum to kick in - I noted it down as free if the minimum was below the price point for 100 stickers.
|
||||
|
||||
I did this work because my previous vendor, DieCutStickers, had notable print issues in the last batch I bought from them, and I decided to look for a new vendor. Because of this, they will not be listed.
|
||||
|
||||
Got a recommendation not in this writeup? Feel free to [let me know](/contact) and I'll price them out and add them.
|
||||
|
||||
All sample packs ordered have been summarized and photographed with the exception of Sticker Bunnies, which has not arrived yet.
|
||||
|
||||
I think I have to make a weird art piece now with all these samples.
|
||||
|
||||
## Exclusions
|
||||
|
||||
Three other vendors are mentioned but will not appear in summaries: Sticker Guy, Sticker Mule, and Sticky Brand.
|
||||
|
||||
- Sticker Guy looks **awesome** for simple stickers (1 or maybe 2 colors printed on solid color vinyl), but holographic stickers are listed as temporarily unavailable, so I couldn't get a price quote.
|
||||
- Sticker Mule's CEO is a vocal Trump supporter.
|
||||
- Sticky Brand has started using generative AI marketing (this is secondhand information as I don't use instagram). Also I had a [pretty bad customer service experience](#sticky-brand).
|
||||
|
||||
I cannot promise that other makers do not have issues similar to Sticker Mule or Sticky Brand; this is just what I surfaced in my research.
|
||||
|
||||
## Summaries
|
||||
|
||||
### Quality summary
|
||||
|
||||
Sticker Ninja - wow! Thick, sturdy vinyl that feels amazing. Plus loads of pretty finishes - I'm really noodling on what I could do on "Prism Party." They're not *the* cheapest, but for sets of 100 they're not awful, so they're probably my vendor of choice unless I'm buying more bulk (and 100 is my most common amount). I've ordered some new holo [hummingbirds](/hummingbird-become-ungovernable) from them as well as a design new to stickers, [big pidge](/big-pidges).
|
||||
|
||||
Also, they sent me a "queer joy is a revolution" sticker in the sample pack - that one actually went on my laptop. Also also, they seem like they have a great approach to work - they close their ordering on Sundays so they don't come in absolutely slammed on Mondays. I respect that a lot.
|
||||
|
||||
I was also impressed with StickerApp's variety of materials and product types, and their pricing is very competitive. If you want to save a little, they seem solid. Also, I just got the [FediZineFest](/fedizinefest-2026-2027) stickers through them, and they are *fast*.
|
||||
|
||||
### Pricing summary
|
||||
|
||||
Death by Stickers stands out as *by far* the cheapest option for ~100 or maybe less, and still fairly competitive for ~200, though bumped out of the top slot by StickerGiant (however, worth noting that I couldn't get Death by Stickers samples). If you want bulk, Brick City Printing comes out ahead - and they are union!
|
||||
|
||||
If you want really small lots, maybe try Sticker Bunnies - their pricing model is a flat per-sticker rate regardless of order size. Be aware, however, that they only take orders via email, so it may be a bit more of an involved process than most.
|
||||
|
||||
It is of course worth it with many vendors to join their email list and wait for deals. These are the standard prices and do not account for sales or discounts.
|
||||
|
||||
### Ease of peeling
|
||||
|
||||
Brick City Printing, StandOut Stickers, Sticker Junkie, StickerApp, and StickerGiant offer split backs.
|
||||
|
||||
Bend Print Co. offers split backs or peel tabs for an increased sticker price. Sticker Robot mentions split backs in their FAQ, but sticker options only support peel tabs, also for an increased price. Vinyl Disorder offers peel tabs for an increased price.
|
||||
|
||||
Sticker Ninja and StickerBros do not offer split backs.
|
||||
|
||||
Busy Beaver, Death by Stickers, and Sticker Bunnies do not specify.
|
||||
|
||||
## Pricing tables
|
||||
|
||||
### Price point 1: 100
|
||||
|
||||
Per 100 (unless noted otherwise).
|
||||
|
||||
| Vendor | Per sticker | Quantity |
|
||||
| --- | --- | --- |
|
||||
| Death by Stickers | $0.81 | |
|
||||
| Sticker Bunnies | $0.90 | |
|
||||
| StickerApp | $0.98 | |
|
||||
| Brick City Printing | $1.05 | |
|
||||
| Sticker Ninja | $1.06 | |
|
||||
| Busy Beaver | $1.07 | |
|
||||
| StandOut Stickers | $1.09 | |
|
||||
| StickerGiant | $1.10 | 125 |
|
||||
| StickerBros | $1.18 | |
|
||||
| Sticker Robot | $1.27 | |
|
||||
| Bend Print Co. | $1.45 | |
|
||||
| Vinyl Disorder | $1.61 | |
|
||||
| Sticker Junkie | n/a | No quantity ~100 offered |
|
||||
|
||||
### Price point 2: 200
|
||||
|
||||
Per 200 (unless noted otherwise).
|
||||
|
||||
| Vendor | Per sticker | Quantity |
|
||||
| --- | --- | --- |
|
||||
| StickerGiant | $0.73 | 250 |
|
||||
| StickerApp | $0.77 | |
|
||||
| Death by Stickers | $0.80 | |
|
||||
| StandOut Stickers | $0.80 | |
|
||||
| StickerBros | $0.84 | |
|
||||
| Sticker Robot | $0.85 | 250 |
|
||||
| Bend Print Co. | $0.88 | 250 |
|
||||
| Sticker Bunnies | $0.90 | |
|
||||
| Brick City Printing | $0.93 | |
|
||||
| Vinyl Disorder | $0.94 | 250 |
|
||||
| Sticker Ninja | $0.97 | |
|
||||
| Sticker Junkie | $1.07 | |
|
||||
| Busy Beaver | n/a | No quantity between 100 and 500 offered |
|
||||
|
||||
### Price point 3: 500
|
||||
|
||||
| Vendor | Per sticker |
|
||||
| --- | --- |
|
||||
| Brick City Printing | $0.49 |
|
||||
| StickerGiant | $0.54 |
|
||||
| StandOut Stickers | $0.55 |
|
||||
| StickerApp | $0.56 |
|
||||
| Sticker Ninja | $0.59 |
|
||||
| StickerBros | $0.60 |
|
||||
| Busy Beaver | $0.63 |
|
||||
| Bend Print Co. | $0.65 |
|
||||
| Sticker Robot | $0.65 |
|
||||
| Sticker Junkie | $0.72 |
|
||||
| Death by Stickers | $0.72 |
|
||||
| Vinyl Disorder | $0.81 |
|
||||
| Sticker Bunnies | $0.90 |
|
||||
|
||||
## Vendors
|
||||
|
||||
### Bend Print Co.
|
||||
|
||||
[Bend Print Co.](https://www.bendprintco.com/)
|
||||
|
||||
- 100 for $145.00 - $1.45/sticker
|
||||
- 250 for $220.00 - $0.88/sticker
|
||||
- 500 for $325.00 - $0.65/sticker
|
||||
- Free shipping
|
||||
- Split backs (or peel tabs) for additional cost
|
||||
|
||||
These are pretty thin. I'm really not sure if vinyl thickness correlates to quality, tbh, but they don't feel particularly sturdy. Still, I like the variety of fun vinyls.
|
||||
|
||||
(Sorry about the weird crop, I realized after I took this picture that I wanted a landscape picture not a portrait one. By then I had already peeled and stuck one of them.)
|
||||
|
||||

|
||||
|
||||
### Brick City Printing
|
||||
|
||||
[Brick City Printing](https://www.brickcityprinting.com/)
|
||||
|
||||
Union made!
|
||||
|
||||
- 100 for $105.00 - $1.05/sticker
|
||||
- 200 for $186.00 - $$0.93/sticker
|
||||
- 500 for $245.00 - $0.49/sticker
|
||||
- Free shipping
|
||||
- Split backs
|
||||
|
||||
They don't have a ton of options - seems like just white or holo vinyl - but their quality is good! The stickers feel decently sturdy.
|
||||
|
||||

|
||||
|
||||
### Busy Beaver
|
||||
|
||||
[Busy Beaver](https://www.busybeaver.net/)
|
||||
|
||||
- 100 for $107.00 - $1.07/sticker
|
||||
- No quantity between 100 and 500 offered
|
||||
- 500 for $315.00 - $0.63/sticker
|
||||
- Free shipping
|
||||
- Couldn't find information regarding split backs
|
||||
|
||||
Apparently you have to call Busy Beaver... on the phone... to get samples. Nah. Not worth.
|
||||
|
||||
### Death by Stickers
|
||||
|
||||
[Death by Stickers](https://deathbystickers.com/)
|
||||
|
||||
- 100 for $81.00 - $0.81/sticker
|
||||
- 200 for $160.00 - $0.80/sticker
|
||||
- 500 for $361.25 - $0.72/sticker
|
||||
- Free shipping for orders over $100.00
|
||||
- Couldn't find information regarding split backs
|
||||
|
||||
Death by Stickers offers sample packs, but they're sold out currently.
|
||||
|
||||
### StandOut Stickers
|
||||
|
||||
[StandOut Stickers](https://www.standoutstickers.com/)
|
||||
|
||||
- 100 for $109.00 - $1.09/sticker
|
||||
- 200 for $160.00 - $0.80/sticker
|
||||
- 500 for $272.50 - $0.55/sticker
|
||||
- $10.00 for template help - they looked to have pretty stringent art requirements
|
||||
- Free shipping
|
||||
- Split backs
|
||||
|
||||
StandOut Stickers doesn't offer samples as far as I could find.
|
||||
|
||||
### Sticker Bunnies
|
||||
|
||||
[Sticker Bunnies](https://www.stickerbunnies.com/)
|
||||
|
||||
Sticker Bunnies prices by sticker size and material - **not** quantity. 3"x3" holo die cut stickers are $0.90 per sticker - no bulk pricing. They also only accept orders via email (other than sample packs).
|
||||
|
||||
I am waiting on a Sticker Bunnies sample pack at current. I have no ETA yet.
|
||||
|
||||
### Sticker Guy
|
||||
|
||||
[Sticker Guy](https://stickerguy.com/)
|
||||
|
||||
I did not price out Sticker Guy as I could not find pricing information for holographic stickers. I did find one table that listed holo stickers as temporarily unavailable. Still, they look like a great option for simpler sticker needs.
|
||||
|
||||
### Sticker Junkie
|
||||
|
||||
[Sticker Junkie](https://www.stickerjunkie.com/)
|
||||
|
||||
- No quantity ~100 offered
|
||||
- 200 for $214.00 - $1.07/sticker
|
||||
- 500 for $360.00 - $0.72/sticker
|
||||
- Free shipping
|
||||
- Split backs
|
||||
|
||||
These feel pretty quality. They're not too flimsy, and the colors are vibrant. The split backs make them easy to peel.
|
||||
|
||||

|
||||
|
||||
### Sticker Mule
|
||||
|
||||
[CEO is a big Trump supporter](https://www.motherjones.com/politics/2026/09/anthony-constantino-donald-trump-sticker-mule-congress-stefanik/).
|
||||
|
||||
### Sticker Ninja
|
||||
|
||||
[Sticker Ninja](https://stickerninja.com/)
|
||||
|
||||
- 100 for $105.81 - $1.06/sticker
|
||||
- 200 for $193.33 - $0.97/sticker
|
||||
- 500 for $293.91 - $0.59/sticker
|
||||
- Free shipping
|
||||
- No split backs
|
||||
|
||||
Sticker Ninja has an *amazing* amount of variety when it comes to glitter, shimmer, mirror finish, and more - not just your standard holographic. I stuck one to my laptop, and while I can't vouch for longevity at this time, it feels *quality* - nice sturdy vinyl.
|
||||
|
||||

|
||||
|
||||
### Sticker Robot
|
||||
|
||||
[Sticker Robot](https://stickerobot.com/)
|
||||
|
||||
- 100 for $127.00 - $1.27/sticker
|
||||
- 250 for $212.00 - $0.85/sticker
|
||||
- 500 for $327.00 - $0.65/sticker
|
||||
- Free shipping
|
||||
- FAQ says split backs can be added, but I didn't see this option; peel tabs can be added for additional cost
|
||||
|
||||
Sticker Robot does both silkscreen and digital stickers. The silkscreen ones seem really nice, but the digital holo stickers are what I priced out and looked at. They seem decent, but nothing outstanding - I'm kinda guessing the silkscreen ones might be more standout. Silkscreen stickers offer printed backs as well. One of the samples is a "business card sticker" which is kinda neat.
|
||||
|
||||
In the picture, silkscreen stickers are on the left and digital on the right.
|
||||
|
||||

|
||||
|
||||
### StickerApp
|
||||
|
||||
[StickerApp](https://stickerapp.com)
|
||||
|
||||
- 100 for $98.00 - $0.98/sticker
|
||||
- 200 for $153.00 - $0.77/sticker
|
||||
- 500 for $280.00 - $0.56/sticker
|
||||
- Free shipping
|
||||
- Split backs
|
||||
|
||||
I'm pretty impressed by the variety here, though the stickers that aren't specifically their "heavy duty" material feel a smidge flimsy. Their special finishes are fun and varied. They also offer a business card sticker option - though I personally wouldn't want a business card that thin...
|
||||
|
||||
They have several sample packs - sticker materials (image 1, left; image 2), label materials (image 1, right), and product types (image 3).
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
### StickerBros
|
||||
|
||||
[StickerBros](https://www.stickerbros.com/)
|
||||
|
||||
- 100 for $118.00 - $1.18/sticker
|
||||
- 200 for $168.00 - $0.84/sticker
|
||||
- 500 for $300.00 - $0.60/sticker
|
||||
- Free shipping
|
||||
- No split backs
|
||||
|
||||
I am decently impressed with the quality of StickerBros, and particularly with their embossed and heavy duty embossed stickers. I haven't seen embossed stickers in any of the other sample packs! Despite not having split backs, I found them pretty easy to peel because there is an ever-so-slightly larger edge of backing paper surrounding the sticker than some others.
|
||||
|
||||
However, they were *really* slow to get my sample pack out. The shipping label was created more than 2 weeks before the package was delivered to USPS. Sample packs don't require any printing time, so I'm not sure why there was such a delay.
|
||||
|
||||

|
||||
|
||||
### StickerGiant
|
||||
|
||||
[StickerGiant](https://www.stickergiant.com/)
|
||||
|
||||
- 125 for $137.50 - $1.10/sticker
|
||||
- 250 for $182.50 - $0.73/sticker
|
||||
- 500 for $270.00 - $0.54/sticker
|
||||
- Free shipping
|
||||
- Split backs
|
||||
|
||||
StickerGiant has a very comprehensive and informative sample pack showcasing a wide variety of materials ranging from the holo die cuts I priced out to kraft paper labels. They also include color samples on their materials for reference.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
### Sticky Brand
|
||||
|
||||
Sticky Brand has apparently gone pretty hard in on generative AI marketing. I priced them out (and ordered some stickers due to a *deep* discount\*) before learning this, so I'm noting prices down for reference, but I don't recommend them.
|
||||
|
||||
- 100 for $118.13 - $1.18/sticker
|
||||
- 250 for $236.25 - $0.95/sticker
|
||||
- 500 for $393.75 - $0.79/sticker
|
||||
- USPS ground shipping rates or thereabouts
|
||||
- Couldn't find information regarding split backs
|
||||
|
||||
\*Or well, I *thought* I ordered stickers. Here's what happened:
|
||||
|
||||
I ordered a sample pack. I saw the discount on 100 holo stickers, realized I should have gone for that, and put in to cancel my sample pack, then ordered the 100 holo PLUS sample pack so I wasn't paying shipping twice. They then canceled my *second* order, of the 100 holo and sample pack, rather than my first. And now it's been 2 or 3 weeks and I still don't have a sample pack, because order 1 is seemingly stuck in printing. Their customer service *sucks*, too - I have been talking to them about this and they have gotten details wrong, failed to read the information I am giving them, and now have canceled my sample order without me asking for that. So, no samples, screw them, will not be putting in a new order.
|
||||
|
||||
### Vinyl Disorder
|
||||
|
||||
[Vinyl Disorder](https://vinyldisorder.com/)
|
||||
|
||||
- 100 for $161.22 - $1.61/sticker
|
||||
- 250 for $236.25 - $0.94/sticker
|
||||
- 500 for $406.35 - $0.81/sticker
|
||||
- $5.00-$6.00 for shipping orders under $250.00; free shipping over $250.00 cannot be combined with other discounts
|
||||
- Peel tabs for 25% extra
|
||||
|
||||
These are decent, but the price is a real deterrant. I think if you're getting more basic stickers their pricing *might* be more competitive - they are clear that holo and other premium materials are marked up 150% - but without doing those pricing tables I can't be sure. That said, I think their "cracked ice holo" is pretty cool.
|
||||
|
||||

|
||||
|
||||
## Resources
|
||||
|
||||
- [Some Free Sticker Designs and Where to Print Them](https://docpop.org/2025/10/some-free-sticker-designs-and-where-to-print-them/)
|
||||
@@ -0,0 +1,13 @@
|
||||
---
|
||||
title: plaid dishtowels
|
||||
image:
|
||||
src: 2026/plaid-dishtowels.jpg
|
||||
alt: "A two image collage. Image one shows one navy, beige, and yellow towel in a simple plaid laid out on a table with two more folded on top. Image two is a close up of the plaid."
|
||||
tags:
|
||||
- gallery
|
||||
- weaving
|
||||
---
|
||||
|
||||
Yarn: [Circulo Anne Weaving Yarn](https://woolery.com/products/circulo-anne-weaving-yarn).
|
||||
|
||||
3 towels. Woven area roughly 12"x24". Hemstitched.
|
||||