2. Development/WebExtensions API

2.1. Firefox

For Firefox get mozilla/web-ext: A command line tool to help build, run, and test web extensions and run

web-ext build

Sign the extension on Developer Hub :: Add-ons for Firefox.

Consider using package.json:

{
  "scripts": {
    "start:firefox": "web-ext run --source-dir ./netflix-more-more-info/",
    "build:firefox": "web-ext build --source-dir ./netflix-more-more-info/"
  }
}

2.2. Google Chrome

Chrome allows unsigned package installation from a folder.

The developer console on Chrome Web Store allows to publish extensions.

2.3. NodeJS

The regular binary releases are available at Index of /download/release/, currently node-v22.12.0-linux-x64.tar.gz.

An LTS PPA is available at Nodesource Node.js DEB, see also nodesource/distributions: NodeSource Node.js Binary Distributions

curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt-get install -y nodejs

2.5. Image to ASCII

From Image to ASCII: Free ASCII Art Converter

             =*%@@@@@@@@%%
          #@@@@@@@@@@@@@@@@@@#+
        @@@@@@@@@@@@@@@@@@@@@@@@*
      ##########@@@@@@@@@@@@@@@@@@+
    +#############@@@@@@@@@@@@@@@@@@
   ################%@@@@@@@@@@@@@@@@@
  ##################@@@@@@@@@@@@@@@@@@
 *###################@@@@@@@@@@@@@@@@@
=#####################@@@@@@@@@@@@@@@%*
*######################@@@@@@@@@@@@@@##+
##########*##############@@@@@@@@@@####*
#####@@@@@@@@@@##############%%########*
+##@@@@@@@@@@@@@@######################*
=#@@@@@@@@@@@@@@@@#####################+
 +@@@@@@@@@@@@@@@@@####################
 =@@@@@@@@@@@@@@@@@@##################=
  *@@@@@@@@@@@@@@@@@#################=
   =@@@@@@@@@@@@@@@@@##############*=
     %@@@@@@@@@@@@@@@@@###########=
       %@@@@@@@@@@@@@@@@@@@@@@@@
         *@@@@@@@@@@@@@@@@@@@#
             *%@@@@@@@@@@#=

2.6. Textarea

Source: javascript - simulate keyboard input / insert string into textarea (adwords) - Stack Overflow

const textarea = document.getElementsByTagName('textarea')[0]
function setNativeValue(element, value) {
  const { set: valueSetter } = Object.getOwnPropertyDescriptor(element, 'value') || {}
  const prototype = Object.getPrototypeOf(element)
  const { set: prototypeValueSetter } = Object.getOwnPropertyDescriptor(prototype, 'value') || {}

  if (prototypeValueSetter && valueSetter !== prototypeValueSetter) {
    prototypeValueSetter.call(element, value)
  } else if (valueSetter) {
    valueSetter.call(element, value)
  } else {
    throw new Error('The given element does not have a value setter')
  }
}
setNativeValue(textarea, 'some text')
textarea.dispatchEvent(new Event('input', { bubbles: true }))

2.7. Interesting Error Message

Uncaught SyntaxError: expected expression, got end of script div>');c=c.firstChild;document.querySelector("body").appendChild(c);c=document.getElementById("notes-container");a=document.getElementById("notes");c.style.maxWidth="300px";c.style.minWidth="300px";c.style.maxWidth="800px";c.style.minWidth="800px";c.style.backgroundColor="white";c.style.color="black";c.style.display="grid";c.style.font="16px serif";c.style.fontPalette="normal";c.style.fontSynthesis="weight style small-caps position";c.style.gridTemplateRows="min-content 0px auto min-content";c.style.letterSpacing="normal";c.style.margin="0px 5px";c.style.maxHeight="100vh";c.style.maxWidth="20vw";c.style.minHeight="50vh";c.style.minWidth="20vw";c.style.padding="5px";c.style.position="fixed";c.style.right="0px";c.style.textTransform="none";c.style.top="50px";c.style.zIndex="99999";c;var d=document.getElementById("notes-container-card-img");d.style.zIndex="100000";d.style.marginRight="8px";d.style.marginTop="8px";var g=document.getElementById("notes-container-img");g.style.display="none";g.style.width="18px";g.style.border="none";g.style.float="right";g.style.margin="0px";g.style.padding="0px";var i=document.getElementById("notes-container-img-span");i.style.display="none";i.style.fontSize="30px";i.style.lineHeight="30px";i.style.backgroundColor="#efbfff";i.style.color="black";i.style.border="none";i.style.float="right";i.style.margin="0px";i.style.padding="0px";function j(){var a=document.getElementById("notes-container-img");var b=document.getElementById("notes-container-img-span");if(a.complete||a.naturalWidth){a.style.display="";b.style.display="none";}else{a.style.display="none";b.style.display="inline-block";}}window.setTimeout(j,500);var k=c.querySelector("h6");k.style.color="black";k.style.font="700 16px serif";k.style.fontPalette="normal";k.style.fontSynthesis="weight style small-caps position";k.style.letterSpacing="normal";k.style.lineHeight="normal";k.style.margin="0px";k.style.padding="3px 7px";k.style.textTransform="none";var l=c.querySelector("h6 span");l.style.margin="0";l.style.padding="0";a.style.background="transparent";a.style.color="black";a.style.display="block";a.style.fontPalette="normal";a.style.fontSynthesis="weight style small-caps position";a.style.font="16px monospace";a.style.height="initial";a.style.letterSpacing="normal";a.style.margin="0px";a.style.outline="initial";a.style.overflowWrap="normal";a.style.overflowX="auto";a.style.padding="3px 5px";a.style.position="initial";a.style.textDecoration="initial";a.style.textTransform="none";a.style.textWrap="nowrap";a.style.whiteSpace="pre";a.style.width="initial";var m=document.getElementById("notes-container-button-bar");m.style.color="black";m.style.display="grid";m.style.fontPalette="normal";m.style.fontSynthesis="weight style small-caps position";m.style.font="14px sans-serif";m.style.gridTemplateColumns="min-content auto min-content min-content min-content";m.style.letterSpacing="normal";m.style.margin="0px";m.style.padding="3px 0px 0px 0px";m.style.textTransform="none";var o=document.getElementById("notes-always-active-button");o.style.backgroundAttachment="scroll";o.style.backgroundColor="transparent";o.style.borderColor="transparent";o.style.borderRadius="3px";o.style.borderStyle="solid";o.style.borderWidth="1px";o.style.boxSizing="border-box";o.style.color="rgb(69, 69, 69)";o.style.height="24px";o.style.marginLeft="0px";o.style.overflow="visible";o.style.padding="1px 0px 2px 0px";o.style.textAlign="center";o.style.whiteSpace="nowrap";o.style.fontPalette="normal";o.style.fontSynthesis="weight style small-caps position";o.style.font="14px sans-serif";var p=document.getElementById("notes-always-active-check");p.style.background="#fff";p.style.color="#000";p.style.cursor="pointer";p.style.display="inline-block";p.style.margin="0";p.style.outline="0";p.style.padding="0";p.style.position="initial";p.style.textAlign="center";p.style.textDecoration="none";p.style.whiteSpace="nowrap";p.style.fontPalette="normal";p.style.fontSynthesis="weight style small-caps position";p.style.font="14px sans-serif";var q=document.getElementById("notes-always-active-label");q.style.padding="0px";q.style.margin="0px 0px 0px 3px";q.style.color="rgb(69, 69, 69)";q.style.cursor="pointer";q.style.textAlign="center";q.style.whiteSpace="nowrap";q.style.fontPalette="normal";q.style.fontSynthesis="weight style small-caps position";q.style.font="14px sans-serif";q.style.display="normal";var r=document.getElementById("notes-container-clear-button");r.style.backgroundAttachment="scroll";r.style.backgroundColor="rgb(246, 246, 246)";r.style.borderColor="rgb(197, 197, 197)";r.style.borderRadius="3px";r.style.borderStyle="solid";r.style.borderWidth="1px";r.style.boxSizing="border-box";r.style.color="rgb(69, 69, 69)";r.style.cursor="pointer";r.style.height="24px";r.style.margin="0px 0px 0px 5px";r.style.overflow="visible";r.style.padding="1px 3px 2px 4px";r.style.textAlign="center";r.style.whiteSpace="nowrap";r.style.fontPalette="normal";r.style.fontSynthesis="weight style small-caps position";r.style.font="14px sans-serif";var s=document.querySelector("#notes-container-clear-button span");s.style.margin="0";s.style.padding="0";s.style.fontPalette="normal";s.style.fontSynthesis="weight style small-caps position";s.style.font="14px sans-serif";s.style.cursor="pointer";var t=document.getElementById("notes-container-refresh-button");t.style.backgroundAttachment="scroll";t.style.backgroundColor="rgb(246, 246, 246)";t.style.borderColor="rgb(197, 197, 197)";t.style.borderRadius="3px";t.style.borderStyle="solid";t.style.borderWidth="1px";t.style.boxSizing="border-box";t.style.color="rgb(69, 69, 69)";t.style.height="24px";t.style.margin="0px 0px 0px 5px";t.style.overflow="visible";t.style.padding="1px 3px 2px 4px";t.style.textAlign="center";t.style.whiteSpace="nowrap";t.style.fontPalette="normal";t.style.fontSynthesis="weight style small-caps position";t.style.font="14px sans-serif";t.style.cursor="pointer";var u=document.querySelector("#notes-container-refresh-button span");u.style.margin="0";u.style.padding="0";u.style.fontPalette="normal";u.style.fontSynthesis="weight style small-caps position";u.style.font="14px sans-serif";u.style.cursor="pointer";var v=document.getElementById("notes-container-save-button");v.style.backgroundAttachment="scroll";v.style.backgroundColor="rgb(246, 246, 246)";v.style.borderColor="rgb(197, 197, 197)";v.style.borderRadius="3px";v.style.borderStyle="solid";v.style.borderWidth="1px";v.style.boxSizing="border-box";v.style.color="rgb(69, 69, 69)";v.style.height="24px";v.style.margin="0px 0px 0px 5px";v.style.overflow="visible";v.style.padding="1px 3px 2px 4px";v.style.textAlign="center";v.style.whiteSpace="nowrap";v.style.fontPalette="normal";v.style.fontSynthesis="weight style small-caps position";v.style.font="14px sans-serif";v.style.cursor="pointer";var w=document.querySelector("#notes-container-save-button span");w.style.margin="0";w.style.padding="0";w.style.fontPalette="normal";w.style.fontSynthesis="weight style small-caps position";w.style.font="14px sans-serif";w.style.cursor="pointer";}e();document.getElementById('notes').addEventListener("input",function(a){f();});document.getElementById('notes').addEventListener("focus",function(a){return;});document.querySelector('#notes-always-active-check').addEventListener("change",function(a){n=this.checked;});document.getElementById('notes-container-clear-button').addEventListener("click",function(a){h("",true);});document.getElementById('notes-container-refresh-button').addEventListener("click",function(a){e();});document.getElementById('notes-container-save-button').addEventListener("click",function(a){f();});window.addEventListener("storage",function(a){if(!a.key||a.key==b)e();});})();document.addEventListener("keydown",function(a){if(a.altKey||a.ctrlKey||a.isComposing||a.metaKey||a.shiftKey)return;if(document.activeElement.id=="notes")return;var b=a.key;if(b==="´"||b==="Escape"){o();a.preventDefault();return;}if(m&&!n)return;if(b==="1"){l("tag1");a.preventDefault();return;}if(b==="2"){l("tag2");a.preventDefault();return;}if(b==="3"){l("tag3");a.preventDefault();return;}if(b==="4"){l("tag4");a.preventDefault();return;}if(b==="c"){j(document.getSelection().toString().trim());a.preventDefault();return;}if(b==="v"){d=!d;a.preventDefault();return;}if(b==="Enter"){i("");a.preventDefault();return;}});})()+:3:15058