2D Graphics

A Small Holiday Gift: Tools for Flow Launcher Power Users

Flow Launcher Plugin: Shortcuts and Shortcut Editor

This is a low-key release, offered in the spirit of Christmas Eve rather than a launch cycle.

Over the past little while I’ve been building a set of tools around Flow Launcher—tools I wanted for my own daily use, and which turned out to be broadly useful enough to justify cleaning up, documenting, and releasing publicly.

There’s no grand thesis here. Just three practical things, now open source:

  • A Flow Launcher plugin for managing shortcuts cleanly and sanely

  • A desktop editor that makes those shortcuts pleasant to work with

  • A developer skill / guide for people who want to build similar plugins themselves

All of it is MIT-licensed, free, and meant to be forked, modified, and quietly improved.

If you use Flow Launcher heavily, one or more of these may be useful to you.


1. Flow Launcher Shortcuts Plugin

Flow Launcher is already excellent, but I wanted a better way to manage frequently used paths, URLs, apps, and bookmarks—something structured, searchable, and predictable.

The result is the Flow Launcher Shortcuts Plugin, which adds a simple but flexible shortcut system directly into Flow.

You get:

  • Keyword-based access (s docs, s github, etc.)

  • Shortcuts for folders, files, apps, and URLs

  • Category grouping with explicit priority ordering

  • Per-shortcut icons

  • Context-menu actions for editing and management

  • A shortcutlist command that shows everything, grouped and ordered

  • Environment variable expansion (%USERPROFILE%, etc.)

It integrates cleanly with Flow Launcher’s JSON-RPC interface and behaves the way a native plugin should—fast, predictable, and unobtrusive.

This isn’t a flashy plugin. It’s meant to disappear into your workflow and stay there.


2. A Desktop Editor (Because JSON Should Be Optional)

Manually editing JSON for everyday workflow tools gets old fast. So alongside the plugin, I built a standalone desktop editor using PySide6 (Qt for Python).

The editor exists for one reason: to make shortcut management frictionless.

Features include:

  • A clean, modern Qt interface with proper dark-mode behavior

  • A table view of all shortcuts

  • Add / edit / delete dialogs with validation

  • Icon selection via file picker

  • Configurable storage location

  • Window state and settings persistence

  • A proper menu bar and About dialog

  • Automatic saving

The standout feature is browser bookmark import.

The editor can read bookmark data from Chrome, Edge, Brave, and Opera, recursively traverse folders, and let you selectively import bookmarks into Flow Launcher shortcuts. It handles non-standard locations and edge cases without drama.

This turns Flow Launcher into a fast, keyboard-driven bookmark launcher without requiring browser plugins or sync hacks.


3. Building Flow Launcher Plugins: Claude Skill and Practical Guide

While building the plugin, I ended up formalizing a lot of knowledge about how Flow Launcher plugins actually work in practice—what’s reliable, what’s fragile, and what patterns scale.

Rather than letting that knowledge evaporate, I wrote it down as a reusable developer skill / guide, structured so others can use it as a starting point for their own plugins.

It includes:

  • An overview of Flow Launcher’s plugin architecture

  • Common plugin patterns (search, actions, data-driven tools, utilities)

  • Production-ready templates

  • Notes on result ordering, scoring, context menus, and edge cases

  • Build and packaging guidance

  • Plugin Store submission workflow

If you’ve ever thought “I should write a Flow Launcher plugin someday,” this removes most of the archaeology phase.


Everything Is Open Source

All of this is available now:


Merry Christmas! Andy Moorer, Dec 24, 2025.

Change is good. And change is also terrifying. Keep. Creating.

I’ve been a bit frustrated with this site for a while, because there’s all this fascinating work I do at Meta Reality Labs, that I’d really love to share. While I know many people are reeling under the changes from AI technology as well as the difficult time both game and visual effects creatives have been facing as everything changes beneath us… Please don’t think I’m unsympathetic (or unaffected) when I say this: there has never been a more exciting time to work in CGI.

“Exciting” and “challenging” go together. It means we are in a period of great change. But I’ve found over the years that these are the kind of times when people also tend to do their most meaningful work. This is one of those points when reputations (and fortunes) are made, and when new paradigms and possibilities abound.

