If I don't hear anything, I'll try the other forum. For the moment, the custom scripts don't run out of github; I just have the small code saved in Roll20 itself. Both were made by others who helped out with specific requests in years past. The code for the smaller one, called Inspect GM Notes, is : on('ready',() => { on('chat:message',(msg) => { if('api' === msg.type && msg.content.match(/^!inspect/) ){ let content = msg.content.split(/\s+/); let token=getObj('graphic',content[1]); if(token){ let who = getObj('player',msg.playerid).get('displayname'); sendChat('',`/w "${who}" <div style="border:1px solid #999;border-radius:.5em;padding:.1em .5em; font-size: .6em;background-color:#eee; color:#333;">${unescape(token.get('gmnotes')).replace(/(?:[\n\r]+|<br\/?>)/g,'<br>')}</div>`); } } }); }); The code for the second one, meant to help with loot, is: /* !Loot @{target|token_id} or !Loot @{selected|token_id} You must have an Ability on the character sheet named Loot. This will be printed out, will roll any inline rolls, and preserve paragraphs. */ var loot = loot || (function () { 'use strict'; const version = '0.2', COMMAND = 'Loot', // this is the name you must use for the Ability, make sure capitalisation matches. HPBAR = 1, // this is the bar used for tracking HP MARKER = 'trophy', // set the status marker used to show if treasure has been rolled for this token. scriptName = 'Loot', lastUpdate = 1545180290523, divider = ' -|- ', // do not use same as newline newline = '--', random = '|', checkInstall = function () { log('--| ' + scriptName + ' v' + version + ' |-- [' + (new Date(lastUpdate)) + ']'); }, processInlinerolls = function (msg) { if (_.has(msg, 'inlinerolls')) { return _.chain(msg.inlinerolls) .reduce(function(previous, current, index) { previous['$[[' + index + ']]'] = current.results.total || 0; return previous; },{}) .reduce(function(previous, current, index) { return previous.replace(index, current); }, msg.content) .value(); } else { return msg.content; } }, getSpeaker = function(msg) { let characters = findObjs({_type: 'character'}); let speaking; characters.forEach(function(chr) { if(chr.get('name') == msg.who) speaking = chr; }); let speaker = speaking ? 'character|'+speaking.id : 'player|'+msg.playerid; return speaker; }, handleInput = function (msg) { if ('api' === msg.type && msg.content.match(`!format${COMMAND} `)) { let args = processInlinerolls(msg).split(divider); //); let lootBase = args[2].split(newline); let loot = [], i = 0; lootBase.forEach(row => { let item = row.split(random); loot[i] = item.length === 1 ? item : item[randomInteger(item.length -1)]; i ++; }); let output = `&{template:spell} {{name=${args[1].trim()}'s Treasure}} {{description=${loot.join('\n')}}}`; let speaker = args[3]; sendChat(speaker,output); } else if ('api' === msg.type && msg.content.match(`!${COMMAND} `)) { let id = msg.content.replace(`!${COMMAND}`,'').trim(); let token = findObjs({_type: 'graphic', id: id})[0]; let tname = token.get('name'); if(!token) { sendChat(COMMAND,'Token Not Found'); return; } if(token.get('status_' + MARKER)) { sendChat(COMMAND,`${tname} has already been looted.`); return; } let character = getObj('character', token.get('represents')); if(!character) { sendChat(COMMAND,`Character Not Found for token ${tname}.`); return; } let greenVal = token.get(`bar${HPBAR}_value`); if (isNaN(greenVal)) { sendChat(COMMAND,`${tname}'s Bar is not a number`); } else if (greenVal > 0) { sendChat(COMMAND,`${tname} is not yet defeated.`); } else { //let loot = getAttrByName(character.id, COMMAND, 'current'); let loot = findObjs({_type: 'ability', characterid: character.id, name: COMMAND})[0]; if(!loot) { sendChat(COMMAND,`Loot Not Found for ${tname}'s token.`); } else { let speaker = getSpeaker(msg); let action = loot.get('action').toString(); let output = action.split('\n').join(newline); token.set('status_' + MARKER,true); sendChat(COMMAND, `!format${COMMAND} ${divider} ${tname} ${divider} ${output} ${divider} ${speaker}`); // } } } }, registerEventHandlers = function () { on('chat:message', handleInput); }; return { CheckInstall: checkInstall, RegisterEventHandlers: registerEventHandlers }; }()); on('ready', function () { 'use strict'; loot.CheckInstall(); loot.RegisterEventHandlers(); });