diff --git a/keyserver/src/creators/thread-creator.js b/keyserver/src/creators/thread-creator.js
--- a/keyserver/src/creators/thread-creator.js
+++ b/keyserver/src/creators/thread-creator.js
@@ -62,6 +62,7 @@
   +forceAddMembers: boolean,
   +updatesForCurrentSession: UpdatesForCurrentSession,
   +silentlyFailMembers: boolean,
+  +addViewerAsGhost: boolean,
 }>;
 
 // If forceAddMembers is set, we will allow the viewer to add random users who
@@ -83,6 +84,7 @@
   const updatesForCurrentSession =
     options?.updatesForCurrentSession ?? 'return';
   const silentlyFailMembers = options?.silentlyFailMembers ?? false;
+  const addViewerAsGhost = options?.addViewerAsGhost ?? false;
 
   const threadType = request.type;
   const shouldCreateRelationships =
@@ -357,13 +359,15 @@
     ? changeRole(id, ghostMemberIDs, -1)
     : Promise.resolve(undefined);
 
+  const creatorRoleID = addViewerAsGhost ? -1 : newRoles.creator.id;
+
   const [
     creatorChangeset,
     initialMembersChangeset,
     ghostMembersChangeset,
     recalculatePermissionsChangeset,
   ] = await Promise.all([
-    changeRole(id, [viewer.userID], newRoles.creator.id),
+    changeRole(id, [viewer.userID], creatorRoleID),
     initialMemberPromise,
     ghostMemberPromise,
     recalculateThreadPermissions(id),