DM Desktop Material {{ t.brandSub }}
Ctrl+F · Ctrl+Shift+P · Ctrl+Shift+F

Open in a new tab

Every page already open is left out of this list. Right-click a tab for close, move, and pin commands.

Material 3 · Windows only · active development

Your Git workspace, made Material.

你嘅 Git 工作枱,變成 Material。

Desktop Material reshapes GitHub Desktop around Material 3: adaptive repository controls, browser-like tabs, local versioned settings, multi-account context, and focused native Git workflows in one calm Windows desktop surface.

Desktop Material 用 Material 3 重寫成個 Git 枱面:控制識得自己讓位、分頁似瀏覽器、設定有本地 Git 版本記錄、多身分各有各 context,全部收埋喺一個安靜嘅 Windows 介面。

{{ voice.heroLine }}

  • MIT licensed
  • Local-first
  • Windows-only support
  • Adaptive themes
Desktop Material
Desktop Material showing the app identity header above a repository workspace, with the tab strip and tonal Material surfaces.
A repository-focused shell with profile identity, favorite tabs, adaptive controls, and tonal surfaces.
  • Adaptive Controls respond before they clip.
  • Repository-aware Choices can follow the project.
  • Auditable Settings history stays local and Git-backed.
Automatic Windows install

Get the newest verified release in one line

Open Windows PowerShell 5.1 or PowerShell 7 as your normal user. The tracked installer resolves this repository's latest stable installer release, verifies GitHub's SHA-256 asset digest and any Authenticode signature, installs silently, and cleans up its temporary download.

Microsoft.PowerShell.Utility\Invoke-RestMethod 'https://raw.githubusercontent.com/Ding-Ding-Projects/desktop-material/main/script/install-windows.ps1' | Microsoft.PowerShell.Utility\Invoke-Expression
Current build status, signing, and packaging notes

Current automated builds are unsigned and x64 only. The script reports the unsigned status after digest verification and stops on an unsupported architecture or unverified download. Windows packaging also produces a portable GitHub Desktop-x64.zip beside the installer assets; extract it before running the packaged executable. Review remote code before running it. While Actions builds or packages a newer exact commit, About shows a transient localized “New update coming soon” status. Published automated Release notes list bounded, sanitized commit subjects through that exact release SHA. CI, installer, and Pages runs use unique groups so newer work never cancels or replaces an older running or pending invocation.

The three download buttons resolve through GitHub’s releases/latest/download/ route, so each one always serves the newest published release’s asset — no version is pinned into this page and nothing goes stale between builds.

Material foundation and shipped roadmap

A Material Design 3 shell with verified native workflows

The numbered roadmap extends through M27. Cards marked Verified on main refer to their recorded production UI gates. Exact build, headless, source-publication, installer, Pages, wiki, and corrected serialization receipts remain centralized in HANDOFF.md.

AI-assisted Build & Run Focused checks passed

Choose Codex CLI or OpenCode per repository for a failed build or bounded free-form request. Prompts travel through stdin, install and authentication stay explicit, auto-approve remains separately gated, output and cancellation are bounded, and a real Build & Run rerun—not the agent exit code—decides whether the repair worked. Stop terminates the owned agent and suppresses that rerun.

M3 Expressive shell

Animated light/dark theming, soft elevation, an app bar with an inline pill menu, and floating radius-24 workspace cards.

Material first run Verified on main

A focused Material welcome keeps GitHub.com, Enterprise, and local-only setup inside one responsive task card, with a tonal workspace preview that steps away cleanly on compact windows.

Scope-aware appearance Verified on main

Right-click the actual identity, workspace, toolbar, list, tab strip, code surface, repository name or logo, tab title, feature entry point, or Back control. Its editor opens beside that owner with a dedicated setting, local Git path, and mutable history. Profile and repository values can inherit without sharing a timeline. Ordinary language, theme, and scale stay in Settings; no monolithic repository Appearance tab is required.

Adaptive toolbar Verified on main

When the app bar tightens, Build & Run moves into More first, followed by Commit & Push. Widening the window restores each action automatically before labels can clip.

Icon navigation rail

A left rail for Changes (with a badge), History, Branches, Settings, and your account avatar — plus a floating pill toolbar with repo and branch chips and a sync pill.

Browser-like repo and settings tabs Verified on main

