jmsktm/claude-settings/letter-writer

Trust tier 2
  • community
LLM review pending
Source check pending

Checking that the SKILL.md file is still in the repository.

Generate formal and informal letters including business correspondence, cover letters, and personal communications

Install

npx vskill@latest install jmsktm/claude-settings/letter-writer

SKILL.md

Letter Writer

The Letter Writer skill automates the creation of professional and personal letters with proper formatting, tone, and structure. It handles various letter types including business correspondence, cover letters, recommendation letters, thank you notes, and formal communications. The skill ensures appropriate formatting, professional language, and customization for different audiences and purposes.

Generate letters in multiple formats (PDF, DOCX, HTML) with customizable templates for different occasions and communication needs.

Core Workflows

Workflow 1: Generate Cover Letter

Purpose: Create a compelling cover letter tailored to a specific job application

Steps:

  1. Collect job details (position, company, requirements)
  2. Extract candidate's relevant qualifications
  3. Structure letter with proper business format
  4. Write engaging opening paragraph
  5. Detail relevant experience and achievements
  6. Connect skills to job requirements
  7. Craft strong closing with call to action
  8. Format with proper spacing and margins
  9. Export to PDF and DOCX

Implementation:

javascript
const { Document, Packer, Paragraph, AlignmentType, TextRun } = require('docx');
const fs = require('fs');
async function generateCoverLetter(letterData, outputPath) {
const doc = new Document({
sections: [{
properties: {
page: {
margin: {
top: 1440, // 1 inch
right: 1440,
bottom: 1440,
left: 1440
}
}
},
children: [
// Your contact information
new Paragraph({
text: letterData.sender.name,
spacing: { after: 0 }
}),
new Paragraph({
text: letterData.sender.address,
spacing: { after: 0 }
}),
new Paragraph({
text: `${letterData.sender.city}, ${letterData.sender.state} ${letterData.sender.zip}`,
spacing: { after: 0 }
}),
new Paragraph({
text: letterData.sender.email,
spacing: { after: 0 }
}),
new Paragraph({
text: letterData.sender.phone,
spacing: { after: 200 }
}),
// Date
new Paragraph({
text: new Date().toLocaleDateString('en-US', {
year: 'numeric',
month: 'long',
day: 'numeric'
}),
spacing: { after: 200 }
}),
// Recipient information
new Paragraph({
text: letterData.recipient.name || 'Hiring Manager',
spacing: { after: 0 }
}),
new Paragraph({
text: letterData.recipient.company,
spacing: { after: 0 }
}),
new Paragraph({
text: letterData.recipient.address,
spacing: { after: 0 }
}),
new Paragraph({
text: `${letterData.recipient.city}, ${letterData.recipient.state} ${letterData.recipient.zip}`,
spacing: { after: 200 }
}),
// Salutation
new Paragraph({
text: `Dear ${letterData.recipient.name || 'Hiring Manager'}:`,
spacing: { after: 200 }
}),
// Opening paragraph
new Paragraph({
text: `I am writing to express my strong interest in the ${letterData.position} position at ${letterData.recipient.company}. ${letterData.opening}`,
alignment: AlignmentType.JUSTIFIED,
spacing: { after: 200 }
}),
// Body paragraphs
...letterData.bodyParagraphs.map(para =>
new Paragraph({
text: para,
alignment: AlignmentType.JUSTIFIED,
spacing: { after: 200 }
})
),
// Closing paragraph
new Paragraph({
text: letterData.closing || `Thank you for considering my application. I am excited about the opportunity to contribute to ${letterData.recipient.company} and would welcome the chance to discuss how my skills and experience align with your needs. I look forward to hearing from you.`,
alignment: AlignmentType.JUSTIFIED,
spacing: { after: 200 }
}),
// Signature
new Paragraph({
text: 'Sincerely,',
spacing: { after: 400 }
}),
new Paragraph({
text: letterData.sender.name
})
]
}]
});
const buffer = await Packer.toBuffer(doc);
fs.writeFileSync(outputPath, buffer);
return outputPath;
}
// Helper function to generate body paragraphs based on job requirements
function generateCoverLetterBody(candidateData, jobData) {
const paragraphs = [];
// Experience paragraph
const relevantExperience = candidateData.experience
.filter(exp => exp.relevanceScore > 0.7)
.slice(0, 2);
if (relevantExperience.length > 0) {
const expText = `With ${calculateYearsExperience(candidateData.experience)} years of experience in ${jobData.industry}, I have developed strong expertise in ${jobData.keySkills.slice(0, 3).join(', ')}. In my current role at ${relevantExperience[0].company}, ${relevantExperience[0].achievements[0].toLowerCase()}`;
paragraphs.push(expText);
}
// Skills and qualifications paragraph
const matchingSkills = candidateData.skills
.filter(skill => jobData.requiredSkills.includes(skill.name))
.slice(0, 4);
if (matchingSkills.length > 0) {
const skillsText = `I am particularly well-suited for this role given my proficiency in ${matchingSkills.map(s => s.name).join(', ')}. ${candidateData.achievements.find(a => a.includes(matchingSkills[0].name)) || 'I have successfully applied these skills to deliver measurable results.'}`;
paragraphs.push(skillsText);
}
// Company-specific paragraph
if (jobData.companyInfo) {
const companyText = `I am particularly drawn to ${jobData.company} because of ${jobData.companyInfo.appeal || 'your reputation for innovation and excellence'}. I believe my background in ${jobData.relevantBackground} would enable me to make immediate contributions to your team.`;
paragraphs.push(companyText);
}
return paragraphs;
}
Workflow 2: Business Letter Generator

