- 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.
+ 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.
+
- 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.
+ 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.
+
);
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%)
);
}
diff --git a/apps/portfolio/package.json b/apps/portfolio/package.json
index d7efe895..2d893b61 100644
--- a/apps/portfolio/package.json
+++ b/apps/portfolio/package.json
@@ -1,6 +1,6 @@
{
"name": "@veriworkly/portfolio",
- "version": "3.18.2",
+ "version": "3.20.0",
"private": true,
"scripts": {
"dev": "next dev",
diff --git a/apps/portfolio/public/pricing.md b/apps/portfolio/public/pricing.md
index 8cb40925..20e1193d 100644
--- a/apps/portfolio/public/pricing.md
+++ b/apps/portfolio/public/pricing.md
@@ -1,65 +1,91 @@
# Pricing — VeriWorkly Portfolio
-VeriWorkly offers flexible options tailored to your job search pace. Choose between structured bundle passes, full subscriptions, or single standalone plans.
+VeriWorkly offers flexible options tailored to your job search pace. Choose between structured bundle passes, recurring subscriptions, or single standalone plans.
-## 1. Flexible Passes (No Auto-Renewal)
-
-Perfect for short-term projects, sudden applications, or quick updates.
-
-### 1-Day Pass
+---
-- **Price**: $0.69 (One-time payment)
-- **Duration**: 24 hours
-- **Features**: Portfolio Pro publishing access, 25 AI writing credits, ATS and document tools.
-- **Credit Expiration**: Credits expire when the 24-hour plan duration ends.
+## 🚀 Free Tier (Sovereign Identity)
-### 7-Day Sprint
+Start building your professional brand today at no cost.
-- **Price**: $3.99 (One-time payment)
-- **Duration**: 7 days
-- **Features**: Portfolio Pro publishing access, 220 AI writing credits, ATS and document tools.
-- **Credit Expiration**: Credits expire when the 7-day plan duration ends.
+- **Price**: $0
+- **Duration**: Lifetime
+- **Features**:
+ - 1 active Resume and 1 active Cover Letter.
+ - 1 Free Link-in-Bio site with standard templates and a small _Identity by VeriWorkly_ badge on a subdomain.
+ - Basic visitor view counts.
+ - **Master Profile, GitHub/LinkedIn generation, and legacy resume imports are locked** (Upgrade to unlock).
+ - Sell digital products or services (e.g., templates, guides) with a **5.0% checkout fee**.
+ - _No AI writing credits included._
---
-## 2. Full Bundle Subscriptions
+## ⚡ 1. Flexible Passes (No Auto-Renewal)
-The complete career toolkit containing both Portfolio Pro publishing and monthly AI writing credits.
+Perfect for short-term projects, sudden applications, or quick updates without ongoing subscriptions.
-### Monthly Bundle
+### 3-Day Sprint Pass
-- **Price**: $11.99 / month (Billed monthly)
-- **Features**: Portfolio Pro publishing, 1,000 monthly AI writing credits, ATS and document tools.
-- **Credit Expiration**: Credits reset at the start of each billing cycle. Unused credits do not roll over and are cleared monthly.
+- **Price**: $2.99 (One-time payment)
+- **Duration**: 3 days (72 hours)
+- **Features**: Unlocked Portfolio Pro publishing (subdomain), 150 AI writing credits, ATS scanner, and unlimited document exports (PDF & DOCX).
+- **Expiration**: Credits and hosting expire when the 3-day plan duration ends.
-### Annual Bundle (Best Value)
+### 7-Day Hunt Pass
-- **Price**: $9.99 / month (Billed yearly at $120)
-- **Features**: Portfolio Pro publishing, 1,000 monthly AI writing credits, ATS and document tools.
-- **Credit Expiration**: Credits reset at the start of each billing cycle. Unused credits do not roll over and are cleared monthly.
+- **Price**: $5.99 (One-time payment)
+- **Duration**: 7 days
+- **Features**: Unlocked Portfolio Pro publishing (subdomain), 400 AI writing credits, ATS scanner, and unlimited document exports (PDF & DOCX).
+- **Expiration**: Credits and hosting expire when the 7-day plan duration ends.
---
-## 3. Standalone Add-ons (Single Superpowers)
+## 📅 2. Recurring Subscriptions
-If you only need one core capability, you can subscribe to it separately.
+Build a persistent professional presence and run continuous job search campaigns.
-### Portfolio Pro Only
+### Creator Pro (Personal Branding)
-- **Price**: $8.99 / month (Billed monthly)
+- **Price**: $9.99 / month (or $7.99 / month, billed annually at $95.88 / year)
- **Features**:
- - Custom VeriWorkly subdomain (e.g., `yourname.veriworkly.com`) to host your public site.
- - Comprehensive visitor view & referrer analytics.
- - High-speed CDN image hosting for portfolio media.
+ - Custom subdomain mapping (e.g., `yourname.veriworkly.com`).
+ - High-speed CDN hosting for portfolio media.
- VeriWorkly branding and watermark removed.
-- **AI Credits**: None included.
+ - Sell digital products or services on your site with a reduced **1.5% checkout fee**.
+ - _Note: custom domains, and AI writing credits are not included._
+
+### Job Hunter Bundle (Complete Package)
+
+- **Price**: $14.99 / month (or $10.00 / month, billed annually at $120 / year)
+- **Features**:
+ - **Everything in Creator Pro** (subdomain hosting, CDN, watermark removal).
+ - **Unlimited active resumes and cover letters** in the Studio editor.
+ - **Master Profile fully unlocked** (your central source of truth for career facts).
+ - **GitHub & LinkedIn Connectors** (sync profiles to generate resumes instantly).
+ - **Legacy Resume Importer** (upload old PDF/DOCX resumes to generate a clean VeriWorkly setup).
+ - **1,000 monthly AI credits** refilled every billing cycle (enough for multiple job-specific resume tailorings).
+- **Credit Expiration**: Unused monthly credits do not roll over.
+
+---
+
+## 🔌 3. Standalone Plans & Add-ons
-### AI Credits Only
+If you only need one core capability, you can subscribe or purchase on-demand.
-- **Price**: $4.99 / month (Billed monthly)
+### AI Credits Only (Subscription)
+
+- **Price**: $5.99 / month (Billed monthly)
- **Features**:
- 1,000 AI writing credits per month.
- - Access to resume builders, cover letter tailor engine, and portfolio AI writeups.
- - Credits tracked and visible in workspace.
-- **Credit Expiration**: Credits reset monthly; unused credits do not roll over.
-- **Website Hosting**: None included.
+ - Access to resume builders, cover letter tailor engine, and ATS scanner.
+ - Master Profile, LinkedIn/GitHub connectors, and Legacy Resume Importer unlocked.
+ - _Note: Website hosting and portfolio custom subdomains are not included._
+- **Credit Expiration**: Unused credits do not roll over.
+
+### One-Time Credit Packs (Add-ons)
+
+For Creator Pro users who need extra AI credits on-demand:
+
+- **250 Credits**: $2.99 (One-time purchase)
+- **500 Credits**: $4.99 (One-time purchase)
+- **Credit Expiration**: Add-on credits expire exactly **90 days** from purchase, or immediately if your Creator Pro subscription is cancelled.
diff --git a/apps/portfolio/template-library b/apps/portfolio/template-library
index 507f3253..ff72ecee 160000
--- a/apps/portfolio/template-library
+++ b/apps/portfolio/template-library
@@ -1 +1 @@
-Subproject commit 507f32532e4e1600e3de127cc97175ad80b4af46
+Subproject commit ff72ecee0848a71c2511e5add71575968d961a8b
diff --git a/apps/server/package.json b/apps/server/package.json
index 603d71d5..393366a5 100644
--- a/apps/server/package.json
+++ b/apps/server/package.json
@@ -1,6 +1,6 @@
{
"name": "@veriworkly/server",
- "version": "3.18.2",
+ "version": "3.20.0",
"description": "VeriWorkly Resume Backend API",
"main": "dist/index.js",
"type": "module",
diff --git a/apps/server/src/auth/mailer.ts b/apps/server/src/auth/mailer.ts
index 525c47d0..c11aa2f1 100644
--- a/apps/server/src/auth/mailer.ts
+++ b/apps/server/src/auth/mailer.ts
@@ -117,3 +117,29 @@ export async function sendLoginAlertEmail(email: string, meta: LoginAlertMeta):
await sendMail({ to: email, subject, text, html });
}
+
+/**
+ * Send contact form submission to admin
+ */
+export async function sendContactEmail(payload: {
+ name: string;
+ email: string;
+ subject: string;
+ message: string;
+}): Promise {
+ const adminEmail = config.admin.email || "admin@veriworkly.com";
+ const mailSubject = `[VeriWorkly Contact] ${payload.subject} from ${payload.name}`;
+ const text = `Contact Form Submission:\n\nName: ${payload.name}\nEmail: ${payload.email}\nSubject: ${payload.subject}\nMessage:\n${payload.message}`;
+ const html = `
+
New Contact Form Submission
+
Name: ${payload.name}
+
Email: ${payload.email}
+
Subject: ${payload.subject}
+
Message:
+
+ ${payload.message.replace(/\n/g, " ")}
+
+ `;
+
+ await sendMail({ to: adminEmail, subject: mailSubject, text, html });
+}
diff --git a/apps/server/src/index.ts b/apps/server/src/index.ts
index 910b5c52..3915a3d7 100644
--- a/apps/server/src/index.ts
+++ b/apps/server/src/index.ts
@@ -29,6 +29,7 @@ import affiliateRoutes from "#routes/affiliates";
import adminMonetizationRoutes from "#routes/adminMonetization";
import aiRoutes from "#routes/ai";
import atsRoutes from "#routes/ats";
+import contactRoutes from "#routes/contact";
import { authNodeHandler } from "#auth/index";
import { BillingController } from "#controllers/billingController";
@@ -85,6 +86,7 @@ app.use("/api/v1/affiliates", affiliateRoutes);
app.use("/api/v1/admin/monetization", adminMonetizationRoutes);
app.use("/api/v1/ai", aiRoutes);
app.use("/api/v1/ats", atsRoutes);
+app.use("/api/v1/contact", contactRoutes);
app.all("/api/v1/auth", authRequestDiagnosticsMiddleware, authNodeHandler);
app.all("/api/v1/auth/*", authRequestDiagnosticsMiddleware, authNodeHandler);
diff --git a/apps/server/src/mail/index.ts b/apps/server/src/mail/index.ts
index 8fc65ca0..dfdf17aa 100644
--- a/apps/server/src/mail/index.ts
+++ b/apps/server/src/mail/index.ts
@@ -1,3 +1,3 @@
-export { renderOtpEmail } from "./otp";
-export { renderWelcomeEmail } from "./welcome";
-export { renderLoginAlertEmail, type LoginAlertMeta } from "./loginAlert";
+export { renderOtpEmail } from "./otp.js";
+export { renderWelcomeEmail } from "./welcome.js";
+export { renderLoginAlertEmail, type LoginAlertMeta } from "./loginAlert.js";
diff --git a/apps/server/src/mail/loginAlert.ts b/apps/server/src/mail/loginAlert.ts
index edad874c..55ee4a0e 100644
--- a/apps/server/src/mail/loginAlert.ts
+++ b/apps/server/src/mail/loginAlert.ts
@@ -1,4 +1,4 @@
-import { getBaseLayout, escapeHtml } from "./layout";
+import { getBaseLayout, escapeHtml } from "./layout.js";
export interface LoginAlertMeta {
ip: string;
@@ -20,7 +20,6 @@ export function renderLoginAlertEmail(email: string, meta: LoginAlertMeta): stri
We detected a new sign-in to your VeriWorkly account (${sanitizedEmail}). Please review the session details below.
-
diff --git a/apps/server/src/routes/contact.ts b/apps/server/src/routes/contact.ts
new file mode 100644
index 00000000..baa5ebd2
--- /dev/null
+++ b/apps/server/src/routes/contact.ts
@@ -0,0 +1,57 @@
+import { z } from "zod";
+import { Router } from "express";
+
+import { sendContactEmail } from "#auth/mailer";
+
+import { logger } from "#utils/logger";
+import { createSuccessResponse, createErrorResponse } from "#utils/errors";
+
+const router = Router();
+
+const contactSchema = z.object({
+ name: z.string().min(1, "Name is required"),
+ email: z.string().email("Invalid email address"),
+ subject: z.string().min(1, "Subject is required"),
+ message: z.string().min(1, "Message is required"),
+});
+
+router.post("/", async (req, res) => {
+ try {
+ const parsed = contactSchema.safeParse(req.body);
+
+ if (!parsed.success) {
+ res.status(400).json(
+ createErrorResponse(
+ 400,
+ "Validation failed",
+ parsed.error.errors.map((e) => ({ path: e.path.join("."), message: e.message })),
+ ),
+ );
+
+ return;
+ }
+
+ const { name, email, subject, message } = parsed.data;
+
+ await sendContactEmail({ name, email, subject, message });
+
+ res.json(
+ createSuccessResponse(
+ {
+ name,
+ email,
+ subject,
+ timestamp: new Date().toISOString(),
+ },
+ "Message sent successfully",
+ ),
+ );
+ } catch (error) {
+ logger.error("Failed to process contact submission:", error);
+ res
+ .status(500)
+ .json(createErrorResponse(500, "Internal server error. Failed to send message."));
+ }
+});
+
+export default router;
diff --git a/apps/server/src/services/billingService.ts b/apps/server/src/services/billingService.ts
index d96c6c89..6f9de7c7 100644
--- a/apps/server/src/services/billingService.ts
+++ b/apps/server/src/services/billingService.ts
@@ -522,7 +522,7 @@ export class BillingService {
const currentPeriodEnd = subscription.next_billing_date
? new Date(subscription.next_billing_date)
: rawInterval === "one_day"
- ? addDays(eventTime, 1)
+ ? addDays(eventTime, 3)
: rawInterval === "seven_day"
? addDays(eventTime, 7)
: rawInterval === "annual"
@@ -698,7 +698,7 @@ export class BillingService {
const now = new Date();
expiresAt =
intervalInput === "one_day"
- ? addDays(now, 1)
+ ? addDays(now, 3)
: intervalInput === "seven_day"
? addDays(now, 7)
: intervalInput === "annual"
diff --git a/apps/server/src/services/productCatalog.ts b/apps/server/src/services/productCatalog.ts
index f2b307e8..471f6dc9 100644
--- a/apps/server/src/services/productCatalog.ts
+++ b/apps/server/src/services/productCatalog.ts
@@ -48,19 +48,19 @@ export const productCatalog: Record<
ai_credits: {
name: "AI Credits",
entitlements: [ENTITLEMENT_KEYS.AI_CREDITS],
- prices: { monthly: 499, annual: 4_990 },
+ prices: { monthly: 599, annual: 5_990 },
creditAllowance: { monthly: 1_000, annual: 12_000 },
},
portfolio_pro: {
- name: "Portfolio Pro",
+ name: "Creator Pro",
entitlements: portfolioEntitlements,
- prices: { seven_day: 399, monthly: 899, annual: 9_990 },
+ prices: { monthly: 999, annual: 9_588 },
},
bundle: {
- name: "VeriWorkly Bundle",
+ name: "Job Hunter Bundle",
entitlements: [ENTITLEMENT_KEYS.AI_CREDITS, ...portfolioEntitlements],
- prices: { one_day: 69, seven_day: 399, monthly: 1_199, annual: 12_000 },
- creditAllowance: { one_day: 25, seven_day: 220, monthly: 1_000, annual: 12_000 },
+ prices: { one_day: 299, seven_day: 599, monthly: 1_499, annual: 14_388 },
+ creditAllowance: { one_day: 150, seven_day: 400, monthly: 1_000, annual: 12_000 },
recommended: true,
},
};
diff --git a/apps/site/app/(marketing)/about/data/principles.ts b/apps/site/app/(marketing)/about/data/principles.ts
new file mode 100644
index 00000000..330f0dfa
--- /dev/null
+++ b/apps/site/app/(marketing)/about/data/principles.ts
@@ -0,0 +1,17 @@
+export const principles = [
+ {
+ title: "You own your data",
+ description:
+ "Your resumes, portfolios, and letters stay inside your browser's local storage. We do not look at, package, or sell your personal details.",
+ },
+ {
+ title: "No subscription trap",
+ description:
+ "We do not advertise free templates only to lock your download behind a paid subscription. PDF compile happens on your machine for free.",
+ },
+ {
+ title: "Sovereign career identity",
+ description:
+ "We build career identity tools, including resumes, letters, portfolios, and invoices, as linked assets. Seed your documents from one central profile.",
+ },
+];
diff --git a/apps/site/app/(marketing)/about/page.tsx b/apps/site/app/(marketing)/about/page.tsx
new file mode 100644
index 00000000..f98ee89f
--- /dev/null
+++ b/apps/site/app/(marketing)/about/page.tsx
@@ -0,0 +1,242 @@
+import type { Metadata } from "next";
+import { principles } from "./data/principles";
+import { siteConfig } from "@/config/site";
+import { Card, Button } from "@veriworkly/ui";
+import { PublicPageShell } from "@/components/layout/PublicPageShell";
+
+const pageUrl = `${siteConfig.url}/about`;
+const pageOgImage = `${siteConfig.url}/og/about-page-og.png`;
+
+export const metadata: Metadata = {
+ title: `About Us: Privacy-First AI Career Tools | ${siteConfig.shortName}`,
+ description:
+ "We believe job seekers should own their data and use AI safely. VeriWorkly is a local-first, privacy-focused AI career workspace for resumes, cover letters, and portfolios.",
+ alternates: {
+ canonical: pageUrl,
+ languages: {
+ "en-US": pageUrl,
+ },
+ },
+ openGraph: {
+ title: `About Us: Privacy-First AI Career Tools | ${siteConfig.shortName}`,
+ description:
+ "We build career tools that put job seekers in control of their data and AI assistant usage. No paywalls, no sold profiles, no data locking.",
+ url: pageUrl,
+ siteName: siteConfig.shortName,
+ type: "website",
+ images: [
+ {
+ url: pageOgImage,
+ width: 1200,
+ height: 630,
+ alt: "About VeriWorkly Platform",
+ },
+ ],
+ },
+ twitter: {
+ card: "summary_large_image",
+ title: `About Us: Privacy-First AI Career Tools | ${siteConfig.shortName}`,
+ description:
+ "Explore the open-source, AI-powered career workspace focused on data sovereignty and client-side security.",
+ images: [pageOgImage],
+ },
+};
+
+const AboutPage = () => {
+ const organizationSchema = {
+ "@context": "https://schema.org",
+ "@type": "Organization",
+ name: siteConfig.name,
+ url: siteConfig.url,
+ description: siteConfig.description,
+ sameAs: [siteConfig.links.github, siteConfig.links.twitter, siteConfig.links.linkedin],
+ founder: {
+ "@type": "Person",
+ name: siteConfig.creator,
+ },
+ };
+
+ return (
+ <>
+
+
+
+
+ {principles.map((principle, idx) => (
+
+
+
+ Principle 0{idx + 1}
+
+
+ {principle.title}
+
+
{principle.description}
+
+
+ ))}
+
+
+
+
+
+ The Problem
+
+
+ The career software tax
+
+
+ Most resume tools operate on a trap. They offer templates for free, guide you through
+ writing your credentials, and then lock your download behind a recurring subscription.
+ Alternatively, they collect your profile details and sell them to recruitment
+ databases.
+
+
+ VeriWorkly is a direct alternative. We believe your professional history belongs to
+ you. Our editor compiles documents directly in your browser's memory using
+ client-side engines. Your data is never held hostage, and you can export professional
+ PDFs or publish static portfolios instantly.
+
+
+
+
+
+ Data Architecture
+
+
+ How your data is stored
+
+
+ We separate your master career records from your document layout sandboxes:
+
+
+
+ •
+
+ Master Profile: Stores your complete background history. By
+ default, it lives locally in your browser (IndexedDB). If you log in with an
+ account, it is securely backed up and synchronized in the cloud.
+
+
+
+ •
+
+ Layout Sandbox: Adjust visual layouts independently. When you
+ create a new resume or portfolio, the app pulls a snapshot from your Master
+ Profile.
+
+
+
+ •
+
+ Decoupled Edits: Tweaking a resume does not change your Master
+ Profile, and updating your Master Profile will not overwrite existing documents.
+ You can customize templates freely.
+
+
+
+
+
+
+
+
+ Product Scope
+
+
+ Four documents, one source of truth
+
+
+ Your career documents are connected assets. VeriWorkly links your resume, cover letter,
+ web presence, and professional invoices under a single framework:
+
+
+
+
1. Document Studio
+
+ Create ATS-friendly resumes and matched cover letters tailored to specific targets.
+
+
+
+
2. Personal Portfolios
+
+ Deploy responsive web portfolios hosted on subdomains with visitor view analytics.
+
+
+
+
3. Link-in-Bio Cards
+
+ Share your links and list digital services with very competitive transaction rates.
+
+
+
+
4. Utility Docs
+
+ Generate invoices and project agreements locally to manage your freelance
+ operations.
+
+
+
+
+
+
+
+
+
+ Referrals
+
+
+ Affiliate Program
+
+
+ Promote user sovereignty in career documents and earn recurring commissions of 2%,
+ 3%, or 5%. Track conversions, clicks, and payouts inside your partner dashboard.
+
+
+
+
+
+
+
+
+
+
+ Students
+
+
+ Student Ambassador
+
+
+ Represent VeriWorkly on your campus, help peers build their career identity, and
+ earn free Portfolio Pro licenses, point boosters, and hackathon workshop
+ sponsorships.
+
+ We typically respond within 24 to 48 hours. The submission metadata
+ has been stored, and a copy of the request was delivered to the site administrator.
+
+
+
+
+
+ )}
+
+ );
+}
diff --git a/apps/site/app/(marketing)/contact/page.tsx b/apps/site/app/(marketing)/contact/page.tsx
new file mode 100644
index 00000000..c3e9bc2c
--- /dev/null
+++ b/apps/site/app/(marketing)/contact/page.tsx
@@ -0,0 +1,100 @@
+import type { Metadata } from "next";
+
+import { siteConfig } from "@/config/site";
+import { ContactExperience } from "./contact-experience";
+import { PublicPageShell } from "@/components/layout/PublicPageShell";
+
+const pageUrl = `${siteConfig.url}/contact`;
+const pageOgImage = `${siteConfig.url}/og/contact-page-og.png`;
+const supportEmail = siteConfig.email;
+
+export const metadata: Metadata = {
+ title: `Contact Support & AI Billing Help | ${siteConfig.shortName}`,
+ description:
+ "Get support for documents, portfolios, AI credit limits, subdomain routing, billing, and privacy-first features.",
+ alternates: {
+ canonical: pageUrl,
+ languages: {
+ "en-US": pageUrl,
+ },
+ },
+ openGraph: {
+ title: `Contact Support & AI Billing Help | ${siteConfig.shortName}`,
+ description:
+ "Contact us for help with resumes, portfolios, AI credits, subdomains, and account billing queries.",
+ url: pageUrl,
+ siteName: siteConfig.shortName,
+ type: "website",
+ images: [
+ {
+ url: pageOgImage,
+ width: 1200,
+ height: 630,
+ alt: `Contact VeriWorkly Support`,
+ },
+ ],
+ },
+ twitter: {
+ card: "summary_large_image",
+ title: `Contact Support | ${siteConfig.shortName}`,
+ description:
+ "Get support for resumes, cover letters, portfolios, custom subdomains, and billing queries.",
+ images: [pageOgImage],
+ },
+};
+
+const ContactPage = () => {
+ const contactSchema = {
+ "@context": "https://schema.org",
+ "@type": "ContactPage",
+ name: "Contact VeriWorkly Support",
+ url: pageUrl,
+ description: "Contact the VeriWorkly support team for help, feedback, and security issues.",
+ mainEntity: {
+ "@type": "Organization",
+ name: siteConfig.name,
+ url: siteConfig.url,
+ sameAs: [siteConfig.links.github, siteConfig.links.twitter, siteConfig.links.linkedin],
+ contactPoint: [
+ {
+ "@type": "ContactPoint",
+ contactType: "customer support",
+ email: supportEmail,
+ url: siteConfig.links.github,
+ },
+ ],
+ },
+ };
+
+ return (
+ <>
+
+
+
+
+
+
+
+
Contact VeriWorkly Support
+
+ Contact VeriWorkly for help with documents, exports, custom portfolios, subdomains,
+ privacy questions, and platform support.
+
+ We couldn't find any questions matching your query. Try clearing filters or using
+ another keyword.
+
+
+
+
+ )}
+
+ );
+};
diff --git a/apps/site/app/(marketing)/faq/data/faqItems.ts b/apps/site/app/(marketing)/faq/data/faqItems.ts
new file mode 100644
index 00000000..221a7331
--- /dev/null
+++ b/apps/site/app/(marketing)/faq/data/faqItems.ts
@@ -0,0 +1,249 @@
+import { Globe, FileText, Code, DollarSign, HelpCircle, Shield } from "lucide-react";
+
+export const categories = [
+ { id: "all", name: "All Questions", icon: HelpCircle },
+ { id: "general", name: "General & Privacy", icon: Shield },
+ { id: "documents", name: "Resumes & Documents", icon: FileText },
+ { id: "portfolios", name: "Web Portfolios", icon: Globe },
+ { id: "billing", name: "Billing & AI Credits", icon: DollarSign },
+ { id: "contribute", name: "Open Source & Contributions", icon: Code },
+] as const;
+
+export const faqs = [
+ // --- GENERAL & PRIVACY ---
+ {
+ id: "data-privacy",
+ category: "general",
+ question: "Is my data really private?",
+ answer:
+ "Yes. VeriWorkly uses a local-first architecture. Your document drafts and profile data are stored directly inside your browser's local database (IndexedDB). Optional features like cloud backups and web portfolio subdomains are only activated when you choose to register and log in.",
+ },
+
+ {
+ id: "account-requirement",
+ category: "general",
+ question: "Do I need an account to use VeriWorkly?",
+ answer:
+ "No. You can open the editor, build your resume or cover letter, and export high-fidelity PDFs completely without an account. Sign-up is only required if you want to back up data in the cloud, publish portfolios to a subdomain, or utilize AI credit features.",
+ },
+
+ {
+ id: "master-profile-concept",
+ category: "general",
+ question: "What is the Master Profile?",
+ answer:
+ "Your Master Profile serves as a central, private database of your career accomplishments. When you create a new resume, cover letter, or portfolio, the system copies information from this Master Profile to seed the new document. You can then edit and customize that document independently, so changes inside documents do not affect or overwrite your Master Profile data.",
+ },
+
+ {
+ id: "analytics-tracking",
+ category: "general",
+ question: "How is visitor analytics handled?",
+ answer:
+ "We track visitor views and referral sources in aggregate to show you portfolio traffic statistics. We do not use tracking cookies, we do not follow visitors across other websites, and we never sell your data.",
+ },
+
+ {
+ id: "mobile-compatibility",
+ category: "general",
+ question: "Can I use VeriWorkly on mobile?",
+ answer:
+ "Yes. The editing interface, dashboards, and landing pages are fully responsive. You can update your career details and export documents directly from your tablet or mobile browser.",
+ },
+
+ // --- RESUMES & DOCUMENTS ---
+ {
+ id: "ats-friendly",
+ category: "documents",
+ question: "Are the resume templates ATS-friendly?",
+ answer:
+ "Yes. All document templates focus on structured single-column and multi-column designs with clean standard typography. They are continuously tested against popular Applicant Tracking Systems (ATS) to ensure parser compliance.",
+ },
+
+ {
+ id: "deep-customization",
+ category: "documents",
+ question: "Can I customize the template design?",
+ answer:
+ "Yes. Visual customization controls let you scale margins, line-heights, letter-spacing, page paddings, font pairings, section order, and section visibility dynamically to match your target role.",
+ },
+
+ {
+ id: "master-profile-overwrite",
+ category: "documents",
+ question: "Does editing a resume update my Master Profile?",
+ answer:
+ "No. When you create a resume, it is seeded with a snapshot of your Master Profile. Any edits, section removals, or wording tweaks you perform within that resume are isolated to that document. This lets you tailor multiple resumes for different job descriptions without messing up your master data.",
+ },
+
+ {
+ id: "custom-sections",
+ category: "documents",
+ question: "Can I include custom sections like projects or volunteer work?",
+ answer:
+ "Yes. You can add standard sections (Experience, Education, Skills) as well as custom sections for certifications, volunteer work, awards, publications, and languages.",
+ },
+
+ {
+ id: "pdf-free-downloads",
+ category: "documents",
+ question: "Can I download my resume as a PDF for free?",
+ answer:
+ "Yes. Creating, editing, and exporting high-quality, print-ready PDF resumes and cover letters is completely free. There are no hidden fees or paywalled PDF downloads.",
+ },
+
+ // --- WEB PORTFOLIOS ---
+ {
+ id: "portfolio-difference",
+ category: "portfolios",
+ question: "How does the portfolio builder work?",
+ answer:
+ "The portfolio builder takes your profile facts and converts them into a modern, responsive website. You select a styled portfolio template, configure your public project displays, and publish instantly. The layout updates on the fly while preserving your text content.",
+ },
+
+ {
+ id: "custom-subdomains",
+ category: "portfolios",
+ question: "How do subdomains and SSL certificates work?",
+ answer:
+ "Subdomain mapping is included in our Portfolio Pro tier. You can secure a unique URL (such as yourname.veriworkly.com). We automatically generate and renew SSL certificates to ensure your site is served securely via HTTPS.",
+ },
+
+ {
+ id: "media-hosting-limits",
+ category: "portfolios",
+ question: "Is there a limit on image and media hosting?",
+ answer:
+ "Our paid tiers include fast, CDN-backed image hosting. You can upload project screenshots, avatars, custom icons, and portfolio assets. There are no hard limits on the number of projects you can showcase.",
+ },
+
+ {
+ id: "portfolio-draft-previews",
+ category: "portfolios",
+ question: "Can I build and preview my portfolio before upgrading?",
+ answer:
+ "Yes. You can create portfolio drafts, select templates, arrange projects, and view live interactive previews in your dashboard completely free of charge before upgrading to public hosting.",
+ },
+
+ // --- BILLING & AI CREDITS ---
+ {
+ id: "pricing-tiers",
+ category: "billing",
+ question: "What paid plans are available?",
+ answer:
+ "We offer standalone Creator Pro ($9.99/mo, or $7.99/mo billed annually) for subdomain hosting, analytics, and watermark removal. The Job Hunter Bundle ($14.99/mo, or $11.99/mo billed annually) adds 1,000 monthly AI credits and unlocks full resume tailoring tools. Standalone AI Credits are available for $5.99/mo if you do not need hosting.",
+ },
+
+ {
+ id: "short-term-passes",
+ category: "billing",
+ question: "Do you offer short-term passes instead of subscriptions?",
+ answer:
+ "Yes. We offer a 3-Day Sprint Pass ($2.99) with 150 AI credits and a 7-Day Hunt Pass ($5.99) with 400 AI credits. Both passes grant full Creator Pro subdomain publishing and expire automatically without recurring charges.",
+ },
+
+ {
+ id: "ai-credits-reset",
+ category: "billing",
+ question: "How do AI credits work and do they roll over?",
+ answer:
+ "AI credits are consumed when generating cover letters, tailoring resumes, or optimizing summary statements. Unused credits do not roll over to the next month; subscriptions reset to 1,000 credits each billing cycle, and passes expire at the end of their term.",
+ },
+
+ {
+ id: "payment-security-provider",
+ category: "billing",
+ question: "Is my payment information secure?",
+ answer:
+ "Yes. All payment and billing operations are securely processed by Dodo Payments in compliance with strict PCI-DSS standards. VeriWorkly never stores or handles your credit card credentials.",
+ },
+
+ // --- CONTRIBUTIONS & OPEN SOURCE ---
+ {
+ id: "bug-reporting-path",
+ category: "contribute",
+ question: "Where should I report bugs or regressions?",
+ answer:
+ "Please open an issue on our official GitHub repository. Provide a clear description, reproducible steps, expected vs. actual outcomes, and screenshots if possible.",
+ },
+
+ {
+ id: "feature-proposals",
+ category: "contribute",
+ question: "How do I suggest features?",
+ answer:
+ "Review our public roadmap first. If your feature is not already planned, open a feature proposal on GitHub detailing your use case and design ideas.",
+ },
+
+ {
+ id: "contribution-safety",
+ category: "contribute",
+ question: "How can I contribute code safely?",
+ answer:
+ "Check out our contributor guidelines. Start with small, focused pull requests, follow existing code formatting standards, and ensure your additions include verification steps.",
+ },
+
+ {
+ id: "pull-request-quality",
+ category: "contribute",
+ question: "What makes a high-quality pull request here?",
+ answer:
+ "A high-quality pull request has a focused scope, clear reasoning, no unrelated style modifications, and verified local build outcomes before submission.",
+ },
+
+ {
+ id: "large-contributions",
+ category: "contribute",
+ question: "Should I open an issue before a large contribution?",
+ answer:
+ "Yes. For larger features or system refactors, please open an issue first to discuss the scope and avoid duplicating efforts.",
+ },
+
+ {
+ id: "open-source-licensing",
+ category: "contribute",
+ question: "How is the project licensed?",
+ answer:
+ "VeriWorkly's core document builder and web engines are licensed under the permissive MIT License, encouraging transparency, custom audits, and developer integrations.",
+ },
+
+ {
+ id: "custom-domain-mapping",
+ category: "portfolios",
+ question: "Can I map a custom domain instead of a subdomain?",
+ answer:
+ "Currently, Portfolio Pro supports publishing to your unique VeriWorkly subdomain (e.g. yourname.veriworkly.com). Support for fully custom domains (e.g. yourname.com) is currently on our active engineering roadmap.",
+ },
+
+ {
+ id: "local-data-migration",
+ category: "general",
+ question: "How do I move my local-first data to a new computer?",
+ answer:
+ "To migrate your local data without an account, export a backup JSON file from the dashboard on your old computer, then import it on your new computer. Alternatively, register for a free account to automatically sync your profile data securely to the cloud.",
+ },
+
+ {
+ id: "credit-top-ups",
+ category: "billing",
+ question: "What happens if I run out of AI credits?",
+ answer:
+ "If you run out of credits, you can wait for your monthly cycle reset, buy standalone AI credit packs, or purchase short-term passes (like the 1-Day Pass) to immediately reload your credit balance.",
+ },
+
+ {
+ id: "refund-policy",
+ category: "billing",
+ question: "Do you offer refunds on passes or subscriptions?",
+ answer:
+ "Because we offer very low-cost passes (like the $0.69 1-Day Pass) to fully test our hosting and AI systems, we generally do not issue refunds. However, if you experience double-billing or technical failures, please contact support to request a manual review.",
+ },
+
+ {
+ id: "password-protection",
+ category: "documents",
+ question: "Can I password-protect shared documents or portfolio links?",
+ answer:
+ "Yes. When creating shared links for resumes, cover letters, or portfolio drafts, you can enable password protection. Only visitors or recruiters who enter the password will be able to view your public page.",
+ },
+];
diff --git a/apps/site/app/(marketing)/faq/page.tsx b/apps/site/app/(marketing)/faq/page.tsx
new file mode 100644
index 00000000..2b012774
--- /dev/null
+++ b/apps/site/app/(marketing)/faq/page.tsx
@@ -0,0 +1,120 @@
+import type { Metadata } from "next";
+
+import Link from "next/link";
+
+import { Card } from "@veriworkly/ui";
+import { siteConfig } from "@/config/site";
+
+import { faqs } from "./data/faqItems";
+
+import { PublicPageShell } from "@/components/layout/PublicPageShell";
+import { FaqInteractiveSection } from "./components/FaqInteractiveSection";
+
+const pageUrl = `${siteConfig.url}/faq`;
+const pageOgImage = `${siteConfig.url}/og/faq-page-og.png`;
+
+export const metadata: Metadata = {
+ title: `Frequently Asked Questions: AI Credits & Features | ${siteConfig.shortName}`,
+ description:
+ "Got questions about templates, custom subdomains, local-first document creation, AI credits, or cloud backups? Read our FAQ.",
+ alternates: {
+ canonical: pageUrl,
+ languages: {
+ "en-US": pageUrl,
+ },
+ },
+ openGraph: {
+ title: `Frequently Asked Questions: AI Credits & Features | ${siteConfig.shortName}`,
+ description:
+ "Got questions about templates, custom subdomains, local-first document creation, AI credits, or cloud backups? Read our FAQ.",
+ url: pageUrl,
+ siteName: siteConfig.shortName,
+ type: "website",
+ images: [
+ {
+ url: pageOgImage,
+ width: 1200,
+ height: 630,
+ alt: `VeriWorkly FAQ`,
+ },
+ ],
+ },
+
+ twitter: {
+ card: "summary_large_image",
+ title: `Frequently Asked Questions | ${siteConfig.shortName}`,
+ description:
+ "Got questions about templates, custom subdomains, local-first document creation, or cloud backups? Read our FAQ.",
+ images: [pageOgImage],
+ },
+};
+
+const FAQPage = () => {
+ const faqSchema = {
+ "@context": "https://schema.org",
+ "@type": "FAQPage",
+ mainEntity: faqs.map((faq) => ({
+ "@type": "Question",
+ name: faq.question,
+ acceptedAnswer: {
+ "@type": "Answer",
+ text: faq.answer,
+ },
+ })),
+ };
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+ Open source
+
+
Contribute to VeriWorkly
+
+
+ VeriWorkly is open-source. Start by reading our contribution guidelines and checking
+ open issues on GitHub.
+
+
+
+
+ Open GitHub repository
+
+
+
+
+
+
+
+
VeriWorkly FAQ
+
+
+ Find answers about ATS-friendly documents, custom portfolio subdomains, template visual
+ controls, privacy policies, and AI credits usage.
+
+
+ >
+ );
+};
+
+export default FAQPage;
diff --git a/apps/site/app/(marketing)/features/page.tsx b/apps/site/app/(marketing)/features/page.tsx
new file mode 100644
index 00000000..afefbf2e
--- /dev/null
+++ b/apps/site/app/(marketing)/features/page.tsx
@@ -0,0 +1,267 @@
+import type { Metadata } from "next";
+import { siteConfig } from "@/config/site";
+import { Card, Button } from "@veriworkly/ui";
+import { PublicPageShell } from "@/components/layout/PublicPageShell";
+import { Sparkles, FileText, Globe, RefreshCcw, Database, ShieldCheck, Check } from "lucide-react";
+
+const pageUrl = `${siteConfig.url}/features`;
+const pageOgImage = `${siteConfig.url}/og/features-page-og.png`;
+
+export const metadata: Metadata = {
+ title: `Platform Features & AI Tools | ${siteConfig.shortName}`,
+ description:
+ "Explore our AI-powered resume tailoring, cover letter writer, visual editor, web portfolio publisher, local sandboxing, and secure cloud sync.",
+ alternates: {
+ canonical: pageUrl,
+ languages: {
+ "en-US": pageUrl,
+ },
+ },
+ openGraph: {
+ title: `Platform Features & AI Tools | ${siteConfig.shortName}`,
+ description:
+ "A complete ecosystem for career assets: resumes, cover letters, portfolios, and link cards with offline-first storage and built-in AI tailoring.",
+ url: pageUrl,
+ siteName: siteConfig.shortName,
+ type: "website",
+ images: [
+ {
+ url: pageOgImage,
+ width: 1200,
+ height: 630,
+ alt: "VeriWorkly Platform Features",
+ },
+ ],
+ },
+ twitter: {
+ card: "summary_large_image",
+ title: `Platform Features & AI Tools | ${siteConfig.shortName}`,
+ description:
+ "Review our privacy-first features: AI document tailoring, client-side PDF compiler, sitemap router, and aggregate statistics.",
+ images: [pageOgImage],
+ },
+};
+
+const featureList = [
+ {
+ title: "Document Studio",
+ description:
+ "Write and format ATS-friendly resumes and cover letters in a structured layout system.",
+ icon: FileText,
+ bullets: [
+ "Strict layout compilation outputting parser-friendly text markup",
+ "Dynamic sliders for visual margins, paddings, and font sizes",
+ "Curated typography pairings with layout scale locks",
+ "Local PDF exports rendered directly in the browser using client engines",
+ ],
+ className: "md:col-span-2 lg:col-span-2",
+ },
+ {
+ title: "Web Portfolios",
+ description: "Publish your credentials as a fast, responsive website mapped to subdomains.",
+ icon: Globe,
+ bullets: [
+ "Subdomain routing (e.g. username.veriworkly.com)",
+ "Upload screenshots and project assets securely",
+ "Custom SEO title options and layout toggle controls",
+ ],
+ className: "md:col-span-1 lg:col-span-1",
+ },
+ {
+ title: "Link Cards",
+ description:
+ "Build a single, clean link aggregator for your social profiles and digital services.",
+ icon: Sparkles,
+ bullets: [
+ "Fast-loading mobile layout optimized for social media links",
+ "Add custom link buttons or contact cards",
+ ],
+ className: "md:col-span-1 lg:col-span-1",
+ },
+ {
+ title: "Master Profile Sandbox",
+ description: "Synchronize factual history without cluttering individual document layouts.",
+ icon: RefreshCcw,
+ bullets: [
+ "Central database holding complete factual records",
+ "Cloud backup and sync when you register and log in",
+ "Create resumes as snapshots decoupled from the master facts",
+ ],
+ className: "md:col-span-1 lg:col-span-1",
+ },
+ {
+ title: "Data Ingestors",
+ description: "Import your existing profile details and legacy files with zero manual typing.",
+ icon: Database,
+ bullets: [
+ "Extract facts from LinkedIn profile downloads and PDFs",
+ "Sync GitHub public projects and contribution calendars",
+ "Standard imports to populate your database instantly",
+ ],
+ className: "md:col-span-1 lg:col-span-1",
+ },
+ {
+ title: "Security & Open Sovereignty",
+ description: "Host your own server, audit code parameters, and own your database files.",
+ icon: ShieldCheck,
+ bullets: [
+ "IndexedDB architecture that runs entirely client-side",
+ "Authenticated sign-in powered by Better Auth OTP credentials",
+ "Open-source MIT database configurations and backend files",
+ "Developer API Keys supporting custom automation limits",
+ ],
+ className: "md:col-span-2 lg:col-span-2",
+ },
+];
+
+const FeaturesPage = () => {
+ const featuresSchema = {
+ "@context": "https://schema.org",
+ "@type": "WebPage",
+ name: "VeriWorkly Platform Features",
+ url: pageUrl,
+ description:
+ "Comprehensive features list including document editors, portfolios, link cards, and cloud sync.",
+ };
+
+ return (
+ <>
+
+
+
+
+ {featureList.map((feat) => {
+ const Icon = feat.icon;
+ return (
+
+
+
+
+
+
+
+ Workspace tool
+
+
+
+
{feat.title}
+
{feat.description}
+
+
+ {feat.bullets.map((b) => (
+
+
+ {b}
+
+ ))}
+
+
+
+ );
+ })}
+
+
+
+
+
+ →
+
+
+ Ready?
+
+
+
+ Create your profile
+
+
+ Start building your documents without registering. Upload a file or connect GitHub
+ to import data.
+
+
+
+
+
+
+
+
+
+
+
+ Comparison
+
+
+ Platform difference
+
+
+ How we build against proprietary subscription-trap career portals.
+
+
+
+
+
+
+
+
Feature
+
Traditional Competitors
+
VeriWorkly Platform
+
+
+
+
+
Layout PDF Downloads
+
Hidden behind paywalls and trials
+
100% Free & Local Compile
+
+
+
Sign-up Gating
+
Mandatory (to harvest databases)
+
No Registration Required
+
+
+
Data Storage Location
+
Locked on proprietary servers
+
Local-First (IndexedDB)
+
+
+
Data Sync Security
+
Plaintext analytics profiles
+
+ Encrypted Cloud Sync (Optional)
+
+
+
+
Open Source Audits
+
Closed, opaque databases
+
Auditable MIT Core
+
+
+
Career Assets
+
Only Resumes or Cover Letters
+
+ Resumes, Letters, Portfolios, Invoices
+
+
+
+
+
+
+
+ >
+ );
+};
+
+export default FeaturesPage;
diff --git a/apps/site/app/(marketing)/how-it-works/page.tsx b/apps/site/app/(marketing)/how-it-works/page.tsx
new file mode 100644
index 00000000..cf9d246a
--- /dev/null
+++ b/apps/site/app/(marketing)/how-it-works/page.tsx
@@ -0,0 +1,169 @@
+import type { Metadata } from "next";
+import { siteConfig } from "@/config/site";
+import { Card, Button } from "@veriworkly/ui";
+import { PublicPageShell } from "@/components/layout/PublicPageShell";
+import { Database, Cpu, ShieldCheck, Lock, UploadCloud } from "lucide-react";
+
+const pageUrl = `${siteConfig.url}/how-it-works`;
+const pageOgImage = `${siteConfig.url}/og/how-it-works-page-og.png`;
+
+export const metadata: Metadata = {
+ title: `How It Works: Privacy-First AI Career Builder | ${siteConfig.shortName}`,
+ description:
+ "Learn how our local-first storage, client-side WebAssembly compilers, privacy-first AI copywriting engine, and secure cloud sync protect your data.",
+ alternates: {
+ canonical: pageUrl,
+ languages: {
+ "en-US": pageUrl,
+ },
+ },
+ openGraph: {
+ title: `How It Works: Privacy-First AI Career Builder | ${siteConfig.shortName}`,
+ description:
+ "A deep dive into local browser databases, offline compilers, stateless AI credit engines, and secure cloud synchronization.",
+ url: pageUrl,
+ siteName: siteConfig.shortName,
+ type: "website",
+ images: [
+ {
+ url: pageOgImage,
+ width: 1200,
+ height: 630,
+ alt: "VeriWorkly Platform Architecture",
+ },
+ ],
+ },
+ twitter: {
+ card: "summary_large_image",
+ title: `How It Works: Privacy-First AI Career Builder | ${siteConfig.shortName}`,
+ description:
+ "Explore how browser databases, offline compilers, and stateless AI engines let you control your career credentials.",
+ images: [pageOgImage],
+ },
+};
+
+const steps = [
+ {
+ step: "01",
+ title: "Local browser storage",
+ description:
+ "Your documents are saved inside your browser's private database (IndexedDB). No text leaves your machine by default, allowing you to use the editors, templates, and features without registering an account.",
+ icon: Database,
+ },
+ {
+ step: "02",
+ title: "Document sandbox",
+ description:
+ "Your Master Profile holds your background records. When you start a document, the editor pulls a snapshot from your profile. Changes inside templates remain sandboxed and will not overwrite your master records.",
+ icon: ShieldCheck,
+ },
+ {
+ step: "03",
+ title: "Browser compilers",
+ description:
+ "When you download a resume or cover letter PDF, the compilation happens inside your browser tab using WebAssembly. Your personal facts are never processed on external servers.",
+ icon: Cpu,
+ },
+ {
+ step: "04",
+ title: "Secure cloud backups",
+ description:
+ "If you register and log in, your Master Profile and sandbox documents are backed up and synchronized in the cloud. Your account is secured using passwordless OTP credentials.",
+ icon: Lock,
+ },
+ {
+ step: "05",
+ title: "Subdomain routing",
+ description:
+ "Publishing a portfolio pushes metadata to our edge router. The system dynamically maps visitors (e.g. name.veriworkly.com) and displays your web portfolio page without cookies.",
+ icon: UploadCloud,
+ },
+];
+
+const HowItWorksPage = () => {
+ const howToSchema = {
+ "@context": "https://schema.org",
+ "@type": "HowTo",
+ name: "How to Build a Sovereign Career Portfolio",
+ description:
+ "Step-by-step overview of local-first editing, browser compilers, and optional cloud sync.",
+ step: steps.map((s, idx) => ({
+ "@type": "HowToStep",
+ position: idx + 1,
+ name: s.title,
+ text: s.description,
+ })),
+ };
+
+ return (
+ <>
+
+
+
+
+ {steps.map((s) => {
+ const Icon = s.icon;
+ return (
+
+
+
+ {s.step}
+
+
+ Phase
+
+
+
+
+
+
+
+
+
{s.title}
+
+
{s.description}
+
+
+ );
+ })}
+
+
+
+
+ Audits
+
+
+ Open and auditable codebase
+
+
+ A privacy statement is only as good as the code that executes it. Because VeriWorkly is
+ open-source, developers, job seekers, and security engineers can audit our database
+ settings, compile parameters, and routing scripts. You can run the entire platform
+ locally, inspect the configuration, or self-host your own database endpoints.
+
+
+
+
+
+
+ >
+ );
+};
+
+export default HowItWorksPage;
diff --git a/apps/site/app/(marketing)/layout.tsx b/apps/site/app/(marketing)/layout.tsx
new file mode 100644
index 00000000..d90e311b
--- /dev/null
+++ b/apps/site/app/(marketing)/layout.tsx
@@ -0,0 +1,8 @@
+import React from "react";
+import { MainLayout } from "@/components/layout/MainLayout";
+
+const MarketingLayout = ({ children }: { children: React.ReactNode }) => {
+ return {children};
+};
+
+export default MarketingLayout;
diff --git a/apps/site/app/page.tsx b/apps/site/app/(marketing)/page.tsx
similarity index 77%
rename from apps/site/app/page.tsx
rename to apps/site/app/(marketing)/page.tsx
index ec63ec28..6f5d02fb 100644
--- a/apps/site/app/page.tsx
+++ b/apps/site/app/(marketing)/page.tsx
@@ -22,14 +22,19 @@ const pageUrl = siteConfig.url;
const pageOgImage = `${siteConfig.url}/og/landing-page-og.png`;
export const metadata: Metadata = {
- title: `Free ATS Resume Builder – No Login Required | ${siteConfig.shortName}`,
+ title: `Free AI Resume Builder, Cover Letters & Portfolios | ${siteConfig.shortName}`,
description:
- "Create ATS-friendly resumes instantly with VeriWorkly. Free, open-source, privacy-first, and no login required.",
-
+ "Build and tailor ATS-friendly resumes, cover letters, and web portfolios instantly with advanced AI tools. Free, privacy-first, open-core, and no login required.",
+ alternates: {
+ canonical: pageUrl,
+ languages: {
+ "en-US": pageUrl,
+ },
+ },
openGraph: {
- title: `Free ATS Resume Builder (No Login) | ${siteConfig.shortName}`,
+ title: `Free AI Resumes, Cover Letters & Portfolios | ${siteConfig.shortName}`,
description:
- "Build professional ATS-friendly resumes in minutes with VeriWorkly for free. Free, open-source, privacy-first, and no signup required resume builder. Choose from modern resume templates, customize easily, and download instantly.",
+ "Create professional resumes, cover letters, and web portfolios in minutes with VeriWorkly's privacy-first AI tools. Free, open-core, and no signup required. Customize professional templates, sync dynamic sections with AI tailoring, and publish instantly.",
url: pageUrl,
siteName: siteConfig.shortName,
type: "website",
@@ -38,16 +43,16 @@ export const metadata: Metadata = {
url: pageOgImage,
width: 1200,
height: 630,
- alt: `${siteConfig.shortName} Resume Builder`,
+ alt: `${siteConfig.shortName} Document & Portfolio Platform`,
},
],
},
twitter: {
card: "summary_large_image",
- title: `Free ATS Resume Builder (No Login) | ${siteConfig.shortName}`,
+ title: `Free AI Resumes, Cover Letters & Portfolios | ${siteConfig.shortName}`,
description:
- "Create ATS-friendly resumes instantly. No signup required. Open-source and privacy-first.",
+ "Build ATS-friendly resumes, cover letters, and custom portfolios instantly with private AI assistance. No signup required. Open-core and privacy-first.",
images: [pageOgImage],
},
};
@@ -64,7 +69,8 @@ const Home = () => {
name: "VeriWorkly",
applicationCategory: "BusinessApplication",
operatingSystem: "Web",
- description: "Free ATS-friendly resume builder with no login required.",
+ description:
+ "Free-to-use privacy-first career workspace with AI resume builder, AI cover letter writer, and AI portfolio builder.",
url: siteConfig.url,
offers: {
"@type": "Offer",
@@ -76,12 +82,14 @@ const Home = () => {
name: "Gautam Raj",
},
featureList: [
- "ATS-friendly resume builder",
+ "ATS-friendly AI resume builder & tailoring",
+ "AI cover letter generator",
+ "AI portfolio publisher with custom subdomains",
"No login required",
- "Open-source",
- "Privacy-first",
- "Resume PDF export",
- "Modern resume templates",
+ "Open-core platform",
+ "Privacy-first & local-first",
+ "GitHub & LinkedIn data imports",
+ "Master Profile dynamic synchronization",
],
}),
}}
diff --git a/apps/site/app/(marketing)/pricing/page.tsx b/apps/site/app/(marketing)/pricing/page.tsx
new file mode 100644
index 00000000..750b68bf
--- /dev/null
+++ b/apps/site/app/(marketing)/pricing/page.tsx
@@ -0,0 +1,28 @@
+import type { Metadata } from "next";
+
+import { siteConfig } from "@/config/site";
+
+import { PricingExperience } from "./pricing-experience";
+
+export const metadata: Metadata = {
+ title: "Pricing & AI Credit Packages | VeriWorkly",
+ description:
+ "Get flexible access to VeriWorkly Portfolio Pro and AI credits for resume tailoring. Choose daily, weekly, monthly, or yearly packages.",
+ alternates: {
+ canonical: `${siteConfig.url}/pricing`,
+ languages: {
+ "en-US": `${siteConfig.url}/pricing`,
+ },
+ },
+ openGraph: {
+ title: "Pricing & AI Credit Packages | VeriWorkly",
+ description:
+ "Get flexible access to VeriWorkly Portfolio Pro and AI credits for resume tailoring. Choose daily, weekly, monthly, or yearly packages.",
+ url: `${siteConfig.url}/pricing`,
+ type: "website",
+ },
+};
+
+export default function PricingPage() {
+ return ;
+}
diff --git a/apps/site/app/(marketing)/pricing/pricing-experience.tsx b/apps/site/app/(marketing)/pricing/pricing-experience.tsx
new file mode 100644
index 00000000..263bc670
--- /dev/null
+++ b/apps/site/app/(marketing)/pricing/pricing-experience.tsx
@@ -0,0 +1,552 @@
+"use client";
+
+import { useState, useEffect } from "react";
+import {
+ ArrowRight,
+ Check,
+ CheckCircle2,
+ Clock3,
+ Coins,
+ Crown,
+ LoaderCircle,
+ Minus,
+ ShieldCheck,
+ Sparkles,
+ WandSparkles,
+ Zap,
+} from "lucide-react";
+
+import { siteConfig } from "@/config/site";
+import { ApiRequestError, fetchApiData } from "@/utils/fetchApiData";
+
+type ProductKey = "ai_credits" | "portfolio_pro" | "bundle";
+type BillingInterval = "one_day" | "seven_day" | "monthly" | "annual";
+
+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;
+
+const customPlans = {
+ portfolio_pro: {
+ eyebrow: "Publish and grow",
+ title: "Creator Pro",
+ price: "$9.99",
+ description: "For builders who want a polished public portfolio without the AI bundle.",
+ icon: Crown,
+ features: ["Public subdomain", "Analytics & views", "SEO meta controls", "No watermark"],
+ },
+ ai_credits: {
+ eyebrow: "Write with momentum",
+ title: "AI Standalone",
+ price: "$5.99",
+ description: "For focused writing help across resumes, cover letters, and portfolio content.",
+ icon: WandSparkles,
+ features: [
+ "1,000 monthly credits",
+ "Tailor documents & bios",
+ "ATS Score optimization",
+ "Credits tracked clearly",
+ ],
+ },
+} as const;
+
+export function PricingExperience() {
+ const [bundleInterval, setBundleInterval] = useState<"monthly" | "annual">("annual");
+ const [customPlan, setCustomPlan] = useState<"portfolio_pro" | "ai_credits">("portfolio_pro");
+ const [loading, setLoading] = useState("");
+ const [error, setError] = useState("");
+ const [user, setUser] = useState<{ email?: string | null } | null>(null);
+
+ useEffect(() => {
+ fetchApiData<{ email: string | null; name: string | null }>("/users/me")
+ .then((data) => {
+ setUser(data);
+ })
+ .catch(() => {
+ setUser(null);
+ });
+ }, []);
+
+ const isProd = process.env.NODE_ENV === "production";
+ const adminEmail = (
+ process.env.NEXT_PUBLIC_ADMIN_EMAIL || "ashragautam25@gmail.com"
+ ).toLowerCase();
+ const isAdmin = user && user.email && user.email.toLowerCase() === adminEmail;
+ const paymentsBlocked = isProd && !isAdmin;
+
+ const checkout = async (productKey: ProductKey, interval: BillingInterval) => {
+ if (paymentsBlocked) return;
+ const checkoutKey = `${productKey}:${interval}`;
+ setLoading(checkoutKey);
+ setError("");
+
+ try {
+ const result = await fetchApiData<{ url: string }>("/billing/checkout", {
+ method: "POST",
+ body: JSON.stringify({ productKey, interval, redirectUrl: "/billing" }),
+ });
+ window.location.assign(result.url);
+ } catch (cause) {
+ if (cause instanceof ApiRequestError && cause.status === 401) {
+ const params = new URLSearchParams({ productKey, interval });
+ window.location.assign(`${siteConfig.links.app}/checkout?${params.toString()}`);
+ return;
+ }
+
+ setError(cause instanceof Error ? cause.message : "Could not start checkout.");
+ setLoading("");
+ }
+ };
+
+ const bundlePrice =
+ bundleInterval === "annual"
+ ? { amount: "$11.99", cadence: "/ month", note: "$143.88 billed yearly", savings: "Save 20%" }
+ : {
+ amount: "$14.99",
+ cadence: "/ month",
+ note: "Billed monthly",
+ savings: "Recommended",
+ };
+
+ const selectedCustom = customPlans[customPlan];
+ const CustomIcon = selectedCustom.icon;
+
+ return (
+
+ {/* Hero Header */}
+
+
+
+
+
+
+
+
+ Pay for the pace you need
+
+
+ One workspace.
+ Your timeline.
+
+
+
+
+
+ Get Creator Pro hosting and AI writing tools together for a weekend, a week, or a
+ full year. Zero automatic renewal risk.
+
+
+ Secure checkout by Dodo Payments
+
+
+
+
+ {paymentsBlocked ? (
+
+ Payments are disabled in production during this phase. Only system administrators can
+ perform checkouts.
+
+ Core resume and portfolio editors stay free forever. Upgrade when you need active
+ subdomain hosting, custom SEO configurations, or advanced AI content tailoring.
+
+
+
+
+
+
+ What's included
+
+ Free
+
+
+ Creator Pro
+
+
+ AI Standalone
+
+
+ Bundle
+
+
+
+ );
+}
+
+function CheckoutButton({
+ children,
+ className,
+ loading,
+ onClick,
+ disabled,
+}: {
+ children: React.ReactNode;
+ className: string;
+ loading: boolean;
+ onClick: () => void;
+ disabled?: boolean;
+}) {
+ return (
+
+ );
+}
diff --git a/apps/site/app/(marketing)/privacy/page.tsx b/apps/site/app/(marketing)/privacy/page.tsx
new file mode 100644
index 00000000..3fd10301
--- /dev/null
+++ b/apps/site/app/(marketing)/privacy/page.tsx
@@ -0,0 +1,172 @@
+import type { Metadata } from "next";
+
+import { siteConfig } from "@/config/site";
+import { Card, Badge } from "@veriworkly/ui";
+
+import { PublicPageShell } from "@/components/layout/PublicPageShell";
+
+const pageUrl = `${siteConfig.url}/privacy`;
+const pageOgImage = `${siteConfig.url}/og/privacy-page-og.png`;
+
+export const metadata: Metadata = {
+ title: `Privacy Policy: Privacy-First AI Resume Builder | ${siteConfig.shortName}`,
+ description:
+ "Review how VeriWorkly protects resumes, cover letters, and portfolios. Learn about our local-first storage, encrypted sync, and stateless, private AI processing.",
+ alternates: {
+ canonical: pageUrl,
+ languages: {
+ "en-US": pageUrl,
+ },
+ },
+ openGraph: {
+ title: `Privacy Policy: Privacy-First AI Resume Builder | ${siteConfig.shortName}`,
+ description:
+ "Your documents stay private. We support local-first browser storage, secure cloud sync, and stateless AI processing.",
+ url: pageUrl,
+ siteName: siteConfig.shortName,
+ type: "website",
+ images: [
+ {
+ url: pageOgImage,
+ width: 1200,
+ height: 630,
+ alt: `${siteConfig.shortName} Privacy Parameters`,
+ },
+ ],
+ },
+ twitter: {
+ card: "summary_large_image",
+ title: `Privacy Policy | ${siteConfig.shortName}`,
+ description:
+ "Explore data safety boundaries: browser IndexedDB storage, sitemap routes, and opt-in sharing rules.",
+ images: [pageOgImage],
+ },
+};
+
+const privacyTopics = [
+ {
+ title: "Local-First Browser Storage",
+ description:
+ "All credentials, layouts, and profile facts reside in your browser's private storage database (IndexedDB). No text is uploaded to remote servers without your deliberate choice.",
+ },
+ {
+ title: "Opt-in Portfolios Sharing",
+ description:
+ "Published portfolios and link-in-bio cards are serveable publicly. Shared links can be password-protected, and you can take down pages from your dashboard at any time.",
+ },
+ {
+ title: "Privacy-First Analytics",
+ description:
+ "We track visitor views and referral links on published portfolios. It is fully GDPR/CCPA compliant, runs without cookies, and does not profile visitor identities.",
+ },
+ {
+ title: "Third-Party Integrations",
+ description:
+ "If you sync GitHub repositories or import LinkedIn data, those processes run directly under client-authorized sessions. We never store or sell your credential credentials.",
+ },
+];
+
+const PrivacyPage = () => {
+ const privacySchema = {
+ "@context": "https://schema.org",
+ "@type": "WebPage",
+ name: "Privacy Policy | VeriWorkly",
+ url: pageUrl,
+ description:
+ "Learn how VeriWorkly secures career data through local-first and encrypted workflows.",
+ about: {
+ "@type": "Thing",
+ name: "Privacy Policy",
+ },
+ };
+
+ return (
+ <>
+
+
+
+ {/* Core Privacy Grid */}
+
+ {privacyTopics.map((topic) => (
+
+
+
+ Parameter
+
+
{topic.title}
+
{topic.description}
+
+
+ ))}
+
+
+ {/* Detailed Sections */}
+
+
+
User Rights
+
+ Direct ownership of data
+
+
+
+ No Login Required: You can open the Document Studio, write resumes
+ or cover letters, edit layout structures, and export PDFs completely without
+ registering.
+
+
+ Cloud Backups (Optional): When you register, your Master Profile
+ and layout sandboxes sync to the cloud. Connections are encrypted via SSL/TLS and
+ secured by Better Auth.
+
+
+ Zero Profiling: We do not compile, sell, or rent your professional
+ details to advertiser databases or recruiter lists.
+
+
+
+
+
+
Data Usage
+
+ How we process assets
+
+
+ VeriWorkly keeps document drafts isolated from your Master Profile. Edits inside
+ layouts remain local to that template, preventing unintentional modifications of your
+ master credentials.
+
+
+ Billing operations are processed directly by Dodo Payments in compliance with PCI-DSS
+ standards. VeriWorkly does not store or process your credit card coordinates.
+
+
+
+
+
+ Have questions about your data privacy?{" "}
+
+ Contact support directly
+
+ .
+
+
+ >
+ );
+};
+
+export default PrivacyPage;
diff --git a/apps/site/app/roadmap/[id]/components/FeatureDetailsContent.tsx b/apps/site/app/(marketing)/roadmap/[id]/components/FeatureDetailsContent.tsx
similarity index 100%
rename from apps/site/app/roadmap/[id]/components/FeatureDetailsContent.tsx
rename to apps/site/app/(marketing)/roadmap/[id]/components/FeatureDetailsContent.tsx
diff --git a/apps/site/app/roadmap/[id]/components/FeatureHeader.tsx b/apps/site/app/(marketing)/roadmap/[id]/components/FeatureHeader.tsx
similarity index 100%
rename from apps/site/app/roadmap/[id]/components/FeatureHeader.tsx
rename to apps/site/app/(marketing)/roadmap/[id]/components/FeatureHeader.tsx
diff --git a/apps/site/app/roadmap/[id]/components/SuggestedItemsSidebar.tsx b/apps/site/app/(marketing)/roadmap/[id]/components/SuggestedItemsSidebar.tsx
similarity index 100%
rename from apps/site/app/roadmap/[id]/components/SuggestedItemsSidebar.tsx
rename to apps/site/app/(marketing)/roadmap/[id]/components/SuggestedItemsSidebar.tsx
diff --git a/apps/site/app/roadmap/[id]/page.tsx b/apps/site/app/(marketing)/roadmap/[id]/page.tsx
similarity index 97%
rename from apps/site/app/roadmap/[id]/page.tsx
rename to apps/site/app/(marketing)/roadmap/[id]/page.tsx
index 3cbf9e23..f39252f0 100644
--- a/apps/site/app/roadmap/[id]/page.tsx
+++ b/apps/site/app/(marketing)/roadmap/[id]/page.tsx
@@ -38,12 +38,17 @@ export async function generateMetadata({ params }: RoadmapDetailPageProps): Prom
const metadataDescription =
item.description ||
- `Track progress, updates, and release details for ${item.title} in the VeriWorkly resume builder roadmap.`;
+ `Track progress, updates, and release details for ${item.title} in the VeriWorkly platform roadmap.`;
return {
- title: `${item.title} | Resume Builder Roadmap`,
+ title: `${item.title} | Platform Roadmap`,
description: metadataDescription,
-
+ alternates: {
+ canonical: `${siteConfig.url}/roadmap/${id}`,
+ languages: {
+ "en-US": `${siteConfig.url}/roadmap/${id}`,
+ },
+ },
openGraph: {
title: `${item.title} | VeriWorkly Roadmap`,
description: metadataDescription,
diff --git a/apps/site/app/roadmap/components/RoadmapHeader.tsx b/apps/site/app/(marketing)/roadmap/components/RoadmapHeader.tsx
similarity index 100%
rename from apps/site/app/roadmap/components/RoadmapHeader.tsx
rename to apps/site/app/(marketing)/roadmap/components/RoadmapHeader.tsx
diff --git a/apps/site/app/roadmap/components/RoadmapPageShell.tsx b/apps/site/app/(marketing)/roadmap/components/RoadmapPageShell.tsx
similarity index 100%
rename from apps/site/app/roadmap/components/RoadmapPageShell.tsx
rename to apps/site/app/(marketing)/roadmap/components/RoadmapPageShell.tsx
diff --git a/apps/site/app/roadmap/components/RoadmapSEOContent.tsx b/apps/site/app/(marketing)/roadmap/components/RoadmapSEOContent.tsx
similarity index 76%
rename from apps/site/app/roadmap/components/RoadmapSEOContent.tsx
rename to apps/site/app/(marketing)/roadmap/components/RoadmapSEOContent.tsx
index f532d85e..bfcd9f73 100644
--- a/apps/site/app/roadmap/components/RoadmapSEOContent.tsx
+++ b/apps/site/app/(marketing)/roadmap/components/RoadmapSEOContent.tsx
@@ -12,8 +12,8 @@ const RoadmapSEOContent = () => {
- VeriWorkly is a free, privacy-first resume builder with no login required. We continuously
- improve the platform based on user feedback and evolving hiring trends.
+ VeriWorkly is a free, privacy-first career documents platform with no login required. We
+ continuously improve the platform based on user feedback and evolving hiring trends.
);
diff --git a/apps/site/app/roadmap/components/RoadmapSortControls.tsx b/apps/site/app/(marketing)/roadmap/components/RoadmapSortControls.tsx
similarity index 100%
rename from apps/site/app/roadmap/components/RoadmapSortControls.tsx
rename to apps/site/app/(marketing)/roadmap/components/RoadmapSortControls.tsx
diff --git a/apps/site/app/roadmap/components/RoadmapStatsGrid.tsx b/apps/site/app/(marketing)/roadmap/components/RoadmapStatsGrid.tsx
similarity index 100%
rename from apps/site/app/roadmap/components/RoadmapStatsGrid.tsx
rename to apps/site/app/(marketing)/roadmap/components/RoadmapStatsGrid.tsx
diff --git a/apps/site/app/roadmap/components/RoadmapStatusFilters.tsx b/apps/site/app/(marketing)/roadmap/components/RoadmapStatusFilters.tsx
similarity index 100%
rename from apps/site/app/roadmap/components/RoadmapStatusFilters.tsx
rename to apps/site/app/(marketing)/roadmap/components/RoadmapStatusFilters.tsx
diff --git a/apps/site/app/roadmap/done/page.tsx b/apps/site/app/(marketing)/roadmap/done/page.tsx
similarity index 77%
rename from apps/site/app/roadmap/done/page.tsx
rename to apps/site/app/(marketing)/roadmap/done/page.tsx
index 773e3c3a..49ea63eb 100644
--- a/apps/site/app/roadmap/done/page.tsx
+++ b/apps/site/app/(marketing)/roadmap/done/page.tsx
@@ -10,13 +10,18 @@ import {
import RoadmapPageShell from "../components/RoadmapPageShell";
export const metadata: Metadata = {
- title: `Completed Resume Builder Features | ${siteConfig.shortName} Roadmap`,
+ title: `Shipped AI & Platform Features | ${siteConfig.shortName} Roadmap`,
description:
- "See completed features, shipped updates, and released improvements in the VeriWorkly resume builder roadmap.",
-
+ "View completed AI features, shipped resume and portfolio updates, and released improvements in the VeriWorkly roadmap.",
+ alternates: {
+ canonical: `${siteConfig.url}/roadmap/done`,
+ languages: {
+ "en-US": `${siteConfig.url}/roadmap/done`,
+ },
+ },
openGraph: {
- title: `${siteConfig.shortName} Roadmap – Completed Features`,
- description: "View recently completed features and updates in VeriWorkly resume builder.",
+ title: `${siteConfig.shortName} Roadmap: Shipped AI Features`,
+ description: "View recently completed AI features and updates in the VeriWorkly roadmap.",
url: `${siteConfig.url}/roadmap/done`,
siteName: siteConfig.shortName,
images: [
diff --git a/apps/site/app/roadmap/error.tsx b/apps/site/app/(marketing)/roadmap/error.tsx
similarity index 100%
rename from apps/site/app/roadmap/error.tsx
rename to apps/site/app/(marketing)/roadmap/error.tsx
diff --git a/apps/site/app/roadmap/in-progress/page.tsx b/apps/site/app/(marketing)/roadmap/in-progress/page.tsx
similarity index 76%
rename from apps/site/app/roadmap/in-progress/page.tsx
rename to apps/site/app/(marketing)/roadmap/in-progress/page.tsx
index 723daac8..6615dfce 100644
--- a/apps/site/app/roadmap/in-progress/page.tsx
+++ b/apps/site/app/(marketing)/roadmap/in-progress/page.tsx
@@ -10,13 +10,18 @@ import {
import RoadmapPageShell from "../components/RoadmapPageShell";
export const metadata: Metadata = {
- title: `Features In Development | ${siteConfig.shortName} Roadmap`,
+ title: `AI Features in Development | ${siteConfig.shortName} Roadmap`,
description:
- "Track resume builder features currently in development and active improvements planned for VeriWorkly users.",
-
+ "Track AI-powered capabilities, document compilers, and active improvements currently in development for VeriWorkly.",
+ alternates: {
+ canonical: `${siteConfig.url}/roadmap/in-progress`,
+ languages: {
+ "en-US": `${siteConfig.url}/roadmap/in-progress`,
+ },
+ },
openGraph: {
- title: `${siteConfig.shortName} Roadmap – In Progress`,
- description: "Follow features currently in development and active improvements in VeriWorkly.",
+ title: `${siteConfig.shortName} Roadmap: AI Features In Progress`,
+ description: "Follow AI-powered tools and platform improvements currently in development.",
url: `${siteConfig.url}/roadmap/in-progress`,
siteName: siteConfig.shortName,
images: [
@@ -33,7 +38,7 @@ export const metadata: Metadata = {
twitter: {
card: "summary_large_image",
title: `${siteConfig.shortName} In Progress Features`,
- description: "See what features are currently being built in VeriWorkly resume builder.",
+ description: "See what features are currently being built in the VeriWorkly platform.",
images: ["/og/roadmap/roadmap-progress-page-og.png"],
creator: "@noober_boy",
},
diff --git a/apps/site/app/roadmap/loading.tsx b/apps/site/app/(marketing)/roadmap/loading.tsx
similarity index 100%
rename from apps/site/app/roadmap/loading.tsx
rename to apps/site/app/(marketing)/roadmap/loading.tsx
diff --git a/apps/site/app/roadmap/not-found.tsx b/apps/site/app/(marketing)/roadmap/not-found.tsx
similarity index 100%
rename from apps/site/app/roadmap/not-found.tsx
rename to apps/site/app/(marketing)/roadmap/not-found.tsx
diff --git a/apps/site/app/roadmap/page.tsx b/apps/site/app/(marketing)/roadmap/page.tsx
similarity index 72%
rename from apps/site/app/roadmap/page.tsx
rename to apps/site/app/(marketing)/roadmap/page.tsx
index 8938be54..5d14ca1e 100644
--- a/apps/site/app/roadmap/page.tsx
+++ b/apps/site/app/(marketing)/roadmap/page.tsx
@@ -14,14 +14,19 @@ const pageUrl = `${siteConfig.url}/roadmap`;
const pageOgImage = `${siteConfig.url}/og/roadmap-page-og.png`;
export const metadata: Metadata = {
- title: `Resume Builder Product Roadmap`,
+ title: `Product Roadmap: AI Career Builder Updates | ${siteConfig.shortName}`,
description:
- "Explore upcoming ATS resume builder features, template updates, exports, and completed improvements in VeriWorkly.",
-
+ "Explore upcoming AI features, resume and cover letter templates, subdomain routing updates, and completed improvements.",
+ alternates: {
+ canonical: pageUrl,
+ languages: {
+ "en-US": pageUrl,
+ },
+ },
openGraph: {
- title: `Resume Builder Roadmap | ${siteConfig.shortName}`,
+ title: `Product Roadmap: AI Career Builder Updates | ${siteConfig.shortName}`,
description:
- "Track upcoming resume builder features, roadmap progress, and recently shipped updates.",
+ "Track upcoming AI features, document compiler updates, and recently shipped improvements.",
url: pageUrl,
siteName: siteConfig.shortName,
images: [
@@ -29,7 +34,7 @@ export const metadata: Metadata = {
url: pageOgImage,
width: 1200,
height: 630,
- alt: `${siteConfig.shortName} | Resume Builder Roadmap`,
+ alt: `${siteConfig.shortName} | Product Roadmap`,
},
],
type: "website",
@@ -37,9 +42,8 @@ export const metadata: Metadata = {
twitter: {
card: "summary_large_image",
- title: `Resume Builder Roadmap | ${siteConfig.shortName}`,
- description:
- "See upcoming ATS resume builder features, template improvements, and shipped updates.",
+ title: `Product Roadmap | ${siteConfig.shortName}`,
+ description: "See upcoming platform features, template improvements, and shipped updates.",
images: [pageOgImage],
},
};
diff --git a/apps/site/app/roadmap/todo/page.tsx b/apps/site/app/(marketing)/roadmap/todo/page.tsx
similarity index 73%
rename from apps/site/app/roadmap/todo/page.tsx
rename to apps/site/app/(marketing)/roadmap/todo/page.tsx
index a8f51b82..e2ad8ff0 100644
--- a/apps/site/app/roadmap/todo/page.tsx
+++ b/apps/site/app/(marketing)/roadmap/todo/page.tsx
@@ -10,14 +10,19 @@ import {
import RoadmapPageShell from "../components/RoadmapPageShell";
export const metadata: Metadata = {
- title: `Upcoming Resume Builder Features | ${siteConfig.shortName} Roadmap`,
+ title: `Planned AI Features & Updates | ${siteConfig.shortName} Roadmap`,
description:
- "Discover planned resume builder features, upcoming improvements, and future updates in the VeriWorkly roadmap.",
-
+ "Discover planned AI features, upcoming resume and portfolio templates, and future platform updates in the VeriWorkly roadmap.",
+ alternates: {
+ canonical: `${siteConfig.url}/roadmap/todo`,
+ languages: {
+ "en-US": `${siteConfig.url}/roadmap/todo`,
+ },
+ },
openGraph: {
- title: `${siteConfig.shortName} Roadmap – Planned Features`,
+ title: `${siteConfig.shortName} Roadmap: Planned AI Features`,
description:
- "Discover upcoming features and planned improvements in VeriWorkly resume builder.",
+ "Discover upcoming AI capabilities and planned improvements in the VeriWorkly workspace roadmap.",
url: `${siteConfig.url}/roadmap/todo`,
siteName: siteConfig.shortName,
images: [
@@ -34,7 +39,7 @@ export const metadata: Metadata = {
twitter: {
card: "summary_large_image",
title: `${siteConfig.shortName} Planned Features`,
- description: "See what features are planned next in our free resume builder.",
+ description: "See what features are planned next in the VeriWorkly workspace roadmap.",
images: ["/og/roadmap/roadmap-todo-page-og.png"],
creator: "@noober_boy",
},
diff --git a/apps/site/app/(marketing)/security/page.tsx b/apps/site/app/(marketing)/security/page.tsx
new file mode 100644
index 00000000..b208d2ab
--- /dev/null
+++ b/apps/site/app/(marketing)/security/page.tsx
@@ -0,0 +1,198 @@
+import type { Metadata } from "next";
+
+import { siteConfig } from "@/config/site";
+import { Card, Button } from "@veriworkly/ui";
+
+import { PublicPageShell } from "@/components/layout/PublicPageShell";
+
+const pageUrl = `${siteConfig.url}/security`;
+const pageOgImage = `${siteConfig.url}/og/security-page-og.png`;
+
+const supportEmail = siteConfig.email;
+const supportEmailHref = `mailto:${supportEmail}`;
+
+const githubDiscussionsUrl = `${siteConfig.links.github}/discussions`;
+const githubSecurityPolicyUrl = "https://github.com/VeriWorkly/veriworkly/blob/master/SECURITY.md";
+
+export const metadata: Metadata = {
+ title: "AI Security & Privacy Policy | VeriWorkly",
+ description:
+ "Learn how we secure your data: local-first browser storage, encrypted cloud sync, and stateless, privacy-first AI resume tailoring.",
+ alternates: {
+ canonical: pageUrl,
+ languages: {
+ "en-US": pageUrl,
+ },
+ },
+ openGraph: {
+ title: "Security & Encryption Policy | VeriWorkly",
+ description:
+ "Learn how we secure your resumes, web portfolios, and credentials using local-first storage and authenticated cloud encryption.",
+ url: pageUrl,
+ siteName: siteConfig.shortName,
+ type: "website",
+ images: [
+ {
+ url: pageOgImage,
+ width: 1200,
+ height: 630,
+ alt: `${siteConfig.shortName} Security Overview`,
+ },
+ ],
+ },
+ twitter: {
+ card: "summary_large_image",
+ title: "Security & Encryption Policy | VeriWorkly",
+ description:
+ "A deep dive into VeriWorkly's sandboxes, IndexedDB databases, and E2E security parameters.",
+ images: [pageOgImage],
+ },
+};
+
+const securityPrinciples = [
+ {
+ title: "Least Privilege Architecture",
+ description:
+ "Our services are built on minimal access. By default, the application runs entirely inside your browser tab. We don't harvest or aggregate your career documents.",
+ },
+ {
+ title: "Decoupled Data Sandboxes",
+ description:
+ "Your documents copy data from your Master Profile but remain isolated. Edits, visual scales, or deletions within templates do not leak to other assets.",
+ },
+ {
+ title: "Responsible Disclosure",
+ description:
+ "We investigate security vulnerabilities proactively. We ask that potential flaws are reported privately to our team before publishing publicly.",
+ },
+];
+
+const SecurityPage = () => {
+ const webPageSchema = {
+ "@context": "https://schema.org",
+ "@type": "WebPage",
+ about: {
+ "@type": "Thing",
+ name: "Web application security and privacy",
+ },
+ name: "Security Policy | VeriWorkly",
+ url: pageUrl,
+ description:
+ "Security architecture, sandbox boundaries, and responsible disclosure procedures.",
+ };
+
+ return (
+ <>
+
+
+
+
+ {securityPrinciples.map((principle, idx) => (
+
+
+
+ Principle 0{idx + 1}
+
+
+ {principle.title}
+
+
{principle.description}
+
+
+ ))}
+
+
+
+
+
+ Storage & Sync
+
+
+ Encryption boundaries
+
+
+
+ •
+
+ Browser Sandbox: All core files compile locally. Your credentials
+ are never uploaded to a remote parsing backend during PDF generation.
+
+
+
+ •
+
+ Cloud Backups: If you register and log in, your Master Profile
+ and sandbox documents are backed up and synchronized to our cloud. Connections are
+ encrypted in transit via SSL/TLS and secured by Better Auth OTP.
+
+
+
+ •
+
+ Public Portfolios & Subdomains: Portfolios published to
+ subdomains (e.g. username.veriworkly.com) are serveable publicly. Visitors'
+ views are tracked in aggregate without using cookies.
+
+
+
+
+
+
+
+
+ Disclosure
+
+
+ Vulnerability reporting
+
+
+ If you discover a security flaw or vulnerability in our database schema,
+ authentication client, or server routing, please send details privately to{" "}
+ {supportEmail}.
+
+
+ We will acknowledge receipt within 24 hours and patch validated vulnerabilities
+ quickly. Please do not publish exploit details in GitHub discussions or public
+ forums before a fix is released.
+
+
+
+
+
+
+
+
+
+ >
+ );
+};
+
+export default SecurityPage;
diff --git a/apps/site/app/stats/components/StatsBoard.tsx b/apps/site/app/(marketing)/stats/components/StatsBoard.tsx
similarity index 100%
rename from apps/site/app/stats/components/StatsBoard.tsx
rename to apps/site/app/(marketing)/stats/components/StatsBoard.tsx
diff --git a/apps/site/app/stats/components/StatsFilters.tsx b/apps/site/app/(marketing)/stats/components/StatsFilters.tsx
similarity index 100%
rename from apps/site/app/stats/components/StatsFilters.tsx
rename to apps/site/app/(marketing)/stats/components/StatsFilters.tsx
diff --git a/apps/site/app/stats/components/StatsHero.tsx b/apps/site/app/(marketing)/stats/components/StatsHero.tsx
similarity index 100%
rename from apps/site/app/stats/components/StatsHero.tsx
rename to apps/site/app/(marketing)/stats/components/StatsHero.tsx
diff --git a/apps/site/app/stats/components/StatsOverview.tsx b/apps/site/app/(marketing)/stats/components/StatsOverview.tsx
similarity index 100%
rename from apps/site/app/stats/components/StatsOverview.tsx
rename to apps/site/app/(marketing)/stats/components/StatsOverview.tsx
diff --git a/apps/site/app/stats/components/StatsPagination.tsx b/apps/site/app/(marketing)/stats/components/StatsPagination.tsx
similarity index 100%
rename from apps/site/app/stats/components/StatsPagination.tsx
rename to apps/site/app/(marketing)/stats/components/StatsPagination.tsx
diff --git a/apps/site/app/stats/components/stats-utils.ts b/apps/site/app/(marketing)/stats/components/stats-utils.ts
similarity index 100%
rename from apps/site/app/stats/components/stats-utils.ts
rename to apps/site/app/(marketing)/stats/components/stats-utils.ts
diff --git a/apps/site/app/stats/error.tsx b/apps/site/app/(marketing)/stats/error.tsx
similarity index 100%
rename from apps/site/app/stats/error.tsx
rename to apps/site/app/(marketing)/stats/error.tsx
diff --git a/apps/site/app/stats/loading.tsx b/apps/site/app/(marketing)/stats/loading.tsx
similarity index 100%
rename from apps/site/app/stats/loading.tsx
rename to apps/site/app/(marketing)/stats/loading.tsx
diff --git a/apps/site/app/stats/page.tsx b/apps/site/app/(marketing)/stats/page.tsx
similarity index 92%
rename from apps/site/app/stats/page.tsx
rename to apps/site/app/(marketing)/stats/page.tsx
index 595cea39..10d9f98b 100644
--- a/apps/site/app/stats/page.tsx
+++ b/apps/site/app/(marketing)/stats/page.tsx
@@ -26,9 +26,15 @@ import StatsOverview from "./components/StatsOverview";
import StatsPagination from "./components/StatsPagination";
export const metadata: Metadata = {
- title: `Development Activity `,
+ title: `Development & AI Platform Statistics | ${siteConfig.shortName}`,
description:
- "Follow the GitHub sync board with live status filters, pagination, and sync timing.",
+ "Follow dynamic platform development statistics, AI feature logs, issue counts, and release metrics.",
+ alternates: {
+ canonical: `${siteConfig.url}/stats`,
+ languages: {
+ "en-US": `${siteConfig.url}/stats`,
+ },
+ },
};
interface StatsPageProps {
diff --git a/apps/site/app/style-guide/_components/BrandAssetsSection.tsx b/apps/site/app/(marketing)/style-guide/_components/BrandAssetsSection.tsx
similarity index 100%
rename from apps/site/app/style-guide/_components/BrandAssetsSection.tsx
rename to apps/site/app/(marketing)/style-guide/_components/BrandAssetsSection.tsx
diff --git a/apps/site/app/style-guide/_components/ColorCard.tsx b/apps/site/app/(marketing)/style-guide/_components/ColorCard.tsx
similarity index 100%
rename from apps/site/app/style-guide/_components/ColorCard.tsx
rename to apps/site/app/(marketing)/style-guide/_components/ColorCard.tsx
diff --git a/apps/site/app/style-guide/_components/ColorSection.tsx b/apps/site/app/(marketing)/style-guide/_components/ColorSection.tsx
similarity index 100%
rename from apps/site/app/style-guide/_components/ColorSection.tsx
rename to apps/site/app/(marketing)/style-guide/_components/ColorSection.tsx
diff --git a/apps/site/app/style-guide/_components/ComponentsSection.tsx b/apps/site/app/(marketing)/style-guide/_components/ComponentsSection.tsx
similarity index 100%
rename from apps/site/app/style-guide/_components/ComponentsSection.tsx
rename to apps/site/app/(marketing)/style-guide/_components/ComponentsSection.tsx
diff --git a/apps/site/app/style-guide/_components/EffectsSection.tsx b/apps/site/app/(marketing)/style-guide/_components/EffectsSection.tsx
similarity index 100%
rename from apps/site/app/style-guide/_components/EffectsSection.tsx
rename to apps/site/app/(marketing)/style-guide/_components/EffectsSection.tsx
diff --git a/apps/site/app/style-guide/_components/LayoutSection.tsx b/apps/site/app/(marketing)/style-guide/_components/LayoutSection.tsx
similarity index 100%
rename from apps/site/app/style-guide/_components/LayoutSection.tsx
rename to apps/site/app/(marketing)/style-guide/_components/LayoutSection.tsx
diff --git a/apps/site/app/style-guide/_components/SectionHeader.tsx b/apps/site/app/(marketing)/style-guide/_components/SectionHeader.tsx
similarity index 100%
rename from apps/site/app/style-guide/_components/SectionHeader.tsx
rename to apps/site/app/(marketing)/style-guide/_components/SectionHeader.tsx
diff --git a/apps/site/app/style-guide/_components/StyleGuideHeader.tsx b/apps/site/app/(marketing)/style-guide/_components/StyleGuideHeader.tsx
similarity index 100%
rename from apps/site/app/style-guide/_components/StyleGuideHeader.tsx
rename to apps/site/app/(marketing)/style-guide/_components/StyleGuideHeader.tsx
diff --git a/apps/site/app/style-guide/_components/TypographySection.tsx b/apps/site/app/(marketing)/style-guide/_components/TypographySection.tsx
similarity index 100%
rename from apps/site/app/style-guide/_components/TypographySection.tsx
rename to apps/site/app/(marketing)/style-guide/_components/TypographySection.tsx
diff --git a/apps/site/app/style-guide/page.tsx b/apps/site/app/(marketing)/style-guide/page.tsx
similarity index 89%
rename from apps/site/app/style-guide/page.tsx
rename to apps/site/app/(marketing)/style-guide/page.tsx
index 41c11033..7eda8fba 100644
--- a/apps/site/app/style-guide/page.tsx
+++ b/apps/site/app/(marketing)/style-guide/page.tsx
@@ -15,12 +15,17 @@ const pageUrl = `${siteConfig.url}/style-guide`;
const pageOgImage = `${siteConfig.url}/og/style-page-og.png`;
export const metadata: Metadata = {
- title: `Resume Builder Style Guide | ${siteConfig.shortName}`,
+ title: `Design System Style Guide | ${siteConfig.shortName}`,
description:
"Explore the VeriWorkly design system including colors, typography, UI components, and branding guidelines.",
-
+ alternates: {
+ canonical: pageUrl,
+ languages: {
+ "en-US": pageUrl,
+ },
+ },
openGraph: {
- title: `Resume Builder Style System | ${siteConfig.shortName}`,
+ title: `Design System Style Guide | ${siteConfig.shortName}`,
description:
"Official VeriWorkly style guide with UI components, typography, layout, and branding standards.",
url: pageUrl,
diff --git a/apps/site/app/templates/[docType]/[templateId]/page.tsx b/apps/site/app/(marketing)/templates/[docType]/[templateId]/page.tsx
similarity index 100%
rename from apps/site/app/templates/[docType]/[templateId]/page.tsx
rename to apps/site/app/(marketing)/templates/[docType]/[templateId]/page.tsx
diff --git a/apps/site/app/templates/[docType]/page.tsx b/apps/site/app/(marketing)/templates/[docType]/page.tsx
similarity index 100%
rename from apps/site/app/templates/[docType]/page.tsx
rename to apps/site/app/(marketing)/templates/[docType]/page.tsx
diff --git a/apps/site/app/templates/components/EmptyState.tsx b/apps/site/app/(marketing)/templates/components/EmptyState.tsx
similarity index 100%
rename from apps/site/app/templates/components/EmptyState.tsx
rename to apps/site/app/(marketing)/templates/components/EmptyState.tsx
diff --git a/apps/site/app/templates/components/TemplateCard.tsx b/apps/site/app/(marketing)/templates/components/TemplateCard.tsx
similarity index 100%
rename from apps/site/app/templates/components/TemplateCard.tsx
rename to apps/site/app/(marketing)/templates/components/TemplateCard.tsx
diff --git a/apps/site/app/templates/components/TemplateFilters.tsx b/apps/site/app/(marketing)/templates/components/TemplateFilters.tsx
similarity index 100%
rename from apps/site/app/templates/components/TemplateFilters.tsx
rename to apps/site/app/(marketing)/templates/components/TemplateFilters.tsx
diff --git a/apps/site/app/templates/components/TemplateGroup.tsx b/apps/site/app/(marketing)/templates/components/TemplateGroup.tsx
similarity index 100%
rename from apps/site/app/templates/components/TemplateGroup.tsx
rename to apps/site/app/(marketing)/templates/components/TemplateGroup.tsx
diff --git a/apps/site/app/templates/components/TemplateHeader.tsx b/apps/site/app/(marketing)/templates/components/TemplateHeader.tsx
similarity index 100%
rename from apps/site/app/templates/components/TemplateHeader.tsx
rename to apps/site/app/(marketing)/templates/components/TemplateHeader.tsx
diff --git a/apps/site/app/templates/components/TemplatesHeader.tsx b/apps/site/app/(marketing)/templates/components/TemplatesHeader.tsx
similarity index 100%
rename from apps/site/app/templates/components/TemplatesHeader.tsx
rename to apps/site/app/(marketing)/templates/components/TemplatesHeader.tsx
diff --git a/apps/site/app/templates/components/TemplatesSEOContent.tsx b/apps/site/app/(marketing)/templates/components/TemplatesSEOContent.tsx
similarity index 100%
rename from apps/site/app/templates/components/TemplatesSEOContent.tsx
rename to apps/site/app/(marketing)/templates/components/TemplatesSEOContent.tsx
diff --git a/apps/site/app/templates/components/utils.ts b/apps/site/app/(marketing)/templates/components/utils.ts
similarity index 100%
rename from apps/site/app/templates/components/utils.ts
rename to apps/site/app/(marketing)/templates/components/utils.ts
diff --git a/apps/site/app/templates/page.tsx b/apps/site/app/(marketing)/templates/page.tsx
similarity index 92%
rename from apps/site/app/templates/page.tsx
rename to apps/site/app/(marketing)/templates/page.tsx
index 682809df..1ab6e18c 100644
--- a/apps/site/app/templates/page.tsx
+++ b/apps/site/app/(marketing)/templates/page.tsx
@@ -9,20 +9,26 @@ import { siteConfig } from "@/config/site";
import { documentTypeSummaries, templateSummaries } from "@/config/templates";
export const metadata: Metadata = {
- title: "Template Directory | VeriWorkly",
+ title: `AI Resume, Cover Letter & Portfolio Templates | ${siteConfig.shortName}`,
description:
- "Explore VeriWorkly templates by type, including resumes, cover letters, and portfolio websites with production-ready previews and editor-ready layouts.",
+ "Browse ATS-friendly AI resume templates, cover letters, and portfolio website designs. Compare layouts and customize them with AI copywriting.",
+ alternates: {
+ canonical: `${siteConfig.url}/templates`,
+ languages: {
+ "en-US": `${siteConfig.url}/templates`,
+ },
+ },
keywords: [
- "document templates",
- "resume templates",
- "cover letter templates",
+ "AI resume templates",
+ "AI cover letter templates",
+ "AI portfolio templates",
"ATS resume templates",
"professional document templates",
],
openGraph: {
- title: "Document Template Directory | VeriWorkly",
+ title: `AI Resume, Cover Letter & Portfolio Templates | ${siteConfig.shortName}`,
description:
- "Browse resume, cover letter, and portfolio website templates by type, compare design intent, and start from the right layout.",
+ "Browse ATS-friendly AI resume templates, cover letters, and portfolio website designs. Compare layouts and customize them with AI copywriting.",
url: `${siteConfig.url}/templates`,
siteName: siteConfig.name,
images: [
@@ -41,9 +47,6 @@ export const metadata: Metadata = {
description: "Resume, cover letter, and portfolio website templates, organized by type.",
images: ["/og/template-page-og.png"],
},
- alternates: {
- canonical: `${siteConfig.url}/templates`,
- },
};
const TemplatesPortalPage = () => {
diff --git a/apps/site/app/(marketing)/terms/page.tsx b/apps/site/app/(marketing)/terms/page.tsx
new file mode 100644
index 00000000..0466a13c
--- /dev/null
+++ b/apps/site/app/(marketing)/terms/page.tsx
@@ -0,0 +1,172 @@
+import type { Metadata } from "next";
+
+import { siteConfig } from "@/config/site";
+import { Card, Badge } from "@veriworkly/ui";
+
+import { PublicPageShell } from "@/components/layout/PublicPageShell";
+
+const pageUrl = `${siteConfig.url}/terms`;
+const pageOgImage = `${siteConfig.url}/og/terms-page-og.png`;
+
+export const metadata: Metadata = {
+ title: `Terms of Service & AI Credit Policy | ${siteConfig.shortName}`,
+ description:
+ "Review guidelines for using VeriWorkly: content ownership, layout publishing, subdomain terms, AI credit usage, and open-source licenses.",
+ alternates: {
+ canonical: pageUrl,
+ languages: {
+ "en-US": pageUrl,
+ },
+ },
+ openGraph: {
+ title: `Terms of Service & AI Credit Policy | ${siteConfig.shortName}`,
+ description:
+ "Simple, transparent terms for using VeriWorkly's resumes, portfolios, AI credit limits, and billing services.",
+ url: pageUrl,
+ siteName: siteConfig.shortName,
+ type: "website",
+ images: [
+ {
+ url: pageOgImage,
+ width: 1200,
+ height: 630,
+ alt: `${siteConfig.shortName} Terms`,
+ },
+ ],
+ },
+ twitter: {
+ card: "summary_large_image",
+ title: `Terms of Service | ${siteConfig.shortName}`,
+ description: "Review content ownership guidelines and platform boundaries for VeriWorkly.",
+ images: [pageOgImage],
+ },
+};
+
+const termsTopics = [
+ {
+ title: "Sovereign Content Ownership",
+ description:
+ "You retain complete ownership and responsibility for the credentials, resume details, screenshots, and billing statements you manage on our platform.",
+ },
+ {
+ title: "Responsible Platform Use",
+ description:
+ "Do not exploit public endpoints, overload sitemap maps, or trigger automated scraping loops that disrupt the workspace for other users.",
+ },
+ {
+ title: "Independent Sandboxing",
+ description:
+ "Your documents copy facts from your Master Profile but act as isolated layout sandboxes. Edits inside templates do not impact your master records.",
+ },
+ {
+ title: "Third-Party Connectors",
+ description:
+ "If you sync data from GitHub or parse LinkedIn PDFs, those actions fall under those platforms' terms. We are not responsible for their data models.",
+ },
+ {
+ title: "As-Is Service Terms",
+ description:
+ "VeriWorkly is provided as-is without warranties. You are responsible for exporting backups of your local IndexedDB profiles.",
+ },
+ {
+ title: "Mitigated Liability",
+ description:
+ "We are not liable for recruitment outcomes, lost opportunities, or database wipes resulting from browser cache clearing.",
+ },
+];
+
+const TermsPage = () => {
+ const termsSchema = {
+ "@context": "https://schema.org",
+ "@type": "WebPage",
+ name: "Terms of Service | VeriWorkly",
+ url: pageUrl,
+ description: "Terms of Service and guidelines for VeriWorkly career workspace.",
+ about: {
+ "@type": "Thing",
+ name: "Terms of Service",
+ },
+ };
+
+ return (
+ <>
+
+
+
+ {/* Core Terms Grid */}
+
+ {termsTopics.map((topic) => (
+
+
+
+ Guideline
+
+
{topic.title}
+
{topic.description}
+
+
+ ))}
+
+
+ {/* Short Version and Notes */}
+
+
+
+ Quick Summary
+
+
+ Your responsibilities in short
+
+
+
Use the workspace for legal career building and publishing.
+
Published subdomain URLs are publicly viewable by default.
+
Keep copies of your profile database files locally.
+
Do not run scraping bots or automated spam templates on the sitemap.
+
+
+
+
+
Transparency
+
+ Open Source & forks
+
+
+ VeriWorkly's core is open source. If you use a fork or self-hosted deployment run
+ by a third party, your relationship falls under their deployment terms. We do not
+ control independent server environments.
+
+
+ Billing transactions are run via Dodo Payments. Charge issues, double billing, or
+ payment failures are handled under Dodo Payments' partner terms.
+
+
+
+
+
+ Have questions about these guidelines?{" "}
+
+ Contact support
+
+ .
+
+
+ >
+ );
+};
+
+export default TermsPage;
diff --git a/apps/site/app/about/data/principles.ts b/apps/site/app/about/data/principles.ts
deleted file mode 100644
index c38f9212..00000000
--- a/apps/site/app/about/data/principles.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-export const principles = [
- {
- title: "Local-first by default",
- description:
- "Resume content is designed to stay on the user's device unless they choose a feature that syncs or shares it.",
- },
-
- {
- title: "Transparent workflows",
- description:
- "Templates, exports, roadmap updates, and account features are organized so people can understand the product quickly.",
- },
-
- {
- title: "Public good mindset",
- description:
- "The goal is to provide a resume tool that is useful, accessible, and honest about how it handles data.",
- },
-];
diff --git a/apps/site/app/about/page.tsx b/apps/site/app/about/page.tsx
deleted file mode 100644
index 7e73b1fa..00000000
--- a/apps/site/app/about/page.tsx
+++ /dev/null
@@ -1,169 +0,0 @@
-import type { Metadata } from "next";
-
-import { principles } from "./data/principles";
-
-import { siteConfig } from "@/config/site";
-import { Card, Badge, Button } from "@veriworkly/ui";
-
-import { PublicPageShell } from "@/components/layout/PublicPageShell";
-
-const pageUrl = `${siteConfig.url}/about`;
-const pageOgImage = `${siteConfig.url}/og/about-page-og.png`;
-
-export const metadata: Metadata = {
- title: "About VeriWorkly | Free ATS Resume Builder",
- description:
- "Learn how VeriWorkly helps users create ATS-friendly resumes with privacy-first, open-source, and no-login workflows.",
-
- openGraph: {
- title: "About VeriWorkly | Free ATS Resume Builder",
- description:
- "Privacy-first ATS resume builder with open-source transparency and no signup required.",
- url: pageUrl,
- siteName: siteConfig.shortName,
- type: "website",
- images: [
- {
- url: pageOgImage,
- width: 1200,
- height: 630,
- alt: "About VeriWorkly ATS Resume Builder",
- },
- ],
- },
-
- twitter: {
- card: "summary_large_image",
- title: "About VeriWorkly | Free ATS Resume Builder",
- description:
- "Open-source ATS resume builder focused on privacy, exports, and no-login resume creation.",
- images: [pageOgImage],
- },
-};
-
-const AboutPage = () => {
- const organizationSchema = {
- "@context": "https://schema.org",
- "@type": "Organization",
- name: siteConfig.name,
- url: siteConfig.url,
- description: siteConfig.description,
- sameAs: [siteConfig.links.github, siteConfig.links.twitter],
- founder: {
- "@type": "Person",
- name: "Gautam Raj",
- },
- };
-
- const webAppSchema = {
- "@context": "https://schema.org",
- "@type": "WebApplication",
- name: "VeriWorkly Resume Builder",
- url: siteConfig.url,
- applicationCategory: "BusinessApplication",
- operatingSystem: "Web",
- description:
- "Free resume builder with no login. Create ATS-friendly resumes online with full privacy.",
- offers: {
- "@type": "Offer",
- price: "0",
- priceCurrency: "USD",
- },
- };
-
- return (
- <>
-
-
-
-
- {principles.map((principle) => (
-
- Principle
-
-
{principle.title}
-
-
{principle.description}
-
- ))}
-
-
-
-
-
- Why We Built VeriWorkly
-
-
-
- Career tools should not force people to trade privacy for utility.
-
-
-
- The product is structured around a simple idea: a resume builder is most useful when
- it is easy to use, easy to audit, and easy to move away from if needed. That means no
- unnecessary account gate, clear export paths, and public pages that explain how the
- system works.
-
-
-
- The public site is intentionally small but complete. It includes the landing page,
- templates, roadmap, policy pages, and contact routes so people can verify the project
- before they trust it.
-
-
-
-
-
- Features of VeriWorkly Resume Builder
-
-
-
-
Free resume creation without forced sign-up or login.
-
-
- ATS-friendly resume templates with fast export options.
-
-
-
- Optional sharing and sync instead of mandatory storage.
-
-
-
A public roadmap so upcoming changes are visible.
-
-
Clear policy pages and contact routes for trust.
-
-
-
-
-
-
-
-
-
-
-
About VeriWorkly ATS Resume Builder
-
-
- VeriWorkly is a free ATS-friendly resume builder with no login required. Create
- professional resumes, customize templates, and export resumes instantly with privacy-first
- workflows.
-
+ Stripe transfers queue dynamically. Withdraw balance as soon as you cross the lock.
+
+
+
+
+
+
+
+ Transfer Limit
+
+
+ $25.00 Minimum
+
+
+
+
+ Funds dispatch ready immediately
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Security & Fraud Filter
+
+
+ Continuous anti-abuse scanners monitor referrers. The local security system filters
+ self-referrals, browser masking, and malicious routing patterns.
+
+ Select a target subscription model and adjust the referral slider to simulate active
+ subscribers. Calculations respond dynamically to state shifts.
+
+
+ {/* Progress Bar to next tier */}
+ {nextTier && (
+
+
+ Progress to {nextTier}
+ {needed} members needed
+
+
+
+
+
+ )}
+
+
+
+
+
+ Calculates yield based on the active plan level select: **Creator Pro ($9.99/mo)**
+ or **Job Hunter Bundle ($14.99/mo)**. Commission payouts occur monthly.
+
+ Compare our partner benefits. We remove standard industry hurdles to align payouts with
+ your long-term creative and financial success.
+
+
+
+
+
+
Program Feature
+
+ VeriWorkly
+
+
Standard Networks
+
+
+
+ {COMPARISON_DATA.map((row) => (
+
+
+
+ {row.feature}
+
+
+ {row.description}
+
+
+
+
+
+
+
+
+
+ {row.veriworkly.value}
+
+
+
+ {row.veriworkly.description}
+
+
+
+
+
+
+
+
+
+ {row.industry.value}
+
+
+
+ {row.industry.description}
+
+
+
+ ))}
+
+
+
+
+ );
+}
diff --git a/apps/site/app/affiliate/components/AffiliateFAQ.tsx b/apps/site/app/affiliate/components/AffiliateFAQ.tsx
new file mode 100644
index 00000000..e182acad
--- /dev/null
+++ b/apps/site/app/affiliate/components/AffiliateFAQ.tsx
@@ -0,0 +1,114 @@
+"use client";
+
+import { useState } from "react";
+import { motion, AnimatePresence } from "framer-motion";
+import { ChevronDown, HelpCircle } from "lucide-react";
+
+const faqItems = [
+ {
+ question: "How do referrals get tracked?",
+ answer:
+ "When someone clicks your partner link, a cookie is saved in their browser with a 60-day duration. If they subscribe to any paid plan within those 60 days, the conversion is linked to your partner dashboard.",
+ },
+ {
+ question: "When and how are payouts processed?",
+ answer:
+ "Commission payouts are processed monthly. Once your dashboard balance reaches the minimum threshold of $25.00, you can request a payout. Transactions are reviewed manually to prevent abuse and processed via Stripe or local payout methods.",
+ },
+ {
+ question: "Why are VeriWorkly's commission rates set to 2% - 5% recurring?",
+ answer:
+ "VeriWorkly is an open-source, bootstrapped project. We keep our premium plans highly affordable (starting at $2.99 for passes or $5.99/mo for subscriptions) with thin margins, rather than charging typical high-margin SaaS rates. Our 2% to 5% recurring commission structure is designed to be sustainable long-term without forcing price hikes on job seekers and students.",
+ },
+ {
+ question: "Does my earned commission ever expire?",
+ answer:
+ "For active accounts with balances under $25.00, your earnings will not expire. If your balance exceeds $25.00, we will send automatic reminders asking you to submit a withdrawal request. If your account is inactive (no logins for 3 months / 90 days), your status changes to 'Inactive'. You then have exactly 60 days to claim your accumulated balance. If unclaimed within this grace period, your balance expires and all associated referrals are lost.",
+ },
+ {
+ question: "Are self-referrals permitted?",
+ answer:
+ "No. Self-referrals are strictly prohibited. The system filters IP addresses, devices, and payment email domains to identify and flag self-referral attempts automatically. Referrals must be genuine, independent users.",
+ },
+ {
+ question: "Can I run paid advertisements to my link?",
+ answer:
+ "Yes, you are allowed to promote your affiliate link via paid advertisements. However, you are strictly prohibited from bidding on brand keywords (e.g. search terms containing 'VeriWorkly') on Google, Bing, or social platforms.",
+ },
+];
+
+export function AffiliateFAQ() {
+ const [openIndex, setOpenIndex] = useState(null);
+
+ const toggleFAQ = (idx: number) => {
+ setOpenIndex(openIndex === idx ? null : idx);
+ };
+
+ return (
+
+
+ {/* Left Side Info */}
+
+
+ Common
+
+ Queries.
+
+
+
+ Clear details about tracking, parameters, withdrawals, and system terms.
+
+
+ );
+}
diff --git a/apps/site/app/ambassador/components/AmbassadorFAQ.tsx b/apps/site/app/ambassador/components/AmbassadorFAQ.tsx
new file mode 100644
index 00000000..6620724a
--- /dev/null
+++ b/apps/site/app/ambassador/components/AmbassadorFAQ.tsx
@@ -0,0 +1,145 @@
+"use client";
+
+import { useState } from "react";
+import { motion, AnimatePresence } from "framer-motion";
+import { Plus, Minus } from "lucide-react";
+
+type FAQItem = {
+ question: string;
+ answer: string;
+};
+
+const faqItems: FAQItem[] = [
+ {
+ question: "Is there a cash payout or budget for student ambassadors?",
+ answer:
+ "No. VeriWorkly is a free, open-source project. Because we operate without a direct commercial marketing budget, we run a points-based system instead of cash payouts. Points can be exchanged for premium platform access tokens.",
+ },
+ {
+ question: "How do classmate invite points work and how do we prevent spam?",
+ answer:
+ "You earn 10 points for every peer who registers. To prevent invite spam or fake self-referral accounts, invites are only officially 'qualified' and credited once the classmate actively engages with the builder and scores at least 250 platform points (e.g. creating their resume, Master Profile, or customization).",
+ },
+ {
+ question: "How does the upgrade boost work?",
+ answer:
+ "If a classmate you invited upgrades to a paid plan (Portfolio Pro, AI Credits, or the Bundle), you receive a 1.2x boost of +20 points (totaling 30 points for that referral).",
+ },
+ {
+ question: "Do my points expire?",
+ answer:
+ "Yes. To keep the program structured and encourage active participation, all points expire at the end of each calendar year. For example, all points earned in 2026 will reset on January 1, 2027. Be sure to redeem your points before the end of the year!",
+ },
+ {
+ question: "What are the limits on social posts, articles, and videos?",
+ answer:
+ "Ambassadors can create and upload up to 30 videos (50 pts each), 30 articles/blog posts (40 pts each), and 30 Twitter/X or LinkedIn shares (5 pts each) per month. To maintain high quality and prevent system spam, a daily limit of 1 post count per day applies across all channels.",
+ },
+ {
+ question: "What platforms are allowed for video walkthroughs and articles?",
+ answer:
+ "Videos must be posted on LinkedIn or Twitter/X (videos uploaded on TikTok or YouTube are not credited). Articles and blog posts must be published on Medium, Dev.to, LinkedIn Articles, or a reputable personal blog. All posts are reviewed manually.",
+ },
+ {
+ question: "How do I redeem Portfolio Pro access and when does it expire?",
+ answer:
+ "You can redeem 30 days of Portfolio Pro at any time for 1,500 points. The 30-day Pro license begins the day you claim it and expires after 30 days, regardless of whether you keep a portfolio published or not.",
+ },
+ {
+ question: "How is my student status verified?",
+ answer:
+ "Submit your application using a valid university email domain (.edu or your institution's local equivalent). Once validated, your account is activated as a Campus Ambassador.",
+ },
+];
+
+export function AmbassadorFAQ() {
+ const [openIndex, setOpenIndex] = useState(null);
+
+ const toggleFAQ = (idx: number) => {
+ setOpenIndex(openIndex === idx ? null : idx);
+ };
+
+ return (
+
+
+ {/* Left Column: Sticky Title */}
+
+
+ FREQUENTLY
+
+ ASKED
+
+ QUESTIONS
+
+
+ Need clarification on points verification, caps, or voucher expirations?
+
+ {/* Notch Left */}
+
+ {/* Notch Right */}
+
+
+
+
+
+ Upgrade Token
+
+
+ Portfolio Pro Key
+
+
+
+
+
+
+
+ Activation Key
+
+
+ VW-PRO-K98X-841L
+
+
+
+
+
+
+
+ )}
+
+
+
+ );
+ })}
+
+ );
+}
diff --git a/apps/site/app/ambassador/page.tsx b/apps/site/app/ambassador/page.tsx
new file mode 100644
index 00000000..fccd5e75
--- /dev/null
+++ b/apps/site/app/ambassador/page.tsx
@@ -0,0 +1,85 @@
+import type { Metadata } from "next";
+import { siteConfig } from "@/config/site";
+import { AmbassadorNav } from "./components/AmbassadorNav";
+import { AmbassadorHero } from "./components/AmbassadorHero";
+import { AmbassadorPerks } from "./components/AmbassadorPerks";
+import { AmbassadorPlaybook } from "./components/AmbassadorPlaybook";
+import { AmbassadorCalculator } from "./components/AmbassadorCalculator";
+import { AmbassadorLeaderboard } from "./components/AmbassadorLeaderboard";
+import { AmbassadorFAQ } from "./components/AmbassadorFAQ";
+import { AmbassadorFooter } from "./components/AmbassadorFooter";
+import "./ambassador.css";
+
+const pageUrl = `${siteConfig.url}/ambassador`;
+const pageOgImage = `${siteConfig.url}/og/ambassador-page-og.png`;
+
+export const metadata: Metadata = {
+ title: "Student Ambassador Program | VeriWorkly",
+ description:
+ "Gated campus program for college students. Share local-first career editors, earn points for social shares or peer referrals, and unlock free Portfolio Pro access.",
+ alternates: {
+ canonical: pageUrl,
+ languages: {
+ "en-US": pageUrl,
+ },
+ },
+ openGraph: {
+ title: "Student Ambassador Program | VeriWorkly",
+ description:
+ "Help your peers build professional resumes and portfolios. Earn point multipliers and redeem them for free Portfolio Pro upgrades.",
+ url: pageUrl,
+ siteName: siteConfig.shortName,
+ type: "website",
+ images: [
+ {
+ url: pageOgImage,
+ width: 1200,
+ height: 630,
+ alt: "VeriWorkly Student Ambassador Program",
+ },
+ ],
+ },
+ twitter: {
+ card: "summary_large_image",
+ title: "Student Ambassador Program | VeriWorkly",
+ description:
+ "Earn campus points and redeem them for free Portfolio Pro access as a student ambassador.",
+ images: [pageOgImage],
+ },
+};
+
+const AmbassadorPage = () => {
+ const ambassadorSchema = {
+ "@context": "https://schema.org",
+ "@type": "WebPage",
+ name: "VeriWorkly Student Ambassador Program",
+ url: pageUrl,
+ description:
+ "Represent VeriWorkly on campus, earn points by sharing with peers, and get free Pro access.",
+ };
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+};
+
+export default AmbassadorPage;
diff --git a/apps/site/app/contact/page.tsx b/apps/site/app/contact/page.tsx
deleted file mode 100644
index c7b08ca0..00000000
--- a/apps/site/app/contact/page.tsx
+++ /dev/null
@@ -1,217 +0,0 @@
-import type { Metadata } from "next";
-
-import { siteConfig } from "@/config/site";
-import { Card, Badge, Button } from "@veriworkly/ui";
-
-import { PublicPageShell } from "@/components/layout/PublicPageShell";
-
-const pageUrl = `${siteConfig.url}/contact`;
-const pageOgImage = `${siteConfig.url}/og/contact-page-og.png`;
-
-const supportEmail = siteConfig.email;
-const supportEmailHref = `mailto:${supportEmail}`;
-
-const githubDiscussionsUrl = `${siteConfig.links.github}/discussions`;
-const githubSecurityPolicyUrl = "https://github.com/VeriWorkly/veriworkly/blob/master/SECURITY.md";
-
-export const metadata: Metadata = {
- title: `Contact VeriWorkly Support | ATS Resume Builder Help`,
- description:
- "Get help with ATS resume templates, exports, bugs, feature requests, and privacy-related questions.",
-
- openGraph: {
- title: `Contact VeriWorkly Support`,
- description:
- "Contact VeriWorkly for resume builder support, bug reports, feature requests, and security issues.",
- url: pageUrl,
- siteName: siteConfig.shortName,
- type: "website",
- images: [
- {
- url: pageOgImage,
- width: 1200,
- height: 630,
- alt: `Contact VeriWorkly Support`,
- },
- ],
- },
-
- twitter: {
- card: "summary_large_image",
- title: `Contact VeriWorkly Support`,
- description:
- "Get support for resume templates, exports, feedback, bugs, and privacy-related issues.",
- images: [pageOgImage],
- },
-};
-
-const contactOptions = [
- {
- label: "Email",
- href: supportEmailHref,
- detail: `Send support and privacy questions directly to ${supportEmail}.`,
- },
-
- {
- label: "Security Policy (GitHub)",
- href: githubSecurityPolicyUrl,
- detail: "Read the disclosure guidance in SECURITY.md before reporting sensitive issues.",
- },
-
- {
- label: "GitHub Discussions",
- href: githubDiscussionsUrl,
- detail: "Use discussions for roadmap ideas, Q&A, and community conversation.",
- },
-
- {
- label: "GitHub",
- href: siteConfig.links.github,
- detail:
- "Best for reporting bugs, feature requests, issues, and discussions with the resume builder or templates in a transparent way.",
- },
-
- {
- label: "X / Twitter",
- href: siteConfig.links.twitter,
- detail:
- "Good for quick feedback, updates, and discussions about the resume builder at @VeriWorkly X(prev twitter) account.",
- },
-
- {
- label: "Roadmap",
- href: "/roadmap",
- detail:
- "Check what is already planned before starting a new request or discussion about features and improvements of VeriWorkly.",
- },
-];
-
-const ContactPage = () => {
- const contactSchema = {
- "@context": "https://schema.org",
- "@type": "ContactPage",
- name: "Contact VeriWorkly",
- url: pageUrl,
- description:
- "Contact the VeriWorkly resume builder team for support, feedback, and security issues.",
- mainEntity: {
- "@type": "Organization",
- name: siteConfig.name,
- url: siteConfig.url,
- sameAs: [siteConfig.links.github, siteConfig.links.twitter],
- contactPoint: [
- {
- "@type": "ContactPoint",
- contactType: "customer support",
- email: supportEmail,
- url: siteConfig.links.github,
- },
- ],
- },
- };
-
- return (
- <>
-
-
-
-
- {contactOptions.map((option) => (
-
- {option.label}
-
-
{option.detail}
-
-
-
- ))}
-
-
-
-
-
- How to Report Resume Builder Issues
-
-
-
-
- The page, resume template, or feature you were using when the issue happened.
-
-
-
A short reproduction path, if the issue is technical.
-
-
Screenshots or screen recordings for layout problems.
-
-
- Whether the issue affects the public site, resume editor, or dashboard.
-
-
-
- For security issues, share the minimum details needed to reproduce the problem and
- wait for a response before wider disclosure.
-
-
-
-
-
-
- Report Security Vulnerabilities
-
-
-
- Report sensitive issues privately through the security page.
-
-
-
- If you believe you found a vulnerability, do not post it publicly first. Use the
- security page so the issue can be assessed before any wider disclosure.
-
-
-
-
-
-
-
-
-
-
-
-
-
Contact ATS Resume Builder Support
-
-
- Contact VeriWorkly for help with ATS resume templates, exports, dashboard issues, privacy
- questions, and resume builder support.
-
-
- >
- );
-};
-
-export default ContactPage;
diff --git a/apps/site/app/faq/data/builderFaqs.ts b/apps/site/app/faq/data/builderFaqs.ts
deleted file mode 100644
index 5905f756..00000000
--- a/apps/site/app/faq/data/builderFaqs.ts
+++ /dev/null
@@ -1,112 +0,0 @@
-export const builderFaqs = [
- {
- question: "Is my data private?",
- answer:
- "The builder is local-first. Resume content stays on your device by default unless you intentionally use sync or sharing features.",
- },
-
- {
- question: "Do I need an account?",
- answer:
- "No. You can create and edit resumes without mandatory sign-up. Accounts are for optional capabilities like managed sync and controlled sharing.",
- },
-
- {
- question: "Can I use VeriWorkly without cloud sync?",
- answer:
- "Yes. The default workflow is local-first, and cloud sync remains optional so you can keep full local control if that is your preference.",
- },
-
- {
- question: "Can I create multiple resume versions?",
- answer:
- "Yes. Build a base profile and produce tailored resume variants for different roles, companies, and industries.",
- },
-
- {
- question: "Can I reorder sections in my resume?",
- answer: "Yes. You can control section order and visibility to match each application strategy.",
- },
-
- {
- question: "How customizable are templates?",
- answer:
- "You can adjust layout behavior, colors, fonts, spacing, section order, section visibility, and content hierarchy.",
- },
-
- {
- question: "Can I include extra sections like achievements or volunteer work?",
- answer:
- "Yes. The builder supports multiple section types beyond basics, including optional sections for broader profile storytelling.",
- },
-
- {
- question: "What can I export?",
- answer:
- "You can export resumes as PDF, DOCX, PNG, etc. and keep portable copies for job applications and sharing.",
- },
-
- {
- question: "Can I keep backups of my resume data?",
- answer:
- "Yes. You can export and keep portable backups so your work remains under your control.",
- },
-
- {
- question: "Are templates ATS-friendly?",
- answer:
- "Templates are built to be readable and structured for hiring workflows, with emphasis on clear typography and content organization.",
- },
-
- {
- question: "Can I preview before exporting?",
- answer:
- "Yes. The editor is designed for quick feedback so you can refine layout and content before final export.",
- },
-
- {
- question: "Can I share a resume publicly?",
- answer:
- "Yes. Shared links are intended to be viewed by others, so only publish information you are comfortable exposing.",
- },
-
- {
- question: "Can shared resumes be protected?",
- answer:
- "Sharing options support additional controls in supported workflows, so you can keep sharing intentional and bounded.",
- },
-
- {
- question: "Can I update a resume after sharing it?",
- answer:
- "Yes. Resume editing remains iterative, and sharing should be treated as a workflow you review whenever content changes.",
- },
-
- {
- question: "How is analytics handled?",
- answer:
- "We use limited product analytics for quality and roadmap decisions, such as usage of login, dashboard, and resume operations. We do not sell resume data for ad profiling.",
- },
-
- {
- question: "Do you sell my data?",
- answer: "No. The product is built around user control and practical value, not data resale.",
- },
-
- {
- question: "Can I use the builder on mobile?",
- answer:
- "Yes. Public pages and core editing flows are designed to remain usable across desktop and mobile layouts.",
- },
-
- {
- question: "How often is the product updated?",
- answer:
- "Roadmap and release work is active. You can follow progress on the public roadmap for transparency.",
- },
-
- {
- question: "Is VeriWorkly free?",
- answer: "Yes. The builder is free to use and designed for broad accessibility.",
- },
-];
diff --git a/apps/site/app/faq/data/contributorFaqs.ts b/apps/site/app/faq/data/contributorFaqs.ts
deleted file mode 100644
index 50e33e03..00000000
--- a/apps/site/app/faq/data/contributorFaqs.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-export const contributorFaqs = [
- {
- question: "Where should I report bugs or regressions?",
- answer:
- "Use GitHub issues for reproducible bugs. Include steps, expected behavior, actual behavior, and screenshots if possible.",
- },
-
- {
- question: "Where do I suggest features?",
- answer:
- "Check the roadmap first, then open a proposal with use case, target users, and success criteria.",
- },
-
- {
- question: "How can I contribute safely?",
- answer:
- "Start with small, testable improvements, follow existing conventions, and keep changes scoped to one clear outcome per pull request.",
- },
-
- {
- question: "What makes a high-quality pull request here?",
- answer:
- "Focused scope, clear reasoning, no unrelated refactors, and updated tests or validation notes where behavior changes.",
- },
-
- {
- question: "Should I open an issue before a large contribution?",
- answer:
- "Yes. For larger ideas, align first so effort maps to roadmap direction and avoids duplicated work.",
- },
-];
diff --git a/apps/site/app/faq/page.tsx b/apps/site/app/faq/page.tsx
deleted file mode 100644
index 47eb59b5..00000000
--- a/apps/site/app/faq/page.tsx
+++ /dev/null
@@ -1,196 +0,0 @@
-import type { Metadata } from "next";
-
-import Link from "next/link";
-
-import { siteConfig } from "@/config/site";
-import { Accordion, AccordionItem, AccordionContent, AccordionTrigger, Card } from "@veriworkly/ui";
-
-import { PublicPageShell } from "@/components/layout/PublicPageShell";
-
-import { builderFaqs } from "./data/builderFaqs";
-import { contributorFaqs } from "./data/contributorFaqs";
-
-const pageUrl = `${siteConfig.url}/faq`;
-const pageOgImage = `${siteConfig.url}/og/faq-page-og.png`;
-
-function splitIntoColumns(items: T[]): [T[], T[]] {
- const left: T[] = [];
- const right: T[] = [];
-
- items.forEach((item, index) => {
- if (index % 2 === 0) {
- left.push(item);
- return;
- }
-
- right.push(item);
- });
-
- return [left, right];
-}
-
-export const metadata: Metadata = {
- title: `Resume Builder FAQ | ATS Resume, Privacy & Export Help`,
- description:
- "Answers about ATS-friendly resumes, templates, exports, privacy, and using VeriWorkly without login.",
-
- openGraph: {
- title: `Resume Builder FAQ | ${siteConfig.shortName}`,
- description:
- "Find answers about ATS resumes, resume templates, exports, privacy, and no-login resume creation.",
- url: pageUrl,
- siteName: siteConfig.shortName,
- type: "website",
- images: [
- {
- url: pageOgImage,
- width: 1200,
- height: 630,
- alt: `VeriWorkly Resume Builder FAQ`,
- },
- ],
- },
-
- twitter: {
- card: "summary_large_image",
- title: `Resume Builder FAQ | ${siteConfig.shortName}`,
- description:
- "Common questions about ATS resumes, templates, exports, privacy, and resume builder workflows.",
- images: [pageOgImage],
- },
-};
-
-const FAQPage = () => {
- const [builderLeftColumn, builderRightColumn] = splitIntoColumns(builderFaqs);
- const [contributorLeftColumn, contributorRightColumn] = splitIntoColumns(contributorFaqs);
-
- const faqSchema = {
- "@context": "https://schema.org",
- "@type": "FAQPage",
- mainEntity: builderFaqs.map((faq) => ({
- "@type": "Question",
- name: faq.question,
- acceptedAnswer: {
- "@type": "Answer",
- text: faq.answer,
- },
- })),
- };
-
- return (
- <>
-
-
-
-
-