Skip to content

Commit 4dc49fa

Browse files
committed
SEO: Global reach optimization - domain consistency, hreflang, expanded sitemap & schema
- Fix domain consistency: all URLs now point to simpaticohrconsultancy.com - Rewrite sitemap.xml: 8 to 18 URLs with correct domain and fresh lastmod - Fix robots.txt: sitemap URL corrected, added /widget/ disallow - Add hreflang tags (en + x-default) for international SEO - Add geo-targeting meta tags (coordinates, region, placename) - Add 9 OG locale alternates (US, UK, UAE, Saudi, Qatar, Arabic, German) - Expand areaServed from 9 to 19 countries in structured data - Add SoftwareApplication schema for SaaS classification - Add GA4 placeholder (cookie-consent-aware, needs measurement ID) - Fix invalid JSON-LD email field syntax - Update chatbot KB URLs to canonical domain - Expand AI system prompt regions to global coverage - Fix canonical URLs on jobs.html and services.html - Fix LinkedIn share URL on jobs.html - De-link Career Lab, Evalis Platform, Evalis Interview from navigation
1 parent 1b5fc2a commit 4dc49fa

12 files changed

Lines changed: 441 additions & 114 deletions

career-lab.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<head>
44
<meta charset="utf-8">
55
<meta name="viewport" content="width=device-width, initial-scale=1">
6+
<meta name="robots" content="noindex, nofollow">
67
<title>Career Lab | Simpatico HR</title>
78

89
<!-- 🔒 ACCESS GUARD — Requires Supabase Authentication -->

contact.html

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@
270270
<a href="sectors.html">Sectors</a>
271271
<a href="employers.html">Employers</a>
272272
<a href="jobs.html">Job Board</a>
273-
<a href="career-lab.html" class="lab-link"><i class="fas fa-sparkles"></i> Career Lab</a>
273+
274274
<a href="contact.html" style="color:var(--tech)">Contact</a>
275275
<a href="admin.html" class="admin-link"><i class="fas fa-shield-halved"></i> Admin</a>
276276
</div>
@@ -593,8 +593,7 @@ <h2 class="fade-in">Ready to Transform Your Hiring?</h2>
593593
<div class="footer-col">
594594
<h4>Platform</h4>
595595
<a href="jobs.html">Job Board</a>
596-
<a href="career-lab.html">Career Lab</a>
597-
<a href="evalis-interview.html">AI Interview</a>
596+
<a href="mock-admin.html">Mock Admin</a>
598597
<a href="employers.html">For Employers</a>
599598
</div>
600599
<div class="footer-col">
@@ -606,9 +605,9 @@ <h4>Company</h4>
606605
</div>
607606
<div class="footer-col">
608607
<h4>Resources</h4>
609-
<a href="career-lab.html">ATS Resume Score</a>
610-
<a href="career-lab.html">Interview Prep</a>
611-
<a href="career-lab.html">Career Roadmap</a>
608+
<a href="pricing.html">Pricing</a>
609+
<a href="terms.html">Terms</a>
610+
<a href="privacy.html">Privacy</a>
612611
</div>
613612
<div class="footer-col">
614613
<h4>Connect</h4>

employers.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@
503503
<a href="contact.html">Contact</a>
504504
<div class="nav-divider"></div>
505505
<a href="mock-admin.html" class="nav-pill ats-link"><i class="fas fa-wand-magic-sparkles"></i> Mock Admin</a>
506-
<a href="career-lab.html" class="nav-pill lab-link"><i class="fas fa-flask"></i> Career Lab</a>
506+
507507
<div class="nav-divider"></div>
508508
<a href="admin.html" class="admin-link"><i class="fas fa-shield-halved"></i> Admin</a>
509509
</div>
@@ -812,7 +812,7 @@ <h2>Ready to Hire Smarter?</h2>
812812
<h4>Platform</h4>
813813
<a href="employers.html">For Employers</a>
814814
<a href="jobs.html">Job Board</a>
815-
<a href="career-lab.html">Career Lab</a>
815+
816816
<a href="mock-admin.html">Mock Admin</a>
817817
<a href="platform/pricing.html">Pricing</a>
818818
</div>
@@ -843,7 +843,7 @@ <h4>Connect</h4>
843843
<div class="footer-logo-icon">S</div>
844844
</div>
845845
<p>&copy; 2026 Simpatico HR Consultancy | Perinthalmanna, Kerala, India</p>
846-
<p style="font-size:0.75rem;opacity:0.4;margin-top:8px;">AI-Powered Recruitment • ATS Screening • Proctored Interviews • Career Lab</p>
846+
<p style="font-size:0.75rem;opacity:0.4;margin-top:8px;">AI-Powered Recruitment • ATS Screening • Proctored Interviews</p>
847847
</footer>
848848

849849
<!-- ═══ SCRIPTS ═══ -->

evalis-interview.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<head>
44
<meta charset="UTF-8">
55
<meta name="viewport" content="width=device-width,initial-scale=1.0">
6+
<meta name="robots" content="noindex, nofollow">
67
<title>AI Interview � SimpaticoHR</title>
78
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap" rel="stylesheet">
89
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css">

evalis-platform.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
<!DOCTYPE html>
1+
<!DOCTYPE html>
22
<html lang="en">
33
<head>
44
<meta charset="UTF-8">
55
<meta name="viewport" content="width=device-width, initial-scale=1.0">
6+
<meta name="robots" content="noindex, nofollow">
67
<title>Evalis AI Interview Platform | Simpatico HR</title>
78
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.min.js"></script>
89
<script>if(window.pdfjsLib)pdfjsLib.GlobalWorkerOptions.workerSrc='https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.worker.min.js';</script>

index.html

Lines changed: 112 additions & 69 deletions
Large diffs are not rendered by default.

jobs.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
<meta property="og:description" content="Find your next opportunity. Apply now and experience our instant AI screening.">
1818

1919
<!-- Search Engine Verification (Optional hooks) -->
20-
<link rel="canonical" href="https://simpaticohr.github.io/jobs.html">
20+
<link rel="canonical" href="https://simpaticohrconsultancy.com/jobs.html">
2121

2222
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" rel="stylesheet">
2323
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">
@@ -420,7 +420,7 @@ <h2>${job.title || 'Untitled'}</h2>
420420
<div class="job-footer">
421421
<span class="job-level ${levelClass}">${level}</span>
422422
<div style="display: flex; gap: 8px;">
423-
<a class="apply-btn" style="background: #0077b5; padding: 12px 18px;" href="https://www.linkedin.com/sharing/share-offsite/?url=${encodeURIComponent('https://simpaticohr.github.io/' + applyUrl)}" target="_blank" title="Share on LinkedIn"><i class="fab fa-linkedin-in"></i></a>
423+
<a class="apply-btn" style="background: #0077b5; padding: 12px 18px;" href="https://www.linkedin.com/sharing/share-offsite/?url=${encodeURIComponent('https://simpaticohrconsultancy.com/' + applyUrl)}" target="_blank" title="Share on LinkedIn"><i class="fab fa-linkedin-in"></i></a>
424424
<a class="apply-btn" href="${applyUrl}">Apply Now <i class="fa fa-arrow-right"></i></a>
425425
</div>
426426
</div>
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
-- ═══════════════════════════════════════════════════════════════════════════════
2+
-- Migration 022: Explicit GRANT statements for Supabase Data API access
3+
-- ═══════════════════════════════════════════════════════════════════════════════
4+
--
5+
-- WHY: Starting May 30 2026 (new projects) and October 30 2026 (existing projects),
6+
-- Supabase no longer auto-grants Data API access to tables in the "public" schema.
7+
-- Without explicit GRANTs, PostgREST / supabase-js / GraphQL will return "42501"
8+
-- permission errors on any table created after the cutoff date.
9+
--
10+
-- This migration retroactively adds explicit GRANTs to ALL existing public tables
11+
-- so the transition is seamless. It is idempotent (safe to re-run).
12+
-- Each GRANT is wrapped in a safety check so missing tables are silently skipped.
13+
-- ═══════════════════════════════════════════════════════════════════════════════
14+
15+
DO $$
16+
DECLARE
17+
tbl TEXT;
18+
all_tables TEXT[] := ARRAY[
19+
-- Core HR
20+
'employees',
21+
'departments',
22+
'leave_requests',
23+
'leave_balances',
24+
'attendance_records',
25+
'audit_logs',
26+
-- Payroll
27+
'employee_salaries',
28+
'payslips',
29+
'payroll_runs',
30+
'payroll_deductions',
31+
'employee_expenses',
32+
-- ATS / Recruitment
33+
'jobs',
34+
'job_listings',
35+
'job_applications',
36+
'applications',
37+
'interviews',
38+
'interview_sessions',
39+
'candidate_assessments',
40+
'assessments',
41+
-- Performance & Training
42+
'performance_reviews',
43+
'review_cycles',
44+
'performance_goals',
45+
'goals',
46+
'training_courses',
47+
'training_enrollments',
48+
-- Onboarding / Offboarding
49+
'onboarding_records',
50+
'onboarding_tasks',
51+
'offboarding_records',
52+
'offboarding_tasks',
53+
-- HR Ops
54+
'hr_tickets',
55+
'hr_policies',
56+
'employee_documents',
57+
'expenses',
58+
-- Pulse Surveys
59+
'pulse_surveys',
60+
'pulse_survey_responses',
61+
-- Automation
62+
'automation_rules',
63+
'automation_logs',
64+
-- Multi-tenant / Org
65+
'companies',
66+
'users',
67+
'org_profiles',
68+
-- Billing
69+
'subscriptions',
70+
'payment_transactions'
71+
];
72+
BEGIN
73+
FOREACH tbl IN ARRAY all_tables
74+
LOOP
75+
-- Only grant if the table actually exists in public schema
76+
IF EXISTS (
77+
SELECT 1 FROM information_schema.tables
78+
WHERE table_schema = 'public' AND table_name = tbl
79+
) THEN
80+
EXECUTE format('GRANT SELECT ON public.%I TO anon', tbl);
81+
EXECUTE format('GRANT SELECT, INSERT, UPDATE, DELETE ON public.%I TO authenticated', tbl);
82+
EXECUTE format('GRANT ALL ON public.%I TO service_role', tbl);
83+
RAISE NOTICE 'Granted access on: %', tbl;
84+
ELSE
85+
RAISE NOTICE 'Skipped (does not exist): %', tbl;
86+
END IF;
87+
END LOOP;
88+
END
89+
$$;
90+
91+
92+
-- ─────────────────────────────────────────────────────────────────────────────
93+
-- SEQUENCES — Grant usage on all sequences in public schema
94+
-- (Required for gen_random_uuid() / auto-increment inserts via Data API)
95+
-- ─────────────────────────────────────────────────────────────────────────────
96+
97+
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO anon;
98+
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO authenticated;
99+
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO service_role;
100+
101+
102+
-- ─────────────────────────────────────────────────────────────────────────────
103+
-- DEFAULT PRIVILEGES — Auto-grant on FUTURE tables and sequences
104+
-- (This is the key safeguard: any new CREATE TABLE will automatically
105+
-- get these grants, preventing 42501 errors after the cutoff date)
106+
-- ─────────────────────────────────────────────────────────────────────────────
107+
108+
ALTER DEFAULT PRIVILEGES IN SCHEMA public
109+
GRANT SELECT ON TABLES TO anon;
110+
111+
ALTER DEFAULT PRIVILEGES IN SCHEMA public
112+
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO authenticated;
113+
114+
ALTER DEFAULT PRIVILEGES IN SCHEMA public
115+
GRANT ALL ON TABLES TO service_role;
116+
117+
ALTER DEFAULT PRIVILEGES IN SCHEMA public
118+
GRANT USAGE, SELECT ON SEQUENCES TO anon, authenticated, service_role;
119+
120+
121+
-- ─────────────────────────────────────────────────────────────────────────────
122+
-- SCHEMA USAGE — Ensure roles can access the public schema itself
123+
-- ─────────────────────────────────────────────────────────────────────────────
124+
125+
GRANT USAGE ON SCHEMA public TO anon;
126+
GRANT USAGE ON SCHEMA public TO authenticated;
127+
GRANT USAGE ON SCHEMA public TO service_role;
128+
129+
130+
-- ═══════════════════════════════════════════════════════════════════════════════
131+
-- REFRESH POSTGREST SCHEMA CACHE
132+
-- ═══════════════════════════════════════════════════════════════════════════════
133+
NOTIFY pgrst, 'reload schema';
134+
135+
136+
-- ═══════════════════════════════════════════════════════════════════════════════
137+
-- DONE. After running this migration:
138+
--
139+
-- 1. All existing tables have explicit GRANTs for anon, authenticated, service_role
140+
-- 2. Tables that don't exist are silently skipped (check NOTICE logs)
141+
-- 3. RLS policies (already in place) still control row-level access
142+
-- 4. DEFAULT PRIVILEGES ensure future tables automatically get the same grants
143+
-- 5. No 42501 errors will occur after the Supabase May 30 / October 30 cutoff
144+
-- ═══════════════════════════════════════════════════════════════════════════════