If you’re a professional struggling to find work or establish relevance in a world which may not demand some of your formerly most attractive skills, allow me to suggest that you step back a moment and remember that you ARE still relevant. Yes a toddler can now seemingly generate an image or video that would only have been possible through great effort just a few years ago, or vibe code an application that formerly took a team of engineers. All that means is that YOU can do the same, as well as so much more, by leveraging your less obvious skills which have now become massively relevant.

– Eye for quality and detail. – Understanding of process principles to achieve top results. – Industry understanding of tools, methods, ways to approach challenges and visualize your end goals early. – Discipline to slog through difficulties to get to somewhere extraordinary.

You may not be able to do the work you’ve spent decades doing. But that doesn’t mean you lack value. Do NEW stuff. Ride this wave, and go further, faster than you ever dreamt was possible. Or, to be a bit more militaristic in tone: Adapt. Overcome.

Change is struggle. But it’s also opportunity. Figure out where your brass ring is, and reach for it.

Update: It’s all about AI these Days

Ok, it’s been some time since I last posted. That is due in part to the fact that much of the work I’m doing for Meta Reality Labs is NDA’d and even the work I do in my personal time often touches on what I’m focusing on at work. I wish I could show off some of the stuff I’ve gotten into recently, it’s pretty amazing.

Here are a few thoughts. The world which has emerged is one of increasing rate of change. For Game Devs, VFX professionals and Technical Artists this change is almost overwhelming. AI is capable of generating astounding visuals in seconds from a simple prompt, as well as models, code, and even entire games. I see this generating a lot of angst 

and fear, and it certainly has changed the recruiting and hiring side of things.

But this kind of change has happened before. The emergence of CGI transformed filmmaking. Computer networks transformed all of

 society. The emergence of digital tools for artists decimated the once huge numbers of “draftsmen” working in architecture, construction and a host of other fields. In recent decades we have seen a LOT of change. Video killed the radio star, and then video on demand killed television, at least to the extent of replacing those media from their seemingly (at the time) unassailable positions as king of the hill.

Today influencers vie with A-listers for viewership, movie box office releases and television series compete for consumer attention with on-demand series, game titles, and social media.

Change is scary and disruptive.

But it can also be astoundingly beneficial. Artists of all kinds shouldn’t fear AI directly. Sure we will have to face uncertainty as job markets change and seek different skills. And that can be incredibly frustrating and challenging. But if you are a skilled professional you absolutely have the insights and talents necessary to thrive in a new world filled with AI. The ability to discern visual quality is still essential. The ability to organize and guide an effort to success is still relevant. “Production sense”, “vision”, an “artist’s eye”, and “creativity” all have as much value as they ever did.

Creative tools have changed and enabled the most unskilled an astounding degree of capability to produce impressive creative works. But that’s good, and doesn’t change the fact that those of us who have spent entire careers focusing on creating such imagery have gained a myriad of skills needed more than ever in assessing and learning to fully exploit these astounding new technologies and tools.

The key to relevancy today as a technical artist or professional creative in general is to ride this wave at it’s cutting edge. Our role in times like this is to identify the new creative opportunities inherent in these changes. Explore new mediums. Guide the engineers towards enabling better quality content as opposed to releasing a societal spam storm of mediocre content. Identify the new bar of quality and use AI and new methods such as gaussian splatting, realtime engines, spatial computing, code and asset generation, image and video generation in new ways. Creative ways.

We aren’t facing a disaster for creatives. It’s just change, filled with disruption of plans to be sure, but also filled with opportunity to be the ones who create entire new media, new forms of artistic expression, and creative content better than anything we dreamed possible in our lifetimes.

Surf this wave of change. Have fun with it. The core of what makes us creatives – vision, insight, keen minds and practical experience – is not at all devalued. Our use cases have just been reset, the canvas wiped clean. Now is the time to make your masterpiece.

Procedural Glyphs, another method

I thought I was done with the procedural glyphs project but it occured to me there was another approach I could take and I had to give it a try. The results are a bit closer to feeling handwritten. What would be really interesting would be to develop a continuous cursive-like script with some form of punctuation.

Update: Cursive writing GET.

Procedural Hatching

