Repository files navigation

Maccord

macOSSwift 6SwiftUINo ElectronLiquid Glass

StarsTop languageCode sizeLast commitPRs welcomeMade with Swift

A truly native macOS Discord client — Swift 6 + SwiftUI, not Electron.

Log in with your own Discord account and get the familiar four‑pane Discord, rendered with Liquid Glass (macOS 26 Tahoe), speaking the Discord v10 REST + Gateway protocols directly — no Chromium, a fraction of the RAM, instant launch.

Maccord running natively on macOS — server rail, channels, chat and member list

Warning

Using a user token from a non‑official client ("self‑botting") violates Discord's Terms of Service and can get your account terminated. Maccord stores your token only on your machine and sends it only to Discord over TLS, but the risk is yours. The same networking layer works with a bot token too if you'd rather stay within ToS.

⚡ Why Maccord?

The official Discord desktop app is an Electron app: it ships an entire copy of Chromium and runs your chat as a web page across half a dozen processes. Maccord is the opposite — a hand‑written native Mac app.

Maccord🌐 Discord (Electron)
EngineNative SwiftUI / AppKitChromium + Node
ProcessesOne~6 (main, GPU, renderers, utility…)
Memory~200 MB (measured)commonly 600 MB – 1.5 GB+
LaunchInstant — no web runtimeCold‑starts a browser
RenderingReal Liquid Glass, 120 HzDOM / CSS in a web view
EnergyLow (native, GPU‑aware)High (full browser)
DiskA few MB150 MB+ payload

It's not a clone or a web wrapper — it talks to Discord's wire protocol itself and draws the UI pixel‑for‑pixel with native views.

✨ Features

🔎 Quick Switcher (⌘K) — search your entire account: every server, every channel, every DM, every friend. Fuzzy, space‑insensitive matching (gamedev finds Game Dev), channels you can't view are filtered out, recents first, arrow‑key + click navigation. It fetches every server's channel list up front so the index is always complete.

🗂️ Servers, channels & DMs

  • Four‑pane layout: rail → sidebar → chat → members
  • Server folders, categories, unread / mention badges
  • Text, announcement, forum, voice, stage & threads
  • DMs, group DMs, friends list with live presence

💬 Messages & composer

  • Full markdown (bold, headers, lists, spoilers, masked links, subtext)
  • Reactions + emoji picker, reaction details
  • Replies, silent replies, forwarding, edit, pins & jump‑to‑pin
  • Message search with filters, jump‑to‑result
  • Drafts, ⌘B/I/U, drag‑drop / paste / file uploads

👥 People, presence & moderation

  • Role colors & hoisting, presence dots, activity, rich profiles
  • Permission‑gated kick / ban / timeout, role assignment
  • Server management: join, invites (expiry / max‑uses), ban list

🪄 Platform polish

  • Settings persistence (prefs, mutes, notif levels, drafts)
  • Native notifications (avatar, click‑to‑jump, focus‑aware)
  • Dock unread badge, ⌘/ shortcut reference, text zoom
  • Token saved across rebuilds — no re‑login every run

📊 Performance

Measured on this machine, a typical Maccord session runs as a single ~200 MB process. Discord's Electron build spawns a Chromium main process plus a GPU process and several renderer / utility processes that together commonly sit well above 600 MB. Maccord has no web runtime to boot, so it launches instantly and idles cheaply.

Numbers vary with how many servers you're in and how much history you've scrolled — Maccord background‑loads channel lists and unread history to keep the switcher and sidebar snappy.

🚀 Install

Download the latest Maccord.app from the Releases page, drag it to /Applications, and launch it. It's ad‑hoc signed, so the first launch may need right‑click → Open (or xattr -dr com.apple.quarantine /Applications/Maccord.app).

Or build from source:

git clone https://github.com/time-attack/maccord.git
cd maccord
swift build && swift test# compile + test the core
scripts/build-app.sh release # assemble dist/Maccord.app (icon + Keychain entitlement)
open dist/Maccord.app

You can also open Package.swift in Xcode and run the maccord scheme.

🔑 Logging in

On first launch, paste your Discord token into the login screen. Your token is saved to the macOS Keychain, with a file‑permission‑protected fallback in ~/Library/Application Support/Maccord/ so that ad‑hoc dev rebuilds don't log you out — later launches connect automatically. Log out from the user panel to wipe both.

🏗️ Architecture

A thin SwiftUI app over a Foundation‑only core library.

Sources/
MaccordCore/ # Foundation only — unit‑testable, no UI
Models/ # Codable Discord types (Snowflake, Guild, Message, …)
Networking/ # actor RESTClient + typed v10 endpoints + rate limiter
Gateway/ # actor GatewaySocket — WebSocket, heartbeat, resume,
# typed AsyncStream<GatewayEvent>
Persistence/ # actor KeychainStore + TokenStore (+ file fallback)
maccord/ # SwiftUI app
State/ # @MainActor @Observable stores + EventApplier
DesignSystem/ # color/layout/type tokens, Liquid Glass, markdown
Views/ # GuildRail · ChannelSidebar · Chat · Members · QuickSwitcher · …
Services/ # ImageCache, notifications, fonts

Data flow:GatewaySocket (actor) yields a Sendable AsyncStream<GatewayEvent> → a single @MainActor pump in AppStateEventApplier mutates the @Observable stores → SwiftUI re‑renders. REST calls flow into the same stores. Full notes in ARCHITECTURE.md.

⌨️ Keyboard shortcuts

KeysActionKeysAction
⌘KQuick Switcher⌘B/I/UBold / italic / underline
⌘UToggle member list⌘=⌘−Text size
⌥↑⌥↓Prev / next channel⌘/Shortcut reference

🚧 Not (yet) implemented

Honest scope — deliberately out of scope for now: voice / video + DAVE E2EE · GIF picker (Tenor/Giphy), Lottie stickers, inline media players · server‑side link unfurling, full forum / stage browsing · edit history, slash commands, audit log, multi‑account switcher, drag‑to‑reorder · full role / emoji editors.



Built from scratch in Swift 6 + SwiftUI for macOS 26 Tahoe · Not affiliated with Discord

About

