Repository files navigation

ProjectDirector

A desktop application for managing and comparing many Git repositories side by side.

LicenseGitHub commit activityGitHub contributorsGitHub Actions Workflow Status

Introduction

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.

Features

  • 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.

Requirements

  • .NET 9.0
  • Windows (the application uses a Dear ImGui desktop window)

Installation

git clone https://github.com/ktsu-dev/ProjectDirector.git
cd ProjectDirector
dotnet build

Usage

# Run the application
dotnet run
# Publish a distributable build
dotnet publish --configuration Release --output ./staging

On first run, set the development directory that ProjectDirector should scan and supply GitHub credentials if you want remote repositories listed. Both are persisted to the application data folder, so subsequent runs start where you left off.

Typical Workflow

  1. Point ProjectDirector at your development directory.
  2. Let it scan for local clones and fetch the remote repository list.
  3. Select a repository to see its details, or select a file to diff it across every repository that has one.
  4. Choose the version you want to keep and propagate it to the others.
  5. Review the log panel, then commit and push from your normal Git tooling.

Architecture

ComponentResponsibility
ProjectDirectorMain application class: ImGui loop, three-panel layout, and the fetch/pull/diff/propagate operations.
ProjectDirectorOptionsApplication state persisted as JSON — dev directory, credentials, repository cache, and UI state.
GitRepositoryAbstract repository model with polymorphic JSON serialization.
GitHubRepository / AzureDevOpsRepositoryProvider-specific repository implementations.
PopupPropagateFileModal that drives the file propagation flow.
DictionaryOfHashSetsHelper collection for grouping repositories by file hash.

Key Dependencies

PackageUsed for
ktsu.RunCommandRuns the git command line — clone, fetch, pull, status
OctokitGitHub API access
DiffPlexLine-by-line file diffing
ktsu.ImGuiAppApplication shell and window management
ktsu.AppDataStoragePersistent options storage
ktsu.SemanticsType-safe paths and identifiers

Contributing

Contributions are welcome! Feel free to open issues or submit pull requests.

License

This project is licensed under the MIT License. See the LICENSE.md file for details.

About

A .NET desktop application for managing and comparing many Git repositories side by side. Scans a local development directory, browses GitHub and Azure DevOps remotes, fetches and pulls in bulk, diffs individual files across repositories, and propagates a chosen version of a file to the others.

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

ProjectDirector

A desktop application for managing and comparing many Git repositories side by side.

LicenseGitHub commit activityGitHub contributorsGitHub Actions Workflow Status

Introduction

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.

Features

  • 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.

Requirements

  • .NET 9.0
  • Windows (the application uses a Dear ImGui desktop window)

Installation

git clone https://github.com/ktsu-dev/ProjectDirector.git
cd ProjectDirector
dotnet build

Usage

# Run the application
dotnet run
# Publish a distributable build
dotnet publish --configuration Release --output ./staging

On first run, set the development directory that ProjectDirector should scan and supply GitHub credentials if you want remote repositories listed. Both are persisted to the application data folder, so subsequent runs start where you left off.

Typical Workflow

  1. Point ProjectDirector at your development directory.
  2. Let it scan for local clones and fetch the remote repository list.
  3. Select a repository to see its details, or select a file to diff it across every repository that has one.
  4. Choose the version you want to keep and propagate it to the others.
  5. Review the log panel, then commit and push from your normal Git tooling.

Architecture

ComponentResponsibility
ProjectDirectorMain application class: ImGui loop, three-panel layout, and the fetch/pull/diff/propagate operations.
ProjectDirectorOptionsApplication state persisted as JSON — dev directory, credentials, repository cache, and UI state.
GitRepositoryAbstract repository model with polymorphic JSON serialization.
GitHubRepository / AzureDevOpsRepositoryProvider-specific repository implementations.
PopupPropagateFileModal that drives the file propagation flow.
DictionaryOfHashSetsHelper collection for grouping repositories by file hash.

Key Dependencies

PackageUsed for
ktsu.RunCommandRuns the git command line — clone, fetch, pull, status
OctokitGitHub API access
DiffPlexLine-by-line file diffing
ktsu.ImGuiAppApplication shell and window management
ktsu.AppDataStoragePersistent options storage
ktsu.SemanticsType-safe paths and identifiers

Contributing

Contributions are welcome! Feel free to open issues or submit pull requests.

License

This project is licensed under the MIT License. See the LICENSE.md file for details.

About

A .NET desktop application for managing and comparing many Git repositories side by side. Scans a local development directory, browses GitHub and Azure DevOps remotes, fetches and pulls in bulk, diffs individual files across repositories, and propagates a chosen version of a file to the others.

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ProjectDirector

