A modern, fast, and accessible developer portfolio built with Astro and Tailwind CSS. All content is automatically fetched from GitHub, making it easy to keep your portfolio up-to-date.
π Live Site: kuxall.github.io
- Fully Automated Content: All data fetched from GitHub API (profile, repositories, stats)
- Modern Design: Clean, responsive UI with dark/light theme toggle
- Performance: Static site generation for blazing-fast load times
- Accessibility: WCAG AA compliant, keyboard navigable, semantic HTML
- SEO Optimized: Meta tags, OpenGraph, Twitter cards, sitemap
- Auto-Refresh: Weekly automatic updates via GitHub Actions
All portfolio data is automatically fetched from the GitHub API for user Kuxall:
- Name, avatar, bio, location, company, email
- Followers count, public repositories
- GitHub profile URL
- Featured Projects: Top repositories by stars and recent activity
- Each project includes:
- Name, description, topics/tags
- Primary language, star count, fork count
- Last updated date
- Links to repository and live demo (if available)
- Languages: Automatically detected from repository languages
- Technologies: Extracted from repository topics
- Ranked by usage frequency across repositories
- Total repositories, stars, and forks
- Public repository count
- GitHub contribution graph
- Node.js 20.x or higher
- npm or yarn
-
Clone the repository
git clone https://github.com/kuxall/kuxall.github.io.git cd kuxall.github.io -
Install dependencies
npm install
-
Start development server
npm run dev
-
Open in browser Navigate to
http://localhost:4321
npm run buildThe built site will be in the dist/ directory.
npm run previewEdit site.config.ts to customize:
export const siteConfig = {
// GitHub username to fetch data from
githubUsername: 'Kuxall',
// Number of featured projects (default: 9)
maxFeaturedProjects: 9,
// Theme settings
theme: {
defaultMode: 'dark', // 'light' or 'dark'
enableToggle: true,
},
// SEO configuration
seo: {
title: 'Your Name - Developer Portfolio',
description: 'Your custom description',
keywords: ['your', 'keywords'],
},
// Optional analytics
analytics: {
enabled: false,
provider: 'plausible', // or 'umami'
siteId: '',
},
};Featured projects are selected in src/lib/github.ts:
export async function getFeaturedProjects(username: string) {
const repos = await fetchUserRepos(username);
// Customize sorting logic here
const sortedRepos = repos
.sort((a, b) => {
if (b.stargazers_count !== a.stargazers_count) {
return b.stargazers_count - a.stargazers_count;
}
return new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime();
})
.slice(0, siteConfig.maxFeaturedProjects);
// ...
}To prioritize pinned repositories, you can use the GitHub GraphQL API to fetch pinned repos first.
The portfolio automatically refreshes weekly to fetch the latest data from GitHub.
- Scheduled Workflow:
.github/workflows/auto-refresh.ymlruns every Monday at 00:00 UTC - Rebuild: Fetches fresh data from GitHub API during build
- Commit: Updates timestamp file to track last refresh
You can manually trigger a refresh:
- Go to your repository on GitHub
- Click Actions tab
- Select Auto Refresh Data workflow
- Click Run workflow
If you encounter API rate limiting, add a GitHub token:
- Create a Personal Access Token (PAT) with
public_reposcope - Add it as a repository secret named
GITHUB_TOKEN - The workflows will automatically use it
This repository is configured to automatically deploy to GitHub Pages on every push to main.
Setup Steps:
- Go to repository Settings β Pages
- Under Source, select GitHub Actions
- The site will deploy automatically on the next push
If you prefer manual deployment:
npm run buildThen deploy the dist/ folder to your hosting provider.
/
βββ .github/
β βββ workflows/
β βββ deploy.yml # GitHub Pages deployment
β βββ auto-refresh.yml # Weekly data refresh
βββ public/
β βββ favicon.svg # Site favicon
β βββ robots.txt # SEO robots file
βββ src/
β βββ components/ # Astro components
β β βββ Navbar.astro
β β βββ Hero.astro
β β βββ About.astro
β β βββ Projects.astro
β β βββ Skills.astro
β β βββ Activity.astro
β β βββ Contact.astro
β β βββ Footer.astro
β βββ layouts/
β β βββ BaseLayout.astro # Base HTML layout
β βββ lib/
β β βββ github.ts # GitHub API utilities
β βββ pages/
β β βββ index.astro # Main page
β βββ styles/
β β βββ global.css # Global styles
β βββ types/
β βββ github.ts # TypeScript types
βββ astro.config.mjs # Astro configuration
βββ site.config.ts # Site configuration
βββ tailwind.config.mjs # Tailwind CSS configuration
βββ tsconfig.json # TypeScript configuration
βββ package.json # Dependencies
- β Semantic HTML structure
- β ARIA labels where appropriate
- β Keyboard navigation support
- β Focus states on interactive elements
- β Color contrast meets WCAG AA standards
- β
Respects
prefers-reduced-motion - β Alt text for images
- β Meta title and description
- β OpenGraph tags for social sharing
- β Twitter Card tags
- β Sitemap.xml (auto-generated by Astro)
- β Robots.txt
- β Semantic heading hierarchy
- β Fast page load times
- Framework: Astro - Static Site Generator
- Styling: Tailwind CSS - Utility-first CSS
- Language: TypeScript
- Deployment: GitHub Pages via GitHub Actions
- Data Source: GitHub REST API
All content is automatically generated from your GitHub data:
- Tagline: Generated from GitHub bio and top skills
- About: Composed from profile bio, location, and skills
- Projects: Pulled from your repositories
- Skills: Inferred from languages and topics
To update content:
- Update your GitHub profile bio
- Add topics to your repositories
- Keep repository descriptions up-to-date
- The portfolio will automatically refresh weekly
This is a personal portfolio, but feel free to:
- Fork for your own use
- Submit issues for bugs
- Suggest improvements
MIT License - feel free to use this template for your own portfolio!
- GitHub: @Kuxall
- Portfolio: kuxall.github.io
Built with β€οΈ using Astro and Tailwind CSS