I wrote a simple API script that you can add to your campaign backend to help optimize large maps with lots of assets on them. This helps people with older hardware. I mostly did this because you can buy old chromebooks on Amazon for as cheap as $50 each for your players to use and this helps maps run on cheap hardware. Command Effect !cleanup-tokens Disables token menus on map and foreground layers only !cleanup-vision Turns off bright/night vision and bright/low light emission on all tokens on the page !cleanup-bars Hides player-visible names and bars 1–3 on all tokens on the page Here is the script: on ( 'ready' , () => { log ( '--- Token Cleanup Script Ready ---' ); const getCurrentPage = ( playerid ) => { const player = getObj ( 'player' , playerid ); return player . get ( 'lastpage' ) || Campaign (). get ( 'playerpageid' ); }; on ( 'chat:message' , ( msg ) => { // Only trigger on command from a GM if ( msg . type !== 'api' || ! playerIsGM ( msg . playerid )) return ; const currentPageId = getCurrentPage ( msg . playerid ); const page = getObj ( 'page' , currentPageId ); const pageName = page ? page . get ( 'name' ) : 'Unknown Page' ; // 1. !cleanup-tokens: Disable menus on Map/Foreground layers if ( msg . content . indexOf ( '!cleanup-tokens' ) === 0 ) { sendChat ( 'Token Cleanup' , `/w gm Cleaning up token menus on Page: " ${ pageName } " (Map and Foreground layers)...` ); const layersToClean = [ 'map' , 'foreground' ] ; let count = 0 ; const allGraphics = findObjs ({ _type : 'graphic' , _pageid : currentPageId }); allGraphics . forEach ( obj => { if ( layersToClean . includes ( obj . get ( 'layer' ))) { obj . set ( 'disableTokenMenu' , true); count ++ ; } }); sendChat ( 'Token Cleanup' , `/w gm Finished! Disabled menus for ${ count } tokens.` ); } // 2. !cleanup-vision: Turn off vision for ALL tokens on ALL layers if ( msg . content . indexOf ( '!cleanup-vision' ) === 0 ) { sendChat ( 'Token Cleanup' , `/w gm Disabling vision for all tokens on Page: " ${ pageName } "...` ); let count = 0 ; const allGraphics = findObjs ({ _type : 'graphic' , _pageid : currentPageId }); allGraphics . forEach ( obj => { // Disable common vision/light properties obj . set ({ has_bright_light_vision : false, has_night_vision : false, emits_bright_light : false, emits_low_light : false }); count ++ ; }); sendChat ( 'Token Cleanup' , `/w gm Finished! Disabled vision for ${ count } tokens.` ); } // 3. !cleanup-bars: Hide names and bars for ALL tokens on ALL layers if ( msg . content . indexOf ( '!cleanup-bars' ) === 0 ) { sendChat ( 'Token Cleanup' , `/w gm Hiding names and bars for all tokens on Page: " ${ pageName } "...` ); let count = 0 ; const allGraphics = findObjs ({ _type : 'graphic' , _pageid : currentPageId }); allGraphics . forEach ( obj => { obj . set ({ showplayers_name : false, showplayers_bar1 : false, showplayers_bar2 : false, showplayers_bar3 : false }); count ++ ; }); sendChat ( 'Token Cleanup' , `/w gm Finished! Hid names and bars for ${ count } tokens.` ); } }); });