diff --git a/Changes.md b/Changes.md
--- a/Changes.md
+++ b/Changes.md
@@ -1,5 +1,10 @@
 # Change log for the `cabal-flatpak` package
 
+## 0.1.1
+
+ * reduce file size of manifests using inlined script `revise.sh`.
+
+
 ## 0.1
 
  * No need to specify `main-sources` field anymore.
diff --git a/ReadMe.md b/ReadMe.md
--- a/ReadMe.md
+++ b/ReadMe.md
@@ -10,7 +10,7 @@
 However, for maintaining your own Flatpak repository
 or for distributing Flatpak bundles
 it is not strictly necessary to have such a verbose manifest.
-You may get results quicker by writing you own manifest
+You may get results quicker by writing your own manifest
 which simply runs `cabal-install` or `stack`.
 `stack` should give you reproducible builds
 but its package database contains only a subset of Hackage.
@@ -101,6 +101,13 @@
 
 
 ### Build the Flatpak package
+
+First you need to install a Flatpak runtime environment and its SDK:
+
+~~~~
+$ sudo flatpak install org.freedesktop.Platform org.freedesktop.Sdk org.freedesktop.Platform.Compat.i386 org.freedesktop.Sdk.Compat.i386
+~~~~
+
 
 You may refer to the `Makefile` that is shipped with `cabal-flatpak`
 for how to eventually build the Flatpak package.
diff --git a/cabal-flatpak.cabal b/cabal-flatpak.cabal
--- a/cabal-flatpak.cabal
+++ b/cabal-flatpak.cabal
@@ -1,6 +1,6 @@
 Cabal-Version:  2.2
 Name:           cabal-flatpak
-Version:        0.1.0.4
+Version:        0.1.1
 License:        BSD-3-Clause
 License-File:   LICENSE
 Author:         Henning Thielemann <haskell@henning-thielemann.de>
@@ -25,7 +25,7 @@
   flatpak.cabal.json
 
 Source-Repository this
-  Tag:         0.1.0.4
+  Tag:         0.1.1
   Type:        darcs
   Location:    https://hub.darcs.net/thielema/cabal-flatpak/
 
@@ -38,18 +38,19 @@
     cabal-plan >=0.5 && <0.8,
     cryptohash-sha256 >=0.11 && <0.12,
     zlib >=0.5.3 && <0.7,
-    tar >=0.5.0.3 && <0.6,
+    tar >=0.5.0.3 && <0.7,
     http-client-tls >=0.3.5.3 && <0.4,
     http-client >=0.5.12 && <0.8,
     http-types >=0.10 && <0.13,
     aeson-pretty >=0.8.7 && <0.9,
-    aeson >=2.0 && <2.2,
+    aeson >=2.0 && <2.3,
+    yaml >=0.11 && <0.12,
     shell-utility >=0.1 && <0.2,
-    optparse-applicative >=0.11 && <0.18,
+    optparse-applicative >=0.11 && <0.19,
     pathtype >=0.8 && <0.9,
-    text >=1.2 && <2.1,
-    bytestring >=0.9 && <0.12,
-    containers >=0.5 && <0.7,
+    text >=1.2 && <2.2,
+    bytestring >=0.9 && <0.13,
+    containers >=0.5 && <0.8,
     utility-ht >=0.0.12 && <0.1,
     base >=4.5 && <5
 
diff --git a/src/Flatpak.hs b/src/Flatpak.hs
--- a/src/Flatpak.hs
+++ b/src/Flatpak.hs
@@ -2,6 +2,7 @@
    SourceType(..), archive, Source(..),
    Module(..), ModuleItem(ModuleEmbed),
    Arch(..), archString, T(..),
+   encodeJson, encodeYaml,
    PackageHook(..), Cabal(..),
    ) where
 
@@ -9,13 +10,21 @@
 
 import qualified Cabal.Plan as Plan
 
+import qualified Data.Yaml.Pretty as YamlPretty
+import qualified Data.Aeson.Encode.Pretty as JsonPretty
 import qualified Data.Aeson.Key as Key
 import qualified Data.Aeson as Json