I’ve been using Shadershop as a tool to explore useful procedural functions. In this case I needed procedural hatching. A square wave was quick to define:
  In this case, all that we need to do is call a couple of floor functions. Frequency, phase and amplitude are easy enough to adjust after the fact just as you would any other periodic function. (A simpler method to create a square wave is to use a rounding function, but I wanted to see where Shadershop’s approach took me.)
  I then extrapolated this function into a vector2, skewed it with a 2×2 matrix, and voila. Shadershop makes figuring this kind of thing out much easier by using a visual workflow and graphing your function as you go. Very handy!

  You can do something similar with a 1d random function fract(sin(x)*999) to achieve a periodic 2d noise pattern.

  A simple crosshatch shader in unity can be made by adding two of the above square wave functions. In this case I used a min and max function to change the “pulse length” of the square wave. You can get a similar look by using the more common approach of establishing a sine wave which you then clip/threshold. I’m not sure which method would be faster… Here’s the basic shader:
 

Shader "Unlit/Test"
{
    Properties
    {
      _Density ("Density", Range(1,400)) = 150
      _Rotation ("Rotation", Range(0,360)) = 45.0
      _Width ("Width", Range(0,1)) = 0.4
    }
    SubShader
    {
        Pass
        {
          CGPROGRAM
          #pragma vertex vert
          #pragma fragment frag
          #include "UnityCG.cginc"
          struct v2f
          {
              float2 uv : TEXCOORD0;
              float4 vertex : SV_POSITION;
          };
          float _Density;
          float _Rotation;
          float _Width;
          v2f vert (float4 pos : POSITION, float2 uv : TEXCOORD0)
          {
              v2f o;
              o.vertex = UnityObjectToClipPos(pos);
              o.uv = uv * _Density;
              return o;
          }
            
          fixed4 frag (v2f i) : SV_Target
          {
            float sn, cs;
            sincos(radians(_Rotation), sn, cs);
            float2x2 mt = float2x2(cs, -sn, sn, cs); 
            float2 c = i.uv;
            c.xy = mul ( c.xy, mt );
            float hatch = max(abs(floor((c.x/2 - 0.5)/-1) 
                          + floor(c.x/2)+1),
                          abs(floor(((c.x-_Width)/2 - 0.5)/-1) 
                          + floor((c.x-_Width)/2)+1))
                          - min(abs(floor((c.y/2 - 0.5)/-1) 
                          + floor(c.y/2)+1),
                          abs(floor(((c.y-_Width)/2 - 0.5)/-1) 
                          + floor((c.y-_Width)/2)+1));
            return hatch;
          }
          ENDCG
      }
  }
}

  The problem with this kind of approach is that it’s overly complex. All of that min/max/floor stuff can be replaced with a much shorter step function. Same look, much more direct.
 

{
  float sn, cs;
  sincos(radians(_Rotation), sn, cs);
  float2x2 mt = float2x2(cs, -sn, sn, cs); 
  float2 c = i.uv;
  c.xy = mul ( c.xy, mt );
  float hatch = abs(step(1-_Width,sin(c.x)))
              + abs(step(1-_Width,sin(c.y)));
  return hatch;
}

  I added some lighting to the shader and here’s the result. Procedural and written entirely in notepad!

NPR Final Touches

It’s wrapping up, I’ve added all the bells and whistles – Ambient Occlusion, Depth fading, Image Adjustment, etc. Highlights can now be dialated or eroded. Support for separate outlines of normals. Presets and clean menus. I think this shader is about done.

The shader allows for a pretty broad array of looks, from architectural sketches to classic toon shading. Below is an example of a more painterly rendering.

Here are some presets:

NPR Shading Continued

I’m continuing to refine the NonPhotoRealistic (NPR) sketch post-process in Unreal. This is using completely different methods now, I’ve changed the method of convolution edge detection for outlines, and am using world-aligned sketch texturing in the shadow and highlight regions.

The background is also given a custom color and texture. The light source is defined through any number of unreal lights.

There is now support for sketchy highlights and varying line colors, and much better response to light. Ideally the post process would support variation in outline width, although I don’t have a good method for that yet.

There are options to use procedural line, dot and crosshatching for a more comic/newsprint look.

The results are very solid and smooth in motion, with no temporal swimming or distractions. I see this shader being ideal for architectural stylization and general NPR usage. 

To get a more chalk-like effect with ink outlines I take this post process and combine it with an NPR painterly process which applies brushstrokes on the image in world space. Here’s the result: