diff --git a/external/lang b/external/lang
index 5e57b0f203f1c03c2942222b967288257c218a4e..be021b37763b2b0f8f0367b49f9912add845aa21 160000
--- a/external/lang
+++ b/external/lang
@@ -1 +1 @@
-Subproject commit 5e57b0f203f1c03c2942222b967288257c218a4e
+Subproject commit be021b37763b2b0f8f0367b49f9912add845aa21
diff --git a/package.json b/package.json
index e95866ea9a7db99245f73ea4c5baadcec7db5367..7077cd3eb1166b71210900edeb5158c7a1b80be9 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
   "version": "0.0.0",
   "scripts": {
     "dev": "vite",
-    "build": "rimraf build && tsc --noEmit && vite build",
+    "build": "rimraf build && vite build",
     "preview": "vite preview",
     "lint": "eslint 'src/**/*.{js,jsx,ts,tsx}'",
     "fmt": "prettier --write 'src/**/*.{js,jsx,ts,tsx}'",
diff --git a/src/components/common/messaging/MessageBase.tsx b/src/components/common/messaging/MessageBase.tsx
index 204733812a9ed4ed8a29cd7ba4d4f3f06dad6134..435c2f11f54da76e4552c13c1478901cb4cb9096 100644
--- a/src/components/common/messaging/MessageBase.tsx
+++ b/src/components/common/messaging/MessageBase.tsx
@@ -61,7 +61,10 @@ export default styled.div<BaseMessageProps>`
     
     .copy {
         width: 0;
+        height: 0;
         opacity: 0;
+        display: block;
+        overflow: hidden;
     }
 
     &:hover {
@@ -88,10 +91,12 @@ export const MessageInfo = styled.div`
 
     time {
         opacity: 0;
+    }
+
+    time, .edited {
         cursor: default;
         display: inline;
         font-size: 10px;
-        padding-top: 1px;
         color: var(--tertiary-foreground);
     }
 `;
@@ -117,14 +122,16 @@ export function MessageDetail({ message, position }: { message: MessageObject, p
     if (position === 'left') {
         if (message.edited) {
             return (
-                <span>
+                <>
                     <span className="copy">
                         [<time>{dayjs(decodeTime(message._id)).format("H:mm")}</time>]
                     </span>
-                    <Tooltip content={dayjs(message.edited).format("LLLL")}>
-                        <Text id="app.main.channel.edited" />
-                    </Tooltip>
-                </span>
+                    <span className="edited">
+                        <Tooltip content={dayjs(message.edited).format("LLLL")}>
+                            <Text id="app.main.channel.edited" />
+                        </Tooltip>
+                    </span>
+                </>
             )
         } else {
             return (
diff --git a/src/context/Voice.tsx b/src/context/Voice.tsx
index 935bda52b0cced88488db21748eba9a2dcc00e89..e78b09181084d83425b4f0d8da48e762f953c46b 100644
--- a/src/context/Voice.tsx
+++ b/src/context/Voice.tsx
@@ -1,8 +1,8 @@
 import { createContext } from "preact";
 import { Children } from "../types/Preact";
-import VoiceClient from "../lib/vortex/VoiceClient";
 import { AppContext } from "./revoltjs/RevoltClient";
-import { ProduceType, VoiceUser } from "../lib/vortex/Types";
+import type VoiceClient from "../lib/vortex/VoiceClient";
+import type { ProduceType, VoiceUser } from "../lib/vortex/Types";
 import { useContext, useEffect, useMemo, useRef, useState } from "preact/hooks";
 
 export enum VoiceStatus {
@@ -22,7 +22,7 @@ export interface VoiceOperations {
     disconnect: () => void;
     isProducing: (type: ProduceType) => boolean;
     startProducing: (type: ProduceType) => Promise<void>;
-    stopProducing: (type: ProduceType) => Promise<void>;
+    stopProducing: (type: ProduceType) => Promise<void> | undefined;
 }
 
 export interface VoiceState {
@@ -31,14 +31,6 @@ export interface VoiceState {
     participants?: Readonly<Map<string, VoiceUser>>;
 }
 
-export interface VoiceOperations {
-    connect: (channelId: string) => Promise<void>;
-    disconnect: () => void;
-    isProducing: (type: ProduceType) => boolean;
-    startProducing: (type: ProduceType) => Promise<void>;
-    stopProducing: (type: ProduceType) => Promise<void>;
-}
-
 export const VoiceContext = createContext<VoiceState>(undefined as any);
 export const VoiceOperationsContext = createContext<VoiceOperations>(undefined as any);
 
@@ -48,7 +40,7 @@ type Props = {
 
 export default function Voice({ children }: Props) {
     const revoltClient = useContext(AppContext);
-    const [client,] = useState(new VoiceClient());
+    const [client,] = useState<VoiceClient | undefined>(undefined);
     const [state, setState] = useState<VoiceState>({
         status: VoiceStatus.LOADING,
         participants: new Map()
@@ -57,13 +49,13 @@ export default function Voice({ children }: Props) {
     function setStatus(status: VoiceStatus, roomId?: string) {
         setState({
             status,
-            roomId: roomId ?? client.roomId,
-            participants: client.participants ?? new Map(),
+            roomId: roomId ?? client?.roomId,
+            participants: client?.participants ?? new Map(),
         });
     }
 
     useEffect(() => {
-        if (!client.supported()) {
+        if (!client?.supported()) {
             setStatus(VoiceStatus.UNAVAILABLE);
         } else {
             setStatus(VoiceStatus.READY);
@@ -74,7 +66,7 @@ export default function Voice({ children }: Props) {
     const operations: VoiceOperations = useMemo(() => {
         return {
             connect: async channelId => {
-                if (!client.supported())
+                if (!client?.supported())
                     throw new Error("RTC is unavailable");
                 
                 isConnecting.current = true;
@@ -109,7 +101,7 @@ export default function Voice({ children }: Props) {
                 isConnecting.current = false;
             },
             disconnect: () => {
-                if (!client.supported())
+                if (!client?.supported())
                     throw new Error("RTC is unavailable");
             
                 // if (status <= VoiceStatus.READY) return;
@@ -122,13 +114,13 @@ export default function Voice({ children }: Props) {
             isProducing: (type: ProduceType) => {
                 switch (type) {
                     case "audio":
-                        return client.audioProducer !== undefined;
+                        return client?.audioProducer !== undefined;
                 }
             },
             startProducing: async (type: ProduceType) => {
                 switch (type) {
                     case "audio": {
-                        if (client.audioProducer !== undefined) return;
+                        if (client?.audioProducer !== undefined) return;
                         if (navigator.mediaDevices === undefined) return;
                         const mediaStream = await navigator.mediaDevices.getUserMedia(
                             {
@@ -136,7 +128,7 @@ export default function Voice({ children }: Props) {
                             }
                         );
 
-                        await client.startProduce(
+                        await client?.startProduce(
                             mediaStream.getAudioTracks()[0],
                             "audio"
                         );
@@ -145,13 +137,13 @@ export default function Voice({ children }: Props) {
                 }
             },
             stopProducing: (type: ProduceType) => {
-                return client.stopProduce(type);
+                return client?.stopProduce(type);
             }
         }
     }, [ client ]);
 
     useEffect(() => {
-        if (!client.supported()) return;
+        if (!client?.supported()) return;
 
         /* client.on("startProduce", forceUpdate);
         client.on("stopProduce", forceUpdate);
diff --git a/src/pages/channels/messaging/MessageRenderer.tsx b/src/pages/channels/messaging/MessageRenderer.tsx
index fba6b281b59f34a0d2b1e65b163393afa3331b07..1eae8e7e96ed4b6c389d5b591bf12f3f027f5109 100644
--- a/src/pages/channels/messaging/MessageRenderer.tsx
+++ b/src/pages/channels/messaging/MessageRenderer.tsx
@@ -139,7 +139,11 @@ function MessageRenderer({ id, state, queue }: Props) {
             }
 
             render.push(
-                <Message message={msg.data}
+                <Message
+                    message={{
+                        ...msg.data,
+                        replies: msg.data.replies.map(x => x.id)
+                    }}
                     key={msg.id}
                     queued={msg}
                     head={head}