VedaLogic builds VL HRM — a cloud-based HR, payroll, and statutory compliance platform targeting growing Indian companies. The marketing website at veda-logic.com is built on a modern Laravel + Inertia.js + React + Vite stack and serves as the primary lead generation and product-discovery surface for the business.
Plain-text HTTP access is available. Visitors, integrations, and automated tools that reach http://veda-logic.com receive a full 200 OK response without being redirected to HTTPS. All transmitted data — including login credentials — is unencrypted.
/robots.txt returns an HTML page loading http://cdn.jsinit.directfwd.com/sk-jspark_init.php — a 2022 domain-parking script. Google cannot read crawl directives; an unvetted external script executes on every crawler visit.
Every public page embeds the full Laravel application route table (200+ routes) in the data-page HTML attribute via Ziggy. This includes /install, /install/database, /hr/employees, /api/media, /permissions, /roles, and /_debugbar routes.
globalSettings serialised to every page response includes: AWS key names, SMTP server, email credentials (currently placeholder), storage type, and is_saas: true. Any real values set by an admin become instantly public.
Baseline indicators from automated HTTP checks and HTML source inspection. Not a substitute for full Lighthouse, penetration testing, legal review, or assistive-technology testing.
| # | Category | Score | Distribution | Rating | Key Finding |
|---|---|---|---|---|---|
| A | Business & Content | 55 | Good product content; no analytics; footer date stale | ||
| B | UI / UX | 60 | React SPA; dark mode; 12 fonts; jQuery + React | ||
| C | Accessibility | 40 | lang=en; SPA prevents source-based ARIA verification | ||
| D | Performance | 28 | Zero cache headers; 12 fonts; jQuery + React; no CDN | ||
| E | SEO | 38 | Sitemap OK; all meta JS-only; robots.txt broken; no canonical | ||
| F | Security | 32 | HTTP unforced; no HSTS; no CSP; route map exposed; version disclosed | ||
| G | Privacy / Legal | 28 | No Privacy Policy; no Terms; no cookie consent | ||
| H | Code Quality | 42 | Modern stack; config leak; route leak; jQuery; deprecated header | ||
| I | CI / CD / Deployment | 35 | No CDN; no cache; installer routes in prod; HTTP unforced |
Detailed findings by audit category. Evidence is from automated HTTP inspection and HTML source analysis.
VL HRM positions itself as transparent, auditable payroll for growing Indian companies. The site has a mature content structure: 7 product module pages (Payroll, Statutory Compliance, Employee Records, Attendance & Leave, Recruitment & Onboarding, Performance & Training, Employee Self-Service), 6 industry solution pages, Pricing, Demo, Why VL HRM, Security, About, Contact, and a Resources section with 5 published articles on Indian compliance topics (TDS, LWF, PF/ESI, Professional Tax, payroll errors). The product differentiator — visible, traceable calculations — is clearly communicated.
Weaknesses: No analytics tracking means the business has zero visibility into which pages drive enquiries, where visitors drop off, or which campaigns convert. The footer copyright reads "© 2025 VL HRM. All rights reserved." — one year behind. The production HRM application (/login) is co-hosted on the same origin as the marketing site, mixing marketing surface area with the live application.
Items not tested: Content accuracy, pricing competitiveness, conversion rates, demo booking UX, CRM integration.
Inertia.js + React SPA with dark mode (system preference detection on load). Navigation includes a Product mega-menu with module shortcuts and direct links to Why VL HRM, Pricing, and Resources. Properly structured content hierarchy.
Font loading is excessive: A single Google Fonts stylesheet loads 12 typeface families: DM Sans, Inter, Poppins, Nunito, Roboto, Open Sans, Lato, Montserrat, Plus Jakarta Sans, Manrope, Syne, and Material Symbols Outlined. This is a severe render-blocking payload with no justification for 12 families on a focused SaaS marketing site.
jQuery is loaded alongside React — a ~90 KB redundant library alongside a full component-based framework. Without analytics, all UX quality assessments are unmeasurable.
Items not tested: Mobile rendering, touch targets, form validation, 404 page, demo booking UX, dark-mode visual quality.
| Check | Status | Evidence |
|---|---|---|
| HTML lang attribute | Pass | <html lang="en"> present on all pages |
| Page <title> in HTML | Fail | Server-rendered title is "VL_HRM" — overwritten client-side by JS |
| Skip navigation | Not tested | SPA rendering prevents source inspection |
| ARIA landmark roles | Not tested | React renders dynamically |
| Colour contrast (1.4.3) | Not tested | Requires visual inspection |
| Keyboard navigation | Not tested | Requires browser testing |
| Image alt text | Not tested | Images rendered client-side |
| Form labels | Not tested | Forms rendered client-side |
| Focus indicators | Not tested | Requires browser testing |
Items not tested: Screen reader compatibility, contrast ratios, focus order, form accessibility, error states, dynamic content announcements.
| Check | Status | Evidence |
|---|---|---|
| Cache-Control on pages | Fail | cache-control: no-cache, private on all responses |
| HTTPS available | Pass | TLS working on port 443 |
| HTTP → HTTPS redirect | Fail | HTTP returns 200 OK — no redirect |
| Google Fonts load | Fail | 12 font families in one stylesheet — major render-blocking payload |
| jQuery + React | Warn | /js/jquery.min.js loaded alongside Inertia + React bundle (~90 KB wasted) |
| Vite asset fingerprinting | Pass | Content-hashed filenames (e.g. app-Cu5gOz5Z.css) — ready for long-TTL cache |
| Module preloading | Pass | <link rel="modulepreload"> for JS chunks — correct Vite output |
| CSS preloading | Pass | <link rel="preload" as="style"> for critical CSS — correct |
| CDN | Not confirmed | No CDN identification headers; x-server-cache and x-proxy-cache headers present — may be nginx-level caching |
| Core Web Vitals | Not tested | Requires PageSpeed Insights |
Key finding: Vite fingerprinting is correctly implemented but the assets are served with no-cache, private — so the cache-busting infrastructure is in place but the cache TTLs that make it valuable are absent. Setting assets to 1-year immutable cache is a configuration-only change with immediate performance benefit.
Items not tested: LCP, CLS, INP, Lighthouse score, image compression, font subsetting, Time to Interactive, CDN coverage.
| Check | Status | Evidence |
|---|---|---|
| HTTPS | Pass | Available and working on port 443 |
| robots.txt | Critical Fail | /robots.txt serves HTML with <script src="http://cdn.jsinit.directfwd.com/..."> — not a valid robots.txt |
| Sitemap | Pass | /sitemap.xml — 27 URLs covering all product, solution, resource, and company pages |
| Sitemap lastmod | Warn | All dates static: 2026-07-14 or 2026-07-16 regardless of actual updates |
| Meta <title> in HTML | Fail | Server renders "VL_HRM"; correct title applied by JavaScript client-side only |
| Meta description in HTML | Fail | No <meta name="description"> in server-rendered HTML; set via Inertia client-side |
| Canonical tag | Fail | canonical: null in all page SEO props — no canonical in HTML |
| OG tags | Fail | og_image: null — no og:title, og:description, og:image in HTML |
| Twitter Card | Fail | No twitter:card in HTML |
| Structured data | Fail | No JSON-LD schema.org markup detected |
| hreflang | N/A | Single-language (English) site |
Critical — JavaScript-only meta tags: The page SEO data (title: "VL HRM — HR, payroll & statutory compliance software for India", description: "Payroll you can actually read...") exists in the Inertia page props and is applied by React. Google's crawler may execute JavaScript and index the correct title. However, LinkedIn, WhatsApp, Facebook, and Twitter/X crawlers do not execute JavaScript and will share every page with the internal name "VL_HRM", no description, and no image. For a B2B SaaS product where LinkedIn is a primary channel, this is a severe SEO limitation.
Items not tested: Google Search Console coverage, keyword rankings, Core Web Vitals in GSC, backlink profile, crawl budget.
| Check | Status | Evidence |
|---|---|---|
| HTTPS enforced | Critical Fail | http://veda-logic.com/ returns HTTP/1.1 200 OK — no redirect to HTTPS |
| HSTS | Fail | Strict-Transport-Security header absent from all responses |
| Content-Security-Policy | Fail | CSP header absent |
| X-Frame-Options | Pass | x-frame-options: SAMEORIGIN — clickjacking protection present |
| X-Content-Type-Options | Pass | x-content-type-options: nosniff — MIME sniffing protected |
| Referrer-Policy | Pass | referrer-policy: strict-origin-when-cross-origin — correct modern value |
| Permissions-Policy | Pass | camera=(), microphone=(), geolocation=() — browser APIs restricted |
| X-XSS-Protection | Warn | 1; mode=block — deprecated, ignored by modern browsers; should be removed |
| Server header | Fail | nginx/1.29.8 — exact version disclosed on GET requests |
| Session cookie | Pass | vl_hrm_session: secure; httponly; samesite=lax — all correct flags |
| XSRF-TOKEN cookie | Warn | Secure; samesite=lax but not httponly — intentional for Laravel CSRF pattern |
| Ziggy route exposure | Critical Fail | 200+ named routes serialised to public HTML — full application surface exposed |
| Installer routes | Fail | /install, /install/environment, /install/database, /update routes in public route map; redirect to /dashboard (installed) but still discoverable |
| DebugBar routes | Note | /_debugbar/* in route map; endpoints return 404 — disabled in practice, but routes still registered |
Items not tested: Penetration test of admin endpoints, SSL certificate expiry, session fixation, token rotation, dependency CVEs.
| Check | Status | Evidence |
|---|---|---|
| Privacy Policy | Critical Fail | /privacy-policy → HTTP 404 |
| Terms of Service | Critical Fail | /terms → HTTP 404 |
| Cookie Policy | Fail | No cookie policy page found |
| Cookie consent banner | Fail | No consent mechanism visible in HTML source |
| Analytics tracking | Note | No GA4, GTM, or third-party analytics detected — reduces consent obligation for now |
| Google Fonts request | Warn | fonts.googleapis.com request sends user IP to Google — third-party data transfer |
| DPDPA 2023 compliance | Not assessed | India's Digital Personal Data Protection Act 2023 — requires legal review |
Key finding: A SaaS platform selling to Indian businesses in regulated sectors (Healthcare, Financial Services) must have a Privacy Policy and Terms of Service as legal baseline requirements under the IT Act 2000 and DPDPA 2023. Both pages return 404. Enterprise procurement teams — especially in Financial Services and Healthcare — will require these documents before vendor onboarding. Their absence blocks sales.
Items not tested: Full DPDPA 2023 compliance assessment, data retention policies, sub-processor list, data residency.
| Check | Status | Evidence |
|---|---|---|
| Tech stack | Pass | Laravel + Inertia.js + React + Vite — modern, well-maintained stack |
| Vite build pipeline | Pass | Content-hashed assets; modulepreload; CSS preload — correct Vite configuration |
| HTML <title> | Fail | <title inertia>VL_HRM</title> — internal app name visible as server-rendered title |
| globalSettings in HTML | Fail | AWS key names, SMTP config, email credentials, storage_type, is_saas in public data-page JSON |
| Ziggy route exposure | Fail | Complete Laravel route table (200+ routes) in public HTML — admin, HR, API, installer routes all visible |
| jQuery + React | Warn | /js/jquery.min.js loaded via <script> alongside full Inertia + React bundle |
| Deprecated X-XSS-Protection | Warn | Header deployed but ignored by modern browsers; creates false sense of protection |
| Inconsistent Server header | Warn | HEAD → Apache; GET → nginx/1.29.8 — two different layers responding inconsistently |
| CSRF meta token | Note | Standard Laravel pattern — expected and necessary |
| Installer package registered | Warn | laravel-installer routes still in production route map |
Architectural concern — globalSettings exposure: The Inertia page props serialise the application's globalSettings database object into every page response. This is a standing data exposure risk. Any admin who configures real SMTP credentials, an AWS access key, or a payment API token in the settings panel will immediately expose those values to every anonymous visitor worldwide. This must be fixed before the product scales or the admin panel is used for real infrastructure configuration.
Items not tested: PHP code quality, composer dependency audit, npm dependency audit, server-side security of HRM application.
| Check | Status | Evidence |
|---|---|---|
| HTTPS available | Pass | TLS working on port 443 |
| HTTP → HTTPS redirect | Fail | http:// serves 200 OK — no redirect |
| Platform | Note | nginx/1.29.8 reverse proxy in front of Apache origin |
| Cache strategy | Fail | No-cache on all responses — no browser or CDN caching |
| Proxy cache headers | Note | x-server-cache: true; x-proxy-cache: MISS suggests nginx-level caching layer exists but is not being used |
| CDN | Unknown | No definitive CDN identification headers observed |
| Installer routes in production | Fail | /install routes registered in production route map |
| CI/CD pipeline | Unknown | No public repository found; deployment process not testable |
| Staging environment | Unknown | Not testable externally |
Note: The presence of x-server-cache and x-proxy-cache response headers indicates a caching layer is deployed (likely nginx proxy_cache). However, x-proxy-cache: MISS on all tested requests indicates the cache is not being populated — likely because the Cache-Control: no-cache, private headers from the application instruct the proxy to bypass caching. Enabling caching at both the application and proxy level would immediately improve performance without infrastructure changes.
Items not tested: nginx configuration, Apache configuration, SSL certificate expiry, deployment pipeline, staging environment, CDN provider.
All 24 issues sorted by severity. Each includes unique ID, evidence, business impact, recommended fix, owner, effort, and verification method.
return 301 https://$host$request_uri; for port 80. Deploy HSTS (SEC-004) after redirect is confirmed stable.
OwnerDevOps
Verifycurl -sI http://veda-logic.com/ returns 301 to https://veda-logic.com/
content-type: text/html. Content is an HTML page with CSS loader animation and <script src="http://cdn.jsinit.directfwd.com/sk-jspark_init.php">. File last-modified: 07 Sep 2022. Script loads over insecure HTTP. Publisher ID: 9POBEX80W.
ImpactGoogle cannot read crawl directives; all pages treated as unconstrained. Third-party script (directfwd.com) executes on every crawler visit — potentially serving redirect or tracking code. Domain-parking remnant may trigger Google quality signals.
FixDelete current file. Create /robots.txt with content: User-agent: *\nAllow: /\nSitemap: https://veda-logic.com/sitemap.xml. Serve as text/plain.
OwnerDevOps
Verifycurl -sI https://veda-logic.com/robots.txt returns content-type: text/plain · content contains "User-agent: *"
Strict-Transport-Security: max-age=31536000; includeSubDomains — add only after SEC-001 HTTPS redirect is confirmed stable.
Owner · VerifyDevOps · securityheaders.com shows HSTS present
server_tokens off; in nginx.conf. Also investigate why HEAD returns "Apache" and GET returns nginx — standardise both.
Owner · VerifyDevOps · curl -sI shows Server: nginx with no version
Five phases from immediate security fixes to long-term quality hardening.
- Force HTTP → HTTPS redirect (SEC-001)
- Replace robots.txt (SEC-002)
- Add HSTS header (SEC-004)
- Deploy CSP Report-Only (SEC-005)
- Suppress nginx version (SEC-006)
- Remove deprecated X-XSS-Protection (COD-002)
- Publish Privacy Policy (PRIV-001)
- Publish Terms of Service (PRIV-001)
- Publish Cookie Policy (PRIV-001)
- Link all legal pages from footer
- Update footer year to 2026 (COD-004)
- Scope Ziggy to marketing-only routes (SEC-003)
- Create PublicSettings class (COD-001)
- Disable installer routes in production (SEC-007)
- Server-side OG/Twitter meta tags (SEO-001)
- Server-side canonical tags (SEO-002)
- Configure cache headers (PERF-001)
- Reduce Google Fonts to ≤ 2 families (PERF-002)
- Remove jQuery (PERF-003)
- Fix dark-mode CSS preload (PERF-004)
- Dynamic sitemap lastmod (SEO-003)
- Add structured data JSON-LD (SEO-004)
- Implement analytics (UX-001)
- Resolve server header inconsistency (COD-003)
- Promote CSP to enforcing mode (SEC-005)
- WCAG 2.2 AA audit and remediation (ACC-001)
- Self-host Google Fonts (PRIV-002)
- Document XSRF cookie behaviour (SEC-008)
| Phase | Timeframe | Items | Primary Owner | Focus |
|---|---|---|---|---|
| 1 — Security Baseline | Week 1 | 6 | DevOps | HTTP→HTTPS, robots.txt, HSTS, CSP-RO, headers |
| 2 — Legal & Trust | Weeks 1–2 | 5 | Management / Legal | Privacy Policy, Terms, Cookie Policy, footer |
| 3 — Architecture | Weeks 2–4 | 5 | Developer | Route map, globalSettings, installer, SSR meta |
| 4 — Performance & SEO | Weeks 4–8 | 8 | Developer / DevOps | Caching, fonts, jQuery, analytics, schema |
| 5 — Hardening | Weeks 8–12 | 4 | Developer / DevOps | CSP enforcing, WCAG, Google Fonts, docs |
The following could not be assessed from external HTTP inspection and HTML analysis alone.
| Tool | Command / URL | Purpose |
|---|---|---|
| curl | curl -sI http://veda-logic.com/ | HTTP/HTTPS redirect behaviour |
| curl | curl -sI https://veda-logic.com/ | HTTPS response headers (HEAD) |
| curl | curl -sv https://veda-logic.com/ | Full TLS + response headers (verbose) |
| curl | curl -sL https://veda-logic.com/ | Full HTML source inspection |
| curl | curl -sI https://veda-logic.com/robots.txt | robots.txt response type and headers |
| curl | curl -s https://veda-logic.com/robots.txt | robots.txt content inspection |
| curl | curl -s https://veda-logic.com/sitemap.xml | Sitemap structure and URL count |
| curl | curl -sI https://veda-logic.com/product | Product page headers |
| curl | curl -sI https://veda-logic.com/about | About page headers |
| curl | curl -sI https://veda-logic.com/pricing | Pricing page headers |
| curl | curl -sI https://veda-logic.com/privacy-policy | Privacy policy existence |
| curl | curl -sI https://veda-logic.com/terms | Terms of service existence |
| curl | curl -sI https://veda-logic.com/login | Login page accessibility |
| curl | curl -sI https://veda-logic.com/install | Laravel installer route accessibility |
| curl | curl -sI https://veda-logic.com/install/environment | Installer environment route |
| curl | curl -sI https://veda-logic.com/_debugbar/open | DebugBar endpoint accessibility |
| Python | data-page JSON parse + extraction | Inertia route map, globalSettings, page SEO props, modules, nav |
| HTML analysis | Page source inspection | Meta tags, fonts, analytics, cookies, CSRF token, Inertia structure |
| regex grep | Pattern matching on HTML source | AWS keys, email config, OG tags, analytics scripts |