Repository: rahuldkjain/github-profile-readme-generator Branch: main Commit: 5ae90bfcbd7a Files: 87 Total size: 308.4 KB Directory structure: gitextract_r5j2l4sc/ ├── .all-contributorsrc ├── .eslintignore ├── .eslintrc.json ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ ├── feature-enhancement-request.md │ │ └── feature_request.md │ ├── PULL_REQUEST_TEMPLATE.md │ ├── config.yml │ └── workflows/ │ └── deploy.yml ├── .gitignore ├── .husky/ │ └── pre-commit ├── .prettierignore ├── .prettierrc ├── CHANGELOG.md ├── CHEATSHEET.md ├── CODE_OF_CONDUCT.md ├── CODE_STYLE_GUIDE.md ├── COMMIT_CONVENTION.md ├── CONTRIBUTING.md ├── DEPLOYMENT.md ├── LICENSE ├── README.md ├── env.example ├── eslint.config.mjs ├── next.config.ts ├── package.json ├── postcss.config.mjs ├── public/ │ ├── manifest.json │ └── robots.txt ├── setupTests.js ├── src/ │ ├── app/ │ │ ├── about/ │ │ │ └── page.tsx │ │ ├── addons/ │ │ │ └── page.tsx │ │ ├── globals.css │ │ ├── layout.tsx │ │ ├── page.tsx │ │ ├── robots.ts │ │ ├── sitemap.ts │ │ └── support/ │ │ └── page.tsx │ ├── components/ │ │ ├── analytics/ │ │ │ └── conditional-analytics.tsx │ │ ├── forms/ │ │ │ ├── __tests__/ │ │ │ │ └── form-input.test.tsx │ │ │ ├── form-checkbox.tsx │ │ │ ├── form-input.tsx │ │ │ ├── form-select.tsx │ │ │ ├── form-textarea.tsx │ │ │ └── github-username-input.tsx │ │ ├── layout/ │ │ │ ├── footer.tsx │ │ │ ├── header.tsx │ │ │ └── theme-provider.tsx │ │ ├── sections/ │ │ │ ├── basic-info-section.tsx │ │ │ ├── links-section.tsx │ │ │ ├── skills-section.tsx │ │ │ └── social-section.tsx │ │ └── ui/ │ │ ├── accessibility-menu.tsx │ │ ├── buy-me-coffee.tsx │ │ ├── collapsible-section.tsx │ │ ├── confirm-dialog.tsx │ │ ├── cookie-consent.tsx │ │ ├── github-stats.tsx │ │ ├── markdown-preview.tsx │ │ ├── select.tsx │ │ ├── theme-toggle.tsx │ │ └── toast.tsx │ ├── constants/ │ │ ├── defaults.ts │ │ └── skills.ts │ ├── hooks/ │ │ ├── use-consent.ts │ │ ├── use-local-storage.ts │ │ └── use-theme.ts │ ├── lib/ │ │ ├── analytics.ts │ │ ├── asset-path.ts │ │ ├── github-api.ts │ │ ├── markdown-generator.ts │ │ ├── storage.ts │ │ ├── store.ts │ │ └── validations.ts │ ├── markdown-pages/ │ │ ├── about.md │ │ ├── addons.md │ │ └── support.md │ ├── styles/ │ │ └── tailwind.css │ ├── test/ │ │ └── setup.ts │ └── types/ │ ├── profile.ts │ ├── skills.ts │ └── theme.ts ├── tailwind.config.js ├── tailwind.config.ts ├── tsconfig.json └── vitest.config.ts ================================================ FILE CONTENTS ================================================ ================================================ FILE: .all-contributorsrc ================================================ { "files": ["README.md"], "imageSize": 100, "commit": false, "contributors": [ { "login": "sarbikbetal", "name": "Sarbik Betal", "avatar_url": "https://avatars2.githubusercontent.com/u/41508422?v=4", "profile": "https://github.com/sarbikbetal", "contributions": ["code"] }, { "login": "Hardik0307", "name": "Hardik Bagada", "avatar_url": "https://avatars3.githubusercontent.com/u/41434099?v=4", "profile": "https://github.com/Hardik0307", "contributions": ["code"] }, { "login": "antonkomarev", "name": "Anton Komarev", "avatar_url": "https://avatars0.githubusercontent.com/u/1849174?v=4", "profile": "https://komarev.com", "contributions": ["plugin"] }, { "login": "KKVANONYMOUS", "name": "Kunal Kumar Verma", "avatar_url": "https://avatars3.githubusercontent.com/u/58628586?v=4", "profile": "https://kkvanonymous.github.io/", "contributions": ["code"] }, { "login": "jaideepghosh", "name": "Jaideep Ghosh", "avatar_url": "https://avatars2.githubusercontent.com/u/3909648?v=4", "profile": "http://jaideepghosh.blogspot.com", "contributions": ["code"] }, { "login": "YashKandalkar", "name": "yash", "avatar_url": "https://avatars0.githubusercontent.com/u/35102959?v=4", "profile": "http://yashkandalkar.github.io", "contributions": ["code"] }, { "login": "abhijit-hota", "name": "Abhijit Hota", "avatar_url": "https://avatars0.githubusercontent.com/u/8116174?v=4", "profile": "https://github.com/abhijit-hota", "contributions": ["code", "test"] }, { "login": "Maddoxx88", "name": "Sunit Shirke", "avatar_url": "https://avatars1.githubusercontent.com/u/34238672?v=4", "profile": "https://maddoxx88.github.io/", "contributions": ["code"] }, { "login": "g-savitha", "name": "Savitha Gollamudi", "avatar_url": "https://avatars0.githubusercontent.com/u/31612459?v=4", "profile": "https://www.gsavitha.in", "contributions": ["code"] } ], "contributorsPerLine": 7, "projectName": "github-profile-readme-generator", "projectOwner": "rahuldkjain", "repoType": "github", "repoHost": "https://github.com", "skipCi": true } ================================================ FILE: .eslintignore ================================================ node_modules/** ================================================ FILE: .eslintrc.json ================================================ { "env": { "browser": true, "es2021": true }, "extends": ["plugin:react/recommended", "airbnb", "prettier"], "parserOptions": { "ecmaFeatures": { "jsx": true }, "ecmaVersion": 12, "sourceType": "module" }, "plugins": ["react"], "rules": { "react/forbid-prop-types": 0 }, "ignorePatterns": ["**/*.test.js"] } ================================================ FILE: .github/FUNDING.yml ================================================ # These are supported funding model platforms github: rahuldkjain patreon: # Replace with a single Patreon username open_collective: github-profile-readme-generator ko_fi: rahuldkjain tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry liberapay: # Replace with a single Liberapay username issuehunt: # Replace with a single IssueHunt username otechie: # Replace with a single Otechie username custom: ['https://paypal.me/rahuldkjain', 'https://www.buymeacoffee.com/rahuldkjain'] ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.md ================================================ --- name: 🐛 Bug Report about: Report a bug in GitHub Profile README Generator title: '[Bug] ' labels: ['bug'] assignees: '' --- ## 🐛 Bug Description A clear and concise description of what the bug is. ## 🔄 Steps to Reproduce 1. Go to [URL or page] 2. Click on [element] 3. Fill in [specific fields] 4. See error ## ✅ Expected Behavior A clear description of what you expected to happen. ## 📸 Screenshots If applicable, add screenshots to help explain your problem. ## 🖥️ Environment **Desktop:** - OS: [e.g. macOS, Windows, Linux] - Browser: [e.g. Chrome 118, Safari 17, Firefox 119] **Mobile:** - Device: [e.g. iPhone 15, Samsung Galaxy S23] - OS: [e.g. iOS 17.1, Android 14] - Browser: [e.g. Safari, Chrome Mobile] ## 🔧 Additional Context - Does this happen in incognito/private mode? [Yes/No] - Console errors (if any): [Paste console output] - Network connectivity: [Good/Slow/Offline] **Note:** Please test at the current version: https://rahuldkjain.github.io/gh-profile-readme-generator Join the **Discord Server** for further discussions. GPRG Discord Server Link Server Link: https://discord.gg/HHMs7Eg ================================================ FILE: .github/ISSUE_TEMPLATE/feature-enhancement-request.md ================================================ --- name: Feature/Enhancement request about: Suggest an idea for this project title: '' labels: enhancement, hacktoberfest assignees: '' --- **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. **Additional context** Add any other context or screenshots about the feature request here. Join the **Discord Server** for further discussions. GPRG Discord Server Link Server Link: https://discord.gg/HHMs7Eg ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request.md ================================================ --- name: ✨ Feature Request about: Suggest a new feature for GitHub Profile README Generator title: '[Feature] ' labels: ['enhancement'] assignees: '' --- ## ✨ Feature Description A clear and concise description of the feature you'd like to see. ## 🎯 Problem Statement What problem does this feature solve? Is your feature request related to a problem? ## 💡 Proposed Solution Describe the solution you'd like to see implemented. ## 🔄 User Flow Describe how a user would interact with this feature: 1. User goes to... 2. User clicks/types... 3. System responds with... ## 🎨 Design Considerations - UI/UX requirements - Accessibility considerations - Mobile responsiveness needs - Theme compatibility (dark/light mode) ## 🔧 Technical Considerations - Performance impact - Browser compatibility requirements - Dependencies needed - Potential breaking changes ## 📋 Alternative Solutions Describe alternatives you've considered. ## 📸 Mockups/Examples If applicable, add mockups, sketches, or examples from other tools. ## 🎯 Priority - [ ] Low - Nice to have - [ ] Medium - Would improve UX significantly - [ ] High - Critical for user workflow - [ ] Critical - Blocking current functionality ## 📱 Target Platforms - [ ] Desktop - [ ] Mobile - [ ] Tablet - [ ] All platforms --- 💬 **Join our Discord** for feature discussions: https://discord.gg/HHMs7Eg ================================================ FILE: .github/PULL_REQUEST_TEMPLATE.md ================================================ # 🔄 Pull Request ## 📋 **Type of Change** (check all applicable) - [ ] 🐛 **Bug Fix** - Fixes an issue without breaking existing functionality - [ ] ✨ **Feature** - Adds new functionality - [ ] ⚡ **Performance** - Improves performance without changing functionality - [ ] ♻️ **Refactor** - Code changes that neither fix bugs nor add features - [ ] 📚 **Documentation** - Updates to documentation, comments, or README - [ ] 🎨 **Style** - Code style changes (formatting, missing semi-colons, etc.) - [ ] 🧪 **Test** - Adding or updating tests - [ ] 🏗️ **Build** - Changes to build system or dependencies - [ ] 👷 **CI/CD** - Changes to CI/CD workflows - [ ] 🔒 **Security** - Security improvements or vulnerability fixes - [ ] ♿ **Accessibility** - Improves accessibility compliance - [ ] 📱 **Mobile** - Mobile-specific improvements - [ ] 🌐 **i18n** - Internationalization changes ## 📖 **Description** ### **What changed?** ### **Why was this change made?** ### **How does this change help users?** ## 🔗 **Related Issues** - Closes # - Fixes # - Related to # ## 🧪 **Testing & Quality Assurance** ### **Testing Done** (check all applicable) - [ ] ✅ **Manual testing** - Tested functionality manually - [ ] 🧪 **Unit tests** - Added/updated unit tests - [ ] 🔄 **Integration tests** - Tested with other components - [ ] 📱 **Mobile testing** - Tested on mobile devices - [ ] ♿ **Accessibility testing** - Tested with screen readers/keyboard nav - [ ] 🌐 **Cross-browser testing** - Tested in multiple browsers - [ ] 🎨 **Visual testing** - Checked UI/UX in light/dark themes ### **Test Instructions** 1. 2. 3. ### **Expected Behavior** ## 📸 **Screenshots/Recordings** ### **Before** ### **After** ## 📋 **Checklist** ### **Code Quality** - [ ] 🔍 **TypeScript** - No TypeScript errors (`npm run type-check`) - [ ] 🧹 **Linting** - No ESLint errors (`npm run lint`) - [ ] 🎨 **Formatting** - Code is properly formatted (`npm run format`) - [ ] 🏗️ **Build** - Production build succeeds (`npm run build`) - [ ] ⚡ **Performance** - No performance regressions introduced ### **Accessibility** - [ ] ♿ **WCAG Compliance** - Follows WCAG 2.1 AA guidelines - [ ] ⌨️ **Keyboard Navigation** - All interactive elements are keyboard accessible - [ ] 🔍 **Screen Reader** - Proper ARIA labels and semantic HTML - [ ] 🎨 **Color Contrast** - Meets contrast requirements - [ ] 🎯 **Focus Management** - Visible focus indicators ### **Mobile & Responsive** - [ ] 📱 **Mobile Responsive** - Works on mobile devices (320px+) - [ ] 🖥️ **Desktop** - Works on desktop (1024px+) - [ ] 📐 **Tablet** - Works on tablet sizes (768px+) - [ ] 🔄 **Orientation** - Works in portrait and landscape ### **Browser Compatibility** - [ ] 🌐 **Chrome** - Latest version - [ ] 🦊 **Firefox** - Latest version - [ ] 🧭 **Safari** - Latest version - [ ] 📱 **Mobile Safari** - iOS Safari - [ ] 📱 **Chrome Mobile** - Android Chrome ### **Documentation** - [ ] 📚 **Code Comments** - Added helpful comments for complex logic - [ ] 📖 **Documentation** - Updated relevant documentation - [ ] 📝 **README** - Updated README if needed - [ ] 🔄 **Changelog** - Will be auto-generated from conventional commits ### **Security & Privacy** - [ ] 🔒 **No Secrets** - No API keys, passwords, or sensitive data exposed - [ ] 🛡️ **Input Validation** - Proper validation for user inputs - [ ] 🔐 **XSS Prevention** - Protected against XSS attacks - [ ] 🍪 **Privacy Compliant** - Follows GDPR/privacy requirements ## 🚀 **Deployment Notes** - [ ] **No breaking changes** - Backward compatible - [ ] **Database changes** - N/A (static site) - [ ] **Environment variables** - No new env vars needed - [ ] **Third-party dependencies** - No new external dependencies ## 📝 **Additional Notes** ## 👀 **Reviewers** --- **By submitting this PR, I confirm that:** - ✅ I have read and agree to the [Code of Conduct](https://github.com/rahuldkjain/github-profile-readme-generator/blob/master/CODE_OF_CONDUCT.md) - ✅ I have followed the [Contributing Guidelines](https://github.com/rahuldkjain/github-profile-readme-generator/blob/master/CONTRIBUTING.md) - ✅ I have used [Conventional Commits](https://github.com/rahuldkjain/github-profile-readme-generator/blob/master/COMMIT_CONVENTION.md) for my commit messages - ✅ I have tested my changes thoroughly - ✅ My code follows the project's coding standards ================================================ FILE: .github/config.yml ================================================ # Configuration for new-issue-welcome - https://github.com/behaviorbot/new-issue-welcome # Comment to be posted to on first time issues newIssueWelcomeComment: > Thanks for opening your first issue here! Your contribution means alot. 🙌 Join Discord Server (https://discord.gg/HHMs7Eg) for discussing issues, pull-requests, new features, etc. # Configuration for new-pr-welcome - https://github.com/behaviorbot/new-pr-welcome # Comment to be posted to on PRs from first time contributors in your repository newPRWelcomeComment: > Thanks for opening this pull request! Make sure you have assigned an issue to this respective PR 😇 # Configuration for first-pr-merge - https://github.com/behaviorbot/first-pr-merge # Comment to be posted to on pull requests merged by a first time user firstPRMergeComment: > Congrats on merging your first pull request🎉! Thanks alot for your contribution. 🙏 ================================================ FILE: .github/workflows/deploy.yml ================================================ name: Build and Deploy on: push: branches: [master, dev] # Allow concurrent deployments for different environments concurrency: group: 'pages-${{ github.ref }}' cancel-in-progress: true jobs: build: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' - name: Install dependencies run: npm ci - name: Run type check run: npm run type-check - name: Run linting run: npm run lint - name: Run tests run: npm run test - name: Build application run: | echo "Building for branch: ${{ github.ref_name }}" echo "NODE_ENV: $NODE_ENV" echo "SURGE_PREVIEW: $SURGE_PREVIEW" npm run build env: NEXT_PUBLIC_GA_ID: ${{ secrets.NEXT_PUBLIC_GA_ID }} NEXT_PUBLIC_REQUIRE_CONSENT: true NEXT_PUBLIC_ANONYMIZE_IP: true # Set SURGE_PREVIEW for non-master branches to disable basePath SURGE_PREVIEW: ${{ github.ref != 'refs/heads/master' && 'true' || '' }} - name: Upload Pages Artifact (Production) if: github.ref == 'refs/heads/master' uses: actions/upload-pages-artifact@v3 with: path: ./out - name: Upload Preview Artifact if: github.ref != 'refs/heads/master' uses: actions/upload-artifact@v4 with: name: preview-build-${{ github.run_number }}-${{ github.run_attempt }} path: ./out retention-days: 30 # Production deployment to main GitHub Pages deploy-production: needs: build runs-on: ubuntu-latest # Only deploy to production from master branch if: github.ref == 'refs/heads/master' permissions: pages: write id-token: write environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} steps: - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v4 # Preview deployment for development branches deploy-preview: needs: build runs-on: ubuntu-latest # Deploy preview for dev branches (not master, only on direct push) if: github.ref != 'refs/heads/master' && github.event_name == 'push' # Add deployment environment to show URL in GitHub UI environment: name: preview-${{ github.ref_name }} steps: - name: Calculate sanitized branch name id: branch run: | SANITIZED_BRANCH=$(echo "${{ github.ref_name }}" | sed 's/[^a-zA-Z0-9-]/-/g' | tr '[:upper:]' '[:lower:]') echo "sanitized=$SANITIZED_BRANCH" >> $GITHUB_OUTPUT echo "url=https://gprg-${SANITIZED_BRANCH}.surge.sh" >> $GITHUB_OUTPUT - name: Debug deployment conditions run: | echo "GitHub ref: ${{ github.ref }}" echo "GitHub ref name: ${{ github.ref_name }}" echo "Event name: ${{ github.event_name }}" echo "Is master?: ${{ github.ref == 'refs/heads/master' }}" echo "Is push?: ${{ github.event_name == 'push' }}" echo "Should deploy?: ${{ github.ref != 'refs/heads/master' && github.event_name == 'push' }}" - name: Download Preview Artifact uses: actions/download-artifact@v4 with: name: preview-build-${{ github.run_number }}-${{ github.run_attempt }} path: ./preview-out - name: Deploy to Surge.sh (Preview) id: deploy run: | npm install -g surge echo "Deploying preview for branch: ${{ github.ref_name }}" echo "Sanitized branch name: ${{ steps.branch.outputs.sanitized }}" echo "Preview URL: ${{ steps.branch.outputs.url }}" surge ./preview-out ${{ steps.branch.outputs.url }} --token ${{ secrets.SURGE_TOKEN }} echo "deployment_url=${{ steps.branch.outputs.url }}" >> $GITHUB_OUTPUT env: SURGE_TOKEN: ${{ secrets.SURGE_TOKEN }} - name: Comment PR with Preview URL if: github.event_name == 'pull_request' uses: actions/github-script@v7 with: script: | const previewUrl = '${{ steps.deploy.outputs.deployment_url }}'; github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, body: `🚀 **Preview Deployment Ready!**\n\n📱 Preview URL: ${previewUrl}\n\n*This preview will be available for 30 days.*` }); - name: Create deployment status uses: actions/github-script@v7 with: script: | const previewUrl = '${{ steps.deploy.outputs.deployment_url }}'; // Create a commit status with the deployment URL github.rest.repos.createCommitStatus({ owner: context.repo.owner, repo: context.repo.repo, sha: context.sha, state: 'success', target_url: previewUrl, description: `Preview deployed to ${previewUrl}`, context: 'deployment/preview' }); - name: Update Status Check run: | echo "🚀 Preview deployed successfully!" echo "📱 Preview URL: ${{ steps.deploy.outputs.deployment_url }}" echo "" echo "You can find this URL in:" echo "1. GitHub Actions > Environments tab" echo "2. Commit status checks" echo "3. This workflow run summary" # Add to job summary for easy access echo "## 🚀 Preview Deployment Complete!" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "**Branch:** \`${{ github.ref_name }}\`" >> $GITHUB_STEP_SUMMARY echo "**Preview URL:** [${{ steps.deploy.outputs.deployment_url }}](${{ steps.deploy.outputs.deployment_url }})" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "### Where to find this URL:" >> $GITHUB_STEP_SUMMARY echo "- **Environments tab:** Go to your repository → Environments → preview-${{ github.ref_name }}" >> $GITHUB_STEP_SUMMARY echo "- **Commit status:** Check the commit status checks for 'deployment/preview'" >> $GITHUB_STEP_SUMMARY echo "- **This summary:** Bookmark this workflow run for easy access" >> $GITHUB_STEP_SUMMARY ================================================ FILE: .gitignore ================================================ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. # dependencies /node_modules /.pnp .pnp.* .yarn/* !.yarn/patches !.yarn/plugins !.yarn/releases !.yarn/versions # testing /coverage # next.js /.next/ /out/ # production /build # misc .DS_Store *.pem # debug npm-debug.log* yarn-debug.log* yarn-error.log* .pnpm-debug.log* # env files (can opt-in for committing if needed) .env* # vercel .vercel # typescript *.tsbuildinfo next-env.d.ts # Claude .cursor/ .claude/ ================================================ FILE: .husky/pre-commit ================================================ #!/bin/sh . "$(dirname "$0")/_/husky.sh" npx --no-install lint-staged ================================================ FILE: .prettierignore ================================================ .cache package.json package-lock.json public ================================================ FILE: .prettierrc ================================================ { "singleQuote": true, "jsxSingleQuote": false, "tabWidth": 2, "printWidth": 100, "trailingComma": "es5", "semi": true, "arrowParens": "always", "endOfLine": "lf", "plugins": ["prettier-plugin-tailwindcss"] } ================================================ FILE: CHANGELOG.md ================================================ # Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [2.0.0] - 2025-10-15 ### ✨ Features - **Complete rewrite**: Migrated to Next.js 15 with App Router and Turbopack - **React 19**: Updated to latest React with concurrent features - **TypeScript 5**: Full type safety with strict configuration - **Modern UI**: Tailwind CSS 4 with design tokens and CSS variables - **Accessibility**: WCAG 2.1 AA compliance with accessibility menu - **Privacy**: GDPR-compliant analytics with opt-in consent - **Performance**: 3x faster builds and 50% smaller bundle size - **Auto-fill**: GitHub integration for automatic profile data - **Export/Import**: JSON functionality for profile data - **Enhanced UX**: Multi-step wizard with real-time validation - **Responsive**: Mobile-first design with touch optimization ### 🐛 Bug Fixes - Fixed skill selection persistence across sessions - Resolved theme toggle flickering on page load - Fixed social media icon alignment issues - Corrected markdown preview rendering edge cases ### ⚡ Performance Improvements - Implemented code splitting with lazy loading - Optimized bundle size with Turbopack - Added image optimization for better loading - Reduced JavaScript bundle by 50% ### ♻️ Code Refactoring - Migrated from Gatsby to Next.js 15 - Converted all components to TypeScript - Implemented modern React patterns (hooks, context) - Restructured project architecture for scalability ### 📚 Documentation - Added comprehensive TypeScript documentation - Created accessibility guidelines - Updated deployment documentation - Added contributing guidelines for V2 ### 🏗️ Build System - Migrated to Next.js build system - Added Turbopack for development - Implemented ESLint + Prettier configuration - Added Vitest for testing ### 👷 Continuous Integration - Enhanced GitHub Actions workflows - Added preview deployments with environment tracking - Implemented automated release management - Added comprehensive testing pipeline --- ## Previous Versions (V1) For changes in V1, see the [V1 Release Archive](https://github.com/rahuldkjain/github-profile-readme-generator/releases?q=v1&expanded=true). ### Migration from V1 to V2 V2 represents a complete rewrite with breaking changes: - **Technology Stack**: Gatsby → Next.js 15 - **Styling**: CSS Modules → Tailwind CSS 4 - **State Management**: Local state → Zustand + localStorage - **Build System**: Webpack → Turbopack - **Type Safety**: JavaScript → TypeScript 5 All V1 functionality has been preserved and enhanced in V2. See [MIGRATION_STRATEGY.md](./MIGRATION_STRATEGY.md) for detailed migration information. ================================================ FILE: CHEATSHEET.md ================================================ # GitHub Profile Generator - Developer Cheatsheet ## 🚀 Quick Start ```bash npm install && npm run dev ``` Visit: http://localhost:3000 --- ## 📁 File Structure (Where to Edit) | Task | File Location | |------|--------------| | Add form field | `src/components/sections/[section]-section.tsx` | | Add validation | `src/lib/validations.ts` | | Modify markdown output | `src/lib/markdown-generator.ts` | | Add new section | Create in `src/components/sections/` + add to `src/app/page.tsx` | | Create form component | `src/components/forms/` | | Add skill | `src/constants/skills.ts` | | Storage logic | `src/lib/storage.ts` | | Theme colors | `src/styles/globals.css` | | Header/Footer | `src/components/layout/` | --- ## 🎨 Theme Colors (Always Use These) ```typescript // Backgrounds bg-background // Main background bg-card // Card background bg-accent // Accent background bg-muted // Muted background bg-primary // Primary action background // Text text-foreground // Main text text-muted-foreground // Secondary text text-primary-foreground // Text on primary bg text-destructive // Error text // Borders & Effects border-border // Border color border-input // Input border ring-ring // Focus ring ``` **❌ Never hardcode:** `bg-white`, `text-black`, `border-gray-300` --- ## 📝 Component Templates ### Form Component ```typescript 'use client'; import { forwardRef } from 'react'; import type { InputHTMLAttributes } from 'react'; export interface MyInputProps extends Omit, 'type'> { label?: string; error?: string; } export const MyInput = forwardRef( ({ label, error, className = '', ...props }, ref) => { return (
{label && } {error &&

{error}

}
); } ); MyInput.displayName = 'MyInput'; ``` ### Section Component ```typescript 'use client'; import { UseFormRegister, FieldErrors } from 'react-hook-form'; import { FormInput } from '@/components/forms/form-input'; import type { MyFormData } from '@/lib/validations'; interface MySectionProps { register: UseFormRegister; errors: FieldErrors; } export function MySection({ register, errors }: MySectionProps) { return (

Section Title

Description

); } ``` --- ## 🔒 TypeScript Patterns ```typescript // Component Props interface ComponentProps { title: string; // Required count?: number; // Optional onAction: () => void; // Required function onChange?: (val: string) => void; // Optional function } // Zod Schema const schema = z.object({ email: z.string().email(), age: z.number().min(0).max(120), url: z.string().url().optional(), isActive: z.boolean().default(false), }); type FormData = z.infer; // Form Hook const { register, watch, setValue, formState: { errors } } = useForm({ resolver: zodResolver(schema), defaultValues: { isActive: false } }); ``` --- ## ♿ Accessibility Checklist ```typescript // ✅ Keyboard Navigation ``` ### CSS Variables - Use CSS custom properties for theming - Follow the design system color palette - Prefer Tailwind classes over custom CSS ## File Naming Conventions - **Components**: `kebab-case.tsx` (e.g., `skills-section.tsx`) - **Hooks**: `use-hook-name.ts` (e.g., `use-local-storage.ts`) - **Types**: `kebab-case.ts` (e.g., `profile-types.ts`) - **Utils**: `kebab-case.ts` (e.g., `markdown-generator.ts`) ## Spacing & Formatting ### JavaScript/TypeScript - Use **2 spaces** for indentation (not 4) - Use spaces after `if`, `for`, `while`, `switch` - No spaces after opening `(` and before closing `)` - Use spaces around destructuring ```tsx // Good const { name, email } = user; const handleClick = ({ target }: MouseEvent) => { if (target instanceof HTMLElement) { // logic } }; // Bad const { name, email } = user; const handleClick = ({ target }: MouseEvent) => { if (target instanceof HTMLElement) { // logic } }; ``` ### JSX Formatting - Space before self-closing tag slash - No spaces in JSX curly braces - Use new lines for multiple props ```tsx // Good // Bad ``` ## Props & Event Handling ### Prop Naming - Use `camelCase` for prop names - Use `PascalCase` if prop value is a React component - Use descriptive names with proper prefixes ```tsx interface FormProps { initialValues?: Record; onSubmit?: (data: FormData) => void; isLoading?: boolean; ErrorComponent?: React.ComponentType; } ``` ### Event Handlers - Prefix with `handle` or `on` - Use descriptive names - Type event handlers properly ```tsx const handleInputChange = (event: React.ChangeEvent) => { setValue(event.target.value); }; const handleSubmit = async (event: React.FormEvent) => { event.preventDefault(); // submit logic }; ``` ## Best Practices ### Code Quality - **Always** add semicolons - Use meaningful variable and function names - Keep components small and focused (< 200 lines) - Extract complex logic into custom hooks - Use TypeScript strict mode ### Accessibility - Always add `alt` prop to `img` tags - Use semantic HTML elements - Add proper ARIA attributes - Don't use `outline: none` without alternative focus styles - Use proper heading hierarchy ### Performance - Use `React.memo` for expensive components - Implement proper dependency arrays for hooks - Avoid inline objects and functions in JSX - Use `useCallback` and `useMemo` appropriately ```tsx // Good const MemoizedComponent = React.memo(({ data }: Props) => { const processedData = useMemo(() => processData(data), [data]); const handleClick = useCallback(() => { // click logic }, []); return
{/* JSX */}
; }); ``` ### Error Handling - Use error boundaries for component errors - Handle async operations properly - Provide fallback UI for loading states ```tsx const AsyncComponent = () => { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { fetchData() .then(setData) .catch(setError) .finally(() => setLoading(false)); }, []); if (loading) return ; if (error) return ; if (!data) return ; return ; }; ``` ## Dependencies & Imports ### Import Organization ```tsx // 1. React imports import { useState, useEffect, useCallback } from 'react'; import type { ReactNode } from 'react'; // 2. Third-party libraries import { motion } from 'framer-motion'; import { ChevronDown } from 'lucide-react'; // 3. Internal imports import { Button } from '@/components/ui/button'; import { useLocalStorage } from '@/hooks/use-local-storage'; import type { ProfileData } from '@/types/profile'; ``` ### Package Management - Prefer stable, well-maintained packages - Keep dependencies up to date - Use exact versions for critical dependencies - Document any custom modifications ## Testing Considerations - Write testable components with clear props - Avoid complex side effects in components - Use dependency injection for external services - Keep business logic separate from UI logic ## Further Reading This guide is based on: - [Next.js Best Practices](https://nextjs.org/docs/app/building-your-application/styling/tailwind-css) - [React TypeScript Cheatsheet](https://react-typescript-cheatsheet.netlify.app/) - [Tailwind CSS Best Practices](https://tailwindcss.com/docs/reusing-styles) For questions about code style, please discuss with maintainers on our [Discord community](https://discord.gg/HHMs7Eg). ================================================ FILE: COMMIT_CONVENTION.md ================================================ # 📝 Commit Message Convention This project follows [Conventional Commits](https://www.conventionalcommits.org/) specification for automated changelog generation and semantic versioning. ## Format ``` [optional scope]: [optional body] [optional footer(s)] ``` ## Types | Type | Description | Version Bump | | ---------- | ------------------------ | ------------ | | `feat` | New feature | Minor | | `fix` | Bug fix | Patch | | `perf` | Performance improvement | Patch | | `refactor` | Code refactoring | Patch | | `docs` | Documentation changes | Patch | | `style` | Code style changes | Patch | | `test` | Adding or updating tests | Patch | | `build` | Build system changes | Patch | | `ci` | CI/CD changes | Patch | | `chore` | Maintenance tasks | No bump | ## Breaking Changes Add `BREAKING CHANGE:` in the footer or `!` after type to indicate breaking changes: ```bash feat!: remove deprecated API endpoints BREAKING CHANGE: The old API endpoints have been removed. Use the new v2 endpoints instead. ``` ## Examples ### Features ```bash feat: add GitHub auto-fill integration feat(ui): implement dark mode toggle feat!: migrate to Next.js 15 App Router ``` ### Bug Fixes ```bash fix: resolve skill selection persistence issue fix(mobile): correct responsive navigation layout fix(a11y): improve keyboard navigation for forms ``` ### Performance ```bash perf: optimize image loading with next/image perf(build): reduce bundle size by 30% ``` ### Documentation ```bash docs: update installation instructions docs(api): add TypeScript examples docs(readme): fix broken demo links ``` ### Refactoring ```bash refactor: convert components to TypeScript refactor(store): migrate to Zustand state management ``` ## Scopes (Optional) Use scopes to indicate the area of change: - `ui` - User interface components - `api` - API related changes - `build` - Build system - `ci` - Continuous integration - `docs` - Documentation - `test` - Testing - `a11y` - Accessibility - `perf` - Performance - `mobile` - Mobile-specific changes ## Tools ### Commitizen (Recommended) Install commitizen for interactive commit messages: ```bash npm install -g commitizen cz-conventional-changelog echo '{ "path": "cz-conventional-changelog" }' > ~/.czrc ``` Use `git cz` instead of `git commit`: ```bash git add . git cz ``` ### VS Code Extension Install "Conventional Commits" extension for VS Code to get commit message templates. ## Automated Release Process 1. **Commit** using conventional format 2. **Push** to master branch 3. **Release Please** analyzes commits 4. **Creates PR** with changelog and version bump 5. **Merge PR** to trigger release and deployment ## Examples in Practice ```bash # Adding new feature git commit -m "feat(ui): add accessibility menu with font size controls" # Fixing bug git commit -m "fix(mobile): resolve navigation menu overflow on small screens" # Breaking change git commit -m "feat!: migrate to Next.js 15 App Router BREAKING CHANGE: Pages directory structure has changed. See migration guide for updating custom pages." # Performance improvement git commit -m "perf(build): implement code splitting for 50% bundle reduction" # Documentation update git commit -m "docs(contributing): add TypeScript coding standards" ``` ## Benefits - ✅ **Automated changelogs** - No manual changelog maintenance - ✅ **Semantic versioning** - Automatic version bumps based on commit types - ✅ **Release notes** - Rich, categorized release notes - ✅ **Consistency** - Standardized commit history - ✅ **Tooling integration** - Works with Release Please, semantic-release, etc. ================================================ FILE: CONTRIBUTING.md ================================================ # Contributing to GitHub Profile README Generator When contributing to this repository, please first discuss the change you wish to make via issue, email, or any other method with the owners of this repository before making a change. join discord community of github profile readme generator Please note we have a code of conduct, please follow it in all your interactions with the project. ## 🚀 Tech Stack This project is built with modern web technologies: - **Framework**: [Next.js 15](https://nextjs.org/) with App Router - **Language**: [TypeScript](https://www.typescriptlang.org/) for type safety - **Styling**: [Tailwind CSS](https://tailwindcss.com/) for utility-first styling - **Icons**: [Lucide React](https://lucide.dev/) for consistent iconography - **Animations**: [Framer Motion](https://www.framer.com/motion/) for smooth animations - **Forms**: [React Hook Form](https://react-hook-form.com/) for form management - **Analytics**: [Google Analytics 4](https://developers.google.com/analytics/devguides/collection/ga4) with privacy compliance - **Testing**: [Vitest](https://vitest.dev/) for unit testing - **Linting**: [ESLint](https://eslint.org/) + [Prettier](https://prettier.io/) for code quality ## 🛠️ Development Setup ### Prerequisites - **Node.js**: Version 18.17 or higher - **npm**: Version 9 or higher (comes with Node.js) - **Git**: For version control ### Local Development 1. **Fork & Clone the repository** ```bash # Fork the repo on GitHub, then clone your fork git clone https://github.com/YOUR_USERNAME/github-profile-readme-generator.git cd github-profile-readme-generator ``` 2. **Install dependencies** ```bash npm install ``` 3. **Set up environment variables** (optional) ```bash # Copy the example environment file cp env.example .env.local # Add your Google Analytics ID if you want to test analytics NEXT_PUBLIC_GA_ID=G-XXXXXXXXXX ``` 4. **Start the development server** ```bash npm run dev ``` The app will be available at `http://localhost:3000` ### Available Scripts ```bash # Development npm run dev # Start development server npm run build # Build for production npm run start # Start production server npm run export # Export static site # Code Quality npm run lint # Run ESLint npm run lint:fix # Fix ESLint issues automatically npm run type-check # Run TypeScript type checking # Testing npm run test # Run tests npm run test:watch # Run tests in watch mode npm run test:ui # Run tests with UI ``` ## 📝 Pull Request Process ### Before You Start 1. **Check existing issues** to see if your feature/bug is already being worked on 2. **Create an issue** if one doesn't exist for your contribution 3. **Join our Discord** to discuss your ideas with the community 4. **Read our [Code Style Guide](CODE_STYLE_GUIDE.md)** to understand our coding standards ### Making Changes 1. **Create a feature branch** from `main` ```bash git checkout -b feature/your-feature-name # or git checkout -b fix/bug-description ``` 2. **Follow our coding standards** - Use TypeScript with strict mode - Follow the existing code style (ESLint + Prettier) - Write meaningful commit messages - Add tests for new features - Update documentation if needed 3. **Test your changes** ```bash # Run all checks before submitting npm run lint # Check code style npm run type-check # Check TypeScript npm run test # Run tests npm run build # Ensure it builds successfully ``` 4. **Commit your changes** ```bash # Use conventional commit messages git add . git commit -m "feat: add new skill category filter" # or git commit -m "fix: resolve mobile navigation issue" ``` ### Submitting Your PR 1. **Push your branch** ```bash git push origin feature/your-feature-name ``` 2. **Create a Pull Request** on GitHub with: - Clear title describing the change - Detailed description of what was changed and why - Screenshots for UI changes - Reference to any related issues 3. **PR Requirements**: - ✅ All tests pass - ✅ No TypeScript errors - ✅ ESLint passes - ✅ Builds successfully - ✅ Follows our code style guide - ✅ Includes tests for new features - ✅ Updates documentation if needed ### Review Process 1. **Automated checks** will run on your PR 2. **Maintainers** will review your code 3. **Address feedback** by pushing new commits to your branch 4. **Merge** happens after approval from maintainers ## 🎯 Contribution Guidelines ### What We're Looking For - **Bug fixes** with clear reproduction steps - **New features** that align with the project's goals - **Performance improvements** with benchmarks - **Accessibility improvements** following WCAG guidelines - **Documentation** improvements and translations - **Test coverage** improvements ### Areas That Need Help - 🌍 **Internationalization** (i18n) support - 📱 **Mobile experience** improvements - ♿ **Accessibility** enhancements - 🎨 **UI/UX** improvements - 🧪 **Test coverage** expansion - 📚 **Documentation** improvements - 🔧 **Developer experience** tools ### Component Development When creating new components: ```tsx // Follow this structure for new components interface ComponentProps { // Define clear prop types title: string; onAction?: () => void; variant?: 'primary' | 'secondary'; } export const Component = ({ title, onAction, variant = 'primary' }: ComponentProps) => { // Component logic here return
{/* JSX here */}
; }; ``` ### File Organization ``` src/ ├── app/ # Next.js app directory ├── components/ # Reusable UI components │ ├── forms/ # Form-related components │ ├── layout/ # Layout components │ ├── sections/ # Page sections │ └── ui/ # Basic UI components ├── hooks/ # Custom React hooks ├── lib/ # Utility functions and configurations ├── types/ # TypeScript type definitions └── constants/ # Application constants ``` ## 🐛 Reporting Bugs When reporting bugs, please include: 1. **Steps to reproduce** the bug 2. **Expected behavior** vs actual behavior 3. **Screenshots** or screen recordings if applicable 4. **Browser/OS information** 5. **Console errors** if any Use our [bug report template](https://github.com/rahuldkjain/github-profile-readme-generator/issues/new/choose) for consistency. ## 💡 Suggesting Features For feature requests: 1. **Check existing issues** to avoid duplicates 2. **Describe the problem** you're trying to solve 3. **Propose a solution** with examples 4. **Consider the impact** on existing users 5. **Be open to discussion** and alternative approaches ## 🏷️ Issue Labels We use labels to organize issues: - `bug` - Something isn't working - `enhancement` - New feature or request - `good first issue` - Good for newcomers - `help wanted` - Extra attention is needed - `documentation` - Improvements to docs - `accessibility` - A11y improvements - `performance` - Performance improvements ## 📋 Code Review Checklist Before requesting review, ensure: - [ ] Code follows our style guide - [ ] All tests pass locally - [ ] TypeScript compiles without errors - [ ] ESLint passes without warnings - [ ] Component is accessible (proper ARIA labels, keyboard navigation) - [ ] Mobile-responsive design - [ ] Performance considerations addressed - [ ] Documentation updated if needed - [ ] Commit messages are clear and descriptive ## 🎉 Recognition Contributors are recognized in: - **README.md** contributors section - **All Contributors** bot for automated recognition - **Release notes** for significant contributions - **Discord community** shoutouts ## 📞 Getting Help - **Discord**: [Join our community](https://discord.gg/HHMs7Eg) - **Issues**: [GitHub Issues](https://github.com/rahuldkjain/github-profile-readme-generator/issues) - **Discussions**: [GitHub Discussions](https://github.com/rahuldkjain/github-profile-readme-generator/discussions) ## 📄 License By contributing, you agree that your contributions will be licensed under the same license as the project (MIT License). --- Thank you for contributing to GitHub Profile README Generator! 🚀 ================================================ FILE: DEPLOYMENT.md ================================================ # 🚀 Production Deployment Guide ## Pre-Deployment Checklist ### ✅ SEO & Performance - [x] **Meta Tags**: Complete Open Graph and Twitter Card metadata - [x] **Structured Data**: JSON-LD schema for better search visibility - [x] **Canonical URLs**: Proper canonical URLs for all pages - [x] **Sitemap**: Auto-generated XML sitemap at `/sitemap.xml` - [x] **Robots.txt**: SEO-friendly robots.txt configuration - [x] **PWA Manifest**: Mobile app-like experience with manifest.json ### ✅ Assets & Performance - [x] **Static Assets**: All assets properly placed in `/public` directory - [x] **Image Optimization**: OG image and favicon configured - [x] **Bundle Optimization**: Turbopack enabled for faster builds - [x] **CSS Optimization**: Tailwind CSS optimized for production - [x] **Font Loading**: Local fonts with proper fallbacks ### ✅ Analytics & Tracking - [x] **Google Analytics**: GA4 integration with environment variable - [x] **Buy Me Coffee**: Widget properly integrated - [x] **Error Tracking**: Console error handling ## Environment Configuration ### 1. Create Environment File ```bash cp .env.example .env.local ``` ### 2. Configure Analytics & Privacy ```env # Required for production analytics NEXT_PUBLIC_GA_ID=G-XXXXXXXXXX # Optional: Google Search Console verification NEXT_PUBLIC_GOOGLE_SITE_VERIFICATION=your-verification-code # Privacy & GDPR Compliance (recommended) NEXT_PUBLIC_REQUIRE_CONSENT=true NEXT_PUBLIC_ANONYMIZE_IP=true ``` **GA4 Setup Instructions:** 1. Create a GA4 property in Google Analytics 2. Copy your Measurement ID (format: G-XXXXXXXXXX) 3. Add it to your environment variables 4. The app includes GDPR-compliant consent management 5. Custom events track: GitHub auto-fill, README completion, file exports ## Build & Deploy ### GitHub Pages Deployment ```bash # Build for production npm run build # The built files will be in the 'out' directory # GitHub Pages will automatically serve from this directory ``` ### Custom Domain Deployment 1. Update the base URL in `next.config.ts` 2. Update URLs in `src/app/layout.tsx` metadata 3. Update sitemap and robots.txt URLs ## Performance Metrics ### Bundle Analysis - **Main Bundle**: ~282 kB (optimized) - **First Load JS**: ~174 kB shared - **Build Time**: ~3.2s with Turbopack ### SEO Score - **Structured Data**: ✅ Complete - **Meta Tags**: ✅ All pages covered - **Performance**: ✅ Optimized bundles - **Accessibility**: ✅ ARIA labels and semantic HTML - **PWA**: ✅ Manifest and service worker ready ## Post-Deployment Verification ### 1. SEO Tools - [ ] Test with [Google Rich Results Test](https://search.google.com/test/rich-results) - [ ] Verify with [Facebook Sharing Debugger](https://developers.facebook.com/tools/debug/) - [ ] Check with [Twitter Card Validator](https://cards-dev.twitter.com/validator) ### 2. Performance Testing - [ ] Run [Google PageSpeed Insights](https://pagespeed.web.dev/) - [ ] Test with [GTmetrix](https://gtmetrix.com/) - [ ] Verify mobile responsiveness ### 3. Functionality Testing - [ ] Test all form submissions - [ ] Verify GitHub API integration - [ ] Check markdown generation - [ ] Test theme switching - [ ] Verify analytics tracking ## Monitoring ### Analytics Setup 1. **Google Analytics**: Monitor user engagement and conversion 2. **Search Console**: Track search performance and indexing 3. **Error Monitoring**: Monitor console errors and user issues ### Key Metrics to Track - **Page Load Speed**: < 3 seconds - **Core Web Vitals**: LCP, FID, CLS scores - **Conversion Rate**: README generation completion - **User Engagement**: Time on site, bounce rate ## Troubleshooting ### Common Issues 1. **Build Failures**: Check Node.js version (18+) 2. **Asset Loading**: Verify all assets are in `/public` 3. **Analytics Not Working**: Check environment variables 4. **SEO Issues**: Validate structured data and meta tags ### Support - **Issues**: [GitHub Issues](https://github.com/rahuldkjain/github-profile-readme-generator/issues) - **Discussions**: [GitHub Discussions](https://github.com/rahuldkjain/github-profile-readme-generator/discussions) ================================================ FILE: LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: README.md ================================================