migrations/_TEMPLATE_new_table.sql

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
-- ═══════════════════════════════════════════════════════════════════════════════
2+
-- SIMPATICO HR — NEW TABLE MIGRATION TEMPLATE
3+
-- ═══════════════════════════════════════════════════════════════════════════════
4+
-- Copy this template for every new table you create.
5+
-- Since Supabase no longer auto-grants Data API access (May 30 2026+),
6+
-- you MUST include explicit GRANTs or the table will return 42501 errors
7+
-- from PostgREST / supabase-js / GraphQL.
8+
-- ═══════════════════════════════════════════════════════════════════════════════
9+
10+
11+
-- ─── 1. CREATE TABLE ─────────────────────────────────────────────────────────
12+
13+
CREATE TABLE IF NOT EXISTS public.your_table_name (
14+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
15+
-- your columns here
16+
tenant_id TEXT NOT NULL DEFAULT 'SIMP_PRO_MAIN',
17+
company_id UUID,
18+
created_at TIMESTAMPTZ DEFAULT NOW(),
19+
updated_at TIMESTAMPTZ DEFAULT NOW()
20+
);
21+
22+
-- ─── 2. INDEXES ──────────────────────────────────────────────────────────────
23+
24+
CREATE INDEX IF NOT EXISTS idx_your_table_tenant ON your_table_name(tenant_id);
25+
26+
27+
-- ─── 3. EXPLICIT GRANTS (REQUIRED since May 30 2026) ────────────────────────
28+
-- Without these, the Data API will NOT be able to access this table.
29+
-- GRANTs control TABLE-level access. RLS controls ROW-level access.
30+
31+
-- anon: read-only for public-facing queries (e.g. job listings)
32+
GRANT SELECT ON public.your_table_name TO anon;
33+
34+
-- authenticated: full CRUD for logged-in users (filtered by RLS policies)
35+
GRANT SELECT, INSERT, UPDATE, DELETE ON public.your_table_name TO authenticated;
36+
37+
-- service_role: full access for backend Workers (bypasses RLS)
38+
GRANT ALL ON public.your_table_name TO service_role;
39+
40+
41+
-- ─── 4. ROW LEVEL SECURITY ──────────────────────────────────────────────────
42+
43+
ALTER TABLE public.your_table_name ENABLE ROW LEVEL SECURITY;
44+
45+
-- Service role bypass (your Cloudflare Worker uses service_role key)
46+
CREATE POLICY "service_full_access" ON your_table_name
47+
FOR ALL TO service_role USING (true) WITH CHECK (true);
48+
49+
-- Authenticated users: read rows from own tenant only
50+
CREATE POLICY "tenant_read_your_table" ON your_table_name
51+
FOR SELECT TO authenticated
52+
USING (
53+
tenant_id = COALESCE(
54+
(auth.jwt()->'app_metadata'->>'tenant_id'),
55+
(auth.jwt()->'user_metadata'->>'tenant_id'),
56+
'SIMP_PRO_MAIN'
57+
)
58+
);
59+
60+
-- Authenticated users: insert rows for own tenant
61+
CREATE POLICY "tenant_insert_your_table" ON your_table_name
62+
FOR INSERT TO authenticated
63+
WITH CHECK (
64+
tenant_id = COALESCE(
65+
(auth.jwt()->'app_metadata'->>'tenant_id'),
66+
(auth.jwt()->'user_metadata'->>'tenant_id'),
67+
'SIMP_PRO_MAIN'
68+
)
69+
);
70+
71+
-- Authenticated users: update rows in own tenant
72+
CREATE POLICY "tenant_update_your_table" ON your_table_name
73+
FOR UPDATE TO authenticated
74+
USING (
75+
tenant_id = COALESCE(
76+
(auth.jwt()->'app_metadata'->>'tenant_id'),
77+
(auth.jwt()->'user_metadata'->>'tenant_id'),
78+
'SIMP_PRO_MAIN'
79+
)
80+
);
81+
82+
83+
-- ─── 5. REFRESH POSTGREST CACHE ─────────────────────────────────────────────
84+
85+
NOTIFY pgrst, 'reload schema';

robots.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Disallow: /interview/
1010
Disallow: /mock-admin.html
1111
Disallow: /backend/
1212
Disallow: /migrations/
13+
Disallow: /widget/
1314

14-
# Sitemap location (matches CNAME: simpaticohr.in)
15-
Sitemap: https://simpaticohr.in/sitemap.xml
15+
# Sitemap location (canonical domain)
16+
Sitemap: https://simpaticohrconsultancy.com/sitemap.xml

0 commit comments

Comments
 (0)