From c741b05c05e5f53eacbcfee3030f23cdfb13228b Mon Sep 17 00:00:00 2001 From: "Aesthetic.Computer" Date: Fri, 17 Apr 2026 12:01:42 -0700 Subject: [PATCH] cv: unify /bio + /cv at justanothersystem.org/cv, add PDF export MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Merge bio.html and cv.html into one document at /cv (portrait slideshow, narrative timeline, full CV listings). /bio now 301s to /cv. - jas.life top-right "Biography & CV" link → https://justanothersystem.org/cv (replaces stale Google Doc). - build-cv-pdf.mjs renders /cv via headless Chrome and writes papers.aesthetic.computer/jeffrey-alan-scudder-cv.pdf, linked from the top of the CV page. Exposed as npm run cv:pdf / cv:pdf:file. - CLAUDE.md + SCORE.md: clarify that lith (DO VPS, pulling from the tangled knot) is the production host — Netlify is no longer the deploy target; system/netlify/functions/ is kept as a historical path. Co-Authored-By: Claude Opus 4.7 (1M context) --- CLAUDE.md | 4 +- SCORE.md | 4 +- package.json | 2 + system/netlify.toml | 4 +- system/public/jas.life/index.html | 4 +- system/public/justanothersystem.org/bio.html | 574 ------------ .../justanothersystem.org/build-cv-pdf.mjs | 179 ++++ system/public/justanothersystem.org/cv.html | 862 +++++++++++++----- .../public/justanothersystem.org/index.html | 4 +- .../jeffrey-alan-scudder-cv.pdf | Bin 0 -> 163764 bytes 10 files changed, 804 insertions(+), 833 deletions(-) delete mode 100644 system/public/justanothersystem.org/bio.html create mode 100644 system/public/justanothersystem.org/build-cv-pdf.mjs create mode 100644 system/public/papers.aesthetic.computer/jeffrey-alan-scudder-cv.pdf diff --git a/CLAUDE.md b/CLAUDE.md index 77d800242b..2ba4ee7d82 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -202,9 +202,9 @@ The API is provided through function parameters. Common APIs: ### Servers and Services 1. **System Server** (`system/` + `lith/`) - - Production: lith monolith (Express + Caddy on DigitalOcean VPS) + - Production: **lith** monolith — Express + Caddy on a DigitalOcean VPS (`lith.aesthetic.computer`). Deployed with `fish lith/deploy.fish`, which pulls from the tangled knot `git@knot.aesthetic.computer:aesthetic.computer/core`. Netlify is no longer the host. - Dev: `npm run site` (port 8888) - - Backend functions in `system/netlify/functions/` + - Backend function handlers live in `system/netlify/functions/` — the path is historical, but lith's Express adapts each file as a route, so keep adding new endpoints there. - Handles piece serving, authentication, storage APIs 2. **Session Server** (`session-server/`) diff --git a/SCORE.md b/SCORE.md index 3fd72d7cb3..f65599d089 100644 --- a/SCORE.md +++ b/SCORE.md @@ -58,7 +58,7 @@ Every piece is URL addressable (e.g. https://aesthetic.computer/notepat). Genera **Backend** - `session-server/` — Real-time multiplayer (Socket.io) -- `lith/` — Monolith deploy (Express wrapping Netlify function handlers + static files, served via Caddy on a DigitalOcean VPS) +- `lith/` — Production monolith deploy (Express + Caddy on a DigitalOcean VPS, pulled from the tangled knot `git@knot.aesthetic.computer:aesthetic.computer/core` via `lith/deploy.fish`). Express adapts the handlers in `system/netlify/functions/` as routes — the `netlify/functions/` path is historical; Netlify is no longer the host. - Authentication and data storage **Languages** @@ -197,7 +197,7 @@ The development environment uses Emacs with named terminal buffers. Use Emacs MC - `ac-chat-clock` — Start clock chat - `ac-stripe-print` — Stripe print service - `ac-stripe-ticket` — Stripe ticket service -- `ac-logger` — View netlify function logs +- `ac-logger` — View lith backend logs (the handlers living under `system/netlify/functions/` run under lith's Express; the name is legacy) - `ac-oven` — Oven service - `ac-offline` — Offline mode diff --git a/package.json b/package.json index cde5572461..0aef7722ac 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,8 @@ "test:kidlisp-wasm:audio": "jasmine spec/kidlisp-wasm-sonic-spec.mjs", "papers": "node papers/cli.mjs", "papers:publish": "node papers/cli.mjs publish", + "cv:pdf": "node system/public/justanothersystem.org/build-cv-pdf.mjs", + "cv:pdf:file": "node system/public/justanothersystem.org/build-cv-pdf.mjs --file", "user": "f() { echo -n \"https://cloud.digitalocean.com/spaces/user-aesthetic-computer?path=\"; curl -s \"https://aesthetic.computer/user?from=$1\" | jq -r '.sub'; }; f", "filter": "cd shared; node --experimental-repl-await -i -e \"import('./filter.mjs').then(m => global.filter = m.filter)\"", "chat": "echo '\n💬 Chat\n';", diff --git a/system/netlify.toml b/system/netlify.toml index 07a8f921da..bd50b516c8 100644 --- a/system/netlify.toml +++ b/system/netlify.toml @@ -826,8 +826,8 @@ status = 200 force = true [[redirects]] from = "https://justanothersystem.org/bio" -to = "/justanothersystem.org/bio.html" -status = 200 +to = "https://justanothersystem.org/cv" +status = 301 force = true [[redirects]] from = "https://justanothersystem.org/*" diff --git a/system/public/jas.life/index.html b/system/public/jas.life/index.html index 9a3de51fcc..2c49c954d8 100644 --- a/system/public/jas.life/index.html +++ b/system/public/jas.life/index.html @@ -31,7 +31,7 @@

