Code
Open-source bits I made
to make my life easier.
Everything below was created to solve a problem I had — most of them stayed small on purpose.
Stand-alone graphics tools
A normal map that visually rounds off the hard edges of a low-poly mesh is usually produced by modelling a high-poly version and baking the difference between the two surface directions into a texture. This tool skips the high-poly step. It evaluates Blender Cycles' svm_bevel shader node per texel, treating the low-poly mesh as both the sampling target and the shading surface. The output is a tangent-space normal map that, when applied to the same low-poly mesh in any PBR viewer, makes hard edges look like they were physically chamfered.
DownloadMost game engines ignore the blue channel of a normal map and derive it at runtime to save memory, so many artists pack other texture data into that channel. It works fine in the engine, but if you export the texture and use it in a DCC program it may not display correctly without a valid blue channel. This app reconstructs the blue channel from the existing red and green channels and lets you save the resulting normal map with all three channels intact.
DownloadTakes N input meshes, each with its own texture(s), and produces one square atlas texture plus N output meshes whose UV channel now points into the packed atlas. The transfer is pixel-based, not bake-based, sidestepping the usual baking artifacts — every output texel is sampled directly from one source texture via the barycentric coordinates of the triangle that covers it. What the artist painted is what lands in the atlas.
DownloadScripts / Plugins
A tool for managing and collecting Unity shader variants efficiently. Also ships a better inspector UI for the default Unity shader-variant-collection file editor.
ViewA 'portal' you place on glass or transparent surfaces in a mixed-reality scene so virtual objects behind the glass render correctly without sensor glitches on Meta Quest. Adds a green-channel mask to the depth mask (cameraRT) and replaces the environment-depth manager — meshes added to the manager aren't rendered themselves; they act as cut-outs that cancel real-world environment-depth data behind them. Drop a quad in front of a real glass wall and the virtual scene beyond it stops being falsely occluded.
ViewA Blender add-on that gives you a shelf-style toolbar for custom scripts, like Maya's shelf or 3ds Max's custom toolbar. Paste a script in, get a button to run it later. Rename, reorder, and organise as you like.
ViewBlender shapekeys driven by UV layout rather than vertex ID, so the source and target can have different vertex counts. Corresponding vertices are matched via UV coordinates. Demo on YouTube (no sound): https://youtu.be/wxlkXQNb7uE
ViewTransfers vertex world positions from a target mesh onto a source mesh, even when the two have different vertex counts. Works in object space or world space. Useful for aligning parts of character meshes, matching deformations, or syncing mesh segments. Demo: https://youtu.be/GZXPjzqsw8c
ViewA pie-menu for switching between Blender's edit modes, loosely based on Maya's right-click behaviour. Toggle between sub-object modes, object mode, and the context menu from a single radial gesture.
ViewA modern, full-compatibility replacement for Maya's native shelf. Import existing shelves, drag and drop (or Shift+Ctrl+click) to add items, customise triggers for primary/secondary actions and pop-up submenus, set custom backgrounds and tint icon colours, browse from any icon path you point it at, and edit multiple items in one go. Dock or float as many shelves as you like in vertical, horizontal, or flow layouts; horizontal shelves scroll on mousewheel, and the UI is hiDPI-aware.
ViewA small Python 3 script that adds fill-selection capability to Maya — borrowed from 3ds Max, where the feature was sorely missed on the Maya side.
ViewA UV packer that respects unselected UV shells and treats them as obstacles, and lets you group multiple shells together to be packed as a single unit. The packer relies on a C++ binary for speed — a Windows build is included; on macOS or Linux you'll need to build it yourself (CMake, no dependencies). A native AABB fallback is available if you'd rather skip the binary entirely.
ViewA Hypershade plugin that reconstructs the blue (Z) channel of a normal map from its red and green channels. Ships two nodes — one for the Maya viewport shader and one for Arnold.
ViewTurns selected objects or vertices into spheres, either from each object's pivot or from the centroid of the selection.
ViewA tool to transfer vertex IDs between two meshes that share topology — something 3ds Max couldn't do natively. Works regardless of mesh shape or UVs; you choose three matching vertices from source and target to anchor the transfer.
ViewGeneral-purpose tools
A headless terminal emulator built for native Windows that keeps isatty() returning true for spawned processes while staying either completely invisible or hidden in the system tray. Install with `winget install Revoconner.HeadlessTTY` or grab the latest release from GitHub.
DownloadAn offline standalone desktop application for Windows that automatically finds and groups all photos of the same person across your entire photo library. Instead of manually sorting thousands of photos, the app uses on-device face recognition to organise them for you.
DownloadBackblaze personal backup only lets you pick whole drives to back up, and any folder or file you add to the exclusion list affects every selected drive — no exclusion is tied to a single drive letter. So excluding C:\Windows also excludes D:\Windows, which is inconvenient. Backblaze does allow editing the exclusion list manually via an XML file, but doing that by hand is cumbersome. This program lets you exclude files or folders just by selecting them.
DownloadA simple add-on that lets you mute/unmute websites instead of individual tabs — works like Chromium's mute function. Right-click an open tab and click mute; all future tabs on the same domain will be muted. Clicking the add-on shows a list of muted websites and lets you unmute them directly. Shortcut: Ctrl + Alt + M.
DownloadAn AI personal assistant for Windows with multiple backends, built around existing accounts rather than API keys, with a focus on security and speed. Currently in alpha and not ready for general use.
View private repoAn MCP server paired with a Firefox browser extension that provides AI assistants with tab management, browsing history, and webpage text content. Tools include opening/closing tabs, listing open tabs, creating tab groups with name and colour, reordering tabs, reading and searching browser history, reading a page's text and links, finding and highlighting text in a tab, executing JS, filling forms, clicking elements, monitoring page changes, and searching/opening bookmarks. Example uses: play a song on YouTube Music, check Microsoft 365 calendar events, screenshot the active tab, resume playback on Prime Video.
DownloadA filename-search extension for the VS Code explorer (the built-in implementations leave a lot to be desired). Features: persistent state, option to hide files matching .gitignore patterns, three search modes (wildcard like *.cpp, regex with r: prefix, glob with g: prefix), sort options, and a right-click context menu with checksum hash support.
Download