Joblet AI - Job Cover letters

Return to Projects
Joblet AI - Job Cover letters

An AI-powered web application for generating professional cover letters. Input job details and CV, customise tone and length settings, and receive tailored letters instantly. Featured credit-based pricing with customisable creativity levels.

Project Type
Web App
Current Status
Archived
App Version
1.0.12 (Build 12)
Development
104 hrs (website & app)

The Origin Story

This project started with a simple goal: I wanted to get more comfortable working with AI agents and prompts within the Laravel framework. The job market seemed like a natural fit. Everyone hates writing cover letters, and AI is pretty good at generating professional text, and so Joblet was born: an AI-powered cover letter generator that would help job seekers create professional, customised cover letters in seconds.

Spoiler alert: the app worked exactly as intended. It generated great cover letters, had all the features I wanted, and the technical implementation was solid. But here's the thing. The market for AI cover letter generators is absolutely saturated. There are dozens of similar tools out there, all doing basically the same thing. After launching and running it for a while, I realised I'd built yet another solution to a problem that already had too many solutions.

So I took it offline. Not because it failed, but because it succeeded at teaching me what I wanted to learn about AI integration in Laravel, and I didn't see a compelling reason to compete in an overcrowded space. This is the story of that project.

What Joblet Actually Did

Joblet was a full-featured web application that generated professional cover letters using AI. The core workflow was dead simple:

  1. Enter your details: Name, job title, job description, and upload your CV/resume
  2. Customise your letter: Select tone (casual/formal/professional), length (short/medium/long), creativity level, language variant, and date format
  3. Get your letter: AI generates a polished, professional cover letter in seconds

But the real power was in the optional content sections that let users really tailor their letters:

  • Problem Solving: Identify a challenge you're equipped to solve
  • Growth Interest: Express interest in specific opportunities
  • Unique Value: Articulate what sets you apart
  • Achievements Highlight relevant accomplishments
  • Motivation: Explain why you want this role
  • Aspirations: Share your career goals
  • Address placeholders: For proper business letter formatting

The AI would weave all of this together into a coherent, professional cover letter that didn't sound like every other AI-generated letter out there.

The Technical Side

This was my playground for learning AI integration in Laravel, and I threw everything at it:

The Stack

  • Laravel 12, because I always work with the latest version on new projects.
  • Livewire 3 for reactive components without writing JavaScript
  • Tailwind 4 for clean, modern UI that didn't take forever to build
  • Anthopic API with Claude to write the letters and blog post content.
  • OpenAI API for blog post image generation.
  • Stripe with Laravel Cashier to help with payment processing and subscription management

AI Prompt Engineering

This was the real learning experience. I spent a lot of time crafting and refining the AI prompts to generate letters that:

  • Actually sounded human, not like a robot
  • Matched the selected tone consistently
  • Hit the right length without padding
  • Incorporated all the optional content naturally
  • Avoided generic phrases that scream "AI-generated"

The creativity levels (Precise, Balanced, Dynamic, Creative) weren't just labels, they actually adjusted the AI's temperature and parameters to control how "safe" or "interesting" the output was. Getting these tuned right took experimentation.

Credit System & Payments

I implemented a credit-based system with Stripe and Laravel Cashier:

  • 2 free credits for new accounts
  • Additional credits via one-time purchases (no subscriptions)
  • Three tiers: £5.99 for 10 credits, £9.99 for 25, £17.99 for 50
  • Custom webhook handler for automatically assigning credits after successful payments

Laravel Cashier made the Stripe integration straightforward, handling all the payment flow complexity. The webhook system ensured credits were added instantly after purchase, with proper failure handling and retry logic for edge cases.

Automated Blog Content

Here's where things got interesting. I built an entire blog section with AI-generated content that ran on autopilot. In all honesty, this was me being lazy (somewhat). I just didn't have the time or the passion to write the posts myself. I'm really not that interested in the job markets! Anyway, this auto-pilot article system would:

  • Generate blog posts based on keywords and short prompts from single file json files.
  • Create AI-generated images for each post using Open AI image end points
  • Queue everything to publish once per week over a 6-month period
  • Periodically check any youtube links used in the posts to ensure they were still valid
  • Handle the entire content pipeline automatically

This was essentially a set-it-and-forget-it content marketing system. I'd provide a handful of keywords like "cover letter tips", "job interview advice", or "resume writing", along with a short prompt, and the AI would generate full blog posts with accompanying images. Laravel's queue system handled the scheduling, so I didn't have to manually publish anything. Six months of content, fully automated.

The irony wasn't lost on me. I built an AI tool to help people write cover letters, then used AI to market that tool. Very meta and certainly not the best of ideas. The learning experience was worth it regardless!

User Experience

The generator was built with Livewire, so the entire form was reactive. Upload a CV? It previews immediately. Change the tone? The UI updates with a description of what that means. Select a creativity level? Get instant feedback on what that will do to your letter.

Generated letters were stored in the user's account with full CRUD operations – view, edit, download, delete. I added PDF export so people could download properly formatted letters ready to send.

What I Learned

1. AI Prompt Engineering Is Actually Hard

I thought it would be straightforward, just tell the AI what to do and it does it. Wrong. Getting consistent, high-quality output required:

  • Multiple prompt iterations to nail the tone
  • Careful handling of edge cases (missing info, conflicting requirements)
  • Balancing creativity with professionalism
  • Preventing the AI from hallucinating information
  • Making sure it used the user's actual CV content instead of making things up

