I had an idea last night based on something I've hacked together and I'm wondering if it would be possible for those of you who have much better scripting skills to improve this idea. I previously took a little scriptlet from The Aaron and modified it to make it so I could send messages that wouldn't get sent to the Chat Archive. I'm sure this basic script could be improved/streamlined on its own, but it works for what I need it to do: NoArchive Scriptlet: on('ready', () => { const processInlinerolls = (msg) => { if(_.has(msg,'inlinerolls')){ return _.chain(msg.inlinerolls) .reduce(function(m,v,k){ let ti=_.reduce(v.results.rolls,function(m2,v2){ if(_.has(v2,'table')){ m2.push(_.reduce(v2.results,function(m3,v3){ m3.push(v3.tableItem.name); return m3; },[]).join(', ')); } return m2; },[]).join(', '); m['$[['+k+']]']= (ti.length && ti) || v.results.total || 0; return m; },{}) .reduce(function(m,v,k){ return m.replace(k,v); },msg.content) .value(); } else { return msg.content; } }; let lastPlayerId; on('chat:message', (msg) => { if('api' !== msg.type ){ return; } let args = processInlinerolls(msg).split(/\s+/); switch(args.shift()){ case '!noarchive': case '!na': { const who=(getObj('player',('API'===msg.playerid ? lastPlayerId : msg.playerid))||{get:()=>'API'}).get('_displayname'); let content = args.join(' '); if(_.has(msg,'rolltemplate') && _.isString(msg.rolltemplate) && msg.rolltemplate.length){ content = content.replace(/\{\{/,'&{template:'+msg.rolltemplate+'} {{'); } sendChat('(NoArchive)',`${content}`,null,{noarchive:true}); log(`NoArchive content: ${content}`); } break; case '!test': { const who=(getObj('player',('API'===msg.playerid ? lastPlayerId : msg.playerid))||{get:()=>'API'}).get('_displayname'); let content = args.join(' '); if(_.has(msg,'rolltemplate') && _.isString(msg.rolltemplate) && msg.rolltemplate.length){ content = content.replace(/\{\{/,'&{template:'+msg.rolltemplate+'} {{'); } sendChat('(Test)',`${content}`,null,{noarchive:true}); log(`Test content: ${content}`); } break; default: if(/\s!noarchive\b/.test(msg.content)){ lastPlayerId = msg.playerid; } break; } }); }); I use !noarchive, !na, or !test to send messages without them being archived. Great for testing things, as well as lots of macros for chat menus that I don't want cluttering up the archive later. 'Test Mode' Script Idea here: So my idea is: could a script basically intercept all commands and adjust them to add the '{noarchive:true}' option, so that the message is not sent to the chat archive? I've seen requests previously for a Test Mode or way for GMs to test things without creating unintentional spoilers. The /talktomyself feature works, unless you are using API scripts, which is a big limitation. So my thought is to have a script that can be toggled on and off: !TestMode --on !TestMode --off While it's on, all messages from the GM are changed to not be archived. It would be nice if there were a visual indication at the same time (like what you see with /talktomyself or the API Heartbeat script), or another idea would be a GM whispered chat message every so often that tells the GM that they are still in Test Mode if a persistent indicator isn't possible. What are the thoughts from you awesome script creators out there? Thanks for any ideas or feedback!