diff --git a/bin/compare-screenshots b/bin/compare-screenshots
deleted file mode 100755
index 4f7e2535a4827e6fe70e57c2bf4d553053148f1f..0000000000000000000000000000000000000000
--- a/bin/compare-screenshots
+++ /dev/null
@@ -1,145 +0,0 @@
-#!/usr/bin/env babel-node
-
-import fetch from "isomorphic-fetch";
-import path from "path";
-import fs from "fs-promise"
-import imageDiff_ from "image-diff";
-import https from "https";
-import os from "os";
-
-import { WebClient } from "@slack/client";
-
-const CIRCLECI_TOKEN = process.env["CIRCLECI_TOKEN"];
-const SLACK_TOKEN = process.env["SLACK_TOKEN"];
-const SLACK_CHANNEL = "#ci-screenshots";
-
-const CIRCLE_PROJECT = "github/metabase/metabase";
-const CIRCLE_BRANCH = "master";
-
-const CIRCLE_SCREENSHOT_PATH = "/home/ubuntu/metabase/screenshots/";
-
-const slack = new WebClient(SLACK_TOKEN);
-
-async function circleci(path) {
-    const response = await fetch(
-        `https://circleci.com/api/v1.1/${path}?circle-token=${encodeURIComponent(CIRCLECI_TOKEN)}`
-    );
-    return response.json();
-}
-
-function imageDiff(options) {
-    return new Promise((resolve, reject) => {
-        imageDiff_.getFullResult(options, (err, result) =>
-            err ? reject(err) : resolve(result)
-        );
-    });
-}
-
-function download(url, path) {
-    return new Promise((resolve, reject) => {
-        https.get(url, response => {
-            response.pipe(fs.createWriteStream(path)).on("finish", resolve);
-        }).on('error', reject);
-    });
-}
-
-async function getCircleArtifactScreenshots(buildPath) {
-    let artifacts = await circleci(`project/${buildPath}/artifacts`);
-    let results = {};
-    for (const artifact of artifacts) {
-        if (artifact.pretty_path.startsWith(CIRCLE_SCREENSHOT_PATH)) {
-            const downloadPath = path.join(os.tmpdir(), path.basename(artifact.pretty_path));
-            console.log("Downloading ", artifact.url, "to", downloadPath);
-            await download(artifact.url, downloadPath);
-            results[artifact.pretty_path.slice(CIRCLE_SCREENSHOT_PATH.length)] = downloadPath;
-        }
-    }
-    return results;
-}
-
-async function getLocalScreenshots(directory) {
-    const filenames = await fs.readdir(directory);
-    let results = {};
-    for (const filename of filenames) {
-        results[filename] = path.resolve(directory, filename);
-    }
-    return results;
-}
-
-async function getScreenshots(target) {
-    if (target.circleProject && target.circleBranch) {
-        let builds = await circleci(`project/${target.circleProject}/tree/${target.circleBranch}`);
-        let ok = builds.filter(build => build.status === "success" || build.status === "fixed");
-        let screenshots = await getCircleArtifactScreenshots(`${target.circleProject}/${ok[0].build_num}`);
-        return screenshots;
-    } else if (target.localDirectory) {
-        return await getLocalScreenshots(target.localDirectory);
-    } else {
-        throw "unknown target type";
-    }
-}
-
-async function run(expectedTarget, actualTarget) {
-    try {
-        const expectedScreenshots = await getScreenshots(expectedTarget);
-        console.log("Expected", Object.keys(expectedScreenshots));
-        const actualScreenshots = await getScreenshots(actualTarget);
-        console.log("Actual", Object.keys(expectedScreenshots));
-        let images = Object.keys({ ...expectedScreenshots, ...actualScreenshots });
-
-        for (const image of images) {
-            const expectedImage = expectedScreenshots[image];
-            const actualImage = actualScreenshots[image];
-            const diffImage = path.join(os.tmpdir(), "diff-"+image);
-            if (!actualImage) {
-                console.log("Added", image);
-                await slack.files.upload(image, {
-                    title: "Added " + image,
-                    channels: [SLACK_CHANNEL],
-                    file: fs.createReadStream(actualImage)
-                });
-            } else if (!expectedImage) {
-                console.log("Removed", image);
-                await slack.files.upload(image, {
-                    title: "Removed " + image,
-                    channels: [SLACK_CHANNEL],
-                    file: fs.createReadStream(expectedImage)
-                });
-            } else {
-                const result = await imageDiff({
-                    expectedImage,
-                    actualImage,
-                    diffImage,
-                    shadow: true
-                })
-                if (result.percentage === 0.0) {
-                    console.log("No difference", image);
-                } else {
-                    console.log("Changed", result.percentage.toFixed(2), image);
-                    await slack.files.upload(image, {
-                        title: "Diff (" + result.percentage.toFixed(2) + ") " + image,
-                        channels: [SLACK_CHANNEL],
-                        file: fs.createReadStream(diffImage)
-                    });
-                    await slack.files.upload(image, {
-                        title: "Expected " + image,
-                        channels: [SLACK_CHANNEL],
-                        file: fs.createReadStream(expectedImage)
-                    });
-                    await slack.files.upload(image, {
-                        title: "Actual " + image,
-                        channels: [SLACK_CHANNEL],
-                        file: fs.createReadStream(actualImage)
-                    });
-                }
-            }
-        }
-    } catch (e) {
-        console.error(e);
-    }
-}
-
-run(
-    { circleProject: CIRCLE_PROJECT, circleBranch: CIRCLE_BRANCH },
-    { localDirectory: "screenshots" }
-);
diff --git a/package.json b/package.json
index 1e2538205f550efa97fb721df851bc4b43848701..1da6d1cd401944abd3d5c91fca201d51ee77b0f1 100644
--- a/package.json
+++ b/package.json
@@ -132,7 +132,6 @@
     "html-webpack-harddisk-plugin": "^2.0.0",
     "html-webpack-plugin": "^5.3.1",
     "husky": "^6.0.0",