A desktop application for managing and comparing many Git repositories side by side.

LicenseGitHub commit activityGitHub contributorsGitHub Actions Workflow Status

Introduction

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.

Features

  • 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.

Requirements

  • .NET 9.0
  • Windows (the application uses a Dear ImGui desktop window)

Installation

git clone https://github.com/ktsu-dev/ProjectDirector.git
cd ProjectDirector
dotnet build

Usage

# Run the application
dotnet run
# Publish a distributable build
dotnet publish --configuration Release --output ./staging

On first run, set the development directory that ProjectDirector should scan and supply GitHub credentials if you want remote repositories listed. Both are persisted to the application data folder, so subsequent runs start where you left off.

Typical Workflow

  1. Point ProjectDirector at your development directory.
  2. Let it scan for local clones and fetch the remote repository list.
  3. Select a repository to see its details, or select a file to diff it across every repository that has one.
  4. Choose the version you want to keep and propagate it to the others.
  5. Review the log panel, then commit and push from your normal Git tooling.

Architecture

ComponentResponsibility
ProjectDirectorMain application class: ImGui loop, three-panel layout, and the fetch/pull/diff/propagate operations.
ProjectDirectorOptionsApplication state persisted as JSON — dev directory, credentials, repository cache, and UI state.
GitRepositoryAbstract repository model with polymorphic JSON serialization.
GitHubRepository / AzureDevOpsRepositoryProvider-specific repository implementations.
PopupPropagateFileModal that drives the file propagation flow.
DictionaryOfHashSetsHelper collection for grouping repositories by file hash.

Key Dependencies

PackageUsed for
ktsu.RunCommandRuns the git command line — clone, fetch, pull, status
OctokitGitHub API access
DiffPlexLine-by-line file diffing
ktsu.ImGuiAppApplication shell and window management
ktsu.AppDataStoragePersistent options storage
ktsu.SemanticsType-safe paths and identifiers

Contributing

Contributions are welcome! Feel free to open issues or submit pull requests.

License

This project is licensed under the MIT License. See the LICENSE.md file for details.

About

A .NET desktop application for managing and comparing many Git repositories side by side. Scans a local development directory, browses GitHub and Azure DevOps remotes, fetches and pulls in bulk, diffs individual files across repositories, and propagates a chosen version of a file to the others.

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ProjectDirector

A desktop application for managing and comparing many Git repositories side by side.

LicenseGitHub commit activityGitHub contributorsGitHub Actions Workflow Status

Introduction

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.

Features

  • 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.

Requirements

  • .NET 9.0
  • Windows (the application uses a Dear ImGui desktop window)

Installation

git clone https://github.com/ktsu-dev/ProjectDirector.git
cd ProjectDirector
dotnet build

Usage

# Run the application
dotnet run
# Publish a distributable build
dotnet publish --configuration Release --output ./staging

On first run, set the development directory that ProjectDirector should scan and supply GitHub credentials if you want remote repositories listed. Both are persisted to the application data folder, so subsequent runs start where you left off.

Typical Workflow

  1. Point ProjectDirector at your development directory.
  2. Let it scan for local clones and fetch the remote repository list.
  3. Select a repository to see its details, or select a file to diff it across every repository that has one.
  4. Choose the version you want to keep and propagate it to the others.
  5. Review the log panel, then commit and push from your normal Git tooling.

Architecture

ComponentResponsibility
ProjectDirectorMain application class: ImGui loop, three-panel layout, and the fetch/pull/diff/propagate operations.
ProjectDirectorOptionsApplication state persisted as JSON — dev directory, credentials, repository cache, and UI state.
GitRepositoryAbstract repository model with polymorphic JSON serialization.
GitHubRepository / AzureDevOpsRepositoryProvider-specific repository implementations.
PopupPropagateFileModal that drives the file propagation flow.
DictionaryOfHashSetsHelper collection for grouping repositories by file hash.

Key Dependencies

PackageUsed for
ktsu.RunCommandRuns the git command line — clone, fetch, pull, status
OctokitGitHub API access
DiffPlexLine-by-line file diffing
ktsu.ImGuiAppApplication shell and window management
ktsu.AppDataStoragePersistent options storage
ktsu.SemanticsType-safe paths and identifiers

Contributing

Contributions are welcome! Feel free to open issues or submit pull requests.

License

This project is licensed under the MIT License. See the LICENSE.md file for details.

About

A .NET desktop application for managing and comparing many Git repositories side by side. Scans a local development directory, browses GitHub and Azure DevOps remotes, fetches and pulls in bulk, diffs individual files across repositories, and propagates a chosen version of a file to the others.

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

