diff --git a/locales/en-US.yml b/locales/en-US.yml
index f8da18450c..a8663375a8 100644
--- a/locales/en-US.yml
+++ b/locales/en-US.yml
@@ -394,6 +394,7 @@ enableRegistration: "Enable new user registration"
 invite: "Invite"
 driveCapacityPerLocalAccount: "Drive capacity per local user"
 driveCapacityPerRemoteAccount: "Drive capacity per remote user"
+antennaLimit: "The maximum number of antennas that each user can create"
 inMb: "In megabytes"
 iconUrl: "Icon URL"
 bannerUrl: "Banner image URL"
diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml
index a8510612dc..9e7a0ed19e 100644
--- a/locales/zh-CN.yml
+++ b/locales/zh-CN.yml
@@ -340,6 +340,7 @@ invite: "邀请"
 driveCapacityPerLocalAccount: "每个本地用户的网盘容量"
 driveCapacityPerRemoteAccount: "每个远程用户的网盘容量"
 inMb: "以兆字节 (MegaByte) 为单位"
+antennaLimit: "每个用户最多可以创建的天线数量"
 iconUrl: "图标 URL"
 bannerUrl: "横幅图 URL"
 backgroundImageUrl: "背景图 URL"
diff --git a/packages/backend-rs/index.d.ts b/packages/backend-rs/index.d.ts
index 617bedf5b9..509c3d912d 100644
--- a/packages/backend-rs/index.d.ts
+++ b/packages/backend-rs/index.d.ts
@@ -443,6 +443,7 @@ export interface Meta {
   recaptchaSecretKey: string | null
   localDriveCapacityMb: number
   remoteDriveCapacityMb: number
+  antennaLimit: number
   summalyProxy: string | null
   enableEmail: boolean
   email: string | null
diff --git a/packages/backend-rs/src/model/entity/meta.rs b/packages/backend-rs/src/model/entity/meta.rs
index b9a89914bd..7d0972b844 100644
--- a/packages/backend-rs/src/model/entity/meta.rs
+++ b/packages/backend-rs/src/model/entity/meta.rs
@@ -50,6 +50,8 @@ pub struct Model {
     pub local_drive_capacity_mb: i32,
     #[sea_orm(column_name = "remoteDriveCapacityMb")]
     pub remote_drive_capacity_mb: i32,
+    #[sea_orm(column_name = "antennaLimit")]
+    pub antenna_limit: i32,
     #[sea_orm(column_name = "summalyProxy")]
     pub summaly_proxy: Option<String>,
     #[sea_orm(column_name = "enableEmail")]
diff --git a/packages/backend/src/migration/1712937600000-antennaLimit.ts b/packages/backend/src/migration/1712937600000-antennaLimit.ts
new file mode 100644
index 0000000000..cd8f9ff658
--- /dev/null
+++ b/packages/backend/src/migration/1712937600000-antennaLimit.ts
@@ -0,0 +1,19 @@
+import type { MigrationInterface, QueryRunner } from "typeorm";
+
+export class antennaLimit1712937600000 implements MigrationInterface {
+	async up(queryRunner: QueryRunner): Promise<void> {
+		await queryRunner.query(
+			`ALTER TABLE "meta" ADD "antennaLimit" integer NOT NULL DEFAULT 5`,
+			undefined,
+		);
+		await queryRunner.query(
+			`COMMENT ON COLUMN "meta"."antennaLimit" IS 'Antenna Limit'`,
+		);
+	}
+	async down(queryRunner: QueryRunner): Promise<void> {
+		await queryRunner.query(
+			`ALTER TABLE "meta" DROP COLUMN "antennaLimit"`,
+			undefined,
+		);
+	}
+}
diff --git a/packages/backend/src/models/entities/meta.ts b/packages/backend/src/models/entities/meta.ts
index cdb8e14c3f..5e267a8e24 100644
--- a/packages/backend/src/models/entities/meta.ts
+++ b/packages/backend/src/models/entities/meta.ts
@@ -276,6 +276,12 @@ export class Meta {
 	})
 	public remoteDriveCapacityMb: number;
 
+	@Column("integer", {
+		default: 5,
+		comment: "Antenna Limit",
+	})
+	public antennaLimit: number;
+
 	@Column("varchar", {
 		length: 128,
 		nullable: true,
diff --git a/packages/backend/src/server/api/endpoints/admin/meta.ts b/packages/backend/src/server/api/endpoints/admin/meta.ts
index a22fbab8f1..1f382f1254 100644
--- a/packages/backend/src/server/api/endpoints/admin/meta.ts
+++ b/packages/backend/src/server/api/endpoints/admin/meta.ts
@@ -24,6 +24,11 @@ export const meta = {
 				optional: false,
 				nullable: false,
 			},
+			antennaLimit: {
+				type: "number",
+				optional: false,
+				nullable: false,
+			},
 			cacheRemoteFiles: {
 				type: "boolean",
 				optional: false,
@@ -487,6 +492,7 @@ export default define(meta, paramDef, async () => {
 		enableGuestTimeline: instance.enableGuestTimeline,
 		driveCapacityPerLocalUserMb: instance.localDriveCapacityMb,
 		driveCapacityPerRemoteUserMb: instance.remoteDriveCapacityMb,
+		antennaLimit: instance.antennaLimit,
 		emailRequiredForSignup: instance.emailRequiredForSignup,
 		enableHcaptcha: instance.enableHcaptcha,
 		hcaptchaSiteKey: instance.hcaptchaSiteKey,
diff --git a/packages/backend/src/server/api/endpoints/admin/update-meta.ts b/packages/backend/src/server/api/endpoints/admin/update-meta.ts
index 604ef3a0fc..e5234ea720 100644
--- a/packages/backend/src/server/api/endpoints/admin/update-meta.ts
+++ b/packages/backend/src/server/api/endpoints/admin/update-meta.ts
@@ -94,6 +94,7 @@ export const paramDef = {
 		defaultDarkTheme: { type: "string", nullable: true },
 		localDriveCapacityMb: { type: "integer" },
 		remoteDriveCapacityMb: { type: "integer" },
+		antennaLimit: { type: "integer" },
 		cacheRemoteFiles: { type: "boolean" },
 		markLocalFilesNsfwByDefault: { type: "boolean" },
 		emailRequiredForSignup: { type: "boolean" },
@@ -327,6 +328,10 @@ export default define(meta, paramDef, async (ps, me) => {
 		set.remoteDriveCapacityMb = ps.remoteDriveCapacityMb;
 	}
 
+	if (ps.antennaLimit !== undefined) {
+		set.antennaLimit = ps.antennaLimit;
+	}
+
 	if (ps.cacheRemoteFiles !== undefined) {
 		set.cacheRemoteFiles = ps.cacheRemoteFiles;
 	}
diff --git a/packages/backend/src/server/api/endpoints/antennas/create.ts b/packages/backend/src/server/api/endpoints/antennas/create.ts
index 792301d4de..792c5e30b4 100644
--- a/packages/backend/src/server/api/endpoints/antennas/create.ts
+++ b/packages/backend/src/server/api/endpoints/antennas/create.ts
@@ -3,6 +3,7 @@ import { genId } from "backend-rs";
 import { Antennas, UserLists, UserGroupJoinings } from "@/models/index.js";
 import { ApiError } from "@/server/api/error.js";
 import { publishInternalEvent } from "@/services/stream.js";
+import { fetchMeta } from "@/misc/fetch-meta.js";
 
 export const meta = {
 	tags: ["antennas"],
@@ -109,10 +110,12 @@ export default define(meta, paramDef, async (ps, user) => {
 	let userList;
 	let userGroupJoining;
 
+	const instance = await fetchMeta(true);
+
 	const antennas = await Antennas.findBy({
 		userId: user.id,
 	});
-	if (antennas.length > 5 && !user.isAdmin) {
+	if (antennas.length >= instance.antennaLimit) {
 		throw new ApiError(meta.errors.tooManyAntennas);
 	}
 
diff --git a/packages/backend/src/server/api/endpoints/meta.ts b/packages/backend/src/server/api/endpoints/meta.ts
index 2a674b52c3..cb494bf27e 100644
--- a/packages/backend/src/server/api/endpoints/meta.ts
+++ b/packages/backend/src/server/api/endpoints/meta.ts
@@ -126,6 +126,11 @@ export const meta = {
 				optional: false,
 				nullable: false,
 			},
+			antennaLimit: {
+				type: "number",
+				optional: false,
+				nullable: false,
+			},
 			cacheRemoteFiles: {
 				type: "boolean",
 				optional: false,
@@ -445,6 +450,7 @@ export default define(meta, paramDef, async (ps, me) => {
 		enableGuestTimeline: instance.enableGuestTimeline,
 		driveCapacityPerLocalUserMb: instance.localDriveCapacityMb,
 		driveCapacityPerRemoteUserMb: instance.remoteDriveCapacityMb,
+		antennaLimit: instance.antennaLimit,
 		emailRequiredForSignup: instance.emailRequiredForSignup,
 		enableHcaptcha: instance.enableHcaptcha,
 		hcaptchaSiteKey: instance.hcaptchaSiteKey,
diff --git a/packages/client/src/pages/admin/settings.vue b/packages/client/src/pages/admin/settings.vue
index f69c4fb23b..1c2188daac 100644
--- a/packages/client/src/pages/admin/settings.vue
+++ b/packages/client/src/pages/admin/settings.vue
@@ -350,6 +350,19 @@
 							</FormSplit>
 						</FormSection>
 
+						<FormSection>
+							<template #label>{{ i18n.ts.antennas }}</template>
+							<FormInput
+									v-model="antennaLimit"
+									type="number"
+									class="_formBlock"
+								>
+									<template #label>{{
+										i18n.ts.antennaLimit
+									}}</template>
+								</FormInput>
+						</FormSection>
+
 						<FormSection>
 							<template #label>ServiceWorker</template>
 
@@ -502,6 +515,7 @@ const cacheRemoteFiles = ref(false);
 const markLocalFilesNsfwByDefault = ref(false);
 const localDriveCapacityMb = ref(0);
 const remoteDriveCapacityMb = ref(0);
+const antennaLimit = ref(0);
 const enableRegistration = ref(false);
 const emailRequiredForSignup = ref(false);
 const enableServiceWorker = ref(false);
@@ -579,6 +593,7 @@ async function init() {
 	markLocalFilesNsfwByDefault.value = meta.markLocalFilesNsfwByDefault;
 	localDriveCapacityMb.value = meta.driveCapacityPerLocalUserMb;
 	remoteDriveCapacityMb.value = meta.driveCapacityPerRemoteUserMb;
+	antennaLimit.value = meta.antennaLimit;
 	enableRegistration.value = !meta.disableRegistration;
 	emailRequiredForSignup.value = meta.emailRequiredForSignup;
 	enableServiceWorker.value = meta.enableServiceWorker;
@@ -631,6 +646,7 @@ function save() {
 		markLocalFilesNsfwByDefault: markLocalFilesNsfwByDefault.value,
 		localDriveCapacityMb: localDriveCapacityMb.value,
 		remoteDriveCapacityMb: remoteDriveCapacityMb.value,
+		antennaLimit: antennaLimit.value,
 		disableRegistration: !enableRegistration.value,
 		emailRequiredForSignup: emailRequiredForSignup.value,
 		enableServiceWorker: enableServiceWorker.value,
diff --git a/packages/firefish-js/src/entities.ts b/packages/firefish-js/src/entities.ts
index ce940a1481..6f9d6b400b 100644
--- a/packages/firefish-js/src/entities.ts
+++ b/packages/firefish-js/src/entities.ts
@@ -341,6 +341,7 @@ export type LiteInstanceMetadata = {
 	disableGlobalTimeline: boolean;
 	driveCapacityPerLocalUserMb: number;
 	driveCapacityPerRemoteUserMb: number;
+	antennaLimit: number;
 	enableHcaptcha: boolean;
 	hcaptchaSiteKey: string | null;
 	enableRecaptcha: boolean;