diff --git a/CHANGELOG.md b/CHANGELOG.md
index 677fb5698b905ad34e8276da69f73c7a0b8fe460..b9c0ddf27d5dcc61ac2001be6414277180a28df0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,11 +12,15 @@ You should also include the user name that made the change.
 
 ## 12.x.x (unreleased)
 
+### Changes
+- ノートの最大文字数を設定できる機能が廃止され、デフォルトで一律3000文字になりました
+
 ### Improvements
 - 
 
 ### Bugfixes
 - Client: リアクションピッカーの高さが低くなったまま戻らないことがあるのを修正 @syuilo
+- Client: タッチ操作だとウィジェットの編集がしにくいのを修正 @xianonn
 
 ## 12.107.0 (2022/02/12)
 
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index f4c9d199816c1d68dc28582478b45ef5099fddd0..840e1beeee5eb807dbec668ad4aa23b6a7425a41 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -422,7 +422,6 @@ next: "次"
 retype: "再入力"
 noteOf: "{user}のノート"
 inviteToGroup: "グループに招待"
-maxNoteTextLength: "ノートの文字数制限"
 quoteAttached: "引用付き"
 quoteQuestion: "引用として添付しますか?"
 noMessagesYet: "まだチャットはありません"
diff --git a/packages/backend/migration/1645340161439-remove-max-note-text-length.js b/packages/backend/migration/1645340161439-remove-max-note-text-length.js
new file mode 100644
index 0000000000000000000000000000000000000000..63e7d25ee5491d946ef15f700cba08ed9f7bdc2c
--- /dev/null
+++ b/packages/backend/migration/1645340161439-remove-max-note-text-length.js
@@ -0,0 +1,13 @@
+const { MigrationInterface, QueryRunner } = require("typeorm");
+
+module.exports = class removeMaxNoteTextLength1645340161439 {
+    name = 'removeMaxNoteTextLength1645340161439'
+
+    async up(queryRunner) {
+        await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "maxNoteTextLength"`);
+    }
+
+    async down(queryRunner) {
+        await queryRunner.query(`ALTER TABLE "meta" ADD "maxNoteTextLength" integer NOT NULL DEFAULT '500'`);
+    }
+}
diff --git a/packages/backend/src/const.ts b/packages/backend/src/const.ts
index b00bd81655851347ab30f2f248ed7c63044f5dd1..6d3b9559e8d89e2dc99b8e98905f063f8f46510c 100644
--- a/packages/backend/src/const.ts
+++ b/packages/backend/src/const.ts
@@ -1,3 +1,5 @@
+export const MAX_NOTE_TEXT_LENGTH = 3000;
+
 export const USER_ONLINE_THRESHOLD = 1000 * 60 * 10; // 10min
 export const USER_ACTIVE_THRESHOLD = 1000 * 60 * 60 * 24 * 3; // 3days
 
diff --git a/packages/backend/src/models/entities/meta.ts b/packages/backend/src/models/entities/meta.ts
index 1426c79c514df48ef92f719e2194883963eb7def..30316424784b61ef9e1ef0eefa9f4e66ae879f08 100644
--- a/packages/backend/src/models/entities/meta.ts
+++ b/packages/backend/src/models/entities/meta.ts
@@ -205,12 +205,6 @@ export class Meta {
 	})
 	public remoteDriveCapacityMb: number;
 
-	@Column('integer', {
-		default: 500,
-		comment: 'Max allowed note text length in characters',
-	})
-	public maxNoteTextLength: number;
-
 	@Column('varchar', {
 		length: 128,
 		nullable: true,
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 ecede8a049ec83c48f73898f16c3883f4e5de8d6..509e120e7905a165b0c9b98f8f70415b91553edc 100644
--- a/packages/backend/src/server/api/endpoints/admin/update-meta.ts
+++ b/packages/backend/src/server/api/endpoints/admin/update-meta.ts
@@ -36,7 +36,6 @@ export const paramDef = {
 		logoImageUrl: { type: 'string', nullable: true },
 		name: { type: 'string', nullable: true },
 		description: { type: 'string', nullable: true },
-		maxNoteTextLength: { type: 'integer', maximum: 8192 },
 		localDriveCapacityMb: { type: 'integer' },
 		remoteDriveCapacityMb: { type: 'integer' },
 		cacheRemoteFiles: { type: 'boolean' },
@@ -164,10 +163,6 @@ export default define(meta, paramDef, async (ps, me) => {
 		set.description = ps.description;
 	}
 
-	if (ps.maxNoteTextLength) {
-		set.maxNoteTextLength = ps.maxNoteTextLength;
-	}
-
 	if (ps.localDriveCapacityMb !== undefined) {
 		set.localDriveCapacityMb = ps.localDriveCapacityMb;
 	}
diff --git a/packages/backend/src/server/api/endpoints/meta.ts b/packages/backend/src/server/api/endpoints/meta.ts
index 5b5604f6a6d719f08ab206c6a0814e58daf30233..9ea75009e6879dbb6da1668cbc138c8615c91664 100644
--- a/packages/backend/src/server/api/endpoints/meta.ts
+++ b/packages/backend/src/server/api/endpoints/meta.ts
@@ -138,11 +138,6 @@ export const meta = {
 				type: 'string',
 				optional: false, nullable: true,
 			},
-			maxNoteTextLength: {
-				type: 'number',
-				optional: false, nullable: false,
-				default: 500,
-			},
 			emojis: {
 				type: 'array',
 				optional: false, nullable: false,
@@ -506,7 +501,6 @@ export default define(meta, paramDef, async (ps, me) => {
 		iconUrl: instance.iconUrl,
 		backgroundImageUrl: instance.backgroundImageUrl,
 		logoImageUrl: instance.logoImageUrl,
-		maxNoteTextLength: Math.min(instance.maxNoteTextLength, DB_MAX_NOTE_TEXT_LENGTH),
 		emojis: await Emojis.packMany(emojis),
 		ads: ads.map(ad => ({
 			id: ad.id,
diff --git a/packages/backend/src/server/api/endpoints/notes/create.ts b/packages/backend/src/server/api/endpoints/notes/create.ts
index 7ac318c5011a776890c3bfb4f2e963d118a1899b..6bf696b9d13f42a6c31e1e4048fc4fe3ccd3e621 100644
--- a/packages/backend/src/server/api/endpoints/notes/create.ts
+++ b/packages/backend/src/server/api/endpoints/notes/create.ts
@@ -1,24 +1,14 @@
 import ms from 'ms';
-import { length } from 'stringz';
 import create from '@/services/note/create';
 import define from '../../define';
-import { fetchMeta } from '@/misc/fetch-meta';
 import { ApiError } from '../../error';
 import { User } from '@/models/entities/user';
 import { Users, DriveFiles, Notes, Channels, Blockings } from '@/models/index';
 import { DriveFile } from '@/models/entities/drive-file';
 import { Note } from '@/models/entities/note';
-import { DB_MAX_NOTE_TEXT_LENGTH } from '@/misc/hard-limits';
 import { noteVisibilities } from '../../../../types';
 import { Channel } from '@/models/entities/channel';
-
-let maxNoteTextLength = 500;
-
-setInterval(() => {
-	fetchMeta().then(m => {
-		maxNoteTextLength = m.maxNoteTextLength;
-	});
-}, 3000);
+import { MAX_NOTE_TEXT_LENGTH } from '@/const';
 
 export const meta = {
 	tags: ['notes'],
@@ -102,7 +92,7 @@ export const paramDef = {
 		visibleUserIds: { type: 'array', uniqueItems: true, items: {
 			type: 'string', format: 'misskey:id',
 		} },
-		text: { type: 'string', nullable: true, maxLength: 3000, default: null },
+		text: { type: 'string', nullable: true, maxLength: MAX_NOTE_TEXT_LENGTH, default: null },
 		cw: { type: 'string', nullable: true, maxLength: 100 },
 		localOnly: { type: 'boolean', default: false },
 		noExtractMentions: { type: 'boolean', default: false },
diff --git a/packages/backend/src/server/nodeinfo.ts b/packages/backend/src/server/nodeinfo.ts
index 4209fc7f14e49b4d31b31866f2ceebd37d3de67c..25eca291db1d5a79934e8578f4d51232445bf733 100644
--- a/packages/backend/src/server/nodeinfo.ts
+++ b/packages/backend/src/server/nodeinfo.ts
@@ -3,6 +3,7 @@ import config from '@/config/index';
 import { fetchMeta } from '@/misc/fetch-meta';
 import { Users, Notes } from '@/models/index';
 import { MoreThan } from 'typeorm';
+import { MAX_NOTE_TEXT_LENGTH } from '@/const';
 
 const router = new Router();
 
@@ -69,7 +70,7 @@ const nodeinfo2 = async () => {
 			emailRequiredForSignup: meta.emailRequiredForSignup,
 			enableHcaptcha: meta.enableHcaptcha,
 			enableRecaptcha: meta.enableRecaptcha,
-			maxNoteTextLength: meta.maxNoteTextLength,
+			maxNoteTextLength: MAX_NOTE_TEXT_LENGTH,
 			enableTwitterIntegration: meta.enableTwitterIntegration,
 			enableGithubIntegration: meta.enableGithubIntegration,
 			enableDiscordIntegration: meta.enableDiscordIntegration,
diff --git a/packages/client/src/components/widgets.vue b/packages/client/src/components/widgets.vue
index ccde5fbe552bf0a52ff70238760b37011539ebd7..da9d935281f9854c42eecd5b4afefbf50f74adee 100644
--- a/packages/client/src/components/widgets.vue
+++ b/packages/client/src/components/widgets.vue
@@ -12,13 +12,14 @@
 		<XDraggable
 			v-model="widgets_"
 			item-key="id"
+			handle=".handle"
 			animation="150"
 		>
 			<template #item="{element}">
 				<div class="customize-container">
 					<button class="config _button" @click.prevent.stop="configWidget(element.id)"><i class="fas fa-cog"></i></button>
 					<button class="remove _button" @click.prevent.stop="removeWidget(element)"><i class="fas fa-times"></i></button>
-					<component :ref="el => widgetRefs[element.id] = el" :is="`mkw-${element.name}`" :widget="element" @updateProps="updateWidget(element.id, $event)"/>
+					<component class="handle" :ref="el => widgetRefs[element.id] = el" :is="`mkw-${element.name}`" :widget="element" @updateProps="updateWidget(element.id, $event)"/>
 				</div>
 			</template>
 		</XDraggable>
@@ -121,10 +122,6 @@ export default defineComponent({
 		position: relative;
 		cursor: move;
 
-		> *:not(.remove):not(.config) {
-			pointer-events: none;
-		}
-
 		> .config,
 		> .remove {
 			position: absolute;
diff --git a/packages/client/src/pages/admin/settings.vue b/packages/client/src/pages/admin/settings.vue
index 81204f6e2fed1101f7baead359d2002dd78dc48e..17f7842ab23dca555ed7e8b9ae310101997dd7d0 100644
--- a/packages/client/src/pages/admin/settings.vue
+++ b/packages/client/src/pages/admin/settings.vue
@@ -52,11 +52,6 @@
 				<template #caption>{{ $ts.pinnedUsersDescription }}</template>
 			</FormTextarea>
 
-			<FormInput v-model="maxNoteTextLength" type="number" class="_formBlock">
-				<template #prefix><i class="fas fa-pencil-alt"></i></template>
-				<template #label>{{ $ts.maxNoteTextLength }}</template>
-			</FormInput>
-
 			<FormSection>
 				<FormSwitch v-model="enableRegistration" class="_formBlock">
 					<template #label>{{ $ts.enableRegistration }}</template>
@@ -186,7 +181,6 @@ export default defineComponent({
 			bannerUrl: null,
 			backgroundImageUrl: null,
 			themeColor: null,
-			maxNoteTextLength: 0,
 			enableLocalTimeline: false,
 			enableGlobalTimeline: false,
 			pinnedUsers: '',
@@ -216,7 +210,6 @@ export default defineComponent({
 			this.themeColor = meta.themeColor;
 			this.maintainerName = meta.maintainerName;
 			this.maintainerEmail = meta.maintainerEmail;
-			this.maxNoteTextLength = meta.maxNoteTextLength;
 			this.enableLocalTimeline = !meta.disableLocalTimeline;
 			this.enableGlobalTimeline = !meta.disableGlobalTimeline;
 			this.pinnedUsers = meta.pinnedUsers.join('\n');
@@ -244,7 +237,6 @@ export default defineComponent({
 				themeColor: this.themeColor === '' ? null : this.themeColor,
 				maintainerName: this.maintainerName,
 				maintainerEmail: this.maintainerEmail,
-				maxNoteTextLength: this.maxNoteTextLength,
 				disableLocalTimeline: !this.enableLocalTimeline,
 				disableGlobalTimeline: !this.enableGlobalTimeline,
 				pinnedUsers: this.pinnedUsers.split('\n'),