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
2 changes: 1 addition & 1 deletion backend/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ app.use(clerkMiddleware());

app.get('/', (req, res) => {
res.json({
message: 'Portlify API is running',
message: 'PortlifyAi API is running',
version: '1.0.0'
});
});
Expand Down
6 changes: 3 additions & 3 deletions backend/src/routes/export.js
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ const generateHTML = (profile, preferences) => {
` : ''}

<footer>
<p>Generated with ❤️ by Portlify</p>
<p>Generated with ❤️ by PortlifyAi</p>
</footer>
</div>
<script src="script.js"></script>
Expand Down Expand Up @@ -437,7 +437,7 @@ router.get('/portfolio', authMiddleware, getUserFromAuth, async (req, res) => {
// Add README
archive.append(`# ${profile.basicDetails?.name || user.username}'s Portfolio

Generated from Portlify on ${new Date().toLocaleDateString()}
Generated from PortlifyAi on ${new Date().toLocaleDateString()}

## Usage
1. Open index.html in a browser
Expand All @@ -451,7 +451,7 @@ Generated from Portlify on ${new Date().toLocaleDateString()}
## Customization
Feel free to modify the CSS variables in styles.css to change colors.

Generated with ❤️ by Portlify
Generated with ❤️ by PortlifyAi
${process.env.FRONTEND_URL || 'https://portlify.techycsr.dev'}
`, { name: 'README.md' });

Expand Down
54 changes: 29 additions & 25 deletions frontend/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,38 +6,41 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" />

<!-- Primary Meta Tags -->
<title>Portlify - AI-Powered Resume to Portfolio Builder</title>
<meta name="title" content="Portlify - AI-Powered Resume to Portfolio Builder" />
<title>PortlifyAi - AI-Powered Resume to Portfolio Builder</title>
<meta name="title" content="PortlifyAi - AI-Powered Resume to Portfolio Builder" />
<meta name="description"
content="Transform your resume into a stunning, professional portfolio in seconds. Upload your PDF, let AI extract your skills & experience, and get a shareable portfolio URL instantly." />
content="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." />
<meta name="keywords"
content="portfolio builder, resume to portfolio, AI portfolio, professional portfolio, developer portfolio, career portfolio, resume parser, online portfolio, portfolio website, job portfolio" />
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="language" content="English" />
<meta name="revisit-after" content="7 days" />
<link rel="canonical" href="https://portlify.techycsr.dev" />
<link rel="canonical" href="https://portlify.techycsr.dev/" />

<!-- Favicon -->
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
<!-- Favicon — all generated from portlify_clean_logo.png -->
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png?v=2" />
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png?v=2" />
<link rel="icon" type="image/png" sizes="192x192" href="/favicon-192x192.png?v=2" />
<link rel="icon" type="image/png" sizes="512x512" href="/favicon-512x512.png?v=2" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg?v=2" />
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png?v=2" />
<link rel="shortcut icon" href="/favicon-32x32.png?v=2" />
<link rel="manifest" href="/manifest.json" />
<meta name="theme-color" content="#5a7a9e" />
<meta name="msapplication-TileColor" content="#5a7a9e" />

<!-- Open Graph / Facebook -->
<meta property="og:type" content="website" />
<meta property="og:url" content="https://portlify.techycsr.dev/" />
<meta property="og:title" content="Portlify - AI-Powered Resume to Portfolio Builder" />
<meta property="og:title" content="PortlifyAi - AI-Powered Resume to Portfolio Builder" />
<meta property="og:description"
content="Transform your resume into a stunning, professional portfolio in seconds. Upload your PDF, let AI extract your skills & experience, and get a shareable portfolio URL instantly." />
content="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." />
<meta property="og:image" content="https://portlify.techycsr.dev/og-image.png" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:image:alt" content="Portlify - Transform your resume into a portfolio" />
<meta property="og:site_name" content="Portlify" />
<meta property="og:image:alt" content="PortlifyAi - Transform your resume into a portfolio" />
<meta property="og:site_name" content="PortlifyAi" />
<meta property="og:locale" content="en_US" />

<!-- Open Graph Video -->
Expand All @@ -49,16 +52,16 @@
<!-- Twitter -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:url" content="https://portlify.techycsr.dev/" />
<meta name="twitter:title" content="Portlify - AI-Powered Resume to Portfolio Builder" />
<meta name="twitter:title" content="PortlifyAi - AI-Powered Resume to Portfolio Builder" />
<meta name="twitter:description"
content="Transform your resume into a stunning, professional portfolio in seconds. Upload your PDF, let AI extract your skills & experience, and get a shareable portfolio URL instantly." />
content="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." />
<meta name="twitter:image" content="https://portlify.techycsr.dev/og-image.png" />
<meta name="twitter:creator" content="@techycsr" />
<meta name="twitter:site" content="@techycsr" />

<!-- Additional SEO -->
<meta name="application-name" content="Portlify" />
<meta name="apple-mobile-web-app-title" content="Portlify" />
<meta name="application-name" content="PortlifyAi" />
<meta name="apple-mobile-web-app-title" content="PortlifyAi" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="mobile-web-app-capable" content="yes" />
Expand All @@ -69,9 +72,10 @@
{
"@context": "https://schema.org",
"@type": "WebApplication",
"name": "Portlify",
"name": "PortlifyAi",
"url": "https://portlify.techycsr.dev",
"description": "AI-powered resume to portfolio builder. Transform your resume into a stunning, professional portfolio in seconds.",
"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": {
Expand Down Expand Up @@ -113,8 +117,8 @@
{
"@context": "https://schema.org",
"@type": "VideoObject",
"name": "Portlify Demo — AI Resume to Portfolio Builder",
"description": "Watch how Portlify transforms your resume into a professional portfolio website in seconds using AI. Upload your PDF, DOC, or DOCX and get a shareable portfolio URL instantly.",
"name": "PortlifyAi Demo — AI Resume to Portfolio Builder",
"description": "Watch how PortlifyAi transforms your resume into a professional portfolio website in seconds using AI. Upload your PDF, DOC, or DOCX and get a shareable portfolio URL instantly.",
"thumbnailUrl": "https://portlify.techycsr.dev/og-image.png",
"uploadDate": "2026-01-15",
"contentUrl": "https://github.com/user-attachments/assets/e36d6f10-bb27-4ae8-a2b6-81122ef85994",
Expand Down Expand Up @@ -147,9 +151,9 @@
<div id="root"></div>
<noscript>
<div style="max-width:800px;margin:40px auto;padding:20px;font-family:system-ui,sans-serif;color:#1e293b">
<h1>Portlify — AI-Powered Resume to Portfolio Builder</h1>
<p>Transform your resume into a stunning, professional portfolio in seconds. Upload your PDF, DOC, or DOCX and let
AI extract your skills, experience, projects, and achievements.</p>
<h1>PortlifyAi — AI-Powered Resume to Portfolio Builder</h1>
<p>PortlifyAi transforms your resume into a stunning, professional portfolio in seconds. Upload PDF, DOC, or DOCX and
let AI extract your skills, experience, projects, and achievements into a shareable portfolio URL.</p>
<h2>Features</h2>
<ul>
<li>Smart AI Resume Parsing — supports PDF, DOC, DOCX</li>
Expand Down
16 changes: 8 additions & 8 deletions frontend/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,10 @@
"eslint-plugin-react": "^7.37.0",
"eslint-plugin-react-hooks": "^5.1.0",
"globals": "^15.14.0",
"jsdom": "^25.0.0",
"postcss": "^8.4.32",
"tailwindcss": "^3.4.0",
"vite": "^5.0.0",
"jsdom": "^25.0.0",
"vitest": "^2.1.0"
}
}
Binary file modified frontend/public/apple-touch-icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified frontend/public/favicon-16x16.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified frontend/public/favicon-192x192.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified frontend/public/favicon-32x32.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified frontend/public/favicon-512x512.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added frontend/public/favicon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 changes: 1 addition & 8 deletions frontend/public/favicon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
27 changes: 17 additions & 10 deletions frontend/public/manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "Portlify - AI Resume to Portfolio Builder",
"short_name": "Portlify",
"description": "Transform your resume into a stunning, professional portfolio in seconds with AI.",
"name": "PortlifyAi - AI Resume to Portfolio Builder",
"short_name": "PortlifyAi",
"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.",
"start_url": "/",
"display": "standalone",
"background_color": "#09090b",
Expand All @@ -12,10 +12,16 @@
"categories": ["productivity", "business", "utilities"],
"icons": [
{
"src": "/favicon.svg",
"sizes": "any",
"type": "image/svg+xml",
"purpose": "any maskable"
"src": "/portlify_clean_logo.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "any"
},
{
"src": "/portlify_clean_logo.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/favicon-192x192.png",
Expand All @@ -25,7 +31,8 @@
{
"src": "/favicon-512x512.png",
"sizes": "512x512",
"type": "image/png"
"type": "image/png",
"purpose": "any"
}
],
"screenshots": [
Expand All @@ -34,9 +41,9 @@
"sizes": "1200x630",
"type": "image/png",
"form_factor": "wide",
"label": "Portlify Homepage"
"label": "PortlifyAi Homepage"
}
],
"related_applications": [],
"prefer_related_applications": false
}
}
5 changes: 2 additions & 3 deletions frontend/public/og-image.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added frontend/public/portlify_clean_logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion frontend/public/robots.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Robots.txt for Portlify
# Robots.txt for PortlifyAi
# https://portlify.techycsr.dev
# Created by TechyCSR

Expand Down
8 changes: 4 additions & 4 deletions frontend/public/sitemap.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,25 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://portlify.techycsr.dev/</loc>
<lastmod>2026-02-21</lastmod>
<lastmod>2026-06-06</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://portlify.techycsr.dev/premium</loc>
<lastmod>2026-02-21</lastmod>
<lastmod>2026-06-06</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://portlify.techycsr.dev/sign-in</loc>
<lastmod>2026-02-21</lastmod>
<lastmod>2026-06-06</lastmod>
<changefreq>monthly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://portlify.techycsr.dev/sign-up</loc>
<lastmod>2026-02-21</lastmod>
<lastmod>2026-06-06</lastmod>
<changefreq>monthly</changefreq>
<priority>0.5</priority>
</url>
Expand Down
17 changes: 11 additions & 6 deletions frontend/src/App.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ import Premium from './pages/Premium'
import Portfolio from './pages/Portfolio'
import ProtectedRoute from './components/ProtectedRoute'
import DashboardLayout from './components/DashboardLayout'
import ClerkThemeProvider from './components/ClerkThemeProvider'
import SeoManager from './components/SeoManager'
import { getClerkAppearance } from './utils/clerkAppearance'

// Layout wrapper that conditionally shows navbar
Expand Down Expand Up @@ -127,12 +129,15 @@ function AppRoutes() {
function App() {
return (
<ThemeProvider>
<ToastProvider>
<Router>
<ScrollToTop />
<AppRoutes />
</Router>
</ToastProvider>
<ClerkThemeProvider>
<ToastProvider>
<Router>
<ScrollToTop />
<SeoManager />
<AppRoutes />
</Router>
</ToastProvider>
</ClerkThemeProvider>
</ThemeProvider>
)
}
Expand Down
47 changes: 47 additions & 0 deletions frontend/src/components/BrandLogo.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import { BRAND_LOGO_ALT, BRAND_LOGO_SRC, BRAND_NAME_DISPLAY } from '../constants/brand'

Check warning on line 1 in frontend/src/components/BrandLogo.jsx

View workflow job for this annotation

GitHub Actions / frontend

'BRAND_NAME_DISPLAY' is defined but never used

const SIZE_STYLES = {
sm: {
image: 'w-8 h-8 rounded-lg',
text: 'text-base',
},
md: {
image: 'w-9 h-9 sm:w-10 sm:h-10 rounded-xl',
text: 'text-lg sm:text-xl',
},
lg: {
image: 'w-12 h-12 rounded-xl',
text: 'text-2xl',
},
}

function BrandLogo({
size = 'md',
showName = true,
className = '',
nameClassName = '',
imageClassName = '',
}) {
const styles = SIZE_STYLES[size] || SIZE_STYLES.md

return (
<span className={`inline-flex items-center gap-2.5 sm:gap-3 min-w-0 ${className}`}>
<img
src={BRAND_LOGO_SRC}
alt={BRAND_LOGO_ALT}
className={`${styles.image} object-contain flex-shrink-0 shadow-sm ${imageClassName}`}
width={size === 'sm' ? 32 : size === 'lg' ? 48 : 40}
height={size === 'sm' ? 32 : size === 'lg' ? 48 : 40}
decoding="async"
/>
{showName && (
<span className={`font-display font-bold truncate ${styles.text} ${nameClassName}`}>
<span className="text-primary">Portlify</span>
<span className="heading-gradient">Ai</span>
</span>
)}
</span>
)
}

export default BrandLogo
Loading
Loading