Skip to content

Commit ebd3db2

Browse files
authored
Merge pull request #10 from TechyCSR/ashish
Improve landing page SEO and GEO for organic discovery.
2 parents 96bdf29 + 5d4b4eb commit ebd3db2

14 files changed

Lines changed: 383 additions & 82 deletions

File tree

frontend/index.html

Lines changed: 13 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
content="PortlifyAi, Portlify AI, AI portfolio builder, resume to portfolio, AI resume parser, professional portfolio, developer portfolio, online portfolio website, portfolio generator, career portfolio, job portfolio, resume portfolio maker" />
1515
<meta name="author" content="TechyCSR" />
1616
<meta name="robots" content="index, follow" />
17+
<meta name="google-site-verification" content="fkXMUEjrIeNlMbtI6eQobtiYyhoaMR5yCTCfG8K1Cjo" />
1718
<meta name="language" content="English" />
1819
<meta name="revisit-after" content="7 days" />
1920
<link rel="canonical" href="https://portlifyai.app/" />
@@ -67,52 +68,8 @@
6768
<meta name="mobile-web-app-capable" content="yes" />
6869
<meta name="format-detection" content="telephone=no" />
6970

70-
<!-- Structured Data / JSON-LD -->
71-
<script type="application/ld+json">
72-
{
73-
"@context": "https://schema.org",
74-
"@type": "WebApplication",
75-
"name": "PortlifyAi",
76-
"url": "https://portlifyai.app",
77-
"description": "PortlifyAi transforms your resume into a stunning, professional portfolio in seconds. Upload PDF, DOC, or DOCX — AI extracts your skills, experience, and projects into a shareable portfolio URL.",
78-
"alternateName": ["Portlify AI", "Portlify", "PortlifyAi Portfolio"],
79-
"applicationCategory": "BusinessApplication",
80-
"operatingSystem": "Web",
81-
"offers": {
82-
"@type": "Offer",
83-
"price": "0",
84-
"priceCurrency": "INR"
85-
},
86-
"author": {
87-
"@type": "Person",
88-
"name": "TechyCSR",
89-
"url": "https://techycsr.dev",
90-
"sameAs": [
91-
"https://github.com/TechyCSR",
92-
"https://linkedin.com/in/techycsr",
93-
"https://twitter.com/techycsr"
94-
]
95-
},
96-
"creator": {
97-
"@type": "Person",
98-
"name": "TechyCSR",
99-
"url": "https://techycsr.dev"
100-
},
101-
"featureList": [
102-
"AI Resume Parsing",
103-
"Instant Portfolio Generation",
104-
"Custom Username URLs",
105-
"Dark/Light Theme",
106-
"Portfolio Analytics",
107-
"DOC/DOCX/PDF Support",
108-
"Custom Branding",
109-
"Export as ZIP"
110-
],
111-
"screenshot": "https://portlifyai.app/og-image.png?v=6"
112-
}
113-
</script>
114-
115-
<!-- Video Structured Data
71+
<!-- Structured Data / JSON-LD — dynamically injected by SeoManager for the landing page -->
72+
<!-- Video Structured Data -->
11673
<script type="application/ld+json">
11774
{
11875
"@context": "https://schema.org",
@@ -135,7 +92,16 @@
13592
"url": "https://techycsr.dev"
13693
}
13794
}
138-
</script> -->
95+
</script>
96+
97+
<!-- Google tag (gtag.js) -->
98+
<script async src="https://www.googletagmanager.com/gtag/js?id=G-DNET5K9CFS"></script>
99+
<script>
100+
window.dataLayer = window.dataLayer || [];
101+
function gtag(){dataLayer.push(arguments);}
102+
gtag('js', new Date());
103+
gtag('config', 'G-DNET5K9CFS');
104+
</script>
139105

140106
<!-- Fonts -->
141107
<link rel="preconnect" href="https://fonts.googleapis.com">
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
google-site-verification: googlef81296fda760752d.html

frontend/public/robots.txt

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22
# https://portlifyai.app
33
# Created by TechyCSR
44

5+
# Allow all crawlers on public content
56
User-agent: *
67
Allow: /
8+
Crawl-delay: 10
79

810
# Disallow admin/private routes
911
Disallow: /dashboard
@@ -15,6 +17,33 @@ Disallow: /analytics
1517
Disallow: /username
1618
Disallow: /api/
1719

20+
# AI Search Engine Bots — Allow all for maximum GEO visibility
21+
User-agent: GPTBot
22+
Allow: /
23+
24+
User-agent: ChatGPT-User
25+
Allow: /
26+
27+
User-agent: PerplexityBot
28+
Allow: /
29+
30+
User-agent: ClaudeBot
31+
Allow: /
32+
Crawl-delay: 5
33+
34+
User-agent: anthropic-ai
35+
Allow: /
36+
37+
User-agent: Google-Extended
38+
Allow: /
39+
40+
User-agent: CCBot
41+
Allow: /
42+
Crawl-delay: 5
43+
44+
User-agent: Bytespider
45+
Allow: /
46+
1847
# Sitemaps — dynamic (primary) + static (fallback)
1948
Sitemap: https://portlifybackend.techycsr.dev/api/sitemap.xml
2049
Sitemap: https://portlifyai.app/sitemap.xml

frontend/public/sitemap.xml

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,4 @@
1212
<changefreq>monthly</changefreq>
1313
<priority>0.8</priority>
1414
</url>
15-
<url>
16-
<loc>https://portlifyai.app/sign-in</loc>
17-
<lastmod>2026-06-06</lastmod>
18-
<changefreq>monthly</changefreq>
19-
<priority>0.5</priority>
20-
</url>
21-
<url>
22-
<loc>https://portlifyai.app/sign-up</loc>
23-
<lastmod>2026-06-06</lastmod>
24-
<changefreq>monthly</changefreq>
25-
<priority>0.5</priority>
26-
</url>
2715
</urlset>
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/** Static landing page HTML injected at build time for crawler-visible content */
2+
export const LANDING_STATIC_HTML = `
3+
<main id="seo-landing-fallback" aria-hidden="true" style="position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0">
4+
<h1>PortlifyAi — AI-Powered Resume to Portfolio Builder</h1>
5+
<p>Turn your resume into a professional portfolio in under 30 seconds. Free to use — upload PDF, DOC, or DOCX and get a shareable URL at portlifyai.app.</p>
6+
7+
<h2>How It Works</h2>
8+
<ol>
9+
<li><strong>Upload your resume</strong> — PDF, DOC, or DOCX supported</li>
10+
<li><strong>AI extracts your data</strong> — 95% parse accuracy across supported formats</li>
11+
<li><strong>Portfolio goes live</strong> — custom URL ready in under 30 seconds</li>
12+
<li><strong>Share anywhere</strong> — LinkedIn, GitHub, resume, or social media</li>
13+
</ol>
14+
15+
<h2>Key Features</h2>
16+
<ul>
17+
<li>AI Resume Parsing with 95% accuracy</li>
18+
<li>Instant portfolio generation with custom username URLs</li>
19+
<li>Portfolio analytics and visitor tracking</li>
20+
<li>Multiple themes: Modern, Minimal, Creative, Professional</li>
21+
<li>Dark and light mode support</li>
22+
<li>Mobile-responsive design</li>
23+
<li>Completely free — no credit card required</li>
24+
</ul>
25+
26+
<h2>PortlifyAi vs Manual Portfolio Building</h2>
27+
<table border="1" cellpadding="8" cellspacing="0" style="border-collapse:collapse;width:100%">
28+
<thead>
29+
<tr><th>Feature</th><th>PortlifyAi</th><th>Manual Build</th></tr>
30+
</thead>
31+
<tbody>
32+
<tr><td>Time to launch</td><td>Under 30 seconds</td><td>Hours to days</td></tr>
33+
<tr><td>Cost</td><td>Free</td><td>Hosting + domain fees</td></tr>
34+
<tr><td>Resume parsing</td><td>AI-powered (95% accuracy)</td><td>Manual copy-paste</td></tr>
35+
<tr><td>SEO-ready pages</td><td>Built-in</td><td>Requires setup</td></tr>
36+
<tr><td>Analytics</td><td>Included</td><td>Third-party tools</td></tr>
37+
</tbody>
38+
</table>
39+
40+
<h2>Frequently Asked Questions</h2>
41+
<dl>
42+
<dt>What is PortlifyAi?</dt>
43+
<dd>PortlifyAi is a free AI-powered tool that transforms your resume into a professional portfolio website in seconds. Upload PDF, DOC, or DOCX and AI extracts your skills and experience into a shareable portfolio URL.</dd>
44+
<dt>Is PortlifyAi really free?</dt>
45+
<dd>Yes, PortlifyAi is completely free to use. You can create and publish your portfolio with no credit card required. Premium features like custom branding and priority support are available as optional upgrades.</dd>
46+
<dt>How does the AI resume parser work?</dt>
47+
<dd>PortlifyAi uses machine learning models to analyze your uploaded resume, extracting key information including skills, work experience, education, projects, and contact details with 95% accuracy.</dd>
48+
<dt>What file formats are supported?</dt>
49+
<dd>PortlifyAi supports PDF, DOC, and DOCX file formats for resume uploads.</dd>
50+
<dt>Can I customize my portfolio design?</dt>
51+
<dd>Yes, PortlifyAi offers multiple themes including Modern, Minimal, Creative, and Professional, with dark and light modes.</dd>
52+
<dt>How do I share my portfolio?</dt>
53+
<dd>Once generated, you get a custom URL to share on LinkedIn, GitHub, your resume, or social media.</dd>
54+
</dl>
55+
56+
<p><a href="https://portlifyai.app/sign-up">Get Started Free</a> | <a href="https://portlifyai.app/premium">Premium Plans</a></p>
57+
</main>
58+
`.trim()

