worked on transcripts
diff --git a/Components/Transcripts/Embed.js b/Components/Transcripts/Embed.js
index b163da8..43b1ac4 100644
--- a/Components/Transcripts/Embed.js
+++ b/Components/Transcripts/Embed.js
@@ -14,9 +14,7 @@
 const codeBlock = /(\`\`\`.+\`\`\`)/g;
 const spoiler = /(\`\`\`.+\`\`\`)/g;
 
-const regex = /(\*\*\*.+\*\*\*|\*\*.+\*\*|\*.+\*|\_.+\_|\_\_.+\_\_|\~\~.+\~\~|\`.+\`|\`\`\`.+\`\`\`|\`\`\`.+\`\`\`|<a?:.+:\D+>|<@!?\d+>)/g;
-
-const converter = new Showdown.Converter();
+const regex = /(\*\*\*.+\*\*\*|\*\*.+\*\*|\*.+\*|\_.+\_|\_\_.+\_\_|\~\~.+\~\~|\`.+\`|\`\`\`.+\`\`\`|\`\`\`.+\`\`\`|<a?:.+:\D+>|<@!?\d+>|<#\d+>)/g;
 
 async function parse(text) {
     const splitText = text.split(regex);
@@ -38,7 +36,7 @@
             return <Image key={index} src={`https://cdn.discord.com/emojis/${item.replaceAll(/\D/g, '')}`} width={20} height={20} alt="" />
         }
         if (item.match(user)) {
-            const username = (await Axios.get(`http://localhost:10000/users/${item.replaceAll(/\D/g, '')}`)).data;
+            const username = (await Axios.get(`http://${process.env.NUCLEUS_CALLBACK}/users/${item.replaceAll(/\D/g, '')}`)).data;
             console.log(username)
             return <>{username}</>
 
@@ -56,16 +54,6 @@
         description = description.split("\n");
     }
 
