diff --git a/src/components/albumList/letterSection.astro b/src/components/albumList/letterSection.astro
new file mode 100644
index 0000000..23c6b49
--- /dev/null
+++ b/src/components/albumList/letterSection.astro
@@ -0,0 +1,24 @@
+---
+import { AlbumStatus } from '@prisma/client'
+import prismaClient from 'utils/prisma-client'
+
+interface Props {
+ letter: string
+}
+
+const { letter } = Astro.props
+const albums = await prismaClient.albums.findMany({
+ where: { status: AlbumStatus.SHOW, title: { startsWith: letter } },
+ select: { id: true, title: true }
+})
+---
+
+
diff --git a/src/pages/album/list/index.astro b/src/pages/album/list/index.astro
new file mode 100644
index 0000000..1b78507
--- /dev/null
+++ b/src/pages/album/list/index.astro
@@ -0,0 +1,52 @@
+---
+import prismaClient from 'utils/prisma-client'
+import * as m from 'paraglide/messages'
+import { AlbumStatus } from '@prisma/client'
+
+import Sidebar from 'components/Sidebar.astro'
+import BaseLayout from 'layouts/base.astro'
+import AlbumBox from 'components/AlbumBox.astro'
+import LetterSection from 'components/albumList/letterSection.astro'
+
+const letters: { letter: string; count: BigInt }[] = await prismaClient.$queryRaw`
+ SELECT DISTINCT UPPER(LEFT(title, 1)) AS letter, COUNT(*) AS count
+ FROM albums
+ WHERE status = 'SHOW'
+ GROUP BY letter
+ ORDER BY letter;
+ `
+---
+
+
+
+
+
+ {
+ letters.map((l) => (
+
+ ))
+ }
+
+
+ {
+ letters.map((l) => (
+
+ ))
+ }
+
+
+
+
+