Repository tabs stay bound per-account with inline rename and a Word-style appearance editor — bold, italic, underline, size, font, alignment, plus separate text and background palettes or custom colours. Global Settings, Repository Settings, and Stash Manager now use the same horizontal browser tabs: open, close, overflow, keyboard movement, linked panels, localized labels, and session-safe persistence that does not lose pages when a search temporarily narrows the view.

Guarded tab control Verified on main

Keep the regex close action or review a safe literal close-everything-except query with counts and preview. Pin tabs, drag or move them by keyboard, and apply persistent one-shot label, opened-date, or repository-status ordering. A named group may contain pinned or unpinned tabs, never both, so grouping cannot break the protected pin boundary.

Real multi-account

Multiple identities per host, each with its own tabs, repos, and settings. Switching the active account switches the whole workspace context.

Repository transfer · Repo 轉移

Choose another signed-in GitHub account or organization, keep or rename the repository, then publish every branch and tag with full history or one clean root snapshot. origin changes only after destination verification.

揀另一個已登入嘅 GitHub 身分或者組織,可以保留或者改名;揀完整歷史,或者淨係交一個乾淨新根提交。目的地驗證成功先會改 origin

Versioned settings

Every settings and tab change auto-commits to a local git repo, with a non-modal history side sheet for diffs, undo, redo, and restore. Each action appends an audit commit instead of rewriting history.

Non-modal dialogs

Dialogs float without blocking the app, drag by their headers, cascade, and come to front on focus. Preferences is an MD3 940×660 dialog; wheel and trackpad gestures work anywhere over its content while nested controls keep their own scroll range. Pickers use side sheets. Acknowledgement-only errors default to dismissible red bottom-right notices, while decisions and recovery actions remain dialogs.

Language modes & playfulness Shipped

Every surface renders in English, playful Hong Kong-style Cantonese, or a compact bilingual view, chosen in Settings › Appearance and persisted across restarts. Two independent 1–5 playfulness sliders — one per language — style the voice of every message, errors and warnings included. The level never changes the facts: what happened, which file, and what your options are stay stated in unambiguous words at every level. Scheduled settings add local date/time windows, validated API values, and Home Assistant boolean gating for language, theme, and appearance customization.

Search everywhere Shipped

Filter chips, substring/regex modes, and a full regex builder, plus History search by title, message, tag, or hash and an optional commit ancestry graph. The builder reflows and scrolls vertically at compact or zoomed sizes while its tester and footer remain reachable.

Release- and registry-backed large files 72-way comparison atlas

The dedicated Cheap LFS product guide traces the provider-first pointer-commit handoff, including the first-branch Release anchor exception. A separate comparison atlas maps Cheap LFS against Git LFS across 72 sourced decisions in 12 categories, with row-level receipts, provider-first and pre-push graphics, composable filters, an interactive fit finder, and an exact remote-SHA proof.

More shipped and verified work (titles as recorded on main)
  • Notification centre — Shipped
  • Release history in the app — Shipped
  • Open in your editor — Shipped
  • Spoken narrator & cues — Shipped
  • Dim sum surprise — Shipped
  • Full-app command palette — Verified on main
  • Multi-clone & orgs — Shipped
  • Guided repository functions — Verified on main
  • Compact Repository Releases — 100–200% keyboard gate
  • Background Git reliability — Contained
  • Automation — Shipped
  • GitHub Actions — Verified on main
  • Release test gates — Verified on main
  • GitHub API functions — Hideable · verified on main
  • Guarded run cancellation — Verified on main
  • Reviewed current-branch rebase — Verified on main
  • Reviewed ordinary pull — Exact OID
  • Clone-style submodules — Verified on main
  • Temporary submodule workspaces — No import
  • Native pull requests — Verified on main
  • Effective branch rules — Verified on main
  • Agent access & CLI — Shipped
  • Provider accounts — Shipped
  • Local Ollama models — M23
  • Provider-neutral triage — Verified on main
  • Compact task surfaces — Verified on main
  • Desktop-plus parity — Shipped
  • Multi-window workflows — Shipped
  • Advanced workflows — Verified on main
Take a look

Screenshots

Guided task forms wrap text and stack controls as space narrows, avoiding page-level sideways scrolling; spatial code, diff, and log content is the exception. The current refresh contract targets 95 Windows scenes. The current Launchpad repair and seven representative scenes are below; open one for the full-size capture.

