Skip to content

04. Full Config Explanation

Clayton Burlison edited this page Nov 16, 2023 · 12 revisions

Important

  • Below is the full default.json file and explanations for all of the values.

General Rule:

  • If an item is an object, indicated by curly brackets {}, then the options are limited to what's in this document.
  • If the item is an array, indicated by square brackets [], then you can add unlimited number of items to it.
  • Copying and pasting from this Wiki does not guarantee comma placement is correct for your json!

Top Level

{
  // Interface that ReactMap is hosted on
  "interface": "0.0.0.0",
  // Port that ReactMap is being hosted on
  "port": 8080,
  // "git" / "docker"
  "packageSource": "git"
}

Dev Options

{
  "devOptions": {
    // Enables extra logging for development
    "enabled": false,
    // Enables 'http://interface:port/graphql' for debugging
    "graphiql": false,
    // Enables query debug statements
    "queryDebug": false,
    // Sets a custom client path
    "clientPath": "../../dist",
    // Log client side errors
    "clientErrors": false
  }
}

API Options

{
  "api": {
    // Session secret, changing this forces all of your users to logout
    "sessionSecret": "98ki^e72~!@#(85o3kXLI*#c9wu5l!Z",
    // React Map Secret used for accessing API endpoints
    "reactMapSecret": "You Should Change Me",
    // Show your schema information, including passwords, when accessing the config API
    "showSchemasInConfigApi": false,
    // Show your authentication strategies, including tokens, when accessing the config API
    "showStrategiesInConfigApi": false,
    // # of active sessions your users can each have at once
    "maxSessions": 5,
    // How often should the server check for expired sessions (ms)
    "sessionCheckIntervalMs": 900000,
    // # of days until the cookie expires for each client session
    "cookieAgeDays": 7,
    "rateLimit": {
      // Time in seconds that sets the rate limit period
      "time": 60,
      // # of requests allowed within that rate limit period
      "requests": 1000
    },
    // How often the client should poll for an update in seconds
    "polling": {
      "devices": 10,
      "gyms": 10,
      "nests": 300,
      "pokemon": 20,
      "pokestops": 300,
      "portals": 300,
      "scanAreas": 10000,
      "scanCells": 10,
      "submissionCells": 500,
      "weather": 30
    },
    // which categories are enabled for searching on the client
    "searchable": {
      "quests": true,
      "pokestops": true,
      "raids": true,
      "gyms": true,
      "portals": true,
      "nests": true,
      "pokemon": true
    },
    // How often ReactMap's Event Manager should update what Pokemon, Quests, Raids, and Nests are available
    "queryUpdateHours": {
      "pokemon": 0.5,
      "quests": 1,
      "raids": 0.5,
      "nests": 3,
      "historicalRarity": 6
    },
    // Setting these to true will result in the safest experience for your users, since what's available will always be fetched on session init, but it will result in a much slower startup time
    "queryOnSessionInit": {
      "pokemon": false,
      "quests": false,
      "raids": true,
      "nests": false
    },
    // If you want to limit how many items can be queried from your DB to save on response times
    "queryLimits": {
      "pokemon": 10000,
      // Pvp results are ran separately due to the complexity
      "pokemonPvp": 25000,
      "pokestops": 5000,
      "gyms": 5000,
      "portals": 5000,
      "spawnpoints": 10000,
      "nests": 2500,
      "scanCells": 5000
    },
    "pvp": {
      // Leagues you would like displayed
      // And parsed if ReactMap is calculating PVP
      "leagues": [
        {
          "name": "little",
          "cp": 500,
          // Follows Little Cup Specific Rules
          "littleCupRules": false
        }
        {
          "name": "great",
          "cp": 1500
        },
        {
          "name": "ultra",
          "cp": 2500
        }
      ],
      // Levels that you would like parsed
      // Only valid if using Chuck or reactMapHandlesPvp
      "levels": [50, 51],
      // uses internal PVP engine when set to true
      "reactMapHandlesPvp": false,
      // Only necessary if using RDM for PVP
      "minCp": {
        "great": 1400,
        "ultra": 2400
      }
    },
    // Number of days used to filter out old portals
    "portalUpdateLimit": 30,
    // Number of days used to filter out unscanned weather cells
    "weatherCellLimit": 3,
    // Number of search results to return when using the global search
    "searchResultsLimit": 15,
    // Used to fetch nest lists
    "nestHemisphere": "north",
    // Hide gyms older than 30 days
    "gymValidDataLimit": 30,
    // If set to false, gyms are just greyed out instead of hidden
    "hideOldGyms": false,
    // Same for Pokestops
    "stopValidDataLimit": 30,
    "hideOldPokestops": false,
    // Timeout for server side fetches in milliseconds
    "fetchTimeout": 3000,
    // Various endpoints to fetch external data from
    // If you change these, the format must still be the same!
    // Make sure you know what you're doing
    "pogoApiEndpoints": {
      "invasions": "https://raw.githubusercontent.com/WatWowMap/event-info/main/grunts/formatted.json",
      "masterfile": "https://raw.githubusercontent.com/WatWowMap/Masterfile-Generator/master/master-latest-react-map.json",
      "translations": "https://raw.githubusercontent.com/WatWowMap/pogo-translations/master"
    }
  }
}

Multi Domain Support

More Info

{
  // Keys are set to the full host of the domain you wish to customize.
  // Any properties from the below "map" obj can be added to this.
  "multiDomains": []
}

Map

{
  "map": {
    "general": {
      // Map Title
      "title": "ReactMap",
      // Browser Title
      "headerTitle": "ReactMap",
      // Map start latitude
      "startLat": 0,
      // Map start longitude
      "startLon": 0,
      // Map start zoom
      "startZoom": 12,
      // Map min zoom (zooming out)
      "minZoom": 10,
      // Map max zoom (zooming in)
      "maxZoom": 18,
      // Min zoom to activate interaction ranges
      "interactionRangeZoom": 15,
      // Zoom to fly to when going clicking on a scan area
      "scanAreasZoom": 12,
      // Min zoom to active scan cells
      "scanCellsZoom": 13,
      // Min zoom to activate submission cells
      "submissionZoom": 15,
      // Min zoom to show the active weather icon in the top right corner
      "activeWeatherZoom": 13,
      // geojson file name, placed in the same folder as your local.json
      "geoJsonFileName": "areas.json",
      // Prefix for the map tile attribution
      "attributionPrefix": "<a href='https://github.com/WatWowMap/ReactMap' target='_blank' rel='noreferrer'>ReactMap</a>",
      // The order that the main drawer will display its various categories
      "menuOrder": [
        "gyms",
        "nests",
        "pokestops",
        "pokemon",
        "wayfarer",
        "scanAreas",
        "weather",
        "admin",
        "settings"
      ]
    },
    // Frontend locales available to your users
    "localeSelection": [
      "en",
      "de",
      "es",
      "fr",
      "hi",
      "id",
      "it",
      "ja",
      "ko",
      "nl",
      "pl",
      "ru",
      "sv",
      "th"
      "th",
      "tr"
    ],
    // Used for multidomains when setting up custom authentication strategies
    "customRoutes": {
      // custom discord route
      "discordAuthUrl": "/auth/discord/callback",
      // custom telegram route
      "telegramAuthUrl": "/auth/telegram/callback",
      // The name of your telegram bot
      "telegramBotName": "",
      // custom local route
      "localAuthUrl": "/auth/local/callback"
    },
    "links": {
      // Discord invite link, shows on the login screen
      "discordInvite": "",
      // Feedback link, if you would like to add a feedback form for your users
      "feedbackLink": "",
      // Stats page link, if you would like to add a stats page for your users
      "statsLink": "",
      // Custom name for the roles button on the profile page
      "rolesLinkName": "Role Upgrading Info",
      // Link for the roles button on the profile page
      "rolesLink": ""
    },
    // Various holiday CSS/JS effects on certain holidays
    "holidayEffects": [
      {
        // Purely a label for internal config viewing
        "name": "New Years",
        // Kill switch if you want to maintain it in your config
        "enabled": true,
        // array of image URLs, can be local images hosted in `public/images/custom` as well
        "images": [],
        // Can be `snow` or `fireworks` to use some custom CSS affects
        "css": "snow",
        // The day the effects should start
        "startDay": 31,
        // The month the effects should start
        "startMonth": 12,
        // The day the effects should end
        "endDay": 1,
        // The month the effects should end
        "endMonth": 1
      }
    ],
    "misc": {
      // Enables the advanced MapJS filtering system
      "enableMapJsFilter": true,
      // Fetches latest invasions during session init
      "fetchLatestInvasions": true,
      // How long to cache the latest invasions for before fetching again
      "invasionCacheHrs": 1,
      // How long to to cache the masterfile before fetching again
      "masterfileCacheHrs": 6,
      // How long to cache webhook settings before fetching again
      "webhookCacheHrs": 1,
      // Set a custom Has AR/Does not have AR indicator for quests
      "questMessage": "",
      // Navigation control style "react"/"leaflet"
      "navigationControls": "react",
      // Enables a floating profile button on the main map screen
      "enableFloatingProfileButton": false,
      // Makes first time users view the tutorial
      "forceTutorial": true,
      // Enables/disables the tutorial entirely
      "enableTutorial": true,
      // Enables the user profile
      "enableUserProfile": true,
      // Enables the Has AR/Does not have AR/both quest filter
      // Probably best to only set to true if you scan both sets of quests
      "enableQuestSetSelector": false,
      // Disable polygon overlay for your geojson
      "noScanAreaOverlay": false,
      // If you want to set custom, git-friendly images for the permissions profile page
      "permImageDir": "images/perms",
      // If you want to use images for the perms that are arrays
      // Area Restrictions and Webhooks currently
      "permArrayImages": false,
      // How many minutes before the client sessions go into standby mode if the tab/window is inactive
      "clientTimeoutMinutes": 30,
      // Unit used for client side searching to display distance (km/mi)
      "distanceUnit": "km"
    },
    // Customize the map's main colors
    "theme": {
      "primary": "#ff5722",
      "secondary": "#00b0ff",
    },
    // Sets clustering settings
    "clustering": {
      "gyms": {
        // Zoom level to enable clustering
        "zoomLevel": 13,
        // Number of items before clustering is forced
        "forcedLimit": 2500
      },
      "pokestops": {
        "zoomLevel": 14,
        "forcedLimit": 2500
      },
      "pokemon": {
        "zoomLevel": 15,
        "forcedLimit": 3000
      },
      "portals": {
        "zoomLevel": 14,
        "forcedLimit": 3000
      },
      "spawnpoints": {
        "zoomLevel": 12,
        "forcedLimit": 5000
      }
    },
    // Message of the Day, Donation, and Long page settings:
    // See https://github.com/WatWowMap/ReactMap/wiki/08.-Additional-Info#custom-pages
    // Shows a motd for your users at beginning of the session
    "messageOfTheDay": {
      "index": 0,
      "settings": {
        "parentSpacing": 0,
        "parentAlignItems": "center",
        "parentJustifyContent": "center",
        "parentStyle": {},
        "permanent": false,
        "freeloaderOnly": false,
        "donorOnly": false
      },
      "titles": [],
      "components": [],
      "footerButtons": []
    },
    // Customize a donation page, there is no default donation page
    "donationPage": {
      "showOnMap": false,
      "showToDonors": false,
      "fabIcon": "card",
      "settings": {
        "parentSpacing": 0,
        "parentAlignItems": "center",
        "parentJustifyContent": "center",
        "parentStyle": {}
      },
      "titles": [],
      "components": [],
      "footerButtons": []
    },
    // Customize the login page
    "loginPage": {
      "settings": {
        "parentSpacing": 0,
        "parentAlignItems": "center",
        "parentJustifyContent": "center",
        "parentStyle": {}
      },
      "components": []
    }
  },

Client Side Defaults

{
  "clientSideOptions": {
    "admin": {
      // Sets the device path color (RDM Only)
      "devicePathColor": "#ff1744"
    },
    "gyms": {
      // Clustering for Gyms
      "clustering": true,
      // Shows all raid timers
      "raidTimers": false,
      // Interaction range circles for gyms
      "interactionRanges": false
      // Show EX Badge on eligible gyms on the map
      "showExBadge": false,
      // Show AR badge on eligible gyms on the map
      "showArBadge": false,
      // Show raid level badge on gyms with raids
      "raidLevelBadges": false,
      // Toggles showing gym badge diamonds for gyms with set badges
      "gymBadgeDiamonds": true
    },
    "pokestops": {
      // Clustering for pokestops
      "clustering": true,
      // Shows all invasion timers
      "invasionTimers": false,
      // Shows all lure timers
      "lureTimers": false,
      // Shows all timers for special event pokestops
      "eventStopTimers": false,
      // Interaction range circles for pokestops
      "interactionRanges": false,
      // Lure range circles
      "lureRange": false,
      // Shows native quest text (MAD only)
      "madQuestText": false,
      // Pokestop will be alternative color if uicons repo supports it
      "hasQuestIndicator": true,
      // Show AR badge on eligible Pokestops on the map
      "showArBadge": false
    },
    "pokemon": {
      // Clustering for pokemon
      "clustering": true,
      // Sets legacy MapJS String Filter to be on by default
      "legacyFilter": false,
      // Shows IV badges on pokemon
      "ivCircles": false,
      // Min IV to show an IV badge
      "minIvCircle": 90,
      // Dex # instead of pokemon image in popup
      "showDexNumInPopup": false,
      // Mega PVP Stats
      "pvpMega": false,
      // Interaction range circles for pokemon
      "interactionRanges": false,
      // Show weather boost indicator
      "weatherIndicator": false,
      // Link global & Advanced menus, requiring pokemon to be selected in adv in order to show
      "linkGlobalAndAdvanced": false,
      // Show XXS/XXL etc size indicator on the leaflet marker
      "showSizeIndicator": false,
      // Unlimited number of glow rules can be added to this array
      // See https://github.com/WatWowMap/ReactMap/wiki/08.-Additional-Info#glow-options
      "glow": [
        {"name": "Hundo", "perm": "iv", "num": 100, "value": "#ff1744", "op": "=" },
        {"name": "Top 3 Ranks", "perm": "pvp", "num": 3, "value": "#0000ff", "op": "<=" },
        // Rule that applies if multiple glow rules are satisfied, do not remove but feel free to customize the color
        {"name": "Multiple", "perm": "pvp", "value": "#800080" }
      ]
    },
    "wayfarer": {
      // Clustering for portals
      "clustering": true,
      // Color for portals imported > 24 hours ago
      "oldPortals": "#0000ff",
      // Color for portals imported < 24 hours ago
      "newPortals": "#16b819",
      // Various other color settings used with Wayfarer cells and POIs
      "twoStopsTillNext": "#ffa500",
      "oneStopTillNext": "#ff0000",
      "noMoreGyms": "#000000",
      "lightMapBorder": "#000000",
      "darkMapBorder": "#ff0000",
      "cellBlocked": "#000000",
      "poiColor": "#03ffff"
    },
    "weather": {
      // Zoomed in weather icon is clickable to display info
      "clickableIcon": false,
      // Border for weather cells when dark themed map tiles are used
      "darkMapBorder": "#ff0000",
      // same but for light map tiles
      "lightMapBorder": "#246377"
    }
  },
}

Default filters

{
  "defaultFilters": {
    "devices": {
      "enabled": false
    },
    "gyms": {
      // Enables gyms being displayed
      "enabled": true,
      // Enables all teams being selected in the adv menu
      "allGyms": true,
      // Power Up Levels default (1/2/3/"all")
      "levels": "all",
      // Enables global ex eligible gyms
      "exEligible": false,
      // Enables global gyms that are in battle
      "inBattle": false,
      // Enables raids globally
      "raids": true,
      // Enables all raid eggs in the adv menu
      "eggs": true,
      // Enables all raid bosses in the adv menu
      "pokemon": true,
      // Enables gym badges
      "gymBadges": false,
      // Base Raid tiers that will always be displayed
      // Others will be added depending on what's in your database.
      // If you want tier 7 to always be displayed, just add it to this array.
      "baseRaidTiers": [
        1,
        3,
        5,
        6
      ],
      // Don't touch this unless you know what you're doing
      // Exists in case other teams are ever added to the game and I'm dead
      "baseTeamIds": [
        0,
        1,
        2,
        3
      ],
      // Don't touch this unless you know what you're doing
      // Exists in case the gym system changes and I'm dead
      "baseGymSlotAmounts": [
        1,
        2,
        3,
        4,
        5,
        6
      ]
    },
    "nests": {
      // Nest polygons
      "polygons": false,
      // Nest Pokemon
      "pokemon": false,
      // All Pokemon in the adv nest menu
      "allPokemon": true,
      // Sets the default and the limits of the avg spawn / hr slider
      "avgFilter": [0, 100],
      // Sets the step for the avg spawn / hr slider
      "avgSliderStep": 1
    },
    "pokestops": {
      // All Pokestops
      "enabled": false,
      // Global Lures
      "lures": true,
      // Global Quests
      "quests": true,
      // Event stops
      "eventStops": false,
      // Sets the default questSelection
      // Leave both if you only scan one set
      // "both/with_ar/without_ar"
      "questSet": "both",
      // Item rewards in the adv menu
      "items": true,
      // Mega Energy Rewards in the adv menu
      "megaEnergy": true,
      // Candy rewards in the adv menu
      "candy": true,
      // Pokemon rewards in the adv menu
      "pokemon": true,
      // Global invasions
      "invasions": false,
      // All invasions in the adv menu
      "allInvasions": true,
      // Reward types in the adv menu
      "rewardTypes": false,
      // Mega Energy amounts to always show
      // Others will be added based on what's in your database
      "baseMegaEnergyAmounts": [
        10,
        20
      ],
      // Base lures to show
      // Others will be added based on what's in your database
      "baseLureIds": [
        501,
        502,
        503,
        504,
        505
      ],
      // Base stardust amounts to show
      // Others will be added based on what's in your database
      "stardust": {
        // Lowest amount
        "min": 100,
        // Max amount
        "max": 2000,
        // Adds an entry every...
        "interval": 100,
        // Stardust filters enabled in adv menu by default
        "enabled": true
      },
      "xp": {
        // same as above but for XP rewards
        "min": 100,
        "max": 1000,
        "interval": 100,
        "enabled": true
      }
    },
    "pokemon": {
      // Global Pokemon
      "enabled": false,
      // Enables all Pokemon in adv menu
      // Recommended to leave false
      "allPokemon": false,
      // xs rats
      "xsRat": false,
      // xl karps
      "xlKarp": false,
      // Global slider default values
      "globalValues": {
        "iv": [80, 100],
        "level": [1, 35],
        "atk_iv": [0, 15],
        "def_iv": [0, 15],
        "sta_iv": [0, 15],
        "pvp": [1, 10],
        "gender": 0,
        "cp": [
          10,
          5000
        ],
        "xxs": false,
        "xxl": false
      }
    },
    "portals": {
      "enabled": false
    },
    "scanAreas": {
      // Geojson overaly enabled
      "enabled": false
    },
    "scanCells": {
      "enabled": false
    },
    "spawnpoints": {
      "enabled": false
    },
    "submissionCells": {
      "enabled": false,
      // Show POIs
      "rings": true,
      // Show S17 cells
      "s17Cells": true,
      // Show S14 cells
      "s14Cells": true
    },
    "weather": {
      "enabled": true
    }
  }
}

Database

More Info

{
  "database": {
    "settings": {
      // User table name
      "userTableName": "users",
      // Gym badge table name
      "gymBadgeTableName": "gymBadges",
      // Session table name
      "sessionTableName": "session",
      // Knex migration table name
      "migrationTableName": "knex_migrations",
      // Only set to true if your gym table and gym badge table are in the same db
      // Slight performance upgrade when true
      "joinGymBadgeTable": false,
      // only necessary for MAD, hides expired quests
      "hideOldQuests": false,
      // max number of db connections
      "maxConnections": 10,
      // See this PR https://github.com/WatWowMap/ReactMap/pull/579
      "extraUserFields": [
        "paypal_name",
        {
          "name": "paypal",
          "en": "paypal",
          "es": "spanish_paypal",
          "database": "paypal_ish"
        }
      ]
    },
    // You can add an UNLIMITED numbers of schemas here
    // They can even be a mix of mad and rdm, the type will automatically be detected
    // the gym badge table will be wherever "user" is at
    "schemas": [
      // Your Scanner database
      {
        "host": "127.0.0.1",
        "port": 3306,
        "username": "user",
        "password": "pass123!",
        "database": "scanner_db",
        "useFor": [
          "device",
          "gym",
          "pokemon",
          "pokestop",
          "scanCell",
          "spawnpoint",
          "weather"
        ]
      },
      // Your ReactMap database
      {
        "host": "127.0.0.1",
        "port": 3306,
        "username": "user",
        "password": "pass123!",
        "database": "reactmap_db",
        "useFor": ["session", "user"]
      }
      // Your manual database
      {
        "host": "127.0.0.1",
        "port": 3306,
        "username": "user",
        "password": "pass123!",
        "database": "manual_db",
        "useFor": ["nest", "portal"]
      }
      // Your Golbat In-Memory Endpoint
      {
        "type": "golbat",
        "endpoint": "http://127.0.0.1:9001",
        "secret": "golbat_api_secret",
        "useFor": [
          "pokemon"
        ]
      },
    ]
  }
}

Scan on Demand (ScanNext/ScanZone/Scout Mode)

  "scanner": {
    "backendConfig": {
      // scanner backend type
      "platform": "rdm/mad/custom",
      // scanner API endpoint
      "apiEndpoint": "http://ip:port/api",
      // authorized API user credentials
      "apiUsername": "username",
      "apiPassword": "password",
      // Minimum interval to request queue from scanner
      "queueRefreshInterval": 5 
    },
    "scanNext": {
      // to enable the scanNext floating button and feature
      "enabled": false,
      // Show number of scan request in popup
      "showScanCount": false,
      // Show current queue in popup
      "showScanQueue": false,
      // the scanner instance to which the requests will be made (RDM)
      "scanNextInstance": "scanNext",
      // the scanner device to which the requests will be made (MAD)
      "scanNextDevice": "Device01",
      // MAD sleeptime option
      "scanNextSleeptime": 5,
      // allowed areas for the scans (needs a valid areas.json with name matching)
      "scanNextAreaRestriction": [],
      // Discord roles that will be allowed to use scanNext
      "discordRoles": [],
      // Telegram group that will be allowed to use scanNext
      "telegramGroups": []
    },
    "scanZone": {
      // to enable the scanZone floating button and feature (RDM only)
      "enabled": false,
      // Show number of scan request in popup
      "showScanCount": false,
      // Show current queue in popup
      "showScanQueue": false,
      // the maximum size allowed for the scan zone area
      "scanZoneMaxSize": 10,
      // enables advanced options in popup (spacing and radius)
      "advancedScanZoneOptions": false,
      // default circle sizes
      "scanZoneRadius": { "pokemon": 70, "gym": 750 },
      // default spacing coefficient
      "scanZoneSpacing": 1,
      // the scanner instance to which the requests will be made
      "scanZoneInstance": "scanZone",
      // allowed areas for the scans (needs a valid areas.json with name matching)
      "scanZoneAreaRestriction": [],
      // Discord roles that will be allowed to use scanZone
      "discordRoles": [],
      // Telegram group that will be allowed to use scanZone
      "telegramGroups": []
    }
  },

For Dragonite. Use this option if ReactMap is on the same network as Dragonite.

 "scanner": {
    "backendConfig": {
      "platform": "custom",
      "apiEndpoint": "http://{drago_ip}/scout",
    },

For Dragonite Admin. Use this option if ReactMap is on a different network from Dragonite. This will proxy the request through Dragonite Admin to Dragonite utilizing the api_secret value.

  "scanner": {
    "backendConfig": {
      "platform": "custom",
      "apiEndpoint": "http://{d_admin_ip}/api/scout",
      "headers": [
        { "key": "X-Dragonite-Admin-Secret", "value": "your_api_secret_set_in_admin_config" }
      ],
    },

Authentication

{
  "authentication": {
    // You can add an unlimited number of strategies here
    "strategies": [
      {
        // The name of the strategy for your reference
        "name": "discord",
        // The type of strategy to interact with backend strategies
        "type": "discord",
        // whether to enable it or not
        "enabled": false,
        // Discord log channel ID, must have message writing perms
        "logChannelId": "",
        // Discord scanNext log channel ID
        "scanNextLogChannelId": "",
        // Discord scanZone log channel ID
        "scanZoneLogChannelId": "",
        // Discord bot presence
        "presence": "Map Status: Online",
        // Discord bot presence type
        "presenceType": 3,
        // Discord bot token
        "botToken": "",
        // Discord client id
        "clientId": "",
        // Discord client secret
        "clientSecret": "",
        // Discord redirect uri, must add to bot in the Discord developer panel
        "redirectUri": "http://localhost:8080/auth/discord/callback",
        // Allowed guilds "1231419501"
        "allowedGuilds": [],
        // Blocked guilds "12341415213"
        "blockedGuilds": [],
        // Users that will always have all perms "1235325321431"
        "allowedUsers": [],
        // Thumbnail image used in scanNext/scanZone log channels, must be https
        "thumbnailUrl": "https://user-images.githubusercontent.com/58572875/167069223-745a139d-f485-45e3-a25c-93ec4d09779c.png"
      },
      {
        "name": "telegram",
        "type": "telegram",
        "enabled": false,
        // Telegram bot token
        "botToken": "",
        // All groups that will have some perms
        "groups": []
      },
      {
        // Local authentication, mostly meant for custom strategies
        "name": "local",
        "type": "local",
        "enabled": false
      }
    ],
    // Area restrictions, add an unlimited numbers of rules
    "areaRestrictions": [],
    // {
    // Discord Roles and Telegram Groups or "local"
    //   "roles": [],
    // Areas that the above roles will be allowed to view
    //   "areas": []
    // },
    // Perms to exclude from the tutorial/profile page
    "excludeFromTutorial": [],
    // Perms that are always enabled for everyone
    "alwaysEnabledPerms": [],
    "perms": {
      // View the map
      "map": {
        // Hide from everyone if enabled = false
        "enabled": true,
        // Array of Discord role IDs, Telegram Groups, or "local"
        // Must be strings, not numbers!
        "roles": []
      },
      // Basic Pokemon without any IVs
      "pokemon": {
        "enabled": true,
        "roles": []
      },
      // Pokemon IVs
      "iv": {
        "enabled": true,
        "roles": []
      },
      // Pokemon PVP stats
      "pvp": {
        "enabled": true,
        "roles": []
      },
      // Gym details
      "gyms": {
        "enabled": true,
        "roles": []
      },
      // Raids
      "raids": {
        "enabled": true,
        "roles": []
      },
      // Stop locations
      "pokestops": {
        "enabled": true,
        "roles": []
      },
      // Quests
      "quests": {
        "enabled": true,
        "roles": []
      },
      // Lures
      "lures": {
        "enabled": true,
        "roles": []
      },
      // Portals
      "portals": {
        "enabled": true,
        "roles": []
      },
      // Submission cells
      "submissionCells": {
        "enabled": true,
        "roles": []
      },
      // Invasions
      "invasions": {
        "enabled": true,
        "roles": []
      },
      // Nests
      "nests": {
        "enabled": true,
        "roles": []
      },
      // Scan Areas from the geojson
      "scanAreas": {
        "enabled": true,
        "roles": []
      },
      // Weather
      "weather": {
        "enabled": true,
        "roles": []
      },
      // Spawnpoints
      "spawnpoints": {
        "enabled": true,
        "roles": []
      },
      // Scancells
      "scanCells": {
        "enabled": true,
        "roles": []
      },
      // Devices
      "devices": {
        "enabled": true,
        "roles": []
      },
      // Indicates whether a user is a donor or not
      // for use with the custom donation page and MotD
      "donor": {
        "enabled": true,
        "roles": []
      },
      // Access to gym badge features
      "gymBadges": {
        "enabled": true,
        "roles": []
      }
    }
  }
}

Webhooks

More Info

  "webhooks": [],

Tileservers

{
  // You can add an unlimited number of tileservers as well
  "tileServers": [
    {
      // Auto tileserver to show dark tiles at night and light during the day
      // Users the first tileserver in this array for light
      // Same for dark
      // First tileserver will be the default
      "name": "auto"
    },
      // You can add custom tileservers like so, with custom variations for day/night/dawn/dusk
    {
      "name": "Pogo",
      "attribution": "NPlumb",
      "url": "https://your_custom_tileserver/tile/pogo_day/{z}/{x}/{y}/2/png",
      "day": "https://your_custom_tileserver/tile/pogo_day/{z}/{x}/{y}/2/png",
      "night": "https://your_custom_tileserver/tile/pogo_night/{z}/{x}/{y}/2/png",
      "dawn": "https://your_custom_tileserver/tile/pogo_dawn/{z}/{x}/{y}/2/png",
      "dusk": "https://your_custom_tileserver/tile/pogo_dusk/{z}/{x}/{y}/2/png"
    },
    {
      "name": "Carto",
      "attribution": "Map tiles by Carto, under CC BY 3.0. Data by  <a href='https://www.openstreetmap.org/'>OpenStreetMap</a>, under ODbL.",
      "url": "https://{s}.basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}{r}.png",
      "style": "light"
    },
    {
      "name": "OSM",
      "attribution": "Map data © <a href='https://www.openstreetmap.org'>OpenStreetMap</a> contributors",
      "url": "https://tile.openstreetmap.org/{z}/{x}/{y}.png",
      "style": "light"
    },
    {
      "name": "Dark Matter",
      "attribution": "© <a href='https://www.openstreetmap.org/copyright'>OpenStreetMap</a> contributors © <a href='https://carto.com/attributions'>CARTO</a>",
      "url": "https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png",
      "style": "dark"
    },
    {
      "name": "Satellite",
      "attribution": "&copy; Esri &mdash; Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Getmapping, Aerogrid, IGN, IGP, UPR-EGP, and the GIS User Community",
      "url": "https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",
      "style": "dark"
    },
    // Paid
    {
      "name": "AlidadeSmoothDark",
      "attribution": "&copy; <a href='https://stadiamaps.com/'>Stadia Maps</a>, &copy; <a href='https://openmaptiles.org/'>OpenMapTiles</a> &copy; <a href='http://openstreetmap.org'>OpenStreetMap</a> contributors",
      "url": "https://tiles.stadiamaps.com/tiles/alidade_smooth_dark/{z}/{x}/{y}{r}.png",
      "style": "dark"
    },
    // Paid
    {
      "name": "ThunderForest",
      "attribution": "&copy; <a href='http://www.thunderforest.com/'>Thunderforest</a>, &copy; <a href='https://www.openstreetmap.org/copyright'>OpenStreetMap</a> contributors",
      "url": "https://{s}.tile.thunderforest.com/transport-dark/{z}/{x}/{y}.png",
      "style": "dark"
    }
  ]
}

Navigation

{
  // Navigation options, first item will be default, you can add more
  "navigation": [
    {
      // Name to display, not translated
      "name": "Google Maps",
      // Url format for nav
      "url": "https://www.google.com/maps/place/{x},{y}"
    },
    {
      "name": "Apple Maps",
      "url": "https://maps.apple.com/maps?daddr={x},{y}"
    },
    {
      "name": "Waze",
      "url": "https://www.waze.com/ul?ll={x},{y}"
    },
    {
      "name": "Intel",
      "url": "https://intel.ingress.com/intel?pll={x},{y}"
    }
  ]
}

Custom Rarity Tiers

{
  // Set these if you don't want to use the default found in server/src/data/defaultRarity.json
  // You must generate the masterfile after updating these - yarn run generate
  // Supports Pokemon ID #s
  "rarity": {
    // Set percentage tiers when the database is querying for setting rarity dynamically
    "percents": {
      "uncommon": 0.25,
      "rare": 0.1,
      "ultraRare": 0.01
    },
    "common": [],
    "uncommon": [],
    "rare": [],
    "ultraRare": [],
    "regional": [],
    "event": []
  }
}

Manual Areas

// Manual Areas to display in the selectable menu in the sidebar if you have too many in your Areas.json
{
  "manualAreas": [
    {
      // Display Name
      "name": "New York",
      "lat": 40.7481666,
      "lon": -74.0174788,
      // Zoom level to set when jumping to it
      "zoom": 20,
      // Border Color
      "color": "blue",
      // Background Color
      "fillColor": "orange"
    },
    {
      "name": "Manhatten",
      "lat": 40.7481666,
      "lon": -74.0174788,
      "zoom": 20,
      // Sets it as a child of "New York"
      // Having a "New York" object, like the one above this entry, is optional
      // If omitted, the New York button will be visible, but not interactive
      "parent": "New York",
      "color": "teal",
      "fillColor": "yellow"
    },
  ]
}