A desktop application for managing and comparing many Git repositories side by side.
ProjectDirector is a .NET desktop application for working across a large collection of related Git repositories at once. It scans a local development directory, pairs what it finds with your remote repositories on GitHub and Azure DevOps, and gives you a single window from which to fetch, pull, diff, and propagate changes.
It exists for the case where the same file — a workflow, an editorconfig, a shared props file — drifts across dozens of sibling repositories, and you want to see the differences and push one canonical version out to the rest.
- Repository Discovery: Scans a configured development directory for local clones and lists them alongside your remote repositories.
- Multi-Provider Remotes: Browses repositories from GitHub (via Octokit) and Azure DevOps.
- Bulk Git Operations: Fetch and pull across many repositories, with per-repository status and timing.
- Cross-Repository Diffing: Compares a given file across every repository that contains it and shows a line-by-line diff.
- File Propagation: Copies a chosen version of a file out to the other repositories that have it, so a shared file can be reconciled in one step.
- Three-Panel Layout: Repository list on the left, repository detail and diff view on the right, and an operation log along the bottom.
- Persistent State: Development directory, credentials, repository cache, and UI layout are saved between sessions.
- .NET 9.0
- Windows (the application uses a Dear ImGui desktop window)
git clone https://github.com/ktsu-dev/ProjectDirector.git
cd ProjectDirector
dotnet build# Run the application
dotnet run
# Publish a distributable build
dotnet publish --configuration Release --output ./stagingOn first run, set the development directory that ProjectDirector should scan and add the GitHub owners you want listed (File > Add New GitHub Owner). Give an owner a personal access token with File > Set GitHub Owner Token if its repositories are private or you want a higher rate limit.
The development directory, the owner list and the repository cache are persisted to the application data folder. Tokens are not: they go to the operating system's secret store — Windows Credential Manager, macOS Keychain, or libsecret (Secret Service) on Linux. A token saved by an earlier version is moved there on the next start and emptied where it was, so nothing needs re-entering.
- Point ProjectDirector at your development directory.
- Let it scan for local clones and fetch the remote repository list.
- Select a repository to see its details, or select a file to diff it across every repository that has one.
- Choose the version you want to keep and propagate it to the others.
- Review the log panel, then commit and push from your normal Git tooling.
| Component | Responsibility |
|---|---|
ProjectDirector |
Main application class: ImGui loop, three-panel layout, and the fetch/pull/diff/propagate operations. |
ProjectDirectorOptions |
Application state persisted as JSON — dev directory, configured GitHub owners, repository cache, and UI state. Deliberately holds no tokens. |
TokenStorage |
GitHub tokens in the OS secret store, keyed by a persona derived from the login or owner name, plus the one-time migration off the old plaintext fields. |
GitRepository |
Abstract repository model with polymorphic JSON serialization. |
GitHubRepository / AzureDevOpsRepository |
Provider-specific repository implementations. |
PopupPropagateFile |
Modal that drives the file propagation flow. |
DictionaryOfHashSets |
Helper collection for grouping repositories by file hash. |
| Package | Used for |
|---|---|
| ktsu.RunCommand | Runs the git command line — clone, fetch, pull, status |
| Octokit | GitHub API access |
| DiffPlex | Line-by-line file diffing |
| ktsu.ImGuiApp | Application shell and window management |
| ktsu.AppDataStorage | Persistent options storage |
| ktsu.Semantics | Type-safe paths and identifiers |
Contributions are welcome! Feel free to open issues or submit pull requests.
This project is licensed under the MIT License. See the LICENSE.md file for details.