diff --git a/assets/config.json b/assets/config.json
index ac5067a..d955570 100644
--- a/assets/config.json
+++ b/assets/config.json
@@ -47,8 +47,8 @@
     },
     "rat_king_boss":
     {"path": "assets/rat_king_2_frame_animation.png",
-      "frame_width": 256,
-      "frame_height": 256
+      "frame_width": 720,
+      "frame_height": 720
     },
     "barrel_small":
     {"path": "assets/wood_barrel_small-256.png",
diff --git a/tools/fragviewer.cpp b/tools/fragviewer.cpp
index 8aefe1b..fe4540c 100644
--- a/tools/fragviewer.cpp
+++ b/tools/fragviewer.cpp
@@ -13,28 +13,44 @@ void Handle_events(sf::RenderWindow &window) {
   // is this a main event loop
   while (const auto event = window.pollEvent()) {
     if(event->is<sf::Event::Closed>()) {
-      fmt::print("Exiting...\n");
       window.close();
+    } else if(const auto* key = event->getIf<sf::Event::KeyPressed>()) {
+      using KEY = sf::Keyboard::Scan;
+      if(key->scancode == KEY::Escape) {
+        window.close();
+      }
     }
   }
 }
 
-
 int main(int argc, char *argv[]) {
   int opt = 0;
+  bool load_sprite = false;
   std::string sprite_name;
   std::string frag_name;
+  sf::Clock clock;
+  sf::Shader shader;
+  sf::RectangleShape rect;
+  textures::SpriteTexture sprite_texture;
+
+  textures::init();
 
   dbc::check(sf::Shader::isAvailable(), "You apparently are a time traveler from the 80s who doesn't have shaders.");
 
-  while((opt = getopt(argc, argv, "-s:-f:")) != -1) {
+  while((opt = getopt(argc, argv, "-hs:f:")) != -1) {
     switch(opt) {
       case 's':
         sprite_name = optarg;
+        load_sprite = true;
         break;
       case 'f':
         frag_name = optarg;
         break;
+      case 'h':
+        fmt::println(
+            "fragviewer is a simple tool to play fragment shaders.\n"
+            "USAGE: fragviewer [-s sprite_name] -f shader.frag");
+        return 0;
       default:
         fmt::println("USAGE: fragviewer [-s sprite_name] -f shader.frag");
         return -1;
@@ -51,17 +67,23 @@ int main(int argc, char *argv[]) {
   window.setFramerateLimit(60);
   window.setVerticalSyncEnabled(true);
 
-  sf::Clock clock;
-
-  sf::Shader shader;
-
   bool good_shader = shader.loadFromFile(frag_name, sf::Shader::Type::Fragment);
   dbc::check(good_shader, fmt::format("failed to load shader {}", frag_name));
 
-  sf::RectangleShape rect;
-  rect.setPosition({0,0});
-  rect.setSize(u_resolution);
-  rect.setFillColor({255, 0, 0, 255});
+
+  if(load_sprite) {
+    sprite_texture = textures::get(sprite_name);
+    sprite_texture.sprite->setPosition({0,0});
+    auto bounds = sprite_texture.sprite->getLocalBounds();
+    sf::Vector2f scale{u_resolution.x / bounds.size.x,
+      u_resolution.y / bounds.size.y};
+    sprite_texture.sprite->setScale(scale);
+    shader.setUniform("texture", sf::Shader::CurrentTexture);
+  } else {
+    rect.setPosition({0,0});
+    rect.setSize(u_resolution);
+    rect.setFillColor({255, 0, 0, 255});
+  }
 
   shader.setUniform("u_resolution", u_resolution);
 
@@ -74,7 +96,14 @@ int main(int argc, char *argv[]) {
     shader.setUniform("u_mouse", u_mouse);
     shader.setUniform("u_time", u_time.asSeconds());
 
-    window.draw(rect, &shader);
+    window.clear();
+
+    if(load_sprite) {
+      window.draw(*sprite_texture.sprite, &shader);
+    } else {
+      window.draw(rect, &shader);
+    }
+
     window.display();
   }
 }