GitHub Profile Readme Generator

GitHub Profile README Generator

github-profile-readme-generator license github-profile-readme-generator forks github-profile-readme-generator stars github-profile-readme-generator issues github-profile-readme-generator pull-requests join discord community of github profile readme generator

github-profile-readme-generator gif

View Demo · Report Bug · Request Feature

Loved the tool? Please consider donating 💸 to help it improve!

sponsor github profile readme generator Buy Coffee for rahuldkjain Buy Me A Coffee

#### Tired of editing GitHub Profile README with new features? This tool provides an easy way to create a GitHub profile readme with the latest add-ons such as `visitors count`, `github stats`, etc. ## 🚀 Demo Try the tool: [GitHub Profile README Generator](https://rahuldkjain.github.io/github-profile-readme-generator) ## 🧐 Features Just fill in the details such as `Name`, `Tagline`, `Dev Platforms Username`, `Current Work`, `Portfolio`, `Blog`, etc. with a minimal UI. - **Uniform Dev Icons** - **Uniform Social Icons** - **Visitors Counter Badge** - **GitHub Profile Stats Card** - **GitHub Top Skills** - **GitHub Streak Stats** - **Dynamic Dev(.)to Blogs** (GitHub Action) - **Dynamic Medium Blogs** (GitHub Action) - **Dynamic Personal Blogs from RSS Feed** (GitHub Action) - **Wakatime Stats** [contribute](https://github.com/rahuldkjain/github-profile-readme-generator/issues/115) - **Buy Me A Coffee button** Click on `Generate README` to get your README in `markdown`. You can preview the README too. ## 🛠️ Installation Steps 1. Clone the repository ```bash git clone https://github.com/rahuldkjain/github-profile-readme-generator.git ``` 2. Change the working directory ```bash cd github-profile-readme-generator ``` 3. Install dependencies ```bash npm install ``` 4. Run the app ```bash npm run dev ``` 🌟 You are all set! ## 🍰 Contributing Please contribute using [GitHub Flow](https://guides.github.com/introduction/flow). Create a branch, add commits, and [open a pull request](https://github.com/rahuldkjain/github-profile-readme-generator/compare). Please read [`CONTRIBUTING`](CONTRIBUTING.md) for details on our [`CODE OF CONDUCT`](CODE_OF_CONDUCT.md), and the process for submitting pull requests to us. ## 💻 Built with - [Next.js 15](https://nextjs.org/) - React framework with App Router - [TypeScript](https://www.typescriptlang.org/) - Type safety and better DX - [Tailwind CSS](https://tailwindcss.com/) - Utility-first CSS framework - [Framer Motion](https://www.framer.com/motion/) - Production-ready motion library - [Lucide React](https://lucide.dev/) - Beautiful & consistent icons - [React Hook Form](https://react-hook-form.com/) - Performant forms with easy validation ## 🙇 Special Thanks - [Anurag Hazra](https://github.com/anuraghazra) for amazing [github-readme-stats](https://github.com/anuraghazra/github-readme-stats) - [Anton Komarev](https://github.com/antonkomarev) for super cool [github-profile-views-counter](https://github.com/antonkomarev/github-profile-views-counter) - [Gautam Krishna R](https://github.com/gautamkrishnar) for the awesome [blog post workflow](https://github.com/gautamkrishnar/blog-post-workflow) - [Jonah Lawrence](https://github.com/DenverCoder1) for the incredible [github-readme-streak-stats](https://github.com/DenverCoder1/github-readme-streak-stats) - [Julien Monty](https://github.com/konpa) for super useful [devicon](https://github.com/konpa/devicon) - [Eliot Sanford](https://github.com/techieeliot) for adding hashnode as a blog input ## 🙇 Sponsors - [Scott C Wilson](https://github.com/scottcwilson) donated the first-ever grant to this tool. A big thanks to him. - [Max Schmitt](https://github.com/mxschmitt) loved the tool and showed support with his donation. Thanks a lot. - [Aadit Kamat](https://github.com/aaditkamat) find the tool useful and showed support with his donation. A big thanks to him. - [Jean-Michel Fayard](https://github.com/jmfayard) used the generator to create his GitHub Profile README and he loved it. Thanks to him for showing support to the tool with the donation. ## 🔒 Privacy & Analytics This tool includes privacy-friendly analytics to help improve the user experience: - **Google Analytics 4** with GDPR-compliant consent management - **IP anonymization** and privacy-first configuration - **Custom events** tracking for GitHub auto-fill, README generation, and exports - **Cookie consent banner** - users can opt-out anytime - **No personal data** collection - only anonymous usage patterns ## 📄 Font Licensing This project uses the **Wotfard** font family: - **Font**: Wotfard Regular - **Usage**: This font is used under fair use for open source projects - **Source**: Downloaded from online typography resources - **Note**: If you're the font creator and have concerns about usage, please [contact us](mailto:rahuldkjain@gmail.com) For commercial use of this project, please verify font licensing requirements. ## 🙏 Support

