All Posts

This is the feed for all posts on the site; projects, tools, blog posts, and more! If you want to view a specific category of post, use the menu at the top of the page, or the search feature.

Some random notes about issues encountered when developing with Astro for the first time, and fixes I came up with.

Why I've let myself fall prey to the age-old developer trap of rewriting my personal site yet another time.

Cover

A look at my favorite features of Svelte, comparisons to React and other frameworks, and what makes it a joy to use.

Cover

What are bash heredocs (Here Documents), and why they are so fun and useful to have. Covers both the basics and advanced usage and tricks.

Cover

How to write or paste Markdown into Slack messages and have it formatted correctly, while still keeping the format toolbar, by using HTML pasting.

Cover

Why we should all care more about higher-level documentation, a way to view documentation as a funnel, and an explanation of how things have changed.

Cover

A list of things I wish I had known sooner about using pytest and some general tips on usage and productivity with it.

How to delete all last.fm scrobbles of a specific track or album, with Tidal Advertisements as an example.

Simple JavaScript snippet to manage YouTube history in bulk

Cover

How to bypass the network connectivity error when trying to factory reset a Nook Simple Touch ereader from Barnes & Noble.

How to support the site, myself, and the content I produce.

I wrote several of the posts in this series, on how to build static web sites with the Gatsby.js framework, working with a Senior Technical Editor to get articles from idea to publication.

Cover

How to determine point intersection or collision detection with Canvas paths, with or without tolerances / buffers / padding.

Cover

An introductory guide to the different parts of Google Lighthouse, how to use it via CLI and NodeJS, and strategies for customizing its configuration.

Cover

How to use WebViewClient with Android WebView to hook into network requests, intercept them, and block or modify them if they match certain rules.

Cover

Demo weather app project, using Svelte, TypeScript, and Express to power a web interface with a location-based forecast, powered by the AccuWeather API.

Approaches for using CSURF for CSRF protection, but only on certain routes, and some with the ability to extract the generated token from the request.

Cover

Resources and information about the WaveShare line of NFC-Powered Passive E-Ink / E-Paper modules, complete with teardown pictures and some development tips.

Cover

Native Android application (Kotlin and Java) to update WaveShare Passively Powered NFC E-Paper Modules over NFC, and generate bitmaps for them.

How to use WebViewAssetLoader and WebViewClient, with Kotlin code and syntax, to load local HTML files from asset folders into a WebView component.

Cover

CLI and module for packing files into directories or archives, based on ignorelist files and glob patterns. Built with TypeScript and NodeJS, and highly configurable.

Cover

How to use TypeScript with WordPress Blocks and the Gutenberg environment. Covers config changes, necessary dependencies, and some possible issues.

Cover

How to use the Arc Canvas Web API method to draw partial filled circle segments, including quarter circles, and even with added rotation.

Cover

Reasons why every developer should care about documentation. Personal, business, and practical reasons why writing documentation is worth it.

Cover

How to use TypeScript, or JSDoc-powered JavaScript, with Service Workers, as well as some important caveats for current issues.

Cover

NodeJS-powered automation that extracts all the tutorial docs out of the Svelte repo and combines them into a single formatted HTML document.

Cover

A fun browser-based ring light / fill light app, that lets you control a virtual light on your screen.

How to split a string into individual characters in Google Sheets, using a pure formula approach. Even handles line breaks and special characters.

Cover

Project write-up for Brain Breaks Browser - a simple Preact-based web app to manage fun break exercises and activities, with a few added bells and whistles.

Cover

A guide on using SVG files with Svelte, and how to embed, inline-directly, or reference them, with or without rollup plugins.

Cover

A step-by-step guide on how to deploy a Preact app from a nested subdirectory, with instructions on updating Webpack, preact-router, and more.

! DRAFT !
Cover

Options for getting data feeds out of Google Sheets, avoiding slow-to-update published CSV feed URLs, and custom scripting with Google Apps Scripts.

Cover

A small web app with a shared login system to track the status of timed medication doses, as well as scheduled medications and therapy durations.

Cover

An effort to collect, categorize, and summarize some of the common CSS custom properties that are being used to maintain colors in modern theming approaches.

Want a clear visual indicator in your app or documentation so you know *exactly* which commit was pushed and successfully deployed? Then this post is for you.

Cover

An experimental project that delves into the idea of rendering non-video content in Picture-in-Picture windows, use-cases, and a discussion of the future.

Cover

Various ways to investigate stalled content attached to a MediaSource instance, and different causes that can be evaluated and tested.

Cover

Exploring different ways to append videos to a MediaSource instance with SourceBuffers and appendBuffer calls. Includes fully functional examples and tips.

Cover

The easy way to migrate from one subdomain to another, for the same site and primary domain, using Netlify Redirect settings and Custom Domain Aliases.

Cover

