<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Joe Attardi - Blog</title><description>Thoughts on front-end development, JavaScript, CSS, and the modern web platform.</description><link>https://joea.dev/</link><language>en-us</language><item><title>Think before you reach for that div</title><link>https://joea.dev/blog/think-before-you-reach-for-that-div/</link><guid isPermaLink="true">https://joea.dev/blog/think-before-you-reach-for-that-div/</guid><description>In the past, web user interfaces were constructed largely using &lt;div&gt; and &lt;span&gt; elements. These are generic block and inline elements that really were your only option other than &lt;p&gt; and a few other elements.
In 2014, when HTML5 was released as a W3...</description><pubDate>Wed, 24 Sep 2025 18:12:38 GMT</pubDate></item><item><title>Is vibe coding the future?</title><link>https://joea.dev/blog/is-vibe-coding-the-future/</link><guid isPermaLink="true">https://joea.dev/blog/is-vibe-coding-the-future/</guid><description>The concept of “vibe coding” was first introduced by Andrej Karpathy in an X post from February 2025:

There&apos;s a new kind of coding I call &quot;vibe coding&quot;, where you fully give in to the vibes, embrace exponentials, and forget that the code even exists...</description><pubDate>Sun, 23 Mar 2025 04:00:00 GMT</pubDate></item><item><title>4 years of &quot;Modern CSS&quot;</title><link>https://joea.dev/blog/4-years-of-modern-css/</link><guid isPermaLink="true">https://joea.dev/blog/4-years-of-modern-css/</guid><description>It&apos;s October 2024, and I am celebrating four years as a published author. According to Amazon, Modern CSS was published on October 7, 2020. Modern CSS actually started out as a self-published book on Leanpub (a great platform for self-publishing book...</description><pubDate>Sun, 27 Oct 2024 04:00:00 GMT</pubDate></item><item><title>Beyond breakpoints: Leveraging user preference media queries in CSS</title><link>https://joea.dev/blog/beyond-breakpoints-leveraging-user-preference-media-queries-in-css/</link><guid isPermaLink="true">https://joea.dev/blog/beyond-breakpoints-leveraging-user-preference-media-queries-in-css/</guid><description>If you build web sites or apps, chances are you work with media queries. These handy CSS tools allow you to adjust your layout depending on the size of the device. They are a key part of responsive design.
You can query based on the width of the devi...</description><pubDate>Tue, 22 Oct 2024 04:00:00 GMT</pubDate></item><item><title>Using git bisect, the detective tool for debugging</title><link>https://joea.dev/blog/using-git-bisect-the-detective-tool-for-debugging/</link><guid isPermaLink="true">https://joea.dev/blog/using-git-bisect-the-detective-tool-for-debugging/</guid><description>You’re working on a bug fix and find some bad code that causes a bug. The git blame command will tell you who the last developer was that modified that line, and when they modified it. But what if you don’t know what code introduced the bug? For thes...</description><pubDate>Fri, 04 Oct 2024 03:19:15 GMT</pubDate></item><item><title>Steps for installing a local AI copilot in Visual Studio Code</title><link>https://joea.dev/blog/steps-for-installing-a-local-ai-copilot-in-visual-studio-code/</link><guid isPermaLink="true">https://joea.dev/blog/steps-for-installing-a-local-ai-copilot-in-visual-studio-code/</guid><description>Does your company block ChatGPT or GitHub Copilot? Do you have security or trust concerns sending your code to a third party AI service? You might not know this, but you can run a large language model (LLM) locally on your computer, and even integrat...</description><pubDate>Thu, 12 Sep 2024 20:12:07 GMT</pubDate></item><item><title>Fun with arrays</title><link>https://joea.dev/blog/fun-with-arrays/</link><guid isPermaLink="true">https://joea.dev/blog/fun-with-arrays/</guid><description>In this article, we&apos;ll look at some weird quirks with JavaScript arrays to learn a little more about how they work under the hood.
An array is a collection or list of values. It could hold just strings:
const names = [&apos;Luke&apos;, &apos;Leia&apos;, &apos;Han&apos;];