Selected Content 2026
- Biography + Biography & CV
@@ -65,7 +65,7 @@

Selected Content
- Biography + Biography & CV
diff --git a/system/public/justanothersystem.org/bio.html b/system/public/justanothersystem.org/bio.html deleted file mode 100644 index 6bab52bb63..0000000000 --- a/system/public/justanothersystem.org/bio.html +++ /dev/null @@ -1,574 +0,0 @@ - - - - - - - Bio — Jeffrey Alan Scudder - - - - - - - - - - - - - - - - - - - -
- -
-

Bio

-
-
-

Jeffrey Alan Scudder (b. 1989, Assonet, MA) is a painter based in Los Angeles. His work moves between stretched canvas, custom software, and live performance, treating painting as a practice that extends across surfaces and systems.

-

Scudder builds his own tools for making images. Aesthetic.Computer is a creative computing platform he designed as an instrument for drawing, painting, and interaction. NoPaint.art, an earlier project, reimagined the paint program as a medium rather than a utility. These tools inform his studio paintings and vice versa—code becomes a way to think about color, gesture, and composition, while painting on canvas stays immediate and physical.

-

With Whistlegraph, a collaborative performance practice with Camille Klein and Alex Freundlich, Scudder has performed at the New Museum, Pioneer Works, ZKM Karlsruhe, and dozens of venues across the US and Europe. The group's work treats drawing as a live, social act.

-

He has given over 65 lectures and performances on Radical Digital Painting internationally, including at the Chaos Communication Congress and in conversation with Casey Reas at bitforms gallery. His work is in the collections of KADIST (San Francisco) and SMK (National Gallery of Denmark). He was invited to present at the inaugural Hash Award at ZKM Karlsruhe in 2018.

-

Scudder holds a BFA in Fine Art from Ringling College of Art and Design (2011) and an MFA in Sculpture from Yale School of Art (2013). He has taught at UCLA, Parsons The New School for Design, and Southern Oregon University. In Spring 2026, he is Author in Residence at UCLA's Social Software studio with Casey Reas. He also demos biweekly at NELA Computer Club, a biweekly demo night at Plot.Place in Chinatown, Los Angeles.

-
-
- Jeffrey Alan Scudder - Jeffrey Alan Scudder - Jeffrey Alan Scudder -
-
-
- -
- -
-

Upcoming

-

Scudder's last public exhibition of physical pictures was Radical Digital Painting with Julia Yerger at Johannes Vogt Gallery in New York (June 2018), where he showed large-format digital prints on paper. In the years since, he has focused on building Aesthetic Computer, touring with Whistlegraph, and returning to painting on canvas and board.