-    "image-diff": "^1.6.3",
     "jest": "^19.0.2",
     "jest-localstorage-mock": "^2.2.0",
     "jsonwebtoken": "^7.2.1",
diff --git a/yarn.lock b/yarn.lock
index 23b2a7b65a03f60dbe670b5c0b27262e39039a0a..c35525d9bd964c350af7bccca9006c1b28a62007 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1802,16 +1802,6 @@ array-includes@^3.1.2:
     get-intrinsic "^1.1.1"
     is-string "^1.0.5"
 
-array-parallel@~0.1.3:
-  version "0.1.3"
-  resolved "https://registry.yarnpkg.com/array-parallel/-/array-parallel-0.1.3.tgz#8f785308926ed5aa478c47e64d1b334b6c0c947d"
-  integrity sha1-j3hTCJJu1apHjEfmTRszS2wMlH0=
-
-array-series@~0.1.5:
-  version "0.1.5"
-  resolved "https://registry.yarnpkg.com/array-series/-/array-series-0.1.5.tgz#df5d37bfc5c2ef0755e2aa4f92feae7d4b5a972f"
-  integrity sha1-3103v8XC7wdV4qpPkv6ufUtaly8=
-
 array-union@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
@@ -1954,11 +1944,6 @@ async@^3.2.0:
   resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720"
   integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==
 
-async@~0.2.9:
-  version "0.2.10"
-  resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
-  integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E=
-
 async@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9"
@@ -3315,15 +3300,6 @@ buffer@^6.0.3:
     base64-js "^1.3.1"
     ieee754 "^1.2.1"
 
-buffered-spawn@~1.1.1:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/buffered-spawn/-/buffered-spawn-1.1.2.tgz#21ad9735dfbf6576745be0d74a23ef257bf3c58d"
-  integrity sha1-Ia2XNd+/ZXZ0W+DXSiPvJXvzxY0=
-  dependencies:
-    cross-spawn-async "^1.0.1"
-    err-code "^0.1.0"
-    q "^1.0.1"
-
 builtin-status-codes@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
@@ -3945,13 +3921,6 @@ commander@~2.17.1:
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
   integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==
 
-commander@~2.9.0:
-  version "2.9.0"
-  resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
-  integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=
-  dependencies:
-    graceful-readlink ">= 1.0.0"
-
 common-tags@^1.8.0:
   version "1.8.0"
   resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937"
@@ -4227,14 +4196,6 @@ create-react-class@^15.5.1, create-react-class@^15.5.2:
     loose-envify "^1.3.1"
     object-assign "^4.1.1"
 
