From c64119108e733932cc5a3defcfee9ac6f1926b07 Mon Sep 17 00:00:00 2001
From: naskya <m@naskya.net>
Date: Sun, 2 Jun 2024 07:11:39 +0900
Subject: [PATCH] fix (backend): use the exact same time for id and createdAt

---
 .../src/queue/processors/db/import-muting.ts        |  8 +++++---
 .../src/queue/processors/db/import-user-lists.ts    |  7 ++++---
 .../src/remote/activitypub/kernel/flag/index.ts     |  8 +++++---
 .../backend/src/remote/activitypub/models/person.ts |  9 +++++----
 packages/backend/src/server/api/common/signin.ts    |  7 ++++---
 packages/backend/src/server/api/common/signup.ts    | 10 ++++++----
 .../src/server/api/endpoints/admin/ad/create.ts     |  8 +++++---
 .../api/endpoints/admin/announcements/create.ts     |  7 ++++---
 .../src/server/api/endpoints/admin/invite.ts        |  8 +++++---
 .../src/server/api/endpoints/antennas/create.ts     |  8 +++++---
 .../backend/src/server/api/endpoints/app/create.ts  |  7 ++++---
 .../server/api/endpoints/auth/session/generate.ts   |  7 ++++---
 .../src/server/api/endpoints/channels/create.ts     |  8 +++++---
 .../src/server/api/endpoints/channels/follow.ts     |  8 +++++---
 .../src/server/api/endpoints/clips/create.ts        |  7 ++++---
 .../server/api/endpoints/drive/folders/create.ts    |  7 ++++---
 .../server/api/endpoints/gallery/posts/create.ts    | 10 ++++++----
 .../src/server/api/endpoints/gallery/posts/like.ts  |  8 +++++---
 .../src/server/api/endpoints/i/2fa/register-key.ts  |  7 ++++---
 .../src/server/api/endpoints/i/read-announcement.ts |  8 +++++---
 .../src/server/api/endpoints/i/registry/set.ts      |  9 +++++----
 .../src/server/api/endpoints/i/webhooks/create.ts   |  7 ++++---
 .../backend/src/server/api/endpoints/mute/create.ts |  8 +++++---
 .../src/server/api/endpoints/notes/create.ts        |  8 +++++---
 .../server/api/endpoints/notes/favorites/create.ts  |  8 +++++---
 .../api/endpoints/notes/thread-muting/create.ts     |  8 +++++---
 .../src/server/api/endpoints/pages/create.ts        | 10 ++++++----
 .../backend/src/server/api/endpoints/pages/like.ts  |  8 +++++---
 .../backend/src/server/api/endpoints/promo/read.ts  |  8 +++++---
 .../src/server/api/endpoints/renote-mute/create.ts  | 10 ++++++----
 .../src/server/api/endpoints/reply-mute/create.ts   | 10 ++++++----
 .../server/api/endpoints/request-reset-password.ts  |  7 ++++---
 .../backend/src/server/api/endpoints/sw/register.ts |  8 +++++---
 .../src/server/api/endpoints/users/groups/create.ts | 12 +++++++-----
 .../endpoints/users/groups/invitations/accept.ts    |  8 +++++---
 .../src/server/api/endpoints/users/groups/invite.ts |  8 +++++---
 .../src/server/api/endpoints/users/lists/create.ts  |  7 ++++---
 .../src/server/api/endpoints/users/report-abuse.ts  |  8 +++++---
 packages/backend/src/server/api/private/signin.ts   | 13 ++++++++-----
 packages/backend/src/server/api/private/signup.ts   |  8 +++++---
 packages/backend/src/services/blocking/create.ts    |  8 +++++---
 .../backend/src/services/create-notification.ts     |  8 +++++---
 packages/backend/src/services/create-system-user.ts | 10 ++++++----
 packages/backend/src/services/following/create.ts   |  8 +++++---
 .../src/services/following/requests/create.ts       |  8 +++++---
 packages/backend/src/services/i/pin.ts              |  8 +++++---
 .../backend/src/services/insert-moderation-log.ts   |  7 ++++---
 packages/backend/src/services/messages/create.ts    |  7 ++++---
 packages/backend/src/services/note/polls/vote.ts    |  8 +++++---
 .../backend/src/services/note/reaction/create.ts    |  8 +++++---
 packages/backend/src/services/user-list/push.ts     |  8 +++++---
 51 files changed, 253 insertions(+), 165 deletions(-)

diff --git a/packages/backend/src/queue/processors/db/import-muting.ts b/packages/backend/src/queue/processors/db/import-muting.ts
index af65837e29..f96aa7d618 100644
--- a/packages/backend/src/queue/processors/db/import-muting.ts
+++ b/packages/backend/src/queue/processors/db/import-muting.ts
@@ -6,7 +6,7 @@ import { downloadTextFile } from "@/misc/download-text-file.js";
 import { Users, DriveFiles, Mutings } from "@/models/index.js";
 import type { DbUserImportJobData } from "@/queue/types.js";
 import type { User } from "@/models/entities/user.js";
-import { genId, isSelfHost, stringToAcct, toPuny } from "backend-rs";
+import { genIdAt, isSelfHost, stringToAcct, toPuny } from "backend-rs";
 import { IsNull } from "typeorm";
 import { inspect } from "node:util";
 
@@ -80,9 +80,11 @@ export async function importMuting(
 }
 
 async function mute(user: User, target: User) {
+	const now = new Date();
+
 	await Mutings.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		muterId: user.id,
 		muteeId: target.id,
 	});
diff --git a/packages/backend/src/queue/processors/db/import-user-lists.ts b/packages/backend/src/queue/processors/db/import-user-lists.ts
index f4e8523ba8..11f5f66675 100644
--- a/packages/backend/src/queue/processors/db/import-user-lists.ts
+++ b/packages/backend/src/queue/processors/db/import-user-lists.ts
@@ -10,7 +10,7 @@ import {
 	UserLists,
 	UserListJoinings,
 } from "@/models/index.js";
-import { genId, isSelfHost, stringToAcct, toPuny } from "backend-rs";
+import { genIdAt, isSelfHost, stringToAcct, toPuny } from "backend-rs";
 import type { DbUserImportJobData } from "@/queue/types.js";
 import { IsNull } from "typeorm";
 import { inspect } from "node:util";
