Skip to content

Repository files navigation

Cascade

A log analyzer for files that don't fit in memory, with filters that nest.

A from-scratch reimagining of TextAnalysisTool.NET for Windows.

CI

Download · Filters · Reading the log · Fields · Files · Settings · Keyboard

The main window: a two-million-line log coloured by a nested filter set, with the match map beside it and the presets pane on the right


Filters

What a filter is

The filter editor: match type, pattern, options, colours and the three style flags

  • Matches a substring, a .NET regular expression, or marked by marker 1–8.
  • A line is shown when an enabled include matches it and no enabled exclude does.
  • Colour, background, bold, italic and underline are each on, off, or inherited.

Nesting

Alt+Right nests inventory-svc under warnings, and its count falls from 330,152 to 20,666

  • A child narrows its parent: [ERROR]payment-svc means errors, in payments only.
  • A child matches a line only if every one of its ancestors matches it too — whether or not those ancestors are switched on.
  • So switching a parent off does not stop it narrowing its children: you can scope a branch without showing everything the parent matches.
  • A line takes its colour from the first filter in the list that matched it, refined by whichever of that filter's own descendants matched too — never by a filter in a branch further down, however deeply nested.
  • Whatever the winning filter leaves unset it inherits from the filters above it, so a filter with no colour of its own draws the line in the view's default colours.
  • Nest with Alt+→, or by dragging.

The filter list

The filter list: nesting, checkboxes, live counts, and an excluding filter at the foot

  • Count is how many lines in the whole file match, not how many are on screen.
  • Shift+Space switches a filter's whole subtree on or off.
  • The list docks to any edge of the window, or hides altogether (Ctrl+Shift+L).

From the log to a filter

Dragging over an order number inside a line, then Ctrl+N: the Add Filter dialog opens seeded with it, and the new filter arrives already coloured

  • Ctrl+N turns the text you have selected inside a line — or the whole line under the caret — into a filter.

Colour

The paint chips palette: every unused colour pair, each cell drawn as a matching line would look

  • I'm feeling lucky picks a legible colour pair that no other filter is using; Paint chips… shows the rest of the palette.
  • A filter with no colour of its own leaves no mark on the match map.

Working on many at once

Five filters selected across two branches, the header saying so

  • Select several filters and enable, disable, delete, duplicate, reorder, nest or recolour them in one go.
  • Dragging carries the whole selection, nesting and all.
  • Ctrl+Z undoes filter edits, drags included.

Restyling three filters at once: the colour they agree on offered back, 'varies' where they don't

Finding a filter among hundreds

Searching the filter list for 'payment': matches keep their colour, everything else is dimmed but stays where it was

  • Ctrl+E searches the list without hiding or reordering it — non-matching filters dim rather than disappear.
  • F4 / Shift+F4 walk the log through the selected filter's matches, without changing which filters are on.

Presets

The presets pane: one preset ticked and a different one highlighted

  • A preset names a combination of filters — the payment incident, the slow queries.
  • The tick applies a preset; the highlight only says which one the commands act on.
  • Ticking two gives you both, and ticking one moves only its own filters — anything you switched on by hand stays as you left it.

Dim or hide

Ctrl+H switching between dimming the lines that didn't match and hiding them

  • Ctrl+H switches between dimming the lines that didn't match and hiding them altogether.
  • Line numbers are always the file's own, either way.

Reading the log

Find

The find bar above the log, every occurrence marked and the tally reading 'Match 1 of 8,688'

  • Ctrl+F searches the text, literal or regex, marking every occurrence on screen as you type.
  • Find works on every line, not just the shown ones: hits on hidden lines are counted separately, and it says so when a match lands on one.

The match map

The match map beside the log: the whole file at a pixel a line, markers down the left edge, find hits down the right

  • The scrollbar is replaced by the whole file at a pixel a line, in the colours the filters gave it.
  • Unmatched stretches are compressed, so one error among ten thousand ordinary lines still gets a pixel of its own.

Markers

Ctrl+1, Ctrl+2 and Ctrl+3 marking three lines, then 1, 2 and 3 walking back to them

  • Eight colours for marking lines by hand: Ctrl+1Ctrl+8 on the selection.
  • The bare number keys 18 then walk between the lines you marked, Shift to go backwards.
  • Marked by marker N is a filter type, so lines you picked out by hand can be treated as a category.

What matched this line

The tooltip over a line, naming three filters that matched it, one of them switched off

  • Hovering a line names every filter that matched it — including the ones that are switched off.

Getting lines out

  • File ▸ Save Current Lines… writes out exactly what the filters are showing.
  • Edit ▸ Copy with Line Numbers copies the file's own line numbers along with the text.

Fields

Long lines are either wrapped (Alt+Z) or split into fields you can hide and reorder.

Splitting a line

The log laid out as columns under a draggable header

  • Ctrl+Shift+C splits every line into fields for display, guessing a template from the line under the caret.
  • Filtering and searching always run on the whole raw line, so this can shorten a line but never hide one.
  • A line the template does not match is left whole and untouched.

The template

A template is a picture of your line: write one out, replace what changes with *, and wrap each field in { }.

your line:  [2026-08-05T05:00:02][BthPort][INFO] WDF PnP state: started
template:   {[*]}{[*]}{[*]} {*}
* the text that changes — matches as little as it can, up to whatever you wrote next
{ } one field: the unit that gets hidden or moved, punctuation and all
anything else has to be there, except a run of spaces, which matches any run of spaces
\ makes { } * \ ordinary
  • Punctuation goes with the field, so hiding the middle of [a][b][c] leaves [a][c] rather than [a][][c].