+import qualified Data.Map as Map
+import qualified Data.ByteString.Lazy.Char8 as BL
+import qualified Data.ByteString.Char8 as B
 import qualified Data.Text as Text
 import qualified Data.Monoid.HT as Mn
 import Data.Aeson.Types (Parser, Pair)
 import Data.Aeson (FromJSON, ToJSON, parseJSON, toJSON, withObject)
+import Data.Map (Map)
+import Data.Text (Text)
 import Data.Tuple.HT (mapFst)
+import Data.Ord.HT (comparing)
 import Data.Monoid (mempty, (<>))
 
 import Text.Printf (printf)
@@ -64,7 +73,8 @@
 
 data SourceType =
       Archive {stripComponents :: Int} |
-      Git | Bzr | File | Dir | Script | Shell | Patch | ExtraData
+      Git | Bzr | File | Dir |
+      Script {commands :: [String]} | Shell | Patch | ExtraData
    deriving (Show)
 
 archive :: SourceType
@@ -78,11 +88,13 @@
          Archive {stripComponents = strip} ->
             simple "archive" ++
             Mn.when (strip/=1) [("strip-components", Json.toJSON strip)]
+         Script {commands = cmds} ->
+            simple "script" ++
+            [("commands", Json.toJSON cmds)]
          Git       -> simple "git"
          Bzr       -> simple "bzr"
          File      -> simple "file"
          Dir       -> simple "dir"
-         Script    -> simple "script"
          Shell     -> simple "shell"
          Patch     -> simple "patch"
          ExtraData -> simple "extra-data"
@@ -95,7 +107,7 @@
       "bzr"        -> return Bzr
       "file"       -> return File
       "dir"        -> return Dir
-      "script"     -> return Script
+      "script"     -> fmap Script $ obj .: "commands"
       "shell"      -> return Shell
       "patch"      -> return Patch
       "extra-data" -> return ExtraData
@@ -104,7 +116,7 @@
 data Source =
    Source {
       typ :: SourceType,
-      url :: String,
+      url :: Maybe String,
       destFilename :: Maybe String,
       sha256 :: Maybe Plan.Sha256
    } deriving (Show)
@@ -113,16 +125,16 @@
    parseJSON =
       withObject "Source" $ \o -> pure Source
          <*> (parseSourceType o =<< o .: "type")
-         <*> o .: "url"
+         <*> o .:? ("url", Nothing)
          <*> o .:? ("dest-filename", Nothing)
-         <*> o .: "sha256"
+         <*> o .:? ("sha256", Nothing)
 
 instance ToJSON Source where
    toJSON = object $
       (pairsFromSourceType . typ) <>
-      ("url" .= url) <>
+      ("url" .=? (url, Nothing)) <>
       ("dest-filename" .=? (destFilename, Nothing)) <>
-      ("sha256" .= sha256) <>
+      ("sha256" .=? (sha256, Nothing)) <>
       mempty
 
 
@@ -238,6 +250,57 @@
       ("cleanup-commands" .=* cleanupCommands) <>
       ("modules" .= modules) <>
       mempty
+
+
+{- |
+A global ordering of all fields (across all substructures)
+appearing in the manifest JSON.
+This is an ugly hack, but is needed for get pretty JSON and also field ordering.
+See <https://github.com/informatikr/aeson-pretty/issues/28>.
+-}
+fieldOrder :: [Text]
+fieldOrder =
+   map Text.pack $
+      "app-id" :
+      "name" :
+      "runtime" :
+      "runtime-version" :
+      "sdk" :
+      "only-arches" :
+      "command" :
+      "finish-args" :
+      "cleanup" :
+      "cleanup-commands" :
+      "main-package" :
+      "main-sources" :
+      "package-hooks" :
+      "modules" :
+      "buildsystem" :
+      "builddir" :
+      "config-opts" :
+      "build-commands" :
+      "post-install" :
+      "sources" :
+      []
+
+encodeJson :: T -> BL.ByteString
+encodeJson =
+   JsonPretty.encodePretty'
+      JsonPretty.defConfig {
+         JsonPretty.confCompare = JsonPretty.keyOrder fieldOrder
+      }
+
+
+fieldOrderMap :: Map Text Int
+fieldOrderMap =
+   Map.fromListWith (error "duplicate key") $ zip fieldOrder [0..]
+
+encodeYaml :: T -> B.ByteString
+encodeYaml =
+   YamlPretty.encodePretty $
+      YamlPretty.setConfCompare
+         (comparing $ \k -> maybe (Right k) Left $ Map.lookup k fieldOrderMap) $
+      YamlPretty.defConfig
 
 
 