ProjectDirector

A desktop application for managing and comparing many Git repositories side by side.

LicenseGitHub commit activityGitHub contributorsGitHub Actions Workflow Status

Introduction

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.

Features

  • 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.

Requirements

  • .NET 9.0
  • Windows (the application uses a Dear ImGui desktop window)

Installation

git clone https://github.com/ktsu-dev/ProjectDirector.git
cd ProjectDirector
dotnet build

Usage

# Run the application
dotnet run
# Publish a distributable build
dotnet publish --configuration Release --output ./staging

On first run, set the development directory that ProjectDirector should scan and supply GitHub credentials if you want remote repositories listed. Both are persisted to the application data folder, so subsequent runs start where you left off.

Typical Workflow

  1. Point ProjectDirector at your development directory.
  2. Let it scan for local clones and fetch the remote repository list.
  3. Select a repository to see its details, or select a file to diff it across every repository that has one.
  4. Choose the version you want to keep and propagate it to the others.
  5. Review the log panel, then commit and push from your normal Git tooling.

Architecture

ComponentResponsibility
ProjectDirectorMain application class: ImGui loop, three-panel layout, and the fetch/pull/diff/propagate operations.
ProjectDirectorOptionsApplication state persisted as JSON — dev directory, credentials, repository cache, and UI state.
GitRepositoryAbstract repository model with polymorphic JSON serialization.
GitHubRepository / AzureDevOpsRepositoryProvider-specific repository implementations.
PopupPropagateFileModal that drives the file propagation flow.
DictionaryOfHashSetsHelper collection for grouping repositories by file hash.

Key Dependencies

PackageUsed for
ktsu.RunCommandRuns the git command line — clone, fetch, pull, status
OctokitGitHub API access
DiffPlexLine-by-line file diffing
ktsu.ImGuiAppApplication shell and window management
ktsu.AppDataStoragePersistent options storage
ktsu.SemanticsType-safe paths and identifiers

Contributing

Contributions are welcome! Feel free to open issues or submit pull requests.

License

This project is licensed under the MIT License. See the LICENSE.md file for details.

About

A .NET desktop application for managing and comparing many Git repositories side by side. Scans a local development directory, browses GitHub and Azure DevOps remotes, fetches and pulls in bulk, diffs individual files across repositories, and propagates a chosen version of a file to the others.

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ProjectDirector

A desktop application for managing and comparing many Git repositories side by side.

LicenseGitHub commit activityGitHub contributorsGitHub Actions Workflow Status

Introduction

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.

Features

  • 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.

Requirements

  • .NET 9.0
  • Windows (the application uses a Dear ImGui desktop window)

Installation

git clone https://github.com/ktsu-dev/ProjectDirector.git
cd ProjectDirector
dotnet build

Usage

# Run the application
dotnet run
# Publish a distributable build
dotnet publish --configuration Release --output ./staging

On first run, set the development directory that ProjectDirector should scan and supply GitHub credentials if you want remote repositories listed. Both are persisted to the application data folder, so subsequent runs start where you left off.

Typical Workflow

  1. Point ProjectDirector at your development directory.
  2. Let it scan for local clones and fetch the remote repository list.
  3. Select a repository to see its details, or select a file to diff it across every repository that has one.
  4. Choose the version you want to keep and propagate it to the others.
  5. Review the log panel, then commit and push from your normal Git tooling.

Architecture

ComponentResponsibility
ProjectDirectorMain application class: ImGui loop, three-panel layout, and the fetch/pull/diff/propagate operations.
ProjectDirectorOptionsApplication state persisted as JSON — dev directory, credentials, repository cache, and UI state.
GitRepositoryAbstract repository model with polymorphic JSON serialization.
GitHubRepository / AzureDevOpsRepositoryProvider-specific repository implementations.
PopupPropagateFileModal that drives the file propagation flow.
DictionaryOfHashSetsHelper collection for grouping repositories by file hash.

Key Dependencies

PackageUsed for
ktsu.RunCommandRuns the git command line — clone, fetch, pull, status
OctokitGitHub API access
DiffPlexLine-by-line file diffing
ktsu.ImGuiAppApplication shell and window management
ktsu.AppDataStoragePersistent options storage
ktsu.SemanticsType-safe paths and identifiers

Contributing

Contributions are welcome! Feel free to open issues or submit pull requests.

License

This project is licensed under the MIT License. See the LICENSE.md file for details.

About

A .NET desktop application for managing and comparing many Git repositories side by side. Scans a local development directory, browses GitHub and Azure DevOps remotes, fetches and pulls in bulk, diffs individual files across repositories, and propagates a chosen version of a file to the others.

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ProjectDirector

