Last Updated: February 21, 2026 Version: 2.3.0
This document describes all error codes used by Pluginator. Each error includes its PLG code, string code, when it occurs, and how to resolve it.
When Pluginator displays an error, it includes a PLG code in the format PLG-NNNN:
[PLG-1001] Request timed out. Please try again.
Use the PLG code to quickly find the error in this document. The numbering follows category ranges:
| Range | Category | Description |
|---|---|---|
| PLG-1000s | Network | HTTP, connectivity issues |
| PLG-2000s | Validation | Config, schema validation |
| PLG-3000s | Filesystem | File read/write, permissions |
| PLG-4000s | Source | Plugin source API errors |
| PLG-5000s | Auth | Authentication, authorization |
| PLG-6000s | Config | Configuration parsing |
| PLG-7000s | Workflow | Sync, download, update failures |
| PLG-8000s | Security | URL validation, SSRF prevention |
| PLG Code | Type | String Code | Summary |
|---|---|---|---|
| PLG-1001 | network | TIMEOUT | Request timed out. |
| PLG-1002 | network | CONNECTION_FAILED | Could not connect to the server. |
| PLG-1003 | network | RATE_LIMITED | Too many requests. |
| PLG-1004 | network | SERVER_ERROR | The server encountered an error. |
| PLG-1005 | network | OFFLINE | You appear to be offline. |
| PLG-2001 | validation | INVALID_CONFIG | Invalid configuration. |
| PLG-2002 | validation | INVALID_PLUGIN | Invalid plugin format. |
| PLG-2003 | validation | SCHEMA_MISMATCH | Data format mismatch. |
| PLG-2004 | validation | MISSING_FIELD | Required field missing. |
| PLG-3001 | filesystem | FILE_NOT_FOUND | File not found. |
| PLG-3002 | filesystem | PERMISSION_DENIED | Permission denied. |
| PLG-3003 | filesystem | DISK_FULL | Disk is full. |
| PLG-3004 | filesystem | PATH_EXISTS | Path already exists. |
| PLG-3005 | filesystem | WRITE_FAILED | Failed to write file. |
| PLG-4001 | source | API_ERROR | Failed to fetch data from source. |
| PLG-4002 | source | PLUGIN_NOT_FOUND | Plugin not found. |
| PLG-4003 | source | VERSION_MISMATCH | Version compatibility issue. |
| PLG-4004 | source | UNSUPPORTED_SOURCE | Source type not supported. |
| PLG-5001 | auth | NOT_AUTHENTICATED | Please log in to continue. |
| PLG-5002 | auth | TOKEN_EXPIRED | Session has expired. |
| PLG-5003 | auth | INSUFFICIENT_TIER | Requires higher subscription tier. |
| PLG-5004 | auth | INVALID_CREDENTIALS | Invalid email or password. |
| PLG-6001 | config | PARSE_ERROR | Failed to parse configuration. |
| PLG-6002 | config | INVALID_VALUE | Invalid value. |
| PLG-6003 | config | MISSING_REQUIRED | Missing required setting. |
| PLG-6004 | config | UNKNOWN_OPTION | Unknown configuration option. |
| PLG-7001 | workflow | SYNC_FAILED | Failed to sync plugins. |
| PLG-7002 | workflow | DOWNLOAD_FAILED | Failed to download plugin. |
| PLG-7003 | workflow | UPDATE_CHECK_FAILED | Failed to check for updates. |
| PLG-7004 | workflow | BACKUP_FAILED | Failed to create backup. |
| PLG-7005 | workflow | ROLLBACK_FAILED | Failed to rollback. |
| PLG-8001 | security | INTERNAL_ADDRESS | Internal addresses not allowed. |
| PLG-8002 | security | PRIVATE_IP | Private IP ranges not allowed. |
| PLG-8003 | security | INVALID_PROTOCOL | Only HTTP/HTTPS allowed. |
| PLG-8004 | security | INVALID_URL | Invalid URL format. |
Pluginator uses a typed error system with:
- PLG codes (
PLG-NNNN) for user-facing identification and documentation lookup - Discriminated types for type-safe error handling
- String error codes for programmatic identification
- User-friendly messages via
getUserMessage() - Retryability flags to indicate if retry might succeed
- Context objects for debugging information
| Type | PLG Range | Description | Default Retryable |
|---|---|---|---|
network |
1000s | HTTP, connectivity issues | Yes |
validation |
2000s | Config, schema validation | No |
filesystem |
3000s | File read/write, permissions | No |
source |
4000s | Plugin source API errors | Yes |
auth |
5000s | Authentication, authorization | No |
config |
6000s | Configuration parsing | No |
workflow |
7000s | Sync, download, update failures | Yes |
security |
8000s | URL validation, SSRF prevention | No |
Network errors occur during HTTP requests to plugin sources or APIs.
| PLG Code | Code | Description | Retryable |
|---|---|---|---|
| PLG-1001 | TIMEOUT |
Request exceeded timeout limit | Yes |
| PLG-1002 | CONNECTION_FAILED |
Could not establish connection | Yes |
| PLG-1003 | RATE_LIMITED |
Too many requests (HTTP 429) | Yes |
| PLG-1004 | SERVER_ERROR |
Server returned 5xx status | Yes |
| PLG-1005 | OFFLINE |
No network connectivity | Yes |
When it occurs:
- HTTP request takes longer than configured timeout (default 30s)
- Server is slow to respond
User Message: [PLG-1001] Request timed out. Please try again.
Resolution:
- Check your internet connection
- Try again later when the server may be less busy
- Increase timeout in configuration if consistently slow
Context Fields:
url: The URL that timed outstatusCode: May be undefined if connection never established
When it occurs:
- DNS resolution fails
- Server refuses connection
- Network route unavailable
User Message: [PLG-1002] Could not connect to the server. Check your internet connection.
Resolution:
- Verify internet connectivity
- Check if the service is down
- Verify firewall settings
When it occurs:
- Too many requests to a plugin source
- API rate limit exceeded
User Message: [PLG-1003] Too many requests. Please wait before trying again.
Resolution:
- Wait before retrying (usually 1-5 minutes)
- For GitHub, add a personal access token for higher limits
- Reduce frequency of update checks
Context Fields:
statusCode: 429retryAfter: Seconds to wait (if provided by server)
When it occurs:
- Server returns HTTP 500-599 status
- Backend service failure
User Message: [PLG-1004] The server encountered an error. Please try again later.
Resolution:
- Wait and retry
- Check service status pages
- Report if persistent
Context Fields:
statusCode: The HTTP status code (500, 502, 503, etc.)
When it occurs:
- No network interface available
- Network adapter disabled
User Message: [PLG-1005] You appear to be offline. Check your internet connection.
Resolution:
- Enable network connection
- Check WiFi/Ethernet status
Validation errors occur when data doesn't match expected formats.
| PLG Code | Code | Description | Retryable |
|---|---|---|---|
| PLG-2001 | INVALID_CONFIG |
Configuration file has invalid structure | No |
| PLG-2002 | INVALID_PLUGIN |
Plugin JAR is malformed or corrupt | No |
| PLG-2003 | SCHEMA_MISMATCH |
Data doesn't match expected schema | No |
| PLG-2004 | MISSING_FIELD |
Required field is missing | No |
When it occurs:
config.jsoncontains invalid values- Configuration doesn't pass Zod validation
User Message: [PLG-2001] Invalid configuration (field: <field>). Please check your settings.
Resolution:
- Check
~/.pluginator/config.jsonfor errors - Refer to configuration documentation
- Delete config file to reset to defaults
Context Fields:
field: The invalid field name
When it occurs:
- JAR file is corrupt or truncated
- Invalid ZIP structure
- Missing required files inside JAR
User Message: [PLG-2002] Invalid plugin format (field: <field>). The plugin may be corrupted.
Resolution:
- Re-download the plugin
- Check if download was interrupted
- Verify plugin compatibility with your server version
When it occurs:
- API response format changed
- Cached data from incompatible version
User Message: [PLG-2003] Data format mismatch (field: <field>). This may be a compatibility issue.
Resolution:
- Clear cache:
rm -rf ~/.pluginator/cache - Update Pluginator to latest version
When it occurs:
- Required configuration field not provided
- Plugin manifest missing required properties
User Message: [PLG-2004] Required field missing (field: <field>).
Resolution:
- Add the missing field to your configuration
- Check plugin.yml in your plugin JAR
Context Fields:
field: The missing field name
Filesystem errors occur during file operations.
| PLG Code | Code | Description | Retryable |
|---|---|---|---|
| PLG-3001 | FILE_NOT_FOUND |
File doesn't exist at expected path | No |
| PLG-3002 | PERMISSION_DENIED |
Insufficient permissions to access file | No |
| PLG-3003 | DISK_FULL |
No space left on device | No |
| PLG-3004 | PATH_EXISTS |
Path already exists when creating | No |
| PLG-3005 | WRITE_FAILED |
Failed to write to file | No |
When it occurs:
- Plugin JAR doesn't exist at scanned path
- Configuration file missing
User Message: [PLG-3001] File not found: <path>.
Resolution:
- Verify the file path
- Check if file was moved or deleted
- Run scan to refresh plugin list
Context Fields:
path: The missing file path
When it occurs:
- No read/write access to plugins directory
- Trying to modify system files
User Message: [PLG-3002] Permission denied: <path>. Check file permissions.
Resolution:
- Run with appropriate permissions
- Check directory ownership
- Verify user has access to the plugins folder
Context Fields:
path: The inaccessible path
When it occurs:
- No space available for downloads
- No space for backups
User Message: [PLG-3003] Disk is full. Free up some space and try again.
Resolution:
- Free disk space
- Clean up old backups:
~/.pluginator/backups/ - Clear cache:
~/.pluginator/cache/
When it occurs:
- Trying to create a file that already exists
- Backup target already exists
User Message: [PLG-3004] Path already exists: <path>.
Resolution:
- Remove existing file first
- Choose a different name
Context Fields:
path: The existing path
When it occurs:
- I/O error during write
- File locked by another process
User Message: [PLG-3005] Failed to write file: <path>.
Resolution:
- Check if file is open in another program
- Verify disk is working properly
- Check available disk space
Context Fields:
path: The file that couldn't be written
Source errors occur when interacting with plugin repositories.
| PLG Code | Code | Description | Retryable |
|---|---|---|---|
| PLG-4001 | API_ERROR |
Plugin source API returned error | Yes |
| PLG-4002 | PLUGIN_NOT_FOUND |
Plugin doesn't exist in source | No |
| PLG-4003 | VERSION_MISMATCH |
Requested version unavailable | No |
| PLG-4004 | UNSUPPORTED_SOURCE |
Source type not implemented | No |
When it occurs:
- Modrinth, Spigot, or other API returns error
- API structure changed unexpectedly
User Message: [PLG-4001] Failed to fetch data from <source>. The service may be temporarily unavailable.
Resolution:
- Wait and retry
- Check source's status page
- Report if persistent
Context Fields:
source: The plugin source name (modrinth, spigot, github, etc.)statusCode: HTTP status if available
When it occurs:
- Plugin ID/slug not found in source
- Plugin was removed from repository
- Typo in plugin identifier
User Message: [PLG-4002] Plugin not found from <source>. Check the plugin name or ID.
Resolution:
- Verify the plugin ID/slug is correct
- Check if the plugin still exists on the source
- Try searching by name instead of ID
Context Fields:
source: The plugin sourcepluginId: The requested plugin identifier
When it occurs:
- Requested version doesn't exist
- Version incompatible with Minecraft version
User Message: [PLG-4003] Version compatibility issue from <source>.
Resolution:
- Check available versions for your Minecraft version
- Update Minecraft server version
- Use a different plugin version
Context Fields:
source: The plugin sourcerequestedVersion: The version that wasn't found
When it occurs:
- Plugin configured with unknown source type
- Source type deprecated
User Message: [PLG-4004] Source type not supported: <source>.
Resolution:
- Check supported sources: modrinth, spigot, github, curseforge, hangar, jenkins, bukkit, web-manifest
- Update plugin configuration to use supported source
Context Fields:
source: The unsupported source type
Authentication errors occur with account operations.
| PLG Code | Code | Description | Retryable |
|---|---|---|---|
| PLG-5001 | NOT_AUTHENTICATED |
No active session | No |
| PLG-5002 | TOKEN_EXPIRED |
Session token expired | No |
| PLG-5003 | INSUFFICIENT_TIER |
Feature requires higher tier | No |
| PLG-5004 | INVALID_CREDENTIALS |
Wrong email/password | No |
When it occurs:
- Trying to access tier-gated feature without login
- Session file deleted
User Message: [PLG-5001] Please log in to continue.
Resolution:
- Run
/logincommand - Use email, Google, or GitHub authentication
When it occurs:
- Session older than 24 hours
- Server invalidated token
User Message: [PLG-5002] Your session has expired. Please log in again.
Resolution:
- Run
/loginto re-authenticate
When it occurs:
- Accessing Pro/Max features on Free/Plus tier
- Exceeding tier limits
User Message: [PLG-5003] This feature requires a higher subscription tier.
Resolution:
- Upgrade your subscription
- Use
/accountto see current tier and limits
When it occurs:
- Wrong email or password
- Account doesn't exist
User Message: [PLG-5004] Invalid email or password.
Resolution:
- Check email and password
- Reset password if forgotten
- Create account if new user
Configuration errors occur when parsing or validating settings.
| PLG Code | Code | Description | Retryable |
|---|---|---|---|
| PLG-6001 | PARSE_ERROR |
JSON/YAML syntax error | No |
| PLG-6002 | INVALID_VALUE |
Value out of range or wrong type | No |
| PLG-6003 | MISSING_REQUIRED |
Required setting not provided | No |
| PLG-6004 | UNKNOWN_OPTION |
Unrecognized configuration key | No |
When it occurs:
- Malformed JSON in config file
- Syntax error in configuration
User Message: [PLG-6001] Failed to parse configuration for <setting>. Check the file format.
Resolution:
- Validate JSON syntax
- Check for trailing commas, missing quotes
- Use a JSON linter
Context Fields:
setting: The problematic setting
When it occurs:
- Number out of expected range
- Enum value not in allowed list
User Message: [PLG-6002] Invalid value for <setting>.
Resolution:
- Check documentation for valid values
- Reset to default if unsure
Context Fields:
setting: The invalid setting
When it occurs:
- Essential configuration not provided
- Server path not configured
User Message: [PLG-6003] Missing required setting <setting>.
Resolution:
- Add the missing setting to configuration
- Run setup wizard to configure
Context Fields:
setting: The missing setting name
When it occurs:
- Typo in configuration key
- Option deprecated or renamed
User Message: [PLG-6004] Unknown configuration option <setting>.
Resolution:
- Check spelling of configuration key
- Remove unknown options
- Check changelog for renamed settings
Context Fields:
setting: The unknown option name
Workflow errors occur during multi-step operations.
| PLG Code | Code | Description | Retryable |
|---|---|---|---|
| PLG-7001 | SYNC_FAILED |
Plugin sync operation failed | Yes |
| PLG-7002 | DOWNLOAD_FAILED |
Plugin download failed | Yes |
| PLG-7003 | UPDATE_CHECK_FAILED |
Could not check for updates | Yes |
| PLG-7004 | BACKUP_FAILED |
Backup creation failed | Yes |
| PLG-7005 | ROLLBACK_FAILED |
Could not restore previous version | Yes |
When it occurs:
- Copying plugins between servers failed
- File copy error during sync
User Message: [PLG-7001] Failed to sync plugins. Some files may not have been copied.
Resolution:
- Check source and destination paths
- Verify permissions on both servers
- Try syncing individual plugins
Context Fields:
operation: "sync"sourceServer: Source server IDtargetServer: Target server ID
When it occurs:
- Plugin download interrupted
- Checksum verification failed
- Server returned error during download
User Message: [PLG-7002] Failed to download plugin. Please try again.
Resolution:
- Check internet connection
- Verify plugin is still available
- Try alternative source
Context Fields:
operation: "download"pluginName: Name of plugin being downloaded
When it occurs:
- Could not reach update API
- Error parsing update response
User Message: [PLG-7003] Failed to check for updates. Please try again.
Resolution:
- Check internet connection
- Try again later
- Check if specific source is down
Context Fields:
operation: "update-check"
When it occurs:
- Could not create backup archive
- No space for backup
User Message: [PLG-7004] Failed to create backup.
Resolution:
- Check available disk space
- Verify backup directory permissions
- Check
~/.pluginator/backups/accessibility
Context Fields:
operation: "backup"
When it occurs:
- Backup file corrupt or missing
- Permission denied during restore
- Version incompatibility
User Message: [PLG-7005] Failed to rollback. Manual intervention may be required.
Resolution:
- Check if backup exists
- Manually restore from backup directory
- Re-download previous version
Context Fields:
operation: "rollback"pluginName: Plugin being rolled backbackupPath: Path to backup file
Security errors prevent potentially dangerous operations.
| PLG Code | Code | Description | Retryable |
|---|---|---|---|
| PLG-8001 | INTERNAL_ADDRESS |
URL points to internal service | No |
| PLG-8002 | PRIVATE_IP |
URL resolves to private IP range | No |
| PLG-8003 | INVALID_PROTOCOL |
Non-HTTP/HTTPS protocol | No |
| PLG-8004 | INVALID_URL |
URL format is invalid | No |
When it occurs:
- URL points to localhost, 127.x.x.x
- URL uses internal hostname
User Message: [PLG-8001] Internal addresses are not allowed for external sources.
Resolution:
- Use public URLs only
- For local Jenkins, configure as local source type
Context Fields:
url: The blocked URL
When it occurs:
- URL resolves to 10.x.x.x, 172.16-31.x.x, 192.168.x.x
- SSRF prevention triggered
User Message: [PLG-8002] Private IP ranges are not allowed for external sources.
Resolution:
- Use public URLs only
- Configure private sources as local type
Context Fields:
url: The blocked URL
When it occurs:
- Using FTP, file://, or other protocols
- Non-HTTP scheme in URL
User Message: [PLG-8003] Only HTTP and HTTPS protocols are allowed.
Resolution:
- Use HTTPS URLs
- HTTP is allowed but HTTPS preferred
Context Fields:
url: The blocked URL
When it occurs:
- Malformed URL string
- Missing required URL components
User Message: [PLG-8004] Invalid URL format.
Resolution:
- Check URL syntax
- Ensure URL includes protocol (https://)
Context Fields:
url: The invalid URL string
import {
isPluginatorError,
isNetworkError,
isRetryableError,
} from './core/errors';
try {
await downloadPlugin(plugin);
} catch (error) {
if (isNetworkError(error) && error.code === 'RATE_LIMITED') {
// Wait and retry
await sleep(60000);
return downloadPlugin(plugin);
}
if (isRetryableError(error)) {
// Generic retry logic
return retry(() => downloadPlugin(plugin), { maxAttempts: 3 });
}
// Non-retryable error
throw error;
}import { getPlgCode, parsePlgCode } from './core/errors';
// Get PLG code for an error type + code
const plg = getPlgCode('network', 'TIMEOUT'); // 'PLG-1001'
// Parse a PLG code back to type + code
const info = parsePlgCode('PLG-1001'); // { type: 'network', code: 'TIMEOUT' }
// Access PLG code from an error instance
const error = new NetworkError('test', 'TIMEOUT');
console.log(error.plgCode); // 'PLG-1001'
console.log(error.getUserMessage()); // '[PLG-1001] Request timed out. Please try again.'import { toPluginatorError, getUserErrorMessage } from './core/errors';
try {
await riskyOperation();
} catch (error) {
const typedError = toPluginatorError(error);
console.error(getUserErrorMessage(typedError));
}For operations that may partially succeed:
import { processBatch, type WorkflowResult } from './core/errors';
const result = await processBatch(
plugins,
(p) => p.name,
async (plugin) => downloadPlugin(plugin),
{ continueOnError: true }
);
console.log(`${result.successCount}/${result.items.length} downloaded`);
for (const failure of result.failures) {
console.error(`- ${failure.id}: ${failure.error.message}`);
}If you encounter an error that you believe is a bug:
- Note the PLG code (e.g.,
PLG-1001) and the full error message - Check the log file:
~/.pluginator/logs/pluginator-YYYY-MM-DD.log - Ask in the NindroidSystems Discord for quick help
- Open an issue at: https://github.com/NindroidA/pluginator/issues
Include:
- Pluginator version (
/version) - Operating system
- PLG error code and full message
- Steps to reproduce
- Relevant log entries