Purpose: Create formal business correspondence with proper formatting

Steps:

  1. Select letter type (inquiry, complaint, proposal, etc.)
  2. Format with business letter structure
  3. Use professional tone and language
  4. Include subject line if needed
  5. Write clear, concise content
  6. Add proper closing and signature block
  7. Format for letterhead if available

Implementation:

javascript
async function generateBusinessLetter(letterData, outputPath) {
const letterTypes = {
inquiry: {
subject: 'Inquiry Regarding',
opening: 'I am writing to inquire about',
tone: 'polite and professional'
},
complaint: {
subject: 'Concern Regarding',
opening: 'I am writing to bring to your attention',
tone: 'firm but professional'
},
proposal: {
subject: 'Proposal for',
opening: 'I am pleased to present',
tone: 'professional and enthusiastic'
},
thankyou: {
subject: 'Thank You',
opening: 'I wanted to express my sincere gratitude for',
tone: 'warm and appreciative'
}
};
const template = letterTypes[letterData.type] || letterTypes.inquiry;
const doc = new Document({
sections: [{
properties: {
page: {
margin: { top: 1440, right: 1440, bottom: 1440, left: 1440 }
}
},
children: [
// Company letterhead (if provided)
...(letterData.letterhead ? [
new Paragraph({
text: letterData.letterhead.companyName,
alignment: AlignmentType.CENTER,
spacing: { after: 0 }
}),
new Paragraph({
text: letterData.letterhead.address,
alignment: AlignmentType.CENTER,
spacing: { after: 0 }
}),
new Paragraph({
text: `${letterData.letterhead.phone} | ${letterData.letterhead.email}`,
alignment: AlignmentType.CENTER,
spacing: { after: 400 }
})
] : []),
// Date
new Paragraph({
text: new Date().toLocaleDateString('en-US', {
year: 'numeric',
month: 'long',
day: 'numeric'
}),
spacing: { after: 200 }
}),
// Recipient
new Paragraph({
text: letterData.recipient.name,
spacing: { after: 0 }
}),
new Paragraph({
text: letterData.recipient.title,
spacing: { after: 0 }
}),
new Paragraph({
text: letterData.recipient.company,
spacing: { after: 0 }
}),
new Paragraph({
text: letterData.recipient.address,
spacing: { after: 200 }
}),
// Subject line
...(letterData.subject ? [
new Paragraph({
children: [
new TextRun({ text: 'RE: ', bold: true }),
new TextRun(letterData.subject)
],
spacing: { after: 200 }
})
] : []),
// Salutation
new Paragraph({
text: `Dear ${letterData.recipient.name}:`,
spacing: { after: 200 }
}),
// Body
...letterData.paragraphs.map(para =>
new Paragraph({
text: para,
alignment: AlignmentType.JUSTIFIED,
spacing: { after: 200 }
})
),
// Closing
new Paragraph({
text: letterData.closing || 'Sincerely,',
spacing: { after: 400 }
}),
// Signature
new Paragraph({
text: letterData.sender.name,
spacing: { after: 0 }
}),
new Paragraph({
text: letterData.sender.title
})
]
}]
});
const buffer = await Packer.toBuffer(doc);
fs.writeFileSync(outputPath, buffer);
return outputPath;
}
Workflow 3: Recommendation Letter Generator

Purpose: Create letters of recommendation for employees, students, or colleagues

Steps:

  1. Collect information about the person being recommended
  2. Understand the purpose and recipient of the letter
  3. Establish credibility and relationship
  4. Detail specific qualifications and achievements
  5. Provide concrete examples
  6. Compare to peers if appropriate
  7. Give enthusiastic endorsement
  8. Offer to provide additional information

Implementation:

javascript
function generateRecommendationLetter(recommendationData) {
const letterData = {
sender: recommendationData.recommender,
recipient: recommendationData.recipient || {
name: 'To Whom It May Concern'
},
type: 'recommendation',
paragraphs: [
// Opening - establish relationship
`I am writing to enthusiastically recommend ${recommendationData.candidate.name} for ${recommendationData.purpose}. I have had the pleasure of working with ${recommendationData.candidate.firstName} for ${recommendationData.duration} in my capacity as ${recommendationData.recommender.title} at ${recommendationData.recommender.company}.`,
// Qualifications and strengths
`During our time working together, ${recommendationData.candidate.firstName} has consistently demonstrated exceptional ${recommendationData.strengths.join(', ')}. ${recommendationData.standoutQualities}`,
// Specific examples
...recommendationData.examples.map(example =>
`For instance, ${example.description} This ${example.impact}`
),
// Comparison to peers (if applicable)
...(recommendationData.comparison ? [
`${recommendationData.candidate.firstName} stands out among ${recommendationData.comparison.peerGroup} for ${recommendationData.comparison.distinguishingFactors}.`
] : []),

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 100 of 100Pattern checks on the skill's files.
  • Model reviewNot runA model review is scheduled for the next rescan.

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
3
Repository forks
5
7-day trend score
7

Stars and forks are for the whole GitHub repository, not this skill alone. Refreshed 25 Apr 2026, 6 months ago.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/jmsktm/claude-settings/letter-writer/badge)](https://verified-skill.com/skills/jmsktm/claude-settings/letter-writer)

Something wrong with this skill or its page? Tell us.