From 47f8cacf465bd40e43dcccf80e439d0c3a9ca83d Mon Sep 17 00:00:00 2001 From: Gautam Raj Date: Mon, 29 Jun 2026 10:56:15 +0530 Subject: [PATCH 1/4] feat: Revamp templates and features to emphasize AI integration and document versatility - Updated document type summaries to highlight AI capabilities in resume and cover letter templates. - Enhanced benefits section to include new features like AI & ATS scanner and one-click ingestion. - Revised CTA and hero sections to reflect broader document creation (resumes, cover letters, portfolios). - Improved how-it-works and use cases sections to clarify the platform's functionality and target audience. - Expanded resources and FAQs to address document privacy and customization options. - Introduced new pricing structure for flexible access to features and AI credits. - Updated billing page to reflect new plan names and descriptions. --- PRODUCT.md | 33 ++ .../components/layout/Footer.tsx | 3 +- apps/blog-platform/config/site.ts | 3 +- .../components/layout/Footer.tsx | 1 + apps/docs-platform/config/site.ts | 1 + apps/portfolio/app/page.tsx | 34 +- apps/portfolio/app/pricing/page.tsx | 38 +- .../pricing/BundlePricingSection.tsx | 195 +++++-- .../components/pricing/ComparisonTable.tsx | 128 ++++- .../components/pricing/CustomPlansSection.tsx | 242 ++++---- apps/portfolio/features/faq/constants.ts | 20 +- .../pricing/components/IntervalToggle.tsx | 2 +- .../features/pricing/components/PriceCard.tsx | 107 ++-- apps/portfolio/public/pricing.md | 104 ++-- apps/server/src/auth/mailer.ts | 26 + apps/server/src/index.ts | 2 + apps/server/src/routes/contact.ts | 57 ++ apps/server/src/services/billingService.ts | 4 +- apps/server/src/services/productCatalog.ts | 12 +- .../app/(marketing)/about/data/principles.ts | 17 + apps/site/app/(marketing)/about/page.tsx | 242 ++++++++ .../contact/contact-experience.tsx | 363 ++++++++++++ apps/site/app/(marketing)/contact/page.tsx | 100 ++++ .../faq/components/FaqInteractiveSection.tsx | 145 +++++ .../site/app/(marketing)/faq/data/faqItems.ts | 249 +++++++++ apps/site/app/(marketing)/faq/page.tsx | 120 ++++ apps/site/app/(marketing)/features/page.tsx | 267 +++++++++ .../app/(marketing)/how-it-works/page.tsx | 169 ++++++ apps/site/app/(marketing)/layout.tsx | 8 + apps/site/app/{ => (marketing)}/page.tsx | 36 +- apps/site/app/(marketing)/pricing/page.tsx | 28 + .../pricing/pricing-experience.tsx | 516 ++++++++++++++++++ apps/site/app/(marketing)/privacy/page.tsx | 172 ++++++ .../[id]/components/FeatureDetailsContent.tsx | 0 .../roadmap/[id]/components/FeatureHeader.tsx | 0 .../[id]/components/SuggestedItemsSidebar.tsx | 0 .../{ => (marketing)}/roadmap/[id]/page.tsx | 11 +- .../roadmap/components/RoadmapHeader.tsx | 0 .../roadmap/components/RoadmapPageShell.tsx | 0 .../roadmap/components/RoadmapSEOContent.tsx | 4 +- .../components/RoadmapSortControls.tsx | 0 .../roadmap/components/RoadmapStatsGrid.tsx | 0 .../components/RoadmapStatusFilters.tsx | 0 .../{ => (marketing)}/roadmap/done/page.tsx | 15 +- .../app/{ => (marketing)}/roadmap/error.tsx | 0 .../roadmap/in-progress/page.tsx | 17 +- .../app/{ => (marketing)}/roadmap/loading.tsx | 0 .../{ => (marketing)}/roadmap/not-found.tsx | 0 .../app/{ => (marketing)}/roadmap/page.tsx | 22 +- .../{ => (marketing)}/roadmap/todo/page.tsx | 17 +- apps/site/app/(marketing)/security/page.tsx | 198 +++++++ .../stats/components/StatsBoard.tsx | 0 .../stats/components/StatsFilters.tsx | 0 .../stats/components/StatsHero.tsx | 0 .../stats/components/StatsOverview.tsx | 0 .../stats/components/StatsPagination.tsx | 0 .../stats/components/stats-utils.ts | 0 .../app/{ => (marketing)}/stats/error.tsx | 0 .../app/{ => (marketing)}/stats/loading.tsx | 0 .../site/app/{ => (marketing)}/stats/page.tsx | 10 +- .../_components/BrandAssetsSection.tsx | 0 .../style-guide/_components/ColorCard.tsx | 0 .../style-guide/_components/ColorSection.tsx | 0 .../_components/ComponentsSection.tsx | 0 .../_components/EffectsSection.tsx | 0 .../style-guide/_components/LayoutSection.tsx | 0 .../style-guide/_components/SectionHeader.tsx | 0 .../_components/StyleGuideHeader.tsx | 0 .../_components/TypographySection.tsx | 0 .../{ => (marketing)}/style-guide/page.tsx | 11 +- .../templates/[docType]/[templateId]/page.tsx | 0 .../templates/[docType]/page.tsx | 0 .../templates/components/EmptyState.tsx | 0 .../templates/components/TemplateCard.tsx | 0 .../templates/components/TemplateFilters.tsx | 0 .../templates/components/TemplateGroup.tsx | 0 .../templates/components/TemplateHeader.tsx | 0 .../templates/components/TemplatesHeader.tsx | 0 .../components/TemplatesSEOContent.tsx | 0 .../templates/components/utils.ts | 0 .../app/{ => (marketing)}/templates/page.tsx | 23 +- apps/site/app/(marketing)/terms/page.tsx | 172 ++++++ apps/site/app/about/data/principles.ts | 19 - apps/site/app/about/page.tsx | 169 ------ apps/site/app/affiliate/affiliate.css | 135 +++++ .../affiliate/components/AffiliateBento.tsx | 241 ++++++++ .../components/AffiliateCalculator.tsx | 228 ++++++++ .../components/AffiliateComparison.tsx | 165 ++++++ .../app/affiliate/components/AffiliateFAQ.tsx | 114 ++++ .../affiliate/components/AffiliateFooter.tsx | 201 +++++++ .../affiliate/components/AffiliateHero.tsx | 137 +++++ .../app/affiliate/components/AffiliateNav.tsx | 42 ++ .../components/AffiliateResources.tsx | 118 ++++ .../affiliate/components/AffiliateTiers.tsx | 130 +++++ apps/site/app/affiliate/page.tsx | 86 +++ .../components/AmbassadorPointsCalculator.tsx | 326 +++++++++++ .../components/CampusLeaderboard.tsx | 116 ++++ apps/site/app/ambassador/page.tsx | 255 +++++++++ apps/site/app/contact/page.tsx | 217 -------- apps/site/app/faq/data/builderFaqs.ts | 112 ---- apps/site/app/faq/data/contributorFaqs.ts | 31 -- apps/site/app/faq/page.tsx | 196 ------- apps/site/app/layout.tsx | 32 +- apps/site/app/pricing/page.tsx | 22 - apps/site/app/pricing/pricing-experience.tsx | 444 --------------- apps/site/app/privacy/page.tsx | 190 ------- apps/site/app/security/page.tsx | 197 ------- apps/site/app/sitemap.ts | 20 + apps/site/app/terms/page.tsx | 180 ------ apps/site/components/layout/Footer.tsx | 5 + .../components/layout/PublicPageShell.tsx | 7 +- .../components/layout/navbar/constants.ts | 5 +- apps/site/config/site.ts | 43 +- apps/site/config/templates.ts | 48 +- .../landing/components/BenefitsSection.tsx | 53 +- .../landing/components/CTASection.tsx | 10 +- .../landing/components/DocsSection.tsx | 5 +- .../landing/components/HeroSection.tsx | 13 +- .../landing/components/HowItWorksSection.tsx | 18 +- .../landing/components/ResourcesSection.tsx | 22 +- .../landing/components/SecuritySection.tsx | 18 +- .../landing/components/TemplatesPreview.tsx | 13 +- .../landing/components/UseCasesSection.tsx | 21 +- apps/site/features/landing/data/faqItems.ts | 24 +- .../features/landing/data/featureItems.ts | 27 +- apps/site/features/landing/data/trustItems.ts | 4 +- apps/site/package.json | 3 + apps/site/public/llms.txt | 63 ++- apps/site/public/pricing.md | 91 +++ apps/studio/features/billing/BillingPage.tsx | 4 +- package-lock.json | 17 +- 131 files changed, 6228 insertions(+), 2353 deletions(-) create mode 100644 PRODUCT.md create mode 100644 apps/server/src/routes/contact.ts create mode 100644 apps/site/app/(marketing)/about/data/principles.ts create mode 100644 apps/site/app/(marketing)/about/page.tsx create mode 100644 apps/site/app/(marketing)/contact/contact-experience.tsx create mode 100644 apps/site/app/(marketing)/contact/page.tsx create mode 100644 apps/site/app/(marketing)/faq/components/FaqInteractiveSection.tsx create mode 100644 apps/site/app/(marketing)/faq/data/faqItems.ts create mode 100644 apps/site/app/(marketing)/faq/page.tsx create mode 100644 apps/site/app/(marketing)/features/page.tsx create mode 100644 apps/site/app/(marketing)/how-it-works/page.tsx create mode 100644 apps/site/app/(marketing)/layout.tsx rename apps/site/app/{ => (marketing)}/page.tsx (77%) create mode 100644 apps/site/app/(marketing)/pricing/page.tsx create mode 100644 apps/site/app/(marketing)/pricing/pricing-experience.tsx create mode 100644 apps/site/app/(marketing)/privacy/page.tsx rename apps/site/app/{ => (marketing)}/roadmap/[id]/components/FeatureDetailsContent.tsx (100%) rename apps/site/app/{ => (marketing)}/roadmap/[id]/components/FeatureHeader.tsx (100%) rename apps/site/app/{ => (marketing)}/roadmap/[id]/components/SuggestedItemsSidebar.tsx (100%) rename apps/site/app/{ => (marketing)}/roadmap/[id]/page.tsx (97%) rename apps/site/app/{ => (marketing)}/roadmap/components/RoadmapHeader.tsx (100%) rename apps/site/app/{ => (marketing)}/roadmap/components/RoadmapPageShell.tsx (100%) rename apps/site/app/{ => (marketing)}/roadmap/components/RoadmapSEOContent.tsx (76%) rename apps/site/app/{ => (marketing)}/roadmap/components/RoadmapSortControls.tsx (100%) rename apps/site/app/{ => (marketing)}/roadmap/components/RoadmapStatsGrid.tsx (100%) rename apps/site/app/{ => (marketing)}/roadmap/components/RoadmapStatusFilters.tsx (100%) rename apps/site/app/{ => (marketing)}/roadmap/done/page.tsx (77%) rename apps/site/app/{ => (marketing)}/roadmap/error.tsx (100%) rename apps/site/app/{ => (marketing)}/roadmap/in-progress/page.tsx (76%) rename apps/site/app/{ => (marketing)}/roadmap/loading.tsx (100%) rename apps/site/app/{ => (marketing)}/roadmap/not-found.tsx (100%) rename apps/site/app/{ => (marketing)}/roadmap/page.tsx (72%) rename apps/site/app/{ => (marketing)}/roadmap/todo/page.tsx (73%) create mode 100644 apps/site/app/(marketing)/security/page.tsx rename apps/site/app/{ => (marketing)}/stats/components/StatsBoard.tsx (100%) rename apps/site/app/{ => (marketing)}/stats/components/StatsFilters.tsx (100%) rename apps/site/app/{ => (marketing)}/stats/components/StatsHero.tsx (100%) rename apps/site/app/{ => (marketing)}/stats/components/StatsOverview.tsx (100%) rename apps/site/app/{ => (marketing)}/stats/components/StatsPagination.tsx (100%) rename apps/site/app/{ => (marketing)}/stats/components/stats-utils.ts (100%) rename apps/site/app/{ => (marketing)}/stats/error.tsx (100%) rename apps/site/app/{ => (marketing)}/stats/loading.tsx (100%) rename apps/site/app/{ => (marketing)}/stats/page.tsx (92%) rename apps/site/app/{ => (marketing)}/style-guide/_components/BrandAssetsSection.tsx (100%) rename apps/site/app/{ => (marketing)}/style-guide/_components/ColorCard.tsx (100%) rename apps/site/app/{ => (marketing)}/style-guide/_components/ColorSection.tsx (100%) rename apps/site/app/{ => (marketing)}/style-guide/_components/ComponentsSection.tsx (100%) rename apps/site/app/{ => (marketing)}/style-guide/_components/EffectsSection.tsx (100%) rename apps/site/app/{ => (marketing)}/style-guide/_components/LayoutSection.tsx (100%) rename apps/site/app/{ => (marketing)}/style-guide/_components/SectionHeader.tsx (100%) rename apps/site/app/{ => (marketing)}/style-guide/_components/StyleGuideHeader.tsx (100%) rename apps/site/app/{ => (marketing)}/style-guide/_components/TypographySection.tsx (100%) rename apps/site/app/{ => (marketing)}/style-guide/page.tsx (89%) rename apps/site/app/{ => (marketing)}/templates/[docType]/[templateId]/page.tsx (100%) rename apps/site/app/{ => (marketing)}/templates/[docType]/page.tsx (100%) rename apps/site/app/{ => (marketing)}/templates/components/EmptyState.tsx (100%) rename apps/site/app/{ => (marketing)}/templates/components/TemplateCard.tsx (100%) rename apps/site/app/{ => (marketing)}/templates/components/TemplateFilters.tsx (100%) rename apps/site/app/{ => (marketing)}/templates/components/TemplateGroup.tsx (100%) rename apps/site/app/{ => (marketing)}/templates/components/TemplateHeader.tsx (100%) rename apps/site/app/{ => (marketing)}/templates/components/TemplatesHeader.tsx (100%) rename apps/site/app/{ => (marketing)}/templates/components/TemplatesSEOContent.tsx (100%) rename apps/site/app/{ => (marketing)}/templates/components/utils.ts (100%) rename apps/site/app/{ => (marketing)}/templates/page.tsx (92%) create mode 100644 apps/site/app/(marketing)/terms/page.tsx delete mode 100644 apps/site/app/about/data/principles.ts delete mode 100644 apps/site/app/about/page.tsx create mode 100644 apps/site/app/affiliate/affiliate.css create mode 100644 apps/site/app/affiliate/components/AffiliateBento.tsx create mode 100644 apps/site/app/affiliate/components/AffiliateCalculator.tsx create mode 100644 apps/site/app/affiliate/components/AffiliateComparison.tsx create mode 100644 apps/site/app/affiliate/components/AffiliateFAQ.tsx create mode 100644 apps/site/app/affiliate/components/AffiliateFooter.tsx create mode 100644 apps/site/app/affiliate/components/AffiliateHero.tsx create mode 100644 apps/site/app/affiliate/components/AffiliateNav.tsx create mode 100644 apps/site/app/affiliate/components/AffiliateResources.tsx create mode 100644 apps/site/app/affiliate/components/AffiliateTiers.tsx create mode 100644 apps/site/app/affiliate/page.tsx create mode 100644 apps/site/app/ambassador/components/AmbassadorPointsCalculator.tsx create mode 100644 apps/site/app/ambassador/components/CampusLeaderboard.tsx create mode 100644 apps/site/app/ambassador/page.tsx delete mode 100644 apps/site/app/contact/page.tsx delete mode 100644 apps/site/app/faq/data/builderFaqs.ts delete mode 100644 apps/site/app/faq/data/contributorFaqs.ts delete mode 100644 apps/site/app/faq/page.tsx delete mode 100644 apps/site/app/pricing/page.tsx delete mode 100644 apps/site/app/pricing/pricing-experience.tsx delete mode 100644 apps/site/app/privacy/page.tsx delete mode 100644 apps/site/app/security/page.tsx delete mode 100644 apps/site/app/terms/page.tsx create mode 100644 apps/site/public/pricing.md diff --git a/PRODUCT.md b/PRODUCT.md new file mode 100644 index 00000000..58f3482c --- /dev/null +++ b/PRODUCT.md @@ -0,0 +1,33 @@ +# Product + +## Register + +product + +## Users + +Job seekers, independent professionals, developers, designers, and founders creating career documents and public portfolios. They work inside focused editors and expect immediate visual feedback, reliable exports, optional cloud sync, and clear control over their data. + +## Product Purpose + +VeriWorkly is a privacy-first career workspace for building resumes, cover letters, and public portfolios. It should help users turn verified career facts into clear professional writing without obscuring what changed, consuming credits unexpectedly, or locking their source data into the service. + +## Brand Personality + +Precise, trustworthy, and quietly ambitious. Product copy should be direct and specific, with confidence coming from reliable behavior rather than decorative claims. + +## Anti-references + +Avoid surveillance-heavy resume SaaS, generic chatbot interfaces, opaque AI generation, over-decorated dashboards, and editors that hide the user's original content or make destructive changes without review. + +## Design Principles + +1. Keep users in the editor and close to the content they are changing. +2. Show AI cost and mode before generation, then require an explicit replace action. +3. Preserve local-first ownership and make cloud behavior understandable. +4. Reuse familiar controls and the existing VeriWorkly product language. +5. Make errors actionable without interrupting unrelated editing work. + +## Accessibility & Inclusion + +Target WCAG 2.1 AA. All editor actions require keyboard access, visible focus, readable contrast, non-color status cues, and reduced-motion-compatible feedback. diff --git a/apps/blog-platform/components/layout/Footer.tsx b/apps/blog-platform/components/layout/Footer.tsx index 3afe9535..39df2184 100644 --- a/apps/blog-platform/components/layout/Footer.tsx +++ b/apps/blog-platform/components/layout/Footer.tsx @@ -22,7 +22,8 @@ const Footer = () => { { title: "Platform", links: [ - { name: "Resume Builder", href: siteConfig.links.app, external: true }, + { name: "Document Builder", href: siteConfig.links.app, external: true }, + { name: "Portfolio Builder", href: siteConfig.links.portfolio, external: true }, { name: "Template Gallery", href: `${siteConfig.links.main}/templates`, diff --git a/apps/blog-platform/config/site.ts b/apps/blog-platform/config/site.ts index d96a2b5a..e622968f 100644 --- a/apps/blog-platform/config/site.ts +++ b/apps/blog-platform/config/site.ts @@ -18,8 +18,9 @@ export const siteConfig = { main: isDev ? "http://localhost:3000" : "https://veriworkly.com", app: isDev ? "http://localhost:3001" : "https://app.veriworkly.com", - blog: isDev ? "http://localhost:3003" : "https://blog.veriworkly.com", docs: isDev ? "http://localhost:3002" : "https://docs.veriworkly.com", + blog: isDev ? "http://localhost:3003" : "https://blog.veriworkly.com", + portfolio: isDev ? "http://localhost:3004" : "https://portfolio.veriworkly.com", }, keywords: ["VeriWorkly", "blog", "career tips", "architecture"], diff --git a/apps/docs-platform/components/layout/Footer.tsx b/apps/docs-platform/components/layout/Footer.tsx index bc73a7ae..ac41faeb 100644 --- a/apps/docs-platform/components/layout/Footer.tsx +++ b/apps/docs-platform/components/layout/Footer.tsx @@ -22,6 +22,7 @@ const Footer = () => { title: "Platform", links: [ { name: "Resume Builder", href: siteConfig.links.app, external: true }, + { name: "Portfolio Builder", href: siteConfig.links.portfolio, external: true }, { name: "Template Gallery", href: `${siteConfig.links.main}/templates`, diff --git a/apps/docs-platform/config/site.ts b/apps/docs-platform/config/site.ts index 527b4e86..23538432 100644 --- a/apps/docs-platform/config/site.ts +++ b/apps/docs-platform/config/site.ts @@ -19,6 +19,7 @@ export const siteConfig = { app: isDev ? "http://localhost:3001" : "https://app.veriworkly.com", docs: isDev ? "http://localhost:3002" : "https://docs.veriworkly.com", blog: isDev ? "http://localhost:3003" : "https://blog.veriworkly.com", + portfolio: isDev ? "http://localhost:3004" : "https://portfolio.veriworkly.com", }, keywords: ["VeriWorkly", "documentation", "API reference"], diff --git a/apps/portfolio/app/page.tsx b/apps/portfolio/app/page.tsx index af971820..13befd97 100644 --- a/apps/portfolio/app/page.tsx +++ b/apps/portfolio/app/page.tsx @@ -27,7 +27,7 @@ const HomePage = () => { "@type": "AggregateOffer", priceCurrency: "USD", lowPrice: "0", - highPrice: "11.99", + highPrice: "14.99", offerCount: "7", offers: [ { @@ -39,26 +39,26 @@ const HomePage = () => { { "@type": "Offer", - name: "1-Day Pass", - price: "0.69", + name: "3-Day Sprint Pass", + price: "2.99", priceCurrency: "USD", }, { "@type": "Offer", - name: "7-Day Sprint", - price: "3.99", + name: "7-Day Hunt Pass", + price: "5.99", priceCurrency: "USD", }, { "@type": "Offer", - name: "Full Bundle (Annual)", - price: "9.99", + name: "Job Hunter Bundle (Annual)", + price: "11.99", priceCurrency: "USD", priceSpecification: { "@type": "UnitPriceSpecification", - price: "9.99", + price: "11.99", priceCurrency: "USD", referenceQuantity: { "@type": "QuantitativeValue", @@ -70,12 +70,12 @@ const HomePage = () => { { "@type": "Offer", - name: "Full Bundle (Monthly)", - price: "11.99", + name: "Job Hunter Bundle (Monthly)", + price: "14.99", priceCurrency: "USD", priceSpecification: { "@type": "UnitPriceSpecification", - price: "11.99", + price: "14.99", priceCurrency: "USD", referenceQuantity: { "@type": "QuantitativeValue", @@ -87,12 +87,12 @@ const HomePage = () => { { "@type": "Offer", - name: "Portfolio Pro Only", - price: "8.99", + name: "Creator Pro (Monthly)", + price: "9.99", priceCurrency: "USD", priceSpecification: { "@type": "UnitPriceSpecification", - price: "8.99", + price: "9.99", priceCurrency: "USD", referenceQuantity: { "@type": "QuantitativeValue", @@ -104,12 +104,12 @@ const HomePage = () => { { "@type": "Offer", - name: "AI Credits Only", - price: "4.99", + name: "AI Credits Standalone (Monthly)", + price: "5.99", priceCurrency: "USD", priceSpecification: { "@type": "UnitPriceSpecification", - price: "4.99", + price: "5.99", priceCurrency: "USD", referenceQuantity: { "@type": "QuantitativeValue", diff --git a/apps/portfolio/app/pricing/page.tsx b/apps/portfolio/app/pricing/page.tsx index 213f85db..8aae6805 100644 --- a/apps/portfolio/app/pricing/page.tsx +++ b/apps/portfolio/app/pricing/page.tsx @@ -14,14 +14,14 @@ import BundlePricingSection from "@/components/pricing/BundlePricingSection"; export const metadata: Metadata = { title: "Portfolio Builder Pricing", description: - "Build a VeriWorkly portfolio for free, preview templates, and upgrade when you are ready to publish with a subdomain, SEO metadata, analytics, and hosted media.", + "Build a VeriWorkly portfolio for free, preview templates, and upgrade when you are ready to publish with a subdomain, CDN hosting, custom metadata, and no watermark.", openGraph: { type: "website", url: "/pricing", title: "Portfolio Builder Pricing | VeriWorkly Portfolio", description: - "Build a VeriWorkly portfolio for free, preview templates, and upgrade when you are ready to publish with a subdomain, SEO metadata, analytics, and hosted media.", + "Build a VeriWorkly portfolio for free, preview templates, and upgrade when you are ready to publish with a subdomain, CDN hosting, custom metadata, and no watermark.", images: [ { url: "/og/pricing-page-og.png", @@ -36,7 +36,7 @@ export const metadata: Metadata = { card: "summary_large_image", title: "Portfolio Builder Pricing | VeriWorkly Portfolio", description: - "Build a VeriWorkly portfolio for free, preview templates, and upgrade when you are ready to publish with a subdomain, SEO metadata, analytics, and hosted media.", + "Build a VeriWorkly portfolio for free, preview templates, and upgrade when you are ready to publish with a subdomain, CDN hosting, custom metadata, and no watermark.", images: ["/og/pricing-page-og.png"], }, @@ -66,12 +66,12 @@ export default function PricingPage() { "@type": "AggregateOffer", priceCurrency: "USD", lowPrice: "0", - highPrice: "11.99", - offerCount: "7", + highPrice: "14.99", + offerCount: "8", offers: [ { "@type": "Offer", - name: "Draft", + name: "Free Plan", price: "0", priceCurrency: "USD", url: `${siteConfig.links.portfolio}/pricing`, @@ -79,23 +79,31 @@ export default function PricingPage() { { "@type": "Offer", - name: "Day Pass", - price: "0.69", + name: "3-Day Sprint", + price: "2.99", priceCurrency: "USD", url: `${siteConfig.links.portfolio}/pricing`, }, { "@type": "Offer", - name: "Week Sprint", - price: "3.99", + name: "7-Day Hunt", + price: "5.99", priceCurrency: "USD", url: `${siteConfig.links.portfolio}/pricing`, }, { "@type": "Offer", - name: "Full Bundle (Annual)", + name: "Creator Pro (Annual)", + price: "7.99", + priceCurrency: "USD", + url: `${siteConfig.links.portfolio}/pricing`, + }, + + { + "@type": "Offer", + name: "Creator Pro (Monthly)", price: "9.99", priceCurrency: "USD", url: `${siteConfig.links.portfolio}/pricing`, @@ -103,7 +111,7 @@ export default function PricingPage() { { "@type": "Offer", - name: "Full Bundle (Monthly)", + name: "Job Hunter Bundle (Annual)", price: "11.99", priceCurrency: "USD", url: `${siteConfig.links.portfolio}/pricing`, @@ -111,8 +119,8 @@ export default function PricingPage() { { "@type": "Offer", - name: "Portfolio Pro Standalone", - price: "8.99", + name: "Job Hunter Bundle (Monthly)", + price: "14.99", priceCurrency: "USD", url: `${siteConfig.links.portfolio}/pricing`, }, @@ -120,7 +128,7 @@ export default function PricingPage() { { "@type": "Offer", name: "AI Credits Standalone", - price: "4.99", + price: "5.99", priceCurrency: "USD", url: `${siteConfig.links.portfolio}/pricing`, }, diff --git a/apps/portfolio/components/pricing/BundlePricingSection.tsx b/apps/portfolio/components/pricing/BundlePricingSection.tsx index 46c2cdf4..4d7f0c74 100644 --- a/apps/portfolio/components/pricing/BundlePricingSection.tsx +++ b/apps/portfolio/components/pricing/BundlePricingSection.tsx @@ -7,39 +7,47 @@ import { siteConfig } from "@/config/site"; import { PriceCard } from "@/features/pricing/components/PriceCard"; import { IntervalToggle } from "@/features/pricing/components/IntervalToggle"; - -const dayPassFeatures = [ - "Portfolio Pro publishing", - "25 AI writing credits", - "ATS and document tools", - "No auto-renewal", -]; - -const weekSprintFeatures = [ - "Portfolio Pro publishing", - "220 AI writing credits", - "ATS and document tools", - "No auto-renewal", +import { CheckoutButton } from "@/features/pricing/components/CheckoutButton"; + +const creatorProFeatures = [ + "Custom subdomain mapping", + "CDN media hosting & storage", + "Watermark & branding removed", + "1.5% commerce checkout fee", + "1 active resume & cover letter", + "No AI credits included", ]; const bundleFeatures = [ - "Portfolio Pro publishing", + "Everything in Creator Pro", + "Unlimited resumes & cover letters", + "Master Profile unlocked", + "GitHub & LinkedIn generators", + "Legacy PDF/DOCX importer", "1,000 monthly AI credits", - "ATS and document tools", - "Cancel anytime", ]; const BundlePricingSection = () => { const [bundleInterval, setBundleInterval] = useState<"monthly" | "annual">("annual"); + const creatorProPrice = + bundleInterval === "annual" + ? { amount: "$7.99", cadence: "/ month", note: "$95.88 billed yearly", savings: "Save 20%" } + : { + amount: "$9.99", + cadence: "/ month", + note: "Billed monthly", + savings: undefined, + }; + const bundlePrice = bundleInterval === "annual" - ? { amount: "$9.99", cadence: "/ month", note: "$120 billed yearly", savings: "Save 15%" } + ? { amount: "$11.99", cadence: "/ month", note: "$143.88 billed yearly", savings: "Save 20%" } : { - amount: "$11.99", + amount: "$14.99", cadence: "/ month", note: "Billed monthly", - savings: "Flexible monthly", + savings: "Recommended", }; return ( @@ -48,23 +56,23 @@ const BundlePricingSection = () => {
-
+

- Pay for the pace you need + Premium Career Platform

-

+

VeriWorkly Portfolio Pricing: - One toolkit.
{" "} - Your timeline. + Flexible plans.
{" "} + Built for growth.

- Get Portfolio Pro and AI credits together for a day, a week, or a full year. No - oversized commitment before the work earns it. + Publish a premium portfolio webpage and write tailormade resumes with our advanced AI + suite. Select a flexible plan tailored to your timeline.

@@ -73,43 +81,132 @@ const BundlePricingSection = () => {
-
- + {/* Centered Interval Toggle */} +
+
+ +
+
+ {/* Subscription Plans Grid */} +
} + description="The complete workspace for active job searches, unlocking AI document tailoring and importers." />
+ + {/* Transactional Passes Horizontal Strip */} +
+
+
+
+ + + + +

+ Zero Commitment +

+
+

+ Just need a quick fix? +

+

+ Tailor resumes for that dream role this weekend, or publish a quick update. Our + passes automatically expire—no recurring charges, no strings attached. +

+
+ +
+ {/* 3-Day Sprint */} +
+
+
+ + 3-Day Sprint + + 03 +
+

3-Day Sprint

+

+ Portfolio Pro hosting, ATS optimization tools, unlimited downloads, and 150 AI + credits. +

