diff --git a/web/input/input-state-container.react.js b/web/input/input-state-container.react.js
--- a/web/input/input-state-container.react.js
+++ b/web/input/input-state-container.react.js
@@ -32,6 +32,7 @@
   useModalContext,
   type PushModal,
 } from 'lib/components/modal-provider.react.js';
+import commStaffCommunity from 'lib/facts/comm-staff-community.js';
 import { getNextLocalUploadID } from 'lib/media/media-utils.js';
 import { pendingToRealizedThreadIDsSelector } from 'lib/selectors/thread-selectors.js';
 import {
@@ -46,6 +47,7 @@
   threadIsPending,
   threadIsPendingSidebar,
   patchThreadInfoToIncludeMentionedMembersOfParent,
+  threadInfoInsideCommunity,
 } from 'lib/shared/thread-utils.js';
 import type { CalendarQuery } from 'lib/types/entry-types.js';
 import type {
@@ -71,6 +73,7 @@
   type ClientNewThreadRequest,
   type NewThreadResult,
   type ThreadInfo,
+  type RawThreadInfo,
   threadTypes,
 } from 'lib/types/thread-types.js';
 import {
@@ -106,6 +109,7 @@
   +drafts: { +[key: string]: string },
   +viewerID: ?string,
   +messageStoreMessages: { +[id: string]: RawMessageInfo },
+  +threadStoreThreadInfos: { +[id: string]: RawThreadInfo },
   +pendingRealizedThreadIDs: $ReadOnlyMap<string, string>,
   +dispatch: Dispatch,
   +dispatchActionPromise: DispatchActionPromise,
@@ -163,8 +167,6 @@
   };
   replyCallbacks: Array<(message: string) => void> = [];
   pendingThreadCreations = new Map<string, Promise<string>>();
-  // TODO: we want to send encrypted media if thread is in the Comm community
-  sendEncryptedMedia: boolean = false;
 
   // When the user sends a multimedia message that triggers the creation of a
   // sidebar, the sidebar gets created right away, but the message needs to wait
@@ -330,7 +332,7 @@
           creatorID,
           media,
         },
-        { forceMultimediaMessageType: this.sendEncryptedMedia },
+        { forceMultimediaMessageType: this.shouldEncryptMedia(threadID) },
       );
       newMessageInfos.set(messageID, messageInfo);
     }
@@ -374,6 +376,14 @@
     return rawMessageInfo;
   }
 
+  shouldEncryptMedia(threadID: ?string): boolean {
+    if (!threadID) {
+      return false;
+    }
+    const threadInfo = this.props.threadStoreThreadInfos[threadID];
+    return threadInfoInsideCommunity(threadInfo, commStaffCommunity.id);
+  }
+
   async sendMultimediaMessage(messageInfo: RawMultimediaMessageInfo) {
     if (!threadIsPending(messageInfo.threadID)) {
       this.props.dispatchActionPromise(
@@ -632,7 +642,7 @@
     const { pushModal } = this.props;
 
     const appendResults = await Promise.all(
-      files.map(file => this.appendFile(file, selectionTime)),
+      files.map(file => this.appendFile(threadID, file, selectionTime)),
     );
 
     if (appendResults.some(({ result }) => !result.success)) {
@@ -682,6 +692,7 @@
   }
 
   async appendFile(
+    threadID: ?string,
     file: File,
     selectTime: number,
   ): Promise<{
@@ -723,7 +734,7 @@
     const { uri, file: fixedFile, mediaType, dimensions } = result;
 
     let encryptionResult;
-    if (this.sendEncryptedMedia) {
+    if (this.shouldEncryptMedia(threadID)) {
       let encryptionResponse;
       const encryptionStart = Date.now();
       try {
@@ -1502,6 +1513,9 @@
     const messageStoreMessages = useSelector(
       state => state.messageStore.messages,
     );
+    const threadStoreThreadInfos = useSelector(
+      state => state.threadStore.threadInfos,
+    );
     const pendingToRealizedThreadIDs = useSelector(state =>
       pendingToRealizedThreadIDsSelector(state.threadStore.threadInfos),
     );
@@ -1541,6 +1555,7 @@
         drafts={drafts}
         viewerID={viewerID}
         messageStoreMessages={messageStoreMessages}
+        threadStoreThreadInfos={threadStoreThreadInfos}
         pendingRealizedThreadIDs={pendingToRealizedThreadIDs}
         calendarQuery={calendarQuery}
         uploadMultimedia={callUploadMultimedia}