-cross-spawn-async@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-1.0.1.tgz#bb525c1e420d9942552e04791a3eb2d9887a105f"
-  integrity sha1-u1JcHkINmUJVLgR5Gj6y2Yh6EF8=
-  dependencies:
-    lru-cache "^2.6.5"
-    which "^1.1.1"
-
 cross-spawn@^5.0.1:
   version "5.1.0"
   resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
@@ -4637,13 +4598,6 @@ debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
   dependencies:
     ms "2.1.2"
 
-debug@~2.2.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
-  integrity sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=
-  dependencies:
-    ms "0.7.1"
-
 decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
@@ -5185,11 +5139,6 @@ envinfo@^7.7.3:
   resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475"
   integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==
 
-err-code@^0.1.0:
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/err-code/-/err-code-0.1.2.tgz#122a92b3342b9899da02b5ac994d30f95d4763ee"
-  integrity sha1-EiqSszQrmJnaArWsmU0w+V1HY+4=
-
 errno@^0.1.3, errno@~0.1.7:
   version "0.1.7"
   resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
@@ -6433,15 +6382,6 @@ globby@^6.1.0:
     pify "^2.0.0"
     pinkie-promise "^2.0.0"
 
-gm@~1.21.1:
-  version "1.21.1"
-  resolved "https://registry.yarnpkg.com/gm/-/gm-1.21.1.tgz#7ed5ed05db36d30c1943f39c3bc1c839b8f2361d"
-  integrity sha1-ftXtBds20wwZQ/OcO8HIObjyNh0=
-  dependencies:
-    array-parallel "~0.1.3"
-    array-series "~0.1.5"
-    debug "~2.2.0"
-
 graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.2.0:
   version "4.2.4"
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
@@ -6452,11 +6392,6 @@ graceful-fs@^4.2.4:
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
   integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
 
-"graceful-readlink@>= 1.0.0":
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
-  integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=
-
 grid-styled@4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/grid-styled/-/grid-styled-4.1.0.tgz#adb060021b9562e02750ce515dae47f03559b4b9"
@@ -6968,18 +6903,6 @@ ignore@^4.0.6:
   resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
   integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
 
-image-diff@^1.6.3:
-  version "1.6.3"
-  resolved "https://registry.yarnpkg.com/image-diff/-/image-diff-1.6.3.tgz#818a0e656ae89480e802e7ef14db460826f730fc"
-  integrity sha1-gYoOZWrolIDoAufvFNtGCCb3MPw=
-  dependencies:
-    async "~0.2.9"
-    buffered-spawn "~1.1.1"
-    commander "~2.9.0"
-    gm "~1.21.1"
-    mkdirp "~0.3.5"
-    tmp "0.0.23"
-
 import-cwd@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9"
@@ -8820,11 +8743,6 @@ lower-case@^2.0.2:
   dependencies:
     tslib "^2.0.3"
 
-lru-cache@^2.6.5:
-  version "2.7.3"
-  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952"
-  integrity sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=
-
 lru-cache@^4.0.1:
   version "4.1.5"
   resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
@@ -9218,11 +9136,6 @@ mkdirp@^1.0.4:
   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
   integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
 
-mkdirp@~0.3.5:
-  version "0.3.5"
-  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7"
-  integrity sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=
-
 mockdate@^2.0.2:
   version "2.0.5"
   resolved "https://registry.yarnpkg.com/mockdate/-/mockdate-2.0.5.tgz#70c6abf9ed4b2dae65c81dfc170dd1a5cec53620"
@@ -9265,11 +9178,6 @@ moment@2.x.x, "moment@>= 2.9.0", moment@^2.29.1:
   resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3"
   integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==
 
-ms@0.7.1:
-  version "0.7.1"
-  resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
-  integrity sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=
-
 ms@2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
@@ -11110,7 +11018,7 @@ punycode@^2.1.0, punycode@^2.1.1:
   resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
   integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
 
-q@^1.0.1, q@^1.1.2:
+q@^1.1.2:
   version "1.5.1"
   resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
   integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
@@ -13466,11 +13374,6 @@ tinycolor2@^1.4.1:
   resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803"
   integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==
 
-tmp@0.0.23:
-  version "0.0.23"
-  resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.23.tgz#de874aa5e974a85f0a32cdfdbd74663cb3bd9c74"
-  integrity sha1-3odKpel0qF8KMs39vXRmPLO9nHQ=
-
 tmp@~0.2.1:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14"