diff --git a/.gitignore b/.gitignore
index 7c37c91..e1caf77 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,3 +5,4 @@
build/
node_modules/
.vitepress/cache
+.vitepress/contributors.json
diff --git a/.vitepress/get-contributors.js b/.vitepress/get-contributors.js
new file mode 100644
index 0000000..ec48716
--- /dev/null
+++ b/.vitepress/get-contributors.js
@@ -0,0 +1,56 @@
+#!/usr/bin/env node
+const fs = require('fs')
+const path = require('path')
+
+const repo = process.argv[2]
+const file = process.argv[3] ?? '.vitepress/contributors.json'
+console.log(`get-contributors - repo: ${repo} - file: ${file}`)
+
+if (!repo || !file) {
+ console.error('Usage: npm run get-contributors user/repo')
+ process.exit(1)
+}
+
+fs.mkdirSync(path.dirname(file), { recursive: true })
+
+getAllContributors(repo)
+ .then((data) => {
+ // console.log('data:', data)
+ fs.writeFileSync(file, JSON.stringify(data), 'utf8')
+ })
+ .catch((e) => {
+ console.error(e)
+ fs.writeFileSync(file, JSON.stringify([]), 'utf8')
+ })
+
+async function getAllContributors(repo) {
+ let results = []
+ let page = 1
+
+ while (true) {
+ const url = `https://api.github.com/repos/${repo}/contributors?per_page=100&page=${page}`
+ const data = { headers: { Accept: 'application/vnd.github+json' } }
+
+ const response = await fetch(url, data)
+ if (!response.ok) break
+
+ const contributors = await response.json()
+ // console.log('contributors:', contributors)
+ if (!contributors.length) break
+
+ const filtered = contributors
+ .filter((c) => c.type === 'User')
+ .map((c) => ({
+ login: c.login,
+ avatar_url: c.avatar_url,
+ contributions: c.contributions,
+ }))
+ // console.log('filtered:', filtered)
+
+ results.push(...filtered)
+ page++
+ await new Promise((resolve) => setTimeout(resolve, 250))
+ }
+
+ return results
+}
diff --git a/.vitepress/theme/components/Contributors.vue b/.vitepress/theme/components/Contributors.vue
new file mode 100644
index 0000000..e690427
--- /dev/null
+++ b/.vitepress/theme/components/Contributors.vue
@@ -0,0 +1,57 @@
+
+
+
+
+
+