<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Joel M Turner</title><description>Senior Product Engineer in Portland. Astro/React/TypeScript blog, dev tips (TIL), illustration &amp; zines, and side projects.</description><link>https://joelmturner.com/</link><item><title>Delivering Video with Cloudinary &amp; Exploring Astro</title><link>https://joelmturner.com/blog/cloudinary-devjams-episode-36/</link><guid isPermaLink="true">https://joelmturner.com/blog/cloudinary-devjams-episode-36/</guid><description>Guest on Cloudinary DevJams #36: Astro migration, Cloudinary video and cover transforms, Lambda builds, and a portfolio walkthrough with Sam Brace and Jen Brissman.</description><pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate></item><item><title>Fonts in Astro: Optimize Performance of Fonts via Astro</title><link>https://joelmturner.com/blog/astro-font-loading/</link><guid isPermaLink="true">https://joelmturner.com/blog/astro-font-loading/</guid><description>Use Astro&apos;s first-party fonts in astro.config for local or provider fonts, variables, and fallbacks—the supported upgrade from the astro-font package.</description><pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate></item><item><title>WebAwesome and Tailwind v4 in the same site</title><link>https://joelmturner.com/blog/webawesome-tailwind-4-same-site/</link><guid isPermaLink="true">https://joelmturner.com/blog/webawesome-tailwind-4-same-site/</guid><description>Use Web Awesome web components with Tailwind v4 on the same site. Fix styling friction after moving from Panda to Tailwind with the right config and layer order.</description><pubDate>Sat, 20 Dec 2025 16:14:07 GMT</pubDate></item><item><title>Zine Viewer Web Component</title><link>https://joelmturner.com/blog/zine-viewer-web-component/</link><guid isPermaLink="true">https://joelmturner.com/blog/zine-viewer-web-component/</guid><description>Custom web component for flipbook-style zine viewing in a modal. Vanilla HTML, CSS, and JavaScript—no framework. Drop-in script tag for any page.</description><pubDate>Mon, 17 Nov 2025 18:43:03 GMT</pubDate></item><item><title>Astro Font Loading: Optimizing Performance with astro-font</title><link>https://joelmturner.com/blog/astro-font-optimization/</link><guid isPermaLink="true">https://joelmturner.com/blog/astro-font-optimization/</guid><description>Optimize font loading in Astro with the Astro Font package. Preload fonts, control font-display, and reduce layout shift (CLS) for better Core Web Vitals.</description><pubDate>Sun, 04 Feb 2024 18:43:03 GMT</pubDate></item><item><title>Why I Migrated from Next.js to Astro (Svelte Islands &amp; Panda CSS)</title><link>https://joelmturner.com/blog/nextjs-astro/</link><guid isPermaLink="true">https://joelmturner.com/blog/nextjs-astro/</guid><description>Converting my site from Next.js to Astro and Svelte, styled with Panda CSS. Notes on the migration, what stayed, and what changed for a faster, simpler stack.</description><pubDate>Fri, 29 Dec 2023 20:13:34 GMT</pubDate></item><item><title>Retrieving Instagram Content with Cloudinary — DevJams #17</title><link>https://joelmturner.com/blog/cloudinary-devjams-episode-17/</link><guid isPermaLink="true">https://joelmturner.com/blog/cloudinary-devjams-episode-17/</guid><description>Guest on Cloudinary DevJams #17: Instagram-to-Cloudinary automation, code review, open-source Jamstack work, and gallery demos with Sam Brace and Becky Peltz.</description><pubDate>Tue, 23 May 2023 00:00:00 GMT</pubDate></item><item><title>Chart Parts: Dimensions, Metrics, and What Makes Up a Chart</title><link>https://joelmturner.com/blog/chart-parts-anatomy-of-a-chart/</link><guid isPermaLink="true">https://joelmturner.com/blog/chart-parts-anatomy-of-a-chart/</guid><description>Understand dimensions vs metrics, then how field, legend, axes, and controls fit together in any chart. Intro anatomy with diagram and video—before you build or pick chart types.</description><pubDate>Thu, 02 Feb 2023 07:27:30 GMT</pubDate></item><item><title>Quick Tip: VS Code Extension Folder Location</title><link>https://joelmturner.com/blog/quick-tip-code-extension-data/</link><guid isPermaLink="true">https://joelmturner.com/blog/quick-tip-code-extension-data/</guid><description>Quick tip: move VS Code extension data folders (e.g. Local History) into .vscode so you don&apos;t have to add them to .gitignore. Keeps workspace clean for the team.</description><pubDate>Fri, 08 Jul 2022 05:56:36 GMT</pubDate></item><item><title>Working on a New Feature as a Senior Frontend Developer</title><link>https://joelmturner.com/blog/working-feature-senior-frontend-developer/</link><guid isPermaLink="true">https://joelmturner.com/blog/working-feature-senior-frontend-developer/</guid><description>Senior frontend guide for new feature tickets: scope with design and API, reuse patterns, define &quot;done,&quot; and know when to refactor. Questions to ask before writing code.</description><pubDate>Wed, 06 Jul 2022 04:28:59 GMT</pubDate></item><item><title>Static Nextjs Netlify 500 Errors Instead of 404 Errors</title><link>https://joelmturner.com/blog/static-nextjs-netlify-500-errors-404-errors/</link><guid isPermaLink="true">https://joelmturner.com/blog/static-nextjs-netlify-500-errors-404-errors/</guid><description>Fix 500 errors instead of 404 on static Next.js on Netlify when hitting missing dynamic routes. Solution: return pageFound false in getStaticPaths. Includes workaround link.</description><pubDate>Sun, 03 Jul 2022 04:19:41 GMT</pubDate></item><item><title>React One Time Password Input Component</title><link>https://joelmturner.com/blog/react-one-time-password-input-component/</link><guid isPermaLink="true">https://joelmturner.com/blog/react-one-time-password-input-component/</guid><description>Build a React one-time password (OTP) input with 6 separate fields. Auto-advance on type, Backspace support via useKeyPressEvent. Includes CodeSandbox and parent state pattern.</description><pubDate>Sat, 26 Mar 2022 05:07:58 GMT</pubDate></item><item><title>Gatsby Client-Side External Redirect</title><link>https://joelmturner.com/blog/gatsby-client-side-external-redirect/</link><guid isPermaLink="true">https://joelmturner.com/blog/gatsby-client-side-external-redirect/</guid><description>Quick tip: client-side redirect in Gatsby without a lambda. Pass redirectTo via page context and use useEffect to set window.location. Handy for S3/CloudFront.</description><pubDate>Tue, 02 Nov 2021 05:16:08 GMT</pubDate></item><item><title>Instagram to Cloudinary</title><link>https://joelmturner.com/blog/instagram-cloudinary/</link><guid isPermaLink="true">https://joelmturner.com/blog/instagram-cloudinary/</guid><description>GitHub Action to fetch Instagram posts by hashtag and upload images to Cloudinary, then trigger a Netlify build. Node script, no gatsby-source-instagram needed.</description><pubDate>Mon, 01 Nov 2021 16:08:43 GMT</pubDate></item><item><title>Sequential Interval React Hook</title><link>https://joelmturner.com/blog/sequential-interval-react-hook/</link><guid isPermaLink="true">https://joelmturner.com/blog/sequential-interval-react-hook/</guid><description>Build a React hook for sequential animation states with configurable durations. Simulate a pulse cycle (rest, tick, exit, enter) for heartbeat-style UI. Includes CodeSandbox.</description><pubDate>Thu, 08 Apr 2021 00:00:00 GMT</pubDate></item><item><title>Animated SVG Water Pictorial Fraction in Svelte</title><link>https://joelmturner.com/blog/svelte-animated-water-svg-pictorial-fraction/</link><guid isPermaLink="true">https://joelmturner.com/blog/svelte-animated-water-svg-pictorial-fraction/</guid><description>Create an animated SVG pictorial fraction (water fill) in Svelte. Percentage-based progress so the shape fills or drains. Learn Svelte with a small data vis component.</description><pubDate>Mon, 04 Jan 2021 00:00:00 GMT</pubDate></item><item><title>Create a Single Line Chart in React with @vx</title><link>https://joelmturner.com/blog/create-a-single-line-chart-in-react-with-@vx/</link><guid isPermaLink="true">https://joelmturner.com/blog/create-a-single-line-chart-in-react-with-@vx/</guid><description>Build a single line chart in React with @vx (visx). Time on x-axis, metrics on y-axis, data points on the line. Use as a base for multi-line charts. Includes CodeSandbox.</description><pubDate>Thu, 23 Jul 2020 00:00:00 GMT</pubDate></item><item><title>Beginning Web Accessibility in React</title><link>https://joelmturner.com/blog/beginning-web-accessibility-react/</link><guid isPermaLink="true">https://joelmturner.com/blog/beginning-web-accessibility-react/</guid><description>Getting started with web accessibility in React. Add eslint-plugin-jsx-a11y, learn WAI-ARIA roles and semantics, and try no-mouse-days to find gaps.</description><pubDate>Mon, 13 Jan 2020 00:00:00 GMT</pubDate></item><item><title>Front-End Checklist for Ticket Completion</title><link>https://joelmturner.com/blog/front-end-ticket-checklist/</link><guid isPermaLink="true">https://joelmturner.com/blog/front-end-ticket-checklist/</guid><description>Front-end ticket checklist for staying organized across projects. Clean up debuggers and logs, refactor, test, verify on published URL, update Jira. Copy into Todoist and ship.</description><pubDate>Fri, 10 Jan 2020 00:00:00 GMT</pubDate></item><item><title>Productivity Practices for Front End Development</title><link>https://joelmturner.com/blog/productivity-practices-front-end-development/</link><guid isPermaLink="true">https://joelmturner.com/blog/productivity-practices-front-end-development/</guid><description>Productivity practices for front-end dev: window management with Better Touch Tool, Spaces for app grouping, and systems that help ship without burning out.</description><pubDate>Mon, 30 Sep 2019 00:00:00 GMT</pubDate></item><item><title>Bar Chart in React with @vx</title><link>https://joelmturner.com/blog/data-vis-react-bar-chart-vx/</link><guid isPermaLink="true">https://joelmturner.com/blog/data-vis-react-bar-chart-vx/</guid><description>Build a bar chart in React with @vx (visx) charting primitives. Step-by-step with scales, bars, and axes. Includes CodeSandbox and a base for more chart types.</description><pubDate>Tue, 17 Sep 2019 00:00:00 GMT</pubDate></item><item><title>Build an Inline Edit Text Input With React Hooks</title><link>https://joelmturner.com/blog/inline-text-edit-react-hooks/</link><guid isPermaLink="true">https://joelmturner.com/blog/inline-text-edit-react-hooks/</guid><description>Build an inline editable text input with React Hooks. Click to edit, Enter to save, Esc to cancel. Step-by-step tutorial with working CodeSandbox example.</description><pubDate>Mon, 16 Sep 2019 00:00:00 GMT</pubDate></item><item><title>React Hooks: useDims</title><link>https://joelmturner.com/blog/react-hooks-usedims/</link><guid isPermaLink="true">https://joelmturner.com/blog/react-hooks-usedims/</guid><description>React useDims hook that returns width, height, top, and left of a DOM element. Uses useLayoutEffect and getBBox for SVG. Handy for layout and measurement.</description><pubDate>Fri, 13 Sep 2019 00:00:00 GMT</pubDate></item><item><title>Build Reusable React Flexbox and CSS Grid Layout Components</title><link>https://joelmturner.com/blog/react-layout-components/</link><guid isPermaLink="true">https://joelmturner.com/blog/react-layout-components/</guid><description>Build reusable React layout components with Flexbox and CSS Grid. Boolean alignment props, gap support, grid templates, full props reference, and CodeSandbox examples.</description><pubDate>Thu, 12 Sep 2019 00:00:00 GMT</pubDate></item><item><title>React Hooks: useSlider</title><link>https://joelmturner.com/blog/react-hooks-useslider/</link><guid isPermaLink="true">https://joelmturner.com/blog/react-hooks-useslider/</guid><description>Build an auto-advancing image slider in React with hooks. Slides through an array on an interval. Includes working CodeSandbox example and minimal hook implementation.</description><pubDate>Wed, 11 Sep 2019 00:00:00 GMT</pubDate></item><item><title>Build a React Gallery With CSS Grid</title><link>https://joelmturner.com/blog/build-gallery-react-css-grid/</link><guid isPermaLink="true">https://joelmturner.com/blog/build-gallery-react-css-grid/</guid><description>Build a React image gallery with CSS Grid. Simple grid layout with same-size images, minmax for responsiveness, and size props (s, m, l). Uses Gatsby Image.</description><pubDate>Tue, 10 Sep 2019 00:00:00 GMT</pubDate></item><item><title>Quick Tip: GraphQL Fragments in Gatsby</title><link>https://joelmturner.com/blog/quick-tip-graphql-fragments/</link><guid isPermaLink="true">https://joelmturner.com/blog/quick-tip-graphql-fragments/</guid><description>Quick tip: working with GraphQL fragments in Gatsby. Reuse fields across queries, colocate fragments with components, and keep your schema in sync.</description><pubDate>Mon, 09 Sep 2019 00:00:00 GMT</pubDate></item><item><title>Create an Avatar Component in Gatsby with TypeScript Part 3: Adding Types</title><link>https://joelmturner.com/blog/avatar-component-gatsby-3/</link><guid isPermaLink="true">https://joelmturner.com/blog/avatar-component-gatsby-3/</guid><description>Part 3 of the Gatsby Avatar series. Add TypeScript types to the Avatar component: prop types, optional image url, and type-safe Gatsby Image integration.</description><pubDate>Sun, 08 Sep 2019 00:00:00 GMT</pubDate></item><item><title>Create an Avatar Component in Gatsby with TypeScript Part 2: Gatsby Image</title><link>https://joelmturner.com/blog/avatar-component-gatsby-2/</link><guid isPermaLink="true">https://joelmturner.com/blog/avatar-component-gatsby-2/</guid><description>Part 2 of the Gatsby Avatar series. Optimize the avatar with Gatsby Image, sharp plugins, and GraphQL for fast, responsive images. Step-by-step plugin setup.</description><pubDate>Sat, 07 Sep 2019 00:00:00 GMT</pubDate></item><item><title>Create an Avatar Component in Gatsby with TypeScript Part 1</title><link>https://joelmturner.com/blog/avatar-component-gatsby-1/</link><guid isPermaLink="true">https://joelmturner.com/blog/avatar-component-gatsby-1/</guid><description>Build an Avatar component in Gatsby with TypeScript. Part 1 sets up a placeholder image and basic styling as the foundation for Gatsby Image and types in parts 2 and 3.</description><pubDate>Fri, 06 Sep 2019 00:00:00 GMT</pubDate></item><item><title>Animated CSS Timer Icon</title><link>https://joelmturner.com/blog/animated-css-timer-icon/</link><guid isPermaLink="true">https://joelmturner.com/blog/animated-css-timer-icon/</guid><description>Build an animated CSS timer icon that runs forward and backward. Pure HTML and CSS—no SVG or GIF. Scale with font-size and control animation direction in the browser.</description><pubDate>Sat, 11 Nov 2017 00:00:00 GMT</pubDate></item><item><title>My Best Hand Lettering and Sketches of 2016</title><link>https://joelmturner.com/blog/handlettering-best-of-2016/</link><guid isPermaLink="true">https://joelmturner.com/blog/handlettering-best-of-2016/</guid><description>A curated set of my best hand lettering and sketches from 2016. Highlights from a year of practice and finished pieces.</description><pubDate>Mon, 16 Jan 2017 00:00:00 GMT</pubDate></item><item><title>Playing with Type</title><link>https://joelmturner.com/blog/playing-with-type/</link><guid isPermaLink="true">https://joelmturner.com/blog/playing-with-type/</guid><description>Playing with type through hand lettering and sketching. Experiments and practice with letterforms and composition.</description><pubDate>Fri, 26 Jun 2015 00:00:00 GMT</pubDate></item><item><title>Post Modern Jukebox Art</title><link>https://joelmturner.com/blog/pmj-artwork/</link><guid isPermaLink="true">https://joelmturner.com/blog/pmj-artwork/</guid><description>Promo images inspired by Post Modern Jukebox&apos;s Eviction Tour in Portland. Fan artwork and design after seeing Scott Bradlee and the band live.</description><pubDate>Fri, 12 Dec 2014 00:00:00 GMT</pubDate></item><item><title>Getting Sassy With Sass: Nesting</title><link>https://joelmturner.com/blog/sassy-with-sass/</link><guid isPermaLink="true">https://joelmturner.com/blog/sassy-with-sass/</guid><description>Quick look at nesting selectors in Sass. Organize styles and avoid repeating selector strings. Reference and examples from the Sass Basics course.</description><pubDate>Fri, 03 Oct 2014 00:00:00 GMT</pubDate></item><item><title>Choosing the Decisions We Make</title><link>https://joelmturner.com/blog/decisions-we-make/</link><guid isPermaLink="true">https://joelmturner.com/blog/decisions-we-make/</guid><description>How to choose which decisions to make yourself and which to automate. Focus on what matters and streamline the rest.</description><pubDate>Tue, 21 Jan 2014 00:00:00 GMT</pubDate></item><item><title>Creating a Daily Routine for Freedom</title><link>https://joelmturner.com/blog/daily-routine-freedom/</link><guid isPermaLink="true">https://joelmturner.com/blog/daily-routine-freedom/</guid><description>How a daily routine can create more freedom instead of constraint. Personal take on structure and what it unlocks.</description><pubDate>Fri, 17 Jan 2014 00:00:00 GMT</pubDate></item><item><title>The Doctor&apos;s Companions</title><link>https://joelmturner.com/blog/doctors-companions/</link><guid isPermaLink="true">https://joelmturner.com/blog/doctors-companions/</guid><description>A look at the Doctor&apos;s companions in Doctor Who—how they&apos;ve changed across the show and what makes each era&apos;s TARDIS team memorable.</description><pubDate>Mon, 25 Nov 2013 00:00:00 GMT</pubDate></item></channel></rss>