Repository files navigation

Elite API

Elite API is the backend for the Elite Farmers Website and the Elite Discord Bot.

Do not build against api.elitebot.dev for your own projects without permission. Run your own local instance instead.

This project is not a Mojang API or Hypixel API proxy. It is not affiliated with Mojang or Hypixel.

Requirements

This API uses FastEndpoints.

Recommended Local Setup

For the easiest local development workflow, run Postgres, pgbouncer, and Redis in Docker. Then you can run the API from your IDE or dotnet run.

  1. Start the local infrastructure:

    docker compose up -d
  2. Copy EliteAPI/appsettings.json to EliteAPI/appsettings.Development.json.

  3. Add your local secrets and overrides to EliteAPI/appsettings.Development.json. A minimal example:

    {
    "Discord": {
    "ClientId": "<discord-client-id>",
    "ClientSecret": "<discord-client-secret>",
    "BotToken": "<discord-bot-token>"
    },
    "Hypixel": {
    "ApiKey": "<hypixel-api-key>"
    },
    "Jwt": {
    "Secret": "<local-jwt-secret>"
    },
    "WebsiteSecret": "<local-website-secret>"
    }
  4. Validate the setup:

    dotnet run --project EliteAPI -- doctor
  5. Run the API:

    dotnet run --project EliteAPI
  6. Use these local URLs:

  • API: http://localhost:5164
  • OpenAPI: http://localhost:5164/openapi/v1.json
  • Readiness: http://localhost:5164/health/ready

Notes for this setup:

  • Postgres is available on localhost:5436
  • Redis is available on localhost:6380
  • EliteAPI/.env is not used
  • Environment variables and user secrets still work, but appsettings.Development.json is the normal local override file

Full Docker Setup

For production or just running everything in docker, do the following:

  1. Copy .env.example to .env.

  2. Fill in the required values in .env:

  • Discord__ClientId
  • Discord__ClientSecret
  • Discord__BotToken
  • Hypixel__ApiKey (You can override other appsettings too, just use __ in place of : seperators)
  1. Start the full stack:

    docker compose --profile full-stack up -d
  2. Use these local URLs:

  • API: http://localhost:7008
  • Readiness: http://localhost:7008/health/ready
  1. Validate the running container when needed:

    docker compose --profile full-stack exec eliteapi dotnet EliteAPI.dll doctor

Optional observability stack:

docker compose --profile full-stack --profile observability up -d

Website Setup

To run the Website against your local API, use the same Discord application in both repos and set these Website env vars:

ELITE_API_URL=http://localhost:5164PUBLIC_DISCORD_CLIENT_ID=<same value as Discord.ClientId>ELITE_API_TOKEN=<same value as WebsiteSecret>

If the Website should talk to the Dockerized API instead, use:

ELITE_API_URL=http://localhost:7008

Add the correct redirect URL to your Discord application:

http://localhost:5173/login/callback

Basic smoke test:

  1. Start the API.
  2. Start the Website.
  3. Log in with Discord.
  4. Open a profile page.
  5. Refresh the profile page.
  6. Confirm the API still responds at /openapi/v1.json and /health/ready.

If you change API responses or add endpoints, regenerate the Website or Bot API types with the following command in the website repo.

pnpm run generate-api

Supported Development Setups

These combinations are expected to work:

  • Local API + local Website
  • Full Docker API + local Website
  • Full Docker API only

Troubleshooting

  • If you run the API locally from your IDE, use localhost:5436 for Postgres and localhost:6380 for Redis.
  • If you run the API in Docker, use pgbouncer:5432 for Postgres and cache:6379 for Redis.
  • If you change Docker config and nothing happens, restart the affected containers. You should not need to rebuild the image for normal config changes.
  • If you edit EliteAPI/.env and nothing changes, that is expected. The local IDE flow uses appsettings.Development.json, environment variables, or user secrets.
  • If Website login or profile refresh fails locally, verify ELITE_API_URL, PUBLIC_DISCORD_CLIENT_ID, ELITE_API_TOKEN, and the Discord callback URL.
  • For extra request-level diagnostics during local Website debugging, set SetupDiagnostics:LogProfileRequests=true.
  • Run dotnet run --project EliteAPI -- doctor to catch common config mistakes before startup.

Contributing

  • Keep changes relevant to the Website or Discord Bot.
  • Follow the existing code style and project structure.
  • Run tests before opening a PR when possible.
  • Add tests for new behavior when practical.
  • If a feature is large or changes core behavior, discuss it in an issue or in the community Discord first: https://elitebot.dev/support

Database Changes

  1. Make your entity and DTO changes.
  2. Add or update the related DbSet in EliteAPI/Data/DataContext.cs if needed.
  3. Generate an EF Core migration in EliteAPI/Data/Migrations.
  4. Avoid stacking multiple migrations in the same PR unless there is a clear reason.
  5. Migrations run automatically when the API starts in development.

Local Admin Account

If you need admin features locally, set Seed:AdminUserId to your Discord user ID. This only works if there are no existing admin users and that account has already logged in once.

  1. Set Seed:AdminUserId in EliteAPI/appsettings.Development.json, an environment variable, or user secrets.
  2. Run the API and Website locally.
  3. Log in with that Discord account.
  4. Restart the API.
  5. Use /admin on the Website.

About

Backend ASP.NET Core API for the Elite Farmers Website

Resources

Stars