A repository for maccord

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

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

Maccord

macOSSwift 6SwiftUINo ElectronLiquid Glass

StarsTop languageCode sizeLast commitPRs welcomeMade with Swift

A truly native macOS Discord client — Swift 6 + SwiftUI, not Electron.

Log in with your own Discord account and get the familiar four‑pane Discord, rendered with Liquid Glass (macOS 26 Tahoe), speaking the Discord v10 REST + Gateway protocols directly — no Chromium, a fraction of the RAM, instant launch.

Maccord running natively on macOS — server rail, channels, chat and member list

Warning

Using a user token from a non‑official client ("self‑botting") violates Discord's Terms of Service and can get your account terminated. Maccord stores your token only on your machine and sends it only to Discord over TLS, but the risk is yours. The same networking layer works with a bot token too if you'd rather stay within ToS.

⚡ Why Maccord?

The official Discord desktop app is an Electron app: it ships an entire copy of Chromium and runs your chat as a web page across half a dozen processes. Maccord is the opposite — a hand‑written native Mac app.

Maccord🌐 Discord (Electron)
EngineNative SwiftUI / AppKitChromium + Node
ProcessesOne~6 (main, GPU, renderers, utility…)
Memory~200 MB (measured)commonly 600 MB – 1.5 GB+
LaunchInstant — no web runtimeCold‑starts a browser
RenderingReal Liquid Glass, 120 HzDOM / CSS in a web view
EnergyLow (native, GPU‑aware)High (full browser)
DiskA few MB150 MB+ payload

It's not a clone or a web wrapper — it talks to Discord's wire protocol itself and draws the UI pixel‑for‑pixel with native views.

✨ Features

🔎 Quick Switcher (⌘K) — search your entire account: every server, every channel, every DM, every friend. Fuzzy, space‑insensitive matching (gamedev finds Game Dev), channels you can't view are filtered out, recents first, arrow‑key + click navigation. It fetches every server's channel list up front so the index is always complete.

🗂️ Servers, channels & DMs

  • Four‑pane layout: rail → sidebar → chat → members
  • Server folders, categories, unread / mention badges
  • Text, announcement, forum, voice, stage & threads
  • DMs, group DMs, friends list with live presence

💬 Messages & composer

  • Full markdown (bold, headers, lists, spoilers, masked links, subtext)
  • Reactions + emoji picker, reaction details
  • Replies, silent replies, forwarding, edit, pins & jump‑to‑pin
  • Message search with filters, jump‑to‑result
  • Drafts, ⌘B/I/U, drag‑drop / paste / file uploads

👥 People, presence & moderation

  • Role colors & hoisting, presence dots, activity, rich profiles
  • Permission‑gated kick / ban / timeout, role assignment
  • Server management: join, invites (expiry / max‑uses), ban list

🪄 Platform polish

  • Settings persistence (prefs, mutes, notif levels, drafts)
  • Native notifications (avatar, click‑to‑jump, focus‑aware)
  • Dock unread badge, ⌘/ shortcut reference, text zoom
  • Token saved across rebuilds — no re‑login every run

📊 Performance

Measured on this machine, a typical Maccord session runs as a single ~200 MB process. Discord's Electron build spawns a Chromium main process plus a GPU process and several renderer / utility processes that together commonly sit well above 600 MB. Maccord has no web runtime to boot, so it launches instantly and idles cheaply.

Numbers vary with how many servers you're in and how much history you've scrolled — Maccord background‑loads channel lists and unread history to keep the switcher and sidebar snappy.

🚀 Install

Download the latest Maccord.app from the Releases page, drag it to /Applications, and launch it. It's ad‑hoc signed, so the first launch may need right‑click → Open (or xattr -dr com.apple.quarantine /Applications/Maccord.app).

Or build from source:

git clone https://github.com/time-attack/maccord.git
cd maccord
swift build && swift test# compile + test the core
scripts/build-app.sh release # assemble dist/Maccord.app (icon + Keychain entitlement)
open dist/Maccord.app

You can also open Package.swift in Xcode and run the maccord scheme.

🔑 Logging in

On first launch, paste your Discord token into the login screen. Your token is saved to the macOS Keychain, with a file‑permission‑protected fallback in ~/Library/Application Support/Maccord/ so that ad‑hoc dev rebuilds don't log you out — later launches connect automatically. Log out from the user panel to wipe both.

🏗️ Architecture

A thin SwiftUI app over a Foundation‑only core library.

Sources/
MaccordCore/ # Foundation only — unit‑testable, no UI
Models/ # Codable Discord types (Snowflake, Guild, Message, …)
Networking/ # actor RESTClient + typed v10 endpoints + rate limiter
Gateway/ # actor GatewaySocket — WebSocket, heartbeat, resume,
# typed AsyncStream<GatewayEvent>
Persistence/ # actor KeychainStore + TokenStore (+ file fallback)
maccord/ # SwiftUI app
State/ # @MainActor @Observable stores + EventApplier
DesignSystem/ # color/layout/type tokens, Liquid Glass, markdown
Views/ # GuildRail · ChannelSidebar · Chat · Members · QuickSwitcher · …
Services/ # ImageCache, notifications, fonts

Data flow:GatewaySocket (actor) yields a Sendable AsyncStream<GatewayEvent> → a single @MainActor pump in AppStateEventApplier mutates the @Observable stores → SwiftUI re‑renders. REST calls flow into the same stores. Full notes in ARCHITECTURE.md.

⌨️ Keyboard shortcuts

KeysActionKeysAction
⌘KQuick Switcher⌘B/I/UBold / italic / underline
⌘UToggle member list⌘=⌘−Text size
⌥↑⌥↓Prev / next channel⌘/Shortcut reference

🚧 Not (yet) implemented

Honest scope — deliberately out of scope for now: voice / video + DAVE E2EE · GIF picker (Tenor/Giphy), Lottie stickers, inline media players · server‑side link unfurling, full forum / stage browsing · edit history, slash commands, audit log, multi‑account switcher, drag‑to‑reorder · full role / emoji editors.



Built from scratch in Swift 6 + SwiftUI for macOS 26 Tahoe · Not affiliated with Discord

About