sponsor github profile readme generator tweet github profile readme generator

Buy Coffee for rahuldkjain Buy Me A Coffee

## 🌟 Star History GPRG Star History Chart

Developed with ❤️ in India 🇮🇳

================================================ FILE: env.example ================================================ # GitHub Profile README Generator - Environment Configuration # Google Analytics 4 Configuration # Get your GA4 Measurement ID from Google Analytics # Format: G-XXXXXXXXXX NEXT_PUBLIC_GA_ID=G-XXXXXXXXXX # Optional: Google Search Console Verification # Get this from Google Search Console -> Settings -> Ownership verification NEXT_PUBLIC_GOOGLE_SITE_VERIFICATION=your-verification-code # Privacy & GDPR Compliance # Set to 'true' to require explicit consent before loading analytics # Set to 'false' to load analytics by default (not GDPR compliant) NEXT_PUBLIC_REQUIRE_CONSENT=true # Analytics Configuration # Set to 'true' to anonymize IP addresses (recommended for privacy) NEXT_PUBLIC_ANONYMIZE_IP=true # Development Configuration # Set to 'development' to disable analytics in development mode NODE_ENV=development # Optional: Custom Domain Configuration # Update if deploying to a custom domain NEXT_PUBLIC_SITE_URL=https://your-domain.com ================================================ FILE: eslint.config.mjs ================================================ import { dirname } from "path"; import { fileURLToPath } from "url"; import { FlatCompat } from "@eslint/eslintrc"; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const compat = new FlatCompat({ baseDirectory: __dirname, }); const eslintConfig = [ ...compat.extends("next/core-web-vitals", "next/typescript", "prettier"), { ignores: [ "node_modules/**", ".next/**", "out/**", "build/**", "dist/**", "coverage/**", "*.config.js", "*.config.ts", "next-env.d.ts", "old-gatsby-backup/**", ], }, { rules: { "@typescript-eslint/no-unused-vars": [ "warn", { argsIgnorePattern: "^_", varsIgnorePattern: "^_", }, ], "@typescript-eslint/no-explicit-any": "warn", "react/no-unescaped-entities": "off", "react-hooks/exhaustive-deps": "warn", }, }, ]; export default eslintConfig; ================================================ FILE: next.config.ts ================================================ import type { NextConfig } from 'next'; import { PHASE_PRODUCTION_BUILD } from 'next/constants'; const nextConfig = (phase: string): NextConfig => { // Determine if we should use basePath (production build, not Surge preview) const isProductionBuild = phase === PHASE_PRODUCTION_BUILD; const isSurgePreview = process.env.SURGE_PREVIEW === 'true'; const shouldUseBasePath = isProductionBuild && !isSurgePreview; const basePath = shouldUseBasePath ? '/github-profile-readme-generator' : ''; return { // Output as static site for GitHub Pages output: 'export', // Base path for GitHub Pages (only for production builds, not Surge previews) basePath, // Asset prefix to ensure all assets use the correct path assetPrefix: shouldUseBasePath ? '/github-profile-readme-generator/' : '', // Environment variables env: { NEXT_PUBLIC_BASE_PATH: basePath, }, // Image optimization for static export images: { unoptimized: true, // Required for static export }, // Trailing slashes for better compatibility trailingSlash: true, // Enable strict mode for better error catching reactStrictMode: true, // Enable experimental features for better performance experimental: { // Optimize CSS optimizeCss: true, // Enable optimized package imports for heavy libraries optimizePackageImports: [ 'framer-motion', '@hookform/resolvers', 'react-markdown', 'remark-gfm', 'rehype-raw', 'rehype-sanitize', 'zod', 'zustand', 'lucide-react', '@headlessui/react', ], }, // Compiler options for better performance compiler: { // Remove console.log in production removeConsole: isProductionBuild ? { exclude: ['error', 'warn'] } : false, // Enable React compiler optimizations reactRemoveProperties: isProductionBuild, }, // Optimize transpilation transpilePackages: ['react-markdown', 'remark-gfm', 'rehype-raw', 'rehype-sanitize'], // Turbopack configuration (replaces webpack config) turbopack: { // Enable faster module resolution resolveAlias: { // Optimize common imports '@': './src', }, }, // Webpack optimizations for development (only when not using Turbopack) webpack: (config, { dev, isServer }) => { if (dev && !isServer && !process.env.TURBOPACK) { // Optimize development builds config.optimization = { ...config.optimization, splitChunks: { chunks: 'all', cacheGroups: { vendor: { test: /[\\/]node_modules[\\/]/, name: 'vendors', chunks: 'all', priority: 10, }, markdown: { test: /[\\/]node_modules[\\/](react-markdown|remark-|rehype-)/, name: 'markdown', chunks: 'all', priority: 20, }, }, }, }; // Enable faster rebuilds config.cache = { type: 'filesystem', buildDependencies: { config: [__filename], }, }; } return config; }, }; }; export default nextConfig; ================================================ FILE: package.json ================================================ { "name": "github-profile-readme-generator", "version": "2.0.0", "description": "Generate GitHub profile README easily with the latest add-ons like visitors count, GitHub stats, etc using minimal UI", "private": true, "author": "Rahul Jain ", "scripts": { "dev": "TURBOPACK=1 next dev --turbo", "build": "next build --turbo", "export": "next build --turbo", "start": "next start", "type-check": "tsc --noEmit", "lint": "eslint", "format": "prettier --write \"src/**/*.{ts,tsx,js,jsx,json,css,md}\"", "format:check": "prettier --check \"src/**/*.{ts,tsx,js,jsx,json,css,md}\"", "test": "vitest", "test:ui": "vitest --ui", "test:coverage": "vitest --coverage" }, "dependencies": { "@headlessui/react": "^2.2.9", "@hookform/resolvers": "^5.2.2", "@next/third-parties": "^15.5.4", "@tailwindcss/typography": "^0.5.19", "critters": "^0.0.23", "framer-motion": "^12.23.24", "lucide-react": "^0.545.0", "next": "15.5.4", "react": "19.1.0", "react-dom": "19.1.0", "react-hook-form": "^7.65.0", "react-markdown": "^10.1.0", "rehype-raw": "^7.0.0", "rehype-sanitize": "^6.0.0", "remark-gfm": "^4.0.1", "zod": "^4.1.12", "zustand": "^5.0.8" }, "devDependencies": { "@eslint/eslintrc": "^3", "@tailwindcss/postcss": "^4", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^14.6.1", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", "@vitejs/plugin-react": "^5.0.4", "eslint": "^9", "eslint-config-next": "15.5.4", "eslint-config-prettier": "^10.1.8", "jsdom": "^27.0.0", "prettier": "^3.6.2", "prettier-plugin-tailwindcss": "^0.6.14", "tailwindcss": "^4", "typescript": "^5", "vitest": "^3.2.4" } } ================================================ FILE: postcss.config.mjs ================================================ const config = { plugins: ["@tailwindcss/postcss"], }; export default config; ================================================ FILE: public/manifest.json ================================================ { "name": "GitHub Profile README Generator", "short_name": "GitHub README Gen", "description": "Create amazing GitHub profile READMEs in seconds with customizable templates and easy-to-use interface", "start_url": "./", "display": "standalone", "background_color": "#ffffff", "theme_color": "#000000", "orientation": "portrait-primary", "icons": [ { "src": "/mdg.png", "sizes": "192x192", "type": "image/png", "purpose": "maskable any" }, { "src": "/mdg.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable any" } ], "categories": ["developer", "productivity", "utilities"], "lang": "en", "dir": "ltr", "scope": "./", "prefer_related_applications": false } ================================================ FILE: public/robots.txt ================================================ # https://www.robotstxt.org/robotstxt.html User-agent: * Allow: / # Host Host: https://rahuldkjain.github.io # Sitemaps Sitemap: https://rahuldkjain.github.io/gh-profile-readme-generator/sitemap.xml ================================================ FILE: setupTests.js ================================================ import { configure } from 'enzyme'; import Adapter from 'enzyme-adapter-react-16'; configure({ adapter: new Adapter() }); ================================================ FILE: src/app/about/page.tsx ================================================ import { Header } from '@/components/layout/header'; import { Footer } from '@/components/layout/footer'; import type { Metadata } from 'next'; import Image from 'next/image'; export const metadata: Metadata = { title: 'About', description: 'Learn about GitHub Profile README Generator - an open-source tool for creating awesome GitHub profile READMEs with customizable templates, skills showcase, and social links integration.', alternates: { canonical: '/about', }, openGraph: { title: 'About | GitHub Profile README Generator', description: 'Learn about GitHub Profile README Generator - an open-source tool for creating awesome GitHub profile READMEs', url: '/about', }, }; export default function AboutPage() { return (

