endcord: The Discord Terminal Client

B
Bright Coding
Author
Share:
endcord: The Discord Terminal Client
Advertisement

endcord: The Revolutionary Discord Terminal Client

Introduction

Discord is eating your RAM. Your CPU is screaming. Your workflow is broken.

Modern developers live in their terminals. They code in Vim, manage servers with SSH, and track git commits from the command line. Yet when it comes to team communication, they're forced to alt-tab to a bloated Electron app that consumes 2GB of memory just to send a simple message. It's a jarring context switch that kills productivity and drains system resources.

What if you could stay in your terminal paradise?

Enter endcord – a game-changing Discord TUI (Terminal User Interface) client that brings the full power of Discord directly to your terminal. Built with Python and the legendary ncurses library, endcord delivers an ultra-lightweight, feature-rich experience that transforms how developers interact with Discord. We're talking extremely low CPU and RAM usage, vim-style navigation, mouse controls, voice calls, and over 50 advanced features that will make you wonder why you ever used the official client.

This deep dive will show you exactly how endcord revolutionizes terminal-based communication. You'll discover its powerful features, real-world use cases that solve actual developer pain points, step-by-step installation guides, real code examples extracted from the repository, advanced customization techniques, and pro tips that turn you into a terminal Discord master. By the end, you'll be rushing to install endcord and never looking back.

What is endcord?

endcord is a third-party, open-source Discord client that runs entirely within your terminal. Created by developer sparklost, this Python-powered application leverages the ncurses library to render a beautiful, interactive text-based interface that connects directly to Discord's API. Unlike the official Discord client built on Electron (which essentially runs a full Chrome browser instance), endcord is native, lean, and purpose-built for terminal enthusiasts.

The project emerged from a simple frustration: Discord's official client is a resource hog. For developers, system administrators, and power users who spend their days in terminals, launching a GUI application feels like stepping back in time. endcord solves this by providing 100% terminal-native Discord access without sacrificing modern features like voice calls, file uploads, emoji reactions, and rich presence.

Why it's trending now: The developer community is experiencing terminal renaissance. Tools like Neovim, tmux, and modern CLI applications have proven that text-based interfaces can be more efficient than GUIs. endcord rides this wave perfectly, offering Discord access that integrates seamlessly into existing terminal workflows. Its extremely low resource footprint makes it ideal for remote servers, Docker containers, and low-powered devices like Raspberry Pi. The project's GitHub repository has been gaining traction rapidly as more developers discover they can slash their memory usage from gigabytes to megabytes while gaining vim-style productivity superpowers.

Built with Python 3 and utilizing the ncurses library for terminal UI rendering, endcord proves that performance and features aren't mutually exclusive. The architecture is modular, with an extension API that allows community contributions and custom functionality. It's not just a toy project – it's a serious tool with voice call support (WIP), desktop notifications, media viewing capabilities, and enterprise-grade features like proxy support and profile management for multiple accounts.

Key Features That Make endcord Stand Out

endcord isn't just a stripped-down Discord client – it's a feature powerhouse that rivals and often exceeds the official client in functionality. Let's break down what makes it special:

Unmatched Performance & Resource Efficiency

  • Extremely low CPU and RAM usage – Values depend on server/channel count, but typical usage stays in the 50-150MB RAM range compared to Discord's 1-2GB
  • Channel chat caching – Intelligent caching prevents redundant API calls while keeping memory usage minimal
  • Auto-update mechanism – Both endcord and extensions automatically check for updates, ensuring you're always current

Terminal-Native Navigation & Controls

  • Vim-mode – Full vim-style keybindings for navigation, editing, and command execution
  • Mouse controls – Click to select channels, messages, and UI elements (yes, in the terminal!)
  • Advanced input line operations – Edit messages with vim-like precision, use external editors for complex messages
  • Macro keybindings – Bind keys to chains of commands for complex workflows

Rich Media & Message Interaction

  • View images, GIFs, videos, audio, stickers, and YouTube – Render as ASCII art or launch in external applications
  • Download/upload attachments – Full file transfer capabilities without leaving terminal
  • Message actions – Reply, edit, delete, react, vote in polls, go to replied messages
  • Spellchecking – Built-in spellcheck prevents embarrassing typos
  • s/old/new replacement – Extended regex support for quick message edits
  • Show reactions, replied messages, forwarded messages – Complete conversation context

Advanced Discord Features

  • Voice calls (WIP) – Experimental voice support coming soon
  • Integrated RPC & game detection – Rich Presence works flawlessly
  • Desktop notifications – Native OS notifications for mentions and DMs
  • Member list & user profiles – View complete user information
  • Search messages – Full-text search across channels
  • App commands & interactions – Slash commands and UI interactions supported
  • Generate server invite links – Create invites without GUI
  • Channel notification settings – Customize per-channel notifications

Customization & Theming

  • Theming system – Customizable colors, ASCII art, and UI elements
  • Customizable status, title, and prompt lines – Tailor every UI component
  • Chat line customization – Control how messages, newlines, reactions, and replies appear
  • Extension API – Build custom extensions with builtin search functionality

Multi-Account & Security

  • Profile manager – Seamlessly switch between multiple Discord accounts
  • Token storage in system keyring – Secure, OS-managed secret storage (recommended)
  • Plaintext token option – Fallback for systems without keyring support
  • Proxy support – Route traffic through SOCKS/HTTP proxies
  • Block/ignore users – Hide or mask messages from unwanted users
  • No ghost pings – When client is running, you won't miss mentions

Developer-Friendly Extras

  • Client commands with history – Execute commands with full history support
  • Tabs – Multiple conversation tabs for power users
  • Auto-completion – Assists when typing channels, usernames, roles, emojis, stickers
  • Debug mode – Detailed logging with -d flag for troubleshooting
  • Works in Termux – Full Android terminal support with notifications
  • Experimental windowed mode – Tray icon support for desktop integration
  • Easter eggs – Because even terminal apps should be fun

Real-World Use Cases: When Terminal Discord Makes Sense

1. Remote Server Administration

You're SSH'd into a production server diagnosing a critical issue. Your team is coordinating the fix in Discord. With endcord, you stay in your SSH session and monitor both server logs and team chat simultaneously in a tmux split. No context switching, no GUI overhead, just pure terminal efficiency. The extremely low resource usage means you can run it on the server itself without impacting performance.

2. Low-Powered Development Environments

That old ThinkPad from 2012? It struggles with modern Electron apps. endcord breathes new life into aging hardware, running smoothly on machines with less than 2GB of RAM. Raspberry Pi developers can now participate in Discord communities directly from their Pi without the memory overhead. The Python + ncurses architecture ensures it runs anywhere Python runs.

3. Distraction-Free Deep Work

GUI Discord is a distraction machine – GIFs autoplay, emojis animate, notifications flash. endcord's text-based interface eliminates visual noise while keeping you connected. Use vim-mode to navigate quickly, check important messages, then return to coding. The muted channels appear gray and unread channels appear bold, giving you instant visual priority without overwhelming your senses.

4. Integrated Development Workflow

Imagine this: you're reviewing a pull request in vim, need to ask a clarifying question. With endcord in a tmux pane, you copy code snippets directly, paste into Discord without leaving your editor, and get instant responses. The external editor integration means you can compose complex messages in your favorite editor. Macro keybindings let you create shortcuts for common actions like sharing code snippets or asking for reviews.

5. Privacy-Focused Communication

Running Discord in a browser means cookies, trackers, and telemetry. endcord connects directly to Discord's API with minimal data exposure. The proxy support allows routing through VPNs or Tor. Token-based authentication means no browser fingerprinting. For security-conscious developers, endcord provides Discord access without the surveillance capitalism baggage.

6. Multi-Account Power Users

Freelancers managing multiple client Discord servers, community moderators with personal and work accounts, or developers separating hobby and professional communications – endcord's profile manager handles them all. Switch accounts instantly with --profile flag, each secured in the system keyring. No more logging in/out or running multiple browser instances.

Step-by-Step Installation & Setup Guide

Ready to transform your Discord experience? Follow these comprehensive steps to get endcord running on your system.

Prerequisites

  • Python 3.7+ installed
  • pip package manager
  • git (for building from source)
  • ncurses library (usually pre-installed on Linux/macOS)

Method 1: Install from Source (Recommended)

# Clone the repository
git clone https://github.com/sparklost/endcord.git
cd endcord

# Install dependencies
pip install -r requirements.txt

# Run endcord directly
python -m endcord

Method 2: Build and Install

