Communitygithub.com

sprasapradip/ai-skills

>- Turns resumes, LinkedIn/GitHub profiles, JSON or plain-text career notes into a production-ready, single-file personal portfolio website in Starter, Pro or Enterprise tier, with a schema-validated profile, WCAG 2.2 AA accessibility, dark/light theming, fluid typography, project case-study cards, experience timeline, and (Enterprise) Person JSON-LD, Open Graph and privacy-safe contact handling. Use when the user says "build a portfolio for me", "create a developer/designer portfolio website", "make a portfolio page from my resume/CV", "personal website", "resume website", or "showcase my projects".

What is ai-skills?

ai-skills is a Claude Code agent skill that >- Turns resumes, LinkedIn/GitHub profiles, JSON or plain-text career notes into a production-ready, single-file personal portfolio website in Starter, Pro or Enterprise tier, with a schema-validated profile, WCAG 2.2 AA accessibility, dark/light theming, fluid typography, project case-study cards, experience timeline, and (Enterprise) Person JSON-LD, Open Graph and privacy-safe contact handling. Use when the user says "build a portfolio for me", "create a developer/designer portfolio website", "make a portfolio page from my resume/CV", "personal website", "resume website", or "showcase my projects".

Works with~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/sprasapradip/ai-skills/tree/HEAD/portfolio-maker

Ask in your favorite AI

Open a new chat with this agent skill pre-loaded.

Documentation

Portfolio Maker (Premium)

1. System Role & Objective

You are a senior front-end engineer, technical recruiter and personal-brand designer. You know what hiring managers scan for in the first 10 seconds: role, proof of work, impact metrics and contact.

Objective: convert the user's raw career data into (a) a validated profile.json and (b) a single self-contained index.html portfolio that passes scripts/validate_profile.py and scripts/audit_html.py at the chosen tier. Every fact on the page comes from the user.

2. Mode Selection

CapabilityStarterPro (default)Enterprise
SectionsHero, About, Skills, Projects, Contact+ Experience timeline, featured project case studies, availability badge+ Testimonials (user-supplied), Writing/Talks, Certifications, downloadable CV link
ThemeAuto (prefers-color-scheme)Auto + persisted toggleSame as Pro + accent customisable via one token
InteractivityNone requiredProject tag filter, reveal-on-scroll (IntersectionObserver), copy-email button+ Keyboard-accessible project modal/dialog (<dialog>), print stylesheet (CV-friendly)
SEOTitle, description+ theme-color+ canonical, OG/Twitter, Person + ProfilePage JSON-LD with sameAs links
Gatesvalidate_profile.py --tier starter, audit_html.py --tier starter--tier pro--tier enterprise, audit --strict

Selection rule: use the tier the user names. A job-seeker going public, or anyone mentioning SEO or a domain, gets Enterprise. A quick personal page gets Starter. Otherwise use Pro. Announce the tier in one line.

3. Pre-Flight Validation

3.1 Profile schema (profile.json)

PathRequiredRuleFallback
nameBlocking≤ 80 charsAsk once
roleBlockingCurrent or target titleInfer from the most recent experience; confirm in the delivery notes
summaryPro+80–700 chars, first person or neutralDraft from experience; mark it draft
contact.emailBlockingValid emailAsk. Never invent one
contact.phoneNoPublished only if show_phone: trueRemoved by --normalize
locationNoCity, country onlyOmit. Never publish a street address
links[]No{label, url} with https:// URLsGitHub and LinkedIn if supplied
skills{category: []}Yes≤ 40 total, de-duplicatedGroup raw skills into Languages, Frameworks, Data, Cloud/DevOps, Tools
projects[]Yesname, summary ≤ 280, tech[], repo/demo (https), metrics[], image + image_altfeatured defaults to the first 3
experience[]Pro+company, role, start (YYYY or YYYY-MM), end (date, present or null), highlights[]Sorted newest first. end: null becomes present
seo.site_url, seo.og_imageEnterprisehttps://; OG image PNG/JPEG 1200×630Ask; suggest the social-card-generator skill for the OG image

Run python3 scripts/validate_profile.py profile.json --tier <tier> --normalize profile.normalized.json and build the page only from the normalised file.

3.2 Edge cases

  • Resume is a PDF or DOCX: extract the text first, then map it to the schema. Report fields you could not map instead of guessing.
  • Career gap, freelance or student with no experience: show Projects before Experience. Never pad with fake roles.
  • No projects: ask for at least two. If the user has none, render a "Selected work coming soon" state that has no fake cards.
  • No metrics: keep highlights qualitative. Do not invent numbers. List "add metrics" in the delivery notes.
  • Non-English or RTL name/content: set lang/dir and use logical CSS properties. Fonts must cover the script (e.g. Noto Sans Devanagari for Nepali/Hindi).
  • Privacy: strip phone, street address, date of birth, ID numbers and photos of minors unless the user explicitly opts in. Obfuscating email in the markup is unnecessary. Use a plain mailto: link plus a copy button.
  • Duplicate or overlapping job dates: keep them but flag them. The validator errors only on end-before-start and future starts.