Columns and Inline

Hiding a field, then Ctrl+Shift+X switching between the two layouts

  • Columns lays the fields out as a table: drag a header to reorder, double-click it to rename, right-click for the list of which fields are shown.

The same log laid out inline, with a chip strip above it and two fields put away

  • Inline keeps every row a line and leaves out what you hid — better when one field dwarfs the rest.
  • A strip of chips stands in for the header: click one to put a field away or bring it back, drag it to move the field along the row.

Field settings

The field settings dialog: the template, a coloured band per field over a real line, and the row as it will be drawn beneath

  • Ctrl+Shift+D tries the template against real lines from the file: how many of them match, and where a line that doesn't stopped matching.
  • Detect writes the template for you when the line begins with bracketed groups: [ ], ( ) or < >.

Files

Opening

  • Drop a log on the window, hand it to Cascade.exe on the command line, or use Open from Clipboard for one you have pasted from somewhere else.
  • F5 re-reads the file, for when you have just re-run whatever produced it.
  • Dropping a .cascade or .tat file loads its filters instead of opening it as a log.
  • The file is memory-mapped and indexed as it streams, four bytes a line: a 1 GB, 10-million-line log is on screen in milliseconds and fully indexed in under half a second.

Encodings

The Encoding menu, with Auto-detect naming what it found and a tick on the encoding in effect

  • A byte-order mark is honoured; without one, UTF-8 is assumed.
  • View ▸ Encoding reads the file again as UTF-16 or UTF-32 (either endianness), Windows-1252 or the system code page.

Filter files

  • .cascade is JSON — the filter tree with its styles, the presets, and the field template — so a filter set diffs well in source control.
  • Ctrl+S saves the set you have; File ▸ Append Filters… merges another set into it.
  • TextAnalysisTool.NET .tat files are imported, flattened to top-level filters. Saving is always .cascade.

Settings

Preferences

The Preferences dialog

  • File ▸ Settings ▸ Export / Import moves your preferences to another machine.

Where things live

  • Preferences in %APPDATA%\Cascade\settings.json, machine-local state in state.json, and nothing at all in the registry. CASCADE_SETTINGS_DIR moves the folder.

Command line

Cascade.exe [file] [/Filters:<path>]
  • /Filters: also stops the last-used filter file being loaded automatically.
  • CASCADE_UPDATE=off turns off the update check.

Install

Download Cascade.exe and run it — a single file, no installer.

curl.exe -fL --remove-on-error -o Cascade.exe https://github.com/rahul-ramadas/Cascade/releases/latest/download/Cascade.exe
  • Needs Windows and the .NET 10 Desktop Runtime. It updates itself.
  • Draws with GDI rather than a GPU, so it stays quick over a remote desktop.

Keyboard reference

Log view

Key Action
PgUp PgDn Move the caret (Shift extends the selection)
Ctrl+Home / Ctrl+End First / last line
Ctrl+↑ / Ctrl+↓ Scroll a line without moving the caret
/ Home End Scroll sideways / to the far left and right
Drag, double-click, triple-click Select part of a line, a word, the whole line
Ctrl+A / Ctrl+C Select all / copy
18 / Shift+18 Next / previous line with that marker
Ctrl+1Ctrl+8 Toggle that marker on the selection
Ctrl+wheel Zoom

Filter list

Key Action
Space / Shift+Space Enable or disable the selection / their subtrees
Enter / Delete / Ctrl+D Edit / remove / duplicate the selection
Shift+↑ ↓ / Ctrl+↑ ↓ / Ctrl+Space / Ctrl+A Extend, move through, add to, or take the whole selection
Alt+↑ ↓ ← → Move, nest and un-nest
F4 / Shift+F4 Next / previous line matching the current filter
Ctrl+E, then Enter / Shift+Enter / F3 Search the list and walk the matches
Double-click a filter / the empty space below Edit it / add a new one

Global

Key Action
Ctrl+O / F5 / Ctrl+S Open / reload / save filters
Ctrl+Z / Ctrl+Y Undo / redo a filter edit
Ctrl+F / F3 / Shift+F3 Find / next / previous
Ctrl+G / Ctrl+H Go to line / show only filtered lines
Ctrl+N New filter from the selection or the current line
Ctrl+E Search the filter list
Ctrl+M / Alt+Z / Ctrl+Shift+C Match map or plain scrollbar / word wrap / split lines into fields
Ctrl+Shift+X / Ctrl+Shift+D Switch field layout / field settings
Ctrl+Shift+P / Ctrl+Shift+L Show or hide the presets pane / the filter list
Ctrl+Shift+T / Ctrl+Shift+F Focus the log view / the filter list
Ctrl+Shift+↑ ↓ ← → Dock the filter list
Ctrl++ / Ctrl+- / Ctrl+0 Zoom in / out / reset
Tab Move between the log and the filter list
Esc Stop a search, then close the bar and clear its marks

Building

dotnet build Cascade.slnx -c Release
dotnet test tests/Cascade.Core.Tests/Cascade.Core.Tests.csproj   # engine tests
./scripts/Run-UiTests.ps1 -Publish                               # UI automation, off-screen
./scripts/Build-DocImages.ps1                                    # every picture above, from the app
  • .NET 10 SDK. src/Cascade.Core is the UI-agnostic engine — indexing, filtering, find, markers, columns, persistence — and src/Cascade.App is the WinForms GUI.

License

MIT © 2026 Rahul Ramadas.

About

A fast Windows log and text analyzer for multi-gigabyte files, with hierarchical filters. An enhanced reimagining of TextAnalysisTool.NET.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages