[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-105398":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":17,"stars30d":17,"stars90d":16,"forks30d":16,"starsTrendScore":18,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":23,"hasPages":21,"topics":24,"createdAt":10,"pushedAt":10,"updatedAt":33,"readmeContent":34,"aiSummary":10,"trendingCount":16,"starSnapshotCount":16,"syncStatus":17,"lastSyncTime":35,"discoverSource":36},105398,"passenger","Zaneris\u002Fpassenger","Zaneris","An open-source IDE for C# and .NET, built with Avalonia, for Windows, macOS and Linux: a Roslyn-powered editor, its own debugger with Hot Reload, a CPU and memory profiler, XAML tooling for Avalonia and WPF, and an MCP server for coding agents.","https:\u002F\u002Fpassenger-ide.net",null,"C#",208,17,4,54,0,2,6,44.97,"MIT License",false,"main",true,[25,26,27,28,29,30,31,32],"avalonia","csharp","debugger","dotnet","ide","mcp","profiler","roslyn","2026-11-01 00:15:48","# Passenger\n\n**Debug the whole stack.** The free IDE for C# and .NET: from a console app to a Docker Compose stack or an Aspire\nAppHost, every .NET service under its own debugger, Hot Reload and profiler. Free and open source under MIT, for\nWindows, macOS and Linux ([how to install it there](https:\u002F\u002Fpassenger-ide.net\u002Flinux)).\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fpassenger-ide.net\">Website\u003C\u002Fa> •\n  \u003Ca href=\"https:\u002F\u002Fpassenger-ide.net\u002F#download\">Download\u003C\u002Fa> •\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FZaneris\u002Fpassenger\u002Freleases\u002Ftag\u002Fv0.2.3\">What's new in 0.2.3\u003C\u002Fa> •\n  \u003Ca href=\"#what-it-does\">What it does\u003C\u002Fa> •\n  \u003Ca href=\"#your-coding-agent-using-the-ide-as-you-do\">Your coding agent\u003C\u002Fa> •\n  \u003Ca href=\"#building\">Building\u003C\u002Fa> •\n  \u003Ca href=\"CONTRIBUTING.md\">Contributing\u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cpicture>\n  \u003Csource media=\"(prefers-color-scheme: light)\" srcset=\"site\u002Fimages\u002Frequests-light.webp\">\n  \u003Cimg src=\"site\u002Fimages\u002Frequests-dark.webp\" alt=\"Passenger's Requests window following an Aspire app's ASP.NET Core API as it runs, under the minimal API handler that loops over the plants: each GET \u002Fplants\u002Fthirsty request marked N+1, its repeated SQL query marked ×6 with its reads and times\">\n\u003C\u002Fpicture>\n\nPassenger edits, builds, runs, tests, debugs and profiles C# and modern .NET. Most of what it includes usually takes a\npaid IDE or a paid add-on; in Passenger it is part of the IDE, free and open source under MIT, for work and personal\nprojects alike, with no account, no licence key and no telemetry:\n\n- **Debugging and profiling in containers.** A Docker Compose file's services or a Dockerfile's run as one, every .NET\n  service built here, held at its start and attached to inside its container, with Hot Reload and the profiler there\n  too.\n- **Aspire, with Passenger as the AppHost's IDE.** Aspire asks Passenger to start each project resource, so every\n  service is debugged, reloaded and profiled, and the Aspire window shows the resources, their logs and their traces.\n- **Live requests with their SQL.** Each request a running web app serves and the database commands it ran, an N+1 or a\n  slow query marked, for a program you run and for every service of a compose run or an AppHost.\n- **EF Core migrations that run.** The Migrations window finds what would stop `dotnet ef` (the tool, the Design\n  package, a provider behind) and fixes it before it runs.\n- **A debugger of its own, with Hot Reload,** and **performance and memory profiling:** several programs debugged at\n  once, the values methods returned, Smart Step Into and decompiled libraries; call trees, flame graphs and heap\n  snapshots compared.\n- **XAML tooling for Avalonia and WPF.** Completion and checks, a preview as you type, the running app's Live Visual\n  Tree, failed bindings with fixes, and in Avalonia, binding values and breakpoints in the XAML.\n- **An IDE your agent can drive.** Passenger is an MCP server for Claude Code, Codex, OpenCode and any MCP agent: it\n  builds, tests, debugs and profiles through the IDE, and tries out the app it is building.\n- **The rest of a full IDE:** a three-way merge for Git's conflicts, Local History, NuGet with vulnerable versions\n  marked, four test frameworks, a terminal of its own, and twelve looks, each dark and light.\n\nComing from Visual Studio? Visual Studio's keys are the default. On a Mac, where Visual Studio for Mac was retired in\nAugust 2024, Passenger is a full .NET IDE that runs natively on Apple Silicon.\n\nWhat comes next is in the [milestones](https:\u002F\u002Fgithub.com\u002FZaneris\u002Fpassenger\u002Fmilestones), the release in progress among\nthem. The pictures here are of sample projects committed to this repository, in your system's light or dark.\n\n## What it does\n\n### Containers and Docker Compose\n\nA container is one more place a .NET service runs, with nothing to set up beyond a Dockerfile or a compose file, and\nNew Solution and New Project write those for a new web, API, worker, Blazor or gRPC service, Aspire's AppHost too,\nlaunch profiles included, ready to Run or Debug. Passenger works through your own `docker` command and whatever its context reaches: Docker Desktop, Colima, OrbStack,\nRancher Desktop, Podman or a remote engine.\n\nEach compose file (with its override), each project with a Dockerfile or that asks the .NET SDK for its image, and each\nDocker Compose project (`.dcproj`) is a run configuration as the solution opens. By default Passenger builds the .NET\nservices itself and runs each from its build, mounted into its image's runtime stage, so a code change needs no image\nrebuild and Rerun restarts only the services whose build changed; or run the images as Compose builds them. Debug holds\neach .NET service at its start and attaches inside its container, so a breakpoint in `Main` stops, each service in a\nDebug tab of its own with its log as its console. Run with Hot Reload reaches every service, and an edit Hot Reload\ncan't apply rebuilds and restarts only the service that holds it. One service can be debugged, attached to, restarted\nor profiled while the others run on, and Attach to Process lists the .NET programs in every running container. CPU\ntraces and memory snapshots are taken in the container and shown as any others.\n\nThe Containers window lists Compose projects with their services, every other container, images, volumes and networks,\nwith their logs, stats, files and details, and their structured logs and traces when a configuration collects them.\nDockerfiles and compose files get language servers, BuildKit's checks and Compose's own reading as you type: each\n`${VAR}` followed by what it comes to (a secret as dots), Go to Declaration, Rename and completion of the file's names,\nand a connection string a service reads but never gets warned of in both files, with its fix. Add > Docker Support and\nAdd > Docker Compose write the files, with the backing services your packages call for.\n\n### Aspire\n\nAn AppHost, a project or a single-file `apphost.cs`, is a run configuration, and Aspire's orchestrator asks Passenger\nto start each project resource: Run, Debug, Run with Hot Reload and Profile reach every service, a Debug tab each, and\nRerun builds and restarts only what changed. The Aspire window has the Containers window's layout: the resources with\ntheir state, health and addresses, their details with secrets masked, their consoles merged into one log, their\nstructured logs and traces, and the AppHost's own log; a resource's commands run from its row. Resource names complete,\na connection string's name in a service goes to the AppHost line that declares it, Rename renames a resource\neverywhere, and a service that reads a connection string its AppHost never gives it is marked with a fix that adds the\n`WithReference`. The containers an AppHost makes are removed with its run, however it ends.\n\n\u003Cpicture>\n  \u003Csource media=\"(prefers-color-scheme: light)\" srcset=\"site\u002Fimages\u002Faspire-light.webp\">\n  \u003Cimg src=\"site\u002Fimages\u002Faspire-dark.webp\" alt=\"An Aspire AppHost debugged in Passenger: the API service stopped at a breakpoint with its values after the lines, a Debug tab for each service, and the Aspire window listing both services running with the API's details\">\n\u003C\u002Fpicture>\n\n### Web apps and their data\n\nThe Requests window shows the requests a running web app serves and the database commands each one ran, with their\ntimes and rows, for Run, Debug and Profile and for the services of a compose run or an AppHost, with no change to the\napp: Passenger reads ASP.NET Core's and EF Core's own events, only while you look. A command run again for every row (an\nN+1) or a slow one is marked, and a request opens at its handler or at the exception that ended it.\n\nThe Migrations window lists each DbContext's migrations and whether the database has them, with Add Migration, Remove\nLast, Update Database, Script and Bundle. Before a command runs it finds what would stop `dotnet ef` and offers the fix:\nthe tool missing or of another version, the Design package missing, a database provider behind your EF Core, a context\nthe tools can't make. It takes its project, startup project and context from EF Core 11's `.config\u002Fdotnet-ef.json`\nas `dotnet ef` does, and during a compose run or an AppHost it works on the database that run uses.\n\nThe Endpoints window lists the requests in your `.http` files and each web project's routes, read from its code with no\nbuild (minimal APIs, controllers, Razor Pages, Blazor, SignalR and gRPC), each sent to the running app from an icon on\nits line. `appsettings.json` and user secrets complete the keys your code reads, and a stopped EF Core query shows the\nSQL it would run.\n\n### Avalonia and WPF\n\n`.axaml` files get the help C# gets, from the project's own assemblies and Avalonia's own compiler and previewer:\ncompletion of controls, properties, values, resources, selectors and binding paths checked against `x:DataType`, the\nXAML compiler's errors on their lines, Go to Declaration into C#, rename of `x:Name`, Reformat Code, Extract Resource\nand Extract Style, and a missing property, command or converter made from where it is used. XAML Preview draws the\nfile beside it, following each edit.\n\n\u003Cpicture>\n  \u003Csource media=\"(prefers-color-scheme: light)\" srcset=\"site\u002Fimages\u002Fxaml-light.webp\">\n  \u003Cimg src=\"site\u002Fimages\u002Fxaml-dark.webp\" alt=\"An Avalonia .axaml file with XAML completion open, and XAML Preview drawing it beside the editor\">\n\u003C\u002Fpicture>\n\nDebug an Avalonia app and the Live Visual Tree shows its controls as they are, each property with where its value came\nfrom and each style with why it applies or not, and the XAML shows each binding's value after its line. A failed\nbinding is a console line linked to its XAML and a row in Problems with a fix where there is one, and can stop the\ndebugger like an exception. Breakpoints go on an element, one of its attributes, or a property's next change. The\nprofiler charts an Avalonia app's frames and their layout by control, and a failed Avalonia.Headless test (xUnit v3)\ncarries a picture of each window as it was.\n\n\u003Cpicture>\n  \u003Csource media=\"(prefers-color-scheme: light)\" srcset=\"site\u002Fimages\u002Flive-tree-light.webp\">\n  \u003Cimg src=\"site\u002Fimages\u002Flive-tree-dark.webp\" alt=\"Debugging an Avalonia app: the Live Visual Tree with an element's details, and binding values after the XAML's lines\">\n\u003C\u002Fpicture>\n\nWPF projects get the same XAML help on every system, with binding paths checked against the design-time data context.\nOn Windows, XAML Preview draws WPF files, and while a WPF app is debugged the Live Visual Tree shows where each value\ncame from and which styles and triggers set it, Break When Value Changes stops on a property's next change, and failed\nbindings show and can stop the debugger. Elsewhere a WPF or Windows Forms project builds for its code help and says it\nruns only on Windows.\n\n### Profiling\n\nA sampling profiler over the runtime's EventPipe, from a program's first instruction or attached to one already\nrunning: its call tree, hot spots, flame graph, allocations and garbage collections, narrowed to any stretch of the\ntimeline. A memory snapshot counts the heap by type, with each object's retained size, and shows the shortest paths\nthat keep it alive; two snapshots compared say which objects are new, which died and which survived.\n\n\u003Cpicture>\n  \u003Csource media=\"(prefers-color-scheme: light)\" srcset=\"site\u002Fimages\u002Fprofiler-light.webp\">\n  \u003Cimg src=\"site\u002Fimages\u002Fprofiler-dark.webp\" alt=\"A profile of a run: its timeline above the call tree\">\n\u003C\u002Fpicture>\n\n### Debugging\n\nPassenger's own debugger (started from SharpDbg and ICorDebugSharp, over ICorDebug): breakpoints with conditions, hit\ncounts and log messages, exception breakpoints, stepping through async code (.NET 11's runtime async too), Smart Step\nInto, the values methods returned, Run to Cursor and Set Next Statement, the call stack and threads, variables you can\nopen and set, watches and evaluation, and the values each line used drawn after it; resting on an object while paused\nopens it into its members. Several programs debug at once, each in a tab of its own with your breakpoints sent to all.\nA frame in a library without symbols shows its code, decompiled. Data breakpoints work on Windows x64, where the\nruntime supports them.\n\nEdit the code while debugging and Hot Reload puts it in the program, paused or running. An edit it can't apply is\nlisted in Problems with why, and by default the program restarts to take it. Without the debugger, Hot Reload runs\nunder `dotnet watch`.\n\n\u003Cpicture>\n  \u003Csource media=\"(prefers-color-scheme: light)\" srcset=\"site\u002Fimages\u002Fdebugger-light.webp\">\n  \u003Cimg src=\"site\u002Fimages\u002Fdebugger-dark.webp\" alt=\"Stopped at a breakpoint: the values after the lines, and the Debug window's frames and variables\">\n\u003C\u002Fpicture>\n\nRun | Attach to Process (Ctrl+Alt+P, ⌘⌥P on a Mac) lists the .NET programs running on your machine, by executable,\nprocess ID, user and command line, and debugs the one you choose as if Passenger had started it. Run | Detach lets it\ngo again, running on, and Reattach to Process (Alt+Shift+P) attaches to the last one again, even started anew. It\nlists programs on .NET Core 3.0 and later, whose runtime opens pipes for a debugger, and those in every running\ncontainer, debugged inside it; .NET Framework and Mono are not Passenger's.\n\nOn a Mac this needs no setup: no Developer Tools access, no debugger entitlement, no signing of yours or the\nprogram's. The debugger reaches a program's runtime through those pipes, in your temporary folder, not through the\ntask port macOS guards, so a program you started in a terminal, one signed under the hardened runtime, and Passenger\nitself attach as a program the debugger starts does. The program has to run as you, with your temporary folder\n(`TMPDIR`), and with its diagnostics on (`DOTNET_EnableDiagnostics` not set to 0).\n\n### The editor and C#\n\nA text control of its own over an immutable rope: multiple carets, folding, soft wrap, Extend Selection, live, postfix\nand surround templates, inlay hints, the symbol at the caret lit through the file, and splits and tabs in windows of\ntheir own. A key costs what it changed, not the file's size. Visual Studio's keys are the default, chords included,\nas Rider's Visual Studio keymap has them (Visual Studio OSX's on a Mac), so a Rider user finds them too; coming from VS\nCode, Settings, Keymap switches to VS Code's.\n\nC# comes from Roslyn: its parser colours as you type, then the language server gives diagnostics, completion, hovers,\nsignature help, quick fixes and refactorings (Change Signature, Extract Interface, Move, Pull Members Up, Safe Delete\nand more), a rename that renames the type's file, Go to Declaration, Implementation and Base Symbols, Find Usages, call\nand type hierarchies and decompiled library sources. Problems lists the whole solution's without a build. Razor and\nBlazor files get C# and HTML help together.\n\n.NET 11 and C# 15 as they ship: a file-based program (`dotnet run app.cs`) opens as a project of its own, with C# across\nthe files it includes, its run configurations, tests, Run, Debug, Profile and Hot Reload; a solution filter (`.slnf`)\nopens its solution with only the projects it names loaded; and a union's name is coloured, its value shown by the\ndebugger as what it holds.\n\n\u003Cpicture>\n  \u003Csource media=\"(prefers-color-scheme: light)\" srcset=\"site\u002Fimages\u002Feditor-light.webp\">\n  \u003Cimg src=\"site\u002Fimages\u002Feditor-dark.webp\" alt=\"Passenger's C# editor: completion open after a dot, inlay hints, and the change bars of uncommitted lines\">\n\u003C\u002Fpicture>\n\nTwelve looks of its own, each dark and light: Passenger, the default, in the app icon's blue; Harbour, warmer and\nrounder, the icon's teal on linen by day and a warm charcoal by night; and Sorbet, Nocturne, Saffron, Bonbon, Ledger,\nSlate, Orbit, Nightjar, Moss and Phosphor, each checked for contrast in both. Every file has an icon of its own, in\neach look's colours.\n\n\u003Cpicture>\n  \u003Csource media=\"(prefers-color-scheme: light)\" srcset=\"site\u002Fimages\u002Fthemes-light.webp\">\n  \u003Cimg src=\"site\u002Fimages\u002Fthemes-dark.webp\" alt=\"Passenger's window changing look every two seconds through all twelve, each named in its title bar and Solution view: Passenger, Harbour, Sorbet, Nocturne, Saffron, Bonbon, Ledger, Slate, Orbit, Nightjar, Moss and Phosphor\">\n\u003C\u002Fpicture>\n\n### Project files and the web languages\n\nIn a `.csproj`, `.props` or `.targets`: completion of elements, properties, items and their values, and of package ids\nand versions from your feeds (under central package management, the version goes to `Directory.Packages.props`), a\nproperty's evaluated value and where it was set, Go to Declaration into the SDK's own files, and the evaluation's\nerrors on their lines.\n\n\u003Cpicture>\n  \u003Csource media=\"(prefers-color-scheme: light)\" srcset=\"site\u002Fimages\u002Fproject-files-light.webp\">\n  \u003Cimg src=\"site\u002Fimages\u002Fproject-files-dark.webp\" alt=\"A project file with MSBuild help: a property's evaluated value and where it is set\">\n\u003C\u002Fpicture>\n\nJavaScript, TypeScript, HTML, CSS, SCSS, Less, JSON, Dockerfiles and YAML go through their language servers on\nNode.js: completion, checks, navigation and formatting, TypeScript on the project's own version, JSON against its\nschema, ESLint's problems and fixes as you type, and the project's own Prettier on Reformat Code and on save.\n\n\u003Cpicture>\n  \u003Csource media=\"(prefers-color-scheme: light)\" srcset=\"site\u002Fimages\u002Fweb-light.webp\">\n  \u003Cimg src=\"site\u002Fimages\u002Fweb-dark.webp\" alt=\"A TypeScript file with its language server's help\">\n\u003C\u002Fpicture>\n\n### Git\n\nThe Commit window with its changes, the log with its branch graph and branches, side-by-side diffs with the changed\nwords marked, blame, change bars in the gutter that roll a change back, the history of a file, a folder or a\nselection, stashes, push, pull and fetch, and conflicts resolved in a three-way merge.\n\n\u003Cpicture>\n  \u003Csource media=\"(prefers-color-scheme: light)\" srcset=\"site\u002Fimages\u002Fgit-light.webp\">\n  \u003Cimg src=\"site\u002Fimages\u002Fgit-dark.webp\" alt=\"The Git window's log with its branch graph and a commit's details\">\n\u003C\u002Fpicture>\n\n### Search\n\nSearch Everywhere, Go to File, Go to Symbol and Find Action, Find and Replace in Files across the solution, a project,\na folder or a scope with a file mask and a preview, Find Usages in a window of its own, Recent Files and Recent\nLocations, bookmarks and File Structure.\n\n\u003Cpicture>\n  \u003Csource media=\"(prefers-color-scheme: light)\" srcset=\"site\u002Fimages\u002Ffind-in-files-light.webp\">\n  \u003Cimg src=\"site\u002Fimages\u002Ffind-in-files-dark.webp\" alt=\"Find in Files: every match with its file and line, the chosen one previewed below\">\n\u003C\u002Fpicture>\n\n### And the rest\n\n- **Build, run and publish:** a Solution view of the projects as MSBuild evaluates them, builds with their errors in\n  Problems, run configurations from your launch profiles (edited in place, and written back to them), consoles whose\n  stack frames link to their lines, and Publish to a folder with the SDK's own publish profiles.\n- **Unit tests:** xUnit, NUnit, MSTest and TUnit, through VSTest or Microsoft.Testing.Platform, found from the code\n  before any build, with run marks in the gutter, grouping and filters, and any test debugged.\n- **NuGet:** the feeds your `nuget.config` names, packages installed, updated and removed per project, central package\n  management, and vulnerable versions marked with the lowest that fixes them.\n- **Terminal:** an emulator of its own with a shell per tab; a console program can run and be debugged in it.\n- **Tables and previews:** CSV, TSV and Excel workbooks open as tables Find searches, and images and fonts as\n  previews.\n- **Local History**, tool windows docked or floating, a window per solution, New Solution from `dotnet new`'s\n  templates, and updates that install themselves on Windows and macOS, then show what's new.\n\n## Your coding agent, using the IDE as you do\n\n\u003Cpicture>\n  \u003Csource media=\"(prefers-color-scheme: light)\" srcset=\"site\u002Fimages\u002Fagent-light.webp\">\n  \u003Cimg src=\"site\u002Fimages\u002Fagent-dark.webp\" alt=\"An agent in Passenger's terminal driving the Avalonia app being built over MCP: it starts the app under the debugger, finds its Water button, clicks it and reads the plants' moisture back, while the Live Visual Tree shows the button it clicked, now focused\">\n\u003C\u002Fpicture>\n\nConnect a coding agent such as Claude Code, Codex or OpenCode to Passenger and it works through the IDE, not just your\nfiles. It finds where things are declared and used, reads the warnings, and renames, fixes and formats code as the IDE\ndoes, in C#, Razor, XAML, the web languages and project files alike. It builds, runs and tests, sets breakpoints, steps,\nreads and changes variables, applies Hot Reload and profiles a run. It starts, debugs, profiles and stops a compose\nservice or an Aspire resource and reads its logs and traces, reads a web app's routes and its live requests with their\nSQL, and runs the EF Core migrations with their fixes. It searches and replaces across files, commits, resolves\nconflicts, adds packages, types into the terminal and looks at the window. When the program is an Avalonia app,\nor a WPF app on Windows, it sees and drives the app as a person testing it would, without taking your focus or your\npointer.\n\nThere are two ways in, each a flag on Passenger's own executable:\n\n- **`--mcp-attach`** joins the window you have open over the folder the agent works in (`--mcp-attach PID` chooses one\n  Passenger's windows), so its breakpoints and stops show in your editor and its runs in your Run window. Set it up\n  before Passenger is even running: the agent has its tools from the start, and its first call opens the folder in\n  Passenger, starting it if need be. It never joins a window on another folder. The window asks you before it lets an\n  agent in (Allow, Don't allow, or Always for this folder), unless you have turned on Settings | MCP Server | Enable\n  MCP Server; it is reached through a socket in your own user's folder, and the first time an agent uses a tool that\n  changes anything, or opens another folder in your window, it asks you again. While a question waits, the window comes\n  forward (on a Mac the Dock icon bounces), the status bar says which agent waits and on what, and the agent is told so;\n  an answer not given within two minutes comes back to the agent as nobody having answered, and its next call asks again.\n- **`--mcp FOLDER`** starts a Passenger of the agent's own with no window, over a folder or solution, for work it does\n  alone. It asks nothing, so it suits an agent you leave to work while you are away.\n\nA call that takes a while (a build, a test run, a debug session waiting for a stop) tells the agent what it is doing\nevery 10 seconds when the agent asks for progress, so an agent that gives up on a call it hears nothing of waits on.\nWith Settings | Diagnostics | Trace protocol messages on, `mcp.log` in the logs folder has each agent's call, what it\nwaited on and for how long.\n\nThe quickest way in is Passenger's own Settings | MCP Server: it shows each agent's setup below with this copy's own\npath filled in, each with a Copy button, and lists the folders agents join unasked, each one to take back. The\nwebsite's [agents page](https:\u002F\u002Fpassenger-ide.net\u002Fagents) has the same setups.\n\nPassenger is `\u002FApplications\u002FPassenger.app\u002FContents\u002FMacOS\u002FPassenger` on a Mac,\n`%LOCALAPPDATA%\\PassengerIDE\\current\\Passenger.exe` on Windows, and `~\u002F.local\u002Fbin\u002Fpassenger` on Linux\n(`\u002Fusr\u002Flocal\u002Fbin\u002Fpassenger` when installed for everyone). A repository's `.mcp.json` gives it to everyone who works\nthere with Claude Code:\n\n```json\n{\n  \"mcpServers\": {\n    \"passenger\": {\n      \"command\": \"\u002FApplications\u002FPassenger.app\u002FContents\u002FMacOS\u002FPassenger\",\n      \"args\": [\"--mcp-attach\"]\n    }\n  }\n}\n```\n\nOr add it for yourself:\n\n```sh\n# Claude Code\nclaude mcp add passenger -- \u002FApplications\u002FPassenger.app\u002FContents\u002FMacOS\u002FPassenger --mcp-attach\n# Codex CLI\ncodex mcp add passenger -- \u002FApplications\u002FPassenger.app\u002FContents\u002FMacOS\u002FPassenger --mcp-attach\n```\n\nClaude Desktop takes the same `mcpServers` entry in Settings | Developer | Edit Config, with the folder to work in after\n`--mcp-attach`, since it starts its servers in no folder of yours; the Codex desktop app takes it in Settings | MCP\nservers | Add server (STDIO, with the same command and argument). Any other agent that can add an MCP server connects\nthe same way.\n\nOpenCode takes it in `opencode.json`, at your project's root or in `~\u002F.config\u002Fopencode\u002F` for every project, with a\ntimeout of 10 minutes on a call:\n\n```json\n{\n  \"mcp\": {\n    \"passenger\": {\n      \"type\": \"local\",\n      \"command\": [\"\u002FApplications\u002FPassenger.app\u002FContents\u002FMacOS\u002FPassenger\", \"--mcp-attach\"],\n      \"enabled\": true,\n      \"timeout\": 600000\n    }\n  }\n}\n```\n\nOpenCode 2 lists its servers under `mcp.servers`. Turn Code Mode off for Passenger, so OpenCode calls its tools\nitself (Code Mode's permission prompts can leave a call waiting), and give a call 30 minutes rather than 12 hours (OpenCode 2\ncounts a call's whole time whatever progress it hears, so a long build or test run needs the room):\n\n```json\n{\n  \"mcp\": {\n    \"servers\": {\n      \"passenger\": {\n        \"type\": \"local\",\n        \"command\": [\"\u002FApplications\u002FPassenger.app\u002FContents\u002FMacOS\u002FPassenger\", \"--mcp-attach\"],\n        \"codemode\": false,\n        \"timeout\": { \"execution\": 1800000 }\n      }\n    }\n  }\n}\n```\n\nThis repository's own [`.mcp.json`](.mcp.json) runs [`tools\u002Fmcp.sh`](tools\u002Fmcp.sh), the script `just mcp` runs too:\nthe last Debug build with `--mcp` over this folder, run from a clone of the build so rebuilding Passenger never changes\nthe files under the agent's IDE.\n\n## Building\n\nBuilding needs the .NET 11 SDK (11.0.100-rc.3 or later, as [`global.json`](global.json) asks, until .NET 11 ships in\nNovember 2026) and [just](https:\u002F\u002Fgithub.com\u002Fcasey\u002Fjust). The tests need more:\n\n- **the .NET 10 SDK** beside it, since the programs the debugger's tests debug ([`tests\u002FDebuggees`](tests\u002FDebuggees))\n  and most projects the tests write run on .NET 10;\n- **Git**, which the IDE runs for its Git features and the tests for theirs;\n- on Linux, **the X11 and fontconfig libraries** [Passenger's Linux page](https:\u002F\u002Fpassenger-ide.net\u002Flinux) names, which\n  the headless tests draw their text with too;\n- **Node.js**, for the web languages' tests, which skip without it, saying why;\n- **a container engine running Linux containers** (Docker Desktop, Docker Engine, Colima, OrbStack), for the container\n  tests, which skip without one, saying why.\n\n**Python 3** runs the recipes that write or check generated files (`just icons`, `just file-icons`, `just themes`,\n`just unicode-widths`, `just notices`, `just test-times`) and some of the macOS ones (`just app-icon`,\n`just package-mac`, `just site-shots`). To use what you build, Passenger needs what a release needs: a .NET SDK 10 or\nlater, Git, and Node.js for the web languages.\n\n```sh\njust build                 # Debug build; warnings are errors\njust run [PATH]            # run it on a folder or solution (--theme dark|light, --look passenger, harbour, sorbet…)\njust test [FILTER]         # every test, the IDE driven whole on Avalonia's headless platform, or those matching;\n                           # the results in artifacts\u002Ftest-results\njust screenshot shell.png  # draw the main window to a PNG off-screen (--size 1600x1000 --scale 2)\njust mcp [FOLDER]          # Passenger as an MCP server over a folder, from a clone of the last build\njust publish osx-arm64     # a self-contained Release build (win-x64, win-arm64, linux-x64, linux-arm64 too)\njust package-mac           # the macOS disk image, Apple Silicon; signed with PASSENGER_SIGN_IDENTITY, else ad hoc\njust package-win win-x64   # the Windows installer (or win-arm64), unsigned unless tools\u002Fpackage-win.sh's variables sign it\njust package-linux         # the Linux archive with its install.sh (linux-x64, or linux-arm64), as site\u002Flinux.html uses it\njust container-tools       # the tools Passenger debugs and profiles with inside a Linux container, where a build finds them\njust notices               # fail naming any package THIRD_PARTY_NOTICES.md does not name\n```\n\nEvery recipe sets `AVALONIA_TELEMETRY_OPTOUT=1`. Avalonia's build task (Avalonia.BuildServices, which every Avalonia\npackage brings) otherwise sends AvaloniaUI a record of each build: a machine id it keeps, hashes of the machine and\nuser names and of the project's name, the system, the IDE and the CI it ran under. It reads its opt-out only from the\nenvironment, so set the variable yourself for a build outside `just` (`dotnet build`, an IDE's).\n\nPackages come only from nuget.org (`nuget.config`), at the versions and content each project's `packages.lock.json`\npins, and on Windows and Linux only as nuget.org signed them (NuGet checks no signatures on macOS). A restore on your\nmachine updates a lock file when you add or change a package; commit it with the change, since CI restores only what\nthe lock files name.\n\nThe website is [`site\u002F`](site), plain HTML and CSS deployed to [passenger-ide.net](https:\u002F\u002Fpassenger-ide.net) when the\nSite workflow is run by hand.\n\n## Contributing\n\n[`CONTRIBUTING.md`](CONTRIBUTING.md) says how to report a bug, propose a change and open a pull request, and what\nworking on Passenger needs.\n\n## Licence\n\nMIT (`LICENSE`). Third-party code and assets keep their own licences, listed in `THIRD_PARTY_NOTICES.md`.\n","2026-10-31 04:26:40","CREATED_QUERY"]