A repository for maccord

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

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

Maccord

macOSSwift 6SwiftUINo ElectronLiquid Glass

StarsTop languageCode sizeLast commitPRs welcomeMade with Swift

A truly native macOS Discord client — Swift 6 + SwiftUI, not Electron.

Log in with your own Discord account and get the familiar four‑pane Discord, rendered with Liquid Glass (macOS 26 Tahoe), speaking the Discord v10 REST + Gateway protocols directly — no Chromium, a fraction of the RAM, instant launch.

Maccord running natively on macOS — server rail, channels, chat and member list

Warning

Using a user token from a non‑official client ("self‑botting") violates Discord's Terms of Service and can get your account terminated. Maccord stores your token only on your machine and sends it only to Discord over TLS, but the risk is yours. The same networking layer works with a bot token too if you'd rather stay within ToS.

⚡ Why Maccord?

The official Discord desktop app is an Electron app: it ships an entire copy of Chromium and runs your chat as a web page across half a dozen processes. Maccord is the opposite — a hand‑written native Mac app.

Maccord🌐 Discord (Electron)
EngineNative SwiftUI / AppKitChromium + Node
ProcessesOne~6 (main, GPU, renderers, utility…)
Memory~200 MB (measured)commonly 600 MB – 1.5 GB+
LaunchInstant — no web runtimeCold‑starts a browser
RenderingReal Liquid Glass, 120 HzDOM / CSS in a web view
EnergyLow (native, GPU‑aware)High (full browser)
DiskA few MB150 MB+ payload

It's not a clone or a web wrapper — it talks to Discord's wire protocol itself and draws the UI pixel‑for‑pixel with native views.

✨ Features

🔎 Quick Switcher (⌘K) — search your entire account: every server, every channel, every DM, every friend. Fuzzy, space‑insensitive matching (gamedev finds Game Dev), channels you can't view are filtered out, recents first, arrow‑key + click navigation. It fetches every server's channel list up front so the index is always complete.

🗂️ Servers, channels & DMs

  • Four‑pane layout: rail → sidebar → chat → members
  • Server folders, categories, unread / mention badges
  • Text, announcement, forum, voice, stage & threads
  • DMs, group DMs, friends list with live presence

💬 Messages & composer

  • Full markdown (bold, headers, lists, spoilers, masked links, subtext)
  • Reactions + emoji picker, reaction details
  • Replies, silent replies, forwarding, edit, pins & jump‑to‑pin
  • Message search with filters, jump‑to‑result
  • Drafts, ⌘B/I/U, drag‑drop / paste / file uploads

👥 People, presence & moderation

  • Role colors & hoisting, presence dots, activity, rich profiles
  • Permission‑gated kick / ban / timeout, role assignment
  • Server management: join, invites (expiry / max‑uses), ban list

🪄 Platform polish

  • Settings persistence (prefs, mutes, notif levels, drafts)
  • Native notifications (avatar, click‑to‑jump, focus‑aware)
  • Dock unread badge, ⌘/ shortcut reference, text zoom
  • Token saved across rebuilds — no re‑login every run

📊 Performance

Measured on this machine, a typical Maccord session runs as a single ~200 MB process. Discord's Electron build spawns a Chromium main process plus a GPU process and several renderer / utility processes that together commonly sit well above 600 MB. Maccord has no web runtime to boot, so it launches instantly and idles cheaply.

Numbers vary with how many servers you're in and how much history you've scrolled — Maccord background‑loads channel lists and unread history to keep the switcher and sidebar snappy.

🚀 Install

Download the latest Maccord.app from the Releases page, drag it to /Applications, and launch it. It's ad‑hoc signed, so the first launch may need right‑click → Open (or xattr -dr com.apple.quarantine /Applications/Maccord.app).

Or build from source:

git clone https://github.com/time-attack/maccord.git
cd maccord
swift build && swift test# compile + test the core
scripts/build-app.sh release # assemble dist/Maccord.app (icon + Keychain entitlement)
open dist/Maccord.app

You can also open Package.swift in Xcode and run the maccord scheme.

🔑 Logging in

On first launch, paste your Discord token into the login screen. Your token is saved to the macOS Keychain, with a file‑permission‑protected fallback in ~/Library/Application Support/Maccord/ so that ad‑hoc dev rebuilds don't log you out — later launches connect automatically. Log out from the user panel to wipe both.

🏗️ Architecture

A thin SwiftUI app over a Foundation‑only core library.

Sources/
MaccordCore/ # Foundation only — unit‑testable, no UI
Models/ # Codable Discord types (Snowflake, Guild, Message, …)
Networking/ # actor RESTClient + typed v10 endpoints + rate limiter
Gateway/ # actor GatewaySocket — WebSocket, heartbeat, resume,
# typed AsyncStream<GatewayEvent>
Persistence/ # actor KeychainStore + TokenStore (+ file fallback)
maccord/ # SwiftUI app
State/ # @MainActor @Observable stores + EventApplier
DesignSystem/ # color/layout/type tokens, Liquid Glass, markdown
Views/ # GuildRail · ChannelSidebar · Chat · Members · QuickSwitcher · …
Services/ # ImageCache, notifications, fonts

Data flow:GatewaySocket (actor) yields a Sendable AsyncStream<GatewayEvent> → a single @MainActor pump in AppStateEventApplier mutates the @Observable stores → SwiftUI re‑renders. REST calls flow into the same stores. Full notes in ARCHITECTURE.md.

⌨️ Keyboard shortcuts

KeysActionKeysAction
⌘KQuick Switcher⌘B/I/UBold / italic / underline
⌘UToggle member list⌘=⌘−Text size
⌥↑⌥↓Prev / next channel⌘/Shortcut reference

🚧 Not (yet) implemented

Honest scope — deliberately out of scope for now: voice / video + DAVE E2EE · GIF picker (Tenor/Giphy), Lottie stickers, inline media players · server‑side link unfurling, full forum / stage browsing · edit history, slash commands, audit log, multi‑account switcher, drag‑to‑reorder · full role / emoji editors.



Built from scratch in Swift 6 + SwiftUI for macOS 26 Tahoe · Not affiliated with Discord

About

A repository for maccord

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

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