diff --git a/src/Generate.hs b/src/Generate.hs
--- a/src/Generate.hs
+++ b/src/Generate.hs
@@ -105,7 +105,9 @@
          Flatpak.sources =
             [Flatpak.Source {
                Flatpak.typ = Flatpak.archive,
-               Flatpak.url = ghcDirUrl compiler ++ ghcArchive compiler arch,
+               Flatpak.url =
+                  Just $
+                  ghcDirUrl compiler ++ ghcArchive compiler arch,
                Flatpak.destFilename = Nothing,
                Flatpak.sha256 = Just hash
              }]
@@ -132,13 +134,13 @@
    in if' (matchName mainPkg pkg && not (null mainSrcs)) mainSrcs $
       Flatpak.Source {
          Flatpak.typ = typ,
-         Flatpak.url = pkgUrl,
+         Flatpak.url = Just pkgUrl,
          Flatpak.destFilename = Nothing,
          Flatpak.sha256 = Plan.uSha256 pkg
       } :
       Flatpak.Source {
          Flatpak.typ = Flatpak.File,
-         Flatpak.url = cabalUrl,
+         Flatpak.url = Just cabalUrl,
          Flatpak.destFilename = Just cabalPath,
          Flatpak.sha256 = Plan.uCabalSha256 pkg
       } :
@@ -233,47 +235,57 @@
             [Flatpak.Source {
                Flatpak.typ =
                   Flatpak.Archive {Flatpak.stripComponents = 0},
-               Flatpak.url = url,
+               Flatpak.url = Just url,
                Flatpak.destFilename = Nothing,
                Flatpak.sha256 = Plan.parseSha256 . Text.pack =<< cabalHash arch
              }]
       }
 
+reviseCabalScript :: [String]
+reviseCabalScript =
+   "tarball=\"$1\"" :
+   "pkgid=\"$(basename $tarball .tar.gz)\"" :
+   "name=\"$(echo $pkgid | sed -r 's:^(.*)-(.*)$:\\1:')\"" :
+   "ver=\"$(echo $pkgid | sed -r 's:^(.*)-(.*)$:\\2:')\"" :
+   "echo Revising .cabal file for \"$pkgid\"" :
+   "gunzip \"$tarball\"" :
+   "mkdir \"$pkgid\"" :
+   "mv \"$name.cabal\" \"$pkgid\"" :
+   "tar rf \"$pkgid.tar\" \"$pkgid/$name.cabal\"" :
+   "gzip \"$pkgid.tar\"" :
+   []
+
 allInOneModule ::
    (String, [Flatpak.Source]) -> Options -> [String] ->
    [RevisedUnit] -> Flatpak.Module
 allInOneModule main (cabalCfgOptions, ghcOptions) postInstall pkgs =