@@ -54,9 +54,10 @@ export async function importUserLists(
 			});
 
 			if (list == null) {
+				const now = new Date();
 				list = await UserLists.insert({
-					id: genId(),
-					createdAt: new Date(),
+					id: genIdAt(now),
+					createdAt: now,
 					userId: user.id,
 					name: listName,
 				}).then((x) => UserLists.findOneByOrFail(x.identifiers[0]));
diff --git a/packages/backend/src/remote/activitypub/kernel/flag/index.ts b/packages/backend/src/remote/activitypub/kernel/flag/index.ts
index c556605865..755d2b7d5e 100644
--- a/packages/backend/src/remote/activitypub/kernel/flag/index.ts
+++ b/packages/backend/src/remote/activitypub/kernel/flag/index.ts
@@ -4,7 +4,7 @@ import type { IFlag } from "../../type.js";
 import { getApIds } from "../../type.js";
 import { AbuseUserReports, Users } from "@/models/index.js";
 import { In } from "typeorm";
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 
 export default async (
 	actor: CacheableRemoteUser,
@@ -23,9 +23,11 @@ export default async (
 	});
 	if (users.length < 1) return "skip";
 
+	const now = new Date();
+
 	await AbuseUserReports.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		targetUserId: users[0].id,
 		targetUserHost: users[0].host,
 		reporterId: actor.id,
diff --git a/packages/backend/src/remote/activitypub/models/person.ts b/packages/backend/src/remote/activitypub/models/person.ts
index dc3b29dc84..e861553e97 100644
--- a/packages/backend/src/remote/activitypub/models/person.ts
+++ b/packages/backend/src/remote/activitypub/models/person.ts
@@ -16,7 +16,7 @@ import type { IRemoteUser, CacheableUser } from "@/models/entities/user.js";
 import { User } from "@/models/entities/user.js";
 import type { Emoji } from "@/models/entities/emoji.js";
 import { UserNotePining } from "@/models/entities/user-note-pining.js";
-import { genId, isSameOrigin, toPuny } from "backend-rs";
+import { genId, genIdAt, isSameOrigin, toPuny } from "backend-rs";
 import { UserPublickey } from "@/models/entities/user-publickey.js";
 import { isDuplicateKeyValueError } from "@/misc/is-duplicate-key-value-error.js";
 import { UserProfile } from "@/models/entities/user-profile.js";
@@ -242,16 +242,17 @@ export async function createPerson(
 
 	// Create user
 	let user: IRemoteUser;
+	const now = new Date();
 	try {
 		// Start transaction
 		await db.transaction(async (transactionalEntityManager) => {
 			user = (await transactionalEntityManager.save(
 				new User({
-					id: genId(),
+					id: genIdAt(now),
 					avatarId: null,
 					bannerId: null,
-					createdAt: new Date(),
-					lastFetchedAt: new Date(),
+					createdAt: now,
+					lastFetchedAt: now,
 					name: truncate(person.name, nameLength),
 					isLocked: !!person.manuallyApprovesFollowers,
 					movedToUri: person.movedTo,
diff --git a/packages/backend/src/server/api/common/signin.ts b/packages/backend/src/server/api/common/signin.ts
index e5ca09df95..bafec3dfad 100644
--- a/packages/backend/src/server/api/common/signin.ts
+++ b/packages/backend/src/server/api/common/signin.ts
@@ -3,7 +3,7 @@ import type Koa from "koa";
 import { config } from "@/config.js";
 import type { ILocalUser } from "@/models/entities/user.js";
 import { Signins } from "@/models/index.js";
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 import { publishMainStream } from "@/services/stream.js";
 
 export default function (ctx: Koa.Context, user: ILocalUser, redirect = false) {
@@ -29,9 +29,10 @@ export default function (ctx: Koa.Context, user: ILocalUser, redirect = false) {
 
 	(async () => {
 		// Append signin history
+		const now = new Date();
 		const record = await Signins.insert({
-			id: genId(),
-			createdAt: new Date(),
+			id: genIdAt(now),
+			createdAt: now,
 			userId: user.id,
 			ip: ctx.ip,
 			headers: ctx.headers,
diff --git a/packages/backend/src/server/api/common/signup.ts b/packages/backend/src/server/api/common/signup.ts
index 67f06ac4e1..52ef938929 100644
--- a/packages/backend/src/server/api/common/signup.ts
+++ b/packages/backend/src/server/api/common/signup.ts
@@ -3,7 +3,7 @@ import { User } from "@/models/entities/user.js";
 import { Users, UsedUsernames } from "@/models/index.js";
 import { UserProfile } from "@/models/entities/user-profile.js";
 import { IsNull } from "typeorm";
-import { genId, generateUserToken, hashPassword, toPuny } from "backend-rs";
+import { genIdAt, generateUserToken, hashPassword, toPuny } from "backend-rs";
 import { UserKeypair } from "@/models/entities/user-keypair.js";
 import { UsedUsername } from "@/models/entities/used-username.js";
 import { db } from "@/db/postgre.js";
@@ -91,10 +91,12 @@ export async function signup(opts: {
 
 		if (exist) throw new Error(" the username is already used");
 
+		const now = new Date();
+
 		account = await transactionalEntityManager.save(
 			new User({
-				id: genId(),
-				createdAt: new Date(),
+				id: genIdAt(now),
+				createdAt: now,
 				username: username,
 				usernameLower: username.toLowerCase(),
 				host: host == null ? null : toPuny(host),
@@ -125,7 +127,7 @@ export async function signup(opts: {
 
 		await transactionalEntityManager.save(
 			new UsedUsername({
-				createdAt: new Date(),
+				createdAt: now,
 				username: username.toLowerCase(),
 			}),
 		);
diff --git a/packages/backend/src/server/api/endpoints/admin/ad/create.ts b/packages/backend/src/server/api/endpoints/admin/ad/create.ts
index c7a56d3a98..56eedbe602 100644
--- a/packages/backend/src/server/api/endpoints/admin/ad/create.ts
+++ b/packages/backend/src/server/api/endpoints/admin/ad/create.ts
@@ -1,6 +1,6 @@
 import define from "@/server/api/define.js";
 import { Ads } from "@/models/index.js";
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 
 export const meta = {
 	tags: ["admin"],
@@ -32,9 +32,11 @@ export const paramDef = {
 } as const;
 
 export default define(meta, paramDef, async (ps) => {
+	const now = new Date();
+
 	await Ads.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		expiresAt: new Date(ps.expiresAt),
 		url: ps.url,
 		imageUrl: ps.imageUrl,
diff --git a/packages/backend/src/server/api/endpoints/admin/announcements/create.ts b/packages/backend/src/server/api/endpoints/admin/announcements/create.ts
index 1ae25e62d0..1bd83f3b95 100644
--- a/packages/backend/src/server/api/endpoints/admin/announcements/create.ts
+++ b/packages/backend/src/server/api/endpoints/admin/announcements/create.ts
@@ -1,6 +1,6 @@
 import define from "@/server/api/define.js";
 import { Announcements } from "@/models/index.js";
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 
 export const meta = {
 	tags: ["admin"],
@@ -74,9 +74,10 @@ export const paramDef = {
 } as const;
 
 export default define(meta, paramDef, async (ps) => {
+	const now = new Date();
 	const announcement = await Announcements.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		updatedAt: null,
 		title: ps.title,
 		text: ps.text,
diff --git a/packages/backend/src/server/api/endpoints/admin/invite.ts b/packages/backend/src/server/api/endpoints/admin/invite.ts
index d220ae5e4a..912bb986df 100644
--- a/packages/backend/src/server/api/endpoints/admin/invite.ts
+++ b/packages/backend/src/server/api/endpoints/admin/invite.ts
@@ -1,7 +1,7 @@
 import rndstr from "rndstr";
 import define from "@/server/api/define.js";
 import { RegistrationTickets } from "@/models/index.js";
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 
 export const meta = {
 	tags: ["admin"],
@@ -38,9 +38,11 @@ export default define(meta, paramDef, async () => {
 		chars: "2-9A-HJ-NP-Z", // [0-9A-Z] w/o [01IO] (32 patterns)
 	});
 
+	const now = new Date();
+
 	await RegistrationTickets.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		code,
 	});
 
diff --git a/packages/backend/src/server/api/endpoints/antennas/create.ts b/packages/backend/src/server/api/endpoints/antennas/create.ts
index 76842df529..f8e4ed846d 100644
--- a/packages/backend/src/server/api/endpoints/antennas/create.ts
+++ b/packages/backend/src/server/api/endpoints/antennas/create.ts
@@ -1,5 +1,5 @@
 import define from "@/server/api/define.js";
-import { fetchMeta, genId } from "backend-rs";
+import { fetchMeta, genIdAt } from "backend-rs";
 import { Antennas, UserLists, UserGroupJoinings } from "@/models/index.js";
 import { ApiError } from "@/server/api/error.js";
 import { publishInternalEvent } from "@/services/stream.js";
@@ -152,9 +152,11 @@ export default define(meta, paramDef, async (ps, user) => {
 		}
 	}
 
+	const now = new Date();
+
 	const antenna = await Antennas.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		userId: user.id,
 		name: ps.name,
 		src: ps.src,
diff --git a/packages/backend/src/server/api/endpoints/app/create.ts b/packages/backend/src/server/api/endpoints/app/create.ts
index 0d580d1535..05f511f399 100644
--- a/packages/backend/src/server/api/endpoints/app/create.ts
+++ b/packages/backend/src/server/api/endpoints/app/create.ts
@@ -1,6 +1,6 @@
 import define from "@/server/api/define.js";
 import { Apps } from "@/models/index.js";
-import { genId, generateSecureRandomString } from "backend-rs";
+import { genIdAt, generateSecureRandomString } from "backend-rs";
 import { unique } from "@/prelude/array.js";
 
 export const meta = {
@@ -48,9 +48,10 @@ export default define(meta, paramDef, async (ps, user) => {
 	);
 
 	// Create account
+	const now = new Date();
 	const app = await Apps.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		userId: user ? user.id : null,
 		name: ps.name,
 		description: ps.description,
diff --git a/packages/backend/src/server/api/endpoints/auth/session/generate.ts b/packages/backend/src/server/api/endpoints/auth/session/generate.ts
index f20219aa82..2f44c778d5 100644
--- a/packages/backend/src/server/api/endpoints/auth/session/generate.ts
+++ b/packages/backend/src/server/api/endpoints/auth/session/generate.ts
@@ -3,7 +3,7 @@ import { config } from "@/config.js";
 import define from "@/server/api/define.js";
 import { ApiError } from "@/server/api/error.js";
 import { Apps, AuthSessions } from "@/models/index.js";
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 
 export const meta = {
 	tags: ["auth"],
@@ -60,9 +60,10 @@ export default define(meta, paramDef, async (ps) => {
 	const token = uuid();
 
 	// Create session token document
+	const now = new Date();
 	const doc = await AuthSessions.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		appId: app.id,
 		token: token,
 	}).then((x) => AuthSessions.findOneByOrFail(x.identifiers[0]));
diff --git a/packages/backend/src/server/api/endpoints/channels/create.ts b/packages/backend/src/server/api/endpoints/channels/create.ts
index 29c6ca029a..f5ec33a14c 100644
--- a/packages/backend/src/server/api/endpoints/channels/create.ts
+++ b/packages/backend/src/server/api/endpoints/channels/create.ts
@@ -2,7 +2,7 @@ import define from "@/server/api/define.js";
 import { ApiError } from "@/server/api/error.js";
 import { Channels, DriveFiles } from "@/models/index.js";
 import type { Channel } from "@/models/entities/channel.js";
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 
 export const meta = {
 	tags: ["channels"],
@@ -55,9 +55,11 @@ export default define(meta, paramDef, async (ps, user) => {
 		}
 	}
 
+	const now = new Date();
+
 	const channel = await Channels.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		userId: user.id,
 		name: ps.name,
 		description: ps.description || null,
diff --git a/packages/backend/src/server/api/endpoints/channels/follow.ts b/packages/backend/src/server/api/endpoints/channels/follow.ts
index fea6ca797b..afc55ac1cf 100644
--- a/packages/backend/src/server/api/endpoints/channels/follow.ts
+++ b/packages/backend/src/server/api/endpoints/channels/follow.ts
@@ -1,7 +1,7 @@
 import define from "@/server/api/define.js";
 import { ApiError } from "@/server/api/error.js";
 import { Channels, ChannelFollowings } from "@/models/index.js";
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 import { publishUserEvent } from "@/services/stream.js";
 
 export const meta = {
@@ -37,9 +37,11 @@ export default define(meta, paramDef, async (ps, user) => {
 		throw new ApiError(meta.errors.noSuchChannel);
 	}
 
+	const now = new Date();
+
 	await ChannelFollowings.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		followerId: user.id,
 		followeeId: channel.id,
 	});
diff --git a/packages/backend/src/server/api/endpoints/clips/create.ts b/packages/backend/src/server/api/endpoints/clips/create.ts
index ae652d75c2..9e5e979509 100644
--- a/packages/backend/src/server/api/endpoints/clips/create.ts
+++ b/packages/backend/src/server/api/endpoints/clips/create.ts
@@ -1,5 +1,5 @@
 import define from "@/server/api/define.js";
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 import { Clips } from "@/models/index.js";
 
 export const meta = {
@@ -33,9 +33,10 @@ export const paramDef = {
 } as const;
 
 export default define(meta, paramDef, async (ps, user) => {
+	const now = new Date();
 	const clip = await Clips.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		userId: user.id,
 		name: ps.name,
 		isPublic: ps.isPublic,
diff --git a/packages/backend/src/server/api/endpoints/drive/folders/create.ts b/packages/backend/src/server/api/endpoints/drive/folders/create.ts
index 9ea570a6b7..1d9ef1831f 100644
--- a/packages/backend/src/server/api/endpoints/drive/folders/create.ts
+++ b/packages/backend/src/server/api/endpoints/drive/folders/create.ts
@@ -2,7 +2,7 @@ import { publishDriveStream } from "@/services/stream.js";
 import define from "@/server/api/define.js";
 import { ApiError } from "@/server/api/error.js";
 import { DriveFolders } from "@/models/index.js";
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 
 export const meta = {
 	tags: ["drive"],
@@ -52,9 +52,10 @@ export default define(meta, paramDef, async (ps, user) => {
 	}
 
 	// Create folder
+	const now = new Date();
 	const folder = await DriveFolders.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		name: ps.name,
 		parentId: parent != null ? parent.id : null,
 		userId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/gallery/posts/create.ts b/packages/backend/src/server/api/endpoints/gallery/posts/create.ts
index 01c772bc3c..eda2d81e5c 100644
--- a/packages/backend/src/server/api/endpoints/gallery/posts/create.ts
+++ b/packages/backend/src/server/api/endpoints/gallery/posts/create.ts
@@ -1,6 +1,6 @@
 import define from "@/server/api/define.js";
 import { DriveFiles, GalleryPosts } from "@/models/index.js";
-import { HOUR, genId } from "backend-rs";
+import { HOUR, genIdAt } from "backend-rs";
 import { GalleryPost } from "@/models/entities/gallery-post.js";
 import type { DriveFile } from "@/models/entities/drive-file.js";
 
@@ -62,11 +62,13 @@ export default define(meta, paramDef, async (ps, user) => {
 		throw new Error();
 	}
 
+	const now = new Date();
+
 	const post = await GalleryPosts.insert(
 		new GalleryPost({
-			id: genId(),
-			createdAt: new Date(),
-			updatedAt: new Date(),
+			id: genIdAt(now),
+			createdAt: now,
+			updatedAt: now,
 			title: ps.title,
 			description: ps.description,
 			userId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/gallery/posts/like.ts b/packages/backend/src/server/api/endpoints/gallery/posts/like.ts
index 13f7d82bb2..2b1e2aa01b 100644
--- a/packages/backend/src/server/api/endpoints/gallery/posts/like.ts
+++ b/packages/backend/src/server/api/endpoints/gallery/posts/like.ts
@@ -1,7 +1,7 @@
 import define from "@/server/api/define.js";
 import { ApiError } from "@/server/api/error.js";
 import { GalleryPosts, GalleryLikes } from "@/models/index.js";
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 
 export const meta = {
 	tags: ["gallery"],
@@ -51,10 +51,12 @@ export default define(meta, paramDef, async (ps, user) => {
 		throw new ApiError(meta.errors.alreadyLiked);
 	}
 
+	const now = new Date();
+
 	// Create like
 	await GalleryLikes.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		postId: post.id,
 		userId: user.id,
 	});
diff --git a/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts b/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts
index 4991e8fc90..acf12b7168 100644
--- a/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts
+++ b/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts
@@ -2,7 +2,7 @@ import define from "@/server/api/define.js";
 import { UserProfiles, AttestationChallenges } from "@/models/index.js";
 import { promisify } from "node:util";
 import * as crypto from "node:crypto";
-import { genId, verifyPassword } from "backend-rs";
+import { genIdAt, verifyPassword } from "backend-rs";
 import { hash } from "@/server/api/2fa.js";
 
 const randomBytes = promisify(crypto.randomBytes);
@@ -39,13 +39,14 @@ export default define(meta, paramDef, async (ps, user) => {
 		.replace(/\+/g, "-")
 		.replace(/\//g, "_");
 
-	const challengeId = genId();
+	const now = new Date();
+	const challengeId = genIdAt(now);
 
 	await AttestationChallenges.insert({
 		userId: user.id,
 		id: challengeId,
 		challenge: hash(Buffer.from(challenge, "utf-8")).toString("hex"),
-		createdAt: new Date(),
+		createdAt: now,
 		registrationChallenge: true,
 	});
 
diff --git a/packages/backend/src/server/api/endpoints/i/read-announcement.ts b/packages/backend/src/server/api/endpoints/i/read-announcement.ts
index 140eecfe67..65b24c6889 100644
--- a/packages/backend/src/server/api/endpoints/i/read-announcement.ts
+++ b/packages/backend/src/server/api/endpoints/i/read-announcement.ts
@@ -1,6 +1,6 @@
 import define from "@/server/api/define.js";
 import { ApiError } from "@/server/api/error.js";
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 import { AnnouncementReads, Announcements, Users } from "@/models/index.js";
 import { publishMainStream } from "@/services/stream.js";
 
@@ -50,10 +50,12 @@ export default define(meta, paramDef, async (ps, user) => {
 		return;
 	}
 
+	const now = new Date();
+
 	// Create read
 	await AnnouncementReads.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		announcementId: ps.announcementId,
 		userId: user.id,
 	});
diff --git a/packages/backend/src/server/api/endpoints/i/registry/set.ts b/packages/backend/src/server/api/endpoints/i/registry/set.ts
index 7090f0914b..e778bd98d8 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/set.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/set.ts
@@ -1,7 +1,7 @@
 import { publishMainStream } from "@/services/stream.js";
 import define from "@/server/api/define.js";
 import { RegistryItems } from "@/models/index.js";
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 
 export const meta = {
 	requireCredential: true,
@@ -41,10 +41,11 @@ export default define(meta, paramDef, async (ps, user) => {
 			value: ps.value,
 		});
 	} else {
+		const now = new Date();
 		await RegistryItems.insert({
-			id: genId(),
-			createdAt: new Date(),
-			updatedAt: new Date(),
+			id: genIdAt(now),
+			createdAt: now,
+			updatedAt: now,
 			userId: user.id,
 			domain: null,
 			scope: ps.scope,
diff --git a/packages/backend/src/server/api/endpoints/i/webhooks/create.ts b/packages/backend/src/server/api/endpoints/i/webhooks/create.ts
index 4faae058c3..031f0e4eab 100644
--- a/packages/backend/src/server/api/endpoints/i/webhooks/create.ts
+++ b/packages/backend/src/server/api/endpoints/i/webhooks/create.ts
@@ -1,5 +1,5 @@
 import define from "@/server/api/define.js";
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 import { Webhooks } from "@/models/index.js";
 import { publishInternalEvent } from "@/services/stream.js";
 import { webhookEventTypes } from "@/models/entities/webhook.js";
@@ -30,9 +30,10 @@ export const paramDef = {
 } as const;
 
 export default define(meta, paramDef, async (ps, user) => {
+	const now = new Date();
 	const webhook = await Webhooks.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		userId: user.id,
 		name: ps.name,
 		url: ps.url,
diff --git a/packages/backend/src/server/api/endpoints/mute/create.ts b/packages/backend/src/server/api/endpoints/mute/create.ts
index a8d37153a4..85548d4014 100644
--- a/packages/backend/src/server/api/endpoints/mute/create.ts
+++ b/packages/backend/src/server/api/endpoints/mute/create.ts
@@ -1,7 +1,7 @@
 import define from "@/server/api/define.js";
 import { ApiError } from "@/server/api/error.js";
 import { getUser } from "@/server/api/common/getters.js";
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 import { Mutings, NoteWatchings } from "@/models/index.js";
 import type { Muting } from "@/models/entities/muting.js";
 import { publishUserEvent } from "@/services/stream.js";
@@ -79,10 +79,12 @@ export default define(meta, paramDef, async (ps, user) => {
 		return;
 	}
 
+	const now = new Date();
+
 	// Create mute
 	await Mutings.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		expiresAt: ps.expiresAt ? new Date(ps.expiresAt) : null,
 		muterId: muter.id,
 		muteeId: mutee.id,
diff --git a/packages/backend/src/server/api/endpoints/notes/create.ts b/packages/backend/src/server/api/endpoints/notes/create.ts
index 50179db5e2..55fb47b1ad 100644
--- a/packages/backend/src/server/api/endpoints/notes/create.ts
+++ b/packages/backend/src/server/api/endpoints/notes/create.ts
@@ -16,7 +16,7 @@ import { config } from "@/config.js";
 import { noteVisibilities } from "@/types.js";
 import { ApiError } from "@/server/api/error.js";
 import define from "@/server/api/define.js";
-import { HOUR, genId } from "backend-rs";
+import { HOUR, genIdAt } from "backend-rs";
 import { getNote } from "@/server/api/common/getters.js";
 import { langmap } from "firefish-js";
 import { createScheduledNoteJob } from "@/queue/index.js";
@@ -310,11 +310,13 @@ export default define(meta, paramDef, async (ps, user) => {
 		}
 	}
 
+	const now = new Date();
+
 	// Create a post
 	const note = await create(
 		user,
 		{
-			createdAt: new Date(),
+			createdAt: now,
 			files: files,
 			poll: ps.poll
 				? {
@@ -347,7 +349,7 @@ export default define(meta, paramDef, async (ps, user) => {
 		delay
 			? async (note) => {
 					await ScheduledNotes.insert({
-						id: genId(),
+						id: genIdAt(now),
 						noteId: note.id,
 						userId: user.id,
 						scheduledAt: new Date(ps.scheduledAt as number),
diff --git a/packages/backend/src/server/api/endpoints/notes/favorites/create.ts b/packages/backend/src/server/api/endpoints/notes/favorites/create.ts
index e2c7ca951f..48bea4496f 100644
--- a/packages/backend/src/server/api/endpoints/notes/favorites/create.ts
+++ b/packages/backend/src/server/api/endpoints/notes/favorites/create.ts
@@ -1,5 +1,5 @@
 import { NoteFavorites } from "@/models/index.js";
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 import define from "@/server/api/define.js";
 import { ApiError } from "@/server/api/error.js";
 import { getNote } from "@/server/api/common/getters.js";
@@ -54,10 +54,12 @@ export default define(meta, paramDef, async (ps, user) => {
 		throw new ApiError(meta.errors.alreadyFavorited);
 	}
 
+	const now = new Date();
+
 	// Create favorite
 	await NoteFavorites.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		noteId: note.id,
 		userId: user.id,
 	});
diff --git a/packages/backend/src/server/api/endpoints/notes/thread-muting/create.ts b/packages/backend/src/server/api/endpoints/notes/thread-muting/create.ts
index b666e05835..72b5ebbf48 100644
--- a/packages/backend/src/server/api/endpoints/notes/thread-muting/create.ts
+++ b/packages/backend/src/server/api/endpoints/notes/thread-muting/create.ts
@@ -1,5 +1,5 @@
 import { Notes, NoteThreadMutings } from "@/models/index.js";
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 import readNote from "@/services/note/read.js";
 import define from "@/server/api/define.js";
 import { getNote } from "@/server/api/common/getters.js";
@@ -49,9 +49,11 @@ export default define(meta, paramDef, async (ps, user) => {
 
 	await readNote(user.id, mutedNotes);
 
+	const now = new Date();
+
 	await NoteThreadMutings.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		threadId: note.threadId || note.id,
 		userId: user.id,
 	});
diff --git a/packages/backend/src/server/api/endpoints/pages/create.ts b/packages/backend/src/server/api/endpoints/pages/create.ts
index 4980c49806..4677352258 100644
--- a/packages/backend/src/server/api/endpoints/pages/create.ts
+++ b/packages/backend/src/server/api/endpoints/pages/create.ts
@@ -1,5 +1,5 @@
 import { Pages, DriveFiles } from "@/models/index.js";
-import { genId, HOUR } from "backend-rs";
+import { genIdAt, HOUR } from "backend-rs";
 import { Page } from "@/models/entities/page.js";
 import define from "@/server/api/define.js";
 import { ApiError } from "@/server/api/error.js";
@@ -97,11 +97,13 @@ export default define(meta, paramDef, async (ps, user) => {
 		}
 	});
 
+	const now = new Date();
+
 	const page = await Pages.insert(
 		new Page({
-			id: genId(),
-			createdAt: new Date(),
-			updatedAt: new Date(),
+			id: genIdAt(now),
+			createdAt: now,
+			updatedAt: now,
 			title: ps.title,
 			name: ps.name,
 			summary: ps.summary,
diff --git a/packages/backend/src/server/api/endpoints/pages/like.ts b/packages/backend/src/server/api/endpoints/pages/like.ts
index 1480b47e0b..e6c7f1fbb5 100644
--- a/packages/backend/src/server/api/endpoints/pages/like.ts
+++ b/packages/backend/src/server/api/endpoints/pages/like.ts
@@ -1,5 +1,5 @@
 import { Pages, PageLikes } from "@/models/index.js";
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 import define from "@/server/api/define.js";
 import { ApiError } from "@/server/api/error.js";
 
@@ -51,10 +51,12 @@ export default define(meta, paramDef, async (ps, user) => {
 		throw new ApiError(meta.errors.alreadyLiked);
 	}
 
+	const now = new Date();
+
 	// Create like
 	await PageLikes.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		pageId: page.id,
 		userId: user.id,
 	});
diff --git a/packages/backend/src/server/api/endpoints/promo/read.ts b/packages/backend/src/server/api/endpoints/promo/read.ts
index 0509548b05..362e26c463 100644
--- a/packages/backend/src/server/api/endpoints/promo/read.ts
+++ b/packages/backend/src/server/api/endpoints/promo/read.ts
@@ -1,5 +1,5 @@
 import { PromoReads } from "@/models/index.js";
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 import define from "@/server/api/define.js";
 import { ApiError } from "@/server/api/error.js";
 import { getNote } from "@/server/api/common/getters.js";
@@ -44,9 +44,11 @@ export default define(meta, paramDef, async (ps, user) => {
 		return;
 	}
 
+	const now = new Date();
+
 	await PromoReads.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		noteId: note.id,
 		userId: user.id,
 	});
diff --git a/packages/backend/src/server/api/endpoints/renote-mute/create.ts b/packages/backend/src/server/api/endpoints/renote-mute/create.ts
index 46535cb39d..b69f1e086b 100644
--- a/packages/backend/src/server/api/endpoints/renote-mute/create.ts
+++ b/packages/backend/src/server/api/endpoints/renote-mute/create.ts
@@ -1,6 +1,6 @@
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 import { RenoteMutings } from "@/models/index.js";
-import { RenoteMuting } from "@/models/entities/renote-muting.js";
+import type { RenoteMuting } from "@/models/entities/renote-muting.js";
 import define from "@/server/api/define.js";
 import { ApiError } from "@/server/api/error.js";
 import { getUser } from "@/server/api/common/getters.js";
@@ -58,10 +58,12 @@ export default define(meta, paramDef, async (ps, user) => {
 		throw new ApiError(meta.errors.alreadyMuting);
 	}
 
+	const now = new Date();
+
 	// Create mute
 	await RenoteMutings.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		muterId: muter.id,
 		muteeId: mutee.id,
 	} as RenoteMuting);
diff --git a/packages/backend/src/server/api/endpoints/reply-mute/create.ts b/packages/backend/src/server/api/endpoints/reply-mute/create.ts
index fc8644a7e1..e92b846afa 100644
--- a/packages/backend/src/server/api/endpoints/reply-mute/create.ts
+++ b/packages/backend/src/server/api/endpoints/reply-mute/create.ts
@@ -1,6 +1,6 @@
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 import { ReplyMutings } from "@/models/index.js";
-import { ReplyMuting } from "@/models/entities/reply-muting.js";
+import type { ReplyMuting } from "@/models/entities/reply-muting.js";
 import define from "@/server/api/define.js";
 import { ApiError } from "@/server/api/error.js";
 import { getUser } from "@/server/api/common/getters.js";
@@ -56,10 +56,12 @@ export default define(meta, paramDef, async (ps, user) => {
 		throw new ApiError(meta.errors.alreadyMuting);
 	}
 
+	const now = new Date();
+
 	// Create mute
 	await ReplyMutings.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		muterId: muter.id,
 		muteeId: mutee.id,
 	} as ReplyMuting);
diff --git a/packages/backend/src/server/api/endpoints/request-reset-password.ts b/packages/backend/src/server/api/endpoints/request-reset-password.ts
index 58beb94a88..ed269de15f 100644
--- a/packages/backend/src/server/api/endpoints/request-reset-password.ts
+++ b/packages/backend/src/server/api/endpoints/request-reset-password.ts
@@ -3,7 +3,7 @@ import { IsNull } from "typeorm";
 import { config } from "@/config.js";
 import { Users, UserProfiles, PasswordResetRequests } from "@/models/index.js";
 import { sendEmail } from "@/services/send-email.js";
-import { HOUR, genId } from "backend-rs";
+import { HOUR, genIdAt } from "backend-rs";
 import define from "@/server/api/define.js";
 
 export const meta = {
@@ -54,10 +54,11 @@ export default define(meta, paramDef, async (ps) => {
 	}
 
 	const token = rndstr("a-z0-9", 64);
+	const now = new Date();
 
 	await PasswordResetRequests.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		userId: profile.userId,
 		token,
 	});
diff --git a/packages/backend/src/server/api/endpoints/sw/register.ts b/packages/backend/src/server/api/endpoints/sw/register.ts
index dd8c7500b3..d2561baf47 100644
--- a/packages/backend/src/server/api/endpoints/sw/register.ts
+++ b/packages/backend/src/server/api/endpoints/sw/register.ts
@@ -1,4 +1,4 @@
-import { fetchMeta, genId } from "backend-rs";
+import { fetchMeta, genIdAt } from "backend-rs";
 import { SwSubscriptions } from "@/models/index.js";
 import define from "@/server/api/define.js";
 
@@ -76,9 +76,11 @@ export default define(meta, paramDef, async (ps, me) => {
 		};
 	}
 
+	const now = new Date();
+
 	await SwSubscriptions.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		userId: me.id,
 		endpoint: ps.endpoint,
 		auth: ps.auth,
diff --git a/packages/backend/src/server/api/endpoints/users/groups/create.ts b/packages/backend/src/server/api/endpoints/users/groups/create.ts
index e6ff909343..d1417ac36c 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/create.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/create.ts
@@ -1,5 +1,5 @@
 import { UserGroups, UserGroupJoinings } from "@/models/index.js";
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 import type { UserGroup } from "@/models/entities/user-group.js";
 import type { UserGroupJoining } from "@/models/entities/user-group-joining.js";
 import define from "@/server/api/define.js";
@@ -30,17 +30,19 @@ export const paramDef = {
 } as const;
 
 export default define(meta, paramDef, async (ps, user) => {
+	const now = new Date();
+
 	const userGroup = await UserGroups.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		userId: user.id,
 		name: ps.name,
 	} as UserGroup).then((x) => UserGroups.findOneByOrFail(x.identifiers[0]));
 
 	// Push the owner
 	await UserGroupJoinings.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		userId: user.id,
 		userGroupId: userGroup.id,
 	} as UserGroupJoining);
diff --git a/packages/backend/src/server/api/endpoints/users/groups/invitations/accept.ts b/packages/backend/src/server/api/endpoints/users/groups/invitations/accept.ts
index f86f415d7a..c86b59dd49 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/invitations/accept.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/invitations/accept.ts
@@ -1,5 +1,5 @@
 import { UserGroupJoinings, UserGroupInvitations } from "@/models/index.js";
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 import type { UserGroupJoining } from "@/models/entities/user-group-joining.js";
 import { ApiError } from "@/server/api/error.js";
 import define from "@/server/api/define.js";
@@ -44,10 +44,12 @@ export default define(meta, paramDef, async (ps, user) => {
 		throw new ApiError(meta.errors.noSuchInvitation);
 	}
 
+	const now = new Date();
+
 	// Push the user
 	await UserGroupJoinings.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		userId: user.id,
 		userGroupId: invitation.userGroupId,
 	} as UserGroupJoining);
diff --git a/packages/backend/src/server/api/endpoints/users/groups/invite.ts b/packages/backend/src/server/api/endpoints/users/groups/invite.ts
index 62e13a4458..5aa90859e6 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/invite.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/invite.ts
@@ -3,7 +3,7 @@ import {
 	UserGroupJoinings,
 	UserGroupInvitations,
 } from "@/models/index.js";
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 import type { UserGroupInvitation } from "@/models/entities/user-group-invitation.js";
 import { createNotification } from "@/services/create-notification.js";
 import { getUser } from "@/server/api/common/getters.js";
@@ -91,9 +91,11 @@ export default define(meta, paramDef, async (ps, me) => {
 		throw new ApiError(meta.errors.alreadyInvited);
 	}
 
+	const now = new Date();
+
 	const invitation = await UserGroupInvitations.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		userId: user.id,
 		userGroupId: userGroup.id,
 	} as UserGroupInvitation).then((x) =>
diff --git a/packages/backend/src/server/api/endpoints/users/lists/create.ts b/packages/backend/src/server/api/endpoints/users/lists/create.ts
index fa10bf24ce..2849ea0770 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/create.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/create.ts
@@ -1,5 +1,5 @@
 import { UserLists } from "@/models/index.js";
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 import type { UserList } from "@/models/entities/user-list.js";
 import define from "@/server/api/define.js";
 
@@ -29,9 +29,10 @@ export const paramDef = {
 } as const;
 
 export default define(meta, paramDef, async (ps, user) => {
+	const now = new Date();
 	const userList = await UserLists.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		userId: user.id,
 		name: ps.name,
 	} as UserList).then((x) => UserLists.findOneByOrFail(x.identifiers[0]));
diff --git a/packages/backend/src/server/api/endpoints/users/report-abuse.ts b/packages/backend/src/server/api/endpoints/users/report-abuse.ts
index 8a134cf9e7..27a185bc08 100644
--- a/packages/backend/src/server/api/endpoints/users/report-abuse.ts
+++ b/packages/backend/src/server/api/endpoints/users/report-abuse.ts
@@ -1,7 +1,7 @@
 import * as mfm from "mfm-js";
 import sanitizeHtml from "sanitize-html";
 import { AbuseUserReports, UserProfiles, Users } from "@/models/index.js";
-import { genId, publishToModerationStream } from "backend-rs";
+import { genIdAt, publishToModerationStream } from "backend-rs";
 import { sendEmail } from "@/services/send-email.js";
 import { getUser } from "@/server/api/common/getters.js";
 import { ApiError } from "@/server/api/error.js";
@@ -61,9 +61,11 @@ export default define(meta, paramDef, async (ps, me) => {
 		throw new ApiError(meta.errors.cannotReportAdmin);
 	}
 
+	const now = new Date();
+
 	const report = await AbuseUserReports.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		targetUserId: user.id,
 		targetUserHost: user.host,
 		reporterId: me.id,
diff --git a/packages/backend/src/server/api/private/signin.ts b/packages/backend/src/server/api/private/signin.ts
index 1ed11bbbc2..c2620d8113 100644
--- a/packages/backend/src/server/api/private/signin.ts
+++ b/packages/backend/src/server/api/private/signin.ts
@@ -11,7 +11,7 @@ import {
 } from "@/models/index.js";
 import type { ILocalUser } from "@/models/entities/user.js";
 import {
-	genId,
+	genIdAt,
 	hashPassword,
 	isOldPasswordAlgorithm,
 	verifyPassword,
@@ -101,10 +101,12 @@ export default async (ctx: Koa.Context) => {
 	}
 
 	async function fail(status?: number, failure?: { id: string }) {
+		const now = new Date();
+
 		// Append signin history
 		await Signins.insert({
-			id: genId(),
-			createdAt: new Date(),
+			id: genIdAt(now),
+			createdAt: now,
 			userId: user.id,
 			ip: ctx.ip,
 			headers: ctx.headers,
@@ -251,13 +253,14 @@ export default async (ctx: Koa.Context) => {
 			.replace(/\+/g, "-")
 			.replace(/\//g, "_");
 
-		const challengeId = genId();
+		const now = new Date();
+		const challengeId = genIdAt(now);
 
 		await AttestationChallenges.insert({
 			userId: user.id,
 			id: challengeId,
 			challenge: hash(Buffer.from(challenge, "utf-8")).toString("hex"),
-			createdAt: new Date(),
+			createdAt: now,
 			registrationChallenge: false,
 		});
 
diff --git a/packages/backend/src/server/api/private/signup.ts b/packages/backend/src/server/api/private/signup.ts
index 4dd4ffb231..59f26b49ba 100644
--- a/packages/backend/src/server/api/private/signup.ts
+++ b/packages/backend/src/server/api/private/signup.ts
@@ -5,7 +5,7 @@ import { Users, RegistrationTickets, UserPendings } from "@/models/index.js";
 import { signup } from "@/server/api/common/signup.js";
 import { config } from "@/config.js";
 import { sendEmail } from "@/services/send-email.js";
-import { fetchMeta, genId, hashPassword } from "backend-rs";
+import { fetchMeta, genIdAt, hashPassword } from "backend-rs";
 import { validateEmailForAccount } from "@/services/validate-email-for-account.js";
 
 export default async (ctx: Koa.Context) => {
@@ -84,9 +84,11 @@ export default async (ctx: Koa.Context) => {
 		// Generate hash of password
 		const hash = hashPassword(password);
 
+		const now = new Date();
+
 		await UserPendings.insert({
-			id: genId(),
-			createdAt: new Date(),
+			id: genIdAt(now),
+			createdAt: now,
 			code,
 			email: emailAddress,
 			username: username,
diff --git a/packages/backend/src/services/blocking/create.ts b/packages/backend/src/services/blocking/create.ts
index 2e5766c45b..b5e23c8277 100644
--- a/packages/backend/src/services/blocking/create.ts
+++ b/packages/backend/src/services/blocking/create.ts
@@ -15,7 +15,7 @@ import {
 	UserListJoinings,
 	UserLists,
 } from "@/models/index.js";
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 import { getActiveWebhooks } from "@/misc/webhook-cache.js";
 import { webhookDeliver } from "@/queue/index.js";
 
@@ -28,9 +28,11 @@ export default async function (blocker: User, blockee: User) {
 		removeFromList(blockee, blocker),
 	]);
 
+	const now = new Date();
+
 	const blocking = {
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		blocker,
 		blockerId: blocker.id,
 		blockee,
diff --git a/packages/backend/src/services/create-notification.ts b/packages/backend/src/services/create-notification.ts
index 335ba561e7..55fa6819c1 100644
--- a/packages/backend/src/services/create-notification.ts
+++ b/packages/backend/src/services/create-notification.ts
@@ -8,7 +8,7 @@ import {
 	Followings,
 } from "@/models/index.js";
 import {
-	genId,
+	genIdAt,
 	isSilencedServer,
 	sendPushNotification,
 	PushNotificationKind,
@@ -61,10 +61,12 @@ export async function createNotification(
 		}
 	}
 
+	const now = new Date();
+
 	// Create notification
 	const notification = await Notifications.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		notifieeId: notifieeId,
 		type: type,
 		// 相手がこの通知をミュートしているようなら、既読を予めつけておく
diff --git a/packages/backend/src/services/create-system-user.ts b/packages/backend/src/services/create-system-user.ts
index d13d5a7bda..6c9e828900 100644
--- a/packages/backend/src/services/create-system-user.ts
+++ b/packages/backend/src/services/create-system-user.ts
@@ -3,7 +3,7 @@ import { genRsaKeyPair } from "@/misc/gen-key-pair.js";
 import { User } from "@/models/entities/user.js";
 import { UserProfile } from "@/models/entities/user-profile.js";
 import { IsNull } from "typeorm";
-import { generateUserToken, genId, hashPassword } from "backend-rs";
+import { generateUserToken, genIdAt, hashPassword } from "backend-rs";
 import { UserKeypair } from "@/models/entities/user-keypair.js";
 import { UsedUsername } from "@/models/entities/used-username.js";
 import { db } from "@/db/postgre.js";
@@ -21,6 +21,8 @@ export async function createSystemUser(username: string) {
 
 	let account!: User;
 
+	const now = new Date();
+
 	// Start transaction
 	await db.transaction(async (transactionalEntityManager) => {
 		const exist = await transactionalEntityManager.findOneBy(User, {
@@ -32,8 +34,8 @@ export async function createSystemUser(username: string) {
 
 		account = await transactionalEntityManager
 			.insert(User, {
-				id: genId(),
-				createdAt: new Date(),
+				id: genIdAt(now),
+				createdAt: now,
 				username: username,
 				usernameLower: username.toLowerCase(),
 				host: null,
@@ -60,7 +62,7 @@ export async function createSystemUser(username: string) {
 		});
 
 		await transactionalEntityManager.insert(UsedUsername, {
-			createdAt: new Date(),
+			createdAt: now,
 			username: username.toLowerCase(),
 		});
 	});
diff --git a/packages/backend/src/services/following/create.ts b/packages/backend/src/services/following/create.ts
index 49852ee9ef..df9ab8ab2f 100644
--- a/packages/backend/src/services/following/create.ts
+++ b/packages/backend/src/services/following/create.ts
@@ -17,7 +17,7 @@ import {
 	Instances,
 	UserProfiles,
 } from "@/models/index.js";
-import { genId, isSilencedServer } from "backend-rs";
+import { genIdAt, isSilencedServer } from "backend-rs";
 import { createNotification } from "@/services/create-notification.js";
 import { isDuplicateKeyValueError } from "@/misc/is-duplicate-key-value-error.js";
 import type { Packed } from "@/misc/schema.js";
@@ -46,9 +46,11 @@ export async function insertFollowingDoc(
 
 	let alreadyFollowed = false;
 
+	const now = new Date();
+
 	await Followings.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		followerId: follower.id,
 		followeeId: followee.id,
 
diff --git a/packages/backend/src/services/following/requests/create.ts b/packages/backend/src/services/following/requests/create.ts
index 146e20efd9..e4f093dfc1 100644
--- a/packages/backend/src/services/following/requests/create.ts
+++ b/packages/backend/src/services/following/requests/create.ts
@@ -4,7 +4,7 @@ import renderFollow from "@/remote/activitypub/renderer/follow.js";
 import { deliver } from "@/queue/index.js";
 import type { User } from "@/models/entities/user.js";
 import { Blockings, FollowRequests, Users } from "@/models/index.js";
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 import { createNotification } from "@/services/create-notification.js";
 import { config } from "@/config.js";
 
@@ -42,9 +42,11 @@ export default async function (
 	if (blocking) throw new Error("blocking");
 	if (blocked) throw new Error("blocked");
 
+	const now = new Date();
+
 	const followRequest = await FollowRequests.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		followerId: follower.id,
 		followeeId: followee.id,
 		requestId,
diff --git a/packages/backend/src/services/i/pin.ts b/packages/backend/src/services/i/pin.ts
index b44ba5f9fa..42fc09b406 100644
--- a/packages/backend/src/services/i/pin.ts
+++ b/packages/backend/src/services/i/pin.ts
@@ -7,7 +7,7 @@ import type { User } from "@/models/entities/user.js";
 import type { Note } from "@/models/entities/note.js";
 import { Notes, UserNotePinings, Users } from "@/models/index.js";
 import type { UserNotePining } from "@/models/entities/user-note-pining.js";
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 import { deliverToFollowers } from "@/remote/activitypub/deliver-manager.js";
 import { deliverToRelays } from "@/services/relay.js";
 
@@ -49,9 +49,11 @@ export async function addPinned(
 		);
 	}
 
+	const now = new Date();
+
 	await UserNotePinings.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		userId: user.id,
 		noteId: note.id,
 	} as UserNotePining);
diff --git a/packages/backend/src/services/insert-moderation-log.ts b/packages/backend/src/services/insert-moderation-log.ts
index 9c76cf45ac..6fcaeda146 100644
--- a/packages/backend/src/services/insert-moderation-log.ts
+++ b/packages/backend/src/services/insert-moderation-log.ts
@@ -1,5 +1,5 @@
 import { ModerationLogs } from "@/models/index.js";
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 import type { User } from "@/models/entities/user.js";
 
 export async function insertModerationLog(
@@ -7,9 +7,10 @@ export async function insertModerationLog(
 	type: string,
 	info?: Record<string, any>,
 ) {
+	const now = new Date();
 	await ModerationLogs.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		userId: moderator.id,
 		type: type,
 		info: info || {},
diff --git a/packages/backend/src/services/messages/create.ts b/packages/backend/src/services/messages/create.ts
index 709e9bc235..f1f26065bd 100644
--- a/packages/backend/src/services/messages/create.ts
+++ b/packages/backend/src/services/messages/create.ts
@@ -8,7 +8,7 @@ import {
 	Users,
 } from "@/models/index.js";
 import {
-	genId,
+	genIdAt,
 	sendPushNotification,
 	publishToChatStream,
 	publishToGroupChatStream,
@@ -36,9 +36,10 @@ export async function createMessage(
 	file: DriveFile | null,
 	uri?: string,
 ) {
+	const now = new Date();
 	const message = {
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		fileId: file ? file.id : null,
 		recipientId: recipientUser ? recipientUser.id : null,
 		groupId: recipientGroup ? recipientGroup.id : null,
diff --git a/packages/backend/src/services/note/polls/vote.ts b/packages/backend/src/services/note/polls/vote.ts
index 32213ddcc8..c1070576f1 100644
--- a/packages/backend/src/services/note/polls/vote.ts
+++ b/packages/backend/src/services/note/polls/vote.ts
@@ -3,7 +3,7 @@ import type { CacheableUser } from "@/models/entities/user.js";
 import type { Note } from "@/models/entities/note.js";
 import { PollVotes, NoteWatchings, Polls, Blockings } from "@/models/index.js";
 import { Not } from "typeorm";
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 import { createNotification } from "@/services/create-notification.js";
 
 export default async function (
@@ -43,10 +43,12 @@ export default async function (
 		throw new Error("already voted");
 	}
 
+	const now = new Date();
+
 	// Create vote
 	await PollVotes.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		noteId: note.id,
 		userId: user.id,
 		choice: choice,
diff --git a/packages/backend/src/services/note/reaction/create.ts b/packages/backend/src/services/note/reaction/create.ts
index 3b8b97cefd..54b0bfaaab 100644
--- a/packages/backend/src/services/note/reaction/create.ts
+++ b/packages/backend/src/services/note/reaction/create.ts
@@ -13,7 +13,7 @@ import {
 	Blockings,
 } from "@/models/index.js";
 import { IsNull, Not } from "typeorm";
-import { decodeReaction, genId, toDbReaction } from "backend-rs";
+import { decodeReaction, genIdAt, toDbReaction } from "backend-rs";
 import { createNotification } from "@/services/create-notification.js";
 import deleteReaction from "./delete.js";
 import { isDuplicateKeyValueError } from "@/misc/is-duplicate-key-value-error.js";
@@ -47,9 +47,11 @@ export default async (
 	// TODO: cache
 	reaction = await toDbReaction(reaction, user.host);
 
+	const now = new Date();
+
 	const record: NoteReaction = {
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		noteId: note.id,
 		userId: user.id,
 		reaction,
diff --git a/packages/backend/src/services/user-list/push.ts b/packages/backend/src/services/user-list/push.ts
index 141584e294..1ec4289672 100644
--- a/packages/backend/src/services/user-list/push.ts
+++ b/packages/backend/src/services/user-list/push.ts
@@ -3,14 +3,16 @@ import type { User } from "@/models/entities/user.js";
 import type { UserList } from "@/models/entities/user-list.js";
 import { UserListJoinings, Users } from "@/models/index.js";
 import type { UserListJoining } from "@/models/entities/user-list-joining.js";
-import { genId } from "backend-rs";
+import { genIdAt } from "backend-rs";
 import { fetchProxyAccount } from "@/misc/fetch-proxy-account.js";
 import createFollowing from "@/services/following/create.js";
 
 export async function pushUserToUserList(target: User, list: UserList) {
+	const now = new Date();
+
 	await UserListJoinings.insert({
-		id: genId(),
-		createdAt: new Date(),
+		id: genIdAt(now),
+		createdAt: now,
 		userId: target.id,
 		userListId: list.id,
 	} as UserListJoining);