-    const [newDesc, setNewDesc] = useState([]);
-
-    useEffect(() => {
-        async function stuff() {
-            const parsed = await parse(props.embed.description);
-            setNewDesc(newDesc => [...newDesc, parsed]);
-        }
-        stuff();
-    })
-
     return (
         <div className={Styles.embed} style={{borderColor: props.color ?? "#F27878"}}>
             {
@@ -95,8 +83,8 @@
                 props.embed.description ?
                 <div className={Styles.embedDescription}>
                     {
-                        newDesc.map((item) => {
-                            return item;
+                        description.map((item) => {
+                            return <>{item}<br /></>;
                         })
                     }
                 </div>
diff --git a/pages/api/nucleus/verify/complete.js b/pages/api/nucleus/verify/complete.js
index cdffc2e..62802ba 100644
--- a/pages/api/nucleus/verify/complete.js
+++ b/pages/api/nucleus/verify/complete.js
@@ -11,7 +11,7 @@
         return res.status(200).send({success: false})
     }
     try {
-        await Axios.post(`${process.env.VERIFY_CALLBACK}/verify/${req.body.code}`, {
+        await Axios.post(`${process.env.NUCLEUS_CALLBACK}/verify/${req.body.code}`, {
             secret: process.env.VERIFY_SECRET
         });
     } catch (e) {
diff --git a/pages/api/rsmv/validate.js b/pages/api/rsmv/validate.js
index e0c4de1..d968d50 100644
--- a/pages/api/rsmv/validate.js
+++ b/pages/api/rsmv/validate.js
@@ -2,7 +2,7 @@
 
 const Validate = async (req, res) => {
     try {
-        var out = await Axios.get(`http://localhost:10000/verify/${req.body.code}`)
+        var out = await Axios.get(`http://${process.env.NUCLEUS_CALLBACK}/verify/${req.body.code}`)
         out = out.data
         let props = {
             user: out.user,
diff --git "a/pages/nucleus/transcript/\133code\135/human.js" "b/pages/nucleus/transcript/\133code\135/human.js"
index d84a78f..18273ef 100644
--- "a/pages/nucleus/transcript/\133code\135/human.js"
+++ "b/pages/nucleus/transcript/\133code\135/human.js"
@@ -13,7 +13,7 @@
     }
     let code;
     try {
-        code = (await Axios.get(`http://localhost:10000/transcript/${ctx.params.code}`))
+        code = (await Axios.get(`http://${process.env.NUCLEUS_CALLBACK}/transcript/${ctx.params.code}`))
     } catch (e) {
         return {
             redirect: {
@@ -24,7 +24,7 @@
     }
     return {
         redirect: {
-            destination: `http://api.coded.codes/nucleus/transcript/${ctx.params.code}/human`,
+            destination: `http://${process.env.NUCLEUS_CALLBACK}/transcript/${ctx.params.code}/human`,
             permanent: true
         }
     }
diff --git "a/pages/nucleus/transcript/\133code\135/index.js" "b/pages/nucleus/transcript/\133code\135/index.js"
index 4b2389f..c5c4876 100644
--- "a/pages/nucleus/transcript/\133code\135/index.js"
+++ "b/pages/nucleus/transcript/\133code\135/index.js"
@@ -1,6 +1,96 @@
 import Axios from 'axios';
 import React from 'react';
 import Message from '../../../../Components/Transcripts/Message';
+import _ from 'lodash';
+
+const emojiRegex = /(<a?:.+:\D+>)/g;
+const userRegex = /(<@!?\d+>)/g;
+const channelRegex = /(<#\d+>)/g;
+
+async function parseText(text) {
+    const dict = {
+        "emojis": {},
+        "users": {},
+        "channels": {}
+    }
+    const emojis = text.match(emojiRegex);
+    if (emojis) {
+        for (let i = 0; i < emojis.length; i++) {
+            const emoji = emojis[i];
+            const emojiID = emoji.replaceAll(/\D/g, '');
+            const emojiURL = `https://cdn.discord.com/emojis/${emojiID}`;
+            dict["emojis"][emoji] = emojiURL;
+        }
+    }
+    const users = text.match(userRegex);
+    if (users) {
+        for (let i = 0; i < users.length; i++) {
+            const user = users[i];
+            const userID = user.replaceAll(/\D/g, '');
+            const username = (await Axios.get(`http://${process.env.NUCLEUS_CALLBACK}/users/${userID}`)).data;
+            dict["users"][user.replaceAll(/<@|>/g, '')] = username;
+        }
+    }
+    const channels = text.match(channelRegex);
+    if (channels) {
+        for (let i = 0; i < channels.length; i++) {
+            const channel = channels[i];
+            const channelID = channel.replaceAll(/\D/g, '');
+            const channelName = (await Axios.get(`http://${process.env.NUCLEUS_CALLBACK}/channels/${channelID}`)).data;
+            dict["channels"][channel] = channelName;
+        }
+    }
+    // console.log("parseText", dict)
+    return dict
+}
+
+async function parse(json) {
+    let dict = {
+        "emojis": {},
+        "users": {},
+        "channels": {}
+    }
+
+    await _.forEach(json, async (message, index) => {
+        let thisMessage = {}
+        if(message.content) {
+            let parsed = await parseText(message.content)
+            // console.log(parsed)
+            _.assign(thisMessage, parsed)
+        }
+        if(message.embeds) {
+            _.forEach(message.embeds, async (embed, _index) => {
+                // console.log(embed)
+                if(embed.description) {
+                    let parsed = await parseText(embed.description)
+                    _.assign(thisMessage, parsed)
+                }
+                if(embed.title) {
+                    let parsed = await parseText(embed.title)
+                    _.assign(thisMessage, parsed)
+                }
+                if(embed.fields) {
+                    _.forEach(embed.fields, async (field, _index) => {
+                        if(field.name) {
+                            let parsed = await parseText(field.name)
+                            _.assign(thisMessage, parsed)
+                        }
+                        if(field.value) {
+                            let parsed = await parseText(field.value)
+                            _.assign(thisMessage, parsed)
+                        }
+                    })
+                }
+            })
+        }
+        // console.log(thisMessage)
+        _.assign(dict, thisMessage)
+        // console.log(index, dict)
+    })
+
+    // console.log("dict", dict)
+    return dict;
+}
 
 function Index(props) {
     return <div style={{overflowY: "scroll", overflowX: "hidden"}}>
@@ -14,7 +104,7 @@
             paddingLeft: "25px",
             color: "white",
             fontSize: "1.5em",
-        }}>Transcript for: {props.data.for.username}#{props.data.for.discriminator} | In {<a href={`https://discord.com/channels/${props.data.guild}/${props.data.channel}`}>ChannelName</a>} | Type: {props.data.type}</div>
+        }}>Transcript for: {props.data.for.username}#{props.data.for.discriminator} | In #{<a href={`https://discord.com/channels/${props.data.guild}/${props.data.channel}`}>{props.channelName}</a>} | Type: {props.data.type}</div>
         <div style={{
             width: "100vw",
             backgroundColor: "var(--theme-ui-colors-background)", //Can we change this to be not black please. it's too contrast heavy
@@ -42,20 +132,32 @@
             }
         }
     }
-    let code;
-    try {
-        code = (await Axios.get(`http://localhost:10000/transcript/${ctx.params.code}`))
-    } catch (e) {
-        return {
-            redirect: {
-                destination: '/nucleus/transcript/invalid',
-                permanent: true
-            }
-        }
-    }
     return {
-        props: {
-            data: code.data
+        redirect: {
+            destination: `/nucleus/transcript/${ctx.params.code}/human`,
+            permanent: true
         }
     }
+    // let code;
+    // try {
+    //     code = (await Axios.get(`http://${process.env.NUCLEUS_CALLBACK}/transcript/${ctx.params.code}`))
+    // } catch (e) {
+    //     return {
+    //         redirect: {
+    //             destination: '/nucleus/transcript/invalid',
+    //             permanent: true
+    //         }
+    //     }
+    // }
+    // const linkedData = await parse(code.data.messages)
+
+    // const channelName = (await Axios.get(`http://${process.env.NUCLEUS_CALLBACK}/channels/${code.data.channel}`)).data;
+
+    // return {
+    //     props: {
+    //         data: code.data,
+    //         linkedData,
+    //         channelName
+    //     }
+    // }
 }
\ No newline at end of file
diff --git "a/pages/nucleus/transcript/\133code\135/raw.js" "b/pages/nucleus/transcript/\133code\135/raw.js"
index 8c5436e..da6ac40 100644
--- "a/pages/nucleus/transcript/\133code\135/raw.js"
+++ "b/pages/nucleus/transcript/\133code\135/raw.js"
@@ -14,7 +14,7 @@
     }
     let code;
     try {
-        code = (await Axios.get(`http://localhost:10000/transcript/${ctx.params.code}`))
+        code = (await Axios.get(`http://${process.env.NUCLEUS_CALLBACK}/transcript/${ctx.params.code}`))
     } catch (e) {
         return {
             redirect: {
@@ -25,7 +25,7 @@
     }
     return {
         redirect: {
-            destination: `http://localhost:10000/transcript/${ctx.params.code}`,
+            destination: `http://${process.env.NUCLEUS_CALLBACK}/transcript/${ctx.params.code}`,
             permanent: true
         }
     }
diff --git a/pages/nucleus/verify/index.js b/pages/nucleus/verify/index.js
index 05a9dec..9c84b84 100644
--- a/pages/nucleus/verify/index.js
+++ b/pages/nucleus/verify/index.js
@@ -87,7 +87,7 @@
     }
     let code;
     try {
-        code = await Axios.get(`http://localhost:10000/verify/${ctx.query.code}`);
+        code = await Axios.get(`http://${process.env.NUCLEUS_CALLBACK}/verify/${ctx.query.code}`);
     } catch (e) {
         return {
             redirect: {
diff --git a/todo/rolemenu/index.js b/todo/rolemenu/index.js
index a057f9f..ca7e493 100644
--- a/todo/rolemenu/index.js
+++ b/todo/rolemenu/index.js
@@ -60,7 +60,7 @@
                         <Text>{item.description}</Text>
                         <div className={Styles.options}>
                             {
-                                item.options.map((props, optionIndex) => {return <div className={Styles.optionBox}>
+                                item.options.map((props, optionIndex) => {return <div key={optionIndex} className={Styles.optionBox}>
                                     <input
                                         type={item.max === 1 ? "radio" : "checkbox"}
                                         style={{borderRadius: item.max === 1 ? "50%" : "5px"}}
@@ -107,7 +107,7 @@
     }
     let code;
     try {
-        code = (await Axios.get(`http://localhost:10000/rolemenu/${ctx.query.code}`)).data;
+        code = (await Axios.get(`http://${process.env.NUCLEUS_CALLBACK}/rolemenu/${ctx.query.code}`)).data;
     } catch (e) {
         return {
             redirect: {