Category Archives: PowerShell

WinGet Iconification Is Ongoing

Yesterday, I had the good fortune to spend an hour on the phone with WinGet team lead Demitrius Nelon. He gave me a “slice of life” view into the many and varied kinds of chicken-and-egg problems his team deals with daily. He also helped me improve my understanding of where and how icons come from inside a sixel-enabled terminal session, including those that WinGet shows. And indeed, WinGet iconification is ongoing and spreading, as I saw this morning when I ran a general upgrade command on the recently clean-installed (and properly enabled) ThinkPad X12 Gen 1 tablet.

Why Say: WinGet Iconification Is Ongoing

Take a look at the output for a winget upgrade –all …  command from the lead-in graphic. Note the first actual upgrade (for OneDrive) shows an icon in that output stream. This is the first visible evidence I’ve seen running WinGet that the tool is including icons outside of the list –details commands. Very interesting!

Doc Info on list –details

Here’s a big snippet from the release notes for WinGet production version v.1.28.190:

New Feature: ‘list –details’

The new feature enables a new option for the list command, --details. When supplied, the output is no longer a table view of the results but is instead a series of show like outputs drawing data from the installed item.

An example output for a single installed package is:

> wingetdev list Microsoft.VisualStudio.2022.Enterprise --details
Visual Studio Enterprise 2022 [Microsoft.VisualStudio.2022.Enterprise]
Version: 17.14.21 (November 2025)
Publisher: Microsoft Corporation
Local Identifier: ARP\Machine\X86\875fed29
Product Code: 875fed29
Installer Category: exe
Installed Scope: Machine
Installed Location: C:\Program Files\Microsoft Visual Studio\2022\Enterprise
Available Upgrades:
  winget [17.14.23]

If sixels are enabled and supported by the terminal, an icon for the installed package will be shown.

I’m glad to see and understand that the stuff I had to figure out more or less on my own through trial and error is now going explicitly into the public record. For the details on how to enable sixel output in your WinTerm sessions, see last Friday’s how-to blog post Light Up WinGet Icons.

Where to from Here?

I expect to see icons popping up all over WinGet in the coming months. I also expect to see more icons popping up in output streams, as the plumbing falls into place. Right now, only about 20% of WinGet’s packages show icons. But that number’s going to jump for sure. Stay tuned, and I’ll tell you all about it.

 

Facebooklinkedin
Facebooklinkedin

How-To: Light Up Winget Icons

Thanks to numerous requests, I’m providing step-by-step instrux in this unusual second blog post for today. It’s based on something that made me unreasonably happy earlier this week. That is:  WinGet can now display colorful package icons right inside Windows Terminal, rendered via sixel graphics. It’s a small visual upgrade that makes winget list –details output dramatically more readable. You get actual application icons inline with package data instead of a wall of monochrome text. But getting there requires a few specific steps. Here’s the complete recipe so you, too, can light up WinGet icons.

Why Must You Light Up WinGet Icons?

The current production version of WinGet is v1.28.220 as I write this post. The latest Preview version is v1.29.70-preview. Production is still catching up, so preview is a must for the moment. I imagine, though, that this will change with the next production version update. As with all moving targets, this one keeps changing along with everything else!

Step 1 — Get a Preview Version of Winget

Sixel icon support requires WinGet version 1.29.50-preview or later. The current stable release doesn’t include it. Check your version with winget -v. If you’re behind, try this first:

winget upgrade Microsoft.AppInstaller –source winget

If that doesn’t pick up the preview build, head to the microsoft/winget-cli releases page on GitHub, download the latest .msixbundle. If a double-click won’t install it, you can install it manually with Add-AppxPackage. Fair warning: on some machines the Microsoft Store installer handles dependencies automatically. On others, you’ll need to sideload VCLibs and Microsoft.UI.Xaml packages yourself.

Step 2 — Enable Sixels in Winget’s Settings (Not Terminal’s!)

This is the gotcha, and it got me for a short while. I confess: I mixed it up myself. The sixel toggle goes in WinGet‘s own settings file, NOT in Windows Terminal’s settings.json. Run winget settings to open the file. Add or merge a visual block so it looks like this:

{
“$schema”: “https://aka.ms/winget-settings.schema.json”,
“visual”: {
“enableSixels”: true,
“progressBar”: “rainbow”
}
}

The enableSixels: true setting tells WinGet to emit sixel graphics in its output. The progressBar key is optional —”rainbow“, “accent”, and “retro” work well (“sixel” works, but is hard to see). Any of these gives you graphical progress bars during installs, as a nice bonus.

Step 3 — Restart Terminal and Run It

Kill Terminal completely — not just close a tab. Right-click the taskbar icon and close the window, or kill the wt process outright. Relaunch. Then run:

winget list –details

Icons should appear for Win32 packages (exe/msi installers). MSIX packages won’t show icons — that’s a known limitation of the current pipeline, not a configuration error on your part. You can filter to a single package to test things quickly (I chose 7Zip, as it’s at the top of my ASCII sort order):

winget list –details 7zip

What to Expect

Not every package gets an icon. In my testing across two ThinkPads, icon coverage ranged from 26% to 31% of total installed packages. The dividing line is 100% correlated with installer category: Win32 packages (exe/msi) get icons, MSIX packages don’t. That’s an architectural gap Microsoft hasn’t bridged yet.

