Changelog
All notable changes to Aavedak are documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
[Unreleased] — v0.1.0
First product cut of the Aavedak web app (2026-10-07) (local SQLite + Google Better Auth).
Changed
- Design system refresh (Vinyaas 1.5.0) — Every UI building block (buttons, fields, menus, tables, dialogs) was updated to the latest version of the Vinyaas component library. Visible changes: tables now sit in their own rounded, bordered frame with roomier rows and small-caps column headings, and columns can be dragged wider where a page enables it; date ranges in the calendar read as one continuous band with round ends; the character counter under long text fields is pinned to the field's bottom-right corner. The animated connectors on the homepage flow and the undo countdown buttons (Referrals, Inbox, admin) are now standard library components rather than Aavedak-only ones, with the same behaviour — a 20 s fuse on referral sends, 5 s elsewhere. Aavedak's own look is unchanged: dark field surfaces, lighter table dividers, the red-to-forest-green score rings, icon sizes inside buttons, and the Save/Send button spinners all stayed as they were.
Added
- Improve resume (
/resume-improver, nav Resume → Improve resume) — pick a reference resume, the role, your years of experience and, optionally, a job description.
- Deterministic rules only (no LLMs, no paid APIs): rewords weak openers ("Responsible for", "Worked on", "I …"), weak verbs and wrong tense in past roles; groups skills by category ordered by relevance; reorders bullets within a job and sections for the role (hand-written guidance for the 7 roles + a generic fallback).
- Fact guard: a change is dropped if it would add or alter a number, date, email/URL/phone, skill or named entity. Missing requirements are listed as gaps, never written in.
- One section holds the inputs: the reference resume (a searchable picker that starts on your active resume, with a Preview button), the role, years of experience (starts from your profile; a change here applies to that run only) and the job description. A second, collapsed section picks the engines exactly like the Resume score page: Native / Reference / Open Source toggles plus one card per engine, all selected by default.
- From a job — every job on the Jobs page has an Improve resume button that opens this page with the job's title and description filled in.
- When some of your accepted changes would, together with the others, alter a fact (your name or contact lines, a job title, a number, date or skill, or make the resume more than 5% longer), only those changes are left out and listed under Changes with the reason. The old "Limited changes — the combined changes failed a safety check" message is gone; the original is kept whole only when no change can be applied safely, and the reasons are shown.
- The last section is the ATS score table, the same one as the Resume score page and Jobs: two rows, Original and Improved, one column per engine with its score ring (the Improved row shows the change, ±), and the Final score. Each row has its downloads: the original PDF, or the improved version as PDF or DOCX. Both versions are scored with one identical pinned request; only the resume text differs. Drops are shown as computed. Engines that need a job description are skipped without one.
- Accept/reject each change; toggling re-scores with the same request.
- Download a plain single-column PDF or DOCX, or save it as a new inactive resume linked to the original (resumes.source_resume_id, origin = 'improver', plus a resume_improvements record with the scores). The original is untouched.
- Navigation — the top-level ATS link is now a Resume mega menu: a card on the left ("Score, improve and manage your resumes" + your active resume) and Score (
/ats), Improve and Upload resume (/documents?tab=resumes&upload=1, which scrolls to and focuses the upload form), each with an icon and a one-line description. Same items in the mobile nav and Cmd+K. The /ats page title is "Resume score". - One icon and name per feature — every feature now has one icon and one name, used the same way on the homepage flow, the header menus, the mobile nav, Cmd+K, page headings and buttons that open it (for example Resume score, Improve resume, Upload resume, Referrals, Inbox). Referrals and Inbox have icons in the header menu, and the Referrals page's Active applications, Email and People boxes have icons in their headers.
- Header menus now open under their own trigger (kept on screen) instead of at the left edge of the nav.
Fixed
- Improve resume — contact separators rule (improver 1.2) — Header lines that join items with three or more
| separators (email | phone | LinkedIn | GitHub) now switch to · (middle dot). ATS Resume Checker and Enhancv read three pipes on one line as a table structure, which reduces their formatting score; the middle dot is not a recognised separator mix. This is a fact-preserving swap — only the separator character changes. On a typical resume it gains +5 on Enhancv and +2 on Open ATS with no drops on other engines. - Improved PDF download fits 1 page — The Improve resume PDF download now does a two-pass render: it first measures the content height, and if it would overflow one page it scales fonts and margins down proportionally (maximum 25% reduction) so the result fits on one A4 page. DOCX spacing is also tightened. Nothing is removed; if the content is too long even at the minimum, it still flows naturally to a second page.
- Improve resume — the improved version now actually scores higher (improver 1.1) — Rewrites used to land on verbs the ATS engines don't count as strong ("Worked on" → "Contributed to", "Used" → "Applied"), so scores barely moved. Now:
- "Worked on building X" becomes "Built X", using your own verb. "Wrote" and "Made" become "Created", and "Fixed" becomes "Resolved". "Helped with" and "Assisted with" still become "Contributed to", so a supporting role is never written up as sole credit. "Used" is left as it is.
- Abbreviated months next to a year are spelled out ("Jun 2020" → "June 2020"), so every date has the same full month and year.
- Every change shows its measured effect on each engine (for example "+11 Resume Worded · +5 Rezi"). A change that lowers the scores overall starts unticked, with a note, and you can still tick it.
- On a sample 2-year resume the improved version goes from 54 to 61 on Aavedak ATS, 61 to 78 on Resume Worded, 68 to 81 on Rezi and 69 to 75 on Open ATS, and no engine drops. Nothing is invented: missing skills, numbers and summaries are still listed as gaps for you to fill.
- Improve resume — layout — Reference resume, role and years of experience sit on one row on wider screens. The second section is now Engines to improve for: the resume is improved for the engines you pick (each change is measured on them and one that would lower their scores starts unticked), and the Improve resume button sits in that section's header row.
- Icons — one size everywhere — Icons inside buttons are now 16px (14px in small buttons) with a gap before the label, instead of whatever size each icon happened to have; page-heading icons are slightly smaller. The Documents menu shows an icon for Resumes, Cover letters, Referral email and Follow-up email, using the same names, and the Documents page tabs carry the same icons.
- Jobscan, Teal and SkillSyncer engines (reference profile 1.5) — "other keywords" now come from the JD's actual requirements (boilerplate, benefits and company pitch removed, skills not double-counted, ranked by frequency, plural/inflection-aware); soft skills match inflections; "Go" is recognised; "Professional Experience"-style headings are detected and education dates no longer count as jobs; Jobscan and SkillSyncer report "requires a job description" instead of a fake 0/100.
- People table — Rebuilt on the Vinyaas DataTable.
- Every column sorts. Search covers name, company, role, email, location, GitHub and source. 20 per page, and you can show or hide columns.
- New Location column ("City, Country" from discovery's parsed location_city / country_code; "—" when unknown).
- Email has a copy button.
- Row actions (Edit, Archive/Restore, Delete with its confirmation) moved into a ⋯ dropdown menu.
- Dashboard: Referrals & replies — The "Needs a follow-up" card and its aging chart are replaced by a compact Referrals & replies card built only from Inbox data (follow-ups + replies).
- Stats: referral requests sent, replies received (with reply rate), awaiting reply, and queued.
- The 5 latest real replies (person · company · when, with the application's status badge). Each opens its Inbox thread (/outreach?thread=<id>).
- With no data it shows "No referral requests yet" with a link to Referrals.
- Status badges everywhere — Application statuses now use the shared
StatusBadge (inverted, per-status icon) on:
- the dashboard Recent applications card (Offers keep the primary fill) and Needs a status update card
- Job tracker table rows and kanban column headers
- the Referrals composer's application chips
- the Jobs "Applied" tab
Status dropdowns and the tracker's status filter chips show icon + label (StatusLabel). Icons stay on lucide-react; the app had no other icon library (only inline SVGs).
- Needs a follow-up card polish — The aging chart is now horizontal bars (age buckets down the side), all in the primary colour. Each listed application shows a status badge with its own icon (new shared
StatusBadge, lucide icons). The badge uses a new inverted Badge variant (foreground fill, background-coloured text).
- Dashboard Pipeline health — "Pipeline by status" (which repeated the Conversion funnel) is replaced by Needs a follow-up. It covers applications in Applied / Under review with no reply, shown as a bar chart by days since applied (0–7, 8–14, 15–30, 30+). It shows how many are past 7 days with no follow-up queued or sent that week, and lists the 5 oldest (company · role · days). Each opens that application in the Job tracker (
/job-tracker?edit=<id>), and a "Queue follow-ups" button links to Referrals. The Conversion funnel with response and offer rates stays.
- Slow cold starts — Vercel functions (web and API) now run in Singapore (
sin1), next to the Neon database, instead of US East. Web schema setup records a version (manual tag + hash of the setup code) in schema_version and skips its ~160 statements and data clean-ups when nothing changed: one query per cold start (~16 s → ~0.1 s locally). The API's discovery schema check does the same in one round trip. Signed-in pages load the profile and onboarding check in parallel.
- Admin page sections collapse — Every Admin section (Pending registrations, Recent resumes, Jobs, Discovery, Email suggest-corrections, allowlist) now uses the same collapsible card as the ATS steps, now a shared
CollapsibleSection component. Pending registrations starts open and the rest start closed. Header actions (resume filter, Discovery scan/rank buttons) work without collapsing the section. - Admin Jobs pagination — The Jobs list shows 5 jobs per page with page controls and an "x–y of N jobs" count. Search and filters still run server-side across all jobs and jump back to page 1.
- Inbox duplicates — The Inbox list now shows exactly one entry per person (matched by person, or by recipient email when no person is linked). Each person + application is one chronological thread merged across days; other applications with the same person appear as a thread switcher, latest first. All existing Inbox chats in production (15 follow-ups, 5 replies) were cleared once to start clean.
- Deleting people removes their chats — People now have a Delete action (admins or whoever added the person). After a confirmation it permanently removes the person with their Inbox chats, replies and queued follow-ups. Emails already sent via Gmail can't be recalled.
- Database size — Job descriptions are capped at 12,000 characters, discovered jobs no longer keep a second raw copy, and descriptions of jobs that expired or closed over a week ago (and that nobody applied to) are cleared, so the worldwide job pool stays within Neon's free 0.5 GB.
- Admin — Runs chart — The chart showed only the days that had discoveries, so 1M, 3M, 6M and 12M looked the same. Now every India-time day in the range appears on the x-axis, with 0 for quiet days, including days before the site existed. Every run kind gets a line even when it found nothing. A 1W option was added, and month ranges are calendar months ending today.
- Pickers inside dialogs — Date pickers, location and company lists, dropdowns, tooltips and hover cards now open on top of dialogs and side drawers (such as Add job and the admin job editor), not behind them. Pressing Escape in an open picker now closes just the picker, not the whole dialog.
Added
- Jobs worldwide, India first — Discovery now stores tech jobs from every country, not only India and India-open remote roles. Each job records its region and country. Recommendations and the Jobs page put Indian roles first, then remote roles open to India, then other remote and global roles. A new Region menu on Jobs (India first, India only, Outside India, All regions) defaults to India first. The 1-month posted cap and expiry are unchanged; postings already older than a month are not stored.
- Experience matched to you — The fixed "under 3 years" filter is gone. Each job stores its required years (minimum, and maximum when a range is stated; Senior titles count as 5+ and Staff/Principal as 8+ when nothing is stated). You are shown jobs needing up to your years of experience plus 2 (0 years: fresher to 2-year roles; 2 years: up to 4), plus jobs that state no requirement, and jobs closest to your level rank higher. Profiles without years count as 0. Badges show ranges like "2–4 yrs".
- Globe shows the world — The homepage globe plots openings in every country and slowly turns all the way round (it still starts on India). 63 global tech hubs (San Francisco, Seattle, Amsterdam, Dublin, Zurich, Tel Aviv, …) were added to the canonical locations from GeoNames, with no duplicates.
- People near the job — People discovery saves each person's city and country (from GitHub profiles, LinkedIn search snippets and Apollo). In a job's "People at company" and in Referrals, people in the same city come first, then the same country; people in other countries are listed last and labelled. Their location is shown.
- Company registry: 170 → 804 companies — The jobs scan now covers 804 companies with public job boards (Greenhouse 365, Ashby 317, Lever 88, SmartRecruiters 34), every board checked live against the provider's public API on 2026-10-13; dead or empty boards were dropped. New seed companies are added to the existing database automatically on the next scan, with no duplicates by board or company name. Scan and drain crons now get a 240 s budget (under Vercel's 300 s) and fetch 10 companies at a time, so the full list is still scanned every day with the existing crons.
- /health — aavedak.vercel.app/health returns JSON health for the web app, backend API, database (Neon version), GCS bucket, GitHub (token and remaining rate limit), Google search (today's usage against the cap, no search spent), Brave, SerpAPI, Hunter, Apollo, people discovery (last run, queued companies, email patterns) and the cron secret. Each check reports ok, degraded, down or not_configured with a time in ms. No keys or secrets are shown. The API's own report is at /svc/health.
- Jobs — company email format — When a job's company has a known email format, the People section of the job details shows it (for example first.last@example.com) with a confidence badge and a copy button, so you can find people on LinkedIn and build their addresses yourself. Unknown formats show "Unknown". A weaker guess never replaces a stronger format.
- People discovery — emails from GitHub commits — GitHub members without a public email now get one from their recent public commits (noreply addresses skipped), which also helps learn company email formats.
- People — GitHub profiles — The People table has a GitHub column with the person's handle, and a person's name opens their GitHub profile (or LinkedIn if there's no GitHub) in a new tab. Use Edit to change a contact.
- Cleaner job descriptions — Job descriptions no longer include text that isn't about the job: privacy and cookie notices, equal opportunity and non-discrimination statements, data protection (GDPR) notices, accessibility and accommodation notes, recruitment fraud warnings, legal footers and page navigation. This applies to Add job (filling from a link or a pasted JD), admin edits and daily discovery. Responsibilities, requirements, qualifications, skills, benefits and the role overview are kept, so ATS and match scores only see the job itself. Existing jobs were cleaned once. The original text is kept, and if cleaning would remove almost everything, the description is left as it was.
- Cover letters — real values — Placeholders in cover letters now fill in with your real details: {{user_name}}, {{user_email}}, {{linkedin}}, {{github}} and {{portfolio}} from your profile, {{company}}, {{role}} (or {{job_title}}) and {{location}} from the selected job or custom company, and {{date}}. This applies to the live preview, saved letters and PDF/DOCX downloads. Anything Aavedak can't fill, such as {{user_phone}} or {{hiring_manager}}, is highlighted in the preview and listed with a box to type a value. It's left out of downloads, so a PDF never shows raw {{…}}. The variables dialog shows the value each placeholder resolves to.
- Email templates — your real details in previews — Referral and follow-up template previews fill in your own name, email and links. Job, company and recipient use clearly labelled demo values (Software Engineer at Example Corp, to John Doe). When an email is queued to send, every placeholder fills in with real values, and {{user_name}} is now your full profile name.
- Tracker in the top menu — The desktop menu has a Tracker link again, next to Jobs, and it is highlighted while you're on the Job tracker. /jobs-tracker now redirects to /job-tracker.
- Jobs — Mark as unapplied — A job in the Applied tab has a "Mark as unapplied" button. After you confirm, the job goes back to Discover. Its application is removed from the Job tracker and its status history is deleted, so it drops out of your dashboard's application counts. Follow-ups still waiting to be sent for it are cancelled. Cover letters for it are kept in Documents but are no longer linked to the application.
- Admin — Jobs — The admin page has a Jobs section for searching every job by title, company, location, source link or id. You can filter by source and by a posted-date range, and results come in pages of 25. Edit opens a drawer with the same fields as Add job. Delete asks for confirmation and shows how many applications, cover letters and analyses refer to the job. Those keep their own details and history and only lose the link to the job. Saved and hidden states and scores for the job are removed. The posting is still remembered, so discovery won't add it again. Only admins can use these pages and routes. The posted-date filter is a single date-range picker that shows "from – to" and has a clear button.
- Jobs — Posted filter — A new Posted menu at the top of the Jobs page shows jobs from the last 24 hours (the default), 3 days, week, 2 weeks or month. Jobs are filtered by their posting date, or by when Aavedak first found them if the posting has no date. Jobs older than a month never appear on the Jobs page. Your choice is kept in the page link.
- Locations from one list — When you add a job, you now pick its location from a searchable list of cities (such as "Bengaluru, India") or Remote, so there are no typos or duplicate spellings. Filling from a link maps the posting's location to the right city (Bangalore → Bengaluru, Gurgaon → Gurugram, Bombay → Mumbai). If it can't tell which city, the field stays empty and shows what the posting said. Preferred locations in your profile use the same list, newly discovered jobs are saved with these names, and existing jobs and preferences were updated to match. "Posted on" now uses a date picker.
- Locations worldwide — The location list now covers 617 major cities in 106 countries, including every city of a million or more people, Indian cities of 500,000 or more, and the tech hubs Aavedak already knew. Each city has GeoNames coordinates, a country code and a state or region. Common spellings work (Sao Paulo, NYC, Bangalore). A name shared by two cities, like Hyderabad, goes to the country the posting names. With no country named, it goes to the much larger city. The Jobs location filter and the openings globe use the same list, so cities outside India show up too. The web app and job discovery now read one shared file. Coordinates are from GeoNames (CC BY 4.0).
- Add job — fill from a LinkedIn link — Paste a LinkedIn job link at the top of Add job (any form: the job page, a search or collections link with the job open, mobile links or lnkd.in short links). Aavedak reads the public posting and fills in the title, company, location, work mode, employment type, seniority, posted date, description and skills. It also fills the salary and apply link when LinkedIn shows them to signed-out visitors. It fetches on paste, when you leave the field, or with the Fetch button. Everything stays editable, and if you've already typed something different, Aavedak asks before replacing it. The link you pasted is saved with the job.
- Add job — SuccessFactors and other careers pages — Links to SAP SuccessFactors career sites (such as careers.hcltech.com/job/…) now fill in. Other company pages without structured job data now fall back to the page's title, headings and main text instead of failing.
- ATS — Aavedak ATS rebuilt as a best-of benchmark — The native engine now scores 11 resume-quality criteria taken from the strongest checks across every engine: ATS parseability, sections and contact, quantified impact, action verbs (weak openers like "Assisted" or "Helped" count against you), bullet length and count, buzzwords/pronouns/passive voice, verb tense consistency, repetition and spelling, dates and gaps, length for your years of experience, and skills shown in experience. Each criterion appears in the breakdown with what it found and which tools it comes from. With a title or job description, the score is 65% match (skills, responsibilities, experience, title, and now education and certifications) and 35% resume quality.
- ATS — years of experience — The ATS page has a Years of experience field, filled in from your profile's experience level and editable. Aavedak ATS and the Resume Worded engine calibrate their checks to it (expected length, number of bullets, share of quantified bullets, and leadership signals from about 3 years), and Aavedak ATS compares it with the years a job description asks for. Leave it empty to score without a level. Other engines ignore it.
- ATS — input help behind a ? icon — The "Required by … · optional for …" lists under Target role and Job description now sit in a tooltip behind a small ? next to each label, so the form takes less space.
- ATS — hover to see what each measure means — Every score row and signal in the ATS detail panel (for example ATS Parse Rate, Required Skills, Job Title Match, TF-IDF similarity or Quantified bullets) now explains itself when you hover over its name, so you can tell what the number is measuring.
- Resumes — 2 MB upload limit — Resume PDFs can now be up to 2 MB, down from 10 MB, on the Documents page, the ATS upload and onboarding. The server enforces the same limit.
- ATS and Jobs — preview resumes and highlight the active one — Each resume in the ATS page's resume list and in every results table (the ATS page and a job's ATS check on Jobs) has a Preview button that opens the PDF without leaving the page. The results table is now one shared component on both pages, so they look and behave the same. The active resume's row gets a primary-coloured border around the whole row.
- ATS — one results layout for every engine — The resume detail view now looks the same for all 11 ATS engines: a score breakdown, strengths as pills, matched/partial/missing skills as pills, and improvements as cards with a severity tag — instead of some engines showing a plain accordion and a vague "part of the transparent weighted model" line with no detail. Engines pick up relevant context (the scoring formula, caveats) in a "Methodology & limitations" section instead.
- ATS — Enhancv engine — A new reference engine approximates Enhancv's free resume checker: four Content checks shown as issue counts (ATS Parse Rate, Quantifying Impact, Repetition, Spelling & Grammar), each with the specific lines flagged and a fix. With a job description, it also blends in hard-skill coverage.
- ATS — filter engines by kind — A Native / Reference / Open Source toggle above the engine list selects or deselects every engine of that kind at once. All 11 engines now run by default (previously only the native engine was pre-selected).
- ATS Resume Checker — fewer false flags — "Missing contact section" no longer fires when your email or phone number is simply in the header without a "Contact" heading, which is how most resumes are laid out. "Repeated words" no longer flags a company, college, or product name that's capitalized and legitimately repeated — only ordinary words repeated unusually often.
- Resumes — ATS score as a pill, filename hidden on phones — On the Documents page, each resume card now shows its ATS score as a small colored pill instead of plain text, and hides the original filename on phone screens (keeping the display name and file size) so the row stays readable.
- Referrals — one People card with a fuse button — The People column is now a single card. The list scrolls and the queue button stays pinned at its foot. Pressing Queue referral no longer opens a toast: the button turns into Undo with a fuse around its border that starts at the top middle and burns clockwise, all the way round, over 20 seconds, and the mail sends when it runs out. Press Undo before then and nothing is sent. Pressing the button is the confirmation, so the old "I confirm these recipients" checkbox is gone. Admins get the same button for Scan all sources now and Discover people now, with a 5-second undo; the scan confirmation dialog is replaced by it.
- Jobs — salary and stipend on job cards — When a company states pay for a role, the job card now shows it: on the Jobs list, in the job's details and in the Dashboard's top matches. It comes from the pay a hiring platform publishes with the posting, or a clearly labelled line in the posting itself such as "Stipend: ₹25,000/month" or "CTC: 6–8 LPA". Aavedak never estimates pay: phrases like "competitive salary" show nothing, and a pay range published for another country (for example a US or UK band on a Bengaluru role) is left out rather than shown as if it applied. Many postings for junior roles in India don't state pay, so expect the badge on only some jobs.
- Jobs — company careers pages come first — Each company Aavedak scans now has its own careers page tracked as the primary source of truth, alongside the hiring platform it uses. Every scan also reads the job listings the careers page publishes (one page, respecting the site's robots.txt). When the careers page lists a job, the job links there instead of to the hiring platform, and that link stays. Careers pages are found automatically when a company's job links already point to its own site (for example careers.airbnb.com), and admins can add or correct them on the Admin page. Pages that load their jobs with JavaScript publish no readable job data. For those, the hiring platform keeps supplying the jobs and the page is rechecked weekly.
- Homepage — how it works, step by step — The homepage now shows how a job search runs in Aavedak as one diagram, in place of the Discover, Prepare and Act cards. It starts with onboarding and your resume, then your Dashboard and finding openings, and branches into a cover letter, an ATS check you can repeat while you refine your resume, and asking for referrals. Those paths meet at Apply, then track the application and follow up. Thin curved lines link the steps, a yellow dot travels along each one to show the flow, and pairs of lines running both ways mark the steps you go back to. Each step links to its page. With reduced motion turned on, the dots stay hidden.
- Homepage — where the roles are — A slowly turning globe marks every city with open roles as a small gold dot, sized by how many roles are open there, next to how many cities and companies are hiring. Cities with more than one open role also get a label with their count; hover any other dot to see its city and count. Hover a city label for a quick look at its open roles; click it, or See jobs in…, to open Jobs searched by that city. It shows counts only, the same for every visitor, refreshes hourly and follows your light or dark theme. Drag the globe to turn it.
- Homepage — what Aavedak promises — A new section sets out the rules the app always follows: every job links to the company's own posting, nothing is sent until you send it from your own Gmail, new roles are matched to your skills, roles and locations with a few fresh picks each day, and nothing is guessed, neither job requirements nor anyone's email.
- Homepage — questions — A short FAQ at the end of the homepage answers where jobs come from, who Aavedak is for, whether it applies or sends emails for you (it doesn't), what the ATS check does and how to get access, with a link to the full How it works page. Sections on the homepage are now evenly spaced on every screen size.
- Jobs — search and location in the link — The search box is now kept in the page address (
?q=), so a shared link or the homepage globe opens Jobs already searched. Searching a city name also finds its other spellings: "Bengaluru" matches postings that say "Bangalore" or "Bengaluru, KA". A new location menu next to the source filter narrows the list to one city, or to remote roles, with a count for each, also kept in the address (?location=). Both survive signing in from a link. - Theme — modern dark-first, yellow primary — The colour theme is tuned for dark mode first: a near-black page, with cards a step lighter and the sections that hold them (lists, tracker columns) lighter again, so every surface reads as a distinct layer. Dividers are now a thin, translucent grey line instead of a flat colour. Form fields (inputs, textareas, selects, checkboxes) get their own dark fill, the darkest surface in the palette, so they read as a recessed well wherever they sit. Tabs placed over a section or a card always contrast with it, for the same reason. Text contrast is checked against WCAG AA in both themes.
- One job card style everywhere — Jobs and applications look the same on every page: Referrals, the Job tracker board and the Dashboard's Top new matches and Recent applications now use the Jobs page card, with the company's initials, the role, "company · location" and a row of small tags (status, dates, matched skills). On the tracker board, cards show the company, then the role, then the applied date and location, with the drag handle at the top right; on the Dashboard the match score ring sits there. The colour theme is now a warm near-black (or white) with a bright yellow accent. Cards match the page and are outlined, and sit on lighter grey sections. In the Outreach chat your messages are solid yellow bubbles and replies are grey. That applies to the Jobs and Outreach lists, the Referrals applications column, the tracker columns and the Dashboard's job lists. Contrast is checked in both themes: small grey text stays easy to read and form fields have clear outlines.
- Jobs — add a job from its link — Add job now opens with a link box. Paste a job's link and Fetch details fills in the title, company, location, link and description from the posting. It works with Greenhouse, Lever, Ashby, Workable and SmartRecruiters links, and with company career pages that publish job data. You check the details, then Create; nothing is saved until you do, and fields the posting doesn't include stay empty. LinkedIn, Naukri and Indeed don't allow automated reading, so for their links Aavedak keeps the link and you type the rest. Entering everything yourself is in an Add manually section below, laid out in two columns on wider screens with a full-width description.
- Outreach — chat-style inbox — The Outreach inbox now looks and works like a messaging app. Conversations are cards, as on the Jobs page, showing the person, company and role, a preview of the latest message, its status and whether they replied. The newest conversation sits on top. Each chat opens at the latest message over a soft patterned background that follows your light or dark theme. Your mail sits on the right with a delivery tick and replies on the left, with a date divider for each day. Messages are in time order, and a dated divider (Today, Yesterday or the date) starts each day. On phones you see one screen at a time, the list or the open chat, with a back button. The application and time filters sit behind a Filters button that opens a sheet from the bottom, so the top of the page stays short. The inbox can also open full screen on phones, like a messaging app, with the collapse button always at the top right.
- Outreach — reply from the chat — A message box at the bottom of each conversation lets you write your own message and attach a resume. Pressing Send turns the round button into an Undo with a circular fuse around it that burns clockwise from the top for 5 seconds, then delivers the message from your Gmail (Undo keeps your text in the box and sends nothing). The text is locked while the fuse burns. The message goes out as a reply in the same email thread. It appears in the chat at once as "Sending…" and gets a tick when Gmail has sent it; if it can't be queued, your text comes back to the box. The paperclip button next to Send opens a list of your resumes to choose one to attach. Chat replies are never held by the one-hour wait between follow-ups. That wait now only applies to template follow-ups from Referrals, and stops once the person has replied.
- People — add a LinkedIn profile — The New person and Edit person forms now have a LinkedIn field, so you can keep a contact's profile link alongside their name, company, role and email. Paste any LinkedIn profile URL (
linkedin.com/in/…); Aavedak tidies it to a standard form, shows an "in" link next to the person, and won't let the same profile be attached to two different contacts. CSV import already accepted a linkedin column, and this brings the same to contacts you add by hand. Aavedak never fetches or scrapes LinkedIn — it only stores what you enter. - People — automatic discovery of company recruiting inboxes — A new daily job (and an admin "Discover people now" button) finds each company's openly published recruiting inbox — addresses like
careers@, jobs@ or hr@ — from the job postings Aavedak already scans, its job board, and — when those have none — the company's own website (its careers page and at most one careers or contact page linked from it, respecting robots.txt), and adds it to the shared People directory as a clearly labelled "<Company> — Careers" contact you can reach out to. Everything it stores is marked unverified. It only ever keeps an address that is actually published: Aavedak never guesses an email from someone's name, never scrapes LinkedIn or other profiles, and uses no paid lookup service — so it collects company inboxes, not the personal addresses of named individuals. An address found on a company's website is only kept if it's on that company's own domain. Most large companies don't publish such an inbox, so expect contacts mainly from smaller companies. It runs once a day automatically, and admins can trigger it on demand from the admin page, where each run now reads "152 of 165 companies checked · 3 inboxes found · 2 new contacts" instead of bare numbers (job scans read "32 of 32 boards scanned", imports "4 of 4 batches imported"). - Jobs — contact email from the posting — When a discovered job's description openly lists an application or recruiting address (such as
careers@ or jobs@), Discover now shows it as an "Apply by email" link on the job, marked "from the posting · unverified". Aavedak only ever surfaces an address that is actually printed in the posting and never guesses one from a name; when several addresses appear and none clearly marks the application inbox, none is shown. - People — automatic credit for replies — When someone replies to your referral or follow-up email, Aavedak adds 1 point to their score on your behalf, separate from the up and down votes people cast. It counts once per person for each Aavedak user they reply to, and only for a real reply from their own address; out-of-office notices, auto-replies and bounces don't count. Hover over the score to see how much of it comes from replies.
- Outreach — replies to your mails — Optional reply detection reads replies to the referral and follow-up mails Aavedak sent from your Gmail. Replies appear under the mail with a Replied badge; press Check replies, or they are checked daily. Authorize it once from Outreach; sending keeps working without it. Aavedak only reads threads of mails it sent.
- How it works page — A new public page at
/how-it-works explains where Discover jobs come from. It covers the hiring-platform feeds behind company career pages, companies' own career pages that publish job data, and what isn't covered. It lists every company whose careers board is scanned, each linked to its board, and sets out which jobs are kept and how recommendations are ranked. It walks through the Referrals page step by step and covers the ATS page: its three modes, the Final score, and all 10 ATS engines (1 native, 5 reference, 4 open source) with what each measures and the inputs it needs. On wide screens a table of contents on the right follows you as you scroll. It's linked from the footer, the About page and the command palette (⌘K), and included in the sitemap with search and social-preview details. - About — copy-ready summaries — The About page now has a one-line, a short and a detailed description of Aavedak, each with a Copy button, for pasting into a profile, portfolio or post. It also gained a "Who it's for" section and an updated workspace map that includes the Dashboard and ATS pages.
- Jobs — wider job discovery — Discover jobs now finds more than engineering roles. Every engineering role counts, whatever the discipline (software, data engineering, DevOps, cloud, embedded, electrical, mechanical, civil and more), including Indian junior titles like Member of Technical Staff, Software Development Trainee and Technology Analyst. Junior openings in data and analytics, machine learning and AI, QA and testing, IT support and infrastructure, security, UI/UX and product design, and associate product manager roles are included too. Remote jobs open to India (worldwide, anywhere, APAC or Asia) now count, alongside many more Indian cities, tech parks and industrial hubs. A plain "Remote" with no region is still left out, because it usually means remote within another country. The daily scan now covers 52 more companies' career pages (170 in total), including Supabase, DevRev, Veeva, Atlys, Headout, DoorDash, Abnormal Security, Cerebras, IMC Trading, WorldQuant and Coursera. The rules haven't changed otherwise: only roles asking for under 3 years of experience, and every job links to its original posting.
- Dashboard — pipeline radar — Applications by status now show as a radar chart, one spoke per status.
- Dashboard — cleaner applications-per-day line — The "Applications per day" line no longer draws a dot on every day; the dot still appears under the cursor when you hover a day.
- Navbar — account dropdown — The avatar opens a dropdown menu (Vinyaas dropdown) with your name and email, the page links, and sign out.
- Resume preview — laptop actions and A4 size — On larger screens the resume preview shows Open in new tab and a close button in its header, and the page is sized as an A4 sheet. Phones keep the footer actions.
- Jobs re-rank on career changes — Saving Career preferences in Profile settings now re-ranks your Discover jobs straight away. Open recommendations are re-scored against the new preferences, ones that no longer reach the match threshold leave Discover, and new matches fill any remaining daily slots. Discover is ordered by match score, best first. The Documents page opens the tab in its link (
?tab=, default Resumes), and a cover letter started from a job's Cover letter button preselects that job. - Profile — bio and projects — The bio accepts up to 1,600 characters with a counter and grows as you type. Each project's Remove button sits on its title row.
- Tracker — toolbar — Search sits on the left of one toolbar with the view switch and actions on the right; the Kanban column choices open below it.
- UI — upgraded component library — The interface now uses Vinyaas 1.4.0 throughout. Dialogs are larger with a gentle open and close animation, toasts show an action button with their own animation, and the command palette (⌘K) opens in the same dialog. Jobs and Referrals use the upgraded toggle groups for sorting, status filters and engine choices, and the Jobs tabs and sort toggle use the new styling. The job discovery setting in Profile settings is now a switch. Error and success messages are alerts, long lists scroll in themed scroll areas, search boxes and form fields share one input style, and the applied-date field uses a proper date picker. The cover-letter job picker is a searchable combobox.
- UI — spinners only on the pressed button — Buttons no longer spin together. On Jobs (Mark applied, Bookmark, Ignore), Referrals (queue and add person), Friends (New link and Remove) and Documents (Set as showcase and Archive), only the button you pressed shows its loading state; the others just disable until it finishes.
- Jobs — tab and sort in the link — The selected tab (Discover or Applied), the posted-date sort (newest or oldest) and the selected job are kept in the page address. Reloading the page or opening a shared link brings you back to the same view. Without them, the page opens on Discover, newest first.
- Dashboard — redesigned with key stats and charts — The dashboard opens with four headline numbers: active applications (with how many you logged this week compared with last week), response rate, interviews and pending follow-ups. A new conversion funnel shows how many applications reached screening, interview and offer, counting stages they passed through before a later rejection. Pipeline by status is now a horizontal bar chart covering every status, the applications-per-day chart has a compact 1M/3M/6M/12M switch, follow-ups are tagged Overdue, Today, This week or Later, and a Workspace strip links to saved jobs, resumes, cover letters, people and archived applications. Top new matches lists your five best open job recommendations with their match score, matched skills, posting age and a link to the original posting. Needs a status update lists applications sitting in Applied, Under review, Assessment or Interview for 14 days or more, so you can update them or mark them Ghosted or Rejected and keep your tracker accurate. The page is grouped top to bottom by purpose: Overview (headline numbers and a full-width applications-per-day chart), Needs attention, Jobs and applications, Pipeline health (status chart beside the funnel) and Workspace. Each block loads on its own with a placeholder in its place, so quick numbers show straight away and a slow block such as job matches doesn't hold up the rest. On phones the layout stacks cleanly and the chart's range switch moves below its title.
- Jobs — Refresh jobs button — Anyone signed in can now refresh jobs from the top bar of the Jobs page. It scans every company career page right away instead of waiting for the nightly run, and new matches appear as each batch finishes.
- Referrals — search, status filter and unapplied jobs — The top strip has a search box and status toggles (Not applied, Bookmarked, Preparing, Applied and more) to narrow the Active applications list. The list now includes jobs from the Jobs page you haven't applied to yet, marked "Not applied". Sending a referral for one adds it to your tracker as Bookmarked first. The strip sits closer to the columns.
- Documents and ATS — pages load right away — The rest of each page appears immediately while your resumes load, and only the resume list shows a skeleton. The ATS page no longer shows a full-page loader.
- ATS and Jobs — final score column — Each resume row ends with a Final score: the average of every engine score that ran for it, shown as a ring with its verdict. It is display only and does not open a detail view.
- ATS and Jobs — faster pages — Session lookups are shared within a request, the profile is no longer written on every page view, the site header streams in without holding up the page, and the Documents page loads its data in parallel.
- Jobs — partial loading — The Jobs heading shows straight away and only the job list and details show a skeleton while your matches load.
- ATS and Jobs — final score alignment — Placeholder dashes in the Final score column are centred. Scores are right-aligned so every ring lines up in one column.
- Job tracker and Referrals — taller loaders — The loading placeholders now use the same column height as the real boards, so the page no longer grows when your applications arrive.
- Loading skeletons match the pages — Loading placeholders now follow the current layouts of Referrals, Outreach, Follow-ups, Job tracker, People and Documents, so the page doesn't shift when content arrives.
- Jobs — sort by posted date — A toggle beside the Discover and Applied tabs sorts the list newest first (the default) or oldest first. Jobs without a posting date sort last.
- ATS — mobile layout — The results filters sit side by side in a two-column grid on phones, the results table uses narrower columns, and the Loaded from Jobs banner wraps.
- Full-screen board button hidden on phones — The expand control on Jobs, Referrals and Outreach only appears on larger screens.
- Consistent full-page loaders — Every full-page loading state now shares one frame: the same backdrop, container and screen-reader status, so each page's loader looks and announces itself the same way.
- Jobs — no width shift — The list pane keeps your saved width from the first paint, and the loading skeleton uses the same width and layout, so nothing jumps when jobs load.
- Search icons — Every search box now shows a magnifying-glass icon before the placeholder.
- Referrals and Outreach — full-screen boards — Like Jobs, the Referrals columns and the Outreach inbox can expand to a full-screen board and collapse back. Each top strip links to the other page, and in full-screen mode that link opens the other board full-screen too.
- Referrals — active applications — The left column now lists every open application, from your tracker and from jobs you applied to or bookmarked on Jobs, not just ones marked Applied. Each shows its status and a "From Jobs" tag where it applies. The page header is simpler: the Admin badge and Manage people button are gone, and Open outreach inbox moved to the top strip.
- Jobs — full-screen board — A top bar holds search, a source filter, Add job and Paste JD. The expand button opens the jobs board on its own full-screen page, and collapse brings you back to the same job.
- Jobs — cleaner layout — The job list and the job details are now two separate panels. The Discover and Applied tabs, search and source filters sit at the top of the list. Details are split into spaced sections for the job, the description, people at the company and the resume check, and both panels scroll on their own with no empty space below. Each card shows where the job came from (Greenhouse, Lever, Ashby, LinkedIn and so on).
- Jobs — simpler job details — Everything about a job (source, match, experience, salary, posting age, days left) fits in one compact header. The job description has a copy button.
- Jobs — ATS check for each job — Score your resumes against a job with as many ATS engines as you like at once, right on the Jobs page, in a resume-by-engine table like the ATS page. Columns are evenly spaced, scores and loading spinners sit centered in fixed-height cells so nothing jumps, and selected engines are outlined in the accent colour. "Detailed scan on ATS page" opens the ATS page with the job title, description, resumes and engine already filled in, for the full report and improvement tips.
- Jobs — how it works — A "How Jobs works" section at the bottom explains where jobs come from, how matches are picked, expiry, and the ATS check.
- Job tracker — application dates — Each application card shows the date you applied (or the date it was added, for bookmarked jobs). The list view has an Applied column too.
- Jobs — daily discovery of junior engineering roles in India — Aavedak now scans company career pages every night (public Greenhouse, Lever, Ashby, SmartRecruiters and Workable boards, plus career pages that publish structured job data) and keeps only India-based engineering roles that ask for under 3 years of experience. Each day you get up to 50 new matches ranked against your resume and career preferences. Sites without permitted access (LinkedIn, Naukri, Indeed and similar) are not scraped.
- Jobs — Discover and Applied tabs — Discover lists your new matches and the jobs you added yourself. Each shows when it was posted, how many days it has left, the experience it asks for, and why it matches your profile. Mark applied or Bookmark moves a job to Applied, and Ignore hides it. Matches stay until you act on them.
- Jobs — 30-day expiry — A discovered job leaves both tabs 30 days after it was posted. If you had only bookmarked it, were preparing, had applied, or were waiting to hear back, the application is marked Rejected with a "Job expired" badge. Your history stays in the tracker and you can change the status back. Applications at assessment, interview or offer are never touched.
- Jobs — original post link on every card — Each job card links to the original posting, and so does the job's detail view. Discovery only stores jobs that come with their original link.
- Jobs — people at the company — Each job shows contacts at that company who could help with a referral, ordered by how relevant their role is and by votes from other users.
- People — votes — You can upvote or downvote any contact once and change your vote later. Votes show how useful others found a contact, not whether that person will refer you. Contacts added by admin discovery are labelled Discovered.
- Profile — Job discovery setting — Turn daily recommendations off or on in Profile settings.
- Admin — Discovery panel — Admins can manage the career-page list (search, enable or disable, bulk-add URLs, re-import the verified starter list of 118 company boards) and start a scan on demand. They can also run expiry or ranking, follow run progress, retry failed items, and bulk-import thousands of people from a CSV. Imports only fill missing details, never mark emails as verified, and skip phone numbers.
- Application history — Every status change is now recorded, whether you made it or the job expired.
- Real Gmail send — Follow-up queue uses Gmail API (
gmail.send + offline refresh); cron every 10m; re-consent banner on Referrals / Follow-ups / Profile. - SEO —
sitemap.xml, robots.ts, OG/Twitter image route, public index vs app noindex, JSON-LD retained. - Follow-ups — Dedicated
/follow-ups list: open/all/closed filters, create, mark done/dismiss/reopen, process due queue (Gmail stub). - People CRM — Dedicated
/people shell: search, add/edit drawer, archive/restore, link to applications. - About — Public
/about page with product principles and workspace map. - Auth — Google-only sign-in via Better Auth; profile ensure on session.
- Onboarding — Require at least one PDF resume before the app shell.
- Dashboard — Signed-in home shell after onboarding.
- Job tracker — Kanban + list views, status columns, drag-and-drop status changes, archive scope, column visibility preferences.
- Applications import — Import Applications dialog with human-readable schema, sample JSON (including seeded applied roles),
.json upload via Vinyaas FileUpload, strict all-or-nothing client + server validation, duplicate company+role skip summary. POST /api/applications/import, schema at /schemas/applications-import.json and /api/applications/import/schema. - Seed applied roles — On job-tracker load, idempotent upsert of four applied applications (JioSaavn SDE-BE Mumbai, Kobie SDE Bangalore, Teradata SDE Hyderabad, Zuvees SDE-1 Bangalore) with
applied_at / created_at around 2026-09-22–23. Also POST /api/applications/seed-demo-applied. - Documents — Resumes (archive-not-delete), cover letters, text templates; PDF upload via FileUpload.
- Referrals — People contacts + follow-up tasks.
- Jobs — User-scoped jobs master-detail and pasted JD analyses.
- Theme — Dark/light brand theme, FOUC-safe cookie SSR, cropped logo, denser UI and micro-animations.
- SEO — Metadata, favicons, robots / webmanifest.
- Changelog — This file and public
/changelog page.
Changed
- ATS — final score weighted by engine type — The Final score column on the ATS page and Jobs is no longer a plain average. Aavedak ATS counts for 50%, the reference engines (Jobscan, SkillSyncer, Resume Worded, Rezi, Teal, Enhancv) for 35% and the open-source engines for 15%. Inside each group, engines with better-documented criteria count a little more. Engines that didn't run, for example ones that need a job description you didn't give, are left out and the rest share their weight. Hover the final score to see each engine's weight. Teal's Resume Score and Rezi's audits are also weighted now (metrics, contact and job targeting count more) instead of counting every check equally.
- Score rings — one smooth red-to-green scale — Every score ring now shades smoothly from red at 0 through amber and yellow to forest green at 100. The number inside always uses the normal text color, so it reads clearly in light and dark mode.
- Profile — exact years of experience — Onboarding now asks for your years of experience as a number (0–50, decimals like 1.5 allowed) instead of a range, and you can change it in profile settings. Existing profiles were filled in from the range you picked before (for example 1–3 years became 2). ATS scores, resume cards and job matching all use it automatically, so the ATS page no longer has its own years field. Changing it, or an update to the Aavedak ATS engine, rescores your resume cards the next time you open Documents.
- Phone menu as a sidebar — On phones, the menu button now slides a sidebar in from the left instead of dropping a list under the header. It shows the Aavedak name at the top, your pages in two labelled groups with icons — Workspace (Dashboard, Jobs, Tracker, ATS) and Apply & reach out (Documents, Referrals, Outreach, People) — with the page you're on highlighted, and your name, email and photo at the foot, linking to your profile. Tap outside it or press Escape to close it.
- Outreach — tidier conversation cards — Each conversation card in the Outreach list now reads like a chat app in three short lines: the person's name and the time of the last message, their company and role, then the newest message. If you sent it, a tick shows it went out (a red cross if it failed, a clock while it's sending) in place of the old "Success" badge. If they wrote it, their first name comes first. A small Replied tag, with the number of replies when there's more than one, sits at the end of that line.
- Faster-feeling navigation — Clicking a link now responds at once: a thin yellow bar at the top of the page starts moving the moment you click and finishes when the new page arrives, so a slow load never feels like a dead click. Menu shortcuts (the account menu and the ⌘K command palette) start loading their pages as soon as the menu opens, so the page's loading placeholder appears straight away when you pick one. Jobs now shows its own heading and job-list placeholder while loading instead of a generic one. The Job tracker, People and profile pages load their data in parallel, and the Job tracker looks up linked jobs in one go instead of one by one, so they open noticeably faster when you have many applications.
- Header menu on laptops — On wider screens the header reads Dashboard, Jobs, Documents, Referrals and ATS. Hovering Documents opens a panel with its four tabs (Resume, Cover Letter, Referral Email, Follow-up Email), each with a one-line description, and picking one opens that tab directly — even if you're already on Documents. Hovering Referrals opens Referrals and Inbox, plus a card on the right with shortcuts to open your referrals board or inbox in full screen. The menu works with the keyboard (arrow keys, Escape). The phone menu is unchanged.
- Times shown in IST — Every timestamp across Aavedak is now shown in India Standard Time (IST) instead of UTC — admin tables, outreach, and anywhere a date-and-time appears. The "UTC" label is replaced with "IST".
- Admin page — refreshed layout and faster loading — The admin Ops overview is tidier and quicker to open. The headline counts, pending registrations and recent resumes each load on their own with a placeholder, so the page appears straight away and a slow query no longer holds up the rest. Recent resumes is now a proper data table — search, sortable columns, show/hide columns and pagination — with the status filter as a segmented toggle (All / Active / Inactive / Archived). The discovery section groups its actions, shows errors as an alert, and has a dedicated Runs section: a full-width line chart of how many jobs and people were discovered per day (one line per kind, with a 1M/3M/6M/12M range switch) above a paginated recent-runs list. One kind filter (All / Jobs / People discovery / People import) drives both the chart and the list, and hovering it shows when each cron runs during the day (India time) and how long until the next run. The redundant Dashboard and Referrals links were removed from the top of the page.
- Filled jobs are retired, your application is kept — When a discovered job is filled or taken down at the source, it now drops out of Discover and the Jobs page automatically (a daily check). If you had already applied to it or bookmarked it, your application stays in your tracker and on the Jobs page, with a "Removed from portal" badge so you know the posting is gone. Nothing you added is deleted.
- Discovery chart — clearer lines — The admin "Discovered over time" chart now counts how many jobs and people were discovered each day (not how many times the job ran), draws smooth lines, and shows a point only when you hover it. The Recent runs list below it is a sortable, searchable data table with a per-run progress bar and percent, result badges, status, start time and a retry action, and lets you choose how many rows to show per page.
- Job discovery spread across the day — The automatic career-page scan no longer runs as one nightly burst. Its six shards are now spaced every four hours through the day, so newly posted jobs show up throughout the day instead of all at once overnight.
- Outreach — chat view — Each conversation reads like a chat. Your referral and follow-up mails are bubbles on the right with a tick when sent or a cross when failed (retry stays on failed ones). Replies from the person are bubbles on the left. A Refresh button at the top checks for replies now, in addition to the daily check.
- Forms — field labels — Settings, career preferences and the ATS page use proper form labels above each field, linked to the field so clicking a label focuses it. The account, theme and notification menus use the standard Vinyaas dropdown styling.
- Header dropdowns — Vinyaas menus — The account, theme and admin notification menus all use the Vinyaas dropdown menu now; the hand-built header menu is removed.
- Settings — showcase resume choice — Showcase resume is a radio list, so exactly one resume is active at a time: picking another one makes it the showcase and the previous one steps down. The ATS link is gone from the account menu.
- ATS — engines re-checked against their sources — The four open-source engines were compared line by line with their original projects. Scores now match them more closely: similarity scoring uses the exact word list of the original library, and ATS Resume Checker rounds scores the way the original does.
- ATS — Jobscan-, Resume Worded- and Rezi-style engines follow what the products publish — Jobscan-style now weighs hard skills most (and frequent ones more), then education (only when the job asks for an advanced degree), job title, soft skills and other keywords. Resume Worded-style scores Impact, Brevity and Style checks. Rezi-style passes or fails its published checks (bullets per role, word count, full-month dates, pronouns, buzzwords, passive voice, grouped skills). Their exact weights are not public, so they remain approximations.
- ATS — many more skills recognised — Skill detection grew from about 55 to 126 skills, adding machine learning, GenAI (LLMs, RAG, prompt engineering, embeddings), data (feature engineering, data preprocessing, scikit-learn, pandas), testing, tooling and mobile skills. Job descriptions in these fields were previously under-counted, which made match scores too generous. The Jobscan-style title match is now all-or-nothing, like Jobscan's "title not found" check.
- ATS — Jobscan-style works for non-software jobs — When a job description mentions few software skills (a mechanical-engineering role, for example), the Jobscan-style engine now treats the job's own recurring terms as its hard skills. A software resume against such a job moved from about 2 to about 22, close to the 24 Jobscan itself reported.
- ATS — Aavedak resume quality tells resumes apart — Resume quality is now based on the share of strong, quantified and well-sized bullets instead of raw counts, so ordinary resumes no longer all land at 91–92. It also lowers the score for hedging phrases, passive voice, first-person pronouns, buzzwords and very long resumes, and suggests how to fix them.
- Jobs page tweaks — The source filter is wider, and "About the job" has a fixed maximum height in the normal view (it scrolls inside). In full screen it still stretches to fill the panel.
- Version — Aavedak is now labelled v0.1.0, since it hasn't had a public release yet.
- ATS scores always come from the full scoring engine — Every ATS engine now scores only through the scoring service. If the service is down, the result says "Service unavailable" instead of showing a simplified offline score that could differ from the real one.
- Resizable panels — The divider between side-by-side panels (Jobs, Outreach) is now a simple three-dot grip in a gap half as wide as before, instead of a border line and handle. In the Jobs resume check, the resume column stays in place while you scroll across engines.
- Faster ATS scans — When you score several resumes, they are now scanned at the same time instead of one after another, on both the ATS page and the Jobs page.
- Smaller API deployment — The Python function no longer ships the local development server or test tooling, and tests, scripts and docs are excluded from deployments, roughly halving the API bundle.
- Refreshed UI components — Avatars, cards, badges, file uploads, dividers, side panels and confirmation dialogs now use the official Vinyaas components, with smoother open and close animations.
- Discovery moved to the API — Job and people discovery now run in the FastAPI service as small, resumable batches. Nightly runs are spread across several daily schedules so no single run holds the database. The old daily web ingest was removed.
- Jobs page — The page now shows only jobs recommended to you, jobs you acted on, and jobs you added, not every shared job. Scores are no longer calculated while the page loads.
- ATS — four open-source-based engines — Open ATS, ATS Resume Checker, Resume Skills Extractor and Hybrid Resume Analyzer. Each one adapts the scoring formulas found in that project's source code. Every report shows its own weighted breakdown, severity-ranked findings, fixes linked to those findings, its score type, and the places where it differs from the original. These engines need the scoring service and show a clear error rather than a substitute score when it's unavailable.
- ATS — open-source engines without a job description — Open ATS and Hybrid Resume Analyzer now also run with just a resume, and all four run with just a job title. A title is matched against that role's skill profile. Resume Skills Extractor still needs a title or JD, because it can only score against something. Each report labels which kind of score it is.
- ATS — live processing stages — Each result cell now shows the stage the backend is actually working on (Parsing, Extracting, Matching, Scoring, …), each a single word so it fits the narrow cell instead of a generic "Analyzing…". Runs can be cancelled, and failed cells offer Retry.
- ATS — specific outcomes and score rings — Result cells show a circular score gauge (color ramps orange→green with the score) rather than a flat number, and say "Needs input", "Unsupported mode", "Parsing failed", "Analysis failed", or "Service unavailable" instead of a blank score. Engines are labelled by name with a small Native / OSS / Ref tag in the selector, table and detail view.
- Dashboard applications/day charts — One shared multi-line chart (you + friends as distinct colored series); range control on the chart bottom-right; counts derive from live applications (hard delete lowers the day).
- Friends — Profile invite URL;
/friends/invite/[token] confirm; accepted friendships appear as lines on the shared dashboard graph. - Referrals — 20s on-screen countdown before batch Gmail send; Attach resume in the Cold email preview (one uploaded PDF).
- ATS —
/ats page + dashboard card; readiness / JD match scoring; inactive resumes can be permanently deleted (keep ≥1 active). - Tracker — Download applications JSON backup for re-import.
- Wipe script —
scripts/wipe-all-data.mjs clears Neon app + Better Auth tables and GCS resumes/ (not GCP OAuth clients). - Job tracker delete — Hard-deletes applications (no longer archive-only) so activity graphs stay accurate.
- Referrals add-person — Company field uses creatable Company Select (not free text).
- Profile links — Portfolio, LinkedIn, GitHub, LeetCode, HackerRank, X/Twitter, Website (persisted in
links_json; legacy portfolio/linkedin columns kept in sync). - Cover letter footer — Checkboxes pull email + links from profile (disabled when empty); live preview + PDF/DOCX use sans-serif.
- Showcase resume — Only one active resume for public profile; activating demotes others.
- UI — Slightly tighter global
--radius (0.875rem → 0.75rem). - UI — Smaller circular ⓘ tip; Vinyaas-default resize gutter (1px + grip chip); dummy/preview placeholders use John Doe / example.com (not personal email).
- Cold templates — “New blank template” clears editor and focuses title (fixed/ clarified Add new).
- Cover letters — Side panel of saved cover templates; searchable application Select;
{{role}}/{{company}} vars; live PDF-style preview; footer fields (portfolio, email, LinkedIn, GitHub) in preview + PDF/DOCX. - Select — Optional
searchable filter on SelectContent. - Rebrand — Product display name Aavedak (आवेदक); root folder
aavedak; package/CSS prefixes; prod URL examples https://aavedak.vercel.app. - Documents — Cold-email template editor: ⓘ (single circle, foreground) top-right on new-template card; Your templates flat like resumes. Cover letters company-specific + cover templates + PDF/DOCX download.
- Referrals — Grip drag handle; template select = saved only; confirm shows
[name | email] badges + pending/no-Gmail callout. - Job tracker — Cleaner Kanban cards (less chrome).
- UI — Slightly smaller block border radii (
rounded-2xl → rounded-xl). - Layout — Shared shell max-width + horizontal padding for nav and pages; denser→spacier page padding/gaps.
- Job tracker — Resizable Kanban columns (localStorage), search filter, Vinyaas Select for status (no native
<select>). - Command palette — ⌘/Ctrl+K (Vinyaas Command) for navigation, theme, sign out.
- Theme — Secondary/muted/borders charcoal-neutral (gold reserved for primary accent); larger card/badge type.
- Referrals composer — Three reorderable columns (Applications / Cold email / People), Gmail From locked to signed-in user, confirm + queue follow-ups (no send). Admin allowlist via
ADMIN_EMAILS (+ local fallback). POST /api/referrals/queue. - Dashboard — Live SQLite snapshot: status counts, active apps / follow-ups / resumes / jobs, recent applications (5), upcoming follow-ups (5). Optional
GET /api/dashboard.
Fixed
- ATS — reference engines now follow their published criteria — Resume Worded scores the share of checks passed, as Resume Worded describes, and now also checks weak verb openers, tense, repetition, pronouns, spelling and teamwork signals. Teal's Resume Score is now the share of Teal's documented Resume Analyzer issue cards cleared, and its Job Match is the share of the job's keywords on your resume. Enhancv adds its bullet-length check and uses soft skills, action verbs and title when tailoring to a job. SkillSyncer's point split is now labelled as an estimate. Indian degrees (B.Tech, B.E., BCA, M.Tech, MCA, …) are now recognised for degree matching.
- Resumes — card ATS score now matches the ATS page — The ATS pill on a resume card came from a separate quick checklist (text length, email, phone, section names, word count, links) that almost any real resume maxed out at 100. It now uses the native Aavedak ATS engine with the same inputs the ATS page starts with (your first preferred role, your years of experience, no job description), so both show the same score. Existing cards are rescored automatically the next time you open Documents, and again whenever your preferred role or experience level changes.
- Undo buttons keep their shape — While a send or queue button counts down, it stays exactly the size it was, and its burning fuse now runs along the button's own border with the same rounded corners, instead of a second, square line just inside it. The fuse is a little thicker so it's easy to see, and takes the button's colour: the brand yellow, or red on a destructive button.
- Outreach — bounces aren't replies — A "delivery failed" bounce (from
mailer-daemon@googlemail.com and similar), an auto-reply or an out-of-office notice no longer marks a conversation as Replied, isn't counted in its replies, and never adds to the person's score. A bounce usually means the email address was wrong, so it says nothing good about the person. You still see it in the chat, labelled Automated · not a reply, and the conversation card's preview starts with "Automated:". Bounces already stored are corrected, and any points they gave are removed. - Gmail notices — The Gmail authorization notice is the Vinyaas alert with its default styling, like the other notices.
- Buttons while loading — Buttons keep the width of the wider of their label and loading text (for example Save and Saving…), so Create, Add and Save no longer shift in the Add job, Add person and Paste JD dialogs. Those footers use the Vinyaas dialog footer.
- Layout and toggle fixes — Jobs and Inbox panes keep a fixed height instead of stretching to the page, the Jobs loading state matches the new split layout, application cards on the job tracker show the company with a role pill and the location with the applied date, the cover letter editor has the same variables info icon as the referral email editor, the ⌘K palette footer shows just ⌘K, and single-choice controls (chart range, inbox duration, Jobs sort) are single-select toggle groups.
- ATS — long engine names keep the table centred — Engine names that run long, such as Hybrid Resume Analyzer, wrap onto two lines in their column header instead of pushing the header off centre.
- ATS and Jobs — final score reads as one unit — Each Final score shows the ring and then its verdict, centred in the column. The rings line up in one vertical line whatever the verdict's length.
- Jobs full-screen board — Both panels now fill the full height, and "About the job" stretches to use the spare space.
- Referrals loading state — The loading placeholder now matches the real column widths, with the middle column twice as wide.
- Outreach inbox layout — The inbox now matches Jobs: a top strip with search, application filter, time range, Process due queue and expand, then the conversation list and the mail as two separate panels. The time-range buttons no longer stack vertically.
- Frozen resume column — On the ATS page and in the Jobs resume check, the resume column stays put while engine columns scroll, and its divider no longer scrolls away.
- Admin — starting a job scan — Starting the first scan no longer shows a false "service unavailable" error, and clicking it again resumes the scan in progress instead of starting a duplicate. First-time setup of the job sources is much faster.
- ATS page loading state — The loading skeleton now matches the ATS page: the five step cards (engines, resume, job content, review, results) and the scoring guide, instead of a generic placeholder.
- Local development: pages losing all styles — Running a production build while the dev server was up overwrote the files the dev server serves, so pages lost their styles until a restart. Development and production builds now keep their files apart.
Removed
- Sample and demo jobs — The Jobs page no longer creates example jobs, and existing ones are deleted automatically. Applications or cover letters you made from them stay, without the job link.
Notes
- Local-first data in
.data/app.db (separate from Better Auth DB). Production MySQL / R2 planned later. - Aavedak recommends and prepares; the user decides and sends.