Every Microsoft 365 change, in one place.
Built by Florian Salzmann & Jannik Reinhard
A free, 100% client-side dashboard that tracks every Microsoft 365 change and lays it out clearly — filter by product, status, release phase, cloud and platform, search instantly, and follow a release timeline per product.
Built from Microsoft's public Microsoft 365 roadmap (~1,800+ changes across 37 products) and — optionally — your own tenant's Message Center via Microsoft Graph. The index is refreshed daily by a GitHub Action and deployed on Cloudflare Pages.
Independent project — not affiliated with Microsoft. Roadmap and Message Center data is © Microsoft Corporation. Microsoft, Microsoft 365, Azure, Entra and Intune are trademarks of Microsoft Corporation.
Microsoft ships a relentless stream of M365 changes, scattered across the roadmap and the Message Center. MCD collapses that into one fast, readable dashboard:
- Timeline per product — a release schedule for each product, laid out across calendar quarters and colour-coded by status.
- Faceted filters — combine product, status (In development / Rolling out / Launched), release phase, platform and cloud. Counts update live; every view is shareable by URL.
- Instant search — type any feature, product or keyword and MCD ranks matching changes across the whole index (typo- and acronym-tolerant).
- Status at a glance — availability and preview dates surface right on each card; click for the full description and a link to the source.
- 100% client-side PWA — the whole index ships with the page, nothing is sent anywhere, installable and works offline.
MCD combines two sources into one index (window.MCD.DATA):
| Source | Auth | Default | Notes |
|---|---|---|---|
| Public Microsoft 365 roadmap | none | on | https://www.microsoft.com/releasecommunications/api/v1/m365 — the feed behind the public roadmap. |
| Tenant Message Center | Microsoft Graph (app-only) | off | Your org's Message Center posts via /admin/serviceAnnouncement/messages (ServiceMessage.Read.All). |
⚠️ Privacy note: the Message Center feed is off by default. If you enable it, your tenant's Message Center posts are baked intodata/changes.jsand published on your site. Only enable it on a deployment you're comfortable making public (or keep the repo/site private).
The running app is a static site — plain HTML, CSS and ES5-style vanilla JavaScript on the window.MCD namespace, with no build step and zero runtime dependencies.
data/changes.jsdefineswindow.MCD.DATA(the change index),window.MCD.PRODUCTS(per-product display metadata:label,color, monogramtag,count) andwindow.MCD.META(counts + build date).js/search.jsbuilds a lightweight in-memory index and answers ranked text queries (window.MCD.search.query).js/app.jspowers the dashboard (faceted sidebar, list + timeline views, detail drawer);js/landing.jspowers the marketing page's live demo. Both sharejs/util.jsandjs/icons.js.sw.jsprecaches the app shell for offline use (and serves the daily-updateddata/changes.jsnetwork-first so returning visitors stay current).
The index is generated, not hand-edited:
(scripts) (output)
data/raw/roadmap.json ── fetch-roadmap.mjs ─┐
data/raw/mc/*.json ── fetch-mc.mjs (opt) ─┤── build-data.mjs ──▶ data/changes.js
│ window.MCD.DATA / PRODUCTS / META
Regenerate locally:
node scripts/fetch-roadmap.mjs # pull the public roadmap -> data/raw/roadmap.json
node scripts/build-data.mjs # normalize + merge -> data/changes.jsThe build is deterministic (no network, no randomness apart from the build date), so the same inputs always produce the same data/changes.js.
Pure static files — any static server works:
python3 -m http.server 8080 # then open http://localhost:8080
# or: npx serve .No npm install, no bundler. (A service worker / PWA install needs a secure context — https:// or http://localhost.)
The recommended setup is commit → Cloudflare Pages auto-build (no Cloudflare secrets in GitHub):
- Cloudflare Pages → Create a project → Connect to Git → pick this repo.
- Framework preset: None. Build command: (empty). Build output directory:
/(the repo root is the site).
- Framework preset: None. Build command: (empty). Build output directory:
- GitHub Action (
.github/workflows/update-data.yml) runs daily, fetches the roadmap, rebuildsdata/changes.js, and commits it. Each push triggers a Cloudflare Pages deploy automatically.
Any other static host works too (GitHub Pages, Netlify, S3 + CloudFront) — there is no server-side logic.
- Register an Entra app with the application Graph permission
ServiceMessage.Read.All(grant admin consent). - Add repository secrets:
MC_TENANT_ID,MC_CLIENT_ID,MC_CLIENT_SECRET. - That's it — the daily workflow's "Fetch tenant Message Center" step is a no-op without the secrets and starts merging Message Center posts once they're set. (See the privacy note above.)
MCD/
├── index.html # Landing page (SEO, JSON-LD, OG, live demo)
├── app.html # Dashboard shell (search, filters, list + timeline, drawer)
├── manifest.webmanifest # PWA manifest
├── sw.js # Service worker — offline shell, network-first data
├── favicon.svg / icon.svg # Brand mark (green tile + ascending bars + pulse dot)
├── og-image.png # 1200×630 social card (rendered from og-image.svg)
├── og-image.svg # Social card source
├── _headers / _redirects # Cloudflare Pages cache headers + clean-URL aliases
├── robots.txt / sitemap.xml / llms.txt
├── css/
│ ├── landing.css # Landing design tokens, brand, sections
│ └── app.css # App chrome, sidebar, cards, timeline, drawer
├── assets/fonts/manrope.woff2
├── data/
│ ├── changes.js # Generated index: window.MCD.DATA / PRODUCTS / META
│ └── raw/
│ ├── roadmap.json # Fetched public roadmap (committed)
│ └── mc/ # Optional tenant Message Center pulls (git-ignored)
├── scripts/
│ ├── fetch-roadmap.mjs # Pull the public M365 roadmap
│ ├── fetch-mc.mjs # OPTIONAL: pull tenant Message Center via Graph
│ └── build-data.mjs # Deterministic index builder
├── .github/workflows/
│ └── update-data.yml # Daily fetch + build + commit
└── js/
├── util.js # window.MCD helpers (escape, debounce, dates)
├── icons.js # SVG set, status metadata, product tiles
├── search.js # window.MCD.search — ranking engine
├── app.js # Dashboard UI
└── landing.js # Theme/nav + hero live demo
Scripts load as classic <script src> tags in dependency order — no ES modules, no bundler for the running app.
- Vanilla HTML / CSS / JavaScript — ES5-style IIFE modules on
window.MCD,'use strict'. Every value reaching the DOM is escaped viaMCD.util. - No framework, no build step for the running app; the only Node usage is the offline data builder.
- PWA — installable, offline-capable, self-hosted Manrope font, no CDN or external requests.
- Themes — dark (default) and light, toggled via
<html data-theme>and persisted inlocalStorage.
Free, independent, privacy-first tools for Microsoft admins — explore them all at msnugget.com.
| Tool | What it does |
|---|---|
| CMTrace.dev | Web-based CMTrace / ConfigMgr log viewer |
| MSFinder | Find any Microsoft admin portal setting in one search |
| MSChanges | Track every change to Microsoft's documentation |
| ⭐ M365 Change Digest | Every Microsoft 365 roadmap & Message Center change in one place · you are here |
| Error Hunter | Resolve any Intune / Windows error code |
- Data: the Microsoft 365 public roadmap (release-communications feed) and, optionally, the Microsoft Graph service-announcement API.
- Product logos from the MIT-licensed dashboard-icons set, supplemented by svgl and Wikimedia Commons for products it doesn't cover; the few products without an available logo use a coloured monogram. All product names and logos are trademarks of their respective owners.
- Part of the msnugget brand family.
- Built by Florian Salzmann & Jannik Reinhard.
- Source: github.com/FlorianSLZ/MCD.
MIT.
MCD is an independent project and is not affiliated with, endorsed by, or sponsored by Microsoft Corporation. All product names and the underlying roadmap/Message Center data are property of their respective owners. MCD does not distribute any Microsoft binaries or proprietary code; it only organizes and links to publicly available information (and, where you explicitly configure it, your own tenant's data).