This commit is contained in:
30
app/api/analytics/route.ts
Normal file
30
app/api/analytics/route.ts
Normal file
@@ -0,0 +1,30 @@
|
||||
import { NextResponse } from 'next/server';
|
||||
|
||||
export async function POST(req: Request) {
|
||||
try {
|
||||
const body = await req.json();
|
||||
const headers = req.headers;
|
||||
|
||||
// Get IP here since we are the public facing entity
|
||||
const ip = headers.get('x-forwarded-for') || 'unknown';
|
||||
|
||||
// Relay to Admin Dashboard (Internal Docker Network)
|
||||
// admin_dash must be reachable. If in same docker network, use container name.
|
||||
// If separate, use host.docker.internal or configured URL.
|
||||
const adminUrl = process.env.ADMIN_DASH_URL || 'http://admin_dash:3000/api/track';
|
||||
|
||||
// We fire and forget - don't wait for response to keep this fast
|
||||
fetch(adminUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({ ...body, ip }), // Pass IP along
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'X-Forwarded-For': ip // Preserve IP
|
||||
},
|
||||
}).catch(e => console.error('Relay failed', e));
|
||||
|
||||
return NextResponse.json({ success: true });
|
||||
} catch (error) {
|
||||
return NextResponse.json({ success: false });
|
||||
}
|
||||
}
|
||||
14
app/page.tsx
14
app/page.tsx
@@ -1,3 +1,5 @@
|
||||
import Image from "next/image";
|
||||
|
||||
export default function Home() {
|
||||
return (
|
||||
<div className="min-h-screen flex flex-col items-center p-8 sm:p-20 relative overflow-hidden bg-zinc-50 dark:bg-zinc-950 text-zinc-900 dark:text-zinc-50 font-sans">
|
||||
@@ -10,7 +12,7 @@ export default function Home() {
|
||||
|
||||
<main className="z-10 max-w-5xl w-full animate-fade-in mt-20 sm:mt-32 pb-24 px-6">
|
||||
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-12 md:gap-24 items-center">
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-12 md:gap-24 items-start">
|
||||
|
||||
{/* Left Column: Text & Info */}
|
||||
<section className="space-y-8 order-2 md:order-1">
|
||||
@@ -55,21 +57,21 @@ export default function Home() {
|
||||
<div className="pt-2 animate-slide-up" style={{ animationDelay: '0.5s' }}>
|
||||
<p className="text-sm text-zinc-400 dark:text-zinc-500 font-mono">
|
||||
<span className="text-zinc-900 dark:text-zinc-100 mr-2">Currently:</span>
|
||||
Writing about the architecture of personal sites. <a href="/blog/testing-layout" className="text-zinc-600 dark:text-zinc-400 underline decoration-zinc-300 dark:decoration-zinc-700 hover:text-zinc-900 dark:hover:text-zinc-100">Read latest →</a>
|
||||
Writing about deep learning happenings <a href="/blog/testing-layout" className="text-zinc-600 dark:text-zinc-400 underline decoration-zinc-300 dark:decoration-zinc-700 hover:text-zinc-900 dark:hover:text-zinc-100">Read latest →</a>
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Right Column: Photo */}
|
||||
<div className="order-1 md:order-2 flex justify-center md:justify-end animate-slide-up" style={{ animationDelay: '0.2s' }}>
|
||||
<div className="relative w-64 h-64 sm:w-80 sm:h-80 rounded-2xl overflow-hidden bg-zinc-100 dark:bg-zinc-900 shadow-2xl transition-transform duration-500 ease-out grayscale hover:grayscale-0">
|
||||
<div className="relative w-64 h-64 sm:w-80 sm:h-80 rounded-2xl overflow-hidden bg-zinc-100 dark:bg-zinc-900 shadow-2xl transition-transform duration-500 ease-out">
|
||||
{/* UNCOMMENT AFTER ADDING public/profile.jpg */}
|
||||
{/* <Image src="/profile.jpg" alt="Akshay Kolli" fill className="object-cover" priority /> */}
|
||||
<Image src="/profile.jpeg" alt="Akshay Kolli" fill className="object-cover" priority />
|
||||
|
||||
{/* Placeholder */}
|
||||
<div className="absolute inset-0 flex items-center justify-center text-zinc-300 dark:text-zinc-700 border-2 border-dashed border-zinc-200 dark:border-zinc-800 m-2 rounded-xl">
|
||||
{/* <div className="absolute inset-0 flex items-center justify-center text-zinc-300 dark:text-zinc-700 border-2 border-dashed border-zinc-200 dark:border-zinc-800 m-2 rounded-xl">
|
||||
<span className="font-mono text-sm">profile.jpg</span>
|
||||
</div>
|
||||
</div> */}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -3,9 +3,7 @@ export default function ResumePage() {
|
||||
<div className="max-w-3xl mx-auto px-6 py-24 space-y-12 animate-fade-in">
|
||||
<header className="space-y-4">
|
||||
<h1 className="text-4xl font-bold tracking-tight text-zinc-900 dark:text-zinc-50">Resume</h1>
|
||||
<p className="text-zinc-500 dark:text-zinc-400 font-light">
|
||||
Academic and professional timeline.
|
||||
</p>
|
||||
|
||||
</header>
|
||||
|
||||
{/* Timeline Section */}
|
||||
|
||||
Reference in New Issue
Block a user