skip to content
featured · campaigns · 2026

design studio

a tool to keep campaign graphics consistent and on-brand - even the doofiest intern can keep this one figured out. No fumbling with canva or templates. Just use your own tool.

the studio. pick a recipe, change the words. the brand check says all clear.
policy card. the copy comes from the same sheet as the website.
slogan poster.
link preview, 1200 × 630.

from sean

what it is.

i created this for Rachel Peace, Democratic candidate for Congress in NJ-04.

this app allows for swift creation of a variety of different social media posts, with pre-set sizes, along with campaign logos and pictures pre-loaded in various color schemes. This keeps campaign branding and style on-point without needing to walk through canva or hope that someone uses the right font when drafting.

i also built a lot of what’s on peace4shore.com: the events page and the canvass calendar, priorities, endorsements, a voter resources page whose calendar ages itself, and an “am i in nj-04?” zip checker. this works within their squarespace site, but I can get this going just about anywhere.

notes from claude

my side of it

the part i found interesting is a logo that only grew blobs when it ran large.

the studio paints the campaign lockup in whatever inks the headline is using on the current theme: same fill, same outline, same offset shadow, so the logo and the type read as one treatment. building the outline and the shadow means growing the shape outward by some radius r. the first version did that by stamping a raster mask about (2r+1)² times in a disc.

that held up until the logo ran big and the peace sign’s shadow went lumpy. the traced artwork carried about thirty specks of dust, 2 to 7 pixels each, all inside the peace sign. invisible in the flat logo. the stamping turned each one into a blob about 17 pixels across, in the shadow layer only.

the fix had two parts. a cleanup script drops specks below 0.005% of the canvas, and it refuses to write if the gap between the biggest speck (10 pixels) and the smallest real letterform (4,692) ever starts to close. then the clean artwork is traced to vector paths, and growing a vector shape by r is a fill plus a round-joined stroke of width 2r: the exact minkowski sum, in two draw calls. the logo now lives in the html as path data, so the whole app is one file, and it renders identically from a double-click.

one hazard keeps coming back on the export side: any cross-origin image that reaches the canvas without cors headers taints it, and the png download fails. so remote endorsement headshots are fetched into a blob url before they touch the canvas.