But what works, works beautifully. The icons are crisp, properly sized, and render instantly. It turns a dull text dump into something you can actually scan visually — which matters when you’re staring at 150+ installed packages trying to figure out what needs updating. Once you’ve got it set up, you won’t want to go back to the plain-text version. Cheers!

Facebooklinkedin
Facebooklinkedin

Some Have Icons, Others Don’t

Now that the adrenaline rush from getting icons working in WinTerm has subsided, I’ve started looking more closely at which items actually display icons in response to winget list –details. My conclusion from this analysis? Some have icons, others don’t. Indeed, the number of qualifying items is less than I originally thought: exactly 37 of the 143 total packages that winget manages show me something pretty to look at. ‘Sup with that? Here’s my take…

Which Some Have Icons, Others Don’t?

The test machine is a Lenovo ThinkPad X12 Gen 1 Hybrid running Windows 11 — a clean-ish install with the usual factory bloatware and a handful of my own tools layered on top. Running winget list --details produces 143 packages. Of those, exactly 37 display colorful, sixel-rendered icons in the terminal output. The remaining 106 show nothing. No icon, nor placeholder. No ghostly outline. Just… text.

What’s striking is how that output is organized. All 37 icon-bearing packages appear first in the output stream, clustered together like a parade of floats. Then there’s a visual cliff — you scroll past the last colorful logo and drop straight into a desert of monospaced text. It’s like walking from a gallery opening into a DMV waiting room. Same terminal. Same command. Two completely different experiences.

Twenty-six percent. That’s the icon coverage rate. On a machine with 143 packages, barely a quarter of them get the visual treatment. The other 74%? It’s still 1985 out there.

The Installer Category Absolutely Rules

Here’s where things get interesting — and by “interesting” I mean “so clean it almost feels like a prank.” I started looking for the variable that separates the haves from the have-nots. Publisher? Nope — Microsoft shows up on both sides. Source repository? Irrelevant. Architecture? x64 and x86 packages appear in both camps. Update date? No correlation. Then I looked at the Installer Category field, and the mystery evaporated.

The Pattern

Every single package with an icon has Installer Category exe or msi. These are traditional Win32 desktop applications installed via ARP (Add/Remove Programs) entries. Every single package without an icon has Installer Category msix — modern packaged apps from the Microsoft Store or sideloaded MSIX bundles.

There’s a 100% correlation. Not 98%. Not “mostly.” One hundred percent. Win32 equals icons. MSIX equals no icons. The dividing line isn’t publisher, isn’t source, isn’t architecture, isn’t age. It’s installer category, and nothing else.

What Does This Mean?

Why does this make sense architecturally? Because the two package types get their metadata from fundamentally different places:

  • Win32 packages (exe/msi) live in the winget community repository, where their manifest files include IconUrl fields pointing to PNG images. Winget fetches those URLs, converts the images to sixel format, and Terminal renders them inline. Clean pipeline. Works beautifully.
  • MSIX packages get their metadata from the Microsoft Store catalog or from the AppxManifest.xml embedded inside the package itself. Neither of these sources exposes icon URLs in a format that winget’s sixel rendering pipeline can consume. The icons exist — the Store shows them, Dev Home shows them, the Start Menu shows them — but terminal-facing winget can’t reach them through the MSIX metadata path.

Searing Irony: MS Apps Are Holdouts

And here’s where the comedy writes itself. Of the 106 iconless MSIX packages on this PC, 96 are published by Microsoft. Let that sink in. The company that built winget. The same outfit that built Windows Terminal. The company that built the sixel rendering pipeline. The developers who invented the MSIX packaging format… can’t show its own icons in its own tool.

We’re not talking about obscure infrastructure components here. The missing-icon list reads like a “Best of Microsoft” compilation album:

  • Flagship apps: Microsoft Edge, Microsoft Teams, OneDrive, Outlook, Paint, Photos, Calculator, Camera, Notepad
  • Windows itself: Windows Terminal, Microsoft Store, Windows Security, Snipping Tool, Windows Media Player
  • Productivity & lifestyle: To Do, Sticky Notes, Phone Link, Quick Assist, Clipchamp, Power Automate
  • Entertainment & social: Xbox, Solitaire, Dev Home

Then there are the framework and runtime packages — the plumbing that nobody sees but everything depends on. .NET Native Frameworks (versions 1.3, 2.1, 2.2), VCLibs (2012, 2013, 2015), UI.Xaml (2.7, 2.8), WindowsAppRuntime (1.6, 1.7, 1.8) — many appearing twice, once for x64 and once for x86. These make up vital Windows infrastructure. You wouldn’t expect icons on a Visual C++ redistributable. But Teams? Edge? Photos? These are flagship consumer applications with instantly recognizable logos. And in the terminal, they’re anonymous.

What Else Is Missing?

The remaining ~10 non-Microsoft MSIX packages without icons are third-party apps that happen to ship as MSIX bundles, mostly OEM-related: Intel Graphics Software, Thunderbolt Control Center, Dolby Audio Premium, Lenovo Vantage, Notepad++ (there’s also an installable version, with icon showing), Realtek Audio Control, Synaptics TrackPoint and TouchPad drivers, and — somewhat poetically — Oh My Posh, a tool whose entire reason for existing is making terminals look prettier.

Why DOES MSIX Fall Behind?