Maccord

macOSSwift 6SwiftUINo ElectronLiquid Glass

StarsTop languageCode sizeLast commitPRs welcomeMade with Swift

A truly native macOS Discord client — Swift 6 + SwiftUI, not Electron.

Log in with your own Discord account and get the familiar four‑pane Discord, rendered with Liquid Glass (macOS 26 Tahoe), speaking the Discord v10 REST + Gateway protocols directly — no Chromium, a fraction of the RAM, instant launch.

Maccord running natively on macOS — server rail, channels, chat and member list

Warning

Using a user token from a non‑official client ("self‑botting") violates Discord's Terms of Service and can get your account terminated. Maccord stores your token only on your machine and sends it only to Discord over TLS, but the risk is yours. The same networking layer works with a bot token too if you'd rather stay within ToS.

⚡ Why Maccord?

The official Discord desktop app is an Electron app: it ships an entire copy of Chromium and runs your chat as a web page across half a dozen processes. Maccord is the opposite — a hand‑written native Mac app.

Maccord🌐 Discord (Electron)
EngineNative SwiftUI / AppKitChromium + Node
ProcessesOne~6 (main, GPU, renderers, utility…)
Memory~200 MB (measured)commonly 600 MB – 1.5 GB+
LaunchInstant — no web runtimeCold‑starts a browser
RenderingReal Liquid Glass, 120 HzDOM / CSS in a web view
EnergyLow (native, GPU‑aware)High (full browser)
DiskA few MB150 MB+ payload

It's not a clone or a web wrapper — it talks to Discord's wire protocol itself and draws the UI pixel‑for‑pixel with native views.

✨ Features

🔎 Quick Switcher (⌘K) — search your entire account: every server, every channel, every DM, every friend. Fuzzy, space‑insensitive matching (gamedev finds Game Dev), channels you can't view are filtered out, recents first, arrow‑key + click navigation. It fetches every server's channel list up front so the index is always complete.

🗂️ Servers, channels & DMs

  • Four‑pane layout: rail → sidebar → chat → members
  • Server folders, categories, unread / mention badges
  • Text, announcement, forum, voice, stage & threads
  • DMs, group DMs, friends list with live presence

💬 Messages & composer

  • Full markdown (bold, headers, lists, spoilers, masked links, subtext)
  • Reactions + emoji picker, reaction details
  • Replies, silent replies, forwarding, edit, pins & jump‑to‑pin
  • Message search with filters, jump‑to‑result
  • Drafts, ⌘B/I/U, drag‑drop / paste / file uploads

👥 People, presence & moderation

  • Role colors & hoisting, presence dots, activity, rich profiles
  • Permission‑gated kick / ban / timeout, role assignment
  • Server management: join, invites (expiry / max‑uses), ban list

🪄 Platform polish

  • Settings persistence (prefs, mutes, notif levels, drafts)
  • Native notifications (avatar, click‑to‑jump, focus‑aware)
  • Dock unread badge, ⌘/ shortcut reference, text zoom
  • Token saved across rebuilds — no re‑login every run

📊 Performance

Measured on this machine, a typical Maccord session runs as a single ~200 MB process. Discord's Electron build spawns a Chromium main process plus a GPU process and several renderer / utility processes that together commonly sit well above 600 MB. Maccord has no web runtime to boot, so it launches instantly and idles cheaply.

Numbers vary with how many servers you're in and how much history you've scrolled — Maccord background‑loads channel lists and unread history to keep the switcher and sidebar snappy.

🚀 Install

Download the latest Maccord.app from the Releases page, drag it to /Applications, and launch it. It's ad‑hoc signed, so the first launch may need right‑click → Open (or xattr -dr com.apple.quarantine /Applications/Maccord.app).

Or build from source:

git clone https://github.com/time-attack/maccord.git
cd maccord
swift build && swift test# compile + test the core
scripts/build-app.sh release # assemble dist/Maccord.app (icon + Keychain entitlement)
open dist/Maccord.app

You can also open Package.swift in Xcode and run the maccord scheme.

🔑 Logging in

On first launch, paste your Discord token into the login screen. Your token is saved to the macOS Keychain, with a file‑permission‑protected fallback in ~/Library/Application Support/Maccord/ so that ad‑hoc dev rebuilds don't log you out — later launches connect automatically. Log out from the user panel to wipe both.

🏗️ Architecture

A thin SwiftUI app over a Foundation‑only core library.

Sources/
MaccordCore/ # Foundation only — unit‑testable, no UI
Models/ # Codable Discord types (Snowflake, Guild, Message, …)
Networking/ # actor RESTClient + typed v10 endpoints + rate limiter
Gateway/ # actor GatewaySocket — WebSocket, heartbeat, resume,
# typed AsyncStream<GatewayEvent>
Persistence/ # actor KeychainStore + TokenStore (+ file fallback)
maccord/ # SwiftUI app
State/ # @MainActor @Observable stores + EventApplier
DesignSystem/ # color/layout/type tokens, Liquid Glass, markdown
Views/ # GuildRail · ChannelSidebar · Chat · Members · QuickSwitcher · …
Services/ # ImageCache, notifications, fonts

Data flow:GatewaySocket (actor) yields a Sendable AsyncStream<GatewayEvent> → a single @MainActor pump in AppStateEventApplier mutates the @Observable stores → SwiftUI re‑renders. REST calls flow into the same stores. Full notes in ARCHITECTURE.md.

⌨️ Keyboard shortcuts

KeysActionKeysAction
⌘KQuick Switcher⌘B/I/UBold / italic / underline
⌘UToggle member list⌘=⌘−Text size
⌥↑⌥↓Prev / next channel⌘/Shortcut reference

🚧 Not (yet) implemented

Honest scope — deliberately out of scope for now: voice / video + DAVE E2EE · GIF picker (Tenor/Giphy), Lottie stickers, inline media players · server‑side link unfurling, full forum / stage browsing · edit history, slash commands, audit log, multi‑account switcher, drag‑to‑reorder · full role / emoji editors.



Built from scratch in Swift 6 + SwiftUI for macOS 26 Tahoe · Not affiliated with Discord

About

A repository for maccord

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

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