15 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Used by

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

Elite API

Elite API is the backend for the Elite Farmers Website and the Elite Discord Bot.

Do not build against api.elitebot.dev for your own projects without permission. Run your own local instance instead.

This project is not a Mojang API or Hypixel API proxy. It is not affiliated with Mojang or Hypixel.

Requirements

This API uses FastEndpoints.

Recommended Local Setup

For the easiest local development workflow, run Postgres, pgbouncer, and Redis in Docker. Then you can run the API from your IDE or dotnet run.

  1. Start the local infrastructure:

    docker compose up -d
  2. Copy EliteAPI/appsettings.json to EliteAPI/appsettings.Development.json.

  3. Add your local secrets and overrides to EliteAPI/appsettings.Development.json. A minimal example:

    {
    "Discord": {
    "ClientId": "<discord-client-id>",
    "ClientSecret": "<discord-client-secret>",
    "BotToken": "<discord-bot-token>"
    },
    "Hypixel": {
    "ApiKey": "<hypixel-api-key>"
    },
    "Jwt": {
    "Secret": "<local-jwt-secret>"
    },
    "WebsiteSecret": "<local-website-secret>"
    }
  4. Validate the setup:

    dotnet run --project EliteAPI -- doctor
  5. Run the API:

    dotnet run --project EliteAPI
  6. Use these local URLs:

  • API: http://localhost:5164
  • OpenAPI: http://localhost:5164/openapi/v1.json
  • Readiness: http://localhost:5164/health/ready

Notes for this setup:

  • Postgres is available on localhost:5436
  • Redis is available on localhost:6380
  • EliteAPI/.env is not used
  • Environment variables and user secrets still work, but appsettings.Development.json is the normal local override file

Full Docker Setup

For production or just running everything in docker, do the following:

  1. Copy .env.example to .env.

  2. Fill in the required values in .env:

  • Discord__ClientId
  • Discord__ClientSecret
  • Discord__BotToken
  • Hypixel__ApiKey (You can override other appsettings too, just use __ in place of : seperators)
  1. Start the full stack:

    docker compose --profile full-stack up -d
  2. Use these local URLs:

  • API: http://localhost:7008
  • Readiness: http://localhost:7008/health/ready
  1. Validate the running container when needed:

    docker compose --profile full-stack exec eliteapi dotnet EliteAPI.dll doctor

Optional observability stack:

docker compose --profile full-stack --profile observability up -d

Website Setup

To run the Website against your local API, use the same Discord application in both repos and set these Website env vars:

ELITE_API_URL=http://localhost:5164PUBLIC_DISCORD_CLIENT_ID=<same value as Discord.ClientId>ELITE_API_TOKEN=<same value as WebsiteSecret>

If the Website should talk to the Dockerized API instead, use:

ELITE_API_URL=http://localhost:7008

Add the correct redirect URL to your Discord application:

http://localhost:5173/login/callback

Basic smoke test:

  1. Start the API.
  2. Start the Website.
  3. Log in with Discord.
  4. Open a profile page.
  5. Refresh the profile page.
  6. Confirm the API still responds at /openapi/v1.json and /health/ready.

If you change API responses or add endpoints, regenerate the Website or Bot API types with the following command in the website repo.

pnpm run generate-api

Supported Development Setups

These combinations are expected to work:

  • Local API + local Website
  • Full Docker API + local Website
  • Full Docker API only

Troubleshooting

  • If you run the API locally from your IDE, use localhost:5436 for Postgres and localhost:6380 for Redis.
  • If you run the API in Docker, use pgbouncer:5432 for Postgres and cache:6379 for Redis.
  • If you change Docker config and nothing happens, restart the affected containers. You should not need to rebuild the image for normal config changes.
  • If you edit EliteAPI/.env and nothing changes, that is expected. The local IDE flow uses appsettings.Development.json, environment variables, or user secrets.
  • If Website login or profile refresh fails locally, verify ELITE_API_URL, PUBLIC_DISCORD_CLIENT_ID, ELITE_API_TOKEN, and the Discord callback URL.
  • For extra request-level diagnostics during local Website debugging, set SetupDiagnostics:LogProfileRequests=true.
  • Run dotnet run --project EliteAPI -- doctor to catch common config mistakes before startup.

Contributing

  • Keep changes relevant to the Website or Discord Bot.
  • Follow the existing code style and project structure.
  • Run tests before opening a PR when possible.
  • Add tests for new behavior when practical.
  • If a feature is large or changes core behavior, discuss it in an issue or in the community Discord first: https://elitebot.dev/support

Database Changes

  1. Make your entity and DTO changes.
  2. Add or update the related DbSet in EliteAPI/Data/DataContext.cs if needed.
  3. Generate an EF Core migration in EliteAPI/Data/Migrations.
  4. Avoid stacking multiple migrations in the same PR unless there is a clear reason.
  5. Migrations run automatically when the API starts in development.

Local Admin Account

If you need admin features locally, set Seed:AdminUserId to your Discord user ID. This only works if there are no existing admin users and that account has already logged in once.

  1. Set Seed:AdminUserId in EliteAPI/appsettings.Development.json, an environment variable, or user secrets.
  2. Run the API and Website locally.
  3. Log in with that Discord account.
  4. Restart the API.
  5. Use /admin on the Website.

About

Backend ASP.NET Core API for the Elite Farmers Website

Resources

Stars

