diff --git a/.editorconfig b/.editorconfig
index edccf3a9d568fcec8f7fa9c3f36474accd10ae8a..6db1367645cd6a09f3472e73f15093d83303d0de 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -5,6 +5,7 @@ indent_style = tab
 indent_size = 2
 charset = utf-8
 insert_final_newline = true
+end_of_line = lf
 
 [*.yml]
 indent_style = space
diff --git a/.gitattributes b/.gitattributes
index a175917f31ca16f29edb1bd3fa5e26c0ed1b099b..246ecb0a60a8ca02e9983088a9e69f94acda223d 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -5,3 +5,4 @@
 *.glb -diff -text
 *.blend -diff -text
 *.afdesign -diff -text
+* text=auto eol=lf
diff --git a/.github/workflows/check_copyright_year.yml b/.github/workflows/check_copyright_year.yml
index 99799672f2ddeaade259d25c74c1cbc346636db6..8daea44a8347aa88f8fea0ea524951eee34c37b9 100644
--- a/.github/workflows/check_copyright_year.yml
+++ b/.github/workflows/check_copyright_year.yml
@@ -1,18 +1,18 @@
-name: Check copyright year
-
-on:
-  push:
-    branches:
-      - master
-      - develop
-
-jobs:
-  check_copyright_year:
-    runs-on: ubuntu-latest
-    steps:
-    - uses: actions/checkout@v3.2.0
-    - run: |
-        if [ "$(grep Copyright COPYING | sed -e 's/.*2014-\([0-9]*\) .*/\1/g')" -ne "$(date +%Y)" ]; then
-          echo "Please change copyright year!"
-          exit 1
-        fi
+name: Check copyright year
+
+on:
+  push:
+    branches:
+      - master
+      - develop
+
+jobs:
+  check_copyright_year:
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout@v3.2.0
+    - run: |
+        if [ "$(grep Copyright COPYING | sed -e 's/.*2014-\([0-9]*\) .*/\1/g')" -ne "$(date +%Y)" ]; then
+          echo "Please change copyright year!"
+          exit 1
+        fi
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index b88b97ab0c20dd1350e95610e3fc84ae1a6d7a94..6a579bffc85593d616c56022efbba99e901261d4 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -1,54 +1,54 @@
-name: Lint
-
-on:
-  push:
-    branches:
-      - master
-      - develop
-  pull_request:
-
-jobs:
-  pnpm_install:
-    runs-on: ubuntu-latest
-    steps:
-    - uses: actions/checkout@v3.3.0
-      with:
-        fetch-depth: 0
-        submodules: true
-    - uses: pnpm/action-setup@v2
-      with:
-        version: 7
-        run_install: false
-    - uses: actions/setup-node@v3.6.0
-      with:
-        node-version: 18.x
-        cache: 'pnpm'
-    - run: corepack enable
-    - run: pnpm i --frozen-lockfile
-
-  lint:
-    needs: [pnpm_install]
-    runs-on: ubuntu-latest
-    continue-on-error: true
-    strategy:
-      matrix:
-        workspace:
-        - backend
-        - frontend
-        - sw
-    steps:
-    - uses: actions/checkout@v3.3.0
-      with:
-        fetch-depth: 0
-        submodules: true
-    - uses: pnpm/action-setup@v2
-      with:
-        version: 7
-        run_install: false
-    - uses: actions/setup-node@v3.6.0
-      with:
-        node-version: 18.x
-        cache: 'pnpm'
-    - run: corepack enable
-    - run: pnpm i --frozen-lockfile
-    - run: pnpm --filter ${{ matrix.workspace }} run lint
+name: Lint
+
+on:
+  push:
+    branches:
+      - master
+      - develop
+  pull_request:
+
+jobs:
+  pnpm_install:
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout@v3.3.0
+      with:
+        fetch-depth: 0
+        submodules: true
+    - uses: pnpm/action-setup@v2
+      with:
+        version: 7
+        run_install: false
+    - uses: actions/setup-node@v3.6.0
+      with:
+        node-version: 18.x
+        cache: 'pnpm'
+    - run: corepack enable
+    - run: pnpm i --frozen-lockfile
+
+  lint:
+    needs: [pnpm_install]
+    runs-on: ubuntu-latest
+    continue-on-error: true
+    strategy:
+      matrix:
+        workspace:
+        - backend
+        - frontend
+        - sw
+    steps:
+    - uses: actions/checkout@v3.3.0
+      with:
+        fetch-depth: 0
+        submodules: true
+    - uses: pnpm/action-setup@v2
+      with:
+        version: 7
+        run_install: false
+    - uses: actions/setup-node@v3.6.0
+      with:
+        node-version: 18.x
+        cache: 'pnpm'
+    - run: corepack enable
+    - run: pnpm i --frozen-lockfile
+    - run: pnpm --filter ${{ matrix.workspace }} run lint
diff --git a/packages/backend/src/server/api/endpoints/clips/remove-note.ts b/packages/backend/src/server/api/endpoints/clips/remove-note.ts
index 55778c7ecb8a96066e5380bb007556acb279bfbc..5d88870ed27f57246c6eb1f977d0428bad758726 100644
--- a/packages/backend/src/server/api/endpoints/clips/remove-note.ts
+++ b/packages/backend/src/server/api/endpoints/clips/remove-note.ts
@@ -1,72 +1,72 @@
-import { Inject, Injectable } from '@nestjs/common';
-import { Endpoint } from '@/server/api/endpoint-base.js';
-import type { ClipNotesRepository, ClipsRepository } from '@/models/index.js';
-import { DI } from '@/di-symbols.js';
-import { ApiError } from '../../error.js';
-import { GetterService } from '@/server/api/GetterService.js';
-
-export const meta = {
-	tags: ['account', 'notes', 'clips'],
-
-	requireCredential: true,
-
-	kind: 'write:account',
-
-	errors: {
-		noSuchClip: {
-			message: 'No such clip.',
-			code: 'NO_SUCH_CLIP',
-			id: 'b80525c6-97f7-49d7-a42d-ebccd49cfd52',
-		},
-
-		noSuchNote: {
-			message: 'No such note.',
-			code: 'NO_SUCH_NOTE',
-			id: 'aff017de-190e-434b-893e-33a9ff5049d8',
-		},
-	},
-} as const;
-
-export const paramDef = {
-	type: 'object',
-	properties: {
-		clipId: { type: 'string', format: 'misskey:id' },
-		noteId: { type: 'string', format: 'misskey:id' },
-	},
-	required: ['clipId', 'noteId'],
-} as const;
-
-// eslint-disable-next-line import/no-default-export
-@Injectable()
-export default class extends Endpoint<typeof meta, typeof paramDef> {
-	constructor(
-		@Inject(DI.clipsRepository)
-		private clipsRepository: ClipsRepository,
-
-		@Inject(DI.clipNotesRepository)
-		private clipNotesRepository: ClipNotesRepository,
-
-		private getterService: GetterService,
-	) {
-		super(meta, paramDef, async (ps, me) => {
-			const clip = await this.clipsRepository.findOneBy({
-				id: ps.clipId,
-				userId: me.id,
-			});
-
-			if (clip == null) {
-				throw new ApiError(meta.errors.noSuchClip);
-			}
-
-			const note = await this.getterService.getNote(ps.noteId).catch(err => {
-				if (err.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
-				throw err;
-			});
-
-			await this.clipNotesRepository.delete({
-				noteId: note.id,
-				clipId: clip.id,
-			});
-		});
-	}
-}
+import { Inject, Injectable } from '@nestjs/common';
+import { Endpoint } from '@/server/api/endpoint-base.js';
+import type { ClipNotesRepository, ClipsRepository } from '@/models/index.js';
+import { DI } from '@/di-symbols.js';
+import { ApiError } from '../../error.js';
+import { GetterService } from '@/server/api/GetterService.js';
+
+export const meta = {
+	tags: ['account', 'notes', 'clips'],
+
+	requireCredential: true,
+
+	kind: 'write:account',
+
+	errors: {
+		noSuchClip: {
+			message: 'No such clip.',
+			code: 'NO_SUCH_CLIP',
+			id: 'b80525c6-97f7-49d7-a42d-ebccd49cfd52',
+		},
+
+		noSuchNote: {
+			message: 'No such note.',
+			code: 'NO_SUCH_NOTE',
+			id: 'aff017de-190e-434b-893e-33a9ff5049d8',
+		},
+	},
+} as const;
+
+export const paramDef = {
+	type: 'object',
+	properties: {
+		clipId: { type: 'string', format: 'misskey:id' },
+		noteId: { type: 'string', format: 'misskey:id' },
+	},
+	required: ['clipId', 'noteId'],
+} as const;
+
+// eslint-disable-next-line import/no-default-export
+@Injectable()
+export default class extends Endpoint<typeof meta, typeof paramDef> {
+	constructor(
+		@Inject(DI.clipsRepository)
+		private clipsRepository: ClipsRepository,
+
+		@Inject(DI.clipNotesRepository)
+		private clipNotesRepository: ClipNotesRepository,
+
+		private getterService: GetterService,
+	) {
+		super(meta, paramDef, async (ps, me) => {
+			const clip = await this.clipsRepository.findOneBy({
+				id: ps.clipId,
+				userId: me.id,
+			});
+
+			if (clip == null) {
+				throw new ApiError(meta.errors.noSuchClip);
+			}
+
+			const note = await this.getterService.getNote(ps.noteId).catch(err => {
+				if (err.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
+				throw err;
+			});
+
+			await this.clipNotesRepository.delete({
+				noteId: note.id,
+				clipId: clip.id,
+			});
+		});
+	}
+}
diff --git a/packages/frontend/assets/label-red.svg b/packages/frontend/assets/label-red.svg
index 45996aa9ce5c00fbad1f5f456e8fb86590bc4de0..c89d3f5f3a4106c660a73b5ff5167ce1cf56940a 100644
Binary files a/packages/frontend/assets/label-red.svg and b/packages/frontend/assets/label-red.svg differ
diff --git a/packages/frontend/assets/label.svg b/packages/frontend/assets/label.svg
index b1f85f3c075905e8fc884c2159fa3af33c49a929..997335f505dea703797558e16c72f6f860173ad3 100644
Binary files a/packages/frontend/assets/label.svg and b/packages/frontend/assets/label.svg differ
diff --git a/packages/frontend/assets/unread.svg b/packages/frontend/assets/unread.svg
index 8c3cc9f4758c0be0f6f5a12c2929cfa2204acbf8..8bd4156e51d17c439b6d3852db8c745f474b989f 100644
Binary files a/packages/frontend/assets/unread.svg and b/packages/frontend/assets/unread.svg differ