diff --git a/packages/backend/src/@types/redis-lock.d.ts b/packages/backend/src/@types/redis-lock.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9242656a9888dffdafe2c8cd2024ef9fb37b825c
--- /dev/null
+++ b/packages/backend/src/@types/redis-lock.d.ts
@@ -0,0 +1,8 @@
+declare module 'redis-lock' {
+	import type Redis from 'ioredis';
+
+	type Lock = (lockName: string, timeout?: number, taskToPerform?: () => Promise<void>) => void;
+	function redisLock(client: Redis.Redis, retryDelay: number): Lock;
+
+	export = redisLock;
+}
diff --git a/packages/backend/src/core/PushNotificationService.ts b/packages/backend/src/core/PushNotificationService.ts
index 4b7ca5c968013cfd93cc3da936b206dcd059c215..545f86d7643329030bf7b1990308dd86b93aa99a 100644
--- a/packages/backend/src/core/PushNotificationService.ts
+++ b/packages/backend/src/core/PushNotificationService.ts
@@ -9,7 +9,7 @@ import { MetaService } from '@/core/MetaService.js';
 import { bindThis } from '@/decorators.js';
 
 // Defined also packages/sw/types.ts#L13
-type pushNotificationsTypes = {
+type PushNotificationsTypes = {
 	'notification': Packed<'Notification'>;
 	'unreadAntennaNote': {
 		antenna: { id: string, name: string };
@@ -56,7 +56,7 @@ export class PushNotificationService {
 	}
 
 	@bindThis
-	public async pushNotification<T extends keyof pushNotificationsTypes>(userId: string, type: T, body: pushNotificationsTypes[T]) {
+	public async pushNotification<T extends keyof PushNotificationsTypes>(userId: string, type: T, body: PushNotificationsTypes[T]) {
 		const meta = await this.metaService.fetch();
 	
 		if (!meta.enableServiceWorker || meta.swPublicKey == null || meta.swPrivateKey == null) return;
diff --git a/packages/backend/src/core/activitypub/type.ts b/packages/backend/src/core/activitypub/type.ts
index 268bf99119ee000925c6517204dba7a424a05086..7f2ca9c05e644f6a0a56396f7c7e579a5d16d220 100644
--- a/packages/backend/src/core/activitypub/type.ts
+++ b/packages/backend/src/core/activitypub/type.ts
@@ -1,8 +1,8 @@
-export type obj = { [x: string]: any };
+export type Obj = { [x: string]: any };
 export type ApObject = IObject | string | (IObject | string)[];
 
 export interface IObject {
-	'@context'?: string | string[] | obj | obj[];
+	'@context'?: string | string[] | Obj | Obj[];
 	type: string | string[];
 	id?: string;
 	name?: string | null;
diff --git a/packages/backend/src/server/api/endpoint-base.ts b/packages/backend/src/server/api/endpoint-base.ts
index 115526d997af319662fa24d33b4678c6c545084c..ed283eb834ad43011b058b987552a1a4ab1ad690 100644
--- a/packages/backend/src/server/api/endpoint-base.ts
+++ b/packages/backend/src/server/api/endpoint-base.ts
@@ -20,14 +20,14 @@ type File = {
 };
 
 // TODO: paramsの型をT['params']のスキーマ定義から推論する
-type executor<T extends IEndpointMeta, Ps extends Schema> =
+type Executor<T extends IEndpointMeta, Ps extends Schema> =
 	(params: SchemaType<Ps>, user: T['requireCredential'] extends true ? LocalUser : LocalUser | null, token: AccessToken | null, file?: File, cleanup?: () => any, ip?: string | null, headers?: Record<string, string> | null) =>
 		Promise<T['res'] extends undefined ? Response : SchemaType<NonNullable<T['res']>>>;
 
 export abstract class Endpoint<T extends IEndpointMeta, Ps extends Schema> {
 	public exec: (params: any, user: T['requireCredential'] extends true ? LocalUser : LocalUser | null, token: AccessToken | null, file?: File, ip?: string | null, headers?: Record<string, string> | null) => Promise<any>;
 
-	constructor(meta: T, paramDef: Ps, cb: executor<T, Ps>) {
+	constructor(meta: T, paramDef: Ps, cb: Executor<T, Ps>) {
 		const validate = ajv.compile(paramDef);
 
 		this.exec = (params: any, user: T['requireCredential'] extends true ? LocalUser : LocalUser | null, token: AccessToken | null, file?: File, ip?: string | null, headers?: Record<string, string> | null) => {
diff --git a/packages/shared/.eslintrc.js b/packages/shared/.eslintrc.js
index 6d38a9fb9f436536b0c0d7298cb46d0f97c8e4fa..7c979a93dcd3b4988fdffb78540e942fe24dd4ff 100644
--- a/packages/shared/.eslintrc.js
+++ b/packages/shared/.eslintrc.js
@@ -77,6 +77,17 @@ module.exports = {
 		'@typescript-eslint/prefer-nullish-coalescing': [
 			'error',
 		],
+		'@typescript-eslint/naming-convention': [
+			'error',
+			{
+				"selector": "typeLike",
+				"format": ["PascalCase"]
+			},
+			{
+				"selector": "typeParameter",
+				"format": []
+			}
+		],
 		'import/no-unresolved': ['off'],
 		'import/no-default-export': ['warn'],
 		'import/order': ['warn', {