Maccord

macOSSwift 6SwiftUINo ElectronLiquid Glass

StarsTop languageCode sizeLast commitPRs welcomeMade with Swift

A truly native macOS Discord client — Swift 6 + SwiftUI, not Electron.

Log in with your own Discord account and get the familiar four‑pane Discord, rendered with Liquid Glass (macOS 26 Tahoe), speaking the Discord v10 REST + Gateway protocols directly — no Chromium, a fraction of the RAM, instant launch.

Maccord running natively on macOS — server rail, channels, chat and member list

Warning

Using a user token from a non‑official client ("self‑botting") violates Discord's Terms of Service and can get your account terminated. Maccord stores your token only on your machine and sends it only to Discord over TLS, but the risk is yours. The same networking layer works with a bot token too if you'd rather stay within ToS.

⚡ Why Maccord?

The official Discord desktop app is an Electron app: it ships an entire copy of Chromium and runs your chat as a web page across half a dozen processes. Maccord is the opposite — a hand‑written native Mac app.

Maccord🌐 Discord (Electron)
EngineNative SwiftUI / AppKitChromium + Node
ProcessesOne~6 (main, GPU, renderers, utility…)
Memory~200 MB (measured)commonly 600 MB – 1.5 GB+
LaunchInstant — no web runtimeCold‑starts a browser
RenderingReal Liquid Glass, 120 HzDOM / CSS in a web view
EnergyLow (native, GPU‑aware)High (full browser)
DiskA few MB150 MB+ payload

It's not a clone or a web wrapper — it talks to Discord's wire protocol itself and draws the UI pixel‑for‑pixel with native views.

✨ Features

🔎 Quick Switcher (⌘K) — search your entire account: every server, every channel, every DM, every friend. Fuzzy, space‑insensitive matching (gamedev finds Game Dev), channels you can't view are filtered out, recents first, arrow‑key + click navigation. It fetches every server's channel list up front so the index is always complete.

🗂️ Servers, channels & DMs

  • Four‑pane layout: rail → sidebar → chat → members
  • Server folders, categories, unread / mention badges
  • Text, announcement, forum, voice, stage & threads
  • DMs, group DMs, friends list with live presence

💬 Messages & composer

  • Full markdown (bold, headers, lists, spoilers, masked links, subtext)
  • Reactions + emoji picker, reaction details
  • Replies, silent replies, forwarding, edit, pins & jump‑to‑pin
  • Message search with filters, jump‑to‑result
  • Drafts, ⌘B/I/U, drag‑drop / paste / file uploads

👥 People, presence & moderation

  • Role colors & hoisting, presence dots, activity, rich profiles
  • Permission‑gated kick / ban / timeout, role assignment
  • Server management: join, invites (expiry / max‑uses), ban list

🪄 Platform polish

  • Settings persistence (prefs, mutes, notif levels, drafts)
  • Native notifications (avatar, click‑to‑jump, focus‑aware)
  • Dock unread badge, ⌘/ shortcut reference, text zoom
  • Token saved across rebuilds — no re‑login every run

📊 Performance

Measured on this machine, a typical Maccord session runs as a single ~200 MB process. Discord's Electron build spawns a Chromium main process plus a GPU process and several renderer / utility processes that together commonly sit well above 600 MB. Maccord has no web runtime to boot, so it launches instantly and idles cheaply.

Numbers vary with how many servers you're in and how much history you've scrolled — Maccord background‑loads channel lists and unread history to keep the switcher and sidebar snappy.

🚀 Install

Download the latest Maccord.app from the Releases page, drag it to /Applications, and launch it. It's ad‑hoc signed, so the first launch may need right‑click → Open (or xattr -dr com.apple.quarantine /Applications/Maccord.app).

Or build from source:

git clone https://github.com/time-attack/maccord.git
cd maccord
swift build && swift test# compile + test the core
scripts/build-app.sh release # assemble dist/Maccord.app (icon + Keychain entitlement)
open dist/Maccord.app

You can also open Package.swift in Xcode and run the maccord scheme.

🔑 Logging in

On first launch, paste your Discord token into the login screen. Your token is saved to the macOS Keychain, with a file‑permission‑protected fallback in ~/Library/Application Support/Maccord/ so that ad‑hoc dev rebuilds don't log you out — later launches connect automatically. Log out from the user panel to wipe both.

🏗️ Architecture

A thin SwiftUI app over a Foundation‑only core library.

Sources/
MaccordCore/ # Foundation only — unit‑testable, no UI
Models/ # Codable Discord types (Snowflake, Guild, Message, …)
Networking/ # actor RESTClient + typed v10 endpoints + rate limiter
Gateway/ # actor GatewaySocket — WebSocket, heartbeat, resume,
# typed AsyncStream<GatewayEvent>
Persistence/ # actor KeychainStore + TokenStore (+ file fallback)
maccord/ # SwiftUI app
State/ # @MainActor @Observable stores + EventApplier
DesignSystem/ # color/layout/type tokens, Liquid Glass, markdown
Views/ # GuildRail · ChannelSidebar · Chat · Members · QuickSwitcher · …
Services/ # ImageCache, notifications, fonts

Data flow:GatewaySocket (actor) yields a Sendable AsyncStream<GatewayEvent> → a single @MainActor pump in AppStateEventApplier mutates the @Observable stores → SwiftUI re‑renders. REST calls flow into the same stores. Full notes in ARCHITECTURE.md.

⌨️ Keyboard shortcuts

KeysActionKeysAction
⌘KQuick Switcher⌘B/I/UBold / italic / underline
⌘UToggle member list⌘=⌘−Text size
⌥↑⌥↓Prev / next channel⌘/Shortcut reference

🚧 Not (yet) implemented

Honest scope — deliberately out of scope for now: voice / video + DAVE E2EE · GIF picker (Tenor/Giphy), Lottie stickers, inline media players · server‑side link unfurling, full forum / stage browsing · edit history, slash commands, audit log, multi‑account switcher, drag‑to‑reorder · full role / emoji editors.



Built from scratch in Swift 6 + SwiftUI for macOS 26 Tahoe · Not affiliated with Discord

About

A repository for maccord

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

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

