brainstorming
Structured design dialogue that validates ideas before implementation begins.
cv-data-ingestion
Ingest and organize raw career data from Obsidian notes, CSV files, zip archives, and markdown documents into the Universal CV portfolio system. Use when processing career history, work experience, testimonials, case studies, or resume data from multiple sources. Outputs structured YAML/Markdown ...
Full skill instructions
<when_to_activate> Activate when the user:
source-data/ directory to processTrigger phrases: "ingest", "import", "process", "load data", "parse my resume" </when_to_activate>
Drop all source files in source-data/ — this directory is gitignored.
source-data/
├── obsidian-vault/ # Obsidian folders with .md files
├── linkedin-export.csv # CSV exports
├── resume.pdf # Resumes
├── gemini-review.md # AI summaries (processed first)
└── archive.zip # Bulk exports
All output goes to the existing content/ directory:
content/
├── profile.yaml # Identity, hero, about, stats
├── experience/index.yaml # Work history with rich details
├── case-studies/*.md # Project deep-dives (frontmatter + markdown)
├── testimonials/index.yaml # Social proof quotes
├── certifications/index.yaml # Certs and credentials
├── passion-projects/index.yaml
├── skills/index.yaml # Technical & domain skills
└── variants/ # Job-specific personalizations
Objective: Read and internalize the actual Zod schemas before writing ANY content.
CRITICAL: This step MUST be completed before any file writes. Schema mismatches were the #1 source of validation errors in past runs.
# Always read the schema file first
Read src/lib/schemas.ts
Key Schema Constraints to Verify:
| Content Type | Field | Constraint |
|---|---|---|
| Skills | skills | z.array(z.string()) — simple strings only, NOT objects |
| Case Study Media | type | z.enum(['blog', 'twitter', 'linkedin', 'video', 'article', 'slides']) |
| Testimonial | featured | z.boolean() — required, not optional |
| Experience | highlights | z.array(z.string()) — simple strings only |
| Case Study CTA | action | z.enum(['contact', 'calendly', 'linkedin']) — only these 3 values |
Before writing any file, confirm:
Objective: Map all source files before processing.
Before parsing raw files, look for existing AI-generated summaries or reviews. These are often more structured and save significant parsing time.
# Look for AI review files
find source-data/ -name "*review*" -o -name "*summary*" -o -name "*gemini*" -o -name "*claude*" -o -name "*gpt*"
# Check for structured exports
find source-data/ -name "*.json" -o -name "*export*"
If found: Use as PRIMARY source, cross-reference with raw data for verification.
# For Obsidian vault
find source-data/ -name "*.md" -type f | head -50
# For zip archive (extract first)
unzip -l source-data/*.zip | head -50
# Categorize by type
find source-data/ -type f \( -name "*.md" -o -name "*.csv" -o -name "*.txt" -o -name "*.json" \)
Create an inventory table with confidence scores:
| File | Type | Category | Priority | Confidence |
|---|---|---|---|---|
| gemini-review.md | AI Summary | All | HIGH | ⬛⬛⬛ High |
| work-history.md | Markdown | Experience | High | ⬛⬛⬜ Medium |
| skills.csv | CSV | Skills | Medium | ⬛⬛⬛ High |
| testimonials.txt | Text | Social Proof | High | ⬛⬜⬜ Low |
For each work role, extract/synthesize:
# Target: content/experience/index.yaml
jobs:
- company: "Company Name"
role: "Job Title"
period: "YYYY – YYYY"
location: "City, State"
logo: "/images/logos/company.svg" # Optional, nullable
url: "https://company.com" # Company website - ALWAYS extract if available
highlights:
- "Achievement with specific metric (e.g., 15× revenue growth)"
- "Technical accomplishment with stack details"
- "Cross-functional impact with scope"
- "Decision/trade-off that shows judgment"
- "Scale indicator (users, transactions, team size)"
tags: ["Domain1", "Tech1", "Skill1"]
Enrichment criteria:
Highlights support markdown links — use [Product Name](url) to link to shipped products, docs, or proof.
# Example with inline product links
highlights:
- "Shipped [Advanced API](https://ankr.com/docs/advanced-api/) from 0→1, serving 1M+ daily requests"
- "Built [Xbox royalties blockchain](https://ey.com/case-study) achieving 99% faster processing"
- "Launched [Playground V2](https://play.flow.com/) improving developer onboarding by 60%"
Link priority for highlights:
Why this matters: Recruiters verify claims. A clickable link to a live product instantly validates the work is real.
Always extract and verify company/project URLs so viewers can quickly validate the work is real.
Sources for URLs:
Link extraction process:
# Search source files for URLs
grep -oE 'https?://[^\s<>"]+' [SOURCE_FILES]
# Common patterns to look for
- "company.com", "startup.io", "project.xyz"
- LinkedIn: linkedin.com/company/[name]
- GitHub: github.com/[org]
- Product Hunt, Crunchbase links
Validation:
| Company Type | URL Priority |
|---|---|
| Active startup | Official website (e.g., mempools.com) |
| Enterprise | Company careers/about page |
| Acquired | Parent company or press release |
| Defunct | LinkedIn or archive.org |
Track extraction confidence for each data point:
| Confidence | Criteria | Action |
|---|---|---|
| ⬛⬛⬛ High | Exact quote from source, verified metric, named source | Use directly |
| ⬛⬛⬜ Medium | Synthesized from multiple sources, approximated metric | Use with note |
| ⬛⬜⬜ Low | Inferred, placeholder metric like "[X%]", uncertain date | Flag for user review |
Before writing experience file:
[VERIFY] prefix in draft# Validate structure matches schema BEFORE writing
# ExperienceSchema expects:
jobs:
- company: string # Required
role: string # Required
period: string # Required: "YYYY – YYYY" format
location: string # Required
logo: string | null # Optional
url: string | null # Optional - but ALWAYS try to populate!
highlights: string[] # Required: array of STRINGS (not objects!)
tags: string[] # Required
Identify projects with case study potential:
Criteria:
# Target: content/case-studies/NN-slug.md frontmatter
---
id: [next_available_number]
slug: project-slug
title: "Project Title"
company: "Company Name"
year: "YYYY-YY"
tags: [Tag1, Tag2, Tag3]
duration: "X months"
role: "Your Role"
hook:
headline: "One-line impact statement"
impactMetric:
value: "XX%"
label: "metric label"
subMetrics:
- value: "YY"
label: "secondary metric"
thumbnail: /images/case-study-slug.png
cta:
headline: "Call to action question"
subtext: "Optional elaboration"
action: calendly # or: contact, linkedin
linkText: "Let's talk →"
---
[Markdown body with: Challenge, Approach, Key Decision, Execution, Results, Learnings]
Personal testimonials (USE these):
Project testimonials (DO NOT use as personal):
High-confidence personal testimonial signals:
✅ Contains person's name + positive verb: "[Name] led", "[Name] designed"
✅ Uses "I" + relationship: "I worked with", "I hired", "I managed"
✅ Personal qualities: "collaborative", "thoughtful", "proactive"
✅ Recommendation language: "I recommend", "would hire again"
✅ Source: LinkedIn recommendation, performance review
Low-confidence / Project quote signals:
⚠️ No personal name mentioned
⚠️ Focuses on deliverable, not person
⚠️ Source: press release, case study, marketing material
⚠️ Generic praise: "great work", "successful project"
# Phrases indicating personal testimonials
grep -i "working with \[name\]" [SOURCE]
grep -i "I recommend" [SOURCE]
grep -i "pleasure to work" [SOURCE]
grep -i "\[name\] is" [SOURCE]
grep -i "one of the best" [SOURCE]
# LinkedIn recommendation patterns
grep -i "I had the opportunity" [SOURCE]
grep -i "I've had the pleasure" [SOURCE]
Before including a testimonial:
# Target: content/testimonials/index.yaml
testimonials:
- quote: >
Full testimonial text with specific details about
collaboration, impact, or skills demonstrated.
author: "Full Name" # Or "Engineering Lead" if anonymized
initials: "FN"
role: "Their Role"
company: "Company Name"
avatar: null # Or path to image
featured: true # Required boolean - for prominent display
If no valid personal testimonials found:
The skills schema expects SIMPLE STRINGS, not objects!
# ❌ WRONG - This will fail validation
categories:
- name: "Technical Leadership"
skills:
- name: "Platform Architecture"
level: "expert"
evidence: "..."
# ✅ CORRECT - Simple string array
categories:
- name: "Technical Leadership"
skills:
- "Platform Architecture"
- "API Design"
- "System Integration"
Since the schema doesn't support evidence fields, preserve context using YAML comments:
# Target: content/skills/index.yaml
categories:
- name: "Technical Leadership"
skills:
# Evidence: Designed multi-client validator infra at Anchorage
- "Platform Architecture"
# Evidence: Shipped Ankr Advanced APIs, 1M+ daily requests
- "API Design"
- name: "Web3 & Blockchain"
skills:
# Evidence: First smart contract at Microsoft (2016)
- "Ethereum"
# Evidence: ETF-grade validator provisioning
- "Staking Infrastructure"
// SkillsSchema from src/lib/schemas.ts:
SkillsSchema = z.object({
categories: z.array(z.object({
name: z.string(),
skills: z.array(z.string()) // <-- STRINGS ONLY!
}))
});
Before writing skills file:
# Validate all content against Zod schemas
npm run validate
# Check for gaps
Gap checklist:
[METRIC] for user to fill (e.g., "Increased revenue by [METRIC]%"){
company: string; // Required
role: string; // Required
period: string; // Required: "YYYY – YYYY" or "YYYY – Present"
location: string; // Required
logo?: string; // Optional: path to logo
url?: string; // Optional: company website - ALWAYS include if available
highlights: string[]; // Required: 3-4 items with [Product](url) links where possible
tags: string[]; // Required: 2-5 tags
}
{
id: number; // Required: unique incremental
slug: string; // Required: URL-friendly
title: string; // Required
company: string; // Required
year: string; // Required: "YYYY" or "YYYY-YY"
tags: string[]; // Required
duration: string; // Required
role: string; // Required
hook: {
headline: string;
impactMetric: { value: string; label: string };
subMetrics?: { value: string; label: string }[];
thumbnail?: string;
};
cta: {
headline: string;
subtext?: string;
action: "contact" | "calendly" | "linkedin";
linkText: string;
};
// Optional links
demoUrl?: string;
githubUrl?: string;
docsUrl?: string;
media?: { type: string; url: string; label?: string }[];
}
{
quote: string; // Required: the testimonial text
author: string; // Required: name or title if anonymized
initials: string; // Required: for avatar fallback
role: string; // Required
company: string; // Required
avatar?: string; // Optional: image path
featured?: boolean; // Optional: for prominent display
}
After processing, generate:
Data Lineage Document (docs/data-lineage.md)
Gap Analysis Report (docs/gap-analysis.md)
Processing Summary
User: "I have an Obsidian vault at ~/Documents/Career-Notes with my work history"
Steps:
1. Scan vault for relevant files (work, projects, reviews folders)
2. Parse each markdown file, extract structured data
3. Map to experience/index.yaml format
4. Identify case study candidates
5. Extract any testimonial quotes
6. Validate and report gaps
User: "I have a LinkedIn CSV export and my resume as text"
Steps:
1. Parse CSV for positions, skills, recommendations
2. Parse resume text for additional details
3. Merge and deduplicate
4. Enrich highlights with specific metrics
5. Create skills taxonomy
6. Validate against schemas
User: "I have a zip file with CSV files, text notes, and screenshots"
Steps:
1. Extract archive to temp directory
2. Inventory all files by type
3. Process CSVs for structured data
4. Process text files for testimonials/notes
5. Catalog images for case study thumbnails
6. Consolidate into content structure
7. Clean up temp files
Every piece of content should pass this test:
# Full content validation
npm run validate
# Build to catch any issues
npm run build
# Preview locally
npm run dev
/public/images/, reference as /images/filename.pngnpm run validate commandsrc/lib/schemas.tsNo additional packages required.
Structured design dialogue that validates ideas before implementation begins.
Comprehensive design intelligence for web and mobile UI/UX across 10 technology stacks.
Comprehensive implementation plans for multi-step tasks, breaking down specs into bite-sized, testable steps.
Introduction to the obra skills system with mandatory skill invocation rules and best practices.
Execute a written implementation plan with critical review and task checkpoints.
Delegate independent tasks to specialized agents working concurrently with isolated context.
Isolated git worktrees with smart directory selection and safety verification.
Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.
Plan searchable and shareable content that drives traffic, builds authority, and generates leads.
README-first repository scanner that extracts commands and classifies reproduction candidates without executing them.
Brainstorm and prioritize marketing strategies tailored to your SaaS stage, budget, and goals.
Plan and optimize your website's page hierarchy, navigation, URL structure, and internal linking.
The world's fastest calendar for remote work
Capture, organize, and utilize your knowledge effortlessly.
Instant Summaries of Audio & Video Interviews with AnySummary
Transform PDFs into engaging mind maps.
Chat with any PDF instantly
Create an optimal daily plan using your voice
A productivity platform to centralize organizational knowledge and workflows with contextual AI assistance.
AskYourPDF Pricing Plans: Tailored to Your Needs