To understand the gap, you have to understand the pipeline. Winget’s icon rendering isn’t magic — it’s a four-step relay race, and MSIX packages drop the baton at the starting line.

Here’s how it works for Win32 packages:

  1. Manifest lookup. Winget looks up the package in its community repository and finds the package manifest YAML file.
  2. Icon URL extraction. The manifest includes an IconUrl field pointing to a hosted PNG or SVG image.
  3. Sixel conversion. Winget fetches the image from the URL and converts it to sixel format — an inline graphics encoding standard that dates back to DEC terminals in the 1980s, now reborn in modern terminals.
  4. Terminal rendering. Windows Terminal, with enableSixels: true in its experimental settings, interprets the sixel data and renders the icon inline, right next to the package name.

For MSIX and Store packages, this pipeline breaks at steps 1 and 2. MSIX packages registered through the Store don’t necessarily have community manifests with IconUrl fields. Their metadata comes from the Store catalog API or from the AppxManifest.xml bundled inside the package. Neither of these sources feeds into winget’s sixel rendering path.

It’s not that MSIX packages don’t have icons — they absolutely do. The Microsoft Store displays them beautifully. Dev Home displays them. The Start Menu displays them. Your taskbar displays them. But the specific pipeline that converts an icon reference into sixel terminal output hasn’t been connected to the MSIX metadata source. The icons are there. The rendering engine is there. The wiring between them? Not yet.

What Comes Next? “Under Construction…”

The good news — and it’s genuinely good news — is that this is just an implementation gap, not a fundamental limitation. Every piece of the puzzle belongs to MS:

  • Winget — Microsoft’s package manager
  • Windows Terminal — Microsoft’s terminal application
  • Sixel rendering — implemented by the Terminal team
  • MSIX — Microsoft’s modern packaging format
  • The Store catalog API — Microsoft’s metadata service

There are no third-party dependencies to negotiate. No standards bodies to petition. No licensing hurdles to clear. Connecting the MSIX metadata path — where the icons already live — to the sixel rendering pipeline is a plumbing job. An important one, but a plumbing job nonetheless.

When (not if) Microsoft bridges this gap, the icon coverage on a typical Windows machine should jump dramatically. We’re talking from 26% to potentially 90% or higher, essentially overnight. On this ThinkPad, that would mean going from 37 icons to 130+. The visual cliff in the winget list output would disappear, replaced by a continuous stream of colorful, identifiable package icons.

The winget-cli GitHub repository is the place to watch. Feature requests and pull requests related to MSIX icon rendering or Store catalog icon integration would be the signal that the coverage expansion is inbound. Given that Microsoft went to the trouble of implementing sixel rendering in the first place — a non-trivial engineering effort — it seems unlikely they’d leave 74% of packages iconless.

One in Four Is a Good Start…

So here we are. The sixel icon feature in Windows Terminal works. It works beautifully, in fact — those 37 Win32 packages look fantastic, their colorful logos rendered crisply inline, transforming a wall of text into something you can actually scan visually. The three-step setup is straightforward. The technology is sound.

It’s just that only 37 apps showed up to the party in full regalia, while 96 of Microsoft’s own applications stand in the corner without name tags. Edge — the browser Microsoft preinstalls on every Windows PC on Earth — doesn’t get an icon. Teams — the collaboration hub Microsoft spent billions promoting — doesn’t get an icon. Windows Terminal itself, the application rendering the icons, doesn’t get an icon. You have to admire the irony, even if you wish you didn’t.

The feature is real. The gap is clear. The fix is feasible. And in the meantime, those 37 Win32 apps with their lovingly rendered sixel icons are living proof that the future of terminal-based package management looks a lot more colorful. Now, somebody needs to connect the rest of the plumbing.

In Windows-World, 26% is a start. A visually delightful, architecturally illuminating, slightly ironic start. But MS can do better. Hopefully, sooner rather than later. Let’s see!

Facebooklinkedin
Facebooklinkedin

WinGet Export/Import Aces App Handling

After a fortunate accident decided me to clean install Windows 11 on the ThinkPad X12 Detachable Tablet, I had to continue the setup process. For me, that means installing a raft of apps and applications. “This time,” I thought, “Let’s try Winget’s export & import functions.” I did just that yesterday. I’m pleased to report that WinGet Export/Import aces app handling. Indeed I was able to handle 35-plus apps in under 20 minutes. Let me explain…

How WinGet Export/Import Aces App Handling

As with much else in the Windows Terminal/PowerShell environment, WinGet manages export/import operations using a .json (JavaScript Object Notation) file. It’s like XML, except more compact: human-readable, but less verbose.

Step 1 is to instruct the source PC (Flo6, in this case) to export its roster of installed packages. First I started off with a command to grab that roster, and stuff it into a .json file:

winget export -o Flo6-apps.json

Then, I opened that file in notepad to edit out stuff I didn’t want or need. In this case that includes lots of stuff that comes pre-installed on Windows anyway (e.g. Edge, PowerShell, and a bunch of other stuff). It also included apps I knew I wouldn’t want on the X12 (e.g. all the MSI motherboard stuff and utilities, Adobe Acrobat, NVIDIA software, older CrystalDiskX versions, and so forth).

Long Story Short: 58 to 36

By the time I trimmed everything, the number of entries in the .json file dropped from 58 to 36 (the export function skips apps for which WinGet packages don’t exist, so that trimmed the overall number down from 221 to 58 to start with). After that, it was just a matter of using the import function on the receiving X12 PC, like so:

winget import -i Flo6-apps.json
The whole process took about 20 minutes to run. Indeed it is much, much faster than the one-at-a-time approach. It’s even faster than using PatchMyPC Home Updater, whose 500-plus application catalog covers much of the same ground that I like to tread on my setups.

Lessons Learned

Along the way I learned a few things, hopefully worth sharing. First and foremost, I learned to read the export JSON file carefully. I confess: I did miss a couple of things (e.g. MSI version of CPU-Z). I ended up having to do a little cleanup after the import completed. You could do better, by reading — and pruning — the export list more closely than I did.

I also had to do some followup on Windows Terminal/PowerShell setup. That meant adding a nerd font, changing from PS 5.1 to 7.x, and making sure OhMyPosh was working properly. Easily done, but takes a little while.

Now, I’m ready for my next adventure. Here in Windows-World there’s always a new one right around the corner.

Facebooklinkedin
Facebooklinkedin

Icons Make Their WinTerm Debut

Picture a freshly wiped Lenovo ThinkPad X12 Gen 1 Hybrid tablet. Windows 11, clean install, not a single orphaned registry key or stale cache entry to its name. I had spent an entire Saturday — a real, honest, could-have-been-doing-anything-else Saturday — systematically troubleshooting seven distinct layers of the Windows stack, trying to coax winget into rendering package icons inside Windows Terminal. First, I checked the pipeline. Then, I checked the frameworks. Finally, I checked the fonts, the settings, the preview builds, and the GitHub issue tracker. My conclusion, published with the full confidence of a man who had just inspected every plumbing joint in the house, was that the feature didn’t exist yet. The faucet wasn’t connected to anything.

Why Say: Icons Make Their WinTerm Debut?

I was wrong. The icons were there all along, hiding behind a single toggle nobody told me about. Now, running winget list --details,most of the 140 installed packages display beautiful sixel-rendered icons inline in Windows Terminal. The 7-Zip logo in crisp black and white (see lead-in graphic). CPU-Z’s purple microchip. Everything’s orange magnifier. Many, many packages, adorned and accounted for. The bloody icons are alive.

Synopsis: TL;DR

After seven layers of troubleshooting on a pristine clean install that ended in defeat, the fix turned out to be embarrassingly simple: update to winget preview v1.29.70, add "enableSixels": true to the winget settings file, and restart Windows Terminal. That’s it.

Three steps, one hidden toggle, a plethora of package icons rendered in full sixel graphics glory. The seven-layer journey wasn’t wasted — it built the foundation that made the fix possible — but the actual answer was only one JSON property deep.

The Clean-Install Gambit

The Lenovo X12 Hybrid was the perfect test bed. I’d done a fresh clean install of Windows 11. That curred partly because a failed experiment with Secure Boot EFI data had left the boot configuration in a philosophical state. And partly because I wanted to try Smart App Control on a virgin system. No leftover manifests, or stale caches. No conflicting side-loaded packages from six months of tinkering. A blank slate. If icons were going to work anywhere in the known universe, this was the place.

The first round of troubleshooting — documented in painstaking detail a now-abandoned “Still No Bloody Icons” post — ended with a serious verdict. The icon rendering pipeline doesn’t exist. Every layer of the stack was sound, every component was healthy, every dependency was present and accounted for, but winget simply wasn’t emitting anything visual. The conclusion was deeply unsatisfying but seemed defensible. It was also, as it turns out, incomplete.

The Seven Layers: A Brief Retrospective

Before we get to the breakthrough, let’s do a brisk lap through the original investigation. Think of this as the training before the final fight — except the opponent was a JSON property, and the training took eight hours.

Layer 1: App Installer/Preview Pipeline.

I sideloaded the preview .msixbundle, navigated the privilege boundaries between the Microsoft Store and manual installation, and got winget preview running. The CLI worked. The commands parsed. No icons.

Layer 2: VCLibs and UI.Xaml.

The framework dependency chain — Microsoft.VCLibs and Microsoft.UI.Xaml.2.8 — had to be present for the preview to run. Downloaded them, sideloaded them, confirmed both were registered. Still no icons.

Layer 3: WinUI 3 Runtime.

I checked whether the Windows App SDK runtime was present, which it was, because Windows Terminal itself depends on it. Dead end, but a clean one.

Layer 4: Terminal Capabilities.

Tested output in both Command Prompt and Windows Terminal. Both showed identical plain text. The pipe was open; the faucet was off.

Layer 5: Fonts and Glyph Coverage.

I installed CaskaydiaMono Nerd Font, complete with its thousands of extra glyphs — Powerline segments, dev icons, weather symbols, the whole typographic buffet. Powerline segments in my prompt looked gorgeous. Winget output? Still plain text, dressed in its Sunday worst.

Layer 6: Terminal settings.json and Profile Configuration.

I did an exhaustive review of every setting, experimental feature, and flag in the Windows Terminal configuration. Renderer settings, text formatting options, experimental feature toggles — I read them all with the desperation of a man looking for his car keys in a coat he’s already checked three times. Nothing relevant.

Layer 7: Preview-Build Regressions and the Canary Channel.

I searched the GitHub issue tracker for every synonym of “icon” I could think of. Found discussions. Looked at mockups. Found companion app implementations and third-party extensions. What I did not find was any evidence of shipped CLI icon rendering.

