diff --git a/package.json b/package.json
index d466598..b456b87 100644
--- a/package.json
+++ b/package.json
@@ -13,6 +13,7 @@
"@mdx-js/react": "^3.1.1",
"@next/mdx": "^16.1.1",
"@types/mdx": "^2.0.13",
+ "framer-motion": "^12.26.2",
"gray-matter": "^4.0.3",
"next": "16.1.1",
"react": "19.2.3",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 916933b..fb94336 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -20,6 +20,9 @@ importers:
'@types/mdx':
specifier: ^2.0.13
version: 2.0.13
+ framer-motion:
+ specifier: ^12.26.2
+ version: 12.26.2(react-dom@19.1.0(react@19.2.3))(react@19.2.3)
gray-matter:
specifier: ^4.0.3
version: 4.0.3
@@ -1165,6 +1168,20 @@ packages:
resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
engines: {node: '>= 0.4'}
+ framer-motion@12.26.2:
+ resolution: {integrity: sha512-lflOQEdjquUi9sCg5Y1LrsZDlsjrHw7m0T9Yedvnk7Bnhqfkc89/Uha10J3CFhkL+TCZVCRw9eUGyM/lyYhXQA==}
+ peerDependencies:
+ '@emotion/is-prop-valid': '*'
+ react: ^18.0.0 || ^19.0.0
+ react-dom: ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@emotion/is-prop-valid':
+ optional: true
+ react:
+ optional: true
+ react-dom:
+ optional: true
+
function-bind@1.1.2:
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
@@ -1690,6 +1707,12 @@ packages:
minimist@1.2.8:
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+ motion-dom@12.26.2:
+ resolution: {integrity: sha512-KLMT1BroY8oKNeliA3JMNJ+nbCIsTKg6hJpDb4jtRAJ7nCKnnpg/LTq/NGqG90Limitz3kdAnAVXecdFVGlWTw==}
+
+ motion-utils@12.24.10:
+ resolution: {integrity: sha512-x5TFgkCIP4pPsRLpKoI86jv/q8t8FQOiM/0E8QKBzfMozWHfkKap2gA1hOki+B5g3IsBNpxbUnfOum1+dgvYww==}
+
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
@@ -3416,6 +3439,15 @@ snapshots:
dependencies:
is-callable: 1.2.7
+ framer-motion@12.26.2(react-dom@19.1.0(react@19.2.3))(react@19.2.3):
+ dependencies:
+ motion-dom: 12.26.2
+ motion-utils: 12.24.10
+ tslib: 2.8.1
+ optionalDependencies:
+ react: 19.2.3
+ react-dom: 19.1.0(react@19.2.3)
+
function-bind@1.1.2: {}
function.prototype.name@1.1.8:
@@ -4151,6 +4183,12 @@ snapshots:
minimist@1.2.8: {}
+ motion-dom@12.26.2:
+ dependencies:
+ motion-utils: 12.24.10
+
+ motion-utils@12.24.10: {}
+
ms@2.1.3: {}
nanoid@3.3.11: {}
diff --git a/public/icon.svg b/public/icon.svg
new file mode 100644
index 0000000..bffae99
--- /dev/null
+++ b/public/icon.svg
@@ -0,0 +1,4 @@
+
+
+ >_
+
diff --git a/src/app/globals.css b/src/app/globals.css
index 67cf6cc..b74e629 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -1,32 +1,38 @@
@import "tailwindcss";
:root {
- /* Neo-brutalist muted color palette */
- --background: #FAF8F5;
- --foreground: #3D3D3D;
- --card-bg: #FEFDFB;
- --border-color: #3D3D3D;
+ /* Hacker/Cyberpunk color palette */
+ --background: #0a0a0a;
+ --background-secondary: #111111;
+ --foreground: #00ff41;
+ --foreground-dim: #00cc33;
+ --foreground-muted: #008f11;
- /* Muted accent colors */
- --sage: #B8C5B3;
- --sage-light: #CBD6C8;
- --sage-dark: #A8B5A0;
+ --card-bg: #0d0d0d;
+ --card-bg-hover: #141414;
+ --border-color: #00ff41;
+ --border-dim: #00cc33;
- --terracotta: #D4B5A0;
- --terracotta-light: #E0C9B8;
- --terracotta-dark: #C9A88E;
+ /* Accent colors */
+ --cyan: #00d4ff;
+ --cyan-dim: #00a8cc;
+ --magenta: #ff00ff;
+ --magenta-dim: #cc00cc;
+ --yellow: #ffff00;
+ --yellow-dim: #cccc00;
+ --red: #ff3333;
+ --red-dim: #cc2929;
+ --orange: #ff6600;
- --blue-grey: #A5B4BE;
- --blue-grey-light: #B8C5CE;
- --blue-grey-dark: #9BAAB5;
+ /* Terminal colors */
+ --terminal-green: #00ff41;
+ --terminal-amber: #ffb000;
+ --terminal-blue: #0080ff;
- --rose: #D4B5B8;
- --rose-light: #E0C9CC;
- --rose-dark: #C9A8AB;
-
- --sand: #E8DCC8;
- --sand-light: #F0E8D8;
- --sand-dark: #DDD0BB;
+ /* Glow effects */
+ --glow-green: 0 0 10px #00ff41, 0 0 20px #00ff4180, 0 0 30px #00ff4140;
+ --glow-cyan: 0 0 10px #00d4ff, 0 0 20px #00d4ff80;
+ --glow-magenta: 0 0 10px #ff00ff, 0 0 20px #ff00ff80;
}
@theme inline {
@@ -36,54 +42,333 @@
--font-mono: var(--font-geist-mono);
}
-@media (prefers-color-scheme: dark) {
+/* No light mode - always dark for hacker aesthetic */
+@media (prefers-color-scheme: light) {
:root {
- --background: #1A1A1A;
- --foreground: #E8E3D8;
- --card-bg: #242424;
- --border-color: #4D4D4D;
-
- --sage: #8A9985;
- --sage-light: #9BAA96;
- --sage-dark: #7A8975;
-
- --terracotta: #A38E7D;
- --terracotta-light: #B29E8D;
- --terracotta-dark: #937E6D;
-
- --blue-grey: #7D8C95;
- --blue-grey-light: #8D9CA5;
- --blue-grey-dark: #6D7C85;
-
- --rose: #A38E91;
- --rose-light: #B39EA1;
- --rose-dark: #937E81;
-
- --sand: #B8AC98;
- --sand-light: #C8BCA8;
- --sand-dark: #A89C88;
+ --background: #0a0a0a;
+ --foreground: #00ff41;
}
}
body {
background: var(--background);
color: var(--foreground);
- font-family: Arial, Helvetica, sans-serif;
+ font-family: 'Courier New', Courier, monospace;
+ transition: background-color 0.4s ease, color 0.4s ease;
}
-/* Neo-brutalist shadow utilities */
-.shadow-neo-brutal {
- box-shadow: 5px 5px 0px var(--border-color);
+/* Scanline effect overlay */
+.scanlines::before {
+ content: "";
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: repeating-linear-gradient(
+ 0deg,
+ rgba(0, 0, 0, 0.15),
+ rgba(0, 0, 0, 0.15) 1px,
+ transparent 1px,
+ transparent 2px
+ );
+ pointer-events: none;
+ z-index: 100;
}
-.shadow-neo-brutal-hover {
- box-shadow: 7px 7px 0px var(--border-color);
+/* CRT screen flicker */
+@keyframes flicker {
+ 0% { opacity: 0.97; }
+ 5% { opacity: 0.95; }
+ 10% { opacity: 0.97; }
+ 15% { opacity: 0.94; }
+ 20% { opacity: 0.98; }
+ 50% { opacity: 0.96; }
+ 80% { opacity: 0.97; }
+ 90% { opacity: 0.94; }
+ 100% { opacity: 0.98; }
}
-.shadow-brutal {
- box-shadow: 5px 5px 0px var(--border-color);
+.crt-flicker {
+ animation: flicker 0.15s infinite;
}
-.shadow-brutal-hover {
- box-shadow: 7px 7px 0px var(--border-color);
+/* Typing cursor animation */
+@keyframes blink {
+ 0%, 50% { opacity: 1; }
+ 51%, 100% { opacity: 0; }
}
+
+.cursor-blink::after {
+ content: "_";
+ animation: blink 1s infinite;
+}
+
+/* Glitch effect */
+@keyframes glitch {
+ 0% {
+ transform: translate(0);
+ }
+ 20% {
+ transform: translate(-2px, 2px);
+ }
+ 40% {
+ transform: translate(-2px, -2px);
+ }
+ 60% {
+ transform: translate(2px, 2px);
+ }
+ 80% {
+ transform: translate(2px, -2px);
+ }
+ 100% {
+ transform: translate(0);
+ }
+}
+
+.glitch:hover {
+ animation: glitch 0.3s ease-in-out;
+}
+
+/* Text glitch effect */
+@keyframes textGlitch {
+ 0% {
+ text-shadow: 2px 0 #ff00ff, -2px 0 #00ffff;
+ }
+ 25% {
+ text-shadow: -2px 0 #ff00ff, 2px 0 #00ffff;
+ }
+ 50% {
+ text-shadow: 2px 0 #ff00ff, -2px 0 #00ffff;
+ }
+ 75% {
+ text-shadow: -2px 0 #ff00ff, 2px 0 #00ffff;
+ }
+ 100% {
+ text-shadow: 2px 0 #ff00ff, -2px 0 #00ffff;
+ }
+}
+
+.text-glitch:hover {
+ animation: textGlitch 0.2s ease-in-out infinite;
+}
+
+/* Matrix rain background */
+@keyframes matrix-rain {
+ 0% {
+ background-position: 0% 0%;
+ }
+ 100% {
+ background-position: 0% 100%;
+ }
+}
+
+/* Neon glow effects */
+.glow-green {
+ text-shadow: var(--glow-green);
+}
+
+.glow-cyan {
+ text-shadow: var(--glow-cyan);
+}
+
+.glow-magenta {
+ text-shadow: var(--glow-magenta);
+}
+
+.box-glow-green {
+ box-shadow: 0 0 5px #00ff41, 0 0 10px #00ff4180, inset 0 0 5px #00ff4120;
+}
+
+.box-glow-cyan {
+ box-shadow: 0 0 5px #00d4ff, 0 0 10px #00d4ff80, inset 0 0 5px #00d4ff20;
+}
+
+.box-glow-magenta {
+ box-shadow: 0 0 5px #ff00ff, 0 0 10px #ff00ff80, inset 0 0 5px #ff00ff20;
+}
+
+/* Terminal window styling */
+.terminal-window {
+ background: linear-gradient(180deg, #1a1a1a 0%, #0d0d0d 100%);
+ border: 1px solid #00ff41;
+ box-shadow: 0 0 10px #00ff4140, inset 0 0 50px #00ff4108;
+}
+
+.terminal-header {
+ background: linear-gradient(90deg, #1a1a1a, #0d0d0d);
+ border-bottom: 1px solid #00ff4180;
+}
+
+/* Typing animation */
+@keyframes typing {
+ from { width: 0; }
+ to { width: 100%; }
+}
+
+.typing-effect {
+ overflow: hidden;
+ white-space: nowrap;
+ animation: typing 2s steps(30, end);
+}
+
+/* Pulse animation for active elements */
+@keyframes pulse-green {
+ 0%, 100% {
+ box-shadow: 0 0 5px #00ff41;
+ }
+ 50% {
+ box-shadow: 0 0 20px #00ff41, 0 0 30px #00ff4180;
+ }
+}
+
+.pulse-glow {
+ animation: pulse-green 2s ease-in-out infinite;
+}
+
+/* Code highlight style */
+.code-block {
+ background: #0d0d0d;
+ border-left: 3px solid #00ff41;
+ font-family: 'Courier New', monospace;
+}
+
+/* Hacker button style */
+.hacker-btn {
+ background: transparent;
+ border: 1px solid #00ff41;
+ color: #00ff41;
+ position: relative;
+ overflow: hidden;
+ transition: all 0.3s ease;
+}
+
+.hacker-btn::before {
+ content: "";
+ position: absolute;
+ top: 0;
+ left: -100%;
+ width: 100%;
+ height: 100%;
+ background: linear-gradient(90deg, transparent, #00ff4120, transparent);
+ transition: left 0.5s ease;
+}
+
+.hacker-btn:hover::before {
+ left: 100%;
+}
+
+.hacker-btn:hover {
+ background: #00ff4115;
+ box-shadow: 0 0 10px #00ff4180, inset 0 0 10px #00ff4120;
+}
+
+/* Zen button - simple transition without hardcoded colors */
+.zen-btn {
+ background: transparent;
+ transition: all 0.3s ease;
+}
+
+/* Link styling */
+.hacker-link {
+ color: #00d4ff;
+ text-decoration: none;
+ position: relative;
+}
+
+.hacker-link::after {
+ content: "";
+ position: absolute;
+ bottom: -2px;
+ left: 0;
+ width: 0;
+ height: 1px;
+ background: #00d4ff;
+ transition: width 0.3s ease;
+}
+
+.hacker-link:hover::after {
+ width: 100%;
+}
+
+.hacker-link:hover {
+ text-shadow: 0 0 10px #00d4ff80;
+}
+
+/* Selection styling */
+::selection {
+ background: #00ff41;
+ color: #0a0a0a;
+}
+
+/* Scrollbar styling */
+::-webkit-scrollbar {
+ width: 8px;
+ height: 8px;
+}
+
+::-webkit-scrollbar-track {
+ background: #0a0a0a;
+}
+
+::-webkit-scrollbar-thumb {
+ background: #00ff4180;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background: #00ff41;
+}
+
+/* Card hover effects */
+.hacker-card {
+ background: #0d0d0d;
+ border: 1px solid #00ff4140;
+ transition: all 0.3s ease;
+}
+
+.hacker-card:hover {
+ border-color: #00ff41;
+ box-shadow: 0 0 20px #00ff4130, inset 0 0 20px #00ff4108;
+}
+
+/* Status indicator */
+.status-online {
+ width: 8px;
+ height: 8px;
+ background: #00ff41;
+ box-shadow: 0 0 10px #00ff41;
+ animation: pulse-green 2s ease-in-out infinite;
+}
+
+/* ASCII art styling */
+.ascii-art {
+ font-family: 'Courier New', monospace;
+ white-space: pre;
+ line-height: 1.2;
+ font-size: 10px;
+ color: #00ff4180;
+}
+
+/* Grid overlay effect */
+.grid-overlay {
+ background-image:
+ linear-gradient(rgba(0, 255, 65, 0.03) 1px, transparent 1px),
+ linear-gradient(90deg, rgba(0, 255, 65, 0.03) 1px, transparent 1px);
+ background-size: 20px 20px;
+}
+
+/* Fade in animation */
+@keyframes fadeIn {
+ from { opacity: 0; transform: translateY(10px); }
+ to { opacity: 1; transform: translateY(0); }
+}
+
+.fade-in {
+ animation: fadeIn 0.5s ease-out forwards;
+}
+
+.fade-in-delay-1 { animation-delay: 0.1s; opacity: 0; }
+.fade-in-delay-2 { animation-delay: 0.2s; opacity: 0; }
+.fade-in-delay-3 { animation-delay: 0.3s; opacity: 0; }
+.fade-in-delay-4 { animation-delay: 0.4s; opacity: 0; }
+.fade-in-delay-5 { animation-delay: 0.5s; opacity: 0; }
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index b4ce7a8..cf42acb 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -15,29 +15,35 @@ const geistMono = Geist_Mono({
export const metadata: Metadata = {
metadataBase: new URL("https://mainasara.dev"),
title: {
- default: "Mainasara Tsowa - Developer & Cybersecurity Expert",
+ default: "Mainasara Tsowa | Security Researcher & Full-Stack Developer",
template: "%s | Mainasara Tsowa",
},
description:
- "Passionate developer and cybersecurity expert building secure, elegant digital solutions. Explore projects, creative writing, and technical insights.",
+ "Security researcher and full-stack developer specializing in penetration testing, OSINT frameworks, vulnerability research, and building secure applications with Next.js. Open for security consulting and development projects.",
keywords: [
- "developer",
+ "security researcher",
+ "penetration testing",
+ "pentest",
"cybersecurity",
- "full-stack",
- "web development",
- "security",
- "programming",
- "digital art",
- "creative writing",
+ "OSINT",
+ "vulnerability research",
+ "Next.js developer",
+ "full-stack developer",
+ "security tooling",
+ "web security",
+ "application security",
+ "security consulting",
+ "React developer",
+ "TypeScript",
],
- authors: [{ name: "Mainasara Tsowa" }],
+ authors: [{ name: "Mainasara Tsowa", url: "https://mainasara.dev" }],
creator: "Mainasara Tsowa",
publisher: "Mainasara Tsowa",
robots: "index, follow",
openGraph: {
- title: "Mainasara Tsowa - Developer & Cybersecurity Expert",
+ title: "Mainasara Tsowa | Security Researcher & Full-Stack Developer",
description:
- "Passionate developer and cybersecurity expert building secure, elegant digital solutions.",
+ "Security researcher specializing in offensive security, OSINT frameworks, and building secure applications with Next.js.",
url: "https://mainasara.dev",
siteName: "Mainasara Tsowa",
locale: "en_US",
@@ -47,15 +53,15 @@ export const metadata: Metadata = {
url: "/media/me/me.jpeg",
width: 800,
height: 800,
- alt: "Mainasara Tsowa",
+ alt: "Mainasara Tsowa - Security Researcher",
},
],
},
twitter: {
card: "summary_large_image",
- title: "Mainasara Tsowa - Developer & Cybersecurity Expert",
+ title: "Mainasara Tsowa | Security Researcher & Full-Stack Developer",
description:
- "Passionate developer and cybersecurity expert building secure, elegant digital solutions.",
+ "Security researcher specializing in offensive security, OSINT frameworks, and secure application development.",
images: ["/media/me/me.jpeg"],
creator: "@neutrino2211",
},
@@ -63,8 +69,8 @@ export const metadata: Metadata = {
canonical: "https://mainasara.dev",
},
icons: {
- icon: [{ url: "/favicon.ico" }, { url: "/icon.png", type: "image/png" }],
- apple: [{ url: "/apple-icon.png" }],
+ icon: [{ url: "/icon.svg", type: "image/svg+xml" }],
+ apple: [{ url: "/icon.svg" }],
},
manifest: "/manifest.json",
verification: {
@@ -83,9 +89,9 @@ export default function RootLayout({
children: React.ReactNode;
}>) {
return (
-
+
{children}
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 441890f..6398769 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -6,258 +6,453 @@ import Link from "next/link";
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.",
+ "Security Researcher & Full-Stack Developer with expertise in penetration testing, security tooling, and building secure applications with Next.js.",
openGraph: {
- title: "Home | Mainasara Tsowa",
+ title: "Mainasara Tsowa | Security Researcher",
description:
- "Welcome to my personal portfolio. Developer and cybersecurity expert building secure, elegant digital solutions.",
+ "Security Researcher & Full-Stack Developer specializing in offensive security, OSINT, and secure application development.",
url: "https://mainasara.dev",
},
twitter: {
- title: "Home | Mainasara Tsowa",
+ title: "Mainasara Tsowa | Security Researcher",
description:
- "Welcome to my personal portfolio. Developer and cybersecurity expert building secure, elegant digital solutions.",
+ "Security Researcher & Full-Stack Developer specializing in offensive security, OSINT, and secure application development.",
},
};
export default function Home() {
return (
-
-
-
-
-
-
+
+ {/* Scanline overlay */}
+
+
+
+ {/* Header */}
+
+
+ {/* Profile Image - Clean, no terminal effect */}
+
+
+ {/* Info */}
+
+
+ $ whoami
+
+
+ MAINASARA TSOWA
+
+
+ > Security Researcher{" "}
+ | Full-Stack Developer
+
+
+ /* Building secure systems and breaking insecure ones.
+ Specialized in offensive security, OSINT frameworks, and Next.js applications.{" "}
+ */
+
+
+
+
+ {/* Quick Stats */}
+
-
- Mainasara Tsowa
-
-
- Developer & Cybersecurity Expert working on secure, elegant digital
- solutions
-
-
-
-
- {/*
-
- Blog
-
- */}
-
-
- Digital Art
-
-
-
-
- Mini Stories
-
-
-
-
- Thoughts
-
-
-
-
-
-
-
-
-
- About
-
-
- I'm a passionate developer and cybersecurity expert who
- believes in building beautiful, secure, and purposeful digital
- solutions. When I'm not coding or exploring security tooling,
- you'll probably find me trying my hands at some creative
- projects.
-
-
-
-
-
- Expertise
-
-
-
-
- Development
-
-
-
-
- Full-Stack Applications
-
-
-
- Clean Architecture
-
-
-
- Performance Optimization
-
-
-
-
-
- Cybersecurity
-
-
-
-
- Security Tooling
-
-
-
- Penetration Testing
-
-
-
- Security Architecture
-
-
-
-
-
-
-
-
-
-
- Creative Corner
-
-
-
-
🎨
-
- Digital Art
-
-
- Someone messing around with colors and shapes.
-
-
-
-
📝
-
- Mini Stories
-
-
- I like good narratives, so I try to imitate them.
-
-
-
-
🌸
-
- Thoughts
-
-
- Rants on technology, maybe something else.
-
-
-
-
-
-
-
-
-