[
  {
    "path": ".gitignore",
    "content": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pnp\n.pnp.*\n.yarn/*\n!.yarn/patches\n!.yarn/plugins\n!.yarn/releases\n!.yarn/versions\n\n# testing\n/coverage\n\n# next.js\n/.next/\n/out/\n\n# production\n/build\n\n# misc\n.DS_Store\n*.pem\n\n# debug\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n.pnpm-debug.log*\n\n# env files (can opt-in for committing if needed)\n.env*\n\n# vercel\n.vercel\n\n# typescript\n*.tsbuildinfo\nnext-env.d.ts\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2025 Avneesh Agarwal\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "<h1 align=\"center\">Portfolio</h1>\n<p>\n    <a href=\"https://github.com/avneesh0612/portfolio/blob/main/LICENSE\" target=\"_blank\">\n        <img alt=\"License: MIT\" src=\"https://img.shields.io/badge/License-MIT-yellow.svg\" />\n    </a>\n    <a href=\"https://X.com/avneesh0612\" target=\"_blank\">\n        <img alt=\"X: avneesh0612\" src=\"https://img.shields.io/twitter/follow/avneesh0612.svg?style=social\" />\n    </a>\n</p>\n\nA minimalistic SEO-friendly portfolio template built with Next.js and Tailwind CSS. Feel Free to fork it, update your details, and use it.\n\n![Portfolio Preview](https://avneesh.tech/about.png)\n\n## Links\n\n- [Live Demo](https://www.avneesh.tech/)\n- [Source Code](https://github.com/avneesh0612/portfolio)\n\n## Developer\n\n**Avneesh Agarwal**\n\n- Website: [avneesh.tech](https://www.avneesh.tech/)\n- GitHub: [@avneesh0612](https://github.com/avneesh0612)\n- X: [@avneesh0612](https://X.com/avneesh0612)\n- LinkedIn: [@avneesh0612](https://linkedin.com/in/avneesh0612)\n- Warpcast: [@avneesh0612](https://warpcast.com/avneesh)\n\n## License\n\n[MIT](https://github.com/avneesh0612/portfolio/blob/main/LICENSE) © 2025 Avneesh Agarwal\n"
  },
  {
    "path": "eslint.config.mjs",
    "content": "import { dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { FlatCompat } from \"@eslint/eslintrc\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nconst compat = new FlatCompat({\n  baseDirectory: __dirname,\n});\n\nconst eslintConfig = [\n  ...compat.extends(\"next/core-web-vitals\", \"next/typescript\"),\n];\n\nexport default eslintConfig;\n"
  },
  {
    "path": "next.config.ts",
    "content": "import type { NextConfig } from \"next\";\n\nconst nextConfig: NextConfig = {\n  /* config options here */\n};\n\nexport default nextConfig;\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"portfolio\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"next dev --turbopack\",\n    \"build\": \"next build\",\n    \"start\": \"next start\",\n    \"lint\": \"next lint\"\n  },\n  \"dependencies\": {\n    \"framer-motion\": \"^12.5.0\",\n    \"lucide-react\": \"^0.483.0\",\n    \"next\": \"15.2.3\",\n    \"react\": \"^19.0.0\",\n    \"react-dom\": \"^19.0.0\",\n    \"react-rough-notation\": \"^1.0.5\",\n    \"react-scroll\": \"^1.9.3\",\n    \"schema-dts\": \"^1.1.5\"\n  },\n  \"devDependencies\": {\n    \"@eslint/eslintrc\": \"^3.3.0\",\n    \"@tailwindcss/postcss\": \"^4.0.14\",\n    \"@types/node\": \"^20.17.24\",\n    \"@types/react\": \"^19.0.11\",\n    \"@types/react-dom\": \"^19.0.4\",\n    \"@types/react-scroll\": \"^1.8.10\",\n    \"eslint\": \"^9.22.0\",\n    \"eslint-config-next\": \"15.2.3\",\n    \"tailwindcss\": \"^4.0.14\",\n    \"typescript\": \"^5.8.2\"\n  }\n}\n"
  },
  {
    "path": "postcss.config.mjs",
    "content": "const config = {\n  plugins: [\"@tailwindcss/postcss\"],\n};\n\nexport default config;\n"
  },
  {
    "path": "public/robots.txt",
    "content": "User-agent: *\nDisallow:"
  },
  {
    "path": "public/rss.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<rss version=\"2.0\">\n    <channel>\n        <title>Avneesh Agarwal</title>\n        <link>https://avneesh.tech/</link>\n        <description>Hey, I'm Avneesh Agarwal — a developer based in India, passionate about\n            building powerful dev tools, contributing to open source, and sharing my learnings\n            through writing. Currently, I'm the CTO at Orcas, where we're reshaping equity\n            crowdfunding for startups. I've worked across multiple startups as a developer relations\n            engineer, full-stack developer, and technical writer, helping teams build, scale, and\n            engage with developer communities. When I'm not coding, you'll find me experimenting\n            with side projects, writing articles, or diving into something completely random—just\n            for the fun of it. Oh, and I'm also a sports enthusiast (fitness freak + nerd combo :p).</description>\n        <lastBuildDate>Thurs, 20 Mar 2025 12:00:00 GMT</lastBuildDate>\n        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>\n        <generator>https://github.com/jpmonette/feed</generator>\n        <language>en</language>\n        <image>\n            <title>Avneesh Agarwal</title>\n            <url>https://avneesh.tech/about.png</url>\n            <link>https://avneesh.tech/</link>\n        </image>\n        <copyright>All rights reserved, Avneesh Agarwal</copyright>\n        <category>Technology</category>\n        <category>Programming</category>\n        <category>Web Development</category>\n        <category>Web3 development</category>\n        <category>Blogger</category>\n        <category>Avneesh Agarwal</category>\n    </channel>\n</rss>"
  },
  {
    "path": "public/sitemap.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n    <url>\n        <loc>https://avneesh.tech/</loc>\n        <lastmod>2025-03-20</lastmod>\n        <priority>1.0</priority>\n    </url>\n</urlset>"
  },
  {
    "path": "src/app/globals.css",
    "content": "@import \"tailwindcss\";\n@config \"../../tailwind.config.ts\";\n\n:root {\n  --background: theme(\"colors.background.light\");\n  --foreground: theme(\"colors.foreground.light\");\n  --icon-color: theme(\"colors.neutral.900\");\n  --primary: theme(\"colors.primary.DEFAULT\");\n  --primary-hover: theme(\"colors.primary.hover\");\n  --accent-first: theme(\"colors.accent.first\");\n  --accent-second: theme(\"colors.accent.second\");\n  --accent-third: theme(\"colors.accent.third\");\n}\n\n:root.dark {\n  --background: theme(\"colors.background.dark\");\n  --foreground: theme(\"colors.foreground.dark\");\n  --icon-color: theme(\"colors.neutral.100\");\n}\n\n@theme inline {\n  --color-background: var(--background);\n  --color-foreground: var(--foreground);\n  --font-sans: var(--font-geist-sans);\n  --font-mono: var(--font-geist-mono);\n}\n\nbody {\n  background: var(--background);\n  color: var(--foreground);\n  transition: background-color 0.3s ease, color 0.3s ease;\n}\n\n@font-face {\n  font-family: \"Geomanist\";\n  src: url(\"/fonts/Geomanist-Regular.otf\") format(\"opentype\");\n  font-weight: 400;\n  font-style: normal;\n  font-display: swap;\n}\n\n@font-face {\n  font-family: \"Geomanist\";\n  src: url(\"/fonts/Geomanist-Regular-Italic.otf\") format(\"opentype\");\n  font-weight: 400;\n  font-style: italic;\n  font-display: swap;\n}\n"
  },
  {
    "path": "src/app/layout.tsx",
    "content": "import { Footer, Header } from \"@/components\";\nimport { ThemeProvider } from \"@/components/theme-provider\";\nimport { personalData } from \"@/data\";\nimport type { Metadata, Viewport } from \"next\";\nimport \"./globals.css\";\n\nexport const viewport: Viewport = {\n  themeColor: \"#0A0A0A\",\n  width: \"device-width\",\n  initialScale: 1,\n  maximumScale: 5,\n};\n\nexport const metadata: Metadata = {\n  metadataBase: new URL(personalData.site),\n  title: {\n    template: `%s | ${personalData.name}`,\n    default: `${personalData.name} | ${personalData.designation}`,\n  },\n  description: personalData.metaDescription,\n  authors: [{ name: personalData.name, url: personalData.site }],\n  keywords: personalData.keywords,\n  referrer: \"no-referrer-when-downgrade\",\n  alternates: {\n    canonical: personalData.site,\n    languages: {\n      \"en-US\": personalData.site,\n    },\n  },\n  openGraph: {\n    title: `${personalData.name} | ${personalData.designation}`,\n    description: personalData.metaDescription,\n    url: personalData.site,\n    siteName: personalData.name,\n    images: [\n      {\n        url: \"/about.png\",\n        width: 1200,\n        height: 630,\n        alt: `${personalData.name} - ${personalData.designation}`,\n      },\n    ],\n    type: \"website\",\n    locale: \"en-US\",\n  },\n  twitter: {\n    card: \"summary_large_image\",\n    title: `${personalData.name} | ${personalData.designation}`,\n    description: personalData.metaDescription,\n    creator: `@${personalData.x}`,\n    images: [\"/about.png\"],\n  },\n  icons: {\n    icon: \"/favicon.ico\",\n    apple: \"/apple-touch-icon.png\",\n    shortcut: \"/favicon.ico\",\n  },\n  manifest: \"/site.webmanifest\",\n  robots: {\n    index: true,\n    follow: true,\n    nocache: true,\n    googleBot: {\n      index: true,\n      follow: true,\n      nocache: true,\n      \"max-snippet\": -1,\n      \"max-image-preview\": \"large\",\n      \"max-video-preview\": -1,\n    },\n  },\n  category: \"website\",\n};\n\nexport default function RootLayout({\n  children,\n}: Readonly<{\n  children: React.ReactNode;\n}>) {\n  return (\n    <html lang=\"en\" suppressHydrationWarning>\n      <body className=\"antialiased font-geomanist\">\n        <ThemeProvider>\n          <Header />\n          {children}\n          <Footer />\n        </ThemeProvider>\n      </body>\n    </html>\n  );\n}\n"
  },
  {
    "path": "src/app/page.tsx",
    "content": "import { Hero, Main } from \"@/components\";\nimport { personalData, socialLinks } from \"@/data\";\nimport getUserDataAndPosts from \"@/utils/getPosts\";\nimport { WebSite, WithContext } from \"schema-dts\";\n\nasync function getPosts() {\n  const Posts = await getUserDataAndPosts(\"avneesh0612\");\n  return Posts;\n}\n\nconst jsonLd: WithContext<WebSite> = {\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"WebSite\",\n  name: personalData.name,\n  url: personalData.site,\n  description: personalData.shorterDesc,\n  image: `${personalData.site}/about.png`,\n  author: {\n    \"@type\": \"Person\",\n    name: personalData.name,\n    url: personalData.site,\n  },\n  sameAs: socialLinks.map((link) => link.link),\n  potentialAction: {\n    \"@type\": \"SearchAction\",\n    target: `${personalData.site}/search?q={search_term_string}`,\n  },\n  mainEntityOfPage: {\n    \"@type\": \"WebPage\",\n    \"@id\": personalData.site,\n  },\n};\n\nexport default async function Home() {\n  const posts = await getPosts();\n\n  return (\n    <div className=\"flex flex-col px-0 pt-8 md:px-8 lg:px-18\">\n      <script\n        type=\"application/ld+json\"\n        dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}\n      />\n      <Hero />\n      <Main posts={posts} />\n    </div>\n  );\n}\n"
  },
  {
    "path": "src/components/Blog.tsx",
    "content": "import { personalData } from \"@/data\";\nimport { PostType } from \"@/types/PostType\";\nimport type { FC } from \"react\";\n\ninterface PostsType {\n  posts: PostType[];\n}\n\nexport const Blog: FC<PostsType> = ({ posts }) => {\n  return (\n    <section className=\"py-12 px-4\" id=\"blog\" aria-labelledby=\"blog-heading\">\n      <h2 id=\"blog-heading\" className=\"text-4xl font-light text-center mb-8\">\n        Latest Blog Posts\n      </h2>\n      <div className=\"max-w-4xl mx-auto space-y-8 md:space-y-8 px-4 md:px-0 pt-6\">\n        {posts.map((post) => (\n          <article\n            key={post.data.post.slug}\n            className=\"block border-l-4 border-neutral-700 pl-4 md:pl-4 hover:border-neutral-900 dark:hover:border-neutral-300 transition-all duration-200\"\n          >\n            <a\n              href={`${personalData.blog}/${post.data.post.slug}`}\n              className=\"block pb-6 focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 dark:focus:ring-offset-background-dark rounded-md p-2\"\n              aria-label={`Read ${post.data.post.title}`}\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n            >\n              <h3 className=\"text-2xl font-medium text-neutral-900 group-hover:text-neutral-600 dark:text-neutral-100 dark:group-hover:text-neutral-300 transition-colors\">\n                {post.data.post.title}\n                <span className=\"text-lg text-neutral-400 ml-2\">\n                  ({post.data.post.readTimeInMinutes} min read)\n                </span>\n              </h3>\n              <p className=\"text-neutral-500 text-sm mt-3 line-clamp-2\">\n                {post.data.post.brief}\n              </p>\n              <div className=\"text-neutral-400 text-sm mt-3 flex items-center gap-4\">\n                <span\n                  className=\"flex items-center gap-1\"\n                  title=\"Reactions\"\n                  aria-label={`${post.data.post.reactionCount} reactions`}\n                >\n                  <span aria-hidden=\"true\">❤️</span>\n                  {post.data.post.reactionCount}\n                </span>\n                <span\n                  className=\"flex items-center gap-1\"\n                  title=\"Comments\"\n                  aria-label={`${\n                    post.data.post.replyCount + post.data.post.responseCount\n                  } comments`}\n                >\n                  <span aria-hidden=\"true\">💬</span>\n                  {post.data.post.replyCount + post.data.post.responseCount}\n                </span>\n              </div>\n            </a>\n          </article>\n        ))}\n      </div>\n    </section>\n  );\n};\n"
  },
  {
    "path": "src/components/Contact.tsx",
    "content": "import { socialLinks } from \"@/data\";\nimport type { FC } from \"react\";\n\nexport const Contact: FC = () => {\n  return (\n    <section\n      className=\"py-8 sm:py-12\"\n      id=\"contact\"\n      aria-labelledby=\"contact-heading\"\n    >\n      <h2\n        id=\"contact-heading\"\n        className=\"text-4xl sm:text-4xl font-light text-center mb-8 sm:mb-8 px-4\"\n      >\n        Get in Touch\n      </h2>\n\n      <div\n        className=\"flex justify-center flex-wrap gap-2 sm:gap-4 px-4 mb-6 sm:mb-8\"\n        role=\"list\"\n        aria-label=\"Social media links\"\n      >\n        {socialLinks.map(({ link, Icon, name }, index) => (\n          <a\n            key={index}\n            href={link}\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            className=\"hover:opacity-80 transition focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 dark:focus:ring-offset-background-dark p-2 rounded-md\"\n            aria-label={`Connect on ${name}`}\n            title={`Connect on ${name}`}\n            role=\"listitem\"\n          >\n            <Icon className=\"w-6 h-6 sm:w-8 sm:h-8 text-neutral-900 dark:text-neutral-100\" />\n          </a>\n        ))}\n      </div>\n    </section>\n  );\n};\n"
  },
  {
    "path": "src/components/Footer.tsx",
    "content": "import { personalData } from \"@/data\";\nimport type { FC } from \"react\";\n\nexport const Footer: FC = () => {\n  const currentYear = new Date().getFullYear();\n\n  return (\n    <footer\n      className=\"w-full bg-neutral-100 dark:bg-neutral-900 text-neutral-900 dark:text-neutral-100 text-center shadow-sm mx-auto\"\n      role=\"contentinfo\"\n      aria-label=\"Site footer\"\n    >\n      <p className=\"text-neutral-600 dark:text-neutral-400 text-sm py-4\">\n        © {currentYear} {personalData.name}. All rights reserved.\n      </p>\n    </footer>\n  );\n};\n"
  },
  {
    "path": "src/components/Header.tsx",
    "content": "\"use client\";\n\nimport { navLinks } from \"@/data\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { MenuIcon, X } from \"lucide-react\";\nimport { FC, useState } from \"react\";\nimport { Link } from \"react-scroll\";\nimport Logo from \"./Icons/Logo\";\nimport { ThemeToggle } from \"./theme-toggle\";\n\nexport const Header: FC = () => {\n  const [isMenuOpen, setIsMenuOpen] = useState(false);\n\n  return (\n    <header className=\"w-full py-4 px-4 sm:px-16 bg-background-light/70 dark:bg-background-dark/70 backdrop-blur-md fixed top-0 z-50 flex justify-between items-center box-border\">\n      <Link\n        href=\"/\"\n        className=\"text-2xl font-bold text-neutral-900 hover:text-neutral-600 dark:text-neutral-100 dark:hover:text-neutral-400 transition\"\n        to=\"home\"\n      >\n        <Logo width={60} height={40} />\n      </Link>\n\n      {/* Desktop Navigation */}\n      <nav className=\"hidden md:flex items-center space-x-6\">\n        {navLinks.map((link) => (\n          <Link\n            key={link.href}\n            href={link.href}\n            className=\"text-neutral-900 hover:text-neutral-600 dark:text-neutral-100 dark:hover:text-neutral-400 transition\"\n            to={link.href.replace(\"#\", \"\")}\n            spy={true}\n            smooth={true}\n            offset={-70}\n            duration={500}\n            onClick={() => setIsMenuOpen(false)}\n            onSetActive={() => setIsMenuOpen(false)}\n            onSetInactive={() => setIsMenuOpen(false)}\n          >\n            {link.label}\n          </Link>\n        ))}\n        <ThemeToggle />\n      </nav>\n\n      {/* Mobile Navigation Button */}\n      <div className=\"md:hidden flex items-center space-x-4\">\n        <ThemeToggle />\n        <motion.button\n          className=\"focus:outline-none\"\n          onClick={() => setIsMenuOpen(!isMenuOpen)}\n          aria-label=\"Toggle menu\"\n          aria-expanded={isMenuOpen}\n          whileTap={{ scale: 0.95 }}\n        >\n          {isMenuOpen ? (\n            <X className=\"w-6 h-6 text-neutral-900 dark:text-neutral-100\" />\n          ) : (\n            <MenuIcon className=\"w-6 h-6 text-neutral-900 dark:text-neutral-100\" />\n          )}\n        </motion.button>\n      </div>\n\n      {/* Mobile Navigation Menu */}\n      <AnimatePresence>\n        {isMenuOpen && (\n          <motion.nav\n            className=\"md:hidden absolute top-16 left-0 right-0 bg-background-light dark:bg-background-dark p-4\"\n            initial={{ opacity: 0, y: -20 }}\n            animate={{ opacity: 1, y: 0 }}\n            exit={{ opacity: 0, y: -20 }}\n            transition={{ duration: 0.2 }}\n          >\n            {navLinks.map((link, index) => (\n              <motion.div\n                key={link.href}\n                initial={{ opacity: 0, x: -20 }}\n                animate={{ opacity: 1, x: 0 }}\n                transition={{ delay: index * 0.1 }}\n              >\n                <Link\n                  href={link.href}\n                  className=\"block py-2 text-neutral-900 hover:text-neutral-600 dark:text-neutral-400 dark:hover:text-neutral-200 transition\"\n                  onClick={() => setIsMenuOpen(false)}\n                  to={link.href.replace(\"#\", \"\")}\n                  spy={true}\n                  smooth={true}\n                  offset={-70}\n                  duration={500}\n                  onSetActive={() => setIsMenuOpen(false)}\n                  onSetInactive={() => setIsMenuOpen(false)}\n                >\n                  {link.label}\n                </Link>\n              </motion.div>\n            ))}\n          </motion.nav>\n        )}\n      </AnimatePresence>\n    </header>\n  );\n};\n"
  },
  {
    "path": "src/components/Hero.tsx",
    "content": "import { personalData } from \"@/data\";\nimport Image from \"next/image\";\nimport type { FC } from \"react\";\nimport { RoughNotation, RoughNotationGroup } from \"react-rough-notation\";\nimport { Download } from \"lucide-react\";\n\nexport const Hero: FC = () => {\n  return (\n    <section\n      className=\"flex w-full flex-col-reverse md:flex-row items-center justify-between pt-4 md:pt-0 gap-4 md:min-h-screen px-2 md:px-0\"\n      id=\"home\"\n    >\n      <div className=\"flex flex-col px-4 md:px-0\">\n        <RoughNotationGroup show>\n          <div>\n            <h1 className=\"text-3xl md:text-4xl lg:text-5xl font-bold text-neutral-900 dark:text-neutral-100\">\n              Hey, I&apos;m{\" \"}\n              <RoughNotation\n                type=\"highlight\"\n                color=\"var(--accent-first)\"\n                order=\"1\"\n                multiline\n              >\n                {personalData.name}\n              </RoughNotation>\n            </h1>\n            <p className=\"text-lg md:text-xl lg:text-2xl font-light leading-relaxed text-neutral-900 dark:text-neutral-100 md:flex-2/3\">\n              — a high school student and developer based in India, passionate\n              about building powerful dev tools, contributing to open source,\n              and sharing my learnings through writing. Currently, I&apos;m the{\" \"}\n              <RoughNotation\n                type=\"underline\"\n                color=\"var(--accent-second)\"\n                order=\"2\"\n                multiline\n              >\n                CTO at Orcas\n              </RoughNotation>\n              , where we&apos;re reshaping equity crowdfunding for startups.\n              I&apos;ve worked across multiple startups as a{\" \"}\n              <RoughNotation\n                type=\"highlight\"\n                color=\"var(--primary)\"\n                order=\"3\"\n                multiline\n              >\n                developer relations engineer, full-stack developer, and\n                technical writer\n              </RoughNotation>\n              , helping teams build, scale, and engage with developer\n              communities. When I&apos;m not coding, you&apos;ll find me\n              experimenting with side projects, writing articles, or diving into\n              something completely random—just for the fun of it. Oh, and\n              I&apos;m also a sports enthusiast{\" \"}\n              <RoughNotation\n                type=\"bracket\"\n                color=\"var(--accent-third)\"\n                order=\"5\"\n                brackets={[\"left\", \"right\"]}\n                multiline\n              >\n                fitness freak + nerd :p.\n              </RoughNotation>{\" \"}\n              Got a startup that needs someone like me?{\" \"}\n              <RoughNotation\n                type=\"underline\"\n                color=\"var(--primary)\"\n                order=\"6\"\n                iterations={6}\n                multiline\n              >\n                <a\n                  href={`mailto:${personalData.email}`}\n                  className=\"text-primary hover:text-primary-hover dark:text-primary/90 dark:hover:text-primary-hover/90\"\n                >\n                  Let&apos;s talk!\n                </a>\n              </RoughNotation>\n            </p>\n          </div>\n        </RoughNotationGroup>\n\n        <div className=\"mt-8 flex items-center gap-4\">\n          <a\n            href=\"/CV.pdf\"\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            className=\"flex items-center gap-2 px-4 py-2 rounded-md border border-neutral-300 dark:border-neutral-700 text-neutral-900 dark:text-neutral-100 hover:bg-neutral-100 dark:hover:bg-neutral-800 transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-neutral-300 focus:ring-offset-2 dark:focus:ring-offset-background-dark\"\n            aria-label=\"Download my CV\"\n          >\n            <Download className=\"h-4 w-4\" />\n            Download CV\n          </a>\n        </div>\n      </div>\n\n      <Image\n        src=\"/pfp.png\"\n        alt={personalData.name}\n        width={300}\n        height={300}\n        className=\"size-[90%] md:size-[300px] mb-4 p-4 md:p-10 md:m-10 border-2 border-neutral-200 dark:border-neutral-200/20 shadow-lg shadow-neutral-200/50 dark:shadow-neutral-200/10 hover:shadow-neutral-300/50 dark:hover:shadow-neutral-200/20 transition-all duration-200 mt-10 md:mt-0\"\n        priority\n      />\n    </section>\n  );\n};\n"
  },
  {
    "path": "src/components/Icons/CrossIcon.tsx",
    "content": "import React from \"react\";\n\nexport const CrossIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (\n  <svg\n    fill=\"var(--icon-color)\"\n    width=\"24\"\n    height=\"24\"\n    version=\"1.1\"\n    id=\"Capa_1\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n    viewBox=\"0 0 490 490\"\n    xmlSpace=\"preserve\"\n    {...props}\n  >\n    <polygon\n      points=\"456.851,0 245,212.564 33.149,0 0.708,32.337 212.669,245.004 0.708,457.678 33.149,490 245,277.443 456.851,490 \n            489.292,457.678 277.331,245.004 489.292,32.337 \"\n    />\n  </svg>\n);\n"
  },
  {
    "path": "src/components/Icons/FarcasterIcon.tsx",
    "content": "import React from \"react\";\n\nexport const FarcasterIcon: React.FC<React.SVGProps<SVGSVGElement>> = (\n  props\n) => (\n  <svg\n    viewBox=\"0 0 752 690\"\n    fill=\"var(--icon-color)\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    {...props}\n  >\n    <path\n      d=\"M129.778 0.556H614.222V689.444H543.111V373.889H542.414C534.554 286.677 461.258 218.333 372 218.333C282.742 218.333 209.446 286.677 201.586 373.889H200.889V689.444H129.778V0.556Z\"\n      fill=\"var(--icon-color)\"\n    />\n    <path\n      d=\"M0.888672 98.333L29.7777 196.111H54.2217V591.667C41.9487 591.667 31.9997 601.616 31.9997 613.889V640.556H27.5557C15.2827 640.556 5.33266 650.505 5.33266 662.778V689.444H254.222V662.778C254.222 650.505 244.273 640.556 232 640.556H227.556V613.889C227.556 601.616 217.606 591.667 205.333 591.667H178.667V98.333H0.888672Z\"\n      fill=\"var(--icon-color)\"\n    />\n    <path\n      d=\"M547.556 591.667C535.283 591.667 525.333 601.616 525.333 613.889V640.556H520.889C508.616 640.556 498.667 650.505 498.667 662.778V689.444H747.556V662.778C747.556 650.505 737.606 640.556 725.333 640.556H720.889V613.889C720.889 601.616 710.94 591.667 698.667 591.667V196.111H723.111L752 98.333H574.222V591.667H547.556Z\"\n      fill=\"var(--icon-color)\"\n    />\n  </svg>\n);\n"
  },
  {
    "path": "src/components/Icons/GithubIcon.tsx",
    "content": "import React from \"react\";\n\nexport const GithubIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    fill=\"none\"\n    {...props}\n    viewBox=\"0 0 24 24\"\n  >\n    <g clipPath=\"url(#prefix__clip0)\">\n      <path\n        stroke=\"var(--icon-color)\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n        strokeWidth=\"2\"\n        d=\"M16 22v-3.87a3.37 3.37 0 00-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0020 4.77 5.07 5.07 0 0019.91 1S18.73.65 16 2.48a13.38 13.38 0 00-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 005 4.77a5.44 5.44 0 00-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 009 18.13V22m0-3c-5 1.5-5-2.5-7-3l7 3z\"\n      />\n    </g>\n    <defs>\n      <clipPath id=\"prefix__clip0\">\n        <path fill=\"#fff\" d=\"M0 0h24v24H0z\" />\n      </clipPath>\n    </defs>\n  </svg>\n);\n"
  },
  {
    "path": "src/components/Icons/LinkedInIcon.tsx",
    "content": "import React from \"react\";\n\nexport const LinkedInIcon: React.FC<React.SVGProps<SVGSVGElement>> = (\n  props\n) => (\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    fill=\"none\"\n    viewBox=\"0 0 24 24\"\n    {...props}\n  >\n    <path\n      stroke=\"var(--icon-color)\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n      strokeWidth=\"2\"\n      d=\"M16 8a6 6 0 016 6v7h-4v-7a2 2 0 00-4 0v7h-4v-7a6 6 0 016-6v0zM6 9H2v12h4V9zM4 6a2 2 0 100-4 2 2 0 000 4z\"\n    />\n  </svg>\n);\n"
  },
  {
    "path": "src/components/Icons/Logo.tsx",
    "content": "import React from \"react\";\n\nconst Logo: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (\n  <svg\n    width=\"24\"\n    height=\"24\"\n    viewBox=\"0 0 460 269\"\n    fill=\"var(--icon-color)\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    {...props}\n  >\n    <path\n      fillRule=\"evenodd\"\n      clipRule=\"evenodd\"\n      d=\"M0 269L459.239 55.6309L210.543 145.063L134.239 0L0 269ZM200.652 230.27V237.312H254.348L240.217 209.144L200.652 230.27ZM130 87.3194L90.4347 183.089L163.913 153.513L130 87.3194Z\"\n      fill=\"var(--icon-color)\"\n    />\n  </svg>\n);\n\nexport default Logo;\n"
  },
  {
    "path": "src/components/Icons/MailIcon.tsx",
    "content": "import React from \"react\";\n\nexport const MailIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    fill=\"none\"\n    {...props}\n    viewBox=\"0 0 24 24\"\n  >\n    <path\n      stroke=\"var(--icon-color)\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n      strokeWidth=\"2\"\n      d=\"M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z\"\n    />\n    <path\n      stroke=\"var(--icon-color)\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n      strokeWidth=\"2\"\n      d=\"M22 6l-10 7L2 6\"\n    />\n  </svg>\n);\n"
  },
  {
    "path": "src/components/Icons/MenuIcon.tsx",
    "content": "import React from \"react\";\n\nexport const MenuIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (\n  <svg\n    width=\"24\"\n    height=\"24\"\n    viewBox=\"0 0 24 24\"\n    fill=\"none\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    {...props}\n  >\n    <path\n      d=\"M4 18L20 18\"\n      stroke=\"var(--icon-color)\"\n      strokeWidth=\"2\"\n      strokeLinecap=\"round\"\n    />\n    <path\n      d=\"M4 12L20 12\"\n      stroke=\"var(--icon-color)\"\n      strokeWidth=\"2\"\n      strokeLinecap=\"round\"\n    />\n    <path\n      d=\"M4 6L20 6\"\n      stroke=\"var(--icon-color)\"\n      strokeWidth=\"2\"\n      strokeLinecap=\"round\"\n    />\n  </svg>\n);\n"
  },
  {
    "path": "src/components/Icons/VisitIcon.tsx",
    "content": "import React from \"react\";\n\nexport const VisitIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (\n  <svg\n    className=\"icon\"\n    stroke=\"var(--icon-color)\"\n    fill=\"none\"\n    height=\"24\"\n    viewBox=\"0 0 24 24\"\n    width=\"24\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    {...props}\n  >\n    <path\n      d=\"M18 13V19C18 19.5304 17.7893 20.0391 17.4142 20.4142C17.0391 20.7893 16.5304 21 16 21H5C4.46957 21 3.96086 20.7893 3.58579 20.4142C3.21071 20.0391 3 19.5304 3 19V8C3 7.46957 3.21071 6.96086 3.58579 6.58579C3.96086 6.21071 4.46957 6 5 6H11\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n      strokeWidth=\"2\"\n    />\n    <path\n      d=\"M15 3H21V9\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n      strokeWidth=\"2\"\n    />\n    <path\n      d=\"M10 14L21 3\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n      strokeWidth=\"2\"\n    />\n  </svg>\n);\n"
  },
  {
    "path": "src/components/Icons/XIcon.tsx",
    "content": "import React from \"react\";\n\nexport const XIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    viewBox=\"0 0 50 50\"\n    width=\"24\"\n    height=\"24\"\n    {...props}\n  >\n    <path\n      fill=\"var(--icon-color)\"\n      d=\"M 5.9199219 6 L 20.582031 27.375 L 6.2304688 44 L 9.4101562 44 L 21.986328 29.421875 L 31.986328 44 L 44 44 L 28.681641 21.669922 L 42.199219 6 L 39.029297 6 L 27.275391 19.617188 L 17.933594 6 L 5.9199219 6 z M 9.7167969 8 L 16.880859 8 L 40.203125 42 L 33.039062 42 L 9.7167969 8 z\"\n    />\n  </svg>\n);\n"
  },
  {
    "path": "src/components/Icons/index.ts",
    "content": "export { GithubIcon } from \"./GithubIcon\";\nexport { VisitIcon } from \"./VisitIcon\";\nexport { MailIcon } from \"./MailIcon\";\nexport { FarcasterIcon } from \"./FarcasterIcon\";\nexport { XIcon } from \"./XIcon\";\nexport { LinkedInIcon } from \"./LinkedInIcon\";\n"
  },
  {
    "path": "src/components/Main.tsx",
    "content": "\"use client\";\n\nimport { Contact, Projects, Work } from \"@/components\";\nimport { motion } from \"framer-motion\";\nimport type { FC } from \"react\";\nimport { Blog } from \"./Blog\";\nimport { PostType } from \"@/types/PostType\";\n\ninterface MainProps {\n  posts: PostType[];\n}\n\nexport const Main: FC<MainProps> = ({ posts }) => {\n  return (\n    <>\n      <motion.div\n        initial={{ opacity: 0, y: 50 }}\n        whileInView={{ opacity: 1, y: 0 }}\n        transition={{ duration: 0.6, ease: \"easeOut\", delay: 0.2 }}\n        viewport={{ once: true }}\n      >\n        <Work />\n      </motion.div>\n\n      <motion.div\n        initial={{ opacity: 0, y: 50 }}\n        whileInView={{ opacity: 1, y: 0 }}\n        transition={{ duration: 0.6, ease: \"easeOut\", delay: 0.4 }}\n        viewport={{ once: true }}\n      >\n        <Projects />\n      </motion.div>\n\n      <motion.div\n        initial={{ opacity: 0, y: 50 }}\n        whileInView={{ opacity: 1, y: 0 }}\n        transition={{ duration: 0.6, ease: \"easeOut\", delay: 0.4 }}\n        viewport={{ once: true }}\n      >\n        <Blog posts={posts} />\n      </motion.div>\n\n      <Contact />\n    </>\n  );\n};\n"
  },
  {
    "path": "src/components/Projects.tsx",
    "content": "import { projects } from \"@/data\";\nimport type { FC } from \"react\";\nimport { GithubIcon, VisitIcon } from \"./Icons\";\n\nexport const Projects: FC = () => {\n  return (\n    <section className=\"py-12 px-6 md:py-12 mt-8\" id=\"projects\">\n      <h2 className=\"text-4xl font-light text-center mb-6 md:mb-8\">Projects</h2>\n      <div className=\"max-w-4xl mx-auto space-y-8 md:space-y-8 px-4 md:px-0 pt-6\">\n        {projects.map((project, index) => (\n          <div\n            key={index}\n            className=\"block border-l-4 border-neutral-700 pl-4 md:pl-4 hover:border-neutral-900 dark:hover:border-neutral-300 transition-all duration-200\"\n          >\n            <div className=\"flex flex-col md:flex-row md:justify-between md:items-center gap-1 w-[90%] md:w-full\">\n              <h3 className=\"text-xl md:text-2xl font-medium text-neutral-900 dark:text-neutral-100\">\n                {project.title}\n              </h3>\n              <span className=\"text-neutral-400 text-xs md:text-sm\">\n                {project.timeline}\n              </span>\n            </div>\n            <p className=\"text-neutral-500 text-base md:text-lg\">\n              {project.description}\n            </p>\n            <div className=\"mt-2 text-xs md:text-sm text-neutral-400 flex space-x-4\">\n              <a\n                href={project.url}\n                target=\"_blank\"\n                rel=\"noopener noreferrer\"\n                className=\"hover:text-neutral-900 dark:hover:text-neutral-100 transition flex items-center gap-1\"\n              >\n                Live{\" \"}\n                <VisitIcon className=\"h-4 w-4 text-neutral-600 dark:text-neutral-400\" />\n              </a>\n              <a\n                href={project.github}\n                target=\"_blank\"\n                rel=\"noopener noreferrer\"\n                className=\"hover:text-neutral-900 dark:hover:text-neutral-100 transition flex items-center gap-1\"\n              >\n                GitHub{\" \"}\n                <GithubIcon className=\"h-4 w-4 text-neutral-600 dark:text-neutral-400\" />\n              </a>\n            </div>\n          </div>\n        ))}\n      </div>\n    </section>\n  );\n};\n"
  },
  {
    "path": "src/components/Work.tsx",
    "content": "import { work } from \"@/data\";\nimport type { FC } from \"react\";\n\nexport const Work: FC = () => {\n  return (\n    <section className=\"py-12 px-6 md:py-12 mt-8\" id=\"work\">\n      <h2 className=\"text-4xl font-light text-center mb-4 md:mb-8\">\n        Work Experience\n      </h2>\n      <div className=\"max-w-4xl mx-auto space-y-8 md:space-y-8 px-4 md:px-0 pt-6\">\n        {work.map((item, index) => (\n          <a\n            key={index}\n            href={item.url}\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            className=\"block border-l-4 border-neutral-700 pl-4 md:pl-4 hover:border-neutral-900 dark:hover:border-neutral-300 transition-all duration-200\"\n          >\n            <div className=\"flex flex-col md:flex-row md:justify-between md:items-center gap-1 w-[90%] md:w-full\">\n              <h3 className=\"text-xl md:text-2xl font-medium text-neutral-900 dark:text-neutral-100\">\n                {item.title}\n              </h3>\n              <span className=\"text-neutral-400 text-xs md:text-sm\">\n                {item.timeline}\n              </span>\n            </div>\n            <p className=\"text-neutral-500 text-base md:text-lg\">{item.role}</p>\n            <p className=\"text-neutral-400 text-xs md:text-sm mt-2\">\n              {item.description}\n            </p>\n          </a>\n        ))}\n      </div>\n    </section>\n  );\n};\n"
  },
  {
    "path": "src/components/index.ts",
    "content": "export { Contact } from \"./Contact\";\nexport { Footer } from \"./Footer\";\nexport { Header } from \"./Header\";\nexport { Hero } from \"./Hero\";\nexport { Projects } from \"./Projects\";\nexport { Work } from \"./Work\";\nexport { Main } from \"./Main\";\n"
  },
  {
    "path": "src/components/theme-provider.tsx",
    "content": "\"use client\";\n\nimport { createContext, useContext, useEffect, useState } from \"react\";\n\ntype Theme = \"dark\" | \"light\";\n\ntype ThemeProviderProps = {\n  children: React.ReactNode;\n};\n\ntype ThemeProviderState = {\n  theme: Theme;\n  setTheme: (theme: Theme) => void;\n};\n\nconst initialState: ThemeProviderState = {\n  theme: \"dark\",\n  setTheme: () => null,\n};\n\nconst ThemeProviderContext = createContext<ThemeProviderState>(initialState);\n\nexport function ThemeProvider({ children }: ThemeProviderProps) {\n  const [theme, setTheme] = useState<Theme>(\"dark\");\n\n  useEffect(() => {\n    // Check for saved theme preference\n    const savedTheme = localStorage.getItem(\"theme\") as Theme | null;\n\n    // Check system preference\n    const systemTheme = window.matchMedia(\"(prefers-color-scheme: dark)\")\n      .matches\n      ? \"dark\"\n      : \"light\";\n\n    // Use saved theme if it exists, otherwise use system preference\n    const initialTheme = savedTheme || systemTheme;\n    setTheme(initialTheme);\n\n    // Listen for system theme changes\n    const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n    const handleChange = (e: MediaQueryListEvent) => {\n      // Only update if there's no saved preference\n      if (!localStorage.getItem(\"theme\")) {\n        setTheme(e.matches ? \"dark\" : \"light\");\n      }\n    };\n\n    mediaQuery.addEventListener(\"change\", handleChange);\n\n    return () => {\n      mediaQuery.removeEventListener(\"change\", handleChange);\n    };\n  }, []);\n\n  useEffect(() => {\n    const root = window.document.documentElement;\n    root.classList.remove(\"light\", \"dark\");\n    root.classList.add(theme);\n  }, [theme]);\n\n  const value = {\n    theme,\n    setTheme: (theme: Theme) => {\n      localStorage.setItem(\"theme\", theme);\n      setTheme(theme);\n    },\n  };\n\n  return (\n    <ThemeProviderContext.Provider value={value}>\n      {children}\n    </ThemeProviderContext.Provider>\n  );\n}\n\nexport const useTheme = () => {\n  const context = useContext(ThemeProviderContext);\n\n  if (context === undefined)\n    throw new Error(\"useTheme must be used within a ThemeProvider\");\n\n  return context;\n};\n"
  },
  {
    "path": "src/components/theme-toggle.tsx",
    "content": "\"use client\";\n\nimport { useTheme } from \"./theme-provider\";\nimport { Moon, Sun } from \"lucide-react\";\nimport { useEffect, useState } from \"react\";\n\nexport function ThemeToggle() {\n  const { theme, setTheme } = useTheme();\n  const [mounted, setMounted] = useState(false);\n  \n  // Avoid hydration mismatch by ensuring component only renders after mounting\n  useEffect(() => setMounted(true), []);\n  \n  if (!mounted) return null;\n  \n  const isCurrentlyDark = theme === \"dark\";\n  const label = isCurrentlyDark ? \"Switch to light mode\" : \"Switch to dark mode\";\n\n  return (\n    <div className=\"flex items-center gap-2\">\n      <button\n        onClick={() => setTheme(isCurrentlyDark ? \"light\" : \"dark\")}\n        className=\"relative rounded-md p-2 hover:bg-neutral-100 dark:hover:bg-neutral-800 flex items-center justify-center cursor-pointer focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 dark:focus:ring-offset-background-dark transition-all duration-200\"\n        aria-label={label}\n        title={label}\n        role=\"switch\"\n        aria-checked={isCurrentlyDark}\n      >\n        <div className=\"relative w-5 h-5\">\n          <Sun className=\"absolute inset-0 h-5 w-5 rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0\" />\n          <Moon className=\"absolute inset-0 h-5 w-5 rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100\" />\n        </div>\n        <span className=\"sr-only\">{label}</span>\n      </button>\n    </div>\n  );\n}\n"
  },
  {
    "path": "src/data/index.ts",
    "content": "export { work } from \"./work\";\nexport { projects } from \"./projects\";\nexport { socialLinks } from \"./social\";\nexport { navLinks } from \"./nav\";\nexport { personalData } from \"./personal\";\n"
  },
  {
    "path": "src/data/nav.ts",
    "content": "export const navLinks = [\n  { href: \"#home\", label: \"Home\" },\n  { href: \"#work\", label: \"Work\" },\n  { href: \"#projects\", label: \"Projects\" },\n  { href: \"#blog\", label: \"Blog\" },\n  { href: \"#contact\", label: \"Contact\" },\n];\n"
  },
  {
    "path": "src/data/personal.ts",
    "content": "export const personalData = {\n  name: \"Avneesh Agarwal\",\n  designation: \"Full Stack Web3 Developer\",\n  metaDescription:\n    \"Avneesh Agarwal - Full Stack Web3 Developer & CTO at Orcas. Expert in React, TypeScript, and developer tools. Explore my projects, articles, and open source contributions.\",\n  about:\n    \"Hey, I'm Avneesh Agarwal — a developer based in India, passionate about building powerful dev tools, contributing to open source, and sharing my learnings through writing. Currently, I'm the CTO at Orcas, where we're reshaping equity crowdfunding for startups. I've worked across multiple startups as a developer relations engineer, full-stack developer, and technical writer, helping teams build, scale, and engage with developer communities. When I'm not coding, you'll find me experimenting with side projects, writing articles, or diving into something completely random—just for the fun of it. Oh, and I'm also a sports enthusiast (fitness freak + nerd combo :p).\",\n  shorterDesc:\n    \"Full stack web3 developer and technical writer contributing to open source projects and teaching others, while building side projects every now and then.\",\n  site: \"https://avneesh.tech\",\n  email: \"hi@avneesh.tech\",\n  x: \"avneesh0612\",\n  keywords: [\n    \"software engineer\",\n    \"full-stack developer\",\n    \"Web3 developer\",\n    \"technical writer\",\n    \"developer relations\",\n    \"CTO\",\n    \"open source contributor\",\n    \"React developer\",\n    \"TypeScript\",\n    \"JavaScript\",\n    \"startup technology\",\n    \"developer tools\",\n    \"equity crowdfunding\",\n    \"India tech\",\n    \"tech blogger\",\n    \"Avneesh Agarwal\",\n  ],\n  blog: \"https://blog.avneesh.tech\",\n};\n"
  },
  {
    "path": "src/data/projects.ts",
    "content": "export const projects = [\n  {\n    title: \"Chessmates\",\n    description:\n      \"A team-based chess game where players vote on moves. The most popular choice determines the play, with points awarded for winning moves. Won three prizes at the ETH Global Frames Hackathon.\",\n    timeline: \"Mar 2024\",\n    url: \"https://ethglobal.com/showcase/chessmates-qt6d3\",\n    github: \"https://github.com/avneesh0612/Chessmates\",\n  },\n  {\n    title: \"tldrbot\",\n    description:\n      \"A Discord bot that summarizes conversations with a simple command. Recognized as 'Product of the Day' on Product Hunt and integrated into 100+ servers within the first week.\",\n    timeline: \"Feb 2023\",\n    url: \"https://www.producthunt.com/products/tldrbot#tldrbot\",\n    github: \"https://github.com/avneesh0612/tldr-bot\",\n  },\n  {\n    title: \"Snipli\",\n    description: \"Convert your local files into a gist in just a snap\",\n    timeline: \"May 2022\",\n    url: \"https://www.producthunt.com/products/snipli#snipli\",\n    github: \"https://github.com/0xMukesh/snipli\",\n  },\n  {\n    title: \"React and Next.js Snippets\",\n    description:\n      \"A VSCode extension that eliminates repetitive boilerplate code. Awarded 'Product of the Day' on Product Hunt and currently serves over 24,000 users.\",\n    timeline: \"Feb 2022\",\n    url: \"https://www.producthunt.com/products/react-and-next-js-snippets#react-and-next-js-snippets\",\n    github: \"https://github.com/avneesh0612/react-nextjs-snippets\",\n  },\n];\n"
  },
  {
    "path": "src/data/social.tsx",
    "content": "import {\n  FarcasterIcon,\n  GithubIcon,\n  LinkedInIcon,\n  MailIcon,\n  XIcon,\n} from \"@/components/Icons\";\nimport { personalData } from \"./personal\";\n\nexport const socialLinks = [\n  {\n    name: \"GitHub\",\n    Icon: GithubIcon,\n    link: \"https://github.com/avneesh0612\",\n  },\n  {\n    name: \"X\",\n    Icon: XIcon,\n    link: \"https://x.com/avneesh0612\",\n  },\n  {\n    name: \"Farcaster\",\n    Icon: FarcasterIcon,\n    link: \"https://warpcast.com/avneesh\",\n  },\n  {\n    name: \"Mail me\",\n    Icon: MailIcon,\n    link: `mailto:${personalData.email}`,\n  },\n  {\n    name: \"LinkedIn\",\n    Icon: LinkedInIcon,\n    link: \"https://www.linkedin.com/in/avneesh0612/\",\n  },\n];\n"
  },
  {
    "path": "src/data/work.ts",
    "content": "export const work = [\n  {\n    title: \"Orcas\",\n    role: \"CTO\",\n    description:\n      \"Leading the development of a crowdfunding equity platform for startups.\",\n    timeline: \"Oct 2024 - Present\",\n    url: \"https://orcas.com\",\n  },\n  {\n    title: \"Neynar\",\n    role: \"Developer Relations Engineer\",\n    description:\n      \"Managed product documentation, wrote guides, and published case studies to enhance the developer experience.\",\n    timeline: \"Apr 2024 - Nov 2024\",\n    url: \"https://neynar.com\",\n  },\n  {\n    title: \"thirdweb\",\n    role: \"Developer Relations Engineer\",\n    description:\n      \"Published 60+ guides, created templates, mentored developers at hackathons, and collaborated across departments.\",\n    timeline: \"Apr 2022 - Feb 2024\",\n    url: \"https://thirdweb.com\",\n  },\n  {\n    title: \"Yoke (NIL CLUB)\",\n    role: \"Full Stack Engineer\",\n    description:\n      \"Built a web3 payment system, developed the front end for NIL clubs, and refactored JavaScript codebase to TypeScript.\",\n    timeline: \"Jan 2022 - Sep 2022\",\n    url: \"https://nilclub.com\",\n  },\n  {\n    title: \"Freelancer\",\n    role: \"Technical Writer & Full Stack Developer\",\n    description:\n      \"Created technical content for Logrocket, Medusa, and Pointer. Worked on projects like Candypay, Tinydancer, and Cubik.\",\n    timeline: \"Jan 2022 - Present\",\n    url: \"\",\n  },\n];\n"
  },
  {
    "path": "src/types/PostType.ts",
    "content": "export interface PostType {\n  data: {\n    post: {\n      _id: string;\n      title: string;\n      content: string;\n      brief: string;\n      totalReactions: number;\n      replyCount: number;\n      responseCount: number;\n      coverImage: { url: string };\n      slug: string;\n      popularity: number;\n      reactionCount: number;\n      readTimeInMinutes: number;\n    };\n  };\n}\n"
  },
  {
    "path": "src/utils/getPosts.ts",
    "content": "const getUserDataAndPosts = async (username: string) => {\n  const ids = [];\n\n  const userDataQuery = `\n   {\n  user(username:\"${username}\"){\n    username,\n   posts(pageSize:3,page:1,filter:{publications:[\"60d17a93a6a3a25dadf6268d\"]}) {\n       edges {\n        node {\n          id\n        }\n      }\n    }\n  }\n}\n  `;\n\n  const userDataRes = await fetch(\"https://gql.hashnode.com/\", {\n    method: \"POST\",\n    headers: {\n      \"Content-type\": \"application/json\",\n    },\n    body: JSON.stringify({ query: userDataQuery }),\n  });\n\n  const userData = await userDataRes.json();\n  const edges = userData.data.user.posts.edges;\n  for (let i = 0; i < edges.length; i++) {\n    ids.push(edges[i].node.id);\n  }\n\n  const posts = await Promise.all(\n    ids.map(async (id) => {\n      const postQuery = `\n       {\n  post(id: \"${id}\") {\n    id\n    title\n    title\n    brief\n    slug\n    reactionCount\n    replyCount\n    responseCount\n    brief\n    coverImage{\n      url\n    }\n    readTimeInMinutes\n  }\n}\n      `;\n\n      const postRes = await fetch(\"https://gql.hashnode.com/\", {\n        method: \"POST\",\n        headers: {\n          \"Content-type\": \"application/json\",\n        },\n        body: JSON.stringify({ query: postQuery }),\n      });\n\n      const postData = await postRes.json();\n      return postData;\n    })\n  );\n\n  return posts;\n};\n\nexport default getUserDataAndPosts;\n"
  },
  {
    "path": "tailwind.config.ts",
    "content": "import type { Config } from \"tailwindcss\";\nimport defaultTheme from \"tailwindcss/defaultTheme\";\n\nexport default {\n  content: [\n    \"./src/pages/**/*.{js,ts,jsx,tsx,mdx}\",\n    \"./src/components/**/*.{js,ts,jsx,tsx,mdx}\",\n    \"./src/app/**/*.{js,ts,jsx,tsx,mdx}\",\n  ],\n  darkMode: \"selector\",\n  theme: {\n    extend: {\n      fontFamily: {\n        geomanist: [\"Geomanist\", ...defaultTheme.fontFamily.sans],\n      },\n      colors: {\n        primary: {\n          DEFAULT: \"#3B82F6\",\n          hover: \"#2563EB\",\n        },\n        accent: {\n          first: \"#F59E0B\",\n          second: \"#10B981\",\n          third: \"#EC4899\",\n        },\n        background: {\n          light: \"#fafafa\",\n          dark: \"#0a0a0a\",\n        },\n        foreground: {\n          light: \"#0a0a0a\",\n          dark: \"#ededed\",\n        },\n        neutral: {\n          100: \"#f5f5f5\",\n          200: \"#e5e5e5\",\n          300: \"#d4d4d4\",\n          400: \"#a3a3a3\",\n          500: \"#737373\",\n          600: \"#525252\",\n          700: \"#404040\",\n          800: \"#262626\",\n          900: \"#171717\",\n        },\n      },\n    },\n  },\n  plugins: [],\n} satisfies Config;\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2017\",\n    \"lib\": [\"dom\", \"dom.iterable\", \"esnext\"],\n    \"allowJs\": true,\n    \"skipLibCheck\": true,\n    \"strict\": true,\n    \"noEmit\": true,\n    \"esModuleInterop\": true,\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"bundler\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"jsx\": \"preserve\",\n    \"incremental\": true,\n    \"plugins\": [\n      {\n        \"name\": \"next\"\n      }\n    ],\n    \"paths\": {\n      \"@/*\": [\"./src/*\"]\n    }\n  },\n  \"include\": [\"next-env.d.ts\", \"**/*.ts\", \"**/*.tsx\", \".next/types/**/*.ts\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  }
]