Browse all 95 scenes
The app identity header and repository workspace, with the signed-in profile shown beside the tab strip.
App identity Profile backed
The anchored appearance editor open beside the element it edits, showing typography and colour controls.
Anchored appearance Burst-safe owner history
The command palette listing appearance settings as rich rows with their live controls.
Command palette Full-app · teleport
The command palette showing separate notification centre and notification history commands.
Notification routes Centre · history
Named, colour-coded repository tab groups in the tab strip, one collapsed and one expanded.
Tab groups Persistent · collapsible
The notification centre with several notifications selected and the bulk read, unread, and delete actions enabled.
Notification bulk actions Search · select · clear
The regex builder showing guided constructs, flags, sample text, and live highlighted matches.
Regex builder Compose · test
Launchpad empty state from the built Windows app, with five truthful zero-count groups filling the workspace and no blank sidebar.
Launchpad empty state Full-width · truthful counts

Build with Desktop Material

Clone the repo, read the hosted docs, and explore the M0–M27 Material foundation, native Git/GitHub workflows, and current acceptance status.

Documentation

Every feature has its own file. Every category has an index.

Documentation is split into categorized Markdown files with a README index per category, so a feature can be read on its own without loading the whole manual.

Categories

Start here

Rule coverage on this site

Each rule below renders on this documentation surface, not only inside the application. Open any of them from here.

Docs › Quality and reliability

Every-project regex builder

Every project and every search bar opens a documented, tested full regex builder using its real dialect, while plain-text search stays the default.

The contract

The search bar and the builder synchronize their pattern and flags: what you compose in the builder becomes the active query, and what you type in the bar arrives in the builder. Plain text remains the default mode so an ordinary search never requires regex knowledge.

The dialect must be named

The reference builder uses the JavaScript RegExp dialect and says so on its own surface. Downstream projects must use and identify their own production engine rather than copying that dialect blindly.

Bounded evaluation

Guided constructs, raw editing, flags, sample text, live highlighting and captures, and copy, with worker isolation, fixed input and result bounds, and a 300 ms timeout. Patterns and samples stay in the browser and are not persisted.

Verification

node --check runs on the engine, worker, and builder sources. The regex builder and discussion policy suites then exercise the ECMAScript engine, syntax errors, Unicode, multiline and zero-width behaviour, captures, bounds, truncation, and the worker timeout contract.

Cheap LFS · product guide

The commit stays small. The original file stays.

Cheap LFS pins the heavy bytes with a provider first, then ordinary Git commits a small pointer. The working-tree file you can open is still the real file.

重嘅位先寄去 provider,跟住 Git 只 commit 一個細細嘅指標。你打得開嘅檔案,仲係原本嗰個。

Cheap LFS overview illustration

How it works in one minute

01 Pin with the provider The heavy bytes go to Release storage, GHCR, or Docker Hub before Git sees them.
02 Commit the pointer An ordinary Git commit carries a 370–514 byte pointer, no filter configuration.
03 Push as usual Ordinary git push publishes the pointer. The first branch is the Release anchor exception.
04 Keep the real file Your working tree still holds the original bytes; nothing is swapped out from under you.
Tracking workflow diagram

A pointer is a recipe, not the meal

A 370–514 byte pointer records the object identity, size, provider route, and verification hash. Git stores the recipe; the provider stores the meal.

Pointer anatomy diagram

Pick the route that matches the repository

Release storage

Published prerelease buckets and verified assets. The first branch's Release anchor is the documented exception to provider-first ordering.

GHCR and Docker Hub

One logical OCI image keeps the complete current object set, reusing unchanged blobs and retaining digest-specific tags so older pointers keep resolving.

Private repositories

Off until explicit persisted opt-in. Objects travel as AES-256-GCM chunks and no workflow is installed in the private repository.

Provider routes diagram
Privacy boundary diagram

Restore is verification first, replacement second

Clone and open detection and Materialize all verify and replace old pointer-only working-tree files locally. A fresh UI clone restored 10/10 hashes from 370–514-byte Git pointers.

Commit 712ad85 passed verifier 30054805137.

Restore workflow diagram
Cloud compression diagram

Compression is an optimization, not a trust shortcut

Public repositories prepare the owned compression caller in Changes automatically and run it only after a reviewed commit and push. Private repositories stay off until explicit persisted opt-in and install no workflow in the private repository.

Cloud run 30048474438 — 13 compressed, 0 kept raw, 0 failed, all raw originals retained.

The collaboration contract

Everyone on the team needs the pointer, which arrives with an ordinary fetch. Teammates who intend to restore the bytes also need access to the storage route the pointer names.

Collaboration diagram

When something gets stuck

A transfer fails mid-way