15 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Used by

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

Elite API

Elite API is the backend for the Elite Farmers Website and the Elite Discord Bot.

Do not build against api.elitebot.dev for your own projects without permission. Run your own local instance instead.

This project is not a Mojang API or Hypixel API proxy. It is not affiliated with Mojang or Hypixel.

Requirements

This API uses FastEndpoints.

Recommended Local Setup

For the easiest local development workflow, run Postgres, pgbouncer, and Redis in Docker. Then you can run the API from your IDE or dotnet run.

  1. Start the local infrastructure:

    docker compose up -d
  2. Copy EliteAPI/appsettings.json to EliteAPI/appsettings.Development.json.

  3. Add your local secrets and overrides to EliteAPI/appsettings.Development.json. A minimal example:

    {
    "Discord": {
    "ClientId": "<discord-client-id>",
    "ClientSecret": "<discord-client-secret>",
    "BotToken": "<discord-bot-token>"
    },
    "Hypixel": {
    "ApiKey": "<hypixel-api-key>"
    },
    "Jwt": {
    "Secret": "<local-jwt-secret>"
    },
    "WebsiteSecret": "<local-website-secret>"
    }
  4. Validate the setup:

    dotnet run --project EliteAPI -- doctor
  5. Run the API:

    dotnet run --project EliteAPI
  6. Use these local URLs:

  • API: http://localhost:5164
  • OpenAPI: http://localhost:5164/openapi/v1.json
  • Readiness: http://localhost:5164/health/ready

Notes for this setup:

  • Postgres is available on localhost:5436
  • Redis is available on localhost:6380
  • EliteAPI/.env is not used
  • Environment variables and user secrets still work, but appsettings.Development.json is the normal local override file

Full Docker Setup

For production or just running everything in docker, do the following:

  1. Copy .env.example to .env.

  2. Fill in the required values in .env:

  • Discord__ClientId
  • Discord__ClientSecret
  • Discord__BotToken
  • Hypixel__ApiKey (You can override other appsettings too, just use __ in place of : seperators)
  1. Start the full stack:

    docker compose --profile full-stack up -d
  2. Use these local URLs:

  • API: http://localhost:7008
  • Readiness: http://localhost:7008/health/ready
  1. Validate the running container when needed:

    docker compose --profile full-stack exec eliteapi dotnet EliteAPI.dll doctor

Optional observability stack:

docker compose --profile full-stack --profile observability up -d

Website Setup

To run the Website against your local API, use the same Discord application in both repos and set these Website env vars:

ELITE_API_URL=http://localhost:5164PUBLIC_DISCORD_CLIENT_ID=<same value as Discord.ClientId>ELITE_API_TOKEN=<same value as WebsiteSecret>

If the Website should talk to the Dockerized API instead, use:

ELITE_API_URL=http://localhost:7008

Add the correct redirect URL to your Discord application:

http://localhost:5173/login/callback

Basic smoke test:

  1. Start the API.
  2. Start the Website.
  3. Log in with Discord.
  4. Open a profile page.
  5. Refresh the profile page.
  6. Confirm the API still responds at /openapi/v1.json and /health/ready.

If you change API responses or add endpoints, regenerate the Website or Bot API types with the following command in the website repo.

pnpm run generate-api

Supported Development Setups

These combinations are expected to work:

  • Local API + local Website
  • Full Docker API + local Website
  • Full Docker API only

Troubleshooting

  • If you run the API locally from your IDE, use localhost:5436 for Postgres and localhost:6380 for Redis.
  • If you run the API in Docker, use pgbouncer:5432 for Postgres and cache:6379 for Redis.
  • If you change Docker config and nothing happens, restart the affected containers. You should not need to rebuild the image for normal config changes.
  • If you edit EliteAPI/.env and nothing changes, that is expected. The local IDE flow uses appsettings.Development.json, environment variables, or user secrets.
  • If Website login or profile refresh fails locally, verify ELITE_API_URL, PUBLIC_DISCORD_CLIENT_ID, ELITE_API_TOKEN, and the Discord callback URL.
  • For extra request-level diagnostics during local Website debugging, set SetupDiagnostics:LogProfileRequests=true.
  • Run dotnet run --project EliteAPI -- doctor to catch common config mistakes before startup.

Contributing

  • Keep changes relevant to the Website or Discord Bot.
  • Follow the existing code style and project structure.
  • Run tests before opening a PR when possible.
  • Add tests for new behavior when practical.
  • If a feature is large or changes core behavior, discuss it in an issue or in the community Discord first: https://elitebot.dev/support

Database Changes

  1. Make your entity and DTO changes.
  2. Add or update the related DbSet in EliteAPI/Data/DataContext.cs if needed.
  3. Generate an EF Core migration in EliteAPI/Data/Migrations.
  4. Avoid stacking multiple migrations in the same PR unless there is a clear reason.
  5. Migrations run automatically when the API starts in development.

Local Admin Account

If you need admin features locally, set Seed:AdminUserId to your Discord user ID. This only works if there are no existing admin users and that account has already logged in once.

  1. Set Seed:AdminUserId in EliteAPI/appsettings.Development.json, an environment variable, or user secrets.
  2. Run the API and Website locally.
  3. Log in with that Discord account.
  4. Restart the API.
  5. Use /admin on the Website.

About

Backend ASP.NET Core API for the Elite Farmers Website

Resources

Stars

