
    
        
        
    
            
    
        
    
            
        
        
    
            
        
        
    
            
        
        
    
            
    
        
    
            
    
        
    
            
    
        
    
            
    
        
    
            
    
        
    
            
    
        
    
            
    
        
    
            
    
        
    
            
    
        
    
            
    
        
    
            
    
        
    
            
    
        
    
            
    
        
    
            
    
        
    
            
    
        
    
        
{"version":"https:\/\/jsonfeed.org\/version\/1","title":"Skulkworks updates","home_page_url":"https:\/\/bigtwo.dev\/updates","feed_url":"https:\/\/bigtwo.dev\/updates.json","description":"Release notes and studio news for the Skulkworks Mac apps: what shipped in each version, and why.","author":{"name":"Andy Miller"},"items":[{"title":"RasterFox 3.2: JPEG XL","date_published":"2026-10-15T00:00:00+00:00","id":"https:\/\/bigtwo.dev\/updates\/rasterfox-3-2","url":"https:\/\/bigtwo.dev\/updates\/rasterfox-3-2","content_html":"<p><strong>RasterFox 3.2<\/strong> adds JPEG XL, the newer image format that makes smaller files than JPEG at the same quality and also keeps transparency and full color depth. Safari, Preview and Photos already open it, and now RasterFox can make it.<\/p>\n<h3>Two new output formats<\/h3>\n<p><strong>JPEG XL<\/strong> and <strong>JPEG XL Lossless<\/strong> sit in the Convert To menu alongside WebP, AVIF and PNG, and they work from anything RasterFox opens: JPEG, PNG, WebP, AVIF, HEIC, and JPEG XL itself. Lossless keeps every pixel exactly, transparency included, so it's a good home for screenshots and artwork you might want to edit again.<\/p>\n<p>JPEG is the case I like best. Save a JPEG as <strong>JPEG XL Lossless<\/strong> and RasterFox doesn't decode and re-compress it. It repacks the original JPEG data more efficiently instead. The file gets smaller with nothing lost, and the exact original JPEG can be rebuilt from it, byte for byte, whenever you need it back.<\/p>\n<p>Each preset has its own JPEG XL quality, and Settings and the compare window's inspector both have a JPEG XL section with <strong>Quality<\/strong> and <strong>Effort<\/strong> sliders. Higher effort makes smaller files and takes a little longer to encode.<\/p>\n<h3>Opening JPEG XL files<\/h3>\n<p>RasterFox now opens <code>.jxl<\/code> files as well. Optimizing one with <strong>Same as Original<\/strong> keeps it lossless or lossy, whichever it was, and never hands back a bigger file. Choosing <strong>JPEG XL<\/strong> for a lossless file converts it to the smaller lossy version. JPEG XL images can also be resized, upscaled, have their background removed, or be converted to any other format.<\/p>\n<h3>The command line too<\/h3>\n<p>The <code>rasterfox<\/code> command-line tool gets the same in <strong>2.3.0<\/strong>: <code>--to-jxl<\/code> (or <code>-x<\/code>) converts to JPEG XL, <code>--jxl-lossless<\/code> makes it lossless, <code>--jxl-effort<\/code> sets the effort, and <code>.jxl<\/code> files work as input everywhere. Update with <code>brew upgrade rasterfox-cli<\/code>, or install it with <code>brew install skulkworks\/tap\/rasterfox-cli<\/code>.<\/p>\n<p><strong>3.2 is a free update for existing RasterFox owners.<\/strong> The direct download will offer it through the app, or get it from the <a href=\"\/rasterfox\">RasterFox page<\/a> or with Homebrew: <code>brew install --cask skulkworks\/tap\/rasterfox<\/code>. The 14-day trial includes JPEG XL along with everything else, and converting to it is part of Pro afterwards, like WebP. Pro is $9.99 once. Everything is in the <a href=\"\/rasterfox\/changelog\">changelog<\/a>.<\/p>","summary":"RasterFox 3.2 saves and opens JPEG XL, in lossy and lossless versions, from every format it reads. The rasterfox command-line tool gets the same in 2.3.0.","date_modified":"2026-10-16T01:14:26+00:00"},{"title":"VectorFox 3.1: straight lines stay straight, and a cleaner trace from small images","date_published":"2026-10-05T00:00:00+00:00","id":"https:\/\/bigtwo.dev\/updates\/vectorfox-3-1","url":"https:\/\/bigtwo.dev\/updates\/vectorfox-3-1","content_html":"<p><strong>VectorFox 3.1<\/strong> is out. I spent a few days tracing the same dozen test images over and over, looking hard at where the results fell short, and this release fixes the four things that bothered me most. The one I kept coming back to was buildings.<\/p>\n<h3>Straight things stay straight<\/h3>\n<p>Trace a city skyline with <strong>Balanced<\/strong> in 3.0 and the windows came back as soft, slightly melted lozenges. You could fix it by going up to <strong>Detailed<\/strong>, but that doubles the file size for something that should have been right in the first place.<\/p>\n<p>The tracer smooths every outline before it fits curves. That's what you want for a wobbly hand-drawn edge. It is wrong for a window. So 3.1 looks for the straight stretches of an outline first, draws each one as a real line, and puts the corner back exactly where the two sides meet. Curves are left alone: a side has to end in a genuine corner to count, so circles and rounded shapes trace as they did.<\/p>\n<p>On my skyline test image, Balanced in 3.1 is now as accurate as Detailed was in 3.0, at less than half the size. Pixel art benefits too. A character sprite that used to come out as rounded blobs keeps its square steps.<\/p>\n<h3>Enhance<\/h3>\n<p>Small images are hard to trace well. There just aren't enough pixels along each edge. <strong>Upscale<\/strong> helps by doubling the image first, and 3.1 adds <strong>Enhance<\/strong> right beside it, which does that job with a small model that cleans the image up as it enlarges it. Soft edges come back crisp, JPEG fuzz goes away, and thin outlines that a plain upscale loses are kept.<\/p>\n<p>It runs on your Mac in a fraction of a second. Nothing is uploaded. On flat illustration, logos and AI-generated art it gives a cleaner result with 30 to 60% fewer paths at the Detailed preset, which also means a smaller file.<\/p>\n<p>But it isn't for everything, so it's off by default. It makes pixel art worse, and it does nothing useful for a photograph. It works on images up to 1024 px, when Upscale is doubling the image.<\/p>\n<h3>No more grey fringes<\/h3>\n<p>This one was a bug I'm glad to be rid of. The soft, anti-aliased edge of a flat shape looks like a tiny color ramp, and the tracer was faithfully fitting a gradient to it. The result was a faint grey halo around logos and mascots, and a much bigger file than the artwork deserved.<\/p>\n<p>Gradients are now fitted on the inside of each region only. My skyline went from 244 gradients to 37 and came out 30% smaller. Flat artwork loses the halo completely.<\/p>\n<h3>Also in 3.1<\/h3>\n<ul>\n<li><strong>Thin lines survive.<\/strong> Twigs, whiskers and fine strokes that were part of a larger piece used to get worn away into dashes. They're kept whole now.<\/li>\n<li><strong>Balanced keeps close tones apart.<\/strong> Two similar greens or two similar skin tones no longer merge into one. Files are about 8% larger...<\/li><\/ul>","date_modified":"2026-10-05T17:33:15+00:00"},{"title":"InboxFox 2.1: a message list that works like Mail","date_published":"2026-10-03T00:00:00+00:00","id":"https:\/\/bigtwo.dev\/updates\/inboxfox-2-1-0","url":"https:\/\/bigtwo.dev\/updates\/inboxfox-2-1-0","content_html":"<p><strong>InboxFox 2.1.0<\/strong> rebuilds the message list so it works the way <strong>Apple Mail<\/strong> does, adds an unread filter, and fixes how the window behaves when it gets narrow.<\/p>\n<h3>Select it, swipe it<\/h3>\n<p>The selected message now gets a full accent-colour highlight with white text. It stays that colour when you click into the search field, where it used to fade to a grey that was hard to see against the dark list.<\/p>\n<p>You can swipe too. Two fingers left on a message moves it to <strong>Trash<\/strong>. Two fingers right flips it between read and unread.<\/p>\n<p>Working on several messages at once has more to it:<\/p>\n<ul>\n<li>Select several messages, or everything with <strong>\u2318A<\/strong><\/li>\n<li>The <strong>Trash<\/strong> button in the list header deletes the selection, or the message you have open if nothing else is selected<\/li>\n<li>A new envelope button next to it marks the selection read or unread<\/li>\n<li>The right-click menu does all of the above<\/li>\n<\/ul>\n<p>The Trash button also had a bug: it could look enabled and do nothing when a message was open but no row was highlighted. That's fixed, and it now goes grey when there is nothing to delete.<\/p>\n<h3>Just the unread ones<\/h3>\n<p>A new filter button in the list header hides everything you've already read. A message you open stays in the list while you're reading it, even though opening it marks it read. It drops out when you move to another folder or switch the filter off.<\/p>\n<h3>A window that shrinks properly<\/h3>\n<p>Making the window narrow, or receiving a very wide email, used to push the sidebar off the left edge. The sidebar and the message list now keep their width, and the email pane is the one that gives way. The <strong>HTML \/ Text \/ Headers \/ Raw \/ Checks<\/strong> tabs wrap onto a second row when they run out of room, and a phone or tablet preview scrolls sideways if the pane is narrower than the device.<\/p>\n<p>The device previews are drawn properly as well. The email sits on a card at the width of the device, centred in the pane. Before, the white page stretched across the whole pane with the email in one corner.<\/p>\n<h3>Getting it<\/h3>\n<p>Use <strong>InboxFox \u2192 Check for Updates\u2026<\/strong>, download it from the <a href=\"\/inboxfox\">InboxFox page<\/a>, or install with Homebrew: <code>brew install --cask skulkworks\/tap\/inboxfox<\/code>. It's a free update. InboxFox is still free to use with a single inbox, and $9.99 once if you want an inbox per SMTP username, a custom port and bind address, and the HTTP API. The <a href=\"\/inboxfox\/changelog\">full changelog<\/a> has the details.<\/p>","summary":"InboxFox 2.1 rebuilds the message list around how Apple Mail works: a clear highlight, swipe to trash or mark read, an unread filter, and a window that shrinks properly.","date_modified":"2026-10-03T19:33:33+00:00"},{"title":"Riffle 2.3: fold the merge, and big files feel small","date_published":"2026-09-22T00:00:00+00:00","id":"https:\/\/bigtwo.dev\/updates\/riffle-2-3-0","url":"https:\/\/bigtwo.dev\/updates\/riffle-2-3-0","content_html":"<p>A merge of a long file is mostly lines nobody changed. The conflicts are six places in forty thousand lines, and the work is getting from one to the next without losing your place. <strong>Riffle 2.3.0<\/strong> brings the fold you already use in a diff to the merge window, and makes large files of every kind noticeably faster.<\/p>\n<h3>Hide unchanged lines in a merge<\/h3>\n<p>The merge window can now fold long runs of unchanged lines, the same way a two-way comparison does. Each fold closes in the local, result, and remote panes together, keeps three lines of context next to every change, and its seam stays level across all three panes as you scroll.<\/p>\n<p>Click a seam to open it, or <strong>&#8997;-click<\/strong> to open everything. The gutter chevrons open and close one run at a time, and the footer has a <strong>Hide Unchanged Lines<\/strong> toggle and a count of how many lines are hidden, which you can click to show them all again. It follows your existing Hide Unchanged Lines preference, so a long merge opens already folded if that's how you like to work.<\/p>\n<p>The result pane is the file you're writing, so it's careful about folds. Find still searches folded lines, and stepping onto a match opens the fold around it. If you type into a fold, or the caret moves into one with an arrow key, the fold opens rather than letting you edit lines you can't see. Resolving a conflict next to a fold leaves it where it is.<\/p>\n<h3>Large files, much faster<\/h3>\n<p>This release went looking for everything that still made a large comparison feel heavy, and it found a lot:<\/p>\n<ul>\n<li><strong>Reloading no longer freezes the window.<\/strong> After you had scrolled down through a large file, anything that reloaded it (a fold, &#8984;R, a whitespace or view change, the file changing on disk) could stall for seconds. On a 60,000-line file that went from 19 seconds to under one.<\/li>\n<li><strong>Jumping deep into a file is instant.<\/strong> Change bands and line numbers appear straight away, and the text follows a moment later instead of the window waiting for it.<\/li>\n<li><strong>Large merges open and scroll smoothly.<\/strong> A 40,000-line merge opens more than ten times faster, and scrolling it no longer stutters.<\/li>\n<li><strong>Folding and syntax coloring start faster<\/strong>, with fold toggles on very large comparisons up to 18 times quicker.<\/li>\n<\/ul>\n<h3>Text that stays in line<\/h3>\n<p>Two alignment bugs are gone as well. Deep in a large file, the unified view and the merge result could show text thousands of rows away from its own line numbers and change bands. And in fonts with extra line spacing, such as Inconsolata, every blank line was drawn a fraction too tall, so the text slowly drifted away from its markers further down the file. Every row is now exactly where its line number says it is, in every font, and the text itself sits where it always did. The merge result's gutter also makes room for five-digit line numbers instead...<\/p>","summary":"Riffle 2.3 folds unchanged lines in the merge window and makes large files much faster to open, reload, jump around in and scroll.","date_modified":"2026-09-22T22:41:23+00:00"},{"title":"Riffle 2.2: room for more than one comparison","date_published":"2026-09-17T00:00:00+00:00","id":"https:\/\/bigtwo.dev\/updates\/riffle-2-2-0","url":"https:\/\/bigtwo.dev\/updates\/riffle-2-2-0","content_html":"<p>Sometimes you need two comparisons open where you can see them: a working-tree review on one display, a merge on another, or a pair of snippets beside the files they came from. <strong>Riffle 2.2.0<\/strong> adds independent windows, along with a round of improvements to pasting, whitespace, and the little bits of the interface you use all day.<\/p>\n<h3>Give a comparison its own window<\/h3>\n<p><strong>&#8679;&#8984;N<\/strong> opens a new window. <strong>Move Tab to New Window<\/strong>, in the File menu and the tab's right-click menu, takes an existing comparison with it. Your unsaved edits, undo history, search state, and scroll position all come along. If separate windows are how you prefer to work, General settings now lets you choose <strong>Tabs or Windows<\/strong> for new comparisons.<\/p>\n<p>Opening something that's already in another window takes you back to that comparison. A command-line merge waiting for you to finish keeps waiting when you move its tab, and reports the result when you actually finish. Closing a window checks every tab in it for unsaved work; quitting checks every window.<\/p>\n<h3>Copy, paste, compare<\/h3>\n<p>You can now press <strong>&#8984;V<\/strong> on the welcome screen to start a comparison with your clipboard text on the left. Paste the other version on the right and you're ready to read. <strong>&#8984;N<\/strong> opens an empty comparison, and the welcome panel puts <strong>New Comparison<\/strong> and <strong>Paste to Compare<\/strong> together alongside the file and merge options.<\/p>\n<p>There was also a frustrating bug in this workflow: pasting into an empty or padded pane could lose real blank lines, making identical text look different. That's fixed. Blank lines stay where you put them, and an empty pane in Blocks view reliably accepts a click so you can paste into it.<\/p>\n<h3>Whitespace settings reach inside the lines<\/h3>\n<p>Riffle already knew how to ignore whitespace when deciding whether a line had changed. The highlights inside a changed line were still comparing everything exactly, though, so a real edit could bring a lot of ignored spaces along for the ride.<\/p>\n<p><strong>Ignore Trailing<\/strong> and <strong>Ignore All<\/strong> now apply to those inline highlights and insertion markers too, across Blocks, Fluid, Unified, and the input panes of a merge. Change a value and reindent the line, and Ignore All keeps your attention on the value. Highlights also stay in the right place when Unicode text appears before the edit.<\/p>\n<h3>A quieter diff, and clearer navigation<\/h3>\n<p><strong>Unchanged lines are dimmed by default.<\/strong> They remain readable at half opacity while changed text keeps its full contrast. It makes a small edit easier to find in a long file without folding away the context. You can turn it off in General settings, and an existing preference is respected.<\/p>\n<p>Stepping past the last change now briefly shows a large loop icon in the center of the diff area, so wrapping back to the first is easy to notice. Going backward past the first does the same. In a review, stepping into the next file still works as before.<\/p>\n<p>The footer also behaves better when a wide...<\/p>","summary":"Riffle 2.2 adds independent windows, Paste to Compare, dimmed unchanged lines, and fixes for whitespace highlighting and pasted text.","date_modified":"2026-09-17T17:00:31+00:00"},{"title":"FoxSay 2.2: dictation that types while you talk","date_published":"2026-09-13T00:00:00+00:00","id":"https:\/\/bigtwo.dev\/updates\/foxsay-2-2-0","url":"https:\/\/bigtwo.dev\/updates\/foxsay-2-2-0","content_html":"<p>I've been holding a key, talking, and waiting for FoxSay to catch up for months. <strong>2.2<\/strong> stops the waiting. There's a new speech model that transcribes while you're still speaking, and the words go into whatever you're typing in as they come out of your mouth, not after you let go.<\/p>\n<h3>Nemotron Streaming<\/h3>\n<p>Every model FoxSay shipped with until now works the same way: you talk, you release the key, and then the transcription runs. That's fast. Parakeet gets through 17 seconds of audio in under two tenths of a second. But nothing appears until you've finished talking.<\/p>\n<p><strong>Nemotron Streaming<\/strong> is different. It's NVIDIA's cache-aware streaming model, running on the Neural Engine through FluidAudio, and it decodes in half-second chunks as the audio arrives. Text shows up in the overlay about half a second behind your voice, and lands in your document at the same time. Letting go of the key finishes in about two hundredths of a second, because the work is already done.<\/p>\n<p>Your prompts and dictionary still apply. When the AI pass rewrites what you said, FoxSay takes back only the words that actually changed and types the correction. Most of the time it changes nothing, because what's on screen is already right.<\/p>\n<p>It's English, about 590 MB, and you'll find it in Speech Models next to Parakeet and Whisper. It is not the default and it never downloads on its own. Pick it if you like watching the words appear. Parakeet is still the better choice if you don't.<\/p>\n<h3>The overlay shows up when you press the key<\/h3>\n<p>This one bothered me more than it should have. The recording overlay used to wait for microphone permission, a model check and the whole audio engine to spin up before it drew anything. On a warm Mac that was about half a second. On a cold or Bluetooth microphone it was worse, and it made a fast app feel slow for no reason at all.<\/p>\n<p>Now it's on screen in about a tenth of a second. The audio work still happens, it just happens behind a card that's already visible.<\/p>\n<h3>And recording starts three times faster<\/h3>\n<p>FoxSay used to build its entire audio capture chain from scratch on every single press: a new engine, format negotiation with the device, a new tap, a resize of the device's buffer. That's roughly 100ms of work you paid for on every dictation, plus the time to actually start the engine.<\/p>\n<p>It now builds that once and keeps it. Pressing the key to actually capturing audio used to take 240ms to 340ms. It takes 76ms to 81ms now. The microphone is still released between dictations, so the orange recording dot in your menu bar behaves exactly as it did, and the whole thing is handed back after a minute of not dictating.<\/p>\n<p>One more from the same family: pressing the hotkey during the model preload at launch used to wait for that preload to finish. FoxSay asked the speech model whether it...<\/p>","date_modified":"2026-09-14T04:04:31+00:00"},{"title":"VectorFox 3.0: real gradients, a live preview, and presets built for AI art","date_published":"2026-08-27T00:00:00+00:00","id":"https:\/\/bigtwo.dev\/updates\/vectorfox-3-0","url":"https:\/\/bigtwo.dev\/updates\/vectorfox-3-0","content_html":"<p><strong>VectorFox 3.0<\/strong> is a new tracing engine wearing the same app. The tracer is now vtracer 1.0 with VectorFox's own gradient fitting on top, compiled into the app rather than run as a separate program, and nearly everything else in this release follows from that: a preview that moves while you drag a slider, output an editor can actually work with, and presets for the images people really drop on it in 2026, which are mostly made by an image generator.<\/p>\n<h3>Gradients: the thing no other tracer does<\/h3>\n<p>Every tracer fills a region with one flat color. Give one a glossy button or a shaded logo and you get stripes, or a single averaged color, and no setting fixes it. VectorFox recognises where a region's color genuinely ramps and fills it with a real SVG <code>&lt;linearGradient&gt;<\/code> or <code>&lt;radialGradient&gt;<\/code> fitted to the original pixels, highlight and falloff included. Where tracing has to cut a smooth ramp into bands, those bands share one gradient, so the seams disappear instead of showing as steps. Take the Firefox logo: a 406 KB PNG comes out as a 53 KB SVG of 34 paths, and the globe's radial, the fox's belly and the flame of the tail are all gradients you can select and re-tint, not stacks of orange slivers. 3.0 fits those gradients more closely and more cheaply than 2.0 did, and identical ones share a single definition.<\/p>\n<h3>Made for AI art<\/h3>\n<p>Image generators produce bitmaps of things that were meant to be vectors: flat illustrations, logos, stickers, icons. The new <strong>AI Art<\/strong> preset is built around exactly that: clean edges, one piece per color, up to 32 colors, gradients kept where the image really has them. An illustration that traced to 719 paths in 537 slightly different colors now comes out as 37 paths in 37 colors, and opens in Illustrator or Affinity as something you can select and recolor. <strong>Balanced<\/strong> now cuts along edges rather than by color, so a soft shadow in the same hue as what it falls on, or the layers of a tail drawn in one color, stay their own pieces. <strong>Clean Bands<\/strong> turns shadows and glows into a few smooth bands for the poster look, and <strong>Logo<\/strong> replaces Simplistic with a 12-color cutout that emits true circles and rectangles.<\/p>\n<p>VectorFox also says so, up front, when an image is a poor candidate. Each file gets a Good, Fair or Poor fit label with a plain reason, and a batch with Poor images gets one warning with Convert Anyway or Skip These. Photographs were never something a tracer could do well; the app now tells you rather than letting the result do it.<\/p>\n<h3>A preview that keeps up<\/h3>\n<p>Every trace used to write a PNG to disk, launch a helper and read the result back. With the engine in-process and keeping its work between runs, changing a curve or color setting re-traces in about a tenth of a second, so the inspector is live: drag a slider and...<\/p>","date_modified":"2026-08-28T10:43:16+00:00"},{"title":"Magpie 2.2: your keystrokes, in the recording","date_published":"2026-08-08T00:00:00+00:00","id":"https:\/\/bigtwo.dev\/updates\/magpie-keystrokes","url":"https:\/\/bigtwo.dev\/updates\/magpie-keystrokes","content_html":"<p>A recording of somebody using keyboard shortcuts is close to useless if you can't see which keys they pressed. <strong>Magpie 2.2<\/strong> can draw them into the video: an optional overlay puts what you type along the bottom as chips, plain typing reads as a running line, shortcuts get a chip of their own (<code>\u2318\u21e7S<\/code>), and the line fades when you pause.<\/p>\n<p>It's drawn into the recording only. Your screen looks exactly as it always does while you work, nothing is ever stored, and window recordings get it just like full-screen ones. Settings \u25b8 Capture \u25b8 Recording holds the default and a display-time picker. Seeing keys typed into other apps needs the Accessibility permission, which is the one thing here that will ask you for something.<\/p>\n<p><strong>Per-recording toggles<\/strong> arrived alongside it. System audio, microphone, click highlighting and keystrokes each have a button on the pre-record panel next to the format picker. They start at your Settings defaults, now labeled \"by default\" to make the relationship obvious, and they apply to that one recording. Flipping the mic on for a single video no longer turns it on for every video after it. Version 2.2.1 pulled the cursor setting into the same arrangement and split it in two: screenshots default to hiding the cursor, because a screenshot usually wants a clean image, and recordings default to showing it, because a recording is usually following the pointer.<\/p>\n<p>If you annotate most of what you capture, Settings \u25b8 General has a new <strong>After capture<\/strong> option that sends every finished screenshot straight into the editor. Recordings and animated exports are left alone.<\/p>\n<p>The overlay's Quick Look is the real thing now, the same panel Finder uses. It opens centered and resizable, a tall scrolling capture can be panned and zoomed instead of being squeezed into a fixed frame, recordings play with native controls, and there's an \"Open with Preview\" button in the title bar.<\/p>\n<p>Three small ones to finish. The click ripple lingers a touch longer (0.7s rather than 0.45s) so it reads as a pulse instead of a blink. JPEG captures encode at quality 93 instead of 90, for crisper text when JPEG is what you've chosen. And pressing a capture shortcut while a selection is already on screen no longer stacks a second selection on top of the first and leaves it waiting underneath once you've finished the one you could see.<\/p>\n<p>Magpie is $9.99 one time for 3 Macs, with a 14-day full Pro trial and screenshots free forever after that. Grab it from the <a href=\"\/magpie\">Magpie page<\/a> or with Homebrew: <code>brew install --cask skulkworks\/tap\/magpie<\/code>. Full details are in the <a href=\"\/magpie\/changelog\">changelog<\/a>.<\/p>","date_modified":"2026-08-09T14:21:28+00:00"},{"title":"Riffle 2.0: it writes back","date_published":"2026-08-07T00:00:00+00:00","id":"https:\/\/bigtwo.dev\/updates\/riffle-2-0-released","url":"https:\/\/bigtwo.dev\/updates\/riffle-2-0-released","content_html":"<p>Riffle 1.0 could show you anything and change nothing. Every review ended the same way: you read the diff, you knew which three hunks were ready, and then you went to a terminal to say so. Riffle 2.0 is the release where that trip stops being necessary.<\/p>\n<p>A working-tree review can now change the index. Stage, unstage or discard whole files from the file list, or one hunk at a time from the footer of the diff. The unit is git's own hunk rather than Riffle's change block, so what gets staged is exactly what <code>git add -p<\/code> would have staged. The same thing, from a window where you can actually see it. Discarding always asks first, and sends the file to the Trash rather than deleting it.<\/p>\n<p>The file list grew up to meet that. Files group by directory (flat, grouped, or a full tree) with the common root named once above the list instead of repeated down every row. There is a filter, per-status counts, and a dot on each row saying whether it is staged, unstaged, or partly both. Ninety-eight changed files is a list you can work through now instead of a wall.<\/p>\n<p><strong>History arrived too.<\/strong> Every commit that touched the file you are reading sits beside its diff, newest first. Click one to load that revision into the left pane and read the file as it was against the file as it is. A blame column shows who last touched each line, with consecutive lines from one commit drawn as a single block labelled once, and clicking it opens the commit behind it. And a branch or pull request review has a Files &#8644; History toggle of its own, listing the commits in the range, any of which opens as a review in its own right.<\/p>\n<p>Three smaller things that change how a long review feels. &#8984;&darr; no longer stops at the end of a file. It carries on into the next one, and the footer says where you are: \"File 3 of 12 &middot; Change 2 of 5\". A review left Live can tell you when the repository moves while you are somewhere else, and a burst of a hundred changes is one notification rather than a hundred. And image comparisons got a pixel inspector: hover anywhere for both sides' colour, the per-channel difference, and a &Delta;E00 that says whether the difference is one a person could actually see, along with the colour space each file declares, which is very often the entire reason two identical-looking images differ in every pixel.<\/p>\n<p>Riffle 2.0 also has a new icon. Same riffled fan of cards, but the front card is split down the middle now, with a column of lines either side. It reads as a diff rather than as a stack of paper, and it is drawn on Apple's real continuous-corner tile, with a layered version for macOS 26.<\/p>\n<p><strong>If you already own Riffle, 2.0 is free.<\/strong> Lifetime Access means lifetime access. There is no...<\/p>","date_modified":"2026-08-09T14:21:28+00:00"},{"title":"Magpie 2.1: straight into the editor","date_published":"2026-08-07T00:00:00+00:00","id":"https:\/\/bigtwo.dev\/updates\/magpie-capture-and-annotate","url":"https:\/\/bigtwo.dev\/updates\/magpie-capture-and-annotate","content_html":"<p>Taking a screenshot you already know you're going to annotate meant taking it, waiting for the overlay card, and hitting a small button on a thumbnail before it timed out. <strong>Capture &amp; Annotate<\/strong> (<code>&#8997;&#8679;E<\/code>) skips all of that: drag out an area and land in the annotation editor. It has its own row in Settings &#9656; Shortcuts and its own entry in the menu-bar menu.<\/p>\n<p>The other change is at the other end of a recording. The pre-record panel now carries <strong>system audio and microphone toggles<\/strong> next to the format and frame-rate pickers, so turning the mic on is a decision you make where you start recording rather than a trip into Settings beforehand. Switching it on asks for permission right there, and if you denied access at some point in the past it sends you to the Microphone privacy pane instead of failing silently. A <strong>Microphone picker<\/strong> in Settings &#9656; Capture &#9656; Recording lists every input on your Mac: \"System Default\" follows the macOS Sound setting, and pinning a specific mic falls back to the default if it happens to be unplugged when you hit Record.<\/p>\n<h3>Scrolling capture stops fighting you<\/h3>\n<p>Scrolling capture used to take your mouse for the duration. It doesn't now. The pointer is placed inside the region once, when the capture starts, and after that it's yours: move it within the region and the scrolls follow it, move it outside and the capture simply pauses (the chip says \"Paused\") until you bring it back. Stop and Cancel are reachable the whole way through.<\/p>\n<p>The edge handles are also visible for the first time. They were described in the hint, but they drew nothing at all, and macOS routes clicks in fully transparent window areas straight through to whatever is underneath, so they couldn't be clicked either. Each edge has a grabber tab now. The hint tells the truth too: fixed headers and footers are detected automatically, and the handles are there for marking one yourself when the detection needs help.<\/p>\n<h3>Two fixes from 2.1.2 worth knowing about<\/h3>\n<p>Microphone recording didn't work at all in the shipped 2.1 build. The release was missing the hardened-runtime audio-input entitlement, so macOS denied access silently: no permission prompt ever appeared, and Magpie never even showed up in System Settings &#9656; Privacy &amp; Security &#9656; Microphone. If you tried the new mic toggle and got nothing out of it, that's why, and 2.1.2 puts it right.<\/p>\n<p>Captures also match your screen again. Screenshots were being converted to sRGB on the way in, which on a wide-gamut Mac display clamps colors and dims antialiased text, so captures came out slightly washed out and fuzzier than the real thing. Every capture is now taken and saved in <strong>Display P3<\/strong> with the profile embedded, and it survives the whole pipeline: scrolling stitches, Retina downscaling and annotated exports all keep the wide gamut. The color picker still reports hex in standard sRGB, so picked values keep matching what design tools expect.<\/p>\n<p>Magpie...<\/p>","date_modified":"2026-08-09T14:21:28+00:00"},{"title":"Riffle 1.6: fix it where you found it","date_published":"2026-08-05T00:00:00+00:00","id":"https:\/\/bigtwo.dev\/updates\/riffle-editable-diffs","url":"https:\/\/bigtwo.dev\/updates\/riffle-editable-diffs","content_html":"<p>You're reading a diff, you spot a typo, and now there's a small errand: find the file in your editor, find the line, fix it, save, switch back, refresh. <strong>Riffle 1.6<\/strong> deletes the errand. A diff pane whose file is yours is editable in place. You see the typo, you fix the typo, you press <code>&#8984;S<\/code>, and the diff re-runs from what you just wrote. Each side saves on its own (<code>&#8984;&#8679;S<\/code> writes both), the reader keeps its place across the save, and undo stays inside the pane you typed in.<\/p>\n<p>The interesting part was deciding what counts as \"yours\", because most of what Riffle shows isn't what it looks like. Riffle stays read-only unless it can prove otherwise. Your own files and both sides of a folder comparison are editable. A git review's two sides are blobs materialized into a temp tree, a <code>git difftool<\/code> older revision is a copy git is about to delete, and a <code>--pairs<\/code> manifest's left side is the \"before\" snapshot the whole review is built on. None of those take a save, and none of them offer one. A manifest's right side, which is the real file under review, does.<\/p>\n<p><strong>Tabs got names and colors.<\/strong> Double-click a tab to rename it, or right-click for Rename and a set of eight colors that tint its icon and wash its background just enough to pick out across the strip. That becomes useful the moment you have several agent reviews open and the derived names all read alike. \"Use Automatic Name\" puts a tab back to following its files.<\/p>\n<p>Tabs also <strong>land where they should<\/strong> in the diff itself. A tab now advances to the next multiple of the tab width instead of TextKit's 28-point default, which corresponded to nothing in a monospaced font, so tabbed and space-indented lines finally line up in the same column. Settings &#9656; General sets the width to 2, 4 or 8. It changes what you see and never what's written to a file.<\/p>\n<p>A pane with unsaved work grows a <strong>revert<\/strong> control beside its save glyph, for the edit you made by accident. It puts the file back as one undoable step, so <code>&#8984;Z<\/code> brings your work back if the revert was the mistake.<\/p>\n<h3>The details around editing<\/h3>\n<p>Typing is colored as you type, so a line you add is syntax-highlighted like the rest of the file rather than sitting there plain until the next save. A new line keeps the indentation of the one it came from, which is the one editing convenience worth having here, because landing in column zero inside indented code is wrong often enough to notice. Unsaved changes are marked with a slowly pulsing red dot beside the filename, and it holds still when the system asks for reduced motion.<\/p>\n<p>While a pane holds unsaved typing its change bands go faint and its intra-line boxes and end-of-line marks stand down, because they describe the file as it was loaded and a decoration that isn't...<\/p>","date_modified":"2026-08-09T14:21:28+00:00"},{"title":"Riffle 1.5: bring your own themes and languages","date_published":"2026-08-04T00:00:00+00:00","id":"https:\/\/bigtwo.dev\/updates\/riffle-themes-and-languages","url":"https:\/\/bigtwo.dev\/updates\/riffle-themes-and-languages","content_html":"<p>Riffle ships around 60 themes and knows 46 languages, and until now that was the end of the conversation. If your theme wasn't in the list, or your file type wasn't recognized, there was nothing you could do about it. <strong>Riffle 1.5<\/strong> opens both up.<\/p>\n<p>Settings has a new <strong>Syntax<\/strong> tab that manages themes: add one from disk, see what you've added, remove one when you're done with it. It reads the VS Code \/ shiki theme JSON that nearly every editor theme is published as, and real TextMate <code>.tmTheme<\/code> files too, so a theme you've carried around for a decade still works. Themes published as JSON with comments in them, which Cobalt2 and Shades of Purple both are, no longer get turned away at the door.<\/p>\n<p>The same tab browses a <strong>gallery<\/strong> of themes and languages published alongside Riffle's updates, with a preview of each theme's colors, who made it and under what license, and one click to install. It's a feed rather than something baked into the app, so new entries appear without waiting for a Riffle release, and it works offline by showing the last catalog it downloaded.<\/p>\n<p><strong>Languages take the same treatment.<\/strong> A language is a JSON file naming the extensions it claims plus its keywords, comment markers and string delimiters, dropped in <code>~\/Library\/Application Support\/Riffle\/Languages<\/code> or installed from the gallery. At its smallest it's four lines pointing an extension at a language Riffle already knows, which is all it takes to color <code>.blade.php<\/code> as PHP or your in-house <code>.conf<\/code> dialect as INI. Multi-part extensions work and beat a shorter match, so a Blade definition takes <code>page.blade.php<\/code> while plain <code>.php<\/code> files stay PHP. Comparisons you already have open re-read themselves when you add or remove one, so there's no closing and reopening tabs to see the change.<\/p>\n<p>Thirteen languages are ready to install from the gallery on day one, including AL for Microsoft Dynamics 365 Business Central, Blade, Liquid, Jinja, Handlebars, PowerShell, Julia, Solidity, F#, Groovy and Jenkins pipelines, Prisma, MDX, and <code>.env<\/code> files.<\/p>\n<h3>Reviewing a list of files<\/h3>\n<p><code>riffle review --pairs &lt;manifest.json&gt;<\/code> opens the review window over any set of before\/after pairs a JSON file names, with no repository involved at all. Add <code>--watch<\/code> and Riffle re-reads the manifest whenever it changes, revising the rows it changed and adding the ones it newly touched, in the window that's already open rather than in another one. It's built for coding agents and useful to anything that can write a list: a build's before and after outputs, a migration's inputs, a batch of generated files.<\/p>\n<p>The <strong>Riffle plugin for Claude Code<\/strong> uses it. The end of an agent's turn now opens one window listing every file it changed, each against a snapshot taken before the agent first touched it, instead of a tab per file capped at five. Later turns land in the same window. Files you edited yourself are still excluded, which is the entire reason for the snapshots. The tab is named after the project, so...<\/p>","date_modified":"2026-08-09T14:21:28+00:00"},{"title":"Riffle 1.4: reviews that stay live","date_published":"2026-08-04T00:00:00+00:00","id":"https:\/\/bigtwo.dev\/updates\/riffle-live-reviews","url":"https:\/\/bigtwo.dev\/updates\/riffle-live-reviews","content_html":"<p>Two shorthands first, spelled the way you'd say them. <strong><code>riffle diff<\/code><\/strong> reviews everything you've changed but not committed. <strong><code>riffle show<\/code><\/strong> reviews the commit you just made, and <code>riffle show HEAD~1<\/code> the one before it. Both open the same file list beside an inline diff that <code>riffle review<\/code> opens, and both take every option it takes.<\/p>\n<p>The bigger change is that a review can now <strong>stay live<\/strong>. <code>riffle diff --watch<\/code>, or the new Live button in the review window, keeps the file list and the diffs current as the repository changes, so edits, commits, staging and new files all appear on their own. Leave it open on a second screen beside your editor, or beside a coding agent, and watch the work land instead of reaching for refresh. Files that just changed get a dot, and your place in whatever you're reading is kept. It's available for the working tree and the staged index. A commit, branch or pull request review compares two fixed commits, so there's nothing there to watch.<\/p>\n<p>Getting from a comparison to the actual file used to mean finding it yourself. Every comparison's toolbar now has three buttons, for revealing in Finder, opening in your editor, and opening a terminal, each acting in one click on the file you're looking at. The menu beside them reaches every other file the comparison is built from: both sides of a diff, all four files of a merge, either folder and the selected entry in a folder comparison, the repository and the selected file in a review. A review points at the real file in your checkout rather than the temporary copy its diff is drawn from, and anything that <em>is<\/em> a throwaway copy says so before you edit it.<\/p>\n<p><strong>Editors follow the file.<\/strong> A Swift file offers \"Open in Xcode\" and a Markdown file \"Open in Zed\", because Riffle uses whatever you've told macOS to open each type with, so there's nothing to configure. Open With lists everything else that can open it. Terminals do need a choice, so Settings \u25b8 General has a picker offering the ones it finds installed, with anything else selectable from disk.<\/p>\n<p>Rescanning a review also stopped losing your place. Refreshing used to jump the selection back to the top of the file list and rebuild every diff from scratch, so a rescan cost you your scroll position in whatever you were reading. It keeps the selected file now, keeps the diffs for files that didn't move, and reloads only the ones that actually changed, marking them with a dot for a few seconds so you can see what landed.<\/p>\n<p>Riffle is $29.99 once, with a 14-day full-feature trial and a free tier that keeps unlimited 2-way diff forever. Get it from the <a href=\"\/riffle\">Riffle page<\/a> or with Homebrew: <code>brew install --cask skulkworks\/tap\/riffle<\/code>. Full details are in the <a href=\"\/riffle\/changelog\">changelog<\/a>.<\/p>","date_modified":"2026-08-09T14:21:28+00:00"},{"title":"Magpie 2.0: text off the screen, secrets off the screenshot","date_published":"2026-08-03T00:00:00+00:00","id":"https:\/\/bigtwo.dev\/updates\/magpie-copy-text","url":"https:\/\/bigtwo.dev\/updates\/magpie-copy-text","content_html":"<p>There is a particular kind of annoyance where the text you need is sitting right there on screen and there is no way to get at it. An error dialog that won't let you select its own message. A code sample in a video. A PDF viewer that fights you. <strong>Magpie 2.0<\/strong> puts an end to it with <strong>Copy Text<\/strong> (<code>&#8997;&#8679;O<\/code>): drag over anything on screen, and it's on your clipboard.<\/p>\n<p>Recognition runs entirely on your Mac. Nothing is uploaded, nothing is sent to a service, and it works with the network off. The text comes back laid out the way it looked, so wrapped lines stay together, paragraphs keep the blank line between them, and columns that sit side by side on screen come out side by side instead of running into each other. If you'd rather have flowing paragraphs for pasting into a document, Settings &#9656; Capture &#9656; Copy Text will join the wrapped lines instead.<\/p>\n<p>Every grab collects in Capture History, in its own <strong>Text<\/strong> segment beside Images, Recordings and Colors, searchable by what the text <em>says<\/em>. \"That error with the port number in it\" is findable weeks later. Any capture you already have can be read the same way with the text button on a thumbnail or a History card, and the annotation editor has its own text tool for when only one line of a screenshot is worth having.<\/p>\n<h3>Auto-Redact<\/h3>\n<p>The other half of reading a screenshot is deciding what nobody else should see. The shield in the annotation editor (<code>&#8679;&#8984;R<\/code>) reads the capture and covers the email addresses, card numbers, keys, tokens, passwords and phone numbers it finds, before you send it to anyone.<\/p>\n<p>It runs on your Mac, it lands as a single <code>&#8984;Z<\/code>, and it tells you exactly what it covered, so disagreeing with it takes one keystroke. Card numbers are checksum-verified so order numbers and timestamps aren't mistaken for them, and git SHAs, UUIDs and SCREAMING_CONSTANTS are left alone. IP addresses are off by default, because a developer's screen is full of them.<\/p>\n<h3>Trim, pin, and a cleaner desktop<\/h3>\n<p>Recordings can be <strong>trimmed<\/strong> now. The scissors on a recording's card opens a window with the video and a filmstrip under it: drag the two handles to set what to keep, <code>Space<\/code> plays and pauses, <code>I<\/code> and <code>O<\/code> set the handles at the playhead, the arrows step a frame, <code>Return<\/code> cuts. Playback stays inside the kept range, so what you hear is what you'll get. The trimmed version replaces the original in History and the original goes to the Trash, so a cut that took too much is recoverable. Animated GIF, PNG and WebP exports trim too, frame by frame, without going back to the recording they came from.<\/p>\n<p><strong>Pin to Screen<\/strong> (<code>&#8997;&#8679;P<\/code>) floats a capture above everything else until you close it. Retype from it, compare against it, keep a reference in view while you work somewhere else. A pin never takes focus,...<\/p>","date_modified":"2026-08-09T14:21:28+00:00"},{"title":"Magpie picks colors, and the magnifier grows up","date_published":"2026-07-30T00:00:00+00:00","id":"https:\/\/bigtwo.dev\/updates\/magpie-color-picker","url":"https:\/\/bigtwo.dev\/updates\/magpie-color-picker","content_html":"<p>Magpie has had a magnifier since the first release: the loupe that appears while you drag a selection so you can see which pixel you're actually on. <strong>Magpie 1.5<\/strong> takes that loupe, rebuilds it, and hangs a whole new tool off it.<\/p>\n<p><strong>The color picker<\/strong> (<code>&#8997;&#8679;C<\/code>) puts the magnifier under your cursor anywhere on screen, in any app and on any display. Click a pixel and its color goes straight to your clipboard. Nine formats to choose from, from plain hex through RGB, RGBA, and HSL to the percentage variants, and <code>Space<\/code> cycles them without leaving the picker. Hold <code>&#8679;<\/code> while clicking to stay in the picker and read a whole palette in one pass, or nudge a pixel at a time with the arrow keys when you're chasing a hairline border.<\/p>\n<p>Every pick is kept. The last eight sit in a strip in the menu bar, one click from being copied again, and the full list lives in Capture History under a new Colors segment, where you can switch the format across the entire list at once. A palette you picked as hex comes back out as CSS without re-picking anything.<\/p>\n<p>It's free. No license, no trial clock, same as the everyday screenshot tools.<\/p>\n<h3>The magnifier, rebuilt<\/h3>\n<p>Adding a color picker made the old loupe's shortcomings obvious, so it got the rework it needed, and every change lands in area selection too, not just the picker.<\/p>\n<p>The hairline cross through the middle is gone. In its place is a single square that fits the pixel under your cursor exactly, drawn in black over a light pixel and white over a dark one, inside a plain grey ring that never changes. It went from being the loudest thing on screen to something you can actually aim with.<\/p>\n<p>It also <em>stays still<\/em> now. The square used to drift around the centre as you moved, because the magnified image slid smoothly while the square could only land on whole pixels. The loupe snaps to the pixel grid, so the image steps under a square that doesn't move. It zooms twice as far as it used to, and holding <code>&#8679;<\/code> while you scroll changes the zoom live. The value you settle on is the one you get next time.<\/p>\n<p>By default the picker's magnifier sits <em>on<\/em> your pointer and replaces it, so the pixel you're reading is the one under your hand. Area selection keeps it beside the pointer, where it doesn't cover the edge you're dragging toward. Both are settings, so swap them if you disagree.<\/p>\n<h3>Three fixes worth calling out<\/h3>\n<p>If you ever magnified a terminal and got a blank window instead of your text (sometimes, not always, and worst when the terminal was the active app), that's fixed. It affected the measure tool and guides as well.<\/p>\n<p>The pointer no longer reappears on top of the magnifier part-way through a pick. Moving over a text field or a link makes the app underneath assert its own cursor, which...<\/p>","date_modified":"2026-08-09T14:21:28+00:00"},{"title":"Riffle 1.3: naming a review","date_published":"2026-07-30T00:00:00+00:00","id":"https:\/\/bigtwo.dev\/updates\/riffle-review-titles","url":"https:\/\/bigtwo.dev\/updates\/riffle-review-titles","content_html":"<p>A small release, entirely for the people driving Riffle from scripts and tooling.<\/p>\n<p><code>riffle review<\/code> takes <strong><code>--title<\/code><\/strong>, <strong><code>--label-a<\/code><\/strong> and <strong><code>--label-b<\/code><\/strong> now, so a caller can name a review window \"PR #214 review\" rather than being stuck with whatever name Riffle derived from the repository. And <strong><code>--if-changes<\/code><\/strong> opens nothing and exits 0 when the chosen scope is empty, so a tool that offers a review at the end of some work stops popping up a window reading \"No changes\" when that work was already committed.<\/p>\n<p>The titling fix that goes with them is the one you'd actually notice. A comparison whose two sides have different file names now takes its window and tab title from <code>--title<\/code> when the caller passed one. Comparing a file against a temp or content-addressed copy used to title the window with both paths, so a diff of <code>retry-policy.ts<\/code> against a hashed snapshot read as a bare hash and told you nothing. Comparisons whose sides share a name are unchanged: that name is still the title, and <code>--title<\/code> still prefixes the subtitle, so <code>git difftool<\/code> runs look exactly as they did.<\/p>\n<p>Riffle is $29.99 once, with a 14-day full-feature trial and a free tier that keeps unlimited 2-way diff forever. Get it from the <a href=\"\/riffle\">Riffle page<\/a> or with Homebrew: <code>brew install --cask skulkworks\/tap\/riffle<\/code>. Full details are in the <a href=\"\/riffle\/changelog\">changelog<\/a>.<\/p>","date_modified":"2026-08-09T14:21:28+00:00"},{"title":"FoxSay joins the skulk","date_published":"2026-07-29T00:00:00+00:00","id":"https:\/\/bigtwo.dev\/updates\/foxsay-joins-the-skulk","url":"https:\/\/bigtwo.dev\/updates\/foxsay-joins-the-skulk","content_html":"<p><strong>FoxSay<\/strong> has been on GitHub since February, first as VoiceFox and then under the name it kept, but it never had a page here. Now it does, which makes it the seventh app on skulkworks.dev. It turns up with <strong>2.0<\/strong>, easily the biggest release it's had.<\/p>\n<p>FoxSay is dictation that never leaves your Mac. Hold a hotkey, say what you mean, let go, and the text lands in whatever app you were already in. No cloud round trip, no account, nothing uploaded. The transcription runs on the Neural Engine using <strong>Parakeet<\/strong> (via FluidAudio) or <strong>Whisper<\/strong> (via WhisperKit), whichever you pick, and there's a history of every transcript with the audio kept behind it.<\/p>\n<p>What makes it more than a transcriber is the second pass. A local AI model running on <strong>MLX<\/strong> tidies the raw transcript up, and you decide what \"tidy\" means by editing the prompt. <strong>Qwen 2.5 1.5B<\/strong> is the recommended model, and 2.0 brings the current generation along with it: Qwen 3.5 2B, Qwen 3 4B Instruct, Qwen 3 1.7B, Gemma 3 1B QAT, Gemma 4 E2B, LFM2 1.2B and Llama 3.2 1B. If you'd rather send it out to a remote model instead, it talks to any OpenAI-compatible endpoint, with presets for OpenAI, Anthropic, Google and OpenRouter.<\/p>\n<p><strong>2.0<\/strong> is largely a redesign. New app icon, and the whole app rebuilt around it: one coral accent, neutral surfaces, consistent cards throughout. The recording overlay is the part you'll notice first, now three studio meters (<strong>LED Meter<\/strong>, <strong>Analyzer<\/strong> and <strong>Waveform<\/strong>) with much faster level metering. About moved out of its own panel into the main window, sitting next to a new <strong>Our Apps<\/strong> pane, and Check for Updates lives there now rather than in the app menu. On the speech side there are two new Parakeet models: <strong>TDT-CTC 110M<\/strong>, the smallest and fastest of them, English only, and a <strong>Japanese 0.6B<\/strong> that's more accurate on Japanese than the multilingual V3.<\/p>\n<p>Here's where it parts company with the rest of the apps: FoxSay is free. Not free-tier free, actually free. It's <strong>Apache 2.0<\/strong>, the source is public, and there's no license to buy, no in-app purchase, and no trial clock ticking down. It was never on the Mac App Store either, so unlike its siblings there's no migration to do and no receipt to hunt for. Just download it and go.<\/p>\n<p>It needs macOS 14 Sonoma or later and Apple silicon, since MLX and the on-device speech models don't run on Intel. Get it from the <a href=\"\/foxsay\">FoxSay page<\/a> or with Homebrew: <code>brew install --cask skulkworks\/tap\/foxsay<\/code>. The source is on <a href=\"https:\/\/github.com\/skulkworks\/foxsay\">GitHub<\/a>, and release notes live in the <a href=\"\/foxsay\/changelog\">changelog<\/a>.<\/p>","date_modified":"2026-08-09T14:21:28+00:00"},{"title":"VectorFox 2.0: gradients, and curves that land where you drew them","date_published":"2026-07-28T00:00:00+00:00","id":"https:\/\/bigtwo.dev\/updates\/vectorfox-2-0","url":"https:\/\/bigtwo.dev\/updates\/vectorfox-2-0","content_html":"<p><strong>VectorFox 2.0<\/strong> ships the same day as RasterFox 3.0 and shares its redesign: native macOS windows, toolbars and controls throughout, light or dark appearance respected, one vivid magenta accent instead of custom chrome. The more interesting half of this release is underneath, in the tracing itself.<\/p>\n<p>Start with what the preview window was hiding. The old one flattened the SVG to a bitmap once and showed you that, so both sides always looked equally soft and vectorizing appeared to buy you nothing. The SVG pane now re-renders the vector at every zoom level, so zooming in shows crisp curves against the original's honest pixel squares. <strong>Side by Side<\/strong> mode puts them in two panes with locked pan and zoom and a minimap in each, and zoom reaches 64x, which is where the difference stops being theoretical.<\/p>\n<h3>Gradients, at last<\/h3>\n<p>The tracer could only ever fill a shape with one flat color. Anything built from gradients came back banded into stripes or flattened to a single average, and there was no setting that fixed it. Regions whose color genuinely ramps are now filled with a real SVG gradient fitted to the original pixels. An abstract gradient wallpaper that used to trace to a 332 KB mess comes out at 100 KB and actually looks like the source.<\/p>\n<p>Gradients that radiate from a point are recognized as such, so a billiard ball, a glossy button, or anything with spherical shading keeps its highlight and falloff instead of arriving as a flat disc with a diagonal tint across it. And where a smooth ramp gets cut into several bands during tracing, those bands share one gradient rather than each taking a flat color of its own. The cuts are an artifact of how tracing works, not anything in your image, so sharing the gradient across them makes the seams stop showing. The blue field behind the Firefox logo is the example that made this obvious.<\/p>\n<p>Three settings bugs were quietly making everything worse. The <strong>Balanced<\/strong> preset was comparing colors at 6 bits per channel instead of 8, which is enough to swallow a gradient whole before tracing even started. <strong>Gradient Step<\/strong> in the inspector was limited to a 0 to 10 slider when the tracer accepts up to 255 and defaults to 16, so the entire useful range sat past the right edge. And every preset traced with Gradient Step at 0, which switches the tracer into its most wasteful mode and doubles file sizes without improving accuracy. Balanced and Simplistic were also tracing in polygon mode, reproducing pixel staircases instead of fitting curves. All the built-in presets use spline curve fitting now, which is what vtracer recommends, and logos come out with clean edges rather than vectorized pixels.<\/p>\n<h3>Curves that land where you see them<\/h3>\n<p>Two fitter bugs had traced edges drifting away from the artwork, worst along a long gentle arc where the line could sit five or six pixels outside the original. Where a run of outline was too curved...<\/p>","date_modified":"2026-08-09T14:21:28+00:00"},{"title":"RasterFox 3.0: a native Mac app again","date_published":"2026-07-28T00:00:00+00:00","id":"https:\/\/bigtwo.dev\/updates\/rasterfox-3-0","url":"https:\/\/bigtwo.dev\/updates\/rasterfox-3-0","content_html":"<p>RasterFox has been carrying a custom interface around for a long time, and it was starting to feel like an app from somewhere else. <strong>RasterFox 3.0<\/strong> is a full redesign onto native macOS windows, toolbars and controls, with one vivid fox-orange accent doing the personality work instead of custom chrome. It respects your light or dark appearance now rather than insisting on its own.<\/p>\n<p>The preview window got the most out of it. <strong>Side by Side<\/strong> compare mode puts the original and the optimized version in two panes with locked pan and zoom, and each pane carries a minimap showing where you are in the image, so you can click or drag to jump anywhere. Comparing a compressed gradient against its source is finally a thing you can do without guessing which corner you're looking at.<\/p>\n<p>The optimizer panel is a proper inspector pane now: attached to the window edge, resizable, remembered between launches, and toggled with <code>\u2325\u2318I<\/code>. Settings is a real macOS settings window with native tabs and standard grouped forms. Both were floating panels before, and both were exactly as annoying as that sounds.<\/p>\n<p><strong>Keyboard control throughout.<\/strong> <code>\u2318O<\/code> adds images, <code>Space<\/code> previews with Quick Look, <code>Return<\/code> opens the compare window, <code>\u2318\u232b<\/code> removes, <code>\u2318R<\/code> reprocesses, <code>\u2318S<\/code> saves, and the arrow keys walk the list. Every control shows a focus ring again. Result rows keep their buttons hidden until you hover, with the full set of actions on right-click, so a long list stops looking like a control panel.<\/p>\n<p>Big batches feel much faster, mostly because the results list is no longer repainting itself dozens of times a second while images process. The rows read more calmly too: sizes in aligned figures, one highlighted savings percentage, and honest progress bars in place of animated placeholders.<\/p>\n<p>Two fixes worth calling out for direct-build users. Sandbox permission prompts are gone entirely: files save alongside their originals with no folder-access dance, and that whole flow now exists only for sandboxed App Store builds. And pressing Cancel in the folder access dialog actually cancels processing, rather than carrying on regardless.<\/p>\n<p>The app menu has a <strong>What's New<\/strong> item now, showing the full changelog in a native window, and it appears once automatically after each update. VoiceOver can reach every control, every icon button has a label and a tooltip, and Celebrations respect Reduce Motion under a single toggle covering both confetti and sound.<\/p>\n<p>RasterFox is $9.99 paid once, and it runs on macOS 14 Sonoma or later. Get it from the <a href=\"\/rasterfox\">RasterFox page<\/a> or with Homebrew: <code>brew install --cask skulkworks\/tap\/rasterfox<\/code>. Full details are in the <a href=\"\/rasterfox\/changelog\">changelog<\/a>.<\/p>","date_modified":"2026-08-09T14:21:28+00:00"},{"title":"Riffle 1.2: when the file changes underneath you","date_published":"2026-07-28T00:00:00+00:00","id":"https:\/\/bigtwo.dev\/updates\/riffle-reload-from-disk","url":"https:\/\/bigtwo.dev\/updates\/riffle-reload-from-disk","content_html":"<p>A diff is a photograph of two files at a moment in time, and the moment passes. You switch to your editor, save, come back, and Riffle is confidently showing you something that stopped being true a minute ago.<\/p>\n<p><strong>Riffle 1.2<\/strong> notices. When a file under an open comparison is changed by something else, a 2-way diff re-runs itself against the new content and keeps your place. A merge you've already worked in asks first, because silently reloading a merge would throw away resolutions you'd spent time on. There's also <strong>File \u25b8 Reload from Disk<\/strong> (<code>\u2318R<\/code>) for doing it on demand, and it works on any comparison: a diff, a merge, a folder comparison, or a git review.<\/p>\n<p>The fix underneath this one matters more than the feature. Saving a merge could overwrite the target file without warning when another tool had rewritten it while the merge was open. That's the kind of bug that costs somebody an hour of work and never announces itself, and it doesn't happen now.<\/p>\n<p>Riffle is $29.99 once, with a 14-day full-feature trial and a free tier that keeps unlimited 2-way diff forever. Get it from the <a href=\"\/riffle\">Riffle page<\/a> or with Homebrew: <code>brew install --cask skulkworks\/tap\/riffle<\/code>. Full details are in the <a href=\"\/riffle\/changelog\">changelog<\/a>.<\/p>","date_modified":"2026-08-09T14:21:28+00:00"}]}
