본문으로 건너뛰기
cccskills
무료GitHub에 공개

devsync-portfolio

Create portfolios using Devsync template with automated CV, GitHub, LinkedIn, and academics generation

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

연동 도구LinkedInGitHub
설치 방법 보기

포함된 파일(1)

  • SKILL.md11.0 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

Devsync Portfolio Creation Skill

Purpose

Create and maintain developer portfolios using the Devsync template system. This skill guides you through building portfolios where all content comes from DEVSYNC.json - never hardcode text in templates.

Core Principle: Zero Hardcoded Text

All UI text must use translations[lang]['key'] from @devsync/src/devsync/fields-translations.ts. Never write <h3>Projects</h3> - use <h3>{translations[lang]['Projects']}</h3>.

Template Framework

Templates are framework-agnostic. The developer chooses their own stack (Astro, Next.js, SvelteKit, Vue, vanilla HTML, etc.).

When generating a template, always ask:

  • Which framework?

Infer multilingual support directly unless user specifies otherwise.

DEVSYNC.json Structure

Global Fields (required, language-agnostic)

{
	"defaultLang": "en",
	"site": "https://your-site.com",
	"name": "Your Name",
	"img": "https://image-url.com/photo.jpg",
	"socialMedia": [{ "name": "LinkedIn", "url": "...", "icon": "...", "mdBadge": "..." }],
	"githubUserName": "your-username"
}

DEVSYNC.json Example

{
	"defaultLang": "en",
	"site": "https://devsync.work",
	"name": "Your Full Name",
	"img": "https://your-image-url.com/your-image.jpg",
	"socialMedia": [
		{
			"name": "LinkedIn",
			"url": "https://www.linkedin.com/in/your-linkedin-handle",
			"icon": "/icons/linkedin.svg",
			"mdBadge": "![LinkedIn](https://img.shields.io/badge/LinkedIn-0A66C2?logo=linkedin&logoColor=white)"
		}
	],
	"githubUserName": "your-github-username",
	"en": {
		"description": "Write a short professional summary about yourself. Example: Full-stack developer focused on developer experience, performance, and product quality.",
		"jobTitle": "Your Current Job Title",
		"status": {
			"status": "your-status",
			"badge": "![Status](https://img.shields.io/badge/Status-Your%20Status-blue)"
		},
		"languages": [
			{
				"name": "Your Language 1 / Your Language 2",
				"mdBadge": "![Languages](https://img.shields.io/badge/Languages-Your%20Languages-1f6feb)",
				"icon": "https://cdn.simpleicons.org/googletranslate"
			}
		],
		"experience": [
			{
				"company": "Your Company Name",
				"position": "Your Position Title",
				"img": "https://your-image-url.com/company-image.jpg",
				"web": "https://your-company-website.com",
				"description": "Describe your role and impact in one concise sentence.",
				"date": "MM/YY - Present",
				"links": [
					{
						"name": "Company Website",
						"url": "https://your-company-website.com",
						"mdBadge": "![Company](https://img.shields.io/badge/Company-Website-0ea5e9)",
						"icon": "https://cdn.simpleicons.org/googlechrome"
					}
				],
				"list": {
					"title": "key-achievements",
					"items": [
						{
							"highlight": "Achievement headline",
							"description": "Describe one measurable result you delivered (performance, revenue, growth, reliability, etc.)."
						}
					]
				},
				"skills": [
					{
						"name": "Your Key Skill",
						"mdBadge": "![Skill](https://img.shields.io/badge/Skill-Your%20Skill-339933)",
						"icon": "https://cdn.simpleicons.org/codeforces"
					}
				]
			}
		],
		"projects": [
			{
				"name": "Your Project Name",
				"img": "https://your-image-url.com/project-image.jpg",
				"web": "https://your-project-url.com",
				"links": [
					{
						"name": "GitHub",
						"url": "https://github.com/your-github-username/your-project-repo",
						"mdBadge": "![GitHub Repo](https://img.shields.io/badge/Repo-GitHub-181717?logo=github&logoColor=white)",
						"icon": "/icons/github.svg"
					}
				],
				"description": "Describe what the project does and why it matters.",
				"list": {
					"title": "project-highlights",
					"items": [
						{
							"highlight": "Technical highlight",
							"description": "Describe one concrete technical decision or outcome from this project."
						}
					]
				},
				"skills": [
					{
						"name": "Project Skill",
						"mdBadge": "![Skill](https://img.shields.io/badge/Skill-Project%20Skill-61DAFB)",
						"icon": "https://cdn.simpleicons.org/git"
					}
				]
			}
		],
		"education": [
			{
				"name": "Your University or Institution",
				"degree": "Your Degree / Program",
				"img": "https://your-image-url.com/education-image.jpg",
				"date": "MM/YY - MM/YY",
				"links": [
					{
						"name": "Program URL",
						"url": "https://your-program-link.com",
						"mdBadge": "![Program](https://img.shields.io/badge/Program-Details-b45309)",
						"icon": "https://cdn.simpleicons.org/googlechrome"
					}
				],
				"list": {
					"title": "education-highlights",
					"items": [
						{
							"highlight": "Academic highlight",
							"description": "Describe a relevant course, thesis, capstone, or achievement."
						}
					]
				}
			}
		],
		"certifications": [
			{
				"name": "Your Certification Name",
				"url": "https://your-certification-url.com",
				"list": {
					"title": "what-this-validates",
					"items": [
						{
							"highlight": "Validated area",
							"description": "Describe what this certification validates for your profile."
						}
					]
				},
				"skills": [
					{
						"name": "Certification Skill",
						"mdBadge": "![Certification Skill](https://img.shields.io/badge/Skill-Certification-232F3E)",
						"icon": "https://cdn.simpleicons.org/coursera"
					}
				]
			}
		]
	}
}

Key flexibility: Any section can be omitted - if experience is missing, it simply won't appear in CV. Portfolio can add custom fields beyond CV requirements.

package.json Configuration

{
	"devsync": {
		"pathToCompiledCV": "src/[lang]/cv.html"
	}
}

Important: [lang] is a placeholder. The devsync build command iterates through available languages and replaces [lang] with each language code. If your portfolio is monolingual, the replacement still occurs but only one iteration happens.

How 'devsync build' Works

The CLI command (bunx devsync build) executes:

  1. Installs dependencies → bun install
  2. Builds project → bun run build
  3. Extract languages → Reads DEVSYNC.json, filters out global fields to get language codes
  4. For each language:
    • Builds CV HTML → Gets path from package.json, replaces [lang], fetches HTML, generates PDF
    • Creates LinkedIn markdown → Generates linkedin-{lang}.md with professional summary
  5. **Once **(using defaultLang):
    • Creates GitHub README → Combines experience + projects into README.md
    • Creates academics file → Education + certifications in academics/README.md

Translation System

Current Keys (fields-translations.ts)

Available in 8 languages (en, es, fr, pt, de, zh, ja, ko):

  • Description, jobTitle, Status, Languages
  • Professional Experience, Projects, Education, Certifications
  • Core Skills, credential, academics
  • View Certificate, Selected projects, Let's connect, Github Profile, I am, Links

Extensible: Add new keys as needed for portfolio-specific UI text.

Adding New Translation Keys

When a template needs UI text not covered by existing keys, add it to src/devsync/fields-translations.ts in all 8 languages:

  1. Identify the key name — use a descriptive English string (e.g. 'Open to work')
  2. Add to every language block:
// fields-translations.ts
export const translations = {
	en: {
		// ... existing keys
		'Open to work': 'Open to work', // ← add here
	},
	es: {
		// ... existing keys
		'Open to work': 'Disponible para trabajar',
	},
	fr: {
		'Open to work': 'Disponible',
	},
	// ... repeat for pt, de, zh, ja, ko
} as const
  1. Use in template via translations[lang]['Open to work']

Never use the key string as literal UI text — always go through translations[lang]. Missing a language will cause a TypeScript type error, which is the intended safety net.

GitHub Actions Automation

.github/workflows/update-on-devsync-change.yml triggers on DEVSYNC.json pushes:

- run: bunx devsync build # Updates CV, README, LinkedIn, academics
- uses: git-auto-commit-action # Commits changes

Validation

  1. Test build: Run bunx devsync build to generate artifacts
  2. Verify outputs:
    • cv/{lang}.pdf - PDF CV
    • README.md - GitHub profile
    • linkedin/{lang}.md - LinkedIn copy
    • academics/README.md - Academic history

Validation Schema

Zod schema in src/devsync/devsync-validator.ts validates:

  • Required fields per section
  • Array structures (links, skills, list items)
  • Type safety for all DEVSYNC.json entries