Maccord

macOSSwift 6SwiftUINo ElectronLiquid Glass

StarsTop languageCode sizeLast commitPRs welcomeMade with Swift

A truly native macOS Discord client — Swift 6 + SwiftUI, not Electron.

Log in with your own Discord account and get the familiar four‑pane Discord, rendered with Liquid Glass (macOS 26 Tahoe), speaking the Discord v10 REST + Gateway protocols directly — no Chromium, a fraction of the RAM, instant launch.

Maccord running natively on macOS — server rail, channels, chat and member list

Warning

Using a user token from a non‑official client ("self‑botting") violates Discord's Terms of Service and can get your account terminated. Maccord stores your token only on your machine and sends it only to Discord over TLS, but the risk is yours. The same networking layer works with a bot token too if you'd rather stay within ToS.

⚡ Why Maccord?

The official Discord desktop app is an Electron app: it ships an entire copy of Chromium and runs your chat as a web page across half a dozen processes. Maccord is the opposite — a hand‑written native Mac app.

Maccord🌐 Discord (Electron)
EngineNative SwiftUI / AppKitChromium + Node
ProcessesOne~6 (main, GPU, renderers, utility…)
Memory~200 MB (measured)commonly 600 MB – 1.5 GB+
LaunchInstant — no web runtimeCold‑starts a browser
RenderingReal Liquid Glass, 120 HzDOM / CSS in a web view
EnergyLow (native, GPU‑aware)High (full browser)
DiskA few MB150 MB+ payload

It's not a clone or a web wrapper — it talks to Discord's wire protocol itself and draws the UI pixel‑for‑pixel with native views.

✨ Features

🔎 Quick Switcher (⌘K) — search your entire account: every server, every channel, every DM, every friend. Fuzzy, space‑insensitive matching (gamedev finds Game Dev), channels you can't view are filtered out, recents first, arrow‑key + click navigation. It fetches every server's channel list up front so the index is always complete.

🗂️ Servers, channels & DMs

  • Four‑pane layout: rail → sidebar → chat → members
  • Server folders, categories, unread / mention badges
  • Text, announcement, forum, voice, stage & threads
  • DMs, group DMs, friends list with live presence

💬 Messages & composer

  • Full markdown (bold, headers, lists, spoilers, masked links, subtext)
  • Reactions + emoji picker, reaction details
  • Replies, silent replies, forwarding, edit, pins & jump‑to‑pin
  • Message search with filters, jump‑to‑result
  • Drafts, ⌘B/I/U, drag‑drop / paste / file uploads

👥 People, presence & moderation

  • Role colors & hoisting, presence dots, activity, rich profiles
  • Permission‑gated kick / ban / timeout, role assignment
  • Server management: join, invites (expiry / max‑uses), ban list

🪄 Platform polish

  • Settings persistence (prefs, mutes, notif levels, drafts)
  • Native notifications (avatar, click‑to‑jump, focus‑aware)
  • Dock unread badge, ⌘/ shortcut reference, text zoom
  • Token saved across rebuilds — no re‑login every run

📊 Performance

Measured on this machine, a typical Maccord session runs as a single ~200 MB process. Discord's Electron build spawns a Chromium main process plus a GPU process and several renderer / utility processes that together commonly sit well above 600 MB. Maccord has no web runtime to boot, so it launches instantly and idles cheaply.

Numbers vary with how many servers you're in and how much history you've scrolled — Maccord background‑loads channel lists and unread history to keep the switcher and sidebar snappy.

🚀 Install

Download the latest Maccord.app from the Releases page, drag it to /Applications, and launch it. It's ad‑hoc signed, so the first launch may need right‑click → Open (or xattr -dr com.apple.quarantine /Applications/Maccord.app).

Or build from source:

git clone https://github.com/time-attack/maccord.git
cd maccord
swift build && swift test# compile + test the core
scripts/build-app.sh release # assemble dist/Maccord.app (icon + Keychain entitlement)
open dist/Maccord.app

You can also open Package.swift in Xcode and run the maccord scheme.

🔑 Logging in

On first launch, paste your Discord token into the login screen. Your token is saved to the macOS Keychain, with a file‑permission‑protected fallback in ~/Library/Application Support/Maccord/ so that ad‑hoc dev rebuilds don't log you out — later launches connect automatically. Log out from the user panel to wipe both.

🏗️ Architecture

A thin SwiftUI app over a Foundation‑only core library.

Sources/
MaccordCore/ # Foundation only — unit‑testable, no UI
Models/ # Codable Discord types (Snowflake, Guild, Message, …)
Networking/ # actor RESTClient + typed v10 endpoints + rate limiter
Gateway/ # actor GatewaySocket — WebSocket, heartbeat, resume,
# typed AsyncStream<GatewayEvent>
Persistence/ # actor KeychainStore + TokenStore (+ file fallback)
maccord/ # SwiftUI app
State/ # @MainActor @Observable stores + EventApplier
DesignSystem/ # color/layout/type tokens, Liquid Glass, markdown
Views/ # GuildRail · ChannelSidebar · Chat · Members · QuickSwitcher · …
Services/ # ImageCache, notifications, fonts

Data flow:GatewaySocket (actor) yields a Sendable AsyncStream<GatewayEvent> → a single @MainActor pump in AppStateEventApplier mutates the @Observable stores → SwiftUI re‑renders. REST calls flow into the same stores. Full notes in ARCHITECTURE.md.

⌨️ Keyboard shortcuts

KeysActionKeysAction
⌘KQuick Switcher⌘B/I/UBold / italic / underline
⌘UToggle member list⌘=⌘−Text size
⌥↑⌥↓Prev / next channel⌘/Shortcut reference

🚧 Not (yet) implemented

Honest scope — deliberately out of scope for now: voice / video + DAVE E2EE · GIF picker (Tenor/Giphy), Lottie stickers, inline media players · server‑side link unfurling, full forum / stage browsing · edit history, slash commands, audit log, multi‑account switcher, drag‑to‑reorder · full role / emoji editors.



Built from scratch in Swift 6 + SwiftUI for macOS 26 Tahoe · Not affiliated with Discord

About

A repository for maccord

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

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

