diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,12 @@
 
 ## master
 
+
+## v0.1.2.0
+
+* Embed files that are not valid UTF-8 as base64-encoded
+  `{-# START_FILE BASE64 <name> #-}` sections.
+
 ## v0.1.1.0
 
 * Output files in sorted ordering.
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
 # stack-templatizer
 
-[![stack-templatizer Build Status](https://travis-ci.org/prikhi/stack-templatizer.svg?branch=master)](https://travis-ci.org/prikhi/stack-templatizer)
+[![stack-templatizer Build Status](https://github.com/prikhi/stack-templatizer/actions/workflows/main.yml/badge.svg)](https://github.com/prikhi/stack-templatizer/actions/workflows/main.yml)
 
 
 Stack Templatizer is a small application that lets you generate stack template
@@ -8,7 +8,7 @@
 
 Install or clone & build the project using `stack`:
 
-```
+```sh
 # Install from Stack Nightly
 stack install stack-templatizer --resolver nightly
 
@@ -21,11 +21,15 @@
 Once installed, you can run `stack-templatizer my-template-folder` to generate
 a `my-template-folder.hsfiles` stack template.
 
+Files that are not valid UTF-8 (images, archives, etc.) are embedded as
+base64-encoded `{-# START_FILE BASE64 <name> #-}` sections, which `stack new`
+decodes back into the original binary files.
 
+
 For an example repository that generates a stack template, see
 [hpack-template](https://github.com/prikhi/hpack-template).
 
 
-# LICENSE
+## LICENSE
 
 BSD-3-Clause
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -3,7 +3,14 @@
 {-# LANGUAGE TupleSections #-}
 module Main where
 
-import           Data.List                      ( sort )
+import           Data.ByteString.Builder        ( Builder
+                                                , byteString
+                                                , stringUtf8
+                                                , toLazyByteString
+                                                )
+import           Data.List                      ( intersperse
+                                                , sort
+                                                )
 import           System.Directory               ( listDirectory
                                                 , doesDirectoryExist
                                                 )
@@ -11,13 +18,14 @@
 import           System.Exit                    ( exitFailure )
 import           System.FilePath                ( (</>) )
 
+import qualified Data.ByteString               as BS
+import qualified Data.ByteString.Base64        as Base64
 import qualified Data.ByteString.Lazy          as LBS
-import qualified Data.ByteString.Lazy.Char8    as LC
 
 main :: IO ()
 main = getArgs >>= \case
-    [folderName] ->
-        templatize folderName >>= LBS.writeFile (folderName ++ ".hsfiles")
+    [folderName] -> templatize folderName
+        >>= LBS.writeFile (folderName ++ ".hsfiles") . toLazyByteString
     _ -> printHelp >> exitFailure
 
 
@@ -29,14 +37,15 @@
     , "Usage: stack-templatizer FOLDER_NAME"
     , ""
     , "The generated file will be named `<folder-name>.hsfiles`"
+    , "Files that are not valid UTF-8 are embedded base64-encoded."
     ]
 
 
-templatize :: FilePath -> IO LBS.ByteString
+templatize :: FilePath -> IO Builder
 templatize folder = do
     fileNames        <- getFilesInDirectory folder
     namesAndContents <- mapM
-        (\file -> (file, ) <$> LBS.readFile (folder </> file))
+        (\file -> (file, ) <$> BS.readFile (folder </> file))
         fileNames
     return $ generateHFiles namesAndContents
 
@@ -61,9 +70,23 @@
             else return [templatePath]
 
 
-generateHFiles :: [(FilePath, LBS.ByteString)] -> LBS.ByteString
-generateHFiles = LBS.intercalate "\n" . map prefixName
+generateHFiles :: [(FilePath, BS.ByteString)] -> Builder
+generateHFiles = mconcat . intersperse "\n" . map renderSection
   where
-    prefixName :: (FilePath, LBS.ByteString) -> LBS.ByteString
-    prefixName (file, contents) =
-        "{-# START_FILE " <> LC.pack file <> " #-}\n" <> contents
+    renderSection :: (FilePath, BS.ByteString) -> Builder
+    renderSection (file, contents)
+        | BS.isValidUtf8 contents =
+            "{-# START_FILE " <> stringUtf8 file <> " #-}\n"
+                <> byteString contents
+        | otherwise =
+            "{-# START_FILE BASE64 " <> stringUtf8 file <> " #-}\n"
+                <> foldMap ((<> "\n") . byteString)
+                           (chunksOf 76 $ Base64.encode contents)
+
+
+chunksOf :: Int -> BS.ByteString -> [BS.ByteString]
+chunksOf size bytes
+    | BS.null bytes = []
+    | otherwise =
+        let (chunk, rest) = BS.splitAt size bytes
+        in  chunk : chunksOf size rest
diff --git a/stack-templatizer.cabal b/stack-templatizer.cabal
--- a/stack-templatizer.cabal
+++ b/stack-templatizer.cabal
@@ -1,13 +1,11 @@
 cabal-version: 1.12
 
--- This file has been generated from package.yaml by hpack version 0.35.1.
+-- This file has been generated from package.yaml by hpack version 0.39.1.
 --
 -- see: https://github.com/sol/hpack
---
--- hash: c53e807db04e8b8ab72ceacd797c38f9885d39cd532a917e3f101bac72614b20
 
 name:           stack-templatizer
-version:        0.1.1.0
+version:        0.1.2.0
 synopsis:       Generate a stack template from a folder.
 description:    @stack-templatizer@ is an application that generates a @.hsfiles@ stack
                 template from a folder of template files.
@@ -26,7 +24,7 @@
 bug-reports:    https://github.com/prikhi/stack-templatizer/issues
 author:         Pavan Rikhi
 maintainer:     pavan.rikhi@gmail.com
-copyright:      2020-2023 Pavan Rikhi
+copyright:      2020-2026 Pavan Rikhi
 license:        BSD3
 license-file:   LICENSE
 build-type:     Simple
@@ -46,7 +44,8 @@
       src
   build-depends:
       base >=4.7 && <5
-    , bytestring <1
+    , base64-bytestring ==1.*
+    , bytestring >=0.11.2 && <1
     , directory ==1.*
     , filepath ==1.*
   default-language: Haskell2010
