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
4 changes: 2 additions & 2 deletions app/[locale]/(standalone)/cv/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ export async function generateMetadata({ params }: Props): Promise<Metadata> {
const t = await getTranslations({ locale: validLocale, namespace: 'cv' });
const siteUrl = process.env.NEXT_PUBLIC_SITE_URL || 'https://cart-shift.com';
const title = validLocale === 'he'
? "יותם פרג'י - Senior Product Engineer | קורות חיים"
: 'Yotam Faraggi - Senior Product Engineer | CV';
? "יותם פרג'י | Senior Product Engineer בברלין"
: 'Yotam Faraggi | Senior Product Engineer in Berlin';
const description = validLocale === 'he'
? 'Senior Product Engineer בברלין עם 10+ שנות ניסיון במוצרי Full-Stack, AI, מסחר, אינטגרציות ומערכות פרודקשן.'
: 'Berlin-based Senior Product Engineer with 10+ years of experience building full-stack products, AI-assisted software, commerce systems, integrations, and production platforms.';
Expand Down
44 changes: 18 additions & 26 deletions app/[locale]/(website)/about/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,13 @@ export async function generateMetadata({
const { locale } = await params;
return genMeta(
{
title: 'About CartShift Studio | Expert E-commerce Development Team',
title: 'About CartShift Studio | Yotam Faraggi & Team',
description:
'Meet the team behind CartShift Studio. Expert Shopify and WordPress developers dedicated to building custom e-commerce solutions for your business.',
'Meet Yotam Faraggi, a Berlin-based Senior Product Engineer and co-founder of CartShift Studio, and the team building high-quality Shopify, WordPress, and custom web products.',
url: '/about',
keywords: [
'Yotam Faraggi',
'Senior Product Engineer Berlin',
'about us',
'e-commerce team',
'Shopify developers',
Expand All @@ -37,6 +39,7 @@ export default async function AboutPage({ params }: { params: Promise<{ locale:
const { locale } = await params;
setRequestLocale(locale as 'en' | 'he');

const siteUrl = process.env.NEXT_PUBLIC_SITE_URL || 'https://cart-shift.com';
const orgSchema = generateOrganizationSchema();
const breadcrumbSchema = generateBreadcrumbSchema(
[
Expand All @@ -46,22 +49,14 @@ export default async function AboutPage({ params }: { params: Promise<{ locale:
locale as 'en' | 'he'
);

const teamMembers = [
{
name: 'Technical Lead',
jobTitle: 'Technical Lead & Co-er',
description:
'Expert in Shopify and WordPress development, specializing in custom e-commerce solutions and performance optimization.',
},
{
name: 'Customer-Facing Partner',
jobTitle: 'Customer-Facing Partner & Co-er',
description:
'Dedicated to building strong client relationships and ensuring exceptional customer experience throughout the development process.',
},
];

const personSchemas = teamMembers.map(member => generatePersonSchema(member));
const yotamSchema = generatePersonSchema({
name: 'Yotam Faraggi',
jobTitle: 'Co-Founder & Senior Product Engineer',
description:
'Berlin-based Senior Product Engineer with 10+ years of experience building full-stack products, e-commerce systems, integrations, and AI-assisted software.',
url: `${siteUrl}/${locale}/cv`,
image: '/images/portfolio-v2/hero-art.webp',
});

return (
<>
Expand All @@ -75,14 +70,11 @@ export default async function AboutPage({ params }: { params: Promise<{ locale:
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(breadcrumbSchema) }}
/>
{personSchemas.map((schema, index) => (
<Script
key={index}
id={`person-schema-${index}`}
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(schema) }}
/>
))}
<Script
id="yotam-person-schema"
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(yotamSchema) }}
/>
<AboutTemplate />
</>
);
Expand Down
3 changes: 2 additions & 1 deletion app/sitemap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,8 @@ export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
{ path: '/tools/client-portal', changeFrequency: 'monthly' as const, priority: 0.7 },
{ path: '/privacy', changeFrequency: 'yearly' as const, priority: 0.3 },
{ path: '/terms', changeFrequency: 'yearly' as const, priority: 0.3 },
{ path: '/cv', changeFrequency: 'monthly' as const, priority: 0.8 },
{ path: '/cv', changeFrequency: 'monthly' as const, priority: 0.9 },
{ path: '/portfolio', changeFrequency: 'monthly' as const, priority: 0.8 },
...industries.map(industry => ({
path: `/industries/${industry}`,
changeFrequency: 'monthly' as const,
Expand Down
9 changes: 5 additions & 4 deletions tests/cv/cv-pdf-export.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -54,23 +54,25 @@ describe('CV PDF export', () => {
const text = extractPdfText(buffer);

expect(raw.match(/\/Type\s*\/Page\b/g)).toHaveLength(2);
expect(raw.match(/\/Subtype\s*\/Image\b/g)?.length ?? 0).toBeGreaterThanOrEqual(8);
// The current two-page layout embeds six distinct experience logo images.
expect(raw.match(/\/Subtype\s*\/Image\b/g)?.length ?? 0).toBeGreaterThanOrEqual(6);
expect(text.trim().length).toBeGreaterThan(1000);

expect(raw).toContain('/URI (mailto:yotamon@gmail.com)');
expect(raw).toContain('/URI (tel:+4915776211298)');
expect(raw).toContain('/URI (https://linkedin.com/in/yotam-faraggi)');
expect(raw).toContain('/URI (https://github.com/yotamon)');
expect(raw).toContain('/URI (https://cart-shift.com/en/cv)');
expect(raw).toContain('/URI (https://cart-shift.com/en/portfolio)');

[
'Yotam Faraggi',
'Senior Product Engineer',
'Senior Full-Stack Engineer',
'EU citizen',
'+4915776211298',
'Professional Experience',
'Technical Skills',
'Portfolio: cart-shift.com/en/cv',
'Portfolio: cart-shift.com/en/portfolio',
'CartShift Studio',
'Curalife',
'ParagonEX',
Expand All @@ -92,7 +94,6 @@ describe('CV PDF export', () => {

[
'CartShift Studio CV',
'Senior Product Engineer',
'R&D Lead & Senior Full Stack Developer',
'Professional Summary',
'Earlier Engineering Experience',
Expand Down
Loading