The original verdict: “It’s not a regression. It’s not a bug. It’s an absence.” That verdict was wrong — but getting there was essential. It eliminated every false lead and left only the real answer, waiting patiently for me to circle back with fresh eyes and one additional search query.

The Real Deal: Layer 8 (Politics & Religion)

A few days later, I revisited the problem. Different day, different energy, different collaborator. This time I had Copilot riding shotgun, and instead of working bottom-up through the stack like a plumber checking every joint from the basement to the roof, we started with a simpler question: What changed in the latest winget preview releases?

The first discovery landed fast. Winget v1.29.70-preview had stabilized the list --details command and — this is the part that caught my eye — explicitly added icon rendering support. Not “planned.” Not “in development.” Added. Past tense. Shipped. The feature I’d declared nonexistent was sitting in a release that had dropped while I was busy writing about its absence. Timing, as they say, is everything.

Dealing with Dependencies

Installing it required the familiar dependency dance, the kind of manual choreography that makes you deeply appreciate package managers while simultaneously wrestling with one:

  • Grab Microsoft.UI.Xaml.2.8, extract it, and install the .appx from the extracted architecture folder
  • Install the DesktopAppInstaller license XML via Add-AppxProvisionedPackage
  • Install the .msixbundle itself with Add-AppxPackage

All done in an elevated PowerShell session, naturally. You haven’t lived until you’ve used a package manager’s own dependency framework to manually bootstrap the package manager.

But installing v1.29.70 alone didn’t do it. The second discovery — the actual fix, the thing that had eluded seven layers of investigation — was hiding in the winget settings file, accessible via winget settings. I already had "icons": true under the "visual" section:true under "experimentalFeatures". Those were documented. Those were obvious.

The Missing Link

But there was a third setting, never mentioned in any trouble-shooting guide, blog post, or Stack Overflow answer I saw:

{
    "visual": {
        "icons": true,
        "enableSixels": true
    },
    "experimentalFeatures": {
        "richOutput": true
    }
}

The enableSixels property is the linchpin. Without it, winget has no instruction to emit sixel graphics — even though Windows Terminal can render them and the server has the icon data ready to go. The "icons": true setting enables icon support but not the sixel encoding. Two switches that sound like they do the same thing. They don’t. One says “I would like icons, please.” The other says “Here is how you shall deliver them.” You need both.

After adding that one property and restarting Windows Terminal, I ran winget list --details and watched 140 packages scroll by — nearly every single one adorned with its sixel-rendered icon. The 7-Zip logo in crisp black and white. CPU-Z’s purple microchip. Discord’s round blue glyph. Firefox’s fox-wrapped globe. Every package, every icon, rendered inline in the terminal like it’s the future and we should be grateful.

The bloody icons were alive.

The Anatomy of the Fix

Now that the confetti has settled, let’s look at the tripod that had to be in place simultaneously. This is the part I wish I’d understood three weeks earlier, though I suspect I needed the seven-layer pilgrimage to truly appreciate it.

Piece 1: Windows Terminal 1.24+.

The terminal renders sixel graphics inline. This capability has been built in since v1.22 and is enabled by default — no special settings required. It was never the bottleneck. It was the one component that worked perfectly from the start, sitting there patiently while I blamed everything else.

Piece 2: Winget v1.29.70-preview.

This is the version that emits sixel graphics and has the stable list --details command. The older preview I’d been testing with (v1.29.50) could show the winget banner icon — the little “W” logo that appears when you run certain commands — but didn’t reliably render package-level icons. The distinction matters: seeing the banner icon confirmed that sixel rendering could work but didn’t tell me why individual package icons weren’t appearing.

Piece 3: The winget settings file with enableSixels: true

The missing piece. The hidden toggle. The one ring. This tells winget to actually encode icons as sixel graphics in its terminal output. Sans this setting, winget sends plain text — even if the terminal is sixel-capable, even if the icon data exists, even if you’ve set "icons": true and crossed every finger you have.

Behind the scenes, the icons aren’t stored in the YAML package manifests on the winget-pkgs GitHub repository. They’re auto-extracted server-side from installer executables during the validation pipeline, then compiled into the compressed index that winget downloads during source updates. This extraction process was enabled in late 2024, which means the icon data has been quietly accumulating in the index for months — waiting for someone to flip the switch that tells winget to actually use it.

Component What It Does Was It the Problem?
Windows Terminal 1.24+ Renders sixel graphics inline No — already working
Winget v1.29.70-preview Emits sixel graphics for package icons Partially — needed updating
enableSixels: true Tells winget to encode icons as sixels YES — the missing piece
Server-side icon index Auto-extracted icons in compressed index No — already populated

The Red Herrings

No investigation worth its salt is complete without a few false trails, and this one had its share. Early tests with the --name filter — for example, winget list --details --name "Windows Terminal" showed no icons, which sent me chasing theories about manifest coverage and incomplete icon databases. Were some packages missing icon data? Were MSIX-packaged apps excluded from the server-side extraction?

I went spelunking through GitHub discussions suggesting that the extraction pipeline didn’t work for all installer types. It turns out the terminal session needed a restart after changing the settings file. The filter works fine. The icons were there. I was looking at stale output and drawing conclusions from it, which is the troubleshooting equivalent of reading yesterday’s weather forecast and complaining that the meteorologist lied.