A comprehensive write-up on different ways to convert and use binary data in front-end JavaScript code, web browser APIs, and even your local filesystem.

Cover

An evaluation of different ways to backup and export Firefox Bookmarks, both manually and via automated scripts and tools.

Cover

A short guide on how to get and use local binary paths for packages installed through NPM or Yarn, under node_modules, for multiple OSes.

Cover

How to launch a shell with NodeJS, keep it open, and pipe commands in while capturing output. Also, a discussion on how this impacts performance.

A reusable method for adding arbitrary extra HTML attributes to enqueued styles and scripts in WordPress, using add_data and filters.

Cover

Online educational addition game, where you try to create sets of playing cards that add up to 10. Built with Svelte and TypeScript, published as open-source.

Cover

Researching and summarizing offline database options for modern web applications, including low-level APIs, helpful wrapper libraries, SDKs, and more.

Cover

How VSCode Snippets can be used to add support for a customizable Emoji-Log picker, with just a few lines of code you can paste into settings.

How to use various tools to extract the word count from a markdown file, or even the summed count across multiple nested markdown files.

How to disable Chrome's default stdout log messages that come through Selenium Webdriver on NodeJS, such as the "DevTools listening on ws..." message.

How to fix JSX TypeScript errors due to incompatible types between Preact and imported React component libraries, especially for JSX.Element.

How to get a list of all files in a project or directory, with inclusion and exclusion rules applied based on a .gitignore file.

Cover

CLI and module tool - static-build-cache package - built to help avoid redundant builds for static website projects.

Cover

How to fix Android's default Messages app having no notification sound for incoming text messages, even with ringer volume set to maximum.

Bookmarklet to enable Picture-in-Picture (PiP) support on sites that try to disable it, such as Hulu, and especially in browsers that honor it, such as Chrome.

How and why to use OS temporary directories to create files outside your source code directory for scripted tests.

Cover

Details on how default create-react-app projects will stall and fail to start on Glitch, and how to fix this issue with just a simple edit.

Cover

Simple NPM script for detecting whether your code is executing inside of Glitch or not. Detects based on environmental variables and/or hosting info.

Instructions on how to delete multiple files based on a pattern, even when nested, with SHX and ShellJS. Extra tips on using with NPM packages!

Cover

How to use Google Forms for quick user feedback collection, bug reporting, and the pros and cons of this approach.

Project and tool for generating IFrame embeds for any tweet from just the URL, no coding required or third-party scripts.

Cover

A custom built adapter box that turns an elliptical exercise machine into a Google Street View controller, via USB HID. Powered by Arduino.

Cover

How to find a webcam solution in 2020, during the shortage, that is affordable and usable for Zoom, Teams, and other video conferencing.

Cover

Different options for exporting profiles and connections from LinkedIn, and importing on other platforms, including VCard exports and integrations.

Cover

How to extend VR cables without experiencing tracking issues and glitches, and what solutions are available, such as USB extenders.

Cover

How to easily enable VSCode Intellisense and autocomplete within Webpack config JS or JSON files.

Cover

How to generate the perfectly sized cover images, with any input image, using Cloudinary's URL based transformations, overlays, and effects.

Cover

Using TP-Link Kasa, Google Apps Script, Android, and Automagic to automate my morning wake up alarm and turn on the lights.

Overriding the default behavior of keyboard key presses in browsers with JavaScript, to get ALT and arrow key combinations working with a SPA.

Cover

An experimental ReactJS project to turn text input into a point based graphical output, shown as a Github Contributions Graph mockup.

Cover

Documenting my search for the right software to use for remote elementary school tutoring sessions.

Cover

A reminder of the emphasis on opinions in Prettier's guiding principles, and how this can conflict with ESLint.

Cover

Why is mapping remote mouse controls, particularly click-and-drag, so complex and often left out of major mobile applications? I cover the options and answers.

Cover

Utility program, built with AutoHotkey, to use the right mouse button to start a click and drag operation. Useful for certain remote control / VNC clients.

Cover

How to setup NodeJS based tasks in Windows Task Scheduler, with details for both Yarn and NPM entries. Also explores comparison with CRON and alternatives.

An adventure in trying to write a Gatsby remark plugin to wrap specific markdown blocks (aka MD AST nodes) in custom classed div HTML elements.

Cover

5 powerful features that are built-in to Visual Studio Code and do not require any extensions or special toolchains to start using. Improve your dev workflow!

Cover

Details on using a Google Cloud Platform Function and NodeJS to maintain a fixed URL that forwards to a dynamic Ngrok host and can be easily redeployed.

Simple example showing how to use http-proxy-middleware with a NodeJS powered Google Cloud Function.

How to use .env files that are in a different directory than a docker-compose YML file, with variable substitution and relative paths. Options and workarounds.