👨‍💻 About

GitHub Profile README Generator is an OSS (Open Source Software) that provides a cool interface to generate GitHub profile README in markdown.

The tool aims to provide hassle-free experience to add trending addons like profile{' '} visitors count, github-stats,{' '} dynamic blog posts etc.

The profile should be neat and minimal to give a clear overview of the work. Non-uniform icons, too much content, too much images/gifs distracts visitors to see your actual work.

To solve this, GitHub Profile README Generator came into existence.

So many developers contributed to the project and made it more awesome to use. You can contribute too to make it grow even further.

Contributors 🙏

List of the developers who contributed to the project. A big shout out for them.

Contributors

How do I create a profile README?

The profile README is created by creating a new repository that's the same name as your username. For example, my GitHub username is rahuldkjain so I created a new repository with the name rahuldkjain. Note: at the time of this writing, in order to access the profile README feature, the letter-casing must match your GitHub username.

  1. Create a new repository with the same name (including casing) as your GitHub username:{' '} https://github.com/new
  2. Create a README.md file inside the new repo with content (text, GIFs, images, emojis, etc.)
  3. Commit your fancy new README! If you're on GitHub's web interface you can choose to commit directly to the repo's main branch (i.e., master or main) which will make it immediately visible on your profile
  4. Push changes to GitHub (if you made changes locally i.e., on your computer and not github.com)

