Job Application Assistant (WIP)
Why this project?
This is a portfolio project I decided to create upon concluding the Microsoft Azure AI Engineer certification to showcase part of what I learned.
Microsoft regularly updates their courses as new technologies emerge, and the focus of the certification exams shifts accordingly. In the most recent version of the AI-102 exam, which is the one I sat, there’s a heavy emphasis on Generative AI, including Prompt Flow. That’s why I chose to build a Prompt Flow project: It highlights one of the most important takeaways from the course – and it also happens to be genuinely useful.
Problem
Writing job applications and CVs is a long, uncertain, and often discouraging process - one that demands substantial effort yet yields little feedback. Most applicants spend hours tailoring submissions, only to receive generic, AI-generated rejection emails. The job application process is a classic example of a high-effort, low-reward process, but with a potentially life-changing upside if it succeeds.
While AI tools can now write applications and CVs, the resulting texts often lack depth or authenticity. Many AI-generated applications are little more than CVs rewritten in prose form - descriptive but not persuasive.
In addition, job applications and CVs written by AI often bear the unmistakable mark of the machine - a collection of stock phrases and overused expressions repeated endlessly, which tend to push recruiters away rather than engage them.
Vision
The overarching idea is to create a job application service that creates a job application (not a cover letter!) that is prospective and demonstrates how the candidate, given their experience, competencies, and skills, can add value in the role the organisation is looking for.
The service won’t add anything new under the sun but will merely speed up a task that most people would rather not have to bother with.
Features
Prompt templating
The service uses placeholders (e.g. {{job_title}}, {{company_name}}) to dynamically generate tailored applications. This ensures consistency while allowing the content to adapt flexibly to each specific job and company.
Blacklisting
The service uses a blacklist that avoids punctuation, words, phrases and sentence structures overused by the AI.
Technical Implementation
This demo showcases:
- Multi-step prompt engineering with structured JSON outputs
- Job advertisement analysis extracting titles, requirements, and keywords
- CV point selection matching experience to job requirements
- Document generation with consistent formatting and professional tone
- Error handling and input validation
The system uses a 5-stage pipeline similar to production-level document processing workflows used by major recruiting platforms.
Tech Stack
- Azure AI Foundry (Prompt Flow) – for multi-step orchestration, structured JSON outputs, and LLM chaining.
- Azure OpenAI Service – provides GPT-based natural language understanding and generation.
- Node.js (Netlify Functions) – handles flow execution, input validation, and REST API integration.
- Hugo – static site generator used to build and manage the project site.
- Netlify – hosting and serverless deployment with CI/CD integration.
- REST APIs & JSON Schema – for structured communication between components.
- JavaScript / HTML – manages client-side interactivity and demo rendering.
- GitHub + Netlify CI/CD – automated version control and deployment pipeline.
This combination was chosen to demonstrate practical use of Azure’s Generative AI ecosystem while leveraging modern, cost-efficient web deployment. It integrates enterprise-grade AI workflows with lightweight serverless hosting suitable for portfolio-scale projects.
Skills used
- Azure AI Prompt Flow
- Generative AI (LLMs)
- Prompt Engineering
- JavaScript / Node.js
- Netlify Functions
- REST APIs
- JSON Schema
- Error Handling
- CI/CD
Demo
Contact me for access credentials.
If we have on-going communication regarding recruitment, credentials are most likely already included on either my CV or cover letter/job application.
Why are access credentials required? See From Azure to Netlify below.
Example outputs
These outputs illustrate what kind of product users can expect if they try the service.
The job ads are real and taken from LinkedIn.
The CVs are created using ChatGPT or Claude with the prompt
“Write an example CV for a x” where x is the position from the job ad.
This creates a CV that fits the one from the job ad to some degree without being a perfect fit, thus mirroring the relationship between actual candidate CVs and ads where the fit is seldom, if ever, perfect.
This ultimately results in a better picture of how the service would fare in reality as it avoids stacking the cards in favour of the service from the get go by just feeding the AI the ad and, in doing so, creating a CV that fits perfectly.
The flow was made using the GUI on Azure AI Foundry. However, I chose Netlify over Azure App Service for hosting because this is a portfolio demo with infrequent usage. Azure Web Apps charge continuously (~$13+/month) regardless of traffic, while Netlify’s free tier covers hosting and serverless functions with generous limits. Since the tool might only be used a few times per month, paying $156+/year for always-on Azure hosting doesn’t make economic sense compared to Netlify’s $0 hosting cost. This change necessitated me exporting the files from Azure and rewriting the flow as a Netlify function in JS.
Desiderata for the next iteration
I have managed to make the output application prospective and focused on how applicants can add value in the role in question given their experience. But the service is still far from perfect. It is also only a first iteration and would need to go through a significant amount of others with careful monitoring of how progress is made towards the desired output.
(With CVs and cover letters there arguably isn’t an ideal output, and in the absence of empirical data that could say something about the general preference of recruiters and hiring mangers, the principles followed in this project seem as good as principles get when they’re arrived at a priori. The overarching principle is merely that the application should make the strongest possible argument that the candidate will be a success in the role and it does that by being distinctively rational.)
The next iteration should:
Observe the banlist even more strictly
Create a better, less generic opening paragraph
Ideally the service should look online for information about the organisation in question as well as press material and incorporate that to show that the candidate has thoroughly researched the company (so they have a better idea of what they are getting themselves into)
It should also, again ideally, answer the question: why this specific role at this of all companies right now given where I am in my career (i.e. why is it the logical next step).
Create a better, less generic concluding paragraph
Add an extra node that evaluates how well the cover letter satisfies a list of criteria to make sure it is even more on point.
Show that the candidate is intimately familiar with the tasks that are required in the job ad and that are constitutive of the role the organisation is looking for. For example, if an organisation is looking for a PM, the job application needs to show that the applicant is intimately familiar with important aspects of PM by e.g. highlighting some frequent risks and mitigation strategies that the candidate finds useful. So if relevant, the application could mention that the candidate "is well aware of the importance of long, meticulous planning followed by a short, tightly controlled delivery phase to minimize risk"
The main constraint on the above is space. To write a job application that is sufficiently motivated to satisfy a very rational individual is arguably impossible to do on one page. For this reason, the service should also make the right trade-offs and only implement the desiderata with the putative highest ROI.1
Key insight - domain expertise is king
Without knowing how to write a good CV and application and giving the AI very specific instructions, the AI ends up writing only a passable CV and a horrible application that doesn’t really support, or serve as an extension of, the CV. A prompt flow is just a chain of prompts that uses each others outputs; and as with all prompts, the results you get are heavily dependent on your ability to craft prompts that precisely request what you want.
Concluding remarks
This is the kind of artificial intelligence project that I am well-positioned to strategize and implement. I am mostly familiar with Azure but I also have experience with AWS if that is your preferred cloud of choice.
-
I do not consider listing desiderata the main job of the engineer or AI professional that creates the service. It is, at the end of the day, up to the domain experts to define what the service should do and the conditions of its success. If the AI professional also works in a role with a PM component, which is quite frequent these days, they obviously also need to be sharp on the gathering of requirements from domain experts during discovery. ↩︎