diff --git a/README.md b/README.md
index 976c6b7..3af7986 100644
--- a/README.md
+++ b/README.md
@@ -45,7 +45,7 @@ For notarization, you need the following things:
 
 * `options` Object
   * `tool` String - The notarization tool to use, default is `notarytool`.  Can be `legacy` or `notarytool`. `notarytool` is substantially (10x) faster and `legacy` is deprecated and will **stop working** on November 1st 2023.
-  * `appPath` String - The absolute path to your `.app` file
+  * `appPath` String - The absolute path to your `.app`, `.zip`, `.dmg` or `.pkg` file
   * There are different options for each tool: Notarytool
     * There are three authentication methods available: user name with password:
       * `appleId` String - The username of your apple developer account
diff --git a/src/notarytool.ts b/src/notarytool.ts
index 44ec60e..a2f37f0 100644
--- a/src/notarytool.ts
+++ b/src/notarytool.ts
@@ -1,5 +1,6 @@
 import debug from 'debug';
 import * as path from 'path';
+import fs from 'fs';
 
 import { spawn } from './spawn';
 import { makeSecret, withTempDir } from './helpers';
@@ -49,26 +50,34 @@ export async function isNotaryToolAvailable() {
 export async function notarizeAndWaitForNotaryTool(opts: NotaryToolStartOptions) {
   d('starting notarize process for app:', opts.appPath);
   return await withTempDir(async dir => {
-    const zipPath = path.resolve(dir, `${path.parse(opts.appPath).name}.zip`);
-    d('zipping application to:', zipPath);
-    const zipResult = await spawn(
-      'ditto',
-      ['-c', '-k', '--sequesterRsrc', '--keepParent', path.basename(opts.appPath), zipPath],
-      {
-        cwd: path.dirname(opts.appPath),
-      },
-    );
-    if (zipResult.code !== 0) {
-      throw new Error(
-        `Failed to zip application, exited with code: ${zipResult.code}\n\n${zipResult.output}`,
+    const parsedAppPath = path.parse(opts.appPath);
+    const fsStat = fs.statSync(opts.appPath);
+    let filename: string;
+    if (fsStat.isFile()) {
+      filename = opts.appPath;
+      d(`appPath is file, attempting to upload to Apple`);
+    } else {
+      filename = path.resolve(dir, `${parsedAppPath.name}.zip`);
+      d('zipping application to:', filename);
+      const zipResult = await spawn(
+        'ditto',
+        ['-c', '-k', '--sequesterRsrc', '--keepParent', parsedAppPath.base, filename],
+        {
+          cwd: parsedAppPath.dir,
+        },
       );
+      if (zipResult.code !== 0) {
+        throw new Error(
+          `Failed to zip application, exited with code: ${zipResult.code}\n\n${zipResult.output}`,
+        );
+      }
+      d('zip succeeded, attempting to upload to Apple');
     }
-    d('zip succeeded, attempting to upload to Apple');
 
     const notarizeArgs = [
       'notarytool',
       'submit',
-      zipPath,
+      filename,
       ...authorizationArgs(opts),
       '--wait',
       '--output-format',