frontend/src/constants/faq.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
export const LANDING_FAQ = [
2+
{
3+
question: 'What is PortlifyAi?',
4+
answer: 'PortlifyAi is a free AI-powered tool that transforms your resume into a professional portfolio website in seconds. Upload PDF, DOC, or DOCX and AI extracts your skills and experience into a shareable portfolio URL.',
5+
},
6+
{
7+
question: 'Is PortlifyAi really free?',
8+
answer: 'Yes, PortlifyAi is completely free to use. You can create and publish your portfolio with no credit card required. Premium features like custom branding and priority support are available as optional upgrades.',
9+
},
10+
{
11+
question: 'How does the AI resume parser work?',
12+
answer: 'PortlifyAi uses machine learning models to analyze your uploaded resume, extracting key information including skills, work experience, education, projects, and contact details with 95% accuracy.',
13+
},
14+
{
15+
question: 'What file formats are supported?',
16+
answer: 'PortlifyAi supports PDF, DOC, and DOCX file formats for resume uploads. Simply upload your resume in any of these formats and our AI parser extracts all relevant information automatically.',
17+
},
18+
{
19+
question: 'Can I customize my portfolio design?',
20+
answer: 'Yes, PortlifyAi offers multiple themes including Modern, Minimal, Creative, and Professional. You can also switch between dark and light modes and customize your portfolio URL with a unique username.',
21+
},
22+
{
23+
question: 'How do I share my portfolio?',
24+
answer: 'Once your portfolio is generated, you get a custom URL that you can share anywhere — on LinkedIn, GitHub, your resume, or social media. The portfolio is mobile-responsive and works on all devices.',
25+
},
26+
]
27+
28+
export function getFaqSchemaEntities() {
29+
return LANDING_FAQ.map(({ question, answer }) => ({
30+
'@type': 'Question',
31+
name: question,
32+
acceptedAnswer: {
33+
'@type': 'Answer',
34+
text: answer,
35+
},
36+
}))
37+
}

frontend/src/constants/seo.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@ import {
44
BRAND_NAME_DISPLAY,
55
DEFAULT_TITLE,
66
} from './brand'
7+
import { getSiteStructuredData } from '../utils/seo'
8+
9+
const LANDING_PAGE_JSONLD = getSiteStructuredData()
710

811
export const PAGE_SEO = {
912
'/': {
1013
title: DEFAULT_TITLE,
1114
description: BRAND_DESCRIPTION,
1215
keywords: BRAND_KEYWORDS,
1316
robots: 'index, follow',
17+
jsonLd: LANDING_PAGE_JSONLD,
1418
},
1519
'/premium': {
1620
title: `Premium Plans | ${BRAND_NAME_DISPLAY}`,

frontend/src/index.css

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap');
2-
31
@tailwind base;
42
@tailwind components;
53
@tailwind utilities;
@@ -72,7 +70,7 @@
7270
--color-bg-secondary: #f4f4f5;
7371
--color-bg-tertiary: #e4e4e7;
7472
--color-surface: #ffffff;
75-
--color-surface-hover: #f4f4f5;
73+
--color-surface-hover: #e4e4e7;
7674

7775
--color-text-primary: #18181b;
7876
--color-text-secondary: #52525b;
@@ -241,6 +239,27 @@ body {
241239
background-color: var(--color-surface);
242240
}
243241

242+
/* Cards on muted sections — hover stays visible in both themes */
243+
.surface-card {
244+
background-color: var(--color-surface);
245+
border: 1px solid transparent;
246+
transition: background-color 0.25s ease, border-color 0.25s ease, box-shadow 0.25s ease;
247+
}
248+
249+
.surface-card:hover {
250+
background-color: var(--color-surface-hover);
251+
border-color: var(--color-border);
252+
box-shadow: var(--shadow-sm);
253+
}
254+
255+
[data-theme="light"] .surface-card {
256+
border-color: rgba(0, 0, 0, 0.04);
257+
}
258+
259+
[data-theme="light"] .surface-card:hover {
260+
border-color: var(--color-border-hover);
261+
}
262+
244263
.bg-tertiary {
245264
background-color: var(--color-bg-tertiary);
246265
}

0 commit comments

Comments
 (0)