{"id":46209760,"url":"https://github.com/willibrandon/dotsider","last_synced_at":"2026-04-05T01:02:55.511Z","repository":{"id":341654282,"uuid":"1170895355","full_name":"willibrandon/dotsider","owner":"willibrandon","description":"A TUI for analyzing .NET assemblies","archived":false,"fork":false,"pushed_at":"2026-03-31T02:30:50.000Z","size":21811,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-31T04:38:47.977Z","etag":null,"topics":["assembly","dotnet","il-disassembler","nuget","tui"],"latest_commit_sha":null,"homepage":"https://dotsider.dev","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/willibrandon.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-02T16:38:25.000Z","updated_at":"2026-03-31T02:20:41.000Z","dependencies_parsed_at":"2026-03-09T13:01:53.882Z","dependency_job_id":null,"html_url":"https://github.com/willibrandon/dotsider","commit_stats":null,"previous_names":["willibrandon/dotsider"],"tags_count":25,"template":false,"template_full_name":null,"purl":"pkg:github/willibrandon/dotsider","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willibrandon%2Fdotsider","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willibrandon%2Fdotsider/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willibrandon%2Fdotsider/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willibrandon%2Fdotsider/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/willibrandon","download_url":"https://codeload.github.com/willibrandon/dotsider/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willibrandon%2Fdotsider/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31418289,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T20:09:54.854Z","status":"ssl_error","status_checked_at":"2026-04-04T20:09:44.350Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["assembly","dotnet","il-disassembler","nuget","tui"],"created_at":"2026-03-03T09:01:58.316Z","updated_at":"2026-04-05T01:02:55.426Z","avatar_url":"https://github.com/willibrandon.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Dotsider\n\nA TUI for analyzing .NET assemblies — structure, metadata, IL, strings, dependencies, and more. Inspired by [binsider](https://github.com/orhun/binsider) for ELF binaries, built for the .NET ecosystem.\n\n```\ndotsider HelloWorld.dll\n```\n\n## Installation\n\n### dotnet tool (recommended)\n\n```\ndotnet tool install -g dotsider\n```\n\n### Homebrew (macOS / Linux)\n\n```\nbrew install willibrandon/tap/dotsider\n```\n\n### WinGet (Windows)\n\n```\nwinget install willibrandon.dotsider\n```\n\n### Scoop (Windows)\n\n```\nscoop bucket add dotsider https://github.com/willibrandon/scoop-bucket\nscoop install dotsider\n```\n\n### Download binary\n\nGrab a standalone binary from [Releases](https://github.com/willibrandon/dotsider/releases).\n\n## What it does\n\ndotsider opens any .NET DLL or EXE and lets you explore it across 8 tabs. If you open an apphost `.exe` that has no .NET metadata, dotsider detects the missing metadata and offers to open the companion managed `.dll` instead.\n\n| Tab | What you see |\n|-----|-------------|\n| **1 General** | Assembly identity, target framework, architecture, dependency table. Press Enter on a reference to drill into it. |\n| **2 PE/Metadata** | COFF headers, CLR header, sections, TypeDefs, MethodDefs, AssemblyRefs, custom attributes, resources. Press `g` on a TypeDef or MethodDef to jump to its IL. |\n| **3 IL Inspector** | Namespace/Type/Method tree with IL disassembly. Select a method, read its bytecode. Press `x` to jump to the method body in the hex dump. |\n| **4 Strings** | User strings, metadata strings, and raw binary string scan with configurable minimum length. |\n| **5 Hex Dump** | Hex editor with vi-style modal editing (read-only by default), byte category coloring, data interpretation panel, jump-to-offset, and vim navigation. |\n| **6 Dep Graph** | Visual dependency graph — your assembly at the root, references as nodes, edge weights by TypeRef count. Press Enter on a node to open that assembly. |\n| **7 Size Map** | Treemap of code size — Assembly \u003e Namespace \u003e Type \u003e Method, sized by IL byte count. Click to drill in; Enter on a method leaf jumps to its IL. |\n| **8 Dynamic** | Launch the assembly and trace it live via EventPipe — GC events, JIT compilations, exceptions, performance counters, stdout. Press Enter on a JIT event to jump to that method's IL. |\n\n### Additional modes\n\n```\ndotsider diff v1.dll v2.dll     # side-by-side assembly comparison\ndotsider package.nupkg          # browse NuGet package contents, inspect any DLL inside\n```\n\n## Building\n\nRequires [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0).\n\n```\ndotnet build\n```\n\nThe binary lands at `src/Dotsider/bin/Debug/net10.0/dotsider`.\n\n## Usage\n\n```\ndotsider \u003cassembly.dll|.exe\u003e    # TUI mode — interactive assembly explorer\ndotsider \u003cpackage.nupkg\u003e        # TUI mode — browse NuGet package contents\ndotsider diff \u003cleft\u003e \u003cright\u003e    # TUI mode — side-by-side assembly comparison\n\ndotsider analyze \u003cfile\u003e [opts]  # CLI mode — headless analysis to stdout or file\ndotsider sessions \u003ccommand\u003e     # CLI mode — interact with running dotsider instances\ndotsider agent init [opts]      # CLI mode — generate AI skill file for a provider\ndotsider agent mcp              # CLI mode — launch the dotsider MCP server\n\nTUI options:\n  -t, --tab \u003c1-8\u003e               start on a specific tab\n  -n, --min-len \u003cn\u003e             minimum raw string length (default: 4)\n  -v, --version                 show version\n  -h, --help                    show help\n```\n\n### CLI: `dotsider analyze`\n\nRun analysis without the TUI — pipe to other tools, write to files, or output JSON for scripting.\n\n```\ndotsider analyze MyLib.dll                      # assembly info (default)\ndotsider analyze MyLib.dll --types              # list type definitions\ndotsider analyze MyLib.dll --methods            # list method definitions\ndotsider analyze MyLib.dll --il Type.Method     # disassemble a method\ndotsider analyze MyLib.dll --deps               # assembly references\ndotsider analyze MyLib.dll --strings            # extract strings\ndotsider analyze MyLib.dll --size               # size breakdown\ndotsider analyze MyLib.dll --json               # any of the above as JSON\ndotsider analyze MyLib.dll --types -o out.txt   # write to file\ndotsider analyze MyApp.exe                      # apphost .exe → auto-redirects to MyApp.dll\n```\n\n### CLI: `dotsider sessions`\n\nInteract with running dotsider TUI instances. Each instance exposes a Unix domain socket for programmatic access.\n\n```\ndotsider sessions list                          # list running instances\ndotsider sessions info \u003cpid\u003e                    # assembly info + current view\ndotsider sessions view \u003cpid\u003e                    # current tab and view state\ndotsider sessions navigate \u003cpid\u003e \u003ctab\u003e          # switch to tab (1-8)\ndotsider sessions capture \u003cpid\u003e                 # capture screen as plain text\ndotsider sessions trace start \u003cpid\u003e             # start tracing the loaded assembly\ndotsider sessions trace events \u003cpid\u003e            # get JIT, GC, exception events\ndotsider sessions trace counters \u003cpid\u003e          # get performance counters\ndotsider sessions trace output \u003cpid\u003e            # get stdout/stderr from traced process\ndotsider sessions trace stop \u003cpid\u003e              # stop the active trace\n```\n\n### CLI: `dotsider agent`\n\nMCP server management and AI skill file generation.\n\n```\ndotsider agent mcp                              # launch the dotsider MCP server\ndotsider agent init --ai claude                 # generate skill file for a provider\ndotsider agent init --path ./SKILL.md           # write to an explicit path\ndotsider agent init --stdout                    # print skill content to stdout\n```\n\nSupported `--ai` providers: claude, gemini, copilot, cursor-agent, opencode, codex, windsurf, kilocode, amp, qwen. Each resolves to the provider's conventional skill path relative to the current directory.\n\n### Keyboard\n\n| Key | Action |\n|-----|--------|\n| `1`-`8` | Switch tabs |\n| `Enter` | Drill into selected item (assembly ref, method, DLL in package) |\n| `Esc` | Go back (assembly stack, breadcrumb, or cross-view jump) |\n| `y` | Yank (copy) — selected text in editors, or focused row in tables |\n| `yy` | Yank entire line under cursor |\n| `V` | Select entire line under cursor |\n| `iw` | Select inner word (vim text object) |\n| `iW` | Select inner WORD (whitespace-delimited — grabs fully-qualified names) |\n| `yiw` / `yiW` | Select + yank word/WORD in one motion |\n| `Tab` | Cycle focus between info panels and tables |\n| `g` | Go to IL Inspector for the focused TypeDef/MethodDef (PE/Metadata tab) |\n| `x` | Jump to method body in Hex Dump (IL Inspector tab, when a method with RVA is selected) |\n| `/` | Search (highlights matches inline) |\n| `n` / `N` | Next / previous search match |\n| `s` | Toggle human-readable sizes |\n| `q` | Quit |\n\nInfo panels (Assembly Info, PE Headers, CLR Header, detail popups, string details) are selectable read-only editors. Click or `Tab` into them, select text with `Shift` + arrow keys, and press `y` to copy. For word-level selection without the mouse, `iw` selects the word under the cursor and `iW` selects the full whitespace-delimited token — `yiw` copies it in one keystroke. `V` selects the entire line and `yy` copies the entire line in one motion.\n\n**Hex Dump tab** uses vi-style modal editing — the editor starts in normal mode (read-only) to prevent accidental writes:\n\n| Key | Mode | Action |\n|-----|------|--------|\n| `i` | Normal | Enter insert mode (enables byte editing) |\n| `Esc` | Insert | Return to normal mode |\n| `h` `j` `k` `l` | Normal | Vim-style cursor movement |\n| `g` | Normal | Jump to hex offset |\n| `e` | Normal | Toggle endianness (LE/BE) |\n| `Ctrl+T` | Any | Toggle text/hex search mode |\n| `Ctrl+S` | Normal | Save edited bytes (only when modified) |\n\nIn insert mode, type two hex digits (0-9, a-f) to overwrite one byte. The first digit sets the high nibble; the second commits the edit. Saving validates the PE image before writing — invalid edits are rejected.\n\nDiff mode adds `f` to cycle filters (All / Added / Removed / Changed). NuGet mode uses `Esc` to return from DLL inspection to the package browser.\n\n## How it works\n\ndotsider reads assemblies using APIs that ship with the .NET runtime itself — no third-party analysis libraries needed:\n\n- **`System.Reflection.Metadata`** provides `MetadataReader` for traversing the metadata tables (types, methods, references, custom attributes, string heaps)\n- **`System.Reflection.PortableExecutable`** provides `PEReader` for the PE structure (COFF header, sections, CLR header, method bodies)\n- **`System.IO.Compression`** handles NuGet packages (which are just ZIP files containing a `.nuspec` manifest and DLLs)\n\nThe dynamic analysis tab uses `Microsoft.Diagnostics.NETCore.Client` to connect to a running .NET process via EventPipe — the same diagnostic infrastructure that powers `dotnet-trace` and `dotnet-counters`. It launches your assembly with a reverse-connect diagnostic port, so events are captured from the very first instruction.\n\nThe TUI is built on [Hex1b](https://github.com/mitchdenny/hex1b), a .NET terminal UI library with a React-inspired declarative API, constraint-based layout, theming, and efficient widget reconciliation.\n\n## MCP server\n\n`dotsider-mcp` is a standalone [Model Context Protocol](https://modelcontextprotocol.io) server that exposes dotsider's analysis engine to AI coding assistants like Claude Code, VS Code Copilot, and others.\n\n### Install\n\n#### dotnet tool (recommended)\n\n```\ndotnet tool install -g Dotsider.Mcp\n```\n\n#### Homebrew (macOS / Linux)\n\n```\nbrew install willibrandon/tap/dotsider-mcp\n```\n\n#### WinGet (Windows)\n\n```\nwinget install willibrandon.dotsider-mcp\n```\n\n#### Scoop (Windows)\n\n```\nscoop install dotsider-mcp\n```\n\n#### Download binary\n\nGrab a standalone binary from [Releases](https://github.com/willibrandon/dotsider/releases).\n\n### Configure\n\nAdd to your MCP client configuration (e.g. `.mcp.json` for Claude Code):\n\n```json\n{\n  \"mcpServers\": {\n    \"dotsider\": {\n      \"command\": \"dotsider-mcp\"\n    }\n  }\n}\n```\n\n### What it provides\n\n**28 tools** across assembly analysis, IL disassembly, metadata inspection, dependency graphs, size analysis, string extraction, diffing, NuGet package analysis, and runtime tracing. Tools work in two modes:\n\n- **Direct mode** — pass an assembly path, get results (no TUI needed)\n- **Session mode** — connect to a running dotsider TUI instance via Unix domain socket for live state, tracing, and navigation\n\n**4 guided prompts** for common workflows: security audit, API surface review, breaking change detection, and dependency health analysis.\n\n## Project structure\n\n```\nsrc/Dotsider.Core/\n  Analysis/           PE reading, metadata extraction, IL disassembly,\n                      diffing, dependency graphs, size analysis, runtime tracing\n  Analysis/Models/    Data types for analysis results\n  Protocol/           Request/response types and JSON options for the UDS protocol\n\nsrc/Dotsider/\n  Commands/           CLI subcommands (analyze, sessions, agent)\n  Diagnostics/        Unix domain socket listener for TUI state access\n  Infrastructure/     Output formatting, session discovery\n  Views/              One file per tab — widget trees built each frame\n  DotsiderApp.cs      Main app shell (tab panel, key bindings, hints bar)\n  DotsiderState.cs    All mutable UI state in one place\n  DiffApp.cs          Diff mode shell\n  NuGetApp.cs         NuGet mode shell\n  Program.cs          CLI entry point and mode routing\n\nsrc/Dotsider.Mcp/\n  Tools/              MCP tool classes (assembly, IL, metadata, deps, size, etc.)\n  Prompts/            Guided analysis prompts (security, API review, breaking changes)\n  Program.cs          MCP server entry point (stdio transport)\n\nsamples/\n  HelloWorld/         Minimal console app\n  ComplexApp/         Async pipeline with embedded resources\n  RichLibrary/        Library with NuGet deps (Newtonsoft.Json, System.Text.Json)\n  RichLibraryV2/      Same library with deliberate API changes (for diff testing)\n  MinimalApi/         ASP.NET Core minimal API (web SDK, hosted entry point)\n  NativeLib/          Unsafe code, P/Invoke, pointer operations\n  EmptyLib/           Minimal library (edge case testing)\n  NetFxConsole/       .NET Framework 4.8 console app (Dynamic tab guard testing)\n  NativeAotConsole/   NativeAOT-published console app (Dynamic tab tracing tests)\n\ntests/Dotsider.Tests/\n  SampleAssemblyFixture.cs   Builds all 9 samples once, shared across tests\n  *Tests.cs                  Integration tests against real assemblies\n\ntests/Dotsider.Mcp.Tests/\n  McpServerTestBase.cs       In-memory MCP server setup for testing\n  *Tests.cs                  MCP tool and prompt integration tests\n```\n\n## Testing\n\n```\ndotnet test\n```\n\nIntegration tests run against real .NET assemblies. The test fixture builds all sample projects automatically. First run takes longer due to NuGet restore; subsequent runs use cache.\n\n## Samples\n\nBuild the sample assemblies to have something to analyze:\n\n```\ndotnet build samples/RichLibrary\ndotsider samples/RichLibrary/bin/Debug/net10.0/RichLibrary.dll\n```\n\nTry diff mode with the two library versions:\n\n```\ndotnet build samples/RichLibraryV2\ndotsider diff \\\n  samples/RichLibrary/bin/Debug/net10.0/RichLibrary.dll \\\n  samples/RichLibraryV2/bin/Debug/net10.0/RichLibrary.dll\n```\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwillibrandon%2Fdotsider","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwillibrandon%2Fdotsider","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwillibrandon%2Fdotsider/lists"}