diff --git a/Kit/CmdArgs.hs b/Kit/CmdArgs.hs
--- a/Kit/CmdArgs.hs
+++ b/Kit/CmdArgs.hs
@@ -1,10 +1,11 @@
+{-# LANGUAGE TemplateHaskell #-}
 {-# LANGUAGE DeriveDataTypeable #-}
 module Kit.CmdArgs (parseArgs, KitCmdArgs(..)) where
-
   import System.Console.CmdArgs as CA
+  import Distribution.PackageDescription.TH
 
   appVersion :: String
-  appVersion = "0.7.7" -- TODO how to keep this up to date with kit.cabal?
+  appVersion = $(packageVariable (pkgVersion . package))
 
   data KitCmdArgs = Update
                   | Package
diff --git a/Kit/Spec.hs b/Kit/Spec.hs
--- a/Kit/Spec.hs
+++ b/Kit/Spec.hs
@@ -60,7 +60,7 @@
     packageVersion = kitVersion . specKit
 
   defaultSpec :: String -> String -> KitSpec
-  defaultSpec name version = KitSpec (Kit name version) [] "src" "test" "lib" "resources" "Prefix.pch" "Config.xcconfig" Nothing
+  defaultSpec name version = KitSpec (Kit name version) [] "src" "test" "lib" "resources" "Prefix.pch" "Config.xcconfig" Nothing 
   -- TODO make this and the json reading use the same defaults
   -- I suspect that to do this I'll need update functions for each of
   -- fields in the KitSpec record.
diff --git a/Kit/Xcode/ProjectFileTemplate.hs b/Kit/Xcode/ProjectFileTemplate.hs
--- a/Kit/Xcode/ProjectFileTemplate.hs
+++ b/Kit/Xcode/ProjectFileTemplate.hs
@@ -4,9 +4,12 @@
 import Kit.Xcode.Common
 import Text.PList
 import Control.Monad (join)
+import Data.Maybe (maybeToList)
 
 import qualified Data.List as L
 
+val_arr = arr . map val
+
 projectFile objects rootId = PListFile "!$*UTF8*$!" $ obj [
       "archiveVersion" ~> val "1",
       "classes" ~> obj [],
@@ -15,6 +18,10 @@
       "rootObject" ~> val rootId 
   ]
 
+projectRootUUID = "0867D690FE84028FC02AAC07" 
+kitUpdateTargetUUID = "470E2D641287730A0084AE6F"
+staticLibTargetUUID = "D2AAC07D0554694100DB518D"
+
 groupProductsUUID = "034768DFFF38A50411DB9C8B"
 mainGroupUUID = "0867D691FE84028FC02AAC07"
 classesGroupUUID = "08FB77AEFE84172EC02AAC07"
@@ -28,8 +35,11 @@
 sourcesBuildPhaseUUID = "D2AAC07B0554694100DB518D"
 frameworksBuildPhaseUUID = "D2AAC07C0554694100DB518D"
 
+projectBuildConfigurationsUUID = "1DEB922208733DC00010E9CD"
+staticLibBuildConfigurationsUUID = "1DEB921E08733DC00010E9CD"
+
 makeProjectPList :: [PListObjectItem] -> [FilePath] -> PListFile 
-makeProjectPList objects libDirs = projectFile objs "0867D690FE84028FC02AAC07" where
+makeProjectPList objects libDirs = projectFile objs projectRootUUID where
     objs = objects ++ groups ++ targets ++ buildConfigurations libDirs
 
 groups = [ groupProductsUUID ~> group "Products" [ val productRefUUID ],
@@ -42,36 +52,76 @@
           ],
           otherSourcesGroupUUID ~> group "Other Sources" [val "AA747D9E0F9514B9006C5449"]
         ]
-      
-targets = ("D2AAC07D0554694100DB518D" ~> obj [
-            "isa" ~> val "PBXNativeTarget",
-            "buildConfigurationList" ~> val "1DEB921E08733DC00010E9CD",
-            "buildPhases" ~> arr [ val headersBuildPhaseUUID, val sourcesBuildPhaseUUID, val frameworksBuildPhaseUUID ],
-            "buildRules" ~> arr [],
-            "dependencies" ~> arr [],
-            "name" ~> val "KitDeps",
-            "productName" ~> val "KitDeps",
-            "productReference" ~> val productRefUUID,
-            "productType" ~> val "com.apple.product-type.library.static"
-          ]) : kitUpdateTarget ++ ["0867D690FE84028FC02AAC07" ~> obj [
+
+projectRoot = [projectRootUUID ~> obj [
             "isa" ~> val "PBXProject",
-            "buildConfigurationList" ~> val "1DEB922208733DC00010E9CD",
+            "buildConfigurationList" ~> val projectBuildConfigurationsUUID,
             "compatibilityVersion" ~> val "Xcode 3.2",
             "hasScannedForEncodings" ~> val "1",
             "mainGroup" ~> val mainGroupUUID ,
             "productRefGroup" ~> val groupProductsUUID,
             "projectDirPath" ~> val "",
             "projectRoot" ~> val "",
-            "targets" ~> arr [ val "D2AAC07D0554694100DB518D", val "470E2D641287730A0084AE6F" ] 
+            "targets" ~> val_arr [ staticLibTargetUUID, kitUpdateTargetUUID ] 
         ]]
+      
+targets = (staticLibTargetUUID ~> obj [
+            "isa" ~> val "PBXNativeTarget",
+            "buildConfigurationList" ~> val staticLibBuildConfigurationsUUID,
+            "buildPhases" ~> val_arr [ headersBuildPhaseUUID, sourcesBuildPhaseUUID, frameworksBuildPhaseUUID ],
+            "buildRules" ~> arr [],
+            "dependencies" ~> arr [],
+            "name" ~> val "KitDeps",
+            "productName" ~> val "KitDeps",
+            "productReference" ~> val productRefUUID,
+            "productType" ~> val "com.apple.product-type.library.static"
+          ]) : kitUpdateTarget ++ projectRoot
 
 librarySearchPaths libDirs = "LIBRARY_SEARCH_PATHS" ~> val ("$(inherited) " ++ join (L.intersperse " " libDirs))
 
-buildConfigurations libDirs = let libSearch = librarySearchPaths libDirs in ["1DEB921F08733DC00010E9CD" ~> obj [
-            "isa" ~> val "XCBuildConfiguration",
-            "buildSettings" ~> obj [
+staticLibDebugConfigurationUUID = "1DEB921F08733DC00010E9CD"
+staticLibReleaseConfigurationUUID = "1DEB922008733DC00010E9CD"
+
+projectReleaseConfigurationUUID = "1DEB922408733DC00010E9CD"
+projectDebugConfigurationUUID = "1DEB922308733DC00010E9CD" 
+
+buildConfiguration name baseConfig settings = obj $ [
+    "isa" ~> val "XCBuildConfiguration",
+    "buildSettings" ~> obj settings, "name" ~> val name
+  ] ++ (maybeToList baseConfig >>= (\c -> ["baseConfigurationReference" ~> val c]))
+
+buildConfigurations libDirs = let libSearch = librarySearchPaths libDirs in [
+          projectBuildConfigurationsUUID ~> obj [
+              "isa" ~> val "XCConfigurationList",
+              "buildConfigurations" ~> val_arr [projectDebugConfigurationUUID, projectReleaseConfigurationUUID],
+              "defaultConfigurationIsVisible" ~> val "0",
+              "defaultConfigurationName" ~> val "Release"
+            ],
+          staticLibBuildConfigurationsUUID ~> obj [
+              "isa" ~> val "XCConfigurationList",
+              "buildConfigurations" ~> val_arr [staticLibDebugConfigurationUUID, staticLibReleaseConfigurationUUID],
+              "defaultConfigurationIsVisible" ~> val "0",
+              "defaultConfigurationName" ~> val "Release"
+            ],
+          projectDebugConfigurationUUID ~> buildConfiguration "Debug" (Just kitConfigRefUUID) [
+              "GCC_C_LANGUAGE_STANDARD" ~> val "c99",
+              "GCC_OPTIMIZATION_LEVEL" ~> val "0",
+              "GCC_WARN_ABOUT_RETURN_TYPE" ~> val "YES",
+              "GCC_WARN_UNUSED_VARIABLE" ~> val "YES",
+              "OTHER_LDFLAGS" ~> val "-ObjC",
+              "SDKROOT" ~> val "iphoneos",
+              libSearch
+            ],
+          projectReleaseConfigurationUUID ~> buildConfiguration "Release" (Just kitConfigRefUUID) [
+              "GCC_C_LANGUAGE_STANDARD" ~> val "c99",
+              "GCC_WARN_ABOUT_RETURN_TYPE" ~> val "YES",
+              "GCC_WARN_UNUSED_VARIABLE" ~> val "YES",
+              "OTHER_LDFLAGS" ~> val "-ObjC",
+              "SDKROOT" ~> val "iphoneos",
+              libSearch
+            ],
+          staticLibDebugConfigurationUUID ~> buildConfiguration "Debug" Nothing [
               "ALWAYS_SEARCH_USER_PATHS" ~> val "NO",
-              "ARCHS" ~> val "$(ARCHS_STANDARD_32_BIT)",
               "COPY_PHASE_STRIP" ~> val "NO",
               "DSTROOT" ~> val "/tmp/KitDeps.dst",
               "GCC_DYNAMIC_NO_PIC" ~> val "NO",
@@ -83,13 +133,8 @@
               "PRODUCT_NAME" ~> val "KitDeps",
               libSearch 
             ],
-            "name" ~> val "Debug"
-          ],
-          "1DEB922008733DC00010E9CD" ~> obj [
-            "isa" ~> val "XCBuildConfiguration",
-            "buildSettings" ~> obj [
+          staticLibReleaseConfigurationUUID ~> buildConfiguration "Release" Nothing [
               "ALWAYS_SEARCH_USER_PATHS" ~> val "NO",
-              "ARCHS" ~> val "$(ARCHS_STANDARD_32_BIT)",
               "DSTROOT" ~> val "/tmp/KitDeps.dst",
               "GCC_MODEL_TUNING" ~> val "G5",
               "GCC_PRECOMPILE_PREFIX_HEADER" ~> val "YES",
@@ -97,60 +142,11 @@
               "INSTALL_PATH" ~> val "/usr/local/lib",
               "PRODUCT_NAME" ~> val "KitDeps",
               libSearch
-              ],
-            "name" ~> val "Release"
-            ],
-          "1DEB922308733DC00010E9CD" ~> obj [
-            "isa" ~> val "XCBuildConfiguration",
-            "baseConfigurationReference" ~> val kitConfigRefUUID,
-            "buildSettings" ~> obj [
-              "ARCHS" ~> val "$(ARCHS_STANDARD_32_BIT)",
-              "GCC_C_LANGUAGE_STANDARD" ~> val "c99",
-              "GCC_OPTIMIZATION_LEVEL" ~> val "0",
-              "GCC_WARN_ABOUT_RETURN_TYPE" ~> val "YES",
-              "GCC_WARN_UNUSED_VARIABLE" ~> val "YES",
-              "OTHER_LDFLAGS" ~> val "-ObjC",
-              "SDKROOT" ~> val "iphoneos",
-              libSearch
-            ],
-            "name" ~> val "Debug"
-          ],
-          "1DEB922408733DC00010E9CD" ~> obj [
-            "isa" ~> val "XCBuildConfiguration",
-            "baseConfigurationReference" ~> val kitConfigRefUUID,
-            "buildSettings" ~> obj [
-              "ARCHS" ~> val "$(ARCHS_STANDARD_32_BIT)",
-              "GCC_C_LANGUAGE_STANDARD" ~> val "c99",
-              "GCC_WARN_ABOUT_RETURN_TYPE" ~> val "YES",
-              "GCC_WARN_UNUSED_VARIABLE" ~> val "YES",
-              "OTHER_LDFLAGS" ~> val "-ObjC",
-              "SDKROOT" ~> val "iphoneos",
-              libSearch
-            ],
-            "name" ~> val "Release"
-          ],
-          "1DEB921E08733DC00010E9CD" ~> obj [
-            "isa" ~> val "XCConfigurationList",
-            "buildConfigurations" ~> arr [
-              val "1DEB921F08733DC00010E9CD",
-              val "1DEB922008733DC00010E9CD"
-            ],
-            "defaultConfigurationIsVisible" ~> val "0",
-            "defaultConfigurationName" ~> val "Release"
-          ],
-          "1DEB922208733DC00010E9CD" ~> obj [
-            "isa" ~> val "XCConfigurationList",
-            "buildConfigurations" ~> arr [
-              val "1DEB922308733DC00010E9CD",
-              val "1DEB922408733DC00010E9CD"
-            ],
-            "defaultConfigurationIsVisible" ~> val "0",
-            "defaultConfigurationName" ~> val "Release"
-          ]
+            ]
         ]
 
 kitUpdateTarget = [
-      "470E2D641287730A0084AE6F" ~> obj [ 
+      kitUpdateTargetUUID ~> obj [ 
         "isa" ~> val "PBXLegacyTarget",
         "buildArgumentsString" ~> val "",
         "buildConfigurationList" ~> val "470E2D721287731E0084AE6F",
@@ -161,27 +157,15 @@
         "name" ~> val "KitUpdate",
         "passBuildSettingsInEnvironment" ~> val "1",
         "productName" ~> val "KitUpdate"
-      ],
+        ],
       "470E2D721287731E0084AE6F" ~> obj [
         "isa" ~> val "XCConfigurationList",
-        "buildConfigurations" ~> arr [ val "470E2D651287730B0084AE6F", val "470E2D661287730B0084AE6F" ],
+        "buildConfigurations" ~> val_arr [ "470E2D651287730B0084AE6F", "470E2D661287730B0084AE6F" ],
         "defaultConfigurationIsVisible" ~> val "0",
         "defaultConfigurationName" ~> val "Debug"
-      ],
-      "470E2D651287730B0084AE6F" ~> obj [
-        "isa" ~> val "XCBuildConfiguration",
-        "buildSettings" ~> obj [
-          "COPY_PHASE_STRIP" ~> val "NO",
-          "GCC_DYNAMIC_NO_PIC" ~> val "NO",
-          "GCC_OPTIMIZATION_LEVEL" ~> val "0", 
-          "PRODUCT_NAME" ~> val "KitUpdate" 
         ],
-        "name" ~> val "Debug"
-      ], 
-      "470E2D661287730B0084AE6F" ~> obj [
-        "isa" ~> val "XCBuildConfiguration",
-        "buildSettings" ~> obj [ "PRODUCT_NAME" ~> val "KitUpdate" ],
-        "name" ~> val "Release"
-      ]]
+      "470E2D651287730B0084AE6F" ~> buildConfiguration "Debug" Nothing [ "PRODUCT_NAME" ~> val "KitUpdate" ],
+      "470E2D661287730B0084AE6F" ~> buildConfiguration "Release" Nothing ["PRODUCT_NAME" ~> val "KitUpdate" ]
+      ]
 
 
diff --git a/kit.cabal b/kit.cabal
--- a/kit.cabal
+++ b/kit.cabal
@@ -1,5 +1,5 @@
 name:           kit
-version:        0.7.7
+version:        0.7.8
 cabal-version:  >=1.6
 build-type:     Simple
 license:        BSD3
@@ -14,11 +14,23 @@
 Executable kit
   main-is:        Main.hs
   buildable:      True
-  build-depends:  process -any, network -any, mtl >= 2.0 && < 3, 
-                  filepath -any, directory -any, containers -any, cmdargs >= 0.6.2,
-                  bytestring -any, base >=3 && <5,
-                  HTTP >=4000.0.9, Glob >= 0.5.1 && < 6, data-object -any, data-object-yaml -any,
-                  unix >= 2.4 && < 2.5, ansi-terminal >= 0.5.5
+  build-depends:  base >=3 && <5,
+                  Glob >= 0.5.1 && < 6, 
+                  HTTP >=4000.0.9, 
+                  ansi-terminal >= 0.5.5,
+                  bytestring -any, 
+                  cabal-file-th >= 0.1,
+                  cmdargs >= 0.6.2,
+                  containers -any, 
+                  data-object -any, 
+                  data-object-yaml -any,
+                  directory -any, 
+                  filepath -any, 
+                  mtl >= 2.0 && < 3, 
+                  network -any, 
+                  process -any,
+                  template-haskell,
+                  unix >= 2.4 && < 2.5
 
   hs-source-dirs: .
   other-modules:  Kit.Spec Kit.Main Kit.Package Kit.Project Kit.Repository Kit.Util Kit.Xcode.Builder