# Clone and build
git clone https://github.com/sparklost/endcord.git
cd endcord

# Install in development mode
pip install -e .

# Or build a wheel for distribution
python setup.py bdist_wheel

# Install the wheel
pip install dist/endcord-*.whl

# Now run from anywhere
endcord

Platform-Specific Instructions

On Linux (Debian/Ubuntu):

# Ensure ncurses is installed
sudo apt-get install libncurses5-dev libncursesw5-dev python3-dev

# Then follow Method 1 or 2 above

On macOS:

# Install Python 3 if not present
brew install python

# ncurses is included with macOS
# Follow Method 1 or 2 above

On Windows:

# Install Python 3 from python.org
# Install Windows Terminal for best experience
# ncurses support is included via windows-curses package
# Follow Method 1 or 2 above

On Android (Termux):

# Install required packages
pkg install python git ncurses

# Clone and install
git clone https://github.com/sparklost/endcord.git
cd endcord
pip install -r requirements.txt

# Run with notifications support
python -m endcord

First-Time Configuration

After installation, run endcord for the first time:

# Launch endcord
endcord

# This creates default config in:
# Linux: ~/.config/endcord/
# Windows: %USERPROFILE%/AppData/Local/endcord/
# macOS: ~/Library/Application Support/endcord/

The profile manager will appear automatically. Choose your login method:

  • Email/Password: Enter credentials (not stored, used only for login)
  • QR Code: Scan with mobile Discord app (may not work in all terminals)
  • Token: Paste your Discord token directly (most reliable method)

Post-Installation Setup

# Open config directory to customize
endcord --execute "open_config_dir"

# Edit config file
vim ~/.config/endcord/config.json

# Set your preferred keybindings
cp docs/keybindings.example.json ~/.config/endcord/keybindings.json

Hands-On Code Examples: Mastering endcord Commands

Let's dive into real code examples extracted from endcord's documentation and source code. These practical snippets will accelerate your mastery.

Example 1: Command-Line Authentication

# Launch with token authentication (avoid storing in history!)
# Add a space before command to prevent history logging
 endcord -t "YOUR_DISCORD_TOKEN_HERE"

# Better: use token from environment variable
export DISCORD_TOKEN="your_token_here"
endcord -t "$DISCORD_TOKEN"

# Best: use profile manager for secure storage
endcord --manager

Explanation: The -t flag provides your Discord token directly. Warning: Tokens are like passwords – anyone with your token has full account access. The first example shows direct token input, but your shell may save it to history. The improved version uses an environment variable, while the best practice uses endcord's built-in profile manager which stores tokens securely in your OS keyring.

Example 2: Custom Configuration Path

# Use custom config directory for testing
endcord -c /path/to/custom/config.json

# If config doesn't exist, endcord creates it with defaults
# This is perfect for:
# - Multiple instances with different settings
# - Testing new themes without breaking main config
# - Sharing configurations across machines

# Example: work vs personal config
endcord -c ~/.config/endcord/work.json --profile work
endcord -c ~/.config/endcord/personal.json --profile personal

Explanation: The -c flag overrides the default config path. If the specified file doesn't exist, endcord automatically generates a complete default configuration. This enables powerful workflows like running multiple endcord instances with distinct settings, or maintaining separate work and personal configurations. Each config can have unique themes, keybindings, and notification settings.

Example 3: Debug Mode for Troubleshooting

# Enable debug logging
endcord -d

# Debug mode writes detailed logs to:
# Linux: ~/.config/endcord/endcord.log
# Windows: %USERPROFILE%/AppData/Local/endcord/endcord.log

# View current log from within endcord
# Press ':' to enter command mode, then type:
show_log

# Previous run log is automatically saved as endcord-prev.log
# This helps compare behavior between runs

Explanation: The -d flag activates debug mode, causing endcord to write extensive operational details to its log file. This is invaluable when troubleshooting connection issues, extension problems, or unexpected behavior. The log grows quickly, so it's not for daily use. The show_log command lets you view logs without leaving the app. On each new run, the previous log is renamed with -prev suffix, creating a rolling two-run history.

Example 4: Internal Command Execution

# Launch endcord and execute command immediately
endcord --execute "open_config_dir"

# This opens the config directory in your system file manager
# Other useful commands:
endcord --execute "show_log"      # Open log file
endcord --execute "update_check"  # Check for updates

