// Copyright © 2026 Krzysztof Kasprowicz // Licensed under the GNU Affero General Public License, Version 3. See LICENSE in the project root for license information. // Project repository: https://github.com/fathomise/MailFathom // // The VS Code entry point for this repository, because the repository root is not a solution directory. The service // owns its own solution — backend/MailFathom.slnx — so a root opened on its own loads nothing and C# Dev Kit finds no // project. Open this file instead, with `code MailFathom.code-workspace` or File → Open Workspace from File. // // This is a VS Code file and nothing else reads it. Rider and Visual Studio open a solution directly and neither has // the problem it solves. `.vscode/` stays gitignored, which is why every section below is inline here rather than in // a per-user file the repository would have to start tracking. { // The service, and then the repository itself for everything belonging to neither stack — `docs/`, `deploy/`, // `scripts/`, `.github/`, `frontend/`, and the root files. `files.exclude` below keeps the service from appearing // twice under it. // // There is no `client` entry, because there is nothing for it to open: the Uno Platform client was withdrawn and the // client is being rebuilt in React, so `frontend/` holds two placeholder directories and no solution. It is read // under `repository` until the new stack arrives with whatever its own editor tooling turns out to be. "folders": [ { "name": "service", "path": "backend" }, { "name": "repository", "path": "." } ], "settings": { // Applied per folder root, so this hides the service from the `repository` entry and reaches nothing inside // `backend`, which contains no directory by that name. Quick Open and search still find every file in it, through // the folder that owns it. "files.exclude": { "backend": true }, // The lock files, the golden manifests, and the generated site are read rather than edited, and a search that // returns them buries the file that was actually being looked for. "search.exclude": { "**/packages.lock.json": true, "deploy/helm/mailfathom/ci/golden": true, "docfx/_site": true }, // The build already enforces this through `.editorconfig`, `EnforceCodeStyleInBuild`, and `TreatWarningsAsErrors`. // Applying it on save is what keeps a formatting failure out of the gate rather than into it. "editor.formatOnSave": true, "[csharp]": { "editor.defaultFormatter": "ms-dotnettools.csharp" }, // `.slnx` is the solution format the service uses, and VS Code has no built-in association for it. "files.associations": { "*.slnx": "xml", "*.code-workspace": "jsonc" }, // The SDK is pinned through the root `global.json`, so nothing here should reach for another one. "dotnet.dotnetPath": "", "dotnet.server.useOmnisharp": false }, "extensions": { // What a fresh machine is prompted to install. C# Dev Kit loads the solution, and the YAML extension is for the // workflows and the Helm chart. Neither is a dependency of what MailFathom ships — they are editor tooling, and // the third-party register covers what the product carries rather than what a contributor's editor loads. "recommendations": [ "ms-dotnettools.csdevkit", "ms-dotnettools.csharp", "redhat.vscode-yaml" ] }, "launch": { "version": "0.2.0", "configurations": [ // The whole local system: PostgreSQL, the migration run, and the service, in the order the app model declares. // This is the same thing `dotnet run --project backend/src/AppHost/AppHost.csproj` starts, with a debugger // attached to the app host itself rather than to the resources it launches. { "name": "Service: app host with the whole orchestration", "type": "coreclr", "request": "launch", "preLaunchTask": "build the app host", "program": "${workspaceFolder:service}/src/AppHost/bin/Debug/net10.0/MailFathom.AppHost.dll", "cwd": "${workspaceFolder:service}/src/AppHost", "console": "internalConsole", "stopAtEntry": false, "env": { "DOTNET_ENVIRONMENT": "Development" }, // The dashboard address is the first thing the app host writes, and opening it is what makes the run usable. "serverReadyAction": { "action": "openExternally", "pattern": "\\blogin\\?t=[a-z0-9]+" } } ] }, "tasks": { "version": "2.0.0", "tasks": [ { "label": "build the app host", "detail": "Builds backend/src/AppHost, which is what the service launch configuration runs.", "type": "process", "command": "dotnet", "args": [ "build", "${workspaceFolder:service}/src/AppHost/AppHost.csproj" ], "problemMatcher": "$msCompile", "group": "build" }, { "label": "verify: fast loop", "detail": "scripts/verify-fast.sh — the loop to run while implementing.", "type": "shell", "command": "./scripts/verify-fast.sh", "options": { "cwd": "${workspaceFolder:repository}" }, "problemMatcher": [], "group": "test" }, { "label": "verify: full gate", "detail": "scripts/verify-full.sh — the gate to pass before committing. Stage the task's files first.", "type": "shell", "command": "./scripts/verify-full.sh", "options": { "cwd": "${workspaceFolder:repository}" }, "problemMatcher": [], "group": "test" } ] } }