Use parseDevsync(devsync) from @devsync/src/devsync/devsync.ts for validation.

Available Exports (devsync.ts)

import devsync, { languages, defaultLang, parseDevsync } from '@devsync/src/devsync/devsync'

Template Folder Structure

Required structure for a Devsync portfolio template:

your-template/
├── public/
│   ├── poster-light-mode.webp    # Light theme preview (600x315px)
│   ├── poster-dark-mode.webp     # Dark theme preview (600x315px)
│   └── icons/                    # Optional custom icons (linkedin.svg, github.svg, etc.)
├── src/
│   └── devsync/                  # Copy from @devsync/src/devsync/
│       ├── devsync.ts
│       ├── devsync-validator.ts
│       └── fields-translations.ts
├── .github/
│   └── workflows/
│       └── update-on-devsync-change.yml
├── DEVSYNC.json
└── package.json

Required files:

  • public/poster-*.webp - Preview images for template gallery
  • src/devsync/ - Core Devsync modules for translations and validation
  • .github/workflows/update-on-devsync-change.yml - Auto-update workflow
  • DEVSYNC.json - Configuration template
  • package.json - With devsync.pathToCompiledCV and devsync.poster config

Optional:

  • public/icons/ - Custom icon SVGs referenced in socialMedia[].icon and links[].icon

Publishing Templates

When publishing your Devsync template, include poster images for preview:

{
	"name": "@your-username/devsync-template",
	"devsync": {
		"pathToCompiledCV": "src/[lang]/cv.html"
	}
}

Poster images (required for template preview):

  • public/poster-light-mode.webp - Light theme preview (recommended: 600x315px)
  • public/poster-dark-mode.webp - Dark theme preview (recommended: 600x315px)

If posters are not provided, the default Devsync posters will be shown.

Best Practices

  1. Never hardcode - Always use translation keys
  2. Optional sections - Omit experience/projects/education if not needed
  3. Badge consistency - Use shields.io for consistent badge styling
  4. Icon paths - Use /icons/ for local, CDN URLs for external
  5. Date format - Use MM/YY - Present or MM/YY - MM/YY
  6. Skills reuse - Same skill can appear across experience, projects, certifications
  7. Template publishing - Include both poster images for gallery preview

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

Audit and improve web accessibility following WCAG 2.2 guidelines. Use when asked to "improve accessibility", "a11y audit", "WCAG compliance", "screen reader support", "keyboard navigation", or "make accessible".

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

Jannael/Devsync132026년 8월 11일 업데이트

astro

무료

Skill for building with the Astro web framework. Helps create Astro components and pages, configure SSR adapters, set up content collections, deploy static sites, and manage project structure and CLI commands. Use when the user needs to work with Astro, mentions .astro files, asks about static site generation (SSG), islands architecture, content collections, or deploying an Astro project.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

Jannael/Devsync132026년 8월 11일 업데이트

bun

무료

Use when building, testing, and deploying JavaScript/TypeScript applications. Reach for Bun when you need to run scripts, manage dependencies, bundle code, or test applications with a single unified tool.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

Jannael/Devsync132026년 8월 11일 업데이트

caveman

무료

Ultra-compressed communication mode. Cuts token usage ~75% by speaking like caveman while keeping full technical accuracy. Supports intensity levels: lite, full (default), ultra, wenyan-lite, wenyan-full, wenyan-ultra. Use when user says "caveman mode", "talk like caveman", "use caveman", "less tokens", "be brief", or invokes /caveman. Also auto-triggers when token efficiency is requested.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

Jannael/Devsync132026년 8월 11일 업데이트

Ultra-compressed commit message generator. Cuts noise from commit messages while preserving intent and reasoning. Conventional Commits format. Subject ≤50 chars, body only when "why" isn't obvious. Use when user says "write a commit", "commit message", "generate commit", "/commit", or invokes /caveman-commit. Auto-triggers when staging changes.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

Jannael/Devsync132026년 8월 11일 업데이트

Compress natural language memory files (CLAUDE.md, todos, preferences) into caveman format to save input tokens. Preserves all technical substance, code, URLs, and structure. Compressed version overwrites the original file. Human-readable backup saved as FILE.original.md. Trigger: /caveman:compress <filepath> or "compress memory file"

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

Jannael/Devsync132026년 8월 11일 업데이트

Jannael의 스킬 모두 보기

이 스킬의 문제 신고