diff --git a/.node-version b/.node-version
index 658984787f82861c3285fa0385bd48bba69f92c7..c9b6b29e00b3b971df6c2367c20ef695db5f48c9 100644
--- a/.node-version
+++ b/.node-version
@@ -1 +1 @@
-v18.0.0
+v16.0.0
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 05158278d0b5f8aa55634607d56731b7ba4e2d5e..c58714fd25858598737e5693ba5625516e3f1c30 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,9 +10,6 @@ You should also include the user name that made the change.
 -->
 
 ## 12.x.x (unreleased)
-### NOTE
-- From this version, Node 18.0.0 or later is required.
-
 ### Improvements
 - Supports Unicode Emoji 14.0 @mei23
 - プッシュ通知を複数アカウント対応に #7667 @tamaina
diff --git a/packages/backend/src/models/repositories/drive-file.ts b/packages/backend/src/models/repositories/drive-file.ts
index b626359d985a7726e95fa11d4af95174fd92ef08..0d589d4f1134055cfb414a69bd3cc5800ff2f8f6 100644
--- a/packages/backend/src/models/repositories/drive-file.ts
+++ b/packages/backend/src/models/repositories/drive-file.ts
@@ -29,7 +29,9 @@ export const DriveFileRepository = db.getRepository(DriveFile).extend({
 
 	getPublicProperties(file: DriveFile): DriveFile['properties'] {
 		if (file.properties.orientation != null) {
-			const properties = structuredClone(file.properties);
+			// TODO
+			//const properties = structuredClone(file.properties);
+			const properties = JSON.parse(JSON.stringify(file.properties));
 			if (file.properties.orientation >= 5) {
 				[properties.width, properties.height] = [properties.height, properties.width];
 			}
diff --git a/packages/backend/src/server/web/manifest.ts b/packages/backend/src/server/web/manifest.ts
index 61d766006688c98067ab0f8f25cfc327cdc9e41d..ee568b8077fdd9ebe8734812536344071b7e83db 100644
--- a/packages/backend/src/server/web/manifest.ts
+++ b/packages/backend/src/server/web/manifest.ts
@@ -3,7 +3,9 @@ import { fetchMeta } from '@/misc/fetch-meta.js';
 import manifest from './manifest.json' assert { type: 'json' };
 
 export const manifestHandler = async (ctx: Koa.Context) => {
-	const res = structuredClone(manifest);
+	// TODO
+	//const res = structuredClone(manifest);
+	const res = JSON.parse(JSON.stringify(manifest));
 
 	const instance = await fetchMeta(true);
 
diff --git a/packages/backend/src/services/relay.ts b/packages/backend/src/services/relay.ts
index 08bf72cc26dc2b0eec2f61927acfb88dbb72ace5..6bc4304436d1275b6b2a00d277ec3d2dec405c49 100644
--- a/packages/backend/src/services/relay.ts
+++ b/packages/backend/src/services/relay.ts
@@ -1,4 +1,4 @@
-import { createSystemUser } from './create-system-user.js';
+import { IsNull } from 'typeorm';
 import { renderFollowRelay } from '@/remote/activitypub/renderer/follow-relay.js';
 import { renderActivity, attachLdSignature } from '@/remote/activitypub/renderer/index.js';
 import renderUndo from '@/remote/activitypub/renderer/undo.js';
@@ -8,7 +8,7 @@ import { Users, Relays } from '@/models/index.js';
 import { genId } from '@/misc/gen-id.js';
 import { Cache } from '@/misc/cache.js';
 import { Relay } from '@/models/entities/relay.js';
-import { IsNull } from 'typeorm';
+import { createSystemUser } from './create-system-user.js';
 
 const ACTOR_USERNAME = 'relay.actor' as const;
 
@@ -88,7 +88,9 @@ export async function deliverToRelays(user: { id: User['id']; host: null; }, act
 	}));
 	if (relays.length === 0) return;
 
-	const copy = structuredClone(activity);
+	// TODO
+	//const copy = structuredClone(activity);
+	const copy = JSON.parse(JSON.stringify(activity));
 	if (!copy.to) copy.to = ['https://www.w3.org/ns/activitystreams#Public'];
 
 	const signed = await attachLdSignature(copy, user);