15 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Used by

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

Elite API

Elite API is the backend for the Elite Farmers Website and the Elite Discord Bot.

Do not build against api.elitebot.dev for your own projects without permission. Run your own local instance instead.

This project is not a Mojang API or Hypixel API proxy. It is not affiliated with Mojang or Hypixel.

Requirements

This API uses FastEndpoints.

Recommended Local Setup

For the easiest local development workflow, run Postgres, pgbouncer, and Redis in Docker. Then you can run the API from your IDE or dotnet run.

  1. Start the local infrastructure:

    docker compose up -d
  2. Copy EliteAPI/appsettings.json to EliteAPI/appsettings.Development.json.

  3. Add your local secrets and overrides to EliteAPI/appsettings.Development.json. A minimal example:

    {
    "Discord": {
    "ClientId": "<discord-client-id>",
    "ClientSecret": "<discord-client-secret>",
    "BotToken": "<discord-bot-token>"
    },
    "Hypixel": {
    "ApiKey": "<hypixel-api-key>"
    },
    "Jwt": {
    "Secret": "<local-jwt-secret>"
    },
    "WebsiteSecret": "<local-website-secret>"
    }
  4. Validate the setup:

    dotnet run --project EliteAPI -- doctor
  5. Run the API:

    dotnet run --project EliteAPI
  6. Use these local URLs:

  • API: http://localhost:5164
  • OpenAPI: http://localhost:5164/openapi/v1.json
  • Readiness: http://localhost:5164/health/ready

Notes for this setup:

  • Postgres is available on localhost:5436
  • Redis is available on localhost:6380
  • EliteAPI/.env is not used
  • Environment variables and user secrets still work, but appsettings.Development.json is the normal local override file

Full Docker Setup

For production or just running everything in docker, do the following:

  1. Copy .env.example to .env.

  2. Fill in the required values in .env:

  • Discord__ClientId
  • Discord__ClientSecret
  • Discord__BotToken
  • Hypixel__ApiKey (You can override other appsettings too, just use __ in place of : seperators)
  1. Start the full stack:

    docker compose --profile full-stack up -d
  2. Use these local URLs:

  • API: http://localhost:7008
  • Readiness: http://localhost:7008/health/ready
  1. Validate the running container when needed:

    docker compose --profile full-stack exec eliteapi dotnet EliteAPI.dll doctor

Optional observability stack:

docker compose --profile full-stack --profile observability up -d

Website Setup

To run the Website against your local API, use the same Discord application in both repos and set these Website env vars:

ELITE_API_URL=http://localhost:5164PUBLIC_DISCORD_CLIENT_ID=<same value as Discord.ClientId>ELITE_API_TOKEN=<same value as WebsiteSecret>

If the Website should talk to the Dockerized API instead, use:

ELITE_API_URL=http://localhost:7008

Add the correct redirect URL to your Discord application:

http://localhost:5173/login/callback

Basic smoke test:

  1. Start the API.
  2. Start the Website.
  3. Log in with Discord.
  4. Open a profile page.
  5. Refresh the profile page.
  6. Confirm the API still responds at /openapi/v1.json and /health/ready.

If you change API responses or add endpoints, regenerate the Website or Bot API types with the following command in the website repo.

pnpm run generate-api

Supported Development Setups

These combinations are expected to work:

  • Local API + local Website
  • Full Docker API + local Website
  • Full Docker API only

Troubleshooting

  • If you run the API locally from your IDE, use localhost:5436 for Postgres and localhost:6380 for Redis.
  • If you run the API in Docker, use pgbouncer:5432 for Postgres and cache:6379 for Redis.
  • If you change Docker config and nothing happens, restart the affected containers. You should not need to rebuild the image for normal config changes.
  • If you edit EliteAPI/.env and nothing changes, that is expected. The local IDE flow uses appsettings.Development.json, environment variables, or user secrets.
  • If Website login or profile refresh fails locally, verify ELITE_API_URL, PUBLIC_DISCORD_CLIENT_ID, ELITE_API_TOKEN, and the Discord callback URL.
  • For extra request-level diagnostics during local Website debugging, set SetupDiagnostics:LogProfileRequests=true.
  • Run dotnet run --project EliteAPI -- doctor to catch common config mistakes before startup.

Contributing

  • Keep changes relevant to the Website or Discord Bot.
  • Follow the existing code style and project structure.
  • Run tests before opening a PR when possible.
  • Add tests for new behavior when practical.
  • If a feature is large or changes core behavior, discuss it in an issue or in the community Discord first: https://elitebot.dev/support

Database Changes

  1. Make your entity and DTO changes.
  2. Add or update the related DbSet in EliteAPI/Data/DataContext.cs if needed.
  3. Generate an EF Core migration in EliteAPI/Data/Migrations.
  4. Avoid stacking multiple migrations in the same PR unless there is a clear reason.
  5. Migrations run automatically when the API starts in development.

Local Admin Account

If you need admin features locally, set Seed:AdminUserId to your Discord user ID. This only works if there are no existing admin users and that account has already logged in once.

  1. Set Seed:AdminUserId in EliteAPI/appsettings.Development.json, an environment variable, or user secrets.
  2. Run the API and Website locally.
  3. Log in with that Discord account.
  4. Restart the API.
  5. Use /admin on the Website.

About

Backend ASP.NET Core API for the Elite Farmers Website

Resources

Stars