The final prompt was probably 10x longer than my initial attempt, with specific instructions, examples, and guardrails.

2. Context Is Everything

The AI needed context to generate good letters. Just providing a job title and description wasn't enough. I had to teach it to:

  • Extract relevant skills from the CV that matched the job description
  • Prioritize information based on what was most relevant
  • Use specific examples rather than vague statements
  • Maintain consistency in tone throughout the entire letter
  • Avoid repeating the same phrases or sentence structures

This meant processing the CV content, analysing the job description, and building structured context for the AI before generating the letter.

3. Laravel + AI Is Actually Nice

Laravel's service container made it easy to create an AIService that handled all OpenAI interactions. Environment-based configuration meant switching between development and production API keys was trivial. Queue jobs for longer generations kept the UI responsive.

Livewire was perfect for this use case. The entire generator form could be a single component with reactive properties, and I didn't have to write a single line of JavaScript for the interactive bits.

4. The Market Is Brutally Overcrowded

This was the big lesson. There are so many AI cover letter generators out there:

  • Standalone apps like Joblet
  • Features built into job boards
  • Chrome extensions
  • Free tools from career coaching sites
  • Enterprise solutions for recruiters

Most of them do basically the same thing. Some are free, some charge per letter, some have subscriptions. Competing in this space would require either:

  • A unique angle I didn't have
  • Significant marketing budget
  • Integration with existing job platforms
  • Or accepting minimal revenue

I chose option D: walk away and apply what I learned to more interesting projects.

Technical Challenges

Challenge 1: CV Parsing

Users upload CVs in various formats: PDF, DOCX, plain text. I needed to extract the text content reliably across all formats. PDF parsing was especially tricky because layout-based PDFs don't always convert cleanly to text.

Solution: Used multiple parsing libraries with fallbacks. Textract for PDFs, PHPWord for DOCX, and plain text as-is. Added validation to ensure we got usable content before proceeding.

Challenge 2: Prompt Token Limits

OpenAI has token limits, and users with long CVs or detailed job descriptions could easily exceed them. I needed to fit: system prompt, CV content, job description, user preferences, and optional content all within the limit.

Solution: Implemented smart truncation. Prioritised the most recent work experience, trimmed verbose job descriptions, and summarised optional content if needed. Also added warnings when content was close to limits.

Challenge 3: Generation Speed

Some letters took 10-15 seconds to generate, which felt like forever in the UI. Users would click the button multiple times thinking it didn't work.

Solution: Added loading states with progress indicators, disabled the generate button during processing, and showed estimated time remaining. Also moved to streaming responses where possible so users saw content appearing rather than waiting for the full response.

Challenge 4: Quality Control

The AI sometimes generated letters that were technically correct but felt off, too formal for a startup, too casual for a corporate role, or just generic despite having good input.

Solution: Added multiple validation checks post-generation. Flagged letters that seemed too short, contained obvious AI patterns ("as an AI language model..."), or didn't incorporate the optional content properly. Users could regenerate with different settings if needed.

Why I Shut It Down

Here's the honest truth: Joblet worked. It generated good cover letters, users seemed happy with it, and the technical implementation was solid. But:

  1. Market saturation - There are too many similar tools already
  2. Low differentiation - Nothing made Joblet uniquely better
  3. Limited growth potential - Without significant investment in marketing or features, it would stay small
  4. Mission accomplished - I learned what I wanted to learn about AI integration in Laravel

The goal was never to build a massive SaaS business. It was to get comfortable with AI agents, prompt engineering, and integrating OpenAI APIs into Laravel applications. Mission accomplished.

I gained additional practical experience with:

  • Structuring AI prompts for consistent, high-quality output
  • Handling streaming AI responses in web applications
  • Building credit-based systems with payment processing via Stripe and Laravel Cashier
  • Creating custom webhook handlers for payment confirmation
  • Managing API costs and rate limits
  • Creating reactive UIs with Livewire
  • Parsing and processing user-uploaded documents
  • Automating content generation and scheduling with Laravel queues

All of that knowledge can be transferred directly to other projects where AI integration could actually make a meaningful difference.

What I'd Do Differently

If I were to build this again (which I won't, but hypothetically):

  1. Niche down harder. Instead of generic cover letters, target a specific industry or role type where AI could provide more specialised value

  2. Skip the credit system. Either make it free and figure out monetisation later, or charge a flat monthly subscription. Pay-per-letter creates friction

  3. Add more differentiation. Maybe real-time job description analysis, interview prep based on the letter, or integration with LinkedIn to auto-populate details

  4. Test the market first. I should have validated demand before building the full product. A landing page with email signup would have told me everything I needed to know

  5. Consider B2B instead of B2C. Career coaches, recruitment agencies, and universities might have been better customers than individual job seekers

The Takeaway

Joblet wasn't a failure. It was a successful learning project that taught me it wasn't worth pursuing further. That's a valuable lesson in itself. Sometimes the best outcome is realising you've learned what you needed to learn and it's time to move on to more interesting problems. The AI integration skills I gained here have been invaluable in other projects, and I don't regret a minute spent building it.

Would I Recommend Building This?

No, the market is too crowded. But if you want to learn AI integration in Laravel, build something similar as a learning project. Just don't expect to compete with the established players.


Comments (0)

Optional. If given, is displayed publicly.

Optional. If given, is not displayed anywhere.

Required with 25 characters minimum

Comments are reviewed for spam and may require approval.

No comments yet. Be the first to share your thoughts!