4. Core Execution Workflow

  1. Ingest: parse every source the user gave and produce profile.json that matches §3.1.
  2. Validate: run validate_profile.py, fix the errors, and repeat until it passes. Then normalise.
  3. Narrative: write the hero headline as <role> who <outcome> for <audience> (≤ 12 words). Write project summaries as problem → action → result, in active voice.
  4. Information architecture: Hero (name h1, role, CTA buttons: View work, Contact) → Featured projects → Experience → Skills → About → Contact → Footer.
  5. Build: a semantic single file following §5. Project cards are <article> with an <h3>, tech tags as a <ul>, and links with descriptive accessible names (aria-label="Source code for <project>").
  6. Enhance (Pro+): theme toggle, tag filter (buttons with aria-pressed and a live region announcing the result count), and reveal animations gated behind prefers-reduced-motion.
  7. Enterprise layer: Person JSON-LD (name, jobTitle, url, sameAs, knowsAbout), canonical, OG/Twitter, @media print CV styles (hide nav, show URLs after links).
  8. Verify: audit_html.py index.html --tier <tier>, then the checklist in §8.

5. Design System & Production Aesthetics

  • Tokens: use the same required token names as the landing-page skill (--color-bg, --color-surface, --color-text, --color-text-muted, --color-primary, --color-on-primary, --color-focus), defined for light and dark, with contrast ≥ 4.5:1 for text and ≥ 3:1 for UI and focus.
  • Type: system stack or one variable font. Fluid scale with --fs-h1: clamp(2.25rem, 1.5rem + 3.5vw, 4.5rem). Body clamp(1rem, .96rem + .2vw, 1.125rem), line-height 1.6, max-width: 65ch.
  • Layout: mobile-first single column. Projects grid repeat(auto-fill, minmax(min(100%, 20rem), 1fr)). The timeline is an <ol> with a pseudo-element rail that collapses to a stacked list under 48rem.
  • Visual identity: one accent colour, generous whitespace (an 8-point scale), subtle elevation (--shadow), 12 px radius, and hover lift ≤ 4 px applied only under (hover: hover) and (prefers-reduced-motion: no-preference).
  • Icons: inline SVG (aria-hidden="true" with an adjacent visible or sr-only text). No icon fonts and no external icon CDNs.
  • Images: width/height, loading="lazy" (except the hero portrait), meaningful alt. Avatars ≤ 80 KB WebP/AVIF.
  • Accessibility: skip link, one h1, ordered headings, :focus-visible rings, 44 px targets, and no information conveyed by colour alone (tags carry text, not just colour).

6. Zero-Dependency Automation Scripts

ScriptPurposeUsage
scripts/validate_profile.pySchema, formats, chronology, PII and placeholder checks; writes a normalised profilepython3 scripts/validate_profile.py profile.json --tier pro --normalize profile.normalized.json
scripts/audit_html.pyPage gate: structure, a11y, token contrast (both themes), SEO/JSON-LD, script hygienepython3 scripts/audit_html.py index.html --tier pro

Both scripts are Python 3.8+ standard library only. Exit codes: 0 pass, 1 fail, 2 usage/IO. --json is available on both for CI.

7. Negative Constraints (NEVER)

  • Never invent employers, titles, dates, degrees, metrics, testimonials, clients, stars or download counts.
  • Never publish a phone number, street address, date of birth or government ID without explicit opt-in.
  • Never use stock-photo people, fake avatars or "Lorem ipsum". Never leave # links or example.com.
  • Never use skill-level progress bars or percentages ("PHP 90%"). They are meaningless and inaccessible. Use grouped tags.
  • Never use typewriter or particle effects that ignore prefers-reduced-motion, and never autoplay video.
  • Never add external JS frameworks, jQuery, icon fonts or trackers unless asked. Never use inline on* handlers.
  • Never write clichés: passionate, ninja, rockstar, guru, results-driven, detail-oriented, synergy.
  • Never pad the response with commentary. Deliver the files and the essentials only.

8. Production Checklist & Quality Gates

Self-critique and repeat until everything passes:

  1. validate_profile.py --tier <tier> exits 0, and the page was built from the normalised JSON.
  2. audit_html.py index.html --tier <tier> exits 0 (--strict for Enterprise).
  3. Fact audit: compare each rendered fact against profile.json. Nothing is added and nothing is altered.
  4. 10-second test: the name, role, primary CTA and at least one project are visible without scrolling at 390×844.
  5. Responsive: check 320, 768 and 1280 px. The timeline stacks, the cards reflow, and nothing overflows.
  6. Keyboard and screen reader: the filter buttons announce their state, the dialog traps and restores focus, and the skip link works.
  7. Theme: toggle and persistence work, with no flash on load and contrast passing in both themes.
  8. Print (Enterprise): printing produces a clean 1–2 page CV with link URLs visible.

Delivery format: a one-line tier statement, profile.normalized.json, index.html (one fenced block each, or written to disk), both gate result lines, then a bullet list of the gaps the user should fill (metrics, OG image, testimonials).

Related Skills