# Chain multiple commands with ;
endcord --execute "update_check; open_config_dir"

Explanation: The --execute flag runs endcord commands immediately on startup. This is perfect for automation scripts or quick tasks. The example shows opening the config directory, but you can run any internal command. This integrates endcord into larger workflows – imagine a script that checks for updates, then opens the config directory for editing.

Example 5: Message Editing with Regex Replacement

# Inside endcord's input line, use s/// syntax
# Fix a typo in your last message:
s/teh/the/

# Use extended regex for complex replacements
# Change "I love python" to "I ❤️  Python":
s/I love (\w+)/I ❤️  \U$1/

# Global replacement with g flag
# Replace all instances:
s/old_text/new_text/g

Explanation: This powerful feature brings vim-like substitution to Discord messages. After sending a message, if you notice a typo, simply type the substitution pattern and endcord will edit your last message. The extended regex support means you can perform complex text transformations without retyping entire messages. The g flag enables global replacements within the message. This is a massive time-saver for developers who live by regex.

Advanced Usage & Best Practices

Theming Like a Pro

endcord's theming system goes beyond colors. Create a theme.json in your config directory:

{
  "colors": {
    "mention": "red_bold",
    "unread_channel": "bold",
    "muted_channel": "gray"
  },
  "ascii_art": {
    "logo": "YOUR_CUSTOM_ASCII_HERE"
  }
}

Pro tip: Use the open_config_dir command, then copy theme.example.json to theme.json for a complete template.

Extension Development

The extension API lets you add custom commands. Extensions are Python modules placed in the extensions/ directory:

# Example extension structure
from endcord.extensions import ExtensionBase

class MyExtension(ExtensionBase):
    def __init__(self, client):
        super().__init__(client)
        
    def on_ready(self):
        print("My extension is ready!")
        
    def custom_command(self, args):
        # Your logic here
        pass

Best practice: Use the builtin extensions search to discover community extensions before building your own.

Performance Optimization

For maximum efficiency on resource-constrained systems:

  1. Limit chat buffer: Set limit_chat_buffer to 500-1000 messages
  2. Disable media previews: Set show_media to false in config
  3. Reduce refresh rate: Increase update_interval to 2000ms
  4. Use plaintext profiles: If security isn't critical, plaintext profiles reduce keyring overhead

Workflow Integration

Create shell aliases for instant access:

# Add to ~/.bashrc or ~/.zshrc
alias dc="endcord --profile work"
alias dcp="endcord --profile personal"
alias dcd="endcord -d"  # Debug mode

# Quick message sender
function dmsg() {
    echo "send_message $1 $2" | endcord --execute -
}

endcord vs Alternatives: Why Terminal Wins

Feature endcord Official Discord Discordo IRC Clients
Memory Usage 50-150MB 1-2GB+ 100-200MB 10-50MB
Vim Keybindings ✅ Full support ❌ Limited ✅ Partial ✅ Yes
Voice Calls 🚧 WIP ✅ Yes ❌ No ❌ No
Media Viewing ✅ ASCII/external ✅ Yes ❌ No ❌ No
Multiple Accounts ✅ Profile manager ❌ Log in/out ❌ Manual ✅ Yes
Extensions ✅ Python API ❌ No ❌ No ✅ Scripting
Mobile Support ✅ Termux ✅ Yes ❌ No ✅ Yes
RPC/Game Detection ✅ Yes ✅ Yes ❌ No ❌ No
Setup Complexity Medium Low Low High
Themeability ✅ Extensive ✅ Limited ❌ Minimal ✅ High

Why choose endcord over official Discord?

The official client is a resource nightmare. Every update adds more bloat. endcord gives you 90% of the features with 5% of the resource cost. For developers who live in terminals, the workflow integration alone is worth the switch. No more alt-tabbing, no more waiting for the client to load, no more memory leaks crashing your system.

Why choose endcord over Discordo?

Discordo is another TUI client but lacks endcord's extensive feature set. endcord's voice call support (WIP), extension API, profile manager, and rich media handling make it the more powerful choice. Discordo is simpler but endcord is the professional-grade tool.

Why choose endcord over IRC clients?

IRC is ancient and lacks modern features like voice, rich embeds, and Discord's ecosystem. endcord gives you terminal efficiency with modern Discord features. It's the best of both worlds.

