{"id":36841497,"url":"https://github.com/thesomewhatyou/gabe","last_synced_at":"2026-01-25T00:05:17.330Z","repository":{"id":322302185,"uuid":"1084628986","full_name":"thesomewhatyou/gabe","owner":"thesomewhatyou","description":"Gabe is a Discord bot with the ability to do anything you want. If it doesn't do something? Just add it. ","archived":false,"fork":false,"pushed_at":"2026-01-04T22:38:13.000Z","size":25421,"stargazers_count":2,"open_issues_count":5,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-01-05T16:26:24.102Z","etag":null,"topics":["1password","codecov","container","datadog","discord-bot","github","github-codespaces","github-copilot","github-pages","js","learn","notion","oceanicjs","pnpm","sentry","student-vscode","termius","ts","useful"],"latest_commit_sha":null,"homepage":"https://thesomewhatyou.me/gabe","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thesomewhatyou.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"ko_fi":"thesomewhatyou"}},"created_at":"2025-10-28T00:05:55.000Z","updated_at":"2026-01-04T22:38:17.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/thesomewhatyou/gabe","commit_stats":null,"previous_names":["thesomewhatyou/gabe"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/thesomewhatyou/gabe","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thesomewhatyou%2Fgabe","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thesomewhatyou%2Fgabe/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thesomewhatyou%2Fgabe/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thesomewhatyou%2Fgabe/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thesomewhatyou","download_url":"https://codeload.github.com/thesomewhatyou/gabe/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thesomewhatyou%2Fgabe/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28340398,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-12T12:22:26.515Z","status":"ssl_error","status_checked_at":"2026-01-12T12:22:10.856Z","response_time":98,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["1password","codecov","container","datadog","discord-bot","github","github-codespaces","github-copilot","github-pages","js","learn","notion","oceanicjs","pnpm","sentry","student-vscode","termius","ts","useful"],"created_at":"2026-01-12T14:29:12.482Z","updated_at":"2026-01-12T14:29:13.678Z","avatar_url":"https://github.com/thesomewhatyou.png","language":"JavaScript","funding_links":["https://ko-fi.com/thesomewhatyou"],"categories":[],"sub_categories":[],"readme":"# Gabe - Your Discord Bro (or Enemy)                                                                                                 \t\t \n[![Publish to GitHub Container Registry (multi-arch, explicit builder)](https://github.com/thesomewhatyou/gabe/actions/workflows/deploy-to-ghcr.yml/badge.svg)](https://github.com/thesomewhatyou/gabe/actions/workflows/deploy-to-ghcr.yml) \n\n[![Repo sync (GitHub -\u003e Codeberg)](https://github.com/thesomewhatyou/gabe/actions/workflows/mirror.yml/badge.svg)](https://github.com/thesomewhatyou/gabe/actions/workflows/mirror.yml)\n\n\n![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?style=for-the-badge\u0026logo=typescript\u0026logoColor=white) ![JavaScript](https://img.shields.io/badge/JavaScript-F7DF1E?style=for-the-badge\u0026logo=javascript\u0026logoColor=black) ![C++](https://img.shields.io/badge/C++-00599C?style=for-the-badge\u0026logo=cplusplus\u0026logoColor=white) ![pnpm](https://img.shields.io/badge/pnpm-F69220?style=for-the-badge\u0026logo=pnpm\u0026logoColor=white) ![CMake](https://img.shields.io/badge/CMake-064F8C?style=for-the-badge\u0026logo=cmake\u0026logoColor=white) ![Dependabot](https://img.shields.io/badge/Dependabot-025E8C?style=for-the-badge\u0026logo=dependabot\u0026logoColor=white)\n\n\n\nGabe is a fast, loud, and mildly cursed Discord bot built on top of ![oceanic.js](https://img.shields.io/badge/oceanic.js-000?style=for-the-badge). \n\nIt ships native image processing, reliable moderation, fun commands, music via Lavalink, and a flexible storage layer — all tuned for low resource usage\n\n## Highlights\n\n- Powerful image processing (native module; optional ImageMagick support)\n- Moderation tools: ban, kick, timeout, purge\n- Music playback via [Lavalink](https://github.com/lavalink-devs/Lavalink) using [Shoukaku](https://github.com/Deivu/Shoukaku)\n- Tags system for saving and retrieving snippets\n- Low resource usage (CPU/RAM) — naps are normal  \u003cimg src=\"https://github.com/user-attachments/assets/a58b183a-cf97-478d-a7e1-8895cbd44c8e\" align=\"right\" width=\"128\" height=\"128\" alt=\"gabe logo\"/\u003e\n\n- Dual command system: slash commands and prefix commands (`\u0026` by default)\n- Databases: SQLite (default) or PostgreSQL\n- Extensible: add commands by dropping files in `commands/`\n                                      \n## Requirements\n\n- Node.js 22+ (required)\n- Linux/macOS recommended. Windows is not officially supported; use WSL if you must.\n- For image features, a native module is compiled via `cmake-js`. A basic C/C++ toolchain is required when building from source. ImageMagick can be toggled on/off at build time.\n\n## Quick start\n\n1) Clone and install\n\n```\ngit clone https://github.com/gabrielpiss/gabe.git\ncd gabe\npnpm install\n```\n\n2) Configure environment (at minimum, your Discord bot token)\n\nCreate a `.env` file in the project root:\n\n```\nTOKEN=your_discord_bot_token\n# Optional (examples)\nPREFIX=\u0026\n# DB=sqlite:///data/gabe.db           # SQLite (default if not set)\n# DB=postgres://user:pass@host:5432/db # PostgreSQL\n# API_TYPE=ws                          # Use the external image API via WebSocket\n# TEMPDIR=/tmp/gabe-images             # Directory for temporary images\n# THRESHOLD=4G                         # Max size of TEMPDIR before cleanup\n# REST_PROXY=https://discord.com/api   # REST proxy for Discord (optional)\n# SENTRY_DSN=                          # Sentry error tracking (optional)\n```\n\n3) Build and run\n\n```\npnpm build\npnpm start\n```\n\n## Tests\n\nGabe ships with a small but growing automated test suite for core utilities.\n\nTo build the TypeScript sources and run the tests:\n\n```\npnpm test\n```\n\n- Want extra logs? `pnpm run start:debug`\n- Prefer Bun or Deno? Try `pnpm run start:bun` or `pnpm run start:deno` (experimental).\n\nGabe, unfortunately, sometimes does NOT have classic commands (for example, level) and it is sometimes broken.\n\nFixing is hard, but you CAN add the fix yourself in a pull request (PLEASEPLEASEPLEASEPLEASE). \n\n## Commands\n\nUse `/help` or `\u0026help` in your server to view available commands and categories. Using prefixes is a better practice; as slash commands can sometimes be too much and prefixes are generally better. \n\nDon't know a command? It's not better to guess. Just use `\u0026help`. \n\n## Docker and Lavalink\n\n- Build the image: `pnpm run docker:build`\n- Run Gabe: `pnpm run docker:run-bot`\n- Run Lavalink v4 (required for music):\n  - Configure `application.yml` in the repo root\n  - Start: `pnpm run docker:run-lava`\n\n## Configuration notes\n\n- Prefix defaults to `\u0026`.\n- To enable classic (prefix) commands and/or application commands, adjust `config/commands.json`.\n- For large/clustered deployments, PM2 support is available (optional dependency).\n\n## Privacy and Security\n\n- Privacy policy: see [`PRIVACY.md`](./PRIVACY.md)\n- Never commit or share your bot token. If you see an “incorrect bot token length” error, you might have pasted the OAuth2 client secret instead of the bot token.\n\n## Contributing\n\nMIT licensed. Issues and PRs are welcome — features, fixes, docs, or just chaos improvements.\n\n## Credits\n\nGabe is based on the legendary [esmBot](https://github.com/esmBot/esmBot) by [Essem](https://github.com/TheEssem). The rest is pure Gabe.\n\n\n\n## First-time setup (Discord)\n\n1) Create an application and bot user\n- Go to https://discord.com/developers/applications and create a new application.\n- In the Bot tab: add a bot, then copy the token (paste into your `.env` as `TOKEN`). Keep it secret.\n- If you plan to use classic prefix commands, enable the \"Message Content Intent\" on the Bot page.\n\n2) Invite the bot\n- OAuth2 \u003e URL Generator\n  - Scopes: `bot`, `applications.commands`\n  - Permissions: Send Messages, Embed Links, Attach Files, Use External Emojis, Connect, Speak, Use Slash Commands\n- Open the generated URL to add Gabe to your server.\n\n3) Lavalink (for music)\n- You need a Lavalink v4 server running. Use `pnpm run docker:run-lava` for a quick local instance.\n- Make sure the Lavalink host/port/secret in `config/soundplayer.json` (or env) match your Lavalink.\n\n## Environment variables (quick reference)\n\n- `TOKEN` (required): Your bot token from Discord Developer Portal.\n- `PREFIX` (optional): Prefix for classic commands. Default `\u0026`.\n- `DB` (required): Database URL. Examples: `sqlite:///data/gabe.db`, `postgres://user:pass@host:5432/db`.\n- `API_TYPE` (optional): Set to `ws` to use the external image API via WebSocket.\n- `TEMPDIR` (optional): Directory for temporary images (default OS temp).\n- `THRESHOLD` (optional): Max size of `TEMPDIR` before cleanup (e.g. `4G`, `500M`).\n- `REST_PROXY` (optional): Custom Discord REST base URL (advanced; leave empty unless you know you need it).\n- `SENTRY_DSN` (optional): Enable error reporting to Sentry.\n- `DEBUG` (optional): Set to `true` for verbose logs.\n\n## First run checklist\n\n- Node.js 22+ installed (check with `node -v`).\n- `.env` file contains a valid `TOKEN` and optional settings.\n- If you want classic commands: set `config/commands.json` to enable `types.classic` and enable the Message Content Intent for the bot.\n- Lavalink running and reachable if you intend to use music features.\n\n## Troubleshooting\n\n- Incorrect bot token length\n  - Error: \"Incorrect bot token length\". Make sure you copied the Bot Token, not the OAuth2 client secret.\n\n- Native image build fails\n  - Ensure build tools are available (C/C++ toolchain, `cmake-js`).\n  - Try building without ImageMagick: `pnpm build:no-magick`.\n\n- Cannot connect to Discord\n  - Verify `TOKEN` is correct and the bot is invited to at least one server.\n  - Check network/firewall and consider setting `REST_PROXY` only if required.\n\n- Prefix commands not responding\n  - Ensure `types.classic` is enabled in `config/commands.json`.\n  - Enable the Message Content Intent for your bot in the Developer Portal.\n\n- Music not working\n  - Confirm Lavalink is running and configured. Check its console logs.\n  - Verify host/port/secret and that your bot can connect from its network.\n\n- Windows\n  - Windows is not officially supported, nor will it ever be. Use WSL for best results.\n\n## Logs and stability\n\n- Logs print to the console using colorized output. For extra debug information, use `pnpm run start:debug`.\n- Gabe will gracefully shut down on `SIGINT`/`SIGTERM` and will log unhandled rejections and uncaught exceptions. If `SENTRY_DSN` is set, errors will also be reported to Sentry on startup.\n\n## Support and contributions\n\n- Issues and PRs are welcome. Please include logs and steps to reproduce when reporting bugs.\n- See the Privacy Policy in `PRIVACY.md`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthesomewhatyou%2Fgabe","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthesomewhatyou%2Fgabe","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthesomewhatyou%2Fgabe/lists"}