diff --git a/run-downloadDb.js b/run-downloadDb.js
index 0c548cd..646a04d 100644
--- a/run-downloadDb.js
+++ b/run-downloadDb.js
@@ -10,6 +10,8 @@ const ctx = 'downloadDb.js';
  * Downloads all media possible for the users stored in db.json at the specified `--path`.
  * Useful for first run or for augmenting existing media
  * if it may be only partially archived in an uncertain state.
+ * The db.json must be present in order for this to run,
+ * as it will run for the users specified in the db.json and not the directories in the folder.
  */
 const downloadDb = async () => {
   log(ctx, 'Grabbing db');
@@ -40,7 +42,7 @@ const downloadDb = async () => {
     logs: [],
   }));
 
-  log(ctx, `Downloading media using <user>/media for ${processes.length} users`);
+  log(ctx, `Downloading media using /<user>/media for ${processes.length} users`);
   await getMany(processes, threadMax, directory, 'media');
 
   log(ctx, 'Downloading media using /search');
diff --git a/run-downloadUser.js b/run-downloadUser.js
new file mode 100644
index 0000000..a6fdb4f
--- /dev/null
+++ b/run-downloadUser.js
@@ -0,0 +1,92 @@
+import { readFile, writeFile } from 'fs/promises';
+
+import { getArg } from './lib/args.js';
+import { getMany } from './lib/dl.js';
+import { error, log } from './lib/log.js';
+
+const ctx = 'downloadUser.js';
+
+/**
+ * Downloads all media possible for a user stored/to-be-stored in db.json at the specified `--path`.
+ * Useful for first run or for augmenting existing media
+ * if it may be only partially archived in an uncertain state.
+ * Safely checks if the db.json doesn't yet exist and/or the user isn't stored in the db.json at the directory provided.
+ */
+const downloadUser = async () => {
+  log(ctx, 'Grabbing db');
+  let directory, threadMax = 1, user, db;
+  try {
+    directory = getArg('path');
+    user = getArg('user');
+  } catch (err) {
+    error(ctx, err);
+    return;
+  }
+  try {
+    let file = await readFile(`${directory}/db.json`, { encoding: 'utf8' });
+    db = JSON.parse(file);
+  } catch (err) {
+    if (err.toString().includes('ENOENT')) {
+      try {
+        db = [];
+        await writeFile(`${directory}/db.json`, JSON.stringify(db, null, 2));
+      } catch (err2) {
+        error(ctx, err2);
+        return;
+      }
+    } else {
+      error(ctx, err);
+      return;
+    }
+  }
+
+  let index = db.findIndex(other => other.user === user);
+  if (index < 0) {
+    index = db.push({ user }) - 1;
+  }
+
+  let processes = db.filter((other) => other.user === user).map(entry => ({
+    ...entry,
+    lastUpdated: Date.now(),
+    logs: [],
+  }));
+
+  log(ctx, `Downloading media using /<user>/media for ${processes.length} users`);
+  await getMany(processes, threadMax, directory, 'media');
+
+  log(ctx, 'Downloading media using /search');
+  await getMany(processes, threadMax, directory, 'search');
+
+  processes.forEach(entry => {
+    entry.logs.forEach(log => {
+      if (log.includes('NotFoundError')) {
+        const strOut = `${entry.user} wasn't found: "${log.replace('\n', '')}". You may want to remove them from the db.json file or update their username.`;
+        error(ctx, strOut);
+        entry.lastError = strOut;
+      } else if (log.includes('AuthorizationError')) {
+        const strOut = `There was an authorization error for user ${entry.user}: "${log.replace('\n', '')}"`;
+        error(ctx, strOut);
+        entry.lastError = strOut;
+      }
+    });
+  });
+
+  log(ctx, 'Saving db');
+  try {
+    processes.forEach(process => {
+      let i = db.findIndex(other => other.user === process.user);
+      db[i] = {
+        user: process.user,
+        lastUpdated: process.lastUpdated,
+        lastError: process.lastError,
+      }
+    });
+    await writeFile(`${directory}/db.json`, JSON.stringify(db, null, 2));
+  } catch (err) {
+    error(ctx, err);
+    return;
+  }
+  log(ctx, 'Done');
+}
+
+downloadUser();