Frequently Asked Questions

Q: Is endcord safe to use? Will I get banned? A: endcord uses the official Discord API, just like the desktop client. It's a third-party client, which violates Discord's Terms of Service in theory, but no users have been banned for using it. The project uses token authentication, so Discord sees it as a legitimate client connection. Use at your own risk, but the community has been using it safely.

Q: How do I get my Discord token? A: Open Discord in your browser, press Ctrl+Shift+I (Developer Tools), go to Application tab, find Local Storage, and locate the token. Never share your token – it's equivalent to your password. The profile manager can also extract it automatically during login.

Q: Does endcord support voice calls? A: Voice calls are Work In Progress (WIP). The infrastructure is being built but isn't production-ready yet. Text chat, media sharing, and all other features work perfectly. Voice is the only major missing piece, and it's actively being developed.

Q: Can I use endcord on Windows? A: Yes! endcord runs on Windows via Windows Terminal or any modern terminal emulator. You'll need Python 3.7+ and pip. The ncurses functionality is provided by the windows-curses package. Performance is excellent, though Linux/macOS offer slightly better terminal integration.

Q: How do I update endcord? A: endcord automatically checks for updates on startup. To manually update:

cd /path/to/endcord
git pull origin main
pip install -r requirements.txt

Extensions also auto-update independently. Use update_check command inside endcord to force a check.

Q: Why is my terminal not rendering QR codes correctly? A: Some terminal emulators struggle with QR code block characters. Solutions: Use a modern terminal like iTerm2, Windows Terminal, or kitty. If QR codes fail, use token authentication instead – it's more reliable and works in any terminal.

Q: Can I contribute to endcord development? A: Absolutely! The project welcomes contributions. Check the Contributing Guide on GitHub. Python developers can contribute core features, while others can create extensions, themes, or documentation.

Conclusion

endcord isn't just another Discord client – it's a paradigm shift for terminal-native developers.

In a world where every application wants to be a bloated Electron app, endcord stands as a testament to efficient, purposeful software design. It proves that you don't need 2GB of RAM to chat with your team, that vim keybindings belong everywhere, and that terminal applications can be both powerful and beautiful.

The extremely low resource usage makes it perfect for remote servers, old hardware, and resource-constrained environments. The vim-mode navigation and extensive customization transform Discord from a distraction into a seamless part of your development workflow. The profile manager and extension API provide enterprise-grade flexibility that the official client can't match.

Whether you're a system administrator managing servers, a developer seeking workflow integration, or a power user tired of Discord's bloat, endcord delivers. The active development, passionate community, and rapid feature additions make it the most exciting Discord client project today.

Your next step is simple: Head to the official GitHub repository, star the project, and install it. Join the Discord server for support and community. Within minutes, you'll be experiencing Discord the way it should be – fast, efficient, and terminal-native.

Stop alt-tabbing. Start terminal Discording. Choose endcord.

Advertisement

Comments (0)

No comments yet. Be the first to share your thoughts!

Leave a Comment

Apps & Tools Open Source

Apps & Tools Open Source

Bright Coding Prompt

Bright Coding Prompt

Categories

Coding 7 No-Code 2 Automation 14 AI-Powered Content Creation 1 automated video editing 1 Tools 12 Open Source 26 AI 21 Gaming 1 Productivity 16 Security 4 Music Apps 1 Mobile 3 Technology 19 Digital Transformation 2 Fintech 6 Cryptocurrency 2 Trading 2 Cybersecurity 14 Web Development 17 Frontend 1 Marketing 1 Scientific Research 2 Devops 10 Developer 2 Software Development 6 Entrepreneurship 1 Maching learning 2 Data Engineering 4 Linux Tutorials 1 Linux 4 Data Science 5 Server 1 Self-Hosted 6 Homelab 2 File transfert 1 Photo Editing 1 Data Visualization 4 iOS Hacks 1 React Native 1 prompts 1 Wordpress 1 WordPressAI 1 Education 1 Design 1 Streaming 2 LLM 1 Algorithmic Trading 2 Internet of Things 1 Data Privacy 1 AI Security 2 Digital Media 2 Self-Hosting 3 OCR 1 Defi 1 Dental Technology 1 Artificial Intelligence in Healthcare 1 Electronic 2 DIY Audio 1 Academic Writing 1 Technical Documentation 1 Publishing 1 Broadcasting 1 Database 3 Smart Home 1 Business Intelligence 1 Workflow 1 Developer Tools 162 Developer Technologies 3 Payments 1 Development 4 Desktop Environments 1 React 4 Project Management 1 Neurodiversity 1 Remote Communication 1 Machine Learning 15 System Administration 1 Natural Language Processing 1 Data Analysis 1 WhatsApp 1 Library Management 2 Self-Hosted Solutions 2 Blogging 1 IPTV Management 1 Workflow Automation 1 Artificial Intelligence 12 macOS 3 Privacy 1 Manufacturing 1 AI Development 14 Freelancing 1 Invoicing 1 AI & Machine Learning 7 Development Tools 3 CLI Tools 1 OSINT 1 Investigation 1 Backend Development 1 AI/ML 21 Windows 1 Privacy Tools 3 Computer Vision 6 Networking 1 DevOps Tools 4 AI Tools 11 Developer Productivity 6 CSS Frameworks 1 Web Development Tools 1 Cloudflare 1 GraphQL 1 Database Management 3 Educational Technology 2 AI Programming 3 Machine Learning Tools 2 Python Development 2 IoT & Hardware 1 Apple Ecosystem 1 JavaScript 6 AI-Assisted Development 2 Python 2 Document Generation 3 Email 1 macOS Utilities 2 Virtualization 3 Browser Automation 1 AI Development Tools 2 Docker 2 Mobile Development 4 Marketing Technology 1 Open Source Tools 9 Documentation 1 Web Scraping 3 iOS Development 3 Mobile Apps 1 Mobile Tools 2 Android Development 3 macOS Development 2 Web Browsers 1 API Management 1 UI Components 1 React Development 1 UI/UX Design 1 Digital Forensics 2 Music Software 2 API Development 3 Business Software 1 ESP32 Projects 1 Media Server 1 Container Orchestration 1 Speech Recognition 1 Media Automation 1 Media Management 1 Self-Hosted Software 1 Java Development 1 Desktop Applications 1 AI Automation 2 AI Assistant 1 Linux Software 1 Node.js 1 3D Printing 1 Low-Code Platforms 1 Software-Defined Radio 2 CLI Utilities 1 Music Production 1 Monitoring 1 IoT 1 Hardware Programming 1 Godot 1 Game Development Tools 1 IoT Projects 1 ESP32 Development 1 Career Development 1 Python Tools 1 Product Management 1 Python Libraries 1 Legal Tech 1 Home Automation 2 Robotics 2 Hardware Hacking 1 macOS Apps 3 Git Workflow 1 OSINT Tools 1 Game Development 2 Design Tools 1 Enterprise Architecture 1 Network Security 2 Productivity Software 1 Apple Silicon 1 Terminal Applications 2 Business Development 1 Frontend Development 2 Vector Databases 1 Portfolio Tools 1 iOS Tools 1 Chess 1 Video Production 1 Data Recovery 2 Developer Resources 2 Video Editing 2 Simulation Tools 1 AI Integration 4 SEO Tools 1 macOS Applications 1 Penetration Testing 1 System Design 1 Edge AI 1 Audio Production 1 Live Streaming Technology 1 Music Technology 1 Generative AI 1 Flutter Development 1 Privacy Software 1 API Integration 1 Android Security 1 Cloud Computing 1 AI Engineering 1 Command Line Utilities 1 Audio Processing 1 Swift Development 1 AI Frameworks 1 Multi-Agent Systems 1 JavaScript Frameworks 1 Media Applications 1 Mathematical Visualization 1 AI Infrastructure 1 Edge Computing 1 Financial Technology 2 Security Tools 1 AI/ML Tools 1 3D Graphics 2 Database Technology 1 Observability 1 RSS Readers 1 Next.js 1 SaaS Development 1 Docker Tools 1 DevOps Monitoring 1 Visual Programming 1 Testing Tools 1 Video Processing 1 Database Tools 1 Family Technology 1 Open Source Software 1 Motion Capture 1 Scientific Computing 1 Infrastructure 1 CLI Applications 1 AI and Machine Learning 1 Finance/Trading 1 Cloud Infrastructure 1 Quantum Computing 1
Advertisement
Advertisement