diff --git a/.envrc b/.envrc
new file mode 100644
index 0000000..f558b66
--- /dev/null
+++ b/.envrc
@@ -0,0 +1,2 @@
+use_flake .
+dotenv
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 468f82a..e1d81c3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,7 @@
 # Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore
 
+.direnv
+
 # Logs
 
 logs
diff --git a/flake.lock b/flake.lock
new file mode 100644
index 0000000..aca3fbd
--- /dev/null
+++ b/flake.lock
@@ -0,0 +1,61 @@
+{
+  "nodes": {
+    "flake-utils": {
+      "inputs": {
+        "systems": "systems"
+      },
+      "locked": {
+        "lastModified": 1705309234,
+        "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1706006310,
+        "narHash": "sha256-nDPz0fj0IFcDhSTlXBU2aixcnGs2Jm4Zcuoj0QtmiXQ=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "b43bb235efeab5324c5e486882ef46749188eee2",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "flake-utils": "flake-utils",
+        "nixpkgs": "nixpkgs"
+      }
+    },
+    "systems": {
+      "locked": {
+        "lastModified": 1681028828,
+        "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+        "owner": "nix-systems",
+        "repo": "default",
+        "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-systems",
+        "repo": "default",
+        "type": "github"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flake.nix b/flake.nix
new file mode 100644
index 0000000..bc87703
--- /dev/null
+++ b/flake.nix
@@ -0,0 +1,22 @@
+{
+  description = "A basic flake with a shell";
+  inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
+  inputs.flake-utils.url = "github:numtide/flake-utils";
+
+
+  outputs = { nixpkgs, flake-utils, ... }:
+    flake-utils.lib.eachDefaultSystem (system:
+      let
+        pkgs = import nixpkgs {
+          inherit system;
+        };
+      in
+      {
+        devShells.default = pkgs.mkShell {
+          packages = [
+            pkgs.bun
+            pkgs.nodejs_21
+          ];
+        };
+      });
+}
diff --git a/index.ts b/index.ts
index 6c5e4f3..ce0000d 100644
--- a/index.ts
+++ b/index.ts
@@ -10,6 +10,7 @@
 }
 
 async function propogateGuilds(client: Client<true>): Promise<Collection<string, Guild>> {
+    await client.guilds.fetch();
     let guilds = client.guilds.cache.filter((guild) => guild.ownerId == client.user.id);
 
     if (guilds.size < 10) {
@@ -30,18 +31,22 @@
     ]
 });
 
-client.once('ready', async (client) => {
+client.on('warn', (m) => console.warn(m));
+client.on('error', (m) => console.error(m.message));
 
+client.once('ready', async (client) => {
+    console.log('ready')
     let emojis: Collection<string, string> = new Collection();
 
     const dir = readdirSync("./deduplicated", {
         withFileTypes: true
     }).filter(file => file.isFile());
+    console.log(dir)
     const emojiFiles = dir.filter(file => file.name.endsWith('.png'));
 
     let currentEmojiIndex = 0;
-
     const guilds = await propogateGuilds(client);
+    console.log('Fetched Guilds');
 
     for (const [_id, guild] of guilds) {
         if (guild.invites.cache.size > 0) {
@@ -56,6 +61,7 @@
         }
 
         for (const [_, emoji] of guild.emojis.cache) {
+            console.log(`Deleting ${emoji.name}`)
             await emoji.delete();
         }
 
@@ -63,10 +69,11 @@
 
         while (emojiCount > 0) {
             let emoji = emojiFiles[currentEmojiIndex];
-            let attachment = readFileSync(emoji.path);
-            let name = emoji.name.split('.')[0]
+            let attachment = readFileSync(`./deduplicated/${emoji.name}`);
+            let longName = emoji.name.split('.')[0].replaceAll(/\-/g, "_");
+            let name = longName.substring(0, Math.min(longName.length, 32));
             const outEmoji = await uploadEmoji(guild, {name, attachment});
-
+            console.log(`${name}: ${outEmoji.id}`)
             emojis.set(name, outEmoji.id);
 
             emojiCount--;
