Claude Code Guide for Oxeye
Documents a Rust Discord bot and Minecraft mod project with build commands, architecture, API endpoints, and database schema.
What this file does
Documents a Rust Discord bot and Minecraft mod project with build commands, architecture, API endpoints, and database schema.
When to use it
- Onboarding new developers to the Oxeye codebase
- Setting up a development environment for the project
- Understanding the layered architecture and error handling patterns
- Adding new HTTP endpoints or Discord commands
Assumes this stack
Claude Code Guide for Oxeye
Project Overview
Oxeye is a Discord bot + Minecraft Mod + backend service that tracks who's online on Minecraft servers and displays that information in Discord. It consists of:
- Rust Backend: HTTP API server + Discord bot (single binary)
- Minecraft Fabric Mod: Java mod that reports player join/leave events
- SQLite Database: Persistent storage for server links and player status
Enabled Tools
- ast-grep: Available for structural code search and refactoring using AST patterns. Use for finding/modifying Rust and Java code structures.
Quick Reference
Build Commands
# Build the project
cargo build --release
# Run tests
cargo test
# Run with Discord token
DISCORD_TOKEN=<token> cargo run
# Check without building
cargo check
Project Structure
oxeye/
├── oxeye-backend/ # Main Rust HTTP server + Discord bot
│ ├── src/
│ │ ├── main.rs # Entry point, runtime setup
│ │ ├── lib.rs # Router creation, middleware setup
│ │ ├── config.rs # Environment configuration
│ │ ├── routes.rs # HTTP endpoint handlers
│ │ ├── error.rs # Error types and HTTP mapping
│ │ ├── helpers.rs # Utility functions
│ │ ├── validation.rs # Input validation
│ │ └── discord_commands.rs # Discord slash commands
│ └── tests/ # Integration tests
├── oxeye-db/ # Database abstraction crate
│ └── src/
│ ├── lib.rs # Database operations (~60 methods)
│ ├── models.rs # Data types
│ └── error.rs # Database errors
├── oxeye-mod/ # Minecraft Fabric Mod (Java/Gradle)
├── docs/ # Architecture documentation
├── Cargo.toml # Workspace root
└── DESIGN.md # API specification
Technology Stack
| Component | Technology | Notes |
|---|---|---|
| Web Framework | Axum 0.8 | HTTP server with middleware |
| Async Runtime | Tokio | Full features enabled |
| Discord Bot | Poise 0.6 | Command framework on Serenity |
| Database | tokio-rusqlite | Async SQLite with WAL mode |
| Serialization | Serde + serde_json | JSON encoding/decoding |
| Error Handling | thiserror | Ergonomic error types |
| Logging | tracing | Structured logging |
| Rate Limiting | tower-governor | IP-based rate limiting |
Rust Edition: 2024
Architecture Patterns
Layered Design
HTTP Request → Validation (validation.rs) → Routes (routes.rs) → Database (oxeye-db)
Discord Command → discord_commands.rs → Database (oxeye-db)
Error Handling
- All errors flow through
AppErrorenum inerror.rs - Database errors wrapped and mapped to HTTP status codes
- Internal errors logged server-side, user-friendly messages returned
- Never expose SQL, stack traces, or library names to clients
Authentication
- API keys generated as
oxeye-sk-{32 alphanumeric} - Keys stored as SHA-256 hashes (never plaintext)
- Bearer token authentication on protected endpoints
- Connection codes format:
oxeye-{6 alphanumeric}(10-minute TTL)
Concurrency
- SQLite with WAL mode for concurrent reads
- Tokio async/await throughout
- Rate limiting prevents abuse
API Endpoints
| Method | Path | Auth | Purpose |
|---|---|---|---|
| POST | /connect | None | Redeem connection code |
| POST | /join | Bearer | Report player joining |
| POST | /leave | Bearer | Report player leaving |
| POST | /sync | Bearer | Replace entire player list |
| GET | /status | Bearer | Check server connection |
| POST | /disconnect | Bearer | Unlink server |
Discord Commands
/oxeye connect <name>- Admin-only, generates linking code/oxeye list- Shows all servers in guild/oxeye status <name>- Shows online players with join times
Database Schema
Three main tables:
pending_links- Connection codes with TTLservers- Linked Minecraft servers (api_key_hash, name, guild_id)online_players- Players currently online with join timestamps
Testing
# Run all tests
cargo test
# Run specific test
cargo test test_name
# Run with output
cargo test -- --nocapture
Tests use in-memory SQLite for speed. Coverage includes:
- All HTTP endpoints (success and error cases)
- Database operations
- Input validation
- Rate limiting behavior
- Error response formats
Environment Variables
| Variable | Default | Required | Description |
|---|---|---|---|
| DISCORD_TOKEN | - | Yes | Discord bot token |
| PORT | 3000 | No | HTTP server port |
| DATABASE_PATH | oxeye.db | No | SQLite database file |
| REQUEST_BODY_LIMIT | 1048576 | No | Max request size (bytes) |
| REQUEST_TIMEOUT_SECS | 30 | No | Request timeout |
Rate limit variables also available (see config.rs).
Code Style
- Use
#[debug_handler]on Axum handlers for better error messages - Validation happens before any database operations
- Helper functions in
helpers.rsfor common operations - Comprehensive error messages that help users fix issues
- Tests alongside implementation in oxeye-db, separate test files in oxeye-backend
Common Tasks
Adding a new HTTP endpoint
- Add route in
lib.rsunder appropriate rate-limit tier - Add handler in
routes.rs - Add validation if needed in
validation.rs - Add database methods if needed in
oxeye-db/src/lib.rs - Add integration tests in
tests/integration_tests.rs
Adding a new Discord command
- Add command function in
discord_commands.rs - Register in the commands vector in
main.rs - Database access via
ctx.data().db
Adding a new database operation
- Add method in
oxeye-db/src/lib.rs - Add types if needed in
models.rs - Add tests in the
#[cfg(test)]module
Key Files to Understand
oxeye-backend/src/lib.rs:1-119- Router setup, middleware, rate limiting tiersoxeye-backend/src/routes.rs:1-143- All HTTP handlersoxeye-db/src/lib.rs:1-400- Database schema and core operationsDESIGN.md- Complete API specificationdocs/architecture-decisions.md- Performance decisions and caching strategy
Docker
Multi-architecture builds available:
Dockerfile.amd64- x86-64Dockerfile.arm64- ARM64 (Raspberry Pi, Apple Silicon)
Final images are minimal scratch-based containers.
What's inside
15 sections covering overview, tools, build commands, project structure, stack, architecture, API, Discord commands, database, testing, env vars, code style, tasks, key files, and Docker.
Change this for your project
- Replace
adhi-thirumala/oxeyewith your own repository name - Replace
DISCORD_TOKENwith your own environment variable name if different - Replace
oxeye-sk-{32 alphanumeric}with your own API key format - Replace
oxeye-{6 alphanumeric}with your own connection code format
Where it goes
Save as CLAUDE.md in your repository root. Claude Code reads it automatically at the start of every session.
Worth borrowing
- Layered architecture separating validation, routes, and database operations
- Centralized error handling via an
AppErrorenum that maps to HTTP status codes - In-memory SQLite for fast integration tests
Related Documents
Code indexing for AI agents: summarization strategies and evaluation systems
Synthesises 2024-2025 research on code indexing for AI agents, covering summarisation strategies, hybrid retrieval architectures, and evaluation benchmarks.
write-script
Guides an AI through writing a YouTube video script with strict structural, language, and quiz rules for a survival channel.
Claude AI Git Workflow Integration
Recommends using the git-ai-commit CLI tool for AI-generated commit messages instead of manual ones.
Missing Business Agents Research — FLUXION 2026
Identifies 12 missing business operations agents for an indie software company and ranks them by impact and effort with €0 implementation plans.