diff --git a/Main.hs b/Main.hs
new file mode 100644
--- /dev/null
+++ b/Main.hs
@@ -0,0 +1,59 @@
+import Control.Lens hiding ((&), value)
+import Data.List
+import Data.Maybe
+import Data.Ord
+import Options.Applicative
+import Paths_unscramble
+import System.IO
+import Unscramble.Input
+import Unscramble.Output
+import Unscramble.Score
+import Unscramble.Search
+import Unscramble.Types
+
+parseOpts :: Parser ScrambleOpts
+parseOpts = ScrambleOpts
+        <$> option
+            ( long "size" 
+            & short 's'
+            & metavar "SIZE"
+            & help "Grid size (default 4)"
+            & value 4)
+        <*> option
+            ( long "score"
+            & metavar "SYSTEM"
+            & help "Scoring system (one of \27[1mswf\27[0m (default),\
+            \ \27[1mboggle\27[0m, \27[1mword-wars\27[0m)"
+            & value SWF)
+        <*> option
+            ( long "display"
+            & short 'd'
+            & metavar "STYLE"
+            & help "Display style: \27[1mone-line\27[0m to print all\
+            \ the words in order on one line, or \27[1mchunked\27[0m\
+            \ to display three-at-a-time with a board diagram for each."
+            & value Chunked)
+
+main :: IO ()
+main = do
+    sopts <- execParser opts
+    grid' <- readGrid (gridSize sopts)
+    mult' <- case scoreSystem sopts of
+        SWF -> readMult
+        _ -> return $ Multiplier [] Nothing [] Nothing
+    filepath <- getDataFileName "lists/enable.txt"
+    withFile filepath ReadMode $ \h -> do
+        cont <- hGetContents h
+        let foundWords = sortBy ((invert .) . comparing (_1 ^$))
+                       . mapMaybe (\a ->
+                           searchGrid a grid' mult' (scoreSystem sopts))
+                       $ lines cont
+        display foundWords grid' mult' sopts
+    where
+        opts = info (helper <*> parseOpts)
+            ( fullDesc
+            & progDesc "Solve a Boggle-like word game"
+            & header "unscramble")
+        invert LT = GT
+        invert GT = LT
+        invert x = x
diff --git a/Unscramble.hs b/Unscramble.hs
deleted file mode 100644
--- a/Unscramble.hs
+++ /dev/null
@@ -1,61 +0,0 @@
-module Unscramble where
-
-import Control.Lens hiding ((&), value)
-import Data.List
-import Data.Maybe
-import Data.Ord
-import Options.Applicative
-import Paths_unscramble
-import System.IO
-import Unscramble.Input
-import Unscramble.Output
-import Unscramble.Score
-import Unscramble.Search
-import Unscramble.Types
-
-parseOpts :: Parser ScrambleOpts
-parseOpts = ScrambleOpts
-        <$> option
-            ( long "size" 
-            & short 's'
-            & metavar "SIZE"
-            & help "Grid size (default 4)"
-            & value 4)
-        <*> option
-            ( long "score"
-            & metavar "SYSTEM"
-            & help "Scoring system (one of \27[1mswf\27[0m (default),\
-            \ \27[1mboggle\27[0m, \27[1mword-wars\27[0m)"
-            & value SWF)
-        <*> option
-            ( long "display"
-            & short 'd'
-            & metavar "STYLE"
-            & help "Display style: \27[1mone-line\27[0m to print all\
-            \ the words in order on one line, or \27[1mchunked\27[0m\
-            \ to display three-at-a-time with a board diagram for each."
-            & value Chunked)
-
-main :: IO ()
-main = do
-    sopts <- execParser opts
-    grid' <- readGrid (gridSize sopts)
-    mult' <- case scoreSystem sopts of
-        SWF -> readMult
-        _ -> return $ Multiplier [] Nothing [] Nothing
-    filepath <- getDataFileName "lists/enable.txt"
-    withFile filepath ReadMode $ \h -> do
-        cont <- hGetContents h
-        let foundWords = sortBy ((invert .) . comparing (_1 ^$))
-                       . mapMaybe (\a ->
-                           searchGrid a grid' mult' (scoreSystem sopts))
-                       $ lines cont
-        display foundWords grid' mult' sopts
-    where
-        opts = info (helper <*> parseOpts)
-            ( fullDesc
-            & progDesc "Solve a Boggle-like word game"
-            & header "unscramble")
-        invert LT = GT
-        invert GT = LT
-        invert x = x
diff --git a/unscramble.cabal b/unscramble.cabal
--- a/unscramble.cabal
+++ b/unscramble.cabal
@@ -1,5 +1,7 @@
 Name:           unscramble
-Version:        0.0
+Category:       Utils
+Synopsis:       Solve Boggle-like word games
+Version:        0.1
 Description:    Solve Boggle-like word games
 License:        GPL
 Author:         Joel Taylor
@@ -9,7 +11,7 @@
 Data-Files:     lists/enable.txt
 
 Executable unscramble
-    Main-is:                Unscramble.hs
+    Main-is:                Main.hs
     Build-Depends:          base == 4.*, hashmap == 1.3.*, lens == 3.7.*, mtl == 2.1.*, optparse-applicative == 0.4.*
     Default-extensions:     TemplateHaskell, TupleSections
     Default-Language:       Haskell2010