One failed raw file stays retryable while safe changes and verified pointers may still commit. The first HTTP 408 during the 14.8 GB exercise preserved the exact pending SHA for retry.

A large selection needs publishing

Conservative sub-1.5 GB commit and push batches prove each remote tip before the next commit. The Bambu exercise pinned 8,305 files (14,809,588,162 bytes) in four UI-created batches.

A clone shows pointer text

Detection on clone and open offers to verify and replace those files. Materialize does the same explicitly, on demand.

Troubleshooting diagram
Best practices diagram

Good habits

  • Let the provider finish before you commit, except on the first branch's Release anchor.
  • Keep batches under 1.5 GB and prove each remote tip before the next commit.
  • Verify before replacing: hash first, swap second.
  • Treat compression as an optimization; a failed compression stays raw and cloneable.
  • Give restorers storage access, not just repository access.

The full reference

These pages are the tour. Every claim above is written out at length in the documentation.

Integrity and safety diagram
Comparison atlas

Cheap LFS vs Git LFS

The 30-second answer

Neither replaces the other. Choose the operating model.

Git LFS is a hook-driven filter installed in the repository. Cheap LFS is a provider-first pointer commit performed by the application.

Filter the differences without losing the receipts

{{ atlasCount }} rows
{{ row.cat }} {{ row.decision }}
Cheap LFS {{ row.cheap }}
Git LFS {{ row.lfs }}
Receipt · {{ row.receipt }}

Cheap LFS pins first. Then ordinary Git publishes the pointer.

On an established branch the heavy bytes go first, then an ordinary git push carries the pointer. The first branch is the Release anchor exception. Git LFS instead runs its filter during the push itself.

Provider-first push handoff diagram

Fit finder

{{ fitVerdict }}

Receipts

8,305 files · 14,809,588,162 bytes · four UI-created batches

Commit 712ad85 · verifier 30054805137 · 10/10 hashes restored

Cloud run 30048474438 · 13 compressed · 0 raw · 0 failed

Pointer sizes observed: 370–514 bytes

Comparison orbit diagram
Documentation search

Search the whole site

This page shares its query with the app bar's search and with the regex builder. Switching modes here switches them everywhere.

{{ searchCount }} results
DM Desktop Material

An independent Material Design 3 (M3 Expressive) remake of GitHub Desktop. Not affiliated with or endorsed by GitHub.

Project

Repository Documentation Comparison atlas

Upstream

GitHub Desktop desktop-plus
© 2026 Desktop Material contributors. MIT License Built on GitHub Desktop (MIT) & desktop-plus (MIT).
{{ searchCount }} results
{{ paletteCount }} entries. Settings change here without leaving the palette.
{{ row.label }} {{ row.where }} {{ row.value }}

Tab tools

1 · Search the visible strip Collapsed groups are excluded.
2 · Search within groups Includes tabs inside collapsed groups.
3 · Search group names Matches the named group chips.
{{ r.label }} · {{ r.count }}
4 · Search all tabs Every tab in every window state.
Close tabs by text — and its inverse
{{ closeCount }} tabs would close · {{ closeProtected }} protected (pinned or active) and will be kept.
{{ p.label }}

Notifications

{{ notifSelectedCount }} selected
{{ n.title }} {{ n.body }} {{ n.when }}

Export {{ pageTitle }}

Each format carries this page's sections with their titles and body text. Files download locally; nothing is uploaded.

Appearance & language

Playfulness Two independent 1–5 sliders, one per language. The level styles the voice of every message. It never changes the facts: what happened, which file, and what your options are stay stated in unambiguous words at every level.

{{ voice.heroLine }}

Appearance
Theme
Accent colour
Reduce motion Animations on
Higher contrast outlines Stronger borders
Show section tabs Second strip
Per-element appearance Per-element styling lives beside the element it owns: right-click any surface to open its own editor with its own history. {{ customizedCount }} elements on this site currently carry their own styling.

Regex builder

Dialect: JavaScript RegExp (ECMAScript)
Guided constructs

{{ testerError }}

{{ testerCount }} matches (evaluation is bounded to 200 matches and 20,000 characters)
@{{ m.at }} {{ m.text }} {{ m.groups }}
Patterns and samples stay in this browser and are not persisted.

Appearance

Owner: {{ appear.label }}
Every change is stored against this owner only and persists across reloads. Resetting reloads the page to drop the applied styles cleanly.
{{ menuLabel }}
{{ toast.text }}