portfolio-auto

Solid

Auto-sync GitHub repos to portfolio website. Scans GitHub repos, captures screenshots with Playwright, generates project entries, and updates projects-data.js or Supabase DB. Use when user asks to "update portfolio", "sync projects", "add my repos to portfolio", or "refresh portfolio projects". Do NOT use for one-time project additions — batch sync only.

AI & Automation 96 stars 12 forks Updated yesterday MIT

Install

View on GitHub

Quality Score: 91/100

Stars 20%
66
Recency 20%
100
Frontmatter 20%
70
Documentation 15%
100
Issue Health 10%
50
License 10%
100
Description 5%
100

Skill Content

> **Note:** `last-sync.json` state file is auto-created on first successful sync. Ignore "missing file" warnings on first run. # Portfolio Auto-Sync Automatically sync GitHub repositories to your portfolio website. ## Workflow ### Step 1: Gather configuration Ask the user: - **GitHub username**: (default from git config) - **Portfolio type**: `static` (projects-data.js) or `supabase` (API) - **Portfolio directory**: Path to portfolio project - **Filters**: Exclude repos (archived, forks, specific names) ### Step 2: Fetch repos via GitHub API ``` GET /users/{username}/repos?per_page=100&sort=updated&direction=desc ``` Extract: `name`, `description`, `html_url`, `homepage`, `language`, `topics`, `updated_at` Filter out: - Forks (unless user opts in) - Profile repos (`{username}/{username}`) - Archived repos ### Step 3: Detect changes Compare against `last-sync.json` (stored in skill directory). - **New repos**: Not in last sync → full process - **Updated repos**: `updated_at` changed → re-screenshot - **Unchanged repos**: Skip ### Step 4: Capture screenshots For repos with a `homepage` or deploy URL: ```javascript const { chromium } = require('playwright'); const browser = await chromium.launch({ headless: true }); const page = await browser.newPage(); await page.setViewportSize({ width: 1280, height: 800 }); await page.goto(process.env.URL, { waitUntil: 'networkidle', timeout: 15000 }); await page.screenshot({ path: `/tmp/portfolio-${name}.png`, fullPage: false ...

Details

Author
EliasOulkadi
Repository
EliasOulkadi/shokunin
Created
1 months ago
Last Updated
yesterday
Language
HTML
License
MIT

Integrates with

Similar Skills

Semantically similar based on skill content — not just same category