feat: portfolio desktop light done
Signed-off-by: Ameya Shenoy <shenoy.ameya@gmail.com>
This commit is contained in:
parent
dd641fc5aa
commit
360fb2d3d6
8 changed files with 304 additions and 12 deletions
22
frontend/package-lock.json
generated
22
frontend/package-lock.json
generated
|
|
@ -8,6 +8,7 @@
|
|||
"name": "one",
|
||||
"version": "0.1.0",
|
||||
"dependencies": {
|
||||
"@iconify/react": "^6.0.0",
|
||||
"@radix-ui/react-dropdown-menu": "^2.1.15",
|
||||
"@radix-ui/react-slot": "^1.2.3",
|
||||
"class-variance-authority": "^0.7.1",
|
||||
|
|
@ -106,6 +107,27 @@
|
|||
"integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@iconify/react": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@iconify/react/-/react-6.0.0.tgz",
|
||||
"integrity": "sha512-eqNscABVZS8eCpZLU/L5F5UokMS9mnCf56iS1nM9YYHdH8ZxqZL9zyjSwW60IOQFsXZkilbBiv+1paMXBhSQnw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@iconify/types": "^2.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/cyberalien"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": ">=16"
|
||||
}
|
||||
},
|
||||
"node_modules/@iconify/types": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",
|
||||
"integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@img/sharp-darwin-arm64": {
|
||||
"version": "0.34.2",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.2.tgz",
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@
|
|||
"lint": "next lint"
|
||||
},
|
||||
"dependencies": {
|
||||
"@iconify/react": "^6.0.0",
|
||||
"@radix-ui/react-dropdown-menu": "^2.1.15",
|
||||
"@radix-ui/react-slot": "^1.2.3",
|
||||
"class-variance-authority": "^0.7.1",
|
||||
|
|
|
|||
|
|
@ -140,6 +140,12 @@
|
|||
}
|
||||
}
|
||||
|
||||
* {
|
||||
cursor: none;
|
||||
@media (min-width: 768px) {
|
||||
/* Tailwind's md breakpoint */
|
||||
* {
|
||||
cursor: none;
|
||||
}
|
||||
a:hover {
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,12 @@
|
|||
import type { Metadata } from "next";
|
||||
import { ThemeProvider } from "@/components/theme-provider";
|
||||
import { Geist, Geist_Mono, Space_Grotesk, Space_Mono } from "next/font/google";
|
||||
import {
|
||||
Geist,
|
||||
Geist_Mono,
|
||||
Space_Grotesk,
|
||||
Space_Mono,
|
||||
Inter,
|
||||
} from "next/font/google";
|
||||
import "./globals.css";
|
||||
|
||||
import { NavigationMenu } from "@/components/Navbar";
|
||||
|
|
@ -27,6 +33,11 @@ const spaceMono = Space_Mono({
|
|||
subsets: ["latin"],
|
||||
});
|
||||
|
||||
const interSans = Inter({
|
||||
variable: "--font-inter-sans",
|
||||
subsets: ["latin"],
|
||||
});
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Ameya Shenoy",
|
||||
description:
|
||||
|
|
@ -41,7 +52,7 @@ export default function RootLayout({
|
|||
return (
|
||||
<html lang="en" suppressHydrationWarning>
|
||||
<body
|
||||
className={`${geistSans.variable} ${geistMono.variable} ${spaceGroteskSans.variable} ${spaceMono.variable} antialiased`}
|
||||
className={`${geistSans.variable} ${geistMono.variable} ${spaceGroteskSans.variable} ${spaceMono.variable} ${interSans.variable} antialiased`}
|
||||
>
|
||||
<ThemeProvider
|
||||
attribute="class"
|
||||
|
|
@ -49,7 +60,7 @@ export default function RootLayout({
|
|||
enableSystem
|
||||
disableTransitionOnChange
|
||||
>
|
||||
<div className="min-h-screen">
|
||||
<div className="min-h-screen selection:bg-red-200 dark:selection:bg-red-900">
|
||||
<GSAPCursor />
|
||||
<NavigationMenu />
|
||||
{children}
|
||||
|
|
|
|||
|
|
@ -4,9 +4,11 @@ import { World } from "@/components/PhysicsSimulation";
|
|||
export default function Home() {
|
||||
return (
|
||||
<main className="flex flex-col items-center justify-start pt-15 h-screen">
|
||||
<World />
|
||||
<>
|
||||
<World />
|
||||
|
||||
<NameComponent />
|
||||
<NameComponent />
|
||||
</>
|
||||
</main>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,254 @@
|
|||
export default function Portfolio() {
|
||||
import { MapPin, Code, Briefcase, FileUser } from "lucide-react";
|
||||
import { headers } from "next/headers";
|
||||
import { Icon } from "@iconify/react";
|
||||
import Link from "next/link";
|
||||
|
||||
export default async function Portfolio() {
|
||||
const headersList = await headers();
|
||||
const ip = headersList.get("x-forwarded-for");
|
||||
|
||||
// Replace with your chosen IP geolocation API
|
||||
const response = await fetch(`https://ipapi.co/${ip}/json/`);
|
||||
const { country } = await response.json();
|
||||
let isIndianVisitor = false;
|
||||
if (country == "IN") {
|
||||
isIndianVisitor = true;
|
||||
}
|
||||
console.log(ip, isIndianVisitor);
|
||||
|
||||
const skillsLeft = {
|
||||
"Programming Languages": {
|
||||
Python: "vscode-icons:file-type-python",
|
||||
JavaScript: "vscode-icons:file-type-js-official",
|
||||
TypeScript: "vscode-icons:file-type-typescript-official",
|
||||
Golang: "material-icon-theme:go",
|
||||
},
|
||||
"Web Frameworks": {
|
||||
FastAPI: "devicon:fastapi",
|
||||
Django: "material-icon-theme:django",
|
||||
Flask: "simple-icons:flask",
|
||||
ReactJS: "material-icon-theme:react",
|
||||
"Next.js": "devicon:nextjs",
|
||||
},
|
||||
AI: {
|
||||
LangChain: "simple-icons:langchain",
|
||||
Livekit: null,
|
||||
ElevenLabs: "simple-icons:elevenlabs",
|
||||
Ollama: "simple-icons:ollama",
|
||||
vllm: null,
|
||||
},
|
||||
Databases: {
|
||||
Postgres: "devicon:postgresql",
|
||||
Redis: "devicon:redis",
|
||||
ClickHouse: "devicon:clickhouse",
|
||||
etcd: "logos:etcd",
|
||||
Meilisearch: "logos:meilisearch",
|
||||
Typesense: "logos:typesense-icon",
|
||||
qdrant: "logos:qdrant-icon",
|
||||
MySQL: "logos:mysql-icon",
|
||||
},
|
||||
};
|
||||
const skillsRight = {
|
||||
DevOps: {
|
||||
Kubernetes: "material-icon-theme:kubernetes",
|
||||
Ansible: "devicon:ansible",
|
||||
Docker: "material-icon-theme:docker",
|
||||
// Vagrant: "material-icon-theme:vagrant",
|
||||
// "VMware ESXi": "carbon:logo-vmware",
|
||||
Nomad: "devicon:nomad",
|
||||
Terraform: "material-icon-theme:terraform",
|
||||
Bash: "devicon:bash",
|
||||
// Packer: "devicon:packer",
|
||||
// "HashiCorp Vault": "devicon:vault",
|
||||
Jenkins: "material-icon-theme:jenkins",
|
||||
// KVM: "simple-icons:qemu",
|
||||
// Nagios: null,
|
||||
Prometheus: "devicon:prometheus",
|
||||
Grafana: "devicon:grafana",
|
||||
// InfluxDB: "devicon:influxdb",
|
||||
Sentry: "material-icon-theme:sentry",
|
||||
Kafka: "devicon:apachekafka",
|
||||
// Selenium: "devicon:selenium",
|
||||
},
|
||||
"Cloud Providers": {
|
||||
AWS: "logos:aws",
|
||||
"Microsoft Azure": "material-icon-theme:azure",
|
||||
"Google Cloud Platform GCP": "material-icon-theme:gcp",
|
||||
DigitalOcean: "devicon:digitalocean",
|
||||
// Scaleway: "simple-icons:scaleway",
|
||||
// Hetzner: "simple-icons:hetzner",
|
||||
Cloudflare: "devicon:cloudflare",
|
||||
},
|
||||
Robotics: {
|
||||
"Robot Operating System ROS": "devicon:ros",
|
||||
},
|
||||
"Spoken Languages": {
|
||||
English: null,
|
||||
Hindi: null,
|
||||
Marathi: null,
|
||||
Konkani: null,
|
||||
},
|
||||
};
|
||||
|
||||
const workExperience = [
|
||||
{
|
||||
company: "Grapevine",
|
||||
link: "https://grapevine.in",
|
||||
title: "1st Engineer / Engineering Lead / CTO",
|
||||
tenure: "May 2022 - Present",
|
||||
location: "Bengaluru",
|
||||
summary:
|
||||
"Led engineering teams from inception to $3M seed funding, architecting scalable Django/PostgreSQL/Kubernetes backend infrastructure supporting 600k+ users with 99.9% uptime. Built real-time Kafka/ClickHouse pipelines (1M+ events/day) boosting feature adoption 25%, and hybrid Qdrant/Meilisearch systems increasing engagement 80%. Created AI-driven interview platforms using LiveKit/ElevenLabs for personalized candidate experiences at scale.",
|
||||
},
|
||||
{
|
||||
company: "e-Yantra, IIT Bombay",
|
||||
link: "https://portal.e-yantra.org/",
|
||||
title: "Project Engineer",
|
||||
tenure: "Apr 2021 - Dec 2023",
|
||||
location: "Mumbai",
|
||||
summary:
|
||||
"Developed a modular drone platform using Raspberry Pi, NVIDIA Jetson AGX, ZED camera, GoPro, GPS, and optical flow sensors with ROS, enabling real-time video streaming, flight data aggregation, cloud photogrammetry, and autonomous navigation. Designed containerized simulation environments for secure robotics/AI testing and engineered GPU slicing frameworks for optimized ML resource distribution across virtual machines.",
|
||||
keyPoints: [
|
||||
"Developed a modular drone platform integrating Raspberry Pi, NVIDIA Jetson AGX, ZED stereo camera, GoPro, GPS, and optical flow sensors using ROS, enabling real-time video streaming, flight data aggregation, cloud-based photogrammetry, and autonomous navigation capabilities",
|
||||
"Designed and implemented a containerized simulation platform, enabling secure, isolated, and reproducible evaluation of robotics and AI workloads",
|
||||
"Engineered a GPU slicing and distribution framework for NVIDIA GPUs, optimizing resource utilization across multiple virtual machines for scalable machine learning training and browser-based remote Linux workstations",
|
||||
],
|
||||
},
|
||||
{
|
||||
company: "BrowserStack",
|
||||
link: "https://browserstack.com",
|
||||
title: "Cloud Infrastructure and Security Engineer",
|
||||
tenure: "May 2019 - Mar 2021",
|
||||
location: "Mumbai",
|
||||
summary:
|
||||
"Reduced AWS costs by 15% ($150k/year) via reserved instances, snapshots, and S3 lifecycle policies while ensuring 99.9% uptime SLA. Enhanced security with CIS Controls, 99.5% DMARC compliance, VPN deployment, and Cloudflare optimization for 3x faster page loads. Migrated critical systems with <0.1% downtime and established robust disaster recovery.",
|
||||
keyPoints: [
|
||||
"Reduced AWS costs by 15% on $1M annual bill through reserved EC2 instances optimization, snapshot management, and S3 lifecycle policies while maintaining 99.9% uptime SLA",
|
||||
"Enhanced security posture by implementing CIS Controls, improving DMARC rating to 99.54%, setting up VPN for data centers, and deploying Cloudflare to reduce page load times by 3x",
|
||||
"Orchestrated critical infrastructure migrations with <0.1% downtime, and executed disaster recovery planning for AWS",
|
||||
],
|
||||
},
|
||||
{
|
||||
company: "Frappe Technologies Pvt. Ltd. / ERPNext",
|
||||
link: "https://frappe.io/erpnext",
|
||||
title: "Software Engineer (Research and Development)",
|
||||
tenure: "Jun 2017 - Nov 2018",
|
||||
location: "Mumbai",
|
||||
summary:
|
||||
"Implemented email tracking pixels in outbound campaigns to monitor engagement and enable targeted follow-ups, boosting response rates by 18%. Developed the Bench Manager GUI for real-time monitoring of Frappe-hosted sites, presented at the ERPNext Conference, which streamlined system administration tasks through Socket.IO-powered live updates.",
|
||||
keyPoints: [
|
||||
"Implemented email tracking pixels in outbound campaigns, enabling email engagement tracking and allowing targeted follow-ups that boosted response rates by 18%",
|
||||
"Developed Bench Manager GUI for real-time monitoring of Frappe-hosted sites, presented at ERPNext Conference, streamlining system administration tasks and live updates through Socket.IO",
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
return (
|
||||
<main className="flex items-center justify-center h-screen">
|
||||
This is portfolio
|
||||
<main className="flex items-top justify-center md:pt-20 md:pb-0 pb-20 font-[family-name:var(--font-inter-sans)]">
|
||||
<div className="">
|
||||
<div className="p-5 uppercase tracking-[0.2em] text-gray-500 dark:text-gray-100 flex items-center justify-between">
|
||||
<div>About Me</div>
|
||||
<Link href="https://resume.codingcoffee.me">
|
||||
<div className="flex border-gray-200 border-2 p-2 ">
|
||||
Download
|
||||
<FileUser />
|
||||
</div>
|
||||
</Link>
|
||||
</div>
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 md:w-[40vw] w-[95vw] md:min-w-3xl md:gap-5 md:p-5">
|
||||
<div>
|
||||
<div>
|
||||
<div className="text-5xl md:text-6xl">Hi, I'm</div>
|
||||
<div className="text-5xl md:text-6xl text-red-500">
|
||||
Ameya Shenoy
|
||||
</div>
|
||||
</div>
|
||||
<div className="pb-5 text-gray-500 dark:text-gray-100 text-lg">
|
||||
<div className="flex items-center pt-5">
|
||||
<MapPin className="stroke-1 text-red-500" />
|
||||
<span className="pl-2">Based in India</span>
|
||||
</div>
|
||||
<div className="flex items-center pt-5">
|
||||
<Code className="stroke-1 text-red-500" />
|
||||
<span className="pl-2">
|
||||
Principal Engineer / Engineering Lead
|
||||
</span>
|
||||
</div>
|
||||
<div className="flex items-center pt-5">
|
||||
<Briefcase className="stroke-1 text-red-500" />
|
||||
<span className="pl-2">8+ years experience</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="md:text-2xl/10 text-xl/8">
|
||||
Engineering lead with 8+ years of expertise in designing scalable
|
||||
system architecture, leading high performing teams, and delivering
|
||||
ai driven solutions while also maintaining the role of an individual
|
||||
contributor.
|
||||
</div>
|
||||
</div>
|
||||
<div className="md:w-[40vw] w-[95vw] md:min-w-3xl md:p-5">
|
||||
<div className="text-3xl">Key Skills</div>
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 md:gap-5">
|
||||
<div>
|
||||
{Object.entries(skillsLeft).map(([topic, skillsMap]) => (
|
||||
<div key={topic}>
|
||||
<div className="text-xl pt-5 pb-3">{topic}</div>
|
||||
<div className="flex items-center flex-wrap gap-1">
|
||||
{Object.entries(skillsMap).map(([language, icon]) => (
|
||||
<span
|
||||
key={language}
|
||||
className="flex items-center gap-2 bg-red-50 dark:bg-red-900 px-3 py-1 rounded-full text-gray-700 dark:text-white"
|
||||
>
|
||||
<Icon icon={icon} className="inline-block" /> {language}
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
<div>
|
||||
{Object.entries(skillsRight).map(([topic, skillsMap]) => (
|
||||
<div key={topic}>
|
||||
<div className="text-xl pt-5 pb-3">{topic}</div>
|
||||
<div className="flex items-center flex-wrap gap-1">
|
||||
{Object.entries(skillsMap).map(([language, icon]) => (
|
||||
<span
|
||||
key={language}
|
||||
className="flex items-center gap-2 bg-red-50 dark:bg-red-900 px-3 py-1 rounded-full text-gray-700 dark:text-white"
|
||||
>
|
||||
<Icon icon={icon} className="inline-block" /> {language}
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="md:w-[40vw] w-[95vw] md:min-w-3xl md:gap-5 md:p-5">
|
||||
<div className="text-3xl">Work Experience</div>
|
||||
{workExperience.map((job, index) => (
|
||||
<div key={index} className="p-3">
|
||||
<div className="flex items-center justify-between">
|
||||
<Link
|
||||
href={job.link}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="text-xl hover:underline"
|
||||
>
|
||||
{job.company}
|
||||
</Link>
|
||||
<p className="text-xl">{job.tenure}</p>
|
||||
</div>
|
||||
<p className="text-2xl pt-2 text-red-500">{job.title}</p>
|
||||
<p className="pt-2 text-gray-500 dark:text-gray-100 text-justify">
|
||||
{job.summary}
|
||||
</p>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
"use client";
|
||||
|
||||
import { useRef, useEffect, FC, useState } from "react";
|
||||
import gsap from "gsap";
|
||||
|
||||
|
|
@ -50,7 +51,7 @@ const GSAPCursor: FC = () => {
|
|||
}}
|
||||
/>
|
||||
<div
|
||||
className="w-2 h-2 rounded-full bg-black dark:bg-white absolute pointer-events-none z-60"
|
||||
className="fixed w-2 h-2 rounded-full bg-black dark:bg-white pointer-events-none z-60"
|
||||
style={{
|
||||
left: `${position.x}px`,
|
||||
top: `${position.y}px`,
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ import {
|
|||
|
||||
export function NavigationMenu() {
|
||||
return (
|
||||
<div className="flex justify-center fixed left-1/2 -translate-x-1/2 -translate-y-1/2 bottom-5 md:top-10 md:bottom-auto z-20">
|
||||
<div className="flex justify-center fixed left-1/2 -translate-x-1/2 -translate-y-1/2 bottom-5 md:top-10 md:bottom-auto z-20 backdrop-blur-sm bg-white/20 outline-none rounded-lg border-1">
|
||||
<Link href="/">
|
||||
<Button variant="ghost">
|
||||
<div className="hidden md:inline">Home</div>
|
||||
|
|
@ -36,6 +36,7 @@ export function NavigationMenu() {
|
|||
</div>
|
||||
</Button>
|
||||
</Link>
|
||||
{/*
|
||||
<Link href="/talk">
|
||||
<Button variant="ghost">
|
||||
<div className="hidden md:inline">Talk</div>
|
||||
|
|
@ -52,6 +53,7 @@ export function NavigationMenu() {
|
|||
</div>
|
||||
</Button>
|
||||
</Link>
|
||||
*/}
|
||||
<ModeToggle />
|
||||
</div>
|
||||
);
|
||||
|
|
|
|||
Loading…
Reference in a new issue