Observed since 20 Oct, 16:56 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Industry Plugin for Alliance Auth
A powerful plugin for Alliance Auth to help corporation and alliance members track their EVE Online industry operations. This app utilizes the EVE Swagger Interface (ESI) to synchronize industry jobs directly into your Alliance Auth environment.
django.po). Prepare custom translations for your community (e.g., English, Dutch, etc.).Before installing this plugin, ensure your Alliance Auth instance meets the following requirements:
aadiscordbot): Required if you want users to receive Direct Messages upon job completion or if you intend to use Corporate Webhooks.Activate your virtual environment:
source /path/to/venv/bin/activate
Install the App: From your application directory (or via PyPI if published):
pip install -e /path/to/aa-industry-reforged
Configure Settings:
Add the app and its dependencies to your INSTALLED_APPS inside myauth/settings/local.py:
INSTALLED_APPS += [
"eveuniverse",
"industry_reforged",
]
Load Industry Data: To ensure the app can calculate Bills of Materials for both Manufacturing and Reactions without relying on third-party APIs, you must load the EVE Online Industry Activities into your local database:
python manage.py eveuniverse_load_data types --types-enabled-sections industry_activities
(Note: This creates background tasks. Depending on your Celery workers, it may take a few minutes to fully populate the database).
Run Migrations: Update your database to include the new models.
python manage.py migrate
Restart Services: Restart your Gunicorn/Supervisor and Celery worker so the changes take effect.
sudo systemctl restart myauth
sudo systemctl restart myauth-celery
To utilize the AI Market Manager and AI-driven Opportunity Scanners, you must deploy the standalone AI Forecasting service (FastAPI + LightGBM). We provide a pre-built container image via the GitHub Container Registry (GHCR) so you do not need to build it yourself.
Run the Podman Container Start the pre-built container using the following command:
podman run -d -p 8050:8050 --name ai-forecasting ghcr.io/mbroekman/aa-industry-ai-forecasting:latest
Configure Alliance Auth
Add the following to your myauth/settings/local.py so the aa-industry app can communicate with the AI engine:
INDUSTRY_REFORGED_AI_URL = "http://127.0.0.1:8050"
# Note: If Alliance Auth runs in a container, use "http://host.containers.internal:8050"
For more details on running this without Podman using Poetry, see the ai-forecasting/README.md file.
Since this plugin relies on django-eveuniverse to resolve Item Types, make sure the basic EVE universe data is loaded. You may need to run the standard EveUniverse load commands to pull the latest SDE types if you haven't already.
Assign the following permissions in the Django Admin panel:
industry.basic_access: Grants access to the Personal Dashboard (intended for all members).industry.industrialist_access: Grants access to the Industrialist Dashboard, allowing users to view the job market and claim production tasks (intended for corporate builders).industry.corp_access: Grants access to the Corporate Dashboard and Director Control Panel (intended for Directors or Industry Managers).This plugin requires specific ESI scopes depending on the features you want to use. Make sure these are configured in your Alliance Auth Eve Online SSO settings:
esi-industry.read_character_jobs.v1: Required for Personal Dashboard. Users grant this via the "Add Personal Token" button.esi-industry.read_corporation_jobs.v1: Required for Corporate Dashboard. Directors grant this via the "Add Corporate Token" button.esi-planets.manage_planets.v1: Required for Planetary Interaction tracking. Users grant this via the AA Tokens page.esi-assets.read_corporation_assets.v1: Required for the Core Engine to synchronize Corporate Inventory Hangars. Directors grant this via the "Add Corporate Token" button.esi-universe.read_structures.v1: Required to resolve public Upwell structure names in EVE. Directors grant this via the "Add Corporate Token" button.esi-corporations.read_structures.v1: Required for the Director Control Panel to discover and resolve names for structures owned by the corporation. Directors grant this via the "Add Corporate Token" button.esi-wallet.read_corporation_wallets.v1: Required to track corporate wallet balances and journal transactions. Directors grant this via the "Add Corporate Token" button.To prevent members from having to manually authorize additional PI or Industry tokens, you can configure Alliance Auth to automatically request these scopes during the standard "Add Character" login flow. Add the following to your myauth/settings/local.py:
LOGIN_TOKEN_SCOPES = [
'publicData',
'esi-planets.manage_planets.v1',
'esi-industry.read_character_jobs.v1',
]
(This ensures every character added to your Auth natively supports the personal dashboards without requiring a separate "Grant Token" button click).
To track your corporate inventory, you must explicitly configure which hangars to track (to avoid syncing thousands of irrelevant items and hitting ESI rate limits):
Note: Corporate Sync Configuration is automatically created when a Director clicks the 'Add Corporate Token' button.
By default, the Industry Reforged quote engine uses raw Jita prices (and 0% builder rewards). To customize this:
10.0 for 10% off Jita for alliance members).The app relies on Celery tasks to periodically fetch data from EVE Online. To run these tasks automatically, add the following to your myauth/settings/local.py:
from celery.schedules import crontab
if "CELERYBEAT_SCHEDULE" not in locals():
CELERYBEAT_SCHEDULE = {}
CELERYBEAT_SCHEDULE["industry_reforged_update_character_jobs"] = {
"task": "industry_reforged.tasks.update_character_jobs",
"schedule": crontab(minute="*/30"),
}
CELERYBEAT_SCHEDULE["industry_reforged_update_corporation_jobs"] = {
"task": "industry_reforged.tasks.update_corporation_jobs",
"schedule": crontab(minute="*/30"),
}
CELERYBEAT_SCHEDULE["industry_reforged_update_character_pi"] = {
"task": "industry_reforged.tasks.update_character_pi",
"schedule": crontab(minute="0"),
}
CELERYBEAT_SCHEDULE["industry_sync_corp_inventory"] = {
"task": "industry_reforged.tasks.task_sync_corp_inventory",
"schedule": crontab(minute="*/15"),
}
CELERYBEAT_SCHEDULE["industry_sync_corp_blueprints"] = {
"task": "industry_reforged.tasks.task_sync_corp_blueprints",
"schedule": crontab(minute="0", hour="*/2"), # Every 2 hours
}
CELERYBEAT_SCHEDULE["industry_pull_market_data"] = {
"task": "industry_reforged.tasks.task_pull_market_data",
"schedule": crontab(hour="11", minute="30"), # Around EVE Downtime
}
CELERYBEAT_SCHEDULE["industry_sync_corp_wallets"] = {
"task": "industry_reforged.tasks.task_sync_corp_wallets",
"schedule": crontab(minute="*/30"),
}
CELERYBEAT_SCHEDULE["industry_notify_pi_extractors"] = {
"task": "industry_reforged.tasks.task_notify_expired_extractors",
"schedule": crontab(minute="15,45"), # Twice an hour
}
CELERYBEAT_SCHEDULE["industry_update_facilities"] = {
"task": "industry_reforged.tasks.update_industry_facilities",
"schedule": crontab(minute="0", hour="*/4"), # Every 4 hours
}
CELERYBEAT_SCHEDULE["industry_evaluate_ai_baskets"] = {
"task": "industry_reforged.tasks.run_all_active_baskets",
"schedule": crontab(minute="0"), # Every hour
}
CELERYBEAT_SCHEDULE["industry_evaluate_ai_scanners"] = {
"task": "industry_reforged.tasks.run_all_active_scanners",
"schedule": crontab(minute="0"), # Every hour
}
CELERYBEAT_SCHEDULE["industry_sync_ml_market_data"] = {
"task": "industry_reforged.tasks.sync_market_data_to_ml_service",
"schedule": crontab(minute="0", hour="*/12"), # Twice a day
}
CELERYBEAT_SCHEDULE["industry_sync_all_rigs"] = {
"task": "industry_reforged.tasks.task_sync_all_rigs",
"schedule": crontab(minute="0", hour="*/6"), # Every 6 hours
}
CELERYBEAT_SCHEDULE["industry_link_orphaned_jobs"] = {
"task": "industry_reforged.tasks.link_orphaned_jobs_to_tasks",
"schedule": crontab(minute="*/30"),
}
After updating local.py, be sure to restart your Celery worker and Celery Beat services.
Note: First-run after fresh install
Celery Beat only triggers tasks at their configured schedule intervals — it does not run tasks immediately on first start. After a fresh install the System Health tab (
/industry/director/config/#health) will appear empty until each task has run at least once.As of v0.12.3,
manage.py migrateautomatically queues all main tasks once when no prior run history exists (via Django'spost_migratesignal). As long as a Celery worker is running, the health tab will populate within minutes of completing the initial migration.If you need to trigger tasks manually (e.g. after a Celery restart), run:
python manage.py shell -c " from industry_reforged.tasks.jobs import update_character_jobs, update_corporation_jobs from industry_reforged.tasks.blueprints import task_sync_corp_blueprints from industry_reforged.tasks.inventory import task_sync_corp_inventory from industry_reforged.tasks.wallets import task_sync_corp_wallets from industry_reforged.tasks.facilities import update_industry_facilities update_character_jobs.delay() update_corporation_jobs.delay() task_sync_corp_blueprints.delay() task_sync_corp_inventory.delay() task_sync_corp_wallets.delay() update_industry_facilities.delay() print('All tasks queued!') "
The AI Market Manager can automatically evaluate item profitability and create Production Tasks for your corporation based on minimum margin floors. It is backed by a dedicated AI Forecasting Microservice that predicts market demand using Machine Learning (LightGBM).
Because Machine Learning models require specific data science libraries that are heavy on CPU and Memory, the AI forecasting engine runs as an isolated microservice.
Instead of building this manually, you can run the pre-built image from the GitHub Container Registry (as detailed in the Installation section):
podman run -d -p 8050:8050 --name ai-forecasting ghcr.io/mbroekman/aa-industry-ai-forecasting:latest
(Note: If the microservice is not running, the Market Manager will gracefully fall back to using static 30-day historical averages instead of AI predictions).
To utilize this feature:
CorporationPricingConfig to set the minimum_margin_floor.ai_jobs_webhook in your CorporationWebhookConfig to receive Discord notifications when new jobs are automatically generated.Copyright (c) 2026 Maddog Broekman. All rights reserved. Licensed under the MIT License.
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.15.7 | 7 Oct 2026 | 2 |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 16:56 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:b4d57e9265a252de08038a6ef7efa3844c80efc16a2130ea891066c77b69f95e