A desktop application for managing and comparing many Git repositories side by side.

LicenseGitHub commit activityGitHub contributorsGitHub Actions Workflow Status

Introduction

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.

Features

  • 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.

Requirements

  • .NET 9.0
  • Windows (the application uses a Dear ImGui desktop window)

Installation

git clone https://github.com/ktsu-dev/ProjectDirector.git
cd ProjectDirector
dotnet build

Usage

# Run the application
dotnet run
# Publish a distributable build
dotnet publish --configuration Release --output ./staging

On first run, set the development directory that ProjectDirector should scan and supply GitHub credentials if you want remote repositories listed. Both are persisted to the application data folder, so subsequent runs start where you left off.

Typical Workflow

  1. Point ProjectDirector at your development directory.
  2. Let it scan for local clones and fetch the remote repository list.
  3. Select a repository to see its details, or select a file to diff it across every repository that has one.
  4. Choose the version you want to keep and propagate it to the others.
  5. Review the log panel, then commit and push from your normal Git tooling.

Architecture

ComponentResponsibility
ProjectDirectorMain application class: ImGui loop, three-panel layout, and the fetch/pull/diff/propagate operations.
ProjectDirectorOptionsApplication state persisted as JSON — dev directory, credentials, repository cache, and UI state.
GitRepositoryAbstract repository model with polymorphic JSON serialization.
GitHubRepository / AzureDevOpsRepositoryProvider-specific repository implementations.
PopupPropagateFileModal that drives the file propagation flow.
DictionaryOfHashSetsHelper collection for grouping repositories by file hash.

Key Dependencies

PackageUsed for
ktsu.RunCommandRuns the git command line — clone, fetch, pull, status
OctokitGitHub API access
DiffPlexLine-by-line file diffing
ktsu.ImGuiAppApplication shell and window management
ktsu.AppDataStoragePersistent options storage
ktsu.SemanticsType-safe paths and identifiers

Contributing

Contributions are welcome! Feel free to open issues or submit pull requests.

License

This project is licensed under the MIT License. See the LICENSE.md file for details.

About

A .NET desktop application for managing and comparing many Git repositories side by side. Scans a local development directory, browses GitHub and Azure DevOps remotes, fetches and pulls in bulk, diffs individual files across repositories, and propagates a chosen version of a file to the others.

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

ProjectDirector

A desktop application for managing and comparing many Git repositories side by side.

LicenseGitHub commit activityGitHub contributorsGitHub Actions Workflow Status

Introduction

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.

Features

  • 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.

Requirements

  • .NET 9.0
  • Windows (the application uses a Dear ImGui desktop window)

Installation

git clone https://github.com/ktsu-dev/ProjectDirector.git
cd ProjectDirector
dotnet build

Usage

# Run the application
dotnet run
# Publish a distributable build
dotnet publish --configuration Release --output ./staging

On first run, set the development directory that ProjectDirector should scan and supply GitHub credentials if you want remote repositories listed. Both are persisted to the application data folder, so subsequent runs start where you left off.

Typical Workflow

  1. Point ProjectDirector at your development directory.
  2. Let it scan for local clones and fetch the remote repository list.
  3. Select a repository to see its details, or select a file to diff it across every repository that has one.
  4. Choose the version you want to keep and propagate it to the others.
  5. Review the log panel, then commit and push from your normal Git tooling.

Architecture

ComponentResponsibility
ProjectDirectorMain application class: ImGui loop, three-panel layout, and the fetch/pull/diff/propagate operations.
ProjectDirectorOptionsApplication state persisted as JSON — dev directory, credentials, repository cache, and UI state.
GitRepositoryAbstract repository model with polymorphic JSON serialization.
GitHubRepository / AzureDevOpsRepositoryProvider-specific repository implementations.
PopupPropagateFileModal that drives the file propagation flow.
DictionaryOfHashSetsHelper collection for grouping repositories by file hash.

Key Dependencies

PackageUsed for
ktsu.RunCommandRuns the git command line — clone, fetch, pull, status
OctokitGitHub API access
DiffPlexLine-by-line file diffing
ktsu.ImGuiAppApplication shell and window management
ktsu.AppDataStoragePersistent options storage
ktsu.SemanticsType-safe paths and identifiers

Contributing

Contributions are welcome! Feel free to open issues or submit pull requests.

License

This project is licensed under the MIT License. See the LICENSE.md file for details.

About

A .NET desktop application for managing and comparing many Git repositories side by side. Scans a local development directory, browses GitHub and Azure DevOps remotes, fetches and pulls in bulk, diffs individual files across repositories, and propagates a chosen version of a file to the others.

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages