Skip to content
All Work

Software Application

Pre-release

CraftCordDiscord & Minecraft Integration Application

CraftCord is a self-hosted application I developed to connect a Minecraft server with its Discord community. It brings conversations, player activity, server status, and selected administrative actions into a shared interface.

Built with Python, CraftCord combines Discord integrations, asynchronous network communication, server-log processing, and lightweight data persistence. Each installation connects one Discord community to one Minecraft server, with configurable channels, features, and role-based permissions.

Project type
Independent software project
My role
Application development, integrations, and ongoing maintenance
Status
Pre-release development
craftcordbot.com
Screenshot of the craftcordbot.com homepage

The challenge

Two places, one community.

A Minecraft community often lives in two places at once: on the server and in Discord. Keeping them connected means solving a handful of practical problems, reliably and without giving away more control than necessary.

  • One conversation, two places

    Players in the game and members in Discord should be able to talk with each other, instead of the community splitting into two separate conversations.

  • Visibility outside the game

    Members want to know whether the server is reachable and what is happening on it without logging in to check.

  • Staff actions from Discord

    Authorized staff need a few everyday administrative actions where they already coordinate, without handing out full console access.

  • Hosted by the operator

    Server operators need to run the application themselves and decide which channels, roles, and features it uses.

  • Safe behavior when connections fail

    When a connection drops mid-request, the application should not blindly repeat an action that may already have gone through.

Implemented capabilities

Shared conversations, visible activity, and scoped staff tools.

CraftCord runs alongside the server and brings the useful parts of it into Discord, with each feature configurable by the operator.

Two-way chat bridge

Community members can take part in the same conversation whether they are in the game or in Discord.

  • Minecraft chat is read from the server logs and forwarded to a configured Discord channel
  • Authorized Discord messages are relayed into Minecraft through its remote console (RCON) protocol
  • Discord-specific formatting is converted into readable in-game text
  • Bot and webhook messages are ignored on the return path to prevent chat loops
  • Forwarded Discord messages suppress actual mention notifications

Player identity presentation

Messages from the game can appear in Discord under the player’s own name and face. The feature is implemented with automated tests; the README still lists live verification as pending.

  • Optional webhook delivery shows a player’s username and skin-head avatar
  • Chat and event identity modes are configured independently
  • Slash-command replies and server-status messages keep CraftCord’s own identity
  • Profile lookups use bounded caching and timeout handling

Server status and activity

A single, always-current place in Discord to see whether the server is up and who is playing.

  • An automatically updated, pinned Discord status message
  • Online or offline based on observed RCON reachability, not exact Minecraft process uptime
  • Version, player count, latency, and a player-name sample that may not list every player
  • Join, leave, death, and advancement event embeds
  • SQLite keeps the pinned message ID and observed online-since state

Role-controlled administration

Scoped administration through Discord: staff get specific actions, not the whole server console.

  • Slash commands for the player list, server status, broadcasts, kick, ban, pardon, and whitelist changes
  • Diagnostic and command-sync tools for administrators
  • Commands are restricted to the configured Discord server
  • Member, moderator, and administrator tiers control who can use which actions
  • Minecraft usernames and moderation input are validated, and there is no unrestricted raw-console command

Configurable self-hosting

Each operator runs their own instance, connecting one Discord server to one Minecraft server.

  • Configuration through environment variables
  • Configurable roles, channels, status refresh interval, and optional features
  • Local server-log reading, plus an implemented Pterodactyl WebSocket log source not yet live-verified
  • Generic console mirroring is opt-in and disabled by default
  • Requires connectivity to the game server and an appropriate log source

CraftCord targets vanilla Minecraft Java 26.2 with English log formats and needs no Minecraft mod or plugin for that integration. It does not support Bedrock or promise compatibility with modified server logs, and it does not include multi-server management, account linking, a web dashboard, or browser-based configuration.

Technical highlights

The engineering behind the integration.

Three parts of the project that keep it responsive, cautious when things go wrong, and simple to run.

1

Asynchronous integration architecture

Chat, status updates, and staff commands can all happen at the same time, and each part of the application has a clear job, which keeps it easier to maintain and extend.

  1. 01

    Discord

    Slash commands, messages, and the status channel arrive through discord.py.

  2. 02

    Cogs

    Modular cogs separate command handling from event handling.

  3. 03

    Services

    Dedicated services own RCON, server status, log sources, and player identities.

  4. 04

    Minecraft

    Server logs are read for activity, and RCON carries messages and approved actions.

Python’s asyncio lets background work, such as reading logs and refreshing the status message, run alongside network requests to Discord and the Minecraft server without one blocking the other.

2

Careful failure handling

When a connection drops, it is not always clear whether an action went through. CraftCord treats that uncertainty carefully instead of retrying and risking a duplicate ban or repeated message.

A custom asynchronous RCON client sends one request at a time and manages timeouts and reconnection. Commands that change the server, and chat messages sent into the game, are not silently replayed when their delivery is uncertain.

Webhook delivery to Discord distinguishes a confirmed failure from an uncertain result, which reduces the risk of duplicate posts. These choices lower the chance of repeated actions; they are not a guarantee of delivery or exactly-once execution.

3

Lightweight persistence and configuration

The application remembers what it needs across restarts and keeps each installation’s settings separate from the code, so operators can set it up without editing source files.

SQLite stores a small amount of operational state, such as the pinned status message and the observed online-since time, so the bot picks up where it left off after a restart. It is not used as a chat archive.

Environment-based configuration keeps channels, roles, and features out of the application code, and hashed dependency lockfiles support reproducible installation.

Technology

Built with

Application
Python, asyncio, discord.py
Integrations
Discord API and webhooks, Minecraft RCON, mcstatus, aiohttp, Minecraft Services profile lookup, Minotar avatar images
Persistence and configuration
SQLite / aiosqlite, python-dotenv
Development workflow
GitHub, pytest, GitHub Actions workflow, pip-audit tooling, hashed dependency lockfiles

Verification and status

Pre-release, with testing recorded so far.

CraftCord is in pre-release development with no published release. The repository README records what has been tested by the operator and what still needs verification.

Recorded in the README

Successful operator-run tests against:

  • A disposable vanilla Minecraft Java 26.2 server
  • Python 3.13.7 on Windows
  • Local log tailing
  • A Discord test community
  • In-game confirmation of Discord-to-Minecraft chat rendering

Still to verify

Remaining verification identified in the README:

  • Player-identity webhook behavior in a live environment
  • Pterodactyl log streaming
  • Other operating systems and Python versions
  • Runtime rejection in a foreign Discord server

The repository includes automated tests and a GitHub Actions workflow. Their current passing status is not reported here, and the README marks remote CI execution as unverified. The repository is public, and license selection is still pending.

What this demonstrates

The same skills, applied to your project.

CraftCord is an independent project, not a client engagement, but the work behind it applies well beyond Minecraft. These are capabilities it demonstrates and the kind of work I can build for you.

View All Work
stewardmod.com
Screenshot of the Steward product website

Software Application

Steward — GUI-First Minecraft Moderation Suite

A moderation application I am developing for Minecraft servers, bringing player information, reports, warnings, and staff actions into guided, permission-aware workflows with persistent records.

gageolson.com
Screenshot of the gageolson.com homepage

Personal Website · Dual Portfolio Project

Gage Olson — Cybersecurity & IT Portfolio

The professional side of my dual portfolio, presenting my cybersecurity and IT background, technical learning, and searchable technical writing.

Start a conversation

Connect the tools your community or business relies on.

I build applications and integrations that bring useful information and everyday actions into the places people already work.