All Articles

const intervalRef = useRef(null)
const resetGame = useCallback(() => {
clearInterval(intervalRef.current)
}, [])

πŸ•ΉοΈ Building 'Simple' React Games

18 Mar 2026 β€’ πŸ“– 19 min read
β˜• Coffee needed

What I learned refactoring two browser games: grouping state, useReducer, stale closures, timer cleanup, render-time randomisation bugs, and replacing three intervals with one rAF loop.

0
0
0
REACT JAVASCRIPT
<Pressable
accessibilityRole="button"
accessibilityLabel="Submit form"
onPress={handlePress}
/>

🦜Teaching React Native to Talk

17 Mar 2026 β€’ πŸ“– 18 min read
β˜• Coffee needed

What VoiceOver and TalkBack actually need from your app. Semantic roles, focus management, live regions, and the handful of props that make all the difference.

0
0
0
ACCESSIBILITY REACT NATIVE
const { userId } = useLocalSearchParams()
useEffect(() => {
getUserDetails(userId).then(setUser)
}, [userId])

🦸 Expo & Expo Router

21 Jan 2024 β€’ πŸ“– 30 min read β€’ Updated 16 Mar 2026
β˜• Coffee needed

Expo, EAS & Expo Router: one codebase covering web, Android, and iOS, with managed workflows, OTA updates, and file-based routing.

0
0
0
TYPESCRIPT REACT NATIVE
export const resources = {
en, fr,
} as const
type Locale = keyof typeof resources

🌐 React i18n TS Support

17 Dec 2023 β€’ πŸ“– 5 min read β€’ Updated 15 Mar 2026
⚑ Lightning read

Get full TypeScript intellisense for your i18n translations using "as const".

0
0
0
TYPESCRIPT REACT
// arrow: 'this' is always the class
logName = () => console.log(this.name)
// function: 'this' depends on caller
logName() { console.log(this.name) }

🏹 Regular Function vs Arrow Function

17 Aug 2023 β€’ πŸ“– 9 min read β€’ Updated 15 Mar 2026
β˜• Coffee needed

Learn the differences between normal functions and ES6 arrow functions.

0
0
0
JAVASCRIPT
if (true) {
var x = 1
}
console.log(x) // 1, var leaks out!

πŸ“¦ var, let & const

23 Feb 2023 β€’ πŸ“– 9 min read β€’ Updated 15 Mar 2026
πŸ”° Beginner friendly

Learn about scope chain, hoisting, lexical scoping and the key differences between var, let and const.

0
0
0
JAVASCRIPT
const Btn = ({ onClick, children }) => (
<button onClick={onClick}>
{children}
</button>
)

🧱 React Component Composition

20 Nov 2022 β€’ πŸ“– 10 min read β€’ Updated 15 Mar 2026
πŸ”° Beginner friendly

Understanding component composition in React with a simple food orders app.

0
0
0
JAVASCRIPT REACT
<SectionWithHeading
headingID="about"
headingTitle="About"
headingLevel={2}
/>

🍬 HTML Section Sugar

12 Apr 2022 β€’ πŸ“– 5 min read β€’ Updated 15 Mar 2026
⚑ Lightning read

A lightweight React wrapper to create sections as document regions.

0
0
0
ACCESSIBILITY REACT
const logger = () => console.log('yo!')
const theJoeCodes = () => logger()
theJoeCodes()
// call stack: theJoeCodes β†’ logger β†’ log

βš™οΈ JS Runtime Env

20 Feb 2022 β€’ πŸ“– 15 min read β€’ Updated 15 Mar 2026
πŸ§™ Advanced topic

Understanding the JavaScript Runtime Environment with a focus on the Event Loop and Message Queues.

0
0
0
JAVASCRIPT
localStorage.setItem('thejoecodes', '123')
window.addEventListener('storage', () => {
console.log(localStorage.getItem('thejoecodes'))
})

πŸ’Ύ Browser Storage

30 Jan 2022 β€’ πŸ“– 6 min read β€’ Updated 15 Mar 2026
⚑ Lightning read

Client-side storage in the browser using cookies, local storage and session storage.

0
0
0
JAVASCRIPT
const xmas = christmasChallenge()
// 5 puzzles to unlock πŸŽ…
xmas.santaSecretPassPhrase('???')
xmas.giveSantaFood('???')

πŸŽ… Christmas Challenge

16 Dec 2021
πŸ‘¨β€πŸ’» Coding challenge

An interactive christmas challenge. Use your web dev skills to help Santa at the northpole πŸŽ….

0
0
0
JAVASCRIPT
const next = themeColors[index].trim()
body.setAttribute('dark-theme-color', next)

🎨 Theme Picker

27 Oct 2021 β€’ πŸ“– 15 min read β€’ Updated 15 Mar 2026
⚑ Lightning read

Creating a scalable theme picker with CSS custom properties.

0
0
0
SCSS CSS
const urls = routes.map(r => `${baseUrl}${r}`)
await Promise.all(
urls.map(url => $`npx axe ${url}`)
)

