A self-hosted personal GitHub homepage for showcasing your profile, projects, contributions, and activity.
GitShow is a self-hosted GitHub profile dashboard that turns your GitHub account into a clean personal homepage, project showcase, activity board, and lightweight admin panel.
It is designed for simple deployment: the Nuxt frontend is generated as static assets and embedded into a single Go service. One container, one process, one public port.
- Personal GitHub profile hero with avatar, bio, location, social links, and stats
- Contribution heatmap, daily activity chart, recent activity, and star history
- Project showcase controlled from the admin panel
- Following page with followed users, recent repositories, and recent activity
- Admin settings for title, GitHub account, token, social links, homepage projects, and password
- Multiple Passkey support for passwordless admin login, with device notes
- Favicon and site manifest support from the
public/directory - Docker Compose deployment with a single
appservice
- Go HTTP service for API, cache refresh, settings, Passkey/WebAuthn, and static hosting
- Nuxt 3 SPA generated as static files
- Tailwind CSS for the interface
- GitHub REST API and GraphQL API for repository, activity, and contribution data
github.com/go-webauthn/webauthnfor Passkey support
GitShow is deployed as one Go service. The Nuxt frontend is generated first, then embedded into the Go binary at build time.
Docker Compose is the recommended deployment path.
- Clone the repository:
git clone https://github.com/gentpan/GitShow.git
cd GitShow- Prepare runtime files:
Copy the examples:
cp config.json.example config.json
cp settings.json.example settings.jsonEdit config.json:
{
"username": "your-github-username",
"token": "ghp_your_token",
"following": ["antfu", "yyx990803", "torvalds"]
}- Optionally use
.envfor the GitHub token:
cp .env.example .env
# then edit .env
GITHUB_TOKEN=ghp_your_tokenThe token should be able to read public GitHub data. For private deployments that need more account context, use a personal access token with the appropriate GitHub scopes.
- Start the app:
docker compose up -d --build- Open the site:
http://localhost:3000
The Compose file mounts these runtime files into the container:
config.jsonsettings.jsonstar-history.json
Use this when you want to deploy without Docker.
cp config.json.example config.json
cp settings.json.example settings.json
npm ci
NUXT_PUBLIC_API_BASE= npm run generate
go build -o gitshow .
PORT=3000 GITHUB_TOKEN=ghp_your_token ./gitshowThe generated gitshow binary embeds .output/public, so deployment only needs the binary plus runtime files such as config.json, settings.json, and star-history.json.
For local testing, use:
./start.shThe script installs frontend dependencies when needed, generates the Nuxt static output, builds the Go binary, and starts the single service on port 3000.
For a public domain, put GitShow behind a reverse proxy such as Caddy, Nginx, or Traefik and forward traffic to port 3000.
Passkeys require a secure browser context. They work on localhost for development and require HTTPS on a public domain.
Open the footer login button and sign in with the admin password. After login, the navigation adds the 管理 menu item and the footer login icon becomes a red logout button.
From /admin, you can:
- change the site title
- configure the GitHub profile URL and token
- select which repositories are shown on the homepage and projects page
- edit social links
- set or clear the admin password
- register multiple Passkeys, edit Passkey notes, delete one Passkey, or clear all Passkeys
- refresh cached GitHub data
Passkeys work on localhost during local development and require HTTPS on a public domain. They are bound to the current domain, so separate root domains need separate Passkeys.
The projects page follows the admin project toggles exactly:
- enabled repositories are shown
- disabled repositories are hidden
- the display order follows the saved admin selection
If no repositories are enabled, the projects page shows an empty-state message.
GitShow/
├── main.go # Go API, cache, Passkey, and embedded static server
├── Dockerfile # Multi-stage build: Nuxt static output + Go binary
├── docker-compose.yml # Single app service
├── go.mod # Go dependencies
├── package.json # Nuxt build scripts and frontend dependencies
├── app.vue # Nuxt app entry
├── pages/ # Nuxt pages
├── components/ # Vue components
├── composables/ # API, theme, auth, and Passkey helpers
├── layouts/ # Site layout and footer/header
├── assets/ # Global CSS
├── public/ # favicon, webmanifest, and static public assets
├── config.json.example # Example runtime GitHub config
├── settings.json.example # Example runtime site settings
└── start.sh # Local build-and-run helper
MIT
