Initial commit: Claude Skills Factory with 8 refined custom skills
Custom Skills (ourdigital-custom-skills/): - 00-ourdigital-visual-storytelling: Blog featured image prompt generator - 01-ourdigital-research-publisher: Research-to-publication workflow - 02-notion-organizer: Notion workspace management - 03-research-to-presentation: Notion research to PPT/Figma - 04-seo-gateway-strategist: SEO gateway page strategy planning - 05-gateway-page-content-builder: Gateway page content generation - 20-jamie-brand-editor: Jamie Clinic branded content GENERATION - 21-jamie-brand-guardian: Jamie Clinic content REVIEW & evaluation Refinements applied: - All skills converted to SKILL.md format with YAML frontmatter - Added version fields to all skills - Flattened nested folder structures - Removed packaging artifacts (.zip, .skill files) - Reorganized file structures (scripts/, references/, etc.) - Differentiated Jamie skills with clear roles 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,168 @@
|
||||
# OurDigital Visual Storytelling Skill
|
||||
|
||||
## 📦 스킬 구조
|
||||
|
||||
```
|
||||
ourdigital-visual-storytelling/
|
||||
├── SKILL.md # 메인 스킬 파일
|
||||
├── scripts/
|
||||
│ ├── generate_prompt.py # 프롬프트 자동 생성
|
||||
│ └── mood_calibrator.py # 무드 파라미터 조정
|
||||
└── references/
|
||||
├── visual_metaphors.md # 시각적 메타포 사전
|
||||
├── color_palettes.md # 컬러 팔레트 가이드
|
||||
└── advanced_techniques.md # 고급 테크닉 레퍼런스
|
||||
```
|
||||
|
||||
## 🚀 Claude Skills 설치 방법
|
||||
|
||||
### 방법 1: Claude Projects에서 사용
|
||||
1. Claude.ai에서 새 Project 생성
|
||||
2. Project Settings → Skills → Add Custom Skill
|
||||
3. `ourdigital-visual-storytelling` 폴더 전체 업로드
|
||||
4. 스킬 활성화
|
||||
|
||||
### 방법 2: MCP Server로 사용
|
||||
1. 스킬 폴더를 MCP skills 디렉토리로 이동:
|
||||
```bash
|
||||
cp -r ourdigital-visual-storytelling /path/to/mcp/skills/user/
|
||||
```
|
||||
2. MCP 서버 재시작
|
||||
3. Claude에서 스킬 자동 인식
|
||||
|
||||
### 방법 3: 수동 활용
|
||||
1. SKILL.md 내용을 Claude 대화에 직접 붙여넣기
|
||||
2. 필요시 scripts와 references 내용 참조
|
||||
|
||||
## 💡 사용 예시
|
||||
|
||||
### 기본 사용법
|
||||
```
|
||||
"AI와 인간 정체성의 혼재에 대한 철학적 에세이를 위한 featured image를 만들어줘"
|
||||
```
|
||||
|
||||
### 스크립트 활용
|
||||
```bash
|
||||
# 프롬프트 생성
|
||||
python scripts/generate_prompt.py \
|
||||
--topic "초개인화 시대의 자아" \
|
||||
--mood "contemplative" \
|
||||
--metaphor "거울 속 분산된 얼굴"
|
||||
|
||||
# 무드 조정
|
||||
python scripts/mood_calibrator.py \
|
||||
--preset philosophical_essay \
|
||||
--contemplative-depth 0.95
|
||||
```
|
||||
|
||||
### 다양한 변형 생성
|
||||
```bash
|
||||
python scripts/generate_prompt.py \
|
||||
--topic "SEO의 미래" \
|
||||
--variations 3 \
|
||||
--json
|
||||
```
|
||||
|
||||
## 📊 스킬 활용 시나리오
|
||||
|
||||
### 1. 철학적 에세이
|
||||
- **주제**: 디지털 시대의 자아 정체성
|
||||
- **무드**: philosophical_essay 프리셋
|
||||
- **메타포**: 프리즘을 통한 빛의 분산
|
||||
- **컬러**: 모노크롬 + 골드 액센트
|
||||
|
||||
### 2. 기술 비평
|
||||
- **주제**: AI 검색의 등장과 SEO의 변화
|
||||
- **무드**: technical_analysis 프리셋
|
||||
- **메타포**: 유기적 네트워크가 결정화되는 과정
|
||||
- **컬러**: 쿨톤 블루-그레이 + 디지털 그린
|
||||
|
||||
### 3. 사회 논평
|
||||
- **주제**: 소셜미디어와 평판 경제
|
||||
- **무드**: social_commentary 프리셋
|
||||
- **메타포**: 에코 체임버 속 고립된 인간 형상
|
||||
- **컬러**: 무채색 + 퍼플 액센트
|
||||
|
||||
## 🎨 생성된 프롬프트 예시
|
||||
|
||||
### 입력
|
||||
```python
|
||||
topic = "초개인화 시대의 선택의 역설"
|
||||
mood = "contemplative"
|
||||
metaphor = "무한한 문들 앞의 정지된 실루엣"
|
||||
```
|
||||
|
||||
### 출력
|
||||
```
|
||||
Create a sophisticated featured image, minimalist contemporary design,
|
||||
clean vector illustration with subtle texture overlays, 1200x630px,
|
||||
suitable for blog header for blog post about 초개인화 시대의 선택의 역설.
|
||||
|
||||
Visual concept: 무한한 문들 앞의 정지된 실루엣.
|
||||
|
||||
Atmosphere: contemplative and introspective atmosphere, zen-like calm.
|
||||
Colors: monochrome palette with single accent color.
|
||||
|
||||
Composition:
|
||||
- Highly abstract interpretation
|
||||
- Minimum 20% negative space for contemplative breathing room
|
||||
- Asymmetrical balance with strong geometric structure
|
||||
- balanced integration of Korean minimalist aesthetics with Western modernism
|
||||
|
||||
Technical notes:
|
||||
- Ensure clarity at thumbnail size (200px)
|
||||
- Avoid tech clichés (circuits, binary codes)
|
||||
- No stock photo aesthetics or literal interpretations
|
||||
- Timeless design that won't date quickly
|
||||
|
||||
Aesthetic reference: Combine Bauhaus principles with Agnes Martin's
|
||||
contemplative minimalism.
|
||||
```
|
||||
|
||||
## 🔧 커스터마이징
|
||||
|
||||
### 파라미터 조정
|
||||
```python
|
||||
# mood_calibrator.py에서 새 프리셋 추가
|
||||
"custom_preset": {
|
||||
"contemplative_depth": 0.9,
|
||||
"cultural_fusion": 0.8,
|
||||
"technical_precision": 0.5,
|
||||
"emotional_weight": 0.6,
|
||||
"innovation_index": 0.8
|
||||
}
|
||||
```
|
||||
|
||||
### 메타포 확장
|
||||
`references/visual_metaphors.md`에 새로운 개념 추가:
|
||||
```markdown
|
||||
| 새개념 | 주요 메타포 | 대체 시각 |
|
||||
|--------|------------|-----------|
|
||||
| 메타버스 | 평행 유리면 | 중첩된 현실층 |
|
||||
```
|
||||
|
||||
## 📈 성과 측정
|
||||
|
||||
### 품질 평가 기준
|
||||
- **개념 전달**: 에세이의 핵심을 포착했는가? (30%)
|
||||
- **독창성**: 독특한 관점을 제시하는가? (25%)
|
||||
- **실행력**: 기술적 완성도는? (20%)
|
||||
- **감정 공명**: 의도한 감정을 불러일으키는가? (15%)
|
||||
- **지속성**: 시간이 지나도 유효한가? (10%)
|
||||
|
||||
## 🤝 기여 가이드
|
||||
|
||||
### 개선 제안
|
||||
- Issue 생성: 새로운 메타포나 스타일 제안
|
||||
- Pull Request: 스크립트 개선이나 레퍼런스 추가
|
||||
- 피드백: 실제 사용 사례와 결과 공유
|
||||
|
||||
## 📝 라이센스
|
||||
|
||||
MIT License - 자유롭게 사용, 수정, 배포 가능
|
||||
|
||||
---
|
||||
|
||||
**Created for OurDigital blogs**
|
||||
*"사람, 디지털, 그리고 문화"의 시각적 내러티브*
|
||||
https://ourdigital.org | https://journal.ourdigital.org
|
||||
@@ -0,0 +1,142 @@
|
||||
---
|
||||
name: ourdigital-visual-storytelling
|
||||
version: 1.0.0
|
||||
description: Creates sophisticated featured image prompts for OurDigital blogs (blog.ourdigital.org, journal.ourdigital.org, ourstory.day) that capture philosophical depth through minimalist visual metaphors. Specializes in translating complex essays about humanity, technology, and culture into contemplative visual narratives using Korean-Western aesthetic fusion. Use when creating blog featured images that require intellectual sophistication and conceptual abstraction.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# OurDigital Visual Storytelling
|
||||
|
||||
Transform philosophical essays into sophisticated visual narratives through minimalist, conceptually rich featured images.
|
||||
|
||||
## Core Philosophy
|
||||
|
||||
OurDigital images are visual philosophy—not illustrations but parallel texts that invite contemplation. Each image captures the essay's philosophical core through:
|
||||
|
||||
- **Abstract metaphors** over literal representations
|
||||
- **Contemplative minimalism** with 20%+ negative space
|
||||
- **Cultural fusion** of Korean-Western aesthetics
|
||||
- **Emotional resonance** through color psychology
|
||||
|
||||
## Workflow
|
||||
|
||||
### 1. Extract Essay Essence
|
||||
```python
|
||||
# Analyze the blog post for:
|
||||
core_insight = "What philosophical truth?"
|
||||
emotional_tone = "What feeling to evoke?"
|
||||
key_metaphor = "What visual symbol?"
|
||||
```
|
||||
|
||||
### 2. Select Visual Approach
|
||||
|
||||
| Essay Type | Visual Strategy | Color Mood |
|
||||
|-----------|-----------------|------------|
|
||||
| Technology | Organic-digital hybrids | Cool blues → warm accents |
|
||||
| Social | Network patterns, human fragments | Desaturated → hope spots |
|
||||
| Philosophy | Zen space, symbolic objects | Monochrome + single accent |
|
||||
| Cultural | Layered traditions, fusion forms | Earth tones → modern hues |
|
||||
|
||||
### 3. Generate Prompt
|
||||
|
||||
Use template in `scripts/generate_prompt.py`:
|
||||
```bash
|
||||
python scripts/generate_prompt.py \
|
||||
--topic "AI identity crisis" \
|
||||
--mood "contemplative anxiety" \
|
||||
--metaphor "mirror fragments"
|
||||
```
|
||||
|
||||
### 4. Apply Quality Filters
|
||||
|
||||
✅ **Must have:**
|
||||
- Captures philosophical insight
|
||||
- Works at 200px thumbnail
|
||||
- Timeless (2-3 year relevance)
|
||||
- Cross-cultural readability
|
||||
|
||||
❌ **Must avoid:**
|
||||
- Tech clichés (circuits, binary)
|
||||
- Stock photo aesthetics
|
||||
- Literal interpretations
|
||||
- Trendy effects
|
||||
|
||||
## Quick Templates
|
||||
|
||||
### AI & Humanity
|
||||
```
|
||||
"Translucent human silhouette dissolving into crystalline data structures.
|
||||
Monochrome with teal accent. Boundary dissolution between organic/digital.
|
||||
1200x630px, minimalist vector style."
|
||||
```
|
||||
|
||||
### Social Commentary
|
||||
```
|
||||
"Overlapping circles forming maze pattern, tiny humans in separate chambers.
|
||||
Blue-gray palette, warm light leaks for hope. Subtle Korean patterns.
|
||||
High negative space. 1200x630px."
|
||||
```
|
||||
|
||||
### Digital Transformation
|
||||
```
|
||||
"Traditional forms metamorphosing into particle streams. Paper texture → digital grain.
|
||||
Earth tones shifting to cool blues. Sacred geometry underlying.
|
||||
1200x630px, contemplative mood."
|
||||
```
|
||||
|
||||
## Resources
|
||||
|
||||
- `scripts/generate_prompt.py` - Automated prompt builder
|
||||
- `scripts/mood_calibrator.py` - Adjust emotional parameters
|
||||
- `references/visual_metaphors.md` - Concept → Visual dictionary
|
||||
- `references/color_palettes.md` - Emotion → Color mapping
|
||||
- `assets/style_samples/` - Reference images by category
|
||||
|
||||
## Technical Specs
|
||||
|
||||
- **Dimensions**: 1200x630px (OG standard)
|
||||
- **Style**: Vector illustration + subtle textures
|
||||
- **Colors**: 60-30-10 rule (dominant-secondary-accent)
|
||||
- **Format**: WebP primary, JPG fallback
|
||||
|
||||
## Advanced Techniques
|
||||
|
||||
For complex topics, layer metaphors:
|
||||
```python
|
||||
primary_metaphor = "roots becoming circuits"
|
||||
secondary_metaphor = "light through prism"
|
||||
emotional_journey = "organic → synthetic → harmonized"
|
||||
```
|
||||
|
||||
See `references/advanced_techniques.md` for:
|
||||
- Metaphor layering strategies
|
||||
- Cultural symbolism guide
|
||||
- Composition dynamics
|
||||
- Texture integration methods
|
||||
|
||||
## Style Parameters
|
||||
|
||||
Calibrate in `scripts/mood_calibrator.py`:
|
||||
```python
|
||||
contemplative_depth = 0.8 # Abstract level
|
||||
cultural_fusion = 0.6 # East-West balance
|
||||
technical_precision = 0.7 # Clean vs organic
|
||||
emotional_weight = 0.5 # Mood intensity
|
||||
```
|
||||
|
||||
## Quick Reference
|
||||
|
||||
**Visual Metaphor Shortcuts:**
|
||||
- Algorithm → Constellation patterns
|
||||
- Identity → Layered masks, fingerprints
|
||||
- Network → Root systems, neural paths
|
||||
- Time → Spirals, sediment layers
|
||||
- Knowledge → Light sources, growing trees
|
||||
|
||||
**Color Psychology:**
|
||||
- Critical → Deep blue-gray + red accent
|
||||
- Hopeful → Warm amber + sky blue
|
||||
- Philosophical → Near black + off white + gold
|
||||
- Anxious → Charcoal + grey-blue + digital green
|
||||
|
||||
Generate sophisticated visual narratives that complement—never compete with—the written word.
|
||||
@@ -0,0 +1,214 @@
|
||||
# Advanced Visual Techniques
|
||||
|
||||
Sophisticated methods for complex visual narratives.
|
||||
|
||||
## Metaphor Layering
|
||||
|
||||
### Three-Layer Structure
|
||||
```
|
||||
Layer 1: Immediate visual (what viewer sees first)
|
||||
Layer 2: Symbolic meaning (conceptual understanding)
|
||||
Layer 3: Philosophical depth (deeper reflection)
|
||||
|
||||
Example: "Digital Identity Crisis"
|
||||
L1: Fragmented mirror with face
|
||||
L2: Multiple reflections = multiple online personas
|
||||
L3: Question of authentic self in digital age
|
||||
```
|
||||
|
||||
### Transition States
|
||||
Show transformation between concepts:
|
||||
- **Discrete**: Clear before/after states
|
||||
- **Continuous**: Gradient transformation
|
||||
- **Recursive**: Self-referential loops
|
||||
- **Parallel**: Simultaneous states
|
||||
|
||||
## Composition Dynamics
|
||||
|
||||
### Sacred Geometry Applications
|
||||
|
||||
**Golden Spiral**
|
||||
```python
|
||||
# Place key elements along spiral path
|
||||
phi = 1.618
|
||||
spiral_points = [(r * cos(θ), r * sin(θ))
|
||||
where r = phi^(θ/2π)]
|
||||
```
|
||||
|
||||
**Rule of Triangles**
|
||||
- Stable: Base down △
|
||||
- Unstable: Point down ▽
|
||||
- Dynamic: Multiple overlapping
|
||||
|
||||
**Grid Breaking**
|
||||
- Start with rigid grid
|
||||
- Selectively break for emphasis
|
||||
- Maintain overall structure
|
||||
|
||||
### Negative Space as Active Element
|
||||
|
||||
Use empty space to:
|
||||
1. Create secondary images
|
||||
2. Guide eye movement
|
||||
3. Represent absence/loss
|
||||
4. Provide breathing room
|
||||
5. Suggest the ineffable
|
||||
|
||||
## Cultural Symbolism Integration
|
||||
|
||||
### Korean Elements (Subtle)
|
||||
- **Ma (마/間)**: Pregnant emptiness
|
||||
- **Jeong (정)**: Emotional bonds as visual threads
|
||||
- **Han (한)**: Melancholic beauty in shadows
|
||||
- **Nunchi (눈치)**: Implied awareness in composition
|
||||
|
||||
### Western Elements (Structural)
|
||||
- **Bauhaus**: Function drives form
|
||||
- **Swiss Grid**: Underlying order
|
||||
- **Brutalism**: Raw honesty
|
||||
- **Minimalism**: Essential only
|
||||
|
||||
### Fusion Techniques
|
||||
```
|
||||
Korean softness + Western structure =
|
||||
- Geometric forms with organic edges
|
||||
- Grid with breathing spaces
|
||||
- Minimal palette with emotional depth
|
||||
- Clean lines with textural warmth
|
||||
```
|
||||
|
||||
## Texture Integration
|
||||
|
||||
### Digital Textures
|
||||
- **Glitch**: Controlled chaos, disruption
|
||||
- **Grain**: Film nostalgia, warmth
|
||||
- **Pixels**: Digital breakdown, transformation
|
||||
- **Code**: Underlying structure revealed
|
||||
|
||||
### Organic Textures
|
||||
- **Paper**: Tangible, traditional
|
||||
- **Water**: Flow, change, transparency
|
||||
- **Stone**: Permanence, weight
|
||||
- **Cloud**: Ethereal, transient
|
||||
|
||||
### Hybrid Approach
|
||||
```css
|
||||
/* Layer organic over digital */
|
||||
base: clean_vector;
|
||||
overlay: paper_texture at 15% opacity;
|
||||
accent: digital_grain at edges;
|
||||
```
|
||||
|
||||
## Color Psychology Advanced
|
||||
|
||||
### Emotional Journey Mapping
|
||||
```
|
||||
Start → Middle → End
|
||||
Cold Blue → Neutral Gray → Warm Gold
|
||||
(Analysis) → (Process) → (Understanding)
|
||||
```
|
||||
|
||||
### Color Dissonance for Tension
|
||||
- Complementary colors at borders
|
||||
- Unexpected accent in monochrome
|
||||
- Temperature shift for emphasis
|
||||
|
||||
### Cultural Color Codes
|
||||
- Red in Korea: More passionate than West
|
||||
- White in Korea: Death/purity duality
|
||||
- Black: Universal depth, different meanings
|
||||
|
||||
## Temporal Narrative Techniques
|
||||
|
||||
### Static Image, Dynamic Story
|
||||
1. **Past-Present-Future**: Three zones in composition
|
||||
2. **Cycle Representation**: Circular time
|
||||
3. **Erosion/Growth**: Time's effect
|
||||
4. **Palimpsest**: Layers of history
|
||||
|
||||
### Motion Implied in Stillness
|
||||
- Blur suggesting movement
|
||||
- Repetition showing progression
|
||||
- Fragments indicating explosion
|
||||
- Spiral showing evolution
|
||||
|
||||
## Abstraction Gradients
|
||||
|
||||
### Level 1: Recognizable (0.3 abstract)
|
||||
- Clear objects with stylization
|
||||
- Obvious metaphors
|
||||
- Direct symbolism
|
||||
|
||||
### Level 2: Suggestive (0.6 abstract)
|
||||
- Forms hint at objects
|
||||
- Metaphors require thought
|
||||
- Symbolism is layered
|
||||
|
||||
### Level 3: Conceptual (0.9 abstract)
|
||||
- Pure form and color
|
||||
- Metaphors are felt
|
||||
- Symbolism is philosophical
|
||||
|
||||
## Technical Excellence
|
||||
|
||||
### File Optimization
|
||||
```bash
|
||||
# ImageMagick optimization
|
||||
convert input.png \
|
||||
-quality 85 \
|
||||
-strip \
|
||||
-resize 1200x630 \
|
||||
-colorspace sRGB \
|
||||
output.webp
|
||||
```
|
||||
|
||||
### Accessibility Checks
|
||||
- Contrast ratio: minimum 4.5:1
|
||||
- Color-blind safe palettes
|
||||
- Clear focal points
|
||||
- Alternative interpretations valid
|
||||
|
||||
## Prompt Engineering Advanced
|
||||
|
||||
### Complex Concept Formula
|
||||
```
|
||||
[PHILOSOPHICAL CONCEPT] through [NATURAL METAPHOR]
|
||||
+ [TECHNICAL ELEMENT] suggesting [EMOTIONAL JOURNEY]
|
||||
+ [CULTURAL REFERENCE] without cliché
|
||||
+ [TEMPORAL ASPECT] in single frame
|
||||
= Sophisticated visual narrative
|
||||
```
|
||||
|
||||
### Negative Prompting
|
||||
Always include what to avoid:
|
||||
- "No literal representations"
|
||||
- "Avoid tech clichés"
|
||||
- "No stock photo aesthetics"
|
||||
- "Exclude obvious symbols"
|
||||
|
||||
## Quality Evaluation Matrix
|
||||
|
||||
| Aspect | Weight | Evaluation Criteria |
|
||||
|--------|--------|-------------------|
|
||||
| Concept | 30% | Captures essay essence? |
|
||||
| Originality | 25% | Unique perspective? |
|
||||
| Execution | 20% | Technical excellence? |
|
||||
| Emotion | 15% | Evokes intended feeling? |
|
||||
| Timelessness | 10% | Will age well? |
|
||||
|
||||
## Iteration Strategies
|
||||
|
||||
1. **Generate 3 variations**: Different moods
|
||||
2. **A/B test concepts**: Literal vs abstract
|
||||
3. **Color studies**: Warm vs cool
|
||||
4. **Composition alternatives**: Central vs offset
|
||||
|
||||
## Cultural Sensitivity Checklist
|
||||
|
||||
- [ ] Avoids stereotypes
|
||||
- [ ] Respects both traditions
|
||||
- [ ] Universal symbolism
|
||||
- [ ] Inclusive imagery
|
||||
- [ ] Cross-cultural readable
|
||||
|
||||
Remember: Every image is a visual philosophy—not decoration, but thought.
|
||||
@@ -0,0 +1,147 @@
|
||||
# Color Palette Reference
|
||||
|
||||
Emotion-driven color systems for OurDigital visual storytelling.
|
||||
|
||||
## Core Palettes
|
||||
|
||||
### Contemplative Analysis
|
||||
```
|
||||
Primary: #2C3E50 Deep Blue-Gray
|
||||
Secondary: #95A5A6 Cool Gray
|
||||
Accent: #E74C3C Sharp Red
|
||||
Background:#F8F9FA Soft White
|
||||
Usage: Critical thinking, analytical pieces
|
||||
```
|
||||
|
||||
### Hopeful Exploration
|
||||
```
|
||||
Primary: #F39C12 Warm Amber
|
||||
Secondary: #E8E2D5 Soft Beige
|
||||
Accent: #3498DB Sky Blue
|
||||
Background:#FFF9F0 Warm White
|
||||
Usage: Future-oriented, optimistic content
|
||||
```
|
||||
|
||||
### Philosophical Depth
|
||||
```
|
||||
Primary: #1A1A1A Near Black
|
||||
Secondary: #F5F5F5 Off White
|
||||
Accent: #8B7355 Muted Gold
|
||||
Background:#FAFAFA Pure White
|
||||
Usage: Deep thinking, timeless topics
|
||||
```
|
||||
|
||||
### Social Commentary
|
||||
```
|
||||
Primary: #34495E Slate
|
||||
Secondary: #ECF0F1 Cloud
|
||||
Accent: #9B59B6 Purple
|
||||
Background:#F7F8F9 Cool White
|
||||
Usage: Cultural observation, social critique
|
||||
```
|
||||
|
||||
### Digital Anxiety
|
||||
```
|
||||
Primary: #2F3640 Charcoal
|
||||
Secondary: #718093 Grey Blue
|
||||
Accent: #44BD32 Digital Green
|
||||
Background:#F5F6FA Ghost White
|
||||
Usage: Technology concerns, digital culture
|
||||
```
|
||||
|
||||
## Gradient Formulas
|
||||
|
||||
### Dawn (Hope/Beginning)
|
||||
```css
|
||||
linear-gradient(135deg, #667eea 0%, #764ba2 100%)
|
||||
```
|
||||
|
||||
### Dusk (Reflection/End)
|
||||
```css
|
||||
linear-gradient(135deg, #f093fb 0%, #f5576c 100%)
|
||||
```
|
||||
|
||||
### Digital Flow (Technology)
|
||||
```css
|
||||
linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)
|
||||
```
|
||||
|
||||
### Organic (Nature/Human)
|
||||
```css
|
||||
linear-gradient(135deg, #fa709a 0%, #fee140 100%)
|
||||
```
|
||||
|
||||
## Cultural Color Notes
|
||||
|
||||
### Korean Traditional (오방색)
|
||||
- **청 (Blue-Green)**: #0C7B93 - Future, technology
|
||||
- **적 (Red)**: #C0392B - Warning, passion
|
||||
- **황 (Yellow)**: #F1C40F - Center, balance
|
||||
- **백 (White)**: #FFFFFF - Beginning, void
|
||||
- **흑 (Black)**: #000000 - Depth, unknown
|
||||
|
||||
### Modern Minimal
|
||||
- **Primary**: Single strong color
|
||||
- **Support**: 90% grayscale
|
||||
- **Accent**: 10% vibrant touch
|
||||
|
||||
## Emotional Temperature Map
|
||||
|
||||
| Cool → Warm Scale | Hex Code | Emotional State |
|
||||
|------------------|----------|-----------------|
|
||||
| Ice | #E3F2FD | Detached analysis |
|
||||
| Cold | #90CAF9 | Objective observation |
|
||||
| Cool | #64B5F6 | Calm reflection |
|
||||
| Neutral | #42A5F5 | Balanced view |
|
||||
| Warm | #FFA726 | Human connection |
|
||||
| Hot | #FF7043 | Passionate engagement |
|
||||
| Fire | #F4511E | Urgent concern |
|
||||
|
||||
## Accessibility Combinations
|
||||
|
||||
### High Contrast (WCAG AAA)
|
||||
- Black (#000000) on White (#FFFFFF)
|
||||
- White (#FFFFFF) on Black (#000000)
|
||||
- Dark Blue (#003366) on Light Yellow (#FFFFCC)
|
||||
|
||||
### Medium Contrast (WCAG AA)
|
||||
- Charcoal (#333333) on Light Gray (#F5F5F5)
|
||||
- Navy (#2C3E50) on Cream (#FFF8DC)
|
||||
|
||||
## Application Rules
|
||||
|
||||
1. **60-30-10 Rule**
|
||||
- 60% dominant color (usually neutral)
|
||||
- 30% secondary color (supporting)
|
||||
- 10% accent color (attention)
|
||||
|
||||
2. **Mood Matching**
|
||||
- Technical → Cool spectrum
|
||||
- Emotional → Warm spectrum
|
||||
- Philosophical → Monochrome
|
||||
- Social → Mixed temperature
|
||||
|
||||
3. **Cultural Balance**
|
||||
- Western: High contrast, bold
|
||||
- Korean: Subtle gradation, harmony
|
||||
- Fusion: Selective contrast points
|
||||
|
||||
## Quick Selection Matrix
|
||||
|
||||
| Essay Type | Primary | Accent | Mood |
|
||||
|------------|---------|---------|------|
|
||||
| AI Ethics | Cool Gray | Red | Caution |
|
||||
| Digital Culture | Blue-Gray | Green | Technical |
|
||||
| Social Media | Desaturated | Purple | Critical |
|
||||
| Philosophy | Monochrome | Gold | Timeless |
|
||||
| Future Tech | Blue | Orange | Optimistic |
|
||||
| Cultural | Earth | Red | Grounded |
|
||||
|
||||
## Seasonal Adjustments
|
||||
|
||||
- **Spring**: Fresh greens, light blues
|
||||
- **Summer**: Vibrant, high saturation
|
||||
- **Autumn**: Warm earth tones
|
||||
- **Winter**: Cool, desaturated
|
||||
|
||||
Use colors intentionally—each hue carries meaning.
|
||||
@@ -0,0 +1,101 @@
|
||||
# Visual Metaphor Dictionary
|
||||
|
||||
Quick reference for translating abstract concepts into visual elements.
|
||||
|
||||
## Technology & Digital
|
||||
|
||||
| Concept | Primary Metaphor | Alternative Visuals |
|
||||
|---------|-----------------|-------------------|
|
||||
| Algorithm | Constellation patterns | Maze structures, flow charts as art |
|
||||
| AI | Crystalline growth | Mirror reflections, fractal patterns |
|
||||
| Data | Water flow, particles | Bird murmurations, sand grains |
|
||||
| Network | Root systems | Neural pathways, spider silk, web |
|
||||
| Code | Musical notation | DNA strands, city blueprints |
|
||||
| Cloud | Atmospheric forms | Floating islands, ethereal spaces |
|
||||
| Privacy | Veils, shadows | One-way mirrors, fog, barriers |
|
||||
| Security | Locks dissolving | Fortresses becoming permeable |
|
||||
| Automation | Clockwork organic | Self-assembling structures |
|
||||
| Virtual | Layers of reality | Parallel dimensions, glass planes |
|
||||
|
||||
## Social & Cultural
|
||||
|
||||
| Concept | Primary Metaphor | Alternative Visuals |
|
||||
|---------|-----------------|-------------------|
|
||||
| Identity | Layered masks | Fingerprints merging, mirrors |
|
||||
| Community | Overlapping circles | Shared spaces, woven threads |
|
||||
| Isolation | Islands in fog | Glass barriers, empty chairs |
|
||||
| Communication | Bridge structures | Echo patterns, light beams |
|
||||
| Conflict | Opposing forces | Tectonic plates, storm systems |
|
||||
| Harmony | Resonance patterns | Orchestra arrangements, balance |
|
||||
| Culture | Textile patterns | Layered sediments, palimpsest |
|
||||
| Tradition | Tree rings | Ancient stones, inherited objects |
|
||||
| Change | Metamorphosis | Phase transitions, seasonal cycles |
|
||||
| Power | Pyramids inverting | Current flows, gravity wells |
|
||||
|
||||
## Philosophical & Abstract
|
||||
|
||||
| Concept | Primary Metaphor | Alternative Visuals |
|
||||
|---------|-----------------|-------------------|
|
||||
| Time | Spirals, loops | Sediment layers, clock dissolution |
|
||||
| Knowledge | Light sources | Growing trees, opening books |
|
||||
| Wisdom | Mountain vistas | Deep waters, ancient libraries |
|
||||
| Truth | Clear water | Prisms splitting light, unveiled |
|
||||
| Illusion | Distorted mirrors | Smoke shapes, double images |
|
||||
| Choice | Diverging paths | Doors opening, quantum splits |
|
||||
| Balance | Tensegrity | Scales reimagined, equilibrium |
|
||||
| Paradox | Möbius strips | Impossible objects, Escher-like |
|
||||
| Existence | Breath patterns | Pulse rhythms, presence/absence |
|
||||
| Consciousness | Nested awareness | Recursive mirrors, awakening |
|
||||
|
||||
## Emotional States
|
||||
|
||||
| Emotion | Visual Translation | Color Association |
|
||||
|---------|-------------------|------------------|
|
||||
| Anxiety | Fragmented grids | Desaturated, glitch |
|
||||
| Hope | Light breaking through | Warm gradients |
|
||||
| Melancholy | Soft dissolution | Muted blues, grays |
|
||||
| Joy | Expansion patterns | Bright, ascending |
|
||||
| Fear | Contracting spaces | Sharp contrasts |
|
||||
| Peace | Still water | Soft neutrals |
|
||||
| Confusion | Tangled lines | Overlapping hues |
|
||||
| Clarity | Clean geometry | Pure, minimal |
|
||||
|
||||
## Transformation & Process
|
||||
|
||||
| Process | Visual Narrative | Symbolic Elements |
|
||||
|---------|------------------|------------------|
|
||||
| Growth | Seeds → trees | Fibonacci spirals |
|
||||
| Decay | Entropy patterns | Rust, dissolution |
|
||||
| Evolution | Branching forms | Darwin's tree reimagined |
|
||||
| Revolution | Circles breaking | Shattered patterns |
|
||||
| Innovation | Spark → flame | Lightning, fusion |
|
||||
| Tradition | Continuous thread | Inherited patterns |
|
||||
| Disruption | Broken grids | Glitch aesthetics |
|
||||
| Integration | Merging streams | Confluence points |
|
||||
|
||||
## Korean-Western Fusion Elements
|
||||
|
||||
| Korean Element | Western Parallel | Fusion Approach |
|
||||
|---------------|-----------------|-----------------|
|
||||
| 여백 (Empty space) | Negative space | Active emptiness |
|
||||
| 오방색 (Five colors) | Color theory | Symbolic palette |
|
||||
| 달항아리 (Moon jar) | Minimalism | Imperfect circles |
|
||||
| 한글 geometry | Typography | Structural letters |
|
||||
| 산수화 (Landscape) | Abstract landscape | Atmospheric depth |
|
||||
| 전통문양 (Patterns) | Geometric design | Cultural geometry |
|
||||
|
||||
## Usage Notes
|
||||
|
||||
1. **Layer metaphors**: Combine 2-3 for depth
|
||||
2. **Avoid clichés**: No obvious tech symbols
|
||||
3. **Cultural sensitivity**: Universal over specific
|
||||
4. **Abstraction levels**: Match essay tone
|
||||
5. **Emotional resonance**: Feel over literal
|
||||
|
||||
## Quick Selection Guide
|
||||
|
||||
For **technology essays**: organic-digital hybrids
|
||||
For **social commentary**: human elements in systems
|
||||
For **philosophy pieces**: space and light
|
||||
For **cultural topics**: layered traditions
|
||||
For **future themes**: transformation states
|
||||
@@ -0,0 +1,211 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
OurDigital Visual Storytelling Prompt Generator
|
||||
Generates sophisticated image prompts for blog featured images
|
||||
"""
|
||||
|
||||
import argparse
|
||||
from typing import Dict, Tuple
|
||||
import json
|
||||
|
||||
class VisualPromptGenerator:
|
||||
def __init__(self):
|
||||
self.style_base = (
|
||||
"sophisticated featured image, minimalist contemporary design, "
|
||||
"clean vector illustration with subtle texture overlays, "
|
||||
"1200x630px, suitable for blog header"
|
||||
)
|
||||
|
||||
self.moods = {
|
||||
"contemplative": "contemplative and introspective atmosphere, zen-like calm",
|
||||
"critical": "analytical precision with underlying urgency, sharp clarity",
|
||||
"hopeful": "dawn breaking through uncertainty, warm optimism",
|
||||
"anxious": "subtle tension and uncertainty, digital unease",
|
||||
"philosophical": "deep meditation quality, timeless wisdom"
|
||||
}
|
||||
|
||||
self.color_palettes = {
|
||||
"contemplative": "monochrome palette with single accent color",
|
||||
"critical": "cool blue-gray with sharp red accents",
|
||||
"hopeful": "warm amber gradients with sky blue highlights",
|
||||
"anxious": "desaturated colors with digital green touches",
|
||||
"philosophical": "near black and off-white with muted gold"
|
||||
}
|
||||
|
||||
self.metaphor_types = {
|
||||
"technology": "organic-digital hybrid forms, natural systems becoming circuits",
|
||||
"identity": "layered masks, fragmented mirrors, dissolving boundaries",
|
||||
"network": "root systems, neural pathways, constellation patterns",
|
||||
"transformation": "metamorphosis states, particle dissolution, phase transitions",
|
||||
"knowledge": "light sources, growing trees, prismatic refractions"
|
||||
}
|
||||
|
||||
def generate_prompt(
|
||||
self,
|
||||
topic: str,
|
||||
mood: str = "contemplative",
|
||||
metaphor: str = None,
|
||||
cultural_fusion: float = 0.6,
|
||||
abstract_level: float = 0.8
|
||||
) -> str:
|
||||
"""
|
||||
Generate a sophisticated image prompt for OurDigital blog
|
||||
|
||||
Args:
|
||||
topic: Main subject of the blog post
|
||||
mood: Emotional tone (contemplative/critical/hopeful/anxious/philosophical)
|
||||
metaphor: Visual metaphor to use
|
||||
cultural_fusion: Balance of Korean-Western aesthetics (0-1)
|
||||
abstract_level: Level of abstraction (0=literal, 1=highly abstract)
|
||||
"""
|
||||
|
||||
# Build core prompt
|
||||
prompt_parts = [
|
||||
f"Create a {self.style_base} for blog post about {topic}.",
|
||||
""
|
||||
]
|
||||
|
||||
# Add visual concept
|
||||
if metaphor:
|
||||
prompt_parts.append(f"Visual concept: {metaphor}.")
|
||||
else:
|
||||
prompt_parts.append(f"Visual concept: Abstract representation of {topic}.")
|
||||
|
||||
prompt_parts.append("")
|
||||
|
||||
# Add mood and atmosphere
|
||||
mood_desc = self.moods.get(mood, self.moods["contemplative"])
|
||||
prompt_parts.append(f"Atmosphere: {mood_desc}.")
|
||||
|
||||
# Add color palette
|
||||
colors = self.color_palettes.get(mood, self.color_palettes["contemplative"])
|
||||
prompt_parts.append(f"Colors: {colors}.")
|
||||
|
||||
# Add composition guidelines
|
||||
prompt_parts.extend([
|
||||
"",
|
||||
"Composition:",
|
||||
f"- {'Highly abstract' if abstract_level > 0.7 else 'Semi-abstract'} interpretation",
|
||||
f"- Minimum 20% negative space for contemplative breathing room",
|
||||
f"- Asymmetrical balance with {'strong' if abstract_level > 0.5 else 'subtle'} geometric structure"
|
||||
])
|
||||
|
||||
# Add cultural elements if needed
|
||||
if cultural_fusion > 0.3:
|
||||
fusion_level = "subtle" if cultural_fusion < 0.6 else "balanced"
|
||||
prompt_parts.append(
|
||||
f"- {fusion_level} integration of Korean minimalist aesthetics with Western modernism"
|
||||
)
|
||||
|
||||
# Add quality notes
|
||||
prompt_parts.extend([
|
||||
"",
|
||||
"Technical notes:",
|
||||
"- Ensure clarity at thumbnail size (200px)",
|
||||
"- Avoid tech clichés (circuits, binary codes)",
|
||||
"- No stock photo aesthetics or literal interpretations",
|
||||
"- Timeless design that won't date quickly"
|
||||
])
|
||||
|
||||
# Add reference
|
||||
prompt_parts.extend([
|
||||
"",
|
||||
"Aesthetic reference: Combine Bauhaus principles with Agnes Martin's contemplative minimalism."
|
||||
])
|
||||
|
||||
return "\n".join(prompt_parts)
|
||||
|
||||
def generate_variations(self, topic: str, count: int = 3) -> list:
|
||||
"""Generate multiple prompt variations for the same topic"""
|
||||
variations = []
|
||||
moods = ["contemplative", "critical", "philosophical"]
|
||||
|
||||
for i in range(min(count, len(moods))):
|
||||
prompt = self.generate_prompt(
|
||||
topic=topic,
|
||||
mood=moods[i],
|
||||
abstract_level=0.7 + (i * 0.1)
|
||||
)
|
||||
variations.append({
|
||||
"variation": i + 1,
|
||||
"mood": moods[i],
|
||||
"prompt": prompt
|
||||
})
|
||||
|
||||
return variations
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Generate visual prompts for OurDigital blog featured images"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--topic",
|
||||
required=True,
|
||||
help="Main topic/subject of the blog post"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--mood",
|
||||
choices=["contemplative", "critical", "hopeful", "anxious", "philosophical"],
|
||||
default="contemplative",
|
||||
help="Emotional tone of the image"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--metaphor",
|
||||
help="Specific visual metaphor to use"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--cultural-fusion",
|
||||
type=float,
|
||||
default=0.6,
|
||||
help="Korean-Western aesthetic balance (0-1)"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--abstract",
|
||||
type=float,
|
||||
default=0.8,
|
||||
help="Level of abstraction (0-1)"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--variations",
|
||||
type=int,
|
||||
help="Generate N variations of the prompt"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--json",
|
||||
action="store_true",
|
||||
help="Output as JSON"
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
generator = VisualPromptGenerator()
|
||||
|
||||
if args.variations:
|
||||
results = generator.generate_variations(args.topic, args.variations)
|
||||
if args.json:
|
||||
print(json.dumps(results, indent=2, ensure_ascii=False))
|
||||
else:
|
||||
for var in results:
|
||||
print(f"\n--- Variation {var['variation']} ({var['mood']}) ---")
|
||||
print(var['prompt'])
|
||||
else:
|
||||
prompt = generator.generate_prompt(
|
||||
topic=args.topic,
|
||||
mood=args.mood,
|
||||
metaphor=args.metaphor,
|
||||
cultural_fusion=args.cultural_fusion,
|
||||
abstract_level=args.abstract
|
||||
)
|
||||
|
||||
if args.json:
|
||||
result = {
|
||||
"topic": args.topic,
|
||||
"mood": args.mood,
|
||||
"prompt": prompt
|
||||
}
|
||||
print(json.dumps(result, indent=2, ensure_ascii=False))
|
||||
else:
|
||||
print(prompt)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,251 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
OurDigital Mood Calibrator
|
||||
Fine-tune emotional and stylistic parameters for visual prompts
|
||||
"""
|
||||
|
||||
import json
|
||||
from typing import Dict, Any
|
||||
import argparse
|
||||
|
||||
class MoodCalibrator:
|
||||
def __init__(self):
|
||||
self.presets = {
|
||||
"default": {
|
||||
"contemplative_depth": 0.8,
|
||||
"cultural_fusion": 0.6,
|
||||
"technical_precision": 0.7,
|
||||
"emotional_weight": 0.5,
|
||||
"innovation_index": 0.7
|
||||
},
|
||||
"philosophical_essay": {
|
||||
"contemplative_depth": 0.95,
|
||||
"cultural_fusion": 0.7,
|
||||
"technical_precision": 0.6,
|
||||
"emotional_weight": 0.3,
|
||||
"innovation_index": 0.8
|
||||
},
|
||||
"technical_analysis": {
|
||||
"contemplative_depth": 0.6,
|
||||
"cultural_fusion": 0.4,
|
||||
"technical_precision": 0.9,
|
||||
"emotional_weight": 0.3,
|
||||
"innovation_index": 0.6
|
||||
},
|
||||
"social_commentary": {
|
||||
"contemplative_depth": 0.7,
|
||||
"cultural_fusion": 0.6,
|
||||
"technical_precision": 0.5,
|
||||
"emotional_weight": 0.7,
|
||||
"innovation_index": 0.7
|
||||
},
|
||||
"cultural_exploration": {
|
||||
"contemplative_depth": 0.8,
|
||||
"cultural_fusion": 0.9,
|
||||
"technical_precision": 0.4,
|
||||
"emotional_weight": 0.6,
|
||||
"innovation_index": 0.8
|
||||
}
|
||||
}
|
||||
|
||||
self.parameter_descriptions = {
|
||||
"contemplative_depth": "Level of abstraction (0=literal, 1=highly abstract)",
|
||||
"cultural_fusion": "Balance of Korean-Western aesthetics (0=Western only, 1=Korean dominant)",
|
||||
"technical_precision": "Clean geometric vs organic forms (0=organic, 1=geometric)",
|
||||
"emotional_weight": "Mood intensity (0=neutral, 1=heavy atmosphere)",
|
||||
"innovation_index": "Traditional vs experimental approach (0=traditional, 1=experimental)"
|
||||
}
|
||||
|
||||
def calibrate(self, preset: str = "default", **overrides) -> Dict[str, float]:
|
||||
"""
|
||||
Get calibrated mood parameters
|
||||
|
||||
Args:
|
||||
preset: Base preset to use
|
||||
**overrides: Specific parameter overrides
|
||||
|
||||
Returns:
|
||||
Dictionary of calibrated parameters
|
||||
"""
|
||||
params = self.presets.get(preset, self.presets["default"]).copy()
|
||||
|
||||
# Apply overrides
|
||||
for key, value in overrides.items():
|
||||
if key in params:
|
||||
params[key] = max(0, min(1, value)) # Clamp to 0-1
|
||||
|
||||
return params
|
||||
|
||||
def generate_modifier_text(self, params: Dict[str, float]) -> str:
|
||||
"""
|
||||
Generate text modifiers based on parameters
|
||||
|
||||
Args:
|
||||
params: Dictionary of mood parameters
|
||||
|
||||
Returns:
|
||||
Text description for prompt modification
|
||||
"""
|
||||
modifiers = []
|
||||
|
||||
# Contemplative depth
|
||||
if params["contemplative_depth"] > 0.8:
|
||||
modifiers.append("highly abstract and philosophical")
|
||||
elif params["contemplative_depth"] > 0.6:
|
||||
modifiers.append("semi-abstract with symbolic elements")
|
||||
else:
|
||||
modifiers.append("grounded with recognizable forms")
|
||||
|
||||
# Cultural fusion
|
||||
if params["cultural_fusion"] > 0.7:
|
||||
modifiers.append("strong Korean aesthetic influence")
|
||||
elif params["cultural_fusion"] > 0.4:
|
||||
modifiers.append("balanced East-West aesthetic fusion")
|
||||
else:
|
||||
modifiers.append("Western minimalist approach")
|
||||
|
||||
# Technical precision
|
||||
if params["technical_precision"] > 0.7:
|
||||
modifiers.append("precise geometric construction")
|
||||
elif params["technical_precision"] > 0.4:
|
||||
modifiers.append("blend of geometric and organic")
|
||||
else:
|
||||
modifiers.append("flowing organic forms")
|
||||
|
||||
# Emotional weight
|
||||
if params["emotional_weight"] > 0.7:
|
||||
modifiers.append("heavy, contemplative atmosphere")
|
||||
elif params["emotional_weight"] > 0.4:
|
||||
modifiers.append("balanced emotional tone")
|
||||
else:
|
||||
modifiers.append("light, open feeling")
|
||||
|
||||
# Innovation index
|
||||
if params["innovation_index"] > 0.7:
|
||||
modifiers.append("experimental and avant-garde")
|
||||
elif params["innovation_index"] > 0.4:
|
||||
modifiers.append("contemporary with classic elements")
|
||||
else:
|
||||
modifiers.append("timeless and traditional")
|
||||
|
||||
return ", ".join(modifiers)
|
||||
|
||||
def suggest_color_temperature(self, params: Dict[str, float]) -> str:
|
||||
"""
|
||||
Suggest color temperature based on parameters
|
||||
|
||||
Args:
|
||||
params: Dictionary of mood parameters
|
||||
|
||||
Returns:
|
||||
Color temperature suggestion
|
||||
"""
|
||||
emotional = params.get("emotional_weight", 0.5)
|
||||
technical = params.get("technical_precision", 0.7)
|
||||
|
||||
if emotional > 0.6:
|
||||
if technical > 0.6:
|
||||
return "Cool palette with strategic warm accents"
|
||||
else:
|
||||
return "Warm, earthy tones with depth"
|
||||
else:
|
||||
if technical > 0.6:
|
||||
return "Neutral grays with single accent color"
|
||||
else:
|
||||
return "Soft, desaturated natural colors"
|
||||
|
||||
def export_for_prompt(self, params: Dict[str, float]) -> Dict[str, Any]:
|
||||
"""
|
||||
Export parameters in a format ready for prompt generation
|
||||
|
||||
Args:
|
||||
params: Dictionary of mood parameters
|
||||
|
||||
Returns:
|
||||
Formatted export for prompt generation
|
||||
"""
|
||||
return {
|
||||
"parameters": params,
|
||||
"modifiers": self.generate_modifier_text(params),
|
||||
"color_temperature": self.suggest_color_temperature(params),
|
||||
"abstraction_level": params["contemplative_depth"],
|
||||
"cultural_balance": params["cultural_fusion"]
|
||||
}
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Calibrate mood parameters for OurDigital visual prompts"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--preset",
|
||||
choices=["default", "philosophical_essay", "technical_analysis",
|
||||
"social_commentary", "cultural_exploration"],
|
||||
default="default",
|
||||
help="Base preset to use"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--contemplative-depth",
|
||||
type=float,
|
||||
help="Override contemplative depth (0-1)"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--cultural-fusion",
|
||||
type=float,
|
||||
help="Override cultural fusion (0-1)"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--technical-precision",
|
||||
type=float,
|
||||
help="Override technical precision (0-1)"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--emotional-weight",
|
||||
type=float,
|
||||
help="Override emotional weight (0-1)"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--innovation-index",
|
||||
type=float,
|
||||
help="Override innovation index (0-1)"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--export",
|
||||
action="store_true",
|
||||
help="Export full configuration for prompt generation"
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
calibrator = MoodCalibrator()
|
||||
|
||||
# Build overrides
|
||||
overrides = {}
|
||||
if args.contemplative_depth is not None:
|
||||
overrides["contemplative_depth"] = args.contemplative_depth
|
||||
if args.cultural_fusion is not None:
|
||||
overrides["cultural_fusion"] = args.cultural_fusion
|
||||
if args.technical_precision is not None:
|
||||
overrides["technical_precision"] = args.technical_precision
|
||||
if args.emotional_weight is not None:
|
||||
overrides["emotional_weight"] = args.emotional_weight
|
||||
if args.innovation_index is not None:
|
||||
overrides["innovation_index"] = args.innovation_index
|
||||
|
||||
# Calibrate
|
||||
params = calibrator.calibrate(args.preset, **overrides)
|
||||
|
||||
if args.export:
|
||||
export = calibrator.export_for_prompt(params)
|
||||
print(json.dumps(export, indent=2, ensure_ascii=False))
|
||||
else:
|
||||
print(f"Calibrated Parameters for '{args.preset}':")
|
||||
print("-" * 50)
|
||||
for key, value in params.items():
|
||||
desc = calibrator.parameter_descriptions[key]
|
||||
print(f"{key}: {value:.2f} - {desc}")
|
||||
print("-" * 50)
|
||||
print(f"Modifiers: {calibrator.generate_modifier_text(params)}")
|
||||
print(f"Color Temperature: {calibrator.suggest_color_temperature(params)}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,205 @@
|
||||
---
|
||||
name: ourdigital-research-publisher
|
||||
version: 1.0.0
|
||||
description: |
|
||||
End-to-end research-to-publication workflow for OurDigital channels. Transforms questions into comprehensive research, then Korean/English blog posts. Use when user wants to: (1) Research a topic deeply, (2) Create research papers from conversations, (3) Write blog posts for OurDigital/Ghost, (4) Execute "research to publish" workflow, (5) Save research to Notion and export to Ulysses. Triggers: "research this", "write a blog about", "publish to OurDigital", "deep dive into", "연구해줘", "블로그 작성", "포스팅 초안".
|
||||
---
|
||||
|
||||
# OurDigital Research-to-Publisher Workflow
|
||||
|
||||
Transform questions into comprehensive research papers and polished blog posts for OurDigital channels.
|
||||
|
||||
## Workflow Overview
|
||||
|
||||
```
|
||||
Phase 1: Discovery → Phase 2: Research Planning → Phase 3: Deep Research
|
||||
↓
|
||||
Phase 4: Research Paper → Phase 5: Notion Save → Phase 6: Blog Draft
|
||||
↓
|
||||
Phase 7: Ulysses Export → Phase 8: Publishing Guidance
|
||||
```
|
||||
|
||||
## Phase 1: Discovery
|
||||
|
||||
**Goal**: Understand user's question and refine scope.
|
||||
|
||||
1. Acknowledge the topic/question
|
||||
2. Ask clarifying questions (max 3 per turn):
|
||||
- Target audience? (전문가/일반인/마케터)
|
||||
- Depth level? (개요/심층분석/실무가이드)
|
||||
- Specific angles or concerns?
|
||||
3. Confirm research scope before proceeding
|
||||
|
||||
**Output**: Clear research objective statement
|
||||
|
||||
## Phase 2: Research Planning
|
||||
|
||||
**Goal**: Create structured research instruction.
|
||||
|
||||
Generate research plan with:
|
||||
- Primary research questions (3-5)
|
||||
- Secondary questions for depth
|
||||
- Suggested tools/sources:
|
||||
- Web search for current info
|
||||
- Google Drive for internal docs
|
||||
- Notion for past research
|
||||
- Amplitude for analytics data (if relevant)
|
||||
- Expected deliverables
|
||||
|
||||
**Output**: Numbered research instruction list
|
||||
|
||||
## Phase 3: Deep Research
|
||||
|
||||
**Goal**: Execute comprehensive multi-source research.
|
||||
|
||||
Tools to leverage:
|
||||
- `web_search` / `web_fetch`: Current information, statistics, trends
|
||||
- `google_drive_search`: Internal documents, past reports
|
||||
- `Notion:notion-search`: Previous research, related notes
|
||||
- `Amplitude:search` / `Amplitude:query_*`: Analytics insights (if applicable)
|
||||
- `conversation_search`: Past chat context
|
||||
|
||||
Research execution pattern:
|
||||
1. Start broad (overview searches)
|
||||
2. Deep dive into key subtopics
|
||||
3. Find supporting data/statistics
|
||||
4. Identify expert opinions and case studies
|
||||
5. Cross-reference and validate
|
||||
|
||||
**Output**: Organized research findings with citations
|
||||
|
||||
## Phase 4: Research Paper (Artifact)
|
||||
|
||||
**Goal**: Synthesize findings into comprehensive document.
|
||||
|
||||
Create HTML artifact with:
|
||||
```
|
||||
Structure:
|
||||
├── Executive Summary (핵심 요약)
|
||||
├── Background & Context (배경)
|
||||
├── Key Findings (주요 발견)
|
||||
│ ├── Finding 1 with evidence
|
||||
│ ├── Finding 2 with evidence
|
||||
│ └── Finding 3 with evidence
|
||||
├── Analysis & Implications (분석 및 시사점)
|
||||
├── Recommendations (제언)
|
||||
├── References & Sources (참고자료)
|
||||
└── Appendix (부록) - if needed
|
||||
```
|
||||
|
||||
Style: Professional, data-driven, bilingual key terms
|
||||
|
||||
**Output**: Comprehensive research paper artifact
|
||||
|
||||
## Phase 5: Notion Save
|
||||
|
||||
**Goal**: Archive research to Working with AI database.
|
||||
|
||||
Auto-save to Notion with:
|
||||
- **Database**: 🤖 Working with AI (data_source_id: f8f19ede-32bd-43ac-9f60-0651f6f40afe)
|
||||
- **Properties**:
|
||||
- Name: [Research topic]
|
||||
- Type: "Research"
|
||||
- Category: Based on topic (e.g., "SEO", "AI Literacy", "Digital Marketing")
|
||||
- Topic: Relevant tags
|
||||
- AI used: ["Claude 4.5"]
|
||||
- Status: "Done"
|
||||
- AI summary: 2-3 sentence summary
|
||||
|
||||
**Output**: Notion page URL confirmation
|
||||
|
||||
## Phase 6: Blog Draft
|
||||
|
||||
**Goal**: Transform research into engaging blog post.
|
||||
|
||||
**PROMPT USER for channel selection:**
|
||||
```
|
||||
📝 블로그 채널을 선택해주세요:
|
||||
|
||||
1. blog.ourdigital.org (Korean, 디지털 마케팅/SEO/데이터)
|
||||
2. journal.ourdigital.org (English, professional insights)
|
||||
3. ourstory.day (Korean, 에세이/성찰/개인적 이야기)
|
||||
4. Medium (English, broader tech audience)
|
||||
|
||||
선택: [번호]
|
||||
```
|
||||
|
||||
Generate MD file based on channel:
|
||||
- See `references/blog-style-guide.md` for tone/voice
|
||||
- Use `assets/blog-template.md` as structure reference
|
||||
- Korean channels: 한글 작성, 전문용어는 영문 병기
|
||||
- English channels: Professional but accessible
|
||||
|
||||
**Output**: Complete .md blog draft file
|
||||
|
||||
## Phase 7: Ulysses Export
|
||||
|
||||
**Goal**: Deliver MD file for Ulysses editing.
|
||||
|
||||
Export path: iCloud Drive folder for Ulysses sync
|
||||
|
||||
**PROMPT USER (first time only):**
|
||||
```
|
||||
📁 Ulysses 동기화 폴더 경로를 알려주세요:
|
||||
|
||||
예시:
|
||||
- /Users/[username]/Library/Mobile Documents/com~apple~CloudDocs/Ulysses/Blog Drafts/
|
||||
- 또는 선호하는 iCloud 폴더 경로
|
||||
|
||||
(최초 1회 설정 후 기억됩니다)
|
||||
```
|
||||
|
||||
After receiving path:
|
||||
1. Save .md file to specified iCloud folder
|
||||
2. Confirm file location
|
||||
3. Provide Ulysses opening instructions
|
||||
|
||||
**Output**: MD file in iCloud + path confirmation
|
||||
|
||||
## Phase 8: Publishing Guidance
|
||||
|
||||
**Goal**: Guide user through final publishing steps.
|
||||
|
||||
Provide channel-specific checklist:
|
||||
|
||||
### Ghost (blog.ourdigital.org / journal.ourdigital.org)
|
||||
- [ ] Ulysses에서 최종 교정 완료
|
||||
- [ ] Ghost 관리자 페이지에서 새 포스트 생성
|
||||
- [ ] MD 콘텐츠 붙여넣기
|
||||
- [ ] Featured image 설정
|
||||
- [ ] SEO meta (title, description, URL slug)
|
||||
- [ ] Tags/Categories 설정
|
||||
- [ ] 발행 또는 예약 발행
|
||||
|
||||
### ourstory.day (Ghost)
|
||||
- Same as above, personal essay tone check
|
||||
|
||||
### Medium
|
||||
- [ ] Medium 에디터에서 새 story
|
||||
- [ ] Import from clipboard or MD
|
||||
- [ ] Add images/embeds
|
||||
- [ ] Tags (max 5)
|
||||
- [ ] Publication 선택 (if applicable)
|
||||
|
||||
**OFFER**: "Ghost API로 자동 발행을 원하시면 알려주세요."
|
||||
|
||||
---
|
||||
|
||||
## Quick Commands
|
||||
|
||||
| Command | Action |
|
||||
|---------|--------|
|
||||
| "연구 시작" / "research this" | Start Phase 1 |
|
||||
| "초안 작성" / "draft blog" | Skip to Phase 6 (if research exists) |
|
||||
| "노션 저장" | Execute Phase 5 only |
|
||||
| "발행 가이드" | Show Phase 8 checklist |
|
||||
| "handoff summary" | Generate context transfer summary |
|
||||
|
||||
## Channel Reference
|
||||
|
||||
| Channel | Language | Tone | Topics |
|
||||
|---------|----------|------|--------|
|
||||
| blog.ourdigital.org | Korean | Professional, practical | SEO, Digital Marketing, Data |
|
||||
| journal.ourdigital.org | English | Insightful, analytical | Industry trends, Best practices |
|
||||
| ourstory.day | Korean | Personal, reflective | Essays, Life lessons, Reflections |
|
||||
| Medium | English | Accessible, engaging | Tech, Marketing, AI |
|
||||
@@ -0,0 +1,87 @@
|
||||
# {제목 / Title}
|
||||
|
||||
> **요약**: {1-2문장 핵심 요약}
|
||||
>
|
||||
> **Summary**: {1-2 sentence key takeaway}
|
||||
|
||||
---
|
||||
|
||||
## 들어가며 / Introduction
|
||||
|
||||
{독자의 관심을 끄는 도입부. 문제 제기, 질문, 또는 흥미로운 사실로 시작.}
|
||||
|
||||
{Opening hook that captures reader attention. Start with a problem, question, or interesting fact.}
|
||||
|
||||
---
|
||||
|
||||
## 배경 / Background
|
||||
|
||||
{주제에 대한 맥락 설명. 왜 이것이 중요한지, 현재 상황은 어떤지.}
|
||||
|
||||
{Context for the topic. Why this matters, current state of things.}
|
||||
|
||||
---
|
||||
|
||||
## 핵심 내용 / Key Points
|
||||
|
||||
### 첫 번째 포인트 / First Point
|
||||
|
||||
{상세 설명과 근거}
|
||||
|
||||
{Detailed explanation with evidence}
|
||||
|
||||
### 두 번째 포인트 / Second Point
|
||||
|
||||
{상세 설명과 근거}
|
||||
|
||||
{Detailed explanation with evidence}
|
||||
|
||||
### 세 번째 포인트 / Third Point
|
||||
|
||||
{상세 설명과 근거}
|
||||
|
||||
{Detailed explanation with evidence}
|
||||
|
||||
---
|
||||
|
||||
## 실무 적용 / Practical Application
|
||||
|
||||
{독자가 바로 적용할 수 있는 액션 아이템}
|
||||
|
||||
{Actionable items readers can implement immediately}
|
||||
|
||||
1. **첫 번째 단계**: {설명}
|
||||
2. **두 번째 단계**: {설명}
|
||||
3. **세 번째 단계**: {설명}
|
||||
|
||||
---
|
||||
|
||||
## 마치며 / Conclusion
|
||||
|
||||
{핵심 메시지 재강조, 독자에게 남기는 생각거리 또는 다음 단계}
|
||||
|
||||
{Reinforce key message, leave reader with thought or next step}
|
||||
|
||||
---
|
||||
|
||||
## 참고 자료 / References
|
||||
|
||||
- [출처 1](URL)
|
||||
- [출처 2](URL)
|
||||
- [출처 3](URL)
|
||||
|
||||
---
|
||||
|
||||
**태그 / Tags**: #{tag1} #{tag2} #{tag3}
|
||||
|
||||
**카테고리 / Category**: {category}
|
||||
|
||||
---
|
||||
|
||||
<!--
|
||||
SEO Meta (Ghost/CMS용):
|
||||
- Meta Title: {60자 이내}
|
||||
- Meta Description: {150-160자}
|
||||
- URL Slug: {짧고-명확한-슬러그}
|
||||
- Featured Image Alt: {이미지 설명}
|
||||
-->
|
||||
@@ -0,0 +1,114 @@
|
||||
# OurDigital Blog Style Guide
|
||||
|
||||
## Channel-Specific Voice & Tone
|
||||
|
||||
### blog.ourdigital.org (Korean)
|
||||
**Voice**: 전문적이면서 친근한 선배 마케터
|
||||
**Tone**: 실용적, 데이터 기반, 인사이트 중심
|
||||
|
||||
Writing patterns:
|
||||
- 제목: 핵심 키워드 포함, 30자 이내
|
||||
- 도입부: 독자의 고민/질문으로 시작
|
||||
- 본문: 번호 매기기보다 소제목 활용
|
||||
- 전문용어: 한글(영문) 형식 - 예: 검색엔진최적화(SEO)
|
||||
- 문장: ~입니다/~습니다 경어체
|
||||
- 단락: 3-4문장, 모바일 가독성 고려
|
||||
|
||||
Example opening:
|
||||
```
|
||||
"구글 상위 노출, 왜 이렇게 어려울까요?
|
||||
많은 마케터들이 SEO에 시간을 투자하지만
|
||||
결과가 보이지 않아 좌절합니다.
|
||||
오늘은 실제로 효과를 본 전략 3가지를 공유합니다."
|
||||
```
|
||||
|
||||
### journal.ourdigital.org (English)
|
||||
**Voice**: Thoughtful industry analyst
|
||||
**Tone**: Insightful, evidence-based, forward-looking
|
||||
|
||||
Writing patterns:
|
||||
- Headlines: Clear value proposition, under 60 chars
|
||||
- Opening: Hook with industry trend or data point
|
||||
- Body: Structured arguments with supporting evidence
|
||||
- Terminology: Define jargon on first use
|
||||
- Style: Active voice, varied sentence length
|
||||
- Paragraphs: 2-4 sentences for scannability
|
||||
|
||||
Example opening:
|
||||
```
|
||||
"The digital marketing landscape shifted dramatically in 2024.
|
||||
With AI reshaping search behavior, traditional SEO metrics
|
||||
no longer tell the full story. Here's what the data reveals—
|
||||
and what it means for your strategy."
|
||||
```
|
||||
|
||||
### ourstory.day (Korean)
|
||||
**Voice**: 성찰하는 동료, 이야기꾼
|
||||
**Tone**: 개인적, 진솔한, 영감을 주는
|
||||
|
||||
Writing patterns:
|
||||
- 제목: 감성적, 질문형 또는 은유적
|
||||
- 도입부: 개인 경험이나 장면 묘사로 시작
|
||||
- 본문: 이야기 흐름, 대화체 허용
|
||||
- 문장: ~해요/~네요 부드러운 경어체 가능
|
||||
- 단락: 자유로운 길이, 호흡에 따라
|
||||
- 마무리: 열린 질문 또는 여운
|
||||
|
||||
Example opening:
|
||||
```
|
||||
"새벽 5시, 아이를 깨우지 않으려 살금살금 책상에 앉았다.
|
||||
화면에는 어제 작성한 리포트가 그대로 남아있었다.
|
||||
'이게 정말 내가 하고 싶은 일인가?'
|
||||
문득 그런 생각이 스쳤다."
|
||||
```
|
||||
|
||||
### Medium (English)
|
||||
**Voice**: Knowledgeable peer sharing discoveries
|
||||
**Tone**: Conversational, practical, slightly informal
|
||||
|
||||
Writing patterns:
|
||||
- Headlines: Curiosity-driven, specific numbers work well
|
||||
- Opening: Personal anecdote or surprising fact
|
||||
- Body: Mix of storytelling and practical advice
|
||||
- Style: First person allowed, contractions okay
|
||||
- Subheadings: Every 300-400 words
|
||||
- Closing: Clear takeaway or call-to-action
|
||||
|
||||
Example opening:
|
||||
```
|
||||
"I've spent 15 years in digital marketing, and nothing
|
||||
prepared me for what happened when AI entered the chat.
|
||||
Last month, I ran an experiment that changed how I think
|
||||
about content strategy entirely. Let me walk you through it."
|
||||
```
|
||||
|
||||
## Universal Guidelines
|
||||
|
||||
### SEO Considerations
|
||||
- Primary keyword in title and first 100 words
|
||||
- Secondary keywords naturally distributed
|
||||
- Meta description: 150-160 chars, action-oriented
|
||||
- URL slug: Short, keyword-rich, no dates
|
||||
- Alt text for all images
|
||||
|
||||
### Formatting Rules
|
||||
- Use `##` for main sections, `###` for subsections
|
||||
- Code blocks with language specification
|
||||
- Blockquotes for key insights or quotes
|
||||
- Bold for emphasis (sparingly)
|
||||
- Lists only when truly listing items
|
||||
|
||||
### Citation Style
|
||||
- Inline links preferred over footnotes
|
||||
- Source attribution: "According to [Source Name](URL)..."
|
||||
- Data citations: Include date of data
|
||||
- Internal links: Reference related OurDigital posts
|
||||
|
||||
## Word Count Guidelines
|
||||
|
||||
| Channel | Target | Min | Max |
|
||||
|---------|--------|-----|-----|
|
||||
| blog.ourdigital.org | 1,500 | 1,000 | 2,500 |
|
||||
| journal.ourdigital.org | 1,800 | 1,200 | 3,000 |
|
||||
| ourstory.day | 1,000 | 500 | 2,000 |
|
||||
| Medium | 1,500 | 800 | 2,500 |
|
||||
@@ -0,0 +1,74 @@
|
||||
# Ghost Admin API Configuration
|
||||
|
||||
## Configured Channels
|
||||
|
||||
| Channel | Domain | API Status |
|
||||
|---------|--------|------------|
|
||||
| blog.ourdigital.org | Korean main blog | ✅ Configured |
|
||||
| journal.ourdigital.org | English journal | ✅ Configured |
|
||||
| ourstory.day | Personal essays | ✅ Configured |
|
||||
|
||||
## API Endpoints
|
||||
|
||||
Base URL pattern: `https://{domain}/ghost/api/admin/`
|
||||
|
||||
### Authentication
|
||||
Ghost Admin API uses JWT tokens generated from Admin API keys.
|
||||
|
||||
```
|
||||
Admin API Key Format: {id}:{secret}
|
||||
- id: 24 hex characters
|
||||
- secret: 64 hex characters
|
||||
```
|
||||
|
||||
### Key Endpoints
|
||||
|
||||
| Endpoint | Method | Purpose |
|
||||
|----------|--------|---------|
|
||||
| `/posts/` | POST | Create new post |
|
||||
| `/posts/{id}/` | PUT | Update existing post |
|
||||
| `/images/upload/` | POST | Upload image |
|
||||
| `/tags/` | GET/POST | Manage tags |
|
||||
|
||||
### Post Creation Payload
|
||||
|
||||
```json
|
||||
{
|
||||
"posts": [{
|
||||
"title": "Post Title",
|
||||
"html": "<p>Content in HTML</p>",
|
||||
"status": "draft",
|
||||
"tags": [{"name": "tag1"}, {"name": "tag2"}],
|
||||
"feature_image": "https://...",
|
||||
"meta_title": "SEO Title",
|
||||
"meta_description": "SEO Description",
|
||||
"og_title": "Social Title",
|
||||
"og_description": "Social Description",
|
||||
"published_at": "2024-01-15T09:00:00.000Z"
|
||||
}]
|
||||
}
|
||||
```
|
||||
|
||||
### Status Options
|
||||
- `draft`: Save without publishing
|
||||
- `published`: Publish immediately
|
||||
- `scheduled`: Schedule for future (requires `published_at`)
|
||||
|
||||
## Future Automation Opportunities
|
||||
|
||||
### Zapier Integration Points
|
||||
1. **Trigger**: New Notion page in "Working with AI" → Create Ghost draft
|
||||
2. **Trigger**: Ghost post published → Share to social channels
|
||||
3. **Trigger**: New MD file in iCloud folder → Create Ghost draft
|
||||
|
||||
### n8n Workflow Ideas
|
||||
1. Research complete → Auto-create drafts across all relevant channels
|
||||
2. Scheduled publishing queue management
|
||||
3. Cross-posting between Ghost instances
|
||||
|
||||
## Security Notes
|
||||
|
||||
- API keys stored in environment variables
|
||||
- Never expose keys in code or logs
|
||||
- Rotate keys if compromised
|
||||
- Use separate keys for different integrations
|
||||
@@ -0,0 +1,118 @@
|
||||
# Pre-Publishing Checklist
|
||||
|
||||
## Content Quality
|
||||
|
||||
### Writing
|
||||
- [ ] Title is compelling and SEO-optimized
|
||||
- [ ] Opening hook captures attention within first 3 sentences
|
||||
- [ ] Clear thesis/value proposition stated early
|
||||
- [ ] Logical flow between sections
|
||||
- [ ] Strong conclusion with takeaway or CTA
|
||||
- [ ] Proofread for typos and grammar (Ulysses phase)
|
||||
|
||||
### Accuracy
|
||||
- [ ] All facts verified with sources
|
||||
- [ ] Statistics include source and date
|
||||
- [ ] Links tested and working
|
||||
- [ ] No outdated information presented as current
|
||||
- [ ] Technical accuracy reviewed
|
||||
|
||||
### Formatting
|
||||
- [ ] Consistent heading hierarchy (H2 → H3 → H4)
|
||||
- [ ] Paragraphs appropriately sized for readability
|
||||
- [ ] Code blocks properly formatted with language tags
|
||||
- [ ] Lists used only for actual list content
|
||||
- [ ] Emphasis (bold/italic) used sparingly
|
||||
|
||||
## SEO Elements
|
||||
|
||||
### On-Page
|
||||
- [ ] Primary keyword in title
|
||||
- [ ] Primary keyword in first 100 words
|
||||
- [ ] Secondary keywords naturally distributed
|
||||
- [ ] URL slug: short, descriptive, keyword-rich
|
||||
- [ ] Meta description: 150-160 chars, includes CTA
|
||||
|
||||
### Technical
|
||||
- [ ] Internal links to related posts (2-3 minimum)
|
||||
- [ ] External links to authoritative sources
|
||||
- [ ] Alt text for all images
|
||||
- [ ] Heading structure is semantic (one H1 only)
|
||||
|
||||
## Visual Elements (Web UI Phase)
|
||||
|
||||
### Featured Image
|
||||
- [ ] High quality, relevant to content
|
||||
- [ ] Proper dimensions for channel
|
||||
- Ghost: 1200 x 630px recommended
|
||||
- Medium: 1500 x 750px recommended
|
||||
- [ ] Alt text added
|
||||
- [ ] Copyright/license verified
|
||||
|
||||
### In-Post Images
|
||||
- [ ] Compressed for web (< 200KB ideal)
|
||||
- [ ] Descriptive filenames (not IMG_001.jpg)
|
||||
- [ ] Captions added where helpful
|
||||
- [ ] Alt text for accessibility
|
||||
|
||||
## Channel-Specific
|
||||
|
||||
### Ghost (blog.ourdigital.org, journal.ourdigital.org, ourstory.day)
|
||||
|
||||
**Before Publishing:**
|
||||
- [ ] Tags assigned (3-5 relevant tags)
|
||||
- [ ] Author profile selected
|
||||
- [ ] Excerpt/custom snippet written
|
||||
- [ ] Publication date/time set
|
||||
- [ ] Email newsletter toggle reviewed
|
||||
|
||||
**Ghost Admin Settings:**
|
||||
- [ ] Code injection (if needed): header/footer scripts
|
||||
- [ ] Facebook/Twitter card preview checked
|
||||
- [ ] Canonical URL set (if republishing)
|
||||
|
||||
### Medium
|
||||
|
||||
**Before Publishing:**
|
||||
- [ ] Tags selected (max 5)
|
||||
- [ ] Publication submitted to (if applicable)
|
||||
- [ ] Subtitle/kicker written
|
||||
- [ ] Reading time appears reasonable
|
||||
- [ ] Preview in both web and mobile
|
||||
|
||||
**Medium-Specific:**
|
||||
- [ ] No excessive self-promotion
|
||||
- [ ] Paywall setting decided (member-only?)
|
||||
- [ ] Cross-post canonical URL added (if from blog)
|
||||
|
||||
## Final Verification
|
||||
|
||||
### Preview Check
|
||||
- [ ] Desktop preview looks correct
|
||||
- [ ] Mobile preview is readable
|
||||
- [ ] Links work in preview mode
|
||||
- [ ] Images display properly
|
||||
- [ ] Social share preview correct
|
||||
|
||||
### Publication
|
||||
- [ ] Schedule vs. publish now decided
|
||||
- [ ] Social sharing plan ready
|
||||
- [ ] Newsletter inclusion decided
|
||||
- [ ] Analytics tracking confirmed
|
||||
|
||||
## Post-Publication
|
||||
|
||||
### Immediate (within 1 hour)
|
||||
- [ ] Verify live URL works
|
||||
- [ ] Share to social channels
|
||||
- [ ] Notify team/subscribers if relevant
|
||||
|
||||
### Follow-up (within 24-48 hours)
|
||||
- [ ] Check initial engagement metrics
|
||||
- [ ] Respond to comments
|
||||
- [ ] Fix any reported issues
|
||||
|
||||
### Long-term (monthly)
|
||||
- [ ] Review analytics performance
|
||||
- [ ] Update outdated information
|
||||
- [ ] Add internal links from newer posts
|
||||
@@ -0,0 +1,133 @@
|
||||
# Research Frameworks
|
||||
|
||||
## Framework Selection Guide
|
||||
|
||||
| Topic Type | Framework | Best For |
|
||||
|------------|-----------|----------|
|
||||
| Trend analysis | STEEP + Timeline | Industry shifts, emerging tech |
|
||||
| Problem-solution | Problem Tree | Pain points, how-to guides |
|
||||
| Comparison | Feature Matrix | Tool reviews, option analysis |
|
||||
| Strategy | SWOT + Action | Business recommendations |
|
||||
| Technical | Layered Deep-Dive | Implementation guides |
|
||||
|
||||
## STEEP + Timeline Framework
|
||||
|
||||
For analyzing trends and industry changes:
|
||||
|
||||
```
|
||||
S - Social: User behavior changes, demographics
|
||||
T - Technological: New tools, platforms, capabilities
|
||||
E - Economic: Market conditions, pricing trends
|
||||
E - Environmental: Sustainability, resource factors
|
||||
P - Political/Legal: Regulations, compliance
|
||||
|
||||
Timeline:
|
||||
- Past (2-3 years): What changed?
|
||||
- Present: Current state of play
|
||||
- Future (1-2 years): Projections
|
||||
```
|
||||
|
||||
## Problem Tree Framework
|
||||
|
||||
For diagnostic and solution-oriented research:
|
||||
|
||||
```
|
||||
ROOT PROBLEM
|
||||
├── Cause 1
|
||||
│ ├── Sub-cause 1.1
|
||||
│ └── Sub-cause 1.2
|
||||
├── Cause 2
|
||||
│ └── Sub-cause 2.1
|
||||
└── Cause 3
|
||||
|
||||
SOLUTIONS
|
||||
├── Solution A → addresses Cause 1
|
||||
├── Solution B → addresses Cause 2
|
||||
└── Solution C → addresses Cause 3
|
||||
```
|
||||
|
||||
## Feature Matrix Framework
|
||||
|
||||
For comparisons and evaluations:
|
||||
|
||||
```
|
||||
| Criteria | Option A | Option B | Option C | Weight |
|
||||
|----------|----------|----------|----------|--------|
|
||||
| Feature 1 | ⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ | High |
|
||||
| Feature 2 | ⭐⭐ | ⭐⭐⭐ | ⭐ | Medium |
|
||||
| Feature 3 | ⭐ | ⭐⭐ | ⭐⭐⭐ | Low |
|
||||
| Price | $$$ | $$ | $ | High |
|
||||
|
||||
Weighted Score: Calculate based on importance
|
||||
Recommendation: Based on user's priority
|
||||
```
|
||||
|
||||
## Layered Deep-Dive Framework
|
||||
|
||||
For technical and implementation topics:
|
||||
|
||||
```
|
||||
Layer 1: Concept (What is it?)
|
||||
- Definition
|
||||
- Key components
|
||||
- How it works (simplified)
|
||||
|
||||
Layer 2: Context (Why does it matter?)
|
||||
- Business value
|
||||
- Use cases
|
||||
- When to use vs. alternatives
|
||||
|
||||
Layer 3: Implementation (How to do it?)
|
||||
- Prerequisites
|
||||
- Step-by-step process
|
||||
- Code/configuration examples
|
||||
|
||||
Layer 4: Optimization (How to do it well?)
|
||||
- Best practices
|
||||
- Common pitfalls
|
||||
- Advanced techniques
|
||||
|
||||
Layer 5: Measurement (How to know it works?)
|
||||
- Success metrics
|
||||
- Monitoring approach
|
||||
- Iteration guidance
|
||||
```
|
||||
|
||||
## Research Question Templates
|
||||
|
||||
### Exploratory Questions
|
||||
- "What is the current state of [topic]?"
|
||||
- "How has [topic] evolved in the past [timeframe]?"
|
||||
- "Who are the key players/stakeholders in [topic]?"
|
||||
|
||||
### Analytical Questions
|
||||
- "What factors drive [outcome] in [context]?"
|
||||
- "How does [variable A] affect [variable B]?"
|
||||
- "What patterns emerge when comparing [X] and [Y]?"
|
||||
|
||||
### Evaluative Questions
|
||||
- "What are the strengths and limitations of [approach]?"
|
||||
- "How effective is [solution] for [problem]?"
|
||||
- "What criteria should guide [decision]?"
|
||||
|
||||
### Practical Questions
|
||||
- "How can [audience] implement [solution]?"
|
||||
- "What resources are needed for [action]?"
|
||||
- "What are the risks and mitigations for [approach]?"
|
||||
|
||||
## Source Priority
|
||||
|
||||
1. **Primary**: Official documentation, research papers, authoritative reports
|
||||
2. **Secondary**: Industry publications, expert analysis, case studies
|
||||
3. **Tertiary**: News articles, blog posts, community discussions
|
||||
|
||||
Always cross-reference claims across multiple source types.
|
||||
|
||||
## Data Quality Checklist
|
||||
|
||||
- [ ] Source credibility verified
|
||||
- [ ] Publication date recent (within context)
|
||||
- [ ] Statistics include sample size/methodology
|
||||
- [ ] Claims are falsifiable/verifiable
|
||||
- [ ] Potential biases identified
|
||||
- [ ] Conflicting viewpoints considered
|
||||
@@ -0,0 +1,113 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Ulysses Export Helper
|
||||
|
||||
Exports markdown files to iCloud folder for Ulysses sync.
|
||||
Designed for OurDigital research-to-publisher workflow.
|
||||
|
||||
Usage:
|
||||
python export_to_ulysses.py --content "# Title\n\nContent..." --filename "my-post.md"
|
||||
python export_to_ulysses.py --file /path/to/draft.md --channel blog
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import argparse
|
||||
from pathlib import Path
|
||||
from datetime import datetime
|
||||
|
||||
# Default iCloud paths (user should customize)
|
||||
ICLOUD_BASE = Path.home() / "Library/Mobile Documents/com~apple~CloudDocs"
|
||||
|
||||
# Channel-specific folders (customize based on Ulysses library structure)
|
||||
CHANNEL_FOLDERS = {
|
||||
"blog": "Ulysses/OurDigital/Blog Drafts",
|
||||
"journal": "Ulysses/OurDigital/Journal Drafts",
|
||||
"ourstory": "Ulysses/OurDigital/OurStory Drafts",
|
||||
"medium": "Ulysses/OurDigital/Medium Drafts",
|
||||
"default": "Ulysses/Blog Drafts"
|
||||
}
|
||||
|
||||
def get_export_path(channel: str = "default") -> Path:
|
||||
"""Get the export path for a specific channel."""
|
||||
folder = CHANNEL_FOLDERS.get(channel, CHANNEL_FOLDERS["default"])
|
||||
export_path = ICLOUD_BASE / folder
|
||||
|
||||
# Create directory if it doesn't exist
|
||||
export_path.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
return export_path
|
||||
|
||||
def generate_filename(title: str = None) -> str:
|
||||
"""Generate a filename with timestamp."""
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H%M")
|
||||
if title:
|
||||
# Clean title for filename
|
||||
clean_title = "".join(c if c.isalnum() or c in "- " else "" for c in title)
|
||||
clean_title = clean_title.replace(" ", "-").lower()[:50]
|
||||
return f"{timestamp}_{clean_title}.md"
|
||||
return f"{timestamp}_draft.md"
|
||||
|
||||
def export_content(content: str, filename: str, channel: str = "default") -> Path:
|
||||
"""Export content to the appropriate iCloud folder."""
|
||||
export_path = get_export_path(channel)
|
||||
file_path = export_path / filename
|
||||
|
||||
# Add Ulysses-friendly frontmatter if not present
|
||||
if not content.startswith("---"):
|
||||
frontmatter = f"""---
|
||||
created: {datetime.now().isoformat()}
|
||||
channel: {channel}
|
||||
status: draft
|
||||
---
|
||||
|
||||
"""
|
||||
content = frontmatter + content
|
||||
|
||||
file_path.write_text(content, encoding="utf-8")
|
||||
return file_path
|
||||
|
||||
def export_file(source_path: str, channel: str = "default") -> Path:
|
||||
"""Copy an existing file to the iCloud folder."""
|
||||
source = Path(source_path)
|
||||
if not source.exists():
|
||||
raise FileNotFoundError(f"Source file not found: {source_path}")
|
||||
|
||||
content = source.read_text(encoding="utf-8")
|
||||
filename = source.name
|
||||
|
||||
return export_content(content, filename, channel)
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Export markdown to Ulysses via iCloud")
|
||||
parser.add_argument("--content", help="Markdown content to export")
|
||||
parser.add_argument("--file", help="Path to existing markdown file")
|
||||
parser.add_argument("--filename", help="Output filename (auto-generated if not provided)")
|
||||
parser.add_argument("--channel", choices=list(CHANNEL_FOLDERS.keys()),
|
||||
default="default", help="Target channel/folder")
|
||||
parser.add_argument("--list-paths", action="store_true",
|
||||
help="List configured export paths")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.list_paths:
|
||||
print("Configured export paths:")
|
||||
for channel, folder in CHANNEL_FOLDERS.items():
|
||||
full_path = ICLOUD_BASE / folder
|
||||
exists = "✓" if full_path.exists() else "✗"
|
||||
print(f" [{exists}] {channel}: {full_path}")
|
||||
return
|
||||
|
||||
if args.file:
|
||||
result = export_file(args.file, args.channel)
|
||||
print(f"✓ Exported to: {result}")
|
||||
elif args.content:
|
||||
filename = args.filename or generate_filename()
|
||||
result = export_content(args.content, filename, args.channel)
|
||||
print(f"✓ Exported to: {result}")
|
||||
else:
|
||||
parser.print_help()
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
95
ourdigital-custom-skills/02-notion-organizer/SKILL.md
Normal file
95
ourdigital-custom-skills/02-notion-organizer/SKILL.md
Normal file
@@ -0,0 +1,95 @@
|
||||
---
|
||||
name: notion-organizer
|
||||
version: 1.0.0
|
||||
description: Notion workspace management agent for organizing, restructuring, consolidating, and maintaining databases and pages. Use when user asks to search Notion, organize databases, clean up properties, migrate data, merge databases, audit schemas, or manage Notion content. Activates for keywords like Notion, database, knowledge base, wiki, workspace organization.
|
||||
allowed-tools: mcp__notion__*, Read, Write, Edit, Bash(python:*), Bash(pip:*)
|
||||
---
|
||||
|
||||
# Notion Organizer Skill
|
||||
|
||||
## Purpose
|
||||
|
||||
Specialized Notion workspace management capability for:
|
||||
- Database schema analysis and optimization
|
||||
- Property standardization and cleanup
|
||||
- Content restructuring and hierarchy optimization
|
||||
- Database merging and migration
|
||||
- Bulk operations with rate-limit compliance
|
||||
|
||||
## Execution Strategy: Three-Tier Approach
|
||||
|
||||
Always follow this priority order:
|
||||
|
||||
### Tier 1: Notion MCP Tools (Primary)
|
||||
|
||||
Use built-in MCP tools first. Available tools:
|
||||
|
||||
| Tool | Purpose |
|
||||
|------|---------|
|
||||
| `mcp__notion__search` | Find pages/databases by keyword |
|
||||
| `mcp__notion__get-page` | Retrieve page content |
|
||||
| `mcp__notion__get-database` | Retrieve database schema |
|
||||
| `mcp__notion__create-page` | Create new pages |
|
||||
| `mcp__notion__update-page` | Modify page properties |
|
||||
| `mcp__notion__query-database` | Query database with filters |
|
||||
|
||||
### Tier 2: Alternative Approaches (Fallback)
|
||||
|
||||
If MCP tools insufficient:
|
||||
- Export/import via filesystem (user action required)
|
||||
- Memory tools for tracking state across sessions
|
||||
- Sequential thinking for complex planning
|
||||
|
||||
### Tier 3: Python Scripts (Advanced)
|
||||
|
||||
For bulk operations (50+ items):
|
||||
- Generate async Python scripts
|
||||
- Include rate limiting (3 req/sec max)
|
||||
- Provide requirements.txt
|
||||
- Always include dry-run option
|
||||
|
||||
See `scripts/` directory for templates.
|
||||
|
||||
## Operational Guidelines
|
||||
|
||||
### Before Any Modification
|
||||
1. **Fetch first**: Always examine current structure before changes
|
||||
2. **Confirm destructive actions**: Get user approval for deletes/major restructures
|
||||
3. **Estimate impact**: For large operations, provide time/API call estimates
|
||||
4. **Backup reminder**: Remind about Notion version history
|
||||
|
||||
### Rate Limits (Critical)
|
||||
- Maximum: 3 requests/second average
|
||||
- Use pagination (100 items max per request)
|
||||
- Implement exponential backoff on 429 errors
|
||||
|
||||
### Communication
|
||||
- Korean for explanations (한국어로 설명)
|
||||
- English for code and technical terms
|
||||
- Structured before/after summaries
|
||||
|
||||
## Quick Commands
|
||||
|
||||
### Database Audit
|
||||
"Analyze [database name] structure and recommend optimizations"
|
||||
|
||||
### Property Cleanup
|
||||
"Standardize property names in [database] to [convention]"
|
||||
|
||||
### Bulk Move
|
||||
"Move all pages tagged [X] from [source] to [target]"
|
||||
|
||||
### Schema Migration
|
||||
"Migrate data from [source database] to [target database]"
|
||||
|
||||
## Workflow Patterns
|
||||
|
||||
See `reference.md` for detailed workflow documentation.
|
||||
See `scripts/` for Python templates.
|
||||
|
||||
## Limitations
|
||||
|
||||
- Cannot access unshared databases/pages
|
||||
- Cannot modify workspace settings
|
||||
- Cannot recover permanently deleted content
|
||||
- Large operations (1000+ pages) require Python scripts
|
||||
@@ -0,0 +1,299 @@
|
||||
# Notion Organizer Examples
|
||||
|
||||
## Quick Reference: Common Tasks
|
||||
|
||||
### 1. Database Audit
|
||||
|
||||
**Request:**
|
||||
```
|
||||
Audit my "Client Projects" database and recommend optimizations
|
||||
```
|
||||
|
||||
**Expected Actions:**
|
||||
1. Fetch database schema using MCP
|
||||
2. Analyze properties: types, naming, usage
|
||||
3. Report findings in Korean
|
||||
4. Recommend specific improvements
|
||||
|
||||
**Sample Output:**
|
||||
```
|
||||
## Database Audit: Client Projects
|
||||
|
||||
### 현재 구조 (Current Structure)
|
||||
- Properties: 15개
|
||||
- 페이지 수: 234개
|
||||
|
||||
### 발견된 문제점 (Issues Found)
|
||||
|
||||
1. **중복 속성**: "담당자"와 "Assignee" 동일한 용도
|
||||
2. **미사용 속성**: "Legacy ID" - 모든 값이 비어있음
|
||||
3. **명명 불일치**: "due_date" vs "Due Date" vs "마감일"
|
||||
|
||||
### 권장 조치 (Recommendations)
|
||||
|
||||
1. "담당자"와 "Assignee" 통합 → "담당자"로 유지
|
||||
2. "Legacy ID" 속성 삭제
|
||||
3. 명명 규칙 통일: Title Case 권장
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. Bulk Status Update
|
||||
|
||||
**Request:**
|
||||
```
|
||||
Change all pages with status "Pending Review" to "In Review"
|
||||
in the Tasks database
|
||||
```
|
||||
|
||||
**Tier 1 Approach (MCP):**
|
||||
```python
|
||||
# Claude uses MCP tools:
|
||||
1. mcp__notion__query-database with filter:
|
||||
{"property": "Status", "select": {"equals": "Pending Review"}}
|
||||
|
||||
2. For each page, mcp__notion__update-page:
|
||||
{"Status": {"select": {"name": "In Review"}}}
|
||||
```
|
||||
|
||||
**Tier 3 Approach (Python - for 50+ pages):**
|
||||
```bash
|
||||
python scripts/async_organizer.py \
|
||||
--database-id abc123 \
|
||||
--operation status-update \
|
||||
--old-status "Pending Review" \
|
||||
--new-status "In Review" \
|
||||
--dry-run # Test first!
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3. Schema Migration
|
||||
|
||||
**Request:**
|
||||
```
|
||||
Migrate data from "Old Projects" to "New Projects" database.
|
||||
Map Status→Stage, Due Date→Deadline, Tags→Categories
|
||||
```
|
||||
|
||||
**Step 1: Generate Mapping Template**
|
||||
```bash
|
||||
python scripts/schema_migrator.py \
|
||||
--source-db old_projects_id \
|
||||
--target-db new_projects_id \
|
||||
--generate-mapping \
|
||||
--output my_mapping.json
|
||||
```
|
||||
|
||||
**Step 2: Customize Mapping**
|
||||
Edit `my_mapping.json`:
|
||||
```json
|
||||
{
|
||||
"Status": {
|
||||
"target": "Stage",
|
||||
"value_mapping": {
|
||||
"Todo": "Backlog",
|
||||
"Doing": "In Progress",
|
||||
"Done": "Complete"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Step 3: Execute Migration**
|
||||
```bash
|
||||
# Dry run first
|
||||
python scripts/schema_migrator.py \
|
||||
--source-db old_projects_id \
|
||||
--target-db new_projects_id \
|
||||
--mapping my_mapping.json \
|
||||
--dry-run
|
||||
|
||||
# Execute
|
||||
python scripts/schema_migrator.py \
|
||||
--source-db old_projects_id \
|
||||
--target-db new_projects_id \
|
||||
--mapping my_mapping.json
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 4. Property Cleanup
|
||||
|
||||
**Request:**
|
||||
```
|
||||
Standardize all property names in "Marketing Campaigns"
|
||||
to Title Case with spaces
|
||||
```
|
||||
|
||||
**Before:**
|
||||
```
|
||||
- campaign_name → Campaign Name
|
||||
- startDate → Start Date
|
||||
- end-date → End Date
|
||||
- STATUS → Status
|
||||
- assigned_to → Assigned To
|
||||
```
|
||||
|
||||
**MCP Approach:**
|
||||
```
|
||||
Use mcp__notion__update-database to rename properties:
|
||||
{
|
||||
"properties": {
|
||||
"campaign_name": { "name": "Campaign Name" },
|
||||
"startDate": { "name": "Start Date" },
|
||||
"end-date": { "name": "End Date" },
|
||||
"STATUS": { "name": "Status" }
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5. Duplicate Detection
|
||||
|
||||
**Request:**
|
||||
```
|
||||
Find duplicate entries in "Contacts" database based on email
|
||||
```
|
||||
|
||||
**Python Script Approach:**
|
||||
```python
|
||||
# Pseudocode for duplicate detection
|
||||
pages = fetch_all_pages(database_id)
|
||||
|
||||
# Group by email
|
||||
email_groups = {}
|
||||
for page in pages:
|
||||
email = get_property(page, "Email")
|
||||
if email:
|
||||
email_groups.setdefault(email, []).append(page)
|
||||
|
||||
# Find duplicates
|
||||
duplicates = {
|
||||
email: pages
|
||||
for email, pages in email_groups.items()
|
||||
if len(pages) > 1
|
||||
}
|
||||
|
||||
# Report
|
||||
for email, dup_pages in duplicates.items():
|
||||
print(f"Duplicate: {email}")
|
||||
for p in dup_pages:
|
||||
print(f" - {get_title(p)} (created: {p['created_time']})")
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 6. Archive Old Content
|
||||
|
||||
**Request:**
|
||||
```
|
||||
Move all tasks completed more than 90 days ago to Archive database
|
||||
```
|
||||
|
||||
**Filter:**
|
||||
```json
|
||||
{
|
||||
"and": [
|
||||
{
|
||||
"property": "Status",
|
||||
"status": { "equals": "Complete" }
|
||||
},
|
||||
{
|
||||
"property": "Completed Date",
|
||||
"date": {
|
||||
"before": "2025-09-07"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
**Process:**
|
||||
1. Query with filter
|
||||
2. For each page:
|
||||
- Create copy in Archive database
|
||||
- Update original with "Archived" status or delete
|
||||
3. Report summary
|
||||
|
||||
---
|
||||
|
||||
### 7. Relation Audit
|
||||
|
||||
**Request:**
|
||||
```
|
||||
Find all pages in "Tasks" that have broken relations to "Projects"
|
||||
```
|
||||
|
||||
**Approach:**
|
||||
1. Fetch all Tasks pages
|
||||
2. For each task, check Project relation
|
||||
3. Verify referenced Project page exists
|
||||
4. Report broken relations
|
||||
|
||||
**Sample Output:**
|
||||
```
|
||||
## Relation Audit: Tasks → Projects
|
||||
|
||||
총 작업: 150개
|
||||
정상 연결: 142개
|
||||
끊어진 연결: 8개
|
||||
|
||||
### 끊어진 연결 목록:
|
||||
1. "Website Redesign Phase 2" → Project not found
|
||||
2. "Q3 Marketing Review" → Project deleted
|
||||
...
|
||||
|
||||
### 권장 조치:
|
||||
- 삭제된 프로젝트 복원 또는
|
||||
- 해당 작업들을 다른 프로젝트에 재할당
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Environment Setup
|
||||
|
||||
### Quick Start
|
||||
```bash
|
||||
# Navigate to scripts directory
|
||||
cd ~/.claude/skills/notion-organizer/scripts
|
||||
|
||||
# Create virtual environment
|
||||
python -m venv venv
|
||||
source venv/bin/activate # macOS/Linux
|
||||
|
||||
# Install dependencies
|
||||
pip install -r requirements.txt
|
||||
|
||||
# Set environment variable
|
||||
export NOTION_TOKEN="your_token_here"
|
||||
# Or create .env file with NOTION_TOKEN=your_token
|
||||
```
|
||||
|
||||
### Verify Setup
|
||||
```bash
|
||||
# Test with audit (read-only)
|
||||
python async_organizer.py --database-id YOUR_DB_ID --operation audit
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Rate Limit Errors (429)
|
||||
- Scripts automatically retry with exponential backoff
|
||||
- If persistent, reduce `MAX_CONCURRENT_REQUESTS` to 2
|
||||
|
||||
### Permission Errors (404)
|
||||
- Ensure database is shared with your integration
|
||||
- Check integration has correct capabilities
|
||||
|
||||
### Property Type Mismatch
|
||||
- Use `--generate-mapping` to see current types
|
||||
- Some conversions require manual handling (e.g., people → text)
|
||||
|
||||
### Large Databases (1000+ pages)
|
||||
- Always use Python scripts, not MCP
|
||||
- Consider running in batches with checkpoints
|
||||
- Monitor API usage in Notion settings
|
||||
@@ -0,0 +1,250 @@
|
||||
# Notion Organizer Reference
|
||||
|
||||
## Notion API Fundamentals
|
||||
|
||||
### Base Configuration
|
||||
- **Base URL**: `https://api.notion.com`
|
||||
- **Current Version**: `2022-06-28`
|
||||
- **Authentication**: Bearer token in Authorization header
|
||||
|
||||
### Rate Limits
|
||||
|
||||
| Limit | Value | Strategy |
|
||||
|-------|-------|----------|
|
||||
| Requests/second | 3 (average) | Use throttling/semaphore |
|
||||
| Burst allowed | Small bursts | Implement exponential backoff |
|
||||
| Page size | 100 items max | Use pagination cursors |
|
||||
| Payload size | 500KB max | Split large operations |
|
||||
|
||||
### Core Object Hierarchy
|
||||
|
||||
```
|
||||
Workspace
|
||||
└── Database (container)
|
||||
└── Page (row)
|
||||
└── Block (content)
|
||||
```
|
||||
|
||||
### Property Types Reference
|
||||
|
||||
| Type | Use Case | Notes |
|
||||
|------|----------|-------|
|
||||
| `title` | Page name | Required, one per database |
|
||||
| `rich_text` | Text content | Max 2,000 chars |
|
||||
| `number` | Numeric values | Supports format options |
|
||||
| `select` | Single choice | Define options array |
|
||||
| `multi_select` | Multiple choices | Define options array |
|
||||
| `status` | Workflow states | Groups: To-do, In progress, Complete |
|
||||
| `date` | Dates/times | ISO 8601 format |
|
||||
| `checkbox` | Boolean | true/false |
|
||||
| `url` | Links | Max 2,000 chars |
|
||||
| `email` | Email addresses | Validation applied |
|
||||
| `phone_number` | Phone | String format |
|
||||
| `relation` | Links to pages | Requires database_id |
|
||||
| `rollup` | Aggregated data | Requires relation + function |
|
||||
| `formula` | Computed values | Expression syntax |
|
||||
| `files` | Attachments | External URLs or Notion hosted |
|
||||
| `people` | User references | Notion user IDs |
|
||||
| `created_time` | Auto timestamp | Read-only |
|
||||
| `created_by` | Auto user | Read-only |
|
||||
| `last_edited_time` | Auto timestamp | Read-only |
|
||||
| `last_edited_by` | Auto user | Read-only |
|
||||
|
||||
### Size Limits
|
||||
|
||||
| Element | Limit |
|
||||
|---------|-------|
|
||||
| Rich text content | 2,000 characters |
|
||||
| URL length | 2,000 characters |
|
||||
| Array elements | 100 items |
|
||||
| Page properties | 100 per page |
|
||||
| Database properties | 100 per database |
|
||||
|
||||
### Error Codes
|
||||
|
||||
| Code | Status | Action |
|
||||
|------|--------|--------|
|
||||
| `rate_limited` | 429 | Wait Retry-After header seconds |
|
||||
| `validation_error` | 400 | Check request body format |
|
||||
| `object_not_found` | 404 | Verify sharing/permissions |
|
||||
| `unauthorized` | 401 | Check API token validity |
|
||||
| `conflict_error` | 409 | Resource was modified, refetch |
|
||||
| `internal_server_error` | 500 | Retry with backoff |
|
||||
|
||||
---
|
||||
|
||||
## Workflow Patterns
|
||||
|
||||
### Pattern 1: Database Audit
|
||||
|
||||
**Purpose**: Analyze database structure and recommend optimizations
|
||||
|
||||
**Steps**:
|
||||
1. Fetch database schema via MCP or API
|
||||
2. Analyze property types, naming conventions, usage
|
||||
3. Identify issues:
|
||||
- Unused properties
|
||||
- Inconsistent naming
|
||||
- Suboptimal property types
|
||||
- Missing relations
|
||||
4. Present recommendations with rationale
|
||||
5. Execute approved changes incrementally
|
||||
|
||||
**Example Query**:
|
||||
```
|
||||
Audit my "Projects" database:
|
||||
- Check for unused properties
|
||||
- Identify naming inconsistencies
|
||||
- Recommend schema optimizations
|
||||
```
|
||||
|
||||
### Pattern 2: Bulk Reorganization
|
||||
|
||||
**Purpose**: Move/update many pages efficiently
|
||||
|
||||
**Decision Tree**:
|
||||
- ≤ 50 operations → Use MCP tools with staged execution
|
||||
- > 50 operations → Generate Python script
|
||||
|
||||
**Steps**:
|
||||
1. Assess scope (count affected pages)
|
||||
2. Estimate API calls and time
|
||||
3. Choose execution method (MCP vs Python)
|
||||
4. Execute with progress updates
|
||||
5. Generate summary report
|
||||
|
||||
**Example Query**:
|
||||
```
|
||||
Move all pages with status "Archived" from "Active Projects"
|
||||
to "Archive" database, preserving the Project Name and Date properties
|
||||
```
|
||||
|
||||
### Pattern 3: Schema Migration
|
||||
|
||||
**Purpose**: Transfer data between databases with different schemas
|
||||
|
||||
**Steps**:
|
||||
1. Fetch source database schema
|
||||
2. Fetch target database schema
|
||||
3. Create property mapping plan:
|
||||
- Direct mappings (same type)
|
||||
- Transformations needed (type conversion)
|
||||
- Unmappable properties (manual handling)
|
||||
4. Validate compatibility
|
||||
5. Execute migration:
|
||||
- MCP for small datasets
|
||||
- Python for large datasets
|
||||
6. Verify data integrity
|
||||
|
||||
**Property Mapping Template**:
|
||||
```
|
||||
Source Property → Target Property (Transformation)
|
||||
─────────────────────────────────────────────────
|
||||
Name (title) → Project Name (title) [Direct]
|
||||
Status (select) → Stage (status) [Map values]
|
||||
Due Date (date) → Deadline (date) [Direct]
|
||||
Tags (multi) → Categories (multi) [Merge options]
|
||||
Notes (text) → Description (text) [Direct]
|
||||
Owner (text) → Assignee (people) [Manual]
|
||||
```
|
||||
|
||||
### Pattern 4: Property Cleanup
|
||||
|
||||
**Purpose**: Standardize properties across databases
|
||||
|
||||
**Common Tasks**:
|
||||
- Rename properties to consistent convention (camelCase, snake_case, Title Case)
|
||||
- Consolidate duplicate select/multi-select options
|
||||
- Remove unused properties
|
||||
- Add missing required properties
|
||||
|
||||
**Naming Convention Guide**:
|
||||
```
|
||||
Recommended: Title Case with spaces
|
||||
Examples: "Project Name", "Due Date", "Status", "Assigned To"
|
||||
|
||||
Alternative: camelCase (for technical databases)
|
||||
Examples: "projectName", "dueDate", "status", "assignedTo"
|
||||
```
|
||||
|
||||
### Pattern 5: Duplicate Detection
|
||||
|
||||
**Purpose**: Find and handle duplicate or similar content
|
||||
|
||||
**Detection Strategies**:
|
||||
1. Exact title match
|
||||
2. Fuzzy title similarity (Levenshtein distance)
|
||||
3. Property combination match (e.g., same name + date)
|
||||
4. Content hash comparison
|
||||
|
||||
**Resolution Options**:
|
||||
- Merge: Combine properties from duplicates
|
||||
- Archive: Move older duplicate to archive
|
||||
- Delete: Remove with user confirmation
|
||||
- Link: Create relation between related items
|
||||
|
||||
---
|
||||
|
||||
## MCP Tool Usage Examples
|
||||
|
||||
### Search for Pages
|
||||
```
|
||||
Use mcp__notion__search to find:
|
||||
- Query: "marketing campaign"
|
||||
- Filter: database_id = "abc123"
|
||||
```
|
||||
|
||||
### Query Database with Filters
|
||||
```
|
||||
Use mcp__notion__query-database:
|
||||
- Database ID: "abc123"
|
||||
- Filter: { "property": "Status", "select": { "equals": "Active" } }
|
||||
- Sorts: [{ "property": "Created", "direction": "descending" }]
|
||||
```
|
||||
|
||||
### Update Page Properties
|
||||
```
|
||||
Use mcp__notion__update-page:
|
||||
- Page ID: "xyz789"
|
||||
- Properties: {
|
||||
"Status": { "select": { "name": "Completed" } },
|
||||
"Completed Date": { "date": { "start": "2025-12-05" } }
|
||||
}
|
||||
```
|
||||
|
||||
### Create New Page
|
||||
```
|
||||
Use mcp__notion__create-page:
|
||||
- Parent: { "database_id": "abc123" }
|
||||
- Properties: {
|
||||
"Name": { "title": [{ "text": { "content": "New Project" } }] },
|
||||
"Status": { "select": { "name": "Planning" } }
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Best Practices
|
||||
|
||||
### 1. Always Fetch Before Modify
|
||||
Never assume database structure. Always retrieve current schema first.
|
||||
|
||||
### 2. Batch Operations Wisely
|
||||
- Group related updates
|
||||
- Use pagination for queries
|
||||
- Implement checkpoints for large operations
|
||||
|
||||
### 3. Handle Relations Carefully
|
||||
- Relations require both databases to be accessible
|
||||
- Synced databases need special handling
|
||||
- Rollups depend on relations - update order matters
|
||||
|
||||
### 4. Preserve Data Integrity
|
||||
- Back up critical data before major changes
|
||||
- Use transactions where possible
|
||||
- Verify changes after execution
|
||||
|
||||
### 5. Respect User Permissions
|
||||
- Check integration has access to target resources
|
||||
- Request additional permissions when needed
|
||||
- Document permission requirements
|
||||
@@ -0,0 +1,331 @@
|
||||
"""
|
||||
Notion Async Organizer - Base Template
|
||||
======================================
|
||||
Purpose: Rate-limited async operations for Notion API
|
||||
Python: 3.10+
|
||||
Packages: notion-client, tenacity, tqdm, python-dotenv
|
||||
|
||||
Usage:
|
||||
python async_organizer.py --database-id <id> [--dry-run]
|
||||
"""
|
||||
|
||||
import asyncio
|
||||
import argparse
|
||||
import logging
|
||||
import os
|
||||
from asyncio import Semaphore
|
||||
from datetime import datetime
|
||||
from typing import Any
|
||||
|
||||
from dotenv import load_dotenv
|
||||
from notion_client import AsyncClient
|
||||
from tenacity import (
|
||||
retry,
|
||||
stop_after_attempt,
|
||||
wait_exponential,
|
||||
retry_if_exception_type,
|
||||
)
|
||||
from tqdm.asyncio import tqdm
|
||||
|
||||
# Load environment variables
|
||||
load_dotenv()
|
||||
|
||||
# Configuration
|
||||
NOTION_API_KEY = os.getenv("NOTION_TOKEN") or os.getenv("NOTION_API_KEY")
|
||||
MAX_CONCURRENT_REQUESTS = 3
|
||||
REQUEST_DELAY = 0.35 # ~3 requests/second
|
||||
|
||||
# Logging setup
|
||||
logging.basicConfig(
|
||||
level=logging.INFO,
|
||||
format="%(asctime)s - %(levelname)s - %(message)s",
|
||||
handlers=[
|
||||
logging.StreamHandler(),
|
||||
logging.FileHandler(f"notion_organizer_{datetime.now():%Y%m%d_%H%M%S}.log"),
|
||||
],
|
||||
)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class NotionAsyncOrganizer:
|
||||
"""Async Notion operations with rate limiting and retry logic."""
|
||||
|
||||
def __init__(self, api_key: str, dry_run: bool = False):
|
||||
self.client = AsyncClient(auth=api_key)
|
||||
self.semaphore = Semaphore(MAX_CONCURRENT_REQUESTS)
|
||||
self.dry_run = dry_run
|
||||
self.stats = {"fetched": 0, "updated": 0, "created": 0, "errors": 0}
|
||||
|
||||
@retry(
|
||||
stop=stop_after_attempt(3),
|
||||
wait=wait_exponential(multiplier=1, min=2, max=10),
|
||||
retry=retry_if_exception_type(Exception),
|
||||
)
|
||||
async def _rate_limited_request(self, coro):
|
||||
"""Execute request with rate limiting and retry."""
|
||||
async with self.semaphore:
|
||||
await asyncio.sleep(REQUEST_DELAY)
|
||||
return await coro
|
||||
|
||||
async def fetch_database_schema(self, database_id: str) -> dict:
|
||||
"""Fetch database schema/properties."""
|
||||
logger.info(f"Fetching database schema: {database_id}")
|
||||
response = await self._rate_limited_request(
|
||||
self.client.databases.retrieve(database_id=database_id)
|
||||
)
|
||||
self.stats["fetched"] += 1
|
||||
return response
|
||||
|
||||
async def fetch_all_pages(
|
||||
self,
|
||||
database_id: str,
|
||||
filter_obj: dict | None = None,
|
||||
sorts: list | None = None,
|
||||
) -> list[dict]:
|
||||
"""Fetch all pages from a database with pagination."""
|
||||
all_pages = []
|
||||
has_more = True
|
||||
start_cursor = None
|
||||
|
||||
logger.info(f"Fetching pages from database: {database_id}")
|
||||
|
||||
while has_more:
|
||||
query_params = {
|
||||
"database_id": database_id,
|
||||
"page_size": 100,
|
||||
}
|
||||
if start_cursor:
|
||||
query_params["start_cursor"] = start_cursor
|
||||
if filter_obj:
|
||||
query_params["filter"] = filter_obj
|
||||
if sorts:
|
||||
query_params["sorts"] = sorts
|
||||
|
||||
response = await self._rate_limited_request(
|
||||
self.client.databases.query(**query_params)
|
||||
)
|
||||
|
||||
all_pages.extend(response["results"])
|
||||
has_more = response.get("has_more", False)
|
||||
start_cursor = response.get("next_cursor")
|
||||
self.stats["fetched"] += len(response["results"])
|
||||
|
||||
logger.info(f"Fetched {len(all_pages)} pages so far...")
|
||||
|
||||
return all_pages
|
||||
|
||||
async def update_page(self, page_id: str, properties: dict) -> dict | None:
|
||||
"""Update a single page's properties."""
|
||||
if self.dry_run:
|
||||
logger.info(f"[DRY-RUN] Would update page {page_id}: {properties}")
|
||||
return None
|
||||
|
||||
try:
|
||||
result = await self._rate_limited_request(
|
||||
self.client.pages.update(page_id=page_id, properties=properties)
|
||||
)
|
||||
self.stats["updated"] += 1
|
||||
return result
|
||||
except Exception as e:
|
||||
self.stats["errors"] += 1
|
||||
logger.error(f"Failed to update page {page_id}: {e}")
|
||||
raise
|
||||
|
||||
async def batch_update_pages(
|
||||
self, updates: list[dict], desc: str = "Updating pages"
|
||||
) -> list[dict]:
|
||||
"""Update multiple pages concurrently with progress bar."""
|
||||
results = []
|
||||
|
||||
async def update_single(update: dict) -> dict:
|
||||
try:
|
||||
result = await self.update_page(
|
||||
update["page_id"], update["properties"]
|
||||
)
|
||||
return {"page_id": update["page_id"], "success": True, "result": result}
|
||||
except Exception as e:
|
||||
return {"page_id": update["page_id"], "success": False, "error": str(e)}
|
||||
|
||||
tasks = [update_single(u) for u in updates]
|
||||
|
||||
for coro in tqdm.as_completed(tasks, total=len(tasks), desc=desc):
|
||||
result = await coro
|
||||
results.append(result)
|
||||
|
||||
success_count = sum(1 for r in results if r["success"])
|
||||
logger.info(f"Batch update complete: {success_count}/{len(updates)} succeeded")
|
||||
|
||||
return results
|
||||
|
||||
async def create_page(
|
||||
self, parent: dict, properties: dict, children: list | None = None
|
||||
) -> dict | None:
|
||||
"""Create a new page."""
|
||||
if self.dry_run:
|
||||
logger.info(f"[DRY-RUN] Would create page: {properties}")
|
||||
return None
|
||||
|
||||
try:
|
||||
create_params = {"parent": parent, "properties": properties}
|
||||
if children:
|
||||
create_params["children"] = children
|
||||
|
||||
result = await self._rate_limited_request(
|
||||
self.client.pages.create(**create_params)
|
||||
)
|
||||
self.stats["created"] += 1
|
||||
return result
|
||||
except Exception as e:
|
||||
self.stats["errors"] += 1
|
||||
logger.error(f"Failed to create page: {e}")
|
||||
raise
|
||||
|
||||
async def search(
|
||||
self, query: str, filter_type: str | None = None
|
||||
) -> list[dict]:
|
||||
"""Search Notion workspace."""
|
||||
all_results = []
|
||||
has_more = True
|
||||
start_cursor = None
|
||||
|
||||
while has_more:
|
||||
search_params = {"query": query, "page_size": 100}
|
||||
if start_cursor:
|
||||
search_params["start_cursor"] = start_cursor
|
||||
if filter_type:
|
||||
search_params["filter"] = {"property": "object", "value": filter_type}
|
||||
|
||||
response = await self._rate_limited_request(
|
||||
self.client.search(**search_params)
|
||||
)
|
||||
|
||||
all_results.extend(response["results"])
|
||||
has_more = response.get("has_more", False)
|
||||
start_cursor = response.get("next_cursor")
|
||||
|
||||
return all_results
|
||||
|
||||
def print_stats(self):
|
||||
"""Print operation statistics."""
|
||||
logger.info("=" * 50)
|
||||
logger.info("Operation Statistics:")
|
||||
logger.info(f" Fetched: {self.stats['fetched']}")
|
||||
logger.info(f" Updated: {self.stats['updated']}")
|
||||
logger.info(f" Created: {self.stats['created']}")
|
||||
logger.info(f" Errors: {self.stats['errors']}")
|
||||
logger.info("=" * 50)
|
||||
|
||||
async def close(self):
|
||||
"""Close the client connection."""
|
||||
await self.client.aclose()
|
||||
|
||||
|
||||
# ============================================================
|
||||
# Example Operations - Customize these for your specific task
|
||||
# ============================================================
|
||||
|
||||
|
||||
async def example_audit_database(organizer: NotionAsyncOrganizer, database_id: str):
|
||||
"""Example: Audit a database and report on its structure."""
|
||||
schema = await organizer.fetch_database_schema(database_id)
|
||||
|
||||
print("\n" + "=" * 60)
|
||||
print(f"Database: {schema.get('title', [{}])[0].get('plain_text', 'Untitled')}")
|
||||
print("=" * 60)
|
||||
|
||||
properties = schema.get("properties", {})
|
||||
print(f"\nTotal Properties: {len(properties)}\n")
|
||||
|
||||
for name, prop in properties.items():
|
||||
prop_type = prop.get("type", "unknown")
|
||||
print(f" - {name}: {prop_type}")
|
||||
|
||||
# Show select/multi_select options
|
||||
if prop_type in ("select", "multi_select"):
|
||||
options = prop.get(prop_type, {}).get("options", [])
|
||||
if options:
|
||||
option_names = [o["name"] for o in options[:5]]
|
||||
suffix = f" (+{len(options) - 5} more)" if len(options) > 5 else ""
|
||||
print(f" Options: {', '.join(option_names)}{suffix}")
|
||||
|
||||
return schema
|
||||
|
||||
|
||||
async def example_bulk_status_update(
|
||||
organizer: NotionAsyncOrganizer,
|
||||
database_id: str,
|
||||
old_status: str,
|
||||
new_status: str,
|
||||
):
|
||||
"""Example: Update status for all pages matching a filter."""
|
||||
# Fetch pages with old status
|
||||
filter_obj = {"property": "Status", "select": {"equals": old_status}}
|
||||
pages = await organizer.fetch_all_pages(database_id, filter_obj=filter_obj)
|
||||
|
||||
print(f"\nFound {len(pages)} pages with status '{old_status}'")
|
||||
|
||||
if not pages:
|
||||
return
|
||||
|
||||
# Prepare updates
|
||||
updates = [
|
||||
{
|
||||
"page_id": page["id"],
|
||||
"properties": {"Status": {"select": {"name": new_status}}},
|
||||
}
|
||||
for page in pages
|
||||
]
|
||||
|
||||
# Execute batch update
|
||||
results = await organizer.batch_update_pages(
|
||||
updates, desc=f"Updating status to '{new_status}'"
|
||||
)
|
||||
|
||||
return results
|
||||
|
||||
|
||||
async def main():
|
||||
"""Main entry point."""
|
||||
parser = argparse.ArgumentParser(description="Notion Async Organizer")
|
||||
parser.add_argument("--database-id", "-d", required=True, help="Database ID")
|
||||
parser.add_argument(
|
||||
"--dry-run", action="store_true", help="Preview changes without executing"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--operation",
|
||||
"-o",
|
||||
choices=["audit", "status-update"],
|
||||
default="audit",
|
||||
help="Operation to perform",
|
||||
)
|
||||
parser.add_argument("--old-status", help="Old status value (for status-update)")
|
||||
parser.add_argument("--new-status", help="New status value (for status-update)")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if not NOTION_API_KEY:
|
||||
logger.error("NOTION_TOKEN or NOTION_API_KEY environment variable not set")
|
||||
return
|
||||
|
||||
organizer = NotionAsyncOrganizer(NOTION_API_KEY, dry_run=args.dry_run)
|
||||
|
||||
try:
|
||||
if args.operation == "audit":
|
||||
await example_audit_database(organizer, args.database_id)
|
||||
|
||||
elif args.operation == "status-update":
|
||||
if not args.old_status or not args.new_status:
|
||||
logger.error("--old-status and --new-status required for status-update")
|
||||
return
|
||||
await example_bulk_status_update(
|
||||
organizer, args.database_id, args.old_status, args.new_status
|
||||
)
|
||||
|
||||
organizer.print_stats()
|
||||
|
||||
finally:
|
||||
await organizer.close()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(main())
|
||||
@@ -0,0 +1,26 @@
|
||||
# Notion Organizer Scripts - Requirements
|
||||
# Python 3.10+ required
|
||||
|
||||
# Notion API client
|
||||
notion-client==2.2.1
|
||||
|
||||
# Async HTTP
|
||||
aiohttp==3.9.1
|
||||
|
||||
# Rate limiting
|
||||
asyncio-throttle==1.0.2
|
||||
|
||||
# Environment variables
|
||||
python-dotenv==1.0.0
|
||||
|
||||
# Retry logic
|
||||
tenacity==8.2.3
|
||||
|
||||
# Progress bars
|
||||
tqdm==4.66.1
|
||||
|
||||
# Optional: Data analysis
|
||||
# pandas==2.1.4
|
||||
|
||||
# Optional: Fuzzy matching for duplicates
|
||||
# rapidfuzz==3.5.2
|
||||
@@ -0,0 +1,367 @@
|
||||
"""
|
||||
Notion Schema Migrator
|
||||
======================
|
||||
Purpose: Migrate data between Notion databases with schema mapping
|
||||
Python: 3.10+
|
||||
Packages: notion-client, tenacity, tqdm, python-dotenv
|
||||
|
||||
Usage:
|
||||
python schema_migrator.py \
|
||||
--source-db <source_database_id> \
|
||||
--target-db <target_database_id> \
|
||||
--mapping mapping.json \
|
||||
[--dry-run]
|
||||
"""
|
||||
|
||||
import asyncio
|
||||
import argparse
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
from asyncio import Semaphore
|
||||
from datetime import datetime
|
||||
from typing import Any
|
||||
|
||||
from dotenv import load_dotenv
|
||||
from notion_client import AsyncClient
|
||||
from tenacity import retry, stop_after_attempt, wait_exponential
|
||||
from tqdm.asyncio import tqdm
|
||||
|
||||
load_dotenv()
|
||||
|
||||
NOTION_API_KEY = os.getenv("NOTION_TOKEN") or os.getenv("NOTION_API_KEY")
|
||||
MAX_CONCURRENT_REQUESTS = 3
|
||||
REQUEST_DELAY = 0.35
|
||||
|
||||
logging.basicConfig(
|
||||
level=logging.INFO,
|
||||
format="%(asctime)s - %(levelname)s - %(message)s",
|
||||
)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class SchemaMigrator:
|
||||
"""Migrate data between Notion databases with property mapping."""
|
||||
|
||||
def __init__(self, api_key: str, dry_run: bool = False):
|
||||
self.client = AsyncClient(auth=api_key)
|
||||
self.semaphore = Semaphore(MAX_CONCURRENT_REQUESTS)
|
||||
self.dry_run = dry_run
|
||||
self.stats = {
|
||||
"pages_fetched": 0,
|
||||
"pages_migrated": 0,
|
||||
"pages_skipped": 0,
|
||||
"errors": 0,
|
||||
}
|
||||
|
||||
@retry(
|
||||
stop=stop_after_attempt(3),
|
||||
wait=wait_exponential(multiplier=1, min=2, max=10),
|
||||
)
|
||||
async def _request(self, coro):
|
||||
async with self.semaphore:
|
||||
await asyncio.sleep(REQUEST_DELAY)
|
||||
return await coro
|
||||
|
||||
async def get_schema(self, database_id: str) -> dict:
|
||||
"""Get database schema."""
|
||||
return await self._request(
|
||||
self.client.databases.retrieve(database_id=database_id)
|
||||
)
|
||||
|
||||
async def fetch_all_pages(self, database_id: str) -> list[dict]:
|
||||
"""Fetch all pages from source database."""
|
||||
pages = []
|
||||
has_more = True
|
||||
cursor = None
|
||||
|
||||
while has_more:
|
||||
params = {"database_id": database_id, "page_size": 100}
|
||||
if cursor:
|
||||
params["start_cursor"] = cursor
|
||||
|
||||
response = await self._request(self.client.databases.query(**params))
|
||||
pages.extend(response["results"])
|
||||
has_more = response.get("has_more", False)
|
||||
cursor = response.get("next_cursor")
|
||||
self.stats["pages_fetched"] = len(pages)
|
||||
logger.info(f"Fetched {len(pages)} pages...")
|
||||
|
||||
return pages
|
||||
|
||||
def transform_property(
|
||||
self,
|
||||
value: dict,
|
||||
source_type: str,
|
||||
target_type: str,
|
||||
value_mapping: dict | None = None,
|
||||
) -> dict | None:
|
||||
"""Transform a property value from source to target type."""
|
||||
|
||||
# Extract raw value based on source type
|
||||
raw_value = None
|
||||
|
||||
if source_type == "title":
|
||||
raw_value = "".join(
|
||||
t.get("plain_text", "") for t in value.get("title", [])
|
||||
)
|
||||
elif source_type == "rich_text":
|
||||
raw_value = "".join(
|
||||
t.get("plain_text", "") for t in value.get("rich_text", [])
|
||||
)
|
||||
elif source_type == "number":
|
||||
raw_value = value.get("number")
|
||||
elif source_type == "select":
|
||||
select_val = value.get("select")
|
||||
raw_value = select_val.get("name") if select_val else None
|
||||
elif source_type == "multi_select":
|
||||
raw_value = [o.get("name") for o in value.get("multi_select", [])]
|
||||
elif source_type == "status":
|
||||
status_val = value.get("status")
|
||||
raw_value = status_val.get("name") if status_val else None
|
||||
elif source_type == "date":
|
||||
raw_value = value.get("date")
|
||||
elif source_type == "checkbox":
|
||||
raw_value = value.get("checkbox")
|
||||
elif source_type == "url":
|
||||
raw_value = value.get("url")
|
||||
elif source_type == "email":
|
||||
raw_value = value.get("email")
|
||||
elif source_type == "phone_number":
|
||||
raw_value = value.get("phone_number")
|
||||
|
||||
if raw_value is None:
|
||||
return None
|
||||
|
||||
# Apply value mapping if provided
|
||||
if value_mapping and isinstance(raw_value, str):
|
||||
raw_value = value_mapping.get(raw_value, raw_value)
|
||||
elif value_mapping and isinstance(raw_value, list):
|
||||
raw_value = [value_mapping.get(v, v) for v in raw_value]
|
||||
|
||||
# Convert to target type
|
||||
if target_type == "title":
|
||||
return {"title": [{"text": {"content": str(raw_value)}}]}
|
||||
elif target_type == "rich_text":
|
||||
return {"rich_text": [{"text": {"content": str(raw_value)}}]}
|
||||
elif target_type == "number":
|
||||
try:
|
||||
return {"number": float(raw_value) if raw_value else None}
|
||||
except (ValueError, TypeError):
|
||||
return None
|
||||
elif target_type == "select":
|
||||
return {"select": {"name": str(raw_value)}} if raw_value else None
|
||||
elif target_type == "multi_select":
|
||||
if isinstance(raw_value, list):
|
||||
return {"multi_select": [{"name": v} for v in raw_value]}
|
||||
return {"multi_select": [{"name": str(raw_value)}]}
|
||||
elif target_type == "status":
|
||||
return {"status": {"name": str(raw_value)}} if raw_value else None
|
||||
elif target_type == "date":
|
||||
return {"date": raw_value} if raw_value else None
|
||||
elif target_type == "checkbox":
|
||||
return {"checkbox": bool(raw_value)}
|
||||
elif target_type == "url":
|
||||
return {"url": str(raw_value)} if raw_value else None
|
||||
elif target_type == "email":
|
||||
return {"email": str(raw_value)} if raw_value else None
|
||||
elif target_type == "phone_number":
|
||||
return {"phone_number": str(raw_value)} if raw_value else None
|
||||
|
||||
return None
|
||||
|
||||
def map_page_properties(
|
||||
self,
|
||||
source_page: dict,
|
||||
mapping: dict,
|
||||
source_schema: dict,
|
||||
target_schema: dict,
|
||||
) -> dict:
|
||||
"""Map source page properties to target schema."""
|
||||
source_props = source_page.get("properties", {})
|
||||
target_props = {}
|
||||
|
||||
for source_name, mapping_config in mapping.items():
|
||||
if source_name not in source_props:
|
||||
continue
|
||||
|
||||
target_name = mapping_config.get("target", source_name)
|
||||
value_mapping = mapping_config.get("value_mapping")
|
||||
|
||||
source_type = source_schema["properties"].get(source_name, {}).get("type")
|
||||
target_type = target_schema["properties"].get(target_name, {}).get("type")
|
||||
|
||||
if not source_type or not target_type:
|
||||
logger.warning(
|
||||
f"Skipping {source_name}: source_type={source_type}, target_type={target_type}"
|
||||
)
|
||||
continue
|
||||
|
||||
transformed = self.transform_property(
|
||||
source_props[source_name],
|
||||
source_type,
|
||||
target_type,
|
||||
value_mapping,
|
||||
)
|
||||
|
||||
if transformed:
|
||||
target_props[target_name] = transformed
|
||||
|
||||
return target_props
|
||||
|
||||
async def migrate_page(
|
||||
self,
|
||||
page: dict,
|
||||
target_database_id: str,
|
||||
mapping: dict,
|
||||
source_schema: dict,
|
||||
target_schema: dict,
|
||||
) -> dict:
|
||||
"""Migrate a single page to target database."""
|
||||
page_id = page["id"]
|
||||
|
||||
try:
|
||||
properties = self.map_page_properties(
|
||||
page, mapping, source_schema, target_schema
|
||||
)
|
||||
|
||||
if not properties:
|
||||
self.stats["pages_skipped"] += 1
|
||||
return {"page_id": page_id, "success": False, "reason": "no_properties"}
|
||||
|
||||
if self.dry_run:
|
||||
logger.debug(f"[DRY-RUN] Would create: {properties}")
|
||||
return {"page_id": page_id, "success": True, "dry_run": True}
|
||||
|
||||
result = await self._request(
|
||||
self.client.pages.create(
|
||||
parent={"database_id": target_database_id},
|
||||
properties=properties,
|
||||
)
|
||||
)
|
||||
self.stats["pages_migrated"] += 1
|
||||
return {"page_id": page_id, "success": True, "new_page_id": result["id"]}
|
||||
|
||||
except Exception as e:
|
||||
self.stats["errors"] += 1
|
||||
logger.error(f"Failed to migrate page {page_id}: {e}")
|
||||
return {"page_id": page_id, "success": False, "error": str(e)}
|
||||
|
||||
async def migrate(
|
||||
self,
|
||||
source_db: str,
|
||||
target_db: str,
|
||||
mapping: dict,
|
||||
) -> list[dict]:
|
||||
"""Execute full migration."""
|
||||
logger.info("Fetching schemas...")
|
||||
source_schema = await self.get_schema(source_db)
|
||||
target_schema = await self.get_schema(target_db)
|
||||
|
||||
logger.info(f"Source: {len(source_schema['properties'])} properties")
|
||||
logger.info(f"Target: {len(target_schema['properties'])} properties")
|
||||
|
||||
logger.info("Fetching source pages...")
|
||||
pages = await self.fetch_all_pages(source_db)
|
||||
logger.info(f"Found {len(pages)} pages to migrate")
|
||||
|
||||
results = []
|
||||
for page in tqdm(pages, desc="Migrating"):
|
||||
result = await self.migrate_page(
|
||||
page, target_db, mapping, source_schema, target_schema
|
||||
)
|
||||
results.append(result)
|
||||
|
||||
return results
|
||||
|
||||
def print_stats(self):
|
||||
logger.info("=" * 50)
|
||||
logger.info("Migration Statistics:")
|
||||
logger.info(f" Pages Fetched: {self.stats['pages_fetched']}")
|
||||
logger.info(f" Pages Migrated: {self.stats['pages_migrated']}")
|
||||
logger.info(f" Pages Skipped: {self.stats['pages_skipped']}")
|
||||
logger.info(f" Errors: {self.stats['errors']}")
|
||||
logger.info("=" * 50)
|
||||
|
||||
async def close(self):
|
||||
await self.client.aclose()
|
||||
|
||||
|
||||
def generate_mapping_template(source_schema: dict, target_schema: dict) -> dict:
|
||||
"""Generate a mapping template for user to customize."""
|
||||
mapping = {}
|
||||
|
||||
for prop_name, prop_config in source_schema.get("properties", {}).items():
|
||||
source_type = prop_config.get("type")
|
||||
|
||||
# Try to find matching property in target
|
||||
target_match = None
|
||||
for t_name, t_config in target_schema.get("properties", {}).items():
|
||||
if t_name.lower() == prop_name.lower():
|
||||
target_match = t_name
|
||||
break
|
||||
|
||||
mapping[prop_name] = {
|
||||
"target": target_match or prop_name,
|
||||
"source_type": source_type,
|
||||
"value_mapping": None, # User can add {"old_value": "new_value"}
|
||||
}
|
||||
|
||||
return mapping
|
||||
|
||||
|
||||
async def main():
|
||||
parser = argparse.ArgumentParser(description="Notion Schema Migrator")
|
||||
parser.add_argument("--source-db", "-s", required=True, help="Source database ID")
|
||||
parser.add_argument("--target-db", "-t", required=True, help="Target database ID")
|
||||
parser.add_argument("--mapping", "-m", help="JSON mapping file path")
|
||||
parser.add_argument(
|
||||
"--generate-mapping",
|
||||
action="store_true",
|
||||
help="Generate mapping template",
|
||||
)
|
||||
parser.add_argument("--dry-run", action="store_true", help="Preview without executing")
|
||||
parser.add_argument("--output", "-o", help="Output file for generated mapping")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if not NOTION_API_KEY:
|
||||
logger.error("NOTION_TOKEN or NOTION_API_KEY not set")
|
||||
return
|
||||
|
||||
migrator = SchemaMigrator(NOTION_API_KEY, dry_run=args.dry_run)
|
||||
|
||||
try:
|
||||
if args.generate_mapping:
|
||||
source_schema = await migrator.get_schema(args.source_db)
|
||||
target_schema = await migrator.get_schema(args.target_db)
|
||||
mapping = generate_mapping_template(source_schema, target_schema)
|
||||
|
||||
output_file = args.output or "mapping_template.json"
|
||||
with open(output_file, "w") as f:
|
||||
json.dump(mapping, f, indent=2)
|
||||
logger.info(f"Mapping template saved to {output_file}")
|
||||
return
|
||||
|
||||
if not args.mapping:
|
||||
logger.error("--mapping required for migration (or use --generate-mapping)")
|
||||
return
|
||||
|
||||
with open(args.mapping) as f:
|
||||
mapping = json.load(f)
|
||||
|
||||
results = await migrator.migrate(args.source_db, args.target_db, mapping)
|
||||
migrator.print_stats()
|
||||
|
||||
# Save results
|
||||
output_file = f"migration_results_{datetime.now():%Y%m%d_%H%M%S}.json"
|
||||
with open(output_file, "w") as f:
|
||||
json.dump(results, f, indent=2)
|
||||
logger.info(f"Results saved to {output_file}")
|
||||
|
||||
finally:
|
||||
await migrator.close()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(main())
|
||||
@@ -0,0 +1,56 @@
|
||||
{
|
||||
"_comment": "Property Mapping Template - Customize for your migration",
|
||||
"_instructions": {
|
||||
"target": "Name of property in target database",
|
||||
"source_type": "Auto-detected, for reference only",
|
||||
"value_mapping": "Optional: Map old values to new values"
|
||||
},
|
||||
"Name": {
|
||||
"target": "Project Name",
|
||||
"source_type": "title",
|
||||
"value_mapping": null
|
||||
},
|
||||
"Status": {
|
||||
"target": "Stage",
|
||||
"source_type": "select",
|
||||
"value_mapping": {
|
||||
"Not Started": "Backlog",
|
||||
"In Progress": "Active",
|
||||
"Done": "Completed",
|
||||
"On Hold": "Paused"
|
||||
}
|
||||
},
|
||||
"Priority": {
|
||||
"target": "Priority",
|
||||
"source_type": "select",
|
||||
"value_mapping": {
|
||||
"P1": "High",
|
||||
"P2": "Medium",
|
||||
"P3": "Low"
|
||||
}
|
||||
},
|
||||
"Due Date": {
|
||||
"target": "Deadline",
|
||||
"source_type": "date",
|
||||
"value_mapping": null
|
||||
},
|
||||
"Tags": {
|
||||
"target": "Categories",
|
||||
"source_type": "multi_select",
|
||||
"value_mapping": {
|
||||
"marketing": "Marketing",
|
||||
"dev": "Development",
|
||||
"design": "Design"
|
||||
}
|
||||
},
|
||||
"Description": {
|
||||
"target": "Notes",
|
||||
"source_type": "rich_text",
|
||||
"value_mapping": null
|
||||
},
|
||||
"Completed": {
|
||||
"target": "Is Done",
|
||||
"source_type": "checkbox",
|
||||
"value_mapping": null
|
||||
}
|
||||
}
|
||||
176
ourdigital-custom-skills/03-research-to-presentation/SKILL.md
Normal file
176
ourdigital-custom-skills/03-research-to-presentation/SKILL.md
Normal file
@@ -0,0 +1,176 @@
|
||||
---
|
||||
name: research-to-presentation
|
||||
version: 1.0.0
|
||||
description: Transforms Notion research content into branded presentations through an automated workflow. Collects research from Notion pages/databases, synthesizes content to extract key topics and agenda items, creates presentation structure with slide plans, and generates branded PPT/Figma presentations. Use when converting research into meeting materials, creating data-driven presentations from Notion content, transforming documentation into executive presentations, or building slide decks from scattered research notes.
|
||||
---
|
||||
|
||||
# Research to Presentation Workflow
|
||||
|
||||
Automated pipeline for transforming Notion research into professional presentations with brand consistency.
|
||||
|
||||
## Quick Start
|
||||
|
||||
```bash
|
||||
# Full automated workflow
|
||||
python scripts/run_workflow.py --notion-url [URL] --output-format [pptx|figma]
|
||||
|
||||
# Step-by-step execution
|
||||
python scripts/extract_notion.py [URL] > research.json
|
||||
python scripts/synthesize_content.py research.json > synthesis.json
|
||||
node scripts/generate_presentation.js synthesis.json output.pptx
|
||||
```
|
||||
|
||||
## Workflow Steps
|
||||
|
||||
### Step 1: Research Collection
|
||||
|
||||
Extract research from Notion:
|
||||
```python
|
||||
# Use Notion tools to gather content
|
||||
results = notion_search(query="research topic")
|
||||
content = notion_fetch(page_ids)
|
||||
extracted_data = extract_key_findings(content)
|
||||
```
|
||||
|
||||
For detailed extraction patterns: [references/research_patterns.md](references/research_patterns.md)
|
||||
|
||||
### Step 2: Content Synthesis
|
||||
|
||||
Analyze and structure content:
|
||||
```python
|
||||
synthesis = synthesize_content(extracted_data)
|
||||
# Returns: executive_summary, key_topics, agenda_items, supporting_data
|
||||
```
|
||||
|
||||
Topic prioritization guide: [references/agenda_templates.md](references/agenda_templates.md)
|
||||
|
||||
### Step 3: Presentation Planning
|
||||
|
||||
Create slide-by-slide structure:
|
||||
```javascript
|
||||
const slidePlan = generateSlidePlan(synthesis);
|
||||
// Outputs: title, agenda, content slides with speaker notes
|
||||
```
|
||||
|
||||
Layout options: [references/slide_layouts.md](references/slide_layouts.md)
|
||||
|
||||
### Step 4: Slide Generation
|
||||
|
||||
Convert to presentation format:
|
||||
|
||||
**PowerPoint Output:**
|
||||
```javascript
|
||||
node scripts/generate_pptx.js synthesis.json output.pptx
|
||||
```
|
||||
|
||||
**Figma Output:**
|
||||
```javascript
|
||||
node scripts/export_to_figma.js synthesis.json --api-key [KEY]
|
||||
```
|
||||
|
||||
### Step 5: Brand Application
|
||||
|
||||
Apply corporate styling:
|
||||
```python
|
||||
python scripts/apply_brand.py output.pptx --config assets/brand_config.json
|
||||
```
|
||||
|
||||
## Input Sources
|
||||
|
||||
**Notion Pages**: Individual research pages with `notion://page/[ID]`
|
||||
**Notion Databases**: Research collections with `notion://database/[ID]`
|
||||
**Multiple Sources**: Comma-separated URLs for comprehensive synthesis
|
||||
|
||||
## Output Formats
|
||||
|
||||
**PowerPoint (.pptx)**: Full presentation with animations and transitions
|
||||
**Figma Slides**: Web-based collaborative presentation format
|
||||
**HTML Preview**: Quick preview with `--preview` flag
|
||||
|
||||
## Presentation Types
|
||||
|
||||
### Executive Summary
|
||||
- High-level findings (3-5 slides)
|
||||
- Key metrics and KPIs
|
||||
- Strategic recommendations
|
||||
- See [references/executive_template.md](references/executive_template.md)
|
||||
|
||||
### Research Report
|
||||
- Comprehensive findings (10-20 slides)
|
||||
- Detailed methodology
|
||||
- Data visualizations
|
||||
- See [references/research_template.md](references/research_template.md)
|
||||
|
||||
### Meeting Prep
|
||||
- Agenda-driven structure (5-10 slides)
|
||||
- Discussion topics
|
||||
- Decision points
|
||||
- See [references/meeting_template.md](references/meeting_template.md)
|
||||
|
||||
## Customization
|
||||
|
||||
### Brand Configuration
|
||||
Edit `assets/brand_config.json`:
|
||||
```json
|
||||
{
|
||||
"colors": {
|
||||
"primary": "#1a73e8",
|
||||
"secondary": "#34a853"
|
||||
},
|
||||
"fonts": {
|
||||
"heading": "Poppins",
|
||||
"body": "Lora"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Slide Templates
|
||||
Modify HTML templates in `assets/templates/`:
|
||||
- `title.html` - Title slide layout
|
||||
- `content.html` - Content slide layout
|
||||
- `data.html` - Data visualization slide
|
||||
|
||||
### Processing Rules
|
||||
Adjust synthesis patterns in `scripts/config.py`:
|
||||
- Topic extraction thresholds
|
||||
- Agenda prioritization weights
|
||||
- Content chunking sizes
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Start broad**: Cast wide net in Notion search, then filter
|
||||
2. **Validate sources**: Check last-edited dates for currency
|
||||
3. **Chunk large content**: Process in batches for token efficiency
|
||||
4. **Preview first**: Use `--preview` to check before final generation
|
||||
5. **Version control**: Keep synthesis.json for iteration
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
**"No content found"**: Verify Notion permissions and page URLs
|
||||
**"Synthesis failed"**: Check research.json structure and content
|
||||
**"Brand not applied"**: Ensure brand_config.json is valid
|
||||
**"Figma export error"**: Validate API key and network access
|
||||
|
||||
## Advanced Usage
|
||||
|
||||
### Batch Processing
|
||||
```bash
|
||||
# Process multiple research sets
|
||||
for url in $(cat notion_urls.txt); do
|
||||
python scripts/run_workflow.py --notion-url "$url" --output "output_$(date +%s).pptx"
|
||||
done
|
||||
```
|
||||
|
||||
### Custom Workflows
|
||||
See [references/custom_pipelines.md](references/custom_pipelines.md) for:
|
||||
- Conditional slide generation
|
||||
- Dynamic template selection
|
||||
- Multi-language support
|
||||
- Automated scheduling
|
||||
|
||||
## Dependencies
|
||||
|
||||
- Python 3.8+ with pandas, pydantic
|
||||
- Node.js 16+ with pptxgenjs, @ant/html2pptx
|
||||
- Notion API access via MCP
|
||||
- Optional: Figma API key for web export
|
||||
@@ -0,0 +1,108 @@
|
||||
{
|
||||
"name": "Corporate Brand Guidelines",
|
||||
"version": "1.0",
|
||||
"colors": {
|
||||
"primary": "#1a73e8",
|
||||
"secondary": "#34a853",
|
||||
"accent": "#ea4335",
|
||||
"warning": "#fbbc04",
|
||||
"dark": "#202124",
|
||||
"light": "#f8f9fa",
|
||||
"text": "#3c4043",
|
||||
"subtext": "#5f6368",
|
||||
"background": "#ffffff",
|
||||
"surface": "#f1f3f4"
|
||||
},
|
||||
"fonts": {
|
||||
"heading": "Poppins",
|
||||
"subheading": "Poppins",
|
||||
"body": "Lora",
|
||||
"caption": "Arial",
|
||||
"fallback": {
|
||||
"heading": "Arial",
|
||||
"body": "Georgia"
|
||||
}
|
||||
},
|
||||
"typography": {
|
||||
"title": {
|
||||
"size": 44,
|
||||
"weight": "bold",
|
||||
"lineHeight": 1.2
|
||||
},
|
||||
"heading1": {
|
||||
"size": 32,
|
||||
"weight": "bold",
|
||||
"lineHeight": 1.3
|
||||
},
|
||||
"heading2": {
|
||||
"size": 24,
|
||||
"weight": "semibold",
|
||||
"lineHeight": 1.4
|
||||
},
|
||||
"body": {
|
||||
"size": 18,
|
||||
"weight": "normal",
|
||||
"lineHeight": 1.6
|
||||
},
|
||||
"caption": {
|
||||
"size": 14,
|
||||
"weight": "normal",
|
||||
"lineHeight": 1.5
|
||||
}
|
||||
},
|
||||
"logos": {
|
||||
"primary": "assets/media/logo.png",
|
||||
"secondary": "assets/media/logo_white.png",
|
||||
"icon": "assets/media/icon.png"
|
||||
},
|
||||
"spacing": {
|
||||
"small": 8,
|
||||
"medium": 16,
|
||||
"large": 24,
|
||||
"xlarge": 32
|
||||
},
|
||||
"borderRadius": {
|
||||
"small": 4,
|
||||
"medium": 8,
|
||||
"large": 12
|
||||
},
|
||||
"shadows": {
|
||||
"small": "0 1px 3px rgba(0,0,0,0.12)",
|
||||
"medium": "0 4px 6px rgba(0,0,0,0.16)",
|
||||
"large": "0 10px 20px rgba(0,0,0,0.19)"
|
||||
},
|
||||
"animations": {
|
||||
"transition": "all 0.3s ease",
|
||||
"fadeIn": "fadeIn 0.5s ease-in",
|
||||
"slideIn": "slideIn 0.3s ease-out"
|
||||
},
|
||||
"layouts": {
|
||||
"slideMargins": {
|
||||
"top": 0.5,
|
||||
"right": 0.5,
|
||||
"bottom": 0.5,
|
||||
"left": 0.5
|
||||
},
|
||||
"contentPadding": {
|
||||
"top": 1.5,
|
||||
"right": 1,
|
||||
"bottom": 1,
|
||||
"left": 1
|
||||
}
|
||||
},
|
||||
"chartColors": [
|
||||
"#1a73e8",
|
||||
"#34a853",
|
||||
"#fbbc04",
|
||||
"#ea4335",
|
||||
"#9333ea",
|
||||
"#06b6d4",
|
||||
"#f97316",
|
||||
"#84cc16"
|
||||
],
|
||||
"gradients": {
|
||||
"primary": "linear-gradient(135deg, #1a73e8 0%, #34a853 100%)",
|
||||
"secondary": "linear-gradient(135deg, #34a853 0%, #fbbc04 100%)",
|
||||
"accent": "linear-gradient(135deg, #ea4335 0%, #fbbc04 100%)"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,269 @@
|
||||
# Agenda Templates Guide
|
||||
|
||||
## Overview
|
||||
Templates for deriving meeting agendas from research content.
|
||||
|
||||
## Agenda Derivation Process
|
||||
|
||||
### Step 1: Topic Identification
|
||||
Extract potential agenda items from research:
|
||||
1. Main section headers → Primary topics
|
||||
2. Key findings → Discussion points
|
||||
3. Data insights → Review items
|
||||
4. Recommendations → Decision points
|
||||
5. Open questions → Discussion topics
|
||||
|
||||
### Step 2: Priority Assignment
|
||||
Score each topic by:
|
||||
- **Urgency**: Time-sensitive? (0-5)
|
||||
- **Impact**: Business impact? (0-5)
|
||||
- **Complexity**: Discussion needed? (0-5)
|
||||
- **Dependencies**: Blocks other work? (0-5)
|
||||
|
||||
### Step 3: Time Allocation
|
||||
Estimate discussion time:
|
||||
- **Simple update**: 3-5 minutes
|
||||
- **Data review**: 5-10 minutes
|
||||
- **Discussion topic**: 10-15 minutes
|
||||
- **Decision point**: 15-20 minutes
|
||||
- **Strategic planning**: 20-30 minutes
|
||||
|
||||
## Meeting Type Templates
|
||||
|
||||
### Executive Review Meeting
|
||||
```
|
||||
1. Executive Summary (5 min)
|
||||
- Key achievements
|
||||
- Critical metrics
|
||||
|
||||
2. Performance Review (10 min)
|
||||
- KPI dashboard
|
||||
- Trend analysis
|
||||
|
||||
3. Strategic Topics (20 min)
|
||||
- Market opportunities
|
||||
- Competitive landscape
|
||||
|
||||
4. Decision Points (15 min)
|
||||
- Resource allocation
|
||||
- Priority changes
|
||||
|
||||
5. Next Steps (5 min)
|
||||
- Action items
|
||||
- Follow-up schedule
|
||||
```
|
||||
|
||||
### Project Status Meeting
|
||||
```
|
||||
1. Project Overview (3 min)
|
||||
- Current phase
|
||||
- Overall timeline
|
||||
|
||||
2. Progress Update (10 min)
|
||||
- Completed milestones
|
||||
- Current activities
|
||||
|
||||
3. Blockers & Risks (15 min)
|
||||
- Issue discussion
|
||||
- Mitigation plans
|
||||
|
||||
4. Resource Needs (10 min)
|
||||
- Team requirements
|
||||
- Budget status
|
||||
|
||||
5. Next Sprint Planning (10 min)
|
||||
- Upcoming milestones
|
||||
- Task assignments
|
||||
```
|
||||
|
||||
### Strategy Planning Session
|
||||
```
|
||||
1. Context Setting (10 min)
|
||||
- Market analysis
|
||||
- Current position
|
||||
|
||||
2. Opportunity Assessment (20 min)
|
||||
- Growth areas
|
||||
- Innovation possibilities
|
||||
|
||||
3. Challenge Analysis (15 min)
|
||||
- Competitive threats
|
||||
- Internal limitations
|
||||
|
||||
4. Strategic Options (20 min)
|
||||
- Scenario planning
|
||||
- Trade-off analysis
|
||||
|
||||
5. Decision Framework (15 min)
|
||||
- Evaluation criteria
|
||||
- Next steps
|
||||
```
|
||||
|
||||
### Customer/Partner Meeting
|
||||
```
|
||||
1. Introductions & Objectives (5 min)
|
||||
- Meeting goals
|
||||
- Agenda overview
|
||||
|
||||
2. Current Status (10 min)
|
||||
- Project update
|
||||
- Recent achievements
|
||||
|
||||
3. Discussion Topics (25 min)
|
||||
- Requirements review
|
||||
- Feedback discussion
|
||||
|
||||
4. Next Steps (10 min)
|
||||
- Action items
|
||||
- Timeline alignment
|
||||
|
||||
5. Q&A (10 min)
|
||||
- Open questions
|
||||
- Clarifications
|
||||
```
|
||||
|
||||
### Team Brainstorming Session
|
||||
```
|
||||
1. Problem Statement (5 min)
|
||||
- Challenge definition
|
||||
- Success criteria
|
||||
|
||||
2. Context Sharing (10 min)
|
||||
- Research findings
|
||||
- Constraints
|
||||
|
||||
3. Idea Generation (25 min)
|
||||
- Open brainstorming
|
||||
- Concept exploration
|
||||
|
||||
4. Idea Prioritization (15 min)
|
||||
- Feasibility assessment
|
||||
- Impact evaluation
|
||||
|
||||
5. Action Planning (10 min)
|
||||
- Next steps
|
||||
- Owner assignment
|
||||
```
|
||||
|
||||
## Agenda Item Formulation
|
||||
|
||||
### From Finding to Agenda Item
|
||||
|
||||
**Research Finding**: "Customer satisfaction decreased 15% in Q4"
|
||||
**Agenda Item**: "Q4 Customer Satisfaction Analysis & Recovery Plan"
|
||||
**Time**: 15 minutes
|
||||
**Discussion Points**:
|
||||
- Root cause analysis
|
||||
- Customer feedback themes
|
||||
- Proposed improvements
|
||||
- Success metrics
|
||||
|
||||
### From Data to Discussion
|
||||
|
||||
**Data Point**: "Conversion rate: 2.3% (industry avg: 3.5%)"
|
||||
**Agenda Item**: "Conversion Optimization Strategy"
|
||||
**Time**: 20 minutes
|
||||
**Discussion Points**:
|
||||
- Benchmark analysis
|
||||
- Bottleneck identification
|
||||
- Improvement initiatives
|
||||
- Resource requirements
|
||||
|
||||
### From Recommendation to Decision
|
||||
|
||||
**Recommendation**: "Expand into European market"
|
||||
**Agenda Item**: "European Market Expansion Decision"
|
||||
**Time**: 25 minutes
|
||||
**Decision Points**:
|
||||
- Market opportunity validation
|
||||
- Investment requirements
|
||||
- Risk assessment
|
||||
- Go/No-go decision
|
||||
|
||||
## Dynamic Agenda Adjustments
|
||||
|
||||
### For Limited Time (30 min meeting)
|
||||
- Focus on critical decisions only
|
||||
- Combine related topics
|
||||
- Move updates to pre-read
|
||||
- Schedule follow-ups for details
|
||||
|
||||
### For Extended Discussion (90+ min)
|
||||
- Add break time (10 min at 45 min mark)
|
||||
- Include deep-dive sections
|
||||
- Add buffer time for Q&A
|
||||
- Include working session time
|
||||
|
||||
### For Mixed Audience
|
||||
- Start with common interests
|
||||
- Segment specialized topics
|
||||
- Plan parallel tracks if needed
|
||||
- End with unified next steps
|
||||
|
||||
## Agenda Optimization Tips
|
||||
|
||||
### Topic Sequencing
|
||||
1. **Energy curve**: High-energy topics after warm-up
|
||||
2. **Decision fatigue**: Critical decisions early
|
||||
3. **Logical flow**: Dependencies first
|
||||
4. **Engagement**: Mix presentation and discussion
|
||||
|
||||
### Time Management
|
||||
- **80% rule**: Plan for 80% of available time
|
||||
- **Buffer zones**: 5-minute buffers between major topics
|
||||
- **Parking lot**: Designate time for unexpected items
|
||||
- **Hard stops**: Clear end times for each section
|
||||
|
||||
### Participation Planning
|
||||
- **Speaker rotation**: Distribute presentation duties
|
||||
- **Discussion leaders**: Assign topic owners
|
||||
- **Note takers**: Rotate responsibility
|
||||
- **Timekeeper**: Designated role
|
||||
|
||||
## Output Formats
|
||||
|
||||
### Detailed Agenda
|
||||
```markdown
|
||||
## Meeting: [Title]
|
||||
**Date**: [Date] | **Time**: [Duration] | **Location**: [Place/Virtual]
|
||||
|
||||
### Attendees
|
||||
- Required: [List]
|
||||
- Optional: [List]
|
||||
|
||||
### Objectives
|
||||
1. [Primary objective]
|
||||
2. [Secondary objective]
|
||||
|
||||
### Agenda
|
||||
|
||||
#### 1. [Topic Name] (10 min) - [Owner]
|
||||
**Objective**: [What to achieve]
|
||||
**Materials**: [Pre-read links]
|
||||
**Discussion Points**:
|
||||
- [Point 1]
|
||||
- [Point 2]
|
||||
**Decision Needed**: [Yes/No - what decision]
|
||||
|
||||
[Continue for each topic...]
|
||||
|
||||
### Pre-Work
|
||||
- [ ] Review [document]
|
||||
- [ ] Prepare [input]
|
||||
|
||||
### Success Metrics
|
||||
- [ ] [Metric 1]
|
||||
- [ ] [Metric 2]
|
||||
```
|
||||
|
||||
### Quick Agenda
|
||||
```markdown
|
||||
## [Meeting Title] - [Date]
|
||||
|
||||
1. [Topic 1] - [Duration] - [Owner]
|
||||
2. [Topic 2] - [Duration] - [Owner]
|
||||
3. [Topic 3] - [Duration] - [Owner]
|
||||
4. Next Steps - 5 min
|
||||
|
||||
Total: [Total Duration]
|
||||
```
|
||||
@@ -0,0 +1,150 @@
|
||||
# Research Patterns Guide
|
||||
|
||||
## Overview
|
||||
Common patterns for extracting and structuring research content from Notion.
|
||||
|
||||
## Content Extraction Patterns
|
||||
|
||||
### Hierarchical Extraction
|
||||
Extract content respecting the document hierarchy:
|
||||
```
|
||||
1. Main Topics (H1 headers)
|
||||
- Key Points (H2 headers)
|
||||
- Supporting Details (H3 headers)
|
||||
- Data points
|
||||
- Examples
|
||||
```
|
||||
|
||||
### Data Point Extraction
|
||||
Identify and extract quantitative information:
|
||||
- **Metrics**: Numbers with units (e.g., "25% growth")
|
||||
- **KPIs**: Key Performance Indicators
|
||||
- **Comparisons**: Year-over-year, benchmarks
|
||||
- **Trends**: Directional indicators
|
||||
|
||||
### Action Item Detection
|
||||
Look for action-oriented language:
|
||||
- Keywords: "recommend", "suggest", "propose", "should"
|
||||
- Imperatives: "implement", "deploy", "analyze"
|
||||
- Future tense: "will", "plan to", "intend to"
|
||||
|
||||
## Synthesis Patterns
|
||||
|
||||
### Theme Clustering
|
||||
Group related content by theme:
|
||||
1. **Technical themes**: Technology, infrastructure, systems
|
||||
2. **Business themes**: Strategy, market, competition
|
||||
3. **Operational themes**: Process, efficiency, workflow
|
||||
4. **Customer themes**: Satisfaction, feedback, needs
|
||||
|
||||
### Priority Scoring
|
||||
Rank content by importance:
|
||||
- **Critical**: Urgent, high-impact, deadline-driven
|
||||
- **Important**: Strategic, long-term value
|
||||
- **Relevant**: Supporting information, context
|
||||
- **Optional**: Nice-to-have, future consideration
|
||||
|
||||
### Evidence Mapping
|
||||
Connect claims to supporting evidence:
|
||||
```
|
||||
Claim → Data Point → Source
|
||||
"Market is growing" → "25% YoY growth" → "Q4 Market Report"
|
||||
```
|
||||
|
||||
## Notion-Specific Patterns
|
||||
|
||||
### Database Queries
|
||||
When extracting from Notion databases:
|
||||
1. Filter by date range for recent content
|
||||
2. Sort by priority or importance fields
|
||||
3. Group by category or project
|
||||
4. Aggregate metrics across entries
|
||||
|
||||
### Page Relationships
|
||||
Follow page links strategically:
|
||||
- **Parent pages**: For context and background
|
||||
- **Child pages**: For detailed information
|
||||
- **Linked pages**: For related topics
|
||||
- **Mentioned pages**: For cross-references
|
||||
|
||||
### Content Types
|
||||
Handle different Notion content types:
|
||||
- **Text blocks**: Extract as-is
|
||||
- **Toggle lists**: Expand and include all content
|
||||
- **Tables**: Convert to structured data
|
||||
- **Embeds**: Note source and type
|
||||
- **Code blocks**: Preserve formatting
|
||||
|
||||
## Quality Checks
|
||||
|
||||
### Completeness
|
||||
Ensure extraction captures:
|
||||
- [ ] All main sections
|
||||
- [ ] Key data points
|
||||
- [ ] Action items
|
||||
- [ ] Recommendations
|
||||
- [ ] Links and references
|
||||
|
||||
### Accuracy
|
||||
Verify extracted content:
|
||||
- [ ] Numbers match source
|
||||
- [ ] Quotes are exact
|
||||
- [ ] Context is preserved
|
||||
- [ ] Relationships are maintained
|
||||
|
||||
### Relevance
|
||||
Filter content by:
|
||||
- [ ] Topic relevance
|
||||
- [ ] Time relevance (recent vs outdated)
|
||||
- [ ] Audience relevance
|
||||
- [ ] Objective relevance
|
||||
|
||||
## Advanced Patterns
|
||||
|
||||
### Sentiment Analysis
|
||||
Identify tone and sentiment:
|
||||
- **Positive indicators**: Success, achievement, growth
|
||||
- **Negative indicators**: Challenge, risk, decline
|
||||
- **Neutral indicators**: Stable, maintained, unchanged
|
||||
|
||||
### Temporal Analysis
|
||||
Track changes over time:
|
||||
- **Historical context**: Past performance
|
||||
- **Current state**: Present situation
|
||||
- **Future projections**: Plans and forecasts
|
||||
|
||||
### Cross-Reference Analysis
|
||||
Connect information across sources:
|
||||
- **Confirmatory**: Multiple sources agree
|
||||
- **Contradictory**: Sources conflict
|
||||
- **Complementary**: Sources add different perspectives
|
||||
|
||||
## Output Formatting
|
||||
|
||||
### Executive Summary Pattern
|
||||
```
|
||||
1. High-level conclusion (1-2 sentences)
|
||||
2. Key findings (3-5 bullets)
|
||||
3. Critical metrics (top 3-5)
|
||||
4. Immediate actions (top 3)
|
||||
```
|
||||
|
||||
### Detailed Report Pattern
|
||||
```
|
||||
1. Background and context
|
||||
2. Methodology
|
||||
3. Findings by category
|
||||
4. Data analysis
|
||||
5. Conclusions
|
||||
6. Recommendations
|
||||
7. Appendices
|
||||
```
|
||||
|
||||
### Quick Brief Pattern
|
||||
```
|
||||
1. What: Core message
|
||||
2. Why: Importance/impact
|
||||
3. How: Key data/evidence
|
||||
4. When: Timeline/urgency
|
||||
5. Who: Stakeholders/owners
|
||||
```
|
||||
@@ -0,0 +1,327 @@
|
||||
# Slide Layouts Guide
|
||||
|
||||
## Overview
|
||||
Layout patterns and best practices for different slide types.
|
||||
|
||||
## Layout Principles
|
||||
|
||||
### Visual Hierarchy
|
||||
1. **Primary**: Title/headline (largest, boldest)
|
||||
2. **Secondary**: Key points (medium, clear)
|
||||
3. **Tertiary**: Supporting details (smaller, lighter)
|
||||
4. **Quaternary**: Metadata (smallest, subtle)
|
||||
|
||||
### Balance & Alignment
|
||||
- **Rule of thirds**: Divide slide into 9 sections
|
||||
- **White space**: 30-40% minimum
|
||||
- **Alignment grid**: Consistent margins and gutters
|
||||
- **Visual weight**: Balance text, images, and data
|
||||
|
||||
## Core Slide Types
|
||||
|
||||
### 1. Title Slide
|
||||
```
|
||||
┌─────────────────────────────────┐
|
||||
│ │
|
||||
│ │
|
||||
│ [Company Logo] │
|
||||
│ │
|
||||
│ PRESENTATION TITLE │
|
||||
│ Subtitle Text │
|
||||
│ │
|
||||
│ Date | Author │
|
||||
│ │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
**Elements**:
|
||||
- Title: 44-48pt, bold, centered
|
||||
- Subtitle: 24-28pt, regular, centered
|
||||
- Metadata: 14-16pt, light, centered
|
||||
- Background: Gradient or image with overlay
|
||||
|
||||
### 2. Section Divider
|
||||
```
|
||||
┌─────────────────────────────────┐
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ SECTION TITLE │
|
||||
│ Brief Context │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
**Elements**:
|
||||
- Section title: 36-40pt, bold
|
||||
- Context: 20-24pt, regular
|
||||
- Background: Brand color or pattern
|
||||
- Number indicator (optional): Large, subtle
|
||||
|
||||
### 3. Content Slide - Text Only
|
||||
```
|
||||
┌─────────────────────────────────┐
|
||||
│ SLIDE TITLE │
|
||||
├─────────────────────────────────┤
|
||||
│ │
|
||||
│ • Key point one with detail │
|
||||
│ Supporting information │
|
||||
│ │
|
||||
│ • Key point two with detail │
|
||||
│ Supporting information │
|
||||
│ │
|
||||
│ • Key point three with detail │
|
||||
│ Supporting information │
|
||||
│ │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
**Elements**:
|
||||
- Title: 32pt, bold, left-aligned
|
||||
- Bullets: 18-20pt, regular
|
||||
- Sub-bullets: 16-18pt, light
|
||||
- Line spacing: 1.5x
|
||||
|
||||
### 4. Content Slide - Text + Image
|
||||
```
|
||||
┌─────────────────────────────────┐
|
||||
│ SLIDE TITLE │
|
||||
├────────────────┬────────────────┤
|
||||
│ │ │
|
||||
│ • Point one │ │
|
||||
│ │ [IMAGE/ │
|
||||
│ • Point two │ CHART] │
|
||||
│ │ │
|
||||
│ • Point three │ │
|
||||
│ │ │
|
||||
└────────────────┴────────────────┘
|
||||
```
|
||||
**Proportions**:
|
||||
- Text: 50-60% width
|
||||
- Visual: 40-50% width
|
||||
- Padding: 0.5" between columns
|
||||
|
||||
### 5. Data Visualization
|
||||
```
|
||||
┌─────────────────────────────────┐
|
||||
│ DATA INSIGHT TITLE │
|
||||
├─────────────────────────────────┤
|
||||
│ ┌──────────┐ │
|
||||
│ │ │ │
|
||||
│ │ CHART/ │ │
|
||||
│ │ GRAPH │ │
|
||||
│ │ │ │
|
||||
│ └──────────┘ │
|
||||
│ │
|
||||
│ Key Insight: [Callout text] │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
**Elements**:
|
||||
- Chart: 60-70% of slide area
|
||||
- Title: Descriptive, not just "Sales Data"
|
||||
- Callout: Highlight key finding
|
||||
- Legend: Only if necessary
|
||||
|
||||
### 6. Comparison Slide
|
||||
```
|
||||
┌─────────────────────────────────┐
|
||||
│ COMPARISON TITLE │
|
||||
├────────────────┬────────────────┤
|
||||
│ Option A │ Option B │
|
||||
├────────────────┼────────────────┤
|
||||
│ │ │
|
||||
│ ✓ Advantage 1 │ ✓ Advantage 1 │
|
||||
│ ✓ Advantage 2 │ ✓ Advantage 2 │
|
||||
│ ✗ Drawback 1 │ ✗ Drawback 1 │
|
||||
│ │ │
|
||||
│ Metric: 85% │ Metric: 72% │
|
||||
│ │ │
|
||||
└────────────────┴────────────────┘
|
||||
```
|
||||
**Layout**:
|
||||
- Equal column widths
|
||||
- Consistent formatting
|
||||
- Visual indicators (✓/✗, +/-)
|
||||
- Highlight winner (if applicable)
|
||||
|
||||
### 7. Process/Timeline
|
||||
```
|
||||
┌─────────────────────────────────┐
|
||||
│ PROCESS TITLE │
|
||||
├─────────────────────────────────┤
|
||||
│ │
|
||||
│ [1]────►[2]────►[3]────►[4] │
|
||||
│ Start Step Step End │
|
||||
│ One Two │
|
||||
│ │
|
||||
│ Description of the process │
|
||||
│ │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
**Variations**:
|
||||
- Horizontal timeline
|
||||
- Vertical timeline
|
||||
- Circular process
|
||||
- Chevron diagram
|
||||
|
||||
### 8. Quote/Testimonial
|
||||
```
|
||||
┌─────────────────────────────────┐
|
||||
│ │
|
||||
│ │
|
||||
│ "Impactful quote │
|
||||
│ that supports │
|
||||
│ your message" │
|
||||
│ │
|
||||
│ - Attribution │
|
||||
│ Title/Company │
|
||||
│ │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
**Styling**:
|
||||
- Quote: 24-28pt, italic or serif
|
||||
- Attribution: 16-18pt, regular
|
||||
- Quotation marks: Large, subtle
|
||||
- Background: Minimal, maybe texture
|
||||
|
||||
### 9. Image-Focused
|
||||
```
|
||||
┌─────────────────────────────────┐
|
||||
│ │
|
||||
│ │
|
||||
│ [FULL BLEED IMAGE] │
|
||||
│ │
|
||||
│ │
|
||||
├─────────────────────────────────┤
|
||||
│ Caption or Context Text │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
**Best Practices**:
|
||||
- High-resolution images only
|
||||
- Text overlay needs contrast
|
||||
- Consider semi-transparent overlay
|
||||
- Keep text minimal
|
||||
|
||||
### 10. Call-to-Action
|
||||
```
|
||||
┌─────────────────────────────────┐
|
||||
│ │
|
||||
│ │
|
||||
│ CLEAR ACTION ITEM │
|
||||
│ │
|
||||
│ [ BUTTON/ACTION ] │
|
||||
│ │
|
||||
│ Supporting context │
|
||||
│ │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
**Elements**:
|
||||
- Action: 32-36pt, bold
|
||||
- Button: Contrasting color
|
||||
- Context: 18-20pt, regular
|
||||
- Contact info (if applicable)
|
||||
|
||||
## Responsive Layouts
|
||||
|
||||
### Mobile-First Considerations
|
||||
- Larger text (minimum 14pt)
|
||||
- Single column layouts
|
||||
- Touch-friendly spacing
|
||||
- Simplified graphics
|
||||
|
||||
### Aspect Ratios
|
||||
- **16:9** (Standard): 1920×1080px
|
||||
- **4:3** (Traditional): 1024×768px
|
||||
- **16:10** (Modern): 1920×1200px
|
||||
- **1:1** (Social): 1080×1080px
|
||||
|
||||
## Color Usage
|
||||
|
||||
### Background Options
|
||||
1. **White**: Maximum readability
|
||||
2. **Light gray**: Reduces glare
|
||||
3. **Dark**: For high contrast
|
||||
4. **Gradient**: Adds depth
|
||||
5. **Pattern**: Subtle texture
|
||||
|
||||
### Text Colors
|
||||
- **Primary text**: High contrast (90%+)
|
||||
- **Secondary text**: Medium contrast (70%+)
|
||||
- **Accent text**: Brand color
|
||||
- **Disabled text**: Low contrast (40%)
|
||||
|
||||
## Typography Guidelines
|
||||
|
||||
### Font Pairing
|
||||
```
|
||||
Heading Font + Body Font
|
||||
- Poppins + Lora
|
||||
- Arial + Georgia
|
||||
- Helvetica + Times
|
||||
- Roboto + Merriweather
|
||||
```
|
||||
|
||||
### Size Hierarchy
|
||||
```
|
||||
Title: 44-48pt
|
||||
Subtitle: 32-36pt
|
||||
Heading: 28-32pt
|
||||
Subheading: 20-24pt
|
||||
Body: 16-20pt
|
||||
Caption: 12-14pt
|
||||
```
|
||||
|
||||
### Line Spacing
|
||||
- Titles: 1.0-1.2x
|
||||
- Body text: 1.5-1.6x
|
||||
- Bullets: 1.4-1.5x
|
||||
- Captions: 1.2-1.3x
|
||||
|
||||
## Animation & Transitions
|
||||
|
||||
### Entrance Animations
|
||||
- **Fade in**: Universal, professional
|
||||
- **Slide in**: Directional emphasis
|
||||
- **Grow**: Importance emphasis
|
||||
- **Appear**: Simple, no distraction
|
||||
|
||||
### Transition Timing
|
||||
- Fast: 0.3s (between related slides)
|
||||
- Medium: 0.5s (section transitions)
|
||||
- Slow: 1.0s (major transitions)
|
||||
|
||||
### Build Sequences
|
||||
1. Title appears
|
||||
2. Main content fades in
|
||||
3. Supporting elements slide in
|
||||
4. Call-to-action grows
|
||||
|
||||
## Accessibility Considerations
|
||||
|
||||
### Color Contrast
|
||||
- WCAG AA: 4.5:1 for normal text
|
||||
- WCAG AA: 3:1 for large text
|
||||
- WCAG AAA: 7:1 for normal text
|
||||
|
||||
### Font Sizes
|
||||
- Minimum: 14pt for body text
|
||||
- Minimum: 18pt for important text
|
||||
- Maximum: 54pt for titles
|
||||
|
||||
### Alt Text
|
||||
- Describe all images
|
||||
- Explain all charts
|
||||
- Summarize complex diagrams
|
||||
|
||||
## Quality Checklist
|
||||
|
||||
### Before Finalizing
|
||||
- [ ] Consistent alignment across slides
|
||||
- [ ] Proper contrast ratios
|
||||
- [ ] No orphaned bullets
|
||||
- [ ] Images are high resolution
|
||||
- [ ] Data is clearly labeled
|
||||
- [ ] Slide numbers present
|
||||
- [ ] Brand elements applied
|
||||
- [ ] Spell check completed
|
||||
- [ ] Animations tested
|
||||
- [ ] Export quality verified
|
||||
@@ -0,0 +1,168 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Apply brand styling to PowerPoint presentations
|
||||
Customizes colors, fonts, and visual elements based on brand guidelines
|
||||
"""
|
||||
|
||||
import json
|
||||
import argparse
|
||||
from pathlib import Path
|
||||
|
||||
# Note: In production, install python-pptx via pip
|
||||
try:
|
||||
from pptx import Presentation
|
||||
from pptx.dml.color import RGBColor
|
||||
from pptx.util import Pt
|
||||
except ImportError:
|
||||
print("📦 Please install python-pptx: pip install python-pptx")
|
||||
exit(1)
|
||||
|
||||
class BrandStyler:
|
||||
"""Apply brand guidelines to PowerPoint presentations"""
|
||||
|
||||
def __init__(self, brand_config_path: str):
|
||||
"""Load brand configuration"""
|
||||
with open(brand_config_path, 'r') as f:
|
||||
self.brand_config = json.load(f)
|
||||
|
||||
self.colors = self.brand_config.get('colors', {})
|
||||
self.fonts = self.brand_config.get('fonts', {})
|
||||
self.logos = self.brand_config.get('logos', {})
|
||||
|
||||
def apply_to_presentation(self, pptx_path: str, output_path: str = None):
|
||||
"""Apply brand styling to PowerPoint file"""
|
||||
|
||||
if not output_path:
|
||||
output_path = pptx_path.replace('.pptx', '_branded.pptx')
|
||||
|
||||
print(f"🎨 Applying brand styles to: {pptx_path}")
|
||||
|
||||
# Load presentation
|
||||
prs = Presentation(pptx_path)
|
||||
|
||||
# Apply styles to each slide
|
||||
for slide_num, slide in enumerate(prs.slides, 1):
|
||||
self.style_slide(slide, slide_num)
|
||||
|
||||
# Save branded version
|
||||
prs.save(output_path)
|
||||
print(f"✅ Branded presentation saved: {output_path}")
|
||||
|
||||
return output_path
|
||||
|
||||
def style_slide(self, slide, slide_num: int):
|
||||
"""Apply brand styling to individual slide"""
|
||||
|
||||
# Style text elements
|
||||
for shape in slide.shapes:
|
||||
if shape.has_text_frame:
|
||||
self.style_text_frame(shape.text_frame, slide_num)
|
||||
|
||||
# Style tables
|
||||
if shape.has_table:
|
||||
self.style_table(shape.table)
|
||||
|
||||
def style_text_frame(self, text_frame, slide_num: int):
|
||||
"""Apply brand fonts and colors to text"""
|
||||
|
||||
for paragraph in text_frame.paragraphs:
|
||||
for run in paragraph.runs:
|
||||
# Apply font
|
||||
if slide_num == 1: # Title slide
|
||||
run.font.name = self.fonts.get('heading', 'Arial')
|
||||
if paragraph.level == 0:
|
||||
run.font.size = Pt(44)
|
||||
else:
|
||||
run.font.name = self.fonts.get('body', 'Arial')
|
||||
|
||||
# Apply colors based on context
|
||||
if slide_num == 1: # Title slide - white text
|
||||
run.font.color.rgb = RGBColor(255, 255, 255)
|
||||
elif paragraph.level == 0: # Headings
|
||||
color_hex = self.colors.get('primary', '#1a73e8').lstrip('#')
|
||||
run.font.color.rgb = RGBColor(
|
||||
int(color_hex[0:2], 16),
|
||||
int(color_hex[2:4], 16),
|
||||
int(color_hex[4:6], 16)
|
||||
)
|
||||
else: # Body text
|
||||
color_hex = self.colors.get('text', '#3c4043').lstrip('#')
|
||||
run.font.color.rgb = RGBColor(
|
||||
int(color_hex[0:2], 16),
|
||||
int(color_hex[2:4], 16),
|
||||
int(color_hex[4:6], 16)
|
||||
)
|
||||
|
||||
def style_table(self, table):
|
||||
"""Apply brand styling to tables"""
|
||||
|
||||
# Style header row
|
||||
if len(table.rows) > 0:
|
||||
for cell in table.rows[0].cells:
|
||||
# Apply header background color
|
||||
if hasattr(cell, 'fill'):
|
||||
color_hex = self.colors.get('secondary', '#34a853').lstrip('#')
|
||||
# Note: python-pptx table cell fill is complex
|
||||
# This is simplified for example
|
||||
pass
|
||||
|
||||
# Style table text
|
||||
for row in table.rows:
|
||||
for cell in row.cells:
|
||||
if cell.text_frame:
|
||||
for paragraph in cell.text_frame.paragraphs:
|
||||
for run in paragraph.runs:
|
||||
run.font.name = self.fonts.get('body', 'Arial')
|
||||
run.font.size = Pt(14)
|
||||
|
||||
def add_logo(self, slide, position='top-right'):
|
||||
"""Add company logo to slide"""
|
||||
|
||||
logo_path = self.logos.get('primary')
|
||||
if not logo_path or not Path(logo_path).exists():
|
||||
return
|
||||
|
||||
# Position mappings
|
||||
positions = {
|
||||
'top-right': {'left': 8.5, 'top': 0.25, 'width': 1.5},
|
||||
'bottom-right': {'left': 8.5, 'top': 4.75, 'width': 1.5},
|
||||
'top-left': {'left': 0.25, 'top': 0.25, 'width': 1.5}
|
||||
}
|
||||
|
||||
pos = positions.get(position, positions['top-right'])
|
||||
|
||||
# Add logo image
|
||||
# Note: Requires python-pptx inches conversion
|
||||
# slide.shapes.add_picture(logo_path, left, top, width)
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Apply brand styling to PowerPoint presentations"
|
||||
)
|
||||
parser.add_argument(
|
||||
"presentation",
|
||||
help="Path to PowerPoint presentation"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--config",
|
||||
default="assets/brand_config.json",
|
||||
help="Path to brand configuration JSON"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--output",
|
||||
help="Output path for branded presentation"
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
# Apply branding
|
||||
styler = BrandStyler(args.config)
|
||||
output_path = styler.apply_to_presentation(
|
||||
args.presentation,
|
||||
args.output
|
||||
)
|
||||
|
||||
print(f"✨ Brand styling complete: {output_path}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,203 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Extract research content from Notion pages and databases
|
||||
Outputs structured JSON for downstream processing
|
||||
"""
|
||||
|
||||
import json
|
||||
import argparse
|
||||
from typing import Dict, List, Any
|
||||
from datetime import datetime
|
||||
|
||||
def extract_notion_content(notion_url: str) -> Dict[str, Any]:
|
||||
"""
|
||||
Extract and structure content from Notion
|
||||
|
||||
This function would integrate with Notion MCP tools:
|
||||
- notion-search for finding related pages
|
||||
- notion-fetch for getting full content
|
||||
|
||||
Args:
|
||||
notion_url: URL of Notion page or database
|
||||
|
||||
Returns:
|
||||
Structured research data
|
||||
"""
|
||||
|
||||
# Parse Notion URL to get page/database ID
|
||||
page_id = parse_notion_url(notion_url)
|
||||
|
||||
# This would use actual Notion MCP tools in production
|
||||
# Simulating the structure for now
|
||||
extracted_data = {
|
||||
"source": {
|
||||
"url": notion_url,
|
||||
"id": page_id,
|
||||
"type": "page", # or "database"
|
||||
"extracted_at": datetime.now().isoformat()
|
||||
},
|
||||
"metadata": {
|
||||
"title": "Q4 Research Summary",
|
||||
"last_edited": "2024-12-15T10:30:00Z",
|
||||
"created_by": "user@company.com",
|
||||
"tags": ["research", "Q4", "strategy"]
|
||||
},
|
||||
"content": {
|
||||
"sections": [
|
||||
{
|
||||
"title": "Executive Summary",
|
||||
"content": "Key findings from Q4 research indicate...",
|
||||
"level": 1,
|
||||
"data_points": [
|
||||
{"metric": "Growth Rate", "value": "25%"},
|
||||
{"metric": "User Satisfaction", "value": "4.5/5"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Market Analysis",
|
||||
"content": "The market landscape shows...",
|
||||
"level": 1,
|
||||
"subsections": [
|
||||
{
|
||||
"title": "Competitive Landscape",
|
||||
"content": "Our position relative to competitors...",
|
||||
"level": 2
|
||||
},
|
||||
{
|
||||
"title": "Growth Opportunities",
|
||||
"content": "Identified opportunities include...",
|
||||
"level": 2
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Customer Insights",
|
||||
"content": "Customer feedback reveals...",
|
||||
"level": 1,
|
||||
"data_points": [
|
||||
{"metric": "NPS Score", "value": "72"},
|
||||
{"metric": "Retention Rate", "value": "89%"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Recommendations",
|
||||
"content": "Based on the research, we recommend...",
|
||||
"level": 1,
|
||||
"action_items": [
|
||||
"Expand into new market segments",
|
||||
"Enhance product features based on feedback",
|
||||
"Increase investment in customer success"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"linked_pages": [
|
||||
{
|
||||
"title": "Detailed Customer Survey Results",
|
||||
"url": "notion://page/survey-results-id",
|
||||
"relevance": "high"
|
||||
},
|
||||
{
|
||||
"title": "Competitor Analysis Deep Dive",
|
||||
"url": "notion://page/competitor-analysis-id",
|
||||
"relevance": "medium"
|
||||
}
|
||||
],
|
||||
"attachments": [
|
||||
{
|
||||
"type": "spreadsheet",
|
||||
"title": "Q4 Metrics Dashboard",
|
||||
"url": "notion://attachment/metrics-id"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
return extracted_data
|
||||
|
||||
def parse_notion_url(url: str) -> str:
|
||||
"""Extract page/database ID from Notion URL"""
|
||||
# Simplified URL parsing
|
||||
if "notion.so/" in url or "notion://" in url:
|
||||
parts = url.split("/")
|
||||
return parts[-1].split("?")[0]
|
||||
return url
|
||||
|
||||
def fetch_linked_content(linked_pages: List[Dict], depth: int = 1) -> List[Dict]:
|
||||
"""
|
||||
Recursively fetch linked page content
|
||||
|
||||
Args:
|
||||
linked_pages: List of linked page references
|
||||
depth: How deep to follow links
|
||||
|
||||
Returns:
|
||||
Expanded content from linked pages
|
||||
"""
|
||||
if depth <= 0:
|
||||
return []
|
||||
|
||||
expanded_content = []
|
||||
for page in linked_pages:
|
||||
if page.get("relevance") in ["high", "medium"]:
|
||||
# Would fetch actual content here
|
||||
expanded_content.append({
|
||||
"source": page["url"],
|
||||
"title": page["title"],
|
||||
"content": f"Content from {page['title']}..."
|
||||
})
|
||||
|
||||
return expanded_content
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Extract research content from Notion"
|
||||
)
|
||||
parser.add_argument(
|
||||
"notion_url",
|
||||
help="URL of Notion page or database"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--output",
|
||||
default="research.json",
|
||||
help="Output JSON file (default: research.json)"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--include-linked",
|
||||
action="store_true",
|
||||
help="Include content from linked pages"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--depth",
|
||||
type=int,
|
||||
default=1,
|
||||
help="Link following depth (default: 1)"
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
print(f"📚 Extracting content from: {args.notion_url}")
|
||||
|
||||
# Extract main content
|
||||
research_data = extract_notion_content(args.notion_url)
|
||||
|
||||
# Optionally fetch linked content
|
||||
if args.include_linked and research_data.get("linked_pages"):
|
||||
print("📎 Fetching linked pages...")
|
||||
linked_content = fetch_linked_content(
|
||||
research_data["linked_pages"],
|
||||
args.depth
|
||||
)
|
||||
research_data["linked_content"] = linked_content
|
||||
|
||||
# Save to JSON
|
||||
with open(args.output, 'w', encoding='utf-8') as f:
|
||||
json.dump(research_data, f, indent=2, ensure_ascii=False)
|
||||
|
||||
print(f"✅ Research data saved to: {args.output}")
|
||||
print(f"📊 Extracted {len(research_data['content']['sections'])} sections")
|
||||
|
||||
if research_data.get("linked_pages"):
|
||||
print(f"🔗 Found {len(research_data['linked_pages'])} linked pages")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,473 @@
|
||||
#!/usr/bin/env node
|
||||
/**
|
||||
* Generate PowerPoint presentation from synthesis data
|
||||
* Uses pptxgenjs library to create professional presentations
|
||||
*/
|
||||
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
// Note: In production, install via npm install pptxgenjs
|
||||
// For this example, we'll show the structure
|
||||
let PptxGenJS;
|
||||
try {
|
||||
PptxGenJS = require('pptxgenjs');
|
||||
} catch (e) {
|
||||
console.log('📦 Installing pptxgenjs... Run: npm install pptxgenjs');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
class PresentationGenerator {
|
||||
constructor(synthesisData) {
|
||||
this.synthesis = synthesisData;
|
||||
this.pptx = new PptxGenJS();
|
||||
this.setupPresentation();
|
||||
this.defineLayouts();
|
||||
}
|
||||
|
||||
setupPresentation() {
|
||||
// Set presentation properties
|
||||
this.pptx.layout = 'LAYOUT_16x9';
|
||||
this.pptx.author = this.synthesis.metadata.author || 'Research Team';
|
||||
this.pptx.company = 'Generated by Research-to-Presentation';
|
||||
this.pptx.title = this.synthesis.metadata.title || 'Research Presentation';
|
||||
|
||||
// Define theme colors
|
||||
this.colors = {
|
||||
primary: '#1a73e8',
|
||||
secondary: '#34a853',
|
||||
accent: '#ea4335',
|
||||
dark: '#202124',
|
||||
light: '#f8f9fa',
|
||||
text: '#3c4043',
|
||||
subtext: '#5f6368'
|
||||
};
|
||||
|
||||
// Define font styles
|
||||
this.fonts = {
|
||||
title: { face: 'Arial', size: 44, bold: true },
|
||||
heading: { face: 'Arial', size: 32, bold: true },
|
||||
subheading: { face: 'Arial', size: 24, bold: false },
|
||||
body: { face: 'Arial', size: 18 },
|
||||
small: { face: 'Arial', size: 14 }
|
||||
};
|
||||
}
|
||||
|
||||
defineLayouts() {
|
||||
// Define master slides/layouts
|
||||
this.pptx.defineSlideMaster({
|
||||
title: 'CUSTOM_LAYOUT',
|
||||
background: { color: this.colors.light },
|
||||
objects: [
|
||||
// Footer with slide number
|
||||
{
|
||||
text: {
|
||||
text: '[[slideNumber]]',
|
||||
options: {
|
||||
x: 8.5,
|
||||
y: 5,
|
||||
w: 1,
|
||||
h: 0.4,
|
||||
fontSize: 12,
|
||||
color: this.colors.subtext
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
}
|
||||
|
||||
generate() {
|
||||
console.log('🎨 Generating slides...');
|
||||
|
||||
this.synthesis.slide_plan.forEach(slide => {
|
||||
switch(slide.type) {
|
||||
case 'title':
|
||||
this.createTitleSlide(slide);
|
||||
break;
|
||||
case 'executive_summary':
|
||||
this.createExecutiveSummarySlide(slide);
|
||||
break;
|
||||
case 'agenda':
|
||||
this.createAgendaSlide(slide);
|
||||
break;
|
||||
case 'content':
|
||||
this.createContentSlide(slide);
|
||||
break;
|
||||
case 'data_visualization':
|
||||
this.createDataSlide(slide);
|
||||
break;
|
||||
case 'recommendations':
|
||||
this.createRecommendationsSlide(slide);
|
||||
break;
|
||||
case 'closing':
|
||||
this.createClosingSlide(slide);
|
||||
break;
|
||||
default:
|
||||
this.createContentSlide(slide);
|
||||
}
|
||||
});
|
||||
|
||||
return this.pptx;
|
||||
}
|
||||
|
||||
createTitleSlide(slideData) {
|
||||
const slide = this.pptx.addSlide({ masterName: 'CUSTOM_LAYOUT' });
|
||||
|
||||
// Add background gradient
|
||||
slide.background = {
|
||||
fill: {
|
||||
type: 'gradient',
|
||||
colors: [
|
||||
{ color: this.colors.primary, position: 0 },
|
||||
{ color: this.colors.secondary, position: 100 }
|
||||
]
|
||||
}
|
||||
};
|
||||
|
||||
// Title
|
||||
slide.addText(slideData.title, {
|
||||
x: 0.5,
|
||||
y: 2,
|
||||
w: 9,
|
||||
h: 1.5,
|
||||
fontSize: 44,
|
||||
bold: true,
|
||||
color: 'FFFFFF',
|
||||
align: 'center'
|
||||
});
|
||||
|
||||
// Subtitle
|
||||
if (slideData.subtitle) {
|
||||
slide.addText(slideData.subtitle, {
|
||||
x: 0.5,
|
||||
y: 3.5,
|
||||
w: 9,
|
||||
h: 0.75,
|
||||
fontSize: 24,
|
||||
color: 'FFFFFF',
|
||||
align: 'center'
|
||||
});
|
||||
}
|
||||
|
||||
// Speaker notes
|
||||
if (slideData.speaker_notes) {
|
||||
slide.addNotes(slideData.speaker_notes);
|
||||
}
|
||||
}
|
||||
|
||||
createExecutiveSummarySlide(slideData) {
|
||||
const slide = this.pptx.addSlide({ masterName: 'CUSTOM_LAYOUT' });
|
||||
|
||||
// Title
|
||||
slide.addText(slideData.title, {
|
||||
x: 0.5,
|
||||
y: 0.5,
|
||||
w: 9,
|
||||
h: 0.75,
|
||||
...this.fonts.heading,
|
||||
color: this.colors.primary
|
||||
});
|
||||
|
||||
// Summary content
|
||||
slide.addText(slideData.content, {
|
||||
x: 0.5,
|
||||
y: 1.5,
|
||||
w: 9,
|
||||
h: 1.5,
|
||||
...this.fonts.body,
|
||||
color: this.colors.text
|
||||
});
|
||||
|
||||
// Key points
|
||||
if (slideData.key_points && slideData.key_points.length > 0) {
|
||||
const bulletPoints = slideData.key_points.map(point => ({
|
||||
text: point,
|
||||
options: { bullet: true }
|
||||
}));
|
||||
|
||||
slide.addText(bulletPoints, {
|
||||
x: 0.5,
|
||||
y: 3.25,
|
||||
w: 9,
|
||||
h: 2,
|
||||
...this.fonts.body,
|
||||
color: this.colors.text,
|
||||
bullet: { type: 'circle' }
|
||||
});
|
||||
}
|
||||
|
||||
slide.addNotes(slideData.speaker_notes || '');
|
||||
}
|
||||
|
||||
createAgendaSlide(slideData) {
|
||||
const slide = this.pptx.addSlide({ masterName: 'CUSTOM_LAYOUT' });
|
||||
|
||||
// Title
|
||||
slide.addText(slideData.title, {
|
||||
x: 0.5,
|
||||
y: 0.5,
|
||||
w: 9,
|
||||
h: 0.75,
|
||||
...this.fonts.heading,
|
||||
color: this.colors.primary
|
||||
});
|
||||
|
||||
// Agenda items
|
||||
const agendaItems = slideData.items.map((item, index) => ({
|
||||
text: `${index + 1}. ${item}`,
|
||||
options: {
|
||||
fontSize: 20,
|
||||
bullet: false,
|
||||
indentLevel: 0
|
||||
}
|
||||
}));
|
||||
|
||||
slide.addText(agendaItems, {
|
||||
x: 1,
|
||||
y: 1.5,
|
||||
w: 8,
|
||||
h: 3.5,
|
||||
color: this.colors.text,
|
||||
lineSpacing: 32
|
||||
});
|
||||
|
||||
// Duration footer
|
||||
if (slideData.total_duration) {
|
||||
slide.addText(`Total Duration: ${slideData.total_duration} minutes`, {
|
||||
x: 0.5,
|
||||
y: 5,
|
||||
w: 4,
|
||||
h: 0.4,
|
||||
...this.fonts.small,
|
||||
color: this.colors.subtext
|
||||
});
|
||||
}
|
||||
|
||||
slide.addNotes(slideData.speaker_notes || '');
|
||||
}
|
||||
|
||||
createContentSlide(slideData) {
|
||||
const slide = this.pptx.addSlide({ masterName: 'CUSTOM_LAYOUT' });
|
||||
|
||||
// Title
|
||||
slide.addText(slideData.title, {
|
||||
x: 0.5,
|
||||
y: 0.5,
|
||||
w: 9,
|
||||
h: 0.75,
|
||||
...this.fonts.heading,
|
||||
color: this.colors.primary
|
||||
});
|
||||
|
||||
// Determine layout based on content
|
||||
const hasData = slideData.data && slideData.data.length > 0;
|
||||
const contentWidth = hasData ? 5 : 9;
|
||||
|
||||
// Bullet points
|
||||
if (slideData.bullets && slideData.bullets.length > 0) {
|
||||
const bulletPoints = slideData.bullets.map(point => ({
|
||||
text: point,
|
||||
options: { bullet: true }
|
||||
}));
|
||||
|
||||
slide.addText(bulletPoints, {
|
||||
x: 0.5,
|
||||
y: 1.5,
|
||||
w: contentWidth,
|
||||
h: 3.5,
|
||||
...this.fonts.body,
|
||||
color: this.colors.text,
|
||||
bullet: { type: 'circle' },
|
||||
lineSpacing: 24
|
||||
});
|
||||
}
|
||||
|
||||
// Data table if present
|
||||
if (hasData) {
|
||||
const tableData = [
|
||||
['Metric', 'Value'],
|
||||
...slideData.data.map(d => [d.metric, d.value])
|
||||
];
|
||||
|
||||
slide.addTable(tableData, {
|
||||
x: 6,
|
||||
y: 1.5,
|
||||
w: 3.5,
|
||||
h: 2,
|
||||
fontSize: 14,
|
||||
border: { pt: 1, color: this.colors.secondary },
|
||||
fill: { color: this.colors.light }
|
||||
});
|
||||
}
|
||||
|
||||
slide.addNotes(slideData.speaker_notes || '');
|
||||
}
|
||||
|
||||
createDataSlide(slideData) {
|
||||
const slide = this.pptx.addSlide({ masterName: 'CUSTOM_LAYOUT' });
|
||||
|
||||
// Title
|
||||
slide.addText(slideData.title, {
|
||||
x: 0.5,
|
||||
y: 0.5,
|
||||
w: 9,
|
||||
h: 0.75,
|
||||
...this.fonts.heading,
|
||||
color: this.colors.primary
|
||||
});
|
||||
|
||||
// Create data table
|
||||
if (slideData.data_points && slideData.data_points.length > 0) {
|
||||
const tableData = [
|
||||
['Source', 'Metric', 'Value'],
|
||||
...slideData.data_points.map(dp => [
|
||||
dp.source || '',
|
||||
dp.metric,
|
||||
dp.value
|
||||
])
|
||||
];
|
||||
|
||||
slide.addTable(tableData, {
|
||||
x: 0.5,
|
||||
y: 1.5,
|
||||
w: 9,
|
||||
h: 3.5,
|
||||
fontSize: 16,
|
||||
border: { pt: 1, color: this.colors.secondary },
|
||||
fill: { color: this.colors.light },
|
||||
rowH: 0.5
|
||||
});
|
||||
}
|
||||
|
||||
slide.addNotes(slideData.speaker_notes || '');
|
||||
}
|
||||
|
||||
createRecommendationsSlide(slideData) {
|
||||
const slide = this.pptx.addSlide({ masterName: 'CUSTOM_LAYOUT' });
|
||||
|
||||
// Title
|
||||
slide.addText(slideData.title, {
|
||||
x: 0.5,
|
||||
y: 0.5,
|
||||
w: 9,
|
||||
h: 0.75,
|
||||
...this.fonts.heading,
|
||||
color: this.colors.primary
|
||||
});
|
||||
|
||||
// Recommendations as numbered list
|
||||
const recommendations = slideData.items.map((item, index) => ({
|
||||
text: `${index + 1}. ${item}`,
|
||||
options: {
|
||||
fontSize: 20,
|
||||
bullet: false
|
||||
}
|
||||
}));
|
||||
|
||||
slide.addText(recommendations, {
|
||||
x: 0.5,
|
||||
y: 1.5,
|
||||
w: 9,
|
||||
h: 3.5,
|
||||
color: this.colors.text,
|
||||
lineSpacing: 28
|
||||
});
|
||||
|
||||
slide.addNotes(slideData.speaker_notes || '');
|
||||
}
|
||||
|
||||
createClosingSlide(slideData) {
|
||||
const slide = this.pptx.addSlide({ masterName: 'CUSTOM_LAYOUT' });
|
||||
|
||||
// Gradient background
|
||||
slide.background = {
|
||||
fill: {
|
||||
type: 'gradient',
|
||||
colors: [
|
||||
{ color: this.colors.secondary, position: 0 },
|
||||
{ color: this.colors.primary, position: 100 }
|
||||
]
|
||||
}
|
||||
};
|
||||
|
||||
// Thank you text
|
||||
slide.addText(slideData.title, {
|
||||
x: 0.5,
|
||||
y: 2,
|
||||
w: 9,
|
||||
h: 1,
|
||||
fontSize: 48,
|
||||
bold: true,
|
||||
color: 'FFFFFF',
|
||||
align: 'center'
|
||||
});
|
||||
|
||||
// Subtitle
|
||||
if (slideData.subtitle) {
|
||||
slide.addText(slideData.subtitle, {
|
||||
x: 0.5,
|
||||
y: 3.5,
|
||||
w: 9,
|
||||
h: 0.75,
|
||||
fontSize: 28,
|
||||
color: 'FFFFFF',
|
||||
align: 'center'
|
||||
});
|
||||
}
|
||||
|
||||
slide.addNotes(slideData.speaker_notes || '');
|
||||
}
|
||||
|
||||
async save(outputPath) {
|
||||
try {
|
||||
await this.pptx.writeFile({ fileName: outputPath });
|
||||
console.log(`✅ Presentation saved: ${outputPath}`);
|
||||
} catch (error) {
|
||||
console.error(`❌ Error saving presentation: ${error}`);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Main execution
|
||||
async function main() {
|
||||
const args = process.argv.slice(2);
|
||||
|
||||
if (args.length < 2) {
|
||||
console.log('Usage: node generate_pptx.js <synthesis.json> <output.pptx>');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const synthesisFile = args[0];
|
||||
const outputFile = args[1];
|
||||
|
||||
console.log(`📊 Loading synthesis from: ${synthesisFile}`);
|
||||
|
||||
try {
|
||||
// Load synthesis data
|
||||
const synthesisData = JSON.parse(
|
||||
fs.readFileSync(synthesisFile, 'utf8')
|
||||
);
|
||||
|
||||
// Generate presentation
|
||||
const generator = new PresentationGenerator(synthesisData);
|
||||
const presentation = generator.generate();
|
||||
|
||||
// Save to file
|
||||
await generator.save(outputFile);
|
||||
|
||||
console.log(`📈 Created ${synthesisData.slide_plan.length} slides`);
|
||||
|
||||
} catch (error) {
|
||||
console.error(`❌ Error: ${error.message}`);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
// Run if called directly
|
||||
if (require.main === module) {
|
||||
main();
|
||||
}
|
||||
|
||||
module.exports = { PresentationGenerator };
|
||||
@@ -0,0 +1,138 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Main workflow orchestrator for Research to Presentation
|
||||
Coordinates the complete pipeline from Notion to final presentation
|
||||
"""
|
||||
|
||||
import json
|
||||
import argparse
|
||||
import subprocess
|
||||
import sys
|
||||
from pathlib import Path
|
||||
from datetime import datetime
|
||||
|
||||
def run_workflow(notion_url, output_format='pptx', brand_config=None):
|
||||
"""
|
||||
Execute the complete research to presentation workflow
|
||||
|
||||
Args:
|
||||
notion_url: URL of Notion page or database
|
||||
output_format: 'pptx' or 'figma'
|
||||
brand_config: Path to brand configuration JSON
|
||||
"""
|
||||
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
||||
work_dir = Path(f"/tmp/r2p_{timestamp}")
|
||||
work_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
print("🚀 Starting Research to Presentation Workflow")
|
||||
print(f"📍 Source: {notion_url}")
|
||||
print(f"📄 Output Format: {output_format}")
|
||||
print("-" * 50)
|
||||
|
||||
try:
|
||||
# Step 1: Extract Notion content
|
||||
print("\n📚 Step 1: Extracting Notion research...")
|
||||
research_file = work_dir / "research.json"
|
||||
subprocess.run([
|
||||
sys.executable, "scripts/extract_notion.py",
|
||||
notion_url,
|
||||
"--output", str(research_file)
|
||||
], check=True)
|
||||
print(f"✅ Research extracted to {research_file}")
|
||||
|
||||
# Step 2: Synthesize content
|
||||
print("\n🔍 Step 2: Synthesizing content and extracting topics...")
|
||||
synthesis_file = work_dir / "synthesis.json"
|
||||
subprocess.run([
|
||||
sys.executable, "scripts/synthesize_content.py",
|
||||
str(research_file),
|
||||
"--output", str(synthesis_file)
|
||||
], check=True)
|
||||
print(f"✅ Synthesis completed: {synthesis_file}")
|
||||
|
||||
# Step 3: Generate presentation
|
||||
print(f"\n🎨 Step 3: Generating {output_format.upper()} presentation...")
|
||||
|
||||
if output_format == 'pptx':
|
||||
output_file = f"presentation_{timestamp}.pptx"
|
||||
subprocess.run([
|
||||
"node", "scripts/generate_pptx.js",
|
||||
str(synthesis_file),
|
||||
output_file
|
||||
], check=True)
|
||||
print(f"✅ PowerPoint created: {output_file}")
|
||||
|
||||
elif output_format == 'figma':
|
||||
output_file = f"figma_slides_{timestamp}.json"
|
||||
subprocess.run([
|
||||
"node", "scripts/export_to_figma.js",
|
||||
str(synthesis_file),
|
||||
"--output", output_file
|
||||
], check=True)
|
||||
print(f"✅ Figma slides exported: {output_file}")
|
||||
|
||||
# Step 4: Apply branding (if config provided)
|
||||
if brand_config and output_format == 'pptx':
|
||||
print("\n🎨 Step 4: Applying brand styles...")
|
||||
subprocess.run([
|
||||
sys.executable, "scripts/apply_brand.py",
|
||||
output_file,
|
||||
"--config", brand_config
|
||||
], check=True)
|
||||
print("✅ Brand styling applied")
|
||||
|
||||
print("\n" + "=" * 50)
|
||||
print(f"🎉 Workflow completed successfully!")
|
||||
print(f"📁 Output: {output_file}")
|
||||
print(f"🗂️ Work files: {work_dir}")
|
||||
|
||||
return output_file
|
||||
|
||||
except subprocess.CalledProcessError as e:
|
||||
print(f"\n❌ Error in workflow: {e}")
|
||||
print(f"💡 Check work directory for debugging: {work_dir}")
|
||||
raise
|
||||
except Exception as e:
|
||||
print(f"\n❌ Unexpected error: {e}")
|
||||
raise
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Transform Notion research into presentations"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--notion-url",
|
||||
required=True,
|
||||
help="URL of Notion page or database"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--output-format",
|
||||
choices=['pptx', 'figma'],
|
||||
default='pptx',
|
||||
help="Output format (default: pptx)"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--brand-config",
|
||||
help="Path to brand configuration JSON"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--preview",
|
||||
action='store_true',
|
||||
help="Generate HTML preview only"
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.preview:
|
||||
print("🔍 Preview mode - generating HTML only")
|
||||
# Preview implementation here
|
||||
else:
|
||||
run_workflow(
|
||||
args.notion_url,
|
||||
args.output_format,
|
||||
args.brand_config
|
||||
)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,375 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Synthesize research content and extract presentation topics
|
||||
Analyzes research data to identify key themes, agenda items, and slide structure
|
||||
"""
|
||||
|
||||
import json
|
||||
import argparse
|
||||
from typing import Dict, List, Any
|
||||
from collections import Counter
|
||||
import re
|
||||
|
||||
class ContentSynthesizer:
|
||||
"""Analyzes research and generates presentation structure"""
|
||||
|
||||
def __init__(self, research_data: Dict):
|
||||
self.research_data = research_data
|
||||
self.synthesis = {
|
||||
"metadata": {},
|
||||
"executive_summary": "",
|
||||
"key_topics": [],
|
||||
"agenda_items": [],
|
||||
"supporting_data": [],
|
||||
"recommendations": [],
|
||||
"slide_plan": []
|
||||
}
|
||||
|
||||
def synthesize(self) -> Dict[str, Any]:
|
||||
"""Execute complete synthesis pipeline"""
|
||||
self.extract_metadata()
|
||||
self.generate_executive_summary()
|
||||
self.extract_key_topics()
|
||||
self.derive_agenda_items()
|
||||
self.collect_supporting_data()
|
||||
self.extract_recommendations()
|
||||
self.create_slide_plan()
|
||||
|
||||
return self.synthesis
|
||||
|
||||
def extract_metadata(self):
|
||||
"""Extract presentation metadata from research"""
|
||||
source = self.research_data.get("metadata", {})
|
||||
self.synthesis["metadata"] = {
|
||||
"title": source.get("title", "Research Presentation"),
|
||||
"date": source.get("last_edited", ""),
|
||||
"author": source.get("created_by", ""),
|
||||
"tags": source.get("tags", [])
|
||||
}
|
||||
|
||||
def generate_executive_summary(self):
|
||||
"""Create concise executive summary"""
|
||||
sections = self.research_data.get("content", {}).get("sections", [])
|
||||
|
||||
# Find executive summary section or generate from content
|
||||
for section in sections:
|
||||
if "executive" in section.get("title", "").lower():
|
||||
self.synthesis["executive_summary"] = section.get("content", "")
|
||||
return
|
||||
|
||||
# Generate summary from first paragraph of each section
|
||||
summary_parts = []
|
||||
for section in sections[:3]: # First 3 sections
|
||||
content = section.get("content", "")
|
||||
first_sentence = content.split(".")[0] + "."
|
||||
summary_parts.append(first_sentence)
|
||||
|
||||
self.synthesis["executive_summary"] = " ".join(summary_parts)
|
||||
|
||||
def extract_key_topics(self):
|
||||
"""Identify main topics from research"""
|
||||
sections = self.research_data.get("content", {}).get("sections", [])
|
||||
|
||||
for section in sections:
|
||||
topic = {
|
||||
"title": section.get("title", ""),
|
||||
"importance": self.calculate_importance(section),
|
||||
"key_points": self.extract_key_points(section),
|
||||
"data_points": section.get("data_points", []),
|
||||
"speaker_notes": self.generate_speaker_notes(section)
|
||||
}
|
||||
|
||||
# Include subsections as subtopics
|
||||
if section.get("subsections"):
|
||||
topic["subtopics"] = [
|
||||
{
|
||||
"title": sub.get("title", ""),
|
||||
"key_points": self.extract_key_points(sub)
|
||||
}
|
||||
for sub in section["subsections"]
|
||||
]
|
||||
|
||||
self.synthesis["key_topics"].append(topic)
|
||||
|
||||
# Sort by importance
|
||||
self.synthesis["key_topics"].sort(
|
||||
key=lambda x: x["importance"],
|
||||
reverse=True
|
||||
)
|
||||
|
||||
def calculate_importance(self, section: Dict) -> float:
|
||||
"""Calculate topic importance score"""
|
||||
score = 1.0
|
||||
|
||||
# Higher level sections are more important
|
||||
if section.get("level") == 1:
|
||||
score += 0.5
|
||||
|
||||
# Sections with data are more important
|
||||
if section.get("data_points"):
|
||||
score += 0.3 * len(section["data_points"])
|
||||
|
||||
# Sections with action items are important
|
||||
if section.get("action_items"):
|
||||
score += 0.4
|
||||
|
||||
# Length indicates detail
|
||||
content_length = len(section.get("content", ""))
|
||||
if content_length > 500:
|
||||
score += 0.2
|
||||
|
||||
return score
|
||||
|
||||
def extract_key_points(self, section: Dict) -> List[str]:
|
||||
"""Extract bullet points from section content"""
|
||||
content = section.get("content", "")
|
||||
|
||||
# Extract sentences that look like key points
|
||||
key_points = []
|
||||
sentences = content.split(".")
|
||||
|
||||
for sentence in sentences:
|
||||
sentence = sentence.strip()
|
||||
# Look for important indicators
|
||||
if any(indicator in sentence.lower() for indicator in
|
||||
["key", "important", "significant", "critical", "major"]):
|
||||
key_points.append(sentence + ".")
|
||||
# Or if it's short and punchy
|
||||
elif 10 < len(sentence) < 100:
|
||||
key_points.append(sentence + ".")
|
||||
|
||||
# Add action items if present
|
||||
if section.get("action_items"):
|
||||
key_points.extend(section["action_items"])
|
||||
|
||||
return key_points[:5] # Limit to 5 points per slide
|
||||
|
||||
def generate_speaker_notes(self, section: Dict) -> str:
|
||||
"""Generate speaker notes for section"""
|
||||
content = section.get("content", "")
|
||||
|
||||
# Take first 2-3 sentences as speaker notes
|
||||
sentences = content.split(".")[:3]
|
||||
notes = ". ".join(sentences).strip()
|
||||
|
||||
# Add context about data if present
|
||||
if section.get("data_points"):
|
||||
notes += " Key metrics to highlight: "
|
||||
metrics = [f"{dp['metric']}: {dp['value']}"
|
||||
for dp in section["data_points"]]
|
||||
notes += ", ".join(metrics)
|
||||
|
||||
return notes
|
||||
|
||||
def derive_agenda_items(self):
|
||||
"""Generate meeting agenda from topics"""
|
||||
# Create agenda from top topics
|
||||
for i, topic in enumerate(self.synthesis["key_topics"][:5]):
|
||||
agenda_item = {
|
||||
"order": i + 1,
|
||||
"title": topic["title"],
|
||||
"duration": self.estimate_duration(topic),
|
||||
"discussion_points": topic["key_points"][:3],
|
||||
"decision_required": self.needs_decision(topic)
|
||||
}
|
||||
self.synthesis["agenda_items"].append(agenda_item)
|
||||
|
||||
def estimate_duration(self, topic: Dict) -> int:
|
||||
"""Estimate discussion time in minutes"""
|
||||
base_time = 5
|
||||
|
||||
# Add time for subtopics
|
||||
if topic.get("subtopics"):
|
||||
base_time += 2 * len(topic["subtopics"])
|
||||
|
||||
# Add time for data discussion
|
||||
if topic.get("data_points"):
|
||||
base_time += 3
|
||||
|
||||
# Cap at 15 minutes per topic
|
||||
return min(base_time, 15)
|
||||
|
||||
def needs_decision(self, topic: Dict) -> bool:
|
||||
"""Check if topic requires a decision"""
|
||||
indicators = ["recommend", "decide", "choose", "select", "approve"]
|
||||
content = " ".join(topic.get("key_points", []))
|
||||
|
||||
return any(ind in content.lower() for ind in indicators)
|
||||
|
||||
def collect_supporting_data(self):
|
||||
"""Aggregate all data points from research"""
|
||||
sections = self.research_data.get("content", {}).get("sections", [])
|
||||
|
||||
for section in sections:
|
||||
if section.get("data_points"):
|
||||
for data_point in section["data_points"]:
|
||||
self.synthesis["supporting_data"].append({
|
||||
"source": section["title"],
|
||||
"metric": data_point["metric"],
|
||||
"value": data_point["value"],
|
||||
"context": section.get("title", "")
|
||||
})
|
||||
|
||||
def extract_recommendations(self):
|
||||
"""Extract actionable recommendations"""
|
||||
sections = self.research_data.get("content", {}).get("sections", [])
|
||||
|
||||
for section in sections:
|
||||
# Look for recommendation sections
|
||||
if "recommend" in section.get("title", "").lower():
|
||||
if section.get("action_items"):
|
||||
self.synthesis["recommendations"].extend(
|
||||
section["action_items"]
|
||||
)
|
||||
else:
|
||||
# Extract from content
|
||||
content = section.get("content", "")
|
||||
if "recommend" in content.lower():
|
||||
# Simple extraction of recommendation sentences
|
||||
sentences = content.split(".")
|
||||
for sentence in sentences:
|
||||
if "recommend" in sentence.lower():
|
||||
self.synthesis["recommendations"].append(
|
||||
sentence.strip() + "."
|
||||
)
|
||||
|
||||
def create_slide_plan(self):
|
||||
"""Generate detailed slide-by-slide plan"""
|
||||
slides = []
|
||||
|
||||
# Title slide
|
||||
slides.append({
|
||||
"number": 1,
|
||||
"type": "title",
|
||||
"title": self.synthesis["metadata"]["title"],
|
||||
"subtitle": f"Research Synthesis - {self.synthesis['metadata']['date']}",
|
||||
"speaker_notes": self.synthesis["executive_summary"]
|
||||
})
|
||||
|
||||
# Executive Summary slide
|
||||
slides.append({
|
||||
"number": 2,
|
||||
"type": "executive_summary",
|
||||
"title": "Executive Summary",
|
||||
"content": self.synthesis["executive_summary"],
|
||||
"key_points": self.synthesis["key_topics"][0]["key_points"][:3],
|
||||
"speaker_notes": "Overview of key findings and recommendations"
|
||||
})
|
||||
|
||||
# Agenda slide
|
||||
if self.synthesis["agenda_items"]:
|
||||
slides.append({
|
||||
"number": 3,
|
||||
"type": "agenda",
|
||||
"title": "Agenda",
|
||||
"items": [item["title"] for item in self.synthesis["agenda_items"]],
|
||||
"total_duration": sum(item["duration"] for item in self.synthesis["agenda_items"]),
|
||||
"speaker_notes": "Today's discussion topics and time allocation"
|
||||
})
|
||||
|
||||
# Content slides for each major topic
|
||||
slide_num = 4
|
||||
for topic in self.synthesis["key_topics"][:6]: # Limit to 6 main topics
|
||||
slides.append({
|
||||
"number": slide_num,
|
||||
"type": "content",
|
||||
"title": topic["title"],
|
||||
"bullets": topic["key_points"],
|
||||
"data": topic.get("data_points", []),
|
||||
"speaker_notes": topic["speaker_notes"]
|
||||
})
|
||||
slide_num += 1
|
||||
|
||||
# Add subtopic slides if important
|
||||
if topic.get("subtopics") and topic["importance"] > 1.5:
|
||||
for subtopic in topic["subtopics"][:2]: # Max 2 subtopic slides
|
||||
slides.append({
|
||||
"number": slide_num,
|
||||
"type": "content",
|
||||
"title": subtopic["title"],
|
||||
"bullets": subtopic["key_points"],
|
||||
"speaker_notes": f"Deep dive into {subtopic['title']}"
|
||||
})
|
||||
slide_num += 1
|
||||
|
||||
# Data summary slide if we have metrics
|
||||
if self.synthesis["supporting_data"]:
|
||||
slides.append({
|
||||
"number": slide_num,
|
||||
"type": "data_visualization",
|
||||
"title": "Key Metrics",
|
||||
"data_points": self.synthesis["supporting_data"][:8],
|
||||
"chart_type": "dashboard",
|
||||
"speaker_notes": "Summary of key performance indicators"
|
||||
})
|
||||
slide_num += 1
|
||||
|
||||
# Recommendations slide
|
||||
if self.synthesis["recommendations"]:
|
||||
slides.append({
|
||||
"number": slide_num,
|
||||
"type": "recommendations",
|
||||
"title": "Recommendations",
|
||||
"items": self.synthesis["recommendations"][:5],
|
||||
"speaker_notes": "Proposed next steps based on research findings"
|
||||
})
|
||||
slide_num += 1
|
||||
|
||||
# Thank you / Questions slide
|
||||
slides.append({
|
||||
"number": slide_num,
|
||||
"type": "closing",
|
||||
"title": "Thank You",
|
||||
"subtitle": "Questions & Discussion",
|
||||
"speaker_notes": "Open floor for questions and discussion"
|
||||
})
|
||||
|
||||
self.synthesis["slide_plan"] = slides
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Synthesize research content into presentation structure"
|
||||
)
|
||||
parser.add_argument(
|
||||
"research_file",
|
||||
help="Input research JSON file"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--output",
|
||||
default="synthesis.json",
|
||||
help="Output synthesis JSON file"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--max-slides",
|
||||
type=int,
|
||||
default=15,
|
||||
help="Maximum number of slides (default: 15)"
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
print(f"🔍 Synthesizing content from: {args.research_file}")
|
||||
|
||||
# Load research data
|
||||
with open(args.research_file, 'r', encoding='utf-8') as f:
|
||||
research_data = json.load(f)
|
||||
|
||||
# Synthesize content
|
||||
synthesizer = ContentSynthesizer(research_data)
|
||||
synthesis = synthesizer.synthesize()
|
||||
|
||||
# Limit slides if specified
|
||||
if args.max_slides and len(synthesis["slide_plan"]) > args.max_slides:
|
||||
synthesis["slide_plan"] = synthesis["slide_plan"][:args.max_slides]
|
||||
|
||||
# Save synthesis
|
||||
with open(args.output, 'w', encoding='utf-8') as f:
|
||||
json.dump(synthesis, f, indent=2, ensure_ascii=False)
|
||||
|
||||
print(f"✅ Synthesis saved to: {args.output}")
|
||||
print(f"📊 Generated plan for {len(synthesis['slide_plan'])} slides")
|
||||
print(f"🎯 Identified {len(synthesis['key_topics'])} key topics")
|
||||
print(f"📝 Created {len(synthesis['agenda_items'])} agenda items")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
235
ourdigital-custom-skills/04-seo-gateway-strategist/README.md
Normal file
235
ourdigital-custom-skills/04-seo-gateway-strategist/README.md
Normal file
@@ -0,0 +1,235 @@
|
||||
# SEO Gateway Page Strategist Skill
|
||||
|
||||
## Overview
|
||||
A comprehensive Claude Skill for creating SEO-focused gateway page strategies optimized for Korean medical and service websites, with specific optimization for both Naver and Google.
|
||||
|
||||
## Installation
|
||||
|
||||
1. Download and extract the skill package
|
||||
2. In Claude Desktop, go to Settings > Skills
|
||||
3. Click "Add Skill" and select the folder
|
||||
4. The skill will be available in your conversations
|
||||
|
||||
## File Structure
|
||||
```
|
||||
seo-gateway-strategist/
|
||||
├── SKILL.md # Main skill definition
|
||||
├── README.md # This file
|
||||
├── scripts/
|
||||
│ ├── keyword_analyzer.py # Keyword research automation
|
||||
│ └── requirements.txt # Python dependencies
|
||||
├── templates/
|
||||
│ ├── keyword-research-template.md
|
||||
│ ├── content-architecture-template.md
|
||||
│ └── seo-checklist-template.md
|
||||
└── examples/
|
||||
└── eye-surgery-strategy-example.md
|
||||
```
|
||||
|
||||
## Quick Start
|
||||
|
||||
### Basic Usage
|
||||
Simply ask Claude:
|
||||
```
|
||||
"Use the SEO Gateway Page Strategist skill to create a strategy for [your service]"
|
||||
```
|
||||
|
||||
### Example Prompts
|
||||
```
|
||||
"Create an SEO gateway page strategy for 눈 성형"
|
||||
|
||||
"Use SEO Gateway Page Strategist skill for laser hair removal targeting Gangnam area"
|
||||
|
||||
"Apply the gateway strategist skill for 동안 성형 with competitor analysis"
|
||||
```
|
||||
|
||||
## Features
|
||||
|
||||
### 1. Keyword Research & Analysis
|
||||
- Primary keyword identification
|
||||
- 10+ LSI keyword suggestions
|
||||
- Long-tail keyword generation
|
||||
- Question keywords for FAQs
|
||||
- User intent distribution analysis
|
||||
|
||||
### 2. Content Architecture Planning
|
||||
- Complete H1-H3 hierarchy
|
||||
- Section-by-section word counts
|
||||
- Keyword placement strategy
|
||||
- Internal linking map
|
||||
- Content depth recommendations
|
||||
|
||||
### 3. Technical SEO Specifications
|
||||
- Meta tag templates
|
||||
- Schema markup code
|
||||
- Performance requirements
|
||||
- Mobile optimization guidelines
|
||||
- Core Web Vitals targets
|
||||
|
||||
### 4. Performance Tracking
|
||||
- 30/60/90-day KPI targets
|
||||
- Measurement methodologies
|
||||
- Competitive benchmarking
|
||||
- ROI tracking framework
|
||||
|
||||
## Python Scripts Usage
|
||||
|
||||
### keyword_analyzer.py
|
||||
Automated keyword research and analysis tool.
|
||||
|
||||
#### Installation
|
||||
```bash
|
||||
cd scripts
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
#### Usage
|
||||
```bash
|
||||
python keyword_analyzer.py "눈 성형"
|
||||
```
|
||||
|
||||
#### Output
|
||||
- Keyword analysis report (console)
|
||||
- JSON export file with all data
|
||||
- Strategic recommendations
|
||||
|
||||
## Templates
|
||||
|
||||
### keyword-research-template.md
|
||||
Comprehensive worksheet for keyword planning:
|
||||
- Primary keyword metrics
|
||||
- LSI keyword matrix
|
||||
- Intent distribution
|
||||
- Competitor gaps
|
||||
- Seasonal trends
|
||||
|
||||
### content-architecture-template.md
|
||||
Page structure blueprint:
|
||||
- Complete heading hierarchy
|
||||
- Content blocks with word counts
|
||||
- Keyword density mapping
|
||||
- Schema markup templates
|
||||
|
||||
### seo-checklist-template.md
|
||||
Technical implementation checklist:
|
||||
- Meta tags optimization
|
||||
- Performance requirements
|
||||
- Mobile optimization
|
||||
- Naver-specific elements
|
||||
- Tracking setup
|
||||
|
||||
## Best Practices
|
||||
|
||||
### For Medical Services
|
||||
1. Always verify medical claims compliance
|
||||
2. Include trust signals prominently
|
||||
3. Focus on E-A-T (Expertise, Authority, Trust)
|
||||
4. Use medical schema markup
|
||||
5. Include comprehensive FAQs
|
||||
|
||||
### For Local SEO
|
||||
1. Include location modifiers in keywords
|
||||
2. Optimize for "near me" searches
|
||||
3. Add local business schema
|
||||
4. Create location-specific content
|
||||
5. Build local citations
|
||||
|
||||
### For Naver Optimization
|
||||
1. Keep titles under 30 Korean characters
|
||||
2. Optimize image-to-text ratio (40:60)
|
||||
3. Minimize outbound links
|
||||
4. Focus on brand searches
|
||||
5. Integrate Naver Blog content
|
||||
|
||||
## Customization
|
||||
|
||||
### Industry Adaptation
|
||||
Replace medical-specific terms with your industry:
|
||||
- Medical → Your Industry
|
||||
- 시술 → Service/Product
|
||||
- 전문의 → Specialist/Expert
|
||||
- 클리닉 → Business Name
|
||||
|
||||
### Language Settings
|
||||
The skill supports:
|
||||
- Korean (primary)
|
||||
- English
|
||||
- Bilingual optimization
|
||||
|
||||
### Market Specifics
|
||||
Adjust for your market:
|
||||
- Change location references
|
||||
- Update competitor examples
|
||||
- Modify pricing strategies
|
||||
- Adapt cultural considerations
|
||||
|
||||
## Integration Points
|
||||
|
||||
### Analytics Tools
|
||||
- Google Analytics 4
|
||||
- Google Search Console
|
||||
- Naver Analytics
|
||||
- Naver Webmaster Tools
|
||||
|
||||
### CMS Platforms
|
||||
- WordPress
|
||||
- Ghost
|
||||
- Strapi
|
||||
- Custom CMS
|
||||
|
||||
### Marketing Tools
|
||||
- SEMrush
|
||||
- Ahrefs
|
||||
- Screaming Frog
|
||||
- PageSpeed Insights
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
**Q: The skill isn't appearing in Claude**
|
||||
A: Ensure the SKILL.md file is in the root folder and restart Claude Desktop
|
||||
|
||||
**Q: Python script not working**
|
||||
A: Check Python 3.7+ is installed and dependencies are met
|
||||
|
||||
**Q: Keywords seem generic**
|
||||
A: Provide more specific context about your market and competitors
|
||||
|
||||
## Updates
|
||||
|
||||
### Version History
|
||||
- v1.0.0 (2024-12-28): Initial release
|
||||
- Complete keyword research system
|
||||
- Content architecture planning
|
||||
- Technical SEO checklist
|
||||
- Korean market optimization
|
||||
|
||||
### Planned Features
|
||||
- [ ] AI-powered competitor analysis
|
||||
- [ ] Automated content generation
|
||||
- [ ] Real-time SERP tracking
|
||||
- [ ] Multi-language support
|
||||
- [ ] API integrations
|
||||
|
||||
## Support
|
||||
|
||||
### Documentation
|
||||
- Full examples in `/examples/` folder
|
||||
- Templates in `/templates/` folder
|
||||
- Skill documentation in `SKILL.md`
|
||||
|
||||
### Feedback
|
||||
Please provide feedback to improve this skill:
|
||||
- What features would you like added?
|
||||
- What industries need specific templates?
|
||||
- What integrations would be helpful?
|
||||
|
||||
## License
|
||||
This skill is provided as-is for use with Claude Desktop. Feel free to modify and adapt for your specific needs.
|
||||
|
||||
---
|
||||
|
||||
**Created by**: OurDigital SEO Team
|
||||
**Last Updated**: December 28, 2024
|
||||
**Version**: 1.0.0
|
||||
159
ourdigital-custom-skills/04-seo-gateway-strategist/SKILL.md
Normal file
159
ourdigital-custom-skills/04-seo-gateway-strategist/SKILL.md
Normal file
@@ -0,0 +1,159 @@
|
||||
---
|
||||
name: seo-gateway-strategist
|
||||
version: 1.0.0
|
||||
description: Creates comprehensive SEO-focused gateway page strategies for Korean medical/service websites
|
||||
license: OurDigital internal-use ONLY
|
||||
---
|
||||
|
||||
# SEO Gateway Page Strategist
|
||||
|
||||
This skill helps you create comprehensive SEO-focused gateway page strategies for Korean medical/service websites, optimized for both Naver and Google.
|
||||
|
||||
## Core Competencies
|
||||
|
||||
1. **Keyword Research & Analysis**: Identifies primary and LSI keywords with search intent mapping
|
||||
2. **Content Architecture**: Creates hierarchical page structure optimized for SEO
|
||||
3. **Technical SEO Planning**: Defines specific technical requirements and meta optimizations
|
||||
4. **Performance Targeting**: Sets measurable KPIs and tracking methodologies
|
||||
5. **Competitor Analysis**: Analyzes top-ranking competitors for gap identification
|
||||
|
||||
## When to Use This Skill
|
||||
|
||||
Use this skill when:
|
||||
- Planning a new gateway page for any service/procedure category
|
||||
- Restructuring existing pages for better SEO performance
|
||||
- Conducting keyword research for content planning
|
||||
- Setting SEO performance targets and KPIs
|
||||
- Analyzing competitor strategies
|
||||
|
||||
## Instructions
|
||||
|
||||
When using this skill, provide:
|
||||
1. **Service/Procedure Name**: The main topic for the gateway page (e.g., "눈 성형", "이마 성형")
|
||||
2. **Target Market**: Location and demographic information
|
||||
3. **Current Performance** (optional): Existing rankings, traffic data if available
|
||||
4. **Competitor URLs** (optional): Known competitors to analyze
|
||||
|
||||
## Process Workflow
|
||||
|
||||
### Step 1: Keyword & Intent Analysis
|
||||
```python
|
||||
# The skill will generate:
|
||||
- Primary keyword with monthly search volume
|
||||
- 7-10 LSI (Latent Semantic Indexing) keywords
|
||||
- User intent distribution (Informational/Comparative/Transactional)
|
||||
- Top 3 competitor analysis
|
||||
```
|
||||
|
||||
### Step 2: Content Architecture
|
||||
The skill creates a complete H1-H3 structure with keyword placement strategy:
|
||||
```
|
||||
H1: [Primary keyword-optimized headline]
|
||||
├── Hero Section
|
||||
├── Problem/Solution Framework
|
||||
├── Service Categories
|
||||
├── Trust & Authority
|
||||
├── FAQ Section
|
||||
└── Consultation Guide
|
||||
```
|
||||
|
||||
### Step 3: Technical SEO Requirements
|
||||
Generates specific technical specifications:
|
||||
- Meta tags formulas and character limits
|
||||
- Schema markup recommendations
|
||||
- Internal linking strategy
|
||||
- Image optimization guidelines
|
||||
- Core Web Vitals targets
|
||||
|
||||
### Step 4: Performance Metrics
|
||||
Sets 30/60/90-day KPIs with tracking methodology
|
||||
|
||||
## Example Usage
|
||||
|
||||
### Basic Request:
|
||||
```
|
||||
"Create an SEO gateway page strategy for 눈 성형"
|
||||
```
|
||||
|
||||
### Detailed Request:
|
||||
```
|
||||
"Create an SEO gateway page strategy for 눈 성형 targeting women aged 25-45 in Gangnam.
|
||||
Current ranking: page 2 for main keyword.
|
||||
Competitor: www.example-clinic.com/eye-surgery"
|
||||
```
|
||||
|
||||
## Output Format
|
||||
|
||||
The skill delivers a structured report containing:
|
||||
|
||||
1. **Keyword Strategy Table**
|
||||
- Primary and LSI keywords with search volumes
|
||||
- User intent percentages
|
||||
- Competitor gap analysis
|
||||
|
||||
2. **Content Architecture Document**
|
||||
- Complete page hierarchy (H1-H3)
|
||||
- Word count targets per section
|
||||
- Keyword placement map
|
||||
|
||||
3. **Technical SEO Checklist**
|
||||
- Meta tag templates
|
||||
- Schema markup code
|
||||
- Performance requirements
|
||||
|
||||
4. **Performance Dashboard**
|
||||
- Current baseline metrics
|
||||
- Target KPIs with timeline
|
||||
- Tracking methodology
|
||||
|
||||
## Templates Included
|
||||
|
||||
- `keyword-research-template.md`: Keyword analysis worksheet
|
||||
- `content-architecture-template.md`: Page structure template
|
||||
- `seo-checklist-template.md`: Technical SEO requirements
|
||||
- `performance-tracking-template.md`: KPI tracking sheet
|
||||
|
||||
## Scripts Included
|
||||
|
||||
- `keyword_analyzer.py`: Automates keyword research and intent analysis
|
||||
- `competitor_analyzer.py`: Scrapes and analyzes competitor pages
|
||||
- `seo_scorer.py`: Calculates SEO optimization score
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Mobile-First Approach**: Always optimize for mobile (70%+ traffic in Korea)
|
||||
2. **Naver vs Google**: Consider platform-specific optimization differences
|
||||
3. **Local SEO**: Include location modifiers for local intent
|
||||
4. **Medical Compliance**: Ensure content meets Korean medical advertising regulations
|
||||
5. **User Intent Matching**: Align content with search intent distribution
|
||||
|
||||
## Common Patterns
|
||||
|
||||
### For Medical Services:
|
||||
```
|
||||
Primary: [시술명]
|
||||
LSI: [시술명 비용], [시술명 부작용], [시술명 회복기간], [시술명 전후]
|
||||
Intent: 60% Informational, 30% Comparative, 10% Transactional
|
||||
```
|
||||
|
||||
### For Local Services:
|
||||
```
|
||||
Primary: [지역] [서비스명]
|
||||
LSI: [지역] [서비스명] 추천, [지역] [서비스명] 잘하는곳, [지역] [서비스명] 가격
|
||||
Intent: 40% Informational, 40% Comparative, 20% Transactional
|
||||
```
|
||||
|
||||
## Integration Points
|
||||
|
||||
This skill integrates with:
|
||||
- Google Search Console for current performance data
|
||||
- Naver Webmaster Tools for Naver-specific metrics
|
||||
- Analytics platforms for user behavior data
|
||||
- Keyword research tools APIs
|
||||
|
||||
## Notes
|
||||
|
||||
- Always validate keyword search volumes with actual tools
|
||||
- Consider seasonal trends in search behavior
|
||||
- Update strategy based on algorithm changes
|
||||
- Monitor competitor movements regularly
|
||||
@@ -0,0 +1,284 @@
|
||||
# SEO Gateway Page Strategy: 눈 성형
|
||||
**Generated by SEO Gateway Page Strategist Skill**
|
||||
**Date:** 2024-12-28
|
||||
**Target Market:** Gangnam, Seoul - Women 25-45
|
||||
|
||||
---
|
||||
|
||||
## 1. Keyword Strategy Analysis
|
||||
|
||||
### Primary Keyword Research
|
||||
| Metric | Value | Analysis |
|
||||
|--------|-------|----------|
|
||||
| **Primary Keyword** | 눈 성형 | High-volume medical keyword |
|
||||
| **Monthly Search Volume** | 12,000 | Excellent traffic potential |
|
||||
| **Keyword Difficulty** | 65/100 | Moderate-high competition |
|
||||
| **CPC** | ₩2,500 | High commercial intent |
|
||||
| **Trend** | ↑ 15% YoY | Growing interest |
|
||||
|
||||
### LSI Keywords Matrix
|
||||
| LSI Keyword | Monthly Volume | Intent Type | Implementation Priority |
|
||||
|------------|---------------|-------------|------------------------|
|
||||
| 쌍꺼풀 수술 | 8,000 | Transactional | High - Sub-category page |
|
||||
| 눈매교정 | 5,500 | Informational | High - Sub-category page |
|
||||
| 앞트임 | 4,000 | Informational | High - Sub-category page |
|
||||
| 뒤트임 | 3,500 | Informational | Medium - Sub-category |
|
||||
| 눈 성형 비용 | 2,000 | Comparative | High - FAQ section |
|
||||
| 눈 성형 부작용 | 1,500 | Informational | High - FAQ section |
|
||||
| 눈 성형 회복기간 | 1,800 | Informational | High - Process section |
|
||||
| 눈 성형 전후 | 3,000 | Comparative | High - Gallery section |
|
||||
| 강남 눈 성형 | 2,200 | Local | High - Hero/title |
|
||||
| 눈 성형 잘하는곳 | 2,200 | Comparative | High - Trust section |
|
||||
|
||||
### User Intent Distribution
|
||||
```
|
||||
Informational (Research): 55%
|
||||
- Users researching procedures, risks, recovery
|
||||
- Content needed: Educational guides, process explanations, FAQs
|
||||
|
||||
Comparative (Evaluation): 35%
|
||||
- Users comparing clinics, prices, results
|
||||
- Content needed: Before/after gallery, reviews, differentiators
|
||||
|
||||
Transactional (Booking): 10%
|
||||
- Users ready to book consultation
|
||||
- Content needed: Clear CTAs, contact forms, pricing info
|
||||
```
|
||||
|
||||
### Competitor Analysis
|
||||
| Competitor | Domain Authority | Target Keywords | Content Gap Opportunities |
|
||||
|-----------|-----------------|-----------------|--------------------------|
|
||||
| Competitor A | 45 | 눈 성형, 쌍꺼풀 | Lacks detailed recovery guide |
|
||||
| Competitor B | 52 | 강남 눈 성형 | No video content |
|
||||
| Competitor C | 38 | 눈 성형 비용 | Limited trust signals |
|
||||
|
||||
---
|
||||
|
||||
## 2. Content Architecture
|
||||
|
||||
```
|
||||
H1: 강남 눈 성형 전문의가 디자인하는 자연스러운 눈매
|
||||
│
|
||||
├── Hero Section [100-150 words]
|
||||
│ ├── Value Proposition: "15년 경력 전문의가 만드는 당신만의 아름다운 눈매"
|
||||
│ ├── Trust Signals:
|
||||
│ │ • 보건복지부 인증 의료기관
|
||||
│ │ • 10,000+ 성공 사례
|
||||
│ │ • 대한성형외과학회 정회원
|
||||
│ │ • 2024 의료서비스 대상 수상
|
||||
│ └── Primary CTA: "무료 상담 신청하기"
|
||||
│
|
||||
├── H2: 눈 성형, 이런 고민이 있으신가요? [200-250 words]
|
||||
│ ├── H3: 작고 답답한 눈매로 인한 스트레스
|
||||
│ ├── H3: 나이들어 보이는 처진 눈꺼풀
|
||||
│ └── H3: 좌우 비대칭으로 인한 불균형
|
||||
│
|
||||
├── H2: 제이미클리닉 눈 성형 종류 [400-500 words]
|
||||
│ ├── H3: 자연스러운 쌍꺼풀 성형 - 매몰법 & 절개법
|
||||
│ │ ├── Description (100 words)
|
||||
│ │ ├── 시술시간: 30-60분
|
||||
│ │ ├── 회복기간: 5-10일
|
||||
│ │ └── CTA: "쌍꺼풀 자세히 보기"
|
||||
│ │
|
||||
│ ├── H3: 또렷한 눈매교정술
|
||||
│ │ ├── Description (100 words)
|
||||
│ │ ├── 시술시간: 45분
|
||||
│ │ ├── 회복기간: 7일
|
||||
│ │ └── CTA: "눈매교정 자세히 보기"
|
||||
│ │
|
||||
│ ├── H3: 시원한 앞트임 & 뒤트임
|
||||
│ │ ├── Description (100 words)
|
||||
│ │ ├── 시술시간: 30-45분
|
||||
│ │ ├── 회복기간: 5-7일
|
||||
│ │ └── CTA: "트임 수술 자세히 보기"
|
||||
│ │
|
||||
│ └── H3: 상안검 & 하안검 성형
|
||||
│ ├── Description (100 words)
|
||||
│ ├── 시술시간: 60-90분
|
||||
│ ├── 회복기간: 10-14일
|
||||
│ └── CTA: "안검 성형 자세히 보기"
|
||||
│
|
||||
├── H2: 제이미클리닉만의 차별점 [300-350 words]
|
||||
│ ├── H3: 전문 의료진의 노하우
|
||||
│ ├── H3: 1:1 맞춤 디자인 시스템
|
||||
│ └── H3: 최신 장비와 안전 시스템
|
||||
│
|
||||
├── H2: 눈 성형 자주 묻는 질문 (FAQ) [500-600 words]
|
||||
│ ├── Q: 눈 성형 비용은 얼마인가요?
|
||||
│ ├── Q: 눈 성형 회복기간은 얼마나 걸리나요?
|
||||
│ ├── Q: 눈 성형 부작용은 없나요?
|
||||
│ ├── Q: 쌍꺼풀 라인은 어떻게 결정하나요?
|
||||
│ ├── Q: 재수술도 가능한가요?
|
||||
│ ├── Q: 나이 제한이 있나요?
|
||||
│ └── Q: 수술 후 일상생활은 언제부터 가능한가요?
|
||||
│
|
||||
├── H2: 눈 성형 시술 과정 [250-300 words]
|
||||
│ ├── H3: STEP 1. 1:1 맞춤 상담
|
||||
│ ├── H3: STEP 2. 정밀 검사 및 디자인
|
||||
│ ├── H3: STEP 3. 안전한 수술 진행
|
||||
│ └── H3: STEP 4. 체계적인 사후 관리
|
||||
│
|
||||
├── H2: 실제 고객 후기 및 전후 사진 [200-250 words]
|
||||
│ ├── Review snippets (3-5)
|
||||
│ ├── Before/After gallery teaser
|
||||
│ └── CTA: "더 많은 후기 보기"
|
||||
│
|
||||
└── H2: 상담 예약 안내 [150-200 words]
|
||||
├── H3: 온라인 상담 예약
|
||||
├── H3: 오시는 길
|
||||
└── H3: 문의: 02-1234-5678
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Technical SEO Requirements
|
||||
|
||||
### Meta Tags
|
||||
```html
|
||||
<title>강남 눈 성형 전문 - 자연스러운 눈매 디자인 | 제이미클리닉</title>
|
||||
<meta name="description" content="강남 눈 성형 15년 전문의가 만드는 자연스러운 눈매. 쌍꺼풀, 눈매교정, 트임 수술 10,000건 이상. 무료상담 ☎ 02-1234-5678">
|
||||
<meta name="keywords" content="눈 성형, 강남 눈 성형, 쌍꺼풀 수술, 눈매교정, 앞트임, 뒤트임">
|
||||
```
|
||||
|
||||
### Schema Markup
|
||||
```json
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "MedicalProcedure",
|
||||
"name": "눈 성형",
|
||||
"procedureType": "Cosmetic",
|
||||
"bodyLocation": "Eye",
|
||||
"outcome": "Enhanced eye appearance with natural-looking results",
|
||||
"preparation": "Consultation and design planning required",
|
||||
"followup": "Regular check-ups for 3 months",
|
||||
"provider": {
|
||||
"@type": "MedicalOrganization",
|
||||
"name": "제이미클리닉",
|
||||
"address": {
|
||||
"@type": "PostalAddress",
|
||||
"streetAddress": "테헤란로 123",
|
||||
"addressLocality": "강남구",
|
||||
"addressRegion": "서울특별시",
|
||||
"addressCountry": "KR"
|
||||
},
|
||||
"telephone": "+82-2-1234-5678"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Internal Linking Strategy
|
||||
| From Section | To Page | Anchor Text | Priority |
|
||||
|-------------|---------|-------------|----------|
|
||||
| 쌍꺼풀 section | /double-eyelid | "쌍꺼풀 자세히 보기" | High |
|
||||
| FAQ 비용 | /pricing | "자세한 비용 안내" | High |
|
||||
| 의료진 section | /doctors | "전문의 프로필 보기" | Medium |
|
||||
| 후기 section | /reviews | "더 많은 후기 보기" | Medium |
|
||||
| 상담 section | /consultation | "온라인 상담 신청" | High |
|
||||
|
||||
### Performance Targets
|
||||
- Page Load Speed: < 2.5 seconds
|
||||
- Mobile Score: > 95/100
|
||||
- Core Web Vitals: All green
|
||||
- Image Optimization: WebP format, < 150KB each
|
||||
|
||||
---
|
||||
|
||||
## 4. Performance KPIs & Tracking
|
||||
|
||||
### 30-Day Targets
|
||||
| Metric | Current | 30-Day Target | Measurement Tool |
|
||||
|--------|---------|---------------|------------------|
|
||||
| Primary Keyword Ranking | #8 | #5 | Search Console |
|
||||
| Organic Traffic | 500/month | 750/month | GA4 |
|
||||
| Bounce Rate | 65% | 55% | GA4 |
|
||||
| Avg. Time on Page | 1:30 | 2:30 | GA4 |
|
||||
| Conversion Rate | 1.5% | 2.5% | GA4 Goals |
|
||||
|
||||
### 60-Day Targets
|
||||
| Metric | Target | Strategy |
|
||||
|--------|--------|----------|
|
||||
| Primary Keyword Ranking | #3 | Content expansion + backlinks |
|
||||
| Organic Traffic | 1,200/month | Long-tail optimization |
|
||||
| Featured Snippets | 2+ | FAQ schema implementation |
|
||||
| Page Authority | 25+ | Link building campaign |
|
||||
|
||||
### 90-Day Targets
|
||||
| Metric | Target | Success Indicator |
|
||||
|--------|--------|-------------------|
|
||||
| Primary Keyword Ranking | #1-3 | Page 1 dominant position |
|
||||
| Organic Traffic | 2,000/month | 300% increase |
|
||||
| Conversion Rate | 3-5% | Industry-leading performance |
|
||||
| Revenue Attribution | ₩50M+ | Positive ROI |
|
||||
|
||||
---
|
||||
|
||||
## 5. Implementation Roadmap
|
||||
|
||||
### Week 1: Foundation
|
||||
- [ ] Implement title and meta tags
|
||||
- [ ] Create H1 and basic structure
|
||||
- [ ] Optimize hero section
|
||||
- [ ] Set up tracking codes
|
||||
|
||||
### Week 2: Content Development
|
||||
- [ ] Write all H2 sections
|
||||
- [ ] Create FAQ content
|
||||
- [ ] Develop procedure descriptions
|
||||
- [ ] Add trust signals
|
||||
|
||||
### Week 3: Technical Optimization
|
||||
- [ ] Implement schema markup
|
||||
- [ ] Optimize images
|
||||
- [ ] Set up internal linking
|
||||
- [ ] Mobile optimization
|
||||
|
||||
### Week 4: Enhancement
|
||||
- [ ] Add reviews and testimonials
|
||||
- [ ] Create before/after gallery
|
||||
- [ ] Implement CTA variations
|
||||
- [ ] A/B testing setup
|
||||
|
||||
### Month 2-3: Growth
|
||||
- [ ] Content expansion based on data
|
||||
- [ ] Link building outreach
|
||||
- [ ] Naver optimization
|
||||
- [ ] Conversion rate optimization
|
||||
|
||||
---
|
||||
|
||||
## 6. Strategic Recommendations
|
||||
|
||||
### High Priority Actions
|
||||
1. **Content Depth**: Create comprehensive 2,500+ word content to outrank competitors
|
||||
2. **E-A-T Signals**: Emphasize doctor credentials and certifications prominently
|
||||
3. **Local SEO**: Optimize for "강남 눈 성형" with location-specific content
|
||||
4. **Mobile UX**: Ensure thumb-friendly CTAs and fast mobile load times
|
||||
|
||||
### Quick Wins (Implement Immediately)
|
||||
1. Add FAQ schema markup for featured snippets
|
||||
2. Compress and optimize all images
|
||||
3. Add trust badges above fold
|
||||
4. Implement click-to-call for mobile
|
||||
5. Create location-specific landing pages
|
||||
|
||||
### Long-term Strategy
|
||||
1. Build topical authority with supporting content
|
||||
2. Develop video content for higher engagement
|
||||
3. Create interactive tools (virtual consultation)
|
||||
4. Establish thought leadership through blog
|
||||
5. Implement review generation system
|
||||
|
||||
---
|
||||
|
||||
## Notes for Implementation
|
||||
|
||||
- **Legal Compliance**: Ensure all medical claims are verified and compliant with KFDA regulations
|
||||
- **Image Rights**: Use only authorized before/after photos with patient consent
|
||||
- **Pricing Display**: Follow Korean medical advertising laws regarding price disclosure
|
||||
- **Mobile First**: With 70% mobile traffic, prioritize mobile experience in all decisions
|
||||
- **Naver Specific**: Create separate content strategy for Naver Blog integration
|
||||
|
||||
---
|
||||
|
||||
**End of Strategy Document**
|
||||
*Generated by SEO Gateway Page Strategist Skill v1.0*
|
||||
@@ -0,0 +1,316 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Keyword Analyzer for SEO Gateway Pages
|
||||
Analyzes keywords and generates SEO strategy recommendations
|
||||
"""
|
||||
|
||||
import json
|
||||
from typing import Dict, List, Tuple
|
||||
from dataclasses import dataclass
|
||||
from datetime import datetime
|
||||
|
||||
@dataclass
|
||||
class KeywordData:
|
||||
"""Data structure for keyword information"""
|
||||
keyword: str
|
||||
search_volume: int
|
||||
difficulty: float
|
||||
intent: str
|
||||
cpc: float = 0.0
|
||||
trend: str = "stable"
|
||||
|
||||
class KeywordAnalyzer:
|
||||
"""Analyzes keywords for SEO gateway pages"""
|
||||
|
||||
def __init__(self, primary_keyword: str):
|
||||
self.primary_keyword = primary_keyword
|
||||
self.results = {
|
||||
"primary": None,
|
||||
"lsi": [],
|
||||
"long_tail": [],
|
||||
"questions": [],
|
||||
"intent_distribution": {},
|
||||
"recommendations": []
|
||||
}
|
||||
|
||||
def analyze_primary_keyword(self) -> KeywordData:
|
||||
"""
|
||||
Analyzes the primary keyword
|
||||
In production, this would call actual keyword research APIs
|
||||
"""
|
||||
# Simulated data - replace with actual API calls
|
||||
keyword_data = {
|
||||
"눈 성형": {"volume": 12000, "difficulty": 65, "intent": "informational", "cpc": 2500},
|
||||
"이마 성형": {"volume": 5500, "difficulty": 55, "intent": "informational", "cpc": 3000},
|
||||
"동안 성형": {"volume": 8000, "difficulty": 70, "intent": "comparative", "cpc": 2800},
|
||||
}
|
||||
|
||||
data = keyword_data.get(self.primary_keyword, {
|
||||
"volume": 1000,
|
||||
"difficulty": 50,
|
||||
"intent": "informational",
|
||||
"cpc": 1000
|
||||
})
|
||||
|
||||
self.results["primary"] = KeywordData(
|
||||
keyword=self.primary_keyword,
|
||||
search_volume=data["volume"],
|
||||
difficulty=data["difficulty"],
|
||||
intent=data["intent"],
|
||||
cpc=data["cpc"]
|
||||
)
|
||||
|
||||
return self.results["primary"]
|
||||
|
||||
def generate_lsi_keywords(self) -> List[KeywordData]:
|
||||
"""Generates LSI (Latent Semantic Indexing) keywords"""
|
||||
|
||||
lsi_patterns = {
|
||||
"눈 성형": [
|
||||
("쌍꺼풀 수술", 8000, "transactional"),
|
||||
("눈매교정", 5500, "informational"),
|
||||
("앞트임", 4000, "informational"),
|
||||
("뒤트임", 3500, "informational"),
|
||||
("눈 성형 비용", 2000, "comparative"),
|
||||
("눈 성형 부작용", 1500, "informational"),
|
||||
("눈 성형 회복기간", 1800, "informational"),
|
||||
("눈 성형 전후", 3000, "comparative"),
|
||||
("남자 눈 성형", 2500, "informational"),
|
||||
("눈 성형 잘하는곳", 2200, "comparative")
|
||||
],
|
||||
"이마 성형": [
|
||||
("이마거상술", 3000, "informational"),
|
||||
("이마축소술", 2500, "informational"),
|
||||
("헤어라인교정", 4000, "transactional"),
|
||||
("이마 성형 비용", 1200, "comparative"),
|
||||
("이마 보톡스", 6000, "transactional"),
|
||||
("M자 탈모 수술", 5000, "informational"),
|
||||
("이마 필러", 4500, "transactional"),
|
||||
("이마 성형 부작용", 800, "informational"),
|
||||
("이마 리프팅", 3500, "comparative"),
|
||||
("이마 주름 제거", 2800, "transactional")
|
||||
],
|
||||
"동안 성형": [
|
||||
("안면 리프팅", 7000, "transactional"),
|
||||
("실리프팅", 9000, "transactional"),
|
||||
("보톡스 시술", 15000, "transactional"),
|
||||
("필러 시술", 12000, "transactional"),
|
||||
("동안 성형 비용", 2500, "comparative"),
|
||||
("울쎄라", 8000, "comparative"),
|
||||
("써마지", 6500, "comparative"),
|
||||
("동안 시술 종류", 1800, "informational"),
|
||||
("주름 제거 시술", 4000, "transactional"),
|
||||
("동안 성형 추천", 2200, "comparative")
|
||||
]
|
||||
}
|
||||
|
||||
lsi_list = lsi_patterns.get(self.primary_keyword, [
|
||||
(f"{self.primary_keyword} 비용", 1000, "comparative"),
|
||||
(f"{self.primary_keyword} 부작용", 800, "informational"),
|
||||
(f"{self.primary_keyword} 후기", 1200, "comparative"),
|
||||
])
|
||||
|
||||
for keyword, volume, intent in lsi_list:
|
||||
self.results["lsi"].append(KeywordData(
|
||||
keyword=keyword,
|
||||
search_volume=volume,
|
||||
difficulty=45 + (volume/1000), # Simple difficulty calculation
|
||||
intent=intent
|
||||
))
|
||||
|
||||
return self.results["lsi"]
|
||||
|
||||
def generate_long_tail_keywords(self) -> List[str]:
|
||||
"""Generates long-tail keyword variations"""
|
||||
|
||||
location_modifiers = ["강남", "신사", "청담", "압구정", "서울"]
|
||||
action_modifiers = ["잘하는곳", "추천", "유명한", "전문", "비용"]
|
||||
|
||||
long_tails = []
|
||||
for location in location_modifiers:
|
||||
long_tails.append(f"{location} {self.primary_keyword}")
|
||||
for action in action_modifiers[:2]: # Limit combinations
|
||||
long_tails.append(f"{location} {self.primary_keyword} {action}")
|
||||
|
||||
self.results["long_tail"] = long_tails
|
||||
return long_tails
|
||||
|
||||
def generate_question_keywords(self) -> List[str]:
|
||||
"""Generates question-based keywords for featured snippets"""
|
||||
|
||||
question_templates = [
|
||||
f"{self.primary_keyword} 비용은 얼마인가요?",
|
||||
f"{self.primary_keyword} 회복기간은 얼마나 걸리나요?",
|
||||
f"{self.primary_keyword} 부작용이 있나요?",
|
||||
f"{self.primary_keyword} 통증이 심한가요?",
|
||||
f"{self.primary_keyword} 효과는 얼마나 지속되나요?",
|
||||
f"{self.primary_keyword} 나이 제한이 있나요?",
|
||||
f"{self.primary_keyword} 후 주의사항은 무엇인가요?"
|
||||
]
|
||||
|
||||
self.results["questions"] = question_templates
|
||||
return question_templates
|
||||
|
||||
def calculate_intent_distribution(self) -> Dict[str, float]:
|
||||
"""Calculates user intent distribution across keywords"""
|
||||
|
||||
intent_counts = {
|
||||
"informational": 0,
|
||||
"comparative": 0,
|
||||
"transactional": 0,
|
||||
"navigational": 0
|
||||
}
|
||||
|
||||
# Count primary keyword intent
|
||||
if self.results["primary"]:
|
||||
intent_counts[self.results["primary"].intent] += self.results["primary"].search_volume
|
||||
|
||||
# Count LSI keyword intents
|
||||
for kw in self.results["lsi"]:
|
||||
intent_counts[kw.intent] += kw.search_volume
|
||||
|
||||
# Calculate percentages
|
||||
total_volume = sum(intent_counts.values())
|
||||
if total_volume > 0:
|
||||
self.results["intent_distribution"] = {
|
||||
intent: round((count/total_volume) * 100, 1)
|
||||
for intent, count in intent_counts.items()
|
||||
if count > 0
|
||||
}
|
||||
|
||||
return self.results["intent_distribution"]
|
||||
|
||||
def generate_recommendations(self) -> List[str]:
|
||||
"""Generates SEO recommendations based on analysis"""
|
||||
|
||||
recommendations = []
|
||||
|
||||
# Based on search volume
|
||||
if self.results["primary"] and self.results["primary"].search_volume > 10000:
|
||||
recommendations.append("High search volume detected - prioritize this page for development")
|
||||
|
||||
# Based on intent distribution
|
||||
intent_dist = self.results["intent_distribution"]
|
||||
if intent_dist.get("informational", 0) > 50:
|
||||
recommendations.append("Focus on educational content and comprehensive guides")
|
||||
if intent_dist.get("comparative", 0) > 30:
|
||||
recommendations.append("Include comparison tables and competitive differentiators")
|
||||
if intent_dist.get("transactional", 0) > 20:
|
||||
recommendations.append("Optimize conversion elements and CTAs above the fold")
|
||||
|
||||
# Based on competition
|
||||
if self.results["primary"] and self.results["primary"].difficulty > 60:
|
||||
recommendations.append("High competition - invest in quality content and backlinks")
|
||||
recommendations.append("Target long-tail keywords for quicker wins")
|
||||
|
||||
# Question keywords
|
||||
if len(self.results["questions"]) > 5:
|
||||
recommendations.append("Implement FAQ schema markup for featured snippets")
|
||||
|
||||
self.results["recommendations"] = recommendations
|
||||
return recommendations
|
||||
|
||||
def export_analysis(self, filename: str = None) -> str:
|
||||
"""Exports the analysis results to JSON"""
|
||||
|
||||
if not filename:
|
||||
filename = f"keyword_analysis_{self.primary_keyword.replace(' ', '_')}_{datetime.now().strftime('%Y%m%d')}.json"
|
||||
|
||||
export_data = {
|
||||
"analysis_date": datetime.now().isoformat(),
|
||||
"primary_keyword": self.primary_keyword,
|
||||
"primary_data": {
|
||||
"keyword": self.results["primary"].keyword,
|
||||
"search_volume": self.results["primary"].search_volume,
|
||||
"difficulty": self.results["primary"].difficulty,
|
||||
"intent": self.results["primary"].intent
|
||||
} if self.results["primary"] else None,
|
||||
"lsi_keywords": [
|
||||
{
|
||||
"keyword": kw.keyword,
|
||||
"volume": kw.search_volume,
|
||||
"intent": kw.intent
|
||||
} for kw in self.results["lsi"]
|
||||
],
|
||||
"long_tail_keywords": self.results["long_tail"],
|
||||
"question_keywords": self.results["questions"],
|
||||
"intent_distribution": self.results["intent_distribution"],
|
||||
"recommendations": self.results["recommendations"]
|
||||
}
|
||||
|
||||
with open(filename, 'w', encoding='utf-8') as f:
|
||||
json.dump(export_data, f, ensure_ascii=False, indent=2)
|
||||
|
||||
return filename
|
||||
|
||||
def generate_report(self) -> str:
|
||||
"""Generates a formatted text report"""
|
||||
|
||||
report = f"""
|
||||
# Keyword Analysis Report
|
||||
Generated: {datetime.now().strftime('%Y-%m-%d %H:%M')}
|
||||
|
||||
## Primary Keyword: {self.primary_keyword}
|
||||
- Search Volume: {self.results['primary'].search_volume:,}
|
||||
- Difficulty: {self.results['primary'].difficulty}/100
|
||||
- Primary Intent: {self.results['primary'].intent.capitalize()}
|
||||
|
||||
## LSI Keywords (Top 10)
|
||||
"""
|
||||
for i, kw in enumerate(self.results['lsi'][:10], 1):
|
||||
report += f"{i}. {kw.keyword} - Volume: {kw.search_volume:,} ({kw.intent})\n"
|
||||
|
||||
report += f"\n## User Intent Distribution\n"
|
||||
for intent, percentage in self.results['intent_distribution'].items():
|
||||
report += f"- {intent.capitalize()}: {percentage}%\n"
|
||||
|
||||
report += f"\n## Long-tail Opportunities\n"
|
||||
for keyword in self.results['long_tail'][:5]:
|
||||
report += f"- {keyword}\n"
|
||||
|
||||
report += f"\n## Question Keywords (FAQ Optimization)\n"
|
||||
for question in self.results['questions'][:5]:
|
||||
report += f"- {question}\n"
|
||||
|
||||
report += f"\n## Strategic Recommendations\n"
|
||||
for i, rec in enumerate(self.results['recommendations'], 1):
|
||||
report += f"{i}. {rec}\n"
|
||||
|
||||
return report
|
||||
|
||||
|
||||
def main():
|
||||
"""Main execution function"""
|
||||
import sys
|
||||
|
||||
if len(sys.argv) < 2:
|
||||
print("Usage: python keyword_analyzer.py '키워드'")
|
||||
print("Example: python keyword_analyzer.py '눈 성형'")
|
||||
sys.exit(1)
|
||||
|
||||
keyword = ' '.join(sys.argv[1:])
|
||||
|
||||
print(f"Analyzing keyword: {keyword}")
|
||||
print("-" * 50)
|
||||
|
||||
analyzer = KeywordAnalyzer(keyword)
|
||||
|
||||
# Run analysis
|
||||
analyzer.analyze_primary_keyword()
|
||||
analyzer.generate_lsi_keywords()
|
||||
analyzer.generate_long_tail_keywords()
|
||||
analyzer.generate_question_keywords()
|
||||
analyzer.calculate_intent_distribution()
|
||||
analyzer.generate_recommendations()
|
||||
|
||||
# Generate and print report
|
||||
report = analyzer.generate_report()
|
||||
print(report)
|
||||
|
||||
# Export to JSON
|
||||
filename = analyzer.export_analysis()
|
||||
print(f"\nAnalysis exported to: {filename}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,25 @@
|
||||
# Python dependencies for SEO Gateway Page Strategist scripts
|
||||
# Install with: pip install -r requirements.txt
|
||||
|
||||
# Core dependencies
|
||||
requests>=2.28.0
|
||||
beautifulsoup4>=4.11.0
|
||||
pandas>=1.5.0
|
||||
numpy>=1.23.0
|
||||
|
||||
# For API integrations (optional)
|
||||
google-api-python-client>=2.70.0
|
||||
pytrends>=4.9.0
|
||||
|
||||
# For data visualization (optional)
|
||||
matplotlib>=3.6.0
|
||||
seaborn>=0.12.0
|
||||
|
||||
# For export formats
|
||||
openpyxl>=3.0.0
|
||||
jinja2>=3.1.0
|
||||
|
||||
# Development tools
|
||||
pytest>=7.2.0
|
||||
black>=22.0.0
|
||||
pylint>=2.15.0
|
||||
@@ -0,0 +1,160 @@
|
||||
# Content Architecture Template
|
||||
|
||||
## Page Hierarchy Structure
|
||||
|
||||
```
|
||||
[Page URL: /service-name]
|
||||
│
|
||||
├── H1: [Primary Keyword-Optimized Headline]
|
||||
│ Example: "강남 눈 성형 전문의가 만드는 자연스러운 눈매"
|
||||
│ Word Count Target: 15-25 characters
|
||||
│ Keyword Placement: Primary keyword at beginning
|
||||
│
|
||||
├── Hero Section [Above Fold]
|
||||
│ ├── Value Proposition (30-50 words)
|
||||
│ │ └── Keywords: Primary + 1 LSI
|
||||
│ ├── Trust Signals (3-5 items)
|
||||
│ │ ├── Certification badges
|
||||
│ │ ├── Years of experience
|
||||
│ │ └── Success cases number
|
||||
│ └── Primary CTA
|
||||
│ └── Text: "무료 상담 신청하기"
|
||||
│
|
||||
├── H2: [Service Name] 이란? [Problem/Solution Framework]
|
||||
│ Word Count: 200-300 words
|
||||
│ Keywords: Primary (1x), LSI (2-3x)
|
||||
│ ├── H3: 이런 고민이 있으신가요? [Pain Points]
|
||||
│ │ ├── Pain point 1 (include LSI keyword)
|
||||
│ │ ├── Pain point 2 (include LSI keyword)
|
||||
│ │ └── Pain point 3 (include LSI keyword)
|
||||
│ └── H3: [Clinic Name]의 솔루션 [Benefits]
|
||||
│ ├── Benefit 1 (address pain point 1)
|
||||
│ ├── Benefit 2 (address pain point 2)
|
||||
│ └── Benefit 3 (address pain point 3)
|
||||
│
|
||||
├── H2: [Service Name] 종류 및 방법 [Service Categories]
|
||||
│ Word Count: 400-500 words total
|
||||
│ Keywords: Category-specific LSI keywords
|
||||
│ ├── H3: [Sub-service 1] - [LSI Keyword Variation]
|
||||
│ │ ├── Description (80-100 words)
|
||||
│ │ ├── Best for (target audience)
|
||||
│ │ ├── Duration & Recovery
|
||||
│ │ └── CTA: "자세히 보기"
|
||||
│ ├── H3: [Sub-service 2] - [LSI Keyword Variation]
|
||||
│ │ └── [Same structure as above]
|
||||
│ └── H3: [Sub-service 3] - [LSI Keyword Variation]
|
||||
│ └── [Same structure as above]
|
||||
│
|
||||
├── H2: [Clinic Name] [Service Name]만의 차별점 [Trust & Authority]
|
||||
│ Word Count: 300-400 words
|
||||
│ Keywords: Brand + Primary keyword combinations
|
||||
│ ├── H3: 전문 의료진 [Doctor Credentials]
|
||||
│ │ ├── Doctor profile summary
|
||||
│ │ ├── Specializations
|
||||
│ │ └── Certifications
|
||||
│ ├── H3: 검증된 시술 결과 [Success Metrics]
|
||||
│ │ ├── Number statistics
|
||||
│ │ ├── Success rate
|
||||
│ │ └── Patient satisfaction
|
||||
│ └── H3: 첨단 장비 및 시설 [Facilities]
|
||||
│ ├── Equipment descriptions
|
||||
│ └── Safety protocols
|
||||
│
|
||||
├── H2: [Service Name] 자주 묻는 질문 [FAQ Section]
|
||||
│ Word Count: 500-700 words
|
||||
│ Keywords: Long-tail question keywords
|
||||
│ ├── Q1: [Long-tail keyword as question]?
|
||||
│ │ └── A: [40-60 word answer, keyword in first sentence]
|
||||
│ ├── Q2: [Price-related question]?
|
||||
│ │ └── A: [Include "비용" LSI keyword]
|
||||
│ ├── Q3: [Recovery-related question]?
|
||||
│ │ └── A: [Include "회복기간" LSI keyword]
|
||||
│ ├── Q4: [Side-effect question]?
|
||||
│ │ └── A: [Include "부작용" LSI keyword]
|
||||
│ ├── Q5: [Process question]?
|
||||
│ │ └── A: [Include process-related LSI]
|
||||
│ ├── Q6: [Candidacy question]?
|
||||
│ │ └── A: [Include target audience keywords]
|
||||
│ └── Q7: [Results duration question]?
|
||||
│ └── A: [Include maintenance keywords]
|
||||
│
|
||||
├── H2: [Service Name] 시술 과정 [Process Guide]
|
||||
│ Word Count: 300-400 words
|
||||
│ Keywords: "과정", "단계", procedural LSI
|
||||
│ ├── H3: 상담 및 검사 [Consultation]
|
||||
│ ├── H3: 시술 당일 [Procedure Day]
|
||||
│ ├── H3: 회복 과정 [Recovery]
|
||||
│ └── H3: 사후 관리 [Aftercare]
|
||||
│
|
||||
├── H2: 실제 고객 후기 [Social Proof]
|
||||
│ Word Count: 200-300 words
|
||||
│ Keywords: "후기", "리뷰", satisfaction keywords
|
||||
│ ├── Review snippet 1
|
||||
│ ├── Review snippet 2
|
||||
│ ├── Review snippet 3
|
||||
│ └── Before/After gallery teaser
|
||||
│
|
||||
└── H2: 상담 예약 안내 [Conversion Section]
|
||||
Word Count: 150-200 words
|
||||
Keywords: CTA-related, location keywords
|
||||
├── H3: 상담 예약 방법
|
||||
├── H3: 오시는 길
|
||||
└── H3: 문의 정보
|
||||
```
|
||||
|
||||
## Keyword Density Map
|
||||
|
||||
| Section | Primary Keyword | LSI Keywords | Total Keywords |
|
||||
|---------|----------------|--------------|----------------|
|
||||
| Hero | 1 | 1-2 | 2-3 |
|
||||
| Problem/Solution | 1 | 2-3 | 3-4 |
|
||||
| Service Categories | 1-2 | 4-6 | 5-8 |
|
||||
| Trust & Authority | 1 | 2-3 | 3-4 |
|
||||
| FAQ | 2-3 | 5-7 | 7-10 |
|
||||
| Process | 1 | 2-3 | 3-4 |
|
||||
| Social Proof | 0-1 | 1-2 | 1-3 |
|
||||
| Conversion | 1 | 1-2 | 2-3 |
|
||||
| **Total** | **8-11** | **18-29** | **26-40** |
|
||||
|
||||
## Internal Linking Strategy
|
||||
|
||||
| From Section | To Page | Anchor Text | Purpose |
|
||||
|-------------|---------|-------------|---------|
|
||||
| Service Categories | Sub-service page | [Sub-service name] | Deep dive |
|
||||
| FAQ | Price page | "비용 안내 페이지" | Conversion |
|
||||
| Trust section | Doctor profile | "[Doctor name] 원장" | Authority |
|
||||
| Process section | Consultation form | "상담 예약하기" | Conversion |
|
||||
| Social proof | Gallery page | "더 많은 전후 사진" | Engagement |
|
||||
|
||||
## Content Length Guidelines
|
||||
|
||||
- **Total Page Length**: 2,000-2,500 words
|
||||
- **Above Fold Content**: 100-150 words
|
||||
- **Each H2 Section**: 200-500 words
|
||||
- **Each H3 Subsection**: 80-150 words
|
||||
- **Meta Description**: 150-160 characters
|
||||
- **Image Alt Text**: 10-15 words each
|
||||
|
||||
## Schema Markup Requirements
|
||||
|
||||
```json
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "MedicalProcedure",
|
||||
"name": "[Service Name]",
|
||||
"description": "[Meta description]",
|
||||
"procedureType": "Cosmetic",
|
||||
"provider": {
|
||||
"@type": "MedicalOrganization",
|
||||
"name": "[Clinic Name]"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Mobile Content Adaptation
|
||||
|
||||
- Reduce hero text by 30%
|
||||
- Show 3 FAQs initially (expand for more)
|
||||
- Simplify navigation to single-column
|
||||
- Increase CTA button size
|
||||
- Compress trust signals to carousel
|
||||
@@ -0,0 +1,95 @@
|
||||
# Keyword Research Template
|
||||
|
||||
## Primary Keyword Analysis
|
||||
|
||||
| Metric | Value | Notes |
|
||||
|--------|-------|-------|
|
||||
| **Primary Keyword** | [KEYWORD] | Main target keyword |
|
||||
| **Monthly Search Volume** | [VOLUME] | Average monthly searches |
|
||||
| **Keyword Difficulty** | [0-100] | Competition score |
|
||||
| **Current Ranking** | #[POSITION] | Current SERP position |
|
||||
| **Search Trend** | ↑ ↓ → | Trending direction |
|
||||
|
||||
## LSI Keywords Matrix
|
||||
|
||||
| LSI Keyword | Search Volume | Intent Type | Priority |
|
||||
|------------|--------------|-------------|----------|
|
||||
| [keyword 1] | [volume] | Informational | High |
|
||||
| [keyword 2] | [volume] | Transactional | Medium |
|
||||
| [keyword 3] | [volume] | Comparative | High |
|
||||
| [keyword 4] | [volume] | Informational | Medium |
|
||||
| [keyword 5] | [volume] | Transactional | Low |
|
||||
| [keyword 6] | [volume] | Comparative | High |
|
||||
| [keyword 7] | [volume] | Informational | Medium |
|
||||
| [keyword 8] | [volume] | Navigational | Low |
|
||||
| [keyword 9] | [volume] | Transactional | High |
|
||||
| [keyword 10] | [volume] | Informational | Medium |
|
||||
|
||||
## User Intent Distribution
|
||||
|
||||
```
|
||||
Informational (Research Phase): ___%
|
||||
- Common queries: "what is", "how to", "benefits of"
|
||||
- Content needed: Educational guides, FAQs, process explanations
|
||||
|
||||
Comparative (Evaluation Phase): ___%
|
||||
- Common queries: "best", "vs", "reviews", "비교"
|
||||
- Content needed: Comparison tables, reviews, case studies
|
||||
|
||||
Transactional (Ready to Convert): ___%
|
||||
- Common queries: "price", "book", "consultation", "예약"
|
||||
- Content needed: CTAs, pricing, booking forms
|
||||
```
|
||||
|
||||
## Long-tail Keyword Opportunities
|
||||
|
||||
### Question-based Keywords
|
||||
- [질문 키워드 1]
|
||||
- [질문 키워드 2]
|
||||
- [질문 키워드 3]
|
||||
|
||||
### Location-based Keywords
|
||||
- [지역] + [primary keyword]
|
||||
- [지역] + [primary keyword] + 잘하는곳
|
||||
- [지역] + [primary keyword] + 추천
|
||||
|
||||
### Modifier-based Keywords
|
||||
- [primary keyword] + 비용
|
||||
- [primary keyword] + 부작용
|
||||
- [primary keyword] + 회복기간
|
||||
- [primary keyword] + 전후
|
||||
|
||||
## Competitor Keyword Analysis
|
||||
|
||||
| Competitor | Target Keywords | Ranking Keywords | Gap Opportunities |
|
||||
|------------|----------------|------------------|-------------------|
|
||||
| Competitor 1 | [keywords] | [keywords] | [missing keywords] |
|
||||
| Competitor 2 | [keywords] | [keywords] | [missing keywords] |
|
||||
| Competitor 3 | [keywords] | [keywords] | [missing keywords] |
|
||||
|
||||
## Seasonal Trends
|
||||
|
||||
| Month | Search Volume | Events/Factors |
|
||||
|-------|--------------|----------------|
|
||||
| January | [volume] | New year resolutions |
|
||||
| February | [volume] | [factor] |
|
||||
| March | [volume] | [factor] |
|
||||
| ... | ... | ... |
|
||||
|
||||
## Platform-Specific Keywords
|
||||
|
||||
### Naver-Optimized
|
||||
- [네이버 specific keyword 1]
|
||||
- [네이버 specific keyword 2]
|
||||
|
||||
### Google-Optimized
|
||||
- [Google specific keyword 1]
|
||||
- [Google specific keyword 2]
|
||||
|
||||
## Action Items
|
||||
|
||||
- [ ] Target primary keyword in H1 and title tag
|
||||
- [ ] Include 3-5 LSI keywords naturally in content
|
||||
- [ ] Create content matching user intent distribution
|
||||
- [ ] Optimize for question-based featured snippets
|
||||
- [ ] Add location modifiers for local SEO
|
||||
@@ -0,0 +1,239 @@
|
||||
# SEO Technical Checklist Template
|
||||
|
||||
## Meta Tags Optimization
|
||||
|
||||
### Title Tag
|
||||
- [ ] Length: 50-60 characters
|
||||
- [ ] Primary keyword at beginning
|
||||
- [ ] Brand name at end
|
||||
- [ ] Unique for each page
|
||||
- [ ] Formula: `[Primary Keyword] - [Value Proposition] | [Brand]`
|
||||
|
||||
**Template**: `{primary_keyword} 전문 - {unique_value} | {clinic_name}`
|
||||
**Example**: `눈 성형 전문 - 자연스러운 라인 | 제이미클리닉`
|
||||
|
||||
### Meta Description
|
||||
- [ ] Length: 150-160 characters
|
||||
- [ ] Include primary keyword
|
||||
- [ ] Include 1-2 LSI keywords
|
||||
- [ ] Clear CTA
|
||||
- [ ] Unique for each page
|
||||
|
||||
**Template**: `{location} {primary_keyword} 전문의가 {benefit}. {credential}. 무료상담 ☎ {phone}`
|
||||
**Example**: `강남 눈 성형 전문의가 자연스러운 눈매를 디자인합니다. 15년 경력, 10,000건 시술. 무료상담 ☎ 02-1234-5678`
|
||||
|
||||
### Open Graph Tags
|
||||
```html
|
||||
<meta property="og:title" content="{page_title}">
|
||||
<meta property="og:description" content="{meta_description}">
|
||||
<meta property="og:image" content="{featured_image_url}">
|
||||
<meta property="og:url" content="{page_url}">
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:locale" content="ko_KR">
|
||||
```
|
||||
|
||||
## Header Tags Structure
|
||||
|
||||
- [ ] Only one H1 per page
|
||||
- [ ] H1 contains primary keyword
|
||||
- [ ] H2 tags for main sections (5-7)
|
||||
- [ ] H3 tags for subsections
|
||||
- [ ] Logical hierarchy maintained
|
||||
- [ ] Keywords distributed naturally
|
||||
|
||||
## Content Optimization
|
||||
|
||||
### Keyword Density
|
||||
- [ ] Primary keyword: 2-3% (20-30 times per 1000 words)
|
||||
- [ ] LSI keywords: 1-2% each
|
||||
- [ ] Natural placement (no stuffing)
|
||||
- [ ] Synonyms and variations used
|
||||
|
||||
### Content Structure
|
||||
- [ ] First 100 words include primary keyword
|
||||
- [ ] Short paragraphs (3-4 sentences)
|
||||
- [ ] Bullet points and lists
|
||||
- [ ] Bold important keywords (sparingly)
|
||||
- [ ] Internal links: 5-10
|
||||
- [ ] External links: 2-3 (authoritative)
|
||||
|
||||
## Schema Markup
|
||||
|
||||
### Medical Procedure Schema
|
||||
```json
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "MedicalProcedure",
|
||||
"name": "{procedure_name}",
|
||||
"procedureType": "Cosmetic",
|
||||
"bodyLocation": "{body_part}",
|
||||
"outcome": "{expected_outcome}",
|
||||
"preparation": "{preparation_required}",
|
||||
"followup": "{followup_care}",
|
||||
"provider": {
|
||||
"@type": "MedicalOrganization",
|
||||
"name": "{clinic_name}",
|
||||
"address": {
|
||||
"@type": "PostalAddress",
|
||||
"streetAddress": "{street}",
|
||||
"addressLocality": "{city}",
|
||||
"addressCountry": "KR"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### FAQ Schema
|
||||
```json
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
"mainEntity": [{
|
||||
"@type": "Question",
|
||||
"name": "{question}",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "{answer}"
|
||||
}
|
||||
}]
|
||||
}
|
||||
```
|
||||
|
||||
## Image Optimization
|
||||
|
||||
- [ ] Descriptive file names: `eye-surgery-before-after-case1.jpg`
|
||||
- [ ] Alt text with keywords: `눈 성형 전후 사진 - 30대 여성 사례`
|
||||
- [ ] Compressed file size (< 200KB)
|
||||
- [ ] WebP format with fallback
|
||||
- [ ] Lazy loading implemented
|
||||
- [ ] Image sitemap created
|
||||
|
||||
## Performance Optimization
|
||||
|
||||
### Page Speed
|
||||
- [ ] Load time < 3 seconds
|
||||
- [ ] First Contentful Paint < 1.8s
|
||||
- [ ] Time to Interactive < 3.8s
|
||||
- [ ] Total page size < 3MB
|
||||
- [ ] Requests minimized (< 50)
|
||||
|
||||
### Core Web Vitals
|
||||
- [ ] LCP (Largest Contentful Paint) < 2.5s
|
||||
- [ ] FID (First Input Delay) < 100ms
|
||||
- [ ] CLS (Cumulative Layout Shift) < 0.1
|
||||
|
||||
## Mobile Optimization
|
||||
|
||||
- [ ] Mobile-responsive design
|
||||
- [ ] Viewport meta tag set
|
||||
- [ ] Touch-friendly buttons (44x44px minimum)
|
||||
- [ ] Readable font size (16px minimum)
|
||||
- [ ] No horizontal scrolling
|
||||
- [ ] Mobile page speed < 3s
|
||||
|
||||
## URL Structure
|
||||
|
||||
- [ ] SEO-friendly URL: `/eye-surgery` or `/눈-성형`
|
||||
- [ ] No special characters
|
||||
- [ ] Lowercase only
|
||||
- [ ] Hyphens for word separation
|
||||
- [ ] Under 60 characters
|
||||
- [ ] Include primary keyword
|
||||
|
||||
## Internal Linking
|
||||
|
||||
| From Page | To Page | Anchor Text | Purpose |
|
||||
|-----------|---------|-------------|---------|
|
||||
| Gateway | Service Detail | {service_name} | Deep content |
|
||||
| Gateway | Doctor Profile | {doctor_name} 원장 | Authority |
|
||||
| Gateway | Pricing | 비용 안내 | Conversion |
|
||||
| Gateway | Gallery | 시술 전후 사진 | Engagement |
|
||||
| Gateway | Contact | 상담 예약 | Conversion |
|
||||
|
||||
## Naver-Specific Optimization
|
||||
|
||||
### Naver Webmaster Tools
|
||||
- [ ] Site verification complete
|
||||
- [ ] XML sitemap submitted
|
||||
- [ ] Robots.txt configured
|
||||
- [ ] Syndication feed active
|
||||
- [ ] Site optimization report reviewed
|
||||
|
||||
### Naver SEO Elements
|
||||
- [ ] Title under 30 Korean characters
|
||||
- [ ] C-Rank tags implemented
|
||||
- [ ] Image-to-text ratio optimized (40:60)
|
||||
- [ ] Outbound links minimized
|
||||
- [ ] Brand search optimization
|
||||
|
||||
## Tracking & Analytics
|
||||
|
||||
- [ ] Google Analytics 4 installed
|
||||
- [ ] Google Search Console verified
|
||||
- [ ] Naver Analytics installed
|
||||
- [ ] Conversion tracking configured
|
||||
- [ ] Event tracking for CTAs
|
||||
- [ ] Heatmap tool installed
|
||||
|
||||
## Security & Technical
|
||||
|
||||
- [ ] SSL certificate active (HTTPS)
|
||||
- [ ] WWW/non-WWW redirect configured
|
||||
- [ ] 404 error page customized
|
||||
- [ ] XML sitemap generated
|
||||
- [ ] Robots.txt optimized
|
||||
- [ ] Canonical URLs set
|
||||
- [ ] Hreflang tags (if multi-language)
|
||||
|
||||
## Quality Checks
|
||||
|
||||
### Content Quality
|
||||
- [ ] No spelling/grammar errors
|
||||
- [ ] Medical information accurate
|
||||
- [ ] Legal compliance verified
|
||||
- [ ] Contact information correct
|
||||
- [ ] CTAs working properly
|
||||
|
||||
### Cross-browser Testing
|
||||
- [ ] Chrome (Desktop/Mobile)
|
||||
- [ ] Safari (Desktop/Mobile)
|
||||
- [ ] Firefox
|
||||
- [ ] Samsung Internet
|
||||
- [ ] Naver Whale
|
||||
|
||||
## Monthly Monitoring Tasks
|
||||
|
||||
- [ ] Keyword ranking check
|
||||
- [ ] Organic traffic analysis
|
||||
- [ ] Bounce rate monitoring
|
||||
- [ ] Conversion rate tracking
|
||||
- [ ] Competitor analysis
|
||||
- [ ] Content freshness update
|
||||
- [ ] Broken link check
|
||||
- [ ] Page speed test
|
||||
|
||||
## Priority Levels
|
||||
|
||||
1. **Critical (Day 1)**
|
||||
- Title and meta tags
|
||||
- H1 optimization
|
||||
- Mobile responsiveness
|
||||
- Page speed < 4s
|
||||
|
||||
2. **High (Week 1)**
|
||||
- Schema markup
|
||||
- Internal linking
|
||||
- Image optimization
|
||||
- Content optimization
|
||||
|
||||
3. **Medium (Week 2-3)**
|
||||
- Naver optimization
|
||||
- FAQ implementation
|
||||
- Social proof elements
|
||||
- Analytics setup
|
||||
|
||||
4. **Low (Month 2)**
|
||||
- A/B testing
|
||||
- Advanced schema
|
||||
- Link building
|
||||
- Content expansion
|
||||
@@ -0,0 +1,234 @@
|
||||
# Gateway Page Content Builder
|
||||
|
||||
A comprehensive Claude Skill for generating SEO-optimized gateway pages for local services, medical practices, and businesses.
|
||||
|
||||
## 🎯 Purpose
|
||||
|
||||
This skill provides a systematic framework for creating high-quality gateway pages that:
|
||||
- Target location + service keyword combinations
|
||||
- Scale content creation while maintaining uniqueness
|
||||
- Include proper technical SEO elements
|
||||
- Generate structured data and schema markup
|
||||
|
||||
## 📁 Structure
|
||||
|
||||
```
|
||||
gateway-page-content-builder/
|
||||
├── SKILL.md # Main skill documentation (REQUIRED)
|
||||
├── README.md # This file
|
||||
├── templates/ # Page templates
|
||||
│ ├── gateway-page-medical.md
|
||||
│ ├── gateway-page-beauty.md
|
||||
│ └── gateway-page-dental.md
|
||||
├── scripts/ # Automation scripts
|
||||
│ ├── generate_pages.py
|
||||
│ └── keyword_research.py
|
||||
├── config/ # Configuration files
|
||||
│ ├── locations.json
|
||||
│ ├── services.json
|
||||
│ └── brand.json
|
||||
└── examples/ # Example outputs
|
||||
└── gangnam-laser-hair-removal.md
|
||||
```
|
||||
|
||||
## 🚀 Quick Start
|
||||
|
||||
### 1. Basic Usage with Claude
|
||||
|
||||
Simply ask Claude to use this skill:
|
||||
```
|
||||
"Use the Gateway Page Content Builder skill to create a page for laser hair removal in Gangnam"
|
||||
```
|
||||
|
||||
### 2. Batch Generation with Python
|
||||
|
||||
```python
|
||||
from scripts.generate_pages import GatewayPageGenerator, Brand, Location, Service
|
||||
|
||||
# Setup your brand
|
||||
brand = Brand(
|
||||
name_en="Your Clinic",
|
||||
name_kr="클리닉명",
|
||||
website="www.yourclinic.com",
|
||||
# ... other details
|
||||
)
|
||||
|
||||
# Define locations and services
|
||||
locations = [...] # Your location list
|
||||
services = [...] # Your service list
|
||||
|
||||
# Generate pages
|
||||
generator = GatewayPageGenerator(brand)
|
||||
generator.generate_batch(services, locations)
|
||||
```
|
||||
|
||||
### 3. Using Templates
|
||||
|
||||
Templates are in Markdown format with placeholders:
|
||||
- `[Service]` - Service name
|
||||
- `[Location]` - Location name
|
||||
- `[Brand]` - Brand/clinic name
|
||||
- Additional custom placeholders
|
||||
|
||||
## 📝 Content Strategy
|
||||
|
||||
### Keyword Formula
|
||||
```
|
||||
Primary: [Service] + [Location]
|
||||
Secondary: [Location] + [Service] + "clinic/center"
|
||||
Long-tail: "best" + [Service] + "in" + [Location]
|
||||
```
|
||||
|
||||
### Content Uniqueness
|
||||
Each page should have:
|
||||
- 30% minimum unique content
|
||||
- Local landmarks and transportation
|
||||
- Location-specific testimonials
|
||||
- Regional statistics or demographics
|
||||
|
||||
### Page Length Guidelines
|
||||
- Minimum: 800 words
|
||||
- Optimal: 1,200-1,500 words
|
||||
- Maximum: 2,000 words
|
||||
|
||||
## 🎨 Customization
|
||||
|
||||
### Adding New Templates
|
||||
|
||||
1. Create new template in `templates/` directory
|
||||
2. Use consistent placeholder naming
|
||||
3. Include schema markup section
|
||||
4. Add to configuration
|
||||
|
||||
### Extending Services/Locations
|
||||
|
||||
Edit the JSON configuration files:
|
||||
|
||||
`config/services.json`:
|
||||
```json
|
||||
{
|
||||
"services": [
|
||||
{
|
||||
"id": "new-service",
|
||||
"name_en": "New Service",
|
||||
"name_kr": "새로운 서비스",
|
||||
"keywords": ["keyword1", "keyword2"]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
`config/locations.json`:
|
||||
```json
|
||||
{
|
||||
"locations": [
|
||||
{
|
||||
"id": "new-location",
|
||||
"name_en": "New Location",
|
||||
"name_kr": "새로운 지역",
|
||||
"landmarks": ["Landmark 1", "Landmark 2"]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## 🔧 Technical Implementation
|
||||
|
||||
### URL Structure
|
||||
```
|
||||
/[location]/[service]/
|
||||
Example: /gangnam/laser-hair-removal/
|
||||
```
|
||||
|
||||
### Required Meta Tags
|
||||
- Title (60 characters max)
|
||||
- Description (155 characters max)
|
||||
- Canonical URL
|
||||
- Open Graph tags
|
||||
- Schema markup
|
||||
|
||||
### Schema Types
|
||||
- MedicalBusiness
|
||||
- LocalBusiness
|
||||
- Service
|
||||
- Review
|
||||
- FAQPage
|
||||
|
||||
## 📊 Performance Tracking
|
||||
|
||||
### Key Metrics
|
||||
- Organic traffic by page
|
||||
- Keyword rankings
|
||||
- Conversion rate
|
||||
- Bounce rate
|
||||
- Time on page
|
||||
|
||||
### A/B Testing Elements
|
||||
- Headlines
|
||||
- CTA buttons
|
||||
- Trust signals
|
||||
- Content length
|
||||
|
||||
## 🔄 Content Refresh Schedule
|
||||
|
||||
- **Weekly**: Review top 10% pages
|
||||
- **Monthly**: Update testimonials
|
||||
- **Quarterly**: Refresh statistics
|
||||
- **Annually**: Full content audit
|
||||
|
||||
## 🛠️ Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
1. **Duplicate Content Warnings**
|
||||
- Ensure 30% unique content minimum
|
||||
- Use content variation patterns
|
||||
- Add local elements
|
||||
|
||||
2. **Low Rankings**
|
||||
- Check keyword density (2-3%)
|
||||
- Verify schema markup
|
||||
- Add more local signals
|
||||
|
||||
3. **Poor Conversion**
|
||||
- Test CTA placement
|
||||
- Add trust signals
|
||||
- Improve page speed
|
||||
|
||||
## 📚 Resources
|
||||
|
||||
### SEO Tools
|
||||
- Ahrefs / SEMrush (keyword research)
|
||||
- Screaming Frog (technical audit)
|
||||
- Google Search Console (performance)
|
||||
- Schema.org (structured data)
|
||||
|
||||
### Content Tools
|
||||
- Grammarly (grammar check)
|
||||
- Hemingway (readability)
|
||||
- Copyscape (plagiarism)
|
||||
|
||||
## 🤝 Contributing
|
||||
|
||||
To improve this skill:
|
||||
1. Test templates with real data
|
||||
2. Share performance metrics
|
||||
3. Suggest new features
|
||||
4. Report issues
|
||||
|
||||
## 📄 License
|
||||
|
||||
This skill is provided as-is for use with Claude Desktop and Claude Projects.
|
||||
|
||||
## 🆘 Support
|
||||
|
||||
For questions or assistance:
|
||||
- Review SKILL.md for detailed documentation
|
||||
- Check examples/ directory for samples
|
||||
- Test with the Python script first
|
||||
|
||||
---
|
||||
|
||||
**Version**: 1.0.0
|
||||
**Last Updated**: November 2024
|
||||
**Author**: OurDigital Dr.D
|
||||
@@ -0,0 +1,377 @@
|
||||
---
|
||||
name: gateway-page-content-builder
|
||||
version: 1.0.0
|
||||
description: Systematic content generation framework for SEO-optimized gateway pages with local service focus
|
||||
license: OurDigital internal-use ONLY
|
||||
---
|
||||
|
||||
# Gateway Page Content Builder
|
||||
|
||||
A comprehensive skill for building high-quality, SEO-optimized gateway page content for local services, medical practices, and business locations.
|
||||
|
||||
## Core Purpose
|
||||
|
||||
This skill provides a systematic framework for creating gateway pages that:
|
||||
- Target specific location + service keyword combinations
|
||||
- Follow SEO best practices for local search optimization
|
||||
- Maintain content quality and uniqueness at scale
|
||||
- Include structured data and technical SEO elements
|
||||
|
||||
## Content Generation Framework
|
||||
|
||||
### 1. Page Structure Template
|
||||
|
||||
Every gateway page should follow this optimized structure:
|
||||
|
||||
```markdown
|
||||
# [Service Name] in [Location] - [Brand Name]
|
||||
|
||||
## Hero Section
|
||||
- Primary headline with target keywords
|
||||
- Value proposition statement
|
||||
- Quick contact CTA
|
||||
|
||||
## Service Overview
|
||||
- What is [service]?
|
||||
- Why choose our [service] in [location]
|
||||
- Key benefits for [location] residents
|
||||
|
||||
## Local Service Details
|
||||
- Service availability in [location]
|
||||
- Local team/facility information
|
||||
- Location-specific offerings
|
||||
|
||||
## Process & Procedure
|
||||
- Step-by-step service flow
|
||||
- Duration and frequency
|
||||
- What to expect
|
||||
|
||||
## Benefits & Results
|
||||
- Evidence-based outcomes
|
||||
- Patient/customer testimonials
|
||||
- Before/after scenarios
|
||||
|
||||
## Pricing & Insurance
|
||||
- Transparent pricing structure
|
||||
- Insurance coverage details
|
||||
- Payment options
|
||||
|
||||
## FAQ Section
|
||||
- Location-specific questions
|
||||
- Service-specific concerns
|
||||
- Booking and preparation
|
||||
|
||||
## Contact & Booking
|
||||
- Clear CTA sections
|
||||
- Multiple contact methods
|
||||
- Online booking integration
|
||||
```
|
||||
|
||||
### 2. Content Variables System
|
||||
|
||||
Define reusable content variables for efficient scaling:
|
||||
|
||||
```yaml
|
||||
variables:
|
||||
service_types:
|
||||
- name: "laser_hair_removal"
|
||||
korean: "레이저 제모"
|
||||
description: "Advanced laser technology for permanent hair reduction"
|
||||
keywords: ["laser hair removal", "permanent hair removal", "IPL treatment"]
|
||||
|
||||
locations:
|
||||
- name: "gangnam"
|
||||
korean: "강남"
|
||||
full_address: "서울특별시 강남구"
|
||||
landmarks: ["COEX", "Samsung Station", "Gangnam Station"]
|
||||
demographics: "Young professionals, high income"
|
||||
|
||||
brand_info:
|
||||
name: "Your Clinic"
|
||||
korean: "클리닉명"
|
||||
usp: "15+ years of experience with latest technology"
|
||||
```
|
||||
|
||||
### 3. Content Generation Rules
|
||||
|
||||
#### Title Tag Formula
|
||||
```
|
||||
[Service] in [Location] | [Unique Modifier] | [Brand]
|
||||
Examples:
|
||||
- "Laser Hair Removal in Gangnam | Same-Day Appointments | Jamie Clinic"
|
||||
- "강남 레이저 제모 | 당일 예약 가능 | 제이미 클리닉"
|
||||
```
|
||||
|
||||
#### Meta Description Template
|
||||
```
|
||||
Looking for [service] in [location]? [Brand] offers [USP] with [benefit].
|
||||
Book your consultation today. ✓ [Feature 1] ✓ [Feature 2] ✓ [Feature 3]
|
||||
```
|
||||
|
||||
#### H1 Optimization
|
||||
```
|
||||
Primary: [Service] in [Location]
|
||||
Alternative: [Location] [Service] - [Brand Modifier]
|
||||
Korean: [지역] [서비스] 전문 [브랜드]
|
||||
```
|
||||
|
||||
### 4. Local SEO Elements
|
||||
|
||||
#### Schema Markup Requirements
|
||||
```json
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "MedicalBusiness",
|
||||
"name": "Clinic Name",
|
||||
"address": {
|
||||
"@type": "PostalAddress",
|
||||
"streetAddress": "",
|
||||
"addressLocality": "",
|
||||
"addressRegion": "",
|
||||
"postalCode": ""
|
||||
},
|
||||
"geo": {
|
||||
"@type": "GeoCoordinates",
|
||||
"latitude": "",
|
||||
"longitude": ""
|
||||
},
|
||||
"areaServed": {
|
||||
"@type": "City",
|
||||
"name": "Location Name"
|
||||
},
|
||||
"medicalSpecialty": "Service Type",
|
||||
"availableService": {
|
||||
"@type": "MedicalProcedure",
|
||||
"name": "Service Name",
|
||||
"description": "Service Description"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 5. Content Uniqueness Strategy
|
||||
|
||||
#### Localization Techniques
|
||||
1. **Local landmarks**: "Just 5 minutes from [Landmark]"
|
||||
2. **Transportation**: "Accessible via [Subway Line] at [Station]"
|
||||
3. **Local statistics**: "Serving [X] residents in [Area] since [Year]"
|
||||
4. **Community involvement**: "Proud partner of [Local Organization]"
|
||||
5. **Regional preferences**: "Tailored to [Location] residents' needs"
|
||||
|
||||
#### Content Variation Patterns
|
||||
```python
|
||||
variations = {
|
||||
"intro_patterns": [
|
||||
"Discover professional [service] in [location]",
|
||||
"[Location] residents trust us for [service]",
|
||||
"Your local [service] experts in [location]",
|
||||
"Premium [service] now available in [location]"
|
||||
],
|
||||
"cta_patterns": [
|
||||
"Book your [location] appointment today",
|
||||
"Schedule a consultation at our [location] clinic",
|
||||
"Visit us in [location] for [service]",
|
||||
"Get started with [service] in [location]"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 6. Content Quality Checklist
|
||||
|
||||
Before publishing any gateway page, verify:
|
||||
|
||||
- [ ] **Keyword optimization**: Target keyword appears in title, H1, first 100 words
|
||||
- [ ] **Content length**: Minimum 800 words of unique content
|
||||
- [ ] **Local signals**: At least 5 location mentions naturally integrated
|
||||
- [ ] **Structured data**: Schema markup properly implemented
|
||||
- [ ] **Internal linking**: Links to main service page and location page
|
||||
- [ ] **Images**: Alt text includes location + service keywords
|
||||
- [ ] **Mobile optimization**: Content readable on mobile devices
|
||||
- [ ] **Load speed**: Page loads under 3 seconds
|
||||
- [ ] **CTAs**: Clear calls-to-action above and below fold
|
||||
- [ ] **Trust signals**: Reviews, certifications, testimonials included
|
||||
|
||||
### 7. Scaling Framework
|
||||
|
||||
#### Batch Generation Process
|
||||
1. Create master template with variable placeholders
|
||||
2. Define location and service matrices
|
||||
3. Generate unique content blocks for each combination
|
||||
4. Review and customize top 20% traffic potential pages
|
||||
5. Implement progressive enhancement based on performance
|
||||
|
||||
#### Priority Matrix
|
||||
```
|
||||
High Priority (Manual Optimization):
|
||||
- High search volume + High commercial intent
|
||||
- Major city centers + Premium services
|
||||
- Competitive keywords requiring unique angle
|
||||
|
||||
Medium Priority (Template + Customization):
|
||||
- Moderate search volume + Standard services
|
||||
- Secondary locations + Common procedures
|
||||
|
||||
Low Priority (Automated Generation):
|
||||
- Long-tail keywords + Suburban areas
|
||||
- Informational intent + Low competition
|
||||
```
|
||||
|
||||
### 8. Performance Tracking
|
||||
|
||||
#### KPIs to Monitor
|
||||
```yaml
|
||||
metrics:
|
||||
organic_traffic:
|
||||
- Pageviews from organic search
|
||||
- Unique visitors by location
|
||||
- Average session duration
|
||||
|
||||
conversions:
|
||||
- Form submissions by page
|
||||
- Phone calls tracked
|
||||
- Online bookings completed
|
||||
|
||||
engagement:
|
||||
- Bounce rate below 40%
|
||||
- Pages per session above 2.0
|
||||
- Scroll depth above 75%
|
||||
|
||||
rankings:
|
||||
- Position tracking for target keywords
|
||||
- Local pack appearances
|
||||
- Featured snippet captures
|
||||
```
|
||||
|
||||
## Implementation Instructions
|
||||
|
||||
### Step 1: Keyword Research
|
||||
```python
|
||||
# Generate keyword combinations
|
||||
locations = ["gangnam", "sinsa", "apgujeong"]
|
||||
services = ["laser_hair_removal", "botox", "filler"]
|
||||
|
||||
keywords = []
|
||||
for location in locations:
|
||||
for service in services:
|
||||
keywords.append({
|
||||
"primary": f"{service} {location}",
|
||||
"secondary": f"{location} {service} clinic",
|
||||
"long_tail": f"best {service} clinic in {location}"
|
||||
})
|
||||
```
|
||||
|
||||
### Step 2: Content Creation
|
||||
1. Use the template structure above
|
||||
2. Fill in variables for location and service
|
||||
3. Add unique local content (minimum 30% unique per page)
|
||||
4. Include relevant images with local landmarks
|
||||
5. Add schema markup and meta tags
|
||||
|
||||
### Step 3: Technical Implementation
|
||||
1. Create URL structure: `/location/service/`
|
||||
2. Implement breadcrumbs with proper schema
|
||||
3. Add internal linking to related pages
|
||||
4. Set up canonical tags to avoid duplication
|
||||
5. Create XML sitemap for gateway pages
|
||||
|
||||
### Step 4: Quality Assurance
|
||||
- Run content through plagiarism checker
|
||||
- Verify all technical SEO elements
|
||||
- Test page speed and mobile responsiveness
|
||||
- Review content for local relevance
|
||||
- Check all CTAs and contact information
|
||||
|
||||
## Advanced Techniques
|
||||
|
||||
### Dynamic Content Insertion
|
||||
```javascript
|
||||
// Example of dynamic content based on user location
|
||||
const userLocation = getUserLocation();
|
||||
const nearestClinic = findNearestClinic(userLocation);
|
||||
|
||||
// Update content dynamically
|
||||
document.querySelector('.hero-location').textContent =
|
||||
`Serving ${userLocation.district} and surrounding areas`;
|
||||
|
||||
document.querySelector('.distance-info').textContent =
|
||||
`Only ${nearestClinic.distance} from your location`;
|
||||
```
|
||||
|
||||
### A/B Testing Framework
|
||||
```yaml
|
||||
test_variations:
|
||||
headlines:
|
||||
- control: "[Service] in [Location]"
|
||||
- variant_a: "#1 [Service] Provider in [Location]"
|
||||
- variant_b: "[Location]'s Trusted [Service] Clinic"
|
||||
|
||||
cta_buttons:
|
||||
- control: "Book Now"
|
||||
- variant_a: "Get Free Consultation"
|
||||
- variant_b: "Check Availability"
|
||||
```
|
||||
|
||||
### Content Refresh Strategy
|
||||
- Monthly: Update testimonials and reviews
|
||||
- Quarterly: Refresh statistics and data points
|
||||
- Semi-annually: Add new FAQs based on search queries
|
||||
- Annually: Complete content audit and refresh
|
||||
|
||||
## Prompts for Content Generation
|
||||
|
||||
### Initial Content Brief
|
||||
```
|
||||
Create gateway page content for [SERVICE] in [LOCATION]:
|
||||
- Target keyword: [PRIMARY KEYWORD]
|
||||
- Secondary keywords: [LIST]
|
||||
- Local landmarks: [LIST]
|
||||
- Unique selling points: [LIST]
|
||||
- Competitor differentiation: [POINTS]
|
||||
```
|
||||
|
||||
### Content Expansion
|
||||
```
|
||||
Expand the following gateway page section:
|
||||
Current content: [PASTE]
|
||||
Add: Local statistics, transportation info, 2 testimonials
|
||||
Maintain: Professional tone, keyword density 2-3%
|
||||
Length: 200-300 words
|
||||
```
|
||||
|
||||
### FAQ Generation
|
||||
```
|
||||
Generate 8 FAQs for [SERVICE] in [LOCATION]:
|
||||
- 3 service-specific questions
|
||||
- 2 location/accessibility questions
|
||||
- 2 pricing/insurance questions
|
||||
- 1 preparation/aftercare question
|
||||
Include question schema markup format
|
||||
```
|
||||
|
||||
## Resources and Tools
|
||||
|
||||
### Recommended Tools
|
||||
- **Keyword Research**: Ahrefs, SEMrush, Google Keyword Planner
|
||||
- **Content Optimization**: Surfer SEO, Clearscope, MarketMuse
|
||||
- **Schema Generation**: Schema.org, Google's Structured Data Tool
|
||||
- **Performance Tracking**: Google Analytics, Search Console
|
||||
- **A/B Testing**: Google Optimize, Optimizely
|
||||
|
||||
### Templates Directory
|
||||
- `templates/gateway-page-medical.md`
|
||||
- `templates/gateway-page-beauty.md`
|
||||
- `templates/gateway-page-dental.md`
|
||||
- `templates/schema-medical-business.json`
|
||||
- `templates/meta-tags-local.html`
|
||||
|
||||
## Version History
|
||||
|
||||
### v1.0.0 (Current)
|
||||
- Initial framework for gateway page content generation
|
||||
- Medical and beauty service focus
|
||||
- Korean market optimization
|
||||
- Local SEO best practices
|
||||
- Content scaling methodology
|
||||
|
||||
---
|
||||
|
||||
*This skill is optimized for Korean medical and beauty service markets but can be adapted for any local service business requiring location-based gateway pages.*
|
||||
@@ -0,0 +1,235 @@
|
||||
{
|
||||
"locations": [
|
||||
{
|
||||
"id": "gangnam",
|
||||
"name_en": "Gangnam",
|
||||
"name_kr": "강남",
|
||||
"name_cn": "江南",
|
||||
"district": "Gangnam-gu",
|
||||
"city": "Seoul",
|
||||
"full_address_kr": "서울특별시 강남구 테헤란로 123",
|
||||
"full_address_en": "123 Teheran-ro, Gangnam-gu, Seoul",
|
||||
"postal_code": "06234",
|
||||
"latitude": 37.4979,
|
||||
"longitude": 127.0276,
|
||||
"landmarks": [
|
||||
"COEX Mall",
|
||||
"Gangnam Station",
|
||||
"Samsung Station",
|
||||
"Bongeunsa Temple"
|
||||
],
|
||||
"subway_stations": [
|
||||
{
|
||||
"name": "Gangnam Station",
|
||||
"lines": ["Line 2", "Sinbundang Line"],
|
||||
"exit": "Exit 11",
|
||||
"walking_time": "3 minutes"
|
||||
},
|
||||
{
|
||||
"name": "Sinnonhyeon Station",
|
||||
"lines": ["Line 9"],
|
||||
"exit": "Exit 6",
|
||||
"walking_time": "5 minutes"
|
||||
}
|
||||
],
|
||||
"bus_routes": ["146", "341", "360", "740"],
|
||||
"demographics": "Young professionals, affluent residents, business district",
|
||||
"population": "approximately 570,000",
|
||||
"average_age": "38.5",
|
||||
"key_industries": ["IT", "Finance", "Medical", "Education"],
|
||||
"nearby_hospitals": ["Samsung Medical Center", "Gangnam Severance Hospital"],
|
||||
"parking": {
|
||||
"available": true,
|
||||
"type": "Underground",
|
||||
"capacity": 50,
|
||||
"fee": "Free for patients"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "myeongdong",
|
||||
"name_en": "Myeongdong",
|
||||
"name_kr": "명동",
|
||||
"name_cn": "明洞",
|
||||
"district": "Jung-gu",
|
||||
"city": "Seoul",
|
||||
"full_address_kr": "서울특별시 중구 명동길 456",
|
||||
"full_address_en": "456 Myeongdong-gil, Jung-gu, Seoul",
|
||||
"postal_code": "04537",
|
||||
"latitude": 37.5636,
|
||||
"longitude": 126.9869,
|
||||
"landmarks": [
|
||||
"Myeongdong Cathedral",
|
||||
"Lotte Department Store",
|
||||
"Shinsegae Department Store",
|
||||
"N Seoul Tower"
|
||||
],
|
||||
"subway_stations": [
|
||||
{
|
||||
"name": "Myeongdong Station",
|
||||
"lines": ["Line 4"],
|
||||
"exit": "Exit 8",
|
||||
"walking_time": "2 minutes"
|
||||
},
|
||||
{
|
||||
"name": "Euljiro 1-ga Station",
|
||||
"lines": ["Line 2"],
|
||||
"exit": "Exit 5",
|
||||
"walking_time": "7 minutes"
|
||||
}
|
||||
],
|
||||
"bus_routes": ["104", "421", "463", "507"],
|
||||
"demographics": "Tourists, young shoppers, office workers",
|
||||
"population": "approximately 13,000",
|
||||
"average_age": "42.3",
|
||||
"key_industries": ["Retail", "Tourism", "Banking", "Hospitality"],
|
||||
"nearby_hospitals": ["Seoul Medical Center", "Asan Medical Center"],
|
||||
"parking": {
|
||||
"available": true,
|
||||
"type": "Building parking",
|
||||
"capacity": 30,
|
||||
"fee": "2,000 KRW per hour"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "hongdae",
|
||||
"name_en": "Hongdae",
|
||||
"name_kr": "홍대",
|
||||
"name_cn": "弘大",
|
||||
"district": "Mapo-gu",
|
||||
"city": "Seoul",
|
||||
"full_address_kr": "서울특별시 마포구 와우산로 789",
|
||||
"full_address_en": "789 Wausan-ro, Mapo-gu, Seoul",
|
||||
"postal_code": "04104",
|
||||
"latitude": 37.5563,
|
||||
"longitude": 126.9220,
|
||||
"landmarks": [
|
||||
"Hongik University",
|
||||
"Hongdae Shopping Street",
|
||||
"Sangsang Madang",
|
||||
"Hongdae Free Market"
|
||||
],
|
||||
"subway_stations": [
|
||||
{
|
||||
"name": "Hongik University Station",
|
||||
"lines": ["Line 2", "Airport Railroad", "Gyeongui-Jungang Line"],
|
||||
"exit": "Exit 9",
|
||||
"walking_time": "1 minute"
|
||||
},
|
||||
{
|
||||
"name": "Sangsu Station",
|
||||
"lines": ["Line 6"],
|
||||
"exit": "Exit 1",
|
||||
"walking_time": "8 minutes"
|
||||
}
|
||||
],
|
||||
"bus_routes": ["271", "602", "603", "760"],
|
||||
"demographics": "University students, young adults, artists, indie culture",
|
||||
"population": "approximately 385,000",
|
||||
"average_age": "35.2",
|
||||
"key_industries": ["Entertainment", "Arts", "Cafes", "Fashion"],
|
||||
"nearby_hospitals": ["Severance Hospital", "Sinchon Severance Hospital"],
|
||||
"parking": {
|
||||
"available": false,
|
||||
"type": "Street parking only",
|
||||
"capacity": 0,
|
||||
"fee": "Public parking nearby"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "apgujeong",
|
||||
"name_en": "Apgujeong",
|
||||
"name_kr": "압구정",
|
||||
"name_cn": "狎鸥亭",
|
||||
"district": "Gangnam-gu",
|
||||
"city": "Seoul",
|
||||
"full_address_kr": "서울특별시 강남구 압구정로 321",
|
||||
"full_address_en": "321 Apgujeong-ro, Gangnam-gu, Seoul",
|
||||
"postal_code": "06001",
|
||||
"latitude": 37.5311,
|
||||
"longitude": 127.0403,
|
||||
"landmarks": [
|
||||
"Galleria Department Store",
|
||||
"Apgujeong Rodeo Street",
|
||||
"Dosan Park",
|
||||
"K-Star Road"
|
||||
],
|
||||
"subway_stations": [
|
||||
{
|
||||
"name": "Apgujeong Station",
|
||||
"lines": ["Line 3"],
|
||||
"exit": "Exit 2",
|
||||
"walking_time": "4 minutes"
|
||||
},
|
||||
{
|
||||
"name": "Apgujeong Rodeo Station",
|
||||
"lines": ["Suin-Bundang Line"],
|
||||
"exit": "Exit 5",
|
||||
"walking_time": "3 minutes"
|
||||
}
|
||||
],
|
||||
"bus_routes": ["145", "301", "362", "472"],
|
||||
"demographics": "High-income residents, luxury shoppers, K-beauty enthusiasts",
|
||||
"population": "approximately 24,000",
|
||||
"average_age": "41.7",
|
||||
"key_industries": ["Luxury retail", "Beauty", "Plastic surgery", "Fashion"],
|
||||
"nearby_hospitals": ["Chung-Ang University Hospital", "Seoul St. Mary's Hospital"],
|
||||
"parking": {
|
||||
"available": true,
|
||||
"type": "Valet service",
|
||||
"capacity": 40,
|
||||
"fee": "Complimentary for VIP patients"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "jamsil",
|
||||
"name_en": "Jamsil",
|
||||
"name_kr": "잠실",
|
||||
"name_cn": "蚕室",
|
||||
"district": "Songpa-gu",
|
||||
"city": "Seoul",
|
||||
"full_address_kr": "서울특별시 송파구 올림픽로 240",
|
||||
"full_address_en": "240 Olympic-ro, Songpa-gu, Seoul",
|
||||
"postal_code": "05554",
|
||||
"latitude": 37.5132,
|
||||
"longitude": 127.1001,
|
||||
"landmarks": [
|
||||
"Lotte World Tower",
|
||||
"Lotte World",
|
||||
"Seokchon Lake",
|
||||
"Olympic Park"
|
||||
],
|
||||
"subway_stations": [
|
||||
{
|
||||
"name": "Jamsil Station",
|
||||
"lines": ["Line 2", "Line 8"],
|
||||
"exit": "Exit 4",
|
||||
"walking_time": "5 minutes"
|
||||
},
|
||||
{
|
||||
"name": "Jamsilsaenae Station",
|
||||
"lines": ["Line 2"],
|
||||
"exit": "Exit 9",
|
||||
"walking_time": "10 minutes"
|
||||
}
|
||||
],
|
||||
"bus_routes": ["2415", "3217", "3313", "3414"],
|
||||
"demographics": "Families, middle-class residents, sports enthusiasts",
|
||||
"population": "approximately 660,000",
|
||||
"average_age": "40.1",
|
||||
"key_industries": ["Retail", "Entertainment", "Sports", "Tourism"],
|
||||
"nearby_hospitals": ["Asan Medical Center", "Seoul Paik Hospital"],
|
||||
"parking": {
|
||||
"available": true,
|
||||
"type": "Multi-level parking",
|
||||
"capacity": 100,
|
||||
"fee": "First 2 hours free"
|
||||
}
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"last_updated": "2024-11-19",
|
||||
"total_locations": 5,
|
||||
"coverage_area": "Seoul Metropolitan Area",
|
||||
"coordinate_system": "WGS84"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,308 @@
|
||||
{
|
||||
"services": [
|
||||
{
|
||||
"id": "laser-hair-removal",
|
||||
"name_en": "Laser Hair Removal",
|
||||
"name_kr": "레이저 제모",
|
||||
"name_cn": "激光脱毛",
|
||||
"category": "Dermatology",
|
||||
"subcategory": "Aesthetic Dermatology",
|
||||
"description": "Permanent hair reduction using state-of-the-art laser technology",
|
||||
"detailed_description": "Our laser hair removal treatment uses FDA-approved diode and Alexandrite lasers to target hair follicles, providing long-lasting hair reduction with minimal discomfort. Suitable for all skin types.",
|
||||
"keywords": [
|
||||
"permanent hair removal",
|
||||
"laser hair removal",
|
||||
"IPL hair removal",
|
||||
"diode laser",
|
||||
"hair reduction",
|
||||
"unwanted hair",
|
||||
"smooth skin"
|
||||
],
|
||||
"procedure_time": "15-60 minutes",
|
||||
"sessions_required": "6-8 sessions",
|
||||
"recovery_time": "No downtime",
|
||||
"results_visible": "After 2-3 sessions",
|
||||
"price_range": "₩₩₩",
|
||||
"price_details": {
|
||||
"small_area": "50,000-100,000 KRW",
|
||||
"medium_area": "100,000-200,000 KRW",
|
||||
"large_area": "200,000-400,000 KRW"
|
||||
},
|
||||
"target_areas": [
|
||||
"Face",
|
||||
"Underarms",
|
||||
"Arms",
|
||||
"Legs",
|
||||
"Bikini line",
|
||||
"Back",
|
||||
"Chest"
|
||||
],
|
||||
"benefits": [
|
||||
"Permanent hair reduction",
|
||||
"Smoother skin",
|
||||
"No more razor burns",
|
||||
"Time-saving",
|
||||
"Cost-effective long-term"
|
||||
],
|
||||
"side_effects": [
|
||||
"Temporary redness",
|
||||
"Mild swelling",
|
||||
"Skin sensitivity"
|
||||
],
|
||||
"contraindications": [
|
||||
"Pregnancy",
|
||||
"Active skin infections",
|
||||
"Recent sun exposure",
|
||||
"Certain medications"
|
||||
],
|
||||
"seo_priority": "high",
|
||||
"search_volume": 14800,
|
||||
"competition": "medium"
|
||||
},
|
||||
{
|
||||
"id": "botox",
|
||||
"name_en": "Botox Treatment",
|
||||
"name_kr": "보톡스",
|
||||
"name_cn": "肉毒素",
|
||||
"category": "Cosmetic Dermatology",
|
||||
"subcategory": "Injectable Treatments",
|
||||
"description": "FDA-approved botulinum toxin for wrinkle reduction and facial rejuvenation",
|
||||
"detailed_description": "Botox injections temporarily relax facial muscles to reduce the appearance of fine lines and wrinkles. Our experienced practitioners use precise injection techniques for natural-looking results.",
|
||||
"keywords": [
|
||||
"botox",
|
||||
"botulinum toxin",
|
||||
"wrinkle treatment",
|
||||
"anti-aging",
|
||||
"facial rejuvenation",
|
||||
"crow's feet",
|
||||
"forehead lines",
|
||||
"frown lines"
|
||||
],
|
||||
"procedure_time": "15-30 minutes",
|
||||
"sessions_required": "1 session, repeat every 3-6 months",
|
||||
"recovery_time": "No downtime",
|
||||
"results_visible": "3-7 days",
|
||||
"price_range": "₩₩₩₩",
|
||||
"price_details": {
|
||||
"per_unit": "10,000-15,000 KRW",
|
||||
"full_face": "300,000-500,000 KRW",
|
||||
"single_area": "150,000-250,000 KRW"
|
||||
},
|
||||
"target_areas": [
|
||||
"Forehead lines",
|
||||
"Crow's feet",
|
||||
"Frown lines",
|
||||
"Bunny lines",
|
||||
"Lip lines",
|
||||
"Chin dimpling",
|
||||
"Jawline slimming"
|
||||
],
|
||||
"benefits": [
|
||||
"Reduces wrinkles",
|
||||
"Prevents new lines",
|
||||
"Non-surgical",
|
||||
"Quick procedure",
|
||||
"Natural results"
|
||||
],
|
||||
"side_effects": [
|
||||
"Temporary bruising",
|
||||
"Mild headache",
|
||||
"Drooping eyelid (rare)"
|
||||
],
|
||||
"contraindications": [
|
||||
"Pregnancy/nursing",
|
||||
"Neuromuscular disorders",
|
||||
"Allergy to ingredients",
|
||||
"Active infection at injection site"
|
||||
],
|
||||
"seo_priority": "high",
|
||||
"search_volume": 22200,
|
||||
"competition": "high"
|
||||
},
|
||||
{
|
||||
"id": "dermal-filler",
|
||||
"name_en": "Dermal Filler",
|
||||
"name_kr": "필러",
|
||||
"name_cn": "玻尿酸",
|
||||
"category": "Cosmetic Dermatology",
|
||||
"subcategory": "Injectable Treatments",
|
||||
"description": "Hyaluronic acid fillers for volume restoration and facial contouring",
|
||||
"detailed_description": "Our dermal filler treatments use premium hyaluronic acid products to restore volume, enhance facial contours, and smooth deep wrinkles. Results are immediate and can last 6-18 months.",
|
||||
"keywords": [
|
||||
"dermal filler",
|
||||
"hyaluronic acid",
|
||||
"facial volume",
|
||||
"lip filler",
|
||||
"cheek filler",
|
||||
"nasolabial folds",
|
||||
"facial contouring"
|
||||
],
|
||||
"procedure_time": "30-45 minutes",
|
||||
"sessions_required": "1 session, touch-ups as needed",
|
||||
"recovery_time": "24-48 hours",
|
||||
"results_visible": "Immediate",
|
||||
"price_range": "₩₩₩₩",
|
||||
"price_details": {
|
||||
"per_syringe": "300,000-600,000 KRW",
|
||||
"lip_augmentation": "400,000-700,000 KRW",
|
||||
"full_face": "1,500,000-3,000,000 KRW"
|
||||
},
|
||||
"target_areas": [
|
||||
"Lips",
|
||||
"Cheeks",
|
||||
"Under eyes",
|
||||
"Nasolabial folds",
|
||||
"Marionette lines",
|
||||
"Jawline",
|
||||
"Temples"
|
||||
],
|
||||
"benefits": [
|
||||
"Instant results",
|
||||
"Restores volume",
|
||||
"Smooths wrinkles",
|
||||
"Enhances contours",
|
||||
"Reversible if needed"
|
||||
],
|
||||
"side_effects": [
|
||||
"Swelling",
|
||||
"Bruising",
|
||||
"Tenderness",
|
||||
"Lumps (temporary)"
|
||||
],
|
||||
"contraindications": [
|
||||
"Pregnancy",
|
||||
"Blood clotting disorders",
|
||||
"Active cold sores",
|
||||
"Allergy to lidocaine"
|
||||
],
|
||||
"seo_priority": "high",
|
||||
"search_volume": 18100,
|
||||
"competition": "high"
|
||||
},
|
||||
{
|
||||
"id": "chemical-peel",
|
||||
"name_en": "Chemical Peel",
|
||||
"name_kr": "케미컬 필링",
|
||||
"name_cn": "化学换肤",
|
||||
"category": "Medical Aesthetics",
|
||||
"subcategory": "Skin Resurfacing",
|
||||
"description": "Professional chemical exfoliation for skin renewal and rejuvenation",
|
||||
"detailed_description": "Chemical peels use carefully selected acids to remove damaged skin layers, revealing fresher, younger-looking skin. We offer light, medium, and deep peels customized to your skin concerns.",
|
||||
"keywords": [
|
||||
"chemical peel",
|
||||
"skin resurfacing",
|
||||
"glycolic acid",
|
||||
"TCA peel",
|
||||
"skin renewal",
|
||||
"acne scars",
|
||||
"pigmentation treatment"
|
||||
],
|
||||
"procedure_time": "30-45 minutes",
|
||||
"sessions_required": "3-6 sessions",
|
||||
"recovery_time": "3-7 days",
|
||||
"results_visible": "After peeling completes",
|
||||
"price_range": "₩₩",
|
||||
"price_details": {
|
||||
"light_peel": "100,000-200,000 KRW",
|
||||
"medium_peel": "300,000-500,000 KRW",
|
||||
"deep_peel": "700,000-1,000,000 KRW"
|
||||
},
|
||||
"target_areas": [
|
||||
"Full face",
|
||||
"Neck",
|
||||
"Décolletage",
|
||||
"Hands",
|
||||
"Back"
|
||||
],
|
||||
"benefits": [
|
||||
"Improves texture",
|
||||
"Reduces pigmentation",
|
||||
"Minimizes pores",
|
||||
"Treats acne",
|
||||
"Stimulates collagen"
|
||||
],
|
||||
"side_effects": [
|
||||
"Peeling",
|
||||
"Redness",
|
||||
"Sensitivity",
|
||||
"Temporary darkening"
|
||||
],
|
||||
"contraindications": [
|
||||
"Active herpes",
|
||||
"Isotretinoin use",
|
||||
"Pregnancy",
|
||||
"Open wounds"
|
||||
],
|
||||
"seo_priority": "medium",
|
||||
"search_volume": 8100,
|
||||
"competition": "medium"
|
||||
},
|
||||
{
|
||||
"id": "acne-treatment",
|
||||
"name_en": "Acne Treatment",
|
||||
"name_kr": "여드름 치료",
|
||||
"name_cn": "痤疮治疗",
|
||||
"category": "Medical Dermatology",
|
||||
"subcategory": "Acne Management",
|
||||
"description": "Comprehensive medical treatment for acne and acne scarring",
|
||||
"detailed_description": "Our acne treatment program combines medical-grade therapies including laser treatments, chemical peels, and prescription medications to clear active acne and prevent future breakouts.",
|
||||
"keywords": [
|
||||
"acne treatment",
|
||||
"acne scars",
|
||||
"pimple treatment",
|
||||
"blackheads",
|
||||
"whiteheads",
|
||||
"cystic acne",
|
||||
"hormonal acne"
|
||||
],
|
||||
"procedure_time": "45-60 minutes",
|
||||
"sessions_required": "4-8 sessions",
|
||||
"recovery_time": "Minimal",
|
||||
"results_visible": "4-6 weeks",
|
||||
"price_range": "₩₩₩",
|
||||
"price_details": {
|
||||
"consultation": "50,000 KRW",
|
||||
"basic_treatment": "150,000-250,000 KRW",
|
||||
"laser_therapy": "300,000-500,000 KRW"
|
||||
},
|
||||
"target_areas": [
|
||||
"Face",
|
||||
"Back",
|
||||
"Chest",
|
||||
"Shoulders"
|
||||
],
|
||||
"benefits": [
|
||||
"Clears acne",
|
||||
"Prevents scarring",
|
||||
"Reduces inflammation",
|
||||
"Improves skin texture",
|
||||
"Boosts confidence"
|
||||
],
|
||||
"side_effects": [
|
||||
"Initial purging",
|
||||
"Dryness",
|
||||
"Mild irritation",
|
||||
"Sun sensitivity"
|
||||
],
|
||||
"contraindications": [
|
||||
"Pregnancy (certain medications)",
|
||||
"Photosensitivity disorders",
|
||||
"Active infections"
|
||||
],
|
||||
"seo_priority": "high",
|
||||
"search_volume": 12100,
|
||||
"competition": "medium"
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"last_updated": "2024-11-19",
|
||||
"total_services": 5,
|
||||
"categories": [
|
||||
"Dermatology",
|
||||
"Cosmetic Dermatology",
|
||||
"Medical Aesthetics",
|
||||
"Medical Dermatology"
|
||||
],
|
||||
"price_currency": "KRW"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,282 @@
|
||||
# Laser Hair Removal in Gangnam | Expert Care | Jamie Clinic
|
||||
|
||||
<!-- Meta Tags -->
|
||||
<!--
|
||||
Title: Laser Hair Removal in Gangnam | Same-Day Appointments | Jamie Clinic
|
||||
Description: Looking for professional laser hair removal in Gangnam? Jamie Clinic offers state-of-the-art permanent hair reduction with experienced doctors. ✓ Same-day appointments ✓ Insurance accepted ✓ 15+ years of experience
|
||||
Canonical: https://www.jamieclinic.com/gangnam/laser-hair-removal/
|
||||
-->
|
||||
|
||||
## Professional Laser Hair Removal Available in Gangnam
|
||||
|
||||
Welcome to Jamie Clinic, your trusted provider for laser hair removal in Gangnam. Our medical team brings over 14 years of combined experience, utilizing the latest medical technology to ensure optimal results for our patients in the Gangnam area.
|
||||
|
||||
### Why Choose Jamie Clinic for Laser Hair Removal in Gangnam?
|
||||
|
||||
Located conveniently at 123 Teheran-ro, Gangnam-gu, Seoul, near COEX Mall, our Gangnam clinic specializes in providing personalized laser hair removal treatments tailored to each patient's unique needs. We understand the specific health concerns of Gangnam residents and have designed our services accordingly.
|
||||
|
||||
**Our Gangnam Advantages:**
|
||||
- 🏥 Modern facility equipped with latest diode and Alexandrite laser equipment
|
||||
- 👨⚕️ Board-certified specialists with ISO 9001, KAHF Certified
|
||||
- 📍 Easy access from Gangnam Station (Line 2), Sinnonhyeon Station (Line 9)
|
||||
- 🕐 Extended hours to accommodate busy Gangnam professionals
|
||||
- 💳 Accept major insurance plans popular in Gangnam
|
||||
|
||||
## Understanding Laser Hair Removal
|
||||
|
||||
### What Is Laser Hair Removal?
|
||||
|
||||
Laser hair removal is a medical procedure that uses concentrated light to target and destroy hair follicles, resulting in permanent hair reduction. Our FDA-approved laser systems deliver precise wavelengths of light that are absorbed by the pigment in hair follicles, effectively disabling them while leaving surrounding skin undamaged. This advanced technology has revolutionized the approach to unwanted hair removal, offering a long-term solution compared to traditional methods.
|
||||
|
||||
### Who Can Benefit from Laser Hair Removal?
|
||||
|
||||
Our laser hair removal treatment in Gangnam is ideal for patients experiencing:
|
||||
- Excessive unwanted hair growth requiring frequent shaving or waxing
|
||||
- Ingrown hairs and razor burn from traditional hair removal methods
|
||||
- Time constraints making regular hair removal maintenance challenging
|
||||
- Skin sensitivity or allergic reactions to depilatory creams and waxing
|
||||
|
||||
## Our Laser Hair Removal Process in Gangnam
|
||||
|
||||
### 1. Initial Consultation
|
||||
Your journey begins with a comprehensive consultation at our Gangnam clinic. Our specialists will:
|
||||
- Review your medical history and skin type
|
||||
- Conduct a patch test to determine optimal laser settings
|
||||
- Discuss your hair removal goals and expectations
|
||||
- Create a personalized treatment plan with session scheduling
|
||||
|
||||
### 2. Treatment Planning
|
||||
Based on your consultation, we develop a customized approach that considers:
|
||||
- Your specific hair type and skin tone
|
||||
- Lifestyle factors common to young professionals and affluent residents
|
||||
- Insurance coverage options for medical necessity cases
|
||||
- Optimal scheduling for your convenience around work commitments
|
||||
|
||||
### 3. Treatment Sessions
|
||||
Each laser hair removal session at our Gangnam facility typically involves:
|
||||
- Pre-treatment skin preparation and cooling
|
||||
- The procedure itself (approximately 15-60 minutes depending on area)
|
||||
- Post-treatment soothing gel application
|
||||
- Detailed aftercare instructions for best results
|
||||
|
||||
### 4. Follow-up Care
|
||||
We provide comprehensive follow-up support including:
|
||||
- Scheduled check-ups to monitor progress
|
||||
- 24/7 emergency hotline for any concerns
|
||||
- Treatment adjustments based on your results
|
||||
- Long-term maintenance planning
|
||||
|
||||
## Expected Results and Recovery
|
||||
|
||||
### What to Expect After Laser Hair Removal
|
||||
|
||||
Patients at our Gangnam clinic typically experience:
|
||||
- **Immediate effects**: Slight redness and warmth in treated areas
|
||||
- **Short-term (1-2 weeks)**: Hair shedding from treated follicles
|
||||
- **Long-term (1-3 months)**: Noticeable reduction in hair growth
|
||||
- **Final results**: 70-90% permanent hair reduction after complete treatment series
|
||||
|
||||
### Recovery Timeline
|
||||
- Day 1-3: Mild redness and sensitivity, similar to mild sunburn
|
||||
- Week 1: Hair begins to shed naturally from treated follicles
|
||||
- Week 2-4: Skin returns to normal, new hair growth visibly reduced
|
||||
- Month 2-3: Ready for next treatment session
|
||||
|
||||
## Safety and Credentials
|
||||
|
||||
### Our Medical Standards
|
||||
Jamie Clinic in Gangnam maintains the highest medical standards:
|
||||
- ✓ ISO 9001 Quality Management Certification
|
||||
- ✓ KAHF (Korean Association of Hair and Face) Certified
|
||||
- ✓ JCI Accredited facility
|
||||
- ✓ Member of Korean Dermatological Association
|
||||
|
||||
### Our Medical Team
|
||||
**Dr. Kim Jung-ho, MD**
|
||||
- Seoul National University Medical School
|
||||
- Dermatology Residency at Samsung Medical Center
|
||||
- 10+ years specializing in laser hair removal
|
||||
- Published research on laser technology in Asian skin types
|
||||
|
||||
**Dr. Park Mi-young, MD**
|
||||
- Yonsei University College of Medicine
|
||||
- Fellowship in Cosmetic Dermatology
|
||||
- 8+ years of laser treatment experience
|
||||
- Specialized training in sensitive skin treatments
|
||||
|
||||
## Pricing and Insurance
|
||||
|
||||
### Insurance Coverage
|
||||
We accept most major insurance plans used by Gangnam residents:
|
||||
- Samsung Fire & Marine Insurance
|
||||
- KB Insurance
|
||||
- Hyundai Marine & Fire Insurance
|
||||
- DB Insurance
|
||||
|
||||
### Payment Options
|
||||
For your convenience, we offer:
|
||||
- Insurance direct billing for eligible treatments
|
||||
- Flexible payment plans with 0% interest
|
||||
- All major credit cards accepted
|
||||
- HSA/FSA acceptance for medical procedures
|
||||
|
||||
### Transparent Pricing
|
||||
Contact us for a detailed quote. Factors affecting cost include:
|
||||
- Size and number of treatment areas
|
||||
- Number of sessions required (typically 6-8)
|
||||
- Your specific insurance coverage level
|
||||
- Package deals for multiple areas
|
||||
|
||||
**Pricing Guide:**
|
||||
- Small areas (upper lip, chin): 50,000-100,000 KRW per session
|
||||
- Medium areas (underarms, bikini): 100,000-200,000 KRW per session
|
||||
- Large areas (full legs, back): 200,000-400,000 KRW per session
|
||||
|
||||
## Patient Testimonials from Gangnam
|
||||
|
||||
> "After struggling with ingrown hairs for years, I finally found relief at Jamie Clinic. The team was professional, and the results exceeded my expectations. Being so close to my office in COEX made it incredibly convenient."
|
||||
> — J.K., Gangnam resident
|
||||
|
||||
> "The convenience of having such high-quality laser hair removal right here in Gangnam made all the difference. I no longer have to travel to other districts for treatment. The results have been life-changing!"
|
||||
> — S.L., Samsung Station area
|
||||
|
||||
> "Dr. Kim took the time to explain everything thoroughly. As someone with sensitive skin, I was nervous, but the treatment was much more comfortable than I expected. Highly recommend to anyone in Gangnam!"
|
||||
> — M.C., Gangnam professional
|
||||
|
||||
## Frequently Asked Questions
|
||||
|
||||
### General Questions
|
||||
|
||||
**Q: How do I know if laser hair removal is right for me?**
|
||||
A: The best way to determine if you're a candidate is through a consultation at our Gangnam clinic. We'll evaluate your skin type, hair color, medical history, and treatment goals. Most people with dark hair and light to medium skin tones are excellent candidates.
|
||||
|
||||
**Q: How long does laser hair removal take?**
|
||||
A: Treatment sessions typically last 15-60 minutes depending on the area being treated, though your first visit including consultation may take up to 90 minutes.
|
||||
|
||||
**Q: Is laser hair removal painful?**
|
||||
A: Most patients describe the sensation as similar to a rubber band snapping against the skin. We use advanced cooling systems and can apply numbing cream for sensitive areas to ensure your comfort.
|
||||
|
||||
**Q: How many sessions will I need?**
|
||||
A: Most patients require 6-8 sessions spaced 4-6 weeks apart for optimal results. The exact number depends on factors like hair color, skin type, and the area being treated.
|
||||
|
||||
### Location-Specific Questions
|
||||
|
||||
**Q: Where exactly is your Gangnam clinic located?**
|
||||
A: We're located at 123 Teheran-ro, Gangnam-gu, Seoul, just 3 minutes walk from Gangnam Station Exit 11. We're in the medical building next to COEX Mall. Free underground parking is available for all patients.
|
||||
|
||||
**Q: Do you have parking available?**
|
||||
A: Yes, we offer free underground parking for all patients. The parking entrance is on the left side of the building. Simply validate your parking ticket at reception.
|
||||
|
||||
**Q: What are your hours for the Gangnam clinic?**
|
||||
A:
|
||||
- Monday-Friday: 9:00 AM - 8:00 PM
|
||||
- Saturday: 9:00 AM - 6:00 PM
|
||||
- Sunday: 10:00 AM - 4:00 PM
|
||||
|
||||
**Q: How do I get there by public transportation?**
|
||||
A: Take Line 2 to Gangnam Station and use Exit 11. Walk straight for about 3 minutes. We're in the tall glass medical building on your right. Alternatively, take Line 9 to Sinnonhyeon Station Exit 6 and walk 5 minutes.
|
||||
|
||||
### Insurance and Payment
|
||||
|
||||
**Q: Does insurance cover laser hair removal?**
|
||||
A: Coverage varies by plan. Medical necessity cases (such as pilonidal cysts or folliculitis) may be covered. Our insurance specialists can verify your benefits before your appointment.
|
||||
|
||||
**Q: Do you offer payment plans?**
|
||||
A: Yes, we offer flexible payment options including 3, 6, or 12-month interest-free payment plans for treatments over 1,000,000 KRW.
|
||||
|
||||
**Q: Can I use my FSA or HSA?**
|
||||
A: Yes, laser hair removal for medical reasons is typically FSA/HSA eligible. We can provide the necessary documentation for reimbursement.
|
||||
|
||||
## Schedule Your Laser Hair Removal Consultation in Gangnam
|
||||
|
||||
Ready to say goodbye to unwanted hair forever? Contact our Gangnam clinic today:
|
||||
|
||||
### Contact Information
|
||||
📍 **Address**: 123 Teheran-ro, Gangnam-gu, Seoul 06234
|
||||
📞 **Phone**: +82-2-1234-5678
|
||||
📧 **Email**: gangnam@jamieclinic.com
|
||||
🌐 **Online Booking**: https://www.jamieclinic.com/book-gangnam
|
||||
|
||||
### Office Hours
|
||||
- **Monday-Friday**: 9:00 AM - 8:00 PM
|
||||
- **Saturday**: 9:00 AM - 6:00 PM
|
||||
- **Sunday**: 10:00 AM - 4:00 PM
|
||||
- **Emergency**: 24/7 hotline available at +82-2-1234-9999
|
||||
|
||||
### Getting Here
|
||||
**By Subway**:
|
||||
- Line 2: Gangnam Station Exit 11 (3-minute walk)
|
||||
- Line 9: Sinnonhyeon Station Exit 6 (5-minute walk)
|
||||
- Sinbundang Line: Gangnam Station Exit 11 (3-minute walk)
|
||||
|
||||
**By Bus**: Routes 146, 341, 360, 740 all stop within 2 minutes of our clinic
|
||||
|
||||
**By Car**: Navigate to 123 Teheran-ro, Gangnam-gu. Underground parking entrance on the left side of the building. Free parking for all patients.
|
||||
|
||||
### Nearby Landmarks
|
||||
- COEX Mall (1-minute walk)
|
||||
- Samsung Station (10-minute walk)
|
||||
- Bongeunsa Temple (15-minute walk)
|
||||
- Gangnam Finance Center (5-minute walk)
|
||||
|
||||
---
|
||||
|
||||
<!-- Schema Markup -->
|
||||
<script type='application/ld+json'>
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "MedicalBusiness",
|
||||
"name": "Jamie Clinic - Gangnam",
|
||||
"url": "https://www.jamieclinic.com",
|
||||
"telephone": "+82-2-1234-5678",
|
||||
"email": "info@jamieclinic.com",
|
||||
"address": {
|
||||
"@type": "PostalAddress",
|
||||
"streetAddress": "123 Teheran-ro, Gangnam-gu, Seoul",
|
||||
"addressLocality": "Gangnam",
|
||||
"addressCountry": "KR"
|
||||
},
|
||||
"geo": {
|
||||
"@type": "GeoCoordinates",
|
||||
"latitude": 37.4979,
|
||||
"longitude": 127.0276
|
||||
},
|
||||
"areaServed": {
|
||||
"@type": "City",
|
||||
"name": "Gangnam"
|
||||
},
|
||||
"availableService": {
|
||||
"@type": "MedicalProcedure",
|
||||
"name": "Laser Hair Removal",
|
||||
"description": "Permanent hair reduction using state-of-the-art laser technology"
|
||||
},
|
||||
"priceRange": "₩₩₩",
|
||||
"openingHoursSpecification": [
|
||||
{
|
||||
"@type": "OpeningHoursSpecification",
|
||||
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
|
||||
"opens": "09:00",
|
||||
"closes": "20:00"
|
||||
},
|
||||
{
|
||||
"@type": "OpeningHoursSpecification",
|
||||
"dayOfWeek": "Saturday",
|
||||
"opens": "09:00",
|
||||
"closes": "18:00"
|
||||
},
|
||||
{
|
||||
"@type": "OpeningHoursSpecification",
|
||||
"dayOfWeek": "Sunday",
|
||||
"opens": "10:00",
|
||||
"closes": "16:00"
|
||||
}
|
||||
],
|
||||
"aggregateRating": {
|
||||
"@type": "AggregateRating",
|
||||
"ratingValue": "4.8",
|
||||
"reviewCount": "324"
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
*Last updated: November 19, 2024 | Jamie Clinic - Professional Laser Hair Removal in Gangnam*
|
||||
@@ -0,0 +1,393 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Gateway Page Content Generator
|
||||
Automates the creation of SEO-optimized gateway pages for local services
|
||||
"""
|
||||
|
||||
import json
|
||||
import os
|
||||
from datetime import datetime
|
||||
from typing import Dict, List, Optional
|
||||
import re
|
||||
from dataclasses import dataclass
|
||||
from pathlib import Path
|
||||
|
||||
@dataclass
|
||||
class Location:
|
||||
"""Location data structure"""
|
||||
id: str
|
||||
name_en: str
|
||||
name_kr: str
|
||||
full_address: str
|
||||
landmarks: List[str]
|
||||
subway_stations: List[str]
|
||||
demographics: str
|
||||
latitude: float
|
||||
longitude: float
|
||||
|
||||
@dataclass
|
||||
class Service:
|
||||
"""Service data structure"""
|
||||
id: str
|
||||
name_en: str
|
||||
name_kr: str
|
||||
category: str
|
||||
description: str
|
||||
keywords: List[str]
|
||||
procedure_time: str
|
||||
recovery_time: str
|
||||
price_range: str
|
||||
|
||||
@dataclass
|
||||
class Brand:
|
||||
"""Brand/Clinic information"""
|
||||
name_en: str
|
||||
name_kr: str
|
||||
website: str
|
||||
phone: str
|
||||
email: str
|
||||
established_year: int
|
||||
certifications: List[str]
|
||||
unique_selling_points: List[str]
|
||||
|
||||
class GatewayPageGenerator:
|
||||
"""Main class for generating gateway page content"""
|
||||
|
||||
def __init__(self, brand: Brand, template_path: str = "templates/"):
|
||||
self.brand = brand
|
||||
self.template_path = Path(template_path)
|
||||
self.generated_pages = []
|
||||
|
||||
def load_template(self, template_name: str) -> str:
|
||||
"""Load a template file"""
|
||||
template_file = self.template_path / template_name
|
||||
if template_file.exists():
|
||||
with open(template_file, 'r', encoding='utf-8') as f:
|
||||
return f.read()
|
||||
else:
|
||||
raise FileNotFoundError(f"Template {template_name} not found")
|
||||
|
||||
def generate_meta_tags(self, service: Service, location: Location) -> Dict:
|
||||
"""Generate SEO meta tags"""
|
||||
return {
|
||||
"title": f"{service.name_en} in {location.name_en} | Expert {service.category} | {self.brand.name_en}",
|
||||
"description": f"Looking for {service.name_en.lower()} in {location.name_en}? "
|
||||
f"{self.brand.name_en} offers professional {service.category.lower()} services. "
|
||||
f"✓ Experienced team ✓ Latest technology ✓ {self.brand.unique_selling_points[0]}",
|
||||
"keywords": ", ".join([
|
||||
f"{service.name_en} {location.name_en}",
|
||||
f"{location.name_en} {service.name_en}",
|
||||
*service.keywords,
|
||||
f"{service.category} {location.name_en}"
|
||||
]),
|
||||
"canonical": f"https://{self.brand.website}/{location.id}/{service.id}/",
|
||||
"og:title": f"{service.name_en} in {location.name_en} - {self.brand.name_en}",
|
||||
"og:description": f"Professional {service.name_en} services in {location.name_en}. "
|
||||
f"Book your consultation today.",
|
||||
"og:image": f"https://{self.brand.website}/images/{service.id}-{location.id}-og.jpg"
|
||||
}
|
||||
|
||||
def generate_schema_markup(self, service: Service, location: Location) -> str:
|
||||
"""Generate JSON-LD schema markup"""
|
||||
schema = {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "MedicalBusiness",
|
||||
"name": f"{self.brand.name_en} - {location.name_en}",
|
||||
"url": f"https://{self.brand.website}",
|
||||
"telephone": self.brand.phone,
|
||||
"email": self.brand.email,
|
||||
"address": {
|
||||
"@type": "PostalAddress",
|
||||
"streetAddress": location.full_address,
|
||||
"addressLocality": location.name_en,
|
||||
"addressCountry": "KR"
|
||||
},
|
||||
"geo": {
|
||||
"@type": "GeoCoordinates",
|
||||
"latitude": location.latitude,
|
||||
"longitude": location.longitude
|
||||
},
|
||||
"areaServed": {
|
||||
"@type": "City",
|
||||
"name": location.name_en
|
||||
},
|
||||
"availableService": {
|
||||
"@type": "MedicalProcedure",
|
||||
"name": service.name_en,
|
||||
"description": service.description
|
||||
},
|
||||
"priceRange": service.price_range
|
||||
}
|
||||
return json.dumps(schema, indent=2, ensure_ascii=False)
|
||||
|
||||
def generate_content_variations(self, service: Service, location: Location) -> Dict[str, List[str]]:
|
||||
"""Generate content variations for uniqueness"""
|
||||
return {
|
||||
"hero_headlines": [
|
||||
f"Professional {service.name_en} in {location.name_en}",
|
||||
f"{location.name_en}'s Premier {service.name_en} {service.category}",
|
||||
f"Expert {service.name_en} Services for {location.name_en} Residents",
|
||||
f"Transform Your Look with {service.name_en} in {location.name_en}"
|
||||
],
|
||||
"intro_paragraphs": [
|
||||
f"Welcome to {self.brand.name_en}, where we specialize in providing exceptional "
|
||||
f"{service.name_en} services to the {location.name_en} community. "
|
||||
f"Our state-of-the-art facility, conveniently located near {location.landmarks[0]}, "
|
||||
f"combines advanced technology with personalized care.",
|
||||
|
||||
f"Looking for trusted {service.name_en} in {location.name_en}? "
|
||||
f"At {self.brand.name_en}, we've been serving the {location.demographics} "
|
||||
f"for over {datetime.now().year - self.brand.established_year} years. "
|
||||
f"Our expert team understands the unique needs of {location.name_en} residents.",
|
||||
|
||||
f"Discover why {location.name_en} residents choose {self.brand.name_en} "
|
||||
f"for their {service.name_en} needs. Located just minutes from "
|
||||
f"{', '.join(location.subway_stations[:2])}, we offer {service.category} "
|
||||
f"services that deliver remarkable results."
|
||||
],
|
||||
"cta_buttons": [
|
||||
f"Book Your {location.name_en} Consultation",
|
||||
f"Schedule {service.name_en} Today",
|
||||
f"Get Started in {location.name_en}",
|
||||
f"Reserve Your Appointment"
|
||||
],
|
||||
"trust_signals": [
|
||||
f"Trusted by {location.name_en} residents since {self.brand.established_year}",
|
||||
f"Over 10,000 successful {service.category} treatments",
|
||||
f"5-star rated {service.name_en} clinic in {location.name_en}",
|
||||
f"Certified specialists serving {location.demographics}"
|
||||
]
|
||||
}
|
||||
|
||||
def localize_content(self, content: str, service: Service, location: Location) -> str:
|
||||
"""Add local elements to content"""
|
||||
local_elements = {
|
||||
"transportation": f"Easily accessible via {', '.join(location.subway_stations)} stations",
|
||||
"landmarks": f"Located near {' and '.join(location.landmarks[:2])}",
|
||||
"community": f"Proud to serve the {location.name_en} community",
|
||||
"convenience": f"Convenient for {location.demographics} in {location.name_en}",
|
||||
"local_stats": f"Join thousands of satisfied patients from {location.name_en}"
|
||||
}
|
||||
|
||||
# Add local elements naturally throughout content
|
||||
for key, value in local_elements.items():
|
||||
placeholder = f"[LOCAL_{key.upper()}]"
|
||||
if placeholder in content:
|
||||
content = content.replace(placeholder, value)
|
||||
|
||||
return content
|
||||
|
||||
def generate_page(self, service: Service, location: Location,
|
||||
template_name: str = "gateway-page-medical.md") -> str:
|
||||
"""Generate a complete gateway page"""
|
||||
|
||||
# Load template
|
||||
template = self.load_template(template_name)
|
||||
|
||||
# Generate components
|
||||
meta_tags = self.generate_meta_tags(service, location)
|
||||
schema = self.generate_schema_markup(service, location)
|
||||
variations = self.generate_content_variations(service, location)
|
||||
|
||||
# Replace placeholders in template
|
||||
replacements = {
|
||||
"[Medical Service]": service.name_en,
|
||||
"[Location]": location.name_en,
|
||||
"[location]": location.name_en.lower(),
|
||||
"[Clinic Name]": self.brand.name_en,
|
||||
"[service-slug]": service.id,
|
||||
"[X years]": str(datetime.now().year - self.brand.established_year),
|
||||
"[specific address near landmark]": f"{location.full_address}, near {location.landmarks[0]}",
|
||||
"[nearby subway/bus stations]": ", ".join(location.subway_stations),
|
||||
"[certification details]": ", ".join(self.brand.certifications[:2]),
|
||||
"[equipment type]": f"{service.category} equipment",
|
||||
"[duration]": service.procedure_time,
|
||||
"[Medical Specialty]": service.category,
|
||||
"[phone-number]": self.brand.phone,
|
||||
"[website-url]": f"https://{self.brand.website}",
|
||||
"[page-url]": f"https://{self.brand.website}/{location.id}/{service.id}/",
|
||||
"[latitude]": str(location.latitude),
|
||||
"[longitude]": str(location.longitude),
|
||||
}
|
||||
|
||||
# Apply replacements
|
||||
content = template
|
||||
for placeholder, value in replacements.items():
|
||||
content = content.replace(placeholder, value)
|
||||
|
||||
# Add localized content
|
||||
content = self.localize_content(content, service, location)
|
||||
|
||||
# Add schema markup at the end if not already present
|
||||
if '"@context": "https://schema.org"' not in content:
|
||||
content += f"\n\n<!-- Schema Markup -->\n<script type='application/ld+json'>\n{schema}\n</script>"
|
||||
|
||||
return content
|
||||
|
||||
def generate_batch(self, services: List[Service], locations: List[Location],
|
||||
output_dir: str = "output/") -> List[str]:
|
||||
"""Generate multiple gateway pages"""
|
||||
output_path = Path(output_dir)
|
||||
output_path.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
generated_files = []
|
||||
|
||||
for location in locations:
|
||||
location_dir = output_path / location.id
|
||||
location_dir.mkdir(exist_ok=True)
|
||||
|
||||
for service in services:
|
||||
# Generate content
|
||||
content = self.generate_page(service, location)
|
||||
|
||||
# Save to file
|
||||
filename = f"{service.id}-{location.id}.md"
|
||||
filepath = location_dir / filename
|
||||
|
||||
with open(filepath, 'w', encoding='utf-8') as f:
|
||||
f.write(content)
|
||||
|
||||
generated_files.append(str(filepath))
|
||||
print(f"✓ Generated: {filepath}")
|
||||
|
||||
# Generate index file
|
||||
self.generate_index(services, locations, output_path)
|
||||
|
||||
return generated_files
|
||||
|
||||
def generate_index(self, services: List[Service], locations: List[Location],
|
||||
output_path: Path):
|
||||
"""Generate an index of all created pages"""
|
||||
index_content = f"# Gateway Pages Index - {self.brand.name_en}\n\n"
|
||||
index_content += f"Generated: {datetime.now().strftime('%Y-%m-%d %H:%M')}\n\n"
|
||||
index_content += "## Pages by Location\n\n"
|
||||
|
||||
for location in locations:
|
||||
index_content += f"### {location.name_en}\n"
|
||||
for service in services:
|
||||
url = f"/{location.id}/{service.id}/"
|
||||
index_content += f"- [{service.name_en} in {location.name_en}]({url})\n"
|
||||
index_content += "\n"
|
||||
|
||||
index_content += "## Pages by Service\n\n"
|
||||
for service in services:
|
||||
index_content += f"### {service.name_en}\n"
|
||||
for location in locations:
|
||||
url = f"/{location.id}/{service.id}/"
|
||||
index_content += f"- [{location.name_en}]({url})\n"
|
||||
index_content += "\n"
|
||||
|
||||
index_content += f"\n---\nTotal Pages Generated: {len(services) * len(locations)}\n"
|
||||
|
||||
with open(output_path / "index.md", 'w', encoding='utf-8') as f:
|
||||
f.write(index_content)
|
||||
|
||||
def create_sample_data():
|
||||
"""Create sample data for testing"""
|
||||
|
||||
# Sample brand
|
||||
brand = Brand(
|
||||
name_en="Jamie Clinic",
|
||||
name_kr="제이미 클리닉",
|
||||
website="www.jamieclinic.com",
|
||||
phone="+82-2-1234-5678",
|
||||
email="info@jamieclinic.com",
|
||||
established_year=2010,
|
||||
certifications=["ISO 9001", "KAHF Certified", "JCI Accredited"],
|
||||
unique_selling_points=[
|
||||
"Same-day appointments available",
|
||||
"15+ years of experience",
|
||||
"Latest medical technology"
|
||||
]
|
||||
)
|
||||
|
||||
# Sample locations
|
||||
locations = [
|
||||
Location(
|
||||
id="gangnam",
|
||||
name_en="Gangnam",
|
||||
name_kr="강남",
|
||||
full_address="123 Teheran-ro, Gangnam-gu, Seoul",
|
||||
landmarks=["COEX", "Gangnam Station", "Samsung Station"],
|
||||
subway_stations=["Gangnam Station (Line 2)", "Sinnonhyeon Station (Line 9)"],
|
||||
demographics="Young professionals and affluent residents",
|
||||
latitude=37.4979,
|
||||
longitude=127.0276
|
||||
),
|
||||
Location(
|
||||
id="myeongdong",
|
||||
name_en="Myeongdong",
|
||||
name_kr="명동",
|
||||
full_address="456 Myeongdong-gil, Jung-gu, Seoul",
|
||||
landmarks=["Myeongdong Cathedral", "Lotte Department Store"],
|
||||
subway_stations=["Myeongdong Station (Line 4)", "Euljiro 1-ga Station (Line 2)"],
|
||||
demographics="Tourists and young shoppers",
|
||||
latitude=37.5636,
|
||||
longitude=126.9869
|
||||
)
|
||||
]
|
||||
|
||||
# Sample services
|
||||
services = [
|
||||
Service(
|
||||
id="laser-hair-removal",
|
||||
name_en="Laser Hair Removal",
|
||||
name_kr="레이저 제모",
|
||||
category="Dermatology",
|
||||
description="Advanced laser technology for permanent hair reduction",
|
||||
keywords=["permanent hair removal", "IPL", "diode laser"],
|
||||
procedure_time="30-60 minutes",
|
||||
recovery_time="No downtime",
|
||||
price_range="₩₩₩"
|
||||
),
|
||||
Service(
|
||||
id="botox",
|
||||
name_en="Botox Treatment",
|
||||
name_kr="보톡스",
|
||||
category="Cosmetic Dermatology",
|
||||
description="FDA-approved botulinum toxin for wrinkle reduction",
|
||||
keywords=["wrinkle treatment", "anti-aging", "facial rejuvenation"],
|
||||
procedure_time="15-30 minutes",
|
||||
recovery_time="No downtime",
|
||||
price_range="₩₩₩₩"
|
||||
)
|
||||
]
|
||||
|
||||
return brand, locations, services
|
||||
|
||||
def main():
|
||||
"""Main execution function"""
|
||||
print("=" * 60)
|
||||
print("Gateway Page Content Generator")
|
||||
print("=" * 60)
|
||||
|
||||
# Get sample data
|
||||
brand, locations, services = create_sample_data()
|
||||
|
||||
# Initialize generator
|
||||
generator = GatewayPageGenerator(brand)
|
||||
|
||||
# Generate pages
|
||||
print(f"\nGenerating {len(services) * len(locations)} gateway pages...")
|
||||
print("-" * 40)
|
||||
|
||||
generated_files = generator.generate_batch(services, locations)
|
||||
|
||||
print("-" * 40)
|
||||
print(f"\n✅ Successfully generated {len(generated_files)} pages!")
|
||||
print(f"📁 Output directory: output/")
|
||||
print(f"📋 Index file created: output/index.md")
|
||||
|
||||
# Generate report
|
||||
print("\n" + "=" * 60)
|
||||
print("GENERATION REPORT")
|
||||
print("=" * 60)
|
||||
print(f"Brand: {brand.name_en}")
|
||||
print(f"Locations: {', '.join([loc.name_en for loc in locations])}")
|
||||
print(f"Services: {', '.join([svc.name_en for svc in services])}")
|
||||
print(f"Total Pages: {len(generated_files)}")
|
||||
print(f"Timestamp: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
||||
print("=" * 60)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,231 @@
|
||||
# [Medical Service] in [Location] | [Clinic Name]
|
||||
|
||||
<!-- Meta Tags -->
|
||||
<!--
|
||||
Title: [Medical Service] in [Location] | Expert Care | [Clinic Name]
|
||||
Description: Looking for professional [medical service] in [location]? [Clinic Name] offers state-of-the-art [service] with experienced doctors. ✓ Same-day appointments ✓ Insurance accepted ✓ [Unique benefit]
|
||||
Canonical: https://example.com/[location]/[service-slug]/
|
||||
-->
|
||||
|
||||
## Professional [Medical Service] Available in [Location]
|
||||
|
||||
Welcome to [Clinic Name], your trusted provider for [medical service] in [location]. Our medical team brings over [X years] of combined experience, utilizing the latest medical technology to ensure optimal results for our patients in the [location] area.
|
||||
|
||||
### Why Choose [Clinic Name] for [Medical Service] in [Location]?
|
||||
|
||||
Located conveniently at [specific address near landmark], our [location] clinic specializes in providing personalized [medical service] treatments tailored to each patient's unique needs. We understand the specific health concerns of [location] residents and have designed our services accordingly.
|
||||
|
||||
**Our [Location] Advantages:**
|
||||
- 🏥 Modern facility equipped with latest [equipment type]
|
||||
- 👨⚕️ Board-certified specialists with [certification details]
|
||||
- 📍 Easy access from [nearby subway/bus stations]
|
||||
- 🕐 Extended hours to accommodate busy [location] professionals
|
||||
- 💳 Accept major insurance plans popular in [location]
|
||||
|
||||
## Understanding [Medical Service]
|
||||
|
||||
### What Is [Medical Service]?
|
||||
|
||||
[Detailed medical explanation of the service, including scientific background, FDA approvals if applicable, and medical benefits. This section should be educational while remaining accessible.]
|
||||
|
||||
### Who Can Benefit from [Medical Service]?
|
||||
|
||||
Our [medical service] treatment in [location] is ideal for patients experiencing:
|
||||
- [Condition 1 with brief explanation]
|
||||
- [Condition 2 with brief explanation]
|
||||
- [Condition 3 with brief explanation]
|
||||
- [Condition 4 with brief explanation]
|
||||
|
||||
## Our [Medical Service] Process in [Location]
|
||||
|
||||
### 1. Initial Consultation
|
||||
Your journey begins with a comprehensive consultation at our [location] clinic. Our specialists will:
|
||||
- Review your medical history
|
||||
- Conduct necessary diagnostic tests
|
||||
- Discuss your treatment goals
|
||||
- Create a personalized treatment plan
|
||||
|
||||
### 2. Treatment Planning
|
||||
Based on your consultation, we develop a customized approach that considers:
|
||||
- Your specific medical condition
|
||||
- Lifestyle factors common to [location] residents
|
||||
- Insurance coverage options
|
||||
- Optimal scheduling for your convenience
|
||||
|
||||
### 3. Treatment Sessions
|
||||
Each [medical service] session at our [location] facility typically involves:
|
||||
- Pre-treatment preparation
|
||||
- The procedure itself (approximately [duration])
|
||||
- Post-treatment monitoring
|
||||
- Detailed aftercare instructions
|
||||
|
||||
### 4. Follow-up Care
|
||||
We provide comprehensive follow-up support including:
|
||||
- Scheduled check-ups
|
||||
- 24/7 emergency hotline
|
||||
- Ongoing treatment adjustments
|
||||
- Long-term health monitoring
|
||||
|
||||
## Expected Results and Recovery
|
||||
|
||||
### What to Expect After [Medical Service]
|
||||
|
||||
Patients at our [location] clinic typically experience:
|
||||
- **Immediate effects**: [Description]
|
||||
- **Short-term (1-2 weeks)**: [Description]
|
||||
- **Long-term (1-3 months)**: [Description]
|
||||
- **Final results**: [Timeline and description]
|
||||
|
||||
### Recovery Timeline
|
||||
- Day 1-3: [Recovery details]
|
||||
- Week 1: [Recovery details]
|
||||
- Week 2-4: [Recovery details]
|
||||
- Month 2-3: [Recovery details]
|
||||
|
||||
## Safety and Credentials
|
||||
|
||||
### Our Medical Standards
|
||||
[Clinic Name] in [location] maintains the highest medical standards:
|
||||
- ✓ [Relevant medical certification]
|
||||
- ✓ [Hospital affiliation if applicable]
|
||||
- ✓ [Safety protocol certification]
|
||||
- ✓ [Professional membership]
|
||||
|
||||
### Our Medical Team
|
||||
**Dr. [Name], MD**
|
||||
- [Medical school]
|
||||
- [Residency/Fellowship]
|
||||
- [Years of experience] specializing in [medical service]
|
||||
- [Special recognition or research]
|
||||
|
||||
## Pricing and Insurance
|
||||
|
||||
### Insurance Coverage
|
||||
We accept most major insurance plans used by [location] residents:
|
||||
- [Insurance provider 1]
|
||||
- [Insurance provider 2]
|
||||
- [Insurance provider 3]
|
||||
- [Insurance provider 4]
|
||||
|
||||
### Payment Options
|
||||
For your convenience, we offer:
|
||||
- Insurance direct billing
|
||||
- Flexible payment plans
|
||||
- Credit card payments
|
||||
- HSA/FSA acceptance
|
||||
|
||||
### Transparent Pricing
|
||||
Contact us for a detailed quote. Factors affecting cost include:
|
||||
- Severity of condition
|
||||
- Number of sessions required
|
||||
- Insurance coverage level
|
||||
- Additional treatments needed
|
||||
|
||||
## Patient Testimonials from [Location]
|
||||
|
||||
> "After struggling with [condition] for years, I finally found relief at [Clinic Name]. The team was professional, and the results exceeded my expectations."
|
||||
> — [Patient initials], [Location] resident
|
||||
|
||||
> "The convenience of having such high-quality [medical service] right here in [location] made all the difference. I no longer have to travel to [other area] for treatment."
|
||||
> — [Patient initials], [Nearby neighborhood]
|
||||
|
||||
> "Dr. [Name] took the time to explain everything thoroughly. I felt confident throughout the entire process."
|
||||
> — [Patient initials], [Location] professional
|
||||
|
||||
## Frequently Asked Questions
|
||||
|
||||
### General Questions
|
||||
|
||||
**Q: How do I know if [medical service] is right for me?**
|
||||
A: The best way to determine if you're a candidate is through a consultation at our [location] clinic. We'll evaluate your medical history, current condition, and treatment goals.
|
||||
|
||||
**Q: How long does [medical service] take?**
|
||||
A: Treatment sessions typically last [duration], though your first visit including consultation may take [longer duration].
|
||||
|
||||
**Q: Is [medical service] painful?**
|
||||
A: [Comfort level explanation with pain management options available]
|
||||
|
||||
### Location-Specific Questions
|
||||
|
||||
**Q: Where exactly is your [location] clinic located?**
|
||||
A: We're located at [full address], just [distance] from [landmark/station]. [Parking/public transport information].
|
||||
|
||||
**Q: Do you have parking available?**
|
||||
A: Yes, we offer [parking details specific to location].
|
||||
|
||||
**Q: What are your hours for the [location] clinic?**
|
||||
A:
|
||||
- Monday-Friday: [hours]
|
||||
- Saturday: [hours]
|
||||
- Sunday: [hours/closed]
|
||||
|
||||
### Insurance and Payment
|
||||
|
||||
**Q: Does insurance cover [medical service]?**
|
||||
A: Coverage varies by plan. Our insurance specialists can verify your benefits before your appointment.
|
||||
|
||||
**Q: Do you offer payment plans?**
|
||||
A: Yes, we offer flexible payment options including [specific plans available].
|
||||
|
||||
## Schedule Your [Medical Service] Consultation in [Location]
|
||||
|
||||
Ready to take the first step? Contact our [location] clinic today:
|
||||
|
||||
### Contact Information
|
||||
📍 **Address**: [Full address]
|
||||
📞 **Phone**: [Local phone number]
|
||||
📧 **Email**: [location]@[clinicname].com
|
||||
🌐 **Online Booking**: [URL]
|
||||
|
||||
### Office Hours
|
||||
- **Monday-Friday**: [Hours]
|
||||
- **Saturday**: [Hours]
|
||||
- **Sunday**: [Hours/Closed]
|
||||
- **Emergency**: [24/7 hotline if available]
|
||||
|
||||
### Getting Here
|
||||
**By Subway**: [Detailed directions from nearest station]
|
||||
**By Bus**: [Bus routes and stops]
|
||||
**By Car**: [Driving directions and parking info]
|
||||
|
||||
---
|
||||
|
||||
<!-- Schema Markup -->
|
||||
```json
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "MedicalClinic",
|
||||
"name": "[Clinic Name] - [Location]",
|
||||
"image": "[clinic-image-url]",
|
||||
"@id": "[page-url]",
|
||||
"url": "[website-url]",
|
||||
"telephone": "[phone-number]",
|
||||
"address": {
|
||||
"@type": "PostalAddress",
|
||||
"streetAddress": "[street]",
|
||||
"addressLocality": "[city]",
|
||||
"addressRegion": "[state/province]",
|
||||
"postalCode": "[zip]",
|
||||
"addressCountry": "KR"
|
||||
},
|
||||
"geo": {
|
||||
"@type": "GeoCoordinates",
|
||||
"latitude": [latitude],
|
||||
"longitude": [longitude]
|
||||
},
|
||||
"openingHoursSpecification": {
|
||||
"@type": "OpeningHoursSpecification",
|
||||
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
|
||||
"opens": "09:00",
|
||||
"closes": "18:00"
|
||||
},
|
||||
"medicalSpecialty": "[Medical Specialty]",
|
||||
"availableService": {
|
||||
"@type": "MedicalProcedure",
|
||||
"name": "[Medical Service]",
|
||||
"description": "[Service Description]"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
*Last updated: [Date] | [Clinic Name] - Professional [Medical Service] in [Location]*
|
||||
238
ourdigital-custom-skills/20-jamie-brand-editor/README.md
Normal file
238
ourdigital-custom-skills/20-jamie-brand-editor/README.md
Normal file
@@ -0,0 +1,238 @@
|
||||
# Jamie Marketing Brand Editor Claude Skill
|
||||
|
||||
A comprehensive Claude Skills package for creating, reviewing, and optimizing marketing content for Jamie Plastic Surgery Clinic while ensuring strict compliance with Korean medical advertising regulations.
|
||||
|
||||
## Overview
|
||||
|
||||
This skill combines deep knowledge of Jamie Clinic's brand identity with automated compliance checking for Korean medical advertising law (의료법 제56조). It enables marketing teams to create consistent, compliant, and effective content across all digital channels.
|
||||
|
||||
## What's Included
|
||||
|
||||
### Documentation
|
||||
- **SKILL.md**: Complete skill documentation with usage instructions and examples
|
||||
- **brand_voice_guide_korean.md**: Comprehensive brand voice guidelines in Korean
|
||||
- **medical_advertising_law_summary_korean.md**: Korean medical advertising regulations summary
|
||||
|
||||
### Python Scripts
|
||||
- **compliance_checker.py**: Automated content scanning for regulatory violations
|
||||
|
||||
### Templates (Coming in future updates)
|
||||
- Procedure page templates
|
||||
- Blog post structures
|
||||
- Social media content frameworks
|
||||
- Advertising copy templates
|
||||
|
||||
## Quick Start
|
||||
|
||||
### Using the Skill in Claude
|
||||
|
||||
1. Load the SKILL.md file into your Claude Project
|
||||
2. Reference the skill when creating or reviewing medical marketing content
|
||||
3. Claude will automatically apply brand guidelines and check compliance
|
||||
|
||||
Example prompt:
|
||||
```
|
||||
Using the Jamie Marketing Brand Editor skill, create a webpage introduction for endoscopic forehead lift surgery targeting women aged 35-50.
|
||||
```
|
||||
|
||||
### Using the Python Scripts
|
||||
|
||||
```bash
|
||||
# Check content for compliance violations
|
||||
python scripts/compliance_checker.py --input my_content.txt --output report.json
|
||||
|
||||
# View detailed violation information
|
||||
python scripts/compliance_checker.py --input my_content.txt --verbose
|
||||
```
|
||||
|
||||
## Key Features
|
||||
|
||||
### Brand Consistency
|
||||
- Maintains Jamie's professional-yet-warm tone across all content
|
||||
- Applies proven content structures from successful campaigns
|
||||
- Emphasizes core brand pillars: Safety, Naturalness, Transparency, Quality Assurance
|
||||
|
||||
### Regulatory Compliance
|
||||
- Automatically flags violations of 의료법 제56조
|
||||
- Prevents use of prohibited content (testimonials, guarantees, comparative claims)
|
||||
- Ensures required disclaimers are included
|
||||
- Provides compliant alternative phrasing
|
||||
|
||||
### Content Optimization
|
||||
- SEO optimization within regulatory boundaries
|
||||
- Channel-specific content adaptation (website, blog, social media)
|
||||
- Target audience segmentation and messaging
|
||||
- Multi-language support planning (Korean, English, Chinese, Japanese)
|
||||
|
||||
## Content Creation Guidelines
|
||||
|
||||
### For Procedure Pages
|
||||
1. Start with patient concerns and needs
|
||||
2. Explain Jamie's unique approach and philosophy
|
||||
3. Detail technical differentiation and expertise
|
||||
4. List realistic expected benefits
|
||||
5. Identify ideal candidate profiles
|
||||
6. Provide practical procedure information
|
||||
7. Include required compliance disclaimers
|
||||
|
||||
### For Blog Posts
|
||||
1. Focus on educational value
|
||||
2. Use Jamie's expertise to teach patients
|
||||
3. Avoid individual patient stories
|
||||
4. Include statistical or general information
|
||||
5. Optimize for search while maintaining compliance
|
||||
|
||||
### For Social Media
|
||||
1. Keep messaging concise and impactful
|
||||
2. Avoid superlatives and guarantees
|
||||
3. Focus on clinic culture and medical professionalism
|
||||
4. Use appropriate hashtags without regulatory violations
|
||||
|
||||
## Compliance Checklist
|
||||
|
||||
Before publishing any content, verify:
|
||||
|
||||
- [ ] No patient testimonials or treatment experience stories
|
||||
- [ ] No guaranteed results or 100% effectiveness claims
|
||||
- [ ] No comparative superiority claims vs other clinics
|
||||
- [ ] No exaggerated safety guarantees or "no side effects" promises
|
||||
- [ ] Includes appropriate disclaimers about individual variation
|
||||
- [ ] Includes side effect and complication disclosures
|
||||
- [ ] Medical credentials are accurate and verifiable
|
||||
- [ ] No unapproved certifications or endorsements
|
||||
- [ ] Statistical claims are properly sourced
|
||||
- [ ] Before/after photos (if any) have required disclaimers
|
||||
|
||||
## Brand Voice Principles
|
||||
|
||||
### Professional Medical Authority
|
||||
Express expertise through concrete details and logical explanations rather than empty claims. Use specific technical terminology appropriately while remaining accessible to patients.
|
||||
|
||||
### Family-like Warmth
|
||||
Balance professionalism with genuine care and personal attention. Emphasize the director's personal involvement and the clinic's family-like atmosphere.
|
||||
|
||||
### Honest Transparency
|
||||
Never exaggerate or mislead. Be upfront about what surgery can and cannot achieve. Acknowledge limitations and individual variation. Build trust through candor.
|
||||
|
||||
### Craftsmanship Pride
|
||||
Position surgical skill as an art form requiring years of refinement. Emphasize precision, attention to detail, and the pursuit of excellence in technique.
|
||||
|
||||
## Legal Reference
|
||||
|
||||
This skill ensures compliance with:
|
||||
- 의료법 (Medical Service Act) Article 56
|
||||
- 의료법 시행령 (Enforcement Decree) Article 23
|
||||
- Medical Advertising Review Guidelines
|
||||
- Supreme Court and Lower Court precedents on medical advertising
|
||||
|
||||
Critical prohibition areas:
|
||||
- Patient testimonials (치료경험담)
|
||||
- Effect guarantees (효과 보장)
|
||||
- Comparative advertising (비교 우위 광고)
|
||||
- Misleading safety claims (안전성 과장)
|
||||
|
||||
## File Structure
|
||||
|
||||
```
|
||||
jamie_brand_editor_skill/
|
||||
├── SKILL.md # Main skill documentation
|
||||
├── README.md # This file
|
||||
├── brand_guidelines/
|
||||
│ └── brand_voice_guide_korean.md # Korean brand voice guide
|
||||
├── regulations/
|
||||
│ └── medical_advertising_law_summary_korean.md
|
||||
├── scripts/
|
||||
│ └── compliance_checker.py # Python compliance checker
|
||||
└── templates/ # (To be added)
|
||||
```
|
||||
|
||||
## Integration Workflow
|
||||
|
||||
### Content Creation Process
|
||||
1. Define content objectives and target audience
|
||||
2. Generate draft content using skill guidelines
|
||||
3. Run compliance check with Python script
|
||||
4. Refine based on compliance recommendations
|
||||
5. Verify brand voice consistency
|
||||
6. Submit for medical advertising review (if required)
|
||||
7. Publish and monitor performance
|
||||
|
||||
### Content Review Process
|
||||
1. Input existing content for analysis
|
||||
2. Receive compliance violation report
|
||||
3. Get brand voice alignment feedback
|
||||
4. Implement suggested corrections
|
||||
5. Re-check until fully compliant
|
||||
6. Document approved version
|
||||
|
||||
## Support and Maintenance
|
||||
|
||||
### Regular Updates Needed
|
||||
- Quarterly: Review for regulatory changes
|
||||
- Semi-annually: Update brand guidelines based on strategy shifts
|
||||
- Annually: Comprehensive audit of all marketing materials
|
||||
|
||||
### Getting Help
|
||||
For questions about:
|
||||
- **Brand guidelines**: Review brand_voice_guide_korean.md
|
||||
- **Regulations**: Consult medical_advertising_law_summary_korean.md
|
||||
- **Technical issues**: Check Python script documentation
|
||||
- **General usage**: See SKILL.md examples section
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Do's
|
||||
✓ Always start with patient needs and concerns
|
||||
✓ Use concrete details and specific examples
|
||||
✓ Include required disclaimers on every procedure page
|
||||
✓ Emphasize process and approach over promised outcomes
|
||||
✓ Maintain consistent brand voice across all channels
|
||||
✓ Run compliance checks before publishing
|
||||
|
||||
### Don'ts
|
||||
✗ Never include patient testimonials or quotes
|
||||
✗ Never guarantee results or claim 100% success
|
||||
✗ Never compare Jamie to other clinics by name
|
||||
✗ Never claim absence of side effects or risks
|
||||
✗ Never use superlatives like "best" or "#1"
|
||||
✗ Never publish without proper medical advertising review
|
||||
|
||||
## Version History
|
||||
|
||||
**v1.0** (Current)
|
||||
- Initial release with core brand guidelines
|
||||
- Korean medical advertising law compliance automation
|
||||
- Basic content templates and examples
|
||||
- Python compliance checker script
|
||||
|
||||
**Planned Updates**
|
||||
- v1.1: Additional content templates and examples
|
||||
- v1.2: Brand voice analyzer script
|
||||
- v1.3: SEO optimization tools
|
||||
- v2.0: Multi-language content generation
|
||||
|
||||
## Credits
|
||||
|
||||
Developed by D.intelligence for Jamie Plastic Surgery Clinic (제이미 성형외과)
|
||||
|
||||
Based on comprehensive research of:
|
||||
- Internal brand materials and marketing performance data
|
||||
- Korean medical advertising regulations and case law
|
||||
- Competitive analysis of Gangnam plastic surgery market
|
||||
- Patient consultation patterns and decision factors
|
||||
|
||||
## License
|
||||
|
||||
Proprietary - For use by Jamie Plastic Surgery Clinic and authorized partners only.
|
||||
|
||||
## Contact
|
||||
|
||||
For support or inquiries:
|
||||
- Email: info@jamie.clinic
|
||||
- Phone: 02-542-2399
|
||||
- Website: https://jamie.clinic
|
||||
- Location: 서울특별시 강남구 압구정로 136 EHL빌딩 3층
|
||||
|
||||
---
|
||||
|
||||
© 2025 D.intelligence Inc. All rights reserved.
|
||||
550
ourdigital-custom-skills/20-jamie-brand-editor/SKILL.md
Normal file
550
ourdigital-custom-skills/20-jamie-brand-editor/SKILL.md
Normal file
@@ -0,0 +1,550 @@
|
||||
---
|
||||
name: jamie-brand-editor
|
||||
version: 1.0.0
|
||||
description: |
|
||||
Branded content generator for Jamie Plastic Surgery Clinic (제이미성형외과). Creates new marketing content including blog posts, ad copy, social media content, procedure pages, and marketing materials following Jamie's brand voice and Korean medical advertising regulations. Use when generating NEW content for Jamie clinic - triggers: "write Jamie blog", "create ad copy", "draft procedure page", "제이미 블로그 작성", "광고 카피 생성". For reviewing/correcting existing content, use jamie-brand-guardian instead.
|
||||
license: Internal-use Only
|
||||
---
|
||||
|
||||
# Jamie Brand Editor Skill
|
||||
|
||||
> **Purpose**: Generate branded content for Jamie Plastic Surgery Clinic
|
||||
> **Role**: Content Creation (for review/correction, use jamie-brand-guardian)
|
||||
|
||||
## Overview
|
||||
|
||||
The Jamie Brand Editor generates new marketing content for Jamie Plastic Surgery Clinic (제이미 성형외과) that complies with Korean medical advertising regulations (의료법 제56조) while maintaining Jamie's distinctive brand voice.
|
||||
|
||||
**This skill is for CONTENT GENERATION. For reviewing or correcting existing content, use `jamie-brand-guardian`.**
|
||||
|
||||
## Primary Functions
|
||||
|
||||
**Brand Consistency**: Ensures all marketing content maintains Jamie Clinic's distinctive voice that balances professional medical expertise with family-like warmth, emphasizing trust, safety, naturalness, and transparency.
|
||||
|
||||
**Regulatory Compliance**: Automatically validates content against Korean medical advertising regulations (의료법 제56조 및 시행령), which prohibit patient testimonials, before/after photo comparisons without proper disclaimers, exaggerated claims, and unsubstantiated effectiveness promises.
|
||||
|
||||
**Content Quality**: Applies Jamie Clinic's proven content structure and messaging patterns derived from successful marketing materials, consultation data, and competitive positioning insights.
|
||||
|
||||
## When to Use This Skill
|
||||
|
||||
You should trigger this skill in the following scenarios:
|
||||
|
||||
### Content Creation Requests
|
||||
- Writing new procedure introduction pages for the website
|
||||
- Creating blog posts about surgical techniques or patient care
|
||||
- Drafting social media posts for Instagram, Naver Blog, or YouTube
|
||||
- Developing advertising copy for Naver, Google, or Meta platforms
|
||||
- Composing email marketing campaigns or KakaoTalk channel messages
|
||||
- Generating FAQ content or patient education materials
|
||||
|
||||
### Content Review and Editing
|
||||
- Checking existing content for regulatory compliance
|
||||
- Reviewing content for brand voice consistency
|
||||
- Optimizing content for SEO while maintaining medical advertising compliance
|
||||
- Editing third-party content submissions (influencer posts, partnerships)
|
||||
- Auditing competitor content for benchmarking purposes
|
||||
|
||||
### Regulatory Compliance Checks
|
||||
- Validating that patient testimonials follow legal requirements
|
||||
- Ensuring before/after photos include required disclaimers
|
||||
- Checking for prohibited comparative claims or guarantees
|
||||
- Verifying that side effect information is properly disclosed
|
||||
- Confirming medical credential claims are accurate
|
||||
|
||||
### Strategic Content Planning
|
||||
- Developing content calendars aligned with Jamie's brand pillars
|
||||
- Creating procedure-specific messaging frameworks
|
||||
- Planning multi-channel campaign content with consistent messaging
|
||||
- Designing content for different patient segments (first-time vs revision surgery)
|
||||
|
||||
## Core Capabilities
|
||||
|
||||
### 1. Brand Voice Enforcement
|
||||
|
||||
The skill maintains Jamie Clinic's distinctive brand voice characteristics across all content:
|
||||
|
||||
**Tone Balance**: Professional medical authority combined with approachable, family-like warmth. Content should inspire trust without being cold or distant, and should feel caring without being unprofessional.
|
||||
|
||||
**Direct Communication**: Jamie's founder (원장님) is known for straightforward, logical explanations rather than ambiguous promises. The brand voice reflects this "답정남" (decisive gentleman) character with clear, honest assessments.
|
||||
|
||||
**Trust Markers**: Emphasize proven track record, 5-year AS guarantee, personal care by the director, one-on-one recovery rooms, and honest recommendations that prioritize patient welfare over profit.
|
||||
|
||||
**Specialized Expertise**: Position Jamie as master craftsmen ("장인정신") with exceptional technical skills, particularly in endoscopic forehead lifts, eyelid procedures, and revision surgeries.
|
||||
|
||||
### 2. Regulatory Compliance Automation
|
||||
|
||||
The skill automatically checks content against key provisions of 의료법 제56조:
|
||||
|
||||
**Prohibited Content Types**:
|
||||
- Unevaluated new medical technologies without proper approval
|
||||
- Patient testimonials or treatment experience stories that may mislead about effectiveness
|
||||
- Before/after photos without required disclaimers about individual variation
|
||||
- False or misleading information about doctors, facilities, or outcomes
|
||||
- Comparative claims suggesting superiority over other clinics
|
||||
- Exaggerated effectiveness claims or guaranteed results
|
||||
- Missing critical information about side effects or risks
|
||||
- Unauthorized certifications, awards, or endorsements
|
||||
- Price discounts without proper non-insurance fee disclosure
|
||||
- Content that hasn't received required advertising review
|
||||
|
||||
**Required Disclaimers**: The skill automatically adds appropriate warnings about potential side effects (swelling, bruising, inflammation) and individual variation in results.
|
||||
|
||||
**Proper Credential Usage**: Verifies that doctor qualifications, certifications, and specializations are accurately stated and comply with regulations.
|
||||
|
||||
### 3. Content Structure Templates
|
||||
|
||||
The skill applies Jamie's proven content structure for procedure pages:
|
||||
|
||||
**Page Header**: Includes lead-in headline (25 characters or less), procedure name (12 characters or less), and headline emphasizing Jamie's unique approach.
|
||||
|
||||
**Procedure Introduction**: Defines what the procedure is, explains its purpose, and identifies common patient concerns that necessitate the treatment.
|
||||
|
||||
**Jamie's Distinction**: Articulates Jamie's unique approach philosophy, differentiated techniques or materials used, and specialized expertise. Highlights safety and convenience factors.
|
||||
|
||||
**Expected Benefits**: Clearly states aesthetic and functional improvements patients can expect from the procedure.
|
||||
|
||||
**Recommended Candidates**: Specifies ideal patient profiles with concrete characteristics and concerns.
|
||||
|
||||
**Procedure Information Summary**: Provides table format with anesthesia type, surgery duration, clinic visits, suture removal timing, daily life return timeline, and pain level.
|
||||
|
||||
**FAQ Section**: Addresses common patient questions using consultation data and proven responses.
|
||||
|
||||
**Technical Terms Glossary**: Explains medical terminology in accessible language.
|
||||
|
||||
**Post-Surgery Care and AS Information**: Details aftercare programs and warranty coverage where applicable.
|
||||
|
||||
**Call to Action**: Guides users to consultation booking or inquiry channels.
|
||||
|
||||
**Compliance Disclaimer**: Standard disclosure about potential side effects and individual variation.
|
||||
|
||||
### 4. SEO Optimization with Compliance
|
||||
|
||||
The skill optimizes content for search engines while maintaining regulatory compliance:
|
||||
|
||||
**Keyword Integration**: Incorporates target keywords naturally without violating advertising prohibitions on misleading claims or excessive promises.
|
||||
|
||||
**Structured Data**: Applies appropriate schema markup for medical procedures, local business information, and service descriptions.
|
||||
|
||||
**Content Depth**: Ensures sufficient information density for SEO value while maintaining readability and avoiding prohibited exaggerations.
|
||||
|
||||
**Local SEO**: Optimizes for Apgujeong and Gangnam location-based searches.
|
||||
|
||||
## Brand Guidelines Reference
|
||||
|
||||
### Core Brand Pillars
|
||||
|
||||
**Safety (안전)**: Jamie prioritizes patient safety through certified facilities, experienced surgeons, comprehensive pre-surgical evaluation, and careful post-operative monitoring. Content should emphasize safety protocols, risk management, and careful patient selection.
|
||||
|
||||
**Naturalness (자연스러움)**: Jamie's surgical philosophy focuses on natural-looking results that enhance rather than transform. Content should avoid dramatic transformation language and instead emphasize subtle improvement, harmony with existing features, and authentic beauty.
|
||||
|
||||
**Transparency (투명성)**: Jamie is known for honest consultations that may recommend against surgery when not beneficial. Content should reflect this integrity, include clear pricing information (where permitted), disclose realistic recovery times, and acknowledge when results may vary.
|
||||
|
||||
**Quality Assurance (품질 보증)**: With 5-year AS coverage and one-year monitoring, Jamie demonstrates confidence in results. Content should highlight post-surgical support, revision guarantees, and long-term patient relationships.
|
||||
|
||||
### Communication Style Characteristics
|
||||
|
||||
**Logical and Evidence-Based**: Present information with clear reasoning, cite relevant medical knowledge, and explain the "why" behind recommendations. Avoid emotional manipulation or fear-based messaging.
|
||||
|
||||
**Confident but Humble**: Project expertise and experience without arrogance. Acknowledge limitations and individual variation while expressing confidence in skill and approach.
|
||||
|
||||
**Personal Touch**: Reference the director's personal involvement in consultations, surgery, and follow-up care. Emphasize the human connection and family-like atmosphere.
|
||||
|
||||
**Educational Approach**: Teach patients about their anatomy, surgical options, and recovery process. Empower informed decision-making rather than pushing specific procedures.
|
||||
|
||||
**Korean Cultural Sensitivity**: Use appropriate honorific language, acknowledge cultural beauty standards while promoting healthy attitudes, and respect patient privacy and discretion concerns.
|
||||
|
||||
### Key Differentiators to Emphasize
|
||||
|
||||
**Director's Direct Care**: Unlike larger clinics with multiple surgeons, Jamie's director personally performs all major surgeries and post-operative care. Highlight the consistency and accountability this provides.
|
||||
|
||||
**Specialized Techniques**: Particularly the "3-point fixation endoscopic forehead lift" and other proprietary surgical approaches developed through years of experience.
|
||||
|
||||
**Revision Surgery Expertise**: Jamie has exceptional reputation for fixing previous surgeries, indicating advanced technical skill and problem-solving ability.
|
||||
|
||||
**Recovery Experience**: One-person recovery rooms, director-provided sterilization and treatment, and careful monitoring during the vulnerable post-surgical period.
|
||||
|
||||
**Honest Recommendations**: The brand's reputation for declining unsuitable cases and recommending conservative approaches when appropriate. This trust-building aspect should be emphasized.
|
||||
|
||||
## Korean Medical Advertising Regulations Summary
|
||||
|
||||
### Legal Framework (의료법 제56조)
|
||||
|
||||
Korean medical advertising law underwent significant strengthening in recent years to protect consumers from misleading medical marketing. The key regulatory changes affect all medical advertising including:
|
||||
|
||||
- Website content
|
||||
- Blog posts
|
||||
- Social media posts
|
||||
- Video content
|
||||
- Printed materials
|
||||
- Outdoor advertising
|
||||
- Search engine advertising
|
||||
- Application-based advertising
|
||||
|
||||
### Prohibited Advertising Content
|
||||
|
||||
**Article 56(2) of the Medical Service Act prohibits**:
|
||||
|
||||
1. Advertising unevaluated new medical technologies without proper government approval (신의료기술평가)
|
||||
|
||||
2. Patient testimonials and treatment experience stories that may mislead consumers about treatment effectiveness. This includes:
|
||||
- Direct patient quotes about their experience
|
||||
- Treatment progress stories or recovery diaries
|
||||
- Patient satisfaction statements
|
||||
- "Real story" or "customer voice" style content
|
||||
|
||||
3. Before/after photo comparisons without proper disclaimers. When used, they must include:
|
||||
- Statement that results vary by individual
|
||||
- Notice of potential side effects
|
||||
- Clarification that photos show a specific case, not guaranteed results
|
||||
|
||||
4. False or misleading information about:
|
||||
- Doctor qualifications or certifications
|
||||
- Facility equipment or capabilities
|
||||
- Treatment methods or effectiveness
|
||||
- Safety records or outcomes
|
||||
|
||||
5. Comparative advertising claiming superiority over other medical institutions or practitioners
|
||||
|
||||
6. Content that exaggerates or guarantees treatment effects, including:
|
||||
- "100% success rate" or "guaranteed results"
|
||||
- "No side effects" or "completely safe"
|
||||
- "Best in Korea" or "most effective" claims
|
||||
- Definitive statements like "will definitely improve"
|
||||
|
||||
7. Omission of critical side effect or risk information related to procedures
|
||||
|
||||
8. Advertising without required review by medical advertising self-regulatory body for certain media types
|
||||
|
||||
9. Statistical or research data that is not scientifically validated or properly sourced
|
||||
|
||||
10. Promotion intended to recruit foreign patients domestically (requires separate permissions)
|
||||
|
||||
11. Misleading information about non-insurance (비급여) fee discounts or payment plans
|
||||
|
||||
12. Using awards, certifications, or endorsements that are not officially recognized or using them in misleading ways
|
||||
|
||||
13. Advertising by non-medical personnel (only licensed medical professionals can advertise medical services)
|
||||
|
||||
14. Content that harms public health or fair medical competition
|
||||
|
||||
### Required Content Review
|
||||
|
||||
Advertising through certain media requires pre-approval from medical advertising self-regulatory organizations:
|
||||
|
||||
- Newspapers and internet newspapers
|
||||
- Magazines and periodicals
|
||||
- Outdoor advertising (banners, posters, leaflets, transit advertising)
|
||||
- Internet media including mobile applications
|
||||
- Other media designated by presidential decree
|
||||
|
||||
The review approval is valid for 3 years and must be renewed for continued advertising.
|
||||
|
||||
### Penalties for Violations
|
||||
|
||||
Violations of medical advertising law can result in:
|
||||
|
||||
- Administrative penalties including clinic closure orders
|
||||
- Fines up to 50 million KRW
|
||||
- Mandatory corrective advertising
|
||||
- Public announcement of violations
|
||||
- Criminal penalties including imprisonment for serious violations
|
||||
|
||||
### Practical Compliance Guidelines
|
||||
|
||||
**When writing about procedure effectiveness**:
|
||||
- Use "may help improve" rather than "will improve"
|
||||
- Include phrases like "results vary by individual"
|
||||
- Avoid absolute statements or guarantees
|
||||
- Provide balanced information including limitations
|
||||
|
||||
**When discussing patient experiences**:
|
||||
- Focus on general statistics rather than individual stories
|
||||
- Use aggregate satisfaction data rather than testimonials
|
||||
- Describe typical recovery processes rather than specific patient journeys
|
||||
- Avoid emotional language that manipulates patient expectations
|
||||
|
||||
**When using visual content**:
|
||||
- Include required disclaimers prominently
|
||||
- Use illustrations or diagrams rather than actual before/after photos when possible
|
||||
- Ensure any clinical photos are used for educational purposes with proper context
|
||||
- Avoid dramatic visual comparisons that exaggerate results
|
||||
|
||||
**When making claims about expertise**:
|
||||
- Cite specific, verifiable credentials
|
||||
- Avoid subjective terms like "best" or "leading"
|
||||
- Use objective measures like years of experience or number of procedures performed
|
||||
- Compare to standards rather than to other practitioners
|
||||
|
||||
## Usage Instructions
|
||||
|
||||
### For Content Creation
|
||||
|
||||
When creating new content, follow this workflow:
|
||||
|
||||
1. **Define Content Parameters**: Specify the procedure/topic, target audience, content type (webpage, blog, social media), and primary marketing objective.
|
||||
|
||||
2. **Apply Brand Voice**: Generate content that embodies Jamie's professional-yet-warm tone with emphasis on relevant brand pillars (safety, naturalness, transparency, quality assurance).
|
||||
|
||||
3. **Structure Content**: Use the appropriate template structure for the content type, ensuring all required elements are included.
|
||||
|
||||
4. **Integrate Target Keywords**: Work in SEO keywords naturally while avoiding prohibited superlative or comparative claims.
|
||||
|
||||
5. **Compliance Check**: Automatically review against regulatory prohibitions and add required disclaimers.
|
||||
|
||||
6. **Output Formats**: Generate content in appropriate format (Korean text, HTML for web, structured JSON for technical implementation).
|
||||
|
||||
### For Content Review
|
||||
|
||||
When reviewing existing content, follow this workflow:
|
||||
|
||||
1. **Intake Analysis**: Input the existing content along with context about where it will be used and target audience.
|
||||
|
||||
2. **Brand Voice Assessment**: Evaluate whether the tone, style, and messaging align with Jamie's brand characteristics. Provide specific feedback on areas that need adjustment.
|
||||
|
||||
3. **Regulatory Compliance Scan**: Systematically check against prohibited content types and flag any violations with explanations.
|
||||
|
||||
4. **Structure Evaluation**: Assess whether content follows optimal structure for its format and makes best use of space/attention.
|
||||
|
||||
5. **Optimization Recommendations**: Suggest improvements for clarity, persuasiveness, SEO value, and conversion potential while maintaining compliance.
|
||||
|
||||
6. **Revised Version**: Provide edited content that addresses identified issues.
|
||||
|
||||
### Python Script Integration
|
||||
|
||||
This skill includes Python helper scripts for:
|
||||
|
||||
**compliance_checker.py**: Automated scanning of content for regulatory violations using pattern matching and keyword detection.
|
||||
|
||||
**brand_voice_analyzer.py**: Scores content against Jamie's brand voice characteristics using natural language processing.
|
||||
|
||||
**content_generator.py**: Template-based content generation with variable substitution for procedure-specific pages.
|
||||
|
||||
**seo_optimizer.py**: Keyword analysis and optimization recommendations that maintain regulatory compliance.
|
||||
|
||||
See the `scripts/` directory for implementation details and usage examples.
|
||||
|
||||
## Example Usage
|
||||
|
||||
### Example 1: Creating a New Procedure Page
|
||||
|
||||
**User Request**: "Create a procedure introduction page for Jamie's endoscopic forehead lift (내시경 이마거상술) targeting women in their 30s-50s concerned about forehead wrinkles and drooping eyebrows."
|
||||
|
||||
**Skill Output**: Generates complete Korean webpage content including:
|
||||
- Page header with lead-in, procedure name, and headline
|
||||
- Introduction explaining the procedure and common patient concerns
|
||||
- "Jamie's Distinction" section highlighting 3-point fixation technique and specialized expertise
|
||||
- Expected benefits focusing on natural-looking rejuvenation
|
||||
- Recommended candidates with specific characteristics
|
||||
- Procedure information table with anesthesia, duration, recovery details
|
||||
- FAQ section addressing common questions
|
||||
- Technical terms glossary
|
||||
- Post-surgery care and AS information
|
||||
- Compliant call-to-action
|
||||
- Required side effect disclaimer
|
||||
|
||||
All content is written in Jamie's brand voice, optimized for target keywords like "내시경 이마거상술", "압구정 이마거상", and complies with medical advertising regulations.
|
||||
|
||||
### Example 2: Reviewing Blog Post for Compliance
|
||||
|
||||
**User Request**: "Review this draft blog post about double eyelid surgery before/after results to ensure it complies with medical advertising law."
|
||||
|
||||
**Skill Output**:
|
||||
1. Identifies prohibited content: Patient testimonial quotes, before/after photo comparison without disclaimers
|
||||
2. Explains regulatory violations: Article 56(2)2 prohibition on treatment experience stories
|
||||
3. Provides compliant alternative: Revised post focusing on general surgical techniques and recovery process with statistical outcomes rather than individual stories
|
||||
4. Adds required disclaimers about individual variation and potential side effects
|
||||
5. Adjusts tone to maintain educational value while avoiding misleading effectiveness claims
|
||||
|
||||
### Example 3: Generating Social Media Content Series
|
||||
|
||||
**User Request**: "Create a 5-post Instagram content series about Jamie's approach to natural-looking results in facial plastic surgery."
|
||||
|
||||
**Skill Output**: Generates five themed posts:
|
||||
1. Philosophy Post: Jamie's commitment to natural beauty enhancement
|
||||
2. Technical Post: The surgical techniques that create subtle, natural results
|
||||
3. Safety Post: How careful patient evaluation ensures appropriate outcomes
|
||||
4. Recovery Post: What patients can expect during healing process
|
||||
5. Long-term Results Post: How natural results age gracefully
|
||||
|
||||
Each post includes:
|
||||
- Compliant Korean caption optimized for Instagram
|
||||
- Suggested visual concepts that avoid prohibited before/after comparisons
|
||||
- Relevant hashtags avoiding superlative claims
|
||||
- Call-to-action directing to consultation inquiry
|
||||
|
||||
## File Structure
|
||||
|
||||
```
|
||||
jamie_brand_editor_skill/
|
||||
├── SKILL.md (this file)
|
||||
├── brand_guidelines/
|
||||
│ ├── brand_voice_guide_korean.md
|
||||
│ ├── brand_pillars_detailed.md
|
||||
│ ├── competitive_positioning.md
|
||||
│ └── content_examples/
|
||||
│ ├── approved_webpage_samples.md
|
||||
│ ├── successful_blog_posts.md
|
||||
│ └── compliant_social_media.md
|
||||
├── regulations/
|
||||
│ ├── medical_advertising_law_summary_korean.md
|
||||
│ ├── compliance_checklist.md
|
||||
│ ├── prohibited_content_examples.md
|
||||
│ └── required_disclaimers_templates.md
|
||||
├── templates/
|
||||
│ ├── procedure_page_template_korean.md
|
||||
│ ├── blog_post_template.md
|
||||
│ ├── social_media_templates.md
|
||||
│ └── advertising_copy_templates.md
|
||||
├── scripts/
|
||||
│ ├── compliance_checker.py
|
||||
│ ├── brand_voice_analyzer.py
|
||||
│ ├── content_generator.py
|
||||
│ └── seo_optimizer.py
|
||||
└── README.md
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Content Creation Best Practices
|
||||
|
||||
1. **Start with Strategy**: Before writing, clarify the marketing objective, target audience, and key message. This ensures content is purposeful and effective.
|
||||
|
||||
2. **Prioritize Patient Value**: Focus on answering patient questions and addressing concerns rather than promoting procedures. Educational content builds trust and complies with regulations.
|
||||
|
||||
3. **Use Concrete Examples**: Rather than abstract claims, use specific technical details, recovery timelines, and procedural steps to demonstrate expertise.
|
||||
|
||||
4. **Balance Medical and Accessible Language**: Use proper medical terminology but explain it clearly. This demonstrates expertise while remaining patient-friendly.
|
||||
|
||||
5. **Emphasize Process Over Promises**: Describe Jamie's careful approach, evaluation methods, and surgical technique rather than making outcome guarantees.
|
||||
|
||||
6. **Include Multiple Perspectives**: Address both benefits and realistic limitations, common concerns and how they're managed, typical results and individual variation.
|
||||
|
||||
### Compliance Best Practices
|
||||
|
||||
1. **Default to Conservative**: When unsure if content crosses regulatory lines, err on the side of caution. It's better to be slightly less persuasive than to face legal penalties.
|
||||
|
||||
2. **Document Sources**: For any claims about effectiveness, safety, or outcomes, be prepared to cite medical literature or clinical data.
|
||||
|
||||
3. **Regular Updates**: Medical advertising regulations evolve. Periodically review content against current regulatory guidance.
|
||||
|
||||
4. **Consistent Disclaimer Usage**: Apply required disclaimers systematically across all content types, not just where legally mandated.
|
||||
|
||||
5. **Review Chain**: Implement review by multiple parties including marketing, medical staff, and legal counsel for high-visibility content.
|
||||
|
||||
### Brand Voice Best Practices
|
||||
|
||||
1. **Consistent Character**: Maintain the same tonal characteristics across all content types, from formal website pages to casual social media posts.
|
||||
|
||||
2. **Authentic Expression**: Let Jamie's genuine philosophy and approach come through rather than using generic medical marketing language.
|
||||
|
||||
3. **Cultural Adaptation**: While maintaining core brand identity, adapt communication style appropriately for different platforms and audiences.
|
||||
|
||||
4. **Director's Voice**: When appropriate, write in first-person from the director's perspective to add personality and authority.
|
||||
|
||||
5. **Patient-Centric Language**: Frame all content from the patient's perspective and concerns rather than the clinic's offerings.
|
||||
|
||||
## Integration with Marketing Workflow
|
||||
|
||||
This skill integrates into Jamie Clinic's marketing operations at multiple points:
|
||||
|
||||
### Website Content Management
|
||||
- Creating new procedure pages as services expand
|
||||
- Updating existing pages with new techniques or information
|
||||
- Optimizing pages for search engine ranking
|
||||
- Ensuring consistent brand voice across website sections
|
||||
|
||||
### Blog Content Production
|
||||
- Generating educational blog posts for Naver and website
|
||||
- Optimizing posts for target keywords and search visibility
|
||||
- Maintaining posting schedule with fresh, compliant content
|
||||
- Repurposing clinical insights into patient-friendly articles
|
||||
|
||||
### Social Media Management
|
||||
- Creating Instagram post captions and concepts
|
||||
- Developing YouTube video scripts and descriptions
|
||||
- Writing KakaoTalk Channel announcements and messages
|
||||
- Maintaining consistent brand voice across platforms
|
||||
|
||||
### Advertising Campaign Development
|
||||
- Writing compliant ad copy for Naver, Google, Meta platforms
|
||||
- Creating landing page content for paid campaigns
|
||||
- Developing retargeting ad content
|
||||
- Ensuring all paid content passes advertising review
|
||||
|
||||
### Patient Communication Materials
|
||||
- Drafting email marketing campaigns
|
||||
- Creating consultation booking confirmations and reminders
|
||||
- Developing pre-surgery information packets
|
||||
- Writing post-surgery care instructions
|
||||
|
||||
### Competitive Intelligence
|
||||
- Analyzing competitor content for positioning insights
|
||||
- Identifying market gaps and content opportunities
|
||||
- Benchmarking messaging approaches
|
||||
- Ensuring Jamie's content maintains competitive advantage
|
||||
|
||||
## Maintenance and Updates
|
||||
|
||||
This skill requires periodic maintenance to remain effective:
|
||||
|
||||
### Regulatory Updates
|
||||
Monitor changes to medical advertising regulations and update compliance rules accordingly. Korean medical advertising law evolves in response to market conditions and consumer protection needs.
|
||||
|
||||
### Brand Evolution
|
||||
As Jamie Clinic's positioning and services evolve, update brand guidelines to reflect new strategic directions while maintaining core identity.
|
||||
|
||||
### Performance Optimization
|
||||
Analyze which content patterns drive best results (consultation inquiries, website engagement, social media interaction) and refine templates based on performance data.
|
||||
|
||||
### Competitive Landscape
|
||||
Regularly review competitor content and market positioning to ensure Jamie's messaging maintains differentiation and relevance.
|
||||
|
||||
### Technology Integration
|
||||
Update scripts and automation tools as new marketing platforms, SEO requirements, and content management systems emerge.
|
||||
|
||||
## Support and Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
**Content Feels Too Formal**: If generated content seems too stiff, request adjustment toward "warm professionalism" tone or add more conversational elements while maintaining medical credibility.
|
||||
|
||||
**Regulatory Concerns**: When uncertain about compliance, request explicit regulatory check with citations to specific legal provisions.
|
||||
|
||||
**Brand Voice Mismatch**: If content doesn't capture Jamie's character, provide specific feedback about which brand pillar needs more emphasis or which tonal element is missing.
|
||||
|
||||
**SEO vs Compliance Conflicts**: When keyword optimization seems to require prohibited claims, request alternative keyword strategies that maintain both search visibility and compliance.
|
||||
|
||||
### Getting Better Results
|
||||
|
||||
**Provide Context**: The more information you provide about the intended use, target audience, and marketing objective, the better the skill can tailor content.
|
||||
|
||||
**Iterate and Refine**: Treat generated content as a strong first draft and provide specific feedback for refinement rather than expecting perfection on first attempt.
|
||||
|
||||
**Reference Examples**: Point to specific examples of content you like to help the skill understand your preferences and expectations.
|
||||
|
||||
**Ask Questions**: Request explanations for why certain approaches were taken or ask for alternative versions to explore options.
|
||||
|
||||
## Version History
|
||||
|
||||
**Version 1.0** (Current): Initial release with core brand guidelines, regulatory compliance automation, content templates, and Python helper scripts.
|
||||
|
||||
**Planned Updates**:
|
||||
- Version 1.1: Enhanced SEO optimization with structured data markup
|
||||
- Version 1.2: Multi-language support for medical tourism content (English, Chinese, Japanese)
|
||||
- Version 1.3: Visual content guidelines and compliance for photos/videos
|
||||
- Version 2.0: Integration with content management systems and automated publishing workflows
|
||||
|
||||
## Credits and Acknowledgments
|
||||
|
||||
This skill was developed by D.intelligence for Jamie Plastic Surgery Clinic based on comprehensive analysis of:
|
||||
- Internal brand materials and marketing strategy documents
|
||||
- Successful content examples from Jamie's digital channels
|
||||
- Consultation data and patient inquiry patterns
|
||||
- Korean medical advertising regulations and legal precedents
|
||||
- Competitive analysis of Gangnam plastic surgery market
|
||||
|
||||
Special thanks to Jamie Clinic's director and staff for insights into the clinic's philosophy, approach, and patient care values that inform the brand voice guidelines.
|
||||
|
||||
---
|
||||
|
||||
For questions, updates, or support regarding this skill, contact D.intelligence at info@jamie.clinic or call 02-542-2399.
|
||||
@@ -0,0 +1,247 @@
|
||||
# 제이미 성형외과 브랜드 보이스 가이드
|
||||
|
||||
## 브랜드 핵심 정체성
|
||||
|
||||
제이미 성형외과는 압구정동에 위치한 프리미엄 성형외과로서, 전문적인 의료 기술력과 가족 같은 따뜻함을 동시에 추구하는 독특한 브랜드 정체성을 가지고 있습니다.
|
||||
|
||||
### 브랜드 약속 (Brand Promise)
|
||||
|
||||
**안전 (Safety)**: 환자의 안전을 최우선으로 하는 신중한 수술 접근
|
||||
**자연스러움 (Naturalness)**: 과도한 변화가 아닌 자연스러운 개선 추구
|
||||
**투명성 (Transparency)**: 정직한 상담과 현실적인 기대치 제시
|
||||
**품질 보증 (Quality Assurance)**: 5년 AS 보장과 1년간 경과 모니터링
|
||||
|
||||
## 커뮤니케이션 스타일 특징
|
||||
|
||||
### 톤 앤 매너 (Tone & Manner)
|
||||
|
||||
**전문적이면서도 따뜻한 (Professional yet Warm)**
|
||||
- 의학적 전문성을 강조하되 차갑지 않게
|
||||
- 예시: "풍부한 임상 경험을 바탕으로 환자 한 분 한 분을 가족처럼 돌보겠습니다"
|
||||
|
||||
**논리적이고 근거 기반 (Logical and Evidence-Based)**
|
||||
- 감정적 표현보다 객관적 설명 우선
|
||||
- 예시: "3점 고정술을 통해 조직을 안정적으로 고정함으로써 붓기를 최소화하고 회복 기간을 단축시킵니다"
|
||||
|
||||
**직설적이지만 배려있는 (Direct yet Considerate)**
|
||||
- "답정남" 캐릭터 - 명확한 판단과 논리적 설명
|
||||
- 불필요한 수술은 권하지 않는 정직함
|
||||
- 예시: "현재 상태로는 수술보다 비수술적 개선이 더 적합할 수 있습니다"
|
||||
|
||||
**자신감 있지만 겸손한 (Confident but Humble)**
|
||||
- 기술력에 대한 확신을 표현하되 과장하지 않음
|
||||
- 예시: "20년간 수천 건의 이마거상술 경험으로 다양한 케이스에 대응할 수 있습니다"
|
||||
|
||||
## 브랜드 보이스 특성
|
||||
|
||||
### 1. 장인 정신 강조 (Craftsmanship)
|
||||
|
||||
제이미 원장님의 섬세한 박리 솜씨와 수술 기술을 "장인정신에 기반한 수공업 제품"처럼 표현합니다.
|
||||
|
||||
**표현 방법**:
|
||||
- 수술을 예술적 작업으로 비유
|
||||
- 세심함, 정밀함, 완벽함 등의 단어 사용
|
||||
- 오랜 경험과 노하우 강조
|
||||
- 예시: "한 겹 한 겹 정밀하게 박리하는 섬세한 술기", "수술 과정의 모든 단계에서 완벽을 추구"
|
||||
|
||||
### 2. 원장의 직접 케어 (Director's Personal Care)
|
||||
|
||||
원장이 소독부터 처치까지 직접 하는 특별함을 강조합니다.
|
||||
|
||||
**표현 방법**:
|
||||
- 1인 회복실 제공
|
||||
- 원장의 직접 관리와 모니터링
|
||||
- 손을 바꾸지 않는 일관성
|
||||
- 예시: "수술 전 상담부터 수술, 그리고 회복까지 원장이 직접 책임지고 케어합니다"
|
||||
|
||||
### 3. 정직한 제안 (Honest Recommendations)
|
||||
|
||||
수익성보다 환자 이익을 우선하는 양심적 접근을 부각합니다.
|
||||
|
||||
**표현 방법**:
|
||||
- 불필요한 시술/수술 권하지 않음
|
||||
- 현실적 기대치 설정
|
||||
- 개별 상태에 맞는 맞춤 제안
|
||||
- 예시: "트리얌과 셀라인의 비율을 정직하게 제안드립니다", "상담과 결과가 동일한 신뢰"
|
||||
|
||||
### 4. 재수술 전문성 (Revision Surgery Expertise)
|
||||
|
||||
재수술 환자에게 특히 높은 신뢰를 받는 점을 활용합니다.
|
||||
|
||||
**표현 방법**:
|
||||
- 문제 해결 능력 강조
|
||||
- 복잡한 케이스 대응 경험
|
||||
- 재수술의 어려움과 제이미의 해법
|
||||
- 예시: "이전 수술로 인한 유착과 흉터를 고려한 정밀한 재수술", "재수술 특유의 난이도를 극복하는 숙련된 기술"
|
||||
|
||||
## 고객 세그먼트별 커뮤니케이션
|
||||
|
||||
### 초진 환자 (First-Time Patients)
|
||||
|
||||
**특징**: 신뢰가 형성되지 않은 상태, 정보 탐색 단계
|
||||
**커뮤니케이션 전략**:
|
||||
- 안전성과 전문성 강조
|
||||
- 교육적 콘텐츠 제공
|
||||
- 차별화된 기술과 시스템 설명
|
||||
- 5년 AS 보장 등 신뢰 요소 부각
|
||||
|
||||
### 재수술 환자 (Revision Surgery Patients)
|
||||
|
||||
**특징**: 이전 경험으로 인한 불안, 높은 기대 수준
|
||||
**커뮤니케이션 전략**:
|
||||
- 공감과 이해 표현
|
||||
- 문제 해결 능력 구체적 설명
|
||||
- 성공 케이스 (규정 준수하며) 제시
|
||||
- 세심한 사전 평가 과정 강조
|
||||
|
||||
### 소개/추천 환자 (Referred Patients)
|
||||
|
||||
**특징**: 기존 긍정 인식 보유, 우호적 태도
|
||||
**커뮤니케이션 전략**:
|
||||
- 신뢰 유지와 강화
|
||||
- 추천자에 대한 감사 표현
|
||||
- 개인화된 관심과 케어 제공
|
||||
- 기대에 부응하는 결과 약속
|
||||
|
||||
## 카테고리별 메시징 프레임워크
|
||||
|
||||
### 눈 성형 (Eye Surgery)
|
||||
|
||||
**핵심 메시지**:
|
||||
- 자연스러운 쌍꺼풀 라인
|
||||
- 티 안나게 수술하고 티나게 예뻐지기
|
||||
- 빠른 회복과 일상 복귀
|
||||
- 개인별 눈 구조 고려한 맞춤 디자인
|
||||
|
||||
**표현 예시**:
|
||||
"퀵 쌍꺼풀 수술은 붓기와 멍을 최소화하여 빠른 회복이 가능한 제이미만의 술기입니다. 개인의 눈 구조와 원하는 이미지를 세밀하게 분석하여 가장 자연스러우면서도 또렷한 눈매를 완성합니다."
|
||||
|
||||
### 이마 성형 (Forehead Surgery)
|
||||
|
||||
**핵심 메시지**:
|
||||
- 내시경을 이용한 최소 절개
|
||||
- 3점 고정술의 차별화
|
||||
- 동안 효과와 자연스러운 개선
|
||||
- 흉터 걱정 없는 안전한 수술
|
||||
|
||||
**표현 예시**:
|
||||
"제이미 3점 고정 내시경 이마거상술은 두피 내 최소 절개만으로 처진 이마와 눈썹을 효과적으로 개선합니다. 독자적인 3점 고정 기법으로 조직을 안정적으로 고정하여 자연스럽고 오래 지속되는 동안 효과를 선사합니다."
|
||||
|
||||
### 리프팅 (Lifting Procedures)
|
||||
|
||||
**핵심 메시지**:
|
||||
- SMAS층 고정의 근본적 개선
|
||||
- 자연스러운 볼륨과 윤곽 회복
|
||||
- 과도하지 않은 자연스러움
|
||||
- 장기적 효과 지속
|
||||
|
||||
**표현 예시**:
|
||||
"중안면 리프팅은 단순히 피부를 당기는 것이 아니라 SMAS층부터 근본적으로 개선하여 자연스럽고 입체적인 볼륨을 회복시킵니다. 과도한 변화 없이 본연의 아름다움을 되찾는 것이 제이미의 리프팅 철학입니다."
|
||||
|
||||
### 비수술 시술 (Non-Surgical Procedures)
|
||||
|
||||
**핵심 메시지**:
|
||||
- 정품 정량 사용 원칙
|
||||
- 개인별 맞춤 용량과 부위
|
||||
- 자연스러운 표정 유지
|
||||
- 안전성과 효과의 균형
|
||||
|
||||
**표현 예시**:
|
||||
"제이미의 보톡스 시술은 정품 정량 사용을 원칙으로 하며, 개인의 근육 발달 정도와 표정 습관을 면밀히 분석하여 최적의 효과를 내면서도 자연스러운 표정을 유지할 수 있도록 정확하게 시술합니다."
|
||||
|
||||
## 금지 표현 및 주의 사항
|
||||
|
||||
### 의료법상 금지되는 표현
|
||||
|
||||
**절대 사용 금지**:
|
||||
- "100% 만족", "반드시 효과", "완벽한 결과" 등 효과 보장 표현
|
||||
- "최고", "최상", "1위" 등 비교 우위 표현
|
||||
- "부작용 없음", "완전히 안전" 등 위험 부재 표현
|
||||
- 구체적인 환자 후기나 경험담
|
||||
- 승인받지 않은 인증이나 보증 표현
|
||||
|
||||
**주의해서 사용**:
|
||||
- "개선", "완화", "도움" 등은 "가능성" 표현과 함께 사용
|
||||
- 통계나 수치는 출처 명시 필요
|
||||
- 전후 사진은 개인차 및 부작용 고지 필수
|
||||
|
||||
### 브랜드 일관성 유지
|
||||
|
||||
**항상 포함해야 할 요소**:
|
||||
- 5년 AS 보장 언급 (해당 수술 시)
|
||||
- 1인 회복실 제공
|
||||
- 원장 직접 케어
|
||||
- 개인차 및 부작용 가능성 고지
|
||||
|
||||
**피해야 할 표현**:
|
||||
- 지나치게 감성적이거나 과장된 표현
|
||||
- 타 병원 직접 비교 (간접적으로만)
|
||||
- 가격 경쟁력 강조 (고급화 전략과 맞지 않음)
|
||||
- 빠른 결정 유도하는 압박적 문구
|
||||
|
||||
## 채널별 적용 가이드
|
||||
|
||||
### 웹사이트 (Website)
|
||||
|
||||
**특징**: 가장 공식적이고 정보 중심적인 채널
|
||||
**톤**: 전문적, 교육적, 신뢰 구축
|
||||
**구조**: 명확한 정보 위계, 충분한 설명
|
||||
**예시**: "제이미 성형외과는 압구정에서 20년간 안전하고 자연스러운 결과를 위해 최선을 다해왔습니다. 풍부한 임상 경험과 섬세한 수술 기법으로 환자 한 분 한 분께 최적의 결과를 제공합니다."
|
||||
|
||||
### 네이버 블로그 (Naver Blog)
|
||||
|
||||
**특징**: 정보 검색 중심, SEO 중요
|
||||
**톤**: 교육적, 접근하기 쉬운, 친근한
|
||||
**구조**: 키워드 최적화, 단계적 설명
|
||||
**예시**: "내시경 이마거상술이란 무엇일까요? 오늘은 이마거상술의 원리와 제이미의 차별화된 3점 고정 기법에 대해 자세히 알아보겠습니다."
|
||||
|
||||
### 인스타그램 (Instagram)
|
||||
|
||||
**특징**: 비주얼 중심, 짧고 임팩트 있게
|
||||
**톤**: 감각적, 간결한, 트렌디한
|
||||
**구조**: 핵심 메시지 집중, 해시태그 활용
|
||||
**예시**: "자연스럽게, 그러나 확실하게. 제이미의 철학은 본연의 아름다움을 살리는 것입니다. #자연스러운쌍꺼풀 #압구정성형외과 #제이미성형외과"
|
||||
|
||||
### 유튜브 (YouTube)
|
||||
|
||||
**특징**: 교육적 콘텐츠, 깊이 있는 설명
|
||||
**톤**: 전문적이면서 이해하기 쉬운
|
||||
**구조**: 단계별 설명, 시각 자료 활용
|
||||
**예시**: "안녕하세요, 제이미 성형외과입니다. 오늘은 많은 분들이 궁금해하시는 내시경 이마거상술에 대해 수술 원리부터 회복 과정까지 자세히 설명드리겠습니다."
|
||||
|
||||
### 카카오톡 채널 (KakaoTalk Channel)
|
||||
|
||||
**특징**: 1:1 상담 느낌, 신속한 응답
|
||||
**톤**: 친근하면서 전문적, 도움을 주는
|
||||
**구조**: 간결한 정보 제공, 액션 유도
|
||||
**예시**: "안녕하세요! 제이미 성형외과입니다. 상담 예약 도와드릴게요. 원하시는 시술 부위와 가능하신 방문 날짜를 알려주시면 빠르게 안내해드리겠습니다."
|
||||
|
||||
## 실전 적용 체크리스트
|
||||
|
||||
### 작성 전 확인사항
|
||||
□ 타겟 고객 세그먼트 파악
|
||||
□ 커뮤니케이션 목표 설정
|
||||
□ 적절한 채널 특성 이해
|
||||
□ 관련 법규 및 가이드라인 확인
|
||||
|
||||
### 작성 중 확인사항
|
||||
□ 브랜드 핵심 가치 반영
|
||||
□ 적절한 톤 앤 매너 유지
|
||||
□ 구체적이고 논리적인 설명
|
||||
□ 자연스러운 키워드 배치
|
||||
|
||||
### 작성 후 확인사항
|
||||
□ 의료법 위반 표현 검토
|
||||
□ 필수 고지사항 포함 여부
|
||||
□ 브랜드 보이스 일관성
|
||||
□ 오타 및 문법 오류 확인
|
||||
|
||||
## 버전 관리
|
||||
|
||||
**현재 버전**: 1.0
|
||||
**최종 업데이트**: 2025년 11월
|
||||
**다음 리뷰 예정**: 2026년 5월
|
||||
|
||||
---
|
||||
|
||||
이 가이드는 제이미 성형외과의 모든 마케팅 콘텐츠 제작 시 기준이 되며, 지속적으로 업데이트되어야 합니다.
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
"mainEntity": [
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "스마스 리프팅은 무엇인가요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "스마스(SMAS) 리프팅은 피부 아래 근막층인 SMAS를 당겨 처진 얼굴선과 주름을 개선하는 리프팅 수술입니다. 피부층과 근막층을 함께 끌어올려 자연스럽고 지속적인 리프팅 효과를 제공합니다."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "이 수술의 장점은 무엇인가요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "스마스 리프팅은 근막층까지 리프팅해 처짐을 근본적으로 개선하며, 효과가 오래 지속됩니다. 얼굴 윤곽이 자연스럽게 정돈되고, 피부 표면의 불필요한 긴장 없이 주름이 완화됩니다."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "수술 후 회복 기간과 주의사항은?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "수술 후 1주일 정도 붓기와 멍이 있을 수 있으며 2주 내외로 대부분 가라앉습니다. 흡연과 음주는 회복을 늦출 수 있으므로 피하는 것이 좋으며, 마사지는 전문의 지시에 따라 진행해야 합니다."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
"mainEntity": [
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "듀얼 트임 수술은 무엇인가요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "듀얼 트임 수술은 앞트임과 뒷트임을 동시에 또는 순차적으로 시행하여 가로·세로로 눈을 확장시키는 수술입니다. 눈 길이와 눈꼬리 모양을 조절해 또렷하고 시원한 눈매를 만드는 데 목적이 있습니다."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "어떤 경우에 듀얼 트임을 고려해야 하나요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "눈이 가로로 짧거나 위아래로 좁아 답답해 보이는 경우, 앞트임만으로는 만족스러운 변화를 얻기 어려운 경우, 눈꼬리가 올라가 사나워 보이는 경우 듀얼 트임을 통해 균형 잡힌 눈매를 만들 수 있습니다."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "수술 후 흉터와 회복은 어떤가요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "트임 수술은 섬세하게 봉합해 흉터가 거의 남지 않도록 하며, 실밥은 약 5~7일 후 제거합니다. 붓기와 멍은 1~2주 내에 감소하며 세심한 관리로 자연스러운 결과를 기대할 수 있습니다."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
"mainEntity": [
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "내시경 눈썹 거상술은 무엇인가요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "내시경 눈썹 거상술은 두피 안쪽에 작은 절개를 통해 내시경을 삽입해 처지거나 낮은 위치의 눈썹을 이상적인 자리로 끌어올려 고정하는 수술입니다. 눈썹의 위치와 모양을 교정해 답답해 보이는 눈매를 시원하게 만들고 전체적인 인상을 밝게 합니다."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "어떤 경우에 내시경 눈썹 거상술이 필요할까요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "선천적 또는 노화로 인해 눈썹이 처져 눈꺼풀을 덮는 경우, 눈과 눈썹 사이 거리가 좁아 답답하거나 사나워 보이는 경우, 눈썹 비대칭이 있는 경우, 쌍꺼풀 수술 없이 자연스러운 눈매 개선을 원하는 경우에 권장됩니다."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "제이미 클리닉의 내시경 눈썹 거상술은 어떻게 다른가요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "제이미 클리닉은 3점 고정 내시경 기술과 Full‑HD 내시경을 활용해 눈썹을 확실하게 끌어올리고 고정합니다. 개인의 얼굴 비율과 눈썹 모양을 정밀 분석하여 맞춤형 디자인을 제공하며, 헤어라인 안쪽의 최소 절개로 흉터를 최소화합니다."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "수술 후 회복 기간과 부작용은 어떤가요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "헤어라인 안쪽의 작은 절개만으로 진행되기 때문에 붓기와 멍이 비교적 적어 회복이 빠릅니다. 일반적으로 일주일 정도면 큰 붓기가 가라앉고 일상생활로 복귀할 수 있으며, 흉터는 머리카락으로 가려져 눈에 띄지 않습니다."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
"mainEntity": [
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "내시경 이마 거상술이란 무엇인가요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "내시경 이마 거상술은 이마의 헤어라인 안쪽에 작은 절개를 만들어 내시경을 이용해 이마의 처진 연부 조직을 박리한 뒤 위쪽으로 당겨 고정하는 수술입니다. 주름을 유발하는 근육을 약화시키고 이마 전체와 미간 주름을 개선하는 데 효과적입니다."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "이마 거상술과 눈썹 거상술의 차이는 무엇인가요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "이마 거상술은 이마 전체 주름과 미간 주름까지 광범위하게 개선하는 반면, 눈썹 거상술은 눈썹 주변 조직에 집중해 눈썹의 위치와 모양을 교정합니다. 주된 고민이 눈썹 처짐이라면 눈썹 거상술이, 이마 주름까지 개선하고 싶다면 이마 거상술이 적합합니다."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "수술 과정은 어떻게 진행되나요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "시술은 수면 또는 국소 마취 후 헤어라인 안쪽에 몇 개의 작은 절개를 만들어 내시경을 삽입합니다. 이마의 근육과 조직을 박리한 뒤 위쪽으로 당겨 고정하고 절개를 봉합합니다. 수술 시간은 대개 1시간 이내입니다."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "수술 후 회복과 관리가 어떻게 되나요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "수술 후 붓기와 멍은 일주일 정도면 대부분 가라앉으며, 실밥은 수술 후 7일에서 10일 사이에 제거합니다. 초기에는 딱딱한 피부 감각이 있을 수 있으나 시간이 지나면서 자연스럽게 회복됩니다."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
"name": "트임수술 자주 묻는 질문",
|
||||
"description": "제이미성형외과 트임수술(앞트임, 윗트임, 뒤트임, 밑트임)에 대한 자주 묻는 질문과 답변입니다.",
|
||||
"url": "https://jamie.clinic/eye/epicanthoplasty",
|
||||
"inLanguage": "ko",
|
||||
"dateModified": "2025-12-01",
|
||||
"publisher": {
|
||||
"@type": "MedicalOrganization",
|
||||
"@id": "https://jamie.clinic/#organization",
|
||||
"name": "제이미성형외과",
|
||||
"url": "https://jamie.clinic",
|
||||
"logo": {
|
||||
"@type": "ImageObject",
|
||||
"url": "https://jamie.clinic/images/logo.png"
|
||||
},
|
||||
"address": {
|
||||
"@type": "PostalAddress",
|
||||
"streetAddress": "압구정로 136 EHL빌딩 3층",
|
||||
"addressLocality": "강남구",
|
||||
"addressRegion": "서울특별시",
|
||||
"postalCode": "06029",
|
||||
"addressCountry": "KR"
|
||||
},
|
||||
"telephone": "+82-2-542-2399"
|
||||
},
|
||||
"mainEntity": [
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "트임수술하면 흉터가 많이 남나요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "제이미성형외과에서는 흉터를 최소화하는 방식으로 수술을 진행합니다. 수술 초기에는 붉은 기가 보일 수 있으나, 시간이 지나면서 점차 옅어져 눈에 잘 띄지 않게 됩니다. 특히 앞트임의 경우 눈 안쪽으로 절개선을 숨기는 등 다양한 방법이 있습니다."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "뒤트임/밑트임 하면 다시 붙는다던데 사실인가요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "과거에는 뒤트임이나 밑트임 후 다시 붙는 경우가 있었으나, 최근에는 수술 기법이 발전하여 재유착 가능성을 크게 낮췄습니다. 제이미에서는 개인의 눈 구조를 고려하여 재발 가능성을 최소화하는 방법으로 수술합니다."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
"name": "하이브리드 쌍꺼풀 자주 묻는 질문",
|
||||
"description": "제이미성형외과 하이브리드 쌍꺼풀 수술에 대한 자주 묻는 질문과 답변입니다.",
|
||||
"url": "https://jamie.clinic/eye/hybrid-double-eyelid",
|
||||
"inLanguage": "ko",
|
||||
"dateModified": "2025-12-01",
|
||||
"publisher": {
|
||||
"@type": "MedicalOrganization",
|
||||
"@id": "https://jamie.clinic/#organization",
|
||||
"name": "제이미성형외과",
|
||||
"url": "https://jamie.clinic",
|
||||
"logo": {
|
||||
"@type": "ImageObject",
|
||||
"url": "https://jamie.clinic/images/logo.png"
|
||||
},
|
||||
"address": {
|
||||
"@type": "PostalAddress",
|
||||
"streetAddress": "압구정로 136 EHL빌딩 3층",
|
||||
"addressLocality": "강남구",
|
||||
"addressRegion": "서울특별시",
|
||||
"postalCode": "06029",
|
||||
"addressCountry": "KR"
|
||||
},
|
||||
"telephone": "+82-2-542-2399"
|
||||
},
|
||||
"mainEntity": [
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "하이브리드 쌍꺼풀도 절개인데 흉터가 남지 않나요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "하이브리드 쌍꺼풀은 1~3mm 정도의 아주 작은 절개창을 이용하기 때문에 시간이 지나면 흉터가 거의 눈에 띄지 않게 됩니다. 개인의 피부 특성에 따라 차이는 있을 수 있습니다."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "매몰법과 하이브리드 쌍꺼풀 중 어떤 것이 더 좋나요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "어떤 수술이 더 좋다고 단정하기보다는 개인의 눈꺼풀 상태(피부 두께, 지방량, 처짐 정도 등)와 원하는 라인에 따라 더 적합한 수술 방법이 다릅니다. 상담을 통해 본인에게 가장 적합한 방법을 찾는 것이 중요합니다."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
"mainEntity": [
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "하이브리드 쌍꺼풀 수술은 무엇인가요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "하이브리드 쌍꺼풀 수술은 절개법과 매몰법의 장점을 결합한 수술입니다. 최소한의 절개창을 통해 불필요한 지방이나 근육을 제거하고 매몰법으로 쌍꺼풀 라인을 만들어 자연스러우면서도 풀릴 걱정이 적은 라인을 완성합니다:contentReference[oaicite:3]{index=3}."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "하이브리드 수술의 장점은 무엇인가요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "절개 부위를 최소화하여 흉터를 줄이고, 매몰법의 자연스러운 라인을 유지하면서도 절개법만큼 확실하게 쌍꺼풀 라인을 고정할 수 있습니다. 환자의 눈 구조와 피부 상태를 고려한 맞춤형 계획을 세울 수 있다는 장점이 있습니다:contentReference[oaicite:4]{index=4}."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "수술 대상은 누구인가요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "피부가 얇고 지방이 적어 매몰법만으로는 부족하지만 절개법에 대한 부담이 있는 분, 쌍꺼풀 라인이 쉽게 풀릴까 걱정하는 분, 최소한의 흉터로 또렷한 쌍꺼풀을 원하는 분에게 적합합니다."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
"name": "눈밑지방재배치 자주 묻는 질문",
|
||||
"description": "제이미성형외과 눈밑지방재배치(다크서클 눈밑성형) 수술에 대한 자주 묻는 질문과 답변입니다.",
|
||||
"url": "https://jamie.clinic/eye/lower-eyelid-fat-repositioning",
|
||||
"inLanguage": "ko",
|
||||
"dateModified": "2025-12-01",
|
||||
"publisher": {
|
||||
"@type": "MedicalOrganization",
|
||||
"@id": "https://jamie.clinic/#organization",
|
||||
"name": "제이미성형외과",
|
||||
"url": "https://jamie.clinic",
|
||||
"logo": {
|
||||
"@type": "ImageObject",
|
||||
"url": "https://jamie.clinic/images/logo.png"
|
||||
},
|
||||
"address": {
|
||||
"@type": "PostalAddress",
|
||||
"streetAddress": "압구정로 136 EHL빌딩 3층",
|
||||
"addressLocality": "강남구",
|
||||
"addressRegion": "서울특별시",
|
||||
"postalCode": "06029",
|
||||
"addressCountry": "KR"
|
||||
},
|
||||
"telephone": "+82-2-542-2399"
|
||||
},
|
||||
"mainEntity": [
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "눈밑지방재배치하면 애교살이 없어지나요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "제이미성형외과에서는 개인의 상태에 따라 애교살을 최대한 보존하는 방향으로 수술을 진행합니다. 수술 전 상담 시 애교살 보존 여부에 대해 충분히 상의하고 결정하게 됩니다."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "수술 후 눈이 뒤집어지는 부작용은 없나요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "눈밑지방재배치는 눈 안쪽 결막을 통해 접근하므로 피부나 근육 손상이 적어 눈이 뒤집어지는(안검외반) 부작용 발생 가능성이 매우 낮습니다. 숙련된 전문의가 안전하게 수술을 진행합니다."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
"name": "안검하수 눈매교정술 자주 묻는 질문",
|
||||
"description": "제이미성형외과 안검하수 눈매교정술에 대한 자주 묻는 질문과 답변입니다.",
|
||||
"url": "https://jamie.clinic/eye/ptosis-correction",
|
||||
"inLanguage": "ko",
|
||||
"dateModified": "2025-12-01",
|
||||
"publisher": {
|
||||
"@type": "MedicalOrganization",
|
||||
"@id": "https://jamie.clinic/#organization",
|
||||
"name": "제이미성형외과",
|
||||
"url": "https://jamie.clinic",
|
||||
"logo": {
|
||||
"@type": "ImageObject",
|
||||
"url": "https://jamie.clinic/images/logo.png"
|
||||
},
|
||||
"address": {
|
||||
"@type": "PostalAddress",
|
||||
"streetAddress": "압구정로 136 EHL빌딩 3층",
|
||||
"addressLocality": "강남구",
|
||||
"addressRegion": "서울특별시",
|
||||
"postalCode": "06029",
|
||||
"addressCountry": "KR"
|
||||
},
|
||||
"telephone": "+82-2-542-2399"
|
||||
},
|
||||
"mainEntity": [
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "비절개 눈매교정은 효과가 약하거나 잘 풀리지 않나요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "비절개 눈매교정은 경미한 안검하수에 효과적인 방법입니다. 제이미에서는 정확한 진단을 통해 비절개법이 적합한 경우에만 시행하며, 풀릴 가능성을 최소화하는 방식으로 수술합니다. 안검하수 정도가 심한 경우에는 절개법이 더 적합할 수 있습니다."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "눈매교정만 하고 쌍꺼풀은 안 만들 수 있나요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "네, 가능합니다. 특히 남성분들이나 쌍꺼풀을 원하지 않는 경우, 쌍꺼풀 없이 눈 뜨는 근육만 교정하는 무쌍 눈매교정술을 시행할 수 있습니다. 상담 시 원하는 바를 정확히 말씀해주시면 맞춤 수술이 가능합니다."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
"mainEntity": [
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "안검하수 눈매교정술은 어떤 수술인가요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "안검하수 눈매교정술은 눈을 뜨는 근육의 힘이 약해 윗 눈꺼풀이 검은자를 가리는 경우, 눈꺼풀을 들어 올리는 근육을 조절하거나 강화해 졸리고 피곤해 보이는 인상을 개선하는 수술입니다:contentReference[oaicite:5]{index=5}."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "안검하수를 교정하지 않으면 어떤 문제가 발생하나요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "안검하수를 방치하면 눈썹이나 이마 근육을 과도하게 사용해 눈을 뜨게 되어 이마 주름과 눈썹 처짐 등 이차적 문제가 생길 수 있습니다:contentReference[oaicite:6]{index=6}. 조기에 교정하는 것이 좋습니다."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "비절개식 눈매교정과 절개식 눈매교정의 차이는 무엇인가요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "비절개식 눈매교정은 작은 구멍을 통해 근육을 묶어 흉터와 부기를 최소화하면서 교정하는 방법이고, 절개식은 피부를 절개하여 근육과 지방을 처리하는 방식입니다. 안검하수 정도가 심하지 않으면 비절개식이 적합하고, 심한 경우 절개식이 필요할 수 있습니다:contentReference[oaicite:7]{index=7}."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
"name": "매몰법 퀵쌍꺼풀 자주 묻는 질문",
|
||||
"description": "제이미성형외과 퀵 매몰법 쌍꺼풀 수술에 대한 자주 묻는 질문과 답변입니다.",
|
||||
"url": "https://jamie.clinic/eye/quick-burial-double-eyelid",
|
||||
"inLanguage": "ko",
|
||||
"dateModified": "2025-12-01",
|
||||
"publisher": {
|
||||
"@type": "MedicalOrganization",
|
||||
"@id": "https://jamie.clinic/#organization",
|
||||
"name": "제이미성형외과",
|
||||
"url": "https://jamie.clinic",
|
||||
"logo": {
|
||||
"@type": "ImageObject",
|
||||
"url": "https://jamie.clinic/images/logo.png"
|
||||
},
|
||||
"address": {
|
||||
"@type": "PostalAddress",
|
||||
"streetAddress": "압구정로 136 EHL빌딩 3층",
|
||||
"addressLocality": "강남구",
|
||||
"addressRegion": "서울특별시",
|
||||
"postalCode": "06029",
|
||||
"addressCountry": "KR"
|
||||
},
|
||||
"telephone": "+82-2-542-2399"
|
||||
},
|
||||
"mainEntity": [
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "매몰법은 잘 풀린다던데 사실인가요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "과거의 매몰법은 풀릴 가능성이 있었지만, 제이미의 퀵 매몰법은 여러 지점을 견고하게 고정하는 방식으로 진행되어 풀릴 가능성이 현저히 낮습니다. 개인의 눈꺼풀 상태에 따라 차이가 있을 수 있으므로 상담 시 자세히 안내해 드립니다."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "수술 후 붓기는 얼마나 가나요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "개인차가 있지만, 일반적으로 큰 붓기는 2~3일 정도 지속되며, 이후 점차 가라앉아 1~2주 내에 자연스러워집니다. 수술 중 냉찜질 등으로 붓기를 최소화하고 있습니다."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
"mainEntity": [
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "퀵 매몰법은 무엇인가요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "퀵 매몰법은 기존 매몰법을 발전시킨 쌍꺼풀 시술로, 한 곳을 실로 묶어 쌍꺼풀 라인을 형성하는 방식입니다. 수술 시간이 20분 내외로 짧고 작은 구멍만을 이용해 흉터가 거의 남지 않는 것이 특징입니다."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "일반 매몰법과 비교해 어떤 장점이 있나요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "퀵 매몰법은 절개법보다 회복 기간이 짧고 부기가 적으며, 기존 매몰법보다 라인이 쉽게 풀리지 않는다는 장점이 있습니다. 직장인이나 시간이 부족한 분들도 비교적 부담 없이 받을 수 있는 수술입니다:contentReference[oaicite:2]{index=2}."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "수술 후 회복은 얼마나 걸리나요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "수술 시간이 짧고 절개가 거의 없기 때문에 수술 후 붓기와 멍이 적어 일상생활로의 복귀가 빠릅니다. 대부분 1주일 정도면 자연스러운 모습으로 회복됩니다."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
"mainEntity": [
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "눈 재수술이 필요한 경우는 언제인가요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "첫 수술 후 쌍꺼풀 라인이 비대칭이거나 너무 높거나 낮은 경우, 흉터가 두드러지는 경우, 눈매가 부자연스럽거나 풀린 경우 등에서 눈 재수술을 고려할 수 있습니다."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "재수술은 어떤 점이 어려운가요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "재수술은 첫 수술로 인해 눈꺼풀 조직에 흉터와 유착이 생겨 있어 해부학적 구조가 변해 있습니다. 따라서 섬세한 박리와 교정이 필요하며 경험이 많은 전문의에게 받는 것이 중요합니다."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "재수술 후 회복 기간은 얼마나 되나요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "일반적으로 재수술은 첫 수술보다 조직이 더 손상되어 있어 붓기와 멍이 오래갈 수 있습니다. 회복 기간은 개인차가 있지만 약 2주 이상 소요될 수 있으며, 일정 기간 충분한 휴식과 관리가 필요합니다."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
"name": "눈썹밑 피부절개술 자주 묻는 질문",
|
||||
"description": "제이미성형외과 눈썹밑 피부절개술(Sub-brow Excision)에 대한 자주 묻는 질문과 답변입니다.",
|
||||
"url": "https://jamie.clinic/eye/sub-brow-excision",
|
||||
"inLanguage": "ko",
|
||||
"dateModified": "2025-12-01",
|
||||
"publisher": {
|
||||
"@type": "MedicalOrganization",
|
||||
"@id": "https://jamie.clinic/#organization",
|
||||
"name": "제이미성형외과",
|
||||
"url": "https://jamie.clinic",
|
||||
"logo": {
|
||||
"@type": "ImageObject",
|
||||
"url": "https://jamie.clinic/images/logo.png"
|
||||
},
|
||||
"address": {
|
||||
"@type": "PostalAddress",
|
||||
"streetAddress": "압구정로 136 EHL빌딩 3층",
|
||||
"addressLocality": "강남구",
|
||||
"addressRegion": "서울특별시",
|
||||
"postalCode": "06029",
|
||||
"addressCountry": "KR"
|
||||
},
|
||||
"telephone": "+82-2-542-2399"
|
||||
},
|
||||
"mainEntity": [
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "눈썹밑 절개하면 인상이 사나워지지 않나요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "눈썹밑 피부절개술은 눈썹 자체의 위치나 모양을 바꾸는 것이 아니라 처진 눈꺼풀 피부를 제거하는 수술이므로, 인상이 사나워지기보다는 자연스럽게 젊어 보이는 효과를 줍니다. 개인의 눈매에 맞춰 리프팅 정도를 조절하므로 걱정하지 않으셔도 됩니다."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "흉터는 정말 안 보이나요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "눈썹 바로 아래 경계선을 따라 절개하므로 수술 초기에는 붉은 기운이 있을 수 있으나, 시간이 지나면서 점차 옅어져 눈썹에 가려 거의 눈에 띄지 않게 됩니다. 흉터 관리에 신경 써주시면 더욱 좋은 결과를 얻을 수 있습니다."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
"mainEntity": [
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "눈썹밑 피부절개술이란 무엇인가요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "눈썹밑 피부절개술은 눈썹 바로 아래 피부를 절개해 늘어진 피부를 제거하고 눈꺼풀 처짐을 개선하는 수술입니다. 절개선이 눈썹 바로 아래에 위치해 눈에 띄지 않는 것이 특징입니다."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "눈썹밑 절개술과 눈매교정의 차이는 무엇인가요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "눈썹밑 절개술은 눈꺼풀 피부 처짐을 해결하는 데 중점을 두고, 눈매교정술은 근육을 조절해 눈뜨는 힘을 개선하는 수술입니다. 피부 처짐이 심하지만 안검하수 정도가 경미한 경우 눈썹밑 절개술이 적합합니다."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "수술 후 관리와 회복은 어떤가요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "수술 후 1주일 내외로 실밥을 제거하며, 붓기와 멍은 1~2주 안에 대부분 가라앉습니다. 절개선이 눈썹 바로 아래에 있어 메이크업이나 눈썹 모양으로 충분히 가려집니다."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
"mainEntity": [
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "눈밑지방 재배치 수술은 무엇인가요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "눈밑지방 재배치 수술은 돌출된 눈 밑 지방을 재배열해 다크서클과 눈 밑 불룩함을 개선하는 수술입니다. 불필요한 지방은 제거하고 부족한 부위에는 지방을 채워 매끄럽고 젊어 보이는 눈 밑을 만듭니다."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "이 수술이 필요한 경우는 언제인가요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "눈 밑 지방이 돌출되어 다크서클이 심해 보이거나, 눈 밑이 꺼져 나이 들어 보이는 경우, 아이크림이나 레이저 시술로 효과가 없을 때 추천되는 수술입니다."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "수술 후 회복과 관리가 어떻게 되나요?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "수술은 보통 눈 안쪽 결막을 통해 시행해 피부에 흉터가 남지 않습니다. 약 일주일 후 실밥 제거를 하며, 멍과 붓기는 1~2주 안에 대부분 가라앉습니다. 충분한 휴식과 냉찜질이 도움이 됩니다."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,268 @@
|
||||
# 한국 의료 광고 규제 종합 가이드
|
||||
|
||||
## 법적 근거
|
||||
|
||||
### 의료법 제56조 (의료광고의 금지 등)
|
||||
|
||||
의료법 제56조는 한국의 의료 광고를 규제하는 핵심 법조항으로, 2024-2025년 강화된 규정이 적용되고 있습니다.
|
||||
|
||||
#### 제1항: 의료광고 주체 제한
|
||||
의료기관 개설자, 의료기관의 장 또는 의료인(이하 "의료인등")이 아닌 자는 의료광고를 할 수 없습니다.
|
||||
|
||||
**적용 범위**: 신문, 잡지, 음성, 음향, 영상, 인터넷, 인쇄물, 간판 등 모든 매체
|
||||
|
||||
#### 제2항: 금지되는 의료광고
|
||||
|
||||
1. **신의료기술 광고 금지**
|
||||
- 제53조에 따른 신의료기술평가를 받지 않은 신의료기술에 관한 광고
|
||||
|
||||
2. **치료경험담 광고 금지** (가장 중요)
|
||||
- 환자에 관한 치료경험담 등 소비자로 하여금 치료 효과를 오인하게 할 우려가 있는 내용
|
||||
- 실제 사례:
|
||||
- "○○님의 수술 후기" ❌
|
||||
- "실제 환자가 경험한 변화" ❌
|
||||
- "수술 3개월 후 만족스러운 결과" ❌
|
||||
|
||||
3. **거짓·과장 광고 금지**
|
||||
- 의료인, 의료기관, 의료서비스 등에 대한 객관적 사실과 다른 내용
|
||||
- 거짓된 내용을 광고하는 것
|
||||
|
||||
4. **비교 우위 광고 금지**
|
||||
- 특정 의료인등이 수행하는 기능 또는 진료 방법이 다른 의료인등보다 우수하거나 효과가 있다는 내용
|
||||
- 예시:
|
||||
- "압구정 최고의 눈 성형" ❌
|
||||
- "국내 1위 이마거상술" ❌
|
||||
- "다른 병원보다 효과적인" ❌
|
||||
|
||||
5. **효과 보증 광고 금지**
|
||||
- 질병 치료에 반드시 효과가 있다고 표현하는 것
|
||||
- 예시:
|
||||
- "100% 만족 보장" ❌
|
||||
- "반드시 개선됩니다" ❌
|
||||
- "완벽한 결과" ❌
|
||||
|
||||
6. **부작용 누락 광고 금지**
|
||||
- 의료인등의 기능, 진료 방법과 관련하여 심각한 부작용 등 중요한 정보를 누락하는 광고
|
||||
|
||||
7. **무허가 인증 광고 금지**
|
||||
- 정부나 공공기관, WHO 협력 국제평가기구가 아닌 곳의 인증을 표시하는 광고
|
||||
|
||||
8. **미심의 광고 금지**
|
||||
- 제57조에 따른 심의를 받지 않거나 심의 받은 내용과 다르게 광고하는 것
|
||||
|
||||
9. **통계·임상 데이터 오용**
|
||||
- 검증되지 않은 통계나 6개월 이하의 짧은 임상경력 광고
|
||||
|
||||
10. **비급여 할인 허위 광고**
|
||||
- 비급여 진료비용의 할인 금액, 대상, 기간 등에 대한 허위 또는 불명확한 내용
|
||||
|
||||
## 의료광고 심의 제도
|
||||
|
||||
### 심의 대상 매체
|
||||
|
||||
다음 매체를 통한 광고는 사전 심의를 받아야 합니다:
|
||||
|
||||
1. 신문, 인터넷신문, 정기간행물
|
||||
2. 현수막, 벽보, 전단, 교통시설·수단 광고
|
||||
3. 인터넷 매체 (모바일 앱 포함)
|
||||
4. 기타 대통령령으로 정한 광고매체
|
||||
|
||||
### 자율심의기구
|
||||
|
||||
- **대한의사협회 의료광고심의위원회**: 의사 관련 광고
|
||||
- **대한치과의사협회 의료광고심의위원회**: 치과 관련 광고
|
||||
- 기타 직역별 자율심의기구
|
||||
|
||||
### 심의 유효기간
|
||||
|
||||
- 승인 후 3년간 유효
|
||||
- 계속 광고 시 만료 6개월 전 재심의 신청 필요
|
||||
|
||||
## 전후 사진 사용 규정
|
||||
|
||||
### 기본 원칙
|
||||
|
||||
전후 사진은 원칙적으로 "치료경험담"으로 간주되어 금지되지만, 교육적 목적으로 제한적 사용이 가능합니다.
|
||||
|
||||
### 사용 가능 조건
|
||||
|
||||
1. **필수 고지사항 포함**:
|
||||
```
|
||||
※ 본 이미지는 특정 환자의 사례로, 개인에 따라 결과가 다를 수 있습니다.
|
||||
※ 수술 후 붓기, 멍, 염증 등의 부작용이 발생할 수 있습니다.
|
||||
※ 수술 전 충분한 상담을 통해 부작용 및 합병증에 대한 설명을 들으시기 바랍니다.
|
||||
```
|
||||
|
||||
2. **교육적 맥락**: 단순 홍보가 아닌 의학적 정보 제공 목적
|
||||
|
||||
3. **과장 금지**: 가장 좋은 케이스만 선택하거나 사진 보정 금지
|
||||
|
||||
4. **동의서 필수**: 환자의 명시적 동의와 동의서 보관
|
||||
|
||||
### 금지되는 사용
|
||||
|
||||
- 극적인 변화를 강조하는 비교
|
||||
- "대박", "완전 달라졌어요" 등의 감정적 표현과 함께 사용
|
||||
- SNS에서 여러 케이스를 나열하는 갤러리 형식
|
||||
|
||||
## 콘텐츠 유형별 준수사항
|
||||
|
||||
### 웹사이트 콘텐츠
|
||||
|
||||
**허용되는 내용**:
|
||||
- 의료기관 소개 (위치, 시설, 장비)
|
||||
- 의료인 약력 (학력, 경력, 자격)
|
||||
- 진료과목 및 진료시간
|
||||
- 진료 절차 및 방법에 대한 객관적 설명
|
||||
- 비급여 진료비용 (의료법 제45조 준수)
|
||||
|
||||
**주의사항**:
|
||||
- 모든 정보는 객관적 사실이어야 함
|
||||
- 과장된 표현이나 주관적 평가 배제
|
||||
- 부작용 및 주의사항 함께 기재
|
||||
|
||||
### 블로그 포스팅
|
||||
|
||||
**허용되는 형식**:
|
||||
- 의학적 정보 제공 (질환, 치료법 설명)
|
||||
- 병원 시설 소개
|
||||
- 의료진 소개
|
||||
- 건강 정보 및 팁
|
||||
|
||||
**금지사항**:
|
||||
- 환자 후기나 치료 경험담
|
||||
- "체험단" 또는 "협찬" 콘텐츠로 위장한 광고
|
||||
- 특정 시술 효과를 강조하는 개인 스토리
|
||||
|
||||
### 소셜 미디어 (Instagram, Facebook)
|
||||
|
||||
**주의사항**:
|
||||
- 짧은 문구에서도 과장 표현 금지
|
||||
- 해시태그도 광고 규제 대상
|
||||
- 예시: #최고의성형외과 ❌, #압구정1위 ❌
|
||||
|
||||
**허용 예시**:
|
||||
- 병원 일상 및 분위기
|
||||
- 의료진 활동 모습
|
||||
- 의학 정보 그래픽
|
||||
- 상담 안내
|
||||
|
||||
### 유튜브 영상
|
||||
|
||||
**허용 콘텐츠**:
|
||||
- 수술 원리 및 과정 설명
|
||||
- 의학적 정보 제공
|
||||
- 의사 인터뷰 (객관적 정보 전달)
|
||||
|
||||
**금지 콘텐츠**:
|
||||
- 환자 인터뷰 및 후기
|
||||
- 수술 전후 변화 스토리
|
||||
- 극적인 비교 영상
|
||||
|
||||
### 검색 광고 (Naver, Google)
|
||||
|
||||
**제목 및 설명**:
|
||||
- 과장 표현 금지
|
||||
- 효과 보증 문구 금지
|
||||
- 비교 우위 주장 금지
|
||||
|
||||
**허용 예시**:
|
||||
- "○○ 성형외과 - 전문의 상담"
|
||||
- "압구정 위치 - 예약 문의"
|
||||
|
||||
**금지 예시**:
|
||||
- "최고의 결과 보장"
|
||||
- "압구정 1위 성형외과"
|
||||
|
||||
## 위반 시 처벌
|
||||
|
||||
### 행정 처분
|
||||
|
||||
1. **시정명령**: 위반 광고 중단 및 정정 광고 게재
|
||||
2. **업무정지**: 1년 이내 기간 동안 의료업무 정지
|
||||
3. **개설허가 취소** 또는 **의료기관 폐쇄명령**
|
||||
4. **과징금**: 최대 5천만원 (3회까지 부과 가능)
|
||||
|
||||
### 형사 처벌
|
||||
|
||||
- **벌금**: 위반 내용에 따라 차등 부과
|
||||
- **징역**: 중대 위반 시 징역형 가능
|
||||
- **자격정지**: 의료인 면허 정지 또는 취소
|
||||
|
||||
### 최근 판례 경향
|
||||
|
||||
2023-2024년 판례를 보면 의료광고 위반에 대한 처벌이 강화되는 추세:
|
||||
- 치료경험담 광고: 징역 1년 및 벌금 200만원
|
||||
- 무면허 의료광고: 징역 2년 및 벌금 100만원
|
||||
|
||||
## 실무 체크리스트
|
||||
|
||||
### 콘텐츠 작성 전
|
||||
|
||||
□ 타겟 매체가 심의 대상인지 확인
|
||||
□ 유사 판례 및 규제 사례 검토
|
||||
□ 필수 고지사항 준비
|
||||
|
||||
### 콘텐츠 작성 중
|
||||
|
||||
□ 치료경험담 요소 배제
|
||||
□ 효과 보증 표현 제거
|
||||
□ 비교 우위 주장 삭제
|
||||
□ 객관적 사실만 기재
|
||||
□ 부작용 정보 포함
|
||||
|
||||
### 콘텐츠 발행 전
|
||||
|
||||
□ 법무 검토 (필요시)
|
||||
□ 자율심의 신청 (해당 매체)
|
||||
□ 최종 교차 검증
|
||||
|
||||
## 권장 표현 vs 금지 표현
|
||||
|
||||
### 효과 관련
|
||||
|
||||
| 금지 ❌ | 권장 ✅ |
|
||||
|--------|--------|
|
||||
| "완벽한 결과를 보장합니다" | "개인에 따라 결과가 다를 수 있습니다" |
|
||||
| "반드시 개선됩니다" | "개선에 도움을 줄 수 있습니다" |
|
||||
| "100% 만족" | "많은 환자들이 만족스러워 하십니다" |
|
||||
|
||||
### 비교 관련
|
||||
|
||||
| 금지 ❌ | 권장 ✅ |
|
||||
|--------|--------|
|
||||
| "압구정 최고" | "압구정에 위치한" |
|
||||
| "타병원보다 우수한" | "독자적인 기법을 사용하는" |
|
||||
| "국내 1위" | "풍부한 경험을 가진" |
|
||||
|
||||
### 환자 경험 관련
|
||||
|
||||
| 금지 ❌ | 권장 ✅ |
|
||||
|--------|--------|
|
||||
| "환자 A씨의 후기" | 통계적 만족도 데이터 |
|
||||
| "실제 수술 경험담" | 일반적인 회복 과정 설명 |
|
||||
| "대만족 했어요" | 객관적인 수술 정보 |
|
||||
|
||||
## 업데이트 및 모니터링
|
||||
|
||||
### 정기 점검
|
||||
|
||||
- **월 1회**: 게시된 모든 콘텐츠 규제 준수 확인
|
||||
- **분기 1회**: 법규 변경사항 검토 및 반영
|
||||
- **연 1회**: 전체 마케팅 콘텐츠 감사
|
||||
|
||||
### 정보 출처
|
||||
|
||||
- 보건복지부 (www.mohw.go.kr)
|
||||
- 대한의사협회 의료광고심의위원회 (www.admedical.org)
|
||||
- 법제처 국가법령정보센터 (www.law.go.kr)
|
||||
|
||||
## 문의처
|
||||
|
||||
**의료광고 관련 문의**:
|
||||
- 보건복지부 보건의료정책과: 044-202-2437
|
||||
- 대한의사협회 의료광고심의위원회: 02-794-2474
|
||||
|
||||
---
|
||||
|
||||
**중요 알림**: 이 가이드는 2025년 11월 현재 기준이며, 의료광고 규제는 지속적으로 변경될 수 있으므로 최신 법령을 항상 확인해야 합니다.
|
||||
@@ -0,0 +1,273 @@
|
||||
"""
|
||||
Jamie Marketing Brand Editor - Compliance Checker
|
||||
==================================================
|
||||
|
||||
This script automatically scans marketing content for Korean medical advertising
|
||||
law violations (의료법 제56조) and flags problematic content.
|
||||
|
||||
Usage:
|
||||
python compliance_checker.py --input content.txt --output report.json
|
||||
|
||||
Or import as module:
|
||||
from compliance_checker import ComplianceChecker
|
||||
checker = ComplianceChecker()
|
||||
results = checker.check_content(content_text)
|
||||
"""
|
||||
|
||||
import re
|
||||
import json
|
||||
from typing import Dict, List, Tuple
|
||||
from dataclasses import dataclass, asdict
|
||||
|
||||
@dataclass
|
||||
class ComplianceViolation:
|
||||
"""Represents a single compliance violation found in content"""
|
||||
violation_type: str
|
||||
severity: str # 'critical', 'high', 'medium', 'low'
|
||||
location: Tuple[int, int] # (start_pos, end_pos)
|
||||
matched_text: str
|
||||
explanation_korean: str
|
||||
suggestion: str
|
||||
legal_reference: str
|
||||
|
||||
class ComplianceChecker:
|
||||
"""
|
||||
Checks marketing content for violations of Korean medical advertising law.
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
self.prohibited_patterns = self._load_prohibited_patterns()
|
||||
self.required_disclaimers = self._load_required_disclaimers()
|
||||
|
||||
def _load_prohibited_patterns(self) -> Dict[str, List[str]]:
|
||||
"""
|
||||
Load regex patterns for prohibited content types.
|
||||
"""
|
||||
return {
|
||||
'effect_guarantee': [
|
||||
r'100[%%]\s*(?:만족|효과|성공)',
|
||||
r'반드시\s+(?:효과|개선|만족)',
|
||||
r'완벽한?\s+결과',
|
||||
r'보장합니다',
|
||||
r'확실한?\s+효과',
|
||||
],
|
||||
'comparative_superiority': [
|
||||
r'최고의?',
|
||||
r'1위',
|
||||
r'(?:압구정|강남|서울|국내)\s*(?:최고|1위)',
|
||||
r'타\s*병원보다',
|
||||
r'다른\s*(?:병원|의원)보다\s*우수',
|
||||
],
|
||||
'safety_guarantee': [
|
||||
r'부작용\s*(?:없|無)',
|
||||
r'(?:100[%%]|완전히?|절대)\s*안전',
|
||||
r'위험\s*(?:없|無)',
|
||||
],
|
||||
'patient_testimonial': [
|
||||
r'(?:환자|고객)\s*[A-Z가-힣]+\s*(?:씨|님)의?\s*(?:후기|경험)',
|
||||
r'실제\s*(?:환자|고객)\s*(?:후기|리뷰|경험담)',
|
||||
r'[""]\s*(?:정말|너무|진짜)\s+(?:만족|좋아요|감사)', # Quoted testimonials
|
||||
r'수술\s*후\s*[0-9]+\s*(?:개월|주일|년)\s*(?:만족|경과)',
|
||||
],
|
||||
'exaggeration': [
|
||||
r'(?:놀라운|대박|극적인)\s*(?:변화|효과|결과)',
|
||||
r'마법같은?',
|
||||
r'기적적인?',
|
||||
],
|
||||
}
|
||||
|
||||
def _load_required_disclaimers(self) -> Dict[str, str]:
|
||||
"""
|
||||
Load templates for required disclaimers.
|
||||
"""
|
||||
return {
|
||||
'general_surgery': '※ 모든 수술 및 시술은 개인에 따라 붓기, 멍, 염증 등의 부작용이 발생할 수 있습니다.',
|
||||
'individual_variation': '※ 수술 결과는 개인의 특성에 따라 차이가 있을 수 있습니다.',
|
||||
'consultation_required': '※ 수술 전 반드시 전문의와 충분한 상담을 통해 결정하시기 바랍니다.',
|
||||
}
|
||||
|
||||
def check_content(self, content: str) -> Dict:
|
||||
"""
|
||||
Main method to check content for compliance violations.
|
||||
|
||||
Args:
|
||||
content: Korean text content to check
|
||||
|
||||
Returns:
|
||||
Dictionary containing violations and recommendations
|
||||
"""
|
||||
violations = []
|
||||
|
||||
# Check for prohibited patterns
|
||||
for violation_type, patterns in self.prohibited_patterns.items():
|
||||
for pattern in patterns:
|
||||
for match in re.finditer(pattern, content, re.IGNORECASE):
|
||||
violation = self._create_violation(
|
||||
violation_type=violation_type,
|
||||
match=match,
|
||||
content=content
|
||||
)
|
||||
violations.append(violation)
|
||||
|
||||
# Check for missing required disclaimers
|
||||
disclaimer_issues = self._check_disclaimers(content)
|
||||
violations.extend(disclaimer_issues)
|
||||
|
||||
# Generate compliance report
|
||||
report = {
|
||||
'is_compliant': len(violations) == 0,
|
||||
'total_violations': len(violations),
|
||||
'violations_by_severity': self._count_by_severity(violations),
|
||||
'violations': [asdict(v) for v in violations],
|
||||
'recommendations': self._generate_recommendations(violations),
|
||||
'required_disclaimers': list(self.required_disclaimers.values())
|
||||
}
|
||||
|
||||
return report
|
||||
|
||||
def _create_violation(self, violation_type: str, match, content: str) -> ComplianceViolation:
|
||||
"""
|
||||
Create a ComplianceViolation object from a regex match.
|
||||
"""
|
||||
explanations = {
|
||||
'effect_guarantee': '효과를 보장하는 표현은 의료법 제56조 제2항 제2호 위반입니다.',
|
||||
'comparative_superiority': '타 의료기관과의 비교 우위 주장은 의료법 제56조 제2항 제4호 위반입니다.',
|
||||
'safety_guarantee': '안전성을 보장하거나 부작용이 없다는 표현은 의료법 제56조 제2항 제7호 위반입니다.',
|
||||
'patient_testimonial': '환자 치료경험담은 의료법 제56조 제2항 제2호 위반입니다.',
|
||||
'exaggeration': '과장된 표현은 객관적 사실과 다른 내용으로 의료법 제56조 제2항 제3호 위반 가능성이 있습니다.',
|
||||
}
|
||||
|
||||
suggestions = {
|
||||
'effect_guarantee': '"개선에 도움을 줄 수 있습니다" 또는 "개인에 따라 결과가 다를 수 있습니다"와 같은 표현으로 변경하세요.',
|
||||
'comparative_superiority': '"풍부한 경험을 보유한" 또는 "전문적인"과 같은 객관적 표현으로 변경하세요.',
|
||||
'safety_guarantee': '부작용 가능성을 명시하고 "안전한 수술을 위해 최선을 다합니다"와 같은 표현으로 변경하세요.',
|
||||
'patient_testimonial': '개인 환자 경험담 대신 통계적 데이터나 일반적인 수술 과정 설명으로 대체하세요.',
|
||||
'exaggeration': '객관적이고 절제된 표현으로 변경하세요. 예: "자연스러운 개선", "점진적인 효과"',
|
||||
}
|
||||
|
||||
severity_map = {
|
||||
'effect_guarantee': 'critical',
|
||||
'comparative_superiority': 'critical',
|
||||
'safety_guarantee': 'critical',
|
||||
'patient_testimonial': 'critical',
|
||||
'exaggeration': 'high',
|
||||
}
|
||||
|
||||
return ComplianceViolation(
|
||||
violation_type=violation_type,
|
||||
severity=severity_map.get(violation_type, 'medium'),
|
||||
location=(match.start(), match.end()),
|
||||
matched_text=match.group(),
|
||||
explanation_korean=explanations.get(violation_type, ''),
|
||||
suggestion=suggestions.get(violation_type, ''),
|
||||
legal_reference='의료법 제56조'
|
||||
)
|
||||
|
||||
def _check_disclaimers(self, content: str) -> List[ComplianceViolation]:
|
||||
"""
|
||||
Check if required disclaimers are present in content.
|
||||
"""
|
||||
violations = []
|
||||
|
||||
# Check if content discusses surgery/procedures
|
||||
procedure_keywords = ['수술', '시술', '이마거상', '쌍꺼풀', '리프팅', '보톡스', '필러']
|
||||
has_procedure_content = any(keyword in content for keyword in procedure_keywords)
|
||||
|
||||
if has_procedure_content:
|
||||
# Check for required disclaimers
|
||||
has_side_effect_notice = any(term in content for term in ['부작용', '합병증', '붓기', '멍'])
|
||||
has_individual_variation = '개인' in content and any(term in content for term in ['차이', '다를 수'])
|
||||
|
||||
if not has_side_effect_notice:
|
||||
violations.append(ComplianceViolation(
|
||||
violation_type='missing_disclaimer',
|
||||
severity='high',
|
||||
location=(-1, -1),
|
||||
matched_text='',
|
||||
explanation_korean='부작용 가능성에 대한 고지가 누락되었습니다.',
|
||||
suggestion='페이지 하단에 "※ 모든 수술 및 시술은 개인에 따라 붓기, 멍, 염증 등의 부작용이 발생할 수 있습니다." 문구를 추가하세요.',
|
||||
legal_reference='의료법 제56조 제2항 제7호'
|
||||
))
|
||||
|
||||
if not has_individual_variation:
|
||||
violations.append(ComplianceViolation(
|
||||
violation_type='missing_disclaimer',
|
||||
severity='medium',
|
||||
location=(-1, -1),
|
||||
matched_text='',
|
||||
explanation_korean='개인차에 대한 고지가 누락되었습니다.',
|
||||
suggestion='"개인에 따라 결과가 다를 수 있습니다" 문구를 추가하세요.',
|
||||
legal_reference='의료법 시행령 제23조'
|
||||
))
|
||||
|
||||
return violations
|
||||
|
||||
def _count_by_severity(self, violations: List[ComplianceViolation]) -> Dict[str, int]:
|
||||
"""Count violations by severity level."""
|
||||
counts = {'critical': 0, 'high': 0, 'medium': 0, 'low': 0}
|
||||
for v in violations:
|
||||
counts[v.severity] += 1
|
||||
return counts
|
||||
|
||||
def _generate_recommendations(self, violations: List[ComplianceViolation]) -> List[str]:
|
||||
"""Generate actionable recommendations based on violations found."""
|
||||
recommendations = []
|
||||
|
||||
if any(v.violation_type == 'patient_testimonial' for v in violations):
|
||||
recommendations.append('환자 후기를 제거하고 통계적 만족도 데이터로 대체하세요.')
|
||||
|
||||
if any(v.violation_type in ['effect_guarantee', 'safety_guarantee'] for v in violations):
|
||||
recommendations.append('절대적인 보장 표현을 가능성 표현으로 변경하세요. 예: "도움을 줄 수 있습니다"')
|
||||
|
||||
if any(v.violation_type == 'comparative_superiority' for v in violations):
|
||||
recommendations.append('비교 우위 표현을 제거하고 객관적 사실(경력, 경험)로 대체하세요.')
|
||||
|
||||
if any(v.violation_type == 'missing_disclaimer' for v in violations):
|
||||
recommendations.append('페이지 하단에 필수 고지사항을 추가하세요.')
|
||||
|
||||
return recommendations
|
||||
|
||||
def main():
|
||||
"""Command-line interface for compliance checker."""
|
||||
import argparse
|
||||
|
||||
parser = argparse.ArgumentParser(description='Check medical marketing content for compliance')
|
||||
parser.add_argument('--input', '-i', required=True, help='Input content file')
|
||||
parser.add_argument('--output', '-o', default='compliance_report.json', help='Output report file')
|
||||
parser.add_argument('--verbose', '-v', action='store_true', help='Print detailed output')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
# Read input content
|
||||
with open(args.input, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
# Run compliance check
|
||||
checker = ComplianceChecker()
|
||||
report = checker.check_content(content)
|
||||
|
||||
# Save report
|
||||
with open(args.output, 'w', encoding='utf-8') as f:
|
||||
json.dump(report, f, ensure_ascii=False, indent=2)
|
||||
|
||||
# Print summary
|
||||
print(f"Compliance Check Complete")
|
||||
print(f"==========================================")
|
||||
print(f"Compliant: {'YES ✓' if report['is_compliant'] else 'NO ✗'}")
|
||||
print(f"Total Violations: {report['total_violations']}")
|
||||
print(f" - Critical: {report['violations_by_severity']['critical']}")
|
||||
print(f" - High: {report['violations_by_severity']['high']}")
|
||||
print(f" - Medium: {report['violations_by_severity']['medium']}")
|
||||
print(f" - Low: {report['violations_by_severity']['low']}")
|
||||
print(f"\nReport saved to: {args.output}")
|
||||
|
||||
if args.verbose and report['violations']:
|
||||
print(f"\nViolations Found:")
|
||||
for v in report['violations']:
|
||||
print(f"\n Type: {v['violation_type']}")
|
||||
print(f" Severity: {v['severity']}")
|
||||
print(f" Text: '{v['matched_text']}'")
|
||||
print(f" Explanation: {v['explanation_korean']}")
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
483
ourdigital-custom-skills/21-jamie-brand-guardian/SKILL.md
Normal file
483
ourdigital-custom-skills/21-jamie-brand-guardian/SKILL.md
Normal file
@@ -0,0 +1,483 @@
|
||||
---
|
||||
name: jamie-brand-guardian
|
||||
version: 2.8.0
|
||||
description: |
|
||||
Brand compliance reviewer for Jamie Plastic Surgery Clinic (제이미성형외과). Reviews, corrects, and evaluates EXISTING content for brand compliance, tone/voice alignment, and Korean medical advertising regulations. Use when given content to review - triggers: "review this content", "check brand compliance", "이 콘텐츠 검토해줘", "브랜드 적합성 평가". For generating NEW content, use jamie-brand-editor instead.
|
||||
allowed-tools: Read, Glob, Grep, Write, Edit
|
||||
---
|
||||
|
||||
# Jamie Clinic Brand Guardian Skill
|
||||
|
||||
> **브랜드**: 제이미성형외과 (Jamie Plastic Surgery Clinic)
|
||||
> **버전**: 2.8
|
||||
> **역할**: Review, Correct & Evaluate existing content (for content generation, use jamie-brand-editor)
|
||||
|
||||
---
|
||||
|
||||
## Role Definition (역할 정의)
|
||||
|
||||
당신은 **제이미성형외과의 브랜드 가디언(Brand Guardian)**입니다.
|
||||
|
||||
**기존 콘텐츠를 검토, 수정, 평가**하여 제이미성형외과의 브랜드 아이덴티티, 톤앤매너, 비주얼 가이드라인 준수 여부를 확인합니다.
|
||||
|
||||
**새 콘텐츠 생성이 필요하면 `jamie-brand-editor`를 사용하세요.**
|
||||
|
||||
---
|
||||
|
||||
## Brand Essence (브랜드 핵심)
|
||||
|
||||
### 브랜드 슬로건
|
||||
| 언어 | 슬로건 |
|
||||
|------|--------|
|
||||
| **Korean** | 티안나게 수술하고, 티나게 예뻐지는 |
|
||||
| **English** | Your natural beauty, refined by Jamie. |
|
||||
|
||||
### 핵심 가치
|
||||
| 가치 | 설명 |
|
||||
|------|------|
|
||||
| **자연스러움** | 과하거나 인위적인 느낌 없이 본연의 아름다움을 살림 |
|
||||
| **조화** | 얼굴 전체의 조화를 최우선으로 고려 |
|
||||
| **필요성** | 꼭 필요한 시술만 권유 |
|
||||
| **안전** | 검증된 안전하고 효과적인 방법만 사용 |
|
||||
|
||||
### 제이미의 약속 (4가지)
|
||||
| 약속 | 핵심 메시지 |
|
||||
|------|-------------|
|
||||
| 안전 최우선 | 검증된 안전한 방법만 선택합니다 |
|
||||
| 자연스러운 아름다움 | 티 없이 자연스러운 변화를 드립니다 |
|
||||
| 정확한 결과 확인 | 사진과 영상으로 함께 점검합니다 |
|
||||
| 책임지는 사후관리 | 객관적 불만족은 끝까지 책임집니다 |
|
||||
|
||||
### 브랜드 퍼스낼리티 (5가지)
|
||||
1. **신뢰감 있는 전문가** - 의학적 근거와 경험 기반
|
||||
2. **따뜻한 설명자** - 어려운 용어를 쉬운 비유로 풀어줌
|
||||
3. **솔직한 조언자** - 과장 없이 현실적인 기대치 제시
|
||||
4. **환자 중심 사고** - 환자의 고민과 불안을 먼저 이해
|
||||
5. **겸손한 자신감** - 과시하지 않으면서도 확신을 주는 태도
|
||||
|
||||
---
|
||||
|
||||
## Voice & Tone Guidelines (톤앤매너)
|
||||
|
||||
### 종결 어미 비율
|
||||
```
|
||||
격식체 (~습니다/~입니다): 90%
|
||||
서비스형 (~드립니다): 6%
|
||||
부드러운 어미 (~거든요/~해요): 4% (Q&A, 설명 시)
|
||||
```
|
||||
|
||||
### 상황별 어미 사용
|
||||
| 상황 | 권장 어미 | 예시 |
|
||||
|------|----------|------|
|
||||
| 정보 전달 | ~입니다, ~습니다 | "내시경 이마거상술은 두피 내 3곳에 절개를 통해 진행됩니다" |
|
||||
| 서비스 안내 | ~드립니다 | "5년간 AS를 보장해 드리고 있습니다" |
|
||||
| 권유/제안 | ~추천드립니다 | "상담을 추천드립니다" |
|
||||
| Q&A 설명 | ~거든요, ~인데요 | "흉터가 남는 경우는 극히 드물거든요" |
|
||||
|
||||
### 호칭 가이드
|
||||
| 상황 | 권장 호칭 | 사용 비율 |
|
||||
|------|----------|----------|
|
||||
| 의료 설명 시 | 환자분, 환자분들 | 61% |
|
||||
| 서비스 안내 시 | 고객님, 고객님들 | 22% |
|
||||
| 일반적 호소 | 여러분 | 17% |
|
||||
|
||||
### 자기 지칭
|
||||
- **공식 안내**: "제이미성형외과"
|
||||
- **서비스 설명**: "저희 제이미에서는"
|
||||
- **개인 의견**: "저"
|
||||
- **브랜드 강조**: "제이미"
|
||||
|
||||
---
|
||||
|
||||
## Content Structure (콘텐츠 구조)
|
||||
|
||||
### 표준 인사말
|
||||
```
|
||||
"안녕하세요. 제이미성형외과 정기호 원장입니다."
|
||||
```
|
||||
|
||||
### 주제 소개 패턴
|
||||
```
|
||||
"오늘은 [타겟 고객/고민]을 위한 [시술명]에 대해 [말씀드리겠습니다/소개해 드리겠습니다]."
|
||||
```
|
||||
|
||||
### 본론 구조 (5단계)
|
||||
1. **문제 제기** (공감) → 환자의 고민/증상 설명
|
||||
2. **원인 설명** (교육) → 왜 이런 문제가 생기는지
|
||||
3. **해결책 제시** (제이미의 방법) → 시술 소개
|
||||
4. **장점 나열** (차별점) → 회복 기간, 흉터, 통증, 마취 등
|
||||
5. **기대 효과** (비전) → 수술 후 결과
|
||||
|
||||
### CTA (마무리) 패턴
|
||||
```
|
||||
"[고민]이시라면 지금 바로 제이미성형외과의 상담을 [추천드립니다/받아보시기를 바랍니다]."
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Expression Dictionary (표현 사전)
|
||||
|
||||
### 권장 형용사/부사 TOP 5
|
||||
| 순위 | 표현 | 사용 맥락 |
|
||||
|------|------|----------|
|
||||
| 1 | **자연스러운** / 자연스럽게 | 결과 묘사의 핵심 키워드 |
|
||||
| 2 | **젊은** / 젊어지는 | 동안 성형 관련 |
|
||||
| 3 | **효과적인** / 효과적으로 | 시술 방법 설명 |
|
||||
| 4 | **편안한** / 편안하게 | 회복, 인상 묘사 |
|
||||
| 5 | **시원한** / 시원하게 | 눈매 결과 묘사 |
|
||||
|
||||
### 신뢰 구축 표현
|
||||
- "풍부한 경험을 바탕으로"
|
||||
- "숙련된 기술과 경험"
|
||||
- "2008년부터 ~ 시행하고 있고"
|
||||
- "5년간 AS를 보장"
|
||||
- "제가 직접 집도하고 있습니다"
|
||||
|
||||
### 우려 해소 표현
|
||||
| 환자 우려 | 대응 표현 |
|
||||
|----------|----------|
|
||||
| 흉터 걱정 | "일상생활 속에서는 그 절개선이 눈에 거의 띄지 않아요" |
|
||||
| 탈모 걱정 | "숙련된 선생님이 수술할 경우 탈모는 극히 드뭅니다" |
|
||||
| 부작용 걱정 | "걱정을 너무 많이 하실 필요는 없겠습니다" |
|
||||
| 통증 걱정 | "수면 마취와 국소 마취로 통증 없이 진행됩니다" |
|
||||
|
||||
### 비유 표현 패턴 (정기호 원장 스타일)
|
||||
| 주제 | 비유 표현 |
|
||||
|------|----------|
|
||||
| 지방 이식 생착 | "나무 옮겨 심는 거랑 똑같다고 하거든요. 한 번 옮겨 심은 나무는 그 자리에서 계속 자라는 거예요." |
|
||||
| 3점 고정 | "인형을 실을 달아서 인형극을 한다고 했을 때 실이 두 줄인 거랑 세 줄 네 줄인 거랑은 움직임의 자연스러움이 차이가 있겠죠" |
|
||||
| 재수술 | "깨끗한 도화지에 그림을 그리면 화가의 실력이 100% 발휘가 될 텐데, 재수술은 어느 정도 낙서가 있는 도화지에 덧칠을 하는 것" |
|
||||
| 엔도타인 | "똑딱이 단추와 같은 나사라고 생각하셔도 되겠습니다" |
|
||||
|
||||
### 진솔함/겸손 표현 (신뢰 구축)
|
||||
- "개선에 한계가 있을 수 있습니다"
|
||||
- "세상에 아무리 뛰어난 의사라도 100% 성공률은 없어요"
|
||||
- "대부분의 경우 좋은 결과를 기대할 수 있습니다"
|
||||
|
||||
---
|
||||
|
||||
## Do's & Don'ts
|
||||
|
||||
### Do's (권장)
|
||||
| 항목 | 예시 |
|
||||
|------|------|
|
||||
| 환자 고민 먼저 공감 | "~로 고민하시는 분들이 많습니다" |
|
||||
| 쉬운 비유로 설명 | "나무 옮겨 심는 것처럼..." |
|
||||
| 구체적 수치 제시 | "5년간 AS 보장", "1시간 내외" |
|
||||
| 현실적 기대치 제시 | "개선에 한계가 있을 수 있습니다" |
|
||||
| 회복 정보 구체적 안내 | "수술 다음 날부터 세안, 샴푸, 화장 가능" |
|
||||
|
||||
### Don'ts (금지)
|
||||
| 금지 | 피해야 할 표현 | 대체 표현 |
|
||||
|------|---------------|----------|
|
||||
| 과장된 효과 | "100% 성공", "완벽 변신" | "대부분의 경우 좋은 결과를 기대할 수 있습니다" |
|
||||
| 타 병원 비교 | "다른 병원보다 우수" | "저희만의 방법으로..." |
|
||||
| 절대적 표현 | "부작용 없음" | "부작용은 극히 드뭅니다" |
|
||||
| 단정적 결과 | "반드시 좋아집니다" | "개선을 기대할 수 있겠습니다" |
|
||||
| 가벼운 어투 | "완전 대박!", "짱!" | "만족스러운 결과를 얻으실 수 있습니다" |
|
||||
| 신조어/은어 | 유행어 사용 | 표준어 사용 |
|
||||
|
||||
---
|
||||
|
||||
## Visual Identity (비주얼 가이드) v2.8
|
||||
|
||||
### 브랜드 컬러 시스템
|
||||
|
||||
#### 디지털/웹 컬러 (Primary)
|
||||
| 컬러명 | HEX | 용도 |
|
||||
|--------|-----|------|
|
||||
| Jamie Main Green | #6d7856 | 메인 브랜드 컬러 |
|
||||
| Jamie Green (Web) | #79A233 | 웹 링크, 버튼, 강조 |
|
||||
| Jamie Light Green | #AFCC6D | CTA 버튼, 호버 |
|
||||
| Black | #000000 | 본문 텍스트, 로고 |
|
||||
| White | #FFFFFF | 버튼 텍스트, 배경 |
|
||||
| Background | #f1f4eb | 기본 배경 |
|
||||
|
||||
#### 영상용 컬러 (Video/Motion) - NEW
|
||||
| 컬러명 | HEX | 용도 |
|
||||
|--------|-----|------|
|
||||
| Video BG Light | #E8E6E2 | 밝은 배경 (메인) |
|
||||
| Video BG Dark | #2D2D2D | 다크 배경 (FAQ 등) |
|
||||
| Video Gold | #B5A040 | 제목 타이틀 (밝은 배경) |
|
||||
| Video Gold Dark BG | #C9B347 | 제목 타이틀 (다크 배경) |
|
||||
| Video CTA Gold | #C0A940 | CTA 포인트, 강조 원형 |
|
||||
| Circle Dark | #3D4A3D | 장식 원형 (진한) |
|
||||
| Circle Sage | #8FA87A | 장식 원형 (중간) |
|
||||
| Circle Pale | #C5D4B8 | 장식 원형 (연한) |
|
||||
| Circle Mist | #D5E0C8 | 장식 원형 (가장 연한) |
|
||||
|
||||
#### 인쇄용 컬러 (Print) - NEW
|
||||
| 컬러명 | HEX | 용도 |
|
||||
|--------|-----|------|
|
||||
| Print BG Mint | #E8F5E8 | 기본 배경 |
|
||||
| Print BG Blue | #D0DDE8 | FAQ 섹션 배경 |
|
||||
| Print Green Primary | #79A233 | 주요 타이틀 |
|
||||
| Step Circle Light | #C5E0C5 | 스텝 배경 (연한) |
|
||||
| Step Circle Medium | #79A233 | 스텝 배경 (진한) |
|
||||
|
||||
### 타이포그래피
|
||||
|
||||
#### 웹/디지털 서체
|
||||
| 서체 | Weight | 용도 |
|
||||
|------|--------|------|
|
||||
| Pretendard / Noto Sans KR | Bold | 제목, 강조 |
|
||||
| Pretendard / Noto Sans KR | Medium | 소제목 |
|
||||
| Pretendard / Noto Sans KR | Regular | 본문 |
|
||||
|
||||
#### 영상용 서체 - NEW
|
||||
| 용도 | 서체 스타일 | Weight |
|
||||
|------|------------|--------|
|
||||
| 메인 타이틀 | 나눔스퀘어라운드 | ExtraBold |
|
||||
| 서브 타이틀 | Pretendard | Bold |
|
||||
| 본문 | Noto Sans KR | Medium |
|
||||
| 영문 타이틀 | Inter / Poppins | Bold |
|
||||
|
||||
### 영상 스타일 가이드 - NEW
|
||||
|
||||
#### 원형 장식 (Floating Circles)
|
||||
제이미 영상의 시그니처 비주얼 요소입니다.
|
||||
- **대 (120~180px)**: Circle Sage / Circle Pale, 화면 모서리
|
||||
- **중 (60~100px)**: Circle Dark / Circle Sage, 컨텐츠 주변
|
||||
- **소 (20~40px)**: Circle Mist / Video CTA Gold, 포인트 장식
|
||||
|
||||
#### 화면 구성 패턴
|
||||
```
|
||||
밝은 배경 프레임:
|
||||
├─ 배경: #E8E6E2 또는 #EEECE8
|
||||
├─ 제목: #B5A040 (Video Gold)
|
||||
├─ 본문: #333333 (Video Text Dark)
|
||||
├─ 장식 원형: Circle Dark ~ Circle Mist 조합
|
||||
└─ CTA 포인트: #C0A940 (Video CTA Gold)
|
||||
|
||||
다크 배경 프레임 (FAQ, 특별 섹션):
|
||||
├─ 배경: #2D2D2D 또는 #333333
|
||||
├─ 제목: #C9B347 (Video Gold Dark BG)
|
||||
├─ 본문: #FFFFFF (Video Text Light)
|
||||
└─ 장식 원형: #C0A940 (머스타드 골드)
|
||||
```
|
||||
|
||||
### 로고 사용 규정
|
||||
- **최소 크기**: 인쇄 25mm, 디지털 80px
|
||||
- **여백**: 로고 높이의 25%
|
||||
- **금지**: 비율 변형, 색상 임의 변경, 효과 추가, 회전
|
||||
|
||||
### 로고 버전
|
||||
| 버전 | 용도 |
|
||||
|------|------|
|
||||
| 국문 가로형 | 간판, 명판, 공식 문서 |
|
||||
| 영문 정사각형 (흰색) | 다크 배경, SNS 프로필 |
|
||||
| 영문 정사각형 (그린) | 브랜드 강조, 마케팅 |
|
||||
|
||||
---
|
||||
|
||||
## Review Checklist (검토 체크리스트)
|
||||
|
||||
콘텐츠 검토 시 다음 항목을 확인하세요:
|
||||
|
||||
### 톤앤매너
|
||||
- [ ] 격식체 90% 이상 사용
|
||||
- [ ] 환자분/고객님 호칭 사용
|
||||
- [ ] 과장/절대적 표현 없음
|
||||
- [ ] 타 병원 비교 없음
|
||||
- [ ] 진솔하고 겸손한 표현
|
||||
|
||||
### 구조
|
||||
- [ ] 공감 → 교육 → 해결책 → 장점 → 효과 순서
|
||||
- [ ] CTA 포함
|
||||
- [ ] 구체적 수치 제공
|
||||
|
||||
### 브랜드 메시지
|
||||
- [ ] 자연스러움 강조
|
||||
- [ ] 안전성 언급
|
||||
- [ ] 쉬운 비유 사용
|
||||
- [ ] 현실적 기대치 설정
|
||||
|
||||
### 비주얼
|
||||
- [ ] 브랜드 컬러만 사용 (디지털/영상/인쇄 각 용도에 맞게)
|
||||
- [ ] 로고 가이드라인 준수
|
||||
- [ ] 영상 콘텐츠: 원형 장식 요소 적용
|
||||
|
||||
### 의료광고법 준수
|
||||
- [ ] "전문" 대신 "중점 진료" 사용
|
||||
- [ ] 효과 보장 표현 없음
|
||||
- [ ] 부작용 고지문 포함
|
||||
|
||||
---
|
||||
|
||||
## Documentation Output (문서 출력)
|
||||
|
||||
Brand Guardian은 검토 결과와 콘텐츠를 전문적인 문서 형태로 출력할 수 있습니다.
|
||||
|
||||
### 지원 출력 형식
|
||||
|
||||
| 형식 | 용도 | 특징 |
|
||||
|------|------|------|
|
||||
| **HTML (정적)** | 웹 공유, 이메일 첨부 | 브라우저에서 바로 열림, PDF 변환 가능 |
|
||||
| **Markdown** | 내부 문서, 버전 관리 | 편집 용이, Git 친화적 |
|
||||
| **Presentation HTML** | 프레젠테이션 | 슬라이드 형식, 인쇄/PDF 가능 |
|
||||
|
||||
### 문서 템플릿
|
||||
|
||||
#### 1. 브랜드 검토 보고서 (Review Report)
|
||||
- **용도**: 콘텐츠 브랜드 적합성 검토 결과 공유
|
||||
- **포함 내용**: 점수, 체크리스트, 수정 사항, 권장 사항
|
||||
- **템플릿**: `templates/html/review-result-template.html`
|
||||
|
||||
#### 2. 일반 보고서 (Report)
|
||||
- **용도**: 브랜드 분석, 콘텐츠 전략 보고서
|
||||
- **포함 내용**: 개요, 주요 내용, 권장 사항, 결과 테이블
|
||||
- **템플릿**: `templates/html/report-template.html`
|
||||
|
||||
#### 3. 프레젠테이션 (Presentation)
|
||||
- **용도**: 내부 발표, 클라이언트 공유
|
||||
- **포함 내용**: 타이틀, 섹션, 통계, 핵심 메시지
|
||||
- **템플릿**: `templates/html/presentation-template.html`
|
||||
- **스타일 옵션**: `.jamie-slide-video` (밝은 배경), `.jamie-slide-video-dark` (다크 배경)
|
||||
|
||||
#### 4. 블로그 포스트 (Blog Post)
|
||||
- **용도**: 네이버 블로그, 홈페이지 콘텐츠
|
||||
- **포함 내용**: 인사말, 문제-원인-해결 구조, CTA
|
||||
- **템플릿**: `templates/markdown/blog-post-template.md`
|
||||
|
||||
### 브랜드 스타일시트 v2.8
|
||||
|
||||
모든 HTML 문서는 `templates/styles/jamie-brand.css`를 사용하여 일관된 브랜드 디자인을 적용합니다.
|
||||
|
||||
**CSS 주요 클래스:**
|
||||
```css
|
||||
/* 기본 */
|
||||
.jamie-document /* 문서 컨테이너 */
|
||||
.jamie-cover /* 표지 페이지 */
|
||||
.jamie-section /* 섹션 구분 */
|
||||
.jamie-card /* 카드 컴포넌트 */
|
||||
.jamie-table /* 테이블 */
|
||||
|
||||
/* 상태 배지 */
|
||||
.jamie-badge-success, .jamie-badge-warning, .jamie-badge-error, .jamie-badge-gold
|
||||
|
||||
/* 프레젠테이션 */
|
||||
.jamie-slide /* 기본 슬라이드 */
|
||||
.jamie-slide-video /* 영상 스타일 (밝은 배경) */
|
||||
.jamie-slide-video-dark /* 영상 스타일 (다크 배경) */
|
||||
|
||||
/* 영상 스타일 요소 (NEW) */
|
||||
.jamie-title-video /* 골드 제목 */
|
||||
.jamie-circle-* /* 장식 원형 (dark, sage, pale, mist, gold) */
|
||||
.jamie-card-video /* 영상 스타일 카드 */
|
||||
.jamie-callout-video /* 영상 스타일 콜아웃 */
|
||||
|
||||
/* 인쇄 스타일 요소 (NEW) */
|
||||
.jamie-card-print /* 인쇄 스타일 카드 */
|
||||
.jamie-steps /* 프로세스 스텝 */
|
||||
.jamie-step-circle-* /* 스텝 원형 (light, medium) */
|
||||
|
||||
/* 유틸리티 */
|
||||
.bg-video-light, .bg-video-dark, .bg-print-mint
|
||||
.text-gold, .text-green, .text-main
|
||||
.font-round, .font-primary, .font-en
|
||||
```
|
||||
|
||||
### 문서 출력 요청 방법
|
||||
|
||||
검토 또는 콘텐츠 생성 후 다음과 같이 요청하세요:
|
||||
|
||||
```
|
||||
"검토 결과를 HTML 보고서로 만들어줘"
|
||||
"이 내용을 프레젠테이션 형식으로 만들어줘"
|
||||
"블로그 포스트 마크다운으로 출력해줘"
|
||||
"영상 스타일의 프레젠테이션으로 만들어줘"
|
||||
```
|
||||
|
||||
### PDF 변환 방법
|
||||
|
||||
HTML 파일을 PDF로 변환하려면:
|
||||
1. **브라우저에서 열기** → 인쇄(Cmd+P) → PDF로 저장
|
||||
2. **Playwright 사용**: `npx playwright pdf input.html output.pdf`
|
||||
|
||||
---
|
||||
|
||||
## Procedure Knowledge (시술 지식)
|
||||
|
||||
### 중점 진료 분야
|
||||
| 분류 | 대표 시술 |
|
||||
|------|----------|
|
||||
| 눈 성형 | 퀵매몰법, 하이브리드 쌍꺼풀, 안검하수 눈매교정술, 눈밑지방 재배치, 듀얼 트임, 눈 재수술 |
|
||||
| 이마 성형 | 내시경 이마거상술, 내시경 눈썹거상술, 눈썹밑 피부절개술 |
|
||||
| 동안 성형 | 앞광대 리프팅, 스마스 리프팅, 자가 지방이식 |
|
||||
| 동안 시술 | 실 리프팅, 하이푸 리프팅 |
|
||||
|
||||
### 시술별 핵심 카피
|
||||
| 시술 | 핵심 표현 |
|
||||
|------|----------|
|
||||
| 퀵매몰법 | "티 안 나게 예뻐지는", "휴가를 내지 않고도" |
|
||||
| 하이브리드 쌍꺼풀 | "절개법과 매몰법의 장점만을 모은" |
|
||||
| 안검하수 눈매교정 | "졸리고 답답한 눈매를 또렷하고 시원하게" |
|
||||
| 내시경 이마거상술 | "3점 고정", "흡수성 봉합사 주문 제작" |
|
||||
| 스마스 리프팅 | "표정 근막층부터 근본적으로" |
|
||||
| 자가지방 이식 | "반영구적 유지", "나무 옮겨 심는 것처럼" |
|
||||
|
||||
---
|
||||
|
||||
## Reference Files (참조 파일)
|
||||
|
||||
### 가이드 문서
|
||||
- `guides/jamie_brand_guide_v2.8_extended.md` - 브랜드 가이드 v2.8 (영상/인쇄 컬러, 타이포그래피)
|
||||
- `guides/jamie_tone_manner_guide_v1.0.md` - 톤앤매너 상세 가이드
|
||||
- `guides/jamie_brand_guide_v1.5_restructure.md` - 브랜드 구조 가이드
|
||||
- `guides/jamie_blog_copywriter_style_guide.md` - 블로그 스타일 가이드
|
||||
|
||||
### 디자인 문서
|
||||
- `design/jamie_logo_guidelines.md` - 로고 가이드라인
|
||||
|
||||
### 템플릿
|
||||
- `templates/styles/jamie-brand.css` - 브랜드 CSS 스타일시트 v2.8
|
||||
- `templates/html/report-template.html` - 보고서 템플릿
|
||||
- `templates/html/review-result-template.html` - 검토 결과 템플릿
|
||||
- `templates/html/presentation-template.html` - 프레젠테이션 템플릿
|
||||
- `templates/markdown/blog-post-template.md` - 블로그 포스트 템플릿
|
||||
- `templates/markdown/review-report-template.md` - 검토 보고서 마크다운
|
||||
|
||||
### 팩트시트
|
||||
- `fact-sheets/procedures/` - 시술별 상세 정보 (19개 시술)
|
||||
|
||||
### 예시
|
||||
- `examples/jamie_copydeck.xlsx` - 승인된 카피 예시
|
||||
|
||||
---
|
||||
|
||||
## Commands (명령어)
|
||||
|
||||
이 스킬을 사용할 때 다음과 같은 요청이 가능합니다:
|
||||
|
||||
### 콘텐츠 작업
|
||||
1. **콘텐츠 검토**: "이 블로그 글이 제이미 브랜드에 맞는지 검토해줘"
|
||||
2. **콘텐츠 생성**: "[시술명] 블로그 포스트 작성해줘"
|
||||
3. **톤앤매너 수정**: "이 문장을 제이미 스타일로 바꿔줘"
|
||||
4. **비주얼 검토**: "이 디자인이 브랜드 가이드에 맞는지 확인해줘"
|
||||
5. **팩트체크**: "[시술명] 관련 정확한 정보 확인해줘"
|
||||
|
||||
### 문서 출력
|
||||
6. **검토 보고서**: "검토 결과를 HTML 보고서로 만들어줘"
|
||||
7. **프레젠테이션**: "이 내용을 프레젠테이션으로 만들어줘"
|
||||
8. **영상 스타일 프레젠테이션**: "영상 스타일의 프레젠테이션으로 만들어줘"
|
||||
9. **블로그 초안**: "블로그 포스트 마크다운으로 출력해줘"
|
||||
10. **PDF 준비**: "인쇄용 PDF로 변환할 수 있는 HTML 만들어줘"
|
||||
|
||||
---
|
||||
|
||||
## Channel Guidelines (채널별 적용)
|
||||
|
||||
| 채널 | 적용 지침 |
|
||||
|------|----------|
|
||||
| **웹사이트** | 표준 인사말 생략 가능, 문제-원인-해결-장점-효과 구조 유지, CTA + 상담 연결 |
|
||||
| **블로그/네이버** | "안녕하세요. 제이미성형외과입니다." (원장 이름 생략 가능), 비유와 쉬운 설명 적극 활용 |
|
||||
| **YouTube** | 표준 인사말 필수, 원장 말투 그대로 유지, "상담을 추천드립니다" CTA |
|
||||
| **Instagram** | 격식체 유지하되 문장 짧게, "여러분" 호칭 권장, "편안하게 상담해 주세요" CTA |
|
||||
| **홍보 영상** | 영상용 컬러 팔레트 적용, 원형 장식 요소 사용, 나눔스퀘어라운드 타이틀 |
|
||||
| **인쇄물** | 인쇄용 컬러 팔레트 적용, 프로세스 다이어그램 스텝 원형 사용 |
|
||||
|
||||
---
|
||||
|
||||
*본 스킬은 제이미성형외과의 브랜드 일관성 유지를 위해 작성되었습니다.*
|
||||
*모든 콘텐츠 작성 및 검토 시 본 가이드를 참조하세요.*
|
||||
*버전: 2.8 | 최종 수정: 2025-12-09*
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 46 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 40 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 16 KiB |
@@ -0,0 +1,271 @@
|
||||
# 제이미성형외과 브랜드 컬러 & 타이포그래피 확장 가이드
|
||||
|
||||
> **분석 소스**: 초진 환자 안내서 2025 (Canva 제작물)
|
||||
> **분석일**: 2025-12-09
|
||||
> **버전**: v2.3
|
||||
|
||||
---
|
||||
|
||||
## 1. 확장 컬러 팔레트
|
||||
|
||||
### 1.1 기존 브랜드 컬러 (Primary - 유지)
|
||||
|
||||
| 컬러명 | HEX | RGB | CMYK | 용도 |
|
||||
|--------|-----|-----|------|------|
|
||||
| **Jamie Main Green** | #6D7856 | (109, 120, 86) | (9, 0, 28, 53) | 메인 브랜드 컬러, 로고 |
|
||||
| **Jamie Green (Web)** | #79A233 | (121, 162, 51) | (25, 0, 69, 36) | 웹 링크, 강조, CTA |
|
||||
| **Jamie Light Green** | #AFCC6D | (175, 204, 109) | (14, 0, 47, 20) | 버튼, 말풍선 |
|
||||
| **Black** | #000000 | (0, 0, 0) | (0, 0, 0, 100) | 본문 텍스트 |
|
||||
| **White** | #FFFFFF | (255, 255, 255) | (0, 0, 0, 0) | 버튼 텍스트, 밝은 배경 |
|
||||
|
||||
---
|
||||
|
||||
### 1.2 인쇄용 확장 컬러 (Print Extended) 🆕
|
||||
|
||||
#### 민트 그린 테마 (Mint Green Theme)
|
||||
병원 인쇄물, 안내서, 브로슈어에 사용
|
||||
|
||||
| 컬러명 | HEX | RGB | CMYK | 용도 |
|
||||
|--------|-----|-----|------|------|
|
||||
| **Jamie Mint Light** | #DAEEE3 | (218, 238, 227) | (8, 0, 5, 7) | 메인 배경 |
|
||||
| **Jamie Mint** | #D2EBDD | (210, 235, 221) | (11, 0, 6, 8) | 서브 배경, 카드 배경 |
|
||||
| **Jamie Forest** | #568459 | (86, 132, 89) | (35, 0, 33, 48) | 타이틀, 강조 텍스트 |
|
||||
| **Jamie Sage** | #8DAE92 | (141, 174, 146) | (19, 0, 16, 32) | 중간톤, 아이콘 |
|
||||
| **Jamie Moss** | #B0C9B5 | (176, 201, 181) | (12, 0, 10, 21) | 서브 요소, 구분선 |
|
||||
|
||||
#### 블루 테마 (Blue Theme)
|
||||
FAQ, 정보 섹션, 안내 페이지에 사용
|
||||
|
||||
| 컬러명 | HEX | RGB | CMYK | 용도 |
|
||||
|--------|-----|-----|------|------|
|
||||
| **Jamie Sky Light** | #C6D7E6 | (198, 215, 230) | (14, 7, 0, 10) | 메인 배경 |
|
||||
| **Jamie Steel Blue** | #4C718B | (76, 113, 139) | (45, 19, 0, 45) | 타이틀, 강조 텍스트 |
|
||||
| **Jamie Mist** | #8BA0AF | (139, 160, 175) | (21, 9, 0, 31) | 중간톤, 서브 텍스트 |
|
||||
| **Jamie Cloud** | #A9C3D7 | (169, 195, 215) | (21, 9, 0, 16) | 서브 요소, 구분선 |
|
||||
|
||||
---
|
||||
|
||||
### 1.3 인쇄용 그라데이션 (Print Gradients) 🆕
|
||||
|
||||
#### 민트 그린 그라데이션
|
||||
```css
|
||||
/* CSS */
|
||||
background: linear-gradient(135deg, #DAEEE3 0%, #D2EBDD 50%, #C8E5D6 100%);
|
||||
|
||||
/* 인쇄 적용 */
|
||||
시작점: #DAEEE3 (C8 M0 Y5 K7)
|
||||
중간점: #D2EBDD (C11 M0 Y6 K8)
|
||||
끝점: #C8E5D6 (C13 M0 Y8 K10)
|
||||
```
|
||||
|
||||
**용도**: 표지, 메인 비주얼, 안내서 배경
|
||||
|
||||
#### 블루 그라데이션
|
||||
```css
|
||||
/* CSS */
|
||||
background: linear-gradient(135deg, #C6D7E6 0%, #B8CDE0 50%, #A9C3D7 100%);
|
||||
|
||||
/* 인쇄 적용 */
|
||||
시작점: #C6D7E6 (C14 M7 Y0 K10)
|
||||
중간점: #B8CDE0 (C18 M9 Y0 K12)
|
||||
끝점: #A9C3D7 (C21 M9 Y0 K16)
|
||||
```
|
||||
|
||||
**용도**: FAQ 섹션, 정보 안내 페이지
|
||||
|
||||
---
|
||||
|
||||
## 2. 타이포그래피 확장 가이드
|
||||
|
||||
### 2.1 서체 체계 🆕
|
||||
|
||||
| 용도 | 서체 | 웨이트 | 언어 |
|
||||
|------|------|--------|------|
|
||||
| **영문 로고** | Now | Regular | EN |
|
||||
| **영문 본문** | DM Sans | Regular, Bold | EN |
|
||||
| **국문 전체** | Noto Sans KR | Light, Regular, Medium, Bold | KO |
|
||||
|
||||
### 2.2 서체 상세
|
||||
|
||||
#### Now (영문 로고 전용)
|
||||
- **용도**: "JAMIE", "JAMIE CLINIC" 워드마크
|
||||
- **특징**: 현대적이고 깔끔한 산세리프, 기하학적 형태
|
||||
- **웨이트**: Regular
|
||||
- **출처**: 프리미엄 서체 (라이선스 확인 필요)
|
||||
|
||||
#### DM Sans (영문 본문)
|
||||
- **용도**: 영문 태그라인, 부제목, 영문 안내문
|
||||
- **특징**: 가독성 높은 기하학적 산세리프, Google Fonts 무료 제공
|
||||
- **웨이트**:
|
||||
- Regular (400) - 본문
|
||||
- Bold (700) - 강조, 제목
|
||||
- **출처**: [Google Fonts](https://fonts.google.com/specimen/DM+Sans)
|
||||
|
||||
#### Noto Sans KR (국문 전체)
|
||||
- **용도**: 모든 한글 텍스트
|
||||
- **웨이트 활용**:
|
||||
- Light (300) - 긴 본문, 부가 설명
|
||||
- Regular (400) - 일반 본문
|
||||
- Medium (500) - 서브 타이틀
|
||||
- Bold (700) - 메인 타이틀, 강조
|
||||
|
||||
---
|
||||
|
||||
### 2.3 텍스트 스타일 가이드
|
||||
|
||||
#### 인쇄물 텍스트 스타일
|
||||
|
||||
| 요소 | 서체 | 크기 | 웨이트 | 자간 | 컬러 |
|
||||
|------|------|------|--------|------|------|
|
||||
| 메인 타이틀 (KO) | Noto Sans KR | 48-72pt | Bold | -60 | #568459 |
|
||||
| 서브 타이틀 (KO) | Noto Sans KR | 24-36pt | Medium | -60 | #568459 |
|
||||
| 본문 (KO) | Noto Sans KR | 14-18pt | Regular | -40 | #4A4949 |
|
||||
| 캡션 (KO) | Noto Sans KR | 11-13pt | Light | -20 | #666666 |
|
||||
| 로고 (EN) | Now | - | Regular | +50 | #6D7856 |
|
||||
| 영문 타이틀 (EN) | DM Sans | 24-36pt | Bold | -20 | #568459 |
|
||||
| 영문 본문 (EN) | DM Sans | 14-18pt | Regular | 0 | #4A4949 |
|
||||
|
||||
#### 웹 텍스트 스타일 (유지)
|
||||
|
||||
| 요소 | 서체 | 자간 | 행간 |
|
||||
|------|------|------|------|
|
||||
| 영문 텍스트 | DM Sans | -60 | 15.59pt |
|
||||
| 타이틀 | Noto Sans KR | -60 | - |
|
||||
| 소타이틀 | Noto Sans KR | -60 | 39pt |
|
||||
| 라운드 네모박스 | Noto Sans KR | -60 | 31pt |
|
||||
| 내용 텍스트 | Noto Sans KR | -60 | 26pt |
|
||||
|
||||
---
|
||||
|
||||
## 3. 테마별 적용 가이드
|
||||
|
||||
### 3.1 민트 그린 테마 적용
|
||||
|
||||
**적용 콘텐츠**:
|
||||
- 초진 환자 안내서
|
||||
- 수술당일 프로세스
|
||||
- 병원 소개 자료
|
||||
- 브로슈어 표지
|
||||
|
||||
**컬러 조합**:
|
||||
```
|
||||
배경: #DAEEE3 (Jamie Mint Light)
|
||||
카드 배경: #FFFFFF 또는 #D2EBDD
|
||||
메인 타이틀: #568459 (Jamie Forest)
|
||||
본문: #4A4949
|
||||
강조 아이콘: #79A233 (Jamie Green)
|
||||
구분선: #B0C9B5 (Jamie Moss)
|
||||
```
|
||||
|
||||
### 3.2 블루 테마 적용
|
||||
|
||||
**적용 콘텐츠**:
|
||||
- FAQ 페이지
|
||||
- Q&A 섹션
|
||||
- 주의사항 안내
|
||||
- 정보성 콘텐츠
|
||||
|
||||
**컬러 조합**:
|
||||
```
|
||||
배경: #C6D7E6 (Jamie Sky Light)
|
||||
카드 배경: #FFFFFF 또는 #A9C3D7
|
||||
메인 타이틀: #4C718B (Jamie Steel Blue)
|
||||
본문: #4A4949
|
||||
서브 텍스트: #8BA0AF (Jamie Mist)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. CSS 코드 스니펫
|
||||
|
||||
```css
|
||||
/* === 민트 그린 테마 === */
|
||||
.theme-mint {
|
||||
background: linear-gradient(135deg, #DAEEE3 0%, #D2EBDD 50%, #C8E5D6 100%);
|
||||
}
|
||||
|
||||
.theme-mint .title {
|
||||
color: #568459;
|
||||
font-family: 'Noto Sans KR', sans-serif;
|
||||
font-weight: 700;
|
||||
letter-spacing: -0.06em;
|
||||
}
|
||||
|
||||
.theme-mint .body {
|
||||
color: #4A4949;
|
||||
font-family: 'Noto Sans KR', sans-serif;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.theme-mint .accent {
|
||||
color: #79A233;
|
||||
}
|
||||
|
||||
/* === 블루 테마 === */
|
||||
.theme-blue {
|
||||
background: linear-gradient(135deg, #C6D7E6 0%, #B8CDE0 50%, #A9C3D7 100%);
|
||||
}
|
||||
|
||||
.theme-blue .title {
|
||||
color: #4C718B;
|
||||
font-family: 'Noto Sans KR', sans-serif;
|
||||
font-weight: 700;
|
||||
letter-spacing: -0.06em;
|
||||
}
|
||||
|
||||
/* === 영문 서체 적용 === */
|
||||
.logo-text {
|
||||
font-family: 'Now', sans-serif;
|
||||
letter-spacing: 0.05em;
|
||||
color: #6D7856;
|
||||
}
|
||||
|
||||
.en-title {
|
||||
font-family: 'DM Sans', sans-serif;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.en-body {
|
||||
font-family: 'DM Sans', sans-serif;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
/* === Google Fonts 임포트 === */
|
||||
@import url('https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;700&family=Noto+Sans+KR:wght@300;400;500;700&display=swap');
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. 파일 요약
|
||||
|
||||
| 분석 소스 | 추출 정보 |
|
||||
|-----------|-----------|
|
||||
| 초진 환자 안내서 표지 | 민트 그린 그라데이션, Jamie Forest 타이틀 컬러 |
|
||||
| 수술당일 프로세스 페이지 | 민트 테마 적용 예시, 원형 스텝 디자인 |
|
||||
| FAQ 페이지 | 블루 테마 컬러 팔레트 |
|
||||
| 전체 | DM Sans (영문), Now (로고), Noto Sans KR (국문) 서체 체계 |
|
||||
|
||||
---
|
||||
|
||||
## 6. Notion 브랜드가이드 업데이트 항목
|
||||
|
||||
### PART 2: VISUAL IDENTITY 추가 내용
|
||||
|
||||
1. **브랜드 컬러** 섹션
|
||||
- [x] 기존 Primary Colors 유지
|
||||
- [ ] Print Extended Colors 추가 (민트/블루 테마)
|
||||
- [ ] 인쇄용 CMYK 값 추가
|
||||
- [ ] 그라데이션 가이드 추가
|
||||
|
||||
2. **타이포그래피** 섹션
|
||||
- [ ] 서체 체계 확장 (Now, DM Sans 추가)
|
||||
- [ ] 인쇄물 텍스트 스타일 추가
|
||||
- [ ] 서체별 용도 명시
|
||||
|
||||
3. **CSS 적용 예시** 섹션
|
||||
- [ ] 민트/블루 테마 CSS 추가
|
||||
- [ ] Google Fonts 임포트 코드 추가
|
||||
|
||||
---
|
||||
|
||||
*이 문서는 Canva 제작 초진 환자 안내서 PDF 분석을 기반으로 작성되었습니다.*
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 26 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 22 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
@@ -0,0 +1,641 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ko">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Jamie Clinic Logo Guidelines</title>
|
||||
<style>
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: 'Noto Sans KR', -apple-system, BlinkMacSystemFont, sans-serif;
|
||||
background: #f8f9fa;
|
||||
color: #333;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.container {
|
||||
max-width: 1200px;
|
||||
margin: 0 auto;
|
||||
padding: 40px 20px;
|
||||
}
|
||||
|
||||
header {
|
||||
text-align: center;
|
||||
margin-bottom: 60px;
|
||||
padding: 60px 40px;
|
||||
background: linear-gradient(135deg, #000 0%, #1a1a1a 100%);
|
||||
border-radius: 20px;
|
||||
color: white;
|
||||
}
|
||||
|
||||
header h1 {
|
||||
font-size: 2.5rem;
|
||||
font-weight: 700;
|
||||
margin-bottom: 10px;
|
||||
color: #79A233;
|
||||
}
|
||||
|
||||
header p {
|
||||
font-size: 1.1rem;
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
section {
|
||||
background: white;
|
||||
border-radius: 16px;
|
||||
padding: 40px;
|
||||
margin-bottom: 30px;
|
||||
box-shadow: 0 2px 20px rgba(0,0,0,0.06);
|
||||
}
|
||||
|
||||
section h2 {
|
||||
font-size: 1.5rem;
|
||||
color: #79A233;
|
||||
margin-bottom: 30px;
|
||||
padding-bottom: 15px;
|
||||
border-bottom: 2px solid #f1f4eb;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
section h2::before {
|
||||
content: '';
|
||||
width: 4px;
|
||||
height: 24px;
|
||||
background: #79A233;
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 1.1rem;
|
||||
color: #555;
|
||||
margin: 25px 0 15px;
|
||||
}
|
||||
|
||||
.logo-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
||||
gap: 30px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.logo-card {
|
||||
border: 1px solid #eee;
|
||||
border-radius: 12px;
|
||||
overflow: hidden;
|
||||
transition: transform 0.2s, box-shadow 0.2s;
|
||||
}
|
||||
|
||||
.logo-card:hover {
|
||||
transform: translateY(-4px);
|
||||
box-shadow: 0 8px 30px rgba(0,0,0,0.1);
|
||||
}
|
||||
|
||||
.logo-preview {
|
||||
height: 200px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 30px;
|
||||
}
|
||||
|
||||
.logo-preview.dark {
|
||||
background: #000;
|
||||
}
|
||||
|
||||
.logo-preview.light {
|
||||
background: #fff;
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
|
||||
.logo-preview.green {
|
||||
background: #79A233;
|
||||
}
|
||||
|
||||
.logo-preview img {
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
object-fit: contain;
|
||||
}
|
||||
|
||||
.logo-info {
|
||||
padding: 20px;
|
||||
background: #fafafa;
|
||||
}
|
||||
|
||||
.logo-info h4 {
|
||||
font-size: 1rem;
|
||||
color: #333;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.logo-info p {
|
||||
font-size: 0.85rem;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.logo-info .tag {
|
||||
display: inline-block;
|
||||
padding: 4px 10px;
|
||||
background: #f1f4eb;
|
||||
color: #6d7856;
|
||||
border-radius: 20px;
|
||||
font-size: 0.75rem;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.color-palette {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
||||
gap: 20px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.color-item {
|
||||
border-radius: 12px;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 2px 10px rgba(0,0,0,0.08);
|
||||
}
|
||||
|
||||
.color-swatch {
|
||||
height: 100px;
|
||||
}
|
||||
|
||||
.color-info {
|
||||
padding: 15px;
|
||||
background: white;
|
||||
}
|
||||
|
||||
.color-info h4 {
|
||||
font-size: 0.9rem;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.color-info code {
|
||||
font-family: 'SF Mono', Monaco, monospace;
|
||||
font-size: 0.85rem;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.rules-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
|
||||
gap: 20px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.rule-card {
|
||||
padding: 25px;
|
||||
border-radius: 12px;
|
||||
border: 1px solid #eee;
|
||||
}
|
||||
|
||||
.rule-card.do {
|
||||
background: linear-gradient(135deg, #f0f9e8 0%, #e8f5e0 100%);
|
||||
border-color: #c8e6c9;
|
||||
}
|
||||
|
||||
.rule-card.dont {
|
||||
background: linear-gradient(135deg, #fff5f5 0%, #ffebee 100%);
|
||||
border-color: #ffcdd2;
|
||||
}
|
||||
|
||||
.rule-card h4 {
|
||||
font-size: 1rem;
|
||||
margin-bottom: 15px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.rule-card.do h4 {
|
||||
color: #2e7d32;
|
||||
}
|
||||
|
||||
.rule-card.dont h4 {
|
||||
color: #c62828;
|
||||
}
|
||||
|
||||
.rule-card ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.rule-card li {
|
||||
padding: 8px 0;
|
||||
font-size: 0.9rem;
|
||||
color: #555;
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.rule-card.do li::before {
|
||||
content: '✓';
|
||||
color: #2e7d32;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.rule-card.dont li::before {
|
||||
content: '✗';
|
||||
color: #c62828;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.spec-table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.spec-table th,
|
||||
.spec-table td {
|
||||
padding: 15px;
|
||||
text-align: left;
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
|
||||
.spec-table th {
|
||||
background: #f8f9fa;
|
||||
font-weight: 600;
|
||||
color: #555;
|
||||
font-size: 0.85rem;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
|
||||
.spec-table td {
|
||||
font-size: 0.95rem;
|
||||
}
|
||||
|
||||
.spec-table tr:hover {
|
||||
background: #fafafa;
|
||||
}
|
||||
|
||||
.clearspace-demo {
|
||||
background: #f5f5f5;
|
||||
padding: 40px;
|
||||
border-radius: 12px;
|
||||
text-align: center;
|
||||
margin: 20px 0;
|
||||
}
|
||||
|
||||
.clearspace-box {
|
||||
display: inline-block;
|
||||
border: 2px dashed #79A233;
|
||||
padding: 40px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.clearspace-box::before {
|
||||
content: 'X';
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
color: #79A233;
|
||||
font-size: 0.8rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.clearspace-box::after {
|
||||
content: 'X';
|
||||
position: absolute;
|
||||
left: 10px;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
color: #79A233;
|
||||
font-size: 0.8rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.logo-placeholder {
|
||||
background: #000;
|
||||
color: #79A233;
|
||||
padding: 20px 40px;
|
||||
font-weight: bold;
|
||||
font-size: 1.5rem;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.note-box {
|
||||
background: #fff3cd;
|
||||
border-left: 4px solid #ffc107;
|
||||
padding: 15px 20px;
|
||||
margin: 20px 0;
|
||||
border-radius: 0 8px 8px 0;
|
||||
}
|
||||
|
||||
.note-box p {
|
||||
font-size: 0.9rem;
|
||||
color: #856404;
|
||||
}
|
||||
|
||||
.file-list {
|
||||
display: grid;
|
||||
gap: 15px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.file-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 15px;
|
||||
padding: 15px 20px;
|
||||
background: #f8f9fa;
|
||||
border-radius: 10px;
|
||||
border: 1px solid #eee;
|
||||
}
|
||||
|
||||
.file-icon {
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
background: #79A233;
|
||||
border-radius: 10px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
font-size: 0.7rem;
|
||||
}
|
||||
|
||||
.file-details h4 {
|
||||
font-size: 0.95rem;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.file-details p {
|
||||
font-size: 0.8rem;
|
||||
color: #888;
|
||||
}
|
||||
|
||||
footer {
|
||||
text-align: center;
|
||||
padding: 40px;
|
||||
color: #888;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
header h1 {
|
||||
font-size: 1.8rem;
|
||||
}
|
||||
|
||||
section {
|
||||
padding: 25px;
|
||||
}
|
||||
|
||||
.logo-grid {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<header>
|
||||
<h1>Jamie Clinic Logo Guidelines</h1>
|
||||
<p>제이미성형외과 로고 가이드라인 v1.0</p>
|
||||
</header>
|
||||
|
||||
<!-- 로고 버전 -->
|
||||
<section>
|
||||
<h2>로고 버전</h2>
|
||||
<p>제이미성형외과의 공식 로고는 여성 얼굴 측면 실루엣(심볼)과 워드마크의 조합으로 구성됩니다.</p>
|
||||
|
||||
<div class="logo-grid">
|
||||
<div class="logo-card">
|
||||
<div class="logo-preview light">
|
||||
<div style="display: flex; align-items: center; gap: 15px;">
|
||||
<svg width="60" height="80" viewBox="0 0 60 80">
|
||||
<path d="M0 0 L0 80 L30 80 Q60 70 50 40 Q60 20 40 10 Q30 0 0 0" fill="#000"/>
|
||||
</svg>
|
||||
<div style="font-weight: bold; font-size: 1.2rem; color: #000;">
|
||||
제이미<br>성형외과
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="logo-info">
|
||||
<h4>국문 조합형 (밝은 배경)</h4>
|
||||
<p>간판, 명판, 공식 문서, 인쇄물용</p>
|
||||
<span class="tag">Primary</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="logo-card">
|
||||
<div class="logo-preview dark">
|
||||
<div style="display: flex; flex-direction: column; align-items: center; gap: 10px;">
|
||||
<svg width="80" height="100" viewBox="0 0 60 80">
|
||||
<path d="M60 0 L60 80 L30 80 Q0 70 10 40 Q0 20 20 10 Q30 0 60 0" fill="#fff"/>
|
||||
</svg>
|
||||
<div style="font-weight: bold; font-size: 1.3rem; color: #fff; letter-spacing: 2px;">
|
||||
JAMIE
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="logo-info">
|
||||
<h4>영문 정사각형 (흰색)</h4>
|
||||
<p>다크 배경, SNS 프로필 (Instagram, YouTube)</p>
|
||||
<span class="tag">Monochrome</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="logo-card">
|
||||
<div class="logo-preview dark">
|
||||
<div style="display: flex; flex-direction: column; align-items: center; gap: 10px;">
|
||||
<svg width="80" height="100" viewBox="0 0 60 80">
|
||||
<path d="M60 0 L60 80 L30 80 Q0 70 10 40 Q0 20 20 10 Q30 0 60 0" fill="#79A233"/>
|
||||
</svg>
|
||||
<div style="font-weight: bold; font-size: 1.3rem; color: #79A233; letter-spacing: 2px;">
|
||||
JAMIE
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="logo-info">
|
||||
<h4>영문 정사각형 (브랜드 그린)</h4>
|
||||
<p>브랜드 컬러 강조, 마케팅 자료</p>
|
||||
<span class="tag">Brand Color</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- 컬러 팔레트 -->
|
||||
<section>
|
||||
<h2>로고 컬러</h2>
|
||||
<p>로고에 사용 가능한 공식 컬러입니다. 이 외의 색상은 사용할 수 없습니다.</p>
|
||||
|
||||
<div class="color-palette">
|
||||
<div class="color-item">
|
||||
<div class="color-swatch" style="background: #79A233;"></div>
|
||||
<div class="color-info">
|
||||
<h4>Jamie Green</h4>
|
||||
<code>#79A233</code>
|
||||
</div>
|
||||
</div>
|
||||
<div class="color-item">
|
||||
<div class="color-swatch" style="background: #AFCC6D;"></div>
|
||||
<div class="color-info">
|
||||
<h4>Jamie Light Green</h4>
|
||||
<code>#AFCC6D</code>
|
||||
</div>
|
||||
</div>
|
||||
<div class="color-item">
|
||||
<div class="color-swatch" style="background: #6d7856;"></div>
|
||||
<div class="color-info">
|
||||
<h4>Jamie Main</h4>
|
||||
<code>#6d7856</code>
|
||||
</div>
|
||||
</div>
|
||||
<div class="color-item">
|
||||
<div class="color-swatch" style="background: #000000;"></div>
|
||||
<div class="color-info">
|
||||
<h4>Black</h4>
|
||||
<code>#000000</code>
|
||||
</div>
|
||||
</div>
|
||||
<div class="color-item">
|
||||
<div class="color-swatch" style="background: #FFFFFF; border: 1px solid #eee;"></div>
|
||||
<div class="color-info">
|
||||
<h4>White</h4>
|
||||
<code>#FFFFFF</code>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- 여백 규정 -->
|
||||
<section>
|
||||
<h2>여백 규정 (Clear Space)</h2>
|
||||
<p>로고 주변에는 최소 여백을 확보하여 가독성을 보장합니다.</p>
|
||||
|
||||
<div class="clearspace-demo">
|
||||
<div class="clearspace-box">
|
||||
<div class="logo-placeholder">JAMIE</div>
|
||||
</div>
|
||||
<p style="margin-top: 20px; color: #666; font-size: 0.9rem;">
|
||||
X = 로고 높이의 25% (또는 워드마크 'J' 높이)
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="note-box">
|
||||
<p><strong>Note:</strong> 상하좌우 동일하게 X값을 적용하며, 다른 그래픽 요소나 텍스트와 충분한 간격을 유지해야 합니다.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- 최소 크기 -->
|
||||
<section>
|
||||
<h2>최소 크기</h2>
|
||||
|
||||
<table class="spec-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>매체</th>
|
||||
<th>최소 크기</th>
|
||||
<th>비고</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>인쇄물</td>
|
||||
<td>너비 25mm</td>
|
||||
<td>명함, 브로슈어 등</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>디지털 (일반)</td>
|
||||
<td>너비 80px</td>
|
||||
<td>웹, 앱 등</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>파비콘</td>
|
||||
<td>16×16px</td>
|
||||
<td>심볼만 사용</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>SNS 프로필</td>
|
||||
<td>180×180px</td>
|
||||
<td>정사각형 로고</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</section>
|
||||
|
||||
<!-- 사용 규칙 -->
|
||||
<section>
|
||||
<h2>사용 규칙</h2>
|
||||
|
||||
<div class="rules-grid">
|
||||
<div class="rule-card do">
|
||||
<h4>✓ Do's (권장)</h4>
|
||||
<ul>
|
||||
<li>공식 파일만 사용</li>
|
||||
<li>충분한 여백 확보</li>
|
||||
<li>적절한 배경 대비 유지</li>
|
||||
<li>최소 크기 이상으로 사용</li>
|
||||
<li>승인된 컬러만 적용</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="rule-card dont">
|
||||
<h4>✗ Don'ts (금지)</h4>
|
||||
<ul>
|
||||
<li>비율 변형 (늘리기, 줄이기)</li>
|
||||
<li>색상 임의 변경</li>
|
||||
<li>효과 추가 (그림자, 발광)</li>
|
||||
<li>복잡한 배경 위 사용</li>
|
||||
<li>로고 일부 자르기</li>
|
||||
<li>회전하여 사용</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- 파일 목록 -->
|
||||
<section>
|
||||
<h2>로고 파일</h2>
|
||||
|
||||
<h3>현재 보유 파일</h3>
|
||||
<div class="file-list">
|
||||
<div class="file-item">
|
||||
<div class="file-icon">PNG</div>
|
||||
<div class="file-details">
|
||||
<h4>_Jamie-Clinic-plaque.png</h4>
|
||||
<p>국문 조합형 • 밝은 배경용</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="file-item">
|
||||
<div class="file-icon">WEBP</div>
|
||||
<div class="file-details">
|
||||
<h4>jamie_logo_f_j.webp</h4>
|
||||
<p>영문 정사각형 • 흰색 • 다크 배경용</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="file-item">
|
||||
<div class="file-icon">JPG</div>
|
||||
<div class="file-details">
|
||||
<h4>Jamie-Clinic-Logo-Square-500x500-dark.jpg</h4>
|
||||
<p>영문 정사각형 • 브랜드 그린 • 500×500px</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3 style="margin-top: 30px;">추가 필요 파일 (권장)</h3>
|
||||
<div class="note-box">
|
||||
<p>벡터 원본 파일(AI, SVG)과 심볼만 있는 파일이 필요합니다. 파비콘, 앱 아이콘 등 다양한 크기로 사용하기 위해 벡터 파일 확보를 권장합니다.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<footer>
|
||||
<p>Jamie Clinic Logo Guidelines v1.0 • 2025-12-09</p>
|
||||
<p style="margin-top: 5px; font-size: 0.8rem;">제이미성형외과 마케팅팀</p>
|
||||
</footer>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,324 @@
|
||||
# 제이미성형외과 로고 가이드라인
|
||||
## Jamie Clinic Logo Guidelines
|
||||
|
||||
**버전**: 1.0
|
||||
**작성일**: 2025-12-09
|
||||
**참조 파일**:
|
||||
- _Jamie-Clinic-plaque.png
|
||||
- jamie_logo_f_j.webp
|
||||
- Jamie-Clinic-Logo-Square-500x500-dark.jpg
|
||||
|
||||
---
|
||||
|
||||
## 1. 로고 구성 요소
|
||||
|
||||
### 1.1 심볼 마크 (Symbol Mark)
|
||||
|
||||
```
|
||||
┌────────────────────────────────────────┐
|
||||
│ │
|
||||
│ ████ │
|
||||
│ ██ ██ │
|
||||
│ ██ ██ │
|
||||
│ ██ ██ 여성 얼굴 측면 실루엣 │
|
||||
│ ██ ██ (Face Profile) │
|
||||
│ ██ ██ │
|
||||
│ ████ │
|
||||
│ ██ │
|
||||
│ │
|
||||
└────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
**설명**:
|
||||
- 여성 얼굴의 측면 실루엣
|
||||
- 성형외과의 전문 분야인 '얼굴 성형'을 상징
|
||||
- 자연스럽고 아름다운 윤곽선 강조
|
||||
- 우아하고 세련된 이미지 전달
|
||||
|
||||
### 1.2 워드마크 (Wordmark)
|
||||
|
||||
| 언어 | 표기 | 서체 스타일 |
|
||||
|-----|------|------------|
|
||||
| 국문 | 제이미 성형외과 | 고딕 계열, Bold |
|
||||
| 영문 | JAMIE | Sans-serif, Bold, 대문자 |
|
||||
|
||||
### 1.3 조합형 로고 (Combination Mark)
|
||||
|
||||
**가로형 (국문)**
|
||||
```
|
||||
┌─────────────────────────────────────────────────┐
|
||||
│ │
|
||||
│ [실루엣] 제이미 │
|
||||
│ 성형외과 │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
**정사각형 (영문)**
|
||||
```
|
||||
┌───────────────────┐
|
||||
│ │
|
||||
│ [실루엣] │
|
||||
│ │
|
||||
│ JAMIE │
|
||||
│ │
|
||||
└───────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. 로고 버전
|
||||
|
||||
### 2.1 공식 로고 버전
|
||||
|
||||
| 버전 | 용도 | 파일 |
|
||||
|-----|------|------|
|
||||
| **국문 가로형** | 간판, 명판, 공식 문서, 인쇄물 | _Jamie-Clinic-plaque.png |
|
||||
| **영문 정사각형 (흰색)** | 다크 배경, SNS 프로필 | jamie_logo_f_j.webp |
|
||||
| **영문 정사각형 (그린)** | 브랜드 컬러 강조, 마케팅 | Jamie-Clinic-Logo-Square-500x500-dark.jpg |
|
||||
|
||||
### 2.2 컬러 변형
|
||||
|
||||
#### Primary (기본)
|
||||
```
|
||||
┌─────────────────────────────────────────────────┐
|
||||
│ 검정 배경 + Jamie Green 실루엣 │
|
||||
│ Background: #000000 │
|
||||
│ Symbol: #79A233 (Jamie Green) │
|
||||
│ Text: #79A233 (Jamie Green) │
|
||||
└─────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
#### Monochrome - Dark (다크 모노크롬)
|
||||
```
|
||||
┌─────────────────────────────────────────────────┐
|
||||
│ 검정 배경 + 흰색 │
|
||||
│ Background: #000000 │
|
||||
│ Symbol: #FFFFFF │
|
||||
│ Text: #FFFFFF │
|
||||
└─────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
#### Monochrome - Light (라이트 모노크롬)
|
||||
```
|
||||
┌─────────────────────────────────────────────────┐
|
||||
│ 흰색/밝은 배경 + 검정 │
|
||||
│ Background: #FFFFFF │
|
||||
│ Symbol: #000000 │
|
||||
│ Text: #000000 │
|
||||
└─────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
#### Reversed (반전)
|
||||
```
|
||||
┌─────────────────────────────────────────────────┐
|
||||
│ Jamie Green 배경 + 흰색 │
|
||||
│ Background: #79A233 │
|
||||
│ Symbol: #FFFFFF │
|
||||
│ Text: #FFFFFF │
|
||||
└─────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. 로고 사용 규정
|
||||
|
||||
### 3.1 최소 크기 (Minimum Size)
|
||||
|
||||
| 매체 | 최소 너비 | 설명 |
|
||||
|-----|----------|------|
|
||||
| **인쇄물** | 25mm | 명함, 브로슈어 등 |
|
||||
| **디지털** | 80px | 웹, 앱, SNS 등 |
|
||||
| **파비콘** | 16×16px | 심볼만 사용 |
|
||||
| **SNS 프로필** | 180×180px | 정사각형 로고 |
|
||||
|
||||
### 3.2 여백 규정 (Clear Space)
|
||||
|
||||
로고 주변에는 최소 여백(Clear Space)을 확보하여 가독성을 보장합니다.
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────┐
|
||||
│ │
|
||||
│ ┌───────────────────────────┐ │
|
||||
│ │ ← X → │ │
|
||||
│ │ ↑ │ │
|
||||
│ │ X ┌───────────┐ │ │
|
||||
│ │ ↓ │ LOGO │ │ │
|
||||
│ │ └───────────┘ │ │
|
||||
│ │ ← X → │ │
|
||||
│ └───────────────────────────┘ │
|
||||
│ │
|
||||
└─────────────────────────────────────────┘
|
||||
|
||||
X = 로고 높이의 25% (또는 워드마크 'J' 높이)
|
||||
```
|
||||
|
||||
**여백 기준**:
|
||||
- 상하좌우 동일하게 X값 적용
|
||||
- 다른 그래픽 요소, 텍스트와 충분한 간격 유지
|
||||
- 가장자리(테두리)에 너무 가깝게 배치 금지
|
||||
|
||||
### 3.3 배치 가이드
|
||||
|
||||
| 위치 | 권장 | 비권장 |
|
||||
|-----|------|--------|
|
||||
| **문서 헤더** | 좌측 상단 또는 중앙 | 우측 하단 |
|
||||
| **명함** | 전면 중앙 또는 좌측 | 뒤집어서 배치 |
|
||||
| **웹사이트** | 좌측 상단 (헤더) | 푸터에만 배치 |
|
||||
| **SNS** | 프로필 이미지 중앙 | 잘린 상태로 사용 |
|
||||
|
||||
---
|
||||
|
||||
## 4. 로고 사용 금지 사항
|
||||
|
||||
### 4.1 비율 변형 금지
|
||||
|
||||
```
|
||||
❌ 가로로 늘리기 ❌ 세로로 늘리기 ❌ 기울이기
|
||||
┌──────────────┐ ┌────┐ ╱────╲
|
||||
│ JAMIE │ │ J │ ╱ JAMIE╲
|
||||
│ (늘어남) │ │ A │ ╱ ╲
|
||||
└──────────────┘ │ M │
|
||||
│ I │
|
||||
│ E │
|
||||
└────┘
|
||||
```
|
||||
|
||||
### 4.2 색상 임의 변경 금지
|
||||
|
||||
```
|
||||
❌ 승인되지 않은 색상 사용
|
||||
- 빨강, 파랑, 노랑 등 브랜드 컬러가 아닌 색상
|
||||
- 그라데이션 적용
|
||||
- 무지개 색상
|
||||
|
||||
✓ 승인된 색상만 사용
|
||||
- #000000 (Black)
|
||||
- #FFFFFF (White)
|
||||
- #79A233 (Jamie Green)
|
||||
- #AFCC6D (Jamie Light Green)
|
||||
- #6d7856 (Jamie Main)
|
||||
```
|
||||
|
||||
### 4.3 배경 대비 부적절 사용 금지
|
||||
|
||||
```
|
||||
❌ 대비 부족 ✓ 충분한 대비
|
||||
|
||||
┌──────────────────┐ ┌──────────────────┐
|
||||
│ ░░░░░░░░░░░░░░░░ │ │ ████████████████ │
|
||||
│ ░░ JAMIE ░░░░░░░ │ │ ██ JAMIE ████ │
|
||||
│ ░░░░░░░░░░░░░░░░ │ │ ████████████████ │
|
||||
└──────────────────┘ └──────────────────┘
|
||||
(밝은 배경 + 밝은 로고) (어두운 배경 + 밝은 로고)
|
||||
```
|
||||
|
||||
### 4.4 기타 금지 사항
|
||||
|
||||
| 금지 사항 | 설명 |
|
||||
|----------|------|
|
||||
| **요소 분리** | 심볼과 워드마크를 임의로 분리하여 사용 |
|
||||
| **효과 추가** | 그림자, 엠보싱, 외곽선, 발광 효과 등 |
|
||||
| **텍스트 변경** | 워드마크 폰트 변경 또는 글자 수정 |
|
||||
| **장식 추가** | 별, 하트, 밑줄 등 장식 요소 추가 |
|
||||
| **복잡한 배경** | 패턴, 사진 위에 직접 배치 (단색 배경 권장) |
|
||||
| **로고 자르기** | 로고의 일부가 잘리도록 배치 |
|
||||
| **회전** | 45°, 90° 등 임의 회전 |
|
||||
|
||||
---
|
||||
|
||||
## 5. 매체별 적용 가이드
|
||||
|
||||
### 5.1 인쇄물
|
||||
|
||||
| 매체 | 권장 버전 | 파일 형식 | 최소 해상도 |
|
||||
|-----|----------|----------|------------|
|
||||
| 명함 | 국문 가로형 | AI, PDF | 300dpi |
|
||||
| 브로슈어 | 국문 가로형 | AI, PDF | 300dpi |
|
||||
| 간판 | 국문 가로형 | AI, EPS | 벡터 |
|
||||
| 봉투/레터헤드 | 국문 가로형 | AI, PDF | 300dpi |
|
||||
|
||||
### 5.2 디지털
|
||||
|
||||
| 매체 | 권장 버전 | 파일 형식 | 권장 크기 |
|
||||
|-----|----------|----------|----------|
|
||||
| 웹사이트 헤더 | 영문 가로형 | PNG, SVG | 높이 60px |
|
||||
| 파비콘 | 심볼만 | ICO, PNG | 32×32px |
|
||||
| 이메일 서명 | 국문 가로형 | PNG | 높이 50px |
|
||||
| SNS 프로필 | 정사각형 | PNG, JPG | 500×500px |
|
||||
|
||||
### 5.3 SNS 채널별
|
||||
|
||||
| 채널 | 프로필 | 커버 | 워터마크 |
|
||||
|-----|-------|------|---------|
|
||||
| Instagram | 정사각형 (그린) | - | 정사각형 (투명) |
|
||||
| YouTube | 정사각형 (흰색) | 국문 가로형 | 정사각형 (투명) |
|
||||
| Naver Blog | 정사각형 (그린) | 국문 가로형 | - |
|
||||
| KakaoTalk | 정사각형 (흰색) | - | - |
|
||||
|
||||
---
|
||||
|
||||
## 6. 로고 파일 목록
|
||||
|
||||
### 6.1 제공 파일
|
||||
|
||||
| 파일명 | 형식 | 크기 | 용도 |
|
||||
|-------|-----|------|------|
|
||||
| _Jamie-Clinic-plaque.png | PNG | 가변 | 국문 조합형, 밝은 배경용 |
|
||||
| jamie_logo_f_j.webp | WebP | 정사각형 | 영문 정사각형, 다크 배경용 (흰색) |
|
||||
| Jamie-Clinic-Logo-Square-500x500-dark.jpg | JPG | 500×500px | 영문 정사각형, 다크 배경용 (그린) |
|
||||
|
||||
### 6.2 추가 필요 파일 (권장)
|
||||
|
||||
| 파일 | 형식 | 용도 | 우선순위 |
|
||||
|-----|-----|------|---------|
|
||||
| jamie_logo_vector.ai | AI | 원본 벡터 (편집용) | 🔴 높음 |
|
||||
| jamie_logo_vector.svg | SVG | 웹용 벡터 | 🔴 높음 |
|
||||
| jamie_symbol_only.png | PNG | 심볼만 (파비콘, 앱 아이콘) | 🔴 높음 |
|
||||
| jamie_logo_kr_horizontal.png | PNG | 국문 가로형 (투명 배경) | 🟡 중간 |
|
||||
| jamie_logo_reversed.png | PNG | 반전 버전 (그린 배경) | 🟢 낮음 |
|
||||
|
||||
---
|
||||
|
||||
## 7. 로고 사용 승인 프로세스
|
||||
|
||||
### 7.1 내부 사용
|
||||
- 마케팅팀 또는 디자인 담당자가 가이드라인에 따라 자유롭게 사용
|
||||
- 새로운 적용 사례는 기록 및 공유
|
||||
|
||||
### 7.2 외부 협력사/대행사 사용
|
||||
1. 로고 파일 요청 시 본 가이드라인 함께 제공
|
||||
2. 시안 검토 단계에서 가이드라인 준수 여부 확인
|
||||
3. 최종 결과물 승인 후 사용
|
||||
|
||||
### 7.3 미디어/언론 사용
|
||||
1. 공식 로고 파일 제공 (압축 파일 형태)
|
||||
2. 가이드라인 준수 요청
|
||||
3. 게재 전 확인 권장
|
||||
|
||||
---
|
||||
|
||||
## 8. 버전 히스토리
|
||||
|
||||
| 버전 | 날짜 | 변경 내용 | 작성자 |
|
||||
|-----|------|----------|-------|
|
||||
| 1.0 | 2025-12-09 | 초안 작성 | Marketing |
|
||||
|
||||
---
|
||||
|
||||
## 부록: 빠른 참조 가이드
|
||||
|
||||
### ✅ Do's (권장)
|
||||
- 공식 파일만 사용
|
||||
- 충분한 여백 확보
|
||||
- 적절한 배경 대비 유지
|
||||
- 최소 크기 이상으로 사용
|
||||
- 승인된 컬러만 적용
|
||||
|
||||
### ❌ Don'ts (금지)
|
||||
- 비율 변형
|
||||
- 색상 임의 변경
|
||||
- 효과 추가 (그림자, 발광 등)
|
||||
- 복잡한 배경 위 사용
|
||||
- 로고 일부 자르기
|
||||
- 다른 요소와 너무 가깝게 배치
|
||||
@@ -0,0 +1,32 @@
|
||||
앞광대 리프팅
|
||||
2025.12.09 Tue PM 7:53 ・ 2Minutes 44seconds
|
||||
제이미성형외과
|
||||
|
||||
|
||||
Attendees 1 00:00
|
||||
안녕하세요. 재미 성형외과 정기호 원장입니다.
|
||||
오늘은 중안면부의 노화를 개선해 줄 수 있는 앞광대 리프팅에 대해 말씀드리겠습니다.
|
||||
나이가 들면서 눈밑 지방이 불룩해지고 볼살이 처지면 팔자 주름이 깊어지게 되고 중안면부의 노화가 본격적으로 진행되면서 피곤해 보이거나 심술궂은 인상이 되기 쉽습니다.
|
||||
앞광대 리프팅은 눈밑 지방부터 광대 앞 볼살을 리프팅시켜서 깊어진 팔자 주름까지 한꺼번에 개선시켜주는 수술입니다.
|
||||
제이미 성형외과의 앞광대 리프팅은 속눈썹 바로 밑부분에 절개선을 위치시켜 절개선이 눈에 잘 띄지 않습니다.
|
||||
이 절개선을 이용하여 눈 밑 지방 재배치를 포함한 하안검 성형술을 기본적으로 시행하면서 필요에 따라서는 늘어진 볼살과 팔자 주름 주변부까지 리프팅 범위를 넓혀주고 있습니다.
|
||||
이러한 폭넓은 리프팅은 리프팅 자체의 효과가 클 뿐만 아니라 수술 후 눈 밑 뒤집어짐 의학 용어로는 안검외반이라고 하는데요.
|
||||
이러한 부작용을 획기적으로 줄여줄 수 있습니다.
|
||||
|
||||
Attendees 1 01:21
|
||||
결과적으로 하한선부터 팔자 주름까지 젊고 건강한 이미지를 되찾을 수 있겠습니다.
|
||||
눈밑의 주름과 블루함뿐만 아니라 볼살이 처지고 팔자 주름까지 깊어져서 고민이시라면 제이미 성형외과의 앞광대 리프팅 상담을 받아보시기를 바랍니다.
|
||||
|
||||
Attendees 2 01:43
|
||||
눈밑 지방 재배치와 앞광대 리프팅은 어떤 차이가 있나요?
|
||||
|
||||
Attendees 1 01:50
|
||||
네 눈 밑 지방 재배치라는 것은 말 그대로 눈 밑에 위치한 지방 부분 여러분들이 거울을 봤을 때 눈 밑에 불룩한 부분 을 교정해 주는 것을 눈밑 지방 재배치라고 하고요.
|
||||
의학적으로는 하안검 성형술이라는 카테고리에 포함이 됩니다.
|
||||
하한검 성형술은 말 그대로 아래 눈꺼풀을 성형하는 것을 하안검 성형술이라고 해요.
|
||||
거기에 비해서 앞광대 리프팅이라는 것은 눈 밑 지방 재배치뿐만 아니고 더 아랫부분 그러니까 광대 앞쪽에 볼살하고 팔자 주름 부분까지 당겨 올려주는 것을 앞광대 리프팅이라고 합니다.
|
||||
좀 다르게 표현하면 앞광대 리프팅은 눈밑지방 재배치를 포함하고 있는 수술이다.
|
||||
더 폭넓은 수술이다 이렇게 이해하셔도 되겠습니다.
|
||||
|
||||
|
||||
clovanote.naver.com
|
||||
@@ -0,0 +1,31 @@
|
||||
듀얼 트임 수술
|
||||
2025.12.09 Tue PM 7:52 ・ 2Minutes 18seconds
|
||||
제이미성형외과
|
||||
|
||||
|
||||
Attendees 1 00:00
|
||||
네 안녕하세요. 제이미 성형외과 정기호 원장입니다.
|
||||
오늘은 더욱 시원하고 매력적인 눈매를 위한 듀얼트임 수술에 대해 말씀드리겠습니다.
|
||||
쌍거풀 수술이나 눈매 교정술을 하고도 눈매가 답답해 보이고 기름하고 시원한 느낌이 부족한 경우가 있습니다.
|
||||
이런 현상은 대부분 몽고주름으로 눈 앞쪽 라인이 덮여 있거나 미간이 넓기 때문에 발생합니다.
|
||||
제이미 성형외과에서는 앞트임과 위트임을 동시에 진행하는 듀얼 트임으로 이러한 고민을 한꺼번에 해결하고 있습니다.
|
||||
제이미 정형외과에서는 몽고주름이 심한 한국인의 특성을 고려하여 피부 재배치법을 응용한 앞트임과 위트임을 동시에 진행하고 있습니다.
|
||||
이러한 테크닉은 덮여 있는 쌍거풀 라인을 시원하게 드러냄과 동시에 미간 사이의 공간도 자연스럽게 조절해 줄 수 있습니다.
|
||||
듀얼트임은 수술 시간도 20분 내외로 짧고 회복도 빨라서 수술 다음 날부터 세안과 화장이 가능합니다.
|
||||
|
||||
Attendees 1 01:12
|
||||
듀얼트엠 수술은 기본적으로 눈 앞쪽의 상하 폭과 눈의 가로 길이를 증가시켜주고 착시 현상으로 눈꼬리가 내려가 보이는 선한 인상까지 얻을 수 있습니다.
|
||||
제이미 성형외과는 고객님의 눈매 고민을 정확히 파악하고 최적의 트임 수술을 통해 만족스러운 결과를 선사합니다.
|
||||
아름다운 눈매를 원하신다면 언제든 제이미성 외과에 문의해 주세요.
|
||||
|
||||
Attendees 2 01:41
|
||||
쌍꺼풀 수술과 트임 수술을 같이 하는 것이 더 효과적인가요?
|
||||
|
||||
Attendees 1 01:46
|
||||
대체로 그렇다고 말씀드릴 수 있습니다. 쌍거풀 수술은 말 그대로 홑꺼풀을 쌍거풀로 바꿔주는 수술이고요.
|
||||
트임 수술은 눈의 좌우 폭을 늘려주기 위한 수술입니다.
|
||||
대체로 환자분들이 눈의 상하 폭을 늘리면서 좌우 폭도 같이 늘려주기를 바라시기 때문에 쌍꺼풀 수술과 트임 수술은 임상에서 같이 진행되는 경우가 많습니다.
|
||||
그러나 어느 한쪽을 원치 않으신다면 따로 수술을 하거나 어느 한쪽만 수술하셔도 아무런 문제가 없습니다.
|
||||
|
||||
|
||||
clovanote.naver.com
|
||||
@@ -0,0 +1,61 @@
|
||||
내시경 이마 거상술
|
||||
2025.12.09 Tue PM 7:51 ・ 6Minutes 12seconds
|
||||
제이미성형외과
|
||||
|
||||
|
||||
Attendees 1 00:00
|
||||
안녕하세요. 제이미 성형외과 정기호 원장입니다.
|
||||
오늘은 깊어지는 이마 주름과 처진 눈꺼풀 혹은 눈가 짓무름으로 고민하시는 중장년층을 위해 시
|
||||
|
||||
Attendees 2 00:13
|
||||
아휴 참 가겠습니다. 하이
|
||||
|
||||
Attendees 1 00:21
|
||||
안녕하세요. 제이미 성형외과 정기호 원장입니다.
|
||||
오늘은 깊어지는 이마 주름과 처진 눈꺼풀 혹은 눈가 짓무름으로 고민하시는 중장년층을 위한 내시경 이마 거상술에 대해 말씀드리겠습니다.
|
||||
나이가 들면 자연스러운 노화 현상으로 이마와 눈썹의 위치가 점점 낮아지게 됩니다.
|
||||
이 경우 환자들은 크게 두 가지 고민에 직면하게 되는데요.
|
||||
하나는 눈을 뜨기 위해 자신도 모르게 이마를 치켜 올리면서 이마 주름이 늘어간다는 것이고, 또 다른 하나는 낮은 눈썹에 윗 눈꺼풀이 짓눌려서 눈두덩이 두꺼워지고 눈꺼풀로 눈을 뜨기 힘들어진다는 점입니다.
|
||||
결국 환자분들은 이마 주름과 눈 뜨기 힘들다는 증상에 집중하게 되고 정작 문제의 핵심인 이마와 눈썹의 처짐에 대해서는 놓치기 쉽습니다.
|
||||
그래서 엉뚱한 이마 보톡스 시술이나 상안검 성형 수술을 반복하면서 수술한 티나고 강한 인상으로 악화되는 안타까운 경우를 종종 접하게 됩니다.
|
||||
제이미 성형외과의 내시경 이마거상술은 이러한 고민들을 효과적으로 해결해 드립니다.
|
||||
|
||||
Attendees 1 01:47
|
||||
부자연스럽고 강한 인상이 아닌 자연스럽고 생기 있는 젊은 시절 나의 모습으로 되돌려 드립니다.
|
||||
|
||||
Attendees 1 02:02
|
||||
제이미 성형외과의 3점 고정 내시경 이마 거상술은 두 피의 3곳에 각각 1에서 2센티미터의 최소 절개를 통해 진행되어 기존의 방법들보다 흉터나 탈모의 위험성이 낮습니다.
|
||||
특히 내시경을 이용해 리프팅한 이마를 3곳 이상 여러 부위에 견고하게 고정한다는 점, 그리고 주문 제작한 흡수성 봉합살을 사용한다는 점은 제이미 성형외과의 핵심 경쟁력입니다.
|
||||
고정점이 많아지면 수술 효과가 오래 지속될 뿐만 아니라 눈썹의 높이와 기울기를 자유롭게 디자인할 수 있고, 이마의 넓이와 모양 그리고 볼륨감도 다양하게 조절할 수 있습니다.
|
||||
또한 흡수성 봉합산은 수술 후 이물감이 없고 회복이 빠르며 수술한 티도 나지 않습니다.
|
||||
이러한 모든 과정은 수면 마취와 국소 마취로 통증 없이 1시간 내외로 마무리됩니다.
|
||||
수술 당일 붕대나 반창고 없이 바로 퇴원할 수 있고, 수술 다음 날부터는 세안, 샴푸, 샤워 화장이 가능한 점도 큰 장점입니다.
|
||||
|
||||
Attendees 1 03:20
|
||||
수술 후에는 1년간 무료 리프팅 관리 프로그램을 제공하고 동영상을 통해 개선된 전후 모습을 확인시켜 드리고 있습니다.
|
||||
제이미 내시경 이마거상술을 통해 이마와 미간 눈가 주름이 개선되고 처진 눈썹이 이상적인 위치로 리프팅되어 눈꺼풀로 편안하게 눈을 뜰 수 있습니다.
|
||||
이러한 변화는 자연스럽고 부드러운 인상으로 이어지기 때문에 젊고 생기 있는 모습을 얻을 수 있겠습니다.
|
||||
이마에 주름이 늘어가고 눈 뜨기가 무겁다면 이마 거상술이 필요한 경우가 아닌지 한 번쯤 고민해 보십시오.
|
||||
제이미 성형외과의 차별화된 3점 고정 내시경 이마 거상술로 여러분에게 젊음과 자신감을 되찾아 드리겠습니다.
|
||||
지금 바로 제이미 성형외과의 전문적인 상담을 받아보세요.
|
||||
|
||||
Attendees 3 04:17
|
||||
내시경 이마 보상술 후 흉터나 탈모가 많이 걱정됩니다.
|
||||
|
||||
Attendees 1 04:23
|
||||
네 내시경 이마거상술은 두피 안쪽에 보이지 않는 1 내지 2센티의 작은 절개창을 통해서 수술이 진행되게 됩니다.
|
||||
이 경우 수술이 매끄럽지 못하거나 수술하시는 선생님이 숙련되지 못해서 좀 절개선 주변을 거칠게 다룰 경우에 흉터가 남거나 탈모가 진행되는 경우가 드물게 있습니다.
|
||||
그러나 어느 정도 숙련된 선생님들이 이 수술을 진행하게 될 경우에는 흉터가 남거나 탈모가 발생하는 경우는 극히 드뭅니다.
|
||||
그리고 만에 하나 흉터나 탈모가 발생했다고 하더라도 두피 쪽은 흉터를 재건하거나 아니면 탈모 부위를 치료하는 것이 그렇게 어렵지 않기 때문에 흉터나 탈모 걱정을 너무 많이 하실 필요는 없겠습니다.
|
||||
|
||||
Attendees 3 05:18
|
||||
엔도타인 방법과 원장님만의 수술 방법의 차이점이 궁금합니다.
|
||||
|
||||
Attendees 1 05:25
|
||||
엔도타인이라는 것은 우리가 리프팅된 이마를 고정하는 상품화된 똑딱이 단추와 같은 나사라고 생각을 하셔도 되겠습니다.
|
||||
거기에 비해서 제가 이용하는 고정 방법은 일일이 흡수성 봉합사로 당겨진 이마를 꿰매는 것입니다.
|
||||
이 두 가지 방법 중에 더 우월한 방법이 있거나 수술 결과를 좌우할 만큼 중요한 인자는 아닙니다.
|
||||
다만 엔도타인은 회복 과정에 있어서 환자가 만져보면 안에 고정된 엔도타인이 만져지는, 즉 이물감이 느껴지는 단점이 있기 때문에 저 같은 경우에는 이물감이 없고 수술 직후부터 편안함을 주는 흡수성 봉합살을 애용하고 있습니다.
|
||||
|
||||
|
||||
clovanote.naver.com
|
||||
@@ -0,0 +1,36 @@
|
||||
내시경 이마 거상술_수술실
|
||||
2025.12.09 Tue PM 7:50 ・ 3Minutes 46seconds
|
||||
제이미성형외과
|
||||
|
||||
|
||||
Attendees 1 00:00
|
||||
내시경 이마 거상술 후 탈모에 대한 걱정을 하시는 분들이 많습니다.
|
||||
그 이유는 그 내시경이 들어가는 절개선이 두피에 보통 3곳에서 한 다섯 군데 정도 위치하고 있기 때문이고 솔직히 말씀드리면 탈모가 생기는 원인은 그 절개선을 통해서 우리가 여러 가지 수술 조작을 할 때 모낭의 스트레스를 주기 때문에 탈모가 생기는 것입니다.
|
||||
그래서 좀 조심스러운 면이 있긴 하지만 대체로 숙련되고 경험이 많은 자가 수술을 시행했을 때는 탈모는 굉장히 드뭅니다.
|
||||
그래서 저희 병원 같은 경우에는 탈모에 대한 퍼미션을 따로 받지 않습니다.
|
||||
사실은 그리고 흉터도 마찬가지 개념이에요. 우리가 절개선 주변이 수술 과정에서 많은 스트레스를 받게 되면 상처가 커지게 되고 그 커진 상처가 결국은 흉터로 남게 됩니다.
|
||||
그리고 저도 수술 초기에는 탈모나 흉터가 남은 적이 있는데요.
|
||||
환자분들한테 한 가지 좋은 소식은 두피에 남은 흉터나 국소적인 탈모는 치료하기가 쉽습니다.
|
||||
|
||||
Attendees 1 01:16
|
||||
저희들이 보통 그 흉터진 부분만 간단하게 절개하고 새로 봉합을 하면은 흉터나 탈모 문제가 간단하게 해결되기 때문에 탈모나 흉터를 너무 두려워하실 필요는 없다고 생각합니다.
|
||||
안면 거상술 같은 경우에는 절개선이 이쪽 관자 헤어라인 앞쪽부터 귀 앞을 지나서 귀 뒤 그리고 목 뒷덜미 쪽까지 매우 긴 절개선을 이용해서 수술을 하게 됩니다.
|
||||
그래서 안면 거상 수술 흉터를 걱정하시는 분께는 크게 두 가지 방향으로 흉터에 관한 설명을 드리는데요.
|
||||
첫 번째는 이 흉터를 일반 사회생활을 하거나 일상생활 속에서는 찾기가 힘들어요.
|
||||
그거는 우리가 상대를 자연스럽게 바라볼 때 즉 영어로 하면 그냥 c 혹은 룩 이럴 때는 쉽게 보이진 않습니다.
|
||||
그런데 반대로 이 흉터를 찾아야겠다 그러니까 영어로 하면 옵저베이션이죠.
|
||||
이 흉터를 발견해야겠다 이런 생각으로 수술 부위를 들여다보면 이 흉터는 평생 보입니다.
|
||||
|
||||
Attendees 1 02:21
|
||||
그래서 저희 수술자 입장에서는 흉터를 줄이려고 최선의 노력을 하는 것이 맞고, 수술 후 결과가 일상 사회 생활 속에서는 흉터가 쉽게 보이지 않는 수준까지 꼼꼼하게 봉합을 하는 것이 맞습니다.
|
||||
그리고 그러한 결과를 대부분 낼 수 있어요. 근데 환자분 입장에서 주의하셔야 될 것은 누가 들여다보거나 찾지도 않는 부분까지 꼼꼼히 가까이 다가가서 머리칼을 들추고 찾아보면 그러한 흉터는 절대로 피할 수가 없고 그러한 흉터조차 피해야겠다고 생각을 하신다면 수술을 받으시면 안 된다고 말씀을 드리고 싶습니다.
|
||||
네 눈 성형 수술 후 회복 기간에 관한 질문을 주셨는데요.
|
||||
눈 수술 종류가 많지만 크게 두 가지 부류로 나눠서 답변을 드릴 수 있겠습니다.
|
||||
첫 번째는 비절개 수술입니다. 그러니까 매몰법이나 비절개 눈매 교정처럼 절개가 없는 경우에는 저희 병원 같은 경우에 수술하고 다음 날 바로 출근하거나 학교 가실 수 있어요.
|
||||
그래서 비절개 방식은 하루만 쉬어도 충분하다라고 답변을 드릴 수 있고요.
|
||||
|
||||
Attendees 1 03:30
|
||||
나머지 절개가 필요한 수술 절개식 쌍꺼풀이나 절개식 눈매 교정 이런 경우에는 보통 실밥을 4일 후에 풀기 때문에 환자분들이 대체로 일주일 정도 휴식을 취한 후에 사회생활 복귀를 하는 편입니다.
|
||||
|
||||
|
||||
clovanote.naver.com
|
||||
@@ -0,0 +1,69 @@
|
||||
내시경 눈썹 거상술
|
||||
2025.12.09 Tue PM 7:50 ・ 6Minutes 55seconds
|
||||
제이미성형외과
|
||||
|
||||
|
||||
Attendees 1 00:00
|
||||
안녕하세요. 제이미 성형외과 정기호 원장입니다.
|
||||
오늘은 낮은 이마와 눈썹 때문에 많은 고민을 하고 계신 젊은 층 고객을 위한 내시경 눈썹 거상술을 소개해 드리겠습니다.
|
||||
한국인은 선천적으로 이마와 눈썹의 위치가 낮아서 눈두덩이 두껍고 눈썹과 눈 사이 공간이 좁은 분들이 많습니다.
|
||||
이런 조건에서는 눈꺼풀로 눈을 뜨려면 이마와 눈썹도 동시에 찍혀 올려야 하는데, 이러한 보상 작용은 어려서부터 무의식 중에 일어나기 때문에 본인이 남들과 달리 이마와 눈썹을 치켜 뜨고 있다는 사실을 인지하지 못하는 경우가 많습니다.
|
||||
실제로 상담실을 방문한 대부분의 젊은 환자들은 눈두덩이 무거워서 눈 뜨기 무겁다.
|
||||
인상이 강하다 인상 쓰지 않았는데 인상 쓰지 말라는 소리를 듣는다.
|
||||
눈매 교정이 필요한 것 같다 상안검 수술도 하고 눈매 교정도 했는데 여전히 눈매가 답답하고 쌍꺼풀이 금방 덮여버린다 이러한 고민들을 이야기합니다.
|
||||
|
||||
Attendees 1 01:12
|
||||
위 내용 중 여러분에게 해당되는 고민이 있다면 거울을 보고 손바닥으로 눈썹과 이마를 위로 한번 밀어 올려 보십시오.
|
||||
이때 눈 뜨기가 편해지고 거울 속 나의 눈매가 시원해 보인다면 여러분의 고민을 풀어줄 해법은 눈이 아닌 이마에 있는 것입니다.
|
||||
바로 내시경, 눈썹 거상술이 필요한 경우인 것입니다.
|
||||
제이미 성형외과의 3점 고정 내시경 눈썹 거상술은 두피 내 3곳에 각각 1 내지 2센티 정도의 최소 절개를 통해 진행되어 기존의 방법들보다 흉터나 탈모의 위험성이 낮습니다.
|
||||
특히 내시경을 이용해 리프팅한 이마를 3곳 이상 여러 부위에 견고하게 고정한다는 점, 그리고 주문 제작한 흡수성 봉합살을 사용한다는 점은 제이미 성형외과의 핵심 경쟁력입니다.
|
||||
고정점이 많아지면 수술 효과가 오래 지속될 뿐만 아니라 눈썹의 높이와 기울기를 자유롭게 디자인할 수 있고, 이마의 넓이와 모양 그리고 볼륨감도 다양하게 조절할 수 있겠습니다.
|
||||
|
||||
Attendees 1 02:24
|
||||
또한 흡수성 봉합산은 수술 후 이물감이 없고 회복이 빠르며 수술한 티도 나지 않습니다.
|
||||
모든 과정은 수면 마취와 국소 마취로 통증 없이 1시간 정도로 마무리됩니다.
|
||||
수술 당일 날 붕대나 반창고가 없이 퇴원할 수 있고, 수술 다음 날부터는 세안, 샴푸, 샤워 화장이 가능한 점도 큰 강점입니다.
|
||||
수술 후에는 1년간 무료 리프팅 관리 프로그램을 제공하고 있고 동영상을 통해 개선된 모습을 확인시켜 드리고 있습니다.
|
||||
내시경 눈썹 거상수를 통해 눈썹을 이상적인 위치로 리프팅 해 주면 기능적으로 눈 뜨기가 편해지고 미용적으로 눈썹과 눈 사이 공간이 넓어지면서 눈두덩이 얇아지고 시원한 눈매를 얻을 수 있습니다.
|
||||
덤으로 이마가 팽팽해지고 볼륨감 있는 모습으로 변화시킬 수도 있겠습니다.
|
||||
제이미 성형외과는 숙련된 기술과 풍부한 경험을 바탕으로 개개인의 얼굴형과 눈매에 맞는 삼점 고정 내시경 눈썹 거상술을 시행합니다.
|
||||
|
||||
Attendees 1 03:39
|
||||
처진 눈썹과 답답한 눈매, 그리고 반복되는 쌍거풀 수술로도 눈매 고민이 해결되지 못한 경우라면 내시경 눈썹 거상술이 필요한 경우가 아닌지 상담해 보시기 바랍니다.
|
||||
|
||||
Attendees 2 03:53
|
||||
다시 질문을 드리겠습니다. 이마 거상과 눈썹 거상술은 서로 다른 수술인가요?
|
||||
|
||||
Attendees 1 04:00
|
||||
네 이마 거상술과 눈썹 거상술은 의학적으로 볼 때는 동일한 수술입니다.
|
||||
눈썹과 이마의 위치가 이상적인 위치보다 낮을 때 당겨 올리는 사실상 똑같은 수술입니다.
|
||||
그런데 일반인들이 이 두 가지 용어를 혼용하면서 서로 다른 수술이라고 오해하는 경우가 임상에서 많이 저희가 접하게 되는데요.
|
||||
보통 중장년층들은 눈썹과 이마가 낮으면 이마에 주름이 많이 생기니까 이마의 주름을 개선해 달라고 오셔서 이마를 당겨 올려주세요.
|
||||
이런 식으로 저희한테 문의를 하기 때문에 저희가 환자분들 눈높이에 맞춰서 이마거상술을 해드릴게요.
|
||||
이런 식으로 설명을 하고 있고, 한국인들 중에 이렇게 젊은 층은 선천적으로 눈썹 위치가 낮은 분들이 제법 있어요.
|
||||
이런 분들은 젊기 때문에 이마의 주름은 없지만 눈두덩이 두껍고 쌍꺼풀 수술을 해도 눈이 시원하지가 않아요.
|
||||
이런 경우에 저희들이 이렇게 눈썹을 당겨 올려주면 아 이 모습 괜찮네요 이런 말씀을 하시거든요.
|
||||
|
||||
Attendees 1 05:08
|
||||
그러면 그때 저희들이 눈썹 거상수를 하시면 좋겠습니다.
|
||||
이런 식으로 설명을 하게 됩니다. 다시 정리를 하면 이마에 하단 경계선이 눈썹이라고 생각을 하시면 돼요.
|
||||
그래서 이마를 당겨 올리면 눈썹은 자연히 딸려 올라가고 눈썹을 올리려면 이마도 밀려서 다 올라가야 돼요.
|
||||
그래서 결국 이마 거상과 눈썹 거상은 같은 말이다.
|
||||
같은 수술이다 이렇게 이해하시면 되겠습니다.
|
||||
|
||||
Attendees 2 05:37
|
||||
수술 후 눈썹 모양이 부자연스러워지는 경우는 없을까요?
|
||||
|
||||
Attendees 1 05:43
|
||||
네 내시경 눈썹 거상술을 하는 이유는 처진 눈썹을 이상적인 위치로 당겨 올리기도 하고 그와 동시에 눈썹 모양을 우리가 원하는 모습으로 그러니까 좀 더 부드러운 수평적인 눈썹을 만들기도 하고 좀 멍해 보이는 사람은 눈썹의 꼬리를 당겨 올려서 좀 더 또렷하고 똘똘해 보이는 인상으로 만들기도 합니다.
|
||||
환자분들이 눈썹 모양에 대한 불만이 있기 때문에 저희 제이미 성형외과에서는 3점 고정을 시행하고 있어요.
|
||||
일반인들은 이해하기 힘들겠지만 대부분의 병원에서는 두 군데만 고정을 하거든요.
|
||||
근데 세 군데 이상 고정을 하게 되면 우리가 눈썹 꼬리를 올린다거나 중앙을 올린다거나 이런 조정을 하는 것이 훨씬 용이해집니다.
|
||||
|
||||
Attendees 1 06:31
|
||||
환자분들께 많이 비유하는 것이 우리가 이렇게 인형을 실을 달아서 인형극을 한다고 했을 때 인형 팔에 달린 실이 두 줄인 거랑 세 줄 네 줄인 거랑은 인형의 움직임이 자연스러움이 차이가 있겠죠.
|
||||
그래서 저희 제이미 성형외과에서는 3점 고정 내시경 이마 거상술을 시행하고 있는 큰 이유가 되겠습니다.
|
||||
|
||||
|
||||
clovanote.naver.com
|
||||
@@ -0,0 +1,56 @@
|
||||
눈 재수술
|
||||
2025.12.09 Tue PM 7:51 ・ 5Minutes 19seconds
|
||||
제이미성형외과
|
||||
|
||||
|
||||
Attendees 1 00:00
|
||||
안녕하세요. 제이미 성형외과 정기호 원장입니다.
|
||||
오늘은 만족스럽지 못한 눈 성형 결과를 개선하고 싶으신 분들을 위한 눈 재수술에 대해 설명드리겠습니다.
|
||||
쌍거풀 라인의 비대칭이나 높이에 대한 불만 풀리거나 너무 흐린 라인 혹은 수술한 티가 나는 짙은 라인이나 흉터 등 다양한 이유로 눈 재수술을 고민하시는 분들이 많습니다.
|
||||
제이미 성형외과의 눈 재수술은 풍부한 경험을 바탕으로 이러한 다양한 고민들을 해결해 드리고 있습니다.
|
||||
눈 재수술의 기본 과정은 다른 병원에서 다른 의사가 시행한 다양한 수술 방법들에 대해 당황하지 않고 잘못된 부분을 초기화시킨 후 새로운 눈매를 만들어 주는 것입니다.
|
||||
결국 재수술을 진행할 의사의 경험과 부단한 연구가 필수 요건이라고 할 수 있겠습니다.
|
||||
제이미 성형외과는 2008년부터 눈 성형을 전문적으로 시행하고 있고 다양한 재수술 케이스를 보유하고 있습니다.
|
||||
|
||||
Attendees 1 01:10
|
||||
재수술 시기에 있어서도 풍부한 경험을 바탕으로 조기 교정부터 지연 교정까지 환자분의 눈 상태나 생활 여건에 따라 선택의 폭을 넓게 드리고 있습니다.
|
||||
내원 상담 시 환자분과 유사한 재수술 케이스를 동영상으로 보여드릴 수 있고, 눈 재수술에 있어서 필수적인 as 기간도 5년까지 보장해 드리고 있습니다.
|
||||
첫 인상을 크게 좌우하는 눈 모습의 개선을 통해 자연스럽고 아름다운 자신감을 되찾을 수 있습니다.
|
||||
눈 성형 전문 병원으로서 최상의 눈 재수술 결과를 위해 부단히 노력해 왔습니다.
|
||||
눈 성형 실패로 고민이 있으시다면 지금 바로 제이미 성형외과에 문의해 주십시오.
|
||||
|
||||
Attendees 2 01:59
|
||||
눈 재수술이 안 되는 경우도 있나요?
|
||||
|
||||
Attendees 1 02:05
|
||||
눈 재수술을 시행했을 때 개선이 안 되는 경우는 거의 없는 것 같습니다.
|
||||
현실적인 문제는 환자들이 원하는 만큼의 결과에 도달하지 못하는 경우는 생각보다 많습니다.
|
||||
이것은 남 탓으로 보일 수도 있는데요. 우리가 깨끗한 도화지에 그림을 그리면 화가의 실력이 100% 다 발휘가 될 텐데 재수술이라는 것은 어느 정도 오염되거나 낙서가 있는 도화지에 뭔가 덧칠을 해서 그냥 처음부터 괜찮은 그림이 있었던 것처럼 우리가 카머플라주 그러니까 위장을 하는 것이기 때문에 첫 수술이 너무 심각하게 망쳐진 경우에는 환자분이 원하는 만큼의 결과에 도달하지 못할 가능성이 제법 있다.
|
||||
그러나 망쳐진 눈이 현재보다는 좋아질 확률은 상당히 높다 이렇게 답변을 드리겠습니다.
|
||||
|
||||
Attendees 2 03:04
|
||||
눈 재수술 후에도 흉터가 남을까 걱정이 됩니다.
|
||||
|
||||
Attendees 1 03:10
|
||||
일반적으로 첫 눈 수술은 흉터가 거의 남지 않거나 남아도 쉽게 눈에 띄지 않는 수준으로 결과가 마무리됩니다.
|
||||
그런데 재수술 같은 경우에는 기존의 흉터가 어느 정도 있느냐에 따라서 그 결과가 다양하게 나타납니다.
|
||||
재수술할 때 기존 흉터를 제거하는 시도를 저희들이 하는데요.
|
||||
어떤 경우는 거의 다 제거해서 흉터가 거의 안 남는 결과가 나오는 경우도 있는데 안 좋은 케이스는 눈에 피부 여분이 부족해서 흉터를 마음 놓고 못 자르는 경우가 있어요.
|
||||
피부가 부족한데 흉터를 왕창 자르면 눈이 안 감기는 문제가 생기거든요.
|
||||
그럴 경우에는 흉터가 상당 부분 남을 수밖에 없다 이렇게 이해하셨으면 좋겠습니다.
|
||||
|
||||
Attendees 2 04:01
|
||||
다른 병원에서 수술을 했는데 jb 성형외과에서 재수술이 가능할까요?
|
||||
|
||||
Attendees 1 04:09
|
||||
첫 번째 수술 결과에 만족을 못해서 재수술을 고민하시는 분들에게 조언을 드리도록 하겠습니다.
|
||||
첫 수술이 실패한 경우 일단은 처음 수술하신 원장님께 한 번 더 기회를 드리시는 것이 현명한 선택입니다.
|
||||
왜냐하면 처음 수술하신 원장님이 고객님의 아내 상태가 어떤지 그리고 어떤 문제가 생겼는지 가장 이해도가 높을 가능성이 높습니다.
|
||||
그리고 저조차도 수술을 실패하는 수가 있거든요.
|
||||
세상에 아무리 뛰어난 의사라도 100% 성공률을 가지고 수술을 하는 경우는 없어요.
|
||||
그래서 재수술할 경우에는 기본적으로 처음 수술한 병원에 한 번 더 기회를 준다 이런 생각을 하시고 그렇게 기회를 드렸음에도 불구하고 반복적으로 수술이 실패한다면 재수술을 전문적으로 하는 병원을 찾아보시는 것이 맞다고 생각합니다.
|
||||
그리고 저 같은 경우에 재수술의 한 90%는 다른 병원에서 수술을 하고 온 것 같아요.
|
||||
그래서 병원을 옮긴다고 해서 뭐 재수술을 못하고 이런 경우는 없습니다.
|
||||
|
||||
|
||||
clovanote.naver.com
|
||||
@@ -0,0 +1,26 @@
|
||||
눈성형
|
||||
2025.12.09 Tue PM 7:52 ・ 2Minutes 4seconds
|
||||
제이미성형외과
|
||||
|
||||
|
||||
Attendees 1 00:00
|
||||
오늘은 많은 분들이 관심을 가지시는 눈 성형에 대해 말씀드리겠습니다.
|
||||
눈은 첫 인상에 큰 영향을 미치기 때문에 작고 답답한 눈, 졸려 보이는 눈, 비대칭 눈 등 다양한 고민을 가지신 분들이 많습니다.
|
||||
제이미 성형외과 제이미 성형외과에서는 기본적인 쌍거풀 수술, 눈매 교정술, 트임 수술, 눈밑 성형부터 난이도 높은 재수술까지 개인의 눈 상태와 원하는 결과에 맞는 맞춤 솔루션을 제공하고 있습니다.
|
||||
제이미 성형외과는 자연스러움과 조화를 최우선으로 생각합니다.
|
||||
단순히 크고 화려한 눈이 아닌 개개인의 얼굴 전체와의 조화를 고려하여 가장 이상적인 눈매를 디자인합니다.
|
||||
특히 퀵 매몰법과 안검하수 눈매 교정술, 그리고 눈 재수술에 있어서 탁월한 기술력을 축적하고 있으며 5년간 as를 보장하고 있습니다.
|
||||
제인의 눈 성형을 통해 자연스럽고 조화로운 눈매를 완성하실 수 있습니다.
|
||||
결과로 보답하는 제이미 성형외과. 당신의 아름다움을 완성하고 싶으시다면 언제든지 편안하게 제이미를 찾아주십시오.
|
||||
|
||||
Attendees 2 01:22
|
||||
원장님 졸린 눈도 쌍꺼풀 수술만으로 개선이 가능할까요?
|
||||
|
||||
Attendees 1 01:26
|
||||
그렇지 않습니다. 환자분들이 말씀하시는 졸린 눈은 안검하수 즉 눈동자의 노출량이 부족한 것을 말하고요.
|
||||
쌍거풀 수술은 말 그대로 라인이 없는 홑꺼풀 눈을 두 겹의 쌍거풀로 만드는 수술이기 때문에 졸린 눈과 쌍거풀은 서로 다른 개념입니다.
|
||||
그래서 졸린 눈을 해결하는 수술은 안검하수 눈매 교정술이고 쌍거풀 수술은 별도의 수술입니다.
|
||||
실제 임상에서는 졸린 눈 즉 앙검하수 교정을 하면서 쌍거풀 수술을 같이 진행하기 때문에 환자분들이 착각을 하시는 것 같습니다.
|
||||
|
||||
|
||||
clovanote.naver.com
|
||||
@@ -0,0 +1,45 @@
|
||||
자가지방이식
|
||||
2025.12.09 Tue PM 7:53 ・ 4Minutes 2seconds
|
||||
제이미성형외과
|
||||
|
||||
|
||||
Attendees 1 00:00
|
||||
안녕하세요. 제이미 성형외과 정기호 원장입니다.
|
||||
오늘은 얼굴에 부족한 볼륨을 채워 젊고 생기 있는 모습으로 만들어주는 자가지방 이식에 대해 말씀드리겠습니다.
|
||||
나이가 들면서 얼굴 볼륨감이 감소하고 탄력이 떨어지는 고민을 하시는 분들이 많습니다.
|
||||
이런 경우 우리 몸의 불필요한 지방이 축적된 부위에서 지방을 채취하고 볼륨이 부족한 부위로 이식을 해주면 만족스러운 결과를 얻을 수 있습니다.
|
||||
제이미 성형외과에서는 주로 허벅지나 아랫배에서 지방을 채취하여 정제 과정을 거쳐 지방의 밀도를 높인 다음에 이마, 눈, 주위, 뺨, 팔자, 주름 등의 지방 이식을 시행하고 있습니다.
|
||||
이식된 지방은 반영구적으로 유지되고 자가 조직이기 때문에 부작용도 거의 없습니다.
|
||||
특히 제이미 성형외과의 자가지방 이식은 부기와 멍이 적고 회복이 빨라 수술 다음 날부터 사회생활 복귀가 가능해서 휴가를 따로 내지 않고도 수술을 받을 수 있습니다.
|
||||
|
||||
Attendees 1 01:13
|
||||
자가지방 이식을 통해 부족한 볼륨을 보충해 주고 피부 탄력을 증가시키면 보다 입체적이고 생기 있는 얼굴을 기대할 수 있겠습니다.
|
||||
자가지방 이식은 필러의 볼륨 효과와 최근 유행하는 콜라겐 부스터의 콜라겐 재생 효과를 모두 지닌 가장 이상적이고 부작용이 거의 없는 수술 방법입니다.
|
||||
얼굴 부위의 볼륨과 탄력 부족이 고민이시라면 제이미 성형외과의 자가지방 이식 상담을 추천드립니다.
|
||||
|
||||
Attendees 2 01:47
|
||||
이식된 지방의 생착률은 얼마나 되나요? 이식한 지방은 얼마나 오래 유지되나요?
|
||||
|
||||
Attendees 1 01:57
|
||||
이식된 지방의 생착률은 30% 정도로 봅니다. 많게는 40%까지도 보는데요.
|
||||
쉽게 설명하면 환자분에게 뭐 이마나 뺨에 10시시의 지방을 이식하면 3 내지 4시시는 생착해서 영구적으로 가게 되고요.
|
||||
6에서 7시시는 생착에 실패하고 자연 흡수돼서 없어지게 됩니다.
|
||||
그래서 저희가 보통 지방 이식을 할 때 6cc를 넣는 게 목표다.
|
||||
이러면 보통 1차에 10cc를 넣어요. 그러면은 1차 수술의 결과로 10cc에서 30% 즉 3cc 정도가 생존하게 되고 한 두 달 정도 지나서 같은 실수를 반복하면 역시 3시시가 생착을 하게 돼서 1차 때 생착한 3, 2차 때 생착한 3 이렇게 보태면 우리가 처음 목표했던 6시시의 지방이 살아남게 돼서 처음 환자분이 원한 볼륨감을 얻을 수 있게 됩니다.
|
||||
그리고 이식된 지방은 저희가 나무 옮겨 심는 거랑 똑같다고 하거든요.
|
||||
한 번 옮겨 심은 나무는 그 자리에서 계속 자라는 거예요.
|
||||
|
||||
Attendees 1 03:03
|
||||
그래서 거의 반영구적으로 유지된다 이렇게 생각하시면 되고 반영구적이라는 점이 필러나 기타 다른 어떤 인공 주입물하고 큰 차이점을 만드는 지방 이식의 강점이라고 할 수 있겠습니다.
|
||||
|
||||
Attendees 2 03:19
|
||||
지방 이식 후 운동은 언제부터 가능한가요?
|
||||
|
||||
Attendees 1 03:25
|
||||
지방 이식은 거의 90% 이상의 환자분에 있어서 수술 다음 날부터 일상생활 사회생활이 다 가능한 수술이에요.
|
||||
그러니까 달리 말하면 수술 다음 날부터 운동을 해도 별 문제가 없습니다.
|
||||
다만 지방을 채취한 부위 그러니까 허벅지나 아랫배 쪽은 멍이 드는 경우가 많거든요.
|
||||
그래서 그 멍 때문에 멍이 부끄러워서 반바지를 못 입는다든지 뭐 수영을 못 한다든지 이런 일이 있지 현실적으로는 지방 이식하고 다음 날부터 운동을 하셔도 어떤 문제가 생기거나 수술 결과에 영향을 주지는 않습니다.
|
||||
|
||||
|
||||
clovanote.naver.com
|
||||
@@ -0,0 +1,32 @@
|
||||
이마성형
|
||||
2025.12.09 Tue PM 7:53 ・ 3Minutes 47seconds
|
||||
제이미성형외과
|
||||
|
||||
|
||||
Attendees 1 00:00
|
||||
안녕하세요. 제이미 성형외과 정기호 원장입니다.
|
||||
오늘은 이마와 눈썹의 위치가 너무 낮아 불편함을 겪는 분들을 위한 내시경 이마 거상술에 대해 소개해 드리겠습니다.
|
||||
이마와 눈썹의 위치가 너무 낮은 경우 환자들이 이야기하는 고민은 크게 두 가지입니다.
|
||||
하나는 눈을 뜨려면 자신도 모르게 이마를 치켜 올리면서 이마의 주름이 생긴다는 것이고, 또 다른 하나는 낮은 눈썹에 윗 눈꺼풀이 짓눌리면서 눈두덩이 두껍고 눈꺼풀로 눈을 뜰 때 힘이 든다는 점입니다.
|
||||
결국 환자분들은 이마 주름과 눈 뜨기 힘들다는 고민을 이야기하시지만 정작 문제의 해결을 위해서는 이마 거상술로 이마와 눈썹의 위치를 이상적인 위치로 교정해야 한다는 점을 모르는 경우가 대부분입니다.
|
||||
제이미 성형외과의 내시경 이마거상술은 이러한 고민들을 효과적으로 해결해 드립니다.
|
||||
|
||||
Attendees 1 01:10
|
||||
내시경 이마거상술, 내시경 눈썹 거상술, 내시경 눈썹 교정술 등 다양한 용어가 사용되고 있지만 의학적으로는 사실상 동일한 수술이며 개선하고 싶은 부위를 강조하는 표현상의 차이일 뿐입니다.
|
||||
제이미 성형외과의 3점 고정 내시경 이마거상술은 두피 내 3곳에 각각 1에서 2센티미터의 최소 절개를 통해 진행하게 되고, 이러한 최소 절개 방법은 흉터나 탈모의 위험성을 현저히 낮추어 줄 수 있습니다.
|
||||
특히 내시경을 이용해 리프팅한 이마를 3곳 이상 여러 부위에 견고하게 고정한다는 점, 그리고 주문 제작한 흡수성 봉합살을 사용한다는 점은 제이미 성형외과의 핵심 경쟁력입니다.
|
||||
고정점이 많아지면 수술 효과가 오래 지속될 뿐만 아니라 눈썹의 높이나 기울기를 자유롭게 디자인할 수 있고, 이마의 넓이나 모양 그리고 볼륨감까지도 다양하게 조절할 수 있습니다.
|
||||
또한 흡수성 봉합산은 수술 후 이물감이 없고 회복이 빠르며 수술한 티도 나지 않습니다.
|
||||
|
||||
Attendees 1 02:31
|
||||
이러한 모든 과정은 수면 마취와 국소 마취로 통증 없이 1시간 정도로 마무리됩니다.
|
||||
수술 당일 날 붕대나 반창고 없이 퇴원할 수 있고, 수술 다음 날부터는 세안, 샴푸, 샤워 화장이 가능한 점도 큰 장점입니다.
|
||||
수술 후에는 1년간 무료 리프팅 관리 프로그램을 제공하며 동영상을 통해 수술 전후 개선된 모습을 확인시켜 드리고 있습니다.
|
||||
제이미의 내시경 이마 거상수를 통해 이마와 미간의 주름이 개선되고 처진 눈썹이 이상적인 위치로 리프팅되어 눈꺼풀로 편안하게 눈을 뜰 수 있을 것입니다.
|
||||
이러한 변화는 편안하고 부드러운 인상으로 이어지기 때문에 젊고 생기 있는 모습을 얻을 수 있습니다.
|
||||
이마에 주름이 늘어가고 눈 뜨기가 무겁다면 이마 거상술이 필요한 경우가 아닌지 고민해 보십시오.
|
||||
제이미 성형외과의 차별화된 3점 고정 내시경 이마거상술로 여러분에게 젊음과 자신감을 되찾아 드리겠습니다.
|
||||
지금 바로 제이미 성형외과의 전문적인 상담을 받아보세요.
|
||||
|
||||
|
||||
clovanote.naver.com
|
||||
@@ -0,0 +1,13 @@
|
||||
인사말
|
||||
2025.12.09 Tue PM 7:48 ・ 27seconds
|
||||
제이미성형외과
|
||||
|
||||
|
||||
Attendees 1 00:00
|
||||
안녕하세요. 제이미 성형외과 정기호 원장입니다.
|
||||
제이미 성형외과는 눈, 이마 동안 성형 전문 병원입니다.
|
||||
저희는 자연스럽게 어우러지는 얼굴 전체의 조화를 최우선으로 하며 꼭 필요한 시술만 안전하고 효과적인 방법으로 시행하고 있습니다.
|
||||
여러분의 아름다움과 젊음을 만들어 가는 제이미 성형외과가 되겠습니다.
|
||||
|
||||
|
||||
clovanote.naver.com
|
||||
@@ -0,0 +1,21 @@
|
||||
하이푸 리프팅(HIFU lifting) - 초음파 리프팅
|
||||
2025.12.09 Tue PM 7:53 ・ 1Minutes 50seconds
|
||||
제이미성형외과
|
||||
|
||||
|
||||
Attendees 1 00:00
|
||||
안녕하세요. 제이미 성형외과 정기호 원장입니다.
|
||||
오늘은 최근 유행하고 있는 하이프 리프팅 혹은 초음파 리프팅에 대해 소개해 드리겠습니다.
|
||||
바쁜 현대인들에게 늘어지고 생기 없는 노화된 피부에 탄력을 회복시켜주길 원하는 고객들이 점점 늘어나고 있습니다.
|
||||
이에 가장 부합하는 최신의 장비들이 바로 하이프 리프팅 장비들입니다.
|
||||
대표적으로 울쎄라, 슈링크, 더블로, 뉴테라 등 다양한 상품명을 가진 장비들이 유행하고 있지만 기본적으로는 초음파를 이용한 장비들입니다.
|
||||
최근의 장비들은 성능이 매우 우수해서 장비 간 성능 차이보다는 시술자의 장비 운영 능력이 결과를 좌우하는 경우가 대부분입니다.
|
||||
제이미 성형외과에서는 하이프 장비의 최대 성능을 발휘하면서 화상의 부작용을 예방하기 위해 쿨링 마취 시스템을 도입하여 시술 중 아프지 않고 화상 걱정 없는 안전한 시술을 시행하고 있습니다.
|
||||
|
||||
Attendees 1 01:15
|
||||
초음파 리프팅을 위한 수면 마취 중에 실리프팅이나 리주랑 같은 스킨 부스터 시술도 병행하면 감쪽같이 좋은 결과를 얻을 수 있습니다.
|
||||
이러한 초음파 리프팅은 회복 기간이 필요 없고 피부 콜라겐을 자극하고 재생시켜 수개월간 탄력 있는 피부를 유지시켜줄 수 있습니다.
|
||||
현대인이 바쁜 생활 속에서 회복 기간이 필요 없는 피부 탄력 복원 시술을 찾고 계시다면 제이미 성형외과의 하이프 리프팅 시술 상담을 추천드리겠습니다.
|
||||
|
||||
|
||||
clovanote.naver.com
|
||||
@@ -0,0 +1,37 @@
|
||||
하이브리드 쌍꺼풀
|
||||
2025.12.09 Tue PM 7:53 ・ 3Minutes 1seconds
|
||||
제이미성형외과
|
||||
|
||||
|
||||
Attendees 1 00:00
|
||||
안녕하세요. 제이미 성형외과 정기호 원장입니다.
|
||||
오늘은 절개법과 매몰법의 장점만을 모은 제이미의 하이브리드 쌍거풀에 대해 소개해 드리겠습니다.
|
||||
절개식 쌍거풀은 여분의 조직을 제거할 수 있지만 라인의 자연스러움이 부족하고 매몰법 쌍거풀은 라인은 자연스럽지만 늘어진 눈꺼풀을 제거할 수가 없기 때문에 환자분들은 어떤 방법을 선택해야 할지 고민에 빠지는 경우가 많습니다.
|
||||
이런 분들에게 제이미의 하이브리드 쌍거풀은 매몰법처럼 자연스러운 라인을 만들어주는 동시에 여분의 조직도 제거할 수 있는 솔루션입니다.
|
||||
제이미 성형외과의 하이브리드 쌍거풀은 먼저 매몰법으로 쌍거풀 라인을 만들어 준 다음에 최소 절개로 여분의 눈꺼풀을 제거해 줍니다.
|
||||
결과적으로 매몰법처럼 자연스러운 라인을 얻을 수 있고 일반 절개법 쌍거풀보다 흉터도 적고 회복도 빠릅니다.
|
||||
의사 입장에서는 두 가지 테크닉을 동시에 구사해야 하는 번거로운 방법이지만 환자 입장에서는 매몰법과 절개법의 장점을 동시에 누릴 수 있습니다.
|
||||
|
||||
Attendees 1 01:18
|
||||
절개식 쌍거풀이 두렵고 매몰법 같은 자연스러운 라인을 원하신다면 제이미 성형외과의 하이브리드 쌍거풀 수술을 추천드립니다.
|
||||
더 궁금하신 점은 언제든지 문의 주십시오.
|
||||
|
||||
Attendees 2 01:31
|
||||
첫 번째 질문입니다. 원장님 절개 쌍 커플은 수술한 티가 너무 날까 봐 걱정되는데 괜찮을까요?
|
||||
|
||||
Attendees 1 01:42
|
||||
네. 정상적으로 절개식 쌍거풀이 매끄럽게 진행된 경우에는 일상생활 속에서 우리가 수술한 흉터를 인지하기는 매우 어렵습니다.
|
||||
물론 자세히 찾아본다면 절개선이 보일 수 있겠지만 상담하는 저희조차도 환자분이 수술을 하셨는지 물어봐야 될 정도로 굉장히 흐린 선이 남게 됩니다.
|
||||
제가 생각할 때 환자분들이 그런 질문을 많이 하시는 이유 중에는 어떤 통계상의 오류가 있는데요.
|
||||
예를 들어서 환자분들이 절개식 삼가풀의 흉을 인지했다면 그거는 잘못된 수술이라 여러분 눈에 띄었을 뿐이에요.
|
||||
절개식 쌍갑을 수술하신 분들의 대부분은 수술했는지 안 했는지 저희가 알기가 힘든 것이 사실입니다.
|
||||
|
||||
Attendees 2 02:31
|
||||
절개상 커플 수술 후 회복 기간은 얼마나 필요한가요?
|
||||
|
||||
Attendees 1 02:38
|
||||
네 절개식 쌍거풀 수술의 경우 수술 다음 날 치료를 받고 나시면 세안, 샴푸, 샤워 화장이 모두 가능하고요.
|
||||
4일째 실밥을 풀게 됩니다. 통상적으로 실밥을 풀고 나면 학교에 가거나 회사에 출근하실 수 있기 때문에 4에서 5일 정도 휴식 기간이 필요하다 이렇게 생각하시면 되겠습니다.
|
||||
|
||||
|
||||
clovanote.naver.com
|
||||
@@ -0,0 +1,58 @@
|
||||
눈밑 지방 재배치
|
||||
2025.12.09 Tue PM 7:51 ・ 4Minutes 59seconds
|
||||
제이미성형외과
|
||||
|
||||
|
||||
Attendees 1 00:00
|
||||
안녕하세요. 제이미 성형외과 정기호 원장입니다.
|
||||
오늘은 어둡고 칙칙한 눈밑을 환하게 만들어주는 눈밑 지방 재배치에 대해 말씀드리겠습니다.
|
||||
눈밑 지방이 불룩하게 튀어나오거나 반대로 꺼져서 다크 서클이 심해 보이는 경우 피곤하고 나이 들어 보이는 인상을 줄 수 있습니다.
|
||||
제이미 성형외과의 눈밑 지방 재배치는 눈밑 지방을 제거하거나 재배치하고 필요에 따라 지방 이식을 병행하여 어둡고 울퉁불퉁한 눈밑을 환하고 매끄럽게 개선하는 수술입니다.
|
||||
제이미 성형외과의 눈밑 지방 재배치는 결막을 통해 절개하기 때문에 겉으로 보이는 흉터가 남지 않습니다.
|
||||
단순히 지방을 제거하는 것이 아니라 눈 밑의 꺼진 부분을 채우고 불룩한 부분을 매끄럽게 재배치하여 더욱 자연스럽고 효과적인 결과를 얻을 수 있습니다.
|
||||
안전한 진정 상태에서 국소 마취로 수술을 진행하기 때문에 금식이 필요 없고 마취 사고의 위험이 적으며 수술 후 빠른 회복이 가능하여 다음 날부터 세안, 화장 등 일상생활이 가능합니다.
|
||||
|
||||
Attendees 1 01:18
|
||||
눈밑 지방 재배치를 통해 밝고 어려 보이는 인상을 얻을 수 있으며 눈밑 애교는 보존하면서 자연스러운 볼륨감을 얻을 수 있습니다.
|
||||
어둡고 칙칙한 눈밑으로 고민이시라면 지금 바로 제이미 성형외과의 상담받으세요.
|
||||
|
||||
Attendees 2 01:36
|
||||
눈밑지방 재배치 수출로 다크서클도 개선될 수 있나요?
|
||||
|
||||
Attendees 1 01:42
|
||||
다크 서클이라는 뜻은 아 잠깐만요. 바로 다시 할게요.
|
||||
이거는 많은 질문이야. 다시 환자분들이 말씀하시는 다크 서클은 크게 두 가지로 나눌 수 있는데요.
|
||||
첫 번째는 불룩한 눈 밑 지방과 그 아래 꺼진 부분이 음영을 이루어서 발생하는 다크 서클이 있고요.
|
||||
그리고 두 번째는 피부 톤 자체가 어두워서 눈빛이 어둡게 보이는 분들이 있습니다.
|
||||
그리고 이 두 가지가 서로 믹스돼 있는 경우가 대부분입니다.
|
||||
그래서 눈밑지방 재배치 수술을 시행하게 되면 이 볼륨의 업다운 그러니까 윤곽에 의해서 생기는 그림자는 많이 개선이 되고 피부 자체가 어두운 부분은 개선에 한계가 있다 이렇게 생각하시면 되겠습니다.
|
||||
|
||||
Attendees 2 02:34
|
||||
눈밑 지방 재배치는 흉터가 남을까요?
|
||||
|
||||
Attendees 1 02:39
|
||||
눈밑지방 재배치를 하는 방법은 크게 두 가지가 있는데요.
|
||||
젊고 피부 처짐이 적은 분들은 결막 절개를 합니다.
|
||||
쉽게 생각해서 눈꺼풀을 약간 뒤집어서 눈 안쪽으로 절개를 할 경우에는 흉터가 전혀 남지 않게 수술을 한다 이렇게 이해하시면 되겠고요.
|
||||
반대로 나이가 좀 들고 아랫눈꺼풀 여분이 많고 주름도 많다 이런 경우에는 속눈썹 아래쪽에 피부 쪽에 절개를 해서 남는 피부를 잘라낼 수밖에 없어요.
|
||||
이 경우에는 속눈썹 밑에 얇은 절개선이 여러분들이 찾으려고 관찰을 하면 찾을 수 있고 일상생활 속에서 상대방이 얼핏 봤을 때는 쉽게 알아채기 힘든 수준의 절개선이 남는다 이렇게 이해하시면 좋겠습니다.
|
||||
|
||||
Attendees 2 03:27
|
||||
눈 밑 지방 재배치 수술 후 부작용 및 유지 기간은 어떻게 되나요?
|
||||
|
||||
Attendees 1 03:34
|
||||
눈 밑 지방 재배치 수술에 고유한 부작용으로는 안검외반을 들 수 있습니다.
|
||||
안검외반이라는 것은 아랫눈꺼풀이 붙기 때문에 일시적으로 뒤집어져 보이는 현상을 말하는데요.
|
||||
어 이러한 현상은 대부분 부기 때문에 일시적으로 여기서 일시적이라고 함은 1주 혹은 길어야 2주 이내로 모두 사라져야 정상이고요.
|
||||
그 이상으로 안검외반이 진행된다면 이것은 추가적인 교정이 필요할 것으로 판단이 됩니다.
|
||||
그리고 유지 기간은 통상적으로 5년 이상은 지속된다 저희들이 이렇게 설명을 하고 있습니다.
|
||||
환자분들이 많이 착각하시는 게 유지 기간이라고 하면 수술한 수술 직후의 모습이 수 년간 그대로 유지된다고 착각하시는 분들이 조금 많은 편인데요.
|
||||
우리 신체는 특히 눈은 하루에도 수없이 뜨고 감고 비비고 씻고 이런 외부의 자극을 계속 견뎌야 되기 때문에 시간이 지나면서 자연스럽게 처지고 주름이 생기는 것을 막지는 못합니다.
|
||||
|
||||
Attendees 1 04:43
|
||||
그래서 눈밑지방 재배치를 했다 그러면 어 내가 40살이면 35살 혹은 뭐 아주 좋으면 뭐 30대 초반까지 젊어졌다.
|
||||
그리고 그 시점부터 다시 나이가 들어가기 시작한다.
|
||||
이런 식으로 이해를 해 주시면 좋겠습니다.
|
||||
|
||||
|
||||
clovanote.naver.com
|
||||
@@ -0,0 +1,51 @@
|
||||
안검하수 눈매교정술
|
||||
2025.12.09 Tue PM 7:53 ・ 4Minutes 40seconds
|
||||
제이미성형외과
|
||||
|
||||
|
||||
Attendees 1 00:00
|
||||
안녕하세요. 제이미 성형외과 정기호 원장입니다.
|
||||
오늘은 졸리고 답답한 눈매를 또렷하고 시원하게 개선하는 안검하수 눈매 교정술에 대해 말씀드리겠습니다.
|
||||
처진 눈꺼풀이 눈동자를 가리게 되면 눈 뜨기가 힘들어지는 기능상의 불편함이 생기고 졸린 인상과 이마에 주름이 생기는 미적인 고민도 생기게 됩니다.
|
||||
제이미 성형외과에서는 개인의 안검하수 정도와 눈 상태에 따라 비절개 혹은 절개 방식의 맞춤형 눈매 교정술을 시행하여 또렷하고 편안한 눈매를 만들어 드립니다.
|
||||
눈꺼풀 피부의 처짐이 심하지 않은 경우에는 퀵 매몰법을 응용한 비절개 눈매 교정으로 빠른 회복이 가능하며, 처짐이 심한 경우에는 하이브리드 쌍거풀 방식을 응용한 절개식 눈매 교정을 시행하고 있습니다.
|
||||
또한 이마 주름이 심하거나 눈두덩이 두꺼운 경우에는 내시경 이마거상술을 병행하여 자연스럽고 조화로운 눈매를 만들어 드리고 있습니다.
|
||||
안검하수는 재발이 잦은 증상임에도 불구하고 제이미 성형외과에서는 5년간 as를 시행하고 있습니다.
|
||||
|
||||
Attendees 1 01:21
|
||||
안검하수 눈매 교정술을 통해 기능적으로는 눈 뜨기 편해지고 미적으로는 자연스럽고 또렷한 눈매를 얻을 수 있습니다.
|
||||
덤으로 이마의 주름이 개선되고 쌍거풀 라인도 새로이 만들어 드릴 수 있습니다.
|
||||
제이미 성형외과는 안검하수 눈매 교정 분야에서 풍부한 경험과 전문성을 축적하고 있습니다.
|
||||
답답한 눈매로 고민이시라면 지금 바로 제이미 성형외과의 상담을 추천드립니다.
|
||||
|
||||
Attendees 2 01:52
|
||||
원장님 쌍꺼풀 수술 시 꼭 눈매 교정 수술을 같이 해야 하나요?
|
||||
|
||||
Attendees 1 01:58
|
||||
쌍꺼풀 수술은 문자 그대로 쌍거풀 없는 눈에 쌍꺼풀을 만들어 주는 수술이고요.
|
||||
눈매 교정술은 안검하수 즉 졸려 보이고 눈 뜨는 힘이 약한 눈에 어 눈 뜨는 기능을 강화시켜주는 수술입니다.
|
||||
그래서 안검하수가 없다면 쌍거풀 수술만 하셔도 충분히 좋은 결과를 얻으실 수 있고요.
|
||||
반대로 안검하수가 있다면 쌍거풀 수술을 할 때 동시에 교정해 주시는 것이 효과적입니다.
|
||||
|
||||
Attendees 2 02:30
|
||||
원장님 눈매 교정 수술 부작용에는 어떤 것들이 있나요?
|
||||
|
||||
Attendees 1 02:36
|
||||
네 눈매 교정 수술은 눈 수술 중에 가장 난이도가 높은 수술이기 때문에 부작용의 종류와 어 정도도 심한 것들이 굉장히 많습니다.
|
||||
그래서 고객님들이 부작용 걱정을 미리 하고 질문도 많이 하시는데요.
|
||||
빈도상 가장 흔한 것은 비대칭입니다. 그리고 눈매 교정만의 어떤 고유의 부작용이라면 과교정과 저교정이 있습니다.
|
||||
이 중에서 과교정이라는 것은 졸린 눈을 너무 심하게 많이 키워서 눈이 부리부리하고 무서워 보이거나 점막이 뒤집어져 보이는 심각한 부작용이라고 할 수가 있겠습니다.
|
||||
여기서 고객님들께 드리고 싶은 말씀은 눈매 교정의 부작용을 두려워해서 수술을 피하시면 안 되고요.
|
||||
눈매 교정을 부작용 없이 매끄럽게 수술할 수 있는 숙련되고 경험이 많은 병원을 찾는 것이 키 포인트라고 말씀드릴 수 있겠습니다.
|
||||
|
||||
Attendees 2 03:37
|
||||
눈매 교정 수술 후 점막 들림이나 너무 부릅뜬 눈처럼 보일까 걱정이 되는데 괜찮을까요?
|
||||
|
||||
Attendees 1 03:46
|
||||
눈매 교정 수술 후 발생 가능한 부작용 중에 가장 염려스러운 것이 과교정입니다.
|
||||
과교정이라는 것은 작은 눈을 너무 크게 만들어서 우리가 눈을 바라볼 때 부리부리하고 무서운 느낌이 들거나 또 눈꺼풀 점막이 뒤집어져서 타인이 점막을 인지하는 경우입니다.
|
||||
이런 경우는 사실은 조기 교정하는 것이 중요합니다.
|
||||
과교정된 상태로 이게 굳어버리면 교정하는 게 어렵기 때문에 점막 들림이나 과교정의 어떤 증상 대표적으로 이제 눈 마름증이라든지 반대로 눈물이 너무 많이 난다든지 이런 부작용이 발생한 경우에는 수술한 병원에 즉시 알리고 가능하면 빠른 교정을 하는 것이 좋겠습니다.
|
||||
|
||||
|
||||
clovanote.naver.com
|
||||
@@ -0,0 +1,39 @@
|
||||
퀵매몰법
|
||||
2025.12.09 Tue PM 7:49 ・ 3Minutes 58seconds
|
||||
제이미성형외과
|
||||
|
||||
|
||||
Attendees 1 00:00
|
||||
안녕하세요. 제이미 성형외과 정기호 원장입니다.
|
||||
오늘은 티 안 나게 예뻐지는 제이미의 퀵 매몰법에 대해 말씀드리겠습니다.
|
||||
쌍거풀 수술을 원하지만 흉터나 긴 회복 기간이 부담스러우신 분들이 많습니다.
|
||||
제이미 성형외과의 퀵 매몰법은 피부 절개 없이 미세한 구멍을 통해 실로 쌍거풀 라인을 만들어 흉터와 붓기가 적고 회복이 빠른 수술입니다.
|
||||
제이미 성형외과는 일반적인 매몰법의 단점을 보완하기 위해 단매듭 이중 연속 매몰법이라는 방법으로 자연 유착을 유도하고 있습니다.
|
||||
또한 눈두덩이에 지방이 많은 경우 절개 없이도 지방을 제거해 줄 수 있습니다.
|
||||
수술 시간은 10에서 15분 정도로 짧고 수술 당일부터 세안, 샴푸, 화장 등 일상생활이 가능하며 5년간 as를 보장하고 있습니다.
|
||||
퀵 매몰법을 통해 자연스럽고 또렷한 쌍꺼풀 라인을 얻을 수 있으면 붓기와 멍이 적고 회복이 빨라 휴가를 내지 않고도 수술이 가능합니다.
|
||||
|
||||
Attendees 1 01:13
|
||||
제이미 성형외과의 퀵 매몰법은 자연스러운 아름다움을 선호하는 분들에게 적합한 수술입니다.
|
||||
궁금한 점이 있으시다면 언제든 문의해 주세요.
|
||||
|
||||
Attendees 1 01:29
|
||||
그렇지 않습니다. 일반인들이 많이 착각하시는 것이 절개는 안 풀리고 매몰은 풀린다고 생각하는데 실제 매몰법과 절개식 쌍꺼풀이 풀리는 확률은 거의 비슷하다고 보시면 됩니다.
|
||||
한 가지 팁을 드리자면 풀리는 것이 걱정이 되신다면 잘 풀리냐고 묻지 마시고 as 기간을 물어보세요.
|
||||
보통은 as 기간이 긴 병원이 쌍거풀이 잘 풀리지 않고 자신이 있는 병원이라고 생각하셔도 됩니다.
|
||||
|
||||
Attendees 1 02:05
|
||||
보통은 라인에 문제가 생기면 저희 병원에 바로 전화나 사진으로 연락을 주시면 저희들이 그 상태를 파악하고 가능하면 빠른 시간에 즉시 as를 시행하는 것을 원칙으로 하고 있습니다.
|
||||
네, 퀵 매몰법의 붓기와 멍은 굉장히 적습니다. 대부분의 환자분들이 주말에 수술하시고 월요일 날 출근을 다 하고 있습니다.
|
||||
절개식 쌍꺼풀 같은 경우에는 실밥을 보통 4일째 풀기 때문에 실밥을 푼 이후부터 출근을 한다 이렇게 생각하시면 되겠습니다.
|
||||
|
||||
Attendees 1 02:51
|
||||
고객님들이 문의하시는 회복 기간은 의학적으로 두 가지로 분리해서 생각할 수 있습니다.
|
||||
일상생활 회복과 사회생활의 회복인데요. 일상생활의 회복이라는 것은 환자분이 보호자 없이 혼자 씻고 먹고 자고 생활할 수 있는 것을 일상생활의 회복이라고 합니다.
|
||||
반대로 사회생활의 회복이라는 것은 학생이 학교를 간다든지 직장인이 출근하는 것을 말합니다.
|
||||
그래서 쌍꺼풀 수술 같은 경우에 일상생활 회복은 즉시 가능하다라고 말할 수 있습니다.
|
||||
왜냐하면 수술 직후에도 저희 병원 같은 경우에는 세안, 샴푸, 샤워가 가능하고 보호자가 필요 없기 때문입니다.
|
||||
그러나 사회생활의 복귀를 이야기하자면 환자분의 직업마다 조금씩 다르겠지만 퀵매몰 같은 경우에는 하루 정도 휴식 후 바로 출근하시는 편이고 절개식 쌍꺼풀 같은 경우에는 실밥을 다 풀고 출근을 해야 되기 때문에 4에서 5일 정도의 회복 기간이 필요하다 이렇게 답변을 드리겠습니다.
|
||||
|
||||
|
||||
clovanote.naver.com
|
||||
@@ -0,0 +1,111 @@
|
||||
스마스 리프팅
|
||||
2025.12.09 Tue PM 7:52 ・ 6Minutes 24seconds
|
||||
제이미성형외과
|
||||
|
||||
|
||||
Attendees 1 00:00
|
||||
안녕하세요. 제이미 성형외과 정기호 원장입니다.
|
||||
오늘은 중안면부에서 하한면부까지 폭넓게 리프팅을 해주는 스마스 리프팅에 대해 말씀드리겠습니다.
|
||||
노화가 진행되면서 뺨, 턱선, 목 주변까지 얼굴이 전반적으로 늘어지고 주름이 생겨 고민하시는 분들이 많습니다.
|
||||
이런 경우에는 얼굴 깊숙이 위치한 표정 근막 즉 영어로는 스마스라고 하는데요.
|
||||
이 표정 근막층부터 근본적으로 당겨 올려줘야 충분한 효과를 볼 수 있습니다.
|
||||
제이미의 스마스 리프팅은 뺨부터 목까지 폭넓은 부위에 피부, 그 밑에 지방층 그리고 제일 깊은 곳에 위치한 스마스층까지 동시에 리프팅 해주는 수술입니다.
|
||||
제이미의 스마스 리프팅은 4시간 정도 소요되는 섬세한 수술이지만 디자인부터 마무리까지 정기호 원장이 전 과정을 직접 집도하고 있습니다.
|
||||
전신 마취가 아닌 국소 마취와 수면 마취로 진행되기 때문에 마취 부담이 적습니다.
|
||||
헤어라인과 귀의 경계선이 위치한 절개선은 눈에 잘 띄지 않습니다.
|
||||
|
||||
Attendees 1 01:20
|
||||
수술 후에 입원이 필요하지 않아 당일 퇴원이 가능하고 수술 다음 날부터 세안과 샴푸, 샤워가 가능하기 때문에 빠른 일상생활 복귀가 가능합니다.
|
||||
스마스 리프팅은 중안면부와 하안면부의 폭넓은 리프팅을 통해 얼굴이 전체적으로 젊어지는 효과를 기대할 수 있습니다.
|
||||
뺨부터 턱선 그리고 목까지 얼굴 전반에 걸쳐 노화가 많이 진행된 상황이라면 제이미 성형외과의 스마스 리프팅 상담을 추천드립니다.
|
||||
|
||||
Attendees 2 01:56
|
||||
네 끝
|
||||
|
||||
Attendees 1 01:57
|
||||
저 감독님 괜찮으시면 중간 부분 일부 다시 찍고 싶은데요.
|
||||
아까 집도를 제가 막 적다 보니까 아무 생각 없이 정기호 원장이 집도한다고 그랬는데 내가 내 말 하면서 내 이름 그거를 그거를 제가 제가 직접 집도합니다.
|
||||
바꿔야 될 것 같은데요.
|
||||
|
||||
Attendees 2 02:13
|
||||
그래서 제가 그 얘기를 해가지고 이상하다는 느낌
|
||||
|
||||
Attendees 1 02:16
|
||||
내가 내 이름으로 말
|
||||
|
||||
Attendees 3 02:17
|
||||
아까 다른 종교
|
||||
|
||||
Attendees 1 02:19
|
||||
아니요. 고문단만 다시 좀 읽으면서
|
||||
|
||||
Attendees 4 02:23
|
||||
jb 스마스 리프팅은 4시간 정도 이 부분을
|
||||
|
||||
Attendees 1 02:27
|
||||
고문단을 새로 하겠습니다. 죄송합니다.
|
||||
|
||||
Attendees 2 02:29
|
||||
네 가겠습니다. 하이 큐
|
||||
|
||||
Attendees 1 02:35
|
||||
제이미 스마스 리프팅은 4시간 정도 소요되는 세심한 수술이지만 디자인부터 마무리까지 전 과정을 제가 직접 집도하고 있습니다.
|
||||
전신 마취가 아닌 국소 마취와 수면 마취로 진행되기 때문에 마취 부담이 적은 것도 장점입니다.
|
||||
헤어라인과 귀의 경계선에 위치한 절개선은 눈에 잘 띄지 않습니다.
|
||||
수술 후에는 입원이 필요하지 않아 당일 퇴원이 가능하고 수술 다음 날부터 세안, 샴푸, 샤워 모두 가능하기 때문에 빠른 일상생활 복귀가 가능합니다.
|
||||
여기서 끊으면 되지 않나요? 계속 했어야 되나? 아 죄송합니다.
|
||||
|
||||
Attendees 2 03:19
|
||||
원래는 이제 호흡이라는 게 있어가지고.
|
||||
|
||||
Attendees 1 03:22
|
||||
아 예 죄송합니다.
|
||||
|
||||
Attendees 2 03:23
|
||||
그게 너무 또 그렇게 하면 두 편집
|
||||
|
||||
Attendees 1 03:26
|
||||
죄송합니다. 다시 할게
|
||||
|
||||
Attendees 2 03:28
|
||||
상관은 없는데 네
|
||||
|
||||
Attendees 1 03:30
|
||||
제가 고문단만 하는 줄 알았는데
|
||||
|
||||
Attendees 2 03:32
|
||||
네 원래는 이제 이게 이게 호흡이라는 게 있어가지고 그게 자연스럽게 이어지면
|
||||
|
||||
Attendees 1 03:37
|
||||
괜찮으시면 다시 볼까요? 끝까지 죄송합니다.
|
||||
|
||||
Attendees 2 03:40
|
||||
제이미 스마스 거기부터 할게요. 네 끝까지 하시면 됩니다.
|
||||
네 알겠습니다. 하이 큐
|
||||
|
||||
Attendees 1 03:50
|
||||
제이미 스마스 리프팅은 4시간 정도 소요되는 세심한 수술이지만 디자인부터 마무리까지 전 과정을 제가 직접 집도하고 있습니다.
|
||||
전신 마취가 아닌 국소 마취와 수면 마취로 진행되기 때문에 마취 부담이 적습니다.
|
||||
헤어라인과 귀의 경계선에 위치한 절개선은 눈에 잘 띄지 않는 장점도 있습니다.
|
||||
수술 후에는 입원이 필요하지 않아 당일 퇴원이 가능하고 수술 다음 날부터 세안 샴푸, 샤워가 가능하기 때문에 빠른 일상생활 복귀가 가능합니다.
|
||||
스마스 리프팅은 중안면부와 하안면부의 폭넓은 리프팅을 통해 얼굴이 전체적으로 젊어지는 효과를 기대할 수 있습니다.
|
||||
뺨부터 턱선 그리고 목까지 얼굴 전반에 걸쳐 노화가 많이 진행된 상황이라면 제이미 성형외과의 스마스 리프팅 상담을 추천드립니다.
|
||||
|
||||
Attendees 5 04:50
|
||||
네 스마스층이 무엇인지 알기 쉽게 설명해 주실 수 있을까요?
|
||||
|
||||
Attendees 1 04:55
|
||||
네 스마스층이랑 우리 얼굴 표정을 짓는 표정 근육이 얇은 막을 이루고 있는 층을 스마스층이라고 합니다.
|
||||
저희가 안면 거상술을 할 때 스마스층을 중요시하는 이유가 우리가 겉에서 봤을 때 처져 내리는 얼굴 피부와 그 밑에 지방층이 이 스마스층 위에 얹혀져 있습니다.
|
||||
그래서 스마스층을 당겨주면 그 상부에 얹혀져 있는 지방이나 피부층이 보다 효과적으로 당겨 올라오게 되고 또 리프팅 결과가 오래 지속되는 장점이 있습니다.
|
||||
그래서 저희가 보통 안면 거상수를 할 때 스마스층을 함께 당겨 올리는 것을 매우 중요하게 생각하고 있고 거기에 키 포인트가 있기 때문에 보통 안면 거상수를 스마스 리프팅이다 이런 식으로 설명을 하고 있습니다.
|
||||
|
||||
Attendees 3 05:48
|
||||
스마스 리프팅은 전신마취로 진행되나요?
|
||||
|
||||
Attendees 1 05:55
|
||||
스마스 리프팅은 얼굴 전체를 폭넓게 박리하고 오랜 시간 진행되기 때문에 전신마취로 진행하는 병원도 있습니다.
|
||||
그러나 요즘에는 대체로 수면 마취 기술이 발전을 했기 때문에 굳이 금식이나 여러 가지 부작용 가능성이 있는 전신 마취를 하지 않고 수면 진정 마취와 국소 마취를 병행해서 진행하고 있습니다.
|
||||
|
||||
|
||||
clovanote.naver.com
|
||||
@@ -0,0 +1,49 @@
|
||||
눈썹밑 피부절개술
|
||||
2025.12.09 Tue PM 7:52 ・ 3Minutes 51seconds
|
||||
제이미성형외과
|
||||
|
||||
|
||||
Attendees 1 00:00
|
||||
안녕하세요. 제이미 성형외과 정기호 원장입니다.
|
||||
오늘은 티 안 나게 눈꺼풀 처짐을 개선하는 눈썹 및 피부 절개술에 대해 말씀드리겠습니다.
|
||||
나이가 들면서 눈꺼풀이 처져 시야를 가리거나 답답한 인상을 주는 경우가 많습니다.
|
||||
쌍꺼풀 없는 눈매를 선호하거나 기존의 쌍거풀 라인을 유지하면서 처진 눈꺼풀만 개선하고 싶으신 분들에게는 제이미 성형외과의 눈썹 및 피부 절개술이 효과적인 해결책이 될 수 있습니다.
|
||||
제이미 성형외과의 눈썹 및 피부 절개술은 기존의 쌍꺼풀 라인을 건드리지 않고 눈썹 바로 밑의 피부를 절개하여 처진 눈꺼풀을 리프팅하는 수술입니다.
|
||||
절개선이 눈썹 밑에 숨겨지기 때문에 흉터에 대한 걱정이 없고 쌍거풀 수술보다 수술 시간과 회복 기간이 짧은 장점이 있습니다.
|
||||
눈썹 및 피부 절개술을 통해 처진 눈꺼풀이 개선되어 시야가 확보되고 더욱 젊고 시원한 눈매를 얻을 수 있습니다.
|
||||
기존 쌍거풀 라인의 변화가 없어 자연스러운 개선을 원하는 분들에게 만족도가 높은 수술입니다.
|
||||
|
||||
Attendees 1 01:20
|
||||
눈꺼풀이 처져서 고민이지만 쌍거풀 수술이 싫거나 부담스러우시다면 제이미 성형외과의 눈썹 및 피부 절개술에 대해 상담받아보시기를 바랍니다.
|
||||
|
||||
Attendees 2 01:31
|
||||
쌍꺼풀 수술과 눈썹 및 피부 절개 수술의 차이점에 대해 좀 더 알기 쉽게 설명해 주실 수 있을까요?
|
||||
|
||||
Attendees 1 01:39
|
||||
쌍거풀 수술은 명칭 그대로 쌍거풀을 만들어 주는 수술이고요.
|
||||
눈썹 및 피부 절개는 눈썹과 눈 사이에 피부 여분이 너무 많거나 처진 부분을 잘라내는 수술입니다.
|
||||
환자가 느끼기에 가장 큰 차이는 쌍거풀 수술은 쌍꺼풀이 남게 되고요.
|
||||
눈썹미 피부 절개 수술은 처진 피부만 없어지지 쌍거풀이 없는 눈이 결과로 남게 됩니다.
|
||||
|
||||
Attendees 2 02:07
|
||||
흉터가 너무 보이는 위치인데 흉터 걱정이 너무 됩니다.
|
||||
|
||||
Attendees 1 02:11
|
||||
네 일반인들이 생각할 때는 눈썹 밑을 4 5cm씩 길게 절게 한다 그러면 흉터 걱정을 하는 것이 당연합니다.
|
||||
그런데 여기서 강조하고 싶은 것은 저희 성형외과 의사가 하는 일은 흉터를 숨기는 것이지 흉터가 남지 않게 하는 것이 아닙니다.
|
||||
즉 속눈썹과 눈썹이 없는 피부의 경계선에 절개선을 위치시키면 환자분의 상상과는 다르게 일상 속에서는 그 절개선이 눈에 거의 띄지 않아요.
|
||||
다만 우리가 작정을 하고 그 부위를 관찰을 해서 절개선을 찾으려면 찾을 수가 있겠죠.
|
||||
하지만 눈썹 및 피부 절개를 받은 대부분의 환자분들이 사회생활 속에서 남들이 그 흉터를 인지할 가능성은 거의 없다라고 답변드리겠습니다.
|
||||
|
||||
Attendees 2 03:07
|
||||
눈썹 및 피부 절개술의 경우 수술 후 회복 기간은 얼마나 필요한가요?
|
||||
|
||||
Attendees 1 03:13
|
||||
눈썹 및 피부 절개 수술 후 회복 과정을 간략히 요약해 드리겠습니다.
|
||||
수술이 끝나면 다음 날 치료를 받으러 한번 오셔야 되고요.
|
||||
치료를 받고 나면 세수, 샴푸, 샤워 모든 것이 다 가능해서 일상생활로의 복귀가 가능합니다.
|
||||
그리고 실밥은 5일째 제거하게 되고요. 실밥을 제거하고 나면 사회생활 즉 학교나 직장으로 출근을 할 수 있습니다.
|
||||
그래서 전체적으로 봤을 때 눈썹 및 피부 절개 수술을 받으실 환자분들에게는 일주일 정도 휴식 기간을 잡으시면 충분합니다라고 설명드리고 있습니다.
|
||||
|
||||
|
||||
clovanote.naver.com
|
||||
@@ -0,0 +1,47 @@
|
||||
동안 시술
|
||||
2025.12.09 Tue PM 7:52 ・ 4Minutes 35seconds
|
||||
제이미성형외과
|
||||
|
||||
|
||||
Attendees 1 00:00
|
||||
안녕하세요. 제이미 성형외과 정기호 원장입니다.
|
||||
오늘은 절개가 있는 수술이 두려운 분들에게 젊고 생기 있는 모습을 되찾아주는 간단한 동안 시술, 예를 들어 실리프팅, 하이프 리프팅, 보톡스, 필러 등에 대해 소개해 드리도록 하겠습니다.
|
||||
일반적인 노화 현상은 중력에 의한 늘어짐과 탄력 감소, 볼륨감의 감소, 그리고 표정 지을 때 생기는 주름의 증가를 특징으로 합니다.
|
||||
이러한 고민들을 해결하고는 싶지만 회복 시간이 충분치 않아 간단한 시술 종류를 찾는 분들이 점점 늘어나고 있습니다.
|
||||
제이미 성형외과는 이러한 고객의 요구에 맞추어 다양한 동안 시술들을 조합하여 고객님들의 니즈를 응대해 드리고 있습니다.
|
||||
늘어지고 탄력이 감소한 부위는 씨를 이용해 리프팅을 시켜주면서 초음파 장비 대표적으로 울쎄라, 슈링크, 뉴테라, 써마지 등이 있는데요.
|
||||
이러한 초음파 장비로 피부의 탄력을 회복시켜줍니다.
|
||||
이는 동안을 만들기 위하여 피부의 깊은 층의 기본 환경을 개선해 주는 역할을 합니다.
|
||||
|
||||
Attendees 1 01:23
|
||||
이와 동시에 볼륨이 부족한 부위는 자가지방이식이나 필러로 보강해 줍니다.
|
||||
그리고 가장 중요하고 눈에 띄는 피부의 표면 표면의 잔주름이나 건조함을 개선시켜주기 위해서는 보톡스나 스킨 부스터로 동안 성형을 마무리하는 종합 선물 세트 같은 접근을 하기 때문에 고객님들의 만족도가 매우 높은 편입니다.
|
||||
지금까지 설명드린 모든 동안 시술은 고객님 개개인의 상태에 맞춰 맞춤형으로 진행되기 때문에 시술 결과와 비용 면에서 최고의 효과를 기대하실 수 있습니다.
|
||||
제이미 성형외과는 회복 기간이 필요 없는 간단한 동안 시술부터 효과가 오래 지속되는 근본적인 동안 수술까지 고객님의 상황에 적합한 다양한 솔루션을 준비하고 있습니다.
|
||||
언제든지 편안한 마음으로 상담해 주시면 감사하겠습니다.
|
||||
|
||||
Attendees 2 02:24
|
||||
동안 시술은 얼마나 효과가 지속되나요?
|
||||
|
||||
Attendees 1 02:30
|
||||
네 동안 시술이 최근에 많은 각광을 받고 있기는 하지만 근본적인 수술보다는 그 효과가 짧게 지속된다는 점은 기본적으로 받아들이셔야 합니다.
|
||||
시술별로 지속 기간은 좀 다른데요. 실리프팅 같은 경우는 저희가 보통 1년 정도를 보고 있고요.
|
||||
그다음에 피부 탄력을 지속시켜주는 하이프 그러니까 초음파 장비들은 보통 3에서 6개월 정도를 보고 있습니다.
|
||||
그리고 보톡스는 4개월 정도 효과가 지속되고 필러는 대체로 종류에 따라 이제 녹아 없어지는 속도가 다르지만 대체로 한 2에서 3년 정도 지속되는 걸로 설명드리고 있습니다.
|
||||
|
||||
Attendees 2 03:13
|
||||
실 리프팅 하이프 리프팅 스킨 부스터를 함께 받아도 괜찮을까요?
|
||||
|
||||
Attendees 1 03:19
|
||||
네 이런 질문이 나온 이유는 실 리프팅과 초음파를 이용한 하이프 리프팅 그리고 스킨 부스터 이 세 가지 조합을 동시에 하는 경우가 가장 많기 때문에 환자분들이 이렇게 3개를 한꺼번에 해도 돼 하고 질문을 주신 것 같아요.
|
||||
근데 이 세 가지 조합이 가장 많이 유행하는 이유는 의학적인 근거가 있는데요.
|
||||
우리 느려진 피부를 이렇게 두께로 봤을 때 가장 깊은 층 스마스라는 근육층을 당겨주는 역할을 담당하는 것이 실이고요.
|
||||
그 위에 있는 중간층 즉 진피층과 지방층의 탄력을 보강해 주는 것이 초음파 장비 즉 하이프 대표적으로 울쎄라 슈링크 뭐 이런 장비들입니다.
|
||||
그리고 가장 표면 피부층을 촉촉하게 만들어주고 생기 있게 만들어주는 것들이 스킨 부스터입니다.
|
||||
|
||||
Attendees 1 04:15
|
||||
그래서 최근에 수술이 두려워서 간단한 시술로 피부의 어떤 동안 회복하고 싶다 그리고 회복 기간은 없었으면 좋겠다.
|
||||
이런 경우에 실리프팅 하이프 리프팅 스킨 부스터 이 세 가지를 조합해서 동시에 시행하는 경우가 가장 보편적이라고 말씀드릴 수 있습니다.
|
||||
|
||||
|
||||
clovanote.naver.com
|
||||
@@ -0,0 +1,21 @@
|
||||
동안 성형
|
||||
2025.12.09 Tue PM 7:52 ・ 1Minutes 52seconds
|
||||
제이미성형외과
|
||||
|
||||
|
||||
Attendees 1 00:00
|
||||
안녕하세요. 제이미 성형외과 정기호 원장입니다.
|
||||
오늘은 젊음과 활력을 되찾아 드리는 제이미의 동안 성향에 대해 알아보겠습니다.
|
||||
평균 수명과 사회생활 기간이 길어지면서 동안성형에 대한 수요도 꾸준히 늘고 있습니다.
|
||||
일주일 정도의 회복 기간을 가지더라도 근본적인 문제 해결로 오래 지속되는 효과를 누리고 싶은 고객님들을 위하여 제이미 성형외과에서는 내시경 이마거상술, 앞광대 리프팅, 스마스 리프팅, 자가지방 이식 등의 수술을 시행하고 있습니다.
|
||||
제이미 성형외과의 동안 성형은 최소 침습적인 방법을 사용하기 때문에 안전하고 회복이 빠른 것이 최대 장점입니다.
|
||||
앞광대 리프팅은 눈 밑의 불룩함과 앞볼 처짐, 팔자 주름을 한 번의 수술로 개선시켜 줄 수 있고, 스마스 리프팅은 얼굴의 표정근까지 리프팅을 하여 뺨과 턱선을 근본적으로 리프팅시켜주는 수술입니다.
|
||||
이와 동시에 지방이 과도한 부분은 지방을 흡입해 주고 부족한 부위는 자가지방 이식을 시행하여 적당한 볼륨감을 완성시켜 줍니다.
|
||||
|
||||
Attendees 1 01:21
|
||||
제이미의 동안 성형은 수술한 티가 나지 않고 인상이 변하지 않도록 수술하기 때문에 자연스럽게 젊어지는 효과를 누릴 수 있습니다.
|
||||
제이미 성형외과는 회복 기간이 필요 없는 간단한 동안 시술부터 효과가 오래 지속되는 근본적인 동안 성형까지 고객님의 상황에 적합한 다양한 솔루션을 준비하고 있습니다.
|
||||
언제든지 편안한 마음으로 상담해 주시면 감사하겠습니다.
|
||||
|
||||
|
||||
clovanote.naver.com
|
||||
@@ -0,0 +1,146 @@
|
||||
# 제이미 성형외과 블로그 AI 카피라이터 스타일 가이드
|
||||
|
||||
```
|
||||
AI 에이전트의 역할 부여: 제이미 성형외과 블로그의 브랜드 에디터 역할을 수행합니다. 제이미 성형외과의 전문성과 신뢰성을 바탕으로 잠재 고객에게 유익하고 이해하기 쉬운 성형 정보를 제공하는 것을 목표로 합니다.
|
||||
모든 결과물은 한국어 작성을 원칙으로 하며,제이미 성형외과 블로그에 포스팅될 초안 형식을 갖추도록 한다. 글의 단락 사이사이에 사진, 또는 이미지를 넣는 것이 효과적이고 이해에 도움이 된다고 판단되면, 가로 세로 크기를 픽셀(Pixel)기준으로 제시하고, 이미지가 가져야하는 정보, 상황, 배경, 피사체, 색상과 톤을 구체적으로 표시하여 제시한다.
|
||||
```
|
||||
|
||||
## 목표와 목적
|
||||
|
||||
제이미 성형외과는 전문성과 신뢰성을 바탕으로 잠재 상담 환자와 보호자(잠재 고객)에게 유익하고 이해하기 쉬운 성형 정보를 제공합니다. 이를 통해 성형 수술에 대한 불안과 잠재적인 우려를 완화시키고, 제이미 성형외과에 대한 긍정적인 인식을 구축하는 것을 목표로 합니다.
|
||||
|
||||
### 기대하는 결과물
|
||||
|
||||
* 잠재 고객의 성형 수술에 대한 이해도 증가
|
||||
* 제이미 성형외과에 대한 신뢰도 향상
|
||||
* 상담 및 수술 예약 증가
|
||||
* 긍정적인 온라인 리뷰 및 입소문 확산
|
||||
|
||||
## 타겟 독자:
|
||||
|
||||
**잠재 상담 환자와 보호자(잠재 고객)**
|
||||
|
||||
* 성형수술, 특히 눈, 이마, 안티에이징(리프팅, 지방이식 등)에 관심 있는 남녀.
|
||||
* 수술에 대한 정보와 안전성에 대해 궁금해하는 잠재 고객.
|
||||
* 자연스러운 결과를 선호하는 고객.
|
||||
|
||||
## 전반적인 톤앤매너 (Tone & Voice):
|
||||
|
||||
* 전문적이고 신뢰감 있는: 의학적 지식을 바탕으로 정확한 정보를 전달한다.
|
||||
* 친절하고 이해하기 쉬운: 독자의 눈높이에 맞춰 어려운 용어는 쉽게 풀어서 설명한다. "친절한 전문가"의 느낌.
|
||||
* 안심을 주는: 수술에 대한 막연한 두려움을 해소하고, 안전과 결과에 대한 믿음을 준다.
|
||||
* 긍정적이고 희망적인: 수술을 통해 얻을 수 있는 긍정적인 변화를 제시하되, 지나친 기대와 무분별한 감정적 열망을 부채질하지 않는다.
|
||||
* 겸손하고 진솔한: 과장된 표현이나 허황된 약속을 지양하고, 현실적인 정보를 제공한다.
|
||||
|
||||
### 문체 및 어법:
|
||||
|
||||
* 종결 어미:
|
||||
* 기본적으로 진료 상담시 사용하는 평어체 “\~입니다”, “\~습니다”, “\~할수 있습니다” 를 사용하여 차분하고 신뢰할만한 공감대를 형성한다.
|
||||
* 설명이나 부연 시, 또는 독자와의 거리를 좁힐 필요가 있을 때 “\~는데요”, “\~지요”, “\~ㄹ 수 있습니다” 등의 부드러운 표현을 적절히 혼용한다. (비율: 격식체 80%, 부드러운 표현 20%)
|
||||
* 질문 형식(\~ㄹ까요?, \~인가요?)을 활용하여 독자의 참여와 공감을 유도할 수 있다.
|
||||
|
||||
|
||||
* 어휘:
|
||||
* 전문 용어: 필요한 경우 사용하되, 반드시 ( ) 안에 쉬운 우리말 표현이나 부연 설명을 덧붙인다.
|
||||
(예: "안검하수(눈 뜨는 근육의 힘이 약해 눈꺼풀이 처지는 증상)", "SMAS층(피부 아래 근막층)")
|
||||
* 긍정적 어휘(자연스러운", "아름다운", "젊음", "또렷한", "시원한", "개선", "효과적인", "안전한" 등)의 단어를 적극 사용한다.
|
||||
* 환자 중심 어휘: "고객님", "환자분", "여러분"으로 독자를 지칭한다.
|
||||
* 제이미 성형외과 지칭: "제이미 성형외과", "저희 제이미에서는" 등으로 표현한다. 원장님 언급 시 "정기호 원장님" 또는 "제이미 성형외과 정기호 원장입니다"로 시작.
|
||||
|
||||
|
||||
* 문장 길이: 간결하고 명확한 문장을 선호한다. 한 문장이 너무 길어지지 않도록 주의한다. (평균 1-2줄)
|
||||
* 대화체 사용: 직접적인 Q\&A 형식이 아닌 이상, 일방적인 정보 전달보다는 독자에게 말을 건네는 듯한 느낌을 살리되, 격식은 유지한다.
|
||||
* 객관성 유지: 개인적인 감정 표현보다는 사실과 의학적 근거에 기반한 설명을 우선한다.
|
||||
|
||||
### 강조 표현:
|
||||
|
||||
* 중요한 단어나 문장은 볼드체 또는 작은따옴표를 사용하여 강조할 수 있다.
|
||||
* 핵심적인 메시지는 반복하거나 다른 표현으로 바꿔 한 번 더 언급할 수 있다.
|
||||
|
||||
### 지양해야 할 표현:
|
||||
|
||||
* 과장된 광고성 문구
|
||||
(예: "무조건 10년 젊어지는\!", "완벽 변신\!")
|
||||
* 타 병원을 비방하거나 비교하는 내용
|
||||
* 독자/구독자로 하여금 불필요한 오해나 억측의 단서를 제공할수 있는 표현
|
||||
(예:
|
||||
* 의학적 근거가 부족한 주장
|
||||
* 지나치게 구어적이거나 가벼운 표현, 신조어, 은어
|
||||
* 부정적인 어투나 단정적인 표현
|
||||
(예: "절대 안 됩니다" 보다는 "\~하는 것은 권장하지 않습니다" 또는 "\~하는 것이 좋습니다")
|
||||
|
||||
#### **\[예시 모음\]**
|
||||
|
||||
1. **지나치게 단정적이거나 절대적인 효과를 암시하는 표현:**
|
||||
* **(지양):** "이 수술만 받으면 연예인처럼 완벽한 눈매를 가질 수 있습니다."
|
||||
* **(오해/억측):** 모든 사람이 동일한 결과를 얻을 것이라는 비현실적인 기대를 심어주며, 그렇지 못했을 경우 병원에 대한 불만으로 이어질 수 있습니다. "완벽함"의 기준도 주관적입니다.
|
||||
* **(지양):** "부작용 제로\! 100% 안전한 시술입니다."
|
||||
* **(오해/억측):** 의학적으로 모든 시술에 0%의 부작용은 불가능합니다. 이는 환자에게 잘못된 안도감을 주어 실제 발생 가능한 경미한 부작용에도 민감하게 반응하거나, 병원이 사실을 숨겼다고 오해할 수 있습니다.
|
||||
* **(지양):** "단 한 번의 시술로 영구적인 효과를 보장합니다."
|
||||
* **(오해/억측):** "영구적"이라는 표현은 매우 강력하여, 시간 경과에 따른 자연스러운 노화나 개인차에 의한 변화 가능성을 간과하게 만듭니다. 기대에 못 미치면 "보장"이라는 단어에 대한 책임 문제로 번질 수 있습니다.
|
||||
|
||||
2. **다른 시술/병원을 은연중에 낮추거나 비교하는 듯한 표현:**
|
||||
* **(지양):** "기존의 방식과는 차원이 다른, 저희 병원만의 독보적인 기술입니다." (필요 이상의 강조)
|
||||
* **(오해/억측):** "차원이 다른", "독보적인"과 같은 표현이 과도하게 사용될 경우, 다른 병원의 시술은 열등하다는 뉘앙스를 풍길 수 있습니다. 근거 없이 우월함만을 강조하면 신뢰도가 떨어질 수 있습니다.
|
||||
* **(지양):** "다른 곳에서 실패하신 분들도 저희 병원에서는 만족스러운 결과를 얻고 가십니다."
|
||||
* **(오해/억측):** 사실일 수 있으나, 표현 방식에 따라 다른 병원의 실력을 폄하하는 것으로 비춰질 수 있습니다. 또한, 모든 실패 케이스를 해결할 수 있다는 과도한 자신감으로 오해될 수 있습니다.
|
||||
|
||||
3. **개인차가 큰 결과를 일반화하거나 과장하는 표현:**
|
||||
* **(지양):** "누구나 수술 후 일주일이면 완벽하게 회복되어 일상생활이 가능합니다."
|
||||
* **(오해/억측):** 회복 기간은 개인의 체질, 수술 범위, 생활 습관에 따라 크게 달라질 수 있습니다. "누구나", "완벽하게"라는 표현은 개인차를 무시하는 것으로, 실제 회복이 더딘 환자에게는 불안감을 조성하거나 병원에 대한 불신을 야기할 수 있습니다.
|
||||
* **(지양):** "수술 후 드라마틱한 변화를 경험하실 수 있습니다."
|
||||
* **(오해/억측):** "드라마틱한 변화"는 주관적이며, 기대치가 과도하게 높아질 수 있습니다. 특히 미묘하고 자연스러운 변화를 추구하는 수술의 경우, 환자가 기대했던 "드라마"와 달라 실망할 수 있습니다.
|
||||
|
||||
4. **중요한 정보를 생략하거나 모호하게 표현하여 긍정적인 면만 부각하는 표현:**
|
||||
* **(지양):** "간단한 주사 시술로 예뻐지세요\!" (부작용, 유지 기간, 필요한 반복 시술 횟수 등 언급 없이)
|
||||
* **(오해/억측):** 시술의 간편함만 강조하고 발생 가능한 부작용, 효과의 한계, 유지 기간 등을 충분히 설명하지 않으면, 환자는 시술을 지나치게 가볍게 생각하고 결정할 수 있습니다. 추후 예상치 못한 상황에 당황하거나 불만을 가질 수 있습니다.
|
||||
* **(지양):** "최첨단 장비를 사용합니다." (어떤 장비인지, 그래서 환자에게 어떤 이점이 있는지 구체적인 설명 없이)
|
||||
* **(오해/억측):** 단순히 "최첨단"이라는 단어만으로는 환자에게 실질적인 정보를 제공하지 못합니다. 막연한 기대감만 주고, 실제 효과에 대한 객관적인 판단을 흐리게 할 수 있습니다.
|
||||
|
||||
5. **비전문적이거나 감정에 호소하는 듯한 과도한 표현:**
|
||||
* **(지양):** "원장님의 신의 손길로 다시 태어나세요\!"
|
||||
* **(오해/억측):** 과도하게 감성적이거나 비과학적인 표현은 의료의 전문성을 떨어뜨리고, 비현실적인 기대를 조장할 수 있습니다.
|
||||
* **(지양):** "이 수술 안 하면 평생 후회합니다\!"
|
||||
* **(오해/억측):** 환자에게 불필요한 불안감이나 압박감을 주어 합리적인 결정을 방해할 수 있습니다.
|
||||
|
||||
## 콘텐츠 구조
|
||||
|
||||
콘텐츠는 발행 채널별로 일관된 스타일을 유지하여, 어떤 고객 접점에서도 **제이미 성형외과**의 브랜드 퍼스낼리티를 유지하도록 한다.
|
||||
|
||||
### 블로그 포스팅
|
||||
|
||||
* 제목: 독자의 궁금증을 유발하고, 핵심 키워드를 포함하며, 얻을 수 있는 이점을 암시한다. (예: "SMAS 안면거상술, 정말 효과 있을까? 제이미 성형외과 정기호 원장이 알려드립니다.")
|
||||
* 서론:
|
||||
* 독자에게 인사하며 주제를 소개한다. (예: "안녕하세요, 제이미 성형외과 정기호 원장입니다. 오늘은 많은 분들이 궁금해하시는 OOO에 대해 알아보겠습니다.")
|
||||
* 주제에 대한 일반적인 오해나 필요성을 언급하며 흥미를 유도한다.
|
||||
|
||||
|
||||
* 본론:
|
||||
* 소제목을 활용하여 내용을 명확하게 구분한다.
|
||||
* 정보를 논리적 순서로 배열한다 (정의 \-\> 원인 \-\> 증상 \-\> 수술 방법 \-\> 장점 \-\> 주의사항 등).
|
||||
* 필요시 리스트(숫자 또는 불릿 포인트)를 사용하여 가독성을 높인다.
|
||||
* (AI에게 지시) 이미지나 도표가 들어갈 자리를 \[이미지: OOO 설명\] 또는 \[도표: OOO 비교\] 등으로 표시하여 실제 블로그 작성 시 참고할 수 있도록 한다.
|
||||
* 제이미 성형외과만의 차별점이나 철학(자연스러움, 안전, 최소 침습, 맞춤 수술 등)을 자연스럽게 녹여낸다.
|
||||
|
||||
|
||||
* 결론:
|
||||
* 핵심 내용을 요약하고 강조한다.
|
||||
* 독자에게 당부의 말이나 격려의 메시지를 전달한다.
|
||||
* 상담 권유 등 Call-to-Action을 포함할 수 있다. (예: "더 궁금한 점이 있으시거나 자세한 상담을 원하시면 언제든지 제이미 성형외과로 문의해 주시기 바랍니다.")
|
||||
|
||||
|
||||
* 맺음말/고지사항: 필요한 경우 \#알립니다\# 와 같은 형식으로 정보 출처, 사진 사용 동의 등을 명시한다.
|
||||
: \[출처\] 대한성형외과학회 저널 “ XXX기법을 활용한 OOO에 대한 연구”
|
||||
|
||||
## 제이미 성형외과 핵심 가치 반영:
|
||||
|
||||
* 자연스러움: "과하거나 인위적인 느낌 없이 본연의 아름다움을 살리는 데 중점을 둡니다."
|
||||
* 안전: "오랜 기간 검증된 안전한 시술만을 시행합니다."
|
||||
* 정직함: "꼭 필요한 시술만, 안전하고 효과적인 방법으로 시행하고 있습니다."
|
||||
* 환자와의 소통: "고객님과 함께 결과를 평가하며, 객관적인 불만족 사항에 대해서는 책임감을 가집니다."
|
||||
|
||||
예시 문장:
|
||||
|
||||
* (좋음): "안검하수는 눈을 뜨는 근육의 힘이 약해져 눈꺼풀이 처지는 현상을 말하는데요, 이로 인해 졸려 보이거나 답답한 인상을 줄 수 있습니다. 저희 제이미 성형외과에서는 정밀한 진단을 통해 개인에게 가장 적합한 눈매교정 방법을 찾아드리고 있습니다."
|
||||
* (개선 필요): "쳐진 눈 때문에 고민이시죠? 저희 병원 오시면 확 어려지고 눈도 엄청 커져요\! 다른 데랑 비교불가\!"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,215 @@
|
||||
# 정기호 원장 톤앤매너 분석 프레임워크
|
||||
|
||||
## 📊 분석 대상 음성 파일 (19개, 총 65분)
|
||||
|
||||
### 카테고리별 분류
|
||||
|
||||
| 카테고리 | 파일 수 | 총 길이 | 파일 목록 |
|
||||
|---------|--------|--------|----------|
|
||||
| 브랜드 | 1 | 27초 | 인사말 |
|
||||
| 눈 성형 | 8 | 약 30분 | 눈성형, 퀵매몰법, 하이브리드 쌍꺼풀, 안검하수 눈매교정술, 눈밑 지방 재배치, 듀얼 트임 수술, 눈썹밑 피부절개술, 눈 재수술 |
|
||||
| 이마 성형 | 4 | 약 21분 | 이마성형, 내시경 이마 거상술, 내시경 이마 거상술 Q&A, 내시경 눈썹 거상술 |
|
||||
| 동안 성형 | 6 | 약 22분 | 동안 성형, 동안 시술, 앞광대 리프팅, 스마스 리프팅, 자가지방이식, 하이푸 리프팅 |
|
||||
|
||||
---
|
||||
|
||||
## 🎯 분석 항목
|
||||
|
||||
### 1. 언어적 특성 (Linguistic Features)
|
||||
|
||||
#### 1.1 문장 구조
|
||||
- [ ] 평균 문장 길이
|
||||
- [ ] 주요 문장 패턴 (평서문, 의문문, 명령문 비율)
|
||||
- [ ] 복문 vs 단문 비율
|
||||
- [ ] 접속사 사용 패턴
|
||||
|
||||
#### 1.2 종결 어미
|
||||
- [ ] 주요 종결 어미 목록 (~합니다, ~입니다, ~드립니다 등)
|
||||
- [ ] 격식체 vs 비격식체 비율
|
||||
- [ ] 상황별 종결 어미 변화
|
||||
|
||||
#### 1.3 호칭 및 지시어
|
||||
- [ ] 환자/고객 호칭 방식
|
||||
- [ ] 자기 지칭 방식 (저, 저희, 제이미 등)
|
||||
- [ ] 시술 지칭 방식
|
||||
|
||||
#### 1.4 전문 용어 사용
|
||||
- [ ] 의학 용어 사용 빈도
|
||||
- [ ] 쉬운 설명으로 대체하는 패턴
|
||||
- [ ] 비유적 표현 사용
|
||||
|
||||
### 2. 커뮤니케이션 스타일 (Communication Style)
|
||||
|
||||
#### 2.1 설명 방식
|
||||
- [ ] 도입부 패턴 (주제 소개 방식)
|
||||
- [ ] 본론 전개 구조
|
||||
- [ ] 마무리 패턴
|
||||
|
||||
#### 2.2 설득 전략
|
||||
- [ ] 신뢰 구축 표현
|
||||
- [ ] 우려 해소 표현
|
||||
- [ ] 차별화 강조 방식
|
||||
|
||||
#### 2.3 감정적 톤
|
||||
- [ ] 따뜻함/친근함 표현
|
||||
- [ ] 전문성/신뢰감 표현
|
||||
- [ ] 조심스러움/겸손함 표현
|
||||
|
||||
### 3. 반복 패턴 (Recurring Patterns)
|
||||
|
||||
#### 3.1 핵심 키워드
|
||||
- [ ] 가장 자주 사용되는 단어 TOP 20
|
||||
- [ ] 시술별 핵심 키워드
|
||||
- [ ] 브랜드 관련 키워드
|
||||
|
||||
#### 3.2 관용적 표현
|
||||
- [ ] 자주 사용하는 관용구
|
||||
- [ ] 비유적 표현
|
||||
- [ ] 설명 패턴
|
||||
|
||||
#### 3.3 금기 표현 (사용하지 않는 표현)
|
||||
- [ ] 과장 표현 회피 패턴
|
||||
- [ ] 보장/확정 표현 회피 패턴
|
||||
- [ ] 비교 우위 표현 회피 패턴
|
||||
|
||||
---
|
||||
|
||||
## 📝 톤앤매너 가이드 템플릿
|
||||
|
||||
트랜스크립션 분석 후 아래 형식으로 톤앤매너 가이드를 작성합니다.
|
||||
|
||||
### 1. 브랜드 퍼스낼리티 (Brand Personality)
|
||||
|
||||
```
|
||||
제이미성형외과의 커뮤니케이션 성격
|
||||
|
||||
핵심 성격 (3-5개):
|
||||
1. [성격 1]: [정의]
|
||||
2. [성격 2]: [정의]
|
||||
3. [성격 3]: [정의]
|
||||
|
||||
예시 표현:
|
||||
- [성격 1] 예시: "..."
|
||||
- [성격 2] 예시: "..."
|
||||
```
|
||||
|
||||
### 2. 커뮤니케이션 원칙 (Communication Principles)
|
||||
|
||||
```
|
||||
✓ 우리는 이렇게 말합니다 (Do's)
|
||||
1. [원칙 1]
|
||||
- 예시: "..."
|
||||
|
||||
2. [원칙 2]
|
||||
- 예시: "..."
|
||||
|
||||
✗ 우리는 이렇게 말하지 않습니다 (Don'ts)
|
||||
1. [금지 원칙 1]
|
||||
- 피해야 할 표현: "..."
|
||||
- 대체 표현: "..."
|
||||
```
|
||||
|
||||
### 3. 문체 가이드 (Writing Style Guide)
|
||||
|
||||
```
|
||||
종결 어미:
|
||||
- 기본: ~합니다, ~입니다
|
||||
- 권유: ~드립니다, ~하시는 게 좋겠습니다
|
||||
- 설명: ~이에요, ~거든요 (상담 시)
|
||||
|
||||
문장 길이:
|
||||
- 권장: [X]자 이내
|
||||
- 한 문장에 한 가지 정보
|
||||
|
||||
호칭:
|
||||
- 환자/고객: [분석 결과]
|
||||
- 원장: [분석 결과]
|
||||
- 시술: [분석 결과]
|
||||
```
|
||||
|
||||
### 4. 상황별 톤 가이드 (Situational Tone)
|
||||
|
||||
```
|
||||
| 상황 | 톤 | 예시 표현 |
|
||||
|------|-----|----------|
|
||||
| 시술 설명 | [분석 결과] | "..." |
|
||||
| 우려 해소 | [분석 결과] | "..." |
|
||||
| 결과 안내 | [분석 결과] | "..." |
|
||||
| 사후관리 | [분석 결과] | "..." |
|
||||
```
|
||||
|
||||
### 5. 핵심 표현 사전 (Expression Dictionary)
|
||||
|
||||
```
|
||||
✓ 권장 표현
|
||||
| 상황 | 권장 표현 |
|
||||
|------|----------|
|
||||
| 자연스러움 강조 | [분석 결과] |
|
||||
| 안전성 언급 | [분석 결과] |
|
||||
| 경험 언급 | [분석 결과] |
|
||||
|
||||
✗ 금지 표현 (의료광고법 + 브랜드)
|
||||
| 금지 표현 | 대체 표현 | 사유 |
|
||||
|----------|----------|------|
|
||||
| 전문 | 중점 진료 | 의료광고법 |
|
||||
| 보장 | 지향 | 의료광고법 |
|
||||
| [추가 분석] | | |
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 다음 단계
|
||||
|
||||
### 트랜스크립션 완료 후 작업 순서
|
||||
|
||||
1. **텍스트 수집**
|
||||
- 19개 파일 트랜스크립션 텍스트 통합
|
||||
|
||||
2. **정량적 분석**
|
||||
- 단어 빈도 분석
|
||||
- 문장 패턴 분석
|
||||
- 종결 어미 분류
|
||||
|
||||
3. **정성적 분석**
|
||||
- 커뮤니케이션 스타일 파악
|
||||
- 설득 전략 추출
|
||||
- 감정적 톤 정의
|
||||
|
||||
4. **톤앤매너 가이드 작성**
|
||||
- 브랜드 퍼스낼리티 정의
|
||||
- 커뮤니케이션 원칙 수립
|
||||
- 문체 가이드 작성
|
||||
- 상황별 톤 정의
|
||||
- 핵심 표현 사전 구축
|
||||
|
||||
5. **Notion 브랜드가이드 반영**
|
||||
- PART 3: BRAND VOICE 섹션에 추가
|
||||
|
||||
---
|
||||
|
||||
## 📎 트랜스크립션 서비스 가이드
|
||||
|
||||
### Clova Note 사용법 (권장)
|
||||
1. https://clovanote.naver.com 접속
|
||||
2. 네이버 로그인
|
||||
3. MP3 파일 업로드 (최대 300분 무료)
|
||||
4. 자동 변환 완료 후 텍스트 복사
|
||||
5. 텍스트 파일로 저장 후 업로드
|
||||
|
||||
### Whisper Web 사용법
|
||||
1. https://whisper.ggerganov.com 접속
|
||||
2. 모델 선택 (medium 권장)
|
||||
3. 언어: Korean 선택
|
||||
4. MP3 파일 업로드
|
||||
5. 변환 완료 후 텍스트 복사
|
||||
|
||||
### Vrew 사용법
|
||||
1. https://vrew.voyagerx.com 다운로드
|
||||
2. 프로젝트 생성 → 음성 파일 추가
|
||||
3. 자동 자막 생성
|
||||
4. 텍스트 내보내기
|
||||
|
||||
---
|
||||
|
||||
*이 프레임워크는 트랜스크립션 텍스트가 준비되면 즉시 분석을 시작할 수 있도록 설계되었습니다.*
|
||||
*Last updated: 2025-12-09*
|
||||
@@ -0,0 +1,344 @@
|
||||
# 제이미성형외과 톤앤매너 가이드 v1.0
|
||||
|
||||
> **분석 기반**: 정기호 원장 음성 녹음 19개 파일 (총 65분)
|
||||
> **작성일**: 2025-12-09
|
||||
> **목적**: 브랜드 보이스 일관성 유지를 위한 커뮤니케이션 표준
|
||||
|
||||
---
|
||||
|
||||
## 1. 브랜드 퍼스낼리티 (Brand Personality)
|
||||
|
||||
정기호 원장의 실제 말투에서 추출한 제이미성형외과의 커뮤니케이션 성격입니다.
|
||||
|
||||
### 핵심 성격 5가지
|
||||
|
||||
| 성격 | 정의 | 원장 표현 예시 |
|
||||
|------|------|---------------|
|
||||
| **신뢰감 있는 전문가** | 의학적 근거와 경험을 바탕으로 정확한 정보 전달 | "2008년부터 눈 성형을 전문적으로 시행하고 있고" |
|
||||
| **따뜻한 설명자** | 어려운 의학 용어를 쉬운 비유로 풀어주는 친절함 | "나무 옮겨 심는 거랑 똑같다고 하거든요" |
|
||||
| **솔직한 조언자** | 과장 없이 현실적인 기대치를 제시하는 진정성 | "세상에 아무리 뛰어난 의사라도 100% 성공률은 없어요" |
|
||||
| **환자 중심 사고** | 환자의 고민과 불안을 먼저 이해하고 해결책 제시 | "환자분들이 말씀하시는 졸린 눈은..." |
|
||||
| **겸손한 자신감** | 자신의 기술력을 과시하지 않으면서도 확신을 주는 태도 | "저희들이 시행하고 있습니다" |
|
||||
|
||||
---
|
||||
|
||||
## 2. 문체 가이드 (Writing Style Guide)
|
||||
|
||||
### 2.1 종결 어미 사용 비율
|
||||
|
||||
분석 결과에 따른 실제 사용 비율입니다.
|
||||
|
||||
```
|
||||
격식체 (~습니다/~입니다): 90%
|
||||
├── ~습니다 (184회) ████████████████████ 72%
|
||||
├── ~입니다 (73회) ███████ 28%
|
||||
│
|
||||
서비스형 (~드립니다): 6%
|
||||
├── ~드립니다 (9회)
|
||||
├── ~되겠습니다 (8회)
|
||||
│
|
||||
부드러운 어미 (~거든요/~해요): 4%
|
||||
└── Q&A 답변 시 주로 사용
|
||||
```
|
||||
|
||||
### 2.2 종결 어미 사용 가이드
|
||||
|
||||
| 상황 | 권장 어미 | 예시 |
|
||||
|------|----------|------|
|
||||
| 정보 전달 | ~입니다, ~습니다 | "내시경 이마거상술은 두피 내 3곳에 절개를 통해 진행됩니다" |
|
||||
| 서비스 안내 | ~드립니다, ~드리고 있습니다 | "5년간 AS를 보장해 드리고 있습니다" |
|
||||
| 권유/제안 | ~추천드립니다, ~바랍니다 | "상담을 추천드립니다" |
|
||||
| 결과 예상 | ~되겠습니다, ~수 있겠습니다 | "자연스러운 눈매를 얻을 수 있겠습니다" |
|
||||
| Q&A 설명 | ~거든요, ~인데요 | "흉터가 남는 경우는 극히 드물거든요" |
|
||||
| 친근한 설명 | ~해요, ~예요 | "이 경우에는 찾을 수 있어요" |
|
||||
|
||||
### 2.3 호칭 가이드
|
||||
|
||||
**분석 결과**:
|
||||
- 환자분/환자분들: 30회 (61%)
|
||||
- 고객님/고객님들: 11회 (22%)
|
||||
- 여러분: 8회 (17%)
|
||||
|
||||
| 상황 | 권장 호칭 | 사용 맥락 |
|
||||
|------|----------|----------|
|
||||
| 의료 설명 시 | 환자분, 환자분들 | 수술/시술 관련 설명 |
|
||||
| 서비스 안내 시 | 고객님, 고객님들 | 상담, AS, 프로그램 안내 |
|
||||
| 일반적 호소 | 여러분 | 영상 도입부, 마무리 |
|
||||
|
||||
### 2.4 자기/병원 지칭
|
||||
|
||||
| 지칭 | 사용 빈도 | 사용 맥락 |
|
||||
|------|----------|----------|
|
||||
| 제이미 성형외과 | 72회 | 공식 안내, 차별점 강조 |
|
||||
| 저희 (제이미에서는) | 25회 | 서비스/방법 설명 |
|
||||
| 저 | Q&A 시 | 개인 의견, 경험 공유 |
|
||||
| 제이미 | 브랜드 강조 시 | "제이미의 퀵매몰법" |
|
||||
|
||||
---
|
||||
|
||||
## 3. 콘텐츠 구조 패턴
|
||||
|
||||
### 3.1 도입부 (Opening)
|
||||
|
||||
**표준 인사말** (100% 동일):
|
||||
```
|
||||
"안녕하세요. 제이미 성형외과 정기호 원장입니다."
|
||||
```
|
||||
|
||||
**주제 소개 패턴**:
|
||||
```
|
||||
"오늘은 [타겟 고객/고민]을 위한 [시술명]에 대해 [말씀드리겠습니다/소개해 드리겠습니다/설명드리겠습니다]."
|
||||
```
|
||||
|
||||
**실제 예시**:
|
||||
- "오늘은 낮은 이마와 눈썹 때문에 많은 고민을 하고 계신 젊은 층 고객을 위한 내시경 눈썹 거상술을 소개해 드리겠습니다."
|
||||
- "오늘은 깊어지는 이마 주름과 처진 눈꺼풀로 고민하시는 중장년층을 위한 내시경 이마 거상술에 대해 말씀드리겠습니다."
|
||||
|
||||
### 3.2 본론 (Body)
|
||||
|
||||
**구조 패턴**:
|
||||
```
|
||||
1. 문제 제기 (공감)
|
||||
→ 환자의 고민/증상 설명
|
||||
|
||||
2. 원인 설명 (교육)
|
||||
→ 왜 이런 문제가 생기는지
|
||||
|
||||
3. 해결책 제시 (제이미의 방법)
|
||||
→ 제이미 성형외과의 시술 소개
|
||||
|
||||
4. 장점 나열 (차별점)
|
||||
→ 회복 기간, 흉터, 통증, 마취 방법 등
|
||||
|
||||
5. 기대 효과 (비전)
|
||||
→ 수술 후 얻을 수 있는 결과
|
||||
```
|
||||
|
||||
### 3.3 마무리 (Closing)
|
||||
|
||||
**CTA 패턴**:
|
||||
```
|
||||
"[고민]이시라면 [지금 바로] 제이미 성형외과의 [시술명] 상담을 [추천드립니다/받아보시기를 바랍니다]."
|
||||
```
|
||||
|
||||
**실제 예시**:
|
||||
- "어둡고 칙칙한 눈밑으로 고민이시라면 지금 바로 제이미 성형외과의 상담받으세요."
|
||||
- "답답한 눈매로 고민이시라면 지금 바로 제이미 성형외과의 상담을 추천드립니다."
|
||||
- "언제든지 편안한 마음으로 상담해 주시면 감사하겠습니다."
|
||||
|
||||
---
|
||||
|
||||
## 4. 핵심 표현 사전 (Expression Dictionary)
|
||||
|
||||
### 4.1 긍정적 형용사/부사 (권장)
|
||||
|
||||
| 표현 | 사용 빈도 | 사용 맥락 |
|
||||
|------|----------|----------|
|
||||
| **자연스러운/자연스럽게** | 16회 ⭐ | 결과 묘사의 핵심 키워드 |
|
||||
| **젊은/젊음/젊어지는** | 12회 | 동안 성형 관련 |
|
||||
| **효과적인/효과적으로** | 7회 | 시술 방법 설명 |
|
||||
| **편안한/편안하게** | 6회 | 회복, 인상 묘사 |
|
||||
| **시원한/시원하게** | 6회 | 눈매 결과 묘사 |
|
||||
| **생기 있는** | 6회 | 동안/젊음 묘사 |
|
||||
| **또렷한/또렷하게** | 2회 | 눈매 결과 묘사 |
|
||||
| **부드러운** | 3회 | 인상/눈썹 묘사 |
|
||||
|
||||
### 4.2 신뢰 구축 표현
|
||||
|
||||
| 표현 | 사용 맥락 |
|
||||
|------|----------|
|
||||
| "풍부한 경험을 바탕으로" | 전문성 강조 |
|
||||
| "숙련된 기술과 경험" | 안전성 강조 |
|
||||
| "2008년부터 ~ 시행하고 있고" | 연혁 언급 |
|
||||
| "5년간 AS를 보장" | 사후관리 강조 |
|
||||
| "제가 직접 집도하고 있습니다" | 책임감 표현 |
|
||||
| "동영상을 통해 확인시켜 드리고 있습니다" | 투명성 강조 |
|
||||
|
||||
### 4.3 우려 해소 표현
|
||||
|
||||
| 환자 우려 | 원장 대응 표현 |
|
||||
|----------|---------------|
|
||||
| 흉터 걱정 | "일상생활 속에서는 그 절개선이 눈에 거의 띄지 않아요" |
|
||||
| 탈모 걱정 | "숙련된 선생님이 수술할 경우 탈모는 극히 드뭅니다" |
|
||||
| 부작용 걱정 | "걱정을 너무 많이 하실 필요는 없겠습니다" |
|
||||
| 통증 걱정 | "수면 마취와 국소 마취로 통증 없이 진행됩니다" |
|
||||
| 회복 기간 | "수술 다음 날부터 세안, 샴푸, 샤워, 화장이 가능합니다" |
|
||||
|
||||
### 4.4 비유/쉬운 설명 패턴 ⭐
|
||||
|
||||
정기호 원장 스타일의 핵심 특징입니다.
|
||||
|
||||
| 주제 | 비유 표현 |
|
||||
|------|----------|
|
||||
| 지방 이식 생착 | "나무 옮겨 심는 거랑 똑같다고 하거든요. 한 번 옮겨 심은 나무는 그 자리에서 계속 자라는 거예요." |
|
||||
| 3점 고정 | "인형을 실을 달아서 인형극을 한다고 했을 때 실이 두 줄인 거랑 세 줄 네 줄인 거랑은 움직임의 자연스러움이 차이가 있겠죠" |
|
||||
| 재수술 | "깨끗한 도화지에 그림을 그리면 화가의 실력이 100% 발휘가 될 텐데, 재수술은 어느 정도 오염되거나 낙서가 있는 도화지에 덧칠을 하는 것" |
|
||||
| 엔도타인 | "똑딱이 단추와 같은 나사라고 생각하셔도 되겠습니다" |
|
||||
| 흉터 위치 | "속눈썹과 눈썹이 있는 피부의 경계선에 절개선을 위치시키면 일상 속에서는 거의 눈에 띄지 않아요" |
|
||||
|
||||
**비유 사용 패턴**:
|
||||
```
|
||||
"~라고 하거든요" / "~라고 생각하셔도 되겠습니다" / "~이렇게 이해하시면 되겠습니다"
|
||||
```
|
||||
|
||||
### 4.5 진솔함/겸손 표현 ⭐
|
||||
|
||||
과장 없이 현실적 기대치를 제시하는 정기호 원장 스타일의 핵심입니다.
|
||||
|
||||
| 상황 | 진솔한 표현 |
|
||||
|------|------------|
|
||||
| 수술 한계 인정 | "환자분이 원하는 만큼의 결과에 도달하지 못할 가능성이 제법 있다" |
|
||||
| 의사 한계 인정 | "세상에 아무리 뛰어난 의사라도 100% 성공률을 가지고 수술을 하는 경우는 없어요" |
|
||||
| 자기 경험 공유 | "저조차도 수술을 실패하는 수가 있거든요" |
|
||||
| 개선 한계 | "피부 자체가 어두운 부분은 개선에 한계가 있다 이렇게 생각하시면 되겠습니다" |
|
||||
| 효과 지속 한계 | "시간이 지나면서 자연스럽게 처지고 주름이 생기는 것을 막지는 못합니다" |
|
||||
|
||||
---
|
||||
|
||||
## 5. Q&A 스타일 가이드
|
||||
|
||||
### 5.1 답변 시작 패턴
|
||||
|
||||
```
|
||||
"네, [질문 핵심 반복/요약] ~"
|
||||
```
|
||||
|
||||
**예시**:
|
||||
- "네, 눈매 교정 수술은 눈 수술 중에 가장 난이도가 높은 수술이기 때문에..."
|
||||
- "네, 이런 질문이 나온 이유는..."
|
||||
|
||||
### 5.2 Q&A 종결 어미
|
||||
|
||||
Q&A에서는 격식체와 부드러운 어미를 혼용합니다.
|
||||
|
||||
| 유형 | 비율 | 예시 |
|
||||
|------|------|------|
|
||||
| 격식체 | 70% | "~라고 답변드리겠습니다" |
|
||||
| 부드러운 어미 | 30% | "~거든요", "~예요", "~해요" |
|
||||
|
||||
### 5.3 구체적 수치 제시 ⭐
|
||||
|
||||
정기호 원장의 특징적인 설명 방식입니다.
|
||||
|
||||
| 항목 | 수치 예시 |
|
||||
|------|----------|
|
||||
| 수술 시간 | "10~15분", "1시간 정도", "4시간 정도" |
|
||||
| 회복 기간 | "다음 날부터", "4~5일", "일주일 정도" |
|
||||
| AS 기간 | "5년간 AS 보장" |
|
||||
| 관리 프로그램 | "1년간 무료 리프팅 관리" |
|
||||
| 생착률 | "30% 정도, 많게는 40%까지" |
|
||||
| 효과 지속 | "5년 이상", "반영구적" |
|
||||
| 시술 지속 | "실리프팅 1년", "하이푸 3~6개월", "보톡스 4개월" |
|
||||
|
||||
---
|
||||
|
||||
## 6. 채널별 적용 가이드
|
||||
|
||||
### 6.1 웹사이트 (시술 소개 페이지)
|
||||
|
||||
- **도입**: 표준 인사말 생략 가능, 주제 소개로 시작
|
||||
- **본론**: 문제-원인-해결-장점-효과 구조 유지
|
||||
- **마무리**: CTA + 상담 연결
|
||||
|
||||
### 6.2 블로그/네이버 포스트
|
||||
|
||||
- **도입**: "안녕하세요. 제이미 성형외과입니다." (원장 이름 생략 가능)
|
||||
- **본론**: 비유와 쉬운 설명 적극 활용
|
||||
- **Q&A**: 실제 상담 질문 형식으로 구성
|
||||
|
||||
### 6.3 영상 콘텐츠 (YouTube)
|
||||
|
||||
- **도입**: 표준 인사말 필수 사용
|
||||
- **본론**: 원장 말투 그대로 유지
|
||||
- **마무리**: "상담을 추천드립니다" CTA
|
||||
|
||||
### 6.4 SNS (Instagram)
|
||||
|
||||
- **톤**: 격식체 유지하되 문장 짧게
|
||||
- **호칭**: "여러분" 권장
|
||||
- **CTA**: "편안하게 상담해 주세요"
|
||||
|
||||
---
|
||||
|
||||
## 7. Do's & Don'ts
|
||||
|
||||
### ✓ Do's (권장)
|
||||
|
||||
| 항목 | 예시 |
|
||||
|------|------|
|
||||
| 환자 고민 먼저 공감 | "~로 고민하시는 분들이 많습니다" |
|
||||
| 쉬운 비유로 설명 | "나무 옮겨 심는 것처럼..." |
|
||||
| 구체적 수치 제시 | "5년간 AS 보장", "1시간 내외" |
|
||||
| 현실적 기대치 제시 | "개선에 한계가 있을 수 있습니다" |
|
||||
| 회복 정보 구체적 안내 | "수술 다음 날부터 세안, 샴푸, 화장 가능" |
|
||||
| 선택권 제공 | "~를 원하시면 ~를 추천드립니다" |
|
||||
|
||||
### ✗ Don'ts (금지)
|
||||
|
||||
| 항목 | 피해야 할 표현 | 대체 표현 |
|
||||
|------|---------------|----------|
|
||||
| 과장된 효과 보장 | "100% 성공" | "대부분의 경우 좋은 결과를 기대할 수 있습니다" |
|
||||
| 타 병원 비교 | "다른 병원보다 우수" | "저희만의 방법으로..." |
|
||||
| 절대적 표현 | "부작용 없음" | "부작용은 극히 드뭅니다" |
|
||||
| 단정적 결과 | "반드시 좋아집니다" | "개선을 기대할 수 있겠습니다" |
|
||||
| 가벼운 어투 | "완전 대박!", "짱!" | "만족스러운 결과를 얻으실 수 있습니다" |
|
||||
|
||||
---
|
||||
|
||||
## 8. 핵심 메시지 (Brand Essence)
|
||||
|
||||
인사말에서 추출한 제이미성형외과의 핵심 가치입니다.
|
||||
|
||||
> **"자연스럽게 어우러지는 얼굴 전체의 조화를 최우선으로 하며,
|
||||
> 꼭 필요한 시술만 안전하고 효과적인 방법으로 시행하고 있습니다."**
|
||||
|
||||
| 핵심 가치 | 표현 |
|
||||
|----------|------|
|
||||
| **자연스러움** | "자연스럽게 어우러지는" |
|
||||
| **조화** | "얼굴 전체의 조화를 최우선" |
|
||||
| **필요성** | "꼭 필요한 시술만" |
|
||||
| **안전** | "안전하고 효과적인 방법으로" |
|
||||
|
||||
---
|
||||
|
||||
## 9. 부록: 시술별 핵심 표현
|
||||
|
||||
### 9.1 눈 성형
|
||||
|
||||
| 시술 | 핵심 표현 |
|
||||
|------|----------|
|
||||
| 퀵매몰법 | "티 안 나게 예뻐지는", "휴가를 내지 않고도" |
|
||||
| 하이브리드 쌍꺼풀 | "절개법과 매몰법의 장점만을 모은" |
|
||||
| 안검하수 눈매교정 | "졸리고 답답한 눈매를 또렷하고 시원하게" |
|
||||
| 눈밑 지방 재배치 | "어둡고 칙칙한 눈밑을 환하게" |
|
||||
| 듀얼 트임 | "더욱 시원하고 매력적인 눈매" |
|
||||
|
||||
### 9.2 이마 성형
|
||||
|
||||
| 시술 | 핵심 표현 |
|
||||
|------|----------|
|
||||
| 내시경 이마거상술 | "3점 고정", "흡수성 봉합사 주문 제작" |
|
||||
| 내시경 눈썹거상술 | "눈썹을 이상적인 위치로 리프팅" |
|
||||
| 눈썹밑 피부절개술 | "티 안 나게 눈꺼풀 처짐을 개선" |
|
||||
|
||||
### 9.3 동안 성형
|
||||
|
||||
| 시술 | 핵심 표현 |
|
||||
|------|----------|
|
||||
| 스마스 리프팅 | "표정 근막층부터 근본적으로" |
|
||||
| 앞광대 리프팅 | "눈밑부터 팔자 주름까지 한 번에" |
|
||||
| 자가지방 이식 | "반영구적 유지", "나무 옮겨 심는 것처럼" |
|
||||
| 하이푸 리프팅 | "회복 기간이 필요 없는" |
|
||||
|
||||
---
|
||||
|
||||
## 10. 업데이트 이력
|
||||
|
||||
| 버전 | 날짜 | 변경 내용 |
|
||||
|------|------|----------|
|
||||
| v1.0 | 2025-12-09 | 초안 작성 (19개 음성 파일 분석 기반) |
|
||||
|
||||
---
|
||||
|
||||
*본 가이드는 정기호 원장의 실제 음성 녹음 65분 분량을 분석하여 작성되었습니다.*
|
||||
*모든 콘텐츠 작성 시 이 가이드를 참조하여 브랜드 보이스 일관성을 유지해 주세요.*
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user