diff --git a/.node-version b/.node-version
index 7fd023741b2008cc2a6ab024146a623a5cfbf92d..e44a38e0803edbf4823dcabc9ee9623b03771e60 100644
--- a/.node-version
+++ b/.node-version
@@ -1 +1 @@
-v16.15.0
+v18.12.1
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 92e47077de523e356c4221c4f389ea0506ddd8c5..f1bc0a96fdc78ae85cb02be900e3fc73f57fc817 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,6 +12,7 @@ You should also include the user name that made the change.
 ## 12.x.x (unreleased)
 
 ### Changes
+- Node.js 18.x or later is required
 - Elasticsearchのサポートが削除されました
 	- 代わりに今後任意の検索プロバイダを設定できる仕組みを構想しています。その仕組みを使えば今まで通りElasticsearchも利用できます
 - ノートのウォッチ機能が削除されました
diff --git a/Dockerfile b/Dockerfile
index 81dc726375c81b744548fe3c92badf9c164bd458..0151797a7b584925518029d03ab7323b00ab4b33 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM node:16.15.1-bullseye AS builder
+FROM node:18.12.1-bullseye AS builder
 
 ARG NODE_ENV=production
 
@@ -13,7 +13,7 @@ RUN yarn install
 RUN yarn build
 RUN rm -rf .git
 
-FROM node:16.15.1-bullseye-slim AS runner
+FROM node:18.12.1-bullseye-slim AS runner
 
 WORKDIR /misskey
 
diff --git a/packages/backend/src/core/RelayService.ts b/packages/backend/src/core/RelayService.ts
index 5324826ec1c8bef6f6f026768423c4aaaec88d58..563eeac0f0cb95614f581288d488e7d567dff72f 100644
--- a/packages/backend/src/core/RelayService.ts
+++ b/packages/backend/src/core/RelayService.ts
@@ -105,9 +105,7 @@ export class RelayService {
 		}));
 		if (relays.length === 0) return;
 	
-		// TODO
-		//const copy = structuredClone(activity);
-		const copy = JSON.parse(JSON.stringify(activity));
+		const copy = structuredClone(activity);
 		if (!copy.to) copy.to = ['https://www.w3.org/ns/activitystreams#Public'];
 	
 		const signed = await this.apRendererService.attachLdSignature(copy, user);
diff --git a/packages/backend/src/core/entities/DriveFileEntityService.ts b/packages/backend/src/core/entities/DriveFileEntityService.ts
index f0ac6518d04fc908952a169989bc86a47b5cf9e6..d9430e1497cc32aa003a7670b3ce1cf4d21716a0 100644
--- a/packages/backend/src/core/entities/DriveFileEntityService.ts
+++ b/packages/backend/src/core/entities/DriveFileEntityService.ts
@@ -55,9 +55,7 @@ export class DriveFileEntityService {
 
 	public getPublicProperties(file: DriveFile): DriveFile['properties'] {
 		if (file.properties.orientation != null) {
-			// TODO
-			//const properties = structuredClone(file.properties);
-			const properties = JSON.parse(JSON.stringify(file.properties));
+			const properties = structuredClone(file.properties);
 			if (file.properties.orientation >= 5) {
 				[properties.width, properties.height] = [properties.height, properties.width];
 			}
diff --git a/packages/backend/src/server/web/ClientServerService.ts b/packages/backend/src/server/web/ClientServerService.ts
index 30d430775c4e34e8091966dda06638623181f4fb..44450245a6fbcdfafdabef1d00650e9693f4b494 100644
--- a/packages/backend/src/server/web/ClientServerService.ts
+++ b/packages/backend/src/server/web/ClientServerService.ts
@@ -86,9 +86,7 @@ export class ClientServerService {
 	}
 
 	private async manifestHandler(ctx: Koa.Context) {
-		// TODO
-		//const res = structuredClone(manifest);
-		const res = JSON.parse(JSON.stringify(manifest));
+		const res = structuredClone(manifest);
 
 		const instance = await this.metaService.fetch(true);