Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,11 @@ It is not a full multi-tenant SaaS yet because there is no database, authenticat
## What The App Does

- compares a resume with a job description in real time
- extracts text from uploaded PDF resumes in the browser
- calculates an overall match score
- groups results into strong, partial, and missing keywords
- features deep AI analysis using a customized "Elite Recruiter" prompt for robust, context-aware scoring
- extracts text from uploaded PDF resumes natively in the browser
- calculates an overall match score and categorizes results (strong, partial, missing)
- dynamically sizes complex AI feedback using robust flexbox/grid UI wrapping (prevents UI blowout)
- provides clean error-handling for API rate-limits and safely parses markdown-polluted JSON
- flags ATS issues and resume risks
- offers copy, export, and local save actions
- works on desktop and mobile
Expand Down Expand Up @@ -97,10 +99,12 @@ sequenceDiagram

### Product experience

- deep AI integration with graceful fallbacks and user-friendly quota/rate-limit alerts
- robust, dynamic UI that intelligently handles long AI-generated text without breaking layouts
- browser-first workflow with no account required
- privacy-friendly resume analysis
- responsive single-page interface
- local history and export utilities
- dynamic local history that automatically names sessions based on AI-detected job titles

### Delivery discipline

Expand Down
13 changes: 8 additions & 5 deletions server.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -422,7 +422,7 @@ async function serveStatic(req, res, pathname) {
createReadStream(filePath).pipe(res);
}

const server = createServer(async (req, res) => {
export default async function handler(req, res) {
try {
const requestUrl = new URL(req.url || "/", `http://${req.headers.host || "localhost"}`);
const { pathname } = requestUrl;
Expand Down Expand Up @@ -461,8 +461,11 @@ const server = createServer(async (req, res) => {
} catch (error) {
json(res, 500, { error: error instanceof Error ? error.message : "Unexpected server error." });
}
});
}

server.listen(port, () => {
console.log(`MatchlyPro server listening on http://localhost:${port}`);
});
if (!process.env.VERCEL) {
const server = createServer(handler);
server.listen(port, () => {
console.log(`MatchlyPro server listening on http://localhost:${port}`);
});
}
Loading