πŸͺ“ Google ZX & Axe CLI

16 Oct 2021 β€’ πŸ“– 4 min read β€’ Updated 15 Mar 2026
⚑ Lightning read

Running axe-core CLI with Google ZX.

0
0
0
ACCESSIBILITY NODE
<Emoji emoji="βœ‹" label="high five" />
// <span role="img" aria-label="high five">βœ‹</span>
<img src={src} /> // missing alt prop

βœ‹ Accessible Emojis

06 Oct 2021 β€’ πŸ“– 5 min read β€’ Updated 15 Mar 2026
⚑ Lightning read

Using eslint-plugin-jsx-a11y to catch accessibility issues during development.

0
0
0
ACCESSIBILITY
Host github-work
IdentityFile ~/.ssh/id_work
Host github-personal
IdentityFile ~/.ssh/id_personal

πŸ”‘ GIT SSH Config

05 Oct 2021 β€’ πŸ“– 4 min read β€’ Updated 15 Mar 2026
⚑ Lightning read

Managing private SSH keys across work and personal GIT repositories.

0
0
0
GIT SSH
@mixin responsive($type) {
@if $type == mobileMinMax {
@media (max-width: 800px) { @content; }
}
}

πŸ“± Responsive Mixin

23 Sept 2021 β€’ πŸ“– 4 min read β€’ Updated 15 Mar 2026
⚑ Lightning read

A responsive sass mixin to clean-up your messy media queries.

0
0
0
SCSS CSS
.rem { padding: 1rem; } /* bad: scales with font */
.px { padding: 16px; } /* good: always 16px */
p { font-size: 1rem; } /* good: rem is right here */

πŸ“ Layouts PX vs REM

14 Sept 2021 β€’ πŸ“– 5 min read β€’ Updated 15 Mar 2026
⚑ Lightning read

Stop using rem units for CSS box model properties like padding and margin.

0
0
0
CSS
<button aria-label="Hide emoji">X</button>
<img src={src} alt="Red warning sign" />
<input aria-required="true" aria-label="Name" />

🌐 Web Accessibility

03 Jun 2021 β€’ πŸ“– 23 min read β€’ Updated 15 Mar 2026
πŸ”₯ Popular read

Tips and tricks, tooling and best practices for web accessibility.

0
0
0
ACCESSIBILITY
while (!valid) {
await askDirectoryName({ ui })
.then(val => { valid = true; dir = val })
}

πŸš€ Productive Tooling

19 Mar 2021 β€’ πŸ“– 10 min read β€’ Updated 15 Mar 2026
β˜• Coffee needed

Increasing my productivity with custom tooling.

0
0
0
JAVASCRIPT NODE
let val: unknown = getData()
if (typeof val === 'string') {
console.log(val.toUpperCase())
}

πŸ›‘οΈ TS Basic Types

04 Feb 2021 β€’ πŸ“– 13 min read β€’ Updated 15 Mar 2026
Bookmark me ⭐

A light introduction into the world of TypeScript and basic data types.

0
0
0
JAVASCRIPT TYPESCRIPT
'The Joe Codes'.split(' ') // ['The', 'Joe', 'Codes']
'The Joe Codes'.includes('Joe') // true

🧡 Strings Cheat Sheet

30 Dec 2020 β€’ πŸ“– 10 min read β€’ Updated 15 Mar 2026
πŸ”° Beginner friendly

Cheat sheet to help you master working with JS strings.

0
0
0
JAVASCRIPT
const el = document.getElementById('app')
renderLoader(el)
const data = await fetchUsers()
el.innerHTML = createHtml(data)

🍦 Vanilla JavaScript

13 Dec 2020 β€’ πŸ“– 10 min read β€’ Updated 15 Mar 2026
πŸ”° Beginner friendly

Life without a modern JavaScript framework. Vanilla JS fun.

0
0
0
JAVASCRIPT
promiseAddOne(value)
.then(val => promiseMultiplyByTwo(val))
.then(val => promiseDivideByTen(val))
.then(val => console.log(val))

🀝 JavaScript Promises

29 Nov 2020 β€’ πŸ“– 10 min read β€’ Updated 15 Mar 2026
πŸ”° Beginner friendly

An introduction into the world of JavaScript promises.

0
0
0
JAVASCRIPT
@mixin button($padding: 0.75rem) {
padding: $padding;
border-radius: 8px;
}
.primary { @include button; }

πŸͺ„ Sass Mixins

22 Nov 2020 β€’ πŸ“– 5 min read β€’ Updated 15 Mar 2026
⚑ Lightning read

Creating flexible styles and reusable patterns with Sass mixins.

0
0
0
SCSS CSS
console.log('πŸ‘»')
setTimeout(() => console.log('πŸŽƒ'), 0)
// ^ runs last, not second!

πŸ‘» Event Loop Intro

31 Oct 2020 β€’ πŸ“– 10 min read β€’ Updated 15 Mar 2026
πŸ”° Beginner friendly

A spooky introduction into the JavaScript Event Loop.

0
0
0
JAVASCRIPT