Or a mi...</description><pubDate>Wed, 25 Oct 2023 19:03:57 GMT</pubDate></item><item><title>Are Computer Science degrees still relevant?</title><link>https://joea.dev/blog/are-computer-science-degrees-still-relevant/</link><guid isPermaLink="true">https://joea.dev/blog/are-computer-science-degrees-still-relevant/</guid><description>I took a more traditional path into tech, going to a 4-year university and getting a Computer Science degree (way back in 2004!). These days, it&apos;s no secret that there are many alternate paths to a software development job. The three main paths today...</description><pubDate>Fri, 13 Oct 2023 19:26:10 GMT</pubDate></item><item><title>Understanding color contrast for accessibility</title><link>https://joea.dev/blog/understanding-color-contrast-for-accessibility/</link><guid isPermaLink="true">https://joea.dev/blog/understanding-color-contrast-for-accessibility/</guid><description>Accessibility is a popular topic these days - as it should be. There are many benefits of making your application accessible - it promotes inclusivity by making your app usable by everyone.
There are many aspects of accessibility that you need to kee...</description><pubDate>Fri, 06 Oct 2023 14:33:49 GMT</pubDate></item><item><title>Understanding error handling in Promise chains</title><link>https://joea.dev/blog/understanding-error-handling-in-promise-chains/</link><guid isPermaLink="true">https://joea.dev/blog/understanding-error-handling-in-promise-chains/</guid><description>Promise chains
You can create a chain of Promises by returning new Promises from a then handler. Here&apos;s a simple example that chains 3 promises together:
Promise.resolve(1)
    .then(id =&gt; {
        console.log(`Success: ${id}`);
        return Promi...</description><pubDate>Fri, 07 Jul 2023 16:13:44 GMT</pubDate></item><item><title>Customizing `JSON.parse` and `JSON.stringify`</title><link>https://joea.dev/blog/customizing-jsonparse-and-jsonstringify/</link><guid isPermaLink="true">https://joea.dev/blog/customizing-jsonparse-and-jsonstringify/</guid><description>The JSON.stringify and JSON.parse functions are handy for converting objects to JSON strings and back again.
However, not all properties of an object are serializable. Functions, regular expressions, and Date objects are all examples of values that c...</description><pubDate>Thu, 27 Apr 2023 03:27:44 GMT</pubDate></item><item><title>How many ways can we reverse an Array?</title><link>https://joea.dev/blog/how-many-ways-can-we-reverse-an-array/</link><guid isPermaLink="true">https://joea.dev/blog/how-many-ways-can-we-reverse-an-array/</guid><description>There&apos;s a Stage 3 proposal to add several array methods including Array.prototype.toReversed, which will create a reversed copy of the array. This will be a welcome addition since Array.prototype.reverse mutates the array, which often is not what we ...</description><pubDate>Wed, 23 Nov 2022 03:43:27 GMT</pubDate></item><item><title>Comparing `const` declarations and immutable objects</title><link>https://joea.dev/blog/comparing-const-declarations-and-immutable-objects/</link><guid isPermaLink="true">https://joea.dev/blog/comparing-const-declarations-and-immutable-objects/</guid><description>Way back in my Java days, when interviewing candidates, I would often ask the candidate to explain the meaning of the final keyword. Many times I would get an answer along the lines of &quot;It&apos;s a constant value&quot; or &quot;It can&apos;t be changed once assigned&quot;.
F...</description><pubDate>Thu, 01 Sep 2022 04:55:56 GMT</pubDate></item><item><title>Promise Tips: When do I need to create my own Promise instance?</title><link>https://joea.dev/blog/promise-tips-when-do-i-need-to-create-my-own-promise-instance/</link><guid isPermaLink="true">https://joea.dev/blog/promise-tips-when-do-i-need-to-create-my-own-promise-instance/</guid><description>Promises are pretty ubiquitous these days, but sometimes Promise based code is more complex that it needs to be.
Consider this getUserDetails function:
function getUserDetails(userId) {
  return new Promise((resolve, reject) =&gt; {
    fetch(`/users/${...</description><pubDate>Fri, 28 Jan 2022 16:07:51 GMT</pubDate></item><item><title>Comparison of JavaScript modules</title><link>https://joea.dev/blog/comparison-of-javascript-modules/</link><guid isPermaLink="true">https://joea.dev/blog/comparison-of-javascript-modules/</guid><description>JavaScript has been around since 1995. In that time there have been several different ways to create modules. Due to browser compatibility issues and legacy codebases, all of these module types are still in use today.
What is a module?
A module is so...</description><pubDate>Sun, 29 Nov 2020 22:23:09 GMT</pubDate></item><item><title>Using Animations with Tailwind CSS</title><link>https://joea.dev/blog/using-animations-with-tailwind-css/</link><guid isPermaLink="true">https://joea.dev/blog/using-animations-with-tailwind-css/</guid><description>Tailwind CSS is awesome. Animations are awesome. So let&apos;s combine them! It&apos;s really easy to define your own custom animations with Tailwind.
Quick CSS animation refresher
A CSS animation is defined by creating a set of keyframes. These keyframes defi...</description><pubDate>Thu, 26 Nov 2020 04:14:55 GMT</pubDate></item><item><title>JavaScript Maps vs Plain JavaScript Objects</title><link>https://joea.dev/blog/javascript-maps-vs-plain-javascript-objects/</link><guid isPermaLink="true">https://joea.dev/blog/javascript-maps-vs-plain-javascript-objects/</guid><description>ES2015, also known as ES6, added lots of new things to the JavaScript language. One very useful addition was the Map. Map allows you to map keys to values. 
Couldn&apos;t we already do that?
You might be thinking - we already could map keys to values in J...</description><pubDate>Fri, 25 Sep 2020 15:36:31 GMT</pubDate></item><item><title>Introduction to Flexbox</title><link>https://joea.dev/blog/introduction-to-flexbox/</link><guid isPermaLink="true">https://joea.dev/blog/introduction-to-flexbox/</guid><description>All the cool kids may be using CSS Grid now, but there are still plenty of scenarios where Flexbox does exactly what you need. This article will give an introductory look at what you can do with Flexbox.
What is Flexbox?
Flexbox is the more commonly ...</description><pubDate>Thu, 24 Sep 2020 18:18:52 GMT</pubDate></item><item><title>Introduction to Custom Elements</title><link>https://joea.dev/blog/introduction-to-custom-elements/</link><guid isPermaLink="true">https://joea.dev/blog/introduction-to-custom-elements/</guid><description>Custom elements have pretty good browser support. Of course, they aren&apos;t supported in Internet Explorer, but that shouldn&apos;t surprise anyone.
If you don&apos;t need to support Internet Explorer 11, you can absolutely use Custom Elements today, as they are ...</description><pubDate>Wed, 23 Sep 2020 15:13:23 GMT</pubDate></item><item><title>How Emojis Work</title><link>https://joea.dev/blog/how-emojis-work/</link><guid isPermaLink="true">https://joea.dev/blog/how-emojis-work/</guid><description>In the process of writing Emoji Button, my plain JavaScript emoji picker (which turns one year old tomorrow, August 29th!), I have learned a lot about emojis! Hopefully someone out there will find this information useful, or at least interesting.
Emo...</description><pubDate>Sat, 29 Aug 2020 01:20:52 GMT</pubDate></item><item><title>Introduction to Tailwind CSS</title><link>https://joea.dev/blog/introduction-to-tailwind-css/</link><guid isPermaLink="true">https://joea.dev/blog/introduction-to-tailwind-css/</guid><description>There&apos;s been a lot of buzz lately about Tailwind CSS. Maybe you&apos;re curious about it but haven&apos;t taken a look yet. This article is for you!
Utility-first CSS
With traditional CSS, you define rules for different elements on your page. Each rule likely ...</description><pubDate>Fri, 28 Aug 2020 01:56:12 GMT</pubDate></item><item><title>All about `this` in JavaScript</title><link>https://joea.dev/blog/all-about-this-in-javascript/</link><guid isPermaLink="true">https://joea.dev/blog/all-about-this-in-javascript/</guid><description>What is this?
It depends on the situation. Let’s look at a few common scenarios.
The global this
Outside of a function, this references the global object. In a browser environment, this is typically the window object. In this scenario, you can set pr...</description><pubDate>Fri, 28 Aug 2020 00:43:06 GMT</pubDate></item><item><title>How to use Font Awesome icons in a vanilla JavaScript project</title><link>https://joea.dev/blog/how-to-use-font-awesome-icons-in-a-vanilla-javascript-project/</link><guid isPermaLink="true">https://joea.dev/blog/how-to-use-font-awesome-icons-in-a-vanilla-javascript-project/</guid><description>I was working on a vanilla JavaScript project recently and wanted to add some Font Awesome icons. Previously I have used Font Awesome icons in React or Angular projects, but never plain JavaScript. It turned out to be pretty easy.
Install packages
Fi...</description><pubDate>Tue, 10 Sep 2019 02:07:51 GMT</pubDate></item><item><title>In defense of the humble `console.log`</title><link>https://joea.dev/blog/in-defense-of-the-humble-consolelog/</link><guid isPermaLink="true">https://joea.dev/blog/in-defense-of-the-humble-consolelog/</guid><description>There is some negative sentiment out there about using console.log for debugging. It&apos;s true that, in
many cases, the browser&apos;s debugger is more powerful. However, there are still scenarios where using
console.log can be very useful.
Recently I was de...</description><pubDate>Thu, 08 Aug 2019 02:10:05 GMT</pubDate></item></channel></rss>