CareerVettaiFULL APPLICATION SEO AUDIT 28 OCTOBER 2026 · ASIA/COLOMBO
LIVE CRAWL + CODE REVIEW + MOBILE LAB TESTS
The metadata foundation is sound. Discovery and loading need work.
A prioritized audit of the current job platform, its career tools, guides, Games pages, hosting behavior and job data. This document records recommendations; application code and hosting settings were not changed.
Code reference: 3ab5d10418 live HTML URLs397 current vacancy pages14 mobile Lighthouse runs / 8 page typesAudit completed: 28 October 2026 at 11:08 +05:30
418 / 418Crawled application/report pages returned HTTP 200
383Sitemap URLs with title, description, H1 and matching HTTPS canonical
367 / 397Current job pages allowing indexing; 30 long-running jobs are noindex
261Indexable jobs with no incoming link from another indexable initial-HTML page
WHAT MATTERS MOST
Three changes should lead the work.
Fix HTTP-downgrading redirects, make the vacancy catalogue crawlable through pre-rendered pages, and stabilize the search and salary interfaces while they load. Then optimize the logo, favicon, fonts and content depth.
These are technical eligibility counts, not Google indexed counts.
No Search Console or analytics account was available. Actual indexing, rankings, clicks, backlinks, Google-selected canonicals and real-user Core Web Vitals remain unverified. A Lighthouse SEO score of 100 is not a whole-site SEO grade or a promise of ranking.
Working well — preserve these
All 383 sitemap URLs returned 200, declared exactly one H1, included metadata and a correct self-canonical.
Robots allows crawling and advertises the HTTPS sitemap. No noindex URLs were found in that sitemap.
Unknown job and unknown general paths returned real HTTP 404 responses, rather than a 200 app shell.
Job details, country pages and guides have useful initial HTML, source links and clear posting/collection dates.
397 BreadcrumbList objects, five Article objects and a home WebSite object parse as JSON. Organization markup is consistent across app pages.
Saved jobs and supporting reports are intentionally noindex. Source attribution, remote eligibility caveats and unlimited application links are visible.
Twenty-eight rendered mobile route/width checks showed no horizontal overflow at 320 px and 390 px, and no browser runtime errors.
Coverage and method
Crawled the live sitemap, all 397 current vacancy IDs exposed by the live search page’s serialized data, all public route types, Saved and the three supporting reports.
Inspected initial HTML and JavaScript-disabled pages, then rendered the public page types on mobile.
Ran Lighthouse 12.8.2 with Chrome 155, simulated mobile 412×823, 4× CPU slowdown, 150 ms RTT and 1,638 Kbps throughput. Jobs, Offer Lens and Singapore each have three runs; other samples have one.
Checked domain variants, slash normalization, the github.io redirect, DNS and read-only GitHub Pages settings.
Findings distinguish observed defects, optional enhancements and items requiring account access or source permission.
RECOMMENDED BACKLOG
What needs to be updated
P1 = address first; P2 = material improvement; P3 = cleanup or optional enhancement. Effort is a planning estimate, not a delivery commitment.
Showing all recommendations
P1F01 · Confirmed
Keep canonical redirects entirely on HTTPS
Domain / hosting · Estimated effort: Small, with DNS or proxy access
Evidence
https://www.careervettai.me/ returns 301 to http://careervettai.me/, followed by another redirect to HTTPS. Slashless https://careervettai.me/jobs and the Sri Lanka market route also redirect first to HTTP. The default GitHub Pages URL does the same. GitHub reports https_enforced: false and no origin certificate. Apex and www DNS resolve to 159.198.67.218; responses identify an APISIX proxy in front of GitHub. The final HTTPS site works and its browser TLS checks pass.
What to update
Confirm whether the proxy is intentional. For direct Pages hosting, align DNS with GitHub’s documented records and enable Enforce HTTPS after certificate provisioning. The apex A records are 185.199.108.153, 185.199.109.153, 185.199.110.153 and 185.199.111.153. If keeping the proxy, correct its forwarded-protocol and redirect rules so host and slash normalization go straight to the HTTPS canonical URL. Preserve paths and queries. A CNAME file or Next.js metadata alone cannot fix HTTP redirects.
Completion check
Apex HTTP, www HTTP/HTTPS, slashless paths and the github.io URL each reach the intended HTTPS URL without any HTTP downgrade, preferably in one redirect. Recheck TLS and a sample deep job URL.
public/CNAME.github/workflows/deploy-pages.ymlHosting / DNS settings
Create a crawlable vacancy catalogue with static pagination
Next.js / information architecture · Estimated effort: Medium–large
Evidence
The base /jobs/ page is intentionally noindex, follow and its initial HTML contains only “Loading jobs…” in main, with no H1, form or job links. All query variants share this static response. Of 367 job pages allowing indexing, 261 have no incoming link from another indexable initial-HTML page. Only 68 of 367 are reachable from Home through the audited indexable HTML link graph; the other 299 still have sitemap discovery. This is a discovery weakness, not proof that Google has failed to index those jobs.
What to update
Make a separate indexable, pre-rendered catalogue at /jobs/ with real job cards and /jobs/page/2/ style static pagination generated from the current collection. Move flexible query-based filtering to a separate noindex search route, or design another explicit separation. Keep Sri Lanka, Singapore and Remote as useful indexable hubs and link further into appropriate roles. Under static export, query parameters cannot change the initial server metadata independently, so simply switching the existing /jobs/ noindex flag off would also affect its query variants.
Completion check
With JavaScript disabled, every intended indexable vacancy is reachable through ordinary anchors and finite pagination from an indexable hub. Search variants remain excluded from the sitemap and have the intended indexing policy.
P1F03 · Confirmed lab issue; cause supported by code
Stop the search and salary tools from shifting during hydration
Rendering / UX performance · Estimated effort: Medium
Evidence
Across three simulated mobile runs, /jobs/ has median CLS 0.774 and LCP 5.54 s; CLS ranges only from 0.774 to 0.776. Offer Lens has median CLS 0.277 across three runs. Both exceed the poor CLS boundary of 0.25. Their large interfaces are inside Suspense boundaries around useSearchParams; the initial responses contain a small loading placeholder. Offer Lens has just 32 words in main and no form before JavaScript. Replacing that small placeholder with a large interface is a likely contributor, consistent with the rendering evidence.
What to update
Pre-render a stable default search/listing interface and salary form. Isolate URL parameter reading and query-prefill logic in the smallest appropriate client boundary. Reserve realistic space for deferred content and maintain consistent heading, form and result geometry. Avoid a tiny placeholder that moves the whole footer when hydration finishes. Retest default and filtered searches, job-prefilled Offer Lens, slow networks and font loading.
Completion check
Repeated mobile lab runs show CLS at or below 0.1 and improved loading; then verify real-user p75 LCP, INP and CLS when field data is available. Lab TBT is not a measurement of INP.
Ship small logo and favicon variants, not the master PNGs
Frontend assets · Estimated effort: Small
Evidence
The 2172×724 wordmark is about 380 KB and renders at roughly 178×59 CSS pixels on mobile. The square favicon is 1280×1280 and about 479 KB. Together their measured network transfers are about 842 KiB, approximately 61% of the homepage’s 1,376 KiB total in the first lab run. Image alt text and declared dimensions are already present.
What to update
Preserve the supplied master files and derive appropriately sized transparent display variants, including 1×/2× wordmarks and small favicon / Apple icon files. Use optimized WebP, AVIF or a suitable compact PNG with explicit dimensions and responsive sources. Static GitHub Pages cannot supply the Next.js runtime image optimizer, so generate these assets before export rather than merely toggling images.unoptimized off.
Completion check
The logo stays crisp and transparent at desktop/mobile sizes, favicon requests are small, and image-delivery warnings and total transfer drop substantially without new layout shift.
The global CSS imports Google Fonts, which then requests font files from a second origin; no preconnect hints were detected. Sample font-related render-blocking estimates were about 0.5–0.8 s. Home and Compass initial HTML decode to about 449 KB and 426 KB, respectively, because full job summaries are serialized. Compression works: Home’s document transferred about 51 KB, so decoded size must not be confused with network transfer.
What to update
Prefer build-time self-hosted fonts through Next.js font handling or local font files; an interim improvement is correctly scoped preconnect hints. Keep only needed font variants. Pass the smallest fields and subsets to each client tool: the home previews do not need every vacancy field. Review default Link prefetching of heavy tool routes on the home page. Retain JavaScript for the interactions that need it.
Completion check
Font dependencies shorten, default interfaces remain readable during load, client payloads decrease, and repeated mobile tests improve without sacrificing content in the initial HTML.
Automated accessibility scores range from 91 to 97 in the sampled pages, with recurring contrast failures. Dark orange #C4510B on the canvas measures about 4.39:1, and on soft orange about 4.16:1, below 4.5:1 for ordinary small text. Footer links retain an old muted green rule. On Jobs, the sort select’s label is hidden and card headings skip from H1 to H3. Much secondary text is only 9–11 px.
What to update
Use darker text tokens for small orange links and chips, explicit readable footer colors, and larger secondary text where practical. Give the sort select a persistent accessible name; use a visually-hidden label instead of display:none when needed. Add a meaningful results H2 before job-card H3s. Keep the existing skip link, focus rings, native filter dialog, outside-click menu dismissal and keyboard support.
Completion check
Rerun contrast checks on all actual backgrounds, automated accessibility scans, keyboard navigation and mobile reading at 200% zoom. Treat these as usability and accessibility improvements rather than a guaranteed ranking bonus.
Improve duplicate normalization without merging genuine separate jobs
Feed normalization · Estimated effort: Medium
Evidence
One pair of indexable pages has the same title and employer: Quantum-Systems’ Learning Experience Architect, with location variants “Gilching” and “Gilching, Bayern, Germany”. Their normalized descriptions have the same SHA-256 hash. Six description-hash clusters exist overall; several are differently titled employer requisitions that may legitimately share a template. The current deduplication key includes raw location wording and country classification.
What to update
Normalize city/country information and stable source identifiers before comparing likely reposts. Verify provider IDs and source links before consolidating the Quantum-Systems pair. Use description hashes as review evidence alongside employer, title, location and requisition identity, never as a merge rule by themselves. Keep alternate-source attribution and a stable primary URL when consolidation is justified.
Completion check
Confirmed reposts produce one primary page and useful source links; distinct roles and multi-location requisitions remain separate. Check canonical and sitemap behavior after any URL consolidation.
Base vacancy indexability on verified usefulness and availability
Feed quality / SEO policy · Estimated effort: Medium
Evidence
Thirty current long-running employer listings are noindex and outside the sitemap under the 60-day age rule. They remain in the collected employer boards according to the site’s displayed source context. Separately, 18 descriptions contain fewer than 100 words; the indexability gate only requires 200 characters. Neither age nor a word count alone proves that a vacancy is closed or that its content is unhelpful.
What to update
Review the age cap for genuinely active employer postings and introduce a documented source-aware availability and completeness policy. Keep real posting dates, distinguish collection dates, expire known-closed roles, and preserve the successful-empty-feed behavior. Review short source descriptions for missing responsibilities or qualifications instead of padding them. Add content hashes / meaningful updated timestamps if needed; collection time is not automatically last-modified time.
Completion check
A current, complete, permitted employer posting is not excluded solely for being old; incomplete or closed postings are handled consistently. Source failure / cache behavior is visible and removed roles continue to return real 404 or 410 responses.
Add JobPosting markup only to a compliant eligible subset
Structured data / source permissions · Estimated effort: Medium–large, depends on source data
Evidence
None of the 397 vacancy pages emits JobPosting structured data. They can still appear in ordinary web search, but this leaves a potential Google jobs experience opportunity unused. The existing decision to withhold broad markup avoids publishing guesses and violating source-specific conditions.
What to update
Define a source-level eligibility gate before adding markup. Use a complete visible description, real title, employer, original posted date, accurate workplace or remote hiring geography and a working application path. Include validThrough when an expiry is known; Google says to omit it when unknown. Do not invent salaries, locations or expiry dates. Never apply JobPosting to listing pages. Exclude Remotive from Google Jobs submission under its current public API terms. Validate the permitted subset and its closed-job removal workflow before launch.
Completion check
Eligible single-job pages pass appropriate structured-data tests, visible facts match the markup, source permissions are documented, and closed roles are promptly removed or updated. Rich-result display is never guaranteed.
The two country pages have good geographic titles and descriptions, but H1s are promotional phrases such as “Build something great. Closer to home.” and “Big ideas. Your Singapore chapter.” Category, role and skill links mostly lead to noindex query searches. The five guides are brief, approximately 300 words each, with limited country-specific examples.
What to update
Make the country/role purpose explicit in main headings and add original practical context alongside the live inventory. Consider useful static role-and-market pages such as software engineering in Sri Lanka, QA in Sri Lanka, and Singapore data roles where inventory supports them. Treat these as candidate topics, not researched search-volume claims. Expand selected guides with real examples, clear source citations and related internal links. Avoid generating hundreds of near-identical thin location or skill pages.
Completion check
Each new landing page answers a distinct user need, contains appropriate current vacancies, links into the catalogue, and has original useful context. Prioritize topics using actual Search Console queries once available.
Make ownership, editorial care and corrections easier to verify
Site owner / editorial · Estimated effort: Small–medium
Evidence
About and Sources explain collection, matching and browser storage, which is useful. The inspected navigation and content do not offer a clear operator/contact/corrections destination or an editor profile. Organization authorship on the guides is valid; a real person does not need to be invented.
What to update
Publish truthful operator information, a contact or corrections channel and an editorial/update policy. Describe what the platform verifies and what remains source-supplied. Link only real owned profiles in Organization sameAs/contact data. Add genuine source references for country-specific claims. A clear privacy explanation is useful for notes, browser storage and any future analytics; do not imply that adding a privacy page is itself a ranking requirement.
Completion check
A visitor can identify who runs the platform, report a wrong or closed role and understand how guides are maintained. Visible information and Organization data agree.
Verify real indexing, search demand and Core Web Vitals in Search Console
Site owner / SEO measurement · Estimated effort: Small setup, ongoing review
Evidence
Search Console, Bing Webmaster Tools, analytics, backlink data and real-user Core Web Vitals were not connected to this audit. Their setup status is unknown. Missing verification tags in the repository do not prove that DNS verification is absent. Public HTTP and Lighthouse tests cannot establish actual indexed counts, rankings, impressions or Google-selected canonicals.
What to update
Verify access to a domain property, submit the HTTPS sitemap and inspect representative market, guide and job URLs. Review indexed/excluded pages, crawling, selected canonicals, queries, CTR and field Core Web Vitals. Optional privacy-conscious analytics can measure source-link opens, not verified application completions. Add a post-build SEO smoke check to the workflow for canonicals, index/noindex intent, sitemap membership, metadata, JSON-LD syntax and real internal links.
Completion check
There is an owner-reviewed baseline and a repeatable release check. Performance claims use real-user p75 LCP/INP/CLS when available; lab reports remain diagnostics.
All sampled pages use the same brand image and og:type=website. Each guide has valid Article JSON-LD, but no article image or dateModified; publication dates and sitemap lastModified are hardcoded to 27 October 2026. That date is consistent with this release, so it should not be replaced with a fake “updated today” timestamp.
What to update
Create per-guide published/modified metadata, a meaningful author/about destination, and a relevant article image when one exists. Keep visible dates, Article data and sitemap values in sync only after real editorial changes. Consider dedicated readable social cards and article Open Graph fields. Extend BreadcrumbList to appropriate guide/market hierarchies where useful; existing job breadcrumbs should remain.
Completion check
Preview images remain readable outside the site’s CSS, article fields describe real visible content, and no fabricated author, rating or freshness claim is introduced. Missing recommended Article properties are not treated as syntax failures.
Clean remaining text entities and review overlapping game-page intent
Normalization / content · Estimated effort: Small
Evidence
Five job descriptions still show literal named entities such as ’ or after normalization. One exact duplicate title group exists, and 124 indexable titles exceed 65 characters; that length is a review heuristic, not a Google limit. The older /arcade/ page overlaps the three challenges now embedded in /games/ and has no incoming indexable HTML link in this crawl, although it remains in the sitemap.
What to update
Decode permitted text entities with a robust text parser, then escape on output as usual. Review unusually long metadata for clarity without changing the employer’s actual job title. Decide whether Arcade has a distinct learning-page purpose; if it does, differentiate and link it. Otherwise consolidate intentionally using hosting-supported redirects or an appropriate canonical strategy. Games do not automatically harm job SEO and do not need to be removed.
Completion check
Descriptions show normal punctuation, metadata remains accurate, and the game URLs have a clear intentional role in navigation and indexing.
Use stronger caching only where the hosting layer supports it
Hosting / delivery · Estimated effort: Small if edge access exists
Evidence
The inspected HTML and hashed Next.js static resources are served with cache-control max-age=600 through the current edge path. Lighthouse flags the short static-asset cache lifetime. This affects repeat visits more than an initial cold page load.
What to update
If the current edge is under your control, use long immutable caching for content-hashed JS/CSS and versioned optimized assets, while keeping HTML and frequently refreshed job data appropriately short-lived. GitHub Pages controls its own response headers; Next.js headers() or a static _headers file will not automatically configure that platform. Consider a hosting change only if the extra control is worth the operational cost.
Completion check
Changed content remains fresh after deployment and immutable hashed files benefit from browser caching. No recommendation relies on unsupported GitHub Pages server features.
Starting at Home and following only inspected indexable HTML anchors reaches 15 public landing/article pages and 68 vacancies. The full sitemap still lists all 367 job pages allowing indexing.
68 reachable from Home299 outside that HTML path
261 of those jobs have zero incoming link from any indexable initial-HTML page. Other unconnected groups have links between pages, but are not connected back to Home through that graph. These counts exclude JavaScript-generated state and do not measure Google’s index.
Recommended structure
Home → market / role hubs → static paginated catalogue → current job details.
Keep flexible filters in a deliberately noindex search experience. Generate all useful pagination and job detail pages in the existing six-hour export workflow. Each intended indexable job should have a real crawlable path, not only a sitemap entry.
Google can render JavaScript, but may skip rendering a response that already says noindex. Do not rely on the current search page as the sole discovery route. Google JavaScript guidance.
Example vacancy with no incoming indexable HTML link
The page is in the sitemap and returns 200 with index, follow and a self-canonical. This is an internal discovery observation, not a claim that Google has not indexed it.
MEASURED MOBILE LAB RESULTS
Layout stability is the clearest repeatable performance problem.
Scores are Lighthouse category scores out of 100 for that URL. For repeated pages, each displayed value is the median of three runs. * Jobs intentionally emits noindex, which reduces its automated SEO score; that is a product/indexing-policy decision, not a missing-tag accident.
Lab results are not a real-user Core Web Vitals pass/fail verdict.
Good field targets are p75 LCP ≤2.5 s, INP ≤200 ms and CLS ≤0.1. Lighthouse TBT is a diagnostic proxy, not INP. Singapore varied from 2.55 to 10.10 s LCP across three runs; its median is 2.94 s. Jobs CLS stayed approximately 0.774–0.776, and Offer Lens approximately 0.275–0.277. Those stable shift results deserve more confidence than a single slow network sample. Threshold methodology.
Asset evidence
Homepage measured transfer: 1376.3 KiB.
Favicon request: 469.1 KiB; wordmark: 372.7 KiB.
The two brand-image transfers total about 61% of that homepage run.
The wordmark master is 2172×724 for a roughly 178×59 mobile display.
Home HTML decodes to 438.9 KiB but transfers around 50.8 KiB with compression. Do not describe the decoded size as network transfer.
Fonts load through CSS @import and two external origins; measured render-blocking estimates vary by run.
Confirmed mobile usability issues
Small orange text on canvas/soft-orange backgrounds falls below 4.5:1 contrast in several components.
Footer links retain an old muted color rule; source notes and selected-skill text also need review.
Jobs’ sort label is hidden from the accessible name calculation.
The Jobs heading structure jumps from H1 to card H3s.
Very small 9–11 px supporting text appears throughout the site. Improve reading comfort while retaining compact controls.
These are accessibility and usability issues; they are not a stand-alone Google ranking score.
Keep noindex; reduce the full-inventory client payload
† Approximate text-parser counts, included to show initial-HTML coverage; word count is not a Google quality threshold. Interactive results may add content after hydration. Supporting HTML reports are intentionally noindex and are not part of the acquisition-page strategy.
All current vacancy pages
397 fetched; 367 allow indexing and 30 are noindex long-running employer postings. No missing job description was found. Eighteen descriptions are under 100 words and should be reviewed for completeness, not padded. One duplicate title pair and six shared-description hash clusters need careful review.
JSON syntax checks found no parsing failures. The app emits Organization, WebSite, Article and BreadcrumbList. This audit did not run Google’s interactive Rich Results Test or inspect Search Console enhancement reports.
JobPosting is absent by design. It is a conditional opportunity after data and source-permission work, not something to paste across all jobs. Article images, richer editorial identities and truthful per-content dates are useful enhancements, not missing required Article fields.
HTTP AND HOSTING EVIDENCE
Canonical HTML is correct; redirect targets need attention.
Redirects were inspected without automatic following. The final apex HTTPS pages work. DNS at audit time: apex and www A = 159.198.67.218; nameservers = dns1.registrar-servers.com and dns2.registrar-servers.com. GitHub Pages settings: workflow build, custom domain careervettai.me, https_enforced false, origin certificate null. A proxy can provide valid public TLS while the origin remains configured this way; the specific HTTPS-to-HTTP redirects are the observed defect.
IMPLEMENTATION ORDER
A practical sequence
Stabilize discovery and rendering
Resolve the canonical-host HTTPS redirect chain.
Design a clean static catalogue and separate filtered search policy.
Fix Jobs and Offer Lens hydration shifts.
Confirm Search Console access and establish the current baseline.
Make the current pages lighter and clearer
Create optimized display-logo and favicon variants.
Self-host or streamline font loading and trim client data.
Fix contrast, accessible sort naming and heading order.
Review likely reposts, entity decoding and the age-only noindex rule.
Expand useful search coverage
Build a few strong Sri Lanka/Singapore role pages and practical guides.
Add verifiable ownership, correction and editorial information.
Pilot permitted, accurate JobPosting markup on an eligible subset.
Improve social/article fields, optional cache policy and SEO release checks.
Use findings F01–F15 as the acceptance checklist. Do not measure success only by an automated score; track indexed useful URLs, relevant queries, click-through, source-link engagement and real-user experience.
CURRENT GUIDANCE / THINGS NOT TO ADD BLINDLY
Avoid outdated or misleading SEO work.
Do not prioritize FAQPage markup for a Google FAQ rich result. Google’s current documentation updates say that feature stopped appearing from May 2026. Keep useful visible FAQs for people. Current Search documentation updates.
There is no special AI schema or required llms.txt file for Google AI Overviews / AI Mode. Crawlability, useful textual content and accurate facts still matter. llms.txt is optional for other systems and is not a verified Google ranking lever. Google AI features guidance.
Do not invent JobPosting salaries, locations, deadlines, author identities, ratings or review counts. Unknown expiry can be omitted; closed jobs still need handling. Remotive’s Google Jobs restriction remains relevant.
Do not call a page “indexed by Google” merely because it is in the app or sitemap. Search Console is needed for actual indexing evidence.
Do not use noindex and robots blocking interchangeably. Google needs to fetch a page to see its noindex directive. At this site’s size, fix catalogue structure before treating crawl budget as an emergency.
Do not add hreflang just because the site lists two countries. The current country pages contain different job markets, not equivalent language/locale versions. Use hreflang only if true corresponding localized versions are created.
Do not chase a fixed word count or rigid title-character limit. Improve clarity, evidence and user value; long job titles can be legitimate.
REVIEWABLE URL EVIDENCE
All 418 crawled pages
This inventory is embedded in the report and works offline. Search by route or title, or download the CSV. “Reachable” means through the inspected indexable initial-HTML graph from Home, not Google index status.
URL / title
Status
Robots
Sitemap
HTML incoming pages
Reachable
The full inventory is available in the interactive HTML report and its CSV download.
PRIMARY REFERENCES
Guidance checked for this audit
Sources support the associated recommendations; the site-specific counts and measurements come from the recorded crawl and lab runs. The report uses current documentation rather than assuming older SEO features still exist.