-   let dispPkgId = Text.unpack . Plan.dispPkgId
-   in Flatpak.Module {
+      Flatpak.Module {
          Flatpak.name = "haskell-parts",
          Flatpak.onlyArches = [],
          Flatpak.buildsystem = "simple",
          Flatpak.builddir = False,
          Flatpak.configOpts = [],
          Flatpak.buildCommands =
-            (flip concatMap pkgs $ \(pkg,_) ->
-               let pkgId@(Plan.PkgId (Plan.PkgName name) _version) =
-                     Plan.uPId pkg
-                   pkgName = Text.unpack name
-                   pkgVerName = dispPkgId pkgId
-               in printf "gunzip %s.tar.gz" pkgVerName :
-                  printf "mkdir %s" pkgVerName :
-                  printf "mv %s.cabal %s/" pkgName pkgVerName :
-                  printf "tar rf %s.tar %s/%s.cabal"
-                    pkgVerName pkgVerName pkgName :
-                  printf "gzip %s.tar" pkgVerName :
-                  []) ++
+            "find . -name '*.tar.gz' | while read pkg; do bash revise.sh \"$pkg\"; done" :
             "mkdir .cabal" :
             "touch .cabal/config" :
             unwords
                ("cabal --config-file=.cabal/config install" :
-                "--offline --prefix=/app" :
-                cabalCfgOptions ++ map ghcOption ghcOptions ++
-                map (printf "%s.tar.gz" . dispPkgId . Plan.uPId . fst) pkgs) :
+                  "-j$FLATPAK_BUILDER_N_JOBS" :
+                  "--offline --prefix=/app" :
+                  cabalCfgOptions ++ map ghcOption ghcOptions ++
+                  ["*.tar.gz"]) :
             [],
          Flatpak.postInstall = postInstall,
          Flatpak.cleanupModule = [],
-         Flatpak.sources = concatMap (packageSources main Flatpak.File) pkgs
+         Flatpak.sources =
+            Flatpak.Source {
+               Flatpak.typ = Flatpak.Script reviseCabalScript,
+               Flatpak.url = Nothing,
+               Flatpak.destFilename = Just "revise.sh",
+               Flatpak.sha256 = Nothing
+            } :
+            concatMap (packageSources main Flatpak.File) pkgs
       }
 
 manifestCabalInstall ::
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -21,10 +21,12 @@
 import Control.Monad (when)
 import Control.Applicative ((<$>))
 
-import qualified Data.Aeson.Encode.Pretty as JsonPretty
 import qualified Data.Aeson as Json
+import qualified Data.Yaml as Yaml
 import qualified Data.ByteString.Lazy.Char8 as BL
+import qualified Data.ByteString.Char8 as B
 import qualified Data.Text as Text
+import qualified Data.Char as Char
 import qualified Data.Traversable as Trav
 import qualified Data.Graph as Graph
 import qualified Data.Map as Map
@@ -46,6 +48,14 @@
    Map.mapWithKey (\k v -> ((), k, Set.toList v)) m
 
 
+isYamlFileName :: Path.File absRel -> Bool
+isYamlFileName path =
+   case map Char.toLower $ Path.takeExtension path of
+      ".yaml" -> True
+      ".yml" -> True
+      _ -> False
+
+
 main :: IO ()
 main = do
    opt <- OP.execParser Option.info
@@ -56,8 +66,11 @@
       Plan.findAndDecodePlanJson $
       Plan.ProjectRelativeToDir $ Path.toString dir
    projectJson <-
-      either fail return . Json.eitherDecode
-      =<< (BL.readFile $ Path.toString $ Option.input opt)
+      if isYamlFileName $ Option.input opt
+         then Yaml.decodeFileThrow (Path.toString $ Option.input opt)
+         else
+            either fail return =<<
+            (Json.eitherDecodeFileStrict' $ Path.toString $ Option.input opt)
 
    {-
    Only cabal >= 2.4.1.0 provides the SHA 256 hashes.
@@ -142,7 +155,13 @@
       "units without a SHA256 hash for the Cabal file:" :
       map (Text.unpack . Plan.dispPkgId . Plan.uPId) unrevisedUnits
 
-   BL.writeFile (Path.toString $ Option.output opt) $ JsonPretty.encodePretty $
+   (if isYamlFileName $ Option.output opt
+      then
+         B.writeFile (Path.toString $ Option.output opt) .
+         Flatpak.encodeYaml
+      else
+         BL.writeFile (Path.toString $ Option.output opt) .
+         Flatpak.encodeJson) $
       if Option.cabalInstall opt
          then Generate.manifestCabalInstall
                   plan archHashes revisedUnits projectJson