Another false trail: the winget show command. It doesn’t display package icons — never has, apparently isn’t designed to. The icon rendering is exclusive to list --details. If you’re testing with the wrong command surface, you’ll produce the same old plain text and conclude nothing has changed.

I lost about thirty minutes to this particular detour before Copilot gently suggested I might be looking in the wrong room. And those concerns about MSIX-packaged apps lacking icon data? Unfounded. Many of my 140 packages — exe installers, MSIX bundles, and everything in between — had their icons. The extraction pipeline is, apparently, less picky than the GitHub discussions led me to believe.

What I Learned

The seven-layer expedition that ended in “the feature doesn’t exist” wasn’t wasted. I want to be clear about that, because it would be easy to read this post as “I spent eight hours troubleshooting something that required three steps” and conclude that the eight hours were pointless. They weren’t. Every dead end eliminated a variable. Every layer confirmed a component was healthy.

The mental model of the winget architecture, starting from the CLI surface through the App Installer framework, down through the WinUI and VCLibs underpinnings, all the way to the terminal’s rendering pipeline paid real dividends when it came time to identify the actual fix. I knew exactly where the gap was because I’d already verified everything else.

The actual lesson is subtler than the original post’s triumphantly grim “sometimes the feature doesn’t exist yet.” The revised lesson: sometimes the feature does exist, but it’s hiding behind a toggle that isn’t documented in any obvious place. The enableSixels setting isn’t prominently featured in winget’s help text. It’s not in the release notes, at least not in any section I found. Not on the GitHub wiki’s settings reference page, either. It’s the kind of setting you’d only discover by reading source code diffs, stumbling across a buried comment in a pull request, or having a very persistent collaborator who doesn’t get tired and doesn’t get discouraged.

Troubleshooting Two-Step

There’s a broader point here for fellow troubleshooters, and it’s one I plan to tattoo on my forearm in a readable monospaced font: when you’ve eliminated every plausible explanation and concluded something is impossible, put a pin in that conclusion. Don’t throw away your work — it’s still valid diagnostic groundwork.

Then, revisit the question when the software updates. Your seven-layer foundation didn’t disappear. The components you verified are still verified. The answer might be one release and one hidden toggle away, waiting for you to come back with fresh eyes and a slightly different search query. And maybe, just maybe, bring a collaborator who doesn’t share your blind spots.

Closing

The icons have arrived. Not “sometime.” Nor “in a future release.” Not “probably, if you squint at the right preview build.” Now. Lots of them, rendering in full sixel graphics in Windows Terminal, each one auto-extracted from its installer binary and compiled into the winget index by Microsoft’s servers. The pipeline that the original post said didn’t exist? It existed all along — it just needed one bloody toggle to turn it on.

I’m no longer reading plain text like it’s 1985. And I’m liking that just fine. Here in Windows-World, that’s cause for celebration. Hold my beer…

Facebooklinkedin
Facebooklinkedin

Dude, Where’s My Icons?

I just spent a couple of frustrating but informative hours trying to get icons to show up with WinGet on the latest Canary build (29558.1000). What started out as a minor visual quirk turned into a deep dive into the innards for App Installer, feature flags, and system-level packages. I’ll provide a step-by-step list of what I did, what I learned, and what others running Canary builds should know. At this point I’m still asking “Dude, where’s my icons?” for WinGet output. But I now know I won’t see them any time soon. I’ll explain…

Steps in Resolving “Dude, Where’s My Icons?”

The first step was to verify the WinGet version and its capabilities. Running winget –info revealed I was on version 1.29.50-preview. Notably, that output lacked usual capability lines including VT Support or Rich Output. That was my first clue that something wasn’t quite right.

Next, I visited the Microsoft Store. I navigated directly to the App Installer product page using the canonical link. The Store offered an Install button. When I clicked same, I expected it to overwrite the preview build with the stable version. After installation, the Store indeed reported the app as Installed. It lied!

I then closed all terminal sessions and opened a fresh CMD tab to recheck winget –info. Unfortunately, the version remained 1.29.50-preview. Worse still, the missing icon issue persisted. To investigate further, I ran PowerShell as Administrator and executed Get-AppxPackage Microsoft.DesktopAppInstaller -AllUsers. The output showed only one package: version 1.29.50.0, marked as NonRemovable. Was I stuck?

Yes, I Was Stuck…

The crux of the matter rests on how Canary builds handle App Installer. On these builds, the preview version of App Installer is baked into the OS image. Indeed, it’s registered as a system-level package. Because it is marked NonRemovable, neither the Microsoft Store nor PowerShell can uninstall or override it. That explains why even though the Store shows the stable App Installer as Installed, Windows continues to use the preview version.

Yep, sez right at bottom: NonRemovable: True

This locked-in preview build lacks support for feature flags like Visual Icons and Rich Output. Alas, their lack also explains the missing icon column in WinGet output. No attempts at reinstalling, resetting, or tweaking settings.json can override this limitation. Stuck indeed.

Note: the lead-in graphic for this story comes from the Build 29558.1000 announcement blog. I can see that damnable delectable icon there in the posting, but I’ll be darned if I can make it show up on my Canary install. Go figure!

 

 

Facebooklinkedin
Facebooklinkedin

Understanding UEFICA2023Status=NotStarted

