From f299da2964efc9f90d37555abee28a003259d9e2 Mon Sep 17 00:00:00 2001 From: pisum-sativum Date: Wed, 22 Jul 2026 02:08:48 +0530 Subject: [PATCH 1/9] fix(ci-analytics): parallelize API requests with Promise.all to prevent timeout on large repos --- services/github/ci-analytics.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/github/ci-analytics.ts b/services/github/ci-analytics.ts index 6c67ebe79..fdcdd5b8d 100644 --- a/services/github/ci-analytics.ts +++ b/services/github/ci-analytics.ts @@ -14,7 +14,7 @@ import type { const GITHUB_REST_URL = 'https://api.github.com'; const MAX_REPO_PAGES = 2; -const MAX_ACTION_PAGES = 2; +const MAX_ACTION_PAGES = 1; const MAX_FETCH_TARGETS = 5; const cache = new DistributedCache(500); From 5a9ecf1956530570d12fba189e8488eb52b06257 Mon Sep 17 00:00:00 2001 From: pisum-sativum Date: Wed, 22 Jul 2026 21:41:46 +0530 Subject: [PATCH 2/9] feat: Automatically sort SOCIALS list alphabetically --- app/generator/data/socials.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/generator/data/socials.ts b/app/generator/data/socials.ts index dfcf8d3cf..b8a77c3c6 100644 --- a/app/generator/data/socials.ts +++ b/app/generator/data/socials.ts @@ -592,7 +592,7 @@ export const SOCIALS: Social[] = [ baseUrl: 'https://huggingface.co/', placeholder: 'e.g. https://huggingface.co/yourname', }, -]; +].sort((a, b) => a.name.localeCompare(b.name)); export const SOCIAL_CATEGORIES: SocialCategory[] = [ 'Social Media', From 6978cd32aa9c191d1a3a39a3b3fd70e46c86b62c Mon Sep 17 00:00:00 2001 From: pisum-sativum Date: Wed, 22 Jul 2026 21:51:02 +0530 Subject: [PATCH 3/9] fix: resolve TS2322 type error in SOCIALS sort by casting array as Social[] --- app/generator/data/socials.ts | 1166 +++++++++++++++++---------------- 1 file changed, 584 insertions(+), 582 deletions(-) diff --git a/app/generator/data/socials.ts b/app/generator/data/socials.ts index b8a77c3c6..567b2accb 100644 --- a/app/generator/data/socials.ts +++ b/app/generator/data/socials.ts @@ -4,595 +4,597 @@ const SI = (slug: string) => `https://cdn.simpleicons.org/${slug}`; const DI = (name: string, variant = 'original') => `https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/${name}/${name}-${variant}.svg`; -export const SOCIALS: Social[] = [ - { - id: 'twitter', - name: 'X (Twitter)', - category: 'Social Media', - iconUrl: SI('x'), - type: 'simpleicon', - siSlug: 'x', - baseUrl: 'https://x.com/', - placeholder: 'e.g. https://x.com/yourhandle', - }, - { - id: 'linkedin', - name: 'LinkedIn', - category: 'Professional', - iconUrl: DI('linkedin'), - type: 'devicon', - siSlug: 'linkedin', - baseUrl: 'https://linkedin.com/in/', - placeholder: 'e.g. https://linkedin.com/in/yourname', - }, - { - id: 'instagram', - name: 'Instagram', - category: 'Social Media', - iconUrl: SI('instagram'), - type: 'simpleicon', - siSlug: 'instagram', - baseUrl: 'https://instagram.com/', - placeholder: 'e.g. https://instagram.com/yourhandle', - }, - { - id: 'facebook', - name: 'Facebook', - category: 'Social Media', - iconUrl: SI('facebook'), - type: 'simpleicon', - siSlug: 'facebook', - baseUrl: 'https://facebook.com/', - placeholder: 'e.g. https://facebook.com/yourprofile', - }, - { - id: 'youtube', - name: 'YouTube', - category: 'Social Media', - iconUrl: SI('youtube'), - type: 'simpleicon', - siSlug: 'youtube', - baseUrl: 'https://youtube.com/@', - placeholder: 'e.g. https://youtube.com/@yourchannel', - }, - { - id: 'tiktok', - name: 'TikTok', - category: 'Social Media', - iconUrl: SI('tiktok'), - type: 'simpleicon', - siSlug: 'tiktok', - baseUrl: 'https://tiktok.com/@', - placeholder: 'e.g. https://tiktok.com/@yourhandle', - }, - { - id: 'discord', - name: 'Discord', - category: 'Social Media', - iconUrl: SI('discord'), - type: 'simpleicon', - siSlug: 'discord', - baseUrl: 'https://discord.gg/', - placeholder: 'e.g. https://discord.gg/yourserver', - }, - { - id: 'reddit', - name: 'Reddit', - category: 'Social Media', - iconUrl: SI('reddit'), - type: 'simpleicon', - siSlug: 'reddit', - baseUrl: 'https://reddit.com/u/', - placeholder: 'e.g. https://reddit.com/u/yourname', - }, - { - id: 'mastodon', - name: 'Mastodon', - category: 'Social Media', - iconUrl: SI('mastodon'), - type: 'simpleicon', - siSlug: 'mastodon', - baseUrl: 'https://mastodon.social/@', - placeholder: 'e.g. https://mastodon.social/@yourhandle', - }, - { - id: 'bluesky', - name: 'Bluesky', - category: 'Social Media', - iconUrl: SI('bluesky'), - type: 'simpleicon', - siSlug: 'bluesky', - baseUrl: 'https://bsky.app/profile/', - placeholder: 'e.g. https://bsky.app/profile/yourhandle', - }, - { - id: 'threads', - name: 'Threads', - category: 'Social Media', - iconUrl: SI('threads'), - type: 'simpleicon', - siSlug: 'threads', - baseUrl: 'https://threads.net/@', - placeholder: 'e.g. https://threads.net/@yourhandle', - }, - { - id: 'snapchat', - name: 'Snapchat', - category: 'Social Media', - iconUrl: SI('snapchat'), - type: 'simpleicon', - siSlug: 'snapchat', - baseUrl: 'https://snapchat.com/add/', - placeholder: 'e.g. https://snapchat.com/add/yourusername', - }, - { - id: 'pinterest', - name: 'Pinterest', - category: 'Social Media', - iconUrl: SI('pinterest'), - type: 'simpleicon', - siSlug: 'pinterest', - baseUrl: 'https://pinterest.com/', - placeholder: 'e.g. https://pinterest.com/yourname', - }, - { - id: 'vimeo', - name: 'Vimeo', - category: 'Social Media', - iconUrl: SI('vimeo'), - type: 'simpleicon', - siSlug: 'vimeo', - baseUrl: 'https://vimeo.com/', - placeholder: 'e.g. https://vimeo.com/yourusername', - }, - { - id: 'xing', - name: 'Xing', - category: 'Professional', - iconUrl: SI('xing'), - type: 'simpleicon', - siSlug: 'xing', - baseUrl: 'https://www.xing.com/profile/', - placeholder: 'e.g. https://www.xing.com/profile/yourname', - }, +export const SOCIALS: Social[] = ( + [ + { + id: 'twitter', + name: 'X (Twitter)', + category: 'Social Media', + iconUrl: SI('x'), + type: 'simpleicon', + siSlug: 'x', + baseUrl: 'https://x.com/', + placeholder: 'e.g. https://x.com/yourhandle', + }, + { + id: 'linkedin', + name: 'LinkedIn', + category: 'Professional', + iconUrl: DI('linkedin'), + type: 'devicon', + siSlug: 'linkedin', + baseUrl: 'https://linkedin.com/in/', + placeholder: 'e.g. https://linkedin.com/in/yourname', + }, + { + id: 'instagram', + name: 'Instagram', + category: 'Social Media', + iconUrl: SI('instagram'), + type: 'simpleicon', + siSlug: 'instagram', + baseUrl: 'https://instagram.com/', + placeholder: 'e.g. https://instagram.com/yourhandle', + }, + { + id: 'facebook', + name: 'Facebook', + category: 'Social Media', + iconUrl: SI('facebook'), + type: 'simpleicon', + siSlug: 'facebook', + baseUrl: 'https://facebook.com/', + placeholder: 'e.g. https://facebook.com/yourprofile', + }, + { + id: 'youtube', + name: 'YouTube', + category: 'Social Media', + iconUrl: SI('youtube'), + type: 'simpleicon', + siSlug: 'youtube', + baseUrl: 'https://youtube.com/@', + placeholder: 'e.g. https://youtube.com/@yourchannel', + }, + { + id: 'tiktok', + name: 'TikTok', + category: 'Social Media', + iconUrl: SI('tiktok'), + type: 'simpleicon', + siSlug: 'tiktok', + baseUrl: 'https://tiktok.com/@', + placeholder: 'e.g. https://tiktok.com/@yourhandle', + }, + { + id: 'discord', + name: 'Discord', + category: 'Social Media', + iconUrl: SI('discord'), + type: 'simpleicon', + siSlug: 'discord', + baseUrl: 'https://discord.gg/', + placeholder: 'e.g. https://discord.gg/yourserver', + }, + { + id: 'reddit', + name: 'Reddit', + category: 'Social Media', + iconUrl: SI('reddit'), + type: 'simpleicon', + siSlug: 'reddit', + baseUrl: 'https://reddit.com/u/', + placeholder: 'e.g. https://reddit.com/u/yourname', + }, + { + id: 'mastodon', + name: 'Mastodon', + category: 'Social Media', + iconUrl: SI('mastodon'), + type: 'simpleicon', + siSlug: 'mastodon', + baseUrl: 'https://mastodon.social/@', + placeholder: 'e.g. https://mastodon.social/@yourhandle', + }, + { + id: 'bluesky', + name: 'Bluesky', + category: 'Social Media', + iconUrl: SI('bluesky'), + type: 'simpleicon', + siSlug: 'bluesky', + baseUrl: 'https://bsky.app/profile/', + placeholder: 'e.g. https://bsky.app/profile/yourhandle', + }, + { + id: 'threads', + name: 'Threads', + category: 'Social Media', + iconUrl: SI('threads'), + type: 'simpleicon', + siSlug: 'threads', + baseUrl: 'https://threads.net/@', + placeholder: 'e.g. https://threads.net/@yourhandle', + }, + { + id: 'snapchat', + name: 'Snapchat', + category: 'Social Media', + iconUrl: SI('snapchat'), + type: 'simpleicon', + siSlug: 'snapchat', + baseUrl: 'https://snapchat.com/add/', + placeholder: 'e.g. https://snapchat.com/add/yourusername', + }, + { + id: 'pinterest', + name: 'Pinterest', + category: 'Social Media', + iconUrl: SI('pinterest'), + type: 'simpleicon', + siSlug: 'pinterest', + baseUrl: 'https://pinterest.com/', + placeholder: 'e.g. https://pinterest.com/yourname', + }, + { + id: 'vimeo', + name: 'Vimeo', + category: 'Social Media', + iconUrl: SI('vimeo'), + type: 'simpleicon', + siSlug: 'vimeo', + baseUrl: 'https://vimeo.com/', + placeholder: 'e.g. https://vimeo.com/yourusername', + }, + { + id: 'xing', + name: 'Xing', + category: 'Professional', + iconUrl: SI('xing'), + type: 'simpleicon', + siSlug: 'xing', + baseUrl: 'https://www.xing.com/profile/', + placeholder: 'e.g. https://www.xing.com/profile/yourname', + }, - { - id: 'github', - name: 'GitHub', - category: 'Developer', - iconUrl: DI('github'), - type: 'devicon', - siSlug: 'github', - baseUrl: 'https://github.com/', - placeholder: 'e.g. https://github.com/yourusername', - }, - { - id: 'gitlabprofile', - name: 'GitLab', - category: 'Developer', - iconUrl: DI('gitlab'), - type: 'devicon', - siSlug: 'gitlab', - baseUrl: 'https://gitlab.com/', - placeholder: 'e.g. https://gitlab.com/yourusername', - }, - { - id: 'bitbucket', - name: 'Bitbucket', - category: 'Developer', - iconUrl: DI('bitbucket'), - type: 'devicon', - siSlug: 'bitbucket', - baseUrl: 'https://bitbucket.org/', - placeholder: 'e.g. https://bitbucket.org/yourusername', - }, - { - id: 'stackoverflow', - name: 'Stack Overflow', - category: 'Developer', - iconUrl: DI('stackoverflow'), - type: 'devicon', - siSlug: 'stackoverflow', - baseUrl: 'https://stackoverflow.com/users/', - placeholder: 'e.g. https://stackoverflow.com/users/123456', - }, - { - id: 'devto', - name: 'Dev.to', - category: 'Developer', - iconUrl: SI('devdotto'), - type: 'simpleicon', - siSlug: 'devdotto', - baseUrl: 'https://dev.to/', - placeholder: 'e.g. https://dev.to/yourusername', - }, - { - id: 'hashnode', - name: 'Hashnode', - category: 'Developer', - iconUrl: SI('hashnode'), - type: 'simpleicon', - siSlug: 'hashnode', - baseUrl: 'https://hashnode.com/@', - placeholder: 'e.g. https://hashnode.com/@yourusername', - }, - { - id: 'medium', - name: 'Medium', - category: 'Developer', - iconUrl: SI('medium'), - type: 'simpleicon', - siSlug: 'medium', - baseUrl: 'https://medium.com/@', - placeholder: 'e.g. https://medium.com/@yourusername', - }, - { - id: 'npm', - name: 'npm', - category: 'Developer', - iconUrl: SI('npm'), - type: 'simpleicon', - siSlug: 'npm', - baseUrl: 'https://npmjs.com/~', - placeholder: 'e.g. https://npmjs.com/~yourusername', - }, - { - id: 'pypi', - name: 'PyPI', - category: 'Developer', - iconUrl: SI('pypi'), - type: 'simpleicon', - siSlug: 'pypi', - baseUrl: 'https://pypi.org/user/', - placeholder: 'e.g. https://pypi.org/user/yourusername', - }, - { - id: 'dockerhub', - name: 'Docker Hub', - category: 'Developer', - iconUrl: DI('docker'), - type: 'devicon', - siSlug: 'docker', - baseUrl: 'https://hub.docker.com/u/', - placeholder: 'e.g. https://hub.docker.com/u/yourusername', - }, - { - id: 'replit', - name: 'Replit', - category: 'Developer', - iconUrl: SI('replit'), - type: 'simpleicon', - siSlug: 'replit', - baseUrl: 'https://replit.com/@', - placeholder: 'e.g. https://replit.com/@yourusername', - }, - { - id: 'codepen', - name: 'CodePen', - category: 'Developer', - iconUrl: DI('codepen'), - type: 'devicon', - siSlug: 'codepen', - baseUrl: 'https://codepen.io/', - placeholder: 'e.g. https://codepen.io/yourusername', - }, - { - id: 'codesandbox', - name: 'CodeSandbox', - category: 'Developer', - iconUrl: SI('codesandbox'), - type: 'simpleicon', - siSlug: 'codesandbox', - baseUrl: 'https://codesandbox.io/u/', - placeholder: 'e.g. https://codesandbox.io/u/yourusername', - }, - { - id: 'wakatime', - name: 'WakaTime', - category: 'Developer', - iconUrl: SI('wakatime'), - type: 'simpleicon', - siSlug: 'wakatime', - baseUrl: 'https://wakatime.com/@', - placeholder: 'e.g. https://wakatime.com/@yourusername', - }, + { + id: 'github', + name: 'GitHub', + category: 'Developer', + iconUrl: DI('github'), + type: 'devicon', + siSlug: 'github', + baseUrl: 'https://github.com/', + placeholder: 'e.g. https://github.com/yourusername', + }, + { + id: 'gitlabprofile', + name: 'GitLab', + category: 'Developer', + iconUrl: DI('gitlab'), + type: 'devicon', + siSlug: 'gitlab', + baseUrl: 'https://gitlab.com/', + placeholder: 'e.g. https://gitlab.com/yourusername', + }, + { + id: 'bitbucket', + name: 'Bitbucket', + category: 'Developer', + iconUrl: DI('bitbucket'), + type: 'devicon', + siSlug: 'bitbucket', + baseUrl: 'https://bitbucket.org/', + placeholder: 'e.g. https://bitbucket.org/yourusername', + }, + { + id: 'stackoverflow', + name: 'Stack Overflow', + category: 'Developer', + iconUrl: DI('stackoverflow'), + type: 'devicon', + siSlug: 'stackoverflow', + baseUrl: 'https://stackoverflow.com/users/', + placeholder: 'e.g. https://stackoverflow.com/users/123456', + }, + { + id: 'devto', + name: 'Dev.to', + category: 'Developer', + iconUrl: SI('devdotto'), + type: 'simpleicon', + siSlug: 'devdotto', + baseUrl: 'https://dev.to/', + placeholder: 'e.g. https://dev.to/yourusername', + }, + { + id: 'hashnode', + name: 'Hashnode', + category: 'Developer', + iconUrl: SI('hashnode'), + type: 'simpleicon', + siSlug: 'hashnode', + baseUrl: 'https://hashnode.com/@', + placeholder: 'e.g. https://hashnode.com/@yourusername', + }, + { + id: 'medium', + name: 'Medium', + category: 'Developer', + iconUrl: SI('medium'), + type: 'simpleicon', + siSlug: 'medium', + baseUrl: 'https://medium.com/@', + placeholder: 'e.g. https://medium.com/@yourusername', + }, + { + id: 'npm', + name: 'npm', + category: 'Developer', + iconUrl: SI('npm'), + type: 'simpleicon', + siSlug: 'npm', + baseUrl: 'https://npmjs.com/~', + placeholder: 'e.g. https://npmjs.com/~yourusername', + }, + { + id: 'pypi', + name: 'PyPI', + category: 'Developer', + iconUrl: SI('pypi'), + type: 'simpleicon', + siSlug: 'pypi', + baseUrl: 'https://pypi.org/user/', + placeholder: 'e.g. https://pypi.org/user/yourusername', + }, + { + id: 'dockerhub', + name: 'Docker Hub', + category: 'Developer', + iconUrl: DI('docker'), + type: 'devicon', + siSlug: 'docker', + baseUrl: 'https://hub.docker.com/u/', + placeholder: 'e.g. https://hub.docker.com/u/yourusername', + }, + { + id: 'replit', + name: 'Replit', + category: 'Developer', + iconUrl: SI('replit'), + type: 'simpleicon', + siSlug: 'replit', + baseUrl: 'https://replit.com/@', + placeholder: 'e.g. https://replit.com/@yourusername', + }, + { + id: 'codepen', + name: 'CodePen', + category: 'Developer', + iconUrl: DI('codepen'), + type: 'devicon', + siSlug: 'codepen', + baseUrl: 'https://codepen.io/', + placeholder: 'e.g. https://codepen.io/yourusername', + }, + { + id: 'codesandbox', + name: 'CodeSandbox', + category: 'Developer', + iconUrl: SI('codesandbox'), + type: 'simpleicon', + siSlug: 'codesandbox', + baseUrl: 'https://codesandbox.io/u/', + placeholder: 'e.g. https://codesandbox.io/u/yourusername', + }, + { + id: 'wakatime', + name: 'WakaTime', + category: 'Developer', + iconUrl: SI('wakatime'), + type: 'simpleicon', + siSlug: 'wakatime', + baseUrl: 'https://wakatime.com/@', + placeholder: 'e.g. https://wakatime.com/@yourusername', + }, - { - id: 'leetcode', - name: 'LeetCode', - category: 'Competitive Programming', - iconUrl: SI('leetcode'), - type: 'simpleicon', - siSlug: 'leetcode', - baseUrl: 'https://leetcode.com/', - placeholder: 'e.g. https://leetcode.com/yourusername', - }, - { - id: 'codeforces', - name: 'Codeforces', - category: 'Competitive Programming', - iconUrl: SI('codeforces'), - type: 'simpleicon', - siSlug: 'codeforces', - baseUrl: 'https://codeforces.com/profile/', - placeholder: 'e.g. https://codeforces.com/profile/yourusername', - }, - { - id: 'hackerrank', - name: 'HackerRank', - category: 'Competitive Programming', - iconUrl: SI('hackerrank'), - type: 'simpleicon', - siSlug: 'hackerrank', - baseUrl: 'https://hackerrank.com/', - placeholder: 'e.g. https://hackerrank.com/yourusername', - }, - { - id: 'hackerearth', - name: 'HackerEarth', - category: 'Competitive Programming', - iconUrl: SI('hackerearth'), - type: 'simpleicon', - siSlug: 'hackerearth', - baseUrl: 'https://hackerearth.com/@', - placeholder: 'e.g. https://hackerearth.com/@yourusername', - }, - { - id: 'atcoder', - name: 'AtCoder', - category: 'Competitive Programming', - iconUrl: SI('codementor'), - type: 'simpleicon', - siSlug: 'codementor', - baseUrl: 'https://atcoder.jp/users/', - placeholder: 'e.g. https://atcoder.jp/users/yourusername', - }, - { - id: 'codechef', - name: 'CodeChef', - category: 'Competitive Programming', - iconUrl: SI('codechef'), - type: 'simpleicon', - siSlug: 'codechef', - baseUrl: 'https://codechef.com/users/', - placeholder: 'e.g. https://codechef.com/users/yourusername', - }, - { - id: 'topcoder', - name: 'TopCoder', - category: 'Competitive Programming', - iconUrl: SI('topcoder'), - type: 'simpleicon', - siSlug: 'topcoder', - baseUrl: 'https://topcoder.com/members/', - placeholder: 'e.g. https://topcoder.com/members/yourusername', - }, - { - id: 'codewars', - name: 'Codewars', - category: 'Competitive Programming', - iconUrl: SI('codewars'), - type: 'simpleicon', - siSlug: 'codewars', - baseUrl: 'https://codewars.com/users/', - placeholder: 'e.g. https://codewars.com/users/yourusername', - }, - { - id: 'geeksforgeeks', - name: 'GeeksForGeeks', - category: 'Competitive Programming', - iconUrl: SI('geeksforgeeks'), - type: 'simpleicon', - siSlug: 'geeksforgeeks', - baseUrl: 'https://geeksforgeeks.org/user/', - placeholder: 'e.g. https://geeksforgeeks.org/user/yourusername', - }, - { - id: 'kaggle', - name: 'Kaggle', - category: 'Competitive Programming', - iconUrl: SI('kaggle'), - type: 'simpleicon', - siSlug: 'kaggle', - baseUrl: 'https://kaggle.com/', - placeholder: 'e.g. https://kaggle.com/yourusername', - }, + { + id: 'leetcode', + name: 'LeetCode', + category: 'Competitive Programming', + iconUrl: SI('leetcode'), + type: 'simpleicon', + siSlug: 'leetcode', + baseUrl: 'https://leetcode.com/', + placeholder: 'e.g. https://leetcode.com/yourusername', + }, + { + id: 'codeforces', + name: 'Codeforces', + category: 'Competitive Programming', + iconUrl: SI('codeforces'), + type: 'simpleicon', + siSlug: 'codeforces', + baseUrl: 'https://codeforces.com/profile/', + placeholder: 'e.g. https://codeforces.com/profile/yourusername', + }, + { + id: 'hackerrank', + name: 'HackerRank', + category: 'Competitive Programming', + iconUrl: SI('hackerrank'), + type: 'simpleicon', + siSlug: 'hackerrank', + baseUrl: 'https://hackerrank.com/', + placeholder: 'e.g. https://hackerrank.com/yourusername', + }, + { + id: 'hackerearth', + name: 'HackerEarth', + category: 'Competitive Programming', + iconUrl: SI('hackerearth'), + type: 'simpleicon', + siSlug: 'hackerearth', + baseUrl: 'https://hackerearth.com/@', + placeholder: 'e.g. https://hackerearth.com/@yourusername', + }, + { + id: 'atcoder', + name: 'AtCoder', + category: 'Competitive Programming', + iconUrl: SI('codementor'), + type: 'simpleicon', + siSlug: 'codementor', + baseUrl: 'https://atcoder.jp/users/', + placeholder: 'e.g. https://atcoder.jp/users/yourusername', + }, + { + id: 'codechef', + name: 'CodeChef', + category: 'Competitive Programming', + iconUrl: SI('codechef'), + type: 'simpleicon', + siSlug: 'codechef', + baseUrl: 'https://codechef.com/users/', + placeholder: 'e.g. https://codechef.com/users/yourusername', + }, + { + id: 'topcoder', + name: 'TopCoder', + category: 'Competitive Programming', + iconUrl: SI('topcoder'), + type: 'simpleicon', + siSlug: 'topcoder', + baseUrl: 'https://topcoder.com/members/', + placeholder: 'e.g. https://topcoder.com/members/yourusername', + }, + { + id: 'codewars', + name: 'Codewars', + category: 'Competitive Programming', + iconUrl: SI('codewars'), + type: 'simpleicon', + siSlug: 'codewars', + baseUrl: 'https://codewars.com/users/', + placeholder: 'e.g. https://codewars.com/users/yourusername', + }, + { + id: 'geeksforgeeks', + name: 'GeeksForGeeks', + category: 'Competitive Programming', + iconUrl: SI('geeksforgeeks'), + type: 'simpleicon', + siSlug: 'geeksforgeeks', + baseUrl: 'https://geeksforgeeks.org/user/', + placeholder: 'e.g. https://geeksforgeeks.org/user/yourusername', + }, + { + id: 'kaggle', + name: 'Kaggle', + category: 'Competitive Programming', + iconUrl: SI('kaggle'), + type: 'simpleicon', + siSlug: 'kaggle', + baseUrl: 'https://kaggle.com/', + placeholder: 'e.g. https://kaggle.com/yourusername', + }, - { - id: 'producthunt', - name: 'Product Hunt', - category: 'Professional', - iconUrl: SI('producthunt'), - type: 'simpleicon', - siSlug: 'producthunt', - baseUrl: 'https://producthunt.com/@', - placeholder: 'e.g. https://producthunt.com/@yourusername', - }, - { - id: 'behance', - name: 'Behance', - category: 'Professional', - iconUrl: SI('behance'), - type: 'simpleicon', - siSlug: 'behance', - baseUrl: 'https://behance.net/', - placeholder: 'e.g. https://behance.net/yourusername', - }, - { - id: 'dribbble', - name: 'Dribbble', - category: 'Professional', - iconUrl: SI('dribbble'), - type: 'simpleicon', - siSlug: 'dribbble', - baseUrl: 'https://dribbble.com/', - placeholder: 'e.g. https://dribbble.com/yourusername', - }, + { + id: 'producthunt', + name: 'Product Hunt', + category: 'Professional', + iconUrl: SI('producthunt'), + type: 'simpleicon', + siSlug: 'producthunt', + baseUrl: 'https://producthunt.com/@', + placeholder: 'e.g. https://producthunt.com/@yourusername', + }, + { + id: 'behance', + name: 'Behance', + category: 'Professional', + iconUrl: SI('behance'), + type: 'simpleicon', + siSlug: 'behance', + baseUrl: 'https://behance.net/', + placeholder: 'e.g. https://behance.net/yourusername', + }, + { + id: 'dribbble', + name: 'Dribbble', + category: 'Professional', + iconUrl: SI('dribbble'), + type: 'simpleicon', + siSlug: 'dribbble', + baseUrl: 'https://dribbble.com/', + placeholder: 'e.g. https://dribbble.com/yourusername', + }, - { - id: 'twitch', - name: 'Twitch', - category: 'Streaming', - iconUrl: SI('twitch'), - type: 'simpleicon', - siSlug: 'twitch', - baseUrl: 'https://twitch.tv/', - placeholder: 'e.g. https://twitch.tv/yourchannel', - }, - { - id: 'spotify', - name: 'Spotify', - category: 'Streaming', - iconUrl: SI('spotify'), - type: 'simpleicon', - siSlug: 'spotify', - baseUrl: 'https://open.spotify.com/user/', - placeholder: 'e.g. https://open.spotify.com/user/yourusername', - }, + { + id: 'twitch', + name: 'Twitch', + category: 'Streaming', + iconUrl: SI('twitch'), + type: 'simpleicon', + siSlug: 'twitch', + baseUrl: 'https://twitch.tv/', + placeholder: 'e.g. https://twitch.tv/yourchannel', + }, + { + id: 'spotify', + name: 'Spotify', + category: 'Streaming', + iconUrl: SI('spotify'), + type: 'simpleicon', + siSlug: 'spotify', + baseUrl: 'https://open.spotify.com/user/', + placeholder: 'e.g. https://open.spotify.com/user/yourusername', + }, - { - id: 'email', - name: 'Email', - category: 'Contact', - iconUrl: SI('gmail'), - type: 'simpleicon', - siSlug: 'gmail', - baseUrl: 'mailto:', - placeholder: 'e.g. youremail@example.com', - }, - { - id: 'telegram', - name: 'Telegram', - category: 'Contact', - iconUrl: SI('telegram'), - type: 'simpleicon', - siSlug: 'telegram', - baseUrl: 'https://t.me/', - placeholder: 'e.g. https://t.me/yourusername', - }, - { - id: 'whatsapp', - name: 'WhatsApp', - category: 'Contact', - iconUrl: SI('whatsapp'), - type: 'simpleicon', - siSlug: 'whatsapp', - baseUrl: 'https://wa.me/', - placeholder: 'e.g. https://wa.me/1234567890', - }, - { - id: 'signal', - name: 'Signal', - category: 'Contact', - iconUrl: SI('signal'), - type: 'simpleicon', - siSlug: 'signal', - baseUrl: 'https://signal.me/#p/', - placeholder: 'e.g. https://signal.me/#p/yourhandle', - }, + { + id: 'email', + name: 'Email', + category: 'Contact', + iconUrl: SI('gmail'), + type: 'simpleicon', + siSlug: 'gmail', + baseUrl: 'mailto:', + placeholder: 'e.g. youremail@example.com', + }, + { + id: 'telegram', + name: 'Telegram', + category: 'Contact', + iconUrl: SI('telegram'), + type: 'simpleicon', + siSlug: 'telegram', + baseUrl: 'https://t.me/', + placeholder: 'e.g. https://t.me/yourusername', + }, + { + id: 'whatsapp', + name: 'WhatsApp', + category: 'Contact', + iconUrl: SI('whatsapp'), + type: 'simpleicon', + siSlug: 'whatsapp', + baseUrl: 'https://wa.me/', + placeholder: 'e.g. https://wa.me/1234567890', + }, + { + id: 'signal', + name: 'Signal', + category: 'Contact', + iconUrl: SI('signal'), + type: 'simpleicon', + siSlug: 'signal', + baseUrl: 'https://signal.me/#p/', + placeholder: 'e.g. https://signal.me/#p/yourhandle', + }, - { - id: 'website', - name: 'Personal Website', - category: 'Portfolio', - iconUrl: SI('googlechrome'), - type: 'simpleicon', - siSlug: 'googlechrome', - baseUrl: 'https://', - placeholder: 'e.g. https://yourwebsite.com', - }, - { - id: 'substack', - name: 'Substack', - category: 'Portfolio', - iconUrl: SI('substack'), - type: 'simpleicon', - siSlug: 'substack', - baseUrl: 'https://substack.com/@', - placeholder: 'e.g. https://substack.com/@yourusername', - }, + { + id: 'website', + name: 'Personal Website', + category: 'Portfolio', + iconUrl: SI('googlechrome'), + type: 'simpleicon', + siSlug: 'googlechrome', + baseUrl: 'https://', + placeholder: 'e.g. https://yourwebsite.com', + }, + { + id: 'substack', + name: 'Substack', + category: 'Portfolio', + iconUrl: SI('substack'), + type: 'simpleicon', + siSlug: 'substack', + baseUrl: 'https://substack.com/@', + placeholder: 'e.g. https://substack.com/@yourusername', + }, - { - id: 'buymeacoffee', - name: 'Buy Me a Coffee', - category: 'Support', - iconUrl: SI('buymeacoffee'), - type: 'simpleicon', - siSlug: 'buymeacoffee', - baseUrl: 'https://buymeacoffee.com/', - placeholder: 'e.g. https://buymeacoffee.com/yourusername', - }, - { - id: 'patreon', - name: 'Patreon', - category: 'Support', - iconUrl: SI('patreon'), - type: 'simpleicon', - siSlug: 'patreon', - baseUrl: 'https://patreon.com/', - placeholder: 'e.g. https://patreon.com/yourusername', - }, - { - id: 'kofi', - name: 'Ko-fi', - category: 'Support', - iconUrl: SI('kofi'), - type: 'simpleicon', - siSlug: 'kofi', - baseUrl: 'https://ko-fi.com/', - placeholder: 'e.g. https://ko-fi.com/yourusername', - }, - { - id: 'githubsponsors', - name: 'GitHub Sponsors', - category: 'Support', - iconUrl: SI('githubsponsors'), - type: 'simpleicon', - siSlug: 'githubsponsors', - baseUrl: 'https://github.com/sponsors/', - placeholder: 'e.g. https://github.com/sponsors/yourusername', - }, - { - id: 'opencollective', - name: 'Open Collective', - category: 'Support', - iconUrl: SI('opencollective'), - type: 'simpleicon', - siSlug: 'opencollective', - baseUrl: 'https://opencollective.com/', - placeholder: 'e.g. https://opencollective.com/yourname', - }, - { - id: 'kick', - name: 'Kick', - category: 'Streaming', - iconUrl: SI('kick'), - type: 'simpleicon', - siSlug: 'kick', - baseUrl: 'https://kick.com/', - placeholder: 'e.g. https://kick.com/yourchannel', - }, - { - id: 'odysee', - name: 'Odysee', - category: 'Streaming', - iconUrl: SI('odysee'), - type: 'simpleicon', - siSlug: 'odysee', - baseUrl: 'https://odysee.com/@', - placeholder: 'e.g. https://odysee.com/@yourchannel', - }, - { - id: 'huggingface', - name: 'Hugging Face', - category: 'Developer', - iconUrl: SI('huggingface'), - type: 'simpleicon', - siSlug: 'huggingface', - baseUrl: 'https://huggingface.co/', - placeholder: 'e.g. https://huggingface.co/yourname', - }, -].sort((a, b) => a.name.localeCompare(b.name)); + { + id: 'buymeacoffee', + name: 'Buy Me a Coffee', + category: 'Support', + iconUrl: SI('buymeacoffee'), + type: 'simpleicon', + siSlug: 'buymeacoffee', + baseUrl: 'https://buymeacoffee.com/', + placeholder: 'e.g. https://buymeacoffee.com/yourusername', + }, + { + id: 'patreon', + name: 'Patreon', + category: 'Support', + iconUrl: SI('patreon'), + type: 'simpleicon', + siSlug: 'patreon', + baseUrl: 'https://patreon.com/', + placeholder: 'e.g. https://patreon.com/yourusername', + }, + { + id: 'kofi', + name: 'Ko-fi', + category: 'Support', + iconUrl: SI('kofi'), + type: 'simpleicon', + siSlug: 'kofi', + baseUrl: 'https://ko-fi.com/', + placeholder: 'e.g. https://ko-fi.com/yourusername', + }, + { + id: 'githubsponsors', + name: 'GitHub Sponsors', + category: 'Support', + iconUrl: SI('githubsponsors'), + type: 'simpleicon', + siSlug: 'githubsponsors', + baseUrl: 'https://github.com/sponsors/', + placeholder: 'e.g. https://github.com/sponsors/yourusername', + }, + { + id: 'opencollective', + name: 'Open Collective', + category: 'Support', + iconUrl: SI('opencollective'), + type: 'simpleicon', + siSlug: 'opencollective', + baseUrl: 'https://opencollective.com/', + placeholder: 'e.g. https://opencollective.com/yourname', + }, + { + id: 'kick', + name: 'Kick', + category: 'Streaming', + iconUrl: SI('kick'), + type: 'simpleicon', + siSlug: 'kick', + baseUrl: 'https://kick.com/', + placeholder: 'e.g. https://kick.com/yourchannel', + }, + { + id: 'odysee', + name: 'Odysee', + category: 'Streaming', + iconUrl: SI('odysee'), + type: 'simpleicon', + siSlug: 'odysee', + baseUrl: 'https://odysee.com/@', + placeholder: 'e.g. https://odysee.com/@yourchannel', + }, + { + id: 'huggingface', + name: 'Hugging Face', + category: 'Developer', + iconUrl: SI('huggingface'), + type: 'simpleicon', + siSlug: 'huggingface', + baseUrl: 'https://huggingface.co/', + placeholder: 'e.g. https://huggingface.co/yourname', + }, + ] as Social[] +).sort((a, b) => a.name.localeCompare(b.name)); export const SOCIAL_CATEGORIES: SocialCategory[] = [ 'Social Media', From dff1d4497037e5857c92c780fa818c2d58aa2518 Mon Sep 17 00:00:00 2001 From: pisum-sativum Date: Wed, 22 Jul 2026 22:19:30 +0530 Subject: [PATCH 4/9] fix: resolve GraphQL request deduplication and sanitize PAT errors (#6239) --- lib/github.ts | 84 ++++++++++++++------------------------------------- 1 file changed, 23 insertions(+), 61 deletions(-) diff --git a/lib/github.ts b/lib/github.ts index bc6ac634e..c5ac7da67 100644 --- a/lib/github.ts +++ b/lib/github.ts @@ -287,13 +287,13 @@ export async function fetchWithRetry( } if (didThrow) { - if (options.signal?.aborted) throw fetchError; + if (options.signal?.aborted) throw new Error('AbortError'); const isTimeoutAbort = isAbortError(fetchError); if (attempt >= MAX_RETRIES) { if (isTimeoutAbort) { throw new Error(`GitHub API request timed out after ${resolvedTimeout / 1000}s`); } - throw fetchError; + throw new Error(fetchError instanceof Error ? fetchError.message : String(fetchError)); } const delay = getJitteredBackoff(attempt); await new Promise((resolve) => setTimeout(resolve, delay)); @@ -910,13 +910,6 @@ export async function fetchGitHubContributions( const loadWithTimeout = async (): Promise => { const controller = new AbortController(); - if (options.signal) { - if (options.signal.aborted) { - controller.abort(); - } else { - options.signal.addEventListener('abort', () => controller.abort(), { once: true }); - } - } let timerId = null; const timeoutPromise = new Promise((_, reject) => { @@ -941,10 +934,7 @@ export async function fetchGitHubContributions( } }; - const coalescedLoad = () => { - if (options.signal) { - return loadWithTimeout(); - } + const coalescedLoad = async () => { let pending = activeContributionsPromises.get(key); if (!pending) { pending = loadWithTimeout().finally(() => { @@ -959,57 +949,29 @@ export async function fetchGitHubContributions( timer.unref(); } } - return pending; - }; - if (options.signal) { - if (options.bypassCache || options.forceRefresh) { - try { - return await loadWithTimeout(); - } catch (err: unknown) { - if (shouldFallbackOnError(err)) { - const staleData = await contributionsCache.get(key); - if (staleData) { - logger.warn('GitHub API fetch failed, falling back to stale cache', { - component: 'GitHub API', - username, - error: err, - }); - return { - ...staleData, - isOfflineFallback: true, - }; - } - return getMockContributions(); - } - throw err; - } - } - const cached = await contributionsCache.get(key); - if (cached !== null && !shouldFetch(cached)) { - return cached; + if (!options.signal) { + return pending; } - try { - return await loadWithTimeout(); - } catch (err: unknown) { - if (shouldFallbackOnError(err)) { - const staleData = await contributionsCache.get(key); - if (staleData) { - logger.warn('GitHub API fetch failed, falling back to stale cache', { - component: 'GitHub API', - username, - error: err, - }); - return { - ...staleData, - isOfflineFallback: true, - }; + + return new Promise((resolve, reject) => { + if (options.signal?.aborted) return reject(new Error('AbortError')); + + const onAbort = () => reject(new Error('AbortError')); + options.signal?.addEventListener('abort', onAbort, { once: true }); + + pending!.then( + (val) => { + options.signal?.removeEventListener('abort', onAbort); + resolve(val); + }, + (err) => { + options.signal?.removeEventListener('abort', onAbort); + reject(err); } - return getMockContributions(); - } - throw err; - } - } + ); + }); + }; if (options.bypassCache || options.forceRefresh) { try { From 2131c06de417275d36037140703d8a81e69bc922 Mon Sep 17 00:00:00 2001 From: pisum-sativum Date: Thu, 23 Jul 2026 23:37:36 +0530 Subject: [PATCH 5/9] revert: remove unrelated changes to socials.ts and ci-analytics.ts --- app/generator/data/socials.ts | 1166 +++++++++++++++---------------- services/github/ci-analytics.ts | 2 +- 2 files changed, 583 insertions(+), 585 deletions(-) diff --git a/app/generator/data/socials.ts b/app/generator/data/socials.ts index 567b2accb..dfcf8d3cf 100644 --- a/app/generator/data/socials.ts +++ b/app/generator/data/socials.ts @@ -4,597 +4,595 @@ const SI = (slug: string) => `https://cdn.simpleicons.org/${slug}`; const DI = (name: string, variant = 'original') => `https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/${name}/${name}-${variant}.svg`; -export const SOCIALS: Social[] = ( - [ - { - id: 'twitter', - name: 'X (Twitter)', - category: 'Social Media', - iconUrl: SI('x'), - type: 'simpleicon', - siSlug: 'x', - baseUrl: 'https://x.com/', - placeholder: 'e.g. https://x.com/yourhandle', - }, - { - id: 'linkedin', - name: 'LinkedIn', - category: 'Professional', - iconUrl: DI('linkedin'), - type: 'devicon', - siSlug: 'linkedin', - baseUrl: 'https://linkedin.com/in/', - placeholder: 'e.g. https://linkedin.com/in/yourname', - }, - { - id: 'instagram', - name: 'Instagram', - category: 'Social Media', - iconUrl: SI('instagram'), - type: 'simpleicon', - siSlug: 'instagram', - baseUrl: 'https://instagram.com/', - placeholder: 'e.g. https://instagram.com/yourhandle', - }, - { - id: 'facebook', - name: 'Facebook', - category: 'Social Media', - iconUrl: SI('facebook'), - type: 'simpleicon', - siSlug: 'facebook', - baseUrl: 'https://facebook.com/', - placeholder: 'e.g. https://facebook.com/yourprofile', - }, - { - id: 'youtube', - name: 'YouTube', - category: 'Social Media', - iconUrl: SI('youtube'), - type: 'simpleicon', - siSlug: 'youtube', - baseUrl: 'https://youtube.com/@', - placeholder: 'e.g. https://youtube.com/@yourchannel', - }, - { - id: 'tiktok', - name: 'TikTok', - category: 'Social Media', - iconUrl: SI('tiktok'), - type: 'simpleicon', - siSlug: 'tiktok', - baseUrl: 'https://tiktok.com/@', - placeholder: 'e.g. https://tiktok.com/@yourhandle', - }, - { - id: 'discord', - name: 'Discord', - category: 'Social Media', - iconUrl: SI('discord'), - type: 'simpleicon', - siSlug: 'discord', - baseUrl: 'https://discord.gg/', - placeholder: 'e.g. https://discord.gg/yourserver', - }, - { - id: 'reddit', - name: 'Reddit', - category: 'Social Media', - iconUrl: SI('reddit'), - type: 'simpleicon', - siSlug: 'reddit', - baseUrl: 'https://reddit.com/u/', - placeholder: 'e.g. https://reddit.com/u/yourname', - }, - { - id: 'mastodon', - name: 'Mastodon', - category: 'Social Media', - iconUrl: SI('mastodon'), - type: 'simpleicon', - siSlug: 'mastodon', - baseUrl: 'https://mastodon.social/@', - placeholder: 'e.g. https://mastodon.social/@yourhandle', - }, - { - id: 'bluesky', - name: 'Bluesky', - category: 'Social Media', - iconUrl: SI('bluesky'), - type: 'simpleicon', - siSlug: 'bluesky', - baseUrl: 'https://bsky.app/profile/', - placeholder: 'e.g. https://bsky.app/profile/yourhandle', - }, - { - id: 'threads', - name: 'Threads', - category: 'Social Media', - iconUrl: SI('threads'), - type: 'simpleicon', - siSlug: 'threads', - baseUrl: 'https://threads.net/@', - placeholder: 'e.g. https://threads.net/@yourhandle', - }, - { - id: 'snapchat', - name: 'Snapchat', - category: 'Social Media', - iconUrl: SI('snapchat'), - type: 'simpleicon', - siSlug: 'snapchat', - baseUrl: 'https://snapchat.com/add/', - placeholder: 'e.g. https://snapchat.com/add/yourusername', - }, - { - id: 'pinterest', - name: 'Pinterest', - category: 'Social Media', - iconUrl: SI('pinterest'), - type: 'simpleicon', - siSlug: 'pinterest', - baseUrl: 'https://pinterest.com/', - placeholder: 'e.g. https://pinterest.com/yourname', - }, - { - id: 'vimeo', - name: 'Vimeo', - category: 'Social Media', - iconUrl: SI('vimeo'), - type: 'simpleicon', - siSlug: 'vimeo', - baseUrl: 'https://vimeo.com/', - placeholder: 'e.g. https://vimeo.com/yourusername', - }, - { - id: 'xing', - name: 'Xing', - category: 'Professional', - iconUrl: SI('xing'), - type: 'simpleicon', - siSlug: 'xing', - baseUrl: 'https://www.xing.com/profile/', - placeholder: 'e.g. https://www.xing.com/profile/yourname', - }, +export const SOCIALS: Social[] = [ + { + id: 'twitter', + name: 'X (Twitter)', + category: 'Social Media', + iconUrl: SI('x'), + type: 'simpleicon', + siSlug: 'x', + baseUrl: 'https://x.com/', + placeholder: 'e.g. https://x.com/yourhandle', + }, + { + id: 'linkedin', + name: 'LinkedIn', + category: 'Professional', + iconUrl: DI('linkedin'), + type: 'devicon', + siSlug: 'linkedin', + baseUrl: 'https://linkedin.com/in/', + placeholder: 'e.g. https://linkedin.com/in/yourname', + }, + { + id: 'instagram', + name: 'Instagram', + category: 'Social Media', + iconUrl: SI('instagram'), + type: 'simpleicon', + siSlug: 'instagram', + baseUrl: 'https://instagram.com/', + placeholder: 'e.g. https://instagram.com/yourhandle', + }, + { + id: 'facebook', + name: 'Facebook', + category: 'Social Media', + iconUrl: SI('facebook'), + type: 'simpleicon', + siSlug: 'facebook', + baseUrl: 'https://facebook.com/', + placeholder: 'e.g. https://facebook.com/yourprofile', + }, + { + id: 'youtube', + name: 'YouTube', + category: 'Social Media', + iconUrl: SI('youtube'), + type: 'simpleicon', + siSlug: 'youtube', + baseUrl: 'https://youtube.com/@', + placeholder: 'e.g. https://youtube.com/@yourchannel', + }, + { + id: 'tiktok', + name: 'TikTok', + category: 'Social Media', + iconUrl: SI('tiktok'), + type: 'simpleicon', + siSlug: 'tiktok', + baseUrl: 'https://tiktok.com/@', + placeholder: 'e.g. https://tiktok.com/@yourhandle', + }, + { + id: 'discord', + name: 'Discord', + category: 'Social Media', + iconUrl: SI('discord'), + type: 'simpleicon', + siSlug: 'discord', + baseUrl: 'https://discord.gg/', + placeholder: 'e.g. https://discord.gg/yourserver', + }, + { + id: 'reddit', + name: 'Reddit', + category: 'Social Media', + iconUrl: SI('reddit'), + type: 'simpleicon', + siSlug: 'reddit', + baseUrl: 'https://reddit.com/u/', + placeholder: 'e.g. https://reddit.com/u/yourname', + }, + { + id: 'mastodon', + name: 'Mastodon', + category: 'Social Media', + iconUrl: SI('mastodon'), + type: 'simpleicon', + siSlug: 'mastodon', + baseUrl: 'https://mastodon.social/@', + placeholder: 'e.g. https://mastodon.social/@yourhandle', + }, + { + id: 'bluesky', + name: 'Bluesky', + category: 'Social Media', + iconUrl: SI('bluesky'), + type: 'simpleicon', + siSlug: 'bluesky', + baseUrl: 'https://bsky.app/profile/', + placeholder: 'e.g. https://bsky.app/profile/yourhandle', + }, + { + id: 'threads', + name: 'Threads', + category: 'Social Media', + iconUrl: SI('threads'), + type: 'simpleicon', + siSlug: 'threads', + baseUrl: 'https://threads.net/@', + placeholder: 'e.g. https://threads.net/@yourhandle', + }, + { + id: 'snapchat', + name: 'Snapchat', + category: 'Social Media', + iconUrl: SI('snapchat'), + type: 'simpleicon', + siSlug: 'snapchat', + baseUrl: 'https://snapchat.com/add/', + placeholder: 'e.g. https://snapchat.com/add/yourusername', + }, + { + id: 'pinterest', + name: 'Pinterest', + category: 'Social Media', + iconUrl: SI('pinterest'), + type: 'simpleicon', + siSlug: 'pinterest', + baseUrl: 'https://pinterest.com/', + placeholder: 'e.g. https://pinterest.com/yourname', + }, + { + id: 'vimeo', + name: 'Vimeo', + category: 'Social Media', + iconUrl: SI('vimeo'), + type: 'simpleicon', + siSlug: 'vimeo', + baseUrl: 'https://vimeo.com/', + placeholder: 'e.g. https://vimeo.com/yourusername', + }, + { + id: 'xing', + name: 'Xing', + category: 'Professional', + iconUrl: SI('xing'), + type: 'simpleicon', + siSlug: 'xing', + baseUrl: 'https://www.xing.com/profile/', + placeholder: 'e.g. https://www.xing.com/profile/yourname', + }, - { - id: 'github', - name: 'GitHub', - category: 'Developer', - iconUrl: DI('github'), - type: 'devicon', - siSlug: 'github', - baseUrl: 'https://github.com/', - placeholder: 'e.g. https://github.com/yourusername', - }, - { - id: 'gitlabprofile', - name: 'GitLab', - category: 'Developer', - iconUrl: DI('gitlab'), - type: 'devicon', - siSlug: 'gitlab', - baseUrl: 'https://gitlab.com/', - placeholder: 'e.g. https://gitlab.com/yourusername', - }, - { - id: 'bitbucket', - name: 'Bitbucket', - category: 'Developer', - iconUrl: DI('bitbucket'), - type: 'devicon', - siSlug: 'bitbucket', - baseUrl: 'https://bitbucket.org/', - placeholder: 'e.g. https://bitbucket.org/yourusername', - }, - { - id: 'stackoverflow', - name: 'Stack Overflow', - category: 'Developer', - iconUrl: DI('stackoverflow'), - type: 'devicon', - siSlug: 'stackoverflow', - baseUrl: 'https://stackoverflow.com/users/', - placeholder: 'e.g. https://stackoverflow.com/users/123456', - }, - { - id: 'devto', - name: 'Dev.to', - category: 'Developer', - iconUrl: SI('devdotto'), - type: 'simpleicon', - siSlug: 'devdotto', - baseUrl: 'https://dev.to/', - placeholder: 'e.g. https://dev.to/yourusername', - }, - { - id: 'hashnode', - name: 'Hashnode', - category: 'Developer', - iconUrl: SI('hashnode'), - type: 'simpleicon', - siSlug: 'hashnode', - baseUrl: 'https://hashnode.com/@', - placeholder: 'e.g. https://hashnode.com/@yourusername', - }, - { - id: 'medium', - name: 'Medium', - category: 'Developer', - iconUrl: SI('medium'), - type: 'simpleicon', - siSlug: 'medium', - baseUrl: 'https://medium.com/@', - placeholder: 'e.g. https://medium.com/@yourusername', - }, - { - id: 'npm', - name: 'npm', - category: 'Developer', - iconUrl: SI('npm'), - type: 'simpleicon', - siSlug: 'npm', - baseUrl: 'https://npmjs.com/~', - placeholder: 'e.g. https://npmjs.com/~yourusername', - }, - { - id: 'pypi', - name: 'PyPI', - category: 'Developer', - iconUrl: SI('pypi'), - type: 'simpleicon', - siSlug: 'pypi', - baseUrl: 'https://pypi.org/user/', - placeholder: 'e.g. https://pypi.org/user/yourusername', - }, - { - id: 'dockerhub', - name: 'Docker Hub', - category: 'Developer', - iconUrl: DI('docker'), - type: 'devicon', - siSlug: 'docker', - baseUrl: 'https://hub.docker.com/u/', - placeholder: 'e.g. https://hub.docker.com/u/yourusername', - }, - { - id: 'replit', - name: 'Replit', - category: 'Developer', - iconUrl: SI('replit'), - type: 'simpleicon', - siSlug: 'replit', - baseUrl: 'https://replit.com/@', - placeholder: 'e.g. https://replit.com/@yourusername', - }, - { - id: 'codepen', - name: 'CodePen', - category: 'Developer', - iconUrl: DI('codepen'), - type: 'devicon', - siSlug: 'codepen', - baseUrl: 'https://codepen.io/', - placeholder: 'e.g. https://codepen.io/yourusername', - }, - { - id: 'codesandbox', - name: 'CodeSandbox', - category: 'Developer', - iconUrl: SI('codesandbox'), - type: 'simpleicon', - siSlug: 'codesandbox', - baseUrl: 'https://codesandbox.io/u/', - placeholder: 'e.g. https://codesandbox.io/u/yourusername', - }, - { - id: 'wakatime', - name: 'WakaTime', - category: 'Developer', - iconUrl: SI('wakatime'), - type: 'simpleicon', - siSlug: 'wakatime', - baseUrl: 'https://wakatime.com/@', - placeholder: 'e.g. https://wakatime.com/@yourusername', - }, + { + id: 'github', + name: 'GitHub', + category: 'Developer', + iconUrl: DI('github'), + type: 'devicon', + siSlug: 'github', + baseUrl: 'https://github.com/', + placeholder: 'e.g. https://github.com/yourusername', + }, + { + id: 'gitlabprofile', + name: 'GitLab', + category: 'Developer', + iconUrl: DI('gitlab'), + type: 'devicon', + siSlug: 'gitlab', + baseUrl: 'https://gitlab.com/', + placeholder: 'e.g. https://gitlab.com/yourusername', + }, + { + id: 'bitbucket', + name: 'Bitbucket', + category: 'Developer', + iconUrl: DI('bitbucket'), + type: 'devicon', + siSlug: 'bitbucket', + baseUrl: 'https://bitbucket.org/', + placeholder: 'e.g. https://bitbucket.org/yourusername', + }, + { + id: 'stackoverflow', + name: 'Stack Overflow', + category: 'Developer', + iconUrl: DI('stackoverflow'), + type: 'devicon', + siSlug: 'stackoverflow', + baseUrl: 'https://stackoverflow.com/users/', + placeholder: 'e.g. https://stackoverflow.com/users/123456', + }, + { + id: 'devto', + name: 'Dev.to', + category: 'Developer', + iconUrl: SI('devdotto'), + type: 'simpleicon', + siSlug: 'devdotto', + baseUrl: 'https://dev.to/', + placeholder: 'e.g. https://dev.to/yourusername', + }, + { + id: 'hashnode', + name: 'Hashnode', + category: 'Developer', + iconUrl: SI('hashnode'), + type: 'simpleicon', + siSlug: 'hashnode', + baseUrl: 'https://hashnode.com/@', + placeholder: 'e.g. https://hashnode.com/@yourusername', + }, + { + id: 'medium', + name: 'Medium', + category: 'Developer', + iconUrl: SI('medium'), + type: 'simpleicon', + siSlug: 'medium', + baseUrl: 'https://medium.com/@', + placeholder: 'e.g. https://medium.com/@yourusername', + }, + { + id: 'npm', + name: 'npm', + category: 'Developer', + iconUrl: SI('npm'), + type: 'simpleicon', + siSlug: 'npm', + baseUrl: 'https://npmjs.com/~', + placeholder: 'e.g. https://npmjs.com/~yourusername', + }, + { + id: 'pypi', + name: 'PyPI', + category: 'Developer', + iconUrl: SI('pypi'), + type: 'simpleicon', + siSlug: 'pypi', + baseUrl: 'https://pypi.org/user/', + placeholder: 'e.g. https://pypi.org/user/yourusername', + }, + { + id: 'dockerhub', + name: 'Docker Hub', + category: 'Developer', + iconUrl: DI('docker'), + type: 'devicon', + siSlug: 'docker', + baseUrl: 'https://hub.docker.com/u/', + placeholder: 'e.g. https://hub.docker.com/u/yourusername', + }, + { + id: 'replit', + name: 'Replit', + category: 'Developer', + iconUrl: SI('replit'), + type: 'simpleicon', + siSlug: 'replit', + baseUrl: 'https://replit.com/@', + placeholder: 'e.g. https://replit.com/@yourusername', + }, + { + id: 'codepen', + name: 'CodePen', + category: 'Developer', + iconUrl: DI('codepen'), + type: 'devicon', + siSlug: 'codepen', + baseUrl: 'https://codepen.io/', + placeholder: 'e.g. https://codepen.io/yourusername', + }, + { + id: 'codesandbox', + name: 'CodeSandbox', + category: 'Developer', + iconUrl: SI('codesandbox'), + type: 'simpleicon', + siSlug: 'codesandbox', + baseUrl: 'https://codesandbox.io/u/', + placeholder: 'e.g. https://codesandbox.io/u/yourusername', + }, + { + id: 'wakatime', + name: 'WakaTime', + category: 'Developer', + iconUrl: SI('wakatime'), + type: 'simpleicon', + siSlug: 'wakatime', + baseUrl: 'https://wakatime.com/@', + placeholder: 'e.g. https://wakatime.com/@yourusername', + }, - { - id: 'leetcode', - name: 'LeetCode', - category: 'Competitive Programming', - iconUrl: SI('leetcode'), - type: 'simpleicon', - siSlug: 'leetcode', - baseUrl: 'https://leetcode.com/', - placeholder: 'e.g. https://leetcode.com/yourusername', - }, - { - id: 'codeforces', - name: 'Codeforces', - category: 'Competitive Programming', - iconUrl: SI('codeforces'), - type: 'simpleicon', - siSlug: 'codeforces', - baseUrl: 'https://codeforces.com/profile/', - placeholder: 'e.g. https://codeforces.com/profile/yourusername', - }, - { - id: 'hackerrank', - name: 'HackerRank', - category: 'Competitive Programming', - iconUrl: SI('hackerrank'), - type: 'simpleicon', - siSlug: 'hackerrank', - baseUrl: 'https://hackerrank.com/', - placeholder: 'e.g. https://hackerrank.com/yourusername', - }, - { - id: 'hackerearth', - name: 'HackerEarth', - category: 'Competitive Programming', - iconUrl: SI('hackerearth'), - type: 'simpleicon', - siSlug: 'hackerearth', - baseUrl: 'https://hackerearth.com/@', - placeholder: 'e.g. https://hackerearth.com/@yourusername', - }, - { - id: 'atcoder', - name: 'AtCoder', - category: 'Competitive Programming', - iconUrl: SI('codementor'), - type: 'simpleicon', - siSlug: 'codementor', - baseUrl: 'https://atcoder.jp/users/', - placeholder: 'e.g. https://atcoder.jp/users/yourusername', - }, - { - id: 'codechef', - name: 'CodeChef', - category: 'Competitive Programming', - iconUrl: SI('codechef'), - type: 'simpleicon', - siSlug: 'codechef', - baseUrl: 'https://codechef.com/users/', - placeholder: 'e.g. https://codechef.com/users/yourusername', - }, - { - id: 'topcoder', - name: 'TopCoder', - category: 'Competitive Programming', - iconUrl: SI('topcoder'), - type: 'simpleicon', - siSlug: 'topcoder', - baseUrl: 'https://topcoder.com/members/', - placeholder: 'e.g. https://topcoder.com/members/yourusername', - }, - { - id: 'codewars', - name: 'Codewars', - category: 'Competitive Programming', - iconUrl: SI('codewars'), - type: 'simpleicon', - siSlug: 'codewars', - baseUrl: 'https://codewars.com/users/', - placeholder: 'e.g. https://codewars.com/users/yourusername', - }, - { - id: 'geeksforgeeks', - name: 'GeeksForGeeks', - category: 'Competitive Programming', - iconUrl: SI('geeksforgeeks'), - type: 'simpleicon', - siSlug: 'geeksforgeeks', - baseUrl: 'https://geeksforgeeks.org/user/', - placeholder: 'e.g. https://geeksforgeeks.org/user/yourusername', - }, - { - id: 'kaggle', - name: 'Kaggle', - category: 'Competitive Programming', - iconUrl: SI('kaggle'), - type: 'simpleicon', - siSlug: 'kaggle', - baseUrl: 'https://kaggle.com/', - placeholder: 'e.g. https://kaggle.com/yourusername', - }, + { + id: 'leetcode', + name: 'LeetCode', + category: 'Competitive Programming', + iconUrl: SI('leetcode'), + type: 'simpleicon', + siSlug: 'leetcode', + baseUrl: 'https://leetcode.com/', + placeholder: 'e.g. https://leetcode.com/yourusername', + }, + { + id: 'codeforces', + name: 'Codeforces', + category: 'Competitive Programming', + iconUrl: SI('codeforces'), + type: 'simpleicon', + siSlug: 'codeforces', + baseUrl: 'https://codeforces.com/profile/', + placeholder: 'e.g. https://codeforces.com/profile/yourusername', + }, + { + id: 'hackerrank', + name: 'HackerRank', + category: 'Competitive Programming', + iconUrl: SI('hackerrank'), + type: 'simpleicon', + siSlug: 'hackerrank', + baseUrl: 'https://hackerrank.com/', + placeholder: 'e.g. https://hackerrank.com/yourusername', + }, + { + id: 'hackerearth', + name: 'HackerEarth', + category: 'Competitive Programming', + iconUrl: SI('hackerearth'), + type: 'simpleicon', + siSlug: 'hackerearth', + baseUrl: 'https://hackerearth.com/@', + placeholder: 'e.g. https://hackerearth.com/@yourusername', + }, + { + id: 'atcoder', + name: 'AtCoder', + category: 'Competitive Programming', + iconUrl: SI('codementor'), + type: 'simpleicon', + siSlug: 'codementor', + baseUrl: 'https://atcoder.jp/users/', + placeholder: 'e.g. https://atcoder.jp/users/yourusername', + }, + { + id: 'codechef', + name: 'CodeChef', + category: 'Competitive Programming', + iconUrl: SI('codechef'), + type: 'simpleicon', + siSlug: 'codechef', + baseUrl: 'https://codechef.com/users/', + placeholder: 'e.g. https://codechef.com/users/yourusername', + }, + { + id: 'topcoder', + name: 'TopCoder', + category: 'Competitive Programming', + iconUrl: SI('topcoder'), + type: 'simpleicon', + siSlug: 'topcoder', + baseUrl: 'https://topcoder.com/members/', + placeholder: 'e.g. https://topcoder.com/members/yourusername', + }, + { + id: 'codewars', + name: 'Codewars', + category: 'Competitive Programming', + iconUrl: SI('codewars'), + type: 'simpleicon', + siSlug: 'codewars', + baseUrl: 'https://codewars.com/users/', + placeholder: 'e.g. https://codewars.com/users/yourusername', + }, + { + id: 'geeksforgeeks', + name: 'GeeksForGeeks', + category: 'Competitive Programming', + iconUrl: SI('geeksforgeeks'), + type: 'simpleicon', + siSlug: 'geeksforgeeks', + baseUrl: 'https://geeksforgeeks.org/user/', + placeholder: 'e.g. https://geeksforgeeks.org/user/yourusername', + }, + { + id: 'kaggle', + name: 'Kaggle', + category: 'Competitive Programming', + iconUrl: SI('kaggle'), + type: 'simpleicon', + siSlug: 'kaggle', + baseUrl: 'https://kaggle.com/', + placeholder: 'e.g. https://kaggle.com/yourusername', + }, - { - id: 'producthunt', - name: 'Product Hunt', - category: 'Professional', - iconUrl: SI('producthunt'), - type: 'simpleicon', - siSlug: 'producthunt', - baseUrl: 'https://producthunt.com/@', - placeholder: 'e.g. https://producthunt.com/@yourusername', - }, - { - id: 'behance', - name: 'Behance', - category: 'Professional', - iconUrl: SI('behance'), - type: 'simpleicon', - siSlug: 'behance', - baseUrl: 'https://behance.net/', - placeholder: 'e.g. https://behance.net/yourusername', - }, - { - id: 'dribbble', - name: 'Dribbble', - category: 'Professional', - iconUrl: SI('dribbble'), - type: 'simpleicon', - siSlug: 'dribbble', - baseUrl: 'https://dribbble.com/', - placeholder: 'e.g. https://dribbble.com/yourusername', - }, + { + id: 'producthunt', + name: 'Product Hunt', + category: 'Professional', + iconUrl: SI('producthunt'), + type: 'simpleicon', + siSlug: 'producthunt', + baseUrl: 'https://producthunt.com/@', + placeholder: 'e.g. https://producthunt.com/@yourusername', + }, + { + id: 'behance', + name: 'Behance', + category: 'Professional', + iconUrl: SI('behance'), + type: 'simpleicon', + siSlug: 'behance', + baseUrl: 'https://behance.net/', + placeholder: 'e.g. https://behance.net/yourusername', + }, + { + id: 'dribbble', + name: 'Dribbble', + category: 'Professional', + iconUrl: SI('dribbble'), + type: 'simpleicon', + siSlug: 'dribbble', + baseUrl: 'https://dribbble.com/', + placeholder: 'e.g. https://dribbble.com/yourusername', + }, - { - id: 'twitch', - name: 'Twitch', - category: 'Streaming', - iconUrl: SI('twitch'), - type: 'simpleicon', - siSlug: 'twitch', - baseUrl: 'https://twitch.tv/', - placeholder: 'e.g. https://twitch.tv/yourchannel', - }, - { - id: 'spotify', - name: 'Spotify', - category: 'Streaming', - iconUrl: SI('spotify'), - type: 'simpleicon', - siSlug: 'spotify', - baseUrl: 'https://open.spotify.com/user/', - placeholder: 'e.g. https://open.spotify.com/user/yourusername', - }, + { + id: 'twitch', + name: 'Twitch', + category: 'Streaming', + iconUrl: SI('twitch'), + type: 'simpleicon', + siSlug: 'twitch', + baseUrl: 'https://twitch.tv/', + placeholder: 'e.g. https://twitch.tv/yourchannel', + }, + { + id: 'spotify', + name: 'Spotify', + category: 'Streaming', + iconUrl: SI('spotify'), + type: 'simpleicon', + siSlug: 'spotify', + baseUrl: 'https://open.spotify.com/user/', + placeholder: 'e.g. https://open.spotify.com/user/yourusername', + }, - { - id: 'email', - name: 'Email', - category: 'Contact', - iconUrl: SI('gmail'), - type: 'simpleicon', - siSlug: 'gmail', - baseUrl: 'mailto:', - placeholder: 'e.g. youremail@example.com', - }, - { - id: 'telegram', - name: 'Telegram', - category: 'Contact', - iconUrl: SI('telegram'), - type: 'simpleicon', - siSlug: 'telegram', - baseUrl: 'https://t.me/', - placeholder: 'e.g. https://t.me/yourusername', - }, - { - id: 'whatsapp', - name: 'WhatsApp', - category: 'Contact', - iconUrl: SI('whatsapp'), - type: 'simpleicon', - siSlug: 'whatsapp', - baseUrl: 'https://wa.me/', - placeholder: 'e.g. https://wa.me/1234567890', - }, - { - id: 'signal', - name: 'Signal', - category: 'Contact', - iconUrl: SI('signal'), - type: 'simpleicon', - siSlug: 'signal', - baseUrl: 'https://signal.me/#p/', - placeholder: 'e.g. https://signal.me/#p/yourhandle', - }, + { + id: 'email', + name: 'Email', + category: 'Contact', + iconUrl: SI('gmail'), + type: 'simpleicon', + siSlug: 'gmail', + baseUrl: 'mailto:', + placeholder: 'e.g. youremail@example.com', + }, + { + id: 'telegram', + name: 'Telegram', + category: 'Contact', + iconUrl: SI('telegram'), + type: 'simpleicon', + siSlug: 'telegram', + baseUrl: 'https://t.me/', + placeholder: 'e.g. https://t.me/yourusername', + }, + { + id: 'whatsapp', + name: 'WhatsApp', + category: 'Contact', + iconUrl: SI('whatsapp'), + type: 'simpleicon', + siSlug: 'whatsapp', + baseUrl: 'https://wa.me/', + placeholder: 'e.g. https://wa.me/1234567890', + }, + { + id: 'signal', + name: 'Signal', + category: 'Contact', + iconUrl: SI('signal'), + type: 'simpleicon', + siSlug: 'signal', + baseUrl: 'https://signal.me/#p/', + placeholder: 'e.g. https://signal.me/#p/yourhandle', + }, - { - id: 'website', - name: 'Personal Website', - category: 'Portfolio', - iconUrl: SI('googlechrome'), - type: 'simpleicon', - siSlug: 'googlechrome', - baseUrl: 'https://', - placeholder: 'e.g. https://yourwebsite.com', - }, - { - id: 'substack', - name: 'Substack', - category: 'Portfolio', - iconUrl: SI('substack'), - type: 'simpleicon', - siSlug: 'substack', - baseUrl: 'https://substack.com/@', - placeholder: 'e.g. https://substack.com/@yourusername', - }, + { + id: 'website', + name: 'Personal Website', + category: 'Portfolio', + iconUrl: SI('googlechrome'), + type: 'simpleicon', + siSlug: 'googlechrome', + baseUrl: 'https://', + placeholder: 'e.g. https://yourwebsite.com', + }, + { + id: 'substack', + name: 'Substack', + category: 'Portfolio', + iconUrl: SI('substack'), + type: 'simpleicon', + siSlug: 'substack', + baseUrl: 'https://substack.com/@', + placeholder: 'e.g. https://substack.com/@yourusername', + }, - { - id: 'buymeacoffee', - name: 'Buy Me a Coffee', - category: 'Support', - iconUrl: SI('buymeacoffee'), - type: 'simpleicon', - siSlug: 'buymeacoffee', - baseUrl: 'https://buymeacoffee.com/', - placeholder: 'e.g. https://buymeacoffee.com/yourusername', - }, - { - id: 'patreon', - name: 'Patreon', - category: 'Support', - iconUrl: SI('patreon'), - type: 'simpleicon', - siSlug: 'patreon', - baseUrl: 'https://patreon.com/', - placeholder: 'e.g. https://patreon.com/yourusername', - }, - { - id: 'kofi', - name: 'Ko-fi', - category: 'Support', - iconUrl: SI('kofi'), - type: 'simpleicon', - siSlug: 'kofi', - baseUrl: 'https://ko-fi.com/', - placeholder: 'e.g. https://ko-fi.com/yourusername', - }, - { - id: 'githubsponsors', - name: 'GitHub Sponsors', - category: 'Support', - iconUrl: SI('githubsponsors'), - type: 'simpleicon', - siSlug: 'githubsponsors', - baseUrl: 'https://github.com/sponsors/', - placeholder: 'e.g. https://github.com/sponsors/yourusername', - }, - { - id: 'opencollective', - name: 'Open Collective', - category: 'Support', - iconUrl: SI('opencollective'), - type: 'simpleicon', - siSlug: 'opencollective', - baseUrl: 'https://opencollective.com/', - placeholder: 'e.g. https://opencollective.com/yourname', - }, - { - id: 'kick', - name: 'Kick', - category: 'Streaming', - iconUrl: SI('kick'), - type: 'simpleicon', - siSlug: 'kick', - baseUrl: 'https://kick.com/', - placeholder: 'e.g. https://kick.com/yourchannel', - }, - { - id: 'odysee', - name: 'Odysee', - category: 'Streaming', - iconUrl: SI('odysee'), - type: 'simpleicon', - siSlug: 'odysee', - baseUrl: 'https://odysee.com/@', - placeholder: 'e.g. https://odysee.com/@yourchannel', - }, - { - id: 'huggingface', - name: 'Hugging Face', - category: 'Developer', - iconUrl: SI('huggingface'), - type: 'simpleicon', - siSlug: 'huggingface', - baseUrl: 'https://huggingface.co/', - placeholder: 'e.g. https://huggingface.co/yourname', - }, - ] as Social[] -).sort((a, b) => a.name.localeCompare(b.name)); + { + id: 'buymeacoffee', + name: 'Buy Me a Coffee', + category: 'Support', + iconUrl: SI('buymeacoffee'), + type: 'simpleicon', + siSlug: 'buymeacoffee', + baseUrl: 'https://buymeacoffee.com/', + placeholder: 'e.g. https://buymeacoffee.com/yourusername', + }, + { + id: 'patreon', + name: 'Patreon', + category: 'Support', + iconUrl: SI('patreon'), + type: 'simpleicon', + siSlug: 'patreon', + baseUrl: 'https://patreon.com/', + placeholder: 'e.g. https://patreon.com/yourusername', + }, + { + id: 'kofi', + name: 'Ko-fi', + category: 'Support', + iconUrl: SI('kofi'), + type: 'simpleicon', + siSlug: 'kofi', + baseUrl: 'https://ko-fi.com/', + placeholder: 'e.g. https://ko-fi.com/yourusername', + }, + { + id: 'githubsponsors', + name: 'GitHub Sponsors', + category: 'Support', + iconUrl: SI('githubsponsors'), + type: 'simpleicon', + siSlug: 'githubsponsors', + baseUrl: 'https://github.com/sponsors/', + placeholder: 'e.g. https://github.com/sponsors/yourusername', + }, + { + id: 'opencollective', + name: 'Open Collective', + category: 'Support', + iconUrl: SI('opencollective'), + type: 'simpleicon', + siSlug: 'opencollective', + baseUrl: 'https://opencollective.com/', + placeholder: 'e.g. https://opencollective.com/yourname', + }, + { + id: 'kick', + name: 'Kick', + category: 'Streaming', + iconUrl: SI('kick'), + type: 'simpleicon', + siSlug: 'kick', + baseUrl: 'https://kick.com/', + placeholder: 'e.g. https://kick.com/yourchannel', + }, + { + id: 'odysee', + name: 'Odysee', + category: 'Streaming', + iconUrl: SI('odysee'), + type: 'simpleicon', + siSlug: 'odysee', + baseUrl: 'https://odysee.com/@', + placeholder: 'e.g. https://odysee.com/@yourchannel', + }, + { + id: 'huggingface', + name: 'Hugging Face', + category: 'Developer', + iconUrl: SI('huggingface'), + type: 'simpleicon', + siSlug: 'huggingface', + baseUrl: 'https://huggingface.co/', + placeholder: 'e.g. https://huggingface.co/yourname', + }, +]; export const SOCIAL_CATEGORIES: SocialCategory[] = [ 'Social Media', diff --git a/services/github/ci-analytics.ts b/services/github/ci-analytics.ts index fdcdd5b8d..6c67ebe79 100644 --- a/services/github/ci-analytics.ts +++ b/services/github/ci-analytics.ts @@ -14,7 +14,7 @@ import type { const GITHUB_REST_URL = 'https://api.github.com'; const MAX_REPO_PAGES = 2; -const MAX_ACTION_PAGES = 1; +const MAX_ACTION_PAGES = 2; const MAX_FETCH_TARGETS = 5; const cache = new DistributedCache(500); From a2e1f13fd3d6cc8b164242b1ebcd70b97a5f9a34 Mon Sep 17 00:00:00 2001 From: pisum-sativum Date: Thu, 23 Jul 2026 23:57:32 +0530 Subject: [PATCH 6/9] fix(burnout): import missing Image component and format code style --- components/InteractiveViewer.tsx | 79 +++++++++++++------------ components/burnout/BurnoutRiskTable.tsx | 1 + types/achievements.ts | 6 +- 3 files changed, 48 insertions(+), 38 deletions(-) diff --git a/components/InteractiveViewer.tsx b/components/InteractiveViewer.tsx index ba6c65a49..0f29e9459 100644 --- a/components/InteractiveViewer.tsx +++ b/components/InteractiveViewer.tsx @@ -25,20 +25,23 @@ interface ParallaxParticle { * Deterministic math prevents random values from causing SSR/CSR mismatches. */ function buildParticles(): ParallaxParticle[] { const colors = ['#10b981', '#8b5cf6', '#06b6d4', '#3b82f6', '#f59e0b']; - return Array.from({ length: PARALLAX_PARTICLE_COUNT }, (_, i): ParallaxParticle => ({ - id: i, - // Spread particles across the container using prime-number strides - x: (i * 17 + 11) % 100, - y: (i * 23 + 7) % 100, - size: 4 + (i % 5) * 2, // range: 4–12 px - // Keep opacity low so particles never obscure the badge - opacity: 0.05 + (i % 4) * 0.025, // range: 0.05–0.125 - // Vary depth so each "layer" of particles shifts by a different amount, - // creating the illusion of 3-D depth. depth 0.1 = farthest; 0.7 = nearest. - depth: 0.1 + (i % 6) * 0.1, // range: 0.1–0.6 - color: colors[i % colors.length], - isCircle: i % 4 === 0, - })); + return Array.from( + { length: PARALLAX_PARTICLE_COUNT }, + (_, i): ParallaxParticle => ({ + id: i, + // Spread particles across the container using prime-number strides + x: (i * 17 + 11) % 100, + y: (i * 23 + 7) % 100, + size: 4 + (i % 5) * 2, // range: 4–12 px + // Keep opacity low so particles never obscure the badge + opacity: 0.05 + (i % 4) * 0.025, // range: 0.05–0.125 + // Vary depth so each "layer" of particles shifts by a different amount, + // creating the illusion of 3-D depth. depth 0.1 = farthest; 0.7 = nearest. + depth: 0.1 + (i % 6) * 0.1, // range: 0.1–0.6 + color: colors[i % colors.length], + isCircle: i % 4 === 0, + }) + ); } // How many pixels a depth-1.0 particle shifts when the cursor is at the @@ -399,29 +402,31 @@ export default function InteractiveViewer({ Each particle shifts by (parallaxX * depth, parallaxY * depth) px relative to its base position, so "closer" particles (higher depth) shift more — creating the impression of a multi-layered isometric space. */} - {particles.map((particle): ReactElement => ( -
- ))} + {particles.map( + (particle): ReactElement => ( +
+ ) + )}
{/* ── Card content ────────────────────────────────────────────────────── diff --git a/components/burnout/BurnoutRiskTable.tsx b/components/burnout/BurnoutRiskTable.tsx index 7cf69d2c5..c276cd649 100644 --- a/components/burnout/BurnoutRiskTable.tsx +++ b/components/burnout/BurnoutRiskTable.tsx @@ -1,6 +1,7 @@ 'use client'; import { useState, useMemo } from 'react'; +import Image from 'next/image'; import { motion } from 'framer-motion'; import { Flame, diff --git a/types/achievements.ts b/types/achievements.ts index b8c3d68c6..fd7272287 100644 --- a/types/achievements.ts +++ b/types/achievements.ts @@ -3,7 +3,11 @@ export type AchievementTier = 'bronze' | 'silver' | 'gold' | 'platinum' | 'diamo export type AchievementRarity = 'common' | 'uncommon' | 'rare' | 'epic' | 'legendary' | 'mythic'; export type AchievementCategory = - 'contribution' | 'pull-request' | 'repository' | 'collaboration' | 'technology'; + | 'contribution' + | 'pull-request' + | 'repository' + | 'collaboration' + | 'technology'; export interface AchievementLevelDef { tier: AchievementTier; From 05bf3d21b84cf2f7038f5f46dd75113a78c7a235 Mon Sep 17 00:00:00 2001 From: pisum-sativum Date: Fri, 24 Jul 2026 00:06:53 +0530 Subject: [PATCH 7/9] revert: restore unrelated files (BurnoutRiskTable, InteractiveViewer, achievements) to main state --- components/InteractiveViewer.tsx | 79 ++++++++++++------------- components/burnout/BurnoutRiskTable.tsx | 1 - types/achievements.ts | 6 +- 3 files changed, 38 insertions(+), 48 deletions(-) diff --git a/components/InteractiveViewer.tsx b/components/InteractiveViewer.tsx index 0f29e9459..ba6c65a49 100644 --- a/components/InteractiveViewer.tsx +++ b/components/InteractiveViewer.tsx @@ -25,23 +25,20 @@ interface ParallaxParticle { * Deterministic math prevents random values from causing SSR/CSR mismatches. */ function buildParticles(): ParallaxParticle[] { const colors = ['#10b981', '#8b5cf6', '#06b6d4', '#3b82f6', '#f59e0b']; - return Array.from( - { length: PARALLAX_PARTICLE_COUNT }, - (_, i): ParallaxParticle => ({ - id: i, - // Spread particles across the container using prime-number strides - x: (i * 17 + 11) % 100, - y: (i * 23 + 7) % 100, - size: 4 + (i % 5) * 2, // range: 4–12 px - // Keep opacity low so particles never obscure the badge - opacity: 0.05 + (i % 4) * 0.025, // range: 0.05–0.125 - // Vary depth so each "layer" of particles shifts by a different amount, - // creating the illusion of 3-D depth. depth 0.1 = farthest; 0.7 = nearest. - depth: 0.1 + (i % 6) * 0.1, // range: 0.1–0.6 - color: colors[i % colors.length], - isCircle: i % 4 === 0, - }) - ); + return Array.from({ length: PARALLAX_PARTICLE_COUNT }, (_, i): ParallaxParticle => ({ + id: i, + // Spread particles across the container using prime-number strides + x: (i * 17 + 11) % 100, + y: (i * 23 + 7) % 100, + size: 4 + (i % 5) * 2, // range: 4–12 px + // Keep opacity low so particles never obscure the badge + opacity: 0.05 + (i % 4) * 0.025, // range: 0.05–0.125 + // Vary depth so each "layer" of particles shifts by a different amount, + // creating the illusion of 3-D depth. depth 0.1 = farthest; 0.7 = nearest. + depth: 0.1 + (i % 6) * 0.1, // range: 0.1–0.6 + color: colors[i % colors.length], + isCircle: i % 4 === 0, + })); } // How many pixels a depth-1.0 particle shifts when the cursor is at the @@ -402,31 +399,29 @@ export default function InteractiveViewer({ Each particle shifts by (parallaxX * depth, parallaxY * depth) px relative to its base position, so "closer" particles (higher depth) shift more — creating the impression of a multi-layered isometric space. */} - {particles.map( - (particle): ReactElement => ( -
- ) - )} + {particles.map((particle): ReactElement => ( +
+ ))}
{/* ── Card content ────────────────────────────────────────────────────── diff --git a/components/burnout/BurnoutRiskTable.tsx b/components/burnout/BurnoutRiskTable.tsx index c276cd649..7cf69d2c5 100644 --- a/components/burnout/BurnoutRiskTable.tsx +++ b/components/burnout/BurnoutRiskTable.tsx @@ -1,7 +1,6 @@ 'use client'; import { useState, useMemo } from 'react'; -import Image from 'next/image'; import { motion } from 'framer-motion'; import { Flame, diff --git a/types/achievements.ts b/types/achievements.ts index fd7272287..b8c3d68c6 100644 --- a/types/achievements.ts +++ b/types/achievements.ts @@ -3,11 +3,7 @@ export type AchievementTier = 'bronze' | 'silver' | 'gold' | 'platinum' | 'diamo export type AchievementRarity = 'common' | 'uncommon' | 'rare' | 'epic' | 'legendary' | 'mythic'; export type AchievementCategory = - | 'contribution' - | 'pull-request' - | 'repository' - | 'collaboration' - | 'technology'; + 'contribution' | 'pull-request' | 'repository' | 'collaboration' | 'technology'; export interface AchievementLevelDef { tier: AchievementTier; From 9f7ff1b58a1c8fae6bd31c918cf5f2c9fa3986ab Mon Sep 17 00:00:00 2001 From: pisum-sativum Date: Fri, 24 Jul 2026 00:08:09 +0530 Subject: [PATCH 8/9] style: format InteractiveViewer and achievements for format:check compliance --- components/InteractiveViewer.tsx | 79 +++++++++++++++++--------------- types/achievements.ts | 6 ++- 2 files changed, 47 insertions(+), 38 deletions(-) diff --git a/components/InteractiveViewer.tsx b/components/InteractiveViewer.tsx index ba6c65a49..0f29e9459 100644 --- a/components/InteractiveViewer.tsx +++ b/components/InteractiveViewer.tsx @@ -25,20 +25,23 @@ interface ParallaxParticle { * Deterministic math prevents random values from causing SSR/CSR mismatches. */ function buildParticles(): ParallaxParticle[] { const colors = ['#10b981', '#8b5cf6', '#06b6d4', '#3b82f6', '#f59e0b']; - return Array.from({ length: PARALLAX_PARTICLE_COUNT }, (_, i): ParallaxParticle => ({ - id: i, - // Spread particles across the container using prime-number strides - x: (i * 17 + 11) % 100, - y: (i * 23 + 7) % 100, - size: 4 + (i % 5) * 2, // range: 4–12 px - // Keep opacity low so particles never obscure the badge - opacity: 0.05 + (i % 4) * 0.025, // range: 0.05–0.125 - // Vary depth so each "layer" of particles shifts by a different amount, - // creating the illusion of 3-D depth. depth 0.1 = farthest; 0.7 = nearest. - depth: 0.1 + (i % 6) * 0.1, // range: 0.1–0.6 - color: colors[i % colors.length], - isCircle: i % 4 === 0, - })); + return Array.from( + { length: PARALLAX_PARTICLE_COUNT }, + (_, i): ParallaxParticle => ({ + id: i, + // Spread particles across the container using prime-number strides + x: (i * 17 + 11) % 100, + y: (i * 23 + 7) % 100, + size: 4 + (i % 5) * 2, // range: 4–12 px + // Keep opacity low so particles never obscure the badge + opacity: 0.05 + (i % 4) * 0.025, // range: 0.05–0.125 + // Vary depth so each "layer" of particles shifts by a different amount, + // creating the illusion of 3-D depth. depth 0.1 = farthest; 0.7 = nearest. + depth: 0.1 + (i % 6) * 0.1, // range: 0.1–0.6 + color: colors[i % colors.length], + isCircle: i % 4 === 0, + }) + ); } // How many pixels a depth-1.0 particle shifts when the cursor is at the @@ -399,29 +402,31 @@ export default function InteractiveViewer({ Each particle shifts by (parallaxX * depth, parallaxY * depth) px relative to its base position, so "closer" particles (higher depth) shift more — creating the impression of a multi-layered isometric space. */} - {particles.map((particle): ReactElement => ( -
- ))} + {particles.map( + (particle): ReactElement => ( +
+ ) + )}
{/* ── Card content ────────────────────────────────────────────────────── diff --git a/types/achievements.ts b/types/achievements.ts index b8c3d68c6..fd7272287 100644 --- a/types/achievements.ts +++ b/types/achievements.ts @@ -3,7 +3,11 @@ export type AchievementTier = 'bronze' | 'silver' | 'gold' | 'platinum' | 'diamo export type AchievementRarity = 'common' | 'uncommon' | 'rare' | 'epic' | 'legendary' | 'mythic'; export type AchievementCategory = - 'contribution' | 'pull-request' | 'repository' | 'collaboration' | 'technology'; + | 'contribution' + | 'pull-request' + | 'repository' + | 'collaboration' + | 'technology'; export interface AchievementLevelDef { tier: AchievementTier; From 67557d0d6fb5e4587c5ee7c269d214fae3cc4e9c Mon Sep 17 00:00:00 2001 From: pisum-sativum Date: Fri, 24 Jul 2026 00:12:42 +0530 Subject: [PATCH 9/9] fix(burnout): import Image component in BurnoutRiskTable --- components/burnout/BurnoutRiskTable.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/components/burnout/BurnoutRiskTable.tsx b/components/burnout/BurnoutRiskTable.tsx index 7cf69d2c5..c276cd649 100644 --- a/components/burnout/BurnoutRiskTable.tsx +++ b/components/burnout/BurnoutRiskTable.tsx @@ -1,6 +1,7 @@ 'use client'; import { useState, useMemo } from 'react'; +import Image from 'next/image'; import { motion } from 'framer-motion'; import { Flame,