-

In May 2026, he will show new physical paintings at the 47th Venice Family Clinic Art Exhibition + Auction at 910 Abbot Kinney Blvd in Venice, CA—his first gallery exhibition of physical work in eight years.

-
- -
-

Selected Press & Writing

- -
- -
- - - - diff --git a/system/public/justanothersystem.org/build-cv-pdf.mjs b/system/public/justanothersystem.org/build-cv-pdf.mjs new file mode 100644 index 0000000000..ea3fb54707 --- /dev/null +++ b/system/public/justanothersystem.org/build-cv-pdf.mjs @@ -0,0 +1,179 @@ +#!/usr/bin/env node +// build-cv-pdf.mjs — Generate jeffrey-alan-scudder-cv.pdf from cv.html. +// +// Renders /cv via a local Caddy dev server (preferred) or falls back to +// rendering the local file directly, then prints to PDF using headless +// Chrome through puppeteer-core. The output lands in +// system/public/papers.aesthetic.computer/ so papers.aesthetic.computer +// serves it at https://papers.aesthetic.computer/jeffrey-alan-scudder-cv.pdf. +// +// Usage: +// node build-cv-pdf.mjs # render http://localhost:8111/cv +// node build-cv-pdf.mjs --file # render the local cv.html file +// node build-cv-pdf.mjs --url https://justanothersystem.org/cv + +import { existsSync, mkdirSync } from "node:fs"; +import { fileURLToPath, pathToFileURL } from "node:url"; +import { dirname, join, resolve } from "node:path"; +import { createRequire } from "node:module"; + +const require = createRequire(import.meta.url); +const __dirname = dirname(fileURLToPath(import.meta.url)); + +const SITE_DIR = __dirname; +const PUBLIC_DIR = resolve(SITE_DIR, ".."); +const PAPERS_DIR = resolve(PUBLIC_DIR, "papers.aesthetic.computer"); +const OUTPUT_PDF = join(PAPERS_DIR, "jeffrey-alan-scudder-cv.pdf"); + +const DEFAULT_URL = "http://localhost:8111/cv"; +const FALLBACK_FILE = pathToFileURL(join(SITE_DIR, "cv.html")).href; + +const CHROME_CANDIDATES = [ + process.env.PUPPETEER_EXECUTABLE_PATH, + "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", + "/Applications/Chromium.app/Contents/MacOS/Chromium", + "/usr/bin/google-chrome", + "/usr/bin/chromium", + "/usr/bin/chromium-browser", +].filter(Boolean); + +function pickChrome() { + for (const p of CHROME_CANDIDATES) { + if (existsSync(p)) return p; + } + throw new Error( + "No Chrome/Chromium found. Set PUPPETEER_EXECUTABLE_PATH to a Chrome binary.", + ); +} + +function parseArgs(argv) { + const args = { url: null, useFile: false }; + for (let i = 2; i < argv.length; i++) { + const a = argv[i]; + if (a === "--file") args.useFile = true; + else if (a === "--url") args.url = argv[++i]; + } + return args; +} + +async function main() { + const { url: urlArg, useFile } = parseArgs(process.argv); + + let puppeteer; + try { + puppeteer = require("puppeteer-core"); + } catch { + puppeteer = require("puppeteer"); + } + + if (!existsSync(PAPERS_DIR)) mkdirSync(PAPERS_DIR, { recursive: true }); + + const target = useFile ? FALLBACK_FILE : urlArg || DEFAULT_URL; + const executablePath = pickChrome(); + + console.log(`[cv-pdf] chrome: ${executablePath}`); + console.log(`[cv-pdf] target: ${target}`); + console.log(`[cv-pdf] output: ${OUTPUT_PDF}`); + + const browser = await puppeteer.launch({ + executablePath, + headless: "new", + args: ["--no-sandbox", "--disable-dev-shm-usage"], + }); + + try { + const page = await browser.newPage(); + await page.emulateMediaType("print"); + + try { + await page.goto(target, { + waitUntil: "networkidle0", + timeout: 60_000, + }); + } catch (err) { + if (!useFile && !urlArg) { + console.warn( + `[cv-pdf] ${DEFAULT_URL} failed (${err.message}); falling back to ${FALLBACK_FILE}`, + ); + await page.goto(FALLBACK_FILE, { + waitUntil: "networkidle0", + timeout: 60_000, + }); + } else { + throw err; + } + } + + // Downsample the hero portrait to a small inline JPEG so the PDF + // doesn't embed 25 MB of CDN source photos. We keep only the first + // slide, render it to a ~360 px wide canvas, and replace the src + // with the resulting data URL. + await page.evaluate(async () => { + if (document.fonts?.ready) await document.fonts.ready; + + const portrait = document.getElementById("heroSlideshow"); + if (portrait) { + const first = portrait.querySelector("img"); + portrait + .querySelectorAll("img:not(:first-child)") + .forEach((el) => el.remove()); + + if (first) { + if (!first.complete) { + await new Promise((res) => { + first.addEventListener("load", res, { once: true }); + first.addEventListener("error", res, { once: true }); + }); + } + + try { + const maxW = 360; + const ratio = first.naturalWidth + ? Math.min(1, maxW / first.naturalWidth) + : 1; + const w = Math.max(1, Math.round(first.naturalWidth * ratio)); + const h = Math.max(1, Math.round(first.naturalHeight * ratio)); + const canvas = document.createElement("canvas"); + canvas.width = w; + canvas.height = h; + const ctx = canvas.getContext("2d"); + ctx.drawImage(first, 0, 0, w, h); + first.src = canvas.toDataURL("image/jpeg", 0.82); + } catch { + // If canvas taint blocks us (CORS), just drop the portrait. + portrait.remove(); + } + } + } + + const remaining = Array.from(document.images); + await Promise.all( + remaining.map((img) => + img.complete + ? null + : new Promise((res) => { + img.addEventListener("load", res, { once: true }); + img.addEventListener("error", res, { once: true }); + }), + ), + ); + }); + + await page.pdf({ + path: OUTPUT_PDF, + format: "letter", + printBackground: true, + preferCSSPageSize: true, + margin: { top: "0.6in", right: "0.6in", bottom: "0.6in", left: "0.6in" }, + }); + + console.log(`[cv-pdf] wrote ${OUTPUT_PDF}`); + } finally { + await browser.close(); + } +} + +main().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/system/public/justanothersystem.org/cv.html b/system/public/justanothersystem.org/cv.html index 3b73f33486..fbc5172928 100644 --- a/system/public/justanothersystem.org/cv.html +++ b/system/public/justanothersystem.org/cv.html @@ -3,26 +3,51 @@ - CV — Jeffrey Alan Scudder + + Bio & CV — Jeffrey Alan Scudder - + + - - + + + - + + + + + + -

Jeffrey Alan Scudder

-

Curriculum Vitae

+
+

Bio

+
+
+

Jeffrey Alan Scudder (b. 1989, Assonet, MA) is a painter based in Los Angeles. His work moves between stretched canvas, custom software, and live performance, treating painting as a practice that extends across surfaces and systems.

+

Scudder builds his own tools for making images. Aesthetic.Computer is a creative computing platform he designed as an instrument for drawing, painting, and interaction. NoPaint.art, an earlier project, reimagined the paint program as a medium rather than a utility. These tools inform his studio paintings and vice versa—code becomes a way to think about color, gesture, and composition, while painting on canvas stays immediate and physical.

+

With Whistlegraph, a collaborative performance practice with Camille Klein and Alex Freundlich, Scudder has performed at the New Museum, Pioneer Works, ZKM Karlsruhe, and dozens of venues across the US and Europe. The group's work treats drawing as a live, social act.

+

He has given over 65 lectures and performances on Radical Digital Painting internationally, including at the Chaos Communication Congress and in conversation with Casey Reas at bitforms gallery. His work is in the collections of KADIST (San Francisco) and SMK (National Gallery of Denmark). He was invited to present at the inaugural Hash Award at ZKM Karlsruhe in 2018.

+

Scudder holds a BFA in Fine Art from Ringling College of Art and Design (2011) and an MFA in Sculpture from Yale School of Art (2013). He has taught at UCLA, Parsons The New School for Design, and Southern Oregon University. In Spring 2026, he is Author in Residence at UCLA's Social Software studio with Casey Reas. He also demos biweekly at NELA Computer Club, a biweekly demo night at Plot.Place in Chinatown, Los Angeles.

+
+
+ Jeffrey Alan Scudder + Jeffrey Alan Scudder + Jeffrey Alan Scudder +
+
+
jas.life · @@ -184,13 +499,14 @@ Instagram: @whistlegraph, @aesthetic.computer
-
- Jeffrey is a painter based in Los Angeles who builds tools for image-making and performance. His work moves between stretched canvas, custom software, and live performance. He is the creator of Aesthetic Computer, Whistlegraph, and No Paint. Collections include KADIST (San Francisco) and SMK (National Gallery of Denmark). -
+
+

Upcoming

+

Scudder's last public exhibition of physical pictures was Radical Digital Painting with Julia Yerger at Johannes Vogt Gallery in New York (June 2018), where he showed large-format digital prints on paper. In the years since, he has focused on building Aesthetic Computer, touring with Whistlegraph, and returning to painting on canvas and board.

+

In May 2026, he will show new physical paintings at the 47th Venice Family Clinic Art Exhibition + Auction at 910 Abbot Kinney Blvd in Venice, CA—his first gallery exhibition of physical work in eight years.

+
- -

Timeline

-
+
+

Timeline

2026

Author in Residence at UCLA Social Software studio with Casey Reas. Participating in the 47th Venice Family Clinic Art Exhibition + Auction. Demoing biweekly at NELA Computer Club at Plot.Place in Chinatown.

@@ -214,11 +530,12 @@

2016–2019

Jeffrey travels and spends his time performing, programming and making pictures. Since 2016 he has given over 65 lecture performances on Radical Digital Painting and related topics in the US and in Europe, often with collaborators Goodiepal & Pals, Julia Yerger, Artur Erman, and Casey REAS. He has taught at UCLA and Parsons The New School for Design and worked previously at the design studio Linked by Air. Jeffrey received an MFA in Sculpture from Yale University School of Art in 2013. He is currently an Assistant Professor of Emerging Digital Practices at Southern Oregon University.

-
+ + +
- -

Geo. Log

-
+
+

Geo. Log

2025 — Los Angeles, CA
2023 — New York, NY
2019 — Ashland, OR
@@ -229,196 +546,243 @@
2011 — New Haven, CT
2007 — Sarasota, FL
1989 — Assonet, MA (Born)
-
- - -

Education

-
2013 — Yale School of Art — MFA
-
2011 — Ringling College of Art + Design — BFA
-
2010 — AICAD New York Studio Program Residency
-
2006 — Ringling College of Art + Design PreCollege Perspective
-
2007 — Apponequet Regional High School
- - -

Press, Interviews, Articles and Pages

-
2023 — Kadist Foundation Artwork Profile
-
2023 — Whistlegraph — A new audience for generative art, Dirt
-
2023 — Sex: The Whistlegraph Zine
-
2019 — On Radical Digital Painting, The Artword Podcast
-
2019 — Drawing is the best videogame, The Creative Independent
-
2018 — Radical Digital Painting & Political Rock, Are.na Blog
-
2018 — Harvard Advocate, Winter 2018, Noise
-
2017 — Rhizome Artist Profile: Jeffrey Alan Scudder (Jeffrey Heart)
-
2017 — A Manifesto for Radical Digital Painting, Schlosspost
-
2017 — Microsoft Paint's Influence on Artists Is Bigger Than You Might Think, Artsy
- - -

Lectures, Conferences & Performances

-
2025 — Talk @ El Cid, Los Angeles, CA
-
2020 — New Dynamic Graphics: Whistlegraph Recital @ Korea HCI 2020
-
2019 — New Dynamic Graphics @ India HCI 19, Hyderabad, India
-
2019 — VJ @ Internet Archive's World Night Market w/ Patrick Vogel, San Francisco
-
2019 — RDP @ SF Art Book Fair w/ Alex Freundlich
-
2019 — RDP & VJ @ Internet Archive's DWeb Camp w/ Alex Freundlich
-
2019 — RDP @ Yale — IEEE GEM Conference
-
2019 — RDP @ RAFLOST Festival, Iceland
-
2019 — Radical Digital Painting w/ Ella Fleck (650mAh) @ Weber State University
-
2019 — Island Crisis w/ Artur Erman, San Juan, PR
-
2019 — Radical Pedagogy I — Flower Eater Drawing Workshop @ Processing Community Day, LA
-
2018 — RDP (JAS on Paper), 35c3: Chaos Communication Congress, Leipzig
-
2018 — RDP (JAS on Paper), The House on Sunset, Los Angeles, CA
-
2018 — RDP (JAS on Paper), 1 Thoresby St. w/ Leon Sadler, Nottingham, UK
-
2018 — RDP (JAS on Paper) w/ GP&PLS, Centrala, Birmingham, UK
-
2018 — RDP (JAS on Paper) w/ GP&PLS, Colchester Arts Center, Colchester, UK
-
2018 — RDP (JAS on Paper) w/ GP&PLS, Cafe OTO, London, UK
-
2018 — RDP (JAS on Paper), Gazelli Art House, London, UK
-
2018 — RDP (JAS on Paper), Digital Painting Class, Sibelius Academy, Helsinki
-
2018 — RDP (Drawing is the Best Videogame), Hove, UK
-
2018 — RDP (JAS on Paper) Yale School of Art (Painting), New Haven, CT
-
2018 — RDP (JAS on Paper) generate!_lab meets Querfeldein, Tubingen, Germany
-
2018 — RDP (JAS on Paper) One Night in Club Danger, curated by Taissa Fromme, Apolda, Germany
-
2018 — RDP (JAS on Paper) Bauhaus University: Arts, Weimar, Germany
-
2018 — RDP (JAS on Paper) w/ GP&PLS (Rowan van As) Serendip Festival, Paris
-
2018 — RDP (JAS on Paper) Klasse Digitale Grafik | HFBK, Hamburg, Germany
-
2018 — RDP (JAS on Paper) Exploration Laboratory @ Sibelius Academy, Helsinki
-
2018 — RDP (JAS on Paper) Jan van Eyck Academie, Maastricht, Holland
-
2018 — Radical Digital Painting & Political Rock @ Erratum Galerie, Berlin
-
2018 — RDP (JAS on Paper) w/ Goodiepal & Pals, Kammer-Pop, Hamburg
-
2018 — RDP (JAS on Paper) w/ Goodiepal & Pals, Dans for voksne, Oslo
-
2018 — RDP (JAS on Paper) w/ Dalin, Rowan & Ben, Open Forum, Oslo National Academy of the Arts
-
2018 — RDP (JAS on Paper) @ Royal Institute of Art, Stockholm
-
2018 — RDP (JAS on Paper) @ Estonian Academy of Arts, Tallinn
-
2018 — RDP (JAS on Paper) w/ GP&PLS, dodo.org HarFest, Helsinki
-
2018 — RDP (JAS on Paper) w/ GP&PLS, Mayhem, Copenhagen
-
2018 — RDP (JAS on Paper) Det Jyske Kunstakademi, Aarhus, Denmark
-
2018 — RDP (JAS on Paper) w/ Goodiepal & Pals, Louisiana Museum Literature Festival
-
2018 — RDP (JAS on Paper) w/ Goodiepal & Pals, KUNSTHAL AARHUS
-
2018 — RDP (JAS on Paper) w/ Goodiepal & Pals, Spanien 19C, Aarhus
-
2018 — RDP (JAS on Paper) w/ Goodiepal & Pals, West Germany Venue, Berlin
-
2018 — RDP @ Headquarters, Asheville, NC
-
2018 — RDP @ Pioneer Works, Brooklyn, NY
-
2018 — RDP Malibu w/ Matty Mo, Malibu, CA
-
2018 — RDP Lecture @ Johannes Vogt Gallery, NYC
-
2018 — RDP (x2) @ RISD Foundations w/ Travess Smalley's students, Providence, RI
-
2018 — RDP @ UC Santa Barbara, Santa Barbara, CA
-
2018 — In conversation | on drawing, animation, and coding systems, makeroom.la, LA
-
2018 — RDP @ Harvard Advocate's Noise Launch Party, Boston, MA
-
2018 — RDP @ SUNY Purchase, NY
-
2018 — Casey Reas & Jeffrey Alan Scudder in Conversation, bitforms gallery, NYC
-
2018 — RDP @ 1st Annual HASH Award, ZKM, Karlsruhe
-
2018 — RDP @ Coaxial Arts in LA
-
2017 — Radical Digital Painting Northeast US Lecture Tour w/ JAS Team (Parsons, Victoria's Basement, Rutgers, RISD, UMASS, Harvard, Temple University, Baltimore, Yale, Kimberly-Klark)
-
2017 — RDP @ Cafe OTO, London
-
2017 — RDP @ RBABARRAB, Copenhagen
-
2017 — RDP @ Neumeister Bar-Am, Berlin
-
2017 — RDP @ GIPHY's TIME_FRAME Exhibition
-
2017 — Radical Digital Painting @ Oberlin College
-
2017 — JAS: In The Grid @ Babycastles, New York
-
2016 — Explained Pictures Basement Show — Victoria Sobel's Basement, Brooklyn, NY
-
2016 — Explained Pictures, The New School, New York
-
2016 — Guest Lecturer: Projects Class, Cooper Union, New York
-
2015 — History of the Web Part II, AIGA/NY, New York
-
2015 — Arts Panel, IEEE GEM Conference, Toronto, Canada
- - -

Solo Exhibitions

-
2022 — Ten Whistlegraphs, Feral File (w/ Whistlegraph)
-
2018 — Radical Digital Painting: Los Angeles, The Newsstand Project & CAP, Los Angeles, CA
-
2017 — Tumpin, left.gallery, Online
-
2017 — Imaginary Screenshots, Whitcher Projects, Los Angeles, CA
-
2016 — No Paint: Release One, Essex Flowers (Digital Commission), Website
-
2016 — What do we see when we close our eyes?, SCREEN_, Email
-
2013 — Attn: Trap, Parallelograms, World Wide Web
-
2008 — Open Your Heart To Me, Crossley Gallery, Sarasota, FL
- - -

Group Exhibitions

-
2026 — 47th Venice Family Clinic Art Exhibition + Auction, 910 Abbot Kinney Blvd, Venice, CA
-
2025 — Turbo Cheap (inaugural exhibition), Los Angeles, CA
-
2019 — Internet Archive Artist in Residency Exhibition
-
2018 — drawings, 650mAh
-
2018 — INTENTIONS BASED ON A FUTURE WHICH HAS ALREADY HAPPENED (curated by Alex Corbett), Naming Gallery, Oakland, CA
-
2018 — Radical Digital Painting w/ Julia Yerger, Johannes Vogt Gallery, NYC
-
2018 — OPEN CODES (Schloss Solitude Web Residencies), ZKM, Karlsruhe
-
2017 — drawinghomework.net Presents, February Gallery, Austin, TX
-
2017 — New Dawn, Neumeister Bar-Am, Berlin
-
2017 — Coping Copy, Konstanet, Online
-
2016 — Becoming That, becomingthat.com, curated by Levi Easterbrooks, Online
-
2016 — Drawing Homework, Online
-
2015 — VIDEO MIXER, Yale School of Art, New Haven, CT
-
2015 — P.S.1 Commencement, ALLGOLD @ MoMA PS1 Printshop, Long Island City, NY
-
2015 — RENDER SERIES (3), ALLGOLD @ MoMA PS1 Printshop, Long Island City, NY
-
2015 — Clorox/Envy, STILL HOUSE GROUP, Brooklyn, NY
-
2013 — 'Toonskin, Artspace, New Haven, CT
-
2013 — APARTMENT SHOW — Hosted by Nouriel Roubini, Nouriel Roubini's Apartment, New York, NY
-
2013 — Yale Sculpture MFA Thesis Exhibition, Yale School of Art, New Haven, CT
-
2013 — "Now that I have your attention, what do I do with it?", New York Studio Program, Brooklyn, NY
-
2012 — 3rd Floor, The New Haven Business Center, New Haven, CT
-
2012 — MFA 2013 Second Year Show, Yale School of Art, New Haven, CT
-
2011 — Frais Peint MFA 2013 First Year Show, Yale School of Art, New Haven, CT
-
2011 — 1408: Group Show, 1408 Art Space (Joint Collective), Sarasota, FL
-
2011 — Fine Arts BFA Thesis Exhibition, Crossley Gallery, Sarasota, FL
-
2011 — SURPLUS, curated by RCAD Senior Thesis Class, Sarasota, FL
-
2011 — Best of Ringling (President's Award), curated by Chie Fueki, RCAD, Sarasota, FL
-
2011 — NUGENT · PHILLIPS · SCUDDER — Compulsory Thesis Exhibition, Crossley Gallery, Sarasota, FL
-
2010 — Best of Ringling 2010, curated by Jay Davis, RCAD, Sarasota, FL
-
2009 — Advanced Drawing, with Bradley Wester's Junior Advanced Drawing, Crossley Gallery, Sarasota, FL
-
2009 — OPEN, with Bradley Wester's Fine Arts Painting III, Crossley Gallery, Sarasota, FL
-
2009 — no ones little grr, with Jenny Vu and Sarah Valdez, Crossley Gallery, Sarasota, FL
-
2009 — The New Easy, curated by Lars Eijssen, Artnews Projects, Berlin
-
2009 — No Bad Memories, with the NYSP class of Spring 2009, New York Studio Program, Brooklyn, NY
-
2008 — Best of Ringling 2008 (Juror's Award), curated by Dominique Nahas, RCAD, Sarasota, FL
-
2008 — Realia, curated by Kayla Carlson, Big E's, Sarasota, FL
- - -

Residencies

-
2026 — Author in Residence, UCLA Social Software (Casey Reas), Los Angeles, CA
-
2018 — Gazell.io Art House Web Residency
-
2017 — Schloss-Post Web Residencies No. 2 by Solitude & ZKM
- - -

Curated Exhibitions

-
2018 — Make Pictures, bitforms gallery, NYC
-
2014 — Island Girl, Gordilloscudder, Brooklyn, NY
-
2013 — Interludes & Remnants, Gordilloscudder, Brooklyn, NY
- - -

Workshops

-
2019 — Radical Pedagogy I — Flower Eater Drawing Workshop @ Processing Community Day, LA
-
2017 — Programming for Graphic Designers, Yale University School of Art, New Haven, CT
- - -

Teaching Experience

-
2026 — Author in Residence, UCLA Social Software (Casey Reas), Los Angeles, CA
-
2024 — UCLA DMA Summer Section: Interactivity
-
2019 — Assistant Professor of Emerging Digital Practices, Southern Oregon University, Ashland, OR
-
2017 — RDP Lecture & Workshop, Yale University School of Art — Graphic Design, New Haven, CT
-
2016 — Visiting Professor, UCLA Digital Media Arts, Los Angeles, CA
-
2013–2016 — Adjunct Professor, Parsons New School for Design, New York, NY
- - -

Professional Experience

-
2021 — Artist Mentor / Adviser, wild.xyz, San Francisco, CA
-
2017 — Technical Curator, GIPHY, New York, NY
-
2016 — Contractor, Kickstarter, Brooklyn, NY
-
2016 — Contractor, New Art Dealers Association & Linked by Air, New York, NY
-
2013–2014 — Linked by Air, New York, NY
-
2013–2014 — Partner — Gordilloscudder gallery, New York, NY
-
2013 — Programmer — allmyfriendsatonce.com, New York, NY
-
2012–2013 — Web Development — New York & Los Angeles Art Book Fair, Printed Matter, New York, NY
-
2012 — Teaching Assistant for Johannes DeYoung, Yale School of Art, New Haven, CT
-
2012 — art.yale.edu Student Administrator, Yale School of Art, New Haven, CT
-
2012 — Checkout Assistant — Digital Media Center for the Arts, Yale University, New Haven, CT
-
2011 — Studio Assistant — Nathan Skiles, Sarasota, FL
-
2010 — Children's Activity Programmer — Travels With Max Books, Naples, FL
-
2010 — Information Technology Assistant — Ringling College of Art + Design, Sarasota, FL
-
2009 — Gallery Assistant — Ringling College of Art + Design, Sarasota, FL
-
2007 — Dishwasher — The Perch Restaurant, Denali, AK
-
2004–2006 — Boys Gymnastics Coach — East Bay Gymnastics, Bristol, RI
- -