How to test that an array does not include any members of another array with Chai JS and Mocha framework. Explains workaround and why certain tests don't work.

Information about public Reddit APIs, building post preview embeds, parsing Reddit JSON data, and an example of a custom Reddit embed generator.

Simple music meta info scraper bookmarklet, for a few sites. Grabs song title, artist, album title, and more, and then lets you copy to clipboard as TSV or JSON.

Tips and tricks on sharing global variable values, inject values, capturing variables, and general NodeJS workarounds for if you can't edit a file.

Cover

Figuring out why stat is returning blank birthtimes on Unix/Linux and how NodeJS got around this with an update to fs.stat through its libuv dependency.

Cover

Automated file timestamp extractor: git-date-extractor NPM package and CLI tool. The tool lets you retrieve file creation and modification dates based on Git history.

Cover

Solutions and tips on how to use "created" and "last updated" date and timestamps with Gatsby and Git, including a fully automated approach with git hooks.

Cover

A Markdown-sourced, Gatsby-powered mini-site that displays a bunch of my cheatsheets, code snippets, and miscellaneous programming notes as I collect them.

Cover

A beginner attempt at creating automatic folder directory listing index pages within Gatsby, using createPages, GraphQL, MarkdownRemark and allDirectory.

Cover

<!-- WP HTML export, not converted to MD --> <p>I recently wanted to force WordPress to make all my &lt;script&gt; and stylesheet (&lt;link&gt;) tags load relative URLs instead of absolute URLs, and ended up learning a bit about the internals of WordPress (pr...

Cover

So many options for building a theme switcher or customization - CSS, React, Vue, Sass, etc. Let's break these down into examples and simple descriptions!

Cover

An embeddable and interactive SASS-to-CSS playground, which can be dynamically generated and modified with custom settings and preloaded SASS/SCSS input.

Cover

An exercise in modifying the script and style tag HTML output by WordPress from enqueue, in order to add async, defer, and lazy loading attributes to resources.

Cover

How to get Github's language statistics breakdown bar to properly show Markdown stats for a repository, using Linguist and gitattributes.

Cover

A guide on mixing Sass-syntax and SCSS-syntax within a single Vue project, and how it can conflict with vendor Sass files, such as Vuetify.

Cover

A custom Google Data Studio connector, built from scratch with TypeScript, to pull in data from Toggl Time Tracker via API.

Cover

The custom WordPress theme that powers both the styling behind this site, as well as a lot of back-end logic that controls indexing, redirects, and more.

Cover

Tips, tricks, and gotchas, for building a Google Data Studio Community Connector on Google Apps Script. Covers some common issues and recommended approaches.

Cover

How to get the UTF-8 Character Code (aka codepoint) for a given character in Google Sheets. Custom formula converts from UTF-16 decimal to UTF-8.

Cover

How to embed your Google Apps Script in an iframe when a user needs to authenticate it first before it can work. Solutions uses JSONP to inform parent page.

Cover

How to look at the basics of a Chrome crash report on Windows, using WinDbg to view the minidump file, and how to enable logging on startup.

Cover

Information on using TypeScript with Google Apps Script and Google Ads, both with and without Clasp. Also discusses how Apps Script treats hoisting.

Cover

A lightweight browser tool for quickly exporting a LinkedIn profile page to a JSON Resume export. Grabs education, work positions, and even skills.

Cover

A breakdown of different ways to embed static and dynamic content into iframes, and dynamically generate iframe embeds on both the client-side and server-side.

Cover

Some random notes on using the Power BI Embedded Javascript APIs, such as resetting slicer visuals.

Some tips on using Fabric.js as a dependency in your project, without requiring that other devs have Cairo installed in order to build.

Reusable Node script that can be passed CLI arguments for a remote file to be downloaded, and optionally integrity checked against a known file hash.

Batch script to kill and restart dropbox client on Windows.

Some random tips and tricks I've been collecting as I work on developing my first VSCode extension.

Cover

Getting a JSON source for the AMP-List carousel element working in AMP for Email Playground - resolving CORs header issues through HTACCESS.

Cover

Quick demo to show a stream of Javascript DOM events emitted when users interact with a page.

Cover

A practical guide to GTM triggers, how they work, and Javascript alternatives if you can't use Google Tag Manager. Meant for both non-developers and developers.

Cover

Desktop Cloud Transform is an image uploader and transformation manager, which lets you apply complex alterations to your images all in the cloud. Built with QT/C++ and uses Cloudinary's image transformation services and API.

Using lambda expressions with QT's newer connect syntax to receive the finished event of a QNetworkRequest / reply without using QObject.

Exploring cross-platform coding library options for window manipulation, active window details, keypress emulation, and more.

Cover

A guide on implementing internal traffic filtering in analytics, as well as blocking tracking and ads for internal employees using IP addresses and/or cookies.

Tool for generating a regular expression (Regex) custom filter to match against multiple IP addresses at the same time, such as for Google Analytics.

Cover

Some simple ways to execute NodeJS code through the command line interface, as well as pipe output in and out.

Cover

A post on trying to get QT Creator to be able to, at the very least, build and run an example project for Android and see it on an emulator.

Cover

An ELI5 type post on how opacity inheritance works with nested components or elements in QML or CSS. Covers the easiest solutions for both QT's QML and CSS.

My experience as a brand new QT beginner while trying to use Font Awesome with QML / QT, dealing with relative import paths, and importing outside the source directory.

Some code examples on how to force wow.js (aka WOW) to trigger on content that suddenly becomes visible, and/or force it to reanimate on ANY element.

Cover

Work in progress - compiled tables of keycodes and related information for ASCII, QT, X11, and more - in one Google Spreadsheet, as well as some SQL stuff.

Cover

My first ReactJS project: a visual editor ("what-you-see-is-what-you-get" or "WYSIWYG") to arrange, preview, and generate dynamic Cloudinary transformation combinations and URL templates.

Some ideas and instructions on how one might go about setting up a system for remotely checking if their house has lost power or if it has been restored.

As a quick way to create typewriter effect videos, you can throw text in PowerPoint, apply an animation, and screen capture the presentation to GIF, MP4, etc.

Cover

I went overboard in trying to use Base64 encoding in Google Sheets and ended up coming up with a "pure formula" for generating Base64 from a text string, which does not require the use of custom scripting. This post covers that formula, how I came up with it, and scripting alternatives.

Cover

How to overlay solid shapes onto an image with Cloudinary, with demos and explanations. Useful for creating dynamic overlays, watermarks, and more!

Cover

Quick JS plugin for PrismJS (code embed syntax highlighter) that I put together, and use throughout this site . Typical "windows" style toolbar, with minimize/expand, fullscreen, and copy-to-clipboard buttons.

A tool for pasting in CSS and converting it to an escaped Javascript string. Options for keeping line breaks and tabs, or removing all (e.i. minifying).

Cover

A random list of issues encountered with Postman in 2019

Revisiting Chrome extension development after a while and outlining some things that have helped me with development and distribution.

Getting the Cloudinary JQuery SDK to allow an overlay transformation to overlay a remote fetched image - a painful lesson in reference materials.

Cover

The bookmarklet that I designed lets you add products to your Amazon wishlist from any site, including AliExpress and other competitors. No tracking!

Cover

How I setup an Android Automagic flow that will start, stop, or resume a Toggl timer when a Flic bluetooth button is pressed. Full Automagic export, plus demo.

Cover

A quick MaterializeCSS styled business card I threw together for this portfolio site.

<!-- 302 REDIRECT TO externally_hosted_code_url -->

Cover

A quick UI mockup, demo, and writeup I created for a feature a popular dating site could implement to improve the messaging experience and cut down on unwanted messages. Demo created using injected Javascript.

Cover

Click the image above to see a spreadsheet I compiled comparing various marketing reporting dashboards, BI tools, and more.

Cover

I developed a chrome extension for a popular online time clock so that you could clock in, clock out, and check hours all from an easy to use popup that can be interacted with no matter what page you are on.

Cover

A nifty little bookmarklet to test any webpage for Google Analytics, verify that event tracking is working properly, and return a list of all linked Google Analytics IDs!

Cover

A demo I made showing how the Wijmo combobox can be combined with a dynamic data source via AJAX, such as the Wikipedia API. Writeup includes demo, build steps, and discussion of cross-domain issues.

Cover

A code snippet I developed to have Google Scripts generate a direct link to a file in ExaVault via the ExaVault API, so it can be used with the Google Scripts URLFetchApp service.

Cover

Some photography samples of mine.

Cover

Click the image above to see how I successfully managed a student team in an electronic marketing class and led us to rank #1 overall in an online marketing simulation competition. I also managed to increase ROI to more than double its original amount, decrease cost-per-action to less than half, and boost our conversion ratio from 7.6% to 13.54%.

Cover

Another project involving both electronics and programming: a traffic light for a classroom that can indicate to students how much time is left to work on an assignment, or what the noise level of the classroom is at.

Cover

For a gift, I created a model bookstore in Sketchup (a 3D design program), figured out how to export to 2D files, and then printed a design that I assembled in real life.

Cover

My first programming and electronics project: a wireless water meter for an outside stream. There are two Arduino units that communicate over 2.4Ghz using the inexpensive nRF24L01+ radios, and send information about the water level of the outside stream, temperature, and humidity. Click the picture above for the full project writeup.

Cover

For my senior project in high school, I took close to 10,000 photos of the inside of the old Lake Washington High School, before it was demolished, stitched them together into panoramic images, and joined the panoramic files into a giant interactive tour. I al...