+
+ + {/* Dashed Ticket Divider */} +
+
+ $2.99 + + one-time + +
+ + Get Pass + +
+
+ + {/* 7-Day Hunt */} +
+
+
+ + 7-Day Hunt + + 07 +
+

7-Day Hunt

+

+ Portfolio Pro hosting, ATS optimization tools, unlimited downloads, and 400 AI + credits. +

+
+ + {/* Dashed Ticket Divider */} +
+
+ $5.99 + + one-time + +
+ + Get Pass + +
+
+
+
+
); diff --git a/apps/portfolio/components/pricing/ComparisonTable.tsx b/apps/portfolio/components/pricing/ComparisonTable.tsx index c877d7c8..3c45e10a 100644 --- a/apps/portfolio/components/pricing/ComparisonTable.tsx +++ b/apps/portfolio/components/pricing/ComparisonTable.tsx @@ -4,15 +4,86 @@ import { siteConfig } from "@/config/site"; import { CheckoutButton } from "@/features/pricing/components/CheckoutButton"; -const comparisonRows = [ - ["Resume and cover letter editor", true, true, true, true], - ["Private portfolio drafts", true, true, true, true], - ["Public portfolio publishing", false, true, false, true], - ["Custom subdomain and SEO controls", false, true, false, true], - ["Portfolio analytics", false, true, false, true], - ["AI writing credits", false, false, true, true], - ["Watermark removal", false, true, false, true], -] as const; +interface ComparisonRow { + label: string; + values: string[]; +} + +const comparisonRows: ComparisonRow[] = [ + { + label: "Max Active Resumes & Letters", + values: ["1 of each", "1 of each", "Unlimited", "Unlimited"], + }, + { + label: "Public Portfolio Webpage", + values: ["Draft only", "Subdomain", "Not included", "Subdomain"], + }, + { + label: "Monthly AI Credits", + values: ["0", "0", "1,000 / mo", "1,000 / mo"], + }, + { + label: "Master Profile (Single Source of Truth)", + values: ["Locked", "Locked", "Unlocked", "Unlocked"], + }, + { + label: "GitHub & LinkedIn Connect", + values: ["Locked", "Locked", "Unlocked", "Unlocked"], + }, + { + label: "Legacy PDF/DOCX Importer", + values: ["Locked", "Locked", "Unlocked", "Unlocked"], + }, + { + label: "Digital Sales Checkout Fees", + values: ["5.0%", "1.5%", "1.5%", "1.5%"], + }, + { + label: "Watermark & Branding", + values: ["Custom badge", "Removed", "N/A", "Removed"], + }, +]; + +function renderCell(val: string, colIndex: number) { + const isBundle = colIndex === 3; + const isPositive = + ["Subdomain", "Unlimited", "Unlocked", "Removed", "1.5%"].includes(val) || val === "1,000 / mo"; + const isNegative = ["Locked", "Not included", "Draft only", "0", "5.0%", "Custom badge"].includes( + val, + ); + + if (isPositive) { + return ( + + + {val} + + ); + } + + if (isNegative) { + return ( + + + ); + } + + if (val === "N/A") { + return ( + {val} + ); + } + + return {val}; +} const ComparisonTable = () => { const checkoutUrl = `${siteConfig.links.app}/checkout?productKey=bundle&interval=annual`; @@ -21,7 +92,7 @@ const ComparisonTable = () => {
-
+

Compare access @@ -33,8 +104,8 @@ const ComparisonTable = () => {

- Core document building remains free. Upgrade when you need publishing, focused AI - assistance, or both. + Core resume and portfolio editors stay free forever. Upgrade when you need active + subdomain hosting, custom SEO configurations, or advanced AI content tailoring.

@@ -43,9 +114,9 @@ const ComparisonTable = () => { aria-label="Feature and plan comparison" className="mt-14 overflow-x-auto rounded-4xl border border-white/10 bg-white/5" > -
+
What's included @@ -55,11 +126,11 @@ const ComparisonTable = () => { - Portfolio + Creator Pro - AI credits + AI Standalone @@ -67,26 +138,23 @@ const ComparisonTable = () => {
- {comparisonRows.map(([label, ...values]) => ( + {comparisonRows.map(({ label, values }) => (
- + {label} - {values.map((enabled, index) => ( - - {enabled ? ( - - ) : ( - - )} + {values.map((val, index) => ( + + {renderCell(val, index)} ))}
@@ -101,7 +169,7 @@ const ComparisonTable = () => {

- A full year for $9.99 per month. + A full year for $11.99 per month.

diff --git a/apps/portfolio/components/pricing/CustomPlansSection.tsx b/apps/portfolio/components/pricing/CustomPlansSection.tsx index 961df6ef..d319d6fb 100644 --- a/apps/portfolio/components/pricing/CustomPlansSection.tsx +++ b/apps/portfolio/components/pricing/CustomPlansSection.tsx @@ -1,128 +1,61 @@ "use client"; -import { useState } from "react"; -import { Crown, WandSparkles } from "lucide-react"; +import { Crown, WandSparkles, Zap, Sparkles } from "lucide-react"; import { siteConfig } from "@/config/site"; import { CheckoutButton } from "@/features/pricing/components/CheckoutButton"; -const customPlans = { - portfolio_pro: { - icon: Crown, - price: "$8.99", - title: "Portfolio Pro", - eyebrow: "Publish and grow", - description: "For builders who want a polished public portfolio without the AI bundle.", - features: ["Public portfolio", "Analytics", "SEO controls", "No watermark"], - }, - - ai_credits: { - price: "$4.99", - icon: WandSparkles, - title: "AI Credits", - eyebrow: "Write with momentum", - description: "For focused writing help across resumes, cover letters, and portfolio content.", - features: [ - "1,000 monthly credits", - "Review-first drafts", - "Resume and portfolio AI", - "Credits tracked clearly", - ], - }, -} as const; - const CustomPlansSection = () => { - const [customPlan, setCustomPlan] = useState<"portfolio_pro" | "ai_credits">("portfolio_pro"); - - const selectedCustom = customPlans[customPlan]; - const CustomIcon = selectedCustom.icon; - return ( -
+
-
-
-

- Build your own plan -

+
+
+
+ Ala Carte +

Only need one superpower?

-

- Skip the bundle and choose the product that removes today's bottleneck. You can - upgrade later without rebuilding your work. +

+ Skip the bundle and choose the specific capability that unblocks you today. You can + always scale up or customize later as your goals evolve.

-
-
-
- - - - -
- -
+ {/* Two side-by-side compact cards */} +
+ {/* Card Left: Creator Pro */} +
-
- - - Individual Add-on +
+
+ + Creator Pro +
+ + Hosting Only
-

- {selectedCustom.title} -

- -

- {selectedCustom.description} +

+ Publish a professional web presence under your own subdomain with CDN media hosting, + watermark removal, and custom metadata controls.

- {selectedCustom.features.map((feature) => ( + {[ + "Public subdomain", + "Unlimited pageviews", + "SEO meta controls", + "Watermark removed", + "1.5% checkout fee", + ].map((feature) => ( {feature} @@ -131,22 +64,117 @@ const CustomPlansSection = () => {
-
-

- {selectedCustom.price} +

+
+ $9.99 + per month +
+ + + Choose Pro + +
+
+ + {/* Card Right: AI Credits Standalone */} +
+
+
+
+ + AI Standalone +
+ + No Hosting + +
+ +

+ Tailor unlimited documents, scan for ATS optimization, and draft cover letters using + our full AI suite.

-

per month

+
+ {[ + "1,000 monthly credits", + "Unlimited document drafts", + "Resume & Letter Tailoring", + "ATS Match Score", + "Profile sync keys", + ].map((feature) => ( + + {feature} + + ))} +
+
+ +
+
+ $5.99 + per month +
- Choose {selectedCustom.title} + Choose AI
+
+
+ + {/* One-Time Add-on Credit Packs */} +
+
+
+
+ + + On-Demand Top-ups + +
+

⚡ Need extra AI capacity?

+

+ Top up your active subscription with one-time credit packs. While monthly + subscription allowances reset each billing cycle, your add-on credits remain active + for 90 days—perfect for + high-volume campaign sprints. +

+
+ +
+ {/* 250 credits */} +
+ + 250 AI Credits + + $2.99 + + One-time purchase + +
+ + {/* 500 credits */} +
+ + 500 AI Credits + + $4.99 + + One-time purchase + +
+
-
+
); diff --git a/apps/portfolio/features/faq/constants.ts b/apps/portfolio/features/faq/constants.ts index 1af18ee9..e7f358fe 100644 --- a/apps/portfolio/features/faq/constants.ts +++ b/apps/portfolio/features/faq/constants.ts @@ -36,9 +36,9 @@ export const faqs = [ { id: "pro-for", category: "general", - question: "Who is Portfolio Pro meant for?", + question: "Who is Creator Pro meant for?", answer: - "Portfolio Pro is for builders, developers, designers, and founders who want a public VeriWorkly subdomain, better sharing controls, analytics, hosted media, and no watermark.", + "Creator Pro is for builders, developers, designers, and founders who want a public VeriWorkly subdomain, better sharing controls, CDN media hosting, watermark removal, and low checkout fees.", }, { @@ -70,7 +70,7 @@ export const faqs = [ category: "domains", question: "How do custom subdomains work?", answer: - "With Portfolio Pro, you can choose a unique VeriWorkly subdomain (like yourname.veriworkly.com) to share your site with the world. All subdomains include automatic, secure SSL certificates.", + "With Creator Pro, you can choose a unique VeriWorkly subdomain (like yourname.veriworkly.com) to share your site with the world. All subdomains include automatic, secure SSL certificates.", }, { @@ -86,7 +86,7 @@ export const faqs = [ category: "billing", question: "What plans are available and how do AI writing credits work?", answer: - "We offer flexible options: 1-Day Pass ($0.69, 25 AI credits) and 7-Day Sprint ($3.99, 220 AI credits) where credits expire when the pass ends. For long-term use, the Full Bundle subscription is $11.99/mo (or $9.99/mo annual) with 1,000 monthly AI credits that reset each billing cycle. You can also purchase Portfolio Pro only ($8.99/mo) or AI Credits only ($4.99/mo) if you prefer a single service. Unused credits do not roll over.", + "We offer flexible options: 3-Day Sprint ($2.99, 150 AI credits) and 7-Day Hunt ($5.99, 400 AI credits) where credits expire when the pass ends. For long-term use, the Job Hunter Bundle subscription is $14.99/mo (or $11.99/mo annual) with 1,000 monthly AI credits that reset each billing cycle. You can also purchase Creator Pro only ($9.99/mo or $7.99/mo annual) for subdomain hosting, or AI Credits Standalone only ($5.99/mo) if you prefer a single service. Unused subscription credits do not roll over.", }, { @@ -94,7 +94,7 @@ export const faqs = [ category: "billing", question: "How do AI writing credits work and when do they reset?", answer: - "AI credits are consumed when generating or tailoring resumes, cover letters, and portfolio bios. If you choose the Full Bundle (either $11.99/mo monthly or $9.99/mo annual) or the standalone AI Credits plan ($4.99/mo), your allowance of 1,000 credits resets at the start of each billing cycle. Unused credits do not roll over. Single-purchase 1-Day ($0.69) and 7-Day ($3.99) passes provide fixed credit amounts (25 and 220 credits) that expire when the plan term ends.", + "AI credits are consumed when generating or tailoring resumes, cover letters, and portfolio bios. If you choose the Job Hunter Bundle (either $14.99/mo monthly or $11.99/mo annual) or the standalone AI Credits plan ($5.99/mo), your allowance of 1,000 credits resets at the start of each billing cycle. Unused subscription credits do not roll over. Single-purchase 3-Day Sprint ($2.99) and 7-Day Hunt ($5.99) passes provide fixed credit amounts (150 and 400 credits) that expire when the plan term ends.", }, { @@ -102,15 +102,15 @@ export const faqs = [ category: "billing", question: "Do unused AI credits roll over to the next month?", answer: - "No, unused credits do not roll over. For monthly subscriptions (like the Full Bundle or standalone AI Credits), credits reset at the start of each billing cycle and any remaining credits from the previous month are cleared. For 1-day and 7-day passes, all credits expire and are gone as soon as the pass duration expires.", + "No, unused subscription credits do not roll over; they reset at the start of each billing cycle. However, one-time add-on credit packs (250 credits for $2.99, 500 credits for $4.99) expire exactly 90 days from purchase, or immediately if you cancel your active paid subscription. For 3-day and 7-day passes, all credits expire when the pass duration ends.", }, { id: "standalone", category: "billing", - question: "Can I buy Portfolio Pro or AI Credits separately?", + question: "Can I buy Creator Pro or AI Credits separately?", answer: - "Yes, if you do not need the full bundle, you can buy single add-on plans. Portfolio Pro is available standalone for $8.99/month, which gives you full publishing on your own custom subdomain, visitor analytics, and no watermark. Standalone AI Credits are available for $4.99/month, providing 1,000 monthly credits for resume and writing tools without website hosting.", + "Yes, if you do not need the full bundle, you can buy single add-on plans. Creator Pro is available standalone for $9.99/month (or $7.99/month annual), which gives you full publishing on your own custom subdomain, visitor analytics, and no watermark. Standalone AI Credits are available for $5.99/month, providing 1,000 monthly credits for resume and writing tools without website hosting.", }, { @@ -118,7 +118,7 @@ export const faqs = [ category: "billing", question: "Do I have to pay extra for a custom subdomain?", answer: - "No. Choosing a custom VeriWorkly subdomain (e.g., yourname.veriworkly.com) with automatic SSL certificates is fully included in the Portfolio Pro standalone plan ($8.99/mo) and the Full Bundle ($11.99/mo monthly, $9.99/mo annual) at no extra cost.", + "No. Choosing a custom VeriWorkly subdomain (e.g., yourname.veriworkly.com) with automatic SSL certificates is fully included in the Creator Pro plan ($9.99/mo or $7.99/mo annual) and the Job Hunter Bundle ($14.99/mo or $11.99/mo annual) at no extra cost.", }, { @@ -134,7 +134,7 @@ export const faqs = [ category: "billing", question: "What happens if I decide to cancel my subscription?", answer: - "If you cancel your active Portfolio Pro or Full Bundle subscription, your custom subdomain mapping and public publishing will be paused at the end of your billing cycle. However, all of your saved resume documents, cover letters, and portfolio drafts remain securely stored in your account so you can reactivate them whenever you're ready.", + "If you cancel your active Creator Pro or Job Hunter Bundle subscription, your custom subdomain mapping and public publishing will be paused at the end of your billing cycle. However, all of your saved resume documents, cover letters, and portfolio drafts remain securely stored in your account so you can reactivate them whenever you're ready.", }, { diff --git a/apps/portfolio/features/pricing/components/IntervalToggle.tsx b/apps/portfolio/features/pricing/components/IntervalToggle.tsx index b9446165..6d2448f3 100644 --- a/apps/portfolio/features/pricing/components/IntervalToggle.tsx +++ b/apps/portfolio/features/pricing/components/IntervalToggle.tsx @@ -36,7 +36,7 @@ export function IntervalToggle({ value, onChange, featured }: IntervalToggleProp : "text-ink/65 hover:text-accent font-bold" }`} > - Yearly (Save 15%) + Yearly (Save 20%)