Monorepo for Aesthetic.Computer aesthetic.computer
4
fork

Configure Feed

Select the types of activity you want to include in your feed.

papers/cv: LaTeX curriculum vitae, replacing the puppeteer-rendered PDF

- papers/cv/cv.tex is the source for https://papers.aesthetic.computer/
jeffrey-alan-scudder-cv.pdf. Single-column letter, small-caps section
headings with a thin rule, year/body hanging-indent list, AC color
palette for links. Builds with xelatex (MacTeX) or tectonic.
- Register cv in papers/cli.mjs PAPER_MAP so `npm run papers publish`
picks it up.
- Drop the headless-Chrome build-cv-pdf.mjs + cv:pdf scripts — the PDF
is now a real LaTeX document alongside the arxiv-* papers.

The /cv page's "Download PDF" link is unchanged (same filename); the
bytes it serves are now the ~33 KB LaTeX build, containing only the CV
listings (the bio narrative stays on the HTML page).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

+372 -181
-2
package.json
··· 17 17 "test:kidlisp-wasm:audio": "jasmine spec/kidlisp-wasm-sonic-spec.mjs", 18 18 "papers": "node papers/cli.mjs", 19 19 "papers:publish": "node papers/cli.mjs publish", 20 - "cv:pdf": "node system/public/justanothersystem.org/build-cv-pdf.mjs", 21 - "cv:pdf:file": "node system/public/justanothersystem.org/build-cv-pdf.mjs --file", 22 20 "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", 23 21 "filter": "cd shared; node --experimental-repl-await -i -e \"import('./filter.mjs').then(m => global.filter = m.filter)\"", 24 22 "chat": "echo '\n💬 Chat\n';",
+5
papers/cli.mjs
··· 191 191 title: "The URL Tradition", 192 192 psycho: true, 193 193 }, 194 + "cv": { 195 + base: "cv", 196 + siteName: "jeffrey-alan-scudder-cv", 197 + title: "Jeffrey Alan Scudder — CV", 198 + }, 194 199 }; 195 200 196 201 function texName(base, lang) {
papers/cv/cv.pdf

This is a binary file and will not be displayed.

+367
papers/cv/cv.tex
··· 1 + % !TEX program = xelatex 2 + % Jeffrey Alan Scudder — Curriculum Vitae 3 + % Source of truth lives alongside justanothersystem.org/cv (the HTML version). 4 + % The HTML carries the bio narrative + portrait slideshow; this PDF is the 5 + % CV listings only, per the site footer link "Download PDF". 6 + % 7 + % Build (from the papers/cv directory): 8 + % tectonic -X compile cv.tex # produces cv.pdf 9 + % # or, if you have MacTeX: 10 + % xelatex cv.tex 11 + 12 + \documentclass[10pt,letterpaper]{article} 13 + 14 + % === GEOMETRY === 15 + \usepackage[top=0.75in, bottom=0.75in, left=0.9in, right=0.9in]{geometry} 16 + 17 + % === FONTS === 18 + % Use Latin Modern via its lmodern package so the document compiles with 19 + % either MacTeX (system fonts) or Tectonic (package-bundled OTFs) without 20 + % requiring the "Latin Modern Roman" family to be installed system-wide. 21 + \usepackage{fontspec} 22 + \setmainfont[ 23 + Extension = .otf, 24 + UprightFont = lmroman10-regular, 25 + BoldFont = lmroman10-bold, 26 + ItalicFont = lmroman10-italic, 27 + BoldItalicFont = lmroman10-bolditalic, 28 + ]{lmroman10} 29 + \setsansfont[ 30 + Extension = .otf, 31 + UprightFont = lmsans10-regular, 32 + BoldFont = lmsans10-bold, 33 + ItalicFont = lmsans10-oblique, 34 + ]{lmsans10} 35 + \setmonofont[ 36 + Extension = .otf, 37 + UprightFont = lmmono10-regular, 38 + ItalicFont = lmmono10-italic, 39 + Scale = 0.85, 40 + ]{lmmono10} 41 + 42 + % === PACKAGES === 43 + \usepackage{xcolor} 44 + \usepackage{titlesec} 45 + \usepackage{enumitem} 46 + \usepackage{fancyhdr} 47 + \usepackage{hyperref} 48 + \usepackage{microtype} 49 + \usepackage{parskip} 50 + 51 + % === COLORS (AC palette — shared with arxiv-* papers) === 52 + \definecolor{acpink}{RGB}{180,72,135} 53 + \definecolor{acpurple}{RGB}{120,80,180} 54 + \definecolor{acdark}{RGB}{64,56,74} 55 + \definecolor{acgray}{RGB}{119,119,119} 56 + 57 + % === HYPERREF === 58 + \hypersetup{ 59 + colorlinks=true, 60 + linkcolor=acpurple, 61 + urlcolor=acpurple, 62 + citecolor=acpurple, 63 + pdfauthor={Jeffrey Alan Scudder}, 64 + pdftitle={Jeffrey Alan Scudder --- Curriculum Vitae}, 65 + pdfsubject={Curriculum Vitae}, 66 + pdfkeywords={Jeffrey Alan Scudder, CV, Aesthetic Computer, Whistlegraph, Radical Digital Painting}, 67 + } 68 + 69 + % === SECTION FORMATTING === 70 + % Small-caps uppercase title with a thin gray rule underneath, matching 71 + % the section feel of the arxiv-* papers without pulling in the working- 72 + % draft watermark from ac-paper-layout.sty. 73 + \titleformat{name=\section,numberless}[block] 74 + {\normalfont\bfseries\small\color{acdark}} 75 + {} 76 + {0pt} 77 + {\MakeUppercase} 78 + [\vspace{-0.25em}{\color{acgray}\rule{\linewidth}{0.4pt}}] 79 + \titlespacing*{\section}{0pt}{1.4em}{0.5em} 80 + 81 + % === HEADER / FOOTER === 82 + \pagestyle{fancy} 83 + \fancyhf{} 84 + \renewcommand{\headrulewidth}{0pt} 85 + \fancyhead[L]{\footnotesize\color{acgray} Jeffrey Alan Scudder --- Curriculum Vitae} 86 + \fancyhead[R]{\footnotesize\color{acgray}\href{https://justanothersystem.org/cv}{justanothersystem.org/cv}} 87 + \fancyfoot[C]{\footnotesize\color{acgray}\thepage} 88 + 89 + \fancypagestyle{firstpage}{% 90 + \fancyhf{}% 91 + \renewcommand{\headrulewidth}{0pt}% 92 + \fancyfoot[C]{\footnotesize\color{acgray}\thepage}% 93 + } 94 + 95 + % === ENTRY ENVIRONMENT === 96 + % cv@entry renders a "year --- body" line with a hanging indent so wrapped 97 + % lines line up under the body text, not under the year. 98 + \newlength{\cvyearwidth} 99 + \setlength{\cvyearwidth}{5em} 100 + \newenvironment{cvlist}{% 101 + \begin{list}{}{% 102 + \setlength{\leftmargin}{\cvyearwidth}% 103 + \setlength{\labelwidth}{\cvyearwidth}% 104 + \setlength{\labelsep}{0.4em}% 105 + \setlength{\itemsep}{0.15em}% 106 + \setlength{\parsep}{0pt}% 107 + \setlength{\topsep}{0.2em}% 108 + \renewcommand{\makelabel}[1]{\color{acgray}\small ##1\hfill}% 109 + }% 110 + }{\end{list}} 111 + \newcommand{\cv}[2]{\item[#1] #2} 112 + 113 + % === PARAGRAPH SETTINGS === 114 + \setlength{\parindent}{0pt} 115 + \setlength{\parskip}{0.25em} 116 + 117 + % Avoid bad breaks in lists on short pages 118 + \widowpenalty=10000 119 + \clubpenalty=10000 120 + 121 + \begin{document} 122 + \thispagestyle{firstpage} 123 + 124 + % ============ HEADER BLOCK ============ 125 + \begin{center} 126 + {\fontsize{22pt}{24pt}\selectfont\color{acdark}\textbf{Jeffrey Alan Scudder}}\par 127 + \vspace{0.25em} 128 + {\small\color{acpink} Curriculum Vitae}\par 129 + \vspace{0.6em} 130 + {\small 131 + \href{https://jas.life}{jas.life} \; \textperiodcentered \; 132 + \href{mailto:me@jas.life}{me@jas.life} \; \textperiodcentered \; 133 + \href{mailto:mail@aesthetic.computer}{mail@aesthetic.computer}\\[0.2em] 134 + TikTok: \href{https://tiktok.com/@whistlegraph}{@whistlegraph}, 135 + \href{https://tiktok.com/@aesthetic.computer}{@aesthetic.computer} \; \textperiodcentered \; 136 + Bluesky: \href{https://bsky.app/profile/aesthetic.computer}{@aesthetic.computer}\\[0.2em] 137 + Instagram: \href{https://instagram.com/whistlegraph}{@whistlegraph}, 138 + \href{https://instagram.com/aesthetic.computer}{@aesthetic.computer} 139 + }\par 140 + \end{center} 141 + 142 + \vspace{0.6em} 143 + {\color{acgray}\rule{\linewidth}{0.4pt}} 144 + \vspace{0.4em} 145 + 146 + % ============ GEO LOG ============ 147 + \section*{Geo. Log} 148 + \begin{cvlist} 149 + \cv{2025}{Los Angeles, CA} 150 + \cv{2023}{New York, NY} 151 + \cv{2019}{Ashland, OR} 152 + \cv{2018}{Berkeley, CA} 153 + \cv{2017}{Los Angeles, CA} 154 + \cv{2016}{Bridgton, ME} 155 + \cv{2013}{Brooklyn, NY} 156 + \cv{2011}{New Haven, CT} 157 + \cv{2007}{Sarasota, FL} 158 + \cv{1989}{Assonet, MA (Born)} 159 + \end{cvlist} 160 + 161 + % ============ EDUCATION ============ 162 + \section*{Education} 163 + \begin{cvlist} 164 + \cv{2013}{Yale School of Art --- MFA} 165 + \cv{2011}{Ringling College of Art + Design --- BFA} 166 + \cv{2010}{AICAD New York Studio Program Residency} 167 + \cv{2006}{Ringling College of Art + Design PreCollege Perspective} 168 + \cv{2007}{Apponequet Regional High School} 169 + \end{cvlist} 170 + 171 + % ============ PRESS ============ 172 + \section*{Press, Interviews, Articles and Pages} 173 + \begin{cvlist} 174 + \cv{2023}{\href{https://kadist.org/work/rdp-98-jas-17-4-16-17-03}{Kadist Foundation Artwork Profile}} 175 + \cv{2023}{\href{https://dirt.fyi/article/2023/09/whistlegraph}{Whistlegraph --- A new audience for generative art}, Dirt} 176 + \cv{2023}{\href{https://sexmag.shop/products/the-whistlegraph-zine}{Sex: The Whistlegraph Zine}, interviews by Asher Penn, essays by Jacob Ciocci \& Perry} 177 + \cv{2022}{\href{https://feralfile.com/journal/close-up/whistlegraph-doodling-clockwork-in-lore-and-score}{Doodling Clockwork in Lore and Score}, Dorothy Howard, Feral File} 178 + \cv{2019}{\href{https://soundcloud.com/theartword/9-jeffrey-alan-scudder-on}{On Radical Digital Painting}, The Artword Podcast} 179 + \cv{2019}{\href{https://thecreativeindependent.com/weekends/drawing-is-the-best-videogame-by-jeffrey-alan-scudder}{Drawing is the best videogame}, The Creative Independent} 180 + \cv{2018}{\href{https://www.are.na/blog/podcast/2018/09/25/radical-digital-painting.html}{Radical Digital Painting \& Political Rock}, Are.na Blog} 181 + \cv{2018}{Harvard Advocate, Winter 2018, \emph{Noise}} 182 + \cv{2017}{\href{https://rhizome.org/editorial/2017/dec/05/Artist-Profile-Jeffrey-Alan-Scudder}{Rhizome Artist Profile: Jeffrey Alan Scudder (Jeffrey Heart)}} 183 + \cv{2017}{\href{https://schloss-post.com/manifesto-radical-digital-painting}{A Manifesto for Radical Digital Painting}, Schlosspost} 184 + \cv{2017}{\href{https://www.artsy.net/article/artsy-editorial-microsoft-paints-influence-artists-bigger}{Microsoft Paint's Influence on Artists Is Bigger Than You Might Think}, Artsy} 185 + \end{cvlist} 186 + 187 + % ============ LECTURES ============ 188 + \section*{Lectures, Conferences \& Performances} 189 + \begin{cvlist} 190 + \cv{2025}{Talk @ El Cid, Los Angeles, CA} 191 + \cv{2020}{New Dynamic Graphics: Whistlegraph Recital @ Korea HCI 2020} 192 + \cv{2019}{New Dynamic Graphics @ India HCI 19, Hyderabad, India} 193 + \cv{2019}{VJ @ Internet Archive's World Night Market w/ Patrick Vogel, San Francisco} 194 + \cv{2019}{RDP @ SF Art Book Fair w/ Alex Freundlich} 195 + \cv{2019}{RDP \& VJ @ Internet Archive's DWeb Camp w/ Alex Freundlich} 196 + \cv{2019}{RDP @ Yale --- IEEE GEM Conference} 197 + \cv{2019}{\href{http://www.raflost.is/jeffrey-alan-scudder}{RDP @ RAFLOST Festival, Iceland}} 198 + \cv{2019}{\href{https://www.youtube.com/watch?v=xZMsXPgg_9U}{Radical Digital Painting w/ Ella Fleck (650mAh) @ Weber State University}} 199 + \cv{2019}{\href{https://www.instagram.com/p/BtY342PFPpO}{Island Crisis w/ Artur Erman, San Juan, PR}} 200 + \cv{2019}{\href{https://day.processing.org/pcd-la-tracks.html}{Radical Pedagogy I --- Flower Eater Drawing Workshop @ Processing Community Day, LA}} 201 + \cv{2018}{\href{https://media.ccc.de/v/35c3-9774-radical_digital_painting}{RDP (JAS on Paper), 35c3: Chaos Communication Congress, Leipzig}} 202 + \cv{2018}{RDP (JAS on Paper), The House on Sunset, Los Angeles, CA} 203 + \cv{2018}{RDP (JAS on Paper), 1 Thoresby St. w/ Leon Sadler, Nottingham, UK} 204 + \cv{2018}{RDP (JAS on Paper) w/ GP\&PLS, Centrala, Birmingham, UK} 205 + \cv{2018}{RDP (JAS on Paper) w/ GP\&PLS, Colchester Arts Center, Colchester, UK} 206 + \cv{2018}{RDP (JAS on Paper) w/ GP\&PLS, Cafe OTO, London, UK} 207 + \cv{2018}{RDP (JAS on Paper), Gazelli Art House, London, UK} 208 + \cv{2018}{\href{https://www.youtube.com/watch?v=ndz-co7Xpn8}{RDP (JAS on Paper), Digital Painting Class, Sibelius Academy, Helsinki}} 209 + \cv{2018}{\href{http://650mah.com/drawing-is-the-best-videogame.html}{RDP (Drawing is the Best Videogame), Hove, UK}} 210 + \cv{2018}{RDP (JAS on Paper) Yale School of Art (Painting), New Haven, CT} 211 + \cv{2018}{RDP (JAS on Paper) generate!\_lab meets Querfeldein, Tubingen, Germany} 212 + \cv{2018}{RDP (JAS on Paper) One Night in Club Danger, curated by Taissa Fromme, Apolda, Germany} 213 + \cv{2018}{RDP (JAS on Paper) Bauhaus University: Arts, Weimar, Germany} 214 + \cv{2018}{RDP (JAS on Paper) w/ GP\&PLS (Rowan van As) Serendip Festival, Paris} 215 + \cv{2018}{RDP (JAS on Paper) Klasse Digitale Grafik | HFBK, Hamburg, Germany} 216 + \cv{2018}{RDP (JAS on Paper) Exploration Laboratory @ Sibelius Academy, Helsinki} 217 + \cv{2018}{RDP (JAS on Paper) Jan van Eyck Academie, Maastricht, Holland} 218 + \cv{2018}{Radical Digital Painting \& Political Rock @ Erratum Galerie, Berlin} 219 + \cv{2018}{RDP (JAS on Paper) w/ Goodiepal \& Pals, Kammer-Pop, Hamburg} 220 + \cv{2018}{RDP (JAS on Paper) w/ Goodiepal \& Pals, Dans for voksne, Oslo} 221 + \cv{2018}{RDP (JAS on Paper) w/ Dalin, Rowan \& Ben, Open Forum, Oslo National Academy of the Arts} 222 + \cv{2018}{RDP (JAS on Paper) @ Royal Institute of Art, Stockholm} 223 + \cv{2018}{RDP (JAS on Paper) @ Estonian Academy of Arts, Tallinn} 224 + \cv{2018}{RDP (JAS on Paper) w/ GP\&PLS, dodo.org HarFest, Helsinki} 225 + \cv{2018}{RDP (JAS on Paper) w/ GP\&PLS, Mayhem, Copenhagen} 226 + \cv{2018}{RDP (JAS on Paper) Det Jyske Kunstakademi, Aarhus, Denmark} 227 + \cv{2018}{RDP (JAS on Paper) w/ Goodiepal \& Pals, Louisiana Museum Literature Festival} 228 + \cv{2018}{RDP (JAS on Paper) w/ Goodiepal \& Pals, KUNSTHAL AARHUS} 229 + \cv{2018}{RDP (JAS on Paper) w/ Goodiepal \& Pals, Spanien 19C, Aarhus} 230 + \cv{2018}{RDP (JAS on Paper) w/ Goodiepal \& Pals, West Germany Venue, Berlin} 231 + \cv{2018}{RDP @ Headquarters, Asheville, NC} 232 + \cv{2018}{\href{https://www.instagram.com/p/BlTvNt-BJQ5DbNzzsEGyegK0-f4Uz7O1MwEAB80/?taken-by=justanothersystem}{RDP @ Pioneer Works, Brooklyn, NY}} 233 + \cv{2018}{\href{https://www.youtube.com/watch?v=Up2-myTEviE}{RDP Malibu w/ Matty Mo, Malibu, CA}} 234 + \cv{2018}{RDP Lecture @ Johannes Vogt Gallery, NYC} 235 + \cv{2018}{RDP (x2) @ RISD Foundations w/ Travess Smalley's students, Providence, RI} 236 + \cv{2018}{RDP @ UC Santa Barbara, Santa Barbara, CA} 237 + \cv{2018}{\href{https://www.facebook.com/events/2058744684449454}{In conversation | on drawing, animation, and coding systems, makeroom.la, LA}} 238 + \cv{2018}{RDP @ Harvard Advocate's \emph{Noise} Launch Party, Boston, MA} 239 + \cv{2018}{RDP @ SUNY Purchase, NY} 240 + \cv{2018}{\href{https://www.facebook.com/events/1901578033465958}{Casey Reas \& Jeffrey Alan Scudder in Conversation, bitforms gallery, NYC}} 241 + \cv{2018}{\href{https://www.youtube.com/watch?v=533s7uZ35rQ}{RDP @ 1st Annual HASH Award, ZKM, Karlsruhe}} 242 + \cv{2018}{RDP @ Coaxial Arts in LA} 243 + \cv{2017}{\href{https://justanothersystem.org}{Radical Digital Painting Northeast US Lecture Tour w/ JAS Team} (Parsons, Victoria's Basement, Rutgers, RISD, UMASS, Harvard, Temple University, Baltimore, Yale, Kimberly-Klark)} 244 + \cv{2017}{\href{https://vimeo.com/230450728}{RDP @ Cafe OTO, London}} 245 + \cv{2017}{\href{https://youtu.be/9Ry0Dwa-gbA}{RDP @ RBABARRAB, Copenhagen}} 246 + \cv{2017}{\href{http://neumeisterbaram.com/event/jeffrey-alan-scudder-radical-digital-painting}{RDP @ Neumeister Bar-Am, Berlin}} 247 + \cv{2017}{RDP @ GIPHY's TIME\_FRAME Exhibition} 248 + \cv{2017}{\href{https://youtu.be/_5YLPA_3l2I}{Radical Digital Painting @ Oberlin College}} 249 + \cv{2017}{\href{https://youtu.be/OAtstjg7owU}{JAS: In The Grid @ Babycastles, New York}} 250 + \cv{2016}{Explained Pictures Basement Show --- Victoria Sobel's Basement, Brooklyn, NY} 251 + \cv{2016}{\href{https://www.youtube.com/watch?v=Zf-COj81KYw}{Explained Pictures, The New School, New York}} 252 + \cv{2016}{Guest Lecturer: Projects Class, Cooper Union, New York} 253 + \cv{2015}{\href{http://aigany.org/event/history-of-the-web-part-2}{History of the Web Part II, AIGA/NY, New York}} 254 + \cv{2015}{\href{http://ieee-gem.org}{Arts Panel, IEEE GEM Conference, Toronto, Canada}} 255 + \end{cvlist} 256 + 257 + % ============ SOLO EXHIBITIONS ============ 258 + \section*{Solo Exhibitions} 259 + \begin{cvlist} 260 + \cv{2022}{\href{https://feralfile.com/exhibitions/ten-whistlegraphs-thv}{Ten Whistlegraphs}, Feral File (w/ Whistlegraph)} 261 + \cv{2018}{Radical Digital Painting: Los Angeles, The Newsstand Project \& CAP, Los Angeles, CA} 262 + \cv{2017}{\href{https://left.gallery/tumpin}{Tumpin}, left.gallery, Online} 263 + \cv{2017}{\href{https://youtu.be/EvtZbcvuV48}{Imaginary Screenshots}, Whitcher Projects, Los Angeles, CA} 264 + \cv{2016}{\href{http://www.essexflowers.us/commissions/jeffreyscudder/}{No Paint: Release One}, Essex Flowers (Digital Commission), Website} 265 + \cv{2016}{\href{http://screen-space.info}{What do we see when we close our eyes?}, SCREEN\_, Email} 266 + \cv{2013}{\href{http://parallelograms.info/78-JS}{Attn: Trap}, Parallelograms, World Wide Web} 267 + \cv{2008}{Open Your Heart To Me, Crossley Gallery, Sarasota, FL} 268 + \end{cvlist} 269 + 270 + % ============ GROUP EXHIBITIONS ============ 271 + \section*{Group Exhibitions} 272 + \begin{cvlist} 273 + \cv{2026}{47th Venice Family Clinic Art Exhibition + Auction, 910 Abbot Kinney Blvd, Venice, CA} 274 + \cv{2025}{Turbo Cheap (inaugural exhibition), Los Angeles, CA} 275 + \cv{2019}{\href{https://blog.archive.org/2019/06/22/the-internet-archives-2019-artist-in-residency-exhibition}{Internet Archive Artist in Residency Exhibition}} 276 + \cv{2018}{\href{http://www.650mah.com/drawings.html}{drawings}, 650mAh} 277 + \cv{2018}{INTENTIONS BASED ON A FUTURE WHICH HAS ALREADY HAPPENED (curated by Alex Corbett), Naming Gallery, Oakland, CA} 278 + \cv{2018}{Radical Digital Painting w/ Julia Yerger, Johannes Vogt Gallery, NYC} 279 + \cv{2018}{OPEN CODES (Schloss Solitude Web Residencies), ZKM, Karlsruhe} 280 + \cv{2017}{\href{http://february.today/drawinghomework}{drawinghomework.net Presents}, February Gallery, Austin, TX} 281 + \cv{2017}{\href{http://neumeisterbaram.com/exhibition/newdawn}{New Dawn}, Neumeister Bar-Am, Berlin} 282 + \cv{2017}{\href{http://konstanet.com}{Coping Copy}, Konstanet, Online} 283 + \cv{2016}{Becoming That, becomingthat.com, curated by Levi Easterbrooks, Online} 284 + \cv{2016}{\href{http://www.drawinghomework.net/jeffrey.html}{Drawing Homework}, Online} 285 + \cv{2015}{VIDEO MIXER, Yale School of Art, New Haven, CT} 286 + \cv{2015}{P.S.1 Commencement, ALLGOLD @ MoMA PS1 Printshop, Long Island City, NY} 287 + \cv{2015}{RENDER SERIES (3), ALLGOLD @ MoMA PS1 Printshop, Long Island City, NY} 288 + \cv{2015}{Clorox/Envy, STILL HOUSE GROUP, Brooklyn, NY} 289 + \cv{2013}{`Toonskin, Artspace, New Haven, CT} 290 + \cv{2013}{APARTMENT SHOW --- Hosted by Nouriel Roubini, Nouriel Roubini's Apartment, New York, NY} 291 + \cv{2013}{Yale Sculpture MFA Thesis Exhibition, Yale School of Art, New Haven, CT} 292 + \cv{2013}{``Now that I have your attention, what do I do with it?'', New York Studio Program, Brooklyn, NY} 293 + \cv{2012}{3rd Floor, The New Haven Business Center, New Haven, CT} 294 + \cv{2012}{MFA 2013 Second Year Show, Yale School of Art, New Haven, CT} 295 + \cv{2011}{Frais Peint MFA 2013 First Year Show, Yale School of Art, New Haven, CT} 296 + \cv{2011}{1408: Group Show, 1408 Art Space (Joint Collective), Sarasota, FL} 297 + \cv{2011}{Fine Arts BFA Thesis Exhibition, Crossley Gallery, Sarasota, FL} 298 + \cv{2011}{SURPLUS, curated by RCAD Senior Thesis Class, Sarasota, FL} 299 + \cv{2011}{Best of Ringling (President's Award), curated by Chie Fueki, RCAD, Sarasota, FL} 300 + \cv{2011}{NUGENT \textperiodcentered{} PHILLIPS \textperiodcentered{} SCUDDER --- Compulsory Thesis Exhibition, Crossley Gallery, Sarasota, FL} 301 + \cv{2010}{Best of Ringling 2010, curated by Jay Davis, RCAD, Sarasota, FL} 302 + \cv{2009}{Advanced Drawing, with Bradley Wester's Junior Advanced Drawing, Crossley Gallery, Sarasota, FL} 303 + \cv{2009}{OPEN, with Bradley Wester's Fine Arts Painting III, Crossley Gallery, Sarasota, FL} 304 + \cv{2009}{no ones little grr, with Jenny Vu and Sarah Valdez, Crossley Gallery, Sarasota, FL} 305 + \cv{2009}{The New Easy, curated by Lars Eijssen, Artnews Projects, Berlin} 306 + \cv{2009}{No Bad Memories, with the NYSP class of Spring 2009, New York Studio Program, Brooklyn, NY} 307 + \cv{2008}{Best of Ringling 2008 (Juror's Award), curated by Dominique Nahas, RCAD, Sarasota, FL} 308 + \cv{2008}{Realia, curated by Kayla Carlson, Big E's, Sarasota, FL} 309 + \end{cvlist} 310 + 311 + % ============ RESIDENCIES ============ 312 + \section*{Residencies} 313 + \begin{cvlist} 314 + \cv{2026}{Author in Residence, UCLA Social Software (Casey Reas), Los Angeles, CA} 315 + \cv{2018}{\href{http://gazell.io/author/jeffreyas}{Gazell.io Art House Web Residency}} 316 + \cv{2017}{\href{https://tenminutepainting.com}{Schloss-Post Web Residencies No.~2} by Solitude \& ZKM} 317 + \end{cvlist} 318 + 319 + % ============ CURATED EXHIBITIONS ============ 320 + \section*{Curated Exhibitions} 321 + \begin{cvlist} 322 + \cv{2018}{\href{http://www.bitforms.com/exhibitions/exhibition-history/make-pictures/make-pictures-2018}{Make Pictures}, bitforms gallery, NYC} 323 + \cv{2014}{Island Girl, Gordilloscudder, Brooklyn, NY} 324 + \cv{2013}{Interludes \& Remnants, Gordilloscudder, Brooklyn, NY} 325 + \end{cvlist} 326 + 327 + % ============ WORKSHOPS ============ 328 + \section*{Workshops} 329 + \begin{cvlist} 330 + \cv{2019}{\href{https://day.processing.org/pcd-la-tracks.html}{Radical Pedagogy I --- Flower Eater Drawing Workshop @ Processing Community Day, LA}} 331 + \cv{2017}{Programming for Graphic Designers, Yale University School of Art, New Haven, CT} 332 + \end{cvlist} 333 + 334 + % ============ TEACHING ============ 335 + \section*{Teaching Experience} 336 + \begin{cvlist} 337 + \cv{2026}{Author in Residence, UCLA Social Software (Casey Reas), Los Angeles, CA} 338 + \cv{2024}{UCLA DMA Summer Section: Interactivity} 339 + \cv{2019}{Assistant Professor of Emerging Digital Practices, Southern Oregon University, Ashland, OR} 340 + \cv{2017}{RDP Lecture \& Workshop, Yale University School of Art --- Graphic Design, New Haven, CT} 341 + \cv{2016}{Visiting Professor, UCLA Digital Media Arts, Los Angeles, CA} 342 + \cv{2013--2016}{Adjunct Professor, Parsons New School for Design, New York, NY} 343 + \end{cvlist} 344 + 345 + % ============ PROFESSIONAL EXPERIENCE ============ 346 + \section*{Professional Experience} 347 + \begin{cvlist} 348 + \cv{2021}{Artist Mentor / Adviser, \href{https://wild.xyz}{wild.xyz}, San Francisco, CA} 349 + \cv{2017}{Technical Curator, GIPHY, New York, NY} 350 + \cv{2016}{Contractor, Kickstarter, Brooklyn, NY} 351 + \cv{2016}{Contractor, New Art Dealers Association \& Linked by Air, New York, NY} 352 + \cv{2013--2014}{Linked by Air, New York, NY} 353 + \cv{2013--2014}{Partner --- \href{http://gordilloscudder.com}{Gordilloscudder gallery}, New York, NY} 354 + \cv{2013}{Programmer --- allmyfriendsatonce.com, New York, NY} 355 + \cv{2012--2013}{Web Development --- New York \& Los Angeles Art Book Fair, Printed Matter, New York, NY} 356 + \cv{2012}{Teaching Assistant for Johannes DeYoung, Yale School of Art, New Haven, CT} 357 + \cv{2012}{art.yale.edu Student Administrator, Yale School of Art, New Haven, CT} 358 + \cv{2012}{Checkout Assistant --- Digital Media Center for the Arts, Yale University, New Haven, CT} 359 + \cv{2011}{Studio Assistant --- Nathan Skiles, Sarasota, FL} 360 + \cv{2010}{Children's Activity Programmer --- Travels With Max Books, Naples, FL} 361 + \cv{2010}{Information Technology Assistant --- Ringling College of Art + Design, Sarasota, FL} 362 + \cv{2009}{Gallery Assistant --- Ringling College of Art + Design, Sarasota, FL} 363 + \cv{2007}{Dishwasher --- The Perch Restaurant, Denali, AK} 364 + \cv{2004--2006}{Boys Gymnastics Coach --- East Bay Gymnastics, Bristol, RI} 365 + \end{cvlist} 366 + 367 + \end{document}
-179
system/public/justanothersystem.org/build-cv-pdf.mjs
··· 1 - #!/usr/bin/env node 2 - // build-cv-pdf.mjs — Generate jeffrey-alan-scudder-cv.pdf from cv.html. 3 - // 4 - // Renders /cv via a local Caddy dev server (preferred) or falls back to 5 - // rendering the local file directly, then prints to PDF using headless 6 - // Chrome through puppeteer-core. The output lands in 7 - // system/public/papers.aesthetic.computer/ so papers.aesthetic.computer 8 - // serves it at https://papers.aesthetic.computer/jeffrey-alan-scudder-cv.pdf. 9 - // 10 - // Usage: 11 - // node build-cv-pdf.mjs # render http://localhost:8111/cv 12 - // node build-cv-pdf.mjs --file # render the local cv.html file 13 - // node build-cv-pdf.mjs --url https://justanothersystem.org/cv 14 - 15 - import { existsSync, mkdirSync } from "node:fs"; 16 - import { fileURLToPath, pathToFileURL } from "node:url"; 17 - import { dirname, join, resolve } from "node:path"; 18 - import { createRequire } from "node:module"; 19 - 20 - const require = createRequire(import.meta.url); 21 - const __dirname = dirname(fileURLToPath(import.meta.url)); 22 - 23 - const SITE_DIR = __dirname; 24 - const PUBLIC_DIR = resolve(SITE_DIR, ".."); 25 - const PAPERS_DIR = resolve(PUBLIC_DIR, "papers.aesthetic.computer"); 26 - const OUTPUT_PDF = join(PAPERS_DIR, "jeffrey-alan-scudder-cv.pdf"); 27 - 28 - const DEFAULT_URL = "http://localhost:8111/cv"; 29 - const FALLBACK_FILE = pathToFileURL(join(SITE_DIR, "cv.html")).href; 30 - 31 - const CHROME_CANDIDATES = [ 32 - process.env.PUPPETEER_EXECUTABLE_PATH, 33 - "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", 34 - "/Applications/Chromium.app/Contents/MacOS/Chromium", 35 - "/usr/bin/google-chrome", 36 - "/usr/bin/chromium", 37 - "/usr/bin/chromium-browser", 38 - ].filter(Boolean); 39 - 40 - function pickChrome() { 41 - for (const p of CHROME_CANDIDATES) { 42 - if (existsSync(p)) return p; 43 - } 44 - throw new Error( 45 - "No Chrome/Chromium found. Set PUPPETEER_EXECUTABLE_PATH to a Chrome binary.", 46 - ); 47 - } 48 - 49 - function parseArgs(argv) { 50 - const args = { url: null, useFile: false }; 51 - for (let i = 2; i < argv.length; i++) { 52 - const a = argv[i]; 53 - if (a === "--file") args.useFile = true; 54 - else if (a === "--url") args.url = argv[++i]; 55 - } 56 - return args; 57 - } 58 - 59 - async function main() { 60 - const { url: urlArg, useFile } = parseArgs(process.argv); 61 - 62 - let puppeteer; 63 - try { 64 - puppeteer = require("puppeteer-core"); 65 - } catch { 66 - puppeteer = require("puppeteer"); 67 - } 68 - 69 - if (!existsSync(PAPERS_DIR)) mkdirSync(PAPERS_DIR, { recursive: true }); 70 - 71 - const target = useFile ? FALLBACK_FILE : urlArg || DEFAULT_URL; 72 - const executablePath = pickChrome(); 73 - 74 - console.log(`[cv-pdf] chrome: ${executablePath}`); 75 - console.log(`[cv-pdf] target: ${target}`); 76 - console.log(`[cv-pdf] output: ${OUTPUT_PDF}`); 77 - 78 - const browser = await puppeteer.launch({ 79 - executablePath, 80 - headless: "new", 81 - args: ["--no-sandbox", "--disable-dev-shm-usage"], 82 - }); 83 - 84 - try { 85 - const page = await browser.newPage(); 86 - await page.emulateMediaType("print"); 87 - 88 - try { 89 - await page.goto(target, { 90 - waitUntil: "networkidle0", 91 - timeout: 60_000, 92 - }); 93 - } catch (err) { 94 - if (!useFile && !urlArg) { 95 - console.warn( 96 - `[cv-pdf] ${DEFAULT_URL} failed (${err.message}); falling back to ${FALLBACK_FILE}`, 97 - ); 98 - await page.goto(FALLBACK_FILE, { 99 - waitUntil: "networkidle0", 100 - timeout: 60_000, 101 - }); 102 - } else { 103 - throw err; 104 - } 105 - } 106 - 107 - // Downsample the hero portrait to a small inline JPEG so the PDF 108 - // doesn't embed 25 MB of CDN source photos. We keep only the first 109 - // slide, render it to a ~360 px wide canvas, and replace the src 110 - // with the resulting data URL. 111 - await page.evaluate(async () => { 112 - if (document.fonts?.ready) await document.fonts.ready; 113 - 114 - const portrait = document.getElementById("heroSlideshow"); 115 - if (portrait) { 116 - const first = portrait.querySelector("img"); 117 - portrait 118 - .querySelectorAll("img:not(:first-child)") 119 - .forEach((el) => el.remove()); 120 - 121 - if (first) { 122 - if (!first.complete) { 123 - await new Promise((res) => { 124 - first.addEventListener("load", res, { once: true }); 125 - first.addEventListener("error", res, { once: true }); 126 - }); 127 - } 128 - 129 - try { 130 - const maxW = 360; 131 - const ratio = first.naturalWidth 132 - ? Math.min(1, maxW / first.naturalWidth) 133 - : 1; 134 - const w = Math.max(1, Math.round(first.naturalWidth * ratio)); 135 - const h = Math.max(1, Math.round(first.naturalHeight * ratio)); 136 - const canvas = document.createElement("canvas"); 137 - canvas.width = w; 138 - canvas.height = h; 139 - const ctx = canvas.getContext("2d"); 140 - ctx.drawImage(first, 0, 0, w, h); 141 - first.src = canvas.toDataURL("image/jpeg", 0.82); 142 - } catch { 143 - // If canvas taint blocks us (CORS), just drop the portrait. 144 - portrait.remove(); 145 - } 146 - } 147 - } 148 - 149 - const remaining = Array.from(document.images); 150 - await Promise.all( 151 - remaining.map((img) => 152 - img.complete 153 - ? null 154 - : new Promise((res) => { 155 - img.addEventListener("load", res, { once: true }); 156 - img.addEventListener("error", res, { once: true }); 157 - }), 158 - ), 159 - ); 160 - }); 161 - 162 - await page.pdf({ 163 - path: OUTPUT_PDF, 164 - format: "letter", 165 - printBackground: true, 166 - preferCSSPageSize: true, 167 - margin: { top: "0.6in", right: "0.6in", bottom: "0.6in", left: "0.6in" }, 168 - }); 169 - 170 - console.log(`[cv-pdf] wrote ${OUTPUT_PDF}`); 171 - } finally { 172 - await browser.close(); 173 - } 174 - } 175 - 176 - main().catch((err) => { 177 - console.error(err); 178 - process.exit(1); 179 - });
system/public/papers.aesthetic.computer/jeffrey-alan-scudder-cv.pdf

This is a binary file and will not be displayed.