With the introduction of the Windows UEFI Certificate Authority 2023 (CA‑2023), Microsoft updates the Secure Boot trust chain to enhance platform security. As part of this transition, Windows systems may report a registry value under the key HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing named UEFICA2023Status. This value reports the status of the Secure Boot servicing task that migrates systems to the new CA‑2023 trust model. Understanding UEFICA2023Status= NotStarted is important, because it doesn’t mean CA2023 is not in use in the running Secure Boot environment. Let me explain…

What UEFICA2023Status=NotStarted Means

There are two reasons why UEFICA2023Status can take a value of NotStarted. The obvious one is when the CA-2023 certificate is ready to be added to the Secure Boot value stores, and the Servicing Task hasn’t yet been scheduled or run. The other, as I’m about to describe happens when the Windows PC is already up-to-date. Huh?

The UEFICA2023Status value can take on several states, including NotStarted, PendingReboot, Completed, and Failed. A common misconception is that a NotStarted value signals failure to apply the CA‑2023 update. In reality, this value might also mean that the Secure Boot servicing task has not been triggered. Why? Because the system already meets all necessary criteria for CA‑2023 compliance, and that task need not be run.

Specifically, Windows only initiates this servicing task if all of these three conditions are met:
1. The system firmware does not already trust the Microsoft UEFI CA 2023.
2. The EFI System Partition (ESP) does not contain a bootloader signed by the CA‑2023.
3. A servicing stack update or cumulative update requires the migration to complete.

If the system firmware already includes the CA‑2023 certificate and the ESP contains a CA‑2023‑signed bootloader, Windows deems migration unnecessary. In such cases, the registry value remains NotStarted, which is both normal and acceptable. Even so, it took me aback when I checked this value and saw that status (see lead-in graphic). It spurred me to investigate, and led to this very blog post.

As it happens, the BIOS/UEFI flash I conducted to get the MSI MAG Tomahawk B550 motherboard working updated Secure Boot and included the CA-2023 certificate data as well. And, somewhere along the way the EFI partition got rebuilt to include the CA-2023 signed bootloader. My desktop, Flo6, simply doesn’t need Windows to run the UEFICA2023 update task.

Verifying the EFI Bootloader Signature

It’s easy to confirm that the system is booting with a CA‑2023‑signed bootloader. Indeed, one need only examine the signature of the boot manager located on the ESP. This typically resides at S:\EFI\Microsoft\Boot\bootmgfw.efi (where S: is the mounted ESP). Using PowerShell, execute the following one-liner command:

Get-AuthenticodeSignature "S:\EFI\Microsoft\Boot\bootmgfw.efi" | Format-List *

If it’s current, the output shows the [Issuer] as Windows UEFI CA 2023. (Otherwise it shows as Windows UEFI CA 2011.) Seeing CA 2023 here confirms that the firmware uses a bootloader signed with the updated certificate authority.

Comparing with the OS Copy

Windows also maintains an OS copy of the boot manager at C:\Windows\Boot\EFI\bootmgfw.efi. This file is not used for booting but may be referenced during servicing operations. It is common for this file to remain signed by the older Microsoft Windows Production PCA 2011 certificate. This does not impact Secure Boot functionality, because the firmware uses the ESP copy. We’ve just confirmed the the ESP copy is current and correct for CA-2023.

This Time, NotStarted Is All Good

Appearances to the contrary notwithstanding, a UEFICA2023Status value of “NotStarted” does not always indicate a problem. Instead, it can simply reflect that the system complies with the Secure Boot requirements for CA‑2023 (and got there before MS could). We verified the ESP bootloader is signed by the Windows UEFI CA 2023. We also confirmed that the firmware trust store includes the appropriate (2023) certificate. Passing these checks means that users can be confident that the system is operating within the latest, current Secure Boot regime despite this “interesting” status. No further action is required unless future updates say otherwise.

Facebooklinkedin
Facebooklinkedin

PS Version Bump WinTerm Oddity

As is my usual practice, my workday starts off with a cruise over the mini-fleet of PCs here at Chez Tittel. I look for upgrades, updates, changes, and glitches. Today, I ran into something interesting on the Lenovo ThinkPad P16 Gen 1 Mobile Workstation. A PowerShell (PS) upgrade happened — and succeeded — even though its parent WinTerm session shows WinGet reporting “Installation abandoned.” That’s the source of this particular PS version bump WinTerm oddity. Let me explain…

Exploring PS Version Bump WinTerm Oddity

As you can see in the lead-in screencap, the left-hand WinTerm pane is running PowerShell v7.5.5. You can also see that WinGet gets going on a v7.6.0.0 upgrade, but reports “Installation abandoned” at its apparent conclusion. Indeed, most readers might be tempted to conclude from this that the installation failed. Not so!

As you can see in the right-hand pane, opened after the apparent WinGet failure, the PS version there is 7.6.0(.0). The update succeeded but it can’t show itself in the parent pane for a very good reason. PS v7.5.5 is running that pane, and the developers didn’t include logic to halt that process and swap in a new version as part of the way that PowerShell works.

It’s a kind of Catch-22 (“How can you see you have flies in your eyes, if you have flies in your eyes?” as Orr asks in the famous WWII novel). With the older version running, you can’t really get the newer one to report itself right there at that moment. But as the right-hand pane shows, you need only open a new PS Session and presto! the new version is up and running therein.

