Manage Microsoft Teams telephony — auto attendants, call queues, and phone numbers — from one desktop app.
PhoneDesk is a self-contained .NET desktop app for administering Microsoft Teams Phone without writing PowerShell.
- Auto attendants, call queues, holidays, resource accounts, and Microsoft 365 Groups
- Guided setup, bulk operations, and tenant documentation
- Native Windows, macOS, and Linux builds with dark and light themes
More screenshots — setup wizard, call queues, auto attendants, holidays, bulk operations, and more
Setup wizard |
Get started |
Call queues |
Auto attendants |
Holidays |
Bulk operations |
Microsoft 365 Groups |
Variables |
Documentation |
Light theme |
Download the latest build from GitHub Releases. PowerShell 7 and the required Microsoft modules are included.
Run phonedesk-win-x64-setup.exe. It supports per-user and all-users
installation and upgrades in place. Until code signing is enabled, Windows may show a
SmartScreen warning.
Portable alternative: download phonedesk-win-x64.zip, extract, run
phonedesk.exe.
For Intune, Configuration Manager, or an RMM:
.\phonedesk-win-x64-setup.exe /ALLUSERS /DIR="C:\Program Files\PhoneDesk" /VERYSILENT /SUPPRESSMSGBOXES /NORESTARTUse /CURRENTUSER for per-user deployment and /DIR="C:\Path" for a managed install
location. Keep the same scope and path when upgrading.
brew tap realgarit/tap
brew trust realgarit/tap
brew install --cask phonedeskUpdate with brew upgrade --cask phonedesk. Manual Apple Silicon and Intel
downloads are also available on the releases page.
Download phonedesk-linux-x64.zip, extract, then:
chmod +x phonedesk
./phonedeskThe app checks GitHub Releases at startup and shows a non-blocking update indicator. On Windows, updates can be downloaded, SHA-256 verified, and installed in the app. macOS and Linux updates continue through Homebrew or GitHub Releases.
Requires the .NET 10 SDK.
dotnet restore
dotnet build
dotnet test PhoneDesk.Tests/PhoneDesk.Tests.csproj
dotnet runBuilt with Avalonia, CommunityToolkit.Mvvm, Microsoft.PowerShell.SDK, and MSAL.
English is the default language. Users can select German in Settings.
When adding user-visible text:
- Add a key to
UiTextKey.cs. - Add the same key to both
Strings.en.jsonandStrings.de.json. - Use
{loc:Translate Key=...}in AXAML andGetTextorLogLocalizedin view models. - Keep placeholders identical in both languages. Use clear operator language and preserve technical commands, identifiers, and native error details.
The localization guard runs during the presentation build and in CI. Run it directly with:
pwsh -NoProfile -File scripts/check-localization.ps1An optional pre-commit hook checks affected localization files before commit. Install it explicitly with
pwsh -NoProfile -File scripts/install-git-hooks.ps1.
Releases use Conventional Commit PR titles. Release Please opens the version PR; merging it creates the tag, release notes, platform packages, and Homebrew update.
The app ships with pinned versions of MicrosoftTeams and the Microsoft.Graph.* modules it
needs, declared in Scripts/module-versions.json. CI reads
this file at build time (Scripts/download-modules.ps1 / .sh) to download exactly those
versions into Modules/, which are bundled into every published build. The pinned versions
are also surfaced in the app itself, in Settings → About, alongside the bundled
PowerShell SDK version.
The module-compatibility.yml workflow runs
weekly (and on manual dispatch) to check the PowerShell Gallery for newer releases of the
pinned modules. When a newer version is found, it bumps module-versions.json, builds and
tests against the update, and opens a pull request if that succeeds (or an issue with the
failure details if it doesn't) — the pins are never bumped automatically without a passing
build.
To bump a pinned version manually: edit Scripts/module-versions.json and either run
Scripts/download-modules.ps1 / .sh locally to re-download Modules/, or just push the
change — the next CI build downloads the updated versions automatically.
MIT © 2026 Patrik Lleshaj. See LICENSE.










