Photograph of illustrator, Sarah Doan, standing in front of art supply store smiling

HOWDY
Sarah is a Vietnamese-American author, illustrator of children's books. Her art is inspired by awkward encounters, childhood memories, food, and the celebration of cultures. She lives in Austin with her partner who inspires many of the smiley faces that appear throughout her work. (⑅˘͈ ᵕ ˘͈ )

Sarah is interested in projects related to:
Fantasy & adventure narratives
Goofy/playful humor
Multiculturalism
Beyond her illustration, Sarah also has a passion for fostering community through art. She hosts creative workshops in Austin where people can connect and create. To view the schedule and sign up, visit: sarahtdoan.com/classes

Photograph of illustrator, Sarah Doan, standing in front of art supply store smiling

CONTACT
Rep'd by James McGowan at Bookends Literary Agency

Email me [email protected]


BOOKS
2025 Milo and the Midnight Meteorite, book design
2024 Nari's New Friend
2024 Thinking Outside the Coop, book design
2023 Gracie Goes Golfing


AWARDS
2024 SCBWI Texas Portfolio Honorable Mention
2024 SCBWI Texas Carmen Oliver On-the-Verge
2023 SCBWI Austin Creators of Diverse Worlds
2023 SCBWI Austin Emerging Voice Illustrator Mentorship


EXHIBITS

‣ 2025 Sep (upcoming), Bouldin Creek Cafe, Austin, TX
‣ 2025 Apr-Jun, Rooted: Central Texan Artists in the Asian Diaspora, Asian American Resource Center, Austin, TX
‣ 2025 May, Whimsical Worlds, Twin Oaks Library, Austin, TX
‣ 2024 Kintsugi, Studio Kura, Itoshima, Japan
‣ 2024 Storytelling, BookPeople, Austin, TX
‣ 2024 Have You Eaten Yet?, Twin Oaks Library, Austin, TX


RESOURCES
Learn Procreate from me

Woodland creatures Children Illustrated borders Cozy fantasy Mythical creatures → Gnomes → Goblins → Elves Lush Forests → Trees → Mushrooms → Woodgrain → Ponds → Lily of the valley → Autumn leaves → Logs Weapons → Swords → Shields → Archery Adventurers Me

UPCOMING WORKSHOPS

Get upcoming events with my newsletter Get Crafty ATX ↓

Join Newsletter

(function($) {window.fnames = new Array(); window.ftypes = new Array();fnames[1]='FNAME';ftypes[1]='text';fnames[0]='EMAIL';ftypes[0]='email';fnames[2]='LNAME';ftypes[2]='text';fnames[3]='ADDRESS';ftypes[3]='address';fnames[4]='PHONE';ftypes[4]='phone';fnames[5]='BIRTHDAY';ftypes[5]='birthday';fnames[6]='COMPANY';ftypes[6]='text';}(jQuery));var $mcj = jQuery.noConflict(true); // SMS Phone Multi-Country Functionality if(!window.MC) { window.MC = {}; } window.MC.smsPhoneData = { defaultCountryCode: 'US', programs: [], smsProgramDataCountryNames: [] }; function getCountryUnicodeFlag(countryCode) { return countryCode.toUpperCase().replace(/./g, (char) => String.fromCodePoint(char.charCodeAt(0) + 127397)) }; // HTML sanitization function to prevent XSS function sanitizeHtml(str) { if (typeof str !== 'string') return ''; return str .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, ''') .replace(/\//g, '/'); } // URL sanitization function to prevent javascript: and data: URLs function sanitizeUrl(url) { if (typeof url !== 'string') return ''; const trimmedUrl = url.trim().toLowerCase(); if (trimmedUrl.startsWith('javascript:') || trimmedUrl.startsWith('data:') || trimmedUrl.startsWith('vbscript:')) { return '#'; } return url; } const getBrowserLanguage = () => { if (!window?.navigator?.language?.split('-')[1]) { return window?.navigator?.language?.toUpperCase(); } return window?.navigator?.language?.split('-')[1]; }; function getDefaultCountryProgram(defaultCountryCode, smsProgramData) { if (!smsProgramData || smsProgramData.length === 0) { return null; } const browserLanguage = getBrowserLanguage(); if (browserLanguage) { const foundProgram = smsProgramData.find( (program) => program?.countryCode === browserLanguage, ); if (foundProgram) { return foundProgram; } } if (defaultCountryCode) { const foundProgram = smsProgramData.find( (program) => program?.countryCode === defaultCountryCode, ); if (foundProgram) { return foundProgram; } } return smsProgramData[0]; } function updateSmsLegalText(countryCode, fieldName) { if (!countryCode || !fieldName) { return; } const programs = window?.MC?.smsPhoneData?.programs; if (!programs || !Array.isArray(programs)) { return; } const program = programs.find(program => program?.countryCode === countryCode); if (!program || !program.requiredTemplate) { return; } const legalTextElement = document.querySelector('#legal-text-' + fieldName); if (!legalTextElement) { return; } // Remove HTML tags and clean up the text const divRegex = new RegExp(']*>', 'gi'); const fullAnchorRegex = new RegExp('', 'g'); const anchorRegex = new RegExp('(.*?)'); const requiredLegalText = program.requiredTemplate .replace(divRegex, '') .replace(fullAnchorRegex, '') .slice(0, -1); const anchorMatches = program.requiredTemplate.match(anchorRegex); if (anchorMatches && anchorMatches.length >= 4) { // Create link element safely using DOM methods instead of innerHTML const linkElement = document.createElement('a'); linkElement.href = sanitizeUrl(anchorMatches[1]); linkElement.target = sanitizeHtml(anchorMatches[2]); linkElement.textContent = sanitizeHtml(anchorMatches[3]); legalTextElement.textContent = requiredLegalText + ' '; legalTextElement.appendChild(linkElement); legalTextElement.appendChild(document.createTextNode('.')); } else { legalTextElement.textContent = requiredLegalText + '.'; } } function generateDropdownOptions(smsProgramData) { if (!smsProgramData || smsProgramData.length === 0) { return ''; } return smsProgramData.map(program => { const flag = getCountryUnicodeFlag(program.countryCode); const countryName = getCountryName(program.countryCode); const callingCode = program.countryCallingCode || ''; // Sanitize all values to prevent XSS const sanitizedCountryCode = sanitizeHtml(program.countryCode || ''); const sanitizedCountryName = sanitizeHtml(countryName || ''); const sanitizedCallingCode = sanitizeHtml(callingCode || ''); return ''; }).join(''); } function getCountryName(countryCode) { if (window.MC?.smsPhoneData?.smsProgramDataCountryNames && Array.isArray(window.MC.smsPhoneData.smsProgramDataCountryNames)) { for (let i = 0; i < window.MC.smsPhoneData.smsProgramDataCountryNames.length; i++) { if (window.MC.smsPhoneData.smsProgramDataCountryNames[i].code === countryCode) { return window.MC.smsPhoneData.smsProgramDataCountryNames[i].name; } } } return countryCode; } function getDefaultPlaceholder(countryCode) { if (!countryCode || typeof countryCode !== 'string') { return '+1 000 000 0000'; // Default US placeholder } const mockPlaceholders = [ { countryCode: 'US', placeholder: '+1 000 000 0000', helpText: 'Include the US country code +1 before the phone number', }, { countryCode: 'GB', placeholder: '+44 0000 000000', helpText: 'Include the GB country code +44 before the phone number', }, { countryCode: 'CA', placeholder: '+1 000 000 0000', helpText: 'Include the CA country code +1 before the phone number', }, { countryCode: 'AU', placeholder: '+61 000 000 000', helpText: 'Include the AU country code +61 before the phone number', }, { countryCode: 'DE', placeholder: '+49 000 0000000', helpText: 'Fügen Sie vor der Telefonnummer die DE-Ländervorwahl +49 ein', }, { countryCode: 'FR', placeholder: '+33 0 00 00 00 00', helpText: 'Incluez le code pays FR +33 avant le numéro de téléphone', }, { countryCode: 'ES', placeholder: '+34 000 000 000', helpText: 'Incluya el código de país ES +34 antes del número de teléfono', }, { countryCode: 'NL', placeholder: '+31 0 00000000', helpText: 'Voeg de NL-landcode +31 toe vóór het telefoonnummer', }, { countryCode: 'BE', placeholder: '+32 000 00 00 00', helpText: 'Incluez le code pays BE +32 avant le numéro de téléphone', }, { countryCode: 'CH', placeholder: '+41 00 000 00 00', helpText: 'Fügen Sie vor der Telefonnummer die CH-Ländervorwahl +41 ein', }, { countryCode: 'AT', placeholder: '+43 000 000 0000', helpText: 'Fügen Sie vor der Telefonnummer die AT-Ländervorwahl +43 ein', }, { countryCode: 'IE', placeholder: '+353 00 000 0000', helpText: 'Include the IE country code +353 before the phone number', }, { countryCode: 'IT', placeholder: '+39 000 000 0000', helpText: 'Includere il prefisso internazionale IT +39 prima del numero di telefono', }, ]; const selectedPlaceholder = mockPlaceholders.find(function(item) { return item && item.countryCode === countryCode; }); return selectedPlaceholder ? selectedPlaceholder.placeholder : mockPlaceholders[0].placeholder; } function updatePlaceholder(countryCode, fieldName) { if (!countryCode || !fieldName) { return; } const phoneInput = document.querySelector('#mce-' + fieldName); if (!phoneInput) { return; } const placeholder = getDefaultPlaceholder(countryCode); if (placeholder) { phoneInput.placeholder = placeholder; } } function updateCountryCodeInstruction(countryCode, fieldName) { updatePlaceholder(countryCode, fieldName); } function getDefaultHelpText(countryCode) { const mockPlaceholders = [ { countryCode: 'US', placeholder: '+1 000 000 0000', helpText: 'Include the US country code +1 before the phone number', }, { countryCode: 'GB', placeholder: '+44 0000 000000', helpText: 'Include the GB country code +44 before the phone number', }, { countryCode: 'CA', placeholder: '+1 000 000 0000', helpText: 'Include the CA country code +1 before the phone number', }, { countryCode: 'AU', placeholder: '+61 000 000 000', helpText: 'Include the AU country code +61 before the phone number', }, { countryCode: 'DE', placeholder: '+49 000 0000000', helpText: 'Fügen Sie vor der Telefonnummer die DE-Ländervorwahl +49 ein', }, { countryCode: 'FR', placeholder: '+33 0 00 00 00 00', helpText: 'Incluez le code pays FR +33 avant le numéro de téléphone', }, { countryCode: 'ES', placeholder: '+34 000 000 000', helpText: 'Incluya el código de país ES +34 antes del número de teléfono', }, { countryCode: 'NL', placeholder: '+31 0 00000000', helpText: 'Voeg de NL-landcode +31 toe vóór het telefoonnummer', }, { countryCode: 'BE', placeholder: '+32 000 00 00 00', helpText: 'Incluez le code pays BE +32 avant le numéro de téléphone', }, { countryCode: 'CH', placeholder: '+41 00 000 00 00', helpText: 'Fügen Sie vor der Telefonnummer die CH-Ländervorwahl +41 ein', }, { countryCode: 'AT', placeholder: '+43 000 000 0000', helpText: 'Fügen Sie vor der Telefonnummer die AT-Ländervorwahl +43 ein', }, { countryCode: 'IE', placeholder: '+353 00 000 0000', helpText: 'Include the IE country code +353 before the phone number', }, { countryCode: 'IT', placeholder: '+39 000 000 0000', helpText: 'Includere il prefisso internazionale IT +39 prima del numero di telefono', }, ]; if (!countryCode || typeof countryCode !== 'string') { return mockPlaceholders[0].helpText; } const selectedHelpText = mockPlaceholders.find(function(item) { return item && item.countryCode === countryCode; }); return selectedHelpText ? selectedHelpText.helpText : mockPlaceholders[0].helpText; } function setDefaultHelpText(countryCode) { const helpTextSpan = document.querySelector('#help-text'); if (!helpTextSpan) { return; } } function updateHelpTextCountryCode(countryCode, fieldName) { if (!countryCode || !fieldName) { return; } setDefaultHelpText(countryCode); } function initializeSmsPhoneDropdown(fieldName) { if (!fieldName || typeof fieldName !== 'string') { return; } const dropdown = document.querySelector('#country-select-' + fieldName); const displayFlag = document.querySelector('#flag-display-' + fieldName); if (!dropdown || !displayFlag) { return; } const smsPhoneData = window.MC?.smsPhoneData; if (smsPhoneData && smsPhoneData.programs && Array.isArray(smsPhoneData.programs)) { dropdown.innerHTML = generateDropdownOptions(smsPhoneData.programs); } const defaultProgram = getDefaultCountryProgram(smsPhoneData?.defaultCountryCode, smsPhoneData?.programs); if (defaultProgram && defaultProgram.countryCode) { dropdown.value = defaultProgram.countryCode; const flagSpan = displayFlag?.querySelector('#flag-emoji-' + fieldName); if (flagSpan) { flagSpan.textContent = getCountryUnicodeFlag(defaultProgram.countryCode); flagSpan.setAttribute('aria-label', sanitizeHtml(defaultProgram.countryCode) + ' flag'); } updateSmsLegalText(defaultProgram.countryCode, fieldName); updatePlaceholder(defaultProgram.countryCode, fieldName); updateCountryCodeInstruction(defaultProgram.countryCode, fieldName); } var phoneInput = document.querySelector('#mce-' + fieldName); if (phoneInput && defaultProgram.countryCallingCode) { phoneInput.value = defaultProgram.countryCallingCode; } displayFlag?.addEventListener('click', function(e) { dropdown.focus(); }); dropdown?.addEventListener('change', function() { const selectedCountry = this.value; if (!selectedCountry || typeof selectedCountry !== 'string') { return; } const flagSpan = displayFlag?.querySelector('#flag-emoji-' + fieldName); if (flagSpan) { flagSpan.textContent

CLAY MOONCAKE JEWELRY BOXES

Sculpt your own mooncake-inspired box using air-dry clay — a charming keepsake that captures the magic of the Mid-Autumn Festival 🥮. All materials provided with light snack and refreshments.📅 Sun, Nov 2, 2025
      11am - 2pm

📍 Crafternoon ATX
      1603 E 38th 1/2 St

DUNGEONS & DRAGONS CHARACTER DESIGN

Greetings Young Adventurers🐉! Illustrate your own fantasy characters Bring a character sheet or create something new! Free event! Event Details📅 Wed, Nov 5, 2025
      4pm - 6pm
- Ages 9-18
📍 Pleasant Hill, Austin Public Library
      211 E William Cannon Dr

DUNGEONS & DRAGONS: MINIATURE FORGE

Make custom D&D miniatures using shrink plastic! All supplies provided. Get a template, class and species guide. Learn how to draw your own D&D character! Turn your final piece into a miniature that can be used in campaigns!📅 Thu, Nov 13, 2025
      6:30pm - 8pm

📍 Merfolk’s Specialty Coffee
      4930 S Congress Ave Ste 304c

PROCREATE WORKSHOP - DIGITAL ART

Learn how to use the Procreate App to make digital illustrations in this beginner friendly workshop in a small group setting. Bring your iPad!📅 Sat, Nov 15, 2025
      4pm - 6pm

📍 Dear Diary Coffee
      1212 Chicon St #103

WATERCOLOR WORKSHOP - OTGW

Celebrate fall with a hands-on watercolor workshop! Over the Garden Wall painting. Template provided & beginner friendly. That’s rock fact! 🍂📅 Mon, Nov 17, 2025
      7pm - 9pm

📍 Hold Out Brewing
      1208 West 4th Street

WORKSHOPS CALENDAR



PHOTOS FROM EVENTS


BOOKINGS / CONTACT

Contact me at [email protected]I teach 1:1 & group art classesI love collabs with venues, events, and artists!

PREVIOUS WORKSHOPS

Nov 2025 Suncatchers for Roots & Wings Festival
Oct 2025 Creepy Crawly Halloween
Oct 2025 BOOkmark & Bag Charms
Sep 2025 Watercolor Workshop: Over the Garden Wall
Sep 2025 Bookmarks & Bag Charms
Aug 2025 The "Charmed" Crafty Adult
Aug 2025 Dungeons & Dragons Character Design
May 2025 Community Zine-Making
May 2025 Exploring Culture Through Food: Art Workshop
Feb 2024 Procreate Demystified

Sarah Sip

Click on DATE to RSVP (optional)
Walk-ins Welcome!


FRI, MAY 9 @ 2-4pm
Twin Oaks Branch, Crafty Adult, 18+
SAT, MAY 10 @ 1-3pm
Twin Oaks Branch, All Ages
TUE, MAY 20 @ 6-7:30pm
Southeast Branch, Crafty Adult, 18+
WED, MAY 21 @ 4-6pm
University Hills Branch, All Ages


Workshop Info

ABOUT 🍙Exploring Culture Through Food ArtLet’s explore and share what food means to us! Learn how to draw adorable food with Austin’s very own illustrator, Sarah Doan. Bring your stories and passion for food! Materials provided.In collaboration with Austin Public Library, this workshop has multiple dates. Attend whichever one fits your schedule!


CONTACTQuestions: [email protected]Austin Public Library: Ask UsLibrary Branches: Twin Oaks | Southeast | University Hills


REGISTRATIONIf you're not able to attend the event, we ask that you cancel your registration so that others may sign up (ˊᗜˋ)/*Eventbrite: How to Cancel
OR Email me: [email protected]
*Disclaimer: If you don't show in the first 10 minutes, it'll be first come first serve


FAQAccessibility
For accommodations call 512-974-7400 or email [email protected]
Language
For help with translations, email [email protected] and we'll do our best to accommodate.



ABOUT SARAH
I'm an art instructor and I love helping others express their individual creativity!When I'm not teaching, I'm writing and illustrating children's books. My art is inspired by awkward encounters, childhood memories, food, and the celebration of cultures.Portfolio: sarahtdoan.com

Procreate workshop by me ↑


Resources

Helpful links I compiled


YOUTUBE
How to Draw a Cartoon Face: Genevieve's Design Studio
     Follow along tutorial, great tips + techniques
Procreate Beginner's Series
     Beginner guide playlist
Format files for Print for Children's Books: Genevieve's Design StudioProcreate 20 Top Tips
     Tip: "Pressure Curve" educes the amount of pen pressure you need to apply
Procreate for Kids: Lisa Bardot
     For someone new to digital art

FAQHow do you setup your file for picture books?
     300 DPI. Generic CMYK
     This video is helpful for figuring out margins & bleeds (13:48 for calculations)
Where can I download FREE brushes & paper textures?
     Gumroad - Drawing & Painting > popular tags: procreate brushes >Max price : 0.
     OR Search Bar + filter Max price: 0
     ProcreateFolio - Search Bar
     (e.g. "Free ink brush" or "Free watercolor paper texture")
I have a shaky hand. Can I still use Procreate?
     Yes! Motion Filtering, designed for hand tremors/accessibility,
     stabilizes brush strokes
Do you have a storyboard template?
     Yes, download here.


DOMESITKA
Forest Fantasy Illustration: Natalie Andrewson
     I used Procreate only. Learned techniques and character development.
Creating Characters for Children's Stories: Jimena S. Sarquiz
     Solid foundation for Procreate, picture book illustrations, and storytelling
Children’s Publications: Editorial Design and Illustration: Jimena S. Sarquiz
     I learned how to use gradient maps and values
Online Portfolio for Children's Book Illustrator: Marissa Valdez
     Last part is in Procreate. She's great at explaining for beginners

MISCBlending Mode GuideColor Palette CinemaImport brushesRealistic watercolor brushesSwatches of all default brushesSave PDFs


CONTACT
Reach out if you have any questions
[email protected]