15 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Used by

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

Elite API

Elite API is the backend for the Elite Farmers Website and the Elite Discord Bot.

Do not build against api.elitebot.dev for your own projects without permission. Run your own local instance instead.

This project is not a Mojang API or Hypixel API proxy. It is not affiliated with Mojang or Hypixel.

Requirements

This API uses FastEndpoints.

Recommended Local Setup

For the easiest local development workflow, run Postgres, pgbouncer, and Redis in Docker. Then you can run the API from your IDE or dotnet run.

  1. Start the local infrastructure:

    docker compose up -d
  2. Copy EliteAPI/appsettings.json to EliteAPI/appsettings.Development.json.

  3. Add your local secrets and overrides to EliteAPI/appsettings.Development.json. A minimal example:

    {
    "Discord": {
    "ClientId": "<discord-client-id>",
    "ClientSecret": "<discord-client-secret>",
    "BotToken": "<discord-bot-token>"
    },
    "Hypixel": {
    "ApiKey": "<hypixel-api-key>"
    },
    "Jwt": {
    "Secret": "<local-jwt-secret>"
    },
    "WebsiteSecret": "<local-website-secret>"
    }
  4. Validate the setup:

    dotnet run --project EliteAPI -- doctor
  5. Run the API:

    dotnet run --project EliteAPI
  6. Use these local URLs:

  • API: http://localhost:5164
  • OpenAPI: http://localhost:5164/openapi/v1.json
  • Readiness: http://localhost:5164/health/ready

Notes for this setup:

  • Postgres is available on localhost:5436
  • Redis is available on localhost:6380
  • EliteAPI/.env is not used
  • Environment variables and user secrets still work, but appsettings.Development.json is the normal local override file

Full Docker Setup

For production or just running everything in docker, do the following:

  1. Copy .env.example to .env.

  2. Fill in the required values in .env:

  • Discord__ClientId
  • Discord__ClientSecret
  • Discord__BotToken
  • Hypixel__ApiKey (You can override other appsettings too, just use __ in place of : seperators)
  1. Start the full stack:

    docker compose --profile full-stack up -d
  2. Use these local URLs:

  • API: http://localhost:7008
  • Readiness: http://localhost:7008/health/ready
  1. Validate the running container when needed:

    docker compose --profile full-stack exec eliteapi dotnet EliteAPI.dll doctor

Optional observability stack:

docker compose --profile full-stack --profile observability up -d

Website Setup

To run the Website against your local API, use the same Discord application in both repos and set these Website env vars:

ELITE_API_URL=http://localhost:5164PUBLIC_DISCORD_CLIENT_ID=<same value as Discord.ClientId>ELITE_API_TOKEN=<same value as WebsiteSecret>

If the Website should talk to the Dockerized API instead, use:

ELITE_API_URL=http://localhost:7008

Add the correct redirect URL to your Discord application:

http://localhost:5173/login/callback

Basic smoke test:

  1. Start the API.
  2. Start the Website.
  3. Log in with Discord.
  4. Open a profile page.
  5. Refresh the profile page.
  6. Confirm the API still responds at /openapi/v1.json and /health/ready.

If you change API responses or add endpoints, regenerate the Website or Bot API types with the following command in the website repo.

pnpm run generate-api

Supported Development Setups

These combinations are expected to work:

  • Local API + local Website
  • Full Docker API + local Website
  • Full Docker API only

Troubleshooting

  • If you run the API locally from your IDE, use localhost:5436 for Postgres and localhost:6380 for Redis.
  • If you run the API in Docker, use pgbouncer:5432 for Postgres and cache:6379 for Redis.
  • If you change Docker config and nothing happens, restart the affected containers. You should not need to rebuild the image for normal config changes.
  • If you edit EliteAPI/.env and nothing changes, that is expected. The local IDE flow uses appsettings.Development.json, environment variables, or user secrets.
  • If Website login or profile refresh fails locally, verify ELITE_API_URL, PUBLIC_DISCORD_CLIENT_ID, ELITE_API_TOKEN, and the Discord callback URL.
  • For extra request-level diagnostics during local Website debugging, set SetupDiagnostics:LogProfileRequests=true.
  • Run dotnet run --project EliteAPI -- doctor to catch common config mistakes before startup.

Contributing

  • Keep changes relevant to the Website or Discord Bot.
  • Follow the existing code style and project structure.
  • Run tests before opening a PR when possible.
  • Add tests for new behavior when practical.
  • If a feature is large or changes core behavior, discuss it in an issue or in the community Discord first: https://elitebot.dev/support

Database Changes

  1. Make your entity and DTO changes.
  2. Add or update the related DbSet in EliteAPI/Data/DataContext.cs if needed.
  3. Generate an EF Core migration in EliteAPI/Data/Migrations.
  4. Avoid stacking multiple migrations in the same PR unless there is a clear reason.
  5. Migrations run automatically when the API starts in development.

Local Admin Account

If you need admin features locally, set Seed:AdminUserId to your Discord user ID. This only works if there are no existing admin users and that account has already logged in once.

  1. Set Seed:AdminUserId in EliteAPI/appsettings.Development.json, an environment variable, or user secrets.
  2. Run the API and Website locally.
  3. Log in with that Discord account.
  4. Restart the API.
  5. Use /admin on the Website.

About

Backend ASP.NET Core API for the Elite Farmers Website

Resources

Stars

15 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Used by

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

Elite API

Elite API is the backend for the Elite Farmers Website and the Elite Discord Bot.

Do not build against api.elitebot.dev for your own projects without permission. Run your own local instance instead.

This project is not a Mojang API or Hypixel API proxy. It is not affiliated with Mojang or Hypixel.

Requirements

This API uses FastEndpoints.

Recommended Local Setup

For the easiest local development workflow, run Postgres, pgbouncer, and Redis in Docker. Then you can run the API from your IDE or dotnet run.

  1. Start the local infrastructure:

    docker compose up -d
  2. Copy EliteAPI/appsettings.json to EliteAPI/appsettings.Development.json.

  3. Add your local secrets and overrides to EliteAPI/appsettings.Development.json. A minimal example:

    {
    "Discord": {
    "ClientId": "<discord-client-id>",
    "ClientSecret": "<discord-client-secret>",
    "BotToken": "<discord-bot-token>"
    },
    "Hypixel": {
    "ApiKey": "<hypixel-api-key>"
    },
    "Jwt": {
    "Secret": "<local-jwt-secret>"
    },
    "WebsiteSecret": "<local-website-secret>"
    }
  4. Validate the setup:

    dotnet run --project EliteAPI -- doctor
  5. Run the API:

    dotnet run --project EliteAPI
  6. Use these local URLs:

  • API: http://localhost:5164
  • OpenAPI: http://localhost:5164/openapi/v1.json
  • Readiness: http://localhost:5164/health/ready

Notes for this setup:

  • Postgres is available on localhost:5436
  • Redis is available on localhost:6380
  • EliteAPI/.env is not used
  • Environment variables and user secrets still work, but appsettings.Development.json is the normal local override file

Full Docker Setup

For production or just running everything in docker, do the following:

  1. Copy .env.example to .env.

  2. Fill in the required values in .env:

  • Discord__ClientId
  • Discord__ClientSecret
  • Discord__BotToken
  • Hypixel__ApiKey (You can override other appsettings too, just use __ in place of : seperators)
  1. Start the full stack:

    docker compose --profile full-stack up -d
  2. Use these local URLs:

  • API: http://localhost:7008
  • Readiness: http://localhost:7008/health/ready
  1. Validate the running container when needed:

    docker compose --profile full-stack exec eliteapi dotnet EliteAPI.dll doctor

Optional observability stack:

docker compose --profile full-stack --profile observability up -d

Website Setup

To run the Website against your local API, use the same Discord application in both repos and set these Website env vars:

ELITE_API_URL=http://localhost:5164PUBLIC_DISCORD_CLIENT_ID=<same value as Discord.ClientId>ELITE_API_TOKEN=<same value as WebsiteSecret>

If the Website should talk to the Dockerized API instead, use:

ELITE_API_URL=http://localhost:7008

Add the correct redirect URL to your Discord application:

http://localhost:5173/login/callback

Basic smoke test:

  1. Start the API.
  2. Start the Website.
  3. Log in with Discord.
  4. Open a profile page.
  5. Refresh the profile page.
  6. Confirm the API still responds at /openapi/v1.json and /health/ready.

If you change API responses or add endpoints, regenerate the Website or Bot API types with the following command in the website repo.

pnpm run generate-api

Supported Development Setups

These combinations are expected to work:

  • Local API + local Website
  • Full Docker API + local Website
  • Full Docker API only

Troubleshooting

  • If you run the API locally from your IDE, use localhost:5436 for Postgres and localhost:6380 for Redis.
  • If you run the API in Docker, use pgbouncer:5432 for Postgres and cache:6379 for Redis.
  • If you change Docker config and nothing happens, restart the affected containers. You should not need to rebuild the image for normal config changes.
  • If you edit EliteAPI/.env and nothing changes, that is expected. The local IDE flow uses appsettings.Development.json, environment variables, or user secrets.
  • If Website login or profile refresh fails locally, verify ELITE_API_URL, PUBLIC_DISCORD_CLIENT_ID, ELITE_API_TOKEN, and the Discord callback URL.
  • For extra request-level diagnostics during local Website debugging, set SetupDiagnostics:LogProfileRequests=true.
  • Run dotnet run --project EliteAPI -- doctor to catch common config mistakes before startup.

Contributing

  • Keep changes relevant to the Website or Discord Bot.
  • Follow the existing code style and project structure.
  • Run tests before opening a PR when possible.
  • Add tests for new behavior when practical.
  • If a feature is large or changes core behavior, discuss it in an issue or in the community Discord first: https://elitebot.dev/support

Database Changes

  1. Make your entity and DTO changes.
  2. Add or update the related DbSet in EliteAPI/Data/DataContext.cs if needed.
  3. Generate an EF Core migration in EliteAPI/Data/Migrations.
  4. Avoid stacking multiple migrations in the same PR unless there is a clear reason.
  5. Migrations run automatically when the API starts in development.

Local Admin Account

If you need admin features locally, set Seed:AdminUserId to your Discord user ID. This only works if there are no existing admin users and that account has already logged in once.

  1. Set Seed:AdminUserId in EliteAPI/appsettings.Development.json, an environment variable, or user secrets.
  2. Run the API and Website locally.
  3. Log in with that Discord account.
  4. Restart the API.
  5. Use /admin on the Website.

About

Backend ASP.NET Core API for the Elite Farmers Website

Resources

Stars

