# Changelog All notable changes to KillerShell are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [1.2.3] - Unreleased ### Added - Hungarian localization for the complete app interface and killershell.net, bringing both to twelve languages. - Storage Analyzer now uses a Master File Table fast path for elevated scans of local NTFS drives and folders. It enumerates the volume by file ID, builds the same treemap tree, and automatically falls back to the existing parallel directory walker for ordinary accounts, network paths, other filesystems, or any unsupported MFT operation. ### Changed - killershell.net's Help and Technical pages now have complete twelve-language coverage, including every newer archive, pane, editor, administration, Storage Analyzer, and shortcut section. The 90-row shortcut reference, its scope/category headings, and its List/Keyboard labels are generated from the app's own locale dictionaries so the website cannot drift from the F1 card. Polish, Czech, and Japanese are also accepted by the website language switcher instead of falling back to English. ### Fixed - Context menus now use opaque, square popup surfaces so menu labels render with ClearType instead of coarse grayscale antialiasing. - Terminal prompts now retain their last valid theme palette if the live session file is briefly unavailable, preventing the path block from flashing red while using a blue theme. - Browsing-tab icons now follow the current folder after navigation, including special folders such as Home and Pictures. - KillerShell now detects when both a per-user and an all-users installation exist and offers to remove the copy that is not running, and self-update keeps the Add/Remove Programs version current instead of leaving it describing the replaced build. - Snapping, maximizing, or restoring the window now keeps the dual panes' proportions instead of handing all the new space to one pane; dragging the window edge still resizes only the right pane. - Open terminal here from the results context menu now uses the folder being viewed when no file row is selected, matching F8 instead of silently doing nothing. - New terminal tabs now preserve their startup screen until layout supplies a real size, so a fast first PowerShell prompt remains visible instead of being pushed into scrollback by a temporary 1x1 buffer. ## [1.2.2] - 2026-08-18 This release makes portable installs and updates safer, expands Storage Analyzer and ZIP workflows, completes localization and theme coverage, and gives the 98SE interface a substantial polish pass. ### Added - Storage Analyzer scans can now be exported as self-contained HTML reports with the current filters, an SVG treemap, ranked folder and file tables, and a compact file-type color legend. - ZIP archives now support creating empty folders, dragging complete folder trees out, and canceling any rewrite without changing the original archive. - The folder tree has an independent Show hidden folders option and now lists every Windows drive, including mapped network drives; reopening the sidebar discovers new drives, and elevated windows can recover hidden mappings. - Recycling a folder now asks for confirmation. The prompt can be disabled from the About card; individual files still recycle without interruption, and permanent deletion always asks. - The About card now has Clear all Data, which removes saved preferences and temporary archive extractions without touching user files or the installation. ### Changed - All thirteen app themes are complete app-owned resources and are available in HTML reports; website palettes are generated from those same XAML resources. 98SE web geometry remains deliberately deferred. - Polish is now fully translated, and all ten non-English interfaces have complete string coverage, including Storage Analyzer, install/update prompts, and the latest file, tree, and performance commands. - The technical website now localizes its administration and Performance Monitor content, restores native Spanish, French, and Turkish diacritics, and generates its shortcut reference from the app's bindings and English resources. - Keyboard Shortcuts now stays inside the app window and scrolls when space is tight. It and the About card also share the family overlay spacing and close-button treatment. - UI polish includes clearer accent-button text without hover shadows, corrected Ectoplasm selections, thumbnail-only image shadows, improved editor and terminal insets, consistent About-card borders, solid input surfaces, and corrected 98SE toolbar bevels. Shadows remain disabled under 98SE. - Theme and language menus now sit above the footer consistently instead of opening too low against it, and the theme menu expands to fit its localized Fonts and File Associations commands. - The technical guide now documents KillerShell's Zip Slip protections, and internal cancellation resource keys use the same spelling as their displayed text. ### Fixed - Storage Analyzer opens normally again; initializing its new file-type legend no longer crashes the tab. Its tab uses the same theme-aware hard-drive artwork as the folder tree, its map is textured before and after scanning, and common data, package/game, font, and configuration files now use distinct colors instead of falling into gray Other blocks. - Portable installs now distinguish fresh installs from per-user and all-users updates, honor the desktop-shortcut choice, verify the installed file before relaunch, and enforce one installed copy. Machine-wide installs and uninstalls correctly elevate, clean up the current account's older copy and registrations, and remove shared files and shortcuts. - Performance Monitor tiles now form independent, gap-free columns with half-height graphs, a compact 2x2 hardware summary, varied metric colors, and one authoritative readout per value. Multi-series values live beside their legend keys, repeated field rows are gone, and full device names wrap on their own line. GPU memory shares one two-series plot. The 98SE tab has a full-width sunken frame that connects the card dividers and separates the active tab from the black client area. - Scrolling file and Performance views now shadow clipped edges through the scrollbar gutter, while dense tables dissolve their content instead; Event Viewer and Processes/Services keep their header edges clear and fade only at the bottom. Folder and Registry trees fade long content before the side scrollbar; Registry also gains a visible resize handle and a slimmer default tree. Pane frames retain their top and side rails while the bottom rule stays hidden until the true end; tool scrollbars sit against that lower edge, and Processes uses the full table width. - Dragging a real folder out of the listing no longer produces an empty drag payload; validation now accepts existing directories as well as files. - The places drawer sizes itself from its real row and padding geometry, so the final selected row keeps its rounded bottom corners instead of being clipped by hidden list chrome. - Process rows now stay in the correct order as live CPU or memory values change after sorting by either column. - File-list shortcuts now act only on the focused list and current selection instead of a stale right-clicked row or another pane, and browsing tabs preserve live multi-row selections through tab changes and silent refreshes. - Tab state capture now tolerates the brief no-active-tab state used while panes are opened, emptied, moved, or closed instead of crashing during the transition. - Renamed files move to their correct sorted position while retaining selection and preview. - Show hidden/system now consistently includes or filters Windows Hidden and System items plus dot-prefixed files and folders, across initial listings, live updates, renames, and both panes. - Supported documents now use the bundled document icon instead of the KillerShell app logo. ## [1.2.1] - 2026-08-10 1.2.1 is a single-fix release, and an urgent one: in 1.2.0 every confirmation dialog closed the app instead of opening. Anyone on 1.2.0 should update. ### Fixed - Confirmation dialogs open instead of closing the app. Deleting files, replacing an entry inside an archive, ending a process and installing the portable copy all ask before they act, and in 1.2.0 the window that does the asking died the instant it was built, taking the app and the open session with it. The actions themselves were never broken - the dialog in front of them could not appear. Its caption row was sized from a theme value that held the right number in the wrong form, which a theme file can express safely and a live theme lookup cannot. It affected every theme, and it went unnoticed through 1.2.0 because it only shows when a confirmation is actually reached. ## [1.2.0] - 2026-08-10 1.2.0 opens archives like folders and lets you write to a .zip from inside one, adds a Storage Analyzer that draws a whole drive as a treemap, and brings the theme picker to thirteen with a full Windows 98 recreation and its own period icon set - plus a KillerShell icon pack throughout, a shortcuts card that knows the app is eight applets rather than one, and a rebuilt Performance tab. It also fixes the two drag bugs that had been chased since 1.1.4: one could corrupt the process heap and take the app down, the other left the drag icon stranded on the window. ### Added - Archives open like folders. Double-click a .zip, .tar, .tar.gz, .tgz or .gz and you are inside it, browsing with the same rows, sorting, icons and keys as anywhere else; Up climbs back out to the folder holding it. Opening a file inside one extracts a copy and hands it to whatever normally opens it, and dragging a file out drops a copy wherever you let go. No new dependencies were added for any of this, and .rar and .7z still open in whatever you already use for them. - A .zip can be changed from inside it: drag or paste files and folders in, Delete an entry, F2 to rename one. A folder takes everything under it, and an empty folder dragged in still arrives. Nothing already in the archive is ever quietly overwritten - a name that is already taken stops the write and asks, with keeping both as the default and replacing as a tick box. Every change is made by building a complete new archive beside the original and swapping it in only after it has been reopened and checked, so a crash, a full disk or a cancel leaves the original file exactly as it was. Adding one file to a zip rewrites the whole zip, so the status line carries a percentage rather than going quiet. Tar, tar.gz, tgz and gz stay read-only and say which they are: rebuilding a tar from what this build can read would drop the links, devices and other members it does not model, and a lone gzip has nowhere to put a second file. Moving out of an archive is deliberately not offered - that would be an extract plus a delete-from-archive with no way to make the two one, and Explorer treats zip drag-out as a copy for the same reason. - A Storage Analyzer tab, on F4 (Ctrl+F4 for an elevated scan that can read folders an ordinary account cannot) and on the sidebar rail. Point it at a folder or a drive, press Scan, and every file becomes a rectangle sized by how much room it takes - the WizTree and WinDirStat way of seeing where a disk went. Double-click a folder to zoom in, and a breadcrumb climbs back out. The scan is a parallel walk that never follows junctions or symlinks, so nothing is counted twice, and folders it is not allowed to open are counted and skipped rather than stopping it. A depth control flattens the map to the folders that matter, a minimum-size control hides the noise, and coloring switches between file type and top-level folder; all three are drawing filters, so they apply instantly and never change the totals. Right-click for open in a new tab, open in Explorer, copy path, or delete - and delete only ever goes to the Recycle Bin. The footer names whatever is under the pointer with its size and share of the map, plus the drive's total and free space. - Seven new themes, bringing the picker to thirteen: 98SE, Ectoplasm, Decay, Mourning, Sepulchre, Delirium and Malaise. 98SE carries its own accent set, like Dark, Light and Black. All thirteen names are translated into every shipped language, except 98SE, which is a product name. - A KillerShell icon pack replaces the Windows shell icons throughout. Folders have their own art, and the special ones are drawn as themselves rather than as generic folders: Home, Desktop, Documents, Downloads, Pictures, Music, Videos, Favorites, Program Files and Windows, plus drives and This PC. Every tab kind has an icon too - shell, admin shell, a closed shell, text editor, Task Manager, Event Viewer, Performance and Registry Editor. - The 98SE theme draws a period icon set instead of the brand one, so the folders, drives, tabs and tool icons match the rest of the theme rather than sitting on it. Switching theme swaps the whole set live. The art is Chicago95 (GPL-3.0+/MIT, the same license family as KillerShell), upscaled with nearest-neighbor so the pixels stay pixels; `Resources\icons\98\ATTRIBUTION.md` maps every icon to its source. ### Changed - The shortcuts card (F1) knows the app is eight applets, not one. Every binding now carries a scope - everywhere, file browser, terminal, editor, Processes/Services, Event Viewer, Registry Editor or Storage Analyzer - and both views group by it, so a key that only exists inside one tab stops reading as though it worked everywhere. The keyboard map draws the meaning that belongs to the tab you are actually on and says which scope that is above the board; hovering a key that is local to a tab names that tab. Two chords that had to be left off the map because a keycap could only say one thing are on it now: Ctrl+Shift+C is Copy full path in the listing and Copy in a terminal, and Ctrl+Shift+A adds a search term, runs a process as administrator, or selects all in a terminal, depending on where you are. - The card's list and the keyboard map are generated from one table instead of two. They had drifted: the map showed bare F7 as "add a filter" long after that moved to Shift+F7, showed Ctrl+Shift+C as case-sensitive matching after that moved to Alt+C, and the list was missing Ctrl+Shift+F8 (elevated CMD) entirely. All three are right now, and Alt+C appears on the map for the first time. - The Performance tab is a grid of full-size cells instead of a list of small tiles beside one big graph. Every metric is live at once, each cell can be half or full width, and dragging a cell's header reorders the grid. The layout is remembered. - Bare F4 opens the Storage Analyzer. It used to be a third way to edit the address bar, which still answers to Ctrl+L and Alt+D. - Files can be dropped onto the folder tree and onto a saved place, not just onto the listing - both mean the same thing dropping on a folder does. Dropping a folder on the empty part of the places drawer still saves it as a place. - UI and theme tweaks throughout. Selected rows read as white on the accent color and hovered ones as accent on a neutral wash, consistently, and menu icons rest in the plain text color and turn accent with the row rather than sitting accent-on-accent. The Black theme draws its card and dialog borders dark again instead of ringing every dialog, card and keycap in a mid-gray box. Outline buttons are readable while hovered on every theme. The sidebar and the search panel each slide out under the window edge when closed, rather than standing still while the content wipes across the top of them. The search panel's term and filter cards no longer render their text through their own drop shadow, the performance graphs' plot wells carry the same film grain as the cells around them, and the recents dropdown draws its folder icons whole, with a remove X on every row. - The new icons are used everywhere one is drawn: the sidebar tree, the places list, the file listing, the tab strip, the tab overflow list and recents all resolve through the same place, so nothing can end up with a different folder icon from its neighbor. - The app icon is the Killer seashell. - A tool's rail icon lights in the accent while a tab of that kind is open anywhere in the window - Event Viewer, Processes, Performance, Registry Editor and Storage Analyzer - so the rail tells you what you already have open instead of looking the same either way. Background tabs and the second pane count; only closing the last one of a kind puts the icon out. - The shared KillerUI palettes are vendored into the repo instead of linked in from a sibling folder at build time. KillerShell now clones and builds on its own, the GPL source zip is complete, and the palettes stop drifting from the ones actually in use. - `--demo` covers everything the app has grown since it was written. The invented machine gained the shell folders it was missing (Favorites, Music, Recent, Searches, Videos) plus Sysinternals, the app's own install folder and a slice of AppData, and its picture folders are now full enough to fill an icon view. Its saved places are a fixed set of fifteen, one per icon in the pack, so the drawer shows the whole folder-art set at once, and demo mode neither reads nor writes the real list. There is a second browsed tab, a picture folder, where every tile is a real image. The Event Viewer's fabricated log is 36 records across Application, System and Security and every level including Critical and Verbose; Processes and Services list 37 and 25 rows with every startup type represented; and the fabricated registry is 56 keys carrying all six value types, including the policy and service branches an endpoint actually has. As before, none of it touches the real machine - no EventLogReader, no WMI, no ServiceController, no RegistryKey. - The invented machine's profile is `C:\Users\Demo` everywhere - the folder tree, the browse listings, the search results, the saved places, the icon map, the fabricated registry, the Task Manager rows and the Event Viewer records. It used to carry a real account name and a real machine name, which put one person's directory layout into a public repository and into every screenshot taken from it. ### Fixed - Dragging a file out to another application no longer corrupts memory and takes the app down with it. The object KillerShell hands to the drag was releasing every piece of data it held by freeing the raw memory handle, which is only correct when that memory belongs to us - and during a drag that shows a drag image, Windows attaches data whose memory belongs to the shell, then re-attaches it repeatedly as the drag moves. Freeing that does not raise an error; it damages the process heap, so the crash landed later and somewhere unrelated, as a heap fault inside Windows itself rather than anything pointing back here. Releases now go through the OS routine that respects who owns what, data that cannot be safely copied is skipped rather than aliased, and every memory allocation on the drag path is checked before it is written through. - The drag icon no longer stays stuck on the window after dragging a file into another application. Two halves, both fixed. KillerShell tells Windows the cursor arrived whenever a drag crosses its own window, but never told it the cursor LEFT - it assumed the receiving app would take over the drag image, which Explorer does and nearly nothing else does, so dragging into Telegram or GIMP left the icon painted at the window edge where the cursor exited, until the app was closed. A real exit is now reported the moment it happens, while the child-to-child crossings WPF disguises as exits are still left alone, since reacting to those is what used to crash mid-drag. And separately, the data Windows attaches during the drag carries a reference to the shell object that owns the drag image; nothing released that data when the drag finished, so even the paths that should have cleaned up could not. Every drag now releases what the shell stored the moment it completes. Chased since 2026-08-03. - Opening any elevated tab no longer buries the desktop in Explorer windows. An admin window already refused to save the session, but still restored it, so it came up carrying every tab from the ordinary window - and each restored shell tab then asked for a non-elevated terminal inside an elevated window, which is answered by handing the request back out through explorer.exe. One stray Explorer window per open tab, every time. An elevated window no longer restores the session, matching its existing refusal to save one. - Ctrl+F8 opens an admin terminal again. The elevated window it relaunched into built its shell profile as unelevated, so the request fell through the "non-elevated shell in an elevated window" guard and was bounced straight back out to a new ordinary window through explorer.exe - meaning every press put up a UAC prompt and then spawned an extra explorer.exe and an extra KillerShell, while the admin window itself came up with no terminal in it. Same fix covers Ctrl+Shift+F8 for an admin CMD. - An admin shell window that fails to open its terminal no longer strips its own menubar, sidebar and tab strip, which left a file browser with no address bar and no way to tell which folder it was showing. - Choosing icons view in the folder picker crashed the app, and its list view showed one tall column instead of Explorer's columns. The dialog was asking for a layout that only exists inside the file pane, where a dialog can never see it. - Photos taken in portrait show the right way up. A phone writes a portrait shot as a landscape frame plus a tag saying which way to turn it, and nothing in WPF reads that tag, so every one of them sat on its side in the listing thumbnail, in icon view and in the details preview, while Explorer showed the same file upright. The tag is read now, and the three places that decode an image share one routine instead of carrying three copies of it. - Ctrl+Shift+A on a Processes row (Run as administrator) and Ctrl+Shift+C in a terminal (Copy) can no longer be taken by the window. The window watches keys on their way down to the tab, so a chord bound in both places was always decided by the window first; the two that collide are now gated on which applet has the keyboard. - The terminal draws the glyphs a prompt actually uses. Anything the chosen font was missing came out as a box, because the terminal resolves one typeface and draws with it directly; it now falls back per character to the bundled set and then to an installed font, with Nerd Font icons only ever resolved against a real Nerd Font so a lookalike cannot draw the wrong picture. - Switching to another tab and back keeps the rows you had selected, and the details strip with them. No tab stored its selection anywhere, so the return trip re-bound the results list and came up with nothing selected. Each tab now remembers the paths of its selected rows and puts them back, multi-row selections included, and a folder tab that re-lists itself on the way in still gets its selection back afterwards. - A shell or document tab can no longer end up wearing two stacked menu bars. Ctrl+F10 toggles the folder location row without going through a tab switch, so it never checked what kind of tab was showing and could slide that row open directly above the shell's own bar. Reachable in one keypress in any window that starts on a shell. - In demo mode the details pane shows a created date for a fabricated file instead of a dash. ## [1.1.4] - 2026-08-03 1.1.4 fixes a crash when dragging files to external applications like Teams and Telegram, plus a ghost icon that persisted on the desktop after dragging to external apps. ### Fixed - Dragging a file to Teams, Telegram, or other external apps could crash KillerShell with an `AccessViolationException` - `NativeDataObject` did not check for NULL returns from `GlobalAlloc` and `GlobalLock`, so when either failed the code would attempt to access invalid memory. Error checking and exception handling added for all Win32 global-memory operations. - `NativeDataObject.GetData` could throw unhandled exceptions when called from a different thread (which happens when dragging to external apps), crashing the entire drag operation - now wrapped in a try-catch to return an empty medium on error, matching the same defensive behavior for in-process calls. - The HDROP structure building could overflow with very large file paths or many files - overflow checks added to prevent negative size calculations that could cause `GlobalAlloc` to fail. - Dragging a file to an external app left a ghost icon (the drag-image layered window) permanently visible on the desktop until the app closed - `IDragSourceHelper` manages the drag-image window lifecycle and must stay alive for the entire `DoDragDrop` call. The helper was being released immediately after initializing the drag image, before the drag even started, which orphaned the window and prevented ole32 from cleaning it up. The helper is now kept alive through the entire drag and only disposed after `DoDragDrop` returns. ## [1.1.3] - 2026-08-03 1.1.3 is a bug fix release - a file drag-and-drop that silently did nothing when dropped onto a folder row, a rename that could scramble the details-pane preview and lose the row's selection, a full pass fixing dragging files OUT of KillerShell (no drag image, a crash, dual-pane focus and refresh bugs, and a drag that needed a warm-up click), and a couple of smaller context-menu and About-card fixes. ### Fixed - Dragging a file or folder onto a folder ROW in the listing did not move or copy it into that folder - the drop target was always resolved as the currently browsed folder, never the specific row under the pointer, so a drop onto a folder icon silently landed back in the same folder it started in and the "already there" filter then treated it as a no-op. The drop target now checks for a folder row under the pointer first and falls back to the browsed folder only when there isn't one. - Renaming the selected file could leave the details-pane preview showing a different, wrong file's thumbnail (and could drop the selection outright) - a rename was queued as two unrelated file-system events (old path gone, new path appeared) and handled as a plain delete-then-add, which replaced the row with a brand new object. That threw away the object identity selection and the async preview decode were both keyed on, and could let a recycled virtualized row briefly show another row's already-decoded thumbnail. Renames are now matched as a pair and applied to the SAME row in place, so its identity, selection and preview all stay put and only its name/path fields refresh. - "More Windows options" did nothing when right-clicking empty pane space instead of an actual file or folder - the context menu item has nothing to open a shell menu FOR without something under the pointer. It is now hidden from the menu entirely unless a file or folder is actually there. - The About card's "Update available" button kept rendering with illegible text (reported repeatedly) - it was a bespoke Button+ControlTemplate trying to hand its own color down through TextElement.Foreground inheritance and a DataTrigger, both of which are exactly the kind of thing the shared `OutlineButton` style already exists to get right once. It now uses that shared style like every other outline button in the app instead of reinventing it. - Dragging a file out of KillerShell showed a bare text cursor instead of the shell's usual dragged-icon-at-reduced-opacity - `System.Windows.Forms.DataObject`'s `IDataObject.SetData` throws `NotImplementedException` (it is written only to be read from as a drag source, never written to), which silently defeated the shell's `IDragSourceHelper`. Drags now build a real native-COM `IDataObject` (`NativeDataObject`, backed by real Win32 `GlobalAlloc`/`GlobalLock`/`GlobalUnlock`) and use `ole32.dll`'s `DoDragDrop` directly instead of WPF's own wrapper, which re-boxes whatever `IDataObject` it is given and would have thrown the fix away. - Even with the drag image fixed as a source, dragging a file from one KillerShell pane onto another never rendered the shell's drag-image ghost - `IDropTargetHelper` (the DROP side that actually paints the layered bitmap) was never wired in; WPF's own `AllowDrop` plumbing has no idea it exists. Now wired into the window's `DragEnter`/`DragOver`/`Drop`. - Dragging a file could crash the app with `AccessViolationException` - WPF raises its own `DragEnter`/`DragLeave` per child element crossed within the SAME window (an Image, then the Border beneath it, then the pane), but there is only one real native OLE drag session for the whole window; calling the shell's `IDropTargetHelper.DragEnter` a second time while it still considered the first session open desynced its internal state machine. `DragEnter` now only calls it once per real drag (later crossings are treated as `DragOver`), and `DragLeave` is a no-op - the real teardown happens once, in `Drop`. - A cross-pane drop moved the file but left the pane it came FROM showing a stale copy until the user clicked back into that folder - only the ACTIVE tab is watched for filesystem changes, and the drop switches focus to the destination pane before the move runs, so the source pane's watcher stopped covering it mid-drag. The source pane's folder is now re-listed directly right after the drop. - That same source-pane refresh then landed a whole drag late instead of immediately (drag `box.png`, it vanishes, but doesn't reappear moved until dragging `box1` next) - the destination pane's own post-move refresh and the new source-pane refresh both touched window focus without waiting on each other, and a listing whose folder's focus moved out from under it mid-flight silently discards its own results (by design, so a slow listing can't land on top of a folder you've since left). Both refreshes are now properly sequenced end to end instead of racing. - F10 (open second pane) showed the pane but never actually moved real command focus to it - the pane-seeding code always quietly handed focus back to whichever pane had it before. F10 now keeps real focus on the newly-opened pane. - Dragging a file needed a "warm-up" click first - clicking and dragging in one motion on a row that wasn't already selected silently did nothing. A freshly-realized row's container can still report no item for the press that lands on it (both the item-container generator lookup and the DataContext fallback could come back empty at that exact tick), so the seed the drag needs was lost immediately and never retried. The lookup is now retried once the drag actually clears the move threshold, by which point the container has always caught up. ### Changed - KillerPrompt's path shortening kept 2 segments in full before abbreviating everything above them to a single letter, which could abbreviate a short, meaningful folder name like `code` down to `c` (`~\c\KillerShell\shell-landing`). Now keeps 3. ## [1.1.2] - 2026-08-03 1.1.2 is primarily a dual-pane release - each pane now keeps its own zoom, density, column layout, view mode and details/preview strip state instead of sharing one, and the F10 open/close animation (plus the gutter drag) had a full pass to fix a cluster of stretching, off-screen and stale-state bugs - alongside image thumbnails in the file listing, the app's own themed file dialog finally wired into Save As and exports, and a handful of smaller polish fixes. ### Fixed - 1.1.1 shipped with the terminal and text editor's grain texture removed outright instead of correctly relocated (both paint their own background as one opaque fill with no exposed gap for a Border behind them to show through, so the fix that worked for the file listing did not apply here). It is now painted directly into each control's own background fill (`TerminalControl.OnRender`, `EditorControl.SurfaceWithGrain`), under the glyphs, so it shows in every blank cell without ever landing on the writing. - Save As in the text editor, and both result-export formats (CSV, HTML), opened the stock Windows file dialog instead of the app's own themed `FileDialog` (Controls/FileDialog.xaml) - it was built as a drop-in stand-in for exactly this and simply never got wired into any of the three call sites that needed it. - The file dialog's list/icon views couldn't be scrolled with the mouse wheel - they use a plain `WrapPanel` rather than a virtualizing, scroll-aware one, but the ListBox still had `ScrollViewer.CanContentScroll` at its default of `True` (item-based scrolling), which silently does nothing against a panel that doesn't implement `IScrollInfo`. Set to `False` so the wheel scrolls by pixels instead. The default List view still didn't scroll after that fix - it wraps into columns and scrolls sideways with vertical scrolling explicitly disabled, and a plain wheel only ever drives vertical scroll. The wheel now redirects to horizontal scroll while in that view. - The file dialog had no rounded corners and no window drop shadow - unlike MainWindow, it never called into the DWM rounded-corner API at all (only the separate theme-border-color call was wired in). `ApplyWindowCorners` (Chrome.cs) is now shared the same way `ApplyThemeBorder` already was, so the file dialog gets both the rounded frame and, on Windows 11, the standard shadow that comes with it for a chromeless popup. - The details pane's "path" field truncated with an ellipsis instead of wrapping, so a long path was only ever partly visible. It now wraps at word (path-segment) boundaries instead. - Restoring a previous session's tabs could show a tab with a real title but a blank pane and "No item selected" - a single corrupt saved line (a truncated escape sequence, say) aborted the whole restore loop, which could leave that line's half-built tab sitting in the tab list with everything past the failure still at its default (not browsing, no editor, no shell). Each saved line is now parsed in its own try/catch, so one bad line is dropped on its own instead of breaking every tab around it. - The folder tree's top/bottom edge fades read as a hard line instead of a dissolve - a plain 2-stop linear alpha ramp is more abrupt than it looks on paper against a tree full of text and icons. Both are now eased (held near-solid/near-clear at each end, most of the ramp in the middle) and taller (18/22px -> 30/34px) so the curve has room to actually read as a fade; a follow-up pass also gave both a flat plateau at their terminal value for the last quarter of the band, so the transition visibly finishes with margin to spare instead of landing exactly on the physical edge. - Dual pane's open/close animation (F10) and its gutter drag had a cluster of bugs in the same area, all fixed together: the second pane always opened at its bare minimum width regardless of how much room was actually available; closing it could visibly grow or stretch pane A instead of leaving it alone, or leave the window oversized instead of shrinking back; F10 and the gutter drag could both push the window (or the pane itself) past the screen edge on a monitor-snapped window; the window's own resize used to snap instantly instead of animating with the pane; and a second F10 press before the previous toggle's animation had finished could leave its bookkeeping stale, compounding on every repeat press. Now: the second pane opens at a comfortable width scaled to pane A's own size (capped, never smaller than the old minimum); pane A never changes size when closing - the window always shrinks back by exactly what the second pane occupied instead, except on a maximized window (which cannot resize independently of being maximized) where pane A animates into the space in sync with the second pane's own collapse; both F10 and the gutter drag check the real room left on the monitor before growing the window, so a snapped window correctly falls back to trading space between the panes in place; the window's resize now animates alongside the pane instead of snapping; and an interrupted toggle finishes cleanly before the next one is allowed to start. - A restored terminal (or editor/registry/processes/events) tab could show the file listing's column-heading row ("name / location / size / modified") sitting above it if the saved view mode was Details - the row's visibility was decided purely by view mode, with no idea whether a listing was even on screen, so `InitResultsView`'s own startup pass re-showed it a moment after tab restore had already correctly hidden it. Now also gated on the pane actually showing its results list, the same signal every non-listing tab already sets on activation. ### Changed - Dual pane's two panes no longer share one results view state. Tile/row icon zoom, density, the details-view column widths/visibility, and now the list/icons/details view mode itself used to be shared across both panes (view mode was a single MainWindow field mirrored into both), so changing any of them in one pane did the same thing to the other. Each pane now keeps all of it independently, and each remembers its own across restarts. - First cut of this reached each pane's state through a `RelativeSource` walk up to the `FilePane` UserControl, which broke every icon in every view (list, icons, details) - the walk resolved fine for the details header (a direct, non-templated descendant) but never for anything inside the results list's own item templates, realized and recycled by the custom virtualizing panels, so the icon size binding stayed at its default and every image blanked out. Fixed by reaching the state through the `ListBox`'s own `Tag` instead - shallower, and not dependent on how the virtualizing panels manage their realized containers. - The details/preview strip's open/closed state, dragged height, and whether the user had ever dragged it were still one shared MainWindow-wide state after the change above - opening, closing or resizing the strip in one pane did the same thing to the other, even though its content already read the right pane's own selection. Now per pane like everything else in this release, and each pane's strip remembers its own height across restarts too. - The About card's tagline trimmed "...one tab strip and one set of keys" down to "...one tab strip", dropping the keys clause. ### Added - The file listing shows a real thumbnail for image files (.jpg, .jpeg, .png, .gif, .bmp, .tif, .tiff, .webp) instead of the generic shared icon, decoded and cached per file (keyed on its last-write time, so an edited image's thumbnail refreshes instead of staying stale). ## [1.1.1] - 2026-08-02 1.1.1 is a bug fix release - a Registry Editor crash and freeze on HKEY_CLASSES_ROOT, a stale file-association icon that never refreshed across upgrades, and some grain-texture regressions in the file browser - plus expanded `--demo` coverage for the admin tools and a couple more canned editor/terminal samples. ### Fixed - Opening HKEY_CLASSES_ROOT in the Registry Editor tab crashed the app - the merged HKLM+HKCU classes view often has a stray key or value with an invalid name (embedded NUL, over-length) from some installer's COM registration, and `GetSubKeyNames()`/`GetValueNames()` throws for the whole call instead of skipping just that entry. That `ArgumentException` was already handled everywhere else in the tab (rename, delete, create); it is now caught in the tree-load and value-load paths too. - Selecting a value under HKEY_CLASSES_ROOT could still freeze the app afterward (Windows shows "not responding") even with the crash above fixed - a stray HKCR entry's DATA, not just its name, can be pathologically large, and the value grid handed the raw string/hex straight to a DataGrid cell with no cap, which is a genuine multi-second-or-worse WPF layout cost for a multi-megabyte cell rather than anything that throws. The grid now caps what it displays (4000 characters, or ~1300 bytes worth of hex for REG_BINARY) and says how much was cut off; Modify still reads and writes the real, untruncated value. - `text-file.ico` - the icon Explorer shows for every text extension (.txt, .md, .ps1, .yml, .csv, .ini and the rest of `Associations.TextExtensions`) defaulted to KillerShell - never refreshed once written next to the exe. A rebranded icon in a newer build sat unused forever unless someone unregistered and re-registered associations by hand. `EnsureFileIcon` now compares the on-disk file against the one embedded in the current build and rewrites it when they differ; a launch also refreshes it automatically when associations are already registered, so an upgrade alone is enough. - The file listing's icon/list/details views lost their grain texture entirely after `ResultsList`'s background moved from transparent to an opaque `SurfaceBrush` (the pane-level grain layer sat behind it and got covered). Restoring it naively painted texture on top of every icon and filename instead. Fixed properly: `SurfaceBrush` and the grain are their own layers behind a `Transparent` `ResultsList`, so texture only ever shows in the gaps around content, never over it - and their visibility is now tied to `ResultsList`'s own, so a shell/editor/registry/processes/events tab activating (which collapses `ResultsList`) does not leave an opaque layer sitting over it. - The file details strip never had a grain layer at all - added, drawn behind the field labels/values so it matches the rest of the pane's texture. - Removed the grain layer over the terminal and the text editor - both paint their own background and every character as one opaque surface with no exposed gap, so grain there could only ever sit on top of the writing, never behind it. ### Added - `--demo` now fabricates data for the Registry Editor, Event Viewer and Processes/Services tabs too, each reading from its own fixed fake source (`Services/DemoRegistry.cs` for the registry tree/values) instead of the real machine, the same "everything fixed, nothing live" rule the rest of demo mode already follows. HKEY_CLASSES_ROOT\.386's `PerceivedType` value in the fake registry is the same key/value that crashed the tab before this release's fix. - Two more fabricated file bodies for the text editor demo (`.md`, `.yml`/`.yaml`), and a second canned terminal session (network triage at a client site) for a second demo shell tab, so a capture does not repeat the same script/session twice. ## [1.1.0] - 2026-08-02 1.1.0 is primarily an admin tools release - Processes/Services, Registry Editor, Event Viewer and a Performance Monitor tab all built into the shell - plus the theme/language flyout rebuild, a file details/preview strip, and other smaller additions and fixes. ### Changed - Repo root decomposed into `Shell/`/`Controls/`/`Services/`, matching KillerPDF and Killendar. Pure reorganization, no behavior change. - More tooltips show their shortcut (bookmark folder, hidden items, new search tab, second-pane toggle); F1 card gained missing rows (Alt+D, editor-only Ctrl+G/Ctrl+S, Ctrl+Shift+P documented as the Dual Pane legacy alias). - The saved-locations drawer is called "Bookmarks" everywhere now, not "favorites" in some places and "saved locations" in others. - The bookmarks drawer can be dragged smaller than its rows need, never bigger - no more empty space when you have only a couple of bookmarks. - A shell tab's title tracks the current folder, like a folder tab's, instead of following whatever the shell happens to be running. - The terminal bar's location field is editable: type a path and Enter sends a `cd` to the live shell, rather than only reporting where it is. - New app icon and site branding, regenerated from the current logo art (app icon, site favicon and header/hero icon, README wordmark and banner, and the social-share image). ### Added - A details/preview strip (toolbar toggle or Alt+P) slides out of the bottom of the file browser with size/dates/type/attributes/path and an image thumbnail (or the shell icon) for the selected item, tracking the selection live; the filename is accented in the typewriter font, the strip matches the toolbar's background, and dragging its top edge resizes the strip's height (capped at half the pane, floored at the real measured height of its fields) with the image preview widening into any leftover space, remembered across restarts; it collapses to a thin line when there's nothing to show. - A saved document's path readout is editable too: type a path and Enter renames and/or moves the file on disk. Only available once the document has been saved at least once - an untitled document has nothing yet to rename. - The editor's encoding readout is a picker now: click it to change what the next save writes (UTF-8, UTF-8 with BOM, UTF-16 LE, UTF-16 BE, ANSI), instead of only ever reporting what was detected on open. - Text files get their own file-association icon instead of borrowing the app's. - Bookmarks can be dragged to reorder, right-clicked to open a (optionally elevated) terminal there, and the drawer fades its scroll edges like the folder tree. - **A Processes/Services tab** (issue #1), opened from its own rail icon. A live, filterable grid of every process (real CPU%, bulk-WMI command line/path/owner lookups so it stays cheap), with one icon button (tooltip + Ctrl+.) toggling the same grid to Windows services (bulk `Win32_Service` query for startup type/path/account). Right-click a row to end/restart a process or start/stop/restart a service, each behind a themed confirm dialog; the filter box matches path and user/account too, not just name. Double-click opens a details card, sized to its content and clamped so it can't grow past the screen you're on, with Previous/Next paging; every action also has a local keyboard shortcut (Delete, Ctrl+R, Ctrl+O, Ctrl+Shift+A, Ctrl+S, Ctrl+., Enter/Space). - **Shortcut reorganization** to make room for the above: Dual Pane moved F11 -> F10 (hide menubar moved to Ctrl+F10), Processes took plain F9 (Ctrl+F9 = elevated), and Export moved off F9 to Ctrl+Alt+E (HTML) / Ctrl+Alt+Shift+E (CSV). F11 went to the Performance tab below. - **A Performance Monitor tab**, F11 (own rail icon, no elevated variant needed - every counter it reads is available to an ordinary account), rebuilt as a Task-Manager-style master/detail layout: a scrolling column of small tiles - CPU, RAM, one per physical disk (labeled with its drive letters, e.g. "Disk 0 (C:)"), one per network adapter, one per GPU, all enumerated from the machine rather than assumed to be exactly one - each with a live one-line readout and a mini trace, and a detail panel for whichever tile is selected with a big scrolling graph (or two) and its own numeric fields. The CPU tile can switch its graph to a grid of per-logical-processor traces from a checkable right-click menu (also a direct "L" shortcut); the network graph plots send/receive as two distinct-colored traces instead of one combined line; and GPU utilization is live again, summing the "GPU Engine" counter category's `engtype_3D` instances the same way Task Manager itself does, with dedicated/shared GPU memory graphs alongside it where the driver exposes them; GPU sampling no longer re-enumerates the GPU Engine/GPU Adapter Memory counter categories every tick, which was spamming the Windows Application log with unrelated Perflib provider-reload errors - it now caches the counters and only re-scans for new instances every few seconds. - **An Event Viewer tab**, Ctrl+F12 only (admin-only, no bare key - the Security log needs elevation). Reads Application/System/Security via `EventLogReader`, with a log/level/text filter, colored severity dots, and newest-first sort. Right-click copies a row's message or full details. Double-click opens a details card, properly sized to its content and narrower than first shipped, clamped so it can't grow past the screen you're on, with every extra field, a syntax-highlighted (AvalonEdit) wrapped raw-XML view, a one-click web search for the event ID, and Previous/Next paging - all with local shortcuts (Escape, Ctrl+C, Alt+X, Alt+S, arrow keys). - Column headers in the Event Viewer grid, Processes grid, and the file browser's Details view can all be right-clicked to show/hide columns, through one shared menu; the choice is remembered per grid. - A browsing tab shows its folder's real Windows icon in the tab strip itself, not just the overflow dropdown. - Ctrl+F7 opens a new document whose save retries elevated on access denied, instead of just failing in a protected folder. - A tab can be dragged out into its own window, or into another KillerShell window (each window is its own process; the tab is rebuilt on the other side, not moved live), with a live insertion caret showing where it will land. A document with unsaved changes refuses the drag rather than dropping the edit. - **A Registry Editor tab**, Ctrl+F11 only (admin-only, no bare key - most of what it touches refuses a standard token anyway). Browse all five hives with a lazily-loaded tree (children load on expand, never eagerly walked), view a key's values with type-correct formatting (DWORD/QWORD shown as hex and decimal, binary as hex byte pairs, multi-string entries visibly separated), and edit/create/rename/delete both keys and values through the right-click menu or local shortcuts (F2, Delete, Enter, Ctrl+F to find a key or value name in the loaded tree, Ctrl+C to copy a name or path). Every value edit goes through one themed dialog that adapts its input to the value's type and needs an explicit Save click - nothing here auto-saves on a lost focus. Deleting a key warns explicitly that it takes everything nested underneath it with it, through the same themed confirm dialog (never a stock message box) the Processes tab's End Process already uses. The tree defaults to a narrower width and the value grid's Data column now takes the lion's share of the remaining space, so the default view no longer needs horizontal scrolling to read a long value; the value-edit dialog's Hex/Decimal radio labels are readable now (they had no explicit Foreground); and the toolbar/tree/value grid backgrounds match the pane/content-surface treatment used elsewhere in the app instead of reading a step darker, and the control's own root background is now painted PaneBrush too so the margins around those rows no longer show the darker menu background through as a black band; the tree sidebar now matches the plain main-window background instead of a content-surface tone, and the value grid's header row has rounded top corners with its own redundant background layer removed. ### Fixed - Tab-strip overflow dropdown icons rendered as the same placeholder shape for every row; now shows the real shell icon (or a color dot for Processes). - Recents dropdown menu icons sat flush against their labels with no gutter margin. - A shell, document or Processes tab open at quit now reopens fresh on restart instead of coming back as a broken, state-less tab; a shell tab restored this way also gets its themed prompt now (`InitShellEnv()` runs before restore, not after). - The update prompt uses KillerShell's own themed dialog instead of a stock Windows message box (the last one left in the app). - A shell or document tab's bar no longer paints a step darker than the pane it sits in; the shell/document/file-listing surface itself now all sit one step below the pane, matching KillerPDF's floating-bar treatment. - `SurfaceButton`'s `Tag="on"` checked state is visible again (it silently did nothing before, despite a comment claiming otherwise). - Removed a stray unthemed border on the text editor's current line (the background wash already marks it). - Clicking a bookmark while a terminal or editor tab is focused now opens a new browse tab instead of hijacking the focused tab (issue #4). - Fixed several related bookmarks-drawer sizing bugs: a phantom extra scroll row past the last bookmark, a 1px scrollbar sliver even when nothing was left to scroll, mouse-wheel "wiggle" over a fully-shown list, and the last row's bottom edge clipping - all traced to the drawer's height converging a fraction of a pixel short of its real content; it now only ever rounds long, never short. Its open/closed state also now persists across restarts instead of always reopening shut. - The bookmark for wherever the active tab currently is now shows as selected, and clears when you navigate away. - The second-pane rail button has distinct open/closed glyphs instead of one static icon. - Dual Pane's resize behavior was wrong: pane A now keeps its exact size when F10 opens the second pane (the window itself grows to fit pane B on a floating window, or splits the existing area only when maximized/snapped), the middle gutter resizes pane A only, and dragging the window's right edge resizes pane B only. - Bare Ctrl+V in a terminal tab pasted nothing; it sent the raw control byte instead of clipboard text, since only Ctrl+Shift+V and Shift+Insert were wired to paste. Ctrl+V now pastes too, matching Windows Terminal. - The theme flyout never landed in the right spot no matter how its placement was tuned - it was a raw `Popup`, and a `Popup`'s `CustomPopupPlacementCallback` fires before WPF has measured its content, so it kept pinning itself to the wrong corner. Rebuilt as a `Button.ContextMenu` (`ThemeFlyout`), the same construct the language menu already was and which always positioned correctly. Its content is now KillerPDF's exact RadioButton picker (Dark/Light/Black/Blood/Greed/Cyanotic) with an accent-dot row that slides open under whichever of Dark/Light/Black is active, instead of a flat swatch-button grid; the language menu got the matching RadioButton treatment. Also fixed the resulting lag when clicking a theme: `ThemeManager.LoadDict` was swapping the live theme dictionary one key at a time, firing a separate app-wide resource-invalidation pass per key (150+ per click); it now builds the combined dictionary off to the side and publishes it in one assignment. - Three editor-bar popups (go-to-line, the settings gear, the encoding picker) and the date picker's calendar drop-down snapped open with no animation, unlike every other popup and dialog in the app; they now fade in the same 150ms as everything else. ## [1.0.2] - 2026-07-27 1.0.2 is a small bug fix release - the results scrollbar takes clicks again, Ctrl+N opens a genuinely new window instead of your last session, F7 with nothing selected opens a blank document, and the Update button's label no longer disappears when you hover it. ### Fixed - **The results scrollbar can be clicked and dragged again.** The press handler treated anything that was not a row as empty space, started the rubber-band selection and captured the mouse - so a click on the scrollbar was swallowed before the scrollbar ever saw it, and dragging the thumb did nothing at all. A press that lands inside the scrollbar now returns before the marquee branch. The scrollbar is not empty space, it is the one piece of chrome inside that control that owns its own clicks. - **Ctrl+N opens a new window, not a copy of your last session.** A second window runs as its own process, and that process was reading the same saved tab list the first one did, so a new window came up carrying every tab from last time. It now launches with a `--new-window` flag that skips the session restore, giving one fresh tab pointed at the folder you were in, or Home if there was not one. Both windows still write the same saved session on exit, so whichever you close last is the one that is remembered. - **F7 with nothing selected opens a blank document instead of doing nothing.** The key only ever acted on a selection, and an empty one set a status line and returned, which from the outside was indistinguishable from a dead key. It now opens an untitled document, the same one the rail's pencil gives you. With a file selected it still opens that file, and the Edit row on the context menu is unchanged, since it is always seeded by whatever is under the pointer. - **The Update button's label is readable on hover.** Hovering fills the button with the accent, but the label was painted in that same accent and had its own explicit `Foreground`, so it vanished into the fill. The caption now inherits its color from the button's border via `TextElement.Foreground` and the hover trigger swaps it to `OnPrimaryBrush`, which every theme already defines as white. A trigger cannot reach the button's Content by name - it sits outside the template's namescope - which is why the color is carried down by inheritance rather than set on the TextBlock. ## [1.0.1] - 2026-07-27 1.0.1 is a bug fix release - a delete no longer walks the pane up a folder, a restored tab comes back as the folder it was instead of an empty search form, a refused delete asks in KillerShell's own dialog rather than Windows', a file operation stops throwing the listing back to the top of the folder, and the toolbar stops hiding a lone button behind an overflow chevron. The selected file's full path also lands in the footer, where a trimmed name cannot hide it. ### Added - **The selected file's full path shows in the footer.** Every view has to trim a name that will not fit - the icon grid worst of all, where a tile is as wide as the icon - and the part it trims is the tail, which is the part that tells two files apart. Selecting a row or a tile now puts its full path on the footer status line, which is the one place in the window sized for an unbounded string and which already elides from the front, so a narrow window costs you the drive letter rather than the file name. More than one selected shows a count instead. Clearing a selection leaves the line alone rather than wiping whatever a file operation just reported. ### Fixed - **Deleting a file no longer moves you up a folder.** Deleting something in Documents left you sitting in your home folder. Refreshing the folder tree after any file operation rebuilt each node's children by clearing the collection and refilling it, which threw away the container holding the tree's selection - and WPF answers a lost selection by selecting the PARENT node, which the tree then followed by navigating there. The refresh now reconciles in place, removing only entries that actually left the disk and inserting only new ones, so the selected folder and its container survive and nothing re-selects behind you. It affected every file operation that refreshes the tree, not just delete: a rename, a paste or a new folder could move you the same way. - **A restored tab comes back as the folder it was, not an empty search form.** The session format was still KillerFind's and had no field for browse state, so every folder tab was written out as a search scoped at that folder and restored as one: the location box showed the path, the listing was empty, and the first-run Home navigation was skipped because it only ran for a tab with no search root. The saved line now carries the current folder and a browsing flag, appended after the original nine fields so a session written by an older build still loads, and a restored folder tab is re-listed on startup. A session saved before those fields existed has no folder to resume, so the test is now whether the tab has a pattern to run at all: one with nothing to search browses its scope instead of showing an empty pane, and a scope that has since been deleted or unmounted falls back to Home. A real search tab with terms in it still comes back as a search form, untouched. - **A refused delete asks in KillerShell's own dialog instead of Windows'.** When the shell would not recycle a file on permissions - Controlled Folder Access, a locked-down ACL, a file owned by another account - it drew its own "You'll need to provide administrator permission" box, the one piece of UI in the app that was never ours. `FOF_NOERRORUI` suppresses it, the refusal comes back as a return code, and the answer is a themed prompt offering the one thing that can still do it: an elevated retry, which starts a second instance with `--recycle`, does the delete and exits without a window. Declining leaves everything where it was. The shell's progress dialog is untouched in the interactive path, since a long recycle still needs to show something, but the headless helper suppresses it as well - it has no message pump to draw one with. The dialog also says out loud that elevation will not defeat Controlled Folder Access, which blocks by binary rather than by token, and that the fix there is adding KillerShell to the allowed apps list in Windows Security. The helper's exit code is now checked, so an elevated retry that gets refused says so in the status bar instead of looking exactly like one that worked: a UAC prompt, then nothing, and the file still sitting there. - **The toolbar no longer hides a single button behind the overflow chevron.** In a pane narrow enough to shed exactly one button - which in practice meant Export, first in the shed order - you got a chevron that opened onto one icon. The chevron is about as wide as the narrowest button it can hide, so the trade bought no room and cost a click. Overflow now appears only when two or more buttons have been shed; below that the button stays on the strip where you can reach it. - **A file operation no longer throws the listing back to the top of the folder.** Deleting one file out of a long folder scrolled you to the top and left you hunting for your place. The refresh after a file operation was re-listing the whole folder, clearing and refilling the collection, which resets the scroll position by definition - while the folder watcher was sitting right there patching the same listing entry by entry, which is what it exists for. The re-list now runs only where there is no watcher to do the job: This PC, demo mode, and a share that refused a watch. Everywhere else the row disappears where it stands and nothing else moves. ## [1.0.0] - 2026-07-27 **KillerShell 1.0.0 is KillerFind 2.0.0 under the name it should have had.** The 1.x line was a search box that happened to list files. This release is a shell for power users: a file browser, a terminal and a text editor sharing one window, one keyboard and one tab strip, still a single portable exe with nothing to install. Search became one of the things it does rather than the whole of it, so the name went with it. Nothing is removed and no setting moves - it is the same codebase, renamed, versioned from 1.0.0 because the product it describes starts here. ### Added - **Windows knows what KillerShell is now.** A File associations card under the theme flyout registers the app with the shell: a ProgID, an entry in the Open With list for the 19 text types the editor handles, "Open in KillerShell" and "Open KillerShell terminal here" on any folder, drive and folder background, and the Capabilities block that puts KillerShell in Settings under Default apps. Per-user by default, all-users when the window is elevated, and taken back out by both uninstall paths so a ProgID never outlives the exe it points at. Registering is all it does: since Windows 8 the `UserChoice` key has been protected by a signed hash, so an app that sets itself as the default is either forging that hash or lying about it. The card says so and hands you to Settings, which is the only place the switch can honestly be thrown. `.bat`, `.cmd` and `.reg` get an "Edit with KillerShell" row rather than the open verb, because their double-click runs or merges them and quietly changing what that means is how someone loses an afternoon. - **A path on the command line opens.** `KillerShell.exe "C:\some\folder"` browses it and `KillerShell.exe "C:\some\file.log"` opens it in an editor tab, which is what makes the shell verbs and the associations above actually do something. Without it every one of them would have launched the app on Home and ignored what it was asked for. `--shell` and `--cwd` take a value, so their value is skipped rather than opened a second time as a tab. - **A text editor, in a tab.** Open any file with F7, the results menu's Edit row, or a double-click on the prompt script. It is AvalonEdit, vendored as source into `third_party/AvalonEdit` and compiled into the exe, so KillerShell is still one portable file with no runtime to install - it costs about 640 KB. Syntax highlighting, line numbers, undo, Ctrl+F find, Ctrl+G go to line, Ctrl+S save, and a right-click menu (AvalonEdit ships with none at all). Word wrap is on by default. The whole vendored tree was audited to zero compiler warnings on the way in, without suppressing any. - **A blank document from the rail.** The pencil above the terminal button opens an untitled document in a new tab in the focused pane, for the note or the throwaway script that has nowhere to live yet. Nothing is written to disk until you save it - the first Ctrl+S is the one that asks where, and naming it is also what gives it highlighting, so a scratch buffer saved as `.ps1` comes back colored. It follows the same BOM rule as any other new file, so a script Windows PowerShell has to read gets one and a `.txt` does not. - **Encoding is preserved, never invented.** A file is read by inspecting its bytes rather than through AvalonEdit's own loader, which hands back a UTF-8 encoding that *writes* a BOM - so a plain `.txt` or `.bat` would have silently grown three bytes at the front the first time it was saved. A BOM present is kept, a BOM absent stays absent, and bytes that are not valid UTF-8 fall back to the system ANSI codepage instead of being replaced with U+FFFD. The document bar shows the encoding and the line ending, because a script PowerShell 5.1 will read depends on both and neither is visible in the text. - **Edit your PowerShell `$PROFILE`** from the rail menu, a shell's right-click menu, or Ctrl+comma. The submenu lists the hosts actually installed, because PowerShell 7 and Windows PowerShell do not share a profile and editing the wrong one is most of the "why is my profile not loading" in the world. The path is obtained by asking the shell binary for `$PROFILE.CurrentUserCurrentHost` rather than assuming `Documents\PowerShell\` - on a machine where OneDrive has redirected Documents, which on a managed fleet is most of them, the assumed path is a file the shell will never load. A missing profile is created. - **Syntax highlighting for the formats a field tech actually opens**: `.bat`/`.cmd`, `.reg`, `.ini`/`.conf`/`.cfg`/`.inf`, `.yml`/`.yaml`, `.log` and `.csv`/`.tsv`. AvalonEdit ships none of these, so they are hand-written and embedded. The registry one colors a key deletion and a value deletion in the danger color, since both are one character away from the line that merely sets something. The log one lights severity words, timestamps, GUIDs, error codes and paths, and leaves everything else as body text on purpose. - **Three toolbars, one per kind of tab.** A folder tab keeps the location row; a shell tab gets its own bar with the live working directory (tracked from OSC 7, click it to open that folder as a tab) plus new shell, elevate, open folder here, clear and fonts; a document tab gets save, undo, redo, find, go to line, wrap, a settings flyout, the full path and the encoding readouts. The location row is hidden on the latter two, where back, forward, up, the star and the sort and view buttons all act on a listing that is not on screen. - **Editor settings** behind the gear: line numbers, highlight current line, show spaces and tabs, spaces vs tabs, and indent width. All app-wide and applied to every open document at once, because they describe how you read code rather than what one file is. - **An editor font slot** in the Fonts dialog beside the app and terminal ones, filtered to fixed-width faces, with its own size slider. Ctrl+wheel over a document moves the same value. - **The prompt renders on a machine with no Nerd Font.** No monospaced font Windows ships has the powerline separators or the git branch mark, and Consolas does not even have the prompt's chevron, so on a fresh machine the shipped prompt was a row of boxes. The exe now carries `Fonts/KillerGlyphs.ttf` - **26 glyphs, 2,928 bytes** - and the terminal draws a cell from it only when the font the user actually chose has no glyph for that codepoint. Their font choice is untouched; it just stops being able to fail on those glyphs. The fallback glyph is stretched to the chosen face's cell width, because a powerline separator is a solid triangle that has to butt against the next cell and the two faces have different advances. It also covers `↑` and `↓`, which the prompt draws for git ahead/behind and which ProFont IIx is missing. Bundling a whole Nerd Font would have cost 2.6 MB, 99% of it icons no prompt draws. KillerGlyphs is a subset of Terminess Nerd Font (SIL OFL 1.1, renamed as the license requires of a modified version) - see `Fonts/KillerGlyphs-NOTICE.txt`. - **File operations.** Cut, copy, paste, rename, delete and new folder, from the keyboard, the context menu or a drag. Copy and move run off the UI thread with a themed progress card showing the current file and a real byte count, and a collision stops to ask - showing both files' size and date - with Replace, Skip or Keep both, and a "do the same for the rest" checkbox. The worker genuinely waits on that answer, so nothing is copied while the question is on screen. A move within one volume is a rename, so it is instant at any size; across volumes it copies then deletes, and only once the copy has landed. Delete sends to the Recycle Bin and Shift+Delete destroys, which is the one that asks first. Recycling is the single call that goes to the shell, because there is no other way into the Recycle Bin - and it is also what puts the operation on Explorer's undo stack, so Ctrl+Z there brings the files back. - **Drag and drop both ways.** Dragging out of KillerShell now offers move as well as copy, so a Shift-drag into Explorer moves instead of silently copying. Dropping onto a browsed folder does real file work with Explorer's modifier rules: Shift moves, Ctrl copies, and neither means move within a drive and copy across drives. Files already in the target folder are ignored rather than prompting about a collision with themselves, and a folder cannot be dropped into its own child. On a search tab a drop still sets the scope or pipes the files, since there is no folder to drop into. - **A visual keyboard on the shortcuts card.** F1 now opens on a LIST / KEYBOARD toggle, remembered between sessions. The keyboard draws a full board with every bound key lit in its category color, the action printed on the cap, and a caption that scrolls when it does not fit; hovering prints "CATEGORY :: action" underneath. Layer buttons switch between the base, Ctrl, Ctrl+Shift, Shift and Alt maps, and holding a real modifier previews that layer, so a chord can be found by pressing Ctrl rather than by reading. The list view is grouped under colored headings in two columns instead of one twenty-row wall. Both views are generated from one table, so a new binding shows up in both rather than being hand-copied into the card. - **Explorer's keyboard conventions.** Alt+Left and Alt+Right go back and forward, Alt+Up goes up a folder, and Backspace goes back - none of which had a binding before, so Back and Forward were reachable only by clicking. F4 joins Ctrl+L for the address bar, Ctrl+A selects every result, F2 renames, Delete recycles, Shift+Delete destroys, Ctrl+Shift+N makes a folder, and Ctrl+X / C / V move files around. - **F12 opens the About card**, matching KillerPDF. It was previously reachable only by clicking the version in the footer, which nobody finds by accident. - **A "?" on the rail** above the globe, where KillerNotes and KillerScan put theirs. - **Browse mode.** A tab opens at Home and lists what is there; double-click enters a folder or opens a file. Browsed entries land in the same collection as search results, so every view, sort, filter and command works on them unchanged. Listing runs off the UI thread. - **Folder tree** down the left, rooted at This PC, open by default. Children load on expand, the tree follows wherever you navigate, and its width is draggable and remembered. - **Address bar** with Back, Forward and Up, tracked per tab. Click it, Ctrl+L or Alt+D to type a path; Ctrl+O still opens the folder picker. - **Favorites** drawer under the tree. Rail star or Ctrl+B to open, Alt+1 to Alt+0 to jump to the first ten, drop a folder on it to save it. - **Three view modes**: list (expandable cards), icons (32px to 256px tiles) and details (sortable, resizable columns). Icons run on a virtualizing wrap panel, so a 100,000-hit search in tiles stays usable. Details columns resize by dragging any divider, on the rule Explorer uses: the divider sizes the column to its left and nothing else, and the columns to its right keep their widths and slide over. Double-click a divider to put its column back to the width it shipped with. Every column carries its own width with a filler after the last one taking the slack, so a drag can never move a column you were not pointing at. Widths are remembered between sessions, clamped so the last column can never be pushed off the edge, and the header and the rows read one shared set of them - so both panes stay in step and no row can drift out of line with its own heading. - **The real Windows context menu**, under "More Windows options...", plus Properties. Shell extensions, Send To and the full Open With list all included, drawn as the native Win32 menu. - **New context-menu commands**: copy the full path, file name, folder path, matched lines, the file itself or a SHA-256; open as administrator; search inside this folder; exclude this folder. All act on the whole selection. - **Marquee selection and drag out.** Drag from an item to drop those files into Explorer or a mail client; drag from empty space to rubber-band a selection. - **Show hidden items** and **keep folders above files** toolbar toggles, both remembered. - **Czech and Japanese**, taking the UI to ten languages. - **Install for all users** checkbox on the install prompt, putting KillerShell in Program Files with a Start Menu and Add/Remove Programs entry for every account. It routes through the same machine-wide `/silent` install winget, choco and RMMs already use, so UAC appears only when the box is ticked. Installing this way removes an existing per-user copy, so there is only ever one install and one uninstall entry, and your theme, accent, language and tabs are kept. Pre-ticked and locked if KillerShell is already installed machine-wide. - WinGet submission workflow (`.github/workflows/winget-release.yml`): publishing a GitHub release submits the new version to winget-pkgs via komac, the same way KillerScan does it. The first submission still has to be made by hand with `komac new`. - **Release date in the About card**, muted and italic beside the version, so a build's age is visible. It comes from a new `` field in the csproj, baked into the assembly as metadata so it survives being copied around, and `release.ps1` fails the release if it does not match this version's CHANGELOG date. Older builds without the field just show the version. - The signer's alias under the publisher in the About card: `AKA "Steve the Killer"`, shown only when the exe is signed by Stephen Riley. Unsigned builds and forks signed by anyone else do not get the line. - `--demo` also renders the About card in its signed state (publisher, thumbprint, alias), so marketing captures taken from an unsigned local build match the released one. The values are the real certificate's, not invented. - **App-wide accessibility zoom**: roll the wheel over the title-bar wordmark to resize the whole app, about 2% per notch between 70% and 250%, remembered across restarts. It is a `LayoutTransform`, so text reflows and re-rasterizes crisply rather than being bitmap-stretched, and the title bar and footer stay put so the wordmark never moves under the pointer. The wordmark also drags the window and double-clicks to maximize; its old link to killershell.net moved to the About card. - **F1 opens a shortcuts card** listing every gesture in one place, translated into all ten languages. The pattern cheat-sheet is still one click away on its own button. Ctrl+Right and Ctrl+Left expand and collapse every result (skipped inside a text box so Ctrl+arrow keeps its word-jump meaning), Ctrl+Shift+F pipes the results into a new tab, Ctrl+Shift+L clears them, and Ctrl+Shift+C toggles case-sensitive matching. ### Changed - **The results pane is its own control now** (`FilePane`). It was six hundred lines inside MainWindow.xaml, which was fine while there was one of it; the dual-pane split needs two, and two copies of a six-hundred-line pane drift apart the way the two panel-slide animations did before they were shared. The markup moved out untouched and every named control is reached through one `Pane` property, so a second pane is a layout change rather than another sweep through every file. - F5 is Refresh rather than Run search, which is what it means everywhere else in Windows. It refreshes whatever the tab is showing: a browsed folder re-lists off disk, a search tab re-runs. Enter still runs a search, so nothing was taken away. - Ctrl+E puts the caret in the search box, as it does in Explorer. Export moved to F9 for HTML and Shift+F9 for CSV, because F8 went to the shell - a primary feature deserved the key you can reach without looking, and export is not something you press twenty times an hour. Adding a filter moved from Ctrl+Shift+N to Shift+F7, because New Folder wanted its Explorer chord back and bare F7 belongs to the editor. - The status bar's indicator is a real traffic light. It was green for "fine" only in the comment describing it; the code used the accent brush, so "fine" rendered as whatever accent you had picked and the dot carried no information unless something had gone wrong. There is a proper `OkBrush` in all six themes now. - The funnel is hidden while browsing. Over a folder listing it reads as "filter these rows" and then surprises you with a new tab; over search results, which is what it was built for, it reads correctly. - "as found" disappears from the sort list while browsing. It is the engine's discovery order, which only exists because a search streams hits in as it walks - a folder is enumerated in one pass, so there is nothing to show and name takes over. - The search panel moved to the right edge and starts closed; the left is the folder tree's now. The rail chevron or Ctrl+Shift+S opens it, and the choice is remembered. - Browsed folders track the disk. The active tab is watched, so a file deleted in another window disappears here too. Events are debounced, and a burst past 200 paths relists instead of patching entry by entry. - Details view hides the location column while browsing, where it repeats the same folder on every row. Search results keep it. - **A new tab always opens in the pane you are looking at.** A shell used to open in the *other* pane, and open the second pane if there was not one, so F8 did a different thing depending on where the focus happened to be and could rearrange the window on you. Shells, documents and folder tabs all land in the focused pane now. If you want a shell beside a folder, F11 and put it there - predictable beats tidy. - **The tab strip stops shredding titles.** Tabs shared the bar equally however many were open, so eight in a half-width pane came out around forty pixels each - `~\D_ x`, which is not a label, it is a shape. The count is capped instead of the width now: as many tabs as fit at a readable floor stay in the strip, and a chevron at the right end lists every tab, hidden ones included, to jump straight to one. The visible run always includes the tab you are on, and each pane windows its own strip, since the two are different widths. - Ctrl+wheel resizes the icons in list and details view too, not only the tile grid. Rows step a shorter ladder than tiles - 16px to 64px against 32px to 256px - because a row is a line of text with a marker beside it, and past 64 the icon is setting the row height rather than telling you anything. Both row views share one size, remembered separately from the tile size, and the icon is refetched at each step rather than being a stretched 32px one. - The About card now matches KillerScan, KillerNotes and KillerPDF: the family's matte pane brush, field spacing and type sizes, EXE SHA-256 as the hash label in every language, a wrapping thumbprint and no duplicate copyright footer. The tagline reads "Fast file search for Windows. Names, contents, wildcards and filters, with no index. A GPLv3 Killer Tools utility.", with Killer Tools linking to killertools.net and GPLv3 and the product name composed in the layout rather than baked into each translation. The card's width now comes from the SHA-256 line instead of a fixed 468px, so a long tagline wraps rather than widening it. - `release.ps1` brought up to the family standard. It was build / sign / hash / print; it now runs a preflight (default branch, clean tree, in sync with origin, tag free locally and remotely, CHANGELOG section dated), scans for vulnerable packages, checks the built FileVersion against the csproj, tries three timestamp authorities and gates on `signtool verify /pa`, rewrites the `find-landing` hero block, the verEgg footers and the README source-zip link, then tags and publishes the release with the exe, source zip and SHA256SUMS.txt. `-DryRun` skips the pushes and leaves the working tree untouched. ### Fixed - **F7 never opened the editor.** Two branches of the same keyboard chain both claimed the key, and the one that came first - add a filter - had no modifier guard, so it swallowed every F7 and the editor's branch below it was unreachable code. Pressing F7 added a filter row while the shortcuts card, the results menu's gesture hint, the README and the how-to page all said it opened the file. The editor has the bare key now and adding a filter moved to Shift+F7, which is the pattern the shell and export keys already use. - The focus ring came out uneven around the active tab. The ring is four elements - the pane's border, the line across the tab band, the tab's own outline and the band's two verticals - and on a first or last tab the outer side was drawn twice, by the band and by the tab. Two 1px borders at the same x is a 2px edge on a ring that is 1px everywhere else, and only sometimes: whether the tab's own outer border cleared the strip's clip depended on how the bar divided a fractional width, so it changed as you moved the split. The tab drops the side the band already owns, and the ring is 1px all the way round. - The details column headings hung around over shell and document tabs. Whether that band showed was decided by the view mode alone, which knows nothing about what kind of tab is on screen, so switching to a terminal or an open file while in details view left a row of name / location / size / modified sort buttons floating on top of it, sorting a listing that was not there. - "Keep folders above files" did nothing. Listings enumerated folders and then files, so the default "as found" order was already grouped and turning the toggle off changed nothing visible. One interleaved pass now, with the grouping left to the view. - File-type icons were slightly soft, and visibly blurry once the app-wide zoom was turned up. `IconCache` asked the shell for the SMALL icon (16px) while the row draws it at 18px, so it was stretched even at 100%. It fetches the 32px icon now. - The separator in the title-bar system menu drew as Windows' stock bright gray 3D line instead of the themed hairline. Inside a menu WPF resolves `MenuItem.SeparatorStyleKey` rather than the app's implicit `Separator` style, and that key was never registered, so every themed menu separator fell back to Aero. Registered now, as it already is in KillerScan and KillerNotes. - The README had no GPL3 corresponding-source link. `release.ps1` rewrites that link on every release, but there was nothing for its pattern to match, so the step reported success while doing nothing and the published binary shipped with no link to its source. The Download section carries it now. - Spanish, French and Turkish were missing every accented character, having been authored as pure ASCII ("busqueda", "Demarrer", "kullanici"). All three have been rewritten with proper text. - `+ add group` was never translated: the key existed in `en-US.xaml` and in no other locale file, so every non-English user saw the English label. All locales sit at full key parity now. - The in-app updater silently did nothing on a machine-wide install. Program Files is not writable by a normal user, and the update helper ran unelevated with no errorlevel check, so the copy failed and it relaunched the *old* exe with no error shown. It now checks the copy, elevates when the target needs it (one UAC prompt), opens the releases page on a genuine failure, and relaunches via Explorer so the app returns at normal integrity rather than continuing as administrator. - A search that matched a lot of files made the window unresponsive. The engine drained its whole result queue into one dispatcher callback every 150ms, and a callback cannot be interrupted once it has started, so a broad term became one uninterruptible block of work with no slot for input. Batches are capped at 250 now, with a backlog drained by posting slices back to back, so throughput is the same and only the length of any one callback is bounded. - The app-size readout parked itself on the status bar at any scale other than 100%, and repainted on every launch. It is transient now: each wheel notch shows the percentage and restarts a five second timer. A scale restored at startup applies silently, and rolling back to exactly 100% clears it at once. - Sorting could stall the window on a search that returned a lot of hits. The sort lived on the collection view, so every arriving result was a binary search plus an insert into the middle of the list, and tens of thousands of them worked out to roughly a billion element moves on the UI thread. The sort is suspended for the length of a run and applied once at the end; results stream in discovery order while the search is live, and changing the sort mid-run reorders on completion. --- ## Previously released as KillerFind KillerShell 1.0.0 is the release that would have been KillerFind 2.0.0; its changes are listed above. Everything below shipped under the old name and is kept for provenance - the GPLv3 corresponding source for each of these is still on the [KillerFind releases page](https://github.com/SteveTheKiller/KillerFind/releases). ## KillerFind 1.0.0 - 2026-07-04 ### Added - Tabs: each tab is a full independent search (folder, terms, filters, results); drag to reorder, optionally remembered across restarts. - Filters: extension / date modified / size rows, AND-ed with the search terms. - Search within results: pipe one search's results into a new tab and drill deeper (funnel button or tab right-click). - Ctrl+F quick filter over results, plus in-app sorting by name / location / size / modified. - CSV export alongside the HTML report; the report gained the six-theme + accent switcher and sortable columns. - Explorer-style folder picker: quick places, list / icons / details views, sortable columns, remembers size and placement. - Per-user installer with PORTABLE badge, plus `/silent` (machine-wide) and `/uninstall`. - Smart Esc: closes popups, stops a running search, then offers to quit (choice can be remembered). - Pattern cheat-sheet card; plain-text patterns now just work (`log` matches `*log*`). - UI in 8 languages (en, es, de, fr, tr, zh-CN, zh-TW, bn). - `--demo` mode with fabricated results for screenshots. You think I'm gonna let you see my **real** files? ### Changed - Reskin to the shared KillerUI "Grunge" theme: custom chrome, multi-theme switcher with Dark/Blue default, film grain, typewriter wordmark, and a UI refresh throughout (real file icons, collapsed-by-default results, themed dialogs and menus). - Multicore search engine: the scan parallelizes across cores with precompiled patterns; the window stays responsive mid-search. - Searching with no folder selected opens the folder picker instead of an error. ### Fixed - Name terms without wildcards now match as contains instead of silently matching nothing. ## KillerFind 0.1.1 - 2026-05-04 ### Added - Code signing on the release binary (Certum). - `find-landing` marketing site. ## KillerFind 0.1.0 - 2026-04-26 ### Added - Initial release. Fast file search for Windows with no indexing: - Filename search with wildcard patterns (`*.log`, `report_*.xlsx`). - Content search that streams files line by line without loading them into RAM, skipping likely-binary files (null byte in the first 4 KB). - Multiple search terms in a single pass, each independently tracked. - Include / exclude filters with semicolon-separated patterns (`*.txt;*.log`, `bin;obj;*.min.js`). - Case-sensitive toggle. - Real-time streaming results (batched every ~150ms) with matched line numbers; click a result to open the file or reveal it in Explorer. - HTML export of results. - Dark terminal-style UI, single portable exe, no installer. - Targets .NET Framework 4.8 (x64). GPL-3.0 licensed. [1.0.0]: https://github.com/SteveTheKiller/KillerFind/compare/v0.1.1...v1.0.0 [0.1.1]: https://github.com/SteveTheKiller/KillerFind/compare/v0.1.0...v0.1.1 [0.1.0]: https://github.com/SteveTheKiller/KillerFind/releases/tag/v0.1.0