Maccord

macOSSwift 6SwiftUINo ElectronLiquid Glass

StarsTop languageCode sizeLast commitPRs welcomeMade with Swift

A truly native macOS Discord client — Swift 6 + SwiftUI, not Electron.

Log in with your own Discord account and get the familiar four‑pane Discord, rendered with Liquid Glass (macOS 26 Tahoe), speaking the Discord v10 REST + Gateway protocols directly — no Chromium, a fraction of the RAM, instant launch.

Maccord running natively on macOS — server rail, channels, chat and member list

Warning

Using a user token from a non‑official client ("self‑botting") violates Discord's Terms of Service and can get your account terminated. Maccord stores your token only on your machine and sends it only to Discord over TLS, but the risk is yours. The same networking layer works with a bot token too if you'd rather stay within ToS.

⚡ Why Maccord?

The official Discord desktop app is an Electron app: it ships an entire copy of Chromium and runs your chat as a web page across half a dozen processes. Maccord is the opposite — a hand‑written native Mac app.

Maccord🌐 Discord (Electron)
EngineNative SwiftUI / AppKitChromium + Node
ProcessesOne~6 (main, GPU, renderers, utility…)
Memory~200 MB (measured)commonly 600 MB – 1.5 GB+
LaunchInstant — no web runtimeCold‑starts a browser
RenderingReal Liquid Glass, 120 HzDOM / CSS in a web view
EnergyLow (native, GPU‑aware)High (full browser)
DiskA few MB150 MB+ payload

It's not a clone or a web wrapper — it talks to Discord's wire protocol itself and draws the UI pixel‑for‑pixel with native views.

✨ Features

🔎 Quick Switcher (⌘K) — search your entire account: every server, every channel, every DM, every friend. Fuzzy, space‑insensitive matching (gamedev finds Game Dev), channels you can't view are filtered out, recents first, arrow‑key + click navigation. It fetches every server's channel list up front so the index is always complete.

🗂️ Servers, channels & DMs

  • Four‑pane layout: rail → sidebar → chat → members
  • Server folders, categories, unread / mention badges
  • Text, announcement, forum, voice, stage & threads
  • DMs, group DMs, friends list with live presence

💬 Messages & composer

  • Full markdown (bold, headers, lists, spoilers, masked links, subtext)
  • Reactions + emoji picker, reaction details
  • Replies, silent replies, forwarding, edit, pins & jump‑to‑pin
  • Message search with filters, jump‑to‑result
  • Drafts, ⌘B/I/U, drag‑drop / paste / file uploads

👥 People, presence & moderation

  • Role colors & hoisting, presence dots, activity, rich profiles
  • Permission‑gated kick / ban / timeout, role assignment
  • Server management: join, invites (expiry / max‑uses), ban list

🪄 Platform polish

  • Settings persistence (prefs, mutes, notif levels, drafts)
  • Native notifications (avatar, click‑to‑jump, focus‑aware)
  • Dock unread badge, ⌘/ shortcut reference, text zoom
  • Token saved across rebuilds — no re‑login every run

📊 Performance

Measured on this machine, a typical Maccord session runs as a single ~200 MB process. Discord's Electron build spawns a Chromium main process plus a GPU process and several renderer / utility processes that together commonly sit well above 600 MB. Maccord has no web runtime to boot, so it launches instantly and idles cheaply.

Numbers vary with how many servers you're in and how much history you've scrolled — Maccord background‑loads channel lists and unread history to keep the switcher and sidebar snappy.

🚀 Install

Download the latest Maccord.app from the Releases page, drag it to /Applications, and launch it. It's ad‑hoc signed, so the first launch may need right‑click → Open (or xattr -dr com.apple.quarantine /Applications/Maccord.app).

Or build from source:

git clone https://github.com/time-attack/maccord.git
cd maccord
swift build && swift test# compile + test the core
scripts/build-app.sh release # assemble dist/Maccord.app (icon + Keychain entitlement)
open dist/Maccord.app

You can also open Package.swift in Xcode and run the maccord scheme.

🔑 Logging in

On first launch, paste your Discord token into the login screen. Your token is saved to the macOS Keychain, with a file‑permission‑protected fallback in ~/Library/Application Support/Maccord/ so that ad‑hoc dev rebuilds don't log you out — later launches connect automatically. Log out from the user panel to wipe both.

🏗️ Architecture

A thin SwiftUI app over a Foundation‑only core library.

Sources/
MaccordCore/ # Foundation only — unit‑testable, no UI
Models/ # Codable Discord types (Snowflake, Guild, Message, …)
Networking/ # actor RESTClient + typed v10 endpoints + rate limiter
Gateway/ # actor GatewaySocket — WebSocket, heartbeat, resume,
# typed AsyncStream<GatewayEvent>
Persistence/ # actor KeychainStore + TokenStore (+ file fallback)
maccord/ # SwiftUI app
State/ # @MainActor @Observable stores + EventApplier
DesignSystem/ # color/layout/type tokens, Liquid Glass, markdown
Views/ # GuildRail · ChannelSidebar · Chat · Members · QuickSwitcher · …
Services/ # ImageCache, notifications, fonts

Data flow:GatewaySocket (actor) yields a Sendable AsyncStream<GatewayEvent> → a single @MainActor pump in AppStateEventApplier mutates the @Observable stores → SwiftUI re‑renders. REST calls flow into the same stores. Full notes in ARCHITECTURE.md.

⌨️ Keyboard shortcuts

KeysActionKeysAction
⌘KQuick Switcher⌘B/I/UBold / italic / underline
⌘UToggle member list⌘=⌘−Text size
⌥↑⌥↓Prev / next channel⌘/Shortcut reference

🚧 Not (yet) implemented

Honest scope — deliberately out of scope for now: voice / video + DAVE E2EE · GIF picker (Tenor/Giphy), Lottie stickers, inline media players · server‑side link unfurling, full forum / stage browsing · edit history, slash commands, audit log, multi‑account switcher, drag‑to‑reorder · full role / emoji editors.



Built from scratch in Swift 6 + SwiftUI for macOS 26 Tahoe · Not affiliated with Discord

About

A repository for maccord

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

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

