diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,10 @@
 # Changelog
+
+## 0.4.6 (2024-06-20)
+- 'new': add --license option
+- 'new': bump stack.yaml resolver to lts-21
+- add missing SUMMARY placeholder to template
+
 ## 0.4.5 (2024-05-23)
 - 'tagdist', 'upload': also do pristine cabal build unless --no-build
 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -72,7 +72,7 @@
 `$ hkgr --version`
 
 ```
-0.4.5
+0.4.6
 ```
 `$ hkgr --help`
 
diff --git a/data/template.cabal.tmpl b/data/template.cabal.tmpl
--- a/data/template.cabal.tmpl
+++ b/data/template.cabal.tmpl
@@ -1,10 +1,10 @@
 cabal-version:       2.2
 name:                @PROJECT@
 version:             0.1.0
-synopsis:            One line summary
+synopsis:            @SUMMARY@
 description:
         Short paragraph here
-license:             BSD-3-Clause
+license:             @LICENSE@
 license-file:        LICENSE
 author:              @NAME@ <@EMAIL@>
 maintainer:          @NAME@ <@EMAIL@>
diff --git a/hkgr.cabal b/hkgr.cabal
--- a/hkgr.cabal
+++ b/hkgr.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.0
 name:                hkgr
-version:             0.4.5
+version:             0.4.6
 synopsis:            Simple Hackage release workflow for package maintainers
 description:
             Hkgr (Hackager) is a tool to help make new releases of
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -33,7 +33,8 @@
     subcommands
     [ Subcommand "new" "setup a new project" $
       newCmd
-      <$> optional (strArg "PROJECT")
+      <$> optional (strOptionWith 'l' "license" "LICENSE" "Specify license")
+      <*> optional (strArg "PROJECT")
     , Subcommand "tagdist" "'git tag' version and 'cabal sdist' tarball" $
       tagDistCmd
       <$> existingTag
@@ -327,9 +328,8 @@
 
 -- FIXME warning if upstream template changed (keep a versioned template copy)
 -- FIXME add default templates dir
--- FIXME --license
-newCmd :: Maybe String -> IO ()
-newCmd mproject = do
+newCmd :: Maybe String -> Maybe String -> IO ()
+newCmd mlicense mproject = do
   needProgram "cabal"
   name <- case mproject of
     Just ns -> return ns
@@ -352,12 +352,16 @@
       let setupFile = "Setup.hs"
       origsetup <- doesFileExist setupFile
       cabalversion <- readVersion <$> cmd "cabal" ["--numeric-version"]
-      let license = if cabalversion > makeVersion [3,4]
-                    then "BSD-3-Clause"
-                    else "BSD3"
-        in cabal_ "init" ["--quiet", "--no-comments", "--non-interactive", "--is-libandexe", "--cabal-version=1.18", "--license=" ++ license, "--package-name=" ++ name, "--version=0.1.0", "--dependency=base<5", "--source-dir=src"]
+      let license =
+            case mlicense of
+              Just l -> l
+              Nothing ->
+                if cabalversion > makeVersion [3,4]
+                then "BSD-3-Clause"
+                else "BSD3"
+      cabal_ "init" ["--quiet", "--no-comments", "--non-interactive", "--is-libandexe", "--cabal-version=1.18", "--license=" ++ license, "--package-name=" ++ name, "--version=0.1.0", "--dependency=base<5", "--source-dir=src"]
       whenJustM (cmdMaybe $ P.proc "find" ["-name", "Main.hs"]) $ \ file -> do
-        sed ["1s/^module Main where/-- SPDX-License-Identifier: BSD-3-Clause\\n\\nmodule Main (main) where/"] file
+        sed ["1s/^module Main where/-- SPDX-License-Identifier:" +-+ license ++ "\\n\\nmodule Main (main) where/"] file
         unless (file == "src/Main.hs") $ renameFile file "src/Main.hs"
       whenM (doesFileExist "CHANGELOG.md") $
         renameFile "CHANGELOG.md" "ChangeLog.md"
@@ -366,7 +370,7 @@
       unless origsetup $ do
         setup <- doesFileExist setupFile
         when setup $ removeFile setupFile
-      setupCabalTemplate name
+      setupCabalTemplate name license
     Just cblName ->
       when (cblName /= name) $
       putStrLn $ "Warning:" +-+ cblName +-+ "different to" +-+ name
@@ -374,7 +378,8 @@
   mstack <- findExecutable "stack"
   -- FIXME add stack.yaml template too
   when (not haveStackCfg && isJust mstack) $ do
-    cmd_ "stack" ["init", "--verbosity", "warn", "--resolver", "lts-19"]
+    -- FIXME determine last lts automatically
+    cmd_ "stack" ["init", "--verbosity", "warn", "--resolver", "lts-21"]
     sed ["/^#/d", "/^$/d"] "stack.yaml"
   haveGit <- doesDirectoryExist ".git"
   unless haveGit $ do
@@ -389,8 +394,8 @@
         [cbl] -> return $ Just (takeBaseName cbl)
         _ -> error' "More than one .cabal file found!"
 
-    setupCabalTemplate :: String -> IO ()
-    setupCabalTemplate name = do
+    setupCabalTemplate :: String -> String -> IO ()
+    setupCabalTemplate name license = do
       userTemplate <- getUserConfigFile "hkgr" "template.cabal"
       unlessM (doesFileExist userTemplate) $ do
         origTemplate <- getDataFileName "template.cabal.tmpl"
@@ -410,6 +415,7 @@
       replaceHolder "PROJECT" name $ name <.> "cabal"
       replaceHolder "PROJECT_" (map underscore name) $ name <.> "cabal"
       replaceHolder "SUMMARY" (name +-+ "project") $ name <.> "cabal"
+      replaceHolder "LICENSE" license $ name <.> "cabal"
       year <- cmdOut (P.proc "date" ["+%Y"])
       replaceHolder "YEAR" year $ name <.> "cabal"
       let modulePath = "src/MyLib.hs"
