Thought Pieces

Focal point blocking for XR media

Planning out a linear VR experience requires thinking about where the viewers attention might be. Thinking about the focal points…

Designing immersive experiences

In traditional cinema, TV, or even the more modern phone screen, there’s limited screen real-estate. But removing that limitation creates a design problem…

The future is not prompt engineered

Let’s not pretend the importance of prompt engineering is ubiquitous. The most prevalent power of generative AI is in the way it adapts to us, not the other way around…

The typography of dates, times, & filenames

A deep dive into carefully considered date formatting, line length and general typography attributes of filenames…

Loosening the Shackles of Rapid Authoring Tools

Rapid authoring tools like Articulate Storyline and Evolve Authoring make sharing projects possible across a team of non-programmers, but your design must often adapted to the limited range of possibilities the tool allows…

Projects

Technical Articles

Prevent Vite doing a full reload

Vite’s auto refreshing can sometimes get in the way. Here’s a way to stop it…

Expo won’t connect to my physical device

React Native apps using Expo won’t connect to your physical device on locked down networks without tunnelling…

Define defaultProps near your props in JS

Most examples online define defaultProps after the class or function. Here’s why I define it before…

Creating a new filetype in Obsidian

Obsidian plugin development allows you to add support for new filetypes…

Extracting the extension from a filename string

Pulling the extension from a filename in javascript can be done in many ways. And it’s easy to do in a way that will create errors…

Register a new file type in Obsidian

A quick reference for creating a new file type in Obsidian plugin development…

Transparent React Native iFrames/WebViews

WebViews will become transparent iFrames when compiling for the Web, but won’t be transparent by default on iOS or Android…

Accessing the vault from An Obsidian CodeMirror plugin

Accessing the Obsidian plugin instance from a CodeMIrror view plugin extension isn’t immediately obvious from the Obsidian docs…

Modify the tlDraw store without firing listeners

tlDraw let’s you tie into listeners that fire whenever the user edits, moves, or selects something on the canvas, but they also fire when making changes programmatically…