       # Build a strip of AYP
       buildComic lines, (err, image) ->
         return msg.reply "SOMETHING TERRIBLE HAPPENED: #{err}" if err
+
         console.log " => Built image: #{image.width}x#{image.height}"
-        msg.reply "TODO: DO SOMETHING WITH THE RESULT: #{image.width}x#{image.height}"
+        # TODO: Temp file name
+        image.savePng path.resolve(ROOT, "out.png"), 0, (err) ->
+          return console.error "Failed to write result:", err if err
+          msg.reply "TODO: Upload result: #{image.width}x#{image.height}"
+
 
       # Echo the lines to the channel
       count = 0

# Build a single panel out of (UP TO) two lines of dialog
# cb invoked as `cb(err, image)`. `err` is only set on failure
buildPanel = (lines, cb) ->
  cb("TODO: Build a panel on a transperant background", null)

# Make any changes required to the name
filterName = (name) ->

buildComic = (lines, cb) ->
  buildPanels lines, (err, panels) ->
    return cb(err, null) if err

    # TODO: Note that you have mixed extension backgrounds, so you'll have
    # to vary the loader to accommodate.
    GD.openPng path.resolve(BG_BASE, "b29.png"), (err, bg) ->
      return cb(err, bg) if err
      # TODO: Composite `panels` onto `bg`
      cb(false, bg)

# Turn a set of 6 `lines` into 3 panels
# using two lines per panel, then invokes `cb`.