Maccord

macOSSwift 6SwiftUINo ElectronLiquid Glass

StarsTop languageCode sizeLast commitPRs welcomeMade with Swift

A truly native macOS Discord client — Swift 6 + SwiftUI, not Electron.

Log in with your own Discord account and get the familiar four‑pane Discord, rendered with Liquid Glass (macOS 26 Tahoe), speaking the Discord v10 REST + Gateway protocols directly — no Chromium, a fraction of the RAM, instant launch.

Maccord running natively on macOS — server rail, channels, chat and member list

Warning

Using a user token from a non‑official client ("self‑botting") violates Discord's Terms of Service and can get your account terminated. Maccord stores your token only on your machine and sends it only to Discord over TLS, but the risk is yours. The same networking layer works with a bot token too if you'd rather stay within ToS.

⚡ Why Maccord?

The official Discord desktop app is an Electron app: it ships an entire copy of Chromium and runs your chat as a web page across half a dozen processes. Maccord is the opposite — a hand‑written native Mac app.

Maccord🌐 Discord (Electron)
EngineNative SwiftUI / AppKitChromium + Node
ProcessesOne~6 (main, GPU, renderers, utility…)
Memory~200 MB (measured)commonly 600 MB – 1.5 GB+
LaunchInstant — no web runtimeCold‑starts a browser
RenderingReal Liquid Glass, 120 HzDOM / CSS in a web view
EnergyLow (native, GPU‑aware)High (full browser)
DiskA few MB150 MB+ payload

It's not a clone or a web wrapper — it talks to Discord's wire protocol itself and draws the UI pixel‑for‑pixel with native views.

✨ Features

🔎 Quick Switcher (⌘K) — search your entire account: every server, every channel, every DM, every friend. Fuzzy, space‑insensitive matching (gamedev finds Game Dev), channels you can't view are filtered out, recents first, arrow‑key + click navigation. It fetches every server's channel list up front so the index is always complete.

🗂️ Servers, channels & DMs

  • Four‑pane layout: rail → sidebar → chat → members
  • Server folders, categories, unread / mention badges
  • Text, announcement, forum, voice, stage & threads
  • DMs, group DMs, friends list with live presence

💬 Messages & composer

  • Full markdown (bold, headers, lists, spoilers, masked links, subtext)
  • Reactions + emoji picker, reaction details
  • Replies, silent replies, forwarding, edit, pins & jump‑to‑pin
  • Message search with filters, jump‑to‑result
  • Drafts, ⌘B/I/U, drag‑drop / paste / file uploads

👥 People, presence & moderation

  • Role colors & hoisting, presence dots, activity, rich profiles
  • Permission‑gated kick / ban / timeout, role assignment
  • Server management: join, invites (expiry / max‑uses), ban list

🪄 Platform polish

  • Settings persistence (prefs, mutes, notif levels, drafts)
  • Native notifications (avatar, click‑to‑jump, focus‑aware)
  • Dock unread badge, ⌘/ shortcut reference, text zoom
  • Token saved across rebuilds — no re‑login every run

📊 Performance

Measured on this machine, a typical Maccord session runs as a single ~200 MB process. Discord's Electron build spawns a Chromium main process plus a GPU process and several renderer / utility processes that together commonly sit well above 600 MB. Maccord has no web runtime to boot, so it launches instantly and idles cheaply.

Numbers vary with how many servers you're in and how much history you've scrolled — Maccord background‑loads channel lists and unread history to keep the switcher and sidebar snappy.

🚀 Install

Download the latest Maccord.app from the Releases page, drag it to /Applications, and launch it. It's ad‑hoc signed, so the first launch may need right‑click → Open (or xattr -dr com.apple.quarantine /Applications/Maccord.app).

Or build from source:

git clone https://github.com/time-attack/maccord.git
cd maccord
swift build && swift test# compile + test the core
scripts/build-app.sh release # assemble dist/Maccord.app (icon + Keychain entitlement)
open dist/Maccord.app

You can also open Package.swift in Xcode and run the maccord scheme.

🔑 Logging in

On first launch, paste your Discord token into the login screen. Your token is saved to the macOS Keychain, with a file‑permission‑protected fallback in ~/Library/Application Support/Maccord/ so that ad‑hoc dev rebuilds don't log you out — later launches connect automatically. Log out from the user panel to wipe both.

🏗️ Architecture

A thin SwiftUI app over a Foundation‑only core library.

Sources/
MaccordCore/ # Foundation only — unit‑testable, no UI
Models/ # Codable Discord types (Snowflake, Guild, Message, …)
Networking/ # actor RESTClient + typed v10 endpoints + rate limiter
Gateway/ # actor GatewaySocket — WebSocket, heartbeat, resume,
# typed AsyncStream<GatewayEvent>
Persistence/ # actor KeychainStore + TokenStore (+ file fallback)
maccord/ # SwiftUI app
State/ # @MainActor @Observable stores + EventApplier
DesignSystem/ # color/layout/type tokens, Liquid Glass, markdown
Views/ # GuildRail · ChannelSidebar · Chat · Members · QuickSwitcher · …
Services/ # ImageCache, notifications, fonts

Data flow:GatewaySocket (actor) yields a Sendable AsyncStream<GatewayEvent> → a single @MainActor pump in AppStateEventApplier mutates the @Observable stores → SwiftUI re‑renders. REST calls flow into the same stores. Full notes in ARCHITECTURE.md.

⌨️ Keyboard shortcuts

KeysActionKeysAction
⌘KQuick Switcher⌘B/I/UBold / italic / underline
⌘UToggle member list⌘=⌘−Text size
⌥↑⌥↓Prev / next channel⌘/Shortcut reference

🚧 Not (yet) implemented

Honest scope — deliberately out of scope for now: voice / video + DAVE E2EE · GIF picker (Tenor/Giphy), Lottie stickers, inline media players · server‑side link unfurling, full forum / stage browsing · edit history, slash commands, audit log, multi‑account switcher, drag‑to‑reorder · full role / emoji editors.



Built from scratch in Swift 6 + SwiftUI for macOS 26 Tahoe · Not affiliated with Discord

About

A repository for maccord

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages