diff --git a/sdk/typescript/examples/chrome-extension/README.md b/sdk/typescript/examples/chrome-extension/README.md
new file mode 100644
index 0000000000..8d7359e8c3
--- /dev/null
+++ b/sdk/typescript/examples/chrome-extension/README.md
@@ -0,0 +1,22 @@
+# Nym Chrome Extension Example
+
+This is an example of how Nym can be used within the context of a Chrome extension.
+
+## Running the example
+
+1. Copy a build of the Nym TypeScript SDK (ESM version) into `./sdk`.
+2. Navigate to `chrome://extensions` in Google Chrome.
+3. Enable "Developer mode" (top right of the page).
+4. Click on "Load unpacked" (top left of the page).
+5. Load this extension folder.
+
+## How does it work?
+
+The Nym Mixnet Client runs a [Web Worker](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API) that wraps
+a WASM library that builds and encrypts Sphinx packets in the browser to send over the Nym mixnet:
+
+
+
+The WASM code encrypts each layer of the Sphinx packet in the browser, before sending the Sphinx packet over a websocket to the ingress gateway:
+
+
diff --git a/sdk/typescript/examples/chrome-extension/icon.png b/sdk/typescript/examples/chrome-extension/icon.png
new file mode 100644
index 0000000000..23d00a8289
Binary files /dev/null and b/sdk/typescript/examples/chrome-extension/icon.png differ
diff --git a/sdk/typescript/examples/chrome-extension/manifest.json b/sdk/typescript/examples/chrome-extension/manifest.json
new file mode 100644
index 0000000000..0b75dc2f95
--- /dev/null
+++ b/sdk/typescript/examples/chrome-extension/manifest.json
@@ -0,0 +1,15 @@
+{
+ "name": "Nym Chrome Extension Example",
+ "description": "An example demonstrating how to integrate the Nym TypeScript SDK in the context of a Google Chrome browser extension.",
+ "version": "1.0",
+ "manifest_version": 3,
+ "permissions": [],
+ "content_security_policy": {
+ "extension_pages": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self';"
+ },
+ "action": {
+ "default_title": "Nym Chrome Extension Example",
+ "default_icon": "icon.png",
+ "default_popup": "popup.html"
+ }
+}
\ No newline at end of file
diff --git a/sdk/typescript/examples/chrome-extension/popup.css b/sdk/typescript/examples/chrome-extension/popup.css
new file mode 100644
index 0000000000..491c7dc3c7
--- /dev/null
+++ b/sdk/typescript/examples/chrome-extension/popup.css
@@ -0,0 +1,8 @@
+body {
+ width: 800px;
+ min-height: 400px;
+}
+
+#editdialog input {
+ width: 100%;
+}
\ No newline at end of file
diff --git a/sdk/typescript/examples/chrome-extension/popup.html b/sdk/typescript/examples/chrome-extension/popup.html
new file mode 100644
index 0000000000..c1471a3617
--- /dev/null
+++ b/sdk/typescript/examples/chrome-extension/popup.html
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
Send messages from your browser, through the mixnet, and to the recipient using the "send" button.
+
Sent messages show in blue, received messages show in green.
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sdk/typescript/examples/chrome-extension/sdk/.gitkeep b/sdk/typescript/examples/chrome-extension/sdk/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/sdk/typescript/examples/chrome-extension/src/dom-utils.js b/sdk/typescript/examples/chrome-extension/src/dom-utils.js
new file mode 100644
index 0000000000..322606c241
--- /dev/null
+++ b/sdk/typescript/examples/chrome-extension/src/dom-utils.js
@@ -0,0 +1,66 @@
+// dom-utils.js
+// Contains utility functionality to help manipulate the DOM elements necessary to demonstrate the Nym example.
+
+/**
+ * Create a Sphinx packet and send it to the mixnet through the gateway node.
+ *
+ * Message and recipient are taken from the values in the user interface.
+ *
+ * @param {Client} nymClient the nym client to use for message sending
+ */
+async function sendMessageTo(nym) {
+ const message = document.getElementById('message').value;
+ const recipient = document.getElementById('recipient').value;
+ await nym.client.send({
+ payload: {
+ message,
+ mimeType: 'text/plain'
+ },
+ recipient
+ });
+ displaySend(message);
+}
+
+/**
+ * Display messages that have been sent up the websocket. Colours them blue.
+ *
+ * @param {string} message
+ */
+function displaySend(message) {
+ const timestamp = new Date().toISOString().substr(11, 12);
+ const sendDiv = document.createElement('div');
+ const paragraph = document.createElement('p');
+ paragraph.setAttribute('style', 'color: blue');
+ const paragraphContent = document.createTextNode(`${timestamp} sent >>> ${message}`);
+ paragraph.appendChild(paragraphContent);
+ sendDiv.appendChild(paragraph);
+ document.getElementById('output')?.appendChild(sendDiv);
+}
+
+/**
+ * Display received text messages in the browser. Colour them green.
+ *
+ * @param {string} message
+ */
+function displayReceived(message) {
+ const content = message;
+ const timestamp = new Date().toLocaleTimeString();
+ const receivedDiv = document.createElement('div');
+ const paragraph = document.createElement('p');
+ paragraph.setAttribute('style', 'color: green');
+ const paragraphContent = document.createTextNode(`${timestamp} received >>> ${content}`);
+ paragraph.appendChild(paragraphContent);
+ receivedDiv.appendChild(paragraph);
+ document.getElementById('output')?.appendChild(receivedDiv);
+}
+
+/**
+ * Display the nymClient's sender address in the user interface
+ *
+ * @param {Client} nymClient
+ */
+function displaySenderAddress(address) {
+ document.getElementById('sender').value = address;
+}
+
+export { sendMessageTo, displaySend, displayReceived , displaySenderAddress }
\ No newline at end of file
diff --git a/sdk/typescript/examples/chrome-extension/src/main.js b/sdk/typescript/examples/chrome-extension/src/main.js
new file mode 100644
index 0000000000..30d84fb4c3
--- /dev/null
+++ b/sdk/typescript/examples/chrome-extension/src/main.js
@@ -0,0 +1,59 @@
+// main.js
+// Simple example of how to load Nym's TypeScript SDK and bind it to a DOM.
+// Look at dom-utils.js for the DOM utility functionality referenced here.
+
+// Import the Nym mixnet ESM module.
+import {
+ createNymMixnetClient
+} from "../sdk/index.js";
+
+// Import the DOM utility functionality.
+import {
+ displaySenderAddress,
+ displayReceived,
+ sendMessageTo
+} from "./dom-utils.js"
+
+async function main() {
+ // Initialize the Nym mixnet client.
+ let nymClient = await createNymMixnetClient();
+ if (!nymClient) {
+ console.error('Oh no! Could not create client');
+ return;
+ }
+
+ const nymApiUrl = 'https://validator.nymtech.net/api';
+ const preferredGatewayIdentityKey = 'E3mvZTHQCdBvhfr178Swx9g4QG3kkRUun7YnToLMcMbM';
+
+ // subscribe to connect event, so that we can show the client's address
+ nymClient.events.subscribeToConnected((e) => {
+ if (e.args.address) {
+ displaySenderAddress(e.args.address);
+ }
+ });
+
+ // subscribe to message received events and show any string messages received
+ nymClient.events.subscribeToTextMessageReceivedEvent((e) => {
+ displayReceived(e.args.payload);
+ });
+
+ const sendButton = document.querySelector('#send-button')
+ if (sendButton) {
+ sendButton.onclick = function() {
+ if (nymClient) {
+ sendMessageTo(nymClient);
+ }
+ };
+ }
+
+ nymClient.events.subscribeToRawMessageReceivedEvent((e) => console.log('Received: ', e.args.payload));
+ await nymClient.client.start({
+ clientId: 'My awesome client',
+ nymApiUrl,
+ preferredGatewayIdentityKey,
+ });
+}
+
+window.addEventListener('DOMContentLoaded', () => {
+ main();
+});
\ No newline at end of file
diff --git a/sdk/typescript/examples/firefox-extension/README.md b/sdk/typescript/examples/firefox-extension/README.md
new file mode 100644
index 0000000000..8739d1da1f
--- /dev/null
+++ b/sdk/typescript/examples/firefox-extension/README.md
@@ -0,0 +1,33 @@
+# Nym Firefox Extension Example
+
+This is an example of how Nym can be used within the context of a Mozilla Firefox extension.
+
+## Running the example
+
+Copy a build of the Nym TypeScript SDK (ESM version) into `./sdk`.
+
+Then, Open `sdk/index.js` and change the following line:
+```js
+var WorkerFactory = createURLWorkerFactory('web-worker-0.js');
+```
+
+to:
+
+```js
+var WorkerFactory = createURLWorkerFactory('sdk/web-worker-0.js');
+```
+
+The above annoying workaround is currently necessary for Firefox extensions.
+
+Load the extension normally via manifest.json.
+
+## How does it work?
+
+The Nym Mixnet Client runs a [Web Worker](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API) that wraps
+a WASM library that builds and encrypts Sphinx packets in the browser to send over the Nym mixnet:
+
+
+
+The WASM code encrypts each layer of the Sphinx packet in the browser, before sending the Sphinx packet over a websocket to the ingress gateway:
+
+
diff --git a/sdk/typescript/examples/firefox-extension/background.html b/sdk/typescript/examples/firefox-extension/background.html
new file mode 100644
index 0000000000..f87c4b9f01
--- /dev/null
+++ b/sdk/typescript/examples/firefox-extension/background.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sdk/typescript/examples/firefox-extension/icon.png b/sdk/typescript/examples/firefox-extension/icon.png
new file mode 100644
index 0000000000..23d00a8289
Binary files /dev/null and b/sdk/typescript/examples/firefox-extension/icon.png differ
diff --git a/sdk/typescript/examples/firefox-extension/manifest.json b/sdk/typescript/examples/firefox-extension/manifest.json
new file mode 100644
index 0000000000..0e91a01740
--- /dev/null
+++ b/sdk/typescript/examples/firefox-extension/manifest.json
@@ -0,0 +1,23 @@
+{
+ "manifest_version": 3,
+ "name": "Nym Firefox Extension Example",
+ "version": "1.0",
+ "description": "An example demonstrating how to integrate the Nym TypeScript SDK in the context of a Mozilla Firefox browser extension.",
+ "icons": {
+ "48": "icon.png"
+ },
+ "permissions": [],
+ "content_security_policy": {
+ "extension_pages": "script-src 'self' 'wasm-unsafe-eval' blob:; object-src 'self' 'wasm-unsafe-eval' blob:; worker-src 'self' 'wasm-unsafe-eval' blob:;"
+ },
+ "background": {
+ "page": "background.html"
+ },
+ "action": {
+ "default_icon": {
+ "32" : "icon.png"
+ },
+ "default_title": "Quicknote",
+ "default_popup": "popup.html"
+ }
+}
diff --git a/sdk/typescript/examples/firefox-extension/popup.css b/sdk/typescript/examples/firefox-extension/popup.css
new file mode 100644
index 0000000000..491c7dc3c7
--- /dev/null
+++ b/sdk/typescript/examples/firefox-extension/popup.css
@@ -0,0 +1,8 @@
+body {
+ width: 800px;
+ min-height: 400px;
+}
+
+#editdialog input {
+ width: 100%;
+}
\ No newline at end of file
diff --git a/sdk/typescript/examples/firefox-extension/popup.html b/sdk/typescript/examples/firefox-extension/popup.html
new file mode 100644
index 0000000000..ea5a674dc9
--- /dev/null
+++ b/sdk/typescript/examples/firefox-extension/popup.html
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
Send messages from your browser, through the mixnet, and to the recipient using the "send" button.
+
Sent messages show in blue, received messages show in green.