Spaces:
Sleeping
Sleeping
Upload 7 files
Browse files- .gitattributes +1 -0
- app.py +36 -0
- index.html +248 -0
- requirements.txt +1 -3
- resume/Praneeth-Kumar-Resume.pdf +3 -0
- resume/README.txt +3 -0
- script.js +89 -0
- styles.css +140 -0
.gitattributes
CHANGED
|
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
+
resume/Praneeth-Kumar-Resume.pdf filter=lfs diff=lfs merge=lfs -text
|
app.py
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
from pathlib import Path
|
| 3 |
+
|
| 4 |
+
st.set_page_config(
|
| 5 |
+
page_title="Pinni Praneeth Kumar | Portfolio",
|
| 6 |
+
page_icon="🌐",
|
| 7 |
+
layout="wide",
|
| 8 |
+
)
|
| 9 |
+
|
| 10 |
+
base_dir = Path(__file__).parent
|
| 11 |
+
html_path = base_dir / "index.html"
|
| 12 |
+
css_path = base_dir / "styles.css"
|
| 13 |
+
js_path = base_dir / "script.js"
|
| 14 |
+
|
| 15 |
+
# Read assets
|
| 16 |
+
html = html_path.read_text(encoding="utf-8") if html_path.exists() else "<h1>index.html not found</h1>"
|
| 17 |
+
css = css_path.read_text(encoding="utf-8") if css_path.exists() else ""
|
| 18 |
+
js = js_path.read_text(encoding="utf-8") if js_path.exists() else ""
|
| 19 |
+
|
| 20 |
+
# Inline CSS and JS by replacing the link/script tags in index.html
|
| 21 |
+
html_inlined = html
|
| 22 |
+
if css:
|
| 23 |
+
html_inlined = html_inlined.replace(
|
| 24 |
+
'<link rel="stylesheet" href="./styles.css" />', f"<style>{css}</style>"
|
| 25 |
+
)
|
| 26 |
+
if js:
|
| 27 |
+
html_inlined = html_inlined.replace(
|
| 28 |
+
'<script src="./script.js"></script>', f"<script>{js}</script>"
|
| 29 |
+
)
|
| 30 |
+
|
| 31 |
+
# Render full HTML document inside Streamlit
|
| 32 |
+
# Use components to allow JS execution and custom styles
|
| 33 |
+
st.components.v1.html(html_inlined, height=900, scrolling=True)
|
| 34 |
+
|
| 35 |
+
# Optional footer in Streamlit (outside the embedded app)
|
| 36 |
+
st.caption("Hosted with Streamlit on Hugging Face Spaces")
|
index.html
ADDED
|
@@ -0,0 +1,248 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en" data-theme="light">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="utf-8" />
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
| 6 |
+
<meta name="description" content="Pinni Praneeth Kumar – Data/ML Engineer Portfolio and Resume" />
|
| 7 |
+
<title>Pinni Praneeth Kumar | Portfolio</title>
|
| 8 |
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
| 9 |
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
| 10 |
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
| 11 |
+
<link rel="stylesheet" href="./styles.css" />
|
| 12 |
+
</head>
|
| 13 |
+
<body>
|
| 14 |
+
<header class="site-header" data-reveal>
|
| 15 |
+
<div class="container header-inner">
|
| 16 |
+
<a href="#home" class="brand">Pinni Praneeth Kumar</a>
|
| 17 |
+
<nav class="nav" id="primary-nav">
|
| 18 |
+
<button class="nav-toggle" id="nav-toggle" aria-label="Open menu" aria-expanded="false">☰</button>
|
| 19 |
+
<ul class="nav-list" id="nav-list">
|
| 20 |
+
<li><a href="#about">About</a></li>
|
| 21 |
+
<li><a href="#skills">Skills</a></li>
|
| 22 |
+
<li><a href="#projects">Projects</a></li>
|
| 23 |
+
<li><a href="#experience">Experience</a></li>
|
| 24 |
+
<li><a href="#education">Education</a></li>
|
| 25 |
+
<li><a href="#contact">Contact</a></li>
|
| 26 |
+
</ul>
|
| 27 |
+
</nav>
|
| 28 |
+
<button id="theme-toggle" class="btn btn-ghost" aria-label="Toggle dark mode" title="Toggle theme">🌙</button>
|
| 29 |
+
</div>
|
| 30 |
+
</header>
|
| 31 |
+
|
| 32 |
+
<main id="home">
|
| 33 |
+
<section class="hero" data-reveal>
|
| 34 |
+
<div class="container hero-inner">
|
| 35 |
+
<div class="hero-copy">
|
| 36 |
+
<h1>Hi, I'm <span class="accent">Pinni Praneeth Kumar</span>.</h1>
|
| 37 |
+
<p class="lead">Senior Data Engineer building ML pipelines and GenAI solutions.</p>
|
| 38 |
+
<div class="cta-group">
|
| 39 |
+
<a href="#projects" class="btn btn-primary">View Projects</a>
|
| 40 |
+
<a href="#contact" class="btn">Contact Me</a>
|
| 41 |
+
</div>
|
| 42 |
+
<div class="meta">
|
| 43 |
+
<span>Based in India • Open to roles</span>
|
| 44 |
+
</div>
|
| 45 |
+
</div>
|
| 46 |
+
<div class="hero-photo" aria-hidden="true">
|
| 47 |
+
<div class="avatar">PP</div>
|
| 48 |
+
</div>
|
| 49 |
+
</div>
|
| 50 |
+
</section>
|
| 51 |
+
|
| 52 |
+
<section id="about" class="section" data-reveal>
|
| 53 |
+
<div class="container">
|
| 54 |
+
<h2>About</h2>
|
| 55 |
+
<p>
|
| 56 |
+
Senior Data Engineer with 3.10+ years of experience architecting and deploying scalable ML pipelines on AWS and Azure,
|
| 57 |
+
accelerating the ML lifecycle from data ingestion to production deployment. Skilled in automating end-to-end ML pipelines.
|
| 58 |
+
Proficient in Python, SQL, CI/CD, Docker, and model deployment at scale. Experienced in GenAI, LLMs, and prompt engineering
|
| 59 |
+
to drive intelligent automation.
|
| 60 |
+
</p>
|
| 61 |
+
<ul class="highlights">
|
| 62 |
+
<li>Proficient: Python, SQL, CI/CD, Docker, model deployment</li>
|
| 63 |
+
<li>Experienced: Generative AI, LLMs, RAG, Prompt Engineering</li>
|
| 64 |
+
<li>Cloud: AWS and Azure for scalable data/ML systems</li>
|
| 65 |
+
</ul>
|
| 66 |
+
</div>
|
| 67 |
+
</section>
|
| 68 |
+
|
| 69 |
+
<section id="skills" class="section" data-reveal>
|
| 70 |
+
<div class="container">
|
| 71 |
+
<h2>Skills</h2>
|
| 72 |
+
<div class="skills-scroll">
|
| 73 |
+
<button class="scroll-arrow" id="skills-left" aria-label="Scroll left">←</button>
|
| 74 |
+
<div class="scroll-container" id="skills-container">
|
| 75 |
+
<div class="skills-groups">
|
| 76 |
+
<div class="skill-group">
|
| 77 |
+
<h3>Programming Languages</h3>
|
| 78 |
+
<div class="chips">
|
| 79 |
+
<span class="chip">SQL</span>
|
| 80 |
+
<span class="chip">Python</span>
|
| 81 |
+
</div>
|
| 82 |
+
</div>
|
| 83 |
+
<div class="skill-group">
|
| 84 |
+
<h3>Tools</h3>
|
| 85 |
+
<div class="chips">
|
| 86 |
+
<span class="chip">MySQL</span>
|
| 87 |
+
<span class="chip">Oracle SQL Developer</span>
|
| 88 |
+
<span class="chip">MongoDB</span>
|
| 89 |
+
<span class="chip">Cloud (AWS, Azure)</span>
|
| 90 |
+
<span class="chip">Tableau</span>
|
| 91 |
+
<span class="chip">GitHub</span>
|
| 92 |
+
<span class="chip">MLFlow (Model Tracking)</span>
|
| 93 |
+
<span class="chip">SageMaker</span>
|
| 94 |
+
<span class="chip">Azure ML Studio</span>
|
| 95 |
+
<span class="chip">Vertex AI</span>
|
| 96 |
+
</div>
|
| 97 |
+
</div>
|
| 98 |
+
<div class="skill-group">
|
| 99 |
+
<h3>Others</h3>
|
| 100 |
+
<div class="chips">
|
| 101 |
+
<span class="chip">MLOps</span>
|
| 102 |
+
<span class="chip">CICD</span>
|
| 103 |
+
<span class="chip">Model Monitoring</span>
|
| 104 |
+
<span class="chip">Deep Learning</span>
|
| 105 |
+
<span class="chip">Generative AI</span>
|
| 106 |
+
<span class="chip">LLMs</span>
|
| 107 |
+
<span class="chip">RAG</span>
|
| 108 |
+
<span class="chip">Agents</span>
|
| 109 |
+
<span class="chip">Prompt Engineering</span>
|
| 110 |
+
<span class="chip">Big Data</span>
|
| 111 |
+
<span class="chip">Data Analytics</span>
|
| 112 |
+
</div>
|
| 113 |
+
</div>
|
| 114 |
+
</div>
|
| 115 |
+
</div>
|
| 116 |
+
<button class="scroll-arrow" id="skills-right" aria-label="Scroll right">→</button>
|
| 117 |
+
</div>
|
| 118 |
+
</div>
|
| 119 |
+
</section>
|
| 120 |
+
|
| 121 |
+
<section id="projects" class="section" data-reveal>
|
| 122 |
+
<div class="container">
|
| 123 |
+
<h2>Projects</h2>
|
| 124 |
+
<div class="grid projects-grid">
|
| 125 |
+
<article class="card">
|
| 126 |
+
<div class="card-body">
|
| 127 |
+
<h3>Streamlining Auto Vehicle Pricing through MLOps <span class="muted">(June 2024 – September 2024)</span></h3>
|
| 128 |
+
<details>
|
| 129 |
+
<summary class="btn btn-sm">Know more</summary>
|
| 130 |
+
<ul>
|
| 131 |
+
<li><strong>Built and deployed</strong> an end-to-end MLOps pipeline on Azure ML using GitHub Actions and Python, automating data processing, model training, evaluation, and CI/CD — <strong>reducing model deployment time by 60%</strong> and enabling <strong>weekly retraining cycles</strong> for dynamic vehicle pricing.</li>
|
| 132 |
+
<li><strong>Developed a scalable pricing model</strong> by integrating <strong>over 1 million records</strong> from multiple data sources using SQL, enabling <strong>real-time pricing updates</strong> that reflected evolving market trends.</li>
|
| 133 |
+
<li><strong>Improved pricing accuracy by 25%</strong> and cut manual processing time by <strong>70%</strong> through workflow automation, significantly enhancing operational decision-making speed.</li>
|
| 134 |
+
<li><strong>Implemented a unified MLOps-driven system</strong> with scalable endpoint deployment, supporting <strong>24/7 availability</strong> and handling <strong>1000+ pricing requests per day</strong> with <strong><200ms inference latency</strong>.</li>
|
| 135 |
+
<li><strong>Delivered a production-ready pricing solution</strong> that increased dealership revenue by <strong>4.8%</strong>, improved customer trust scores by <strong>15%</strong>, and strengthened cross-functional team collaboration.</li>
|
| 136 |
+
</ul>
|
| 137 |
+
</details>
|
| 138 |
+
<ul class="tags">
|
| 139 |
+
<li>Azure ML</li><li>GitHub Actions</li><li>Python</li><li>SQL</li><li>MLOps</li>
|
| 140 |
+
</ul>
|
| 141 |
+
</div>
|
| 142 |
+
</article>
|
| 143 |
+
<article class="card">
|
| 144 |
+
<div class="card-body">
|
| 145 |
+
<h3>Intelligent Reporting on Azure <span class="muted">(January 2023 – March 2023)</span></h3>
|
| 146 |
+
<details>
|
| 147 |
+
<summary class="btn btn-sm">Know more</summary>
|
| 148 |
+
<ul>
|
| 149 |
+
<li>Developed an automated analytical pipeline using <strong>Python, SQL, and Azure ML</strong> to preprocess trip data, ensuring data consistency and accuracy for further analysis.</li>
|
| 150 |
+
<li>Created <strong>interactive dashboards</strong> with Streamlit, hosted on Hugging Face Spaces, to visualize key business metrics like total revenue and trip categories, improving data accessibility and decision-making.</li>
|
| 151 |
+
<li>Implemented an <strong>email alert system</strong> using automation scripts, enabling real-time notifications with summaries of insights and dashboard links, enhancing stakeholder communication and decision-making efficiency.</li>
|
| 152 |
+
<li>Streamlined data workflows by <strong>integrating Azure ML</strong> for data storage, preprocessing, and pipeline management, improving collaboration, scalability, and operational efficiency.</li>
|
| 153 |
+
</ul>
|
| 154 |
+
</details>
|
| 155 |
+
<ul class="tags">
|
| 156 |
+
<li>Azure ML</li><li>Python</li><li>SQL</li><li>Streamlit</li><li>Hugging Face Spaces</li>
|
| 157 |
+
</ul>
|
| 158 |
+
</div>
|
| 159 |
+
</article>
|
| 160 |
+
</div>
|
| 161 |
+
</div>
|
| 162 |
+
</section>
|
| 163 |
+
|
| 164 |
+
<section id="experience" class="section" data-reveal>
|
| 165 |
+
<div class="container">
|
| 166 |
+
<h2>Experience</h2>
|
| 167 |
+
<div class="timeline">
|
| 168 |
+
<div class="timeline-item">
|
| 169 |
+
<div class="timeline-dot"></div>
|
| 170 |
+
<div class="timeline-content">
|
| 171 |
+
<h3>Senior Data Engineer • Great Learning <span class="muted">Bangalore Urban</span></h3>
|
| 172 |
+
<span class="muted">Jan 2022 — Present</span>
|
| 173 |
+
<details>
|
| 174 |
+
<summary class="btn btn-sm">Know more</summary>
|
| 175 |
+
<ul>
|
| 176 |
+
<li>Led end-to-end development of scalable machine learning solutions, driving business impact by transforming raw data into actionable insights across product, marketing, and operations teams.</li>
|
| 177 |
+
<li>Designed and deployed advanced predictive models and statistical frameworks using Python, SQL, and cloud platforms (AWS/Azure/GCP), resulting in measurable improvements in customer retention, conversion, or efficiency.</li>
|
| 178 |
+
<li>Mentored junior data scientists and analysts, fostering a culture of experimentation, code quality, and reproducible research through peer reviews, knowledge sharing, and hands-on guidance.</li>
|
| 179 |
+
<li>Led the design and delivery of 5 successful AI/ML-powered products, driving innovation across data science, machine learning, and automation use cases—contributing to a <strong>5% increase</strong> in overall company revenue and operational growth.</li>
|
| 180 |
+
</ul>
|
| 181 |
+
</details>
|
| 182 |
+
</div>
|
| 183 |
+
</div>
|
| 184 |
+
<div class="timeline-item">
|
| 185 |
+
<div class="timeline-dot"></div>
|
| 186 |
+
<div class="timeline-content">
|
| 187 |
+
<h3>Data Analyst • FSP Solutions Pvt Ltd <span class="muted">Noida, Delhi</span></h3>
|
| 188 |
+
<span class="muted">Jun 2021 — Oct 2021</span>
|
| 189 |
+
<details>
|
| 190 |
+
<summary class="btn btn-sm">Know more</summary>
|
| 191 |
+
<ul>
|
| 192 |
+
<li>Partnered with development teams to deliver groundbreaking solutions, providing expert consultation and driving execution to achieve tangible impact.</li>
|
| 193 |
+
<li>Transformed existing information architectures through in-depth analysis and innovative design, developing optimized solutions that elevate data management.</li>
|
| 194 |
+
</ul>
|
| 195 |
+
</details>
|
| 196 |
+
</div>
|
| 197 |
+
</div>
|
| 198 |
+
</div>
|
| 199 |
+
</div>
|
| 200 |
+
</section>
|
| 201 |
+
|
| 202 |
+
<section id="education" class="section" data-reveal>
|
| 203 |
+
<div class="container">
|
| 204 |
+
<h2>Education</h2>
|
| 205 |
+
<ul class="edu-list">
|
| 206 |
+
<li>
|
| 207 |
+
<h3>Grandhi Varalakshmi Venkatarama Institute of Technology • 81.4%</h3>
|
| 208 |
+
<span class="muted">B.Tech in Mechanical Engineering • Bhimavaram, AP • 2020</span>
|
| 209 |
+
<div class="muted">Honors: Academic Merit Award • Projects: Go‑Kart (Open type wheel car)</div>
|
| 210 |
+
</li>
|
| 211 |
+
<li>
|
| 212 |
+
<h3>Grandhi Varalakshmi Venkatarama Institute of Technology • 82.07%</h3>
|
| 213 |
+
<span class="muted">Diploma in Mechanical Engineering • Bhimavaram, AP • 2017</span>
|
| 214 |
+
<div class="muted">Projects: Dual Tone Multi Frequency Robot</div>
|
| 215 |
+
</li>
|
| 216 |
+
</ul>
|
| 217 |
+
</div>
|
| 218 |
+
</section>
|
| 219 |
+
|
| 220 |
+
<section id="contact" class="section" data-reveal>
|
| 221 |
+
<div class="container">
|
| 222 |
+
<h2>Contact</h2>
|
| 223 |
+
<p>
|
| 224 |
+
Feel free to reach out for roles, collaborations, or just to say hi.
|
| 225 |
+
</p>
|
| 226 |
+
<div class="cta-group">
|
| 227 |
+
<a class="btn btn-primary" href="mailto:praneethsanthosh555@gmail.com">Email Me</a>
|
| 228 |
+
<a class="btn" href="./resume/Praneeth-Kumar-Resume.pdf" download>Download Resume</a>
|
| 229 |
+
<a class="btn btn-ghost" href="https://www.linkedin.com/in/praneeth88/" target="_blank" rel="noopener">LinkedIn</a>
|
| 230 |
+
<a class="btn btn-ghost" href="https://github.com/praneeth300" target="_blank" rel="noopener">GitHub</a>
|
| 231 |
+
<span class="muted">Ph: 8309116050</span>
|
| 232 |
+
</div>
|
| 233 |
+
</div>
|
| 234 |
+
</section>
|
| 235 |
+
</main>
|
| 236 |
+
|
| 237 |
+
<a href="#contact" class="fab" aria-label="Contact">✉️</a>
|
| 238 |
+
<button id="back-to-top" class="back-to-top" aria-label="Back to top">↑</button>
|
| 239 |
+
|
| 240 |
+
<footer class="site-footer">
|
| 241 |
+
<div class="container">
|
| 242 |
+
<span>© <span id="year"></span> Pinni Praneeth Kumar. All rights reserved.</span>
|
| 243 |
+
</div>
|
| 244 |
+
</footer>
|
| 245 |
+
|
| 246 |
+
<script src="./script.js"></script>
|
| 247 |
+
</body>
|
| 248 |
+
</html>
|
requirements.txt
CHANGED
|
@@ -1,3 +1 @@
|
|
| 1 |
-
|
| 2 |
-
pandas
|
| 3 |
-
streamlit
|
|
|
|
| 1 |
+
streamlit==1.36.0
|
|
|
|
|
|
resume/Praneeth-Kumar-Resume.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:aeef4f2bc908ed0464415dd069916b8147adbeaf40a0cc6ca917b412263de285
|
| 3 |
+
size 123877
|
resume/README.txt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Place your resume PDF here as `Praneeth_Resume.pdf`.
|
| 2 |
+
|
| 3 |
+
Example: C:\Users\Praneeth\Desktop\Gen AI\2- Developement\resume\Praneeth_Resume.pdf
|
script.js
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
(function () {
|
| 2 |
+
var root = document.documentElement;
|
| 3 |
+
var themeToggle = document.getElementById('theme-toggle');
|
| 4 |
+
var navToggle = document.getElementById('nav-toggle');
|
| 5 |
+
var navList = document.getElementById('nav-list');
|
| 6 |
+
var year = document.getElementById('year');
|
| 7 |
+
|
| 8 |
+
try {
|
| 9 |
+
var saved = localStorage.getItem('theme');
|
| 10 |
+
if (saved) {
|
| 11 |
+
root.setAttribute('data-theme', saved);
|
| 12 |
+
if (saved === 'dark') themeToggle.textContent = '☀️';
|
| 13 |
+
} else {
|
| 14 |
+
var prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
|
| 15 |
+
root.setAttribute('data-theme', prefersDark ? 'dark' : 'light');
|
| 16 |
+
themeToggle.textContent = prefersDark ? '☀️' : '🌙';
|
| 17 |
+
}
|
| 18 |
+
} catch (e) {}
|
| 19 |
+
|
| 20 |
+
if (themeToggle) {
|
| 21 |
+
themeToggle.addEventListener('click', function () {
|
| 22 |
+
var current = root.getAttribute('data-theme') === 'dark' ? 'dark' : 'light';
|
| 23 |
+
var next = current === 'dark' ? 'light' : 'dark';
|
| 24 |
+
root.setAttribute('data-theme', next);
|
| 25 |
+
themeToggle.textContent = next === 'dark' ? '☀️' : '🌙';
|
| 26 |
+
try { localStorage.setItem('theme', next); } catch (e) {}
|
| 27 |
+
});
|
| 28 |
+
}
|
| 29 |
+
|
| 30 |
+
if (navToggle && navList) {
|
| 31 |
+
navToggle.addEventListener('click', function () {
|
| 32 |
+
var isOpen = navList.classList.contains('open');
|
| 33 |
+
navList.classList.toggle('open');
|
| 34 |
+
navToggle.setAttribute('aria-expanded', String(!isOpen));
|
| 35 |
+
});
|
| 36 |
+
navList.querySelectorAll('a').forEach(function (a) {
|
| 37 |
+
a.addEventListener('click', function () { navList.classList.remove('open'); navToggle.setAttribute('aria-expanded', 'false'); });
|
| 38 |
+
});
|
| 39 |
+
}
|
| 40 |
+
|
| 41 |
+
if (year) {
|
| 42 |
+
year.textContent = String(new Date().getFullYear());
|
| 43 |
+
}
|
| 44 |
+
|
| 45 |
+
// Smooth scroll for in-page anchors
|
| 46 |
+
document.querySelectorAll('a[href^="#"]').forEach(function (a) {
|
| 47 |
+
a.addEventListener('click', function (e) {
|
| 48 |
+
var id = a.getAttribute('href');
|
| 49 |
+
if (id.length > 1) {
|
| 50 |
+
var el = document.querySelector(id);
|
| 51 |
+
if (el) {
|
| 52 |
+
e.preventDefault();
|
| 53 |
+
el.scrollIntoView({ behavior: 'smooth' });
|
| 54 |
+
}
|
| 55 |
+
}
|
| 56 |
+
});
|
| 57 |
+
});
|
| 58 |
+
|
| 59 |
+
// Reveal-on-scroll
|
| 60 |
+
var observer = new IntersectionObserver(function (entries) {
|
| 61 |
+
entries.forEach(function (entry) {
|
| 62 |
+
if (entry.isIntersecting) {
|
| 63 |
+
entry.target.classList.add('visible');
|
| 64 |
+
observer.unobserve(entry.target);
|
| 65 |
+
}
|
| 66 |
+
});
|
| 67 |
+
}, { threshold: 0.1 });
|
| 68 |
+
document.querySelectorAll('[data-reveal]').forEach(function (el) { observer.observe(el); });
|
| 69 |
+
|
| 70 |
+
// Skills horizontal scroll with arrows
|
| 71 |
+
var skillsContainer = document.getElementById('skills-container');
|
| 72 |
+
var left = document.getElementById('skills-left');
|
| 73 |
+
var right = document.getElementById('skills-right');
|
| 74 |
+
function scrollByAmount(amount) {
|
| 75 |
+
if (!skillsContainer) return;
|
| 76 |
+
skillsContainer.scrollBy({ left: amount, behavior: 'smooth' });
|
| 77 |
+
}
|
| 78 |
+
if (left) left.addEventListener('click', function () { scrollByAmount(-300); });
|
| 79 |
+
if (right) right.addEventListener('click', function () { scrollByAmount(300); });
|
| 80 |
+
|
| 81 |
+
// Back to top button
|
| 82 |
+
var backToTop = document.getElementById('back-to-top');
|
| 83 |
+
if (backToTop) {
|
| 84 |
+
window.addEventListener('scroll', function () {
|
| 85 |
+
if (window.scrollY > 600) backToTop.classList.add('show'); else backToTop.classList.remove('show');
|
| 86 |
+
});
|
| 87 |
+
backToTop.addEventListener('click', function () { window.scrollTo({ top: 0, behavior: 'smooth' }); });
|
| 88 |
+
}
|
| 89 |
+
})();
|
styles.css
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
:root {
|
| 2 |
+
--bg: #ffffff;
|
| 3 |
+
--fg: #0f172a;
|
| 4 |
+
--muted: #64748b;
|
| 5 |
+
--accent: #2563eb;
|
| 6 |
+
--card: #f8fafc;
|
| 7 |
+
--border: #e2e8f0;
|
| 8 |
+
--chip: #eef2ff;
|
| 9 |
+
}
|
| 10 |
+
|
| 11 |
+
html[data-theme="dark"] {
|
| 12 |
+
--bg: #0b1220;
|
| 13 |
+
--fg: #e5e7eb;
|
| 14 |
+
--muted: #9aa3b2;
|
| 15 |
+
--accent: #60a5fa;
|
| 16 |
+
--card: #111827;
|
| 17 |
+
--border: #1f2937;
|
| 18 |
+
--chip: #111827;
|
| 19 |
+
}
|
| 20 |
+
|
| 21 |
+
* { box-sizing: border-box; }
|
| 22 |
+
|
| 23 |
+
html, body { height: 100%; }
|
| 24 |
+
|
| 25 |
+
body {
|
| 26 |
+
margin: 0;
|
| 27 |
+
font-family: Inter, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, "Apple Color Emoji", "Segoe UI Emoji";
|
| 28 |
+
color: var(--fg);
|
| 29 |
+
background: var(--bg);
|
| 30 |
+
line-height: 1.6;
|
| 31 |
+
}
|
| 32 |
+
|
| 33 |
+
img { max-width: 100%; display: block; }
|
| 34 |
+
|
| 35 |
+
.container {
|
| 36 |
+
width: 100%;
|
| 37 |
+
max-width: 1100px;
|
| 38 |
+
margin: 0 auto;
|
| 39 |
+
padding: 0 16px;
|
| 40 |
+
}
|
| 41 |
+
|
| 42 |
+
.site-header {
|
| 43 |
+
position: sticky;
|
| 44 |
+
top: 0;
|
| 45 |
+
z-index: 50;
|
| 46 |
+
background: var(--bg);
|
| 47 |
+
border-bottom: 1px solid var(--border);
|
| 48 |
+
}
|
| 49 |
+
.header-inner {
|
| 50 |
+
display: flex;
|
| 51 |
+
align-items: center;
|
| 52 |
+
justify-content: space-between;
|
| 53 |
+
height: 64px;
|
| 54 |
+
}
|
| 55 |
+
.brand { font-weight: 700; font-size: 20px; color: var(--fg); text-decoration: none; }
|
| 56 |
+
|
| 57 |
+
.nav-toggle { display: none; }
|
| 58 |
+
.nav-list { display: flex; list-style: none; gap: 20px; margin: 0; padding: 0; }
|
| 59 |
+
.nav-list a { color: var(--fg); text-decoration: none; opacity: 0.9; }
|
| 60 |
+
.nav-list a:hover { color: var(--accent); }
|
| 61 |
+
|
| 62 |
+
.btn { border: 1px solid var(--border); background: transparent; color: var(--fg); padding: 10px 14px; border-radius: 10px; text-decoration: none; display: inline-flex; align-items: center; gap: 8px; }
|
| 63 |
+
.btn:hover { border-color: var(--accent); }
|
| 64 |
+
.btn-primary { background: var(--accent); color: white; border-color: var(--accent); }
|
| 65 |
+
.btn-ghost { background: transparent; border-color: transparent; }
|
| 66 |
+
.btn-sm { padding: 6px 10px; border-radius: 8px; font-size: 14px; }
|
| 67 |
+
|
| 68 |
+
.hero { padding: 64px 0; }
|
| 69 |
+
.hero-inner { display: grid; grid-template-columns: 1.5fr 1fr; gap: 32px; align-items: center; }
|
| 70 |
+
.hero h1 { font-size: 42px; margin: 0 0 12px; }
|
| 71 |
+
.lead { font-size: 18px; opacity: 0.9; }
|
| 72 |
+
.accent { color: var(--accent); }
|
| 73 |
+
.meta { margin-top: 10px; color: var(--muted); font-size: 14px; }
|
| 74 |
+
|
| 75 |
+
.avatar { height: 140px; width: 140px; border-radius: 50%; background: linear-gradient(135deg, var(--accent), #9333ea); color: white; display: grid; place-items: center; font-weight: 700; font-size: 40px; margin: 0 0 0 auto; }
|
| 76 |
+
|
| 77 |
+
.section { padding: 56px 0; border-top: 1px solid var(--border); }
|
| 78 |
+
.section h2 { margin: 0 0 16px; font-size: 28px; }
|
| 79 |
+
|
| 80 |
+
.highlights { margin: 10px 0 0; padding-left: 20px; }
|
| 81 |
+
|
| 82 |
+
.chips { display: flex; flex-wrap: wrap; gap: 10px; }
|
| 83 |
+
.chip { background: var(--chip); border: 1px solid var(--border); color: var(--fg); padding: 8px 10px; border-radius: 999px; font-size: 14px; }
|
| 84 |
+
|
| 85 |
+
.grid { display: grid; gap: 16px; }
|
| 86 |
+
.projects-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
|
| 87 |
+
|
| 88 |
+
.card { background: var(--card); border: 1px solid var(--border); border-radius: 14px; overflow: hidden; }
|
| 89 |
+
.card-body { padding: 16px; display: grid; gap: 8px; }
|
| 90 |
+
.tags { display: flex; flex-wrap: wrap; gap: 8px; padding: 0; margin: 0; list-style: none; }
|
| 91 |
+
.tags li { background: var(--chip); border: 1px solid var(--border); padding: 4px 8px; border-radius: 999px; font-size: 12px; }
|
| 92 |
+
.card-actions { display: flex; gap: 8px; margin-top: 4px; }
|
| 93 |
+
|
| 94 |
+
.timeline { display: grid; gap: 16px; border-left: none; padding-left: 0; }
|
| 95 |
+
.timeline-item { position: relative; background: var(--card); border: 1px solid var(--border); border-radius: 12px; padding: 12px; }
|
| 96 |
+
.timeline-dot { display: none; }
|
| 97 |
+
.timeline-content h3 { margin: 0 0 6px; font-size: 16px; display: flex; flex-wrap: wrap; gap: 8px; align-items: baseline; }
|
| 98 |
+
.timeline-content .muted { display: block; margin-bottom: 8px; }
|
| 99 |
+
.card summary.btn { background: transparent; border-color: var(--border); color: var(--fg); }
|
| 100 |
+
.card summary.btn:hover { background: transparent; border-color: var(--accent); }
|
| 101 |
+
|
| 102 |
+
.edu-list { list-style: none; padding: 0; margin: 0; display: grid; gap: 10px; }
|
| 103 |
+
|
| 104 |
+
.site-footer { padding: 24px 0 40px; border-top: 1px solid var(--border); color: var(--muted); font-size: 14px; }
|
| 105 |
+
|
| 106 |
+
.cta-group { display: flex; gap: 12px; flex-wrap: wrap; }
|
| 107 |
+
|
| 108 |
+
.skills-groups { display: grid; gap: 20px; }
|
| 109 |
+
.skill-group h3 { margin: 0 0 8px; font-size: 16px; color: var(--muted); }
|
| 110 |
+
|
| 111 |
+
.scroll-container { overflow-x: auto; scroll-behavior: smooth; }
|
| 112 |
+
.skills-scroll { display: grid; grid-template-columns: auto 1fr auto; align-items: center; gap: 8px; }
|
| 113 |
+
.scroll-arrow { border: 1px solid var(--border); background: var(--card); color: var(--fg); height: 36px; width: 36px; border-radius: 8px; }
|
| 114 |
+
.scroll-arrow:hover { border-color: var(--accent); }
|
| 115 |
+
|
| 116 |
+
.card details { margin-top: 6px; }
|
| 117 |
+
.card details[open] summary { color: var(--accent); }
|
| 118 |
+
.card summary { cursor: pointer; list-style: none; }
|
| 119 |
+
.card summary::-webkit-details-marker { display: none; }
|
| 120 |
+
|
| 121 |
+
[data-reveal] { opacity: 0; transform: translateY(12px); transition: opacity .5s ease, transform .5s ease; }
|
| 122 |
+
[data-reveal].visible { opacity: 1; transform: translateY(0); }
|
| 123 |
+
|
| 124 |
+
.fab { position: fixed; right: 18px; bottom: 18px; height: 52px; width: 52px; display: grid; place-items: center; border-radius: 999px; background: var(--accent); color: #fff; text-decoration: none; box-shadow: 0 6px 20px rgba(0,0,0,.2); z-index: 60; }
|
| 125 |
+
|
| 126 |
+
.back-to-top { position: fixed; right: 18px; bottom: 80px; height: 40px; width: 40px; border-radius: 10px; background: var(--card); color: var(--fg); border: 1px solid var(--border); display: none; z-index: 60; }
|
| 127 |
+
.back-to-top.show { display: inline-grid; place-items: center; }
|
| 128 |
+
|
| 129 |
+
@media (max-width: 900px) {
|
| 130 |
+
.hero-inner { grid-template-columns: 1fr; }
|
| 131 |
+
.avatar { margin: 0; }
|
| 132 |
+
.projects-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
| 133 |
+
}
|
| 134 |
+
|
| 135 |
+
@media (max-width: 640px) {
|
| 136 |
+
.nav-toggle { display: inline-flex; align-items: center; justify-content: center; height: 38px; width: 38px; border: 1px solid var(--border); background: transparent; border-radius: 10px; }
|
| 137 |
+
.nav-list { display: none; position: absolute; right: 16px; top: 64px; background: var(--bg); border: 1px solid var(--border); border-radius: 12px; padding: 10px; flex-direction: column; gap: 10px; }
|
| 138 |
+
.nav-list.open { display: flex; }
|
| 139 |
+
.projects-grid { grid-template-columns: 1fr; }
|
| 140 |
+
}
|