Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 13 additions & 47 deletions frontend/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
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" />
<meta name="author" content="TechyCSR" />
<meta name="robots" content="index, follow" />
<meta name="google-site-verification" content="fkXMUEjrIeNlMbtI6eQobtiYyhoaMR5yCTCfG8K1Cjo" />
<meta name="language" content="English" />
<meta name="revisit-after" content="7 days" />
<link rel="canonical" href="https://portlifyai.app/" />
Expand Down Expand Up @@ -67,52 +68,8 @@
<meta name="mobile-web-app-capable" content="yes" />
<meta name="format-detection" content="telephone=no" />

<!-- Structured Data / JSON-LD -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebApplication",
"name": "PortlifyAi",
"url": "https://portlifyai.app",
"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.",
"alternateName": ["Portlify AI", "Portlify", "PortlifyAi Portfolio"],
"applicationCategory": "BusinessApplication",
"operatingSystem": "Web",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "INR"
},
"author": {
"@type": "Person",
"name": "TechyCSR",
"url": "https://techycsr.dev",
"sameAs": [
"https://github.com/TechyCSR",
"https://linkedin.com/in/techycsr",
"https://twitter.com/techycsr"
]
},
"creator": {
"@type": "Person",
"name": "TechyCSR",
"url": "https://techycsr.dev"
},
"featureList": [
"AI Resume Parsing",
"Instant Portfolio Generation",
"Custom Username URLs",
"Dark/Light Theme",
"Portfolio Analytics",
"DOC/DOCX/PDF Support",
"Custom Branding",
"Export as ZIP"
],
"screenshot": "https://portlifyai.app/og-image.png?v=6"
}
</script>

<!-- Video Structured Data
<!-- Structured Data / JSON-LD — dynamically injected by SeoManager for the landing page -->
<!-- Video Structured Data -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
Expand All @@ -135,7 +92,16 @@
"url": "https://techycsr.dev"
}
}
</script> -->
</script>

<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-DNET5K9CFS"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-DNET5K9CFS');
</script>

<!-- Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com">
Expand Down
1 change: 1 addition & 0 deletions frontend/public/googlef81296fda760752d.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
google-site-verification: googlef81296fda760752d.html
29 changes: 29 additions & 0 deletions frontend/public/robots.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@
# https://portlifyai.app
# Created by TechyCSR

# Allow all crawlers on public content
User-agent: *
Allow: /
Crawl-delay: 10

# Disallow admin/private routes
Disallow: /dashboard
Expand All @@ -15,6 +17,33 @@ Disallow: /analytics
Disallow: /username
Disallow: /api/

# AI Search Engine Bots — Allow all for maximum GEO visibility
User-agent: GPTBot
Allow: /

User-agent: ChatGPT-User
Allow: /

User-agent: PerplexityBot
Allow: /

User-agent: ClaudeBot
Allow: /
Crawl-delay: 5

User-agent: anthropic-ai
Allow: /

User-agent: Google-Extended
Allow: /

User-agent: CCBot
Allow: /
Crawl-delay: 5

User-agent: Bytespider
Allow: /

# Sitemaps — dynamic (primary) + static (fallback)
Sitemap: https://portlifybackend.techycsr.dev/api/sitemap.xml
Sitemap: https://portlifyai.app/sitemap.xml
12 changes: 0 additions & 12 deletions frontend/public/sitemap.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,4 @@
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://portlifyai.app/sign-in</loc>
<lastmod>2026-06-06</lastmod>
<changefreq>monthly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://portlifyai.app/sign-up</loc>
<lastmod>2026-06-06</lastmod>
<changefreq>monthly</changefreq>
<priority>0.5</priority>
</url>
</urlset>
58 changes: 58 additions & 0 deletions frontend/scripts/landing-static-html.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
/** Static landing page HTML injected at build time for crawler-visible content */
export const LANDING_STATIC_HTML = `
<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">
<h1>PortlifyAi — AI-Powered Resume to Portfolio Builder</h1>
<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>

<h2>How It Works</h2>
<ol>
<li><strong>Upload your resume</strong> — PDF, DOC, or DOCX supported</li>
<li><strong>AI extracts your data</strong> — 95% parse accuracy across supported formats</li>
<li><strong>Portfolio goes live</strong> — custom URL ready in under 30 seconds</li>
<li><strong>Share anywhere</strong> — LinkedIn, GitHub, resume, or social media</li>
</ol>

<h2>Key Features</h2>
<ul>
<li>AI Resume Parsing with 95% accuracy</li>
<li>Instant portfolio generation with custom username URLs</li>
<li>Portfolio analytics and visitor tracking</li>
<li>Multiple themes: Modern, Minimal, Creative, Professional</li>
<li>Dark and light mode support</li>
<li>Mobile-responsive design</li>
<li>Completely free — no credit card required</li>
</ul>

<h2>PortlifyAi vs Manual Portfolio Building</h2>
<table border="1" cellpadding="8" cellspacing="0" style="border-collapse:collapse;width:100%">
<thead>
<tr><th>Feature</th><th>PortlifyAi</th><th>Manual Build</th></tr>
</thead>
<tbody>
<tr><td>Time to launch</td><td>Under 30 seconds</td><td>Hours to days</td></tr>
<tr><td>Cost</td><td>Free</td><td>Hosting + domain fees</td></tr>
<tr><td>Resume parsing</td><td>AI-powered (95% accuracy)</td><td>Manual copy-paste</td></tr>
<tr><td>SEO-ready pages</td><td>Built-in</td><td>Requires setup</td></tr>
<tr><td>Analytics</td><td>Included</td><td>Third-party tools</td></tr>
</tbody>
</table>

<h2>Frequently Asked Questions</h2>
<dl>
<dt>What is PortlifyAi?</dt>
<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>
<dt>Is PortlifyAi really free?</dt>
<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>
<dt>How does the AI resume parser work?</dt>
<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>
<dt>What file formats are supported?</dt>
<dd>PortlifyAi supports PDF, DOC, and DOCX file formats for resume uploads.</dd>
<dt>Can I customize my portfolio design?</dt>
<dd>Yes, PortlifyAi offers multiple themes including Modern, Minimal, Creative, and Professional, with dark and light modes.</dd>
<dt>How do I share my portfolio?</dt>
<dd>Once generated, you get a custom URL to share on LinkedIn, GitHub, your resume, or social media.</dd>
</dl>

<p><a href="https://portlifyai.app/sign-up">Get Started Free</a> | <a href="https://portlifyai.app/premium">Premium Plans</a></p>
</main>
`.trim()
37 changes: 37 additions & 0 deletions frontend/src/constants/faq.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
export const LANDING_FAQ = [
{
question: 'What is PortlifyAi?',
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.',
},
{
question: 'Is PortlifyAi really free?',
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.',
},
{
question: 'How does the AI resume parser work?',
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.',
},
{
question: 'What file formats are supported?',
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.',
},
{
question: 'Can I customize my portfolio design?',
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.',
},
{
question: 'How do I share my portfolio?',
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.',
},
]

export function getFaqSchemaEntities() {
return LANDING_FAQ.map(({ question, answer }) => ({
'@type': 'Question',
name: question,
acceptedAnswer: {
'@type': 'Answer',
text: answer,
},
}))
}
4 changes: 4 additions & 0 deletions frontend/src/constants/seo.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,17 @@ import {
BRAND_NAME_DISPLAY,
DEFAULT_TITLE,
} from './brand'
import { getSiteStructuredData } from '../utils/seo'

const LANDING_PAGE_JSONLD = getSiteStructuredData()

export const PAGE_SEO = {
'/': {
title: DEFAULT_TITLE,
description: BRAND_DESCRIPTION,
keywords: BRAND_KEYWORDS,
robots: 'index, follow',
jsonLd: LANDING_PAGE_JSONLD,
},
'/premium': {
title: `Premium Plans | ${BRAND_NAME_DISPLAY}`,
Expand Down
25 changes: 22 additions & 3 deletions frontend/src/index.css
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
@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');

@tailwind base;
@tailwind components;
@tailwind utilities;
Expand Down Expand Up @@ -72,7 +70,7 @@
--color-bg-secondary: #f4f4f5;
--color-bg-tertiary: #e4e4e7;
--color-surface: #ffffff;
--color-surface-hover: #f4f4f5;
--color-surface-hover: #e4e4e7;

--color-text-primary: #18181b;
--color-text-secondary: #52525b;
Expand Down Expand Up @@ -241,6 +239,27 @@ body {
background-color: var(--color-surface);
}

/* Cards on muted sections — hover stays visible in both themes */
.surface-card {
background-color: var(--color-surface);
border: 1px solid transparent;
transition: background-color 0.25s ease, border-color 0.25s ease, box-shadow 0.25s ease;
}

.surface-card:hover {
background-color: var(--color-surface-hover);
border-color: var(--color-border);
box-shadow: var(--shadow-sm);
}

[data-theme="light"] .surface-card {
border-color: rgba(0, 0, 0, 0.04);
}

[data-theme="light"] .surface-card:hover {
border-color: var(--color-border-hover);
}

.bg-tertiary {
background-color: var(--color-bg-tertiary);
}
Expand Down
Loading
Loading