Files
leecat.art-site/sticker-vendors/index.html
T

2617 lines
65 KiB
HTML
Raw Normal View History

2026-10-21 22:24:54 +00:00
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<title>sticker vendors | hello hello</title>
<meta name="description" content="Lee Cattarin... on the internet!">
<link rel="alternate" href="/feed.xml" type="application/atom+xml" title="hello hello">
<meta property="og:title" content="sticker vendors | hello hello">
<meta property="og:type" content="website">
<meta property="og:description" content="Lee Cattarin... on the internet!">
<meta property="og:site_name" content="hello hello">
<meta property="og:url" content="https://leecat.art/sticker-vendors/">
<meta property="og:image" content="https://leecat.art/img/fern-curl.jpg">
<meta property="og:image:alt" content="Image unrelated to post. The tip of a fern curling in such a way as to make a complete circle with fronds spreading outwards.">
<meta name="generator" content="Eleventy v3.1.6">
<meta itemprop="ai-content-declaration:version" content="1.0.0">
<meta itemprop="ai-content-declaration:level" content="none">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="">
<link href="https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible+Mono:ital,wght@0,200..800;1,200..800&family=Atkinson+Hyperlegible+Next:ital,wght@0,200..800;1,200..800&display=swap" rel="stylesheet">
<script src="https://kit.fontawesome.com/884dded219.js" crossorigin="anonymous"></script>
<style>#toc {
float: right;
margin: 1rem 0 1.5rem 1.5rem;
width: fit-content;
max-width: 55%;
}
@media (max-width: 900px) {
#toc {
float: unset;
margin-top: 2rem;
margin-left: .5rem;
width: calc(100% - .5rem);
max-width: unset;
}
}
#toc details {
border: thick solid var(--color-pink);
border-radius: 1rem;
margin-top: 1rem;
background-color: var(--color-bg);
}
#toc summary {
position: relative;
top: -1.5rem;
left: -.75rem;
width: fit-content;
background: var(--color-bg);
border-radius: .5rem;
cursor: pointer;
padding-inline-end: .25rem;
}
#toc summary:focus-visible {
outline: .15rem solid var(--color-teal);
}
#toc summary::marker {
font-size: 2.35rem;
}
#toc h2 {
margin-top: 0;
display: inline;
line-height: normal;
}
#toc nav {
position: relative;
top: -1.25rem;
}
/* `tree` style toc */
#toc nav > ol {
margin-inline: 1rem;
}
#toc ol {
margin: 0;
}
#toc li {
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 {
block-size: .5lh;
border-block-end: .1rem solid var(--color-pink);
content: "";
}
#toc li:not(:last-child)::after {
block-size: 100%;
content: "";
}
/* underlines are unnecessary in this context */
#toc a {
text-decoration: none;
color: var(--color-blue);
font-weight: bold;
}
#toc a:focus-visible {
outline-color: var(--color-pink);
}
.post-metadata {
display: flex;
flex-flow: row wrap;
justify-content: space-between;
align-items: baseline;
margin: 1.5rem 0 .5rem;
}
.post-metadata p {
font-size: .9rem;
margin: 0;
}
.post-tags {
display: flex;
flex-flow: row wrap;
gap: .5rem;
list-style: none;
margin: 0;
margin-left: auto;
}
.post-tags li {
margin: 0;
}
.post-tags li a {
text-decoration: none;
color: var(--color-teal);
padding: 0 .5rem;
border-radius: 1rem;
box-shadow: .15rem .15rem var(--color-shadow);
border: .08rem solid var(--color-teal);
line-height: 2;
/* Click animation handling */
position: relative;
top: 0;
left: 0;
transition: top .1s ease-in, left .1s ease-in;
}
.post-tags li a:focus-visible {
outline: none;
background-color: var(--color-teal);
color: var(--color-bg);
}
@media (any-hover: hover) {
.post-tags li a:hover {
outline: none;
background-color: var(--color-teal);
color: var(--color-bg);
}
}
@media (forced-colors: active) {
.post-tags li a:focus-visible {
outline-offset: .08rem;
outline: .08rem solid;
}
@media (any-hover: hover) {
.post-tags li a:hover {
outline-offset: .08rem;
outline: .08rem solid;
}
}
}
/* Click animation */
.post-tags li a:active {
top: .1rem;
left: .1rem;
box-shadow: .05rem .05rem var(--color-shadow);
}
#postlist,
#taglist {
list-style: none;
}
#postlist, .post,
#taglist, .tag {
margin: 0;
}
/* Odd-numbered posts & tag layout/coloration */
.post:nth-child(odd) .postlink,
.tag:nth-child(odd) .taglink {
grid-template-areas:
'img h2'
'img info'
'img .';
grid-template-columns: 45% auto;;
--color-primary: var(--color-teal);
--color-accent: var(--color-pink);
}
/* Even-numbered posts & tags layout/coloration */
.post:nth-child(even) .postlink,
.tag:nth-child(even) .taglink {
grid-template-areas:
'h2 img'
'info img'
'. img';
grid-template-columns: auto 45%;
--color-primary: var(--color-pink);
--color-accent: var(--color-teal);
}
/* Layout for all posts on mobile */
@media (max-width: 650px) {
.post:nth-child(n) .postlink,
.tag:nth-child(n) .taglink {
grid-template-areas:
'img'
'h2'
'info';
grid-template-columns: auto;
}
}
/* Link */
.postlink,
.taglink {
display: grid;
border: .25rem solid var(--color-primary);
border-radius: 1.25rem;
box-shadow: .35rem .35rem var(--color-shadow);
margin: 2rem 0;
text-decoration: none;
/* Click animation handling */
position: relative;
top: 0;
left: 0;
transition: top .05s ease-in, left .05s ease-in;
}
.postlink:focus-visible,
.taglink:focus-visible {
background-color: var(--color-primary);
outline: none;
}
@media (any-hover: hover) {
.postlink:hover,
.taglink:hover {
background-color: var(--color-primary);
}
}
/* Forced colors */
@media (forced-colors: active) {
.postlink:focus-visible,
.taglink:focus-visible {
outline-offset: .25rem;
outline: .25rem solid;
}
@media (any-hover: hover) {
.postlink:hover,
.taglink:hover {
outline-offset: .25rem;
outline: .25rem solid;
}
}
}
/* Click animation */
.postlink:active,
.taglink:active {
top: .2rem;
left: .2rem;
box-shadow: .15rem .15rem var(--color-shadow);
}
/* Post & tag elements */
.post h2, .post img,
.post ul, .post li,
.tag h2, .tag p,
.tag img {
margin: 0;
}
.post h2,
.tag h2 {
grid-area: h2;
padding: .25rem .5rem;
text-transform: uppercase;
font-family: var(--font-family);
font-size: 1.5rem;
color: var(--color-primary);
border-radius: 1rem 1rem 0 0;
border-bottom: .25rem solid var(--color-accent);
}
.post:nth-child(even) h2,
.tag:nth-child(even) h2 {
text-align: right;
}
.postlink:focus-visible h2,
.taglink:focus-visible h2 {
color: var(--color-bg);
border-color: var(--color-bg);
}
@media (any-hover: hover) {
.postlink:hover h2,
.taglink:hover h2 {
color: var(--color-bg);
border-color: var(--color-bg);
}
}
/* Images */
.post img,
.tag-imgs {
grid-area: img;
}
.blur {
filter: blur(.75rem);
clip-path: inset(0 round 1rem);
}
.tag-imgs {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: .15rem;
}
.tag-imgs img {
aspect-ratio: 3 / 2;
object-fit: cover;
}
.missing-image {
width: 100%;
aspect-ratio: 3 / 2;
background-color: var(--color-bg-alt);
border-radius: 1rem;
}
.taglink:focus-visible .missing-image {
opacity: .7;
}
@media (any-hover: hover) {
.taglink:hover .missing-image {
opacity: .7;
}
}
/* Post tags */
.postlist-tags {
grid-area: info;
list-style: none;
display: flex;
flex-flow: row wrap;
gap: .5rem;
padding: .5rem;
}
.post:nth-child(odd) .postlist-tags {
justify-content: flex-end;
}
.postlist-tags li,
.tagcount {
background-color: var(--color-primary);
color: var(--color-bg);
padding: 0 .5rem;
border-radius: 1rem;
}
.postlink:focus-visible .postlist-tags li,
.taglink:focus-visible .tagcount {
background-color: var(--color-bg);
color: var(--color-primary);
}
@media (any-hover: hover) {
.postlink:hover .postlist-tags li,
.taglink:hover .tagcount {
background-color: var(--color-bg);
color: var(--color-primary);
}
}
/* Tag count */
.tag p {
grid-area: info;
padding: .5rem;
}
.tag:nth-child(odd) p {
text-align: right;
}
img[tabindex="0"] {
cursor: pointer;
}
img[tabindex="0"]:focus-visible {
outline: .15rem solid var(--color-teal);
}
dialog {
margin: auto;
flex-flow: column;
background: transparent;
border: none;
position: absolute;
}
dialog[open] {
display: flex;
}
dialog::backdrop {
background-color: rgba(from var(--color-bg) r g b / .8);
backdrop-filter: blur(4px);
}
body:has(dialog[open]) {
overflow: hidden;
}
.close-dialog {
background-color: rgba(from var(--color-teal) r g b / .35);
font-size: 1.5rem;
padding: 0 .5rem .15rem;
border-radius: 1rem;
color: var(--color-teal);
box-shadow: .15rem .15rem var(--color-shadow);
border: .08rem solid var(--color-teal);
align-self: flex-end;
justify-self: flex-start;
margin: 0 .1rem;
/* Click animation handling */
position: relative;
top: 1rem;
left: -.15rem;
transition: top .1s ease-in, left .1s ease-in;
}
.close-dialog:focus-visible {
outline: none;
background-color: var(--color-teal);
color: var(--color-bg);
}
@media (any-hover: hover) {
.close-dialog:hover {
outline: none;
background-color: var(--color-teal);
color: var(--color-bg);
}
}
@media (forced-colors: active) {
.close-dialog:focus-visible {
outline-offset: .08rem;
outline: .08rem solid;
}
@media (any-hover: hover) {
.close-dialog:hover {
outline-offset: .08rem;
outline: .08rem solid;
}
}
}
/* Click animation */
.close-dialog:active {
top: 1.1rem;
left: -.05rem;
box-shadow: .05rem .05rem var(--color-shadow);
}
.modal-img {
max-height: calc(100vh - 2rem);
object-fit: contain;
width: auto;
max-width: 90%;
margin: 0 auto;
}
@font-face {
font-family: "Peritel";
src:
url("/fonts/Peritel/Peritel-Regular.woff2") format("woff2"),
url("/fonts/Peritel/Peritel-Regular.otf") format("opentype");
}
:root {
color-scheme: light dark;
--font-family: 'Atkinson Hyperlegible Next', sans-serif;
/* if you change the header font, go to post-toc.css and fuck about with the width
of the table of contents */
--font-family-headers: 'Peritel', 'Atkinson Hyperlegible Next', sans-serif;
--font-family-code: 'Atkinson Hyperlegible Mono', monospace;
--color-dark: #2e303e;
--color-dark-alt: #3c3f52;
--color-light: #ebeeef;
--color-light-alt: #dbe1e3;
--color-teal-dark: #18737b;
--color-teal-light: #25b0bc;
--color-pink-dark: #94195d;
--color-pink-light: #ee9fcb;
--color-shadow: rgba(2, 10, 40, .25);
/* Used for syntax highlighting */
--color-red-light: #f195aa;
--color-orange-light: #fab795;
--color-yellow-light: #fbe6bc;
--color-green-light: #29d398;
--color-blue-light: #26bbd9;
--color-purple-light: #ddaeea;
--color-grey-light: #b9c3c6;
--color-red-dark: #991433;
--color-orange-dark: #883206;
--color-yellow-dark: #6a4906;
--color-green-dark: #125940;
--color-blue-dark: #125663;
--color-purple-dark: #722999;
--color-grey-dark: #4a4b64;
--color-text: light-dark(var(--color-dark), var(--color-light));
--color-bg: light-dark(var(--color-light), var(--color-dark));
--color-text-alt: light-dark(var(--color-dark-alt), var(--color-light-alt));
--color-bg-alt: light-dark(var(--color-light-alt), var(--color-dark-alt));
--color-teal: light-dark(var(--color-teal-dark), var(--color-teal-light));
--color-pink: light-dark(var(--color-pink-dark), var(--color-pink-light));
--color-red: light-dark(var(--color-red-dark), var(--color-red-light));
--color-orange: light-dark(var(--color-orange-dark), var(--color-orange-light));
--color-yellow: light-dark(var(--color-yellow-dark), var(--color-yellow-light));
--color-green: light-dark(var(--color-green-dark), var(--color-green-light));
--color-blue: light-dark(var(--color-blue-dark), var(--color-blue-light));
--color-purple: light-dark(var(--color-purple-dark), var(--color-purple-light));
--color-grey: light-dark(var(--color-grey-dark), var(--color-grey-light));
}
:root:has(#theme-light:checked) {
color-scheme: light;
}
:root:has(#theme-dark:checked) {
color-scheme: dark;
}
/* Base */
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
font-family: var(--font-family);
color: var(--color-text);
background-color: var(--color-bg);
}
main {
width: 60vw;
max-width: 1000px;
margin: 0 auto;
}
@media (max-width: 1100px) {
main {
width: 75vw;
}
}
@media (max-width: 650px) {
main {
width: 92vw;
}
}
/* Headers */
h1, h2, h3, h4, h5, h6 {
line-height: 1.25;
color: var(--color-teal);
font-family: var(--font-family-headers);
letter-spacing: 0.1rem;
}
h1 {
margin-top: 3rem;
font-size: 3.7rem;
text-align: center;
}
h2 {
margin-top: 2rem;
font-size: 2.35rem;
}
h3 {
margin-top: 1.5rem;
font-size: 1.7rem;
}
@media (max-width: 650px) {
h1 {
margin-top: 1.5rem;
font-size: 2.25rem;
}
h2 { font-size: 1.8rem; }
h3 { font-size: 1.4rem; }
}
h4, h5, h6 {
margin-top: 1rem;
font-size: 1.25rem;
}
/* Images */
img {
display: block;
max-width: 100%;
height: auto;
border-radius: 1rem;
margin: 0 auto;
}
/* Paragraphs */
p {
margin: 1.25rem 0;
line-height: 1.4;
}
strong,
b {
font-weight: 900;
}
/* Links */
a {
color: var(--color-text);
border-radius: .25rem;
text-decoration: underline;
text-decoration-style: solid;
text-decoration-thickness: .2em;
text-decoration-color: var(--color-teal);
transition: text-decoration-thickness .5s;
}
a:focus-visible {
text-decoration: none;
outline: .15rem solid var(--color-teal);
}
@media (any-hover: hover) {
a:hover {
text-decoration-thickness: .4em;
}
}
a:active {
text-decoration-thickness: .4em;
}
/* Heading anchors */
a.ha,
span.ha-placeholder {
color: var(--color-pink);
font-size: .8em;
vertical-align: .1em;
}
span.ha-placeholder {
opacity: .55;
}
/* Lists */
::marker {
color: var(--color-pink);
}
ul, ol, dl, li {
margin-left: 1rem;
}
@media (max-width: 650px) {
ul, ol, dl {
margin-left: 0;
}
}
li {
line-height: 1.4;
margin-top: .65rem;
margin-bottom: .65rem;
}
li ul, li ol {
margin: .5rem 0;
margin-left: 1rem;
}
@media (max-width: 650px) {
li ul, li ol {
margin-left: 0;
}
}
dt {
font-weight: 900;
margin-top: .5rem;
}
dd {
margin-left: 2rem;
margin-bottom: .75rem;
}
/* Blockquotes */
blockquote {
margin: .5rem 0;
padding: 0 1rem;
border-radius: .5rem;
line-height: 1.25;
border-left: .5rem solid var(--color-pink);
}
blockquote,
blockquote p,
blockquote ol,
blockquote ul {
background-color: var(--color-bg-alt);
padding: .5rem;
}
blockquote p {
margin: 0;
}
/* Tables */
table {
width: 100%;
border-spacing: 0; /* border collapse doesn't play nice with radii */
border-radius: .3rem;
border: thin solid var(--color-pink);
margin: 1.25rem 0;
}
th {
color: var(--color-bg);
background-color: var(--color-pink);
}
th code {
color: var(--color-text); /* Yes, I actually do this somewhere */
}
th, td {
padding: .5rem;
text-align: left;
}
tr:nth-child(even) { background-color: var(--color-bg-alt); }
th:not(:first-child) { border-left: thin solid var(--color-bg); }
th:first-child { border-top-left-radius: .25rem; }
th:last-child { border-top-right-radius: .25rem; }
td:not(:first-child) { border-left: thin solid var(--color-pink); }
/* Times */
time {
color: var(--color-grey);
}
/* Horizontal rules */
hr {
border: .25rem solid var(--color-pink);
margin: 2rem 0;
}
/* Used on home, reference, gallery pages */
.centered {
text-align: center;
}
/* Currently only used for resume, but it's generalizable */
.upper {
text-transform: uppercase;
}
/* Header */
header {
background-color: var(--color-bg);
padding: .75rem 0;
border-bottom: thick solid var(--color-teal);
box-shadow: 0 .25rem .15rem var(--color-shadow);
display: grid;
grid-template-columns: auto;
}
/* Header links, pagination links */
header a,
.pagination a,
.webring ul a {
border-radius: 1rem;
border: .125rem solid var(--color-pink);
color: var(--color-pink);
text-decoration: none;
padding: 0 .25rem;
box-shadow: .15rem .15rem var(--color-shadow);
font-size: 1.2rem;
/* Click animation handling */
position: relative;
top: 0;
left: 0;
transition: top .05s ease-in, left .05s ease-in;
}
header a,
.pagination .older a,
.webring .prev a,
.webring .rand a {
padding-right: .35rem;
}
.pagination .newer a,
.webring .next a,
.webring .rand a {
padding-left: .35rem;
}
header a:focus-visible,
.pagination a:focus-visible,
.webring ul a:focus-visible {
color: var(--color-bg);
border-color: var(--color-pink);
background-color: var(--color-pink);
outline: none;
}
@media (any-hover: hover) {
header a:hover,
.pagination a:hover,
.webring ul a:hover {
color: var(--color-bg);
border-color: var(--color-pink);
background-color: var(--color-pink);
}
}
@media (forced-colors: active) {
header a:focus-visible,
.pagination a:focus-visible,
.webring ul a:focus-visible {
outline-offset: .125rem;
outline: .125rem solid;
}
@media (any-hover: hover) {
header a:hover,
.pagination a:hover,
.webring ul a:hover {
outline-offset: .125rem;
outline: .125rem solid;
}
}
}
/* Click animation */
header a:active,
.pagination a:active,
.webring ul a:active {
top: .1rem;
left: .1rem;
box-shadow: .05rem .05rem var(--color-shadow);
}
/* Current page */
header a[aria-current="page"] {
border-color: var(--color-teal);
color: var(--color-teal);
}
header a[aria-current="page"]:focus-visible {
color: var(--color-bg);
border-color: var(--color-teal);
background-color: var(--color-teal);
}
@media (any-hover: hover) {
header a[aria-current="page"]:hover {
color: var(--color-bg);
background-color: var(--color-teal);
border-color: var(--color-teal);
}
}
/* Header link icons, pagination icons */
header i,
.pagination i,
.webring ul i {
color: var(--color-teal);
}
header i,
.pagination .older i,
.webring .prev i,
.webring .rand i:nth-child(1) {
padding-left: .25rem;
}
.pagination .newer i,
.webring .next i,
.webring .rand i:nth-child(2) {
padding-right: .25rem;
}
header a[aria-current="page"] i {
color: var(--color-pink);
}
header a:focus-visible i,
a[aria-current="page"] a:focus-visible i,
.pagination a:focus-visible i,
.webring ul a:focus-visible i {
color: var(--color-bg);
}
@media (any-hover: hover) {
header a:hover i,
header a[aria-current="page"]:hover i,
.pagination a:hover i,
.webring ul a:hover i {
color: var(--color-bg);
}
}
/* Skip link */
#skip {
left: -999px;
position: absolute;
top: auto;
width: 1px;
height: 1px;
overflow: hidden;
z-index: -99;
}
#skip:focus-visible {
display: inline-block;
left: auto;
top: auto;
width: auto;
height: auto;
overflow: auto;
margin: -.125rem 10%;
z-index: 999;
}
/* Nav */
header ul {
display: flex;
list-style: none;
gap: 1rem;
justify-content: center;
}
header ul,
header li {
margin: 0;
}
@media (max-width: 650px) {
.menu-text {
display: none; /* Icons only on small screens */
}
header a {
padding: .15rem .5rem;
}
header i {
padding: 0;
}
}
/* Footer */
footer {
padding: 1rem 0;
font-size: .9rem;
border-top: thick solid var(--color-pink);
margin-top: 2rem;
}
footer ul {
display: flex;
list-style: none;
gap: .5rem;
justify-content: center;
margin: 0;
}
footer li {
margin: 0;
}
footer li:nth-child(2)::before,
footer li:nth-child(2)::after {
content: " ● " / "";
color: var(--color-teal);
}
@media (max-width: 650px) {
footer ul {
flex-flow: column;
text-align: center;
}
footer li:nth-child(2)::before,
footer li:nth-child(2)::after {
content: none;
}
}
footer a {
text-decoration-color: var(--color-pink);
}
footer a:focus-visible {
outline-color: var(--color-pink);
}
/* color picker */
#theme {
display: flex;
justify-content: center;
margin: .5rem auto 0;
padding: 0 .75rem .5rem;
width: fit-content;
border: .125rem solid var(--color-teal);
border-radius: 2rem;
}
#theme legend {
margin: 0 auto;
color: var(--color-teal);
}
footer label {
cursor: pointer;
border: .125rem solid var(--color-pink);
padding: 0 .25rem;
color: var(--color-pink);
background-color: var(--color-bg); /* this stops the box shadows from showing through */
box-shadow: .15em .15em var(--color-shadow);
/* Click animation handling */
position: relative;
top: 0;
left: 0;
transition: top .05s ease-in, left .05s ease-in;
}
footer input:checked + label {
color: var(--color-blue);
border-color: var(--color-blue);
}
footer label i {
color: var(--color-teal);
}
footer input:checked + label i {
color: var(--color-pink);
}
@media (any-hover: hover) {
footer label:hover,
footer input:checked + label:hover,
footer label:hover i,
footer input:checked + label:hover i {
color: var(--color-bg);
}
footer label:hover {
background-color: var(--color-pink);
}
footer input:checked + label:hover {
background-color: var(--color-teal);
}
}
footer input:focus-visible + label,
footer input:focus-visible + label i {
color: var(--color-bg);
background-color: var(--color-pink);
border-color: var(--color-pink);
}
footer input:checked:focus-visible + label,
footer input:checked:focus-visible + label i {
color: var(--color-bg);
background-color: var(--color-teal);
border-color: var(--color-teal);
}
footer label:active {
top: .09em;
left: .09em;
box-shadow: .05em .05em var(--color-shadow);
}
label.theme-light {
border-top-left-radius: 1rem;
border-bottom-left-radius: 1rem;
border-right: none;
padding-left: .35rem;
}
label.theme-auto {
}
label.theme-dark {
border-top-right-radius: 1rem;
border-bottom-right-radius: 1rem;
border-left: none;
padding-right: .35rem;
}
footer input {
/* To allow screen reader to still access these. */
/* From https://lyra.horse/blog/2025/08/you-dont-need-js/ */
opacity: 0;
position: absolute;
pointer-events: none;
}
/* Pagination */
.pagination,
.pagination li {
margin: 0;
}
.pagination {
display: grid;
grid-template-columns: repeat(2, 1fr);
grid-template-areas: "older newer";
list-style: none;
margin-top: 3rem;
}
@media (max-width: 650px) {
.post-pagination {
grid-template-columns: 1fr;
grid-template-areas:
"older"
"newer";
gap: .75rem;
}
}
.pagination .older {
grid-area: older;
}
.pagination .newer {
grid-area: newer;
text-align: right;
}
/* webring navigation */
.webring {
margin-bottom: 3rem;
}
.webring ul {
display: flex;
flex-flow: row wrap;
list-style: none;
justify-content: center;
gap: .5rem;
}
.webring ul,
.webring li {
margin-left: 0;
}
/* Handle color schemes */
:root:has(#theme-light:checked) .dark {
display: none;
}
:root:has(#theme-dark:checked) .light {
display: none;
}
@media (prefers-color-scheme: light) {
:root:not(:has(#theme-dark:checked)) .dark {
display: none;
}
}
@media (prefers-color-scheme: dark) {
:root:not(:has(#theme-light:checked)) .light {
display: none;
}
}
.searchbox {
margin: 1rem auto 0;
}
pagefind-searchbox {
/* Shadows */
--pf-scroll-shadow: var(--color-shadow) !important;
--pf-shadow-sm: .15rem .15rem 0 var(--color-shadow) !important;
--pf-shadow-md: .25rem .25rem 0 var(--color-shadow) !important;
--pf-shadow-lg: 1rem 1rem 0 var(--color-shadow) !important;
/* Typography */
--pf-font: var(--font-family) !important;
/* Border */
--pf-border-radius: 1.5rem !important;
/* Focus */
--pf-outline-width: .125rem !important;
--pf-outline-offset: 0 !important;
/* Width */
--pf-searchbox-max-width: min(550px, 92vw) !important;
}
.light pagefind-searchbox {
--pf-text: var(--color-dark) !important;
--pf-text-secondary: var(--color-dark-alt) !important;
--pf-text-muted: var(--color-dark-alt) !important;
--pf-background: var(--color-light-alt) !important;
--pf-border: var(--color-pink-dark) !important;
--pf-border-focus: var(--color-pink-dark) !important;
--pf-skeleton: var(--color-light) !important;
--pf-skeleton-shine: var(--color-dark) !important;
--pf-hover: var(--color-light) !important;
--pf-mark: var(--color-teal-dark) !important;
--pf-outline-focus: var(--color-teal-dark) !important;
/* Error */
--pf-error-bg: var(--color-light-alt) !important;
--pf-error-border: var(--color-red-dark) !important;
--pf-error-text: var(--color-red-dark) !important;
--pf-error-text-secondary: var(--color-red-dark) !important;
}
.dark pagefind-searchbox {
--pf-text: var(--color-light) !important;
--pf-text-secondary: var(--color-light-alt) !important;
--pf-text-muted: var(--color-light-alt) !important;
--pf-background: var(--color-dark-alt) !important;
--pf-border: var(--color-pink-light) !important;
--pf-border-focus: var(--color-pink-light) !important;
--pf-skeleton: var(--color-dark) !important;
--pf-skeleton-shine: var(--color-dark) !important;
--pf-hover: var(--color-dark) !important;
--pf-mark: var(--color-teal-light) !important;
--pf-outline-focus: var(--color-teal-light) !important;
/* Error */
--pf-error-bg: var(--color-dark-alt) !important;
--pf-error-border: var(--color-red-light) !important;
--pf-error-text: var(--color-red-light) !important;
--pf-error-text-secondary: var(--color-red-light) !important;
}
pagefind-searchbox input {
border-width: .125rem !important;
}
pagefind-searchbox input:not(:focus-visible) {
box-shadow: var(--pf-shadow-md) !important;
}
@media (max-width: 650px) {
.pf-trigger-shortcut {
display: none !important;
}
}
.pf-searchbox-dropdown,
.pf-searchbox-footer {
border-width: .125rem !important;
}
.pf-error {
margin-top: .5rem !important;
}
/* Adapted from PrismJS 1.30.0 Tomorrow Night theme
https://prismjs.com/download
*/
code,
pre,
code[class*=language-],
pre[class*=language-] {
font-family: var(--font-family-code);
background-color: var(--color-bg-alt);
font-size: .9em;
text-shadow: 0 1px var(--color-shadow);
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
pre,
pre[class*=language-] {
margin: 1rem 0;
padding: 1rem;
line-height: 1.5;
white-space: pre-wrap;
word-break: break-word;
overflow-wrap: break-word;
border-radius: .5rem;
overflow: auto;
}
:not(pre)>code,
:not(pre)>code[class*=language-] {
padding: .2rem;
border-radius: .25rem;
white-space: normal;
}
/* Selected text */
code ::-moz-selection,
code::-moz-selection,
pre ::-moz-selection,
pre::-moz-selection,
code[class*=language-] ::-moz-selection,
code[class*=language-]::-moz-selection,
pre[class*=language-] ::-moz-selection,
pre[class*=language-]::-moz-selection,
code ::selection,
code::selection,
pre ::selection,
pre::selection,
code[class*=language-] ::selection,
code[class*=language-]::selection,
pre[class*=language-] ::selection,
pre[class*=language-]::selection {
text-shadow: none;
background-color: var(--color-bg);
}
/* Syntax highlighting */
.token.namespace {
opacity: .7;
}
.token.bold,
.token.important {
font-weight:700
}
.token.italic {
font-style:italic
}
.token.block-comment,
.token.cdata,
.token.comment,
.token.doctype,
.token.prolog,
.token.punctuation {
color: var(--color-grey);
}
.token.attr-name,
.token.deleted,
.token.namespace,
.token.tag {
color: var(--color-red);
}
.token.boolean,
.token.function,
.token.number {
color: var(--color-orange);
}
.token.class-name,
.token.constant,
.token.property,
.token.symbol {
color: var(--color-yellow);
}
.token.attr-value,
.token.char,
.token.regex,
.token.string,
.token.variable,
.token.inserted {
color: var(--color-green);
}
.token.entity,
.token.operator,
.token.url,
.token.function-name {
color:var(--color-blue);
}
.token.atrule,
.token.builtin,
.token.important,
.token.keyword,
.token.selector {
color: var(--color-purple);
}
@media print {
/* Nav elements */
header,
footer,
nav {
display: none !important;
}
/* Base */
body {
background-color: #fff;
color: #000;
}
main {
width: 95vw;
}
h1,h2,h3,h4,h5,h6 {
color: #000;
}
/* Links */
/* Hover is not really necessary, but it's annoying when testing otherwise */
a,
a:hover {
text-decoration-style: dotted;
text-decoration-thickness: .1rem;
text-decoration-color: #000;
}
a::after{
content: " (" attr(href) ")";
}
/* Code */
code,
pre,
code[class*=language-],
pre[class*=language-] {
text-shadow: none;
background-color: var(--color-light);
color: #000 !important;
}
.token.namespace {
opacity: 1;
}
.token.block-comment,
.token.cdata,
.token.comment,
.token.doctype,
.token.prolog,
.token.punctuation,
.token.attr-name,
.token.deleted,
.token.namespace,
.token.tag,
.token.boolean,
.token.function,
.token.number,
.token.class-name,
.token.constant,
.token.property,
.token.symbol,
.token.attr-value,
.token.char,
.token.regex,
.token.string,
.token.variable,
.token.inserted,
.token.entity,
.token.operator,
.token.url,
.token.function-name,
.token.atrule,
.token.builtin,
.token.important,
.token.keyword,
.token.selector {
color: #000;
}
}</style>
<script type="module">// Thank you to https://github.com/daviddarnes/heading-anchors
// Thank you to https://amberwilson.co.uk/blog/are-your-anchor-links-accessible/
let globalInstanceIndex = 0;
class HeadingAnchors extends HTMLElement {
static register(tagName = "heading-anchors", registry = window.customElements) {
if(registry && !registry.get(tagName)) {
registry.define(tagName, this);
}
}
static attributes = {
exclude: "data-ha-exclude",
prefix: "prefix",
content: "content",
}
static classes = {
anchor: "ha",
placeholder: "ha-placeholder",
srOnly: "ha-visualhide",
}
static defaultSelector = "h2,h3,h4,h5,h6";
static css = `
.${HeadingAnchors.classes.srOnly} {
clip: rect(0 0 0 0);
height: 1px;
overflow: hidden;
position: absolute;
width: 1px;
}
.${HeadingAnchors.classes.anchor} {
position: absolute;
left: var(--ha_offsetx);
top: var(--ha_offsety);
text-decoration: none;
opacity: 0;
}
.${HeadingAnchors.classes.placeholder} {
opacity: .3;
}
.${HeadingAnchors.classes.anchor}:is(:focus-within, :hover) {
opacity: 1;
}
.${HeadingAnchors.classes.anchor},
.${HeadingAnchors.classes.placeholder} {
display: inline-block;
padding: 0 .25em;
/* Disable selection of visually hidden label */
-webkit-user-select: none;
user-select: none;
}
@supports (anchor-name: none) {
.${HeadingAnchors.classes.anchor} {
position: absolute;
left: anchor(left);
top: anchor(top);
}
}`;
get supports() {
return "replaceSync" in CSSStyleSheet.prototype;
}
get supportsAnchorPosition() {
return CSS.supports("anchor-name: none");
}
constructor() {
super();
if(!this.supports) {
return;
}
let sheet = new CSSStyleSheet();
sheet.replaceSync(HeadingAnchors.css);
document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet];
this.headingStyles = {};
this.instanceIndex = globalInstanceIndex++;
}
connectedCallback() {
if (!this.supports) {
return;
}
this.headings.forEach((heading, index) => {
if(!heading.hasAttribute(HeadingAnchors.attributes.exclude)) {
let anchor = this.getAnchorElement(heading);
let placeholder = this.getPlaceholderElement();
// Prefers anchor position approach for better accessibility
// https://amberwilson.co.uk/blog/are-your-anchor-links-accessible/
if(this.supportsAnchorPosition) {
let anchorName = `--ha_${this.instanceIndex}_${index}`;
placeholder.style.setProperty("anchor-name", anchorName);
anchor.style.positionAnchor = anchorName;
}
heading.appendChild(placeholder);
heading.after(anchor);
}
});
}
// Polyfill-only
positionAnchorFromPlaceholder(placeholder) {
if(!placeholder) {
return;
}
let heading = placeholder.closest("h1,h2,h3,h4,h5,h6");
if(!heading.nextElementSibling) {
return;
}
// TODO next element could be more defensive
this.positionAnchor(heading.nextElementSibling);
}
// Polyfill-only
positionAnchor(anchor) {
if(!anchor || !anchor.previousElementSibling) {
return;
}
// TODO previous element could be more defensive
let heading = anchor.previousElementSibling;
this.setFontProp(heading, anchor);
if(this.supportsAnchorPosition) {
// quit early
return;
}
let placeholder = heading.querySelector(`.${HeadingAnchors.classes.placeholder}`);
if(placeholder) {
anchor.style.setProperty("--ha_offsetx", `${placeholder.offsetLeft}px`);
anchor.style.setProperty("--ha_offsety", `${placeholder.offsetTop}px`);
}
}
setFontProp(heading, anchor) {
let placeholder = heading.querySelector(`.${HeadingAnchors.classes.placeholder}`);
if(placeholder) {
let style = getComputedStyle(placeholder);
let props = ["font-weight", "font-size", "line-height", "font-family"];
let [weight, size, lh, family] = props.map(name => style.getPropertyValue(name));
anchor.style.setProperty("font", `${weight} ${size}/${lh} ${family}`);
let vars = style.getPropertyValue("font-variation-settings");
if(vars) {
anchor.style.setProperty("font-variation-settings", vars);
}
}
}
/* no longer used, using aria-labelledby instead - see getAnchorElement
getAccessibleTextPrefix() {
// Useful for i18n
return this.getAttribute(HeadingAnchors.attributes.prefix) || "Jump to section titled";
}
*/
getContent() {
if(this.hasAttribute(HeadingAnchors.attributes.content)) {
return this.getAttribute(HeadingAnchors.attributes.content);
}
return "#";
}
// Placeholder nests inside of heading
getPlaceholderElement() {
let ph = document.createElement("span");
ph.setAttribute("aria-hidden", true);
ph.classList.add(HeadingAnchors.classes.placeholder);
let content = this.getContent();
if(content) {
ph.innerHTML = content; // CHANGED HERE
}
ph.addEventListener("mouseover", (e) => {
let placeholder = e.target.closest(`.${HeadingAnchors.classes.placeholder}`);
if(placeholder) {
this.positionAnchorFromPlaceholder(placeholder);
}
});
return ph;
}
getAnchorElement(heading) {
let anchor = document.createElement("a");
anchor.href = `#${heading.id}`;
anchor.classList.add(HeadingAnchors.classes.anchor);
let content = this.getContent();
anchor.innerHTML = `<span aria-labelledby=${heading.id}>${content}</span>`; // CHANGED HERE
anchor.addEventListener("focus", e => {
let anchor = e.target.closest(`.${HeadingAnchors.classes.anchor}`);
if(anchor) {
this.positionAnchor(anchor);
}
});
anchor.addEventListener("mouseover", (e) => {
// when CSS anchor positioning is supported, this is only used to set the font
let anchor = e.target.closest(`.${HeadingAnchors.classes.anchor}`);
this.positionAnchor(anchor);
});
return anchor;
}
get headings() {
return this.querySelectorAll(this.selector.split(",").map(entry => `${entry.trim()}[id]`));
}
get selector() {
return this.getAttribute("selector") || HeadingAnchors.defaultSelector;
}
}
HeadingAnchors.register();
export { HeadingAnchors }
/* don't even bother on mobile */
if (window.innerWidth > 650) {
const dialog = document.querySelector("dialog");
const closeButton = document.querySelector(".close-dialog");
const hero = document.querySelector(".hero");
hero.tabIndex = 0;
hero.addEventListener("click", (e) => dialog.showModal());
hero.addEventListener("keydown", (e) => {
if (e.key === "Enter" || e.key === " ") {
e.preventDefault();
dialog.showModal();
}
});
closeButton.addEventListener("click", (e) => dialog.close());
closeButton.addEventListener("keydown", (e) => {
if (e.key === "Enter" || e.key === " ") {
e.preventDefault();
dialog.close();
}
});
}
const THEME = "theme";
const saveTheme = (themeValue) => {
localStorage.setItem(THEME, themeValue);
};
const themeLight = document.getElementById("theme-light");
themeLight.addEventListener("input", (e) => {
saveTheme(themeLight.value);
});
const themeAuto = document.getElementById("theme-auto");
themeAuto.addEventListener("input", (e) => {
saveTheme(themeAuto.auto);
});
const themeDark = document.getElementById("theme-dark");
themeDark.addEventListener("input", (e) => {
saveTheme(themeDark.value);
});
var currentThemeValue = localStorage.getItem(THEME);
switch (currentThemeValue) {
case "light":
themeLight.checked = true;
themeAuto.checked = false;
break;
case "dark":
themeDark.checked = true;
themeAuto.checked = false;
break;
case "auto":
default:
themeAuto.checked = true;
}</script>
<link href="/pagefind/pagefind-component-ui.css" rel="stylesheet">
<script src="/pagefind/pagefind-component-ui.js" type="module"></script>
</head>
<body>
<header>
<a href="#main" id="skip" title="skip to main content">
<i class="fa-solid fa-forward" aria-hidden="true"></i> skip
</a>
<nav aria-label="main navigation">
<ul>
<li>
<a href="/reference/" title="read reference posts">
<i class="fa-regular fa-folder-open" aria-hidden="true"></i>
<span class="menu-text">reference</span>
</a>
</li>
<li>
<a href="/gallery/" title="view the gallery">
<i class="fa-regular fa-images" aria-hidden="true"></i>
<span class="menu-text">gallery</span>
</a>
</li>
<li>
<a href="/" title="home">
<i class="fa fa-solid fa-crow" aria-hidden="true"></i>
<span class="menu-text">home</span>
</a>
</li>
<li>
<a href="/about/" title="about Lee">
<i class="fa-regular fa-user" aria-hidden="true"></i>
<span class="menu-text">about</span>
</a>
</li>
<li>
<a href="/contact/" title="contact Lee">
<i class="fa-solid fa-envelope-open-text" aria-hidden="true"></i>
<span class="menu-text">contact</span>
</a>
</li>
</ul>
</nav>
<div class="dark searchbox" data-pf-theme="dark">
<pagefind-searchbox></pagefind-searchbox>
</div>
<div class="light searchbox">
<pagefind-searchbox></pagefind-searchbox>
</div>
</header>
<main id="main">
<heading-anchors content="<i class='fa-solid fa-anchor'></i>">
<article data-pagefind-body="">
<h1>sticker vendors</h1>
<div class="post-metadata">
<p>
posted on
<time datetime="2026-09-29">September 29, 2026</time>
by Lee Cattarin
</p>
<ul class="post-tags">
<li>
<a href="/tags/sticker/">sticker</a>
</li>
</ul>
</div>
<dialog closedby="any" aria-label="image modal" tabindex="-1">
<button class="close-dialog" autofocus="" aria-label="close the image modal">&times;</button>
<img class="modal-img" src="/img/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." loading="lazy" decoding="async" width="1000" height="666">
</dialog>
<img class="hero" src="/img/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." loading="lazy" decoding="async" width="1000" height="666">
<aside id="toc">
<details>
<summary><h2>table of contents</h2></summary>
<nav class="toc">
<ol>
<li><a href="#exclusions">Exclusions</a>
</li>
<li><a href="#summaries">Summaries</a>
<ol>
<li><a href="#overall-summary">Overall summary</a>
</li>
<li><a href="#quality-summary">Quality summary</a>
</li>
<li><a href="#pricing-summary">Pricing summary</a>
</li>
<li><a href="#ease-of-peeling">Ease of peeling</a>
</li>
</ol>
</li>
<li><a href="#pricing-tables">Pricing tables</a>
<ol>
<li><a href="#price-point-1%3A-100">Price point 1: 100</a>
</li>
<li><a href="#price-point-2%3A-200">Price point 2: 200</a>
</li>
<li><a href="#price-point-3%3A-500">Price point 3: 500</a>
</li>
</ol>
</li>
<li><a href="#vendors">Vendors</a>
<ol>
<li><a href="#bend-print-co.">Bend Print Co.</a>
</li>
<li><a href="#brick-city-printing">Brick City Printing</a>
</li>
<li><a href="#busy-beaver">Busy Beaver</a>
</li>
<li><a href="#death-by-stickers">Death by Stickers</a>
</li>
<li><a href="#standout-stickers">StandOut Stickers</a>
</li>
<li><a href="#sticker-bunnies">Sticker Bunnies</a>
</li>
<li><a href="#sticker-guy">Sticker Guy</a>
</li>
<li><a href="#sticker-junkie">Sticker Junkie</a>
</li>
<li><a href="#sticker-mule">Sticker Mule</a>
</li>
<li><a href="#sticker-ninja">Sticker Ninja</a>
</li>
<li><a href="#sticker-robot">Sticker Robot</a>
</li>
<li><a href="#stickerapp">StickerApp</a>
</li>
<li><a href="#stickerbros">StickerBros</a>
</li>
<li><a href="#stickergiant">StickerGiant</a>
</li>
<li><a href="#sticky-brand">Sticky Brand</a>
</li>
<li><a href="#vinyl-disorder">Vinyl Disorder</a>
</li>
</ol>
</li>
<li><a href="#resources">Resources</a>
</li>
</ol>
</nav>
</details>
</aside>
<p>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).</p>
<p>I priced out <strong>3&quot;x3&quot; holographic die-cut vinyl stickers</strong> from US-based sticker vendors at three price points: 100 (or nearest above 100), 200 (or nearest above 200), and 500. Free shipping referenced <em>may</em> require a minimum to kick in - I noted it down as free if the minimum was below the price point for 100 stickers.</p>
<p>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.</p>
<p>Got a recommendation not in this writeup? Feel free to <a href="/contact">let me know</a> and I'll price them out and add them.</p>
<p>All sample packs ordered have been summarized and photographed with the exception of Sticker Bunnies, which has not arrived yet.</p>
<p>I think I have to make a weird art piece now with all these samples.</p>
<h2 id="exclusions">Exclusions</h2>
<p>Three other vendors are mentioned but will not appear in summaries: Sticker Guy, Sticker Mule, and Sticky Brand.</p>
<ul>
<li>Sticker Guy looks <strong>awesome</strong> 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.</li>
<li>Sticker Mule's CEO is a vocal Trump supporter.</li>
<li>Sticky Brand has started using generative AI marketing (this is secondhand information as I don't use instagram). Also I had a <a href="#sticky-brand">pretty bad customer service experience</a>.</li>
</ul>
<p>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.</p>
<h2 id="summaries">Summaries</h2>
<h3 id="overall-summary">Overall summary</h3>
<h3 id="quality-summary">Quality summary</h3>
<p>Sticker Ninja - wow! Thick, sturdy vinyl that feels amazing. Plus loads of pretty finishes - I'm really noodling on what I could do on &quot;Prism Party.&quot; They're not <em>the</em> 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 <a href="/hummingbird-become-ungovernable">hummingbirds</a> from them as well as a design new to stickers, <a href="/big-pidges">big pidge</a>.</p>
<p>Also, they sent me a &quot;queer joy is a revolution&quot; 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.</p>
<p>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 <a href="/fedizinefest-2026-2027">FediZineFest</a> stickers through them, and they are <em>fast</em>.</p>
<h3 id="pricing-summary">Pricing summary</h3>
<p>Death by Stickers stands out as <em>by far</em> 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!</p>
<p>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.</p>
<p>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.</p>
<h3 id="ease-of-peeling">Ease of peeling</h3>
<p>Brick City Printing, StandOut Stickers, Sticker Junkie, StickerApp, and StickerGiant offer split backs.</p>
<p>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.</p>
<p>Sticker Ninja and StickerBros do not offer split backs.</p>
<p>Busy Beaver, Death by Stickers, and Sticker Bunnies do not specify.</p>
<h2 id="pricing-tables">Pricing tables</h2>
<h3 id="price-point-1%3A-100">Price point 1: 100</h3>
<p>Per 100 (unless noted otherwise).</p>
<table>
<thead>
<tr>
<th>Vendor</th>
<th>Per sticker</th>
<th>Quantity</th>
</tr>
</thead>
<tbody>
<tr>
<td>Death by Stickers</td>
<td>$0.81</td>
<td></td>
</tr>
<tr>
<td>Sticker Bunnies</td>
<td>$0.90</td>
<td></td>
</tr>
<tr>
<td>StickerApp</td>
<td>$0.98</td>
<td></td>
</tr>
<tr>
<td>Brick City Printing</td>
<td>$1.05</td>
<td></td>
</tr>
<tr>
<td>Sticker Ninja</td>
<td>$1.06</td>
<td></td>
</tr>
<tr>
<td>Busy Beaver</td>
<td>$1.07</td>
<td></td>
</tr>
<tr>
<td>StandOut Stickers</td>
<td>$1.09</td>
<td></td>
</tr>
<tr>
<td>StickerGiant</td>
<td>$1.10</td>
<td>125</td>
</tr>
<tr>
<td>StickerBros</td>
<td>$1.18</td>
<td></td>
</tr>
<tr>
<td>Sticker Robot</td>
<td>$1.27</td>
<td></td>
</tr>
<tr>
<td>Bend Print Co.</td>
<td>$1.45</td>
<td></td>
</tr>
<tr>
<td>Vinyl Disorder</td>
<td>$1.61</td>
<td></td>
</tr>
<tr>
<td>Sticker Junkie</td>
<td>n/a</td>
<td>No quantity ~100 offered</td>
</tr>
</tbody>
</table>
<h3 id="price-point-2%3A-200">Price point 2: 200</h3>
<p>Per 200 (unless noted otherwise).</p>
<table>
<thead>
<tr>
<th>Vendor</th>
<th>Per sticker</th>
<th>Quantity</th>
</tr>
</thead>
<tbody>
<tr>
<td>StickerGiant</td>
<td>$0.73</td>
<td>250</td>
</tr>
<tr>
<td>StickerApp</td>
<td>$0.77</td>
<td></td>
</tr>
<tr>
<td>Death by Stickers</td>
<td>$0.80</td>
<td></td>
</tr>
<tr>
<td>StandOut Stickers</td>
<td>$0.80</td>
<td></td>
</tr>
<tr>
<td>StickerBros</td>
<td>$0.84</td>
<td></td>
</tr>
<tr>
<td>Sticker Robot</td>
<td>$0.85</td>
<td>250</td>
</tr>
<tr>
<td>Bend Print Co.</td>
<td>$0.88</td>
<td>250</td>
</tr>
<tr>
<td>Sticker Bunnies</td>
<td>$0.90</td>
<td></td>
</tr>
<tr>
<td>Brick City Printing</td>
<td>$0.93</td>
<td></td>
</tr>
<tr>
<td>Vinyl Disorder</td>
<td>$0.94</td>
<td>250</td>
</tr>
<tr>
<td>Sticker Ninja</td>
<td>$0.97</td>
<td></td>
</tr>
<tr>
<td>Sticker Junkie</td>
<td>$1.07</td>
<td></td>
</tr>
<tr>
<td>Busy Beaver</td>
<td>n/a</td>
<td>No quantity between 100 and 500 offered</td>
</tr>
</tbody>
</table>
<h3 id="price-point-3%3A-500">Price point 3: 500</h3>
<table>
<thead>
<tr>
<th>Vendor</th>
<th>Per sticker</th>
</tr>
</thead>
<tbody>
<tr>
<td>Brick City Printing</td>
<td>$0.49</td>
</tr>
<tr>
<td>StickerGiant</td>
<td>$0.54</td>
</tr>
<tr>
<td>StandOut Stickers</td>
<td>$0.55</td>
</tr>
<tr>
<td>StickerApp</td>
<td>$0.56</td>
</tr>
<tr>
<td>Sticker Ninja</td>
<td>$0.59</td>
</tr>
<tr>
<td>StickerBros</td>
<td>$0.60</td>
</tr>
<tr>
<td>Busy Beaver</td>
<td>$0.63</td>
</tr>
<tr>
<td>Bend Print Co.</td>
<td>$0.65</td>
</tr>
<tr>
<td>Sticker Robot</td>
<td>$0.65</td>
</tr>
<tr>
<td>Sticker Junkie</td>
<td>$0.72</td>
</tr>
<tr>
<td>Death by Stickers</td>
<td>$0.72</td>
</tr>
<tr>
<td>Vinyl Disorder</td>
<td>$0.81</td>
</tr>
<tr>
<td>Sticker Bunnies</td>
<td>$0.90</td>
</tr>
</tbody>
</table>
<h2 id="vendors">Vendors</h2>
<h3 id="bend-print-co.">Bend Print Co.</h3>
<p><a href="https://www.bendprintco.com/" target="_blank" rel="external">Bend Print Co.</a></p>
<ul>
<li>100 for $145.00 - $1.45/sticker</li>
<li>250 for $220.00 - $0.88/sticker</li>
<li>500 for $325.00 - $0.65/sticker</li>
<li>Free shipping</li>
<li>Split backs (or peel tabs) for additional cost</li>
</ul>
<p>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.</p>
<p>(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.)</p>
<p><img src="/img/bend-print-co.jpg" alt="8 sample stickers with the same Bend Print Co logo design on 8 different vinyls including glitter, chrome, 'galactic', and silver and gold holo. Each also has a small color test" loading="lazy" decoding="async" width="1000" height="315"></p>
<h3 id="brick-city-printing">Brick City Printing</h3>
<p><a href="https://www.brickcityprinting.com/" target="_blank" rel="external">Brick City Printing</a></p>
<p>Union made!</p>
<ul>
<li>100 for $105.00 - $1.05/sticker</li>
<li>200 for $186.00 - $$0.93/sticker</li>
<li>500 for $245.00 - $0.49/sticker</li>
<li>Free shipping</li>
<li>Split backs</li>
</ul>
<p>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.</p>
<p><img src="/img/brick-city-printing.jpg" alt="Some sample stickers in both standard vinyl and holo, including 'stickers the cat,' some pride flag hearts overlaid with St. Louis flag iconography, and a riff on the Black Flag logo done with bricks." loading="lazy" decoding="async" width="1000" height="780"></p>
<h3 id="busy-beaver">Busy Beaver</h3>
<p><a href="https://www.busybeaver.net/" target="_blank" rel="external">Busy Beaver</a></p>
<ul>
<li>100 for $107.00 - $1.07/sticker</li>
<li>No quantity between 100 and 500 offered</li>
<li>500 for $315.00 - $0.63/sticker</li>
<li>Free shipping</li>
<li>Couldn't find information regarding split backs</li>
</ul>
<p>Apparently you have to call Busy Beaver... on the phone... to get samples. Nah. Not worth.</p>
<h3 id="death-by-stickers">Death by Stickers</h3>
<p><a href="https://deathbystickers.com/" target="_blank" rel="external">Death by Stickers</a></p>
<ul>
<li>100 for $81.00 - $0.81/sticker</li>
<li>200 for $160.00 - $0.80/sticker</li>
<li>500 for $361.25 - $0.72/sticker</li>
<li>Free shipping for orders over $100.00</li>
<li>Couldn't find information regarding split backs</li>
</ul>
<p>Death by Stickers offers sample packs, but they're sold out currently.</p>
<h3 id="standout-stickers">StandOut Stickers</h3>
<p><a href="https://www.standoutstickers.com/" target="_blank" rel="external">StandOut Stickers</a></p>
<ul>
<li>100 for $109.00 - $1.09/sticker</li>
<li>200 for $160.00 - $0.80/sticker</li>
<li>500 for $272.50 - $0.55/sticker</li>
<li>$10.00 for template help - they looked to have pretty stringent art requirements</li>
<li>Free shipping</li>
<li>Split backs</li>
</ul>
<p>StandOut Stickers doesn't offer samples as far as I could find.</p>
<h3 id="sticker-bunnies">Sticker Bunnies</h3>
<p><a href="https://www.stickerbunnies.com/" target="_blank" rel="external">Sticker Bunnies</a></p>
<p>Sticker Bunnies prices by sticker size and material - <strong>not</strong> quantity. 3&quot;x3&quot; holo die cut stickers are $0.90 per sticker - no bulk pricing. They also only accept orders via email (other than sample packs).</p>
<p>I am waiting on a Sticker Bunnies sample pack at current. I have no ETA yet.</p>
<h3 id="sticker-guy">Sticker Guy</h3>
<p><a href="https://stickerguy.com/" target="_blank" rel="external">Sticker Guy</a></p>
<p>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.</p>
<h3 id="sticker-junkie">Sticker Junkie</h3>
<p><a href="https://www.stickerjunkie.com/" target="_blank" rel="external">Sticker Junkie</a></p>
<ul>
<li>No quantity ~100 offered</li>
<li>200 for $214.00 - $1.07/sticker</li>
<li>500 for $360.00 - $0.72/sticker</li>
<li>Free shipping</li>
<li>Split backs</li>
</ul>
<p>These feel pretty quality. They're not too flimsy, and the colors are vibrant. The split backs make them easy to peel.</p>
<p><img src="/img/sticker-junkie.jpg" alt="An array of colorful stickers, most featuring the sticker junkie logo of a monkey head smoking a cigar. There's a couple color sample stickers as well that show the full range of colors on glossy and matte stickers." loading="lazy" decoding="async" width="1000" height="579"></p>
<h3 id="sticker-mule">Sticker Mule</h3>
<p><a href="https://www.motherjones.com/politics/2026/09/anthony-constantino-donald-trump-sticker-mule-congress-stefanik/" target="_blank" rel="external">CEO is a big Trump supporter</a>.</p>
<h3 id="sticker-ninja">Sticker Ninja</h3>
<p><a href="https://stickerninja.com/" target="_blank" rel="external">Sticker Ninja</a></p>
<ul>
<li>100 for $105.81 - $1.06/sticker</li>
<li>200 for $193.33 - $0.97/sticker</li>
<li>500 for $293.91 - $0.59/sticker</li>
<li>Free shipping</li>
<li>No split backs</li>
</ul>
<p>Sticker Ninja has an <em>amazing</em> 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 <em>quality</em> - nice sturdy vinyl.</p>
<p><img src="/img/sticker-ninja.jpg" alt="Many stickers laid out on a desk, mostly with some variety of cutesy ninja iconography. There are a lot of shimmery, shiny, or glittery ones. A couple say things like 'queer joy is a revolution' or 'love beyond the binary'." loading="lazy" decoding="async" width="1000" height="590"></p>
<h3 id="sticker-robot">Sticker Robot</h3>
<p><a href="https://stickerobot.com/" target="_blank" rel="external">Sticker Robot</a></p>
<ul>
<li>100 for $127.00 - $1.27/sticker</li>
<li>250 for $212.00 - $0.85/sticker</li>
<li>500 for $327.00 - $0.65/sticker</li>
<li>Free shipping</li>
<li>FAQ says split backs can be added, but I didn't see this option; peel tabs can be added for additional cost</li>
</ul>
<p>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 &quot;business card sticker&quot; which is kinda neat.</p>
<p>In the picture, silkscreen stickers are on the left and digital on the right.</p>
2026-10-21 22:27:17 +00:00
<p><img src="/img/sticker-robot.jpg" alt="Some copies of the same two robot designs in different sticker materials as well as an info sheet." loading="lazy" decoding="async" width="1000" height="615"></p>
2026-10-21 22:24:54 +00:00
<h3 id="stickerapp">StickerApp</h3>
<p><a href="https://stickerapp.com" target="_blank" rel="external">StickerApp</a></p>
<ul>
<li>100 for $98.00 - $0.98/sticker</li>
<li>200 for $153.00 - $0.77/sticker</li>
<li>500 for $280.00 - $0.56/sticker</li>
<li>Free shipping</li>
<li>Split backs</li>
</ul>
<p>I'm pretty impressed by the variety here, though the stickers that aren't specifically their &quot;heavy duty&quot; 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...</p>
<p>They have several sample packs - sticker materials (image 1, left; image 2), label materials (image 1, right), and product types (image 3).</p>
<p><img src="/img/stickerapp-materials.jpg" alt="A two-image collage showing all material samples laid out for both stickers - ranging from standard vinyl to finishes like 'pixie dust' and 'matte mirror' - and labels - five simpler varieties." loading="lazy" decoding="async" width="1000" height="600"></p>
<p><img src="/img/stickerapp-colors.jpg" alt="9 color test stickers for a variety of special finishes, matte and glossy holo and mirror, and clear." loading="lazy" decoding="async" width="1000" height="890"></p>
<p><img src="/img/stickerapp.jpg" alt="A dozen or so varied stickers showing off business cards, die cut, special finishes, kiss cut, hang tag, heavy duty, and more, along with the packaging which has a sticker type key printed on it." loading="lazy" decoding="async" width="1000" height="650"></p>
<h3 id="stickerbros">StickerBros</h3>
<p><a href="https://www.stickerbros.com/" target="_blank" rel="external">StickerBros</a></p>
<ul>
<li>100 for $118.00 - $1.18/sticker</li>
<li>200 for $168.00 - $0.84/sticker</li>
<li>500 for $300.00 - $0.60/sticker</li>
<li>Free shipping</li>
<li>No split backs</li>
</ul>
<p>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.</p>
<p>However, they were <em>really</em> 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.</p>
<p><img src="/img/stickerbros.jpg" alt="A dozen or so stickers in fun design showing off different styles such as matte chrome, glitter, glow-in-the-dark, embossed, and more." loading="lazy" decoding="async" width="1000" height="923"></p>
<h3 id="stickergiant">StickerGiant</h3>
<p><a href="https://www.stickergiant.com/" target="_blank" rel="external">StickerGiant</a></p>
<ul>
<li>125 for $137.50 - $1.10/sticker</li>
<li>250 for $182.50 - $0.73/sticker</li>
<li>500 for $270.00 - $0.54/sticker</li>
<li>Free shipping</li>
<li>Split backs</li>
</ul>
<p>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.</p>
<p><img src="/img/sticker-giant.jpg" alt="An array of stickers on a table. All stickers are either labeled with their materials or their design is fully dedicated to describing their materials. There are many labels and die cut stickers." loading="lazy" decoding="async" width="1000" height="660"></p>
<p><img src="/img/sticker-giant-colors.jpg" alt="CMYK swatches on glossy and matte samples of holo, white, and clear, as well as on kraft paper." loading="lazy" decoding="async" width="1000" height="750"></p>
<h3 id="sticky-brand">Sticky Brand</h3>
<p>Sticky Brand has apparently gone pretty hard in on generative AI marketing. I priced them out (and ordered some stickers due to a <em>deep</em> discount*) before learning this, so I'm noting prices down for reference, but I don't recommend them.</p>
<ul>
<li>100 for $118.13 - $1.18/sticker</li>
<li>250 for $236.25 - $0.95/sticker</li>
<li>500 for $393.75 - $0.79/sticker</li>
<li>USPS ground shipping rates or thereabouts</li>
<li>Couldn't find information regarding split backs</li>
</ul>
<p>*Or well, I <em>thought</em> I ordered stickers. Here's what happened:</p>
<p>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 <em>second</em> 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 <em>sucks</em>, 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.</p>
<h3 id="vinyl-disorder">Vinyl Disorder</h3>
<p><a href="https://vinyldisorder.com/" target="_blank" rel="external">Vinyl Disorder</a></p>
<ul>
<li>100 for $161.22 - $1.61/sticker</li>
<li>250 for $236.25 - $0.94/sticker</li>
<li>500 for $406.35 - $0.81/sticker</li>
<li>$5.00-$6.00 for shipping orders under $250.00; free shipping over $250.00 cannot be combined with other discounts</li>
<li>Peel tabs for 25% extra</li>
</ul>
<p>These are decent, but the price is a real deterrant. I think if you're getting more basic stickers their pricing <em>might</em> 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 &quot;cracked ice holo&quot; is pretty cool.</p>
<p><img src="/img/vinyl-disorder.jpg" alt="The same logo in 11 materials, plus a rectangular chunk of holo sticker vinyl. There's even such oddities as glow in the dark, view through (perforated so the design is not fully opaque), and static cling." loading="lazy" decoding="async" width="1000" height="768"></p>
<h2 id="resources">Resources</h2>
<ul>
<li><a href="https://docpop.org/2025/10/some-free-sticker-designs-and-where-to-print-them/" target="_blank" rel="external">Some Free Sticker Designs and Where to Print Them</a></li>
</ul>
</article>
<nav aria-label="pagination">
<ol class="pagination post-pagination">
<li class="older">
<a href="/intro-to-the-fediverse/">
<i class="fa-solid fa-hand-point-left" aria-hidden="true"></i> intro to the fediverse
</a>
</li>
<li class="newer">
<a href="/plaid-dishtowels/">
plaid dishtowels <i class="fa-solid fa-hand-point-right" aria-hidden="true"></i>
</a>
</li>
</ol>
</nav>
<hr>
<section class="related-posts">
<h2 data-ha-exclude="">related posts</h2>
<ol id="postlist">
<li class="post">
2026-10-21 22:27:17 +00:00
<a class="postlink" href="/stickers/">
<h2 data-ha-exclude="">stickers! </h2>
2026-10-21 22:24:54 +00:00
<ul class="postlist-tags">
<li>sticker</li>
</ul>
2026-10-21 22:27:17 +00:00
<img src="/img/trans-rights-stickers.jpg" alt="Clear and holographic stickers in the same design - a smiling skull with speech bubble reading &#39;trans rights!&#39;" loading="lazy" decoding="async" width="1000" height="750">
2026-10-21 22:24:54 +00:00
</a>
</li>
<li class="post">
<a class="postlink" href="/shrimp/">
<h2 data-ha-exclude="">shrimp </h2>
<ul class="postlist-tags">
<li>print</li>
<li>card</li>
<li>sticker</li>
<li>pin</li>
</ul>
<img src="/img/shrimp-print.jpg" alt="A print of a small shrimp with slender little leggies in orange ink." loading="lazy" decoding="async" width="1000" height="750">
</a>
</li>
<li class="post">
2026-10-21 22:27:17 +00:00
<a class="postlink" href="/girldick/">
<h2 data-ha-exclude="">girldick (mature)</h2>
2026-10-21 22:24:54 +00:00
<ul class="postlist-tags">
<li>print</li>
<li>sticker</li>
<li>shirt</li>
<li>pin</li>
2026-10-21 22:27:17 +00:00
<li>gender</li>
2026-10-21 22:24:54 +00:00
</ul>
2026-10-21 22:27:17 +00:00
<img src="/img/girldick-shirt.jpg" alt="A butch cooking and wearing a cropped tee with blue cap sleeves that reads girldick in blue G.I.Joe font." class="blur" loading="lazy" decoding="async" width="1000" height="750">
2026-10-21 22:24:54 +00:00
</a>
</li>
</ol>
</section>
</heading-anchors>
</main>
<footer>
<ul>
<li>
<a href="/colophon/">
colophon
</a>
</li>
<li>
<a href="/" title="go home" aria-label="go home | hello hello from Lee Cattarin, copyright 2022-2026">
hello hello from Lee Cattarin, © 2022-2026</a>
</li>
<li>
<a href="https://heckin.technology/inherentlee/leecat.art" title="source code" aria-label="source code" target="_blank" rel="external">
src
</a>
</li>
</ul>
<fieldset id="theme">
<legend>color scheme</legend>
<input type="radio" id="theme-light" name="theme" value="light">
<label class="theme-light" for="theme-light">
<i class="fa-regular fa-sun" aria-hidden="true"></i>
light
</label>
<input type="radio" id="theme-auto" name="theme" value="auto" checked="">
<label class="theme-auto" for="theme-auto">
auto
</label>
<input type="radio" id="theme-dark" name="theme" value="dark">
<label class="theme-dark" for="theme-dark">
dark
<i class="fa-regular fa-moon" aria-hidden="true"></i>
</label>
</fieldset>
</footer>
2026-10-21 22:27:17 +00:00
<!-- This page `/sticker-vendors/` was built on 2026-10-21T22:26:49.413Z -->
2026-10-21 22:24:54 +00:00
</body>
</html>