15 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Used by

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

Elite API

Elite API is the backend for the Elite Farmers Website and the Elite Discord Bot.

Do not build against api.elitebot.dev for your own projects without permission. Run your own local instance instead.

This project is not a Mojang API or Hypixel API proxy. It is not affiliated with Mojang or Hypixel.

Requirements

This API uses FastEndpoints.

Recommended Local Setup

For the easiest local development workflow, run Postgres, pgbouncer, and Redis in Docker. Then you can run the API from your IDE or dotnet run.

  1. Start the local infrastructure:

    docker compose up -d
  2. Copy EliteAPI/appsettings.json to EliteAPI/appsettings.Development.json.

  3. Add your local secrets and overrides to EliteAPI/appsettings.Development.json. A minimal example:

    {
    "Discord": {
    "ClientId": "<discord-client-id>",
    "ClientSecret": "<discord-client-secret>",
    "BotToken": "<discord-bot-token>"
    },
    "Hypixel": {
    "ApiKey": "<hypixel-api-key>"
    },
    "Jwt": {
    "Secret": "<local-jwt-secret>"
    },
    "WebsiteSecret": "<local-website-secret>"
    }
  4. Validate the setup:

    dotnet run --project EliteAPI -- doctor
  5. Run the API:

    dotnet run --project EliteAPI
  6. Use these local URLs:

  • API: http://localhost:5164
  • OpenAPI: http://localhost:5164/openapi/v1.json
  • Readiness: http://localhost:5164/health/ready

Notes for this setup:

  • Postgres is available on localhost:5436
  • Redis is available on localhost:6380
  • EliteAPI/.env is not used
  • Environment variables and user secrets still work, but appsettings.Development.json is the normal local override file

Full Docker Setup

For production or just running everything in docker, do the following:

  1. Copy .env.example to .env.

  2. Fill in the required values in .env:

  • Discord__ClientId
  • Discord__ClientSecret
  • Discord__BotToken
  • Hypixel__ApiKey (You can override other appsettings too, just use __ in place of : seperators)
  1. Start the full stack:

    docker compose --profile full-stack up -d
  2. Use these local URLs:

  • API: http://localhost:7008
  • Readiness: http://localhost:7008/health/ready
  1. Validate the running container when needed:

    docker compose --profile full-stack exec eliteapi dotnet EliteAPI.dll doctor

Optional observability stack:

docker compose --profile full-stack --profile observability up -d

Website Setup

To run the Website against your local API, use the same Discord application in both repos and set these Website env vars:

ELITE_API_URL=http://localhost:5164PUBLIC_DISCORD_CLIENT_ID=<same value as Discord.ClientId>ELITE_API_TOKEN=<same value as WebsiteSecret>

If the Website should talk to the Dockerized API instead, use:

ELITE_API_URL=http://localhost:7008

Add the correct redirect URL to your Discord application:

http://localhost:5173/login/callback

Basic smoke test:

  1. Start the API.
  2. Start the Website.
  3. Log in with Discord.
  4. Open a profile page.
  5. Refresh the profile page.
  6. Confirm the API still responds at /openapi/v1.json and /health/ready.

If you change API responses or add endpoints, regenerate the Website or Bot API types with the following command in the website repo.

pnpm run generate-api

Supported Development Setups

These combinations are expected to work:

  • Local API + local Website
  • Full Docker API + local Website
  • Full Docker API only

Troubleshooting

  • If you run the API locally from your IDE, use localhost:5436 for Postgres and localhost:6380 for Redis.
  • If you run the API in Docker, use pgbouncer:5432 for Postgres and cache:6379 for Redis.
  • If you change Docker config and nothing happens, restart the affected containers. You should not need to rebuild the image for normal config changes.
  • If you edit EliteAPI/.env and nothing changes, that is expected. The local IDE flow uses appsettings.Development.json, environment variables, or user secrets.
  • If Website login or profile refresh fails locally, verify ELITE_API_URL, PUBLIC_DISCORD_CLIENT_ID, ELITE_API_TOKEN, and the Discord callback URL.
  • For extra request-level diagnostics during local Website debugging, set SetupDiagnostics:LogProfileRequests=true.
  • Run dotnet run --project EliteAPI -- doctor to catch common config mistakes before startup.

Contributing

  • Keep changes relevant to the Website or Discord Bot.
  • Follow the existing code style and project structure.
  • Run tests before opening a PR when possible.
  • Add tests for new behavior when practical.
  • If a feature is large or changes core behavior, discuss it in an issue or in the community Discord first: https://elitebot.dev/support

Database Changes

  1. Make your entity and DTO changes.
  2. Add or update the related DbSet in EliteAPI/Data/DataContext.cs if needed.
  3. Generate an EF Core migration in EliteAPI/Data/Migrations.
  4. Avoid stacking multiple migrations in the same PR unless there is a clear reason.
  5. Migrations run automatically when the API starts in development.

Local Admin Account

If you need admin features locally, set Seed:AdminUserId to your Discord user ID. This only works if there are no existing admin users and that account has already logged in once.

  1. Set Seed:AdminUserId in EliteAPI/appsettings.Development.json, an environment variable, or user secrets.
  2. Run the API and Website locally.
  3. Log in with that Discord account.
  4. Restart the API.
  5. Use /admin on the Website.

About

Backend ASP.NET Core API for the Elite Farmers Website

Resources

Stars

