diff --git a/.gitignore b/.gitignore index 519eed9..00c348b 100644 --- a/.gitignore +++ b/.gitignore @@ -55,4 +55,6 @@ next-env.d.ts # Agents .agents -skills-lock.json \ No newline at end of file +skills-lock.json +studio_audit_report.md +server_audit_report.md diff --git a/apps/blog-platform/app/[slug]/page.tsx b/apps/blog-platform/app/[slug]/page.tsx index 77f4b7a..8f5626e 100644 --- a/apps/blog-platform/app/[slug]/page.tsx +++ b/apps/blog-platform/app/[slug]/page.tsx @@ -3,11 +3,12 @@ import type { Metadata } from "next"; import Link from "next/link"; import Image from "next/image"; import { notFound } from "next/navigation"; -import { ArrowLeft, Clock, Calendar } from "lucide-react"; import { DocsBody } from "fumadocs-ui/layouts/notebook/page"; +import { ArrowLeft, Clock, Calendar, ArrowRight } from "lucide-react"; import { blog } from "@/lib/source"; import { siteConfig } from "@/config/site"; +import { getReadingTime } from "@/lib/read-time"; import PostActions from "@/components/blog/PostActions"; @@ -29,110 +30,123 @@ export default async function BlogPostPage(props: PageProps) { const postUrl = `${siteConfig.url}/${params.slug}`; return ( -
+
-
-
- - - -
-
-
- - {new Date(page.data.date).toLocaleDateString("en-US", { - month: "long", - day: "numeric", - year: "numeric", - })} -
+
+
+
+ + {" "} + Back to Blog + + +
+
+ Engineering +
+ +

+ {page.data.title} +

-
- 6 min read +

+ {page.data.description} +

+
-
- Engineering +
+ +
+ + + +
+
+ + {/* Sticky Metadata & Project Callout Sidebar */} +
- -
- - - -
- -
-
-
-
- VeriWorkly Logo +
+
+ + + + {new Date(page.data.date).toLocaleDateString("en-US", { + month: "short", + day: "numeric", + year: "numeric", + })} +
-
-

Written by VeriWorkly

- -

- We're on a mission to build the most private and professional career - engineering platform. Join us in redefining how professional stories are told. -

- -
- - Open resume builder - - - - Read docs - - - - Follow our progress - -
+
+ + {getReadingTime(page.data.info.path)}
-
-
+ +
+ +
+
+ Actions +
+ + +
+ +
+ +
+

VeriWorkly Platform

+ +

+ Build a professional, ATS-friendly resume for free. 100% open-source and + privacy-first. +

+ + + Launch Builder + +
+ +
); diff --git a/apps/blog-platform/app/api/og/route.tsx b/apps/blog-platform/app/api/og/route.tsx index dc9ba77..60af8c0 100644 --- a/apps/blog-platform/app/api/og/route.tsx +++ b/apps/blog-platform/app/api/og/route.tsx @@ -168,7 +168,7 @@ export async function GET(request: Request) { textTransform: "uppercase", }} > - blogs.veriworkly.com + blog.veriworkly.com
, { diff --git a/apps/blog-platform/app/archive/page.tsx b/apps/blog-platform/app/archive/page.tsx index b660c51..c76ea8a 100644 --- a/apps/blog-platform/app/archive/page.tsx +++ b/apps/blog-platform/app/archive/page.tsx @@ -1,10 +1,22 @@ +import type { Metadata } from "next"; + import Link from "next/link"; -import { ArrowLeft, ArrowRight, Clock } from "lucide-react"; +import { ArrowLeft, ArrowRight, Clock, FileText, Calendar } from "lucide-react"; import { blog } from "@/lib/source"; import { siteConfig } from "@/config/site"; +import { getReadingTime } from "@/lib/read-time"; + +import { Container } from "@veriworkly/ui"; -import { Container, Card } from "@veriworkly/ui"; +export const metadata: Metadata = { + title: "Blog Archive | VeriWorkly", + description: + "Browse the complete history of articles, tech logs, and career engineering advice from the VeriWorkly team.", + alternates: { + canonical: `${siteConfig.url}/archive`, + }, +}; const BlogArchive = () => { const toBlogMeta = (data: unknown) => @@ -13,6 +25,9 @@ const BlogArchive = () => { description: string; author: string; date: string; + info: { + path: string; + }; }; const allPosts = blog @@ -23,83 +38,128 @@ const BlogArchive = () => { ); return ( -
- -
- - Back to Home - - -
-
-

- The Archive. -

-

- Every story we've told about the future of career engineering. -

+
+ +
+
- -
- {allPosts.map((post) => { - const meta = toBlogMeta(post.data); - return ( - - -
-
- - {new Date(meta.date).toLocaleDateString("en-US", { - month: "short", - day: "numeric", - year: "numeric", - })} - - - - 5m - -
- -

- {meta.title} -

- -

- {meta.description} -

- -
- Read More{" "} - -
+ + +
+ {allPosts.map((post) => { + const meta = toBlogMeta(post.data); + + return ( +
+
+ + + {new Date(meta.date).toLocaleDateString("en-US", { + month: "short", + day: "numeric", + year: "numeric", + })} + + + + + + + {getReadingTime(meta.info.path)} +
- - - ); - })} -
- {allPosts.length === 0 && ( -
-

No articles found.

-
- )} +

+ {meta.title} +

+ +

+ {meta.description} +

+ +
+ + Read Article + + +
+ + ); + })} + + {allPosts.length === 0 && ( +
+ + +

No articles published yet.

+
+ )} + +
); diff --git a/apps/blog-platform/app/page.tsx b/apps/blog-platform/app/page.tsx index f27dd7e..0729248 100644 --- a/apps/blog-platform/app/page.tsx +++ b/apps/blog-platform/app/page.tsx @@ -1,7 +1,19 @@ +import type { Metadata } from "next"; + import { blog } from "@/lib/source"; +import { siteConfig } from "@/config/site"; import { Container } from "@veriworkly/ui"; +export const metadata: Metadata = { + title: "VeriWorkly Blog | Career Insights & Resume Tips", + description: + "Explore developer insights, ATS optimization strategies, and privacy-first resume architecture notes.", + alternates: { + canonical: siteConfig.url, + }, +}; + import { BlogHero } from "../features/landing/components/BlogHero"; import { PostsGrid } from "../features/landing/components/PostsGrid"; import { FAQSection } from "../features/landing/components/FAQSection"; @@ -17,7 +29,7 @@ const BlogHome = () => { const remainingPosts = allPosts.slice(1, 4); return ( -
+
diff --git a/apps/blog-platform/components/layout/MainLayout.tsx b/apps/blog-platform/components/layout/MainLayout.tsx index c5f5e1d..580cfd6 100644 --- a/apps/blog-platform/components/layout/MainLayout.tsx +++ b/apps/blog-platform/components/layout/MainLayout.tsx @@ -9,7 +9,7 @@ interface MainLayoutProps { export const MainLayout = ({ children }: MainLayoutProps) => { return ( -
+
{children}