How to use?

Tired of editing profile README(.md) to add new features like visitors-count badge, github-stats etc?

Don't worry. Keep calm, fill the form and let the tool do the work for you

github profile readme generator

Why visitors count keeps on increasing?

So many users raised an issue that the counter keeps on increasing everytime the page reloads.

Well it is visitors count not "unique" visitors count. The goal of the addon is to provide a good stat of how well the github profile is doing.

Proper use or misuse of the addon is the sole responsibility of the user. The developer of the addon is working on it to fix this issue.

); } ================================================ FILE: src/app/addons/page.tsx ================================================ import { Header } from '@/components/layout/header'; import { Footer } from '@/components/layout/footer'; import type { Metadata } from 'next'; export const metadata: Metadata = { title: 'Addons', description: 'Discover the awesome open-source addons and tools used in GitHub Profile README Generator. Explore the technology stack and libraries that power this amazing tool.', alternates: { canonical: '/addons', }, openGraph: { title: 'Addons | GitHub Profile README Generator', description: 'Discover the awesome open-source addons and tools used in GitHub Profile README Generator', url: '/addons', }, }; export default function AddonsPage() { return (

🚀 Addons

GitHub Profile README Generator tool uses few open-source addons developed by other developers. Including such features makes the tool useful. The developers of this tool is very grateful to use these awesome addons.


GitHub README Stats

⚡️ Dynamically generated stats for your github readmes

GitHub Stats Card

Rahul's github stats

Top Skills Card

Rahul's github top skills

Developed by{' '} Anurag Hazra .

You can customize the theme too. See how to customize yours{' '} here


GitHub Readme Streak Stats

Stay motivated while contributing to open source by displaying your current contribution streak

rahuldkjain

Developed by{' '} Jonah Lawrence .

See how to customize the theme{' '} here


GitHub Profile Views Counter

It counts how many times your GitHub profile has been viewed. Free cloud micro-service.

rahuldkjain

Developed by{' '} Anton Komarev .

You can customize the color, label and style too. See how to customize{' '} here


Dynamic Latest Blog Posts

Show your latest blog posts from any sources (like dev.to, medium etc) or StackOverflow activity on your GitHub profile/project readme automatically using the RSS feed.

dynamic latest blog example

Developed by{' '} Gautam Krishna R

How to use

  • Go to your repository
  • Add the following section to your **README.md** file, you can give whatever title you want. Just make sure that you use **<!-- BLOG-POST-LIST:START --><!-- BLOG-POST-LIST:END -->** in your readme. The workflow will replace this comment with the actual blog post list:
            {`# Blog posts


`}
          
  • Create a folder named .github and create workflows folder inside it if it doesn't exist.
  • Create a new file named blog-post-workflow.yml with the following contents inside the workflows folder:
            {`name: Latest blog post workflow
on:
  schedule:
    # Runs every hour
    - cron: '0 * * * *'
jobs:
  update-readme-with-blog:
    name: Update this repo's README with latest blog posts
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: gautamkrishnar/blog-post-workflow@master
        with:
          feed_list: 'https://dev.to/feed/rahuldkjain, https://medium.com/feed/@rahuldkjain'`}
          
  • Replace the above url list with your own rss feed urls.
  • Commit and wait for it to run

To know more, check out the{' '} official github repository

); } ================================================ FILE: src/app/globals.css ================================================ @import 'tailwindcss'; @plugin '@tailwindcss/typography'; /* Screen reader only utility */ .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0; } :root { /* Light mode colors */ --background: #ffffff; --foreground: #171717; --card: #f9fafb; --card-foreground: #171717; --primary: #2563eb; --primary-foreground: #ffffff; --secondary: #64748b; --secondary-foreground: #ffffff; --muted: #f1f5f9; --muted-foreground: #64748b; --accent: #f1f5f9; --accent-foreground: #0f172a; --destructive: #ef4444; --destructive-foreground: #ffffff; --border: #e2e8f0; --input: #e2e8f0; --ring: #2563eb; --radius: 0.5rem; } @theme inline { --color-background: var(--background); --color-foreground: var(--foreground); --color-card: var(--card); --color-card-foreground: var(--card-foreground); --color-primary: var(--primary); --color-primary-foreground: var(--primary-foreground); --color-secondary: var(--secondary); --color-secondary-foreground: var(--secondary-foreground); --color-muted: var(--muted); --color-muted-foreground: var(--muted-foreground); --color-accent: var(--accent); --color-accent-foreground: var(--accent-foreground); --color-destructive: var(--destructive); --color-destructive-foreground: var(--destructive-foreground); --color-border: var(--border); --color-input: var(--input); --color-ring: var(--ring); } @media (prefers-color-scheme: dark) { :root { /* Dark mode colors */ --background: #0a0a0a; --foreground: #ededed; --card: #171717; --card-foreground: #ededed; --primary: #3b82f6; --primary-foreground: #ffffff; --secondary: #94a3b8; --secondary-foreground: #0f172a; --muted: #1e293b; --muted-foreground: #94a3b8; --accent: #1e293b; --accent-foreground: #f1f5f9; --destructive: #dc2626; --destructive-foreground: #ffffff; --border: #1e293b; --input: #1e293b; --ring: #3b82f6; } } /* Manual light mode class override (to override system preference) */ .light { --background: #ffffff; --foreground: #171717; --card: #f9fafb; --card-foreground: #171717; --primary: #2563eb; --primary-foreground: #ffffff; --secondary: #64748b; --secondary-foreground: #ffffff; --muted: #f1f5f9; --muted-foreground: #64748b; --accent: #f1f5f9; --accent-foreground: #0f172a; --destructive: #ef4444; --destructive-foreground: #ffffff; --border: #e2e8f0; --input: #e2e8f0; --ring: #2563eb; } /* Manual dark mode class override */ .dark { --background: #0a0a0a; --foreground: #ededed; --card: #171717; --card-foreground: #ededed; --primary: #3b82f6; --primary-foreground: #ffffff; --secondary: #94a3b8; --secondary-foreground: #0f172a; --muted: #1e293b; --muted-foreground: #94a3b8; --accent: #1e293b; --accent-foreground: #f1f5f9; --destructive: #dc2626; --destructive-foreground: #ffffff; --border: #1e293b; --input: #1e293b; --ring: #3b82f6; } * { border-color: var(--border); } body { background: var(--background); color: var(--foreground); font-family: var(--font-sans, Arial, Helvetica, sans-serif); } /* Optimized transitions for theme changes - only target necessary elements */ html { transition: background-color 100ms ease-out; } body { transition: background-color 100ms ease-out, color 100ms ease-out; } /* Target specific UI elements for faster transitions */ [class*='bg-'], [class*='text-'], [class*='border-'] { transition: background-color 100ms ease-out, color 100ms ease-out, border-color 100ms ease-out; } /* SVG icons transition */ svg { transition: fill 100ms ease-out, stroke 100ms ease-out, color 100ms ease-out; } /* Button and interactive elements */ button, a, input, select, textarea { transition: background-color 100ms ease-out, color 100ms ease-out, border-color 100ms ease-out, opacity 100ms ease-out; } /* Cards and containers */ [class*='card'], [class*='bg-card'] { transition: background-color 100ms ease-out, border-color 100ms ease-out; } /* Optimize theme switching performance */ html.theme-switching * { transition: none !important; } html.theme-switching { transition: none !important; } /* Respect reduced motion preferences */ @media (prefers-reduced-motion: reduce) { * { transition: none !important; animation: none !important; } } /* Reduced motion override via settings */ :root[style*='--motion-reduce'] * { transition: none !important; animation: none !important; } /* Markdown Preview Styles */ .markdown-preview { color: var(--foreground); } .markdown-preview h1, .markdown-preview h2, .markdown-preview h3, .markdown-preview h4, .markdown-preview h5, .markdown-preview h6 { color: var(--foreground); } .markdown-preview p { color: var(--foreground); line-height: 1.6; } .markdown-preview strong, .markdown-preview b { color: var(--foreground); font-weight: 600; } .markdown-preview img { display: inline-block; vertical-align: middle; } .markdown-preview a img { margin: 0; } /* Custom page content styles to override prose */ .page-content { color: var(--foreground); } .page-content h1, .page-content h2, .page-content h3, .page-content h4, .page-content h5, .page-content h6 { color: var(--foreground); line-height: 1.2; margin-bottom: 1rem; } .page-content h1 { font-size: 2.25rem; font-weight: 700; } .page-content h2 { font-size: 1.875rem; font-weight: 700; } .page-content h3 { font-size: 1.5rem; font-weight: 600; } .page-content h4 { font-size: 1.25rem; font-weight: 600; } .page-content p { color: var(--foreground); line-height: 1.6; margin-bottom: 1rem; } .page-content strong, .page-content b { color: var(--foreground); font-weight: 600; } .page-content a { color: var(--primary); text-decoration: underline; } .page-content a:hover { text-decoration: none; } .page-content ul, .page-content ol { color: var(--foreground); margin-bottom: 1rem; padding-left: 1.5rem; } .page-content li { margin-bottom: 0.5rem; } .page-content blockquote { color: var(--foreground); border-left: 4px solid var(--primary); padding-left: 1rem; margin: 1.5rem 0; font-style: italic; } .page-content hr { border-color: var(--border); margin: 2rem 0; } .page-content pre { background-color: var(--muted); color: var(--foreground); padding: 1rem; border-radius: 0.5rem; overflow-x: auto; margin: 1rem 0; } .page-content code { background-color: var(--muted); color: var(--foreground); padding: 0.125rem 0.25rem; border-radius: 0.25rem; font-size: 0.875rem; } .page-content img { max-width: 100%; height: auto; margin: 1rem 0; } /* High Contrast Mode */ .high-contrast { --background: #000000; --foreground: #ffffff; --card: #000000; --card-foreground: #ffffff; --primary: #ffff00; --primary-foreground: #000000; --secondary: #00ffff; --secondary-foreground: #000000; --muted: #333333; --muted-foreground: #ffffff; --accent: #00ff00; --accent-foreground: #000000; --destructive: #ff0000; --destructive-foreground: #ffffff; --border: #ffffff; --input: #ffffff; --ring: #ffff00; } .high-contrast * { border-width: 2px; } .high-contrast button, .high-contrast a, .high-contrast input, .high-contrast textarea, .high-contrast select { outline: 2px solid var(--foreground); outline-offset: 2px; } /* Form placeholder opacity - reduce to avoid looking like filled fields */ input::placeholder, textarea::placeholder, select::placeholder { opacity: 0.4; } /* Font Size Variants */ .text-small { font-size: 14px; } .text-small h1 { font-size: 1.75rem; } .text-small h2 { font-size: 1.5rem; } .text-small h3 { font-size: 1.25rem; } .text-large { font-size: 18px; } .text-large h1 { font-size: 2.5rem; } .text-large h2 { font-size: 2rem; } .text-large h3 { font-size: 1.75rem; } ================================================ FILE: src/app/layout.tsx ================================================ import type { Metadata } from 'next'; import { Roboto_Mono } from 'next/font/google'; import localFont from 'next/font/local'; import './globals.css'; import { ThemeProvider } from '@/components/layout/theme-provider'; import { ToastProvider } from '@/components/ui/toast'; import { BuyMeACoffeeWidget } from '@/components/ui/buy-me-coffee'; import { ConditionalAnalytics } from '@/components/analytics/conditional-analytics'; import { CookieConsent } from '@/components/ui/cookie-consent'; import { getAssetPath } from '@/lib/asset-path'; const robotoMono = Roboto_Mono({ variable: '--font-mono', subsets: ['latin'], weight: ['400', '500', '600', '700'], }); const wotfard = localFont({ src: '../../public/fonts/wotfard/Wotfard-Regular.woff', variable: '--font-sans', weight: '400', }); export const metadata: Metadata = { title: { default: 'GitHub Profile README Generator - Create Amazing Profile in Seconds', template: '%s | GitHub Profile README Generator', }, description: 'The best profile README generator to create an amazing GitHub profile in seconds. Customize your profile with skills, social links, stats, and more. Free, open-source, and easy to use.', keywords: [ 'github', 'profile', 'readme', 'generator', 'markdown', 'github profile', 'readme generator', 'github readme', 'profile generator', 'github stats', 'github badges', 'developer profile', 'github profile maker', 'readme maker', ], authors: [{ name: 'Rahul Jain', url: 'https://github.com/rahuldkjain' }], creator: 'Rahul Jain', publisher: 'Rahul Jain', formatDetection: { email: false, address: false, telephone: false, }, metadataBase: new URL('https://rahuldkjain.github.io/gh-profile-readme-generator/'), alternates: { canonical: '/', }, openGraph: { title: 'GitHub Profile README Generator - Create Amazing Profile in Seconds', description: 'Create an amazing GitHub profile README in seconds with customizable templates and easy-to-use interface. Add skills, social links, GitHub stats, and more.', url: 'https://rahuldkjain.github.io/gh-profile-readme-generator/', siteName: 'GitHub Profile README Generator', locale: 'en_US', type: 'website', images: [ { url: '/og-image.png', width: 1200, height: 630, alt: 'GitHub Profile README Generator - Create Amazing Profile in Seconds', }, ], }, twitter: { card: 'summary_large_image', title: 'GitHub Profile README Generator', description: 'Create an amazing GitHub profile README in seconds with customizable templates. Free and easy to use.', creator: '@rahuldkjain', images: ['/og-image.png'], }, icons: { icon: [ { url: '/favicon.ico', sizes: 'any' }, { url: getAssetPath('/mdg.png'), type: 'image/png' }, ], apple: getAssetPath('/mdg.png'), }, manifest: getAssetPath('/manifest.json'), robots: { index: true, follow: true, googleBot: { index: true, follow: true, 'max-video-preview': -1, 'max-image-preview': 'large', 'max-snippet': -1, }, }, verification: { google: 'google-site-verification-code', // User will need to add their code }, }; export default function RootLayout({ children, }: Readonly<{ children: React.ReactNode; }>) { const jsonLd = { '@context': 'https://schema.org', '@type': 'WebApplication', name: 'GitHub Profile README Generator', description: 'Create an amazing GitHub profile README in seconds with customizable templates and easy-to-use interface.', url: 'https://rahuldkjain.github.io/gh-profile-readme-generator/', applicationCategory: 'DeveloperApplication', operatingSystem: 'Any', offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD', }, author: { '@type': 'Person', name: 'Rahul Jain', url: 'https://github.com/rahuldkjain', }, aggregateRating: { '@type': 'AggregateRating', ratingValue: '4.8', ratingCount: '1000', }, }; return ( {/* Favicon and manifest are now handled by Next.js metadata API above */} ## Sponsors 🙇 - [Scott C Wilson](https://github.com/scottcwilson) donated the first ever grant to this tool. A big thanks to him. - [Max Schmitt](https://github.com/mxschmitt) loved the tool and showed the support with his donation. Thanks a lot. ================================================ FILE: src/styles/tailwind.css ================================================ @tailwind base; @tailwind components; @tailwind utilities; @tailwind @screens; /* Additional vertical padding used by kbd tag. */ .py-05 { padding-top: 0.125rem; padding-bottom: 0.125rem; } .markdown { @apply text-gray-900 leading-normal break-words; } .markdown > * + * { @apply mt-0 mb-4; } .markdown li + li { @apply mt-1; } .markdown li > p + p { @apply mt-6; } .markdown strong { @apply font-semibold; } .markdown a { @apply text-blue-600 font-semibold; } .markdown strong a { @apply font-bold; } .markdown h1 { @apply leading-tight border-b text-4xl font-semibold mb-4 mt-6 pb-2; } .markdown h2 { @apply leading-tight border-b text-2xl font-semibold mb-4 mt-6 pb-2; } .markdown h3 { @apply leading-snug text-lg font-semibold mb-4 mt-6; } .markdown h4 { @apply leading-none text-base font-semibold mb-4 mt-6; } .markdown h5 { @apply leading-tight text-sm font-semibold mb-4 mt-6; } .markdown h6 { @apply leading-tight text-sm font-semibold text-gray-600 mb-4 mt-6; } .markdown blockquote { @apply text-base border-l-4 border-gray-300 pl-4 pr-4 text-gray-600; } .markdown code { @apply font-body text-sm inline bg-gray-200 rounded px-1 py-05; } .markdown pre { @apply bg-gray-900 text-white overflow-scroll rounded p-4; } .markdown pre code { @apply block p-0 rounded-none text-white; } .markdown ul { @apply text-base pl-8 list-disc; } .markdown ol { @apply text-base pl-8 list-decimal; } .markdown kbd { @apply text-xs inline-block rounded border px-1 py-05 align-middle font-normal font-body shadow; } .markdown table { @apply text-base border-gray-600; } .markdown th { @apply border py-1 px-3; } .markdown td { @apply border py-1 px-3; } /* Override pygments style background color. */ .markdown .highlight pre { @apply bg-gray-100 !important; } ================================================ FILE: src/test/setup.ts ================================================ import '@testing-library/jest-dom'; // Add custom matchers or global test setup here ================================================ FILE: src/types/profile.ts ================================================ // Profile data types export interface ProfilePrefix { title: string; currentWork: string; currentLearn: string; collaborateOn: string; helpWith: string; ama: string; contact: string; resume: string; funFact: string; portfolio: string; blog: string; } export interface GithubStatsOptions { theme: string; titleColor: string; textColor: string; bgColor: string; hideBorder: boolean; cacheSeconds: number | null; locale: string; } export interface TopLanguagesOptions { theme: string; titleColor: string; textColor: string; bgColor: string; hideBorder: boolean; cacheSeconds: number | null; locale: string; } export interface StreakStatsOptions { theme: string; } export interface ProfileData { title: string; subtitle: string; currentWork: string; currentLearn: string; collaborateOn: string; helpWith: string; ama: string; contact: string; funFact: string; visitorsBadge: boolean; badgeStyle: 'flat' | 'flat-square' | 'plastic' | 'for-the-badge'; badgeColor: string; badgeLabel: string; githubProfileTrophy: boolean; githubStats: boolean; githubStatsOptions: GithubStatsOptions; topLanguages: boolean; topLanguagesOptions: TopLanguagesOptions; streakStats: boolean; streakStatsOptions: StreakStatsOptions; devDynamicBlogs: boolean; mediumDynamicBlogs: boolean; rssDynamicBlogs: boolean; } export interface ProfileLinks { currentWork: string; collaborateOn: string; helpWith: string; portfolio: string; blog: string; resume: string; } export interface SocialLinks { github: string; dev: string; linkedin: string; codepen: string; stackoverflow: string; kaggle: string; codesandbox: string; fb: string; instagram: string; twitter: string; dribbble: string; behance: string; medium: string; youtube: string; codechef: string; hackerrank: string; codeforces: string; leetcode: string; topcoder: string; hackerearth: string; geeks_for_geeks: string; discord: string; rssurl: string; twitterBadge: boolean; } export interface SupportLinks { buyMeACoffee: string; } export interface Skills { [key: string]: boolean; } ================================================ FILE: src/types/skills.ts ================================================ export interface SkillCategory { title: string; skills: string[]; } export interface CategorizedSkills { [key: string]: SkillCategory; } export interface SkillIcons { [key: string]: string; } export interface SkillWebsites { [key: string]: string; } export type SkillState = Record; ================================================ FILE: src/types/theme.ts ================================================ export type ThemeMode = 'light' | 'dark' | 'system'; export type ResolvedTheme = 'light' | 'dark'; export interface AccessibilitySettings { highContrast: boolean; fontSize: 'small' | 'medium' | 'large'; reducedMotion: boolean; } ================================================ FILE: tailwind.config.js ================================================ module.exports = { purge: [], theme: { extend: {}, fontSize: { xxs: '.60rem', xs: '.75rem', sm: '.875rem', tiny: '.875rem', base: '1rem', lg: '1.125rem', xl: '1.25rem', '2xl': '1.5rem', '3xl': '1.875rem', '4xl': '2.25rem', '5xl': '3rem', '6xl': '4rem', '7xl': '5rem', }, fontFamily: { title: ['Lato', 'sans-serif'], body: ['Roboto Mono', 'monospace'], }, }, variants: {}, plugins: [], }; ================================================ FILE: tailwind.config.ts ================================================ import type { Config } from 'tailwindcss'; const config: Config = { content: [ // Only scan the actual source files we need './src/app/**/*.{js,ts,jsx,tsx}', './src/components/**/*.{js,ts,jsx,tsx}', './src/lib/**/*.{js,ts,jsx,tsx}', // Exclude heavy directories '!./src/constants/**', '!./node_modules/**', '!./old-gatsby-backup/**', '!./out/**', ], theme: { extend: { fontFamily: { sans: ['var(--font-wotfard)', 'system-ui', 'sans-serif'], mono: ['var(--font-roboto-mono)', 'monospace'], }, colors: { border: 'hsl(var(--border))', input: 'hsl(var(--input))', ring: 'hsl(var(--ring))', background: 'hsl(var(--background))', foreground: 'hsl(var(--foreground))', primary: { DEFAULT: 'hsl(var(--primary))', foreground: 'hsl(var(--primary-foreground))', }, secondary: { DEFAULT: 'hsl(var(--secondary))', foreground: 'hsl(var(--secondary-foreground))', }, destructive: { DEFAULT: 'hsl(var(--destructive))', foreground: 'hsl(var(--destructive-foreground))', }, muted: { DEFAULT: 'hsl(var(--muted))', foreground: 'hsl(var(--muted-foreground))', }, accent: { DEFAULT: 'hsl(var(--accent))', foreground: 'hsl(var(--accent-foreground))', }, popover: { DEFAULT: 'hsl(var(--popover))', foreground: 'hsl(var(--popover-foreground))', }, card: { DEFAULT: 'hsl(var(--card))', foreground: 'hsl(var(--card-foreground))', }, }, borderRadius: { lg: 'var(--radius)', md: 'calc(var(--radius) - 2px)', sm: 'calc(var(--radius) - 4px)', }, animation: { 'fade-in': 'fadeIn 0.3s ease-in-out', 'slide-in': 'slideIn 0.3s ease-out', 'bounce-in': 'bounceIn 0.6s ease-out', }, keyframes: { fadeIn: { '0%': { opacity: '0' }, '100%': { opacity: '1' }, }, slideIn: { '0%': { transform: 'translateY(-10px)', opacity: '0' }, '100%': { transform: 'translateY(0)', opacity: '1' }, }, bounceIn: { '0%, 20%, 40%, 60%, 80%': { transform: 'translateY(0)', }, '10%, 30%, 50%, 70%, 90%': { transform: 'translateY(-10px)', }, }, }, }, }, plugins: [require('@tailwindcss/typography')], }; export default config; ================================================ FILE: tsconfig.json ================================================ { "compilerOptions": { "target": "ES2017", "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, "strict": true, "noEmit": true, "esModuleInterop": true, "module": "esnext", "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", "incremental": true, "plugins": [ { "name": "next" } ], "paths": { "@/*": ["./src/*"] } }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], "exclude": ["node_modules"] } ================================================ FILE: vitest.config.ts ================================================ import { defineConfig } from 'vitest/config'; import react from '@vitejs/plugin-react'; import path from 'path'; export default defineConfig({ plugins: [react()], test: { environment: 'jsdom', globals: true, setupFiles: ['./src/test/setup.ts'], coverage: { provider: 'v8', reporter: ['text', 'json', 'html'], exclude: [ 'node_modules/', 'src/test/', '**/*.config.ts', '**/*.config.js', '**/*.d.ts', '**/types/', ], }, }, resolve: { alias: { '@': path.resolve(__dirname, './src'), }, }, });