Self-Update Is a Tricky Thing

This is an age-old gotcha in computer science. When the thing being updated is also running (and indeed, running the update tool in use), certain compromises and workarounds are needed to prevent things from falling over. For PowerShell, that means reporting a cancelled installation even though the installation itself completes and succeeds. The session that did the work simply can’t see and report on that particular change, because it itself would have to change to do that. Start a new session, and a new and changed context lets that happen.

Here in Windows-World, change is a constant. When the changer itself is changing, things get interesting. WinGet’s report of a “cancelled installation” for PowerShell shows how a specific compromise happens at runtime when PowerShell participates in its own update process. Fun!

 

Facebooklinkedin
Facebooklinkedin

WinGet Versions May Affect Installs

I just saw something interesting running WinGet on multiple PCs here at Chez Tittel. On my production desktop (Flo6) running production Winget (Version 1.27.470.0) a Teams update just failed with error message “…system cannot find … file specified (0x80070002).” On my Canary test system (X12Hybrid) running preview Winget (Version 1.29.30.0) that very same update succeeded. Inevitable conclusion: WinGet version may affect installs and updates, including success or failure. Who knew? Let’s discuss…

Why WinGet Versions May Affect Installs

Copilot confirms my suspicion that version differences sometimes affect update or install behavior. It says (and I concur) “some WinGet releases and App installer builds handle extraction and temp paths differently; newer/older builds can succeed where others fail.” Isn’t that strange — but typical — for Windows stuff anyway?

Fortunately, the in-app updater in Teams popped up as soon as I opened the app up. It, at least, was able to update itself successfully. So I applied the old principle: if you can’t do it one way, try another, and got past this hurdle anyway.

Is It a Version, or an Instance?

Then I went looking at my other production level PCs here at Chez Tittel. I looked at 4 other machines in my office all running Windows 25H2 Build 26200.8037 (latest production build). None threw the same error, though all are on the same Windows, Winget and Terminal versions. Interesting! My other production machines, however, did post this warning (in yellow) after the Teams update:
“Successfully installed. Restart the application to complete the upgrade.” (That warning does not appear in the lead-in graphic, which comes from a preview WinGet version instead.)

I’m left with no choice to conclude that it’s the configuration of the particular machine (Flo6) that’s somehow suffering or different. Based on what Copilot told me, it’s likely a PATH issue of some kind. As the old Internet adage goes so well for Windows: YMMV. Indeed, it just did!

Facebooklinkedin
Facebooklinkedin

On Windows 11 Restore Points

In Windows 11, a restore point provides a snapshot of various essential system files, settings, installed programs, and the registry taken at a specific point in time. Restore points can roll back the OS and associated state info should something go sideways. They don’t replace backups (especially image backups) because they don’t contain personal files and documents, nor do they capture other boot disk partitions for full restoration (e.g. EFI, MSR and recovery partitions, if present). I’ve been thinking on Windows 11 restore points because I don’t use them (I use daily image backups instead) and because they can take up lots of room on disk.

Looking further into Windows 11 Restore Points

Before I could share my reflections and observations about Windows 11 Restore Points (let’s condense that to W11RPs) I had to find a machine with them turned on to dig into them a bit. Turns out my newest personal acquisition — the very nice ASUS Zenbook A14 I picked up during Black Friday sales last year — still has them turned on. You can see that the C: drive has W11RPs enabled, and the info about a single restore point that I just generated right under neath.

You can find restore points inside the WizTree app pretty easily, if you’ve got any. They appear within the System Volume Information folder, which lives at the root of the boot/system drive (C:\ usually). It’s the big purple rectangle in this snippet from Wiztree, and corresponds to the shadow copy item shown in the lead-in graphic (output from the vssadmin list shadows command, in fact):

At 2.3 GB in size, one can see why keeping numbers of them around might be something of a storage-sucker. In truth, that’s one big reason I typically don’t keep them around.

Turning W11RPs on and off, and more

The controls for W11RPs live on the Protection tab of the System Properties applet in Control Panel. Settings in Windows 11 kind of interferes with access to this info, so the best way to get there these days is to invoke its executable directly (Into the Windows Run box (Winkey+R), type this string:

C:\Windows\System32\SystemPropertiesProtection.exe

That fires up the item screencapped next, and shows the key controls for W11RPs, to wit:

For any drives available on the target system, you select its entry, click the “Configure” button then enable or disable restore points. As you can see about the C:\ drive has W11RPs enabled, and it came that way from the factory.

Problems with W11RPs?

If you read up on informed sentiment about W11RPs (I get my insights from many sources, but find TenForums.com and ElevenForum.com particularly insightful), you’ll learn that they sometimes work, and sometimes don’t. If you use them, you’ll learn that they take a while to load (on the order of 15-20 minutes on most of my PCs). They also tend to happen once a day by scheduled task, and whenever you make system changes or install apps that include built-in RP capture commands.

You can use them if you like. I don’t like, and I don’t use them. Macrium Reflect can restore a full system image on my PCs in the 2-6 minute range, is easier to use, runs from a rescue disk if needed, and has shown itself to be thoroughly reliable and capable. For me that’s the end of the story.

Now, pardon me while I go off to disable W11RPs on the AsusSnap. I seem to have forgotten this little step in my intake process…

 

Facebooklinkedin
Facebooklinkedin