15 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Used by

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

Elite API

Elite API is the backend for the Elite Farmers Website and the Elite Discord Bot.

Do not build against api.elitebot.dev for your own projects without permission. Run your own local instance instead.

This project is not a Mojang API or Hypixel API proxy. It is not affiliated with Mojang or Hypixel.

Requirements

This API uses FastEndpoints.

Recommended Local Setup

For the easiest local development workflow, run Postgres, pgbouncer, and Redis in Docker. Then you can run the API from your IDE or dotnet run.

  1. Start the local infrastructure:

    docker compose up -d
  2. Copy EliteAPI/appsettings.json to EliteAPI/appsettings.Development.json.

  3. Add your local secrets and overrides to EliteAPI/appsettings.Development.json. A minimal example:

    {
    "Discord": {
    "ClientId": "<discord-client-id>",
    "ClientSecret": "<discord-client-secret>",
    "BotToken": "<discord-bot-token>"
    },
    "Hypixel": {
    "ApiKey": "<hypixel-api-key>"
    },
    "Jwt": {
    "Secret": "<local-jwt-secret>"
    },
    "WebsiteSecret": "<local-website-secret>"
    }
  4. Validate the setup:

    dotnet run --project EliteAPI -- doctor
  5. Run the API:

    dotnet run --project EliteAPI
  6. Use these local URLs:

  • API: http://localhost:5164
  • OpenAPI: http://localhost:5164/openapi/v1.json
  • Readiness: http://localhost:5164/health/ready

Notes for this setup:

  • Postgres is available on localhost:5436
  • Redis is available on localhost:6380
  • EliteAPI/.env is not used
  • Environment variables and user secrets still work, but appsettings.Development.json is the normal local override file

Full Docker Setup

For production or just running everything in docker, do the following:

  1. Copy .env.example to .env.

  2. Fill in the required values in .env:

  • Discord__ClientId
  • Discord__ClientSecret
  • Discord__BotToken
  • Hypixel__ApiKey (You can override other appsettings too, just use __ in place of : seperators)
  1. Start the full stack:

    docker compose --profile full-stack up -d
  2. Use these local URLs:

  • API: http://localhost:7008
  • Readiness: http://localhost:7008/health/ready
  1. Validate the running container when needed:

    docker compose --profile full-stack exec eliteapi dotnet EliteAPI.dll doctor

Optional observability stack:

docker compose --profile full-stack --profile observability up -d

Website Setup

To run the Website against your local API, use the same Discord application in both repos and set these Website env vars:

ELITE_API_URL=http://localhost:5164PUBLIC_DISCORD_CLIENT_ID=<same value as Discord.ClientId>ELITE_API_TOKEN=<same value as WebsiteSecret>

If the Website should talk to the Dockerized API instead, use:

ELITE_API_URL=http://localhost:7008

Add the correct redirect URL to your Discord application:

http://localhost:5173/login/callback

Basic smoke test:

  1. Start the API.
  2. Start the Website.
  3. Log in with Discord.
  4. Open a profile page.
  5. Refresh the profile page.
  6. Confirm the API still responds at /openapi/v1.json and /health/ready.

If you change API responses or add endpoints, regenerate the Website or Bot API types with the following command in the website repo.

pnpm run generate-api

Supported Development Setups

These combinations are expected to work:

  • Local API + local Website
  • Full Docker API + local Website
  • Full Docker API only

Troubleshooting

  • If you run the API locally from your IDE, use localhost:5436 for Postgres and localhost:6380 for Redis.
  • If you run the API in Docker, use pgbouncer:5432 for Postgres and cache:6379 for Redis.
  • If you change Docker config and nothing happens, restart the affected containers. You should not need to rebuild the image for normal config changes.
  • If you edit EliteAPI/.env and nothing changes, that is expected. The local IDE flow uses appsettings.Development.json, environment variables, or user secrets.
  • If Website login or profile refresh fails locally, verify ELITE_API_URL, PUBLIC_DISCORD_CLIENT_ID, ELITE_API_TOKEN, and the Discord callback URL.
  • For extra request-level diagnostics during local Website debugging, set SetupDiagnostics:LogProfileRequests=true.
  • Run dotnet run --project EliteAPI -- doctor to catch common config mistakes before startup.

Contributing

  • Keep changes relevant to the Website or Discord Bot.
  • Follow the existing code style and project structure.
  • Run tests before opening a PR when possible.
  • Add tests for new behavior when practical.
  • If a feature is large or changes core behavior, discuss it in an issue or in the community Discord first: https://elitebot.dev/support

Database Changes

  1. Make your entity and DTO changes.
  2. Add or update the related DbSet in EliteAPI/Data/DataContext.cs if needed.
  3. Generate an EF Core migration in EliteAPI/Data/Migrations.
  4. Avoid stacking multiple migrations in the same PR unless there is a clear reason.
  5. Migrations run automatically when the API starts in development.

Local Admin Account

If you need admin features locally, set Seed:AdminUserId to your Discord user ID. This only works if there are no existing admin users and that account has already logged in once.

  1. Set Seed:AdminUserId in EliteAPI/appsettings.Development.json, an environment variable, or user secrets.
  2. Run the API and Website locally.
  3. Log in with that Discord account.
  4. Restart the API.
  5. Use /admin on the Website.

About

Backend ASP.NET Core API for the Elite Farmers Website

Resources

Stars

15 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages