diff --git a/lib/routes/obsidian/plugins.ts b/lib/routes/obsidian/plugins.ts
new file mode 100644
index 00000000000000..83198bfacd388c
--- /dev/null
+++ b/lib/routes/obsidian/plugins.ts
@@ -0,0 +1,41 @@
+import { Route } from '@/types';
+
+import ofetch from '@/utils/ofetch';
+
+export const route: Route = {
+ path: '/plugins',
+ name: 'Obsidian Plugins',
+ maintainers: ['DIYgod'],
+ categories: ['program-update'],
+ example: '/obsidian/plugins',
+ handler,
+};
+
+async function handler() {
+ const data = JSON.parse(await ofetch('https://raw.githubusercontent.com/obsidianmd/obsidian-releases/refs/heads/master/community-plugins.json')) as {
+ id: string;
+ name: string;
+ author: string;
+ description: string;
+ repo: string;
+ }[];
+ const stats = JSON.parse(await ofetch('https://raw.githubusercontent.com/obsidianmd/obsidian-releases/HEAD/community-plugin-stats.json')) as {
+ [key: string]: {
+ downloads: number;
+ updated: number;
+ };
+ };
+
+ return {
+ title: 'Obsidian Plugins',
+ link: `https://obsidian.md/plugins`,
+ item: data.map((item) => ({
+ title: item.name,
+ description: `${item.description}
Downloads: ${stats[item.id].downloads}`,
+ link: `https://github.com/${item.repo}`,
+ guid: item.id,
+ pubDate: new Date(stats[item.id].updated),
+ author: item.author,
+ })),
+ };
+}