diff --git a/next.config.ts b/next.config.ts
index 5f4a2dc..0d04e5f 100644
--- a/next.config.ts
+++ b/next.config.ts
@@ -1,9 +1,9 @@
import type { NextConfig } from "next";
-import createMDX from '@next/mdx';
+import createMDX from "@next/mdx";
const nextConfig: NextConfig = {
// Configure `pageExtensions` to include markdown and MDX files
- pageExtensions: ['js', 'jsx', 'md', 'mdx', 'ts', 'tsx'],
+ pageExtensions: ["js", "jsx", "md", "mdx", "ts", "tsx"],
// Optionally, add any other Next.js config below
};
diff --git a/public/manifest.json b/public/manifest.json
new file mode 100644
index 0000000..867b49b
--- /dev/null
+++ b/public/manifest.json
@@ -0,0 +1,56 @@
+{
+ "name": "Mainasara Tsowa Portfolio",
+ "short_name": "Mainasara",
+ "description": "Developer & Cybersecurity Expert - Portfolio Website",
+ "start_url": "/",
+ "display": "standalone",
+ "background_color": "#ffffff",
+ "theme_color": "#000000",
+ "orientation": "portrait-primary",
+ "icons": [
+ {
+ "src": "/icon-72x72.png",
+ "sizes": "72x72",
+ "type": "image/png"
+ },
+ {
+ "src": "/icon-96x96.png",
+ "sizes": "96x96",
+ "type": "image/png"
+ },
+ {
+ "src": "/icon-128x128.png",
+ "sizes": "128x128",
+ "type": "image/png"
+ },
+ {
+ "src": "/icon-144x144.png",
+ "sizes": "144x144",
+ "type": "image/png"
+ },
+ {
+ "src": "/icon-152x152.png",
+ "sizes": "152x152",
+ "type": "image/png"
+ },
+ {
+ "src": "/icon-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png",
+ "purpose": "any maskable"
+ },
+ {
+ "src": "/icon-384x384.png",
+ "sizes": "384x384",
+ "type": "image/png"
+ },
+ {
+ "src": "/icon-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png",
+ "purpose": "any maskable"
+ }
+ ],
+ "categories": ["technology", "portfolio", "developer", "cybersecurity"],
+ "lang": "en"
+}
\ No newline at end of file
diff --git a/src/app/digital-art/page.tsx b/src/app/digital-art/page.tsx
index 54ac0f2..d9a872e 100644
--- a/src/app/digital-art/page.tsx
+++ b/src/app/digital-art/page.tsx
@@ -1,6 +1,21 @@
+import type { Metadata } from "next";
import Link from "next/link";
import { artItems } from "@/data/creativeData";
+export const metadata: Metadata = {
+ title: "Digital Art",
+ description: "Explore my digital art collection featuring creative works through digital canvases and new media. Discover the intersection of technology and artistic expression.",
+ openGraph: {
+ title: "Digital Art | Mainasara Tsowa",
+ description: "Explore my digital art collection featuring creative works through digital canvases and new media.",
+ url: "https://mainasara.dev/digital-art",
+ },
+ twitter: {
+ title: "Digital Art | Mainasara Tsowa",
+ description: "Explore my digital art collection featuring creative works through digital canvases and new media.",
+ },
+};
+
export default function DigitalArtPage() {
return (
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index f7fa87e..0755d55 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -13,8 +13,61 @@ const geistMono = Geist_Mono({
});
export const metadata: Metadata = {
- title: "Create Next App",
- description: "Generated by create next app",
+ metadataBase: new URL('https://mainasara.dev'),
+ title: {
+ default: 'Mainasara Tsowa - Developer & Cybersecurity Expert',
+ template: '%s | Mainasara Tsowa'
+ },
+ description: 'Passionate developer and cybersecurity expert building secure, elegant digital solutions. Explore projects, creative writing, and technical insights.',
+ keywords: ['developer', 'cybersecurity', 'full-stack', 'web development', 'security', 'programming', 'digital art', 'creative writing'],
+ authors: [{ name: 'Mainasara Tsowa' }],
+ creator: 'Mainasara Tsowa',
+ publisher: 'Mainasara Tsowa',
+ robots: 'index, follow',
+ openGraph: {
+ title: 'Mainasara Tsowa - Developer & Cybersecurity Expert',
+ description: 'Passionate developer and cybersecurity expert building secure, elegant digital solutions.',
+ url: 'https://mainasara.dev',
+ siteName: 'Mainasara Tsowa',
+ locale: 'en_US',
+ type: 'website',
+ images: [
+ {
+ url: '/media/me/me.jpeg',
+ width: 800,
+ height: 800,
+ alt: 'Mainasara Tsowa',
+ },
+ ],
+ },
+ twitter: {
+ card: 'summary_large_image',
+ title: 'Mainasara Tsowa - Developer & Cybersecurity Expert',
+ description: 'Passionate developer and cybersecurity expert building secure, elegant digital solutions.',
+ images: ['/media/me/me.jpeg'],
+ creator: '@mainasara',
+ },
+ alternates: {
+ canonical: 'https://mainasara.dev',
+ },
+ icons: {
+ icon: [
+ { url: '/favicon.ico' },
+ { url: '/icon.png', type: 'image/png' },
+ ],
+ apple: [
+ { url: '/apple-icon.png' },
+ ],
+ },
+ manifest: '/manifest.json',
+ verification: {
+ google: 'your-google-site-verification-code',
+ },
+ category: 'technology',
+ other: {
+ 'twitter:site': '@mainasara',
+ 'twitter:creator': '@mainasara',
+ },
};
export default function RootLayout({
@@ -23,7 +76,7 @@ export default function RootLayout({
children: React.ReactNode;
}>) {
return (
-
+
diff --git a/src/app/page.tsx b/src/app/page.tsx
index dba6251..6b5d830 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -1,6 +1,21 @@
+import type { Metadata } from "next";
import ProjectsSection from "@/components/ProjectsSection";
import Image from "next/image";
+export const metadata: Metadata = {
+ title: "Home",
+ description: "Welcome to my personal portfolio. I'm Mainasara Tsowa, a developer and cybersecurity expert passionate about building secure, elegant digital solutions.",
+ openGraph: {
+ title: "Home | Mainasara Tsowa",
+ description: "Welcome to my personal portfolio. Developer and cybersecurity expert building secure, elegant digital solutions.",
+ url: "https://mainasara.dev",
+ },
+ twitter: {
+ title: "Home | Mainasara Tsowa",
+ description: "Welcome to my personal portfolio. Developer and cybersecurity expert building secure, elegant digital solutions.",
+ },
+};
+
export default function Home() {
return (
diff --git a/src/app/stories/page.tsx b/src/app/stories/page.tsx
index d5249d8..00c3a62 100644
--- a/src/app/stories/page.tsx
+++ b/src/app/stories/page.tsx
@@ -1,7 +1,22 @@
+import type { Metadata } from "next";
import Link from "next/link";
import { getStories } from "@/data/creativeData";
import ExpandableStory from "@/components/ExpandableStory";
+export const metadata: Metadata = {
+ title: "Mini Stories",
+ description: "A collection of brief narratives and creative stories. Explore fictional tales that capture moments and emotions in concise storytelling.",
+ openGraph: {
+ title: "Mini Stories | Mainasara Tsowa",
+ description: "A collection of brief narratives and creative stories capturing moments and emotions.",
+ url: "https://mainasara.dev/stories",
+ },
+ twitter: {
+ title: "Mini Stories | Mainasara Tsowa",
+ description: "A collection of brief narratives and creative stories capturing moments and emotions.",
+ },
+};
+
export default async function StoriesPage() {
const stories = await getStories();
diff --git a/src/app/thoughts/page.tsx b/src/app/thoughts/page.tsx
index 6257e94..c88534b 100644
--- a/src/app/thoughts/page.tsx
+++ b/src/app/thoughts/page.tsx
@@ -1,7 +1,22 @@
+import type { Metadata } from "next";
import Link from "next/link";
import { getThoughts } from "@/data/creativeData";
import ExpandableThought from "@/components/ExpandableThought";
+export const metadata: Metadata = {
+ title: "Thoughts",
+ description: "Reflections on technology, life, and the intersection of creativity and code. Read my thoughts on software development, cybersecurity, and digital innovation.",
+ openGraph: {
+ title: "Thoughts | Mainasara Tsowa",
+ description: "Reflections on technology, life, and the intersection of creativity and code.",
+ url: "https://mainasara.dev/thoughts",
+ },
+ twitter: {
+ title: "Thoughts | Mainasara Tsowa",
+ description: "Reflections on technology, life, and the intersection of creativity and code.",
+ },
+};
+
export default async function ThoughtsPage() {
const thoughts = await getThoughts();