diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8fc1ea6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +# Hugo build output +public/ +resources/ +.hugo_build.lock + +# Typst output (optional, but since we compile it in GitHub Actions, you can ignore the local PDF if you want. +# Actually, wait. You might want to track static/resume.pdf if you want it served directly without GH Actions. +# We will NOT ignore static/resume.pdf so it stays in the repo). + +# OS generated files +.DS_Store +Thumbs.db diff --git a/assets/css/style.css b/assets/css/style.css index 9e9c3dc..5d99d8e 100644 --- a/assets/css/style.css +++ b/assets/css/style.css @@ -901,3 +901,55 @@ th { main { animation: fadeIn 0.4s ease-out; } + +/* --- Table of Contents --- */ +.post-toc { + background-color: var(--bg-alt); + border: 1px solid var(--border); + border-radius: 4px; + padding: 1rem; + margin-bottom: 2rem; + font-size: 0.9em; +} + +.toc-title { + font-weight: 700; + color: var(--fg-bright); + cursor: pointer; + user-select: none; + margin-bottom: 0.5rem; +} + +.post-toc summary::marker { + color: var(--accent); +} + +.post-toc nav#TableOfContents { + margin-top: 0.5rem; + padding-left: 0.5rem; +} + +.post-toc nav#TableOfContents ul { + list-style-type: none; + padding-left: 1rem; + margin: 0; +} + +.post-toc nav#TableOfContents > ul { + padding-left: 0; +} + +.post-toc nav#TableOfContents li { + margin-bottom: 0.25rem; +} + +.post-toc nav#TableOfContents a { + color: var(--fg-dim); + text-decoration: none; + transition: color 0.2s ease; +} + +.post-toc nav#TableOfContents a:hover { + color: var(--accent); + text-decoration: underline; +} diff --git a/layouts/_default/single.html b/layouts/_default/single.html index 219af7a..32e7b4b 100644 --- a/layouts/_default/single.html +++ b/layouts/_default/single.html @@ -17,6 +17,12 @@
+ {{- if and (ne .Params.toc false) (gt (len .TableOfContents) 32) }} +
+ Table of Contents + {{ .TableOfContents }} +
+ {{- end }} {{ .Content }}

diff --git a/public/about/index.html b/public/about/index.html deleted file mode 100644 index fb115d1..0000000 --- a/public/about/index.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - -About · Divyam Ahuja - - - - - - - - - - - -
-
-
-
-

About

- -
-
-

Hi, I’m a full-stack developer who loves building things. I enjoy hacking on side projects, exploring new technologies, and deep-diving into the technical details of how things work.

-

I work across the stack — from crafting interactive frontends to designing robust backend systems. When I’m not writing code, I’m probably reading about distributed systems, tinkering with new tools, or working on one of my many side projects.

-

I enjoy hacking on things and deep diving into the technical details of protocols, performance optimization, and algorithms.

-

If you want to see what I’ve been working on, check out my GitHub. Feel free to reach out by email if you want to talk about something I’m doing.

- -
-
- ← back to home -
-
-
- - diff --git a/public/avatar.png b/public/avatar.png deleted file mode 100644 index 53f87b8..0000000 --- a/public/avatar.png +++ /dev/null @@ -1,4 +0,0 @@ - - - DA - diff --git a/public/categories/index.html b/public/categories/index.html deleted file mode 100644 index 4d78722..0000000 --- a/public/categories/index.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - -Categories · Divyam Ahuja - - - - - - - - - - - - -
-
-

Categories

- -
- -
-
-
- - diff --git a/public/categories/index.xml b/public/categories/index.xml deleted file mode 100644 index 351c148..0000000 --- a/public/categories/index.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - Categories on Divyam Ahuja - http://localhost:1313/categories/ - Recent content in Categories on Divyam Ahuja - Hugo - en-us - - - diff --git a/public/css/style.min.0e1426a1030dac3093ef272a67d5031c1fa084587066130ebeedc434ca6c295d.css b/public/css/style.min.0e1426a1030dac3093ef272a67d5031c1fa084587066130ebeedc434ca6c295d.css deleted file mode 100644 index 0d676c5..0000000 --- a/public/css/style.min.0e1426a1030dac3093ef272a67d5031c1fa084587066130ebeedc434ca6c295d.css +++ /dev/null @@ -1 +0,0 @@ -@import 'https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap';:root{--bg:#1d1f21;--bg-alt:#282a2e;--bg-hover:#2a2d31;--fg:#c9cacc;--fg-dim:#6c7a89;--fg-bright:#e8e8e8;--accent:#ff00a6;--accent-dim:#ff004a;--accent-glow:rgba(255, 0, 166, 0.15);--border:#373b41;--code-bg:#1a1c1e;--font-mono:'JetBrains Mono', 'Fira Code', 'Cascadia Code', 'SF Mono', monospace;--font-size:15px;--line-height:1.7;--max-width:720px;--content-pad:1.5rem;--transition:150ms ease}*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}html{font-size:var(--font-size);scroll-behavior:smooth;-webkit-text-size-adjust:100%}body{font-family:var(--font-mono);font-weight:400;line-height:var(--line-height);color:var(--fg);background-color:var(--bg);min-height:100vh;display:flex;flex-direction:column;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}::selection{background-color:var(--accent);color:var(--bg)}.site-wrapper{width:100%;max-width:var(--max-width);margin:0 auto;padding:0 var(--content-pad);flex:1}main{padding:2rem 0 4rem}a{color:var(--accent);text-decoration:none;transition:color var(--transition),border-color var(--transition)}a:hover{color:var(--fg-bright)}h1,h2,h3,h4,h5,h6{font-family:var(--font-mono);font-weight:700;color:var(--fg-bright);line-height:1.3}h1{font-size:1.8rem;margin-bottom:.5rem}h2{font-size:1.4rem;margin:2.5rem 0 1rem}h3{font-size:1.15rem;margin:2rem 0 .75rem}h4{font-size:1rem;margin:1.5rem 0 .5rem}p{margin-bottom:1.2rem}strong{font-weight:700;color:var(--fg-bright)}em{font-style:italic}hr{border:none;border-top:1px solid var(--border);margin:2.5rem 0}blockquote{border-left:3px solid var(--accent);padding-left:1rem;margin:1.5rem 0;color:var(--fg-dim);font-style:italic}ul,ol{padding-left:1.5rem;margin-bottom:1.2rem}li{margin-bottom:.3rem}img{max-width:100%;height:auto;border-radius:4px}.site-header{padding:2.5rem 0 1rem}.site-header-inner{display:flex;align-items:baseline;justify-content:space-between;flex-wrap:wrap;gap:.75rem}.site-title{font-size:1.4rem;font-weight:700;color:var(--fg-bright);text-decoration:none;letter-spacing:-.02em}.site-title:hover{color:var(--accent)}.site-nav{display:flex;align-items:center;gap:0}.site-nav a{color:var(--accent);font-size:.9rem;padding:.15rem 0;border-bottom:1px solid transparent;transition:border-color var(--transition),color var(--transition)}.site-nav a:hover,.site-nav a.active{border-bottom-color:var(--accent)}.nav-separator{color:var(--fg-dim);margin:0 .6rem;user-select:none;font-size:.85rem}.home-bio{margin:1rem 0 1.5rem;font-size:.95rem;color:var(--fg);max-width:600px}.home-bio p{margin-bottom:1rem}.social-line{color:var(--fg-dim);font-size:.9rem;margin-bottom:0}.social-line a{color:var(--fg);border-bottom:1px dashed var(--fg-dim);transition:color var(--transition),border-color var(--transition)}.social-line a:hover{color:var(--accent);border-bottom-color:var(--accent)}.section-heading{font-size:1.2rem;color:var(--accent);font-weight:700;margin:3rem 0 1.5rem;display:flex;align-items:center;gap:.75rem}.section-heading::after{content:'';flex:1;height:1px;background:var(--border)}.post-list{list-style:none;padding:0;margin:0}.post-list-item{display:flex;align-items:baseline;gap:1.5rem;padding:.4rem 0;margin:0;transition:background-color var(--transition)}.post-list-item:hover{background-color:var(--accent-glow);margin:0 -.5rem;padding:.4rem .5rem;border-radius:3px}.post-date{color:var(--fg-dim);font-size:.85rem;white-space:nowrap;min-width:7rem;flex-shrink:0}.post-title-link{color:var(--fg);text-decoration:none;border-bottom:1px solid transparent;transition:color var(--transition),border-color var(--transition)}.post-title-link:hover{color:var(--accent);border-bottom-color:var(--accent)}.year-heading{font-size:1.1rem;font-weight:700;color:var(--fg-bright);margin:2rem 0 .75rem;padding-bottom:.25rem}.year-heading:first-child{margin-top:0}.project-list{list-style:none;padding:0;margin:0}.project-item{padding:.4rem 0;font-size:.95rem}.project-name{color:var(--fg);border-bottom:1px dashed var(--fg-dim);transition:color var(--transition),border-color var(--transition)}.project-name:hover{color:var(--accent);border-bottom-color:var(--accent)}.project-desc{color:var(--fg-dim)}.project-desc::before{content:': '}.site-footer{padding:2rem 0;margin-top:auto;border-top:1px solid var(--border)}.site-footer-inner{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:1rem;font-size:.8rem;color:var(--fg-dim)}.footer-links{display:flex;align-items:center;gap:0}.footer-links a{color:var(--fg-dim);transition:color var(--transition)}.footer-links a:hover{color:var(--accent)}.social-icons{display:flex;gap:1rem;align-items:center}.social-icons a{color:var(--fg-dim);transition:color var(--transition);display:inline-flex;align-items:center}.social-icons a:hover{color:var(--accent)}.social-icons svg{width:18px;height:18px;fill:currentColor}.post-header{margin-bottom:2.5rem}.post-header h1{color:var(--accent);font-size:1.6rem;margin-bottom:.5rem}.post-meta{color:var(--fg-dim);font-size:.85rem;display:flex;align-items:center;flex-wrap:wrap;gap:.5rem}.post-meta .separator{color:var(--border)}.post-tags{display:inline-flex;gap:.4rem}.post-tag{color:var(--accent-dim);font-size:.8rem}.post-tag:hover{color:var(--accent)}.post-content{font-size:.95rem}.post-content h2::before{content:'# ';color:var(--accent);font-weight:400}.post-content h3::before{content:'## ';color:var(--accent);font-weight:400}.post-content a{border-bottom:1px solid var(--accent-dim)}.post-content a:hover{border-bottom-color:var(--accent)}.post-content img{margin:1.5rem 0;border:1px solid var(--border)}code{font-family:var(--font-mono);font-size:.88em;background:var(--bg-alt);padding:.15em .35em;border-radius:3px;color:var(--fg-bright)}pre{background:var(--code-bg);border:1px solid var(--border);border-radius:4px;padding:1.2rem 1.5rem;overflow-x:auto;margin:1.5rem 0;line-height:1.5;position:relative}pre code{background:0 0;padding:0;font-size:.85rem;color:var(--fg)}.highlight{position:relative;margin:1.5rem 0}.highlight pre{margin:0}table{width:100%;border-collapse:collapse;margin:1.5rem 0;font-size:.9rem}th,td{padding:.6rem .8rem;text-align:left;border-bottom:1px solid var(--border)}th{color:var(--fg-bright);font-weight:700}.back-link{display:inline-flex;align-items:center;gap:.3rem;color:var(--fg-dim);font-size:.85rem;margin-bottom:2rem;transition:color var(--transition)}.back-link:hover{color:var(--accent)}.about-header{display:flex;align-items:flex-start;gap:2rem;margin-bottom:2rem}.about-avatar{width:140px;height:140px;border-radius:50%;border:2px solid var(--border);flex-shrink:0;object-fit:cover}.about-content h1{margin-bottom:.25rem}.about-tagline{color:var(--fg-dim);font-size:.95rem;margin-bottom:1rem}.archive-year{margin-bottom:2.5rem}.page-title{color:var(--accent);margin-bottom:1.5rem}@media(max-width:600px){:root{--font-size:14px;--content-pad:1.2rem}.site-header-inner{flex-direction:column;gap:.5rem}.post-list-item{flex-direction:column;gap:.15rem}.post-date{min-width:auto}.about-header{flex-direction:column;align-items:center;text-align:center}.about-avatar{width:120px;height:120px}.site-footer-inner{flex-direction:column;align-items:flex-start}}.projects-intro{color:var(--fg-dim);margin-bottom:2rem;font-size:.95rem}.projects-grid{display:flex;flex-direction:column;gap:.75rem}.project-card{display:flex;align-items:center;justify-content:space-between;padding:1.2rem 1.5rem;background:var(--bg-alt);border:1px solid var(--border);border-radius:6px;transition:border-color var(--transition),background-color var(--transition),transform var(--transition);color:var(--fg);text-decoration:none}.project-card:hover{border-color:var(--accent);background:var(--bg-hover);transform:translateX(4px);color:var(--fg)}.project-card-inner{flex:1}.project-card-name{font-size:1rem;color:var(--accent);margin:0 0 .3rem}.project-card-desc{font-size:.85rem;color:var(--fg-dim);margin:0;line-height:1.5}.project-card-tags{display:flex;gap:.5rem;margin-top:.6rem;flex-wrap:wrap}.project-card-tag{font-size:.72rem;color:var(--fg-dim);background:var(--bg);padding:.15rem .5rem;border-radius:3px;border:1px solid var(--border)}.project-card-arrow{color:var(--fg-dim);font-size:1.2rem;margin-left:1rem;transition:color var(--transition),transform var(--transition)}.project-card:hover .project-card-arrow{color:var(--accent);transform:translateX(3px)}.resume-page{max-width:100%}.resume-header{margin-bottom:2.5rem;padding-bottom:1.5rem;border-bottom:1px solid var(--border)}.resume-name{color:var(--fg-bright);font-size:1.8rem;margin-bottom:.25rem}.resume-tagline{color:var(--fg-dim);font-size:.95rem;margin-bottom:1rem}.resume-contact{display:flex;gap:.5rem;flex-wrap:wrap;font-size:.85rem}.resume-contact a{color:var(--accent);padding:.2rem .6rem;border:1px solid var(--border);border-radius:3px;transition:border-color var(--transition),background-color var(--transition);display:inline-flex;align-items:center;gap:.35rem}.resume-contact a svg{width:14px;height:14px;fill:currentColor;flex-shrink:0}.resume-contact a:hover{border-color:var(--accent);background:var(--accent-glow)}.resume-section{margin-bottom:2.5rem}.resume-section-title{font-size:1.1rem;color:var(--accent);margin:0 0 1.2rem;padding-bottom:.4rem;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:.5rem}.resume-entry{margin-bottom:1.5rem}.resume-entry-header{display:flex;justify-content:space-between;align-items:flex-start;flex-wrap:wrap;gap:.5rem;margin-bottom:.5rem}.resume-entry-title{font-size:1rem;color:var(--fg-bright);margin:0}.resume-entry-org{font-size:.9rem;color:var(--fg-dim)}.resume-entry-date{font-size:.8rem;color:var(--fg-dim);white-space:nowrap}.resume-entry-details{padding-left:1.2rem;font-size:.9rem;color:var(--fg);margin:0}.resume-entry-details li{margin-bottom:.25rem}.resume-skills{display:flex;flex-direction:column;gap:.6rem}.resume-skill-group{display:flex;align-items:baseline;gap:1rem;font-size:.9rem}.resume-skill-label{color:var(--fg-bright);font-size:.85rem;min-width:6rem;flex-shrink:0;margin:0}.resume-skill-items{color:var(--fg)}.resume-tech-stack{font-size:.8rem;color:var(--fg-dim);margin-bottom:.5rem;font-style:italic}.resume-entry-links{display:flex;gap:1rem;margin-top:.4rem;font-size:.8rem}.resume-entry-links a{color:var(--accent-dim)}.resume-entry-links a:hover{color:var(--accent)}.resume-download{margin-top:2rem;padding-top:1.5rem;border-top:1px solid var(--border)}.resume-download-btn{display:inline-flex;align-items:center;gap:.4rem;color:var(--accent);font-size:.9rem;padding:.5rem 1.2rem;border:1px solid var(--accent-dim);border-radius:4px;transition:background-color var(--transition),border-color var(--transition)}.resume-download-btn:hover{background:var(--accent-glow);border-color:var(--accent);color:var(--accent)}@media(max-width:600px){.project-card{padding:1rem}.resume-entry-header{flex-direction:column}.resume-skill-group{flex-direction:column;gap:.2rem}.resume-skill-label{min-width:auto}}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:var(--bg)}::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--fg-dim)}@keyframes fadeIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}main{animation:fadeIn .4s ease-out} \ No newline at end of file diff --git a/public/css/style.min.1bf64ca36e792ef061bd67d08d079d1c791150289a78f04c2b8616cfd642d09a.css b/public/css/style.min.1bf64ca36e792ef061bd67d08d079d1c791150289a78f04c2b8616cfd642d09a.css deleted file mode 100644 index 79793b6..0000000 --- a/public/css/style.min.1bf64ca36e792ef061bd67d08d079d1c791150289a78f04c2b8616cfd642d09a.css +++ /dev/null @@ -1 +0,0 @@ -@import 'https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap';:root{--bg:#1d1f21;--bg-alt:#282a2e;--bg-hover:#2a2d31;--fg:#c9cacc;--fg-dim:#6c7a89;--fg-bright:#e8e8e8;--accent:#2bbc8a;--accent-dim:#239b72;--accent-glow:rgba(43, 188, 138, 0.1);--border:#373b41;--code-bg:#1a1c1e;--font-mono:'JetBrains Mono', 'Fira Code', 'Cascadia Code', 'SF Mono', monospace;--font-size:15px;--line-height:1.7;--max-width:720px;--content-pad:1.5rem;--transition:150ms ease}*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}html{font-size:var(--font-size);scroll-behavior:smooth;-webkit-text-size-adjust:100%}body{font-family:var(--font-mono);font-weight:400;line-height:var(--line-height);color:var(--fg);background-color:var(--bg);min-height:100vh;display:flex;flex-direction:column;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}::selection{background-color:var(--accent);color:var(--bg)}.site-wrapper{width:100%;max-width:var(--max-width);margin:0 auto;padding:0 var(--content-pad);flex:1}main{padding:2rem 0 4rem}a{color:var(--accent);text-decoration:none;transition:color var(--transition),border-color var(--transition)}a:hover{color:var(--fg-bright)}h1,h2,h3,h4,h5,h6{font-family:var(--font-mono);font-weight:700;color:var(--fg-bright);line-height:1.3}h1{font-size:1.8rem;margin-bottom:.5rem}h2{font-size:1.4rem;margin:2.5rem 0 1rem}h3{font-size:1.15rem;margin:2rem 0 .75rem}h4{font-size:1rem;margin:1.5rem 0 .5rem}p{margin-bottom:1.2rem}strong{font-weight:700;color:var(--fg-bright)}em{font-style:italic}hr{border:none;border-top:1px solid var(--border);margin:2.5rem 0}blockquote{border-left:3px solid var(--accent);padding-left:1rem;margin:1.5rem 0;color:var(--fg-dim);font-style:italic}ul,ol{padding-left:1.5rem;margin-bottom:1.2rem}li{margin-bottom:.3rem}img{max-width:100%;height:auto;border-radius:4px}.site-header{padding:2.5rem 0 1rem}.site-header-inner{display:flex;align-items:baseline;justify-content:space-between;flex-wrap:wrap;gap:.75rem}.site-title{font-size:1.4rem;font-weight:700;color:var(--fg-bright);text-decoration:none;letter-spacing:-.02em}.site-title:hover{color:var(--accent)}.site-nav{display:flex;align-items:center;gap:0}.site-nav a{color:var(--accent);font-size:.9rem;padding:.15rem 0;border-bottom:1px solid transparent;transition:border-color var(--transition),color var(--transition)}.site-nav a:hover,.site-nav a.active{border-bottom-color:var(--accent)}.nav-separator{color:var(--fg-dim);margin:0 .6rem;user-select:none;font-size:.85rem}.home-bio{margin:1rem 0 1.5rem;font-size:.95rem;color:var(--fg);max-width:600px}.home-bio p{margin-bottom:1rem}.social-line{color:var(--fg-dim);font-size:.9rem;margin-bottom:0}.social-line a{color:var(--fg);border-bottom:1px dashed var(--fg-dim);transition:color var(--transition),border-color var(--transition)}.social-line a:hover{color:var(--accent);border-bottom-color:var(--accent)}.section-heading{font-size:1.2rem;color:var(--accent);font-weight:700;margin:3rem 0 1.5rem;display:flex;align-items:center;gap:.75rem}.section-heading::after{content:'';flex:1;height:1px;background:var(--border)}.post-list{list-style:none;padding:0;margin:0}.post-list-item{display:flex;align-items:baseline;gap:1.5rem;padding:.4rem 0;margin:0;transition:background-color var(--transition)}.post-list-item:hover{background-color:var(--accent-glow);margin:0 -.5rem;padding:.4rem .5rem;border-radius:3px}.post-date{color:var(--fg-dim);font-size:.85rem;white-space:nowrap;min-width:7rem;flex-shrink:0}.post-title-link{color:var(--fg);text-decoration:none;border-bottom:1px solid transparent;transition:color var(--transition),border-color var(--transition)}.post-title-link:hover{color:var(--accent);border-bottom-color:var(--accent)}.year-heading{font-size:1.1rem;font-weight:700;color:var(--fg-bright);margin:2rem 0 .75rem;padding-bottom:.25rem}.year-heading:first-child{margin-top:0}.project-list{list-style:none;padding:0;margin:0}.project-item{padding:.4rem 0;font-size:.95rem}.project-name{color:var(--fg);border-bottom:1px dashed var(--fg-dim);transition:color var(--transition),border-color var(--transition)}.project-name:hover{color:var(--accent);border-bottom-color:var(--accent)}.project-desc{color:var(--fg-dim)}.project-desc::before{content:': '}.site-footer{padding:2rem 0;margin-top:auto;border-top:1px solid var(--border)}.site-footer-inner{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:1rem;font-size:.8rem;color:var(--fg-dim)}.footer-links{display:flex;align-items:center;gap:0}.footer-links a{color:var(--fg-dim);transition:color var(--transition)}.footer-links a:hover{color:var(--accent)}.social-icons{display:flex;gap:1rem;align-items:center}.social-icons a{color:var(--fg-dim);transition:color var(--transition);display:inline-flex;align-items:center}.social-icons a:hover{color:var(--accent)}.social-icons svg{width:18px;height:18px;fill:currentColor}.post-header{margin-bottom:2.5rem}.post-header h1{color:var(--accent);font-size:1.6rem;margin-bottom:.5rem}.post-meta{color:var(--fg-dim);font-size:.85rem;display:flex;align-items:center;flex-wrap:wrap;gap:.5rem}.post-meta .separator{color:var(--border)}.post-tags{display:inline-flex;gap:.4rem}.post-tag{color:var(--accent-dim);font-size:.8rem}.post-tag:hover{color:var(--accent)}.post-content{font-size:.95rem}.post-content h2::before{content:'# ';color:var(--accent);font-weight:400}.post-content h3::before{content:'## ';color:var(--accent);font-weight:400}.post-content a{border-bottom:1px solid var(--accent-dim)}.post-content a:hover{border-bottom-color:var(--accent)}.post-content img{margin:1.5rem 0;border:1px solid var(--border)}code{font-family:var(--font-mono);font-size:.88em;background:var(--bg-alt);padding:.15em .35em;border-radius:3px;color:var(--fg-bright)}pre{background:var(--code-bg);border:1px solid var(--border);border-radius:4px;padding:1.2rem 1.5rem;overflow-x:auto;margin:1.5rem 0;line-height:1.5;position:relative}pre code{background:0 0;padding:0;font-size:.85rem;color:var(--fg)}.highlight{position:relative;margin:1.5rem 0}.highlight pre{margin:0}table{width:100%;border-collapse:collapse;margin:1.5rem 0;font-size:.9rem}th,td{padding:.6rem .8rem;text-align:left;border-bottom:1px solid var(--border)}th{color:var(--fg-bright);font-weight:700}.back-link{display:inline-flex;align-items:center;gap:.3rem;color:var(--fg-dim);font-size:.85rem;margin-bottom:2rem;transition:color var(--transition)}.back-link:hover{color:var(--accent)}.about-header{display:flex;align-items:flex-start;gap:2rem;margin-bottom:2rem}.about-avatar{width:140px;height:140px;border-radius:50%;border:2px solid var(--border);flex-shrink:0;object-fit:cover}.about-content h1{margin-bottom:.25rem}.about-tagline{color:var(--fg-dim);font-size:.95rem;margin-bottom:1rem}.archive-year{margin-bottom:2.5rem}.page-title{color:var(--accent);margin-bottom:1.5rem}@media(max-width:600px){:root{--font-size:14px;--content-pad:1.2rem}.site-header-inner{flex-direction:column;gap:.5rem}.post-list-item{flex-direction:column;gap:.15rem}.post-date{min-width:auto}.about-header{flex-direction:column;align-items:center;text-align:center}.about-avatar{width:120px;height:120px}.site-footer-inner{flex-direction:column;align-items:flex-start}}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:var(--bg)}::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--fg-dim)}@keyframes fadeIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}main{animation:fadeIn .4s ease-out} \ No newline at end of file diff --git a/public/css/style.min.1dc3dc626886b3a2e4d0a0dc0659f1e03680e83a6330f590cd07641da37cac23.css b/public/css/style.min.1dc3dc626886b3a2e4d0a0dc0659f1e03680e83a6330f590cd07641da37cac23.css deleted file mode 100644 index 8dc9b87..0000000 --- a/public/css/style.min.1dc3dc626886b3a2e4d0a0dc0659f1e03680e83a6330f590cd07641da37cac23.css +++ /dev/null @@ -1 +0,0 @@ -@import 'https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap';:root{--bg:#1d1f21;--bg-alt:#282a2e;--bg-hover:#2a2d31;--fg:#c9cacc;--fg-dim:#6c7a89;--fg-bright:#e8e8e8;--accent:#2bbc8a;--accent-dim:#239b72;--accent-glow:rgba(43, 188, 138, 0.1);--border:#373b41;--code-bg:#1a1c1e;--font-mono:'JetBrains Mono', 'Fira Code', 'Cascadia Code', 'SF Mono', monospace;--font-size:15px;--line-height:1.7;--max-width:720px;--content-pad:1.5rem;--transition:150ms ease}*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}html{font-size:var(--font-size);scroll-behavior:smooth;-webkit-text-size-adjust:100%}body{font-family:var(--font-mono);font-weight:400;line-height:var(--line-height);color:var(--fg);background-color:var(--bg);min-height:100vh;display:flex;flex-direction:column;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}::selection{background-color:var(--accent);color:var(--bg)}.site-wrapper{width:100%;max-width:var(--max-width);margin:0 auto;padding:0 var(--content-pad);flex:1}main{padding:2rem 0 4rem}a{color:var(--accent);text-decoration:none;transition:color var(--transition),border-color var(--transition)}a:hover{color:var(--fg-bright)}h1,h2,h3,h4,h5,h6{font-family:var(--font-mono);font-weight:700;color:var(--fg-bright);line-height:1.3}h1{font-size:1.8rem;margin-bottom:.5rem}h2{font-size:1.4rem;margin:2.5rem 0 1rem}h3{font-size:1.15rem;margin:2rem 0 .75rem}h4{font-size:1rem;margin:1.5rem 0 .5rem}p{margin-bottom:1.2rem}strong{font-weight:700;color:var(--fg-bright)}em{font-style:italic}hr{border:none;border-top:1px solid var(--border);margin:2.5rem 0}blockquote{border-left:3px solid var(--accent);padding-left:1rem;margin:1.5rem 0;color:var(--fg-dim);font-style:italic}ul,ol{padding-left:1.5rem;margin-bottom:1.2rem}li{margin-bottom:.3rem}img{max-width:100%;height:auto;border-radius:4px}.site-header{padding:2.5rem 0 1rem}.site-header-inner{display:flex;align-items:baseline;justify-content:space-between;flex-wrap:wrap;gap:.75rem}.site-title{font-size:1.4rem;font-weight:700;color:var(--fg-bright);text-decoration:none;letter-spacing:-.02em}.site-title:hover{color:var(--accent)}.site-nav{display:flex;align-items:center;gap:0}.site-nav a{color:var(--accent);font-size:.9rem;padding:.15rem 0;border-bottom:1px solid transparent;transition:border-color var(--transition),color var(--transition)}.site-nav a:hover,.site-nav a.active{border-bottom-color:var(--accent)}.nav-separator{color:var(--fg-dim);margin:0 .6rem;user-select:none;font-size:.85rem}.home-bio{margin:1rem 0 1.5rem;font-size:.95rem;color:var(--fg);max-width:600px}.home-bio p{margin-bottom:1rem}.social-line{color:var(--fg-dim);font-size:.9rem;margin-bottom:0}.social-line a{color:var(--fg);border-bottom:1px dashed var(--fg-dim);transition:color var(--transition),border-color var(--transition)}.social-line a:hover{color:var(--accent);border-bottom-color:var(--accent)}.section-heading{font-size:1.2rem;color:var(--accent);font-weight:700;margin:3rem 0 1.5rem;display:flex;align-items:center;gap:.75rem}.section-heading::after{content:'';flex:1;height:1px;background:var(--border)}.post-list{list-style:none;padding:0;margin:0}.post-list-item{display:flex;align-items:baseline;gap:1.5rem;padding:.4rem 0;margin:0;transition:background-color var(--transition)}.post-list-item:hover{background-color:var(--accent-glow);margin:0 -.5rem;padding:.4rem .5rem;border-radius:3px}.post-date{color:var(--fg-dim);font-size:.85rem;white-space:nowrap;min-width:7rem;flex-shrink:0}.post-title-link{color:var(--fg);text-decoration:none;border-bottom:1px solid transparent;transition:color var(--transition),border-color var(--transition)}.post-title-link:hover{color:var(--accent);border-bottom-color:var(--accent)}.year-heading{font-size:1.1rem;font-weight:700;color:var(--fg-bright);margin:2rem 0 .75rem;padding-bottom:.25rem}.year-heading:first-child{margin-top:0}.project-list{list-style:none;padding:0;margin:0}.project-item{padding:.4rem 0;font-size:.95rem}.project-name{color:var(--fg);border-bottom:1px dashed var(--fg-dim);transition:color var(--transition),border-color var(--transition)}.project-name:hover{color:var(--accent);border-bottom-color:var(--accent)}.project-desc{color:var(--fg-dim)}.project-desc::before{content:': '}.site-footer{padding:2rem 0;margin-top:auto;border-top:1px solid var(--border)}.site-footer-inner{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:1rem;font-size:.8rem;color:var(--fg-dim)}.footer-links{display:flex;align-items:center;gap:0}.footer-links a{color:var(--fg-dim);transition:color var(--transition)}.footer-links a:hover{color:var(--accent)}.social-icons{display:flex;gap:1rem;align-items:center}.social-icons a{color:var(--fg-dim);transition:color var(--transition);display:inline-flex;align-items:center}.social-icons a:hover{color:var(--accent)}.social-icons svg{width:18px;height:18px;fill:currentColor}.post-header{margin-bottom:2.5rem}.post-header h1{color:var(--accent);font-size:1.6rem;margin-bottom:.5rem}.post-meta{color:var(--fg-dim);font-size:.85rem;display:flex;align-items:center;flex-wrap:wrap;gap:.5rem}.post-meta .separator{color:var(--border)}.post-tags{display:inline-flex;gap:.4rem}.post-tag{color:var(--accent-dim);font-size:.8rem}.post-tag:hover{color:var(--accent)}.post-content{font-size:.95rem}.post-content h2::before{content:'# ';color:var(--accent);font-weight:400}.post-content h3::before{content:'## ';color:var(--accent);font-weight:400}.post-content a{border-bottom:1px solid var(--accent-dim)}.post-content a:hover{border-bottom-color:var(--accent)}.post-content img{margin:1.5rem 0;border:1px solid var(--border)}code{font-family:var(--font-mono);font-size:.88em;background:var(--bg-alt);padding:.15em .35em;border-radius:3px;color:var(--fg-bright)}pre{background:var(--code-bg);border:1px solid var(--border);border-radius:4px;padding:1.2rem 1.5rem;overflow-x:auto;margin:1.5rem 0;line-height:1.5;position:relative}pre code{background:0 0;padding:0;font-size:.85rem;color:var(--fg)}.highlight{position:relative;margin:1.5rem 0}.highlight pre{margin:0}table{width:100%;border-collapse:collapse;margin:1.5rem 0;font-size:.9rem}th,td{padding:.6rem .8rem;text-align:left;border-bottom:1px solid var(--border)}th{color:var(--fg-bright);font-weight:700}.back-link{display:inline-flex;align-items:center;gap:.3rem;color:var(--fg-dim);font-size:.85rem;margin-bottom:2rem;transition:color var(--transition)}.back-link:hover{color:var(--accent)}.about-header{display:flex;align-items:flex-start;gap:2rem;margin-bottom:2rem}.about-avatar{width:140px;height:140px;border-radius:50%;border:2px solid var(--border);flex-shrink:0;object-fit:cover}.about-content h1{margin-bottom:.25rem}.about-tagline{color:var(--fg-dim);font-size:.95rem;margin-bottom:1rem}.archive-year{margin-bottom:2.5rem}.page-title{color:var(--accent);margin-bottom:1.5rem}@media(max-width:600px){:root{--font-size:14px;--content-pad:1.2rem}.site-header-inner{flex-direction:column;gap:.5rem}.post-list-item{flex-direction:column;gap:.15rem}.post-date{min-width:auto}.about-header{flex-direction:column;align-items:center;text-align:center}.about-avatar{width:120px;height:120px}.site-footer-inner{flex-direction:column;align-items:flex-start}}.projects-intro{color:var(--fg-dim);margin-bottom:2rem;font-size:.95rem}.projects-grid{display:flex;flex-direction:column;gap:.75rem}.project-card{display:flex;align-items:center;justify-content:space-between;padding:1.2rem 1.5rem;background:var(--bg-alt);border:1px solid var(--border);border-radius:6px;transition:border-color var(--transition),background-color var(--transition),transform var(--transition);color:var(--fg);text-decoration:none}.project-card:hover{border-color:var(--accent);background:var(--bg-hover);transform:translateX(4px);color:var(--fg)}.project-card-inner{flex:1}.project-card-name{font-size:1rem;color:var(--accent);margin:0 0 .3rem}.project-card-desc{font-size:.85rem;color:var(--fg-dim);margin:0;line-height:1.5}.project-card-tags{display:flex;gap:.5rem;margin-top:.6rem;flex-wrap:wrap}.project-card-tag{font-size:.72rem;color:var(--fg-dim);background:var(--bg);padding:.15rem .5rem;border-radius:3px;border:1px solid var(--border)}.project-card-arrow{color:var(--fg-dim);font-size:1.2rem;margin-left:1rem;transition:color var(--transition),transform var(--transition)}.project-card:hover .project-card-arrow{color:var(--accent);transform:translateX(3px)}.resume-page{max-width:100%}.resume-header{margin-bottom:2.5rem;padding-bottom:1.5rem;border-bottom:1px solid var(--border)}.resume-name{color:var(--fg-bright);font-size:1.8rem;margin-bottom:.25rem}.resume-tagline{color:var(--fg-dim);font-size:.95rem;margin-bottom:1rem}.resume-contact{display:flex;gap:.5rem;flex-wrap:wrap;font-size:.85rem}.resume-contact a{color:var(--accent);padding:.2rem .6rem;border:1px solid var(--border);border-radius:3px;transition:border-color var(--transition),background-color var(--transition)}.resume-contact a:hover{border-color:var(--accent);background:var(--accent-glow)}.resume-section{margin-bottom:2.5rem}.resume-section-title{font-size:1.1rem;color:var(--accent);margin:0 0 1.2rem;padding-bottom:.4rem;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:.5rem}.resume-entry{margin-bottom:1.5rem}.resume-entry-header{display:flex;justify-content:space-between;align-items:flex-start;flex-wrap:wrap;gap:.5rem;margin-bottom:.5rem}.resume-entry-title{font-size:1rem;color:var(--fg-bright);margin:0}.resume-entry-org{font-size:.9rem;color:var(--fg-dim)}.resume-entry-date{font-size:.8rem;color:var(--fg-dim);white-space:nowrap}.resume-entry-details{padding-left:1.2rem;font-size:.9rem;color:var(--fg);margin:0}.resume-entry-details li{margin-bottom:.25rem}.resume-skills{display:flex;flex-direction:column;gap:.6rem}.resume-skill-group{display:flex;align-items:baseline;gap:1rem;font-size:.9rem}.resume-skill-label{color:var(--fg-bright);font-size:.85rem;min-width:6rem;flex-shrink:0;margin:0}.resume-skill-items{color:var(--fg)}.resume-tech-stack{font-size:.8rem;color:var(--fg-dim);margin-bottom:.5rem;font-style:italic}.resume-entry-links{display:flex;gap:1rem;margin-top:.4rem;font-size:.8rem}.resume-entry-links a{color:var(--accent-dim)}.resume-entry-links a:hover{color:var(--accent)}.resume-download{margin-top:2rem;padding-top:1.5rem;border-top:1px solid var(--border)}.resume-download-btn{display:inline-flex;align-items:center;gap:.4rem;color:var(--accent);font-size:.9rem;padding:.5rem 1.2rem;border:1px solid var(--accent-dim);border-radius:4px;transition:background-color var(--transition),border-color var(--transition)}.resume-download-btn:hover{background:var(--accent-glow);border-color:var(--accent);color:var(--accent)}@media(max-width:600px){.project-card{padding:1rem}.resume-entry-header{flex-direction:column}.resume-skill-group{flex-direction:column;gap:.2rem}.resume-skill-label{min-width:auto}}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:var(--bg)}::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--fg-dim)}@keyframes fadeIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}main{animation:fadeIn .4s ease-out} \ No newline at end of file diff --git a/public/css/style.min.53f4145bed15e8b9aa091635affc6742b2f43980dd1a56321f57b369028d237b.css b/public/css/style.min.53f4145bed15e8b9aa091635affc6742b2f43980dd1a56321f57b369028d237b.css deleted file mode 100644 index cfb14d6..0000000 --- a/public/css/style.min.53f4145bed15e8b9aa091635affc6742b2f43980dd1a56321f57b369028d237b.css +++ /dev/null @@ -1 +0,0 @@ -@import 'https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap';:root{--bg:#1d1f21;--bg-alt:#282a2e;--bg-hover:#2a2d31;--fg:#c9cacc;--fg-dim:#6c7a89;--fg-bright:#e8e8e8;--accent:#2bbc8a;--accent-dim:#239b72;--accent-glow:rgba(43, 188, 138, 0.1);--border:#373b41;--code-bg:#1a1c1e;--font-mono:'JetBrains Mono', 'Fira Code', 'Cascadia Code', 'SF Mono', monospace;--font-size:15px;--line-height:1.7;--max-width:720px;--content-pad:1.5rem;--transition:150ms ease}*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}html{font-size:var(--font-size);scroll-behavior:smooth;-webkit-text-size-adjust:100%}body{font-family:var(--font-mono);font-weight:400;line-height:var(--line-height);color:var(--fg);background-color:var(--bg);min-height:100vh;display:flex;flex-direction:column;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}::selection{background-color:var(--accent);color:var(--bg)}.site-wrapper{width:100%;max-width:var(--max-width);margin:0 auto;padding:0 var(--content-pad);flex:1}main{padding:2rem 0 4rem}a{color:var(--accent);text-decoration:none;transition:color var(--transition),border-color var(--transition)}a:hover{color:var(--fg-bright)}h1,h2,h3,h4,h5,h6{font-family:var(--font-mono);font-weight:700;color:var(--fg-bright);line-height:1.3}h1{font-size:1.8rem;margin-bottom:.5rem}h2{font-size:1.4rem;margin:2.5rem 0 1rem}h3{font-size:1.15rem;margin:2rem 0 .75rem}h4{font-size:1rem;margin:1.5rem 0 .5rem}p{margin-bottom:1.2rem}strong{font-weight:700;color:var(--fg-bright)}em{font-style:italic}hr{border:none;border-top:1px solid var(--border);margin:2.5rem 0}blockquote{border-left:3px solid var(--accent);padding-left:1rem;margin:1.5rem 0;color:var(--fg-dim);font-style:italic}ul,ol{padding-left:1.5rem;margin-bottom:1.2rem}li{margin-bottom:.3rem}img{max-width:100%;height:auto;border-radius:4px}.site-header{padding:2.5rem 0 1rem}.site-header-inner{display:flex;align-items:baseline;justify-content:space-between;flex-wrap:wrap;gap:.75rem}.site-title{font-size:1.4rem;font-weight:700;color:var(--fg-bright);text-decoration:none;letter-spacing:-.02em}.site-title:hover{color:var(--accent)}.site-nav{display:flex;align-items:center;gap:0}.site-nav a{color:var(--accent);font-size:.9rem;padding:.15rem 0;border-bottom:1px solid transparent;transition:border-color var(--transition),color var(--transition)}.site-nav a:hover,.site-nav a.active{border-bottom-color:var(--accent)}.nav-separator{color:var(--fg-dim);margin:0 .6rem;user-select:none;font-size:.85rem}.home-bio{margin:1rem 0 1.5rem;font-size:.95rem;color:var(--fg);max-width:600px}.home-bio p{margin-bottom:1rem}.social-line{color:var(--fg-dim);font-size:.9rem;margin-bottom:0}.social-line a{color:var(--fg);border-bottom:1px dashed var(--fg-dim);transition:color var(--transition),border-color var(--transition)}.social-line a:hover{color:var(--accent);border-bottom-color:var(--accent)}.section-heading{font-size:1.2rem;color:var(--accent);font-weight:700;margin:3rem 0 1.5rem;display:flex;align-items:center;gap:.75rem}.section-heading::after{content:'';flex:1;height:1px;background:var(--border)}.post-list{list-style:none;padding:0;margin:0}.post-list-item{display:flex;align-items:baseline;gap:1.5rem;padding:.4rem 0;margin:0;transition:background-color var(--transition)}.post-list-item:hover{background-color:var(--accent-glow);margin:0 -.5rem;padding:.4rem .5rem;border-radius:3px}.post-date{color:var(--fg-dim);font-size:.85rem;white-space:nowrap;min-width:7rem;flex-shrink:0}.post-title-link{color:var(--fg);text-decoration:none;border-bottom:1px solid transparent;transition:color var(--transition),border-color var(--transition)}.post-title-link:hover{color:var(--accent);border-bottom-color:var(--accent)}.year-heading{font-size:1.1rem;font-weight:700;color:var(--fg-bright);margin:2rem 0 .75rem;padding-bottom:.25rem}.year-heading:first-child{margin-top:0}.project-list{list-style:none;padding:0;margin:0}.project-item{padding:.4rem 0;font-size:.95rem}.project-name{color:var(--fg);border-bottom:1px dashed var(--fg-dim);transition:color var(--transition),border-color var(--transition)}.project-name:hover{color:var(--accent);border-bottom-color:var(--accent)}.project-desc{color:var(--fg-dim)}.project-desc::before{content:': '}.site-footer{padding:2rem 0;margin-top:auto;border-top:1px solid var(--border)}.site-footer-inner{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:1rem;font-size:.8rem;color:var(--fg-dim)}.footer-links{display:flex;align-items:center;gap:0}.footer-links a{color:var(--fg-dim);transition:color var(--transition)}.footer-links a:hover{color:var(--accent)}.social-icons{display:flex;gap:1rem;align-items:center}.social-icons a{color:var(--fg-dim);transition:color var(--transition);display:inline-flex;align-items:center}.social-icons a:hover{color:var(--accent)}.social-icons svg{width:18px;height:18px;fill:currentColor}.post-header{margin-bottom:2.5rem}.post-header h1{color:var(--accent);font-size:1.6rem;margin-bottom:.5rem}.post-meta{color:var(--fg-dim);font-size:.85rem;display:flex;align-items:center;flex-wrap:wrap;gap:.5rem}.post-meta .separator{color:var(--border)}.post-tags{display:inline-flex;gap:.4rem}.post-tag{color:var(--accent-dim);font-size:.8rem}.post-tag:hover{color:var(--accent)}.post-content{font-size:.95rem}.post-content h2::before{content:'# ';color:var(--accent);font-weight:400}.post-content h3::before{content:'## ';color:var(--accent);font-weight:400}.post-content a{border-bottom:1px solid var(--accent-dim)}.post-content a:hover{border-bottom-color:var(--accent)}.post-content img{margin:1.5rem 0;border:1px solid var(--border)}code{font-family:var(--font-mono);font-size:.88em;background:var(--bg-alt);padding:.15em .35em;border-radius:3px;color:var(--fg-bright)}pre{background:var(--code-bg);border:1px solid var(--border);border-radius:4px;padding:1.2rem 1.5rem;overflow-x:auto;margin:1.5rem 0;line-height:1.5;position:relative}pre code{background:0 0;padding:0;font-size:.85rem;color:var(--fg)}.highlight{position:relative;margin:1.5rem 0}.highlight pre{margin:0}table{width:100%;border-collapse:collapse;margin:1.5rem 0;font-size:.9rem}th,td{padding:.6rem .8rem;text-align:left;border-bottom:1px solid var(--border)}th{color:var(--fg-bright);font-weight:700}.back-link{display:inline-flex;align-items:center;gap:.3rem;color:var(--fg-dim);font-size:.85rem;margin-bottom:2rem;transition:color var(--transition)}.back-link:hover{color:var(--accent)}.about-header{display:flex;align-items:flex-start;gap:2rem;margin-bottom:2rem}.about-avatar{width:140px;height:140px;border-radius:50%;border:2px solid var(--border);flex-shrink:0;object-fit:cover}.about-content h1{margin-bottom:.25rem}.about-tagline{color:var(--fg-dim);font-size:.95rem;margin-bottom:1rem}.archive-year{margin-bottom:2.5rem}.page-title{color:var(--accent);margin-bottom:1.5rem}@media(max-width:600px){:root{--font-size:14px;--content-pad:1.2rem}.site-header-inner{flex-direction:column;gap:.5rem}.post-list-item{flex-direction:column;gap:.15rem}.post-date{min-width:auto}.about-header{flex-direction:column;align-items:center;text-align:center}.about-avatar{width:120px;height:120px}.site-footer-inner{flex-direction:column;align-items:flex-start}}.projects-intro{color:var(--fg-dim);margin-bottom:2rem;font-size:.95rem}.projects-grid{display:flex;flex-direction:column;gap:.75rem}.project-card{display:flex;align-items:center;justify-content:space-between;padding:1.2rem 1.5rem;background:var(--bg-alt);border:1px solid var(--border);border-radius:6px;transition:border-color var(--transition),background-color var(--transition),transform var(--transition);color:var(--fg);text-decoration:none}.project-card:hover{border-color:var(--accent);background:var(--bg-hover);transform:translateX(4px);color:var(--fg)}.project-card-inner{flex:1}.project-card-name{font-size:1rem;color:var(--accent);margin:0 0 .3rem}.project-card-desc{font-size:.85rem;color:var(--fg-dim);margin:0;line-height:1.5}.project-card-tags{display:flex;gap:.5rem;margin-top:.6rem;flex-wrap:wrap}.project-card-tag{font-size:.72rem;color:var(--fg-dim);background:var(--bg);padding:.15rem .5rem;border-radius:3px;border:1px solid var(--border)}.project-card-arrow{color:var(--fg-dim);font-size:1.2rem;margin-left:1rem;transition:color var(--transition),transform var(--transition)}.project-card:hover .project-card-arrow{color:var(--accent);transform:translateX(3px)}.resume-page{max-width:100%}.resume-header{margin-bottom:2.5rem;padding-bottom:1.5rem;border-bottom:1px solid var(--border)}.resume-name{color:var(--fg-bright);font-size:1.8rem;margin-bottom:.25rem}.resume-tagline{color:var(--fg-dim);font-size:.95rem;margin-bottom:1rem}.resume-contact{display:flex;gap:.5rem;flex-wrap:wrap;font-size:.85rem}.resume-contact a{color:var(--accent);padding:.2rem .6rem;border:1px solid var(--border);border-radius:3px;transition:border-color var(--transition),background-color var(--transition)}.resume-contact a:hover{border-color:var(--accent);background:var(--accent-glow)}.resume-section{margin-bottom:2.5rem}.resume-section-title{font-size:1.1rem;color:var(--accent);margin:0 0 1.2rem;padding-bottom:.4rem;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:.5rem}.resume-entry{margin-bottom:1.5rem}.resume-entry-header{display:flex;justify-content:space-between;align-items:flex-start;flex-wrap:wrap;gap:.5rem;margin-bottom:.5rem}.resume-entry-title{font-size:1rem;color:var(--fg-bright);margin:0}.resume-entry-org{font-size:.9rem;color:var(--fg-dim)}.resume-entry-date{font-size:.8rem;color:var(--fg-dim);white-space:nowrap}.resume-entry-details{padding-left:1.2rem;font-size:.9rem;color:var(--fg);margin:0}.resume-entry-details li{margin-bottom:.25rem}.resume-skills{display:flex;flex-direction:column;gap:.6rem}.resume-skill-group{display:flex;align-items:baseline;gap:1rem;font-size:.9rem}.resume-skill-label{color:var(--fg-bright);font-size:.85rem;min-width:6rem;flex-shrink:0;margin:0}.resume-skill-items{color:var(--fg)}.resume-download{margin-top:2rem;padding-top:1.5rem;border-top:1px solid var(--border)}.resume-download-btn{display:inline-flex;align-items:center;gap:.4rem;color:var(--accent);font-size:.9rem;padding:.5rem 1.2rem;border:1px solid var(--accent-dim);border-radius:4px;transition:background-color var(--transition),border-color var(--transition)}.resume-download-btn:hover{background:var(--accent-glow);border-color:var(--accent);color:var(--accent)}@media(max-width:600px){.project-card{padding:1rem}.resume-entry-header{flex-direction:column}.resume-skill-group{flex-direction:column;gap:.2rem}.resume-skill-label{min-width:auto}}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:var(--bg)}::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--fg-dim)}@keyframes fadeIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}main{animation:fadeIn .4s ease-out} \ No newline at end of file diff --git a/public/css/style.min.86de29e37fd55fb8581ee5569d0e766097f2718b8f8029e4e11c87973d24a5b1.css b/public/css/style.min.86de29e37fd55fb8581ee5569d0e766097f2718b8f8029e4e11c87973d24a5b1.css deleted file mode 100644 index b19ade0..0000000 --- a/public/css/style.min.86de29e37fd55fb8581ee5569d0e766097f2718b8f8029e4e11c87973d24a5b1.css +++ /dev/null @@ -1 +0,0 @@ -@import 'https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap';:root{--bg:#1d1f21;--bg-alt:#282a2e;--bg-hover:#2a2d31;--fg:#c9cacc;--fg-dim:#6c7a89;--fg-bright:#e8e8e8;--accent:#2bbc8a;--accent-dim:#239b72;--accent-glow:rgba(43, 188, 138, 0.1);--border:#373b41;--code-bg:#1a1c1e;--font-mono:'JetBrains Mono', 'Fira Code', 'Cascadia Code', 'SF Mono', monospace;--font-size:15px;--line-height:1.7;--max-width:720px;--content-pad:1.5rem;--transition:150ms ease}*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}html{font-size:var(--font-size);scroll-behavior:smooth;-webkit-text-size-adjust:100%}body{font-family:var(--font-mono);font-weight:400;line-height:var(--line-height);color:var(--fg);background-color:var(--bg);min-height:100vh;display:flex;flex-direction:column;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}::selection{background-color:var(--accent);color:var(--bg)}.site-wrapper{width:100%;max-width:var(--max-width);margin:0 auto;padding:0 var(--content-pad);flex:1}main{padding:2rem 0 4rem}a{color:var(--accent);text-decoration:none;transition:color var(--transition),border-color var(--transition)}a:hover{color:var(--fg-bright)}h1,h2,h3,h4,h5,h6{font-family:var(--font-mono);font-weight:700;color:var(--fg-bright);line-height:1.3}h1{font-size:1.8rem;margin-bottom:.5rem}h2{font-size:1.4rem;margin:2.5rem 0 1rem}h3{font-size:1.15rem;margin:2rem 0 .75rem}h4{font-size:1rem;margin:1.5rem 0 .5rem}p{margin-bottom:1.2rem}strong{font-weight:700;color:var(--fg-bright)}em{font-style:italic}hr{border:none;border-top:1px solid var(--border);margin:2.5rem 0}blockquote{border-left:3px solid var(--accent);padding-left:1rem;margin:1.5rem 0;color:var(--fg-dim);font-style:italic}ul,ol{padding-left:1.5rem;margin-bottom:1.2rem}li{margin-bottom:.3rem}img{max-width:100%;height:auto;border-radius:4px}.site-header{padding:2.5rem 0 1rem}.site-header-inner{display:flex;align-items:baseline;justify-content:space-between;flex-wrap:wrap;gap:.75rem}.site-title{font-size:1.4rem;font-weight:700;color:var(--fg-bright);text-decoration:none;letter-spacing:-.02em}.site-title:hover{color:var(--accent)}.site-nav{display:flex;align-items:center;gap:0}.site-nav a{color:var(--accent);font-size:.9rem;padding:.15rem 0;border-bottom:1px solid transparent;transition:border-color var(--transition),color var(--transition)}.site-nav a:hover,.site-nav a.active{border-bottom-color:var(--accent)}.nav-separator{color:var(--fg-dim);margin:0 .6rem;user-select:none;font-size:.85rem}.home-bio{margin:1rem 0 1.5rem;font-size:.95rem;color:var(--fg);max-width:600px}.home-bio p{margin-bottom:1rem}.social-line{color:var(--fg-dim);font-size:.9rem;margin-bottom:0}.social-line a{color:var(--fg);border-bottom:1px dashed var(--fg-dim);transition:color var(--transition),border-color var(--transition)}.social-line a:hover{color:var(--accent);border-bottom-color:var(--accent)}.section-heading{font-size:1.2rem;color:var(--accent);font-weight:700;margin:3rem 0 1.5rem;display:flex;align-items:center;gap:.75rem}.section-heading::after{content:'';flex:1;height:1px;background:var(--border)}.post-list{list-style:none;padding:0;margin:0}.post-list-item{display:flex;align-items:baseline;gap:1.5rem;padding:.4rem 0;margin:0;transition:background-color var(--transition)}.post-list-item:hover{background-color:var(--accent-glow);margin:0 -.5rem;padding:.4rem .5rem;border-radius:3px}.post-date{color:var(--fg-dim);font-size:.85rem;white-space:nowrap;min-width:7rem;flex-shrink:0}.post-title-link{color:var(--fg);text-decoration:none;border-bottom:1px solid transparent;transition:color var(--transition),border-color var(--transition)}.post-title-link:hover{color:var(--accent);border-bottom-color:var(--accent)}.year-heading{font-size:1.1rem;font-weight:700;color:var(--fg-bright);margin:2rem 0 .75rem;padding-bottom:.25rem}.year-heading:first-child{margin-top:0}.project-list{list-style:none;padding:0;margin:0}.project-item{padding:.4rem 0;font-size:.95rem}.project-name{color:var(--fg);border-bottom:1px dashed var(--fg-dim);transition:color var(--transition),border-color var(--transition)}.project-name:hover{color:var(--accent);border-bottom-color:var(--accent)}.project-desc{color:var(--fg-dim)}.project-desc::before{content:': '}.site-footer{padding:2rem 0;margin-top:auto;border-top:1px solid var(--border)}.site-footer-inner{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:1rem;font-size:.8rem;color:var(--fg-dim)}.footer-links{display:flex;align-items:center;gap:0}.footer-links a{color:var(--fg-dim);transition:color var(--transition)}.footer-links a:hover{color:var(--accent)}.social-icons{display:flex;gap:1rem;align-items:center}.social-icons a{color:var(--fg-dim);transition:color var(--transition);display:inline-flex;align-items:center}.social-icons a:hover{color:var(--accent)}.social-icons svg{width:18px;height:18px;fill:currentColor}.post-header{margin-bottom:2.5rem}.post-header h1{color:var(--accent);font-size:1.6rem;margin-bottom:.5rem}.post-meta{color:var(--fg-dim);font-size:.85rem;display:flex;align-items:center;flex-wrap:wrap;gap:.5rem}.post-meta .separator{color:var(--border)}.post-tags{display:inline-flex;gap:.4rem}.post-tag{color:var(--accent-dim);font-size:.8rem}.post-tag:hover{color:var(--accent)}.post-content{font-size:.95rem}.post-content h2::before{content:'# ';color:var(--accent);font-weight:400}.post-content h3::before{content:'## ';color:var(--accent);font-weight:400}.post-content a{border-bottom:1px solid var(--accent-dim)}.post-content a:hover{border-bottom-color:var(--accent)}.post-content img{margin:1.5rem 0;border:1px solid var(--border)}code{font-family:var(--font-mono);font-size:.88em;background:var(--bg-alt);padding:.15em .35em;border-radius:3px;color:var(--fg-bright)}pre{background:var(--code-bg);border:1px solid var(--border);border-radius:4px;padding:1.2rem 1.5rem;overflow-x:auto;margin:1.5rem 0;line-height:1.5;position:relative}pre code{background:0 0;padding:0;font-size:.85rem;color:var(--fg)}.highlight{position:relative;margin:1.5rem 0}.highlight pre{margin:0}table{width:100%;border-collapse:collapse;margin:1.5rem 0;font-size:.9rem}th,td{padding:.6rem .8rem;text-align:left;border-bottom:1px solid var(--border)}th{color:var(--fg-bright);font-weight:700}.back-link{display:inline-flex;align-items:center;gap:.3rem;color:var(--fg-dim);font-size:.85rem;margin-bottom:2rem;transition:color var(--transition)}.back-link:hover{color:var(--accent)}.about-header{display:flex;align-items:flex-start;gap:2rem;margin-bottom:2rem}.about-avatar{width:140px;height:140px;border-radius:50%;border:2px solid var(--border);flex-shrink:0;object-fit:cover}.about-content h1{margin-bottom:.25rem}.about-tagline{color:var(--fg-dim);font-size:.95rem;margin-bottom:1rem}.archive-year{margin-bottom:2.5rem}.page-title{color:var(--accent);margin-bottom:1.5rem}@media(max-width:600px){:root{--font-size:14px;--content-pad:1.2rem}.site-header-inner{flex-direction:column;gap:.5rem}.post-list-item{flex-direction:column;gap:.15rem}.post-date{min-width:auto}.about-header{flex-direction:column;align-items:center;text-align:center}.about-avatar{width:120px;height:120px}.site-footer-inner{flex-direction:column;align-items:flex-start}}.projects-intro{color:var(--fg-dim);margin-bottom:2rem;font-size:.95rem}.projects-grid{display:flex;flex-direction:column;gap:.75rem}.project-card{display:flex;align-items:center;justify-content:space-between;padding:1.2rem 1.5rem;background:var(--bg-alt);border:1px solid var(--border);border-radius:6px;transition:border-color var(--transition),background-color var(--transition),transform var(--transition);color:var(--fg);text-decoration:none}.project-card:hover{border-color:var(--accent);background:var(--bg-hover);transform:translateX(4px);color:var(--fg)}.project-card-inner{flex:1}.project-card-name{font-size:1rem;color:var(--accent);margin:0 0 .3rem}.project-card-desc{font-size:.85rem;color:var(--fg-dim);margin:0;line-height:1.5}.project-card-tags{display:flex;gap:.5rem;margin-top:.6rem;flex-wrap:wrap}.project-card-tag{font-size:.72rem;color:var(--fg-dim);background:var(--bg);padding:.15rem .5rem;border-radius:3px;border:1px solid var(--border)}.project-card-arrow{color:var(--fg-dim);font-size:1.2rem;margin-left:1rem;transition:color var(--transition),transform var(--transition)}.project-card:hover .project-card-arrow{color:var(--accent);transform:translateX(3px)}.resume-page{max-width:100%}.resume-header{margin-bottom:2.5rem;padding-bottom:1.5rem;border-bottom:1px solid var(--border)}.resume-name{color:var(--fg-bright);font-size:1.8rem;margin-bottom:.25rem}.resume-tagline{color:var(--fg-dim);font-size:.95rem;margin-bottom:1rem}.resume-contact{display:flex;gap:.5rem;flex-wrap:wrap;font-size:.85rem}.resume-contact a{color:var(--accent);padding:.2rem .6rem;border:1px solid var(--border);border-radius:3px;transition:border-color var(--transition),background-color var(--transition);display:inline-flex;align-items:center;gap:.35rem}.resume-contact a svg{width:14px;height:14px;fill:currentColor;flex-shrink:0}.resume-contact a:hover{border-color:var(--accent);background:var(--accent-glow)}.resume-section{margin-bottom:2.5rem}.resume-section-title{font-size:1.1rem;color:var(--accent);margin:0 0 1.2rem;padding-bottom:.4rem;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:.5rem}.resume-entry{margin-bottom:1.5rem}.resume-entry-header{display:flex;justify-content:space-between;align-items:flex-start;flex-wrap:wrap;gap:.5rem;margin-bottom:.5rem}.resume-entry-title{font-size:1rem;color:var(--fg-bright);margin:0}.resume-entry-org{font-size:.9rem;color:var(--fg-dim)}.resume-entry-date{font-size:.8rem;color:var(--fg-dim);white-space:nowrap}.resume-entry-details{padding-left:1.2rem;font-size:.9rem;color:var(--fg);margin:0}.resume-entry-details li{margin-bottom:.25rem}.resume-skills{display:flex;flex-direction:column;gap:.6rem}.resume-skill-group{display:flex;align-items:baseline;gap:1rem;font-size:.9rem}.resume-skill-label{color:var(--fg-bright);font-size:.85rem;min-width:6rem;flex-shrink:0;margin:0}.resume-skill-items{color:var(--fg)}.resume-tech-stack{font-size:.8rem;color:var(--fg-dim);margin-bottom:.5rem;font-style:italic}.resume-entry-links{display:flex;gap:1rem;margin-top:.4rem;font-size:.8rem}.resume-entry-links a{color:var(--accent-dim)}.resume-entry-links a:hover{color:var(--accent)}.resume-download{margin-top:2rem;padding-top:1.5rem;border-top:1px solid var(--border)}.resume-download-btn{display:inline-flex;align-items:center;gap:.4rem;color:var(--accent);font-size:.9rem;padding:.5rem 1.2rem;border:1px solid var(--accent-dim);border-radius:4px;transition:background-color var(--transition),border-color var(--transition)}.resume-download-btn:hover{background:var(--accent-glow);border-color:var(--accent);color:var(--accent)}@media(max-width:600px){.project-card{padding:1rem}.resume-entry-header{flex-direction:column}.resume-skill-group{flex-direction:column;gap:.2rem}.resume-skill-label{min-width:auto}}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:var(--bg)}::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--fg-dim)}@keyframes fadeIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}main{animation:fadeIn .4s ease-out} \ No newline at end of file diff --git a/public/css/style.min.dde322c2f5eb486cde5fa722b8e6fe1eb33a8ad467a9549f2627b4df7a3807b4.css b/public/css/style.min.dde322c2f5eb486cde5fa722b8e6fe1eb33a8ad467a9549f2627b4df7a3807b4.css deleted file mode 100644 index 8e3ac0e..0000000 --- a/public/css/style.min.dde322c2f5eb486cde5fa722b8e6fe1eb33a8ad467a9549f2627b4df7a3807b4.css +++ /dev/null @@ -1 +0,0 @@ -@import 'https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap';:root{--bg:#1d1f21;--bg-alt:#282a2e;--bg-hover:#2a2d31;--fg:#c9cacc;--fg-dim:#6c7a89;--fg-bright:#e8e8e8;--accent:#bd93f9;--accent-dim:#9d73d9;--accent-glow:rgba(189, 147, 249, 0.15);--border:#373b41;--code-bg:#1a1c1e;--font-mono:'JetBrains Mono', 'Fira Code', 'Cascadia Code', 'SF Mono', monospace;--font-size:15px;--line-height:1.7;--max-width:720px;--content-pad:1.5rem;--transition:150ms ease}*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}html{font-size:var(--font-size);scroll-behavior:smooth;-webkit-text-size-adjust:100%}body{font-family:var(--font-mono);font-weight:400;line-height:var(--line-height);color:var(--fg);background-color:var(--bg);min-height:100vh;display:flex;flex-direction:column;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}::selection{background-color:var(--accent);color:var(--bg)}.site-wrapper{width:100%;max-width:var(--max-width);margin:0 auto;padding:0 var(--content-pad);flex:1}main{padding:2rem 0 4rem}a{color:var(--accent);text-decoration:none;transition:color var(--transition),border-color var(--transition)}a:hover{color:var(--fg-bright)}h1,h2,h3,h4,h5,h6{font-family:var(--font-mono);font-weight:700;color:var(--fg-bright);line-height:1.3}h1{font-size:1.8rem;margin-bottom:.5rem}h2{font-size:1.4rem;margin:2.5rem 0 1rem}h3{font-size:1.15rem;margin:2rem 0 .75rem}h4{font-size:1rem;margin:1.5rem 0 .5rem}p{margin-bottom:1.2rem}strong{font-weight:700;color:var(--fg-bright)}em{font-style:italic}hr{border:none;border-top:1px solid var(--border);margin:2.5rem 0}blockquote{border-left:3px solid var(--accent);padding-left:1rem;margin:1.5rem 0;color:var(--fg-dim);font-style:italic}ul,ol{padding-left:1.5rem;margin-bottom:1.2rem}li{margin-bottom:.3rem}img{max-width:100%;height:auto;border-radius:4px}.site-header{padding:2.5rem 0 1rem}.site-header-inner{display:flex;align-items:baseline;justify-content:space-between;flex-wrap:wrap;gap:.75rem}.site-title{font-size:1.4rem;font-weight:700;color:var(--fg-bright);text-decoration:none;letter-spacing:-.02em}.site-title:hover{color:var(--accent)}.site-nav{display:flex;align-items:center;gap:0}.site-nav a{color:var(--accent);font-size:.9rem;padding:.15rem 0;border-bottom:1px solid transparent;transition:border-color var(--transition),color var(--transition)}.site-nav a:hover,.site-nav a.active{border-bottom-color:var(--accent)}.nav-separator{color:var(--fg-dim);margin:0 .6rem;user-select:none;font-size:.85rem}.home-bio{margin:1rem 0 1.5rem;font-size:.95rem;color:var(--fg);max-width:600px}.home-bio p{margin-bottom:1rem}.social-line{color:var(--fg-dim);font-size:.9rem;margin-bottom:0}.social-line a{color:var(--fg);border-bottom:1px dashed var(--fg-dim);transition:color var(--transition),border-color var(--transition)}.social-line a:hover{color:var(--accent);border-bottom-color:var(--accent)}.section-heading{font-size:1.2rem;color:var(--accent);font-weight:700;margin:3rem 0 1.5rem;display:flex;align-items:center;gap:.75rem}.section-heading::after{content:'';flex:1;height:1px;background:var(--border)}.post-list{list-style:none;padding:0;margin:0}.post-list-item{display:flex;align-items:baseline;gap:1.5rem;padding:.4rem 0;margin:0;transition:background-color var(--transition)}.post-list-item:hover{background-color:var(--accent-glow);margin:0 -.5rem;padding:.4rem .5rem;border-radius:3px}.post-date{color:var(--fg-dim);font-size:.85rem;white-space:nowrap;min-width:7rem;flex-shrink:0}.post-title-link{color:var(--fg);text-decoration:none;border-bottom:1px solid transparent;transition:color var(--transition),border-color var(--transition)}.post-title-link:hover{color:var(--accent);border-bottom-color:var(--accent)}.year-heading{font-size:1.1rem;font-weight:700;color:var(--fg-bright);margin:2rem 0 .75rem;padding-bottom:.25rem}.year-heading:first-child{margin-top:0}.project-list{list-style:none;padding:0;margin:0}.project-item{padding:.4rem 0;font-size:.95rem}.project-name{color:var(--fg);border-bottom:1px dashed var(--fg-dim);transition:color var(--transition),border-color var(--transition)}.project-name:hover{color:var(--accent);border-bottom-color:var(--accent)}.project-desc{color:var(--fg-dim)}.project-desc::before{content:': '}.site-footer{padding:2rem 0;margin-top:auto;border-top:1px solid var(--border)}.site-footer-inner{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:1rem;font-size:.8rem;color:var(--fg-dim)}.footer-links{display:flex;align-items:center;gap:0}.footer-links a{color:var(--fg-dim);transition:color var(--transition)}.footer-links a:hover{color:var(--accent)}.social-icons{display:flex;gap:1rem;align-items:center}.social-icons a{color:var(--fg-dim);transition:color var(--transition);display:inline-flex;align-items:center}.social-icons a:hover{color:var(--accent)}.social-icons svg{width:18px;height:18px;fill:currentColor}.post-header{margin-bottom:2.5rem}.post-header h1{color:var(--accent);font-size:1.6rem;margin-bottom:.5rem}.post-meta{color:var(--fg-dim);font-size:.85rem;display:flex;align-items:center;flex-wrap:wrap;gap:.5rem}.post-meta .separator{color:var(--border)}.post-tags{display:inline-flex;gap:.4rem}.post-tag{color:var(--accent-dim);font-size:.8rem}.post-tag:hover{color:var(--accent)}.post-content{font-size:.95rem}.post-content h2::before{content:'# ';color:var(--accent);font-weight:400}.post-content h3::before{content:'## ';color:var(--accent);font-weight:400}.post-content a{border-bottom:1px solid var(--accent-dim)}.post-content a:hover{border-bottom-color:var(--accent)}.post-content img{margin:1.5rem 0;border:1px solid var(--border)}code{font-family:var(--font-mono);font-size:.88em;background:var(--bg-alt);padding:.15em .35em;border-radius:3px;color:var(--fg-bright)}pre{background:var(--code-bg);border:1px solid var(--border);border-radius:4px;padding:1.2rem 1.5rem;overflow-x:auto;margin:1.5rem 0;line-height:1.5;position:relative}pre code{background:0 0;padding:0;font-size:.85rem;color:var(--fg)}.highlight{position:relative;margin:1.5rem 0}.highlight pre{margin:0}table{width:100%;border-collapse:collapse;margin:1.5rem 0;font-size:.9rem}th,td{padding:.6rem .8rem;text-align:left;border-bottom:1px solid var(--border)}th{color:var(--fg-bright);font-weight:700}.back-link{display:inline-flex;align-items:center;gap:.3rem;color:var(--fg-dim);font-size:.85rem;margin-bottom:2rem;transition:color var(--transition)}.back-link:hover{color:var(--accent)}.about-header{display:flex;align-items:flex-start;gap:2rem;margin-bottom:2rem}.about-avatar{width:140px;height:140px;border-radius:50%;border:2px solid var(--border);flex-shrink:0;object-fit:cover}.about-content h1{margin-bottom:.25rem}.about-tagline{color:var(--fg-dim);font-size:.95rem;margin-bottom:1rem}.archive-year{margin-bottom:2.5rem}.page-title{color:var(--accent);margin-bottom:1.5rem}@media(max-width:600px){:root{--font-size:14px;--content-pad:1.2rem}.site-header-inner{flex-direction:column;gap:.5rem}.post-list-item{flex-direction:column;gap:.15rem}.post-date{min-width:auto}.about-header{flex-direction:column;align-items:center;text-align:center}.about-avatar{width:120px;height:120px}.site-footer-inner{flex-direction:column;align-items:flex-start}}.projects-intro{color:var(--fg-dim);margin-bottom:2rem;font-size:.95rem}.projects-grid{display:flex;flex-direction:column;gap:.75rem}.project-card{display:flex;align-items:center;justify-content:space-between;padding:1.2rem 1.5rem;background:var(--bg-alt);border:1px solid var(--border);border-radius:6px;transition:border-color var(--transition),background-color var(--transition),transform var(--transition);color:var(--fg);text-decoration:none}.project-card:hover{border-color:var(--accent);background:var(--bg-hover);transform:translateX(4px);color:var(--fg)}.project-card-inner{flex:1}.project-card-name{font-size:1rem;color:var(--accent);margin:0 0 .3rem}.project-card-desc{font-size:.85rem;color:var(--fg-dim);margin:0;line-height:1.5}.project-card-tags{display:flex;gap:.5rem;margin-top:.6rem;flex-wrap:wrap}.project-card-tag{font-size:.72rem;color:var(--fg-dim);background:var(--bg);padding:.15rem .5rem;border-radius:3px;border:1px solid var(--border)}.project-card-arrow{color:var(--fg-dim);font-size:1.2rem;margin-left:1rem;transition:color var(--transition),transform var(--transition)}.project-card:hover .project-card-arrow{color:var(--accent);transform:translateX(3px)}.resume-page{max-width:100%}.resume-header{margin-bottom:2.5rem;padding-bottom:1.5rem;border-bottom:1px solid var(--border)}.resume-name{color:var(--fg-bright);font-size:1.8rem;margin-bottom:.25rem}.resume-tagline{color:var(--fg-dim);font-size:.95rem;margin-bottom:1rem}.resume-contact{display:flex;gap:.5rem;flex-wrap:wrap;font-size:.85rem}.resume-contact a{color:var(--accent);padding:.2rem .6rem;border:1px solid var(--border);border-radius:3px;transition:border-color var(--transition),background-color var(--transition);display:inline-flex;align-items:center;gap:.35rem}.resume-contact a svg{width:14px;height:14px;fill:currentColor;flex-shrink:0}.resume-contact a:hover{border-color:var(--accent);background:var(--accent-glow)}.resume-section{margin-bottom:2.5rem}.resume-section-title{font-size:1.1rem;color:var(--accent);margin:0 0 1.2rem;padding-bottom:.4rem;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:.5rem}.resume-entry{margin-bottom:1.5rem}.resume-entry-header{display:flex;justify-content:space-between;align-items:flex-start;flex-wrap:wrap;gap:.5rem;margin-bottom:.5rem}.resume-entry-title{font-size:1rem;color:var(--fg-bright);margin:0}.resume-entry-org{font-size:.9rem;color:var(--fg-dim)}.resume-entry-date{font-size:.8rem;color:var(--fg-dim);white-space:nowrap}.resume-entry-details{padding-left:1.2rem;font-size:.9rem;color:var(--fg);margin:0}.resume-entry-details li{margin-bottom:.25rem}.resume-skills{display:flex;flex-direction:column;gap:.6rem}.resume-skill-group{display:flex;align-items:baseline;gap:1rem;font-size:.9rem}.resume-skill-label{color:var(--fg-bright);font-size:.85rem;min-width:6rem;flex-shrink:0;margin:0}.resume-skill-items{color:var(--fg)}.resume-tech-stack{font-size:.8rem;color:var(--fg-dim);margin-bottom:.5rem;font-style:italic}.resume-entry-links{display:flex;gap:1rem;margin-top:.4rem;font-size:.8rem}.resume-entry-links a{color:var(--accent-dim)}.resume-entry-links a:hover{color:var(--accent)}.resume-download{margin-top:2rem;padding-top:1.5rem;border-top:1px solid var(--border)}.resume-download-btn{display:inline-flex;align-items:center;gap:.4rem;color:var(--accent);font-size:.9rem;padding:.5rem 1.2rem;border:1px solid var(--accent-dim);border-radius:4px;transition:background-color var(--transition),border-color var(--transition)}.resume-download-btn:hover{background:var(--accent-glow);border-color:var(--accent);color:var(--accent)}@media(max-width:600px){.project-card{padding:1rem}.resume-entry-header{flex-direction:column}.resume-skill-group{flex-direction:column;gap:.2rem}.resume-skill-label{min-width:auto}}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:var(--bg)}::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--fg-dim)}@keyframes fadeIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}main{animation:fadeIn .4s ease-out} \ No newline at end of file diff --git a/public/favicon.svg b/public/favicon.svg deleted file mode 100644 index f4a2f4f..0000000 --- a/public/favicon.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - D - diff --git a/public/index.html b/public/index.html deleted file mode 100644 index 0ee4c2e..0000000 --- a/public/index.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - - - - - - - - - - - - - -Divyam Ahuja - - - - - - - - - - - - -
-
-
-

Software Engineer at Microsoft, working on the Excel Copilot team. I enjoy building side projects, tinkering with infrastructure, and deep-diving into performance optimization.

- -
-
-

Blog

-
-

2026

- -
-
-
-

Projects

- -
- View all projects → -
-
-
-
- - diff --git a/public/index.xml b/public/index.xml deleted file mode 100644 index 982b429..0000000 --- a/public/index.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - Divyam Ahuja - http://localhost:1313/ - Recent content on Divyam Ahuja - Hugo - en-us - Fri, 08 May 2026 00:00:00 +0000 - - - Hello World - http://localhost:1313/posts/hello-world/ - Fri, 08 May 2026 00:00:00 +0000 - http://localhost:1313/posts/hello-world/ - <p>Welcome to my new blog! I&rsquo;ve rebuilt my personal website from scratch using <a href="https://gohugo.io/">Hugo</a>, a fast static site generator written in Go.</p> <h2 id="why-hugo">Why Hugo?</h2> <p>I wanted something minimal, fast, and that gets out of the way. Hugo checks all the boxes:</p> <ul> <li><strong>Blazing fast builds</strong> — the entire site builds in under 100ms</li> <li><strong>Markdown-first</strong> — I write posts in plain markdown files</li> <li><strong>Zero JavaScript</strong> — the site ships pure HTML and CSS</li> <li><strong>Built-in features</strong> — syntax highlighting, RSS feeds, sitemaps, all out of the box</li> </ul> <h2 id="the-design">The Design</h2> <p>The design is inspired by the <a href="https://probberechts.github.io/hexo-theme-cactus/">Cactus Dark</a> theme — a minimalist, terminal-inspired aesthetic with monospace typography and a dark color scheme. I built the theme from scratch for full control.</p> - - - Building a PDF Translation Pipeline - http://localhost:1313/posts/pdf-translation-pipeline/ - Wed, 11 Feb 2026 00:00:00 +0000 - http://localhost:1313/posts/pdf-translation-pipeline/ - <p>Recently, I needed to translate a PDF document from Hindi to English. Sounds simple enough, right? Turns out, it&rsquo;s a surprisingly deep rabbit hole.</p> <h2 id="the-pipeline">The Pipeline</h2> <p>The approach I settled on follows this flow:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">PDF → Images → OCR → Translation → Rendered Images → PDF </span></span></code></pre></div><p>Each step has its own set of challenges:</p> <ol> <li><strong>PDF to Images</strong>: Convert each page to a high-DPI image for better OCR accuracy</li> <li><strong>OCR</strong>: Extract text with position data using PaddleOCR</li> <li><strong>Translation</strong>: Run extracted text through NLLB (No Language Left Behind)</li> <li><strong>Rendering</strong>: Paint translated text back onto the original image</li> <li><strong>Assembly</strong>: Combine rendered images back into a PDF</li> </ol> <h2 id="lessons-learned">Lessons Learned</h2> <ul> <li><strong>DPI matters a lot</strong> — bumping from 150 to 300 DPI dramatically improved OCR accuracy for Hindi text</li> <li><strong>Font rendering is hard</strong> — getting translated text to fit in the same bounding boxes required careful font size calculation</li> <li><strong>Fallback strategies</strong> — TrOCR as a fallback when PaddleOCR fails on certain text regions</li> </ul> <p>The code is messy but it works. Sometimes that&rsquo;s enough.</p> - - - About - http://localhost:1313/about/ - Mon, 01 Jan 0001 00:00:00 +0000 - http://localhost:1313/about/ - <p>Hi, I&rsquo;m a full-stack developer who loves building things. I enjoy hacking on side projects, exploring new technologies, and deep-diving into the technical details of how things work.</p> <p>I work across the stack — from crafting interactive frontends to designing robust backend systems. When I&rsquo;m not writing code, I&rsquo;m probably reading about distributed systems, tinkering with new tools, or working on one of my many side projects.</p> <p>I enjoy hacking on things and deep diving into the technical details of protocols, performance optimization, and algorithms.</p> - - - Projects - http://localhost:1313/projects/ - Mon, 01 Jan 0001 00:00:00 +0000 - http://localhost:1313/projects/ - - - - Resume - http://localhost:1313/resume/ - Mon, 01 Jan 0001 00:00:00 +0000 - http://localhost:1313/resume/ - - - - diff --git a/public/posts/hello-world/index.html b/public/posts/hello-world/index.html deleted file mode 100644 index 96e6caf..0000000 --- a/public/posts/hello-world/index.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - - - - - - - - - - - - - -Hello World · Divyam Ahuja - - - - - - - - - - - -
-
-
-
-

Hello World

- -
-
-

Welcome to my new blog! I’ve rebuilt my personal website from scratch using Hugo, a fast static site generator written in Go.

-

Why Hugo?

-

I wanted something minimal, fast, and that gets out of the way. Hugo checks all the boxes:

-
    -
  • Blazing fast builds — the entire site builds in under 100ms
  • -
  • Markdown-first — I write posts in plain markdown files
  • -
  • Zero JavaScript — the site ships pure HTML and CSS
  • -
  • Built-in features — syntax highlighting, RSS feeds, sitemaps, all out of the box
  • -
-

The Design

-

The design is inspired by the Cactus Dark theme — a minimalist, terminal-inspired aesthetic with monospace typography and a dark color scheme. I built the theme from scratch for full control.

-

Here’s a quick code example to make sure syntax highlighting works:

-
def greet(name: str) -> str:
-    """Return a greeting message."""
-    return f"Hello, {name}! Welcome to divyam.dev"
-
-if __name__ == "__main__":
-    print(greet("World"))
-

And some JavaScript too:

-
const fetchPosts = async () => {
-  const response = await fetch('/api/posts');
-  const posts = await response.json();
-  return posts.filter(post => post.published);
-};
-

What’s Next?

-

I plan to write about:

-
    -
  • Full-stack development patterns and best practices
  • -
  • Side projects and what I learn building them
  • -
  • Deep dives into interesting technical problems
  • -
  • Tools and workflows that make development better
  • -
-

Stay tuned — there’s more coming soon.

- -
-
- ← back to home -
-
-
- - diff --git a/public/posts/index.html b/public/posts/index.html deleted file mode 100644 index 2bd6d05..0000000 --- a/public/posts/index.html +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - - - - - - - - - - - -Writing · Divyam Ahuja - - - - - - - - - - - - -
-
-

Writing

- -
-

2026

- -
-
-
- - diff --git a/public/posts/index.xml b/public/posts/index.xml deleted file mode 100644 index f43ef1f..0000000 --- a/public/posts/index.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - Writing on Divyam Ahuja - http://localhost:1313/posts/ - Recent content in Writing on Divyam Ahuja - Hugo - en-us - Fri, 08 May 2026 00:00:00 +0000 - - - Hello World - http://localhost:1313/posts/hello-world/ - Fri, 08 May 2026 00:00:00 +0000 - http://localhost:1313/posts/hello-world/ - <p>Welcome to my new blog! I&rsquo;ve rebuilt my personal website from scratch using <a href="https://gohugo.io/">Hugo</a>, a fast static site generator written in Go.</p> <h2 id="why-hugo">Why Hugo?</h2> <p>I wanted something minimal, fast, and that gets out of the way. Hugo checks all the boxes:</p> <ul> <li><strong>Blazing fast builds</strong> — the entire site builds in under 100ms</li> <li><strong>Markdown-first</strong> — I write posts in plain markdown files</li> <li><strong>Zero JavaScript</strong> — the site ships pure HTML and CSS</li> <li><strong>Built-in features</strong> — syntax highlighting, RSS feeds, sitemaps, all out of the box</li> </ul> <h2 id="the-design">The Design</h2> <p>The design is inspired by the <a href="https://probberechts.github.io/hexo-theme-cactus/">Cactus Dark</a> theme — a minimalist, terminal-inspired aesthetic with monospace typography and a dark color scheme. I built the theme from scratch for full control.</p> - - - Building a PDF Translation Pipeline - http://localhost:1313/posts/pdf-translation-pipeline/ - Wed, 11 Feb 2026 00:00:00 +0000 - http://localhost:1313/posts/pdf-translation-pipeline/ - <p>Recently, I needed to translate a PDF document from Hindi to English. Sounds simple enough, right? Turns out, it&rsquo;s a surprisingly deep rabbit hole.</p> <h2 id="the-pipeline">The Pipeline</h2> <p>The approach I settled on follows this flow:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">PDF → Images → OCR → Translation → Rendered Images → PDF </span></span></code></pre></div><p>Each step has its own set of challenges:</p> <ol> <li><strong>PDF to Images</strong>: Convert each page to a high-DPI image for better OCR accuracy</li> <li><strong>OCR</strong>: Extract text with position data using PaddleOCR</li> <li><strong>Translation</strong>: Run extracted text through NLLB (No Language Left Behind)</li> <li><strong>Rendering</strong>: Paint translated text back onto the original image</li> <li><strong>Assembly</strong>: Combine rendered images back into a PDF</li> </ol> <h2 id="lessons-learned">Lessons Learned</h2> <ul> <li><strong>DPI matters a lot</strong> — bumping from 150 to 300 DPI dramatically improved OCR accuracy for Hindi text</li> <li><strong>Font rendering is hard</strong> — getting translated text to fit in the same bounding boxes required careful font size calculation</li> <li><strong>Fallback strategies</strong> — TrOCR as a fallback when PaddleOCR fails on certain text regions</li> </ul> <p>The code is messy but it works. Sometimes that&rsquo;s enough.</p> - - - diff --git a/public/posts/pdf-translation-pipeline/index.html b/public/posts/pdf-translation-pipeline/index.html deleted file mode 100644 index c7c804d..0000000 --- a/public/posts/pdf-translation-pipeline/index.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - - - - - - - - - - - - - -Building a PDF Translation Pipeline · Divyam Ahuja - - - - - - - - - - - -
-
-
-
-

Building a PDF Translation Pipeline

- -
-
-

Recently, I needed to translate a PDF document from Hindi to English. Sounds simple enough, right? Turns out, it’s a surprisingly deep rabbit hole.

-

The Pipeline

-

The approach I settled on follows this flow:

-
PDF → Images → OCR → Translation → Rendered Images → PDF
-

Each step has its own set of challenges:

-
    -
  1. PDF to Images: Convert each page to a high-DPI image for better OCR accuracy
  2. -
  3. OCR: Extract text with position data using PaddleOCR
  4. -
  5. Translation: Run extracted text through NLLB (No Language Left Behind)
  6. -
  7. Rendering: Paint translated text back onto the original image
  8. -
  9. Assembly: Combine rendered images back into a PDF
  10. -
-

Lessons Learned

-
    -
  • DPI matters a lot — bumping from 150 to 300 DPI dramatically improved OCR accuracy for Hindi text
  • -
  • Font rendering is hard — getting translated text to fit in the same bounding boxes required careful font size calculation
  • -
  • Fallback strategies — TrOCR as a fallback when PaddleOCR fails on certain text regions
  • -
-

The code is messy but it works. Sometimes that’s enough.

- -
-
- ← back to home -
-
-
- - diff --git a/public/projects/index.html b/public/projects/index.html deleted file mode 100644 index 7d110cf..0000000 --- a/public/projects/index.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - - - - - - - - - - - -Projects · Divyam Ahuja - - - - - - - - - - - -
-
-

Projects

-

Things I've built or contributed to.

- - -
-
- - diff --git a/public/resume.pdf b/public/resume.pdf deleted file mode 100644 index a66eff4..0000000 --- a/public/resume.pdf +++ /dev/null @@ -1,2506 +0,0 @@ -%PDF-1.7 -% - -1 0 obj -<< - /Type /Pages - /Count 1 - /Kids [174 0 R] ->> -endobj - -2 0 obj -<< - /Type /Outlines - /First 3 0 R - /Last 6 0 R - /Count 4 ->> -endobj - -3 0 obj -<< - /Parent 2 0 R - /Next 4 0 R - /Title (Experience) - /Dest 161 0 R ->> -endobj - -4 0 obj -<< - /Parent 2 0 R - /Next 5 0 R - /Prev 3 0 R - /Title (Skills) - /Dest 162 0 R ->> -endobj - -5 0 obj -<< - /Parent 2 0 R - /Next 6 0 R - /Prev 4 0 R - /Title (Projects) - /Dest 163 0 R ->> -endobj - -6 0 obj -<< - /Parent 2 0 R - /Prev 5 0 R - /Title (Education) - /Dest 164 0 R ->> -endobj - -7 0 obj -<< - /Type /StructTreeRoot - /RoleMap << - /Datetime /Span - /Terms /Part - /Title /P - /Strong /Span - /Em /Span - >> - /K [9 0 R] - /ParentTree << - /Nums [0 135 0 R 1 133 0 R 2 131 0 R 3 129 0 R 4 127 0 R 5 125 0 R 6 36 0 R 7 26 0 R 8 24 0 R 9 8 0 R] - >> - /ParentTreeNextKey 10 ->> -endobj - -8 0 obj -[138 0 R 137 0 R 136 0 R 135 0 R 134 0 R 133 0 R 132 0 R 131 0 R 130 0 R 129 0 R 128 0 R 127 0 R 126 0 R 125 0 R 123 0 R 122 0 R 120 0 R 118 0 R 116 0 R 114 0 R 111 0 R 110 0 R 108 0 R 106 0 R 106 0 R 107 0 R 106 0 R 104 0 R 103 0 R 103 0 R 101 0 R 100 0 R 100 0 R 98 0 R 96 0 R 97 0 R 96 0 R 96 0 R 94 0 R 93 0 R 90 0 R 88 0 R 86 0 R 84 0 R 82 0 R 79 0 R 78 0 R 78 0 R 76 0 R 74 0 R 74 0 R 75 0 R 74 0 R 72 0 R 70 0 R 71 0 R 70 0 R 70 0 R 68 0 R 66 0 R 67 0 R 66 0 R 66 0 R 64 0 R 62 0 R 63 0 R 62 0 R 62 0 R 60 0 R 58 0 R 59 0 R 58 0 R 55 0 R 53 0 R 51 0 R 49 0 R 47 0 R 44 0 R 43 0 R 41 0 R 40 0 R 38 0 R 37 0 R 32 0 R 31 0 R 31 0 R 31 0 R 31 0 R 31 0 R 31 0 R 31 0 R 31 0 R 30 0 R 29 0 R 29 0 R 28 0 R 27 0 R 23 0 R 25 0 R 20 0 R 20 0 R 19 0 R 18 0 R 16 0 R 14 0 R 12 0 R] -endobj - -9 0 obj -<< - /Type /StructElem - /S /Document - /P 7 0 R - /K [138 0 R 137 0 R 124 0 R 123 0 R 112 0 R 91 0 R 80 0 R 56 0 R 45 0 R 33 0 R 32 0 R 31 0 R 30 0 R 29 0 R 21 0 R 20 0 R 19 0 R 10 0 R] ->> -endobj - -10 0 obj -<< - /Type /StructElem - /S /Div - /P 9 0 R - /K [17 0 R 15 0 R 13 0 R 11 0 R] ->> -endobj - -11 0 obj -<< - /Type /StructElem - /S /Div - /P 10 0 R - /K [12 0 R] ->> -endobj - -12 0 obj -<< - /Type /StructElem - /S /Span - /P 11 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [105] - /Pg 174 0 R ->> -endobj - -13 0 obj -<< - /Type /StructElem - /S /Div - /P 10 0 R - /K [14 0 R] ->> -endobj - -14 0 obj -<< - /Type /StructElem - /S /Span - /P 13 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [104] - /Pg 174 0 R ->> -endobj - -15 0 obj -<< - /Type /StructElem - /S /Div - /P 10 0 R - /K [16 0 R] ->> -endobj - -16 0 obj -<< - /Type /StructElem - /S /Span - /P 15 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [103] - /Pg 174 0 R ->> -endobj - -17 0 obj -<< - /Type /StructElem - /S /Div - /P 10 0 R - /K [18 0 R] ->> -endobj - -18 0 obj -<< - /Type /StructElem - /S /Span - /P 17 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [102] - /Pg 174 0 R ->> -endobj - -19 0 obj -<< - /Type /StructElem - /S /H1 - /P 9 0 R - /T (Education) - /K [101] - /Pg 174 0 R ->> -endobj - -20 0 obj -<< - /Type /StructElem - /S /P - /P 9 0 R - /K [99 100] - /Pg 174 0 R ->> -endobj - -21 0 obj -<< - /Type /StructElem - /S /L - /P 9 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [22 0 R] ->> -endobj - -22 0 obj -<< - /Type /StructElem - /S /LI - /P 21 0 R - /K [28 0 R 23 0 R] ->> -endobj - -23 0 obj -<< - /Type /StructElem - /S /LBody - /P 22 0 R - /K [26 0 R 97 24 0 R] - /Pg 174 0 R ->> -endobj - -24 0 obj -<< - /Type /StructElem - /S /Link - /P 23 0 R - /K [25 0 R << - /Type /OBJR - /Pg 174 0 R - /Obj 173 0 R - >>] ->> -endobj - -25 0 obj -<< - /Type /StructElem - /S /Span - /P 24 0 R - /A [<< - /O /Layout - /TextDecorationType /Underline - >>] - /K [98] - /Pg 174 0 R ->> -endobj - -26 0 obj -<< - /Type /StructElem - /S /Link - /P 23 0 R - /K [27 0 R << - /Type /OBJR - /Pg 174 0 R - /Obj 172 0 R - >>] ->> -endobj - -27 0 obj -<< - /Type /StructElem - /S /Span - /P 26 0 R - /A [<< - /O /Layout - /TextDecorationType /Underline - >>] - /K [96] - /Pg 174 0 R ->> -endobj - -28 0 obj -<< - /Type /StructElem - /S /Lbl - /P 22 0 R - /K [95] - /Pg 174 0 R ->> -endobj - -29 0 obj -<< - /Type /StructElem - /S /P - /P 9 0 R - /K [93 94] - /Pg 174 0 R ->> -endobj - -30 0 obj -<< - /Type /StructElem - /S /H1 - /P 9 0 R - /T (Projects) - /K [92] - /Pg 174 0 R ->> -endobj - -31 0 obj -<< - /Type /StructElem - /S /P - /P 9 0 R - /K [84 85 86 87 88 89 90 91] - /Pg 174 0 R ->> -endobj - -32 0 obj -<< - /Type /StructElem - /S /H1 - /P 9 0 R - /T (Skills) - /K [83] - /Pg 174 0 R ->> -endobj - -33 0 obj -<< - /Type /StructElem - /S /L - /P 9 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [42 0 R 39 0 R 34 0 R] ->> -endobj - -34 0 obj -<< - /Type /StructElem - /S /LI - /P 33 0 R - /K [38 0 R 35 0 R] ->> -endobj - -35 0 obj -<< - /Type /StructElem - /S /LBody - /P 34 0 R - /K [36 0 R] ->> -endobj - -36 0 obj -<< - /Type /StructElem - /S /Link - /P 35 0 R - /K [37 0 R << - /Type /OBJR - /Pg 174 0 R - /Obj 171 0 R - >>] ->> -endobj - -37 0 obj -<< - /Type /StructElem - /S /Span - /P 36 0 R - /A [<< - /O /Layout - /TextDecorationType /Underline - >>] - /K [82] - /Pg 174 0 R ->> -endobj - -38 0 obj -<< - /Type /StructElem - /S /Lbl - /P 34 0 R - /K [81] - /Pg 174 0 R ->> -endobj - -39 0 obj -<< - /Type /StructElem - /S /LI - /P 33 0 R - /K [41 0 R 40 0 R] ->> -endobj - -40 0 obj -<< - /Type /StructElem - /S /LBody - /P 39 0 R - /K [80] - /Pg 174 0 R ->> -endobj - -41 0 obj -<< - /Type /StructElem - /S /Lbl - /P 39 0 R - /K [79] - /Pg 174 0 R ->> -endobj - -42 0 obj -<< - /Type /StructElem - /S /LI - /P 33 0 R - /K [44 0 R 43 0 R] ->> -endobj - -43 0 obj -<< - /Type /StructElem - /S /LBody - /P 42 0 R - /K [78] - /Pg 174 0 R ->> -endobj - -44 0 obj -<< - /Type /StructElem - /S /Lbl - /P 42 0 R - /K [77] - /Pg 174 0 R ->> -endobj - -45 0 obj -<< - /Type /StructElem - /S /Div - /P 9 0 R - /K [54 0 R 52 0 R 50 0 R 48 0 R 46 0 R] ->> -endobj - -46 0 obj -<< - /Type /StructElem - /S /Div - /P 45 0 R - /K [47 0 R] ->> -endobj - -47 0 obj -<< - /Type /StructElem - /S /Span - /P 46 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [76] - /Pg 174 0 R ->> -endobj - -48 0 obj -<< - /Type /StructElem - /S /Div - /P 45 0 R - /K [49 0 R] ->> -endobj - -49 0 obj -<< - /Type /StructElem - /S /Span - /P 48 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [75] - /Pg 174 0 R ->> -endobj - -50 0 obj -<< - /Type /StructElem - /S /Div - /P 45 0 R - /K [51 0 R] ->> -endobj - -51 0 obj -<< - /Type /StructElem - /S /Span - /P 50 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [74] - /Pg 174 0 R ->> -endobj - -52 0 obj -<< - /Type /StructElem - /S /Div - /P 45 0 R - /K [53 0 R] ->> -endobj - -53 0 obj -<< - /Type /StructElem - /S /Span - /P 52 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [73] - /Pg 174 0 R ->> -endobj - -54 0 obj -<< - /Type /StructElem - /S /Div - /P 45 0 R - /K [55 0 R] ->> -endobj - -55 0 obj -<< - /Type /StructElem - /S /Span - /P 54 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [72] - /Pg 174 0 R ->> -endobj - -56 0 obj -<< - /Type /StructElem - /S /L - /P 9 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [77 0 R 73 0 R 69 0 R 65 0 R 61 0 R 57 0 R] ->> -endobj - -57 0 obj -<< - /Type /StructElem - /S /LI - /P 56 0 R - /K [60 0 R 58 0 R] ->> -endobj - -58 0 obj -<< - /Type /StructElem - /S /LBody - /P 57 0 R - /K [69 59 0 R 71] - /Pg 174 0 R ->> -endobj - -59 0 obj -<< - /Type /StructElem - /S /Strong - /P 58 0 R - /K [70] - /Pg 174 0 R ->> -endobj - -60 0 obj -<< - /Type /StructElem - /S /Lbl - /P 57 0 R - /K [68] - /Pg 174 0 R ->> -endobj - -61 0 obj -<< - /Type /StructElem - /S /LI - /P 56 0 R - /K [64 0 R 62 0 R] ->> -endobj - -62 0 obj -<< - /Type /StructElem - /S /LBody - /P 61 0 R - /K [64 63 0 R 66 67] - /Pg 174 0 R ->> -endobj - -63 0 obj -<< - /Type /StructElem - /S /Strong - /P 62 0 R - /K [65] - /Pg 174 0 R ->> -endobj - -64 0 obj -<< - /Type /StructElem - /S /Lbl - /P 61 0 R - /K [63] - /Pg 174 0 R ->> -endobj - -65 0 obj -<< - /Type /StructElem - /S /LI - /P 56 0 R - /K [68 0 R 66 0 R] ->> -endobj - -66 0 obj -<< - /Type /StructElem - /S /LBody - /P 65 0 R - /K [59 67 0 R 61 62] - /Pg 174 0 R ->> -endobj - -67 0 obj -<< - /Type /StructElem - /S /Strong - /P 66 0 R - /K [60] - /Pg 174 0 R ->> -endobj - -68 0 obj -<< - /Type /StructElem - /S /Lbl - /P 65 0 R - /K [58] - /Pg 174 0 R ->> -endobj - -69 0 obj -<< - /Type /StructElem - /S /LI - /P 56 0 R - /K [72 0 R 70 0 R] ->> -endobj - -70 0 obj -<< - /Type /StructElem - /S /LBody - /P 69 0 R - /K [54 71 0 R 56 57] - /Pg 174 0 R ->> -endobj - -71 0 obj -<< - /Type /StructElem - /S /Strong - /P 70 0 R - /K [55] - /Pg 174 0 R ->> -endobj - -72 0 obj -<< - /Type /StructElem - /S /Lbl - /P 69 0 R - /K [53] - /Pg 174 0 R ->> -endobj - -73 0 obj -<< - /Type /StructElem - /S /LI - /P 56 0 R - /K [76 0 R 74 0 R] ->> -endobj - -74 0 obj -<< - /Type /StructElem - /S /LBody - /P 73 0 R - /K [49 50 75 0 R 52] - /Pg 174 0 R ->> -endobj - -75 0 obj -<< - /Type /StructElem - /S /Strong - /P 74 0 R - /K [51] - /Pg 174 0 R ->> -endobj - -76 0 obj -<< - /Type /StructElem - /S /Lbl - /P 73 0 R - /K [48] - /Pg 174 0 R ->> -endobj - -77 0 obj -<< - /Type /StructElem - /S /LI - /P 56 0 R - /K [79 0 R 78 0 R] ->> -endobj - -78 0 obj -<< - /Type /StructElem - /S /LBody - /P 77 0 R - /K [46 47] - /Pg 174 0 R ->> -endobj - -79 0 obj -<< - /Type /StructElem - /S /Lbl - /P 77 0 R - /K [45] - /Pg 174 0 R ->> -endobj - -80 0 obj -<< - /Type /StructElem - /S /Div - /P 9 0 R - /K [89 0 R 87 0 R 85 0 R 83 0 R 81 0 R] ->> -endobj - -81 0 obj -<< - /Type /StructElem - /S /Div - /P 80 0 R - /K [82 0 R] ->> -endobj - -82 0 obj -<< - /Type /StructElem - /S /Span - /P 81 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [44] - /Pg 174 0 R ->> -endobj - -83 0 obj -<< - /Type /StructElem - /S /Div - /P 80 0 R - /K [84 0 R] ->> -endobj - -84 0 obj -<< - /Type /StructElem - /S /Span - /P 83 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [43] - /Pg 174 0 R ->> -endobj - -85 0 obj -<< - /Type /StructElem - /S /Div - /P 80 0 R - /K [86 0 R] ->> -endobj - -86 0 obj -<< - /Type /StructElem - /S /Span - /P 85 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [42] - /Pg 174 0 R ->> -endobj - -87 0 obj -<< - /Type /StructElem - /S /Div - /P 80 0 R - /K [88 0 R] ->> -endobj - -88 0 obj -<< - /Type /StructElem - /S /Span - /P 87 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [41] - /Pg 174 0 R ->> -endobj - -89 0 obj -<< - /Type /StructElem - /S /Div - /P 80 0 R - /K [90 0 R] ->> -endobj - -90 0 obj -<< - /Type /StructElem - /S /Span - /P 89 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [40] - /Pg 174 0 R ->> -endobj - -91 0 obj -<< - /Type /StructElem - /S /L - /P 9 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [109 0 R 105 0 R 102 0 R 99 0 R 95 0 R 92 0 R] ->> -endobj - -92 0 obj -<< - /Type /StructElem - /S /LI - /P 91 0 R - /K [94 0 R 93 0 R] ->> -endobj - -93 0 obj -<< - /Type /StructElem - /S /LBody - /P 92 0 R - /K [39] - /Pg 174 0 R ->> -endobj - -94 0 obj -<< - /Type /StructElem - /S /Lbl - /P 92 0 R - /K [38] - /Pg 174 0 R ->> -endobj - -95 0 obj -<< - /Type /StructElem - /S /LI - /P 91 0 R - /K [98 0 R 96 0 R] ->> -endobj - -96 0 obj -<< - /Type /StructElem - /S /LBody - /P 95 0 R - /K [34 97 0 R 36 37] - /Pg 174 0 R ->> -endobj - -97 0 obj -<< - /Type /StructElem - /S /Strong - /P 96 0 R - /K [35] - /Pg 174 0 R ->> -endobj - -98 0 obj -<< - /Type /StructElem - /S /Lbl - /P 95 0 R - /K [33] - /Pg 174 0 R ->> -endobj - -99 0 obj -<< - /Type /StructElem - /S /LI - /P 91 0 R - /K [101 0 R 100 0 R] ->> -endobj - -100 0 obj -<< - /Type /StructElem - /S /LBody - /P 99 0 R - /K [31 32] - /Pg 174 0 R ->> -endobj - -101 0 obj -<< - /Type /StructElem - /S /Lbl - /P 99 0 R - /K [30] - /Pg 174 0 R ->> -endobj - -102 0 obj -<< - /Type /StructElem - /S /LI - /P 91 0 R - /K [104 0 R 103 0 R] ->> -endobj - -103 0 obj -<< - /Type /StructElem - /S /LBody - /P 102 0 R - /K [28 29] - /Pg 174 0 R ->> -endobj - -104 0 obj -<< - /Type /StructElem - /S /Lbl - /P 102 0 R - /K [27] - /Pg 174 0 R ->> -endobj - -105 0 obj -<< - /Type /StructElem - /S /LI - /P 91 0 R - /K [108 0 R 106 0 R] ->> -endobj - -106 0 obj -<< - /Type /StructElem - /S /LBody - /P 105 0 R - /K [23 24 107 0 R 26] - /Pg 174 0 R ->> -endobj - -107 0 obj -<< - /Type /StructElem - /S /Strong - /P 106 0 R - /K [25] - /Pg 174 0 R ->> -endobj - -108 0 obj -<< - /Type /StructElem - /S /Lbl - /P 105 0 R - /K [22] - /Pg 174 0 R ->> -endobj - -109 0 obj -<< - /Type /StructElem - /S /LI - /P 91 0 R - /K [111 0 R 110 0 R] ->> -endobj - -110 0 obj -<< - /Type /StructElem - /S /LBody - /P 109 0 R - /K [21] - /Pg 174 0 R ->> -endobj - -111 0 obj -<< - /Type /StructElem - /S /Lbl - /P 109 0 R - /K [20] - /Pg 174 0 R ->> -endobj - -112 0 obj -<< - /Type /StructElem - /S /Div - /P 9 0 R - /K [121 0 R 119 0 R 117 0 R 115 0 R 113 0 R] ->> -endobj - -113 0 obj -<< - /Type /StructElem - /S /Div - /P 112 0 R - /K [114 0 R] ->> -endobj - -114 0 obj -<< - /Type /StructElem - /S /Span - /P 113 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [19] - /Pg 174 0 R ->> -endobj - -115 0 obj -<< - /Type /StructElem - /S /Div - /P 112 0 R - /K [116 0 R] ->> -endobj - -116 0 obj -<< - /Type /StructElem - /S /Span - /P 115 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [18] - /Pg 174 0 R ->> -endobj - -117 0 obj -<< - /Type /StructElem - /S /Div - /P 112 0 R - /K [118 0 R] ->> -endobj - -118 0 obj -<< - /Type /StructElem - /S /Span - /P 117 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [17] - /Pg 174 0 R ->> -endobj - -119 0 obj -<< - /Type /StructElem - /S /Div - /P 112 0 R - /K [120 0 R] ->> -endobj - -120 0 obj -<< - /Type /StructElem - /S /Span - /P 119 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [16] - /Pg 174 0 R ->> -endobj - -121 0 obj -<< - /Type /StructElem - /S /Div - /P 112 0 R - /K [122 0 R] ->> -endobj - -122 0 obj -<< - /Type /StructElem - /S /Span - /P 121 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [15] - /Pg 174 0 R ->> -endobj - -123 0 obj -<< - /Type /StructElem - /S /H1 - /P 9 0 R - /T (Experience) - /K [14] - /Pg 174 0 R ->> -endobj - -124 0 obj -<< - /Type /StructElem - /S /P - /P 9 0 R - /K [136 0 R 135 0 R 134 0 R 133 0 R 132 0 R 131 0 R 130 0 R 129 0 R 128 0 R 127 0 R 126 0 R 125 0 R] ->> -endobj - -125 0 obj -<< - /Type /StructElem - /S /Link - /P 124 0 R - /K [13 << - /Type /OBJR - /Pg 174 0 R - /Obj 170 0 R - >>] - /Pg 174 0 R ->> -endobj - -126 0 obj -<< - /Type /StructElem - /S /Figure - /P 124 0 R - /Alt (github) - /A [<< - /O /Layout - /Placement /Block - >>] - /K [12] - /Pg 174 0 R ->> -endobj - -127 0 obj -<< - /Type /StructElem - /S /Link - /P 124 0 R - /K [11 << - /Type /OBJR - /Pg 174 0 R - /Obj 169 0 R - >>] - /Pg 174 0 R ->> -endobj - -128 0 obj -<< - /Type /StructElem - /S /Figure - /P 124 0 R - /Alt (git) - /A [<< - /O /Layout - /Placement /Block - >>] - /K [10] - /Pg 174 0 R ->> -endobj - -129 0 obj -<< - /Type /StructElem - /S /Link - /P 124 0 R - /K [9 << - /Type /OBJR - /Pg 174 0 R - /Obj 168 0 R - >>] - /Pg 174 0 R ->> -endobj - -130 0 obj -<< - /Type /StructElem - /S /Figure - /P 124 0 R - /Alt (linkedin) - /A [<< - /O /Layout - /Placement /Block - >>] - /K [8] - /Pg 174 0 R ->> -endobj - -131 0 obj -<< - /Type /StructElem - /S /Link - /P 124 0 R - /K [7 << - /Type /OBJR - /Pg 174 0 R - /Obj 167 0 R - >>] - /Pg 174 0 R ->> -endobj - -132 0 obj -<< - /Type /StructElem - /S /Figure - /P 124 0 R - /Alt (website) - /A [<< - /O /Layout - /Placement /Block - >>] - /K [6] - /Pg 174 0 R ->> -endobj - -133 0 obj -<< - /Type /StructElem - /S /Link - /P 124 0 R - /K [5 << - /Type /OBJR - /Pg 174 0 R - /Obj 166 0 R - >>] - /Pg 174 0 R ->> -endobj - -134 0 obj -<< - /Type /StructElem - /S /Figure - /P 124 0 R - /Alt (email) - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4] - /Pg 174 0 R ->> -endobj - -135 0 obj -<< - /Type /StructElem - /S /Link - /P 124 0 R - /K [3 << - /Type /OBJR - /Pg 174 0 R - /Obj 165 0 R - >>] - /Pg 174 0 R ->> -endobj - -136 0 obj -<< - /Type /StructElem - /S /Figure - /P 124 0 R - /Alt (phone) - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2] - /Pg 174 0 R ->> -endobj - -137 0 obj -<< - /Type /StructElem - /S /P - /P 9 0 R - /K [1] - /Pg 174 0 R ->> -endobj - -138 0 obj -<< - /Type /StructElem - /S /P - /P 9 0 R - /K [0] - /Pg 174 0 R ->> -endobj - -139 0 obj -<< - /Type /Font - /Subtype /Type0 - /BaseFont /FQWPCH+SourceSans3-SemiBold - /Encoding /Identity-H - /DescendantFonts [140 0 R] - /ToUnicode 143 0 R ->> -endobj - -140 0 obj -<< - /Type /Font - /Subtype /CIDFontType2 - /BaseFont /FQWPCH+SourceSans3-SemiBold - /CIDSystemInfo << - /Registry (Adobe) - /Ordering (Identity) - /Supplement 0 - >> - /FontDescriptor 142 0 R - /DW 0 - /CIDToGIDMap /Identity - /W [0 0 672 1 1 625 2 2 262 3 4 495 5 5 516 6 6 843 7 7 200 8 9 558 10 10 556 11 11 263 12 12 538 13 13 481 14 14 564 15 15 507.00003 16 16 373 17 17 560 18 18 462 19 19 745 20 20 549 21 21 431 22 22 642 23 23 545 24 24 748 25 25 520 26 26 564 27 28 324 29 29 361 30 30 576 31 31 628 32 32 271 33 33 317 34 34 563 35 35 674 36 36 522 37 37 582 38 38 501.99997 39 39 510 40 40 546 41 41 344 42 42 275 43 43 663 44 44 592 45 45 655 46 46 597 47 47 275] ->> -endobj - -141 0 obj -<< - /Length 13 - /Filter /FlateDecode ->> -stream -x -endstream -endobj - -142 0 obj -<< - /Type /FontDescriptor - /FontName /FQWPCH+SourceSans3-SemiBold - /Flags 131076 - /FontBBox [-69 -217 776 734] - /ItalicAngle 0 - /Ascent 1024 - /Descent -400 - /CapHeight 660 - /StemV 144.2 - /CIDSet 141 0 R - /FontFile2 144 0 R ->> -endobj - -143 0 obj -<< - /Length 1268 - /Type /CMap - /WMode 0 ->> -stream -%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: procset CIDInit -%%IncludeResource: procset CIDInit -%%BeginResource: CMap Custom -%%Title: (Custom Adobe Identity 0) -%%Version: 1 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo 3 dict dup begin - /Registry (Adobe) def - /Ordering (Identity) def - /Supplement 0 def -end def -/CMapName /Custom def -/CMapVersion 1 def -/CMapType 0 def -/WMode 0 def -1 begincodespacerange -<0000> -endcodespacerange -47 beginbfchar -<0001> <0044> -<0002> <0069> -<0003> <0076> -<0004> <0079> -<0005> <0061> -<0006> <006D> -<0007> <0020> -<0008> <0041> -<0009> <0068> -<000A> <0075> -<000B> <006A> -<000C> <0045> -<000D> <0078> -<000E> <0070> -<000F> <0065> -<0010> <0072> -<0011> <006E> -<0012> <0063> -<0013> <004D> -<0014> <006F> -<0015> <0073> -<0016> <00660074> -<0017> <0053> -<0018> <0077> -<0019> <0067> -<001A> <0064> -<001B> <0028> -<001C> <0029> -<001D> <0074> -<001E> <0043> -<001F> <0047> -<0020> <006C> -<0021> <0066> -<0022> <0062> -<0023> <004F> -<0024> <006B> -<0025> <0050> -<0026> <004C> -<0027> <0046> -<0028> <0054> -<0029> <002F> -<002A> <003A> -<002B> <0048> -<002C> <0052> -<002D> <0055> -<002E> <0042> -<002F> <002E> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF -endstream -endobj - -144 0 obj -<< - /Length 4045 - /Filter /FlateDecode ->> -stream -xX pu_~zز-zXSK_m%v^? l$*i2xhfZ($C$t6MCY -ah!qش`sdtL_:ss  B@+Oǁ\̼A{k"eu|U10a;:ȡ4l]f^åxX6KQѻϢ8.PDXZ&,bgbRsvVt)@muXErV^U[كl4W8 -KoQ.n0lUᱼ"f@]߬+)*ZJ7Atr 4DU[^;!%(աt)ިQ)9 dtV=/h?M1dC Vng)Ϭoky]j(*LHy#Ϙ3 {ZCrB!*p^B,JWڢ'nY! -BM}=pd?ȝty`#v:7_"smmAv ڼ%%^M.)Sq"#Ñފ -v-gH&vȗ-T̮I}=Fʶ~M{Yb :ΎxFXfWm1V\h)Ҕh2 _df5TUvVBءzy`XJVf|fy&_/=Ů<]NqQ"+WLFFy&S9.Uo?O>R*D6X`O]ȓ=<:f=o4OJG\KrY@;Jk 'eo)sڋͅ*GNM*7V؊2 u )w`\4[W/4le`zRR62[TtN;;͉{\n7  r ^1M0~qɬ5($&էj;M|e|Y[䨛j9<Yԙ9S-z})͖v[P㒆*OPKܹ -QS: uvQQk Z܃Nx\}<-ӖjBo.cS!: -l~ry|~ujiDNWJ=E"I65<  %=QƢRDo3DC=75i]y}7~rUJqp1{uv>+[_ M2E>OƺssŚmPi smmM_U3T MP݂qCO4 gMv;G+ۊU }~Yk67 `)tS;?}VE0Аklk, :'%5Mpz݅ z{WrsmaS" >ב@/߮E2J17ӔiVѶuy+D @NMΘRMGem FC/I85x;4qSaUZ:G[4o̩` -n&/H%?z N9twcWCc:Ν{ths^hZ Cզ䦔^gZV~YY`u(Mo?\=ĕHcP9[d+Z7Bmwu ui>s r)Jޤ1%4kQGcn2a`>o@i JeV/^ճ_0Q >xBXl %v:@!{jwe;fu8J2-7QnK&ݘ¢0}4 -A_;VZZV:OwwOF_1XduT}}}+CzXwZ4rF:.P0j뺥uJ%um CP'ppKJyjc=d -{nޫWuc{fZ#263;Kcf\*>YITvr# dM΍kjTY1[-$C[Itn6j5mLlj~ob3 Db(e2F8&TQq3+m|l3l"d;y졭' sAx}V;.^&"(4NGkL( a""@~{SBB!@8u"DAרar!)y!ri*7PHBCͰӟzQE:pt,CC[PK%4TF~4!څ0aGZ` P!L!:0 H|ED^51 s''% -ZG%}Kk E?)IKK-})/ *xJ\c-J++_P>QTXCL,{!(2<IJej<)r|JRN&"%('RRr:2!%gRr<9%g ]K94$x2$b$c QDFE̾sX*\@5$\2X, l0 ]X0BO = cXFֱy8`2pЊaMYQƹ,sC֖(s  Nv XX%Nquq/g !M6fQ XEmVa%aΧ<ދ7!a_;dУ˦t`m+|gB+E##D0DZ@|X0.c4ɬ~ޓѱ|*kEBKEƟCsD&(z01V`(Bk1 :uqF$it>ɌGI.cs9Ua ){k#|5Yv*s+&>7nKd-kYp9UˌIy2~[VgR3>q?7_2qЁ!8rL!a]pcㄢ'ыndA QA ^G>JQQ5o -QeG?OS0w -endstream -endobj - -145 0 obj -<< - /Type /Font - /Subtype /Type0 - /BaseFont /HYJHEX+SourceSans3-Regular - /Encoding /Identity-H - /DescendantFonts [146 0 R] - /ToUnicode 149 0 R ->> -endobj - -146 0 obj -<< - /Type /Font - /Subtype /CIDFontType2 - /BaseFont /HYJHEX+SourceSans3-Regular - /CIDSystemInfo << - /Registry (Adobe) - /Ordering (Identity) - /Supplement 0 - >> - /FontDescriptor 148 0 R - /DW 0 - /CIDToGIDMap /Identity - /W [0 0 653 1 1 534 2 2 542 3 3 594 4 4 719 5 5 504 6 6 347 7 7 496 8 8 200 9 9 527 10 10 547 11 11 504 12 12 246 13 20 497 21 22 544 23 23 247 24 24 555 25 26 467 27 27 829 28 28 847 29 29 255 30 30 249 31 31 456 32 32 350 33 33 338 34 34 647 35 35 727 36 36 497 37 37 311 38 38 566 39 39 419 40 40 536 41 41 495 42 43 249 44 44 479 45 45 555 46 46 304 47 47 588 48 48 543 49 49 263 50 50 446 51 51 292 52 52 571 53 53 425 54 54 553 55 55 664 56 56 569 57 58 303 59 59 577 60 60 494 61 61 615 62 62 579 63 63 555 64 64 652 65 65 786 66 66 617 67 67 645 68 68 513 69 69 486 70 70 664 71 71 241 72 72 497] ->> -endobj - -147 0 obj -<< - /Length 13 - /Filter /FlateDecode ->> -stream -x ->6 -endstream -endobj - -148 0 obj -<< - /Type /FontDescriptor - /FontName /HYJHEX+SourceSans3-Regular - /Flags 131076 - /FontBBox [-55 -250 797 750] - /ItalicAngle 0 - /Ascent 1024 - /Descent -400 - /CapHeight 660 - /StemV 95.4 - /CIDSet 147 0 R - /FontFile2 150 0 R ->> -endobj - -149 0 obj -<< - /Length 1622 - /Type /CMap - /WMode 0 ->> -stream -%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: procset CIDInit -%%IncludeResource: procset CIDInit -%%BeginResource: CMap Custom -%%Title: (Custom Adobe Identity 0) -%%Version: 1 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo 3 dict dup begin - /Registry (Adobe) def - /Ordering (Identity) def - /Supplement 0 def -end def -/CMapName /Custom def -/CMapVersion 1 def -/CMapType 0 def -/WMode 0 def -1 begincodespacerange -<0000> -endcodespacerange -72 beginbfchar -<0001> <0053> -<0002> <006F> -<0003> <00660074> -<0004> <0077> -<0005> <0061> -<0006> <0072> -<0007> <0065> -<0008> <0020> -<0009> <0045> -<000A> <006E> -<000B> <0067> -<000C> <0069> -<000D> <002B> -<000E> <0039> -<000F> <0031> -<0010> <0037> -<0011> <0030> -<0012> <0035> -<0013> <0036> -<0014> <0034> -<0015> <0068> -<0016> <0075> -<0017> <006A> -<0018> <0064> -<0019> <0076> -<001A> <0079> -<001B> <006D> -<001C> <0040> -<001D> <006C> -<001E> <002E> -<001F> <0063> -<0020> <002F> -<0021> <0074> -<0022> <004E> -<0023> <004D> -<0024> <0032> -<0025> <002D> -<0026> <0050> -<0027> <0073> -<0028> <0054> -<0029> <006B> -<002A> <003A> -<002B> <002C> -<002C> <004A> -<002D> <0070> -<002E> <2022> -<002F> <0042> -<0030> <0041> -<0031> <0049> -<0032> <0078> -<0033> <0066> -<0034> <0043> -<0035> <007A> -<0036> <0062> -<0037> <004F> -<0038> <0052> -<0039> <0028> -<003A> <0029> -<003B> <00660066> -<003C> <0046> -<003D> <0044> -<003E> <004B> -<003F> <0071> -<0040> <0048> -<0041> <0057> -<0042> <0047> -<0043> <0055> -<0044> <0058> -<0045> <004C> -<0046> <0051> -<0047> <007C> -<0048> <0038> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF -endstream -endobj - -150 0 obj -<< - /Length 5721 - /Filter /FlateDecode ->> -stream -xZ T~ p BBȍ@ 2 8@u3ZmZ9ZwUjkmnYZd'0 m2'O{y} E}9@󩹙CsUf}jna(x>ŃoLE,L\,n  ?/l<4', -@,4@?9(D1WUVBVRWkte6S7Hnmnmt-G 4+ˍ6Hn x -mjQ;ޕʩ̖ՂY"T6זTͤ~)T嶝9cvW*JT(Ysʉ.ɺ%/;+}V8L##N, +߼3@..)̖e(:{$]-SDzg|j|HGd֚6>(y\6`,mՐ -fyU; T]Zu[ԲvVGTa -m -NT5 orGTufcI]v)Rf2762E.YZd -^BoSp.GVYWRhl-'{A|yR_%PhG"-"cN% ڦz^+Mʦw .GghGou-2RS -A0 t yRLy~5 %_y-RK:|3JwjV *e_g:\M;wRJȯ%CW;i fURWdǕ\: 2AYy۞U/.561Q[ZL;+%յSzQﱹۭg/0֗ɔVѝ/+m 8YͲ"/dԚPC3`8-zwY'8V7R)x>!׳(0c@'B@ HODxbOGfl Uz+<2t d@DʈL+,$j+ ;3.nrxIt1z$m/km6A]eurXag`uFnπƈHrI^cws#\7I'}4Xݯ#]}g|}Aq7gFΝkMR4(5u5ӊ* 5+&EY%㲇EquLk9Z<#Knv.|8 tU[I 'pVUVdyyeq2E%kOOo.yCW$qːY ߠBϲWnef'mohlݶ{'tu_M}p.W3R}C㇤OD},v^yt tu TB&s,Ҵu==Stz}ܕ|t;Clw}j\c'H]ԔI-wy}|5肼F穴ռWwyMnZOqC_f(-BN[N;t -Ղϐ?C;;70Y祚@%V:O>'1_^sS*=AI3Xr5Zv@xI=G -ZSޒ1'([f r ]DXHSz !MnB!pbWwwh4UF#]jf*tLm\1$I-p]FӱZOyH@2]3u֋XlO 9kln4ǚA!U+%b,܅ {WMEBSxY -/>c5CDMa5!YG9LЇDFfNQ|h^RWs}|2Zm/9rw*s5w EmzZ.[ Ag6ϙn15䓑VSTG1\YUpK'oӻt}~Ti=qɨ`uՂ0#"amהĊ L<:ϵ^w??FԏD5a-&+2|8ɇ$J *ݣFSR#"67|n3g.my ZfUҎT>.?=k.98bR7a37'?@W[EXUd,}{JD-b5''j7_% Lg"]PՙZDž29Oא+Xa[;;o98?ҵ9ּ:_ g2r4B=jƻZIv2zH^!y{ =$+*r>!厨f^\?^M*+~"&g(D*H_"|%CJ6H mV?ҵlYF9>9?2] е佁k #N0c WdrlkXmޭmŮBK^6oшי㉓1u#_5 KmPwjsnMlX@I8Rt:=JCh?9)9j"exG)5ZTjGg+'ڒ)WVi d#\tQv25 $[Y>'IT\З>},wฟ{}=>yOERoO_dH.woޓl^vKo8-VM%HBT@.m""l"E83rr^r*jBЇ7Sߧ5}&ĹAH!%&S%ܛ1A_j1A> =BO~!?Ok'^h&Q`| -Z< ##Ncx'XhZ:&aLVL0mӳdl-.b\d7g.'~B*^r||尐X3lRwf-ˌCq>gɌ zA Q" LaX'nLoq p„*`B3X q38:cX ;E8S74a&~q-bFma+Voڵ/a5s$ -%MW:EJqP "LfI$J39%a*%H,LX.K3_QÇ$Ԡ! ؏ -"#YxݿU\{l+zC'Hdʗ -endstream -endobj - -151 0 obj -<< - /Type /Font - /Subtype /Type0 - /BaseFont /SRFVNV+SourceSans3-Bold - /Encoding /Identity-H - /DescendantFonts [152 0 R] - /ToUnicode 155 0 R ->> -endobj - -152 0 obj -<< - /Type /Font - /Subtype /CIDFontType2 - /BaseFont /SRFVNV+SourceSans3-Bold - /CIDSystemInfo << - /Registry (Adobe) - /Ordering (Identity) - /Supplement 0 - >> - /FontDescriptor 154 0 R - /DW 0 - /CIDToGIDMap /Identity - /W [0 0 690 1 1 528 2 2 514 3 4 528 5 5 857 6 9 528 10 10 556 11 11 573 12 12 555 13 13 383 14 14 286 15 15 276 16 16 534 17 17 571 18 18 200 19 19 573 20 20 776 21 21 527 22 22 398 23 23 573] ->> -endobj - -153 0 obj -<< - /Length 12 - /Filter /FlateDecode ->> -stream -x  -endstream -endobj - -154 0 obj -<< - /Type /FontDescriptor - /FontName /SRFVNV+SourceSans3-Bold - /Flags 131076 - /FontBBox [-171 -211 832 723] - /ItalicAngle 0 - /Ascent 1024 - /Descent -400 - /CapHeight 660 - /StemV 168.6 - /CIDSet 153 0 R - /FontFile2 156 0 R ->> -endobj - -155 0 obj -<< - /Length 928 - /Type /CMap - /WMode 0 ->> -stream -%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: procset CIDInit -%%IncludeResource: procset CIDInit -%%BeginResource: CMap Custom -%%Title: (Custom Adobe Identity 0) -%%Version: 1 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo 3 dict dup begin - /Registry (Adobe) def - /Ordering (Identity) def - /Supplement 0 def -end def -/CMapName /Custom def -/CMapVersion 1 def -/CMapType 0 def -/WMode 0 def -1 begincodespacerange -<0000> -endcodespacerange -23 beginbfchar -<0001> <0035> -<0002> <0078> -<0003> <003E> -<0004> <0039> -<0005> <0025> -<0006> <0034> -<0007> <0030> -<0008> <0033> -<0009> <0032> -<000A> <0053> -<000B> <0070> -<000C> <006F> -<000D> <0074> -<000E> <006C> -<000F> <0069> -<0010> <0067> -<0011> <0068> -<0012> <0020> -<0013> <0041> -<0014> <0077> -<0015> <0061> -<0016> <0072> -<0017> <0064> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF -endstream -endobj - -156 0 obj -<< - /Length 2892 - /Filter /FlateDecode ->> -stream -xU{l[sIԎ}ssv;InmڴIhZHIiBRZ6[W[i `Z6`LBLZblB ֞αEc=;@]x(.̤}'}[g$&'3YZQ>?J?U_JV4ͤW (y4|.fC Bf~R}>8 Qc* jWݚL-BO Z}@@ jU9բ[H(QY4՟vTzZrGkQ2%uրk!:ՄJ,l(D2h,nwM-KU -|>VTŦb?5X#+֊b1I>(dS.7'7ET'*LO!nЪEOZjc r޶}쮌8DbƺOJhhih ҅]+C^s:XQqC;FOr[s*?Q9ɵwj5_.聴!HrvQ1_Q`dǝ3k*=R8vQLCMv vKg?S?>08$C*snB ~ |fTmUvΎWNv׎6ƒI$,aq͓fMT:nnn0J[}5 Ȼb|+ܚjXEYֽtxfm[}+h2]U)k9{%_lwƬ!1_%Ÿ;L*"E#i2ܹYKңϨϝ[|-Uhu,S*1`ZףF]Di[ iX%Xq9Wa -ycd|k -^3J-Tǽ6죦W6:$#t[\~WR;(s`Pn_Y7WثZr$kFUYh0*j{jQUYqsH/06*WF3cinYɹc}&vv(b~_ nC h﮳3`>{VspMR,ً}Vze0cF -;W7/сr{^~@OkKdwì6dEXz\a}(l8#a^)QIkUmM*Y1UfSE_c2Z,yC**8߅..l kZ,qzg\6 -n\Ș{8+*^kΏ暇c6ٕZcHlo߿izZkݽbQQjt$mD} '7zarC*xo+8&C,Ճ oVBkJ34Աs(;beEFGSDG{#Hn J^,;B~DF׆OG@(Iwo1}ϽĞD?v"KGAٯy*dk'i㟓RS=dv `z^QMk-HxW` . IjLm}&ha""E[r);Frj1ǿ ZG<}^6M/ALVzT+Sx:̢&,*p۱3Bb <_UB\D[ՐH!;BE 5bXTK q q9bE4$DQ(HHasE0&D2#6&1aQ ˘&!,"܁ !s$C3lɊ>0d }Hc`0q(qDntyg)[Jkcj1nXisXXgq$4 ̯z4ciE@+|(H_)^Wp0qFSV9{,W xoGsXsXp,`oXi4$! -cwo,8A?& ֽO` :Ә0hتㅊC' 矽!s ;oV҆n\w];(u3:~/ M,bs;%.aaDЍtTs4ΟyFqlM<:7 }w32Nc1~B/z>|n7z!؇6>oܑpa3~򊱾/. 9r+,aE>g S##84\,`syw數G0s,^fnהXV> -stream -xuJPFOUvDD@`]\ -FMkIRB|&إnऋ(HrTų9` ըa&ʺ:l -3Ŭ*ުnh)&C|>b纝黓AvCƫ+ y') -̵8+/> -stream -x}Kq?UX 94%MQKSN#ԦQvBˡhFk ! -ՠZP~xx^ޗQx"^P c!H0 - 0l+ߣy7;׫;Q?V._tF3LEK)y z80eIPkT/%[p:8+%d"G `d_{ٹ֖gzm\8rSif1\CU` S] @o _ -endstream -endobj - -161 0 obj -[174 0 R /XYZ 36 710.56976 0] -endobj - -162 0 obj -[174 0 R /XYZ 36 257.0298 0] -endobj - -163 0 obj -[174 0 R /XYZ 36 174.88977 0] -endobj - -164 0 obj -[174 0 R /XYZ 36 97.34979 0] -endobj - -165 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [48 749.56976 114.61 761.1698] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (tel:+917015600547) - >> - /F 4 - /StructParent 0 - /Contents (Telephone +917015600547) ->> -endobj - -166 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [131.61 749.56976 237.81 761.1698] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (mailto:ahujadivyam@gmail.com) - >> - /F 4 - /StructParent 1 - /Contents (Email ahujadivyam@gmail.com) ->> -endobj - -167 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [254.81 749.56976 302.9 761.1698] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://divyam.dev) - >> - /F 4 - /StructParent 2 - /Contents (https://divyam.dev) ->> -endobj - -168 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [319.9 749.56976 385 761.1698] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://linkedin.com/in/ahujadivyam) - >> - /F 4 - /StructParent 3 - /Contents (https://linkedin.com/in/ahujadivyam) ->> -endobj - -169 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [48 734.56976 109.42 746.1698] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://git.divyam.dev/) - >> - /F 4 - /StructParent 4 - /Contents (https://git.divyam.dev/) ->> -endobj - -170 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [126.42 734.56976 194.07 746.1698] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://github.com/ahujadivyam) - >> - /F 4 - /StructParent 5 - /Contents (https://github.com/ahujadivyam) ->> -endobj - -171 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [44.04 266.5298 263.3 278.12976] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://github.com/ahujadivyam/gsoc-chromium-freequeue) - >> - /F 4 - /StructParent 6 - /Contents (https://github.com/ahujadivyam/gsoc-chromium-freequeue) ->> -endobj - -172 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [44.04 125.44977 171.02 137.04974] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://git.divyam.dev/divyam/fastbin) - >> - /F 4 - /StructParent 7 - /Contents (https://git.divyam.dev/divyam/fastbin) ->> -endobj - -173 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [175.51 125.44977 270.08 137.04974] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://fastbin.lab.divyam.dev) - >> - /F 4 - /StructParent 8 - /Contents (https://fastbin.lab.divyam.dev) ->> -endobj - -174 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 157 0 R - /c1 158 0 R - >> - /Font << - /f0 139 0 R - /f1 145 0 R - /f2 151 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 9 - /Tabs /S - /Parent 1 0 R - /Contents 175 0 R - /Annots [165 0 R 166 0 R 167 0 R 168 0 R 169 0 R 170 0 R 171 0 R 172 0 R 173 0 R] ->> -endobj - -175 0 obj -<< - /Length 7869 - /Filter /FlateDecode ->> -stream -x]Ys%u~#Z&Ȋ8+JKC 䐌-O?akh4yQF/A=!⟿$/8 #\s" ^QüUꆑoN|F#߼ٞ7w3ӯH2+"wkү ߷}?7=Nӫ~R|2)k4IqձI]QP͌f֜]M}.ݽ>}K>}Ն -`@{ܝTݼ M5eoӟO*n¿t#P#gzrwre:%z3nq5UW#hOpCá8V2xR$Q5H-ޜhOSͽA0ӂ> -wxp -\: }r pc_%@w'5ED)NDpO9rl .RX zʽ$ "҄0Oסu{LSxW=[ ꔬG26X YpϨ<,7&`jmGq{82IyB*@'Y)x&bV -IT^)T'uQ/IQ#U"9-R&˟MZ"0x*ɱ8{ݝ2,29X $<hޔTsy8; (C ,?oNyFij$qƒHk(pPA`#ޝ$,#̊d={b8/ -iSB< z2&|{ny;VQ^n=id3{Eu9W֋+p_RX/gnڧO Ml yÝU;V CPR!lNx|a -j`D? ?qWl --f(6Ԉ(fXe5TBxohE`e67 D[P ظ9EhcăL7F2j'JB?ǍR*x -z~1x3*M0)j Q Q | mS 'q rhr2p4K f(>Հxm@ֻ24(~$@wqj@Q.,Un`L]q*# & mQ2D`b;L*HZq_H@+klAg -?ݭDO@cia,qYrP , @R *&L-K}6K̛ fKaMEnb҈s f$inqeE NLMFчR[#ul\1n &&qM+!P [ G1jXoU1drE"/?H+DK3F֔m=3Z_ U KJstRywLzA -C5\ 1oʿ83W>(đV0oORS/IL8 p@:V MQ#aMsO㌳07,PqЪ8p11ʽa -/$_O|u'NxTxBB4*:J`~ESSiBK-#zB^KLz\M cYLʼ g -@+8y2B2 O.Dh2*A2BX?iƝ' XL -I)#2+c2$@cB+ab9;&֟ B܀̅}YJsU$kU -qXЛF"_h[!~>ʴk -Tpȥ "C)t"?UL\!ECX!"HLQcgRh# -D!H ?cU!||5"*,:046[pO:P/50lQ+r"gw&6摼Gg =K2Jb.(@;$虳H&akc+&`qR1d Nk,z!rރ/BL/<М r -%ܡ* >RgBX%mh# P`H=Er,"{ʐ֯g a L @@Rap"> M e::D&g9z kSbuPW\ȣ9gf0 -ek&.5$Dynd;XqTk⟷գoZzXְMr7"A?,u԰خl^SXNz5 |/++bLW/d^ ]2ɄMn"0$KFĽh5G@# ϙJFWuQjAP1d0[2t7\u|];S拍\-II"AapzE.;2ūFymddt WPLa^]'}QƮ>jhb/+ӺttMtřҮq[^q@;ќ^n}>q>x/xWD< f֭fӑO -ywŕb•S8mq))?tI6"NO0S\"7LU-h-ƹSRDD/q+q}e-)0KHGB.Gek/w?d^eiv6Tr-<,t;7;u8ϕXP%0{ WwԽ]mK<9Q=鴪(fd6]7UaD9j˷ }Wmf(?4aTjrR{_vL)]2v\{@dg= D;F8ńٟ{`l4Jpˤ3Qs@=-pzXO+:=`hdoLlC2IeLZ!.Es7:] 7;:Pzыs%Ay/'Nﳙrs_0tc?N2NJC) WO zӋN@?m T}k59^b"7y8R$G %\I¡סP,ۮ#*bF^漏ai-BSNK9.;"Ox[5yڛNŞ ^, -.\. Qkx㮸ÝoZ*ωjԴ}:;f2_p? .ì2JQZ#ɂe ,3r%J߿^H;]Oy2&A)7Q:"l >K}ǥz w/yO"rӫ7 1w/^/pw3Ot>W9*t$^:.iyb< -[Qy(~5ꞵ8ag L ٣]Zbzo(6[ra3zX[^NeUo>AVBd#u= 댂Rv;džIfkVc]DHAWE}0\/Kɖs*gfT騪^LJ}|QYNduZlD35=m ۊN&ոڏd d&W-9e9aJr^,2䘾ʫi|~b ~T^4r]Z6KB +@ރt߻3j_Tj•l2.tnZ}Vs,85p/>etYQm=da*WIQ]R=zsd왃|Qܳ;{^ZR)0gV[gNey4_uTDzW~\ݱa F 1gAe2$wC%oxkp^na[y{n5!UZdUqP4=+'ϛsァse'jR{xM!snkI[U,i'x$0z:QAgF9$uOA*"wG2.uSmٺzn*0x_y>tCLg`IOEAu5pcl:y4Lie.JapygnʘFv' rzPp7]]?"\7u,a9^Zo^jx}\8"vu{H)WW}\+f)?Ƃ˘I_رVCO$| »Dz(WDx;*@xy+ZC-֩zt¡)/K_Rx X*Lo AUX){l.ˠ6|5?fNG1+uRvs9e ga=.p{y<%R;\o?nj?{Ri{haw%vܼ-{R 'XiRF2#( ߳7/\pdw5++5]tS}uXOu;WWxۺ؎*G 1RzkwY Hku^j, 7:zKu+^y7l-ڒ'G(3^3 =՟e)6g 5[{W5>[7GR@G6lFG5p,yhQZW}Eiv<HY-LL#')xws0` ;b 74 \ɉ$Lژ{OWr{WҡߟY1۞'L=MAVҞ?PmNz]ϯS6KBgK^tP9\1^yA4qs(8<to}+{,VH{`wMig"ѽ|@j] Ufjd/fCD4IsyK][L6Phwj -)lCh2A|\zs(>v`懙fo@j揍lͺG%AU_ oۢx1HLzz^|Z%=j(_$ah!rKK7pgsz%[DZ}㽍ϽZ<2Ì~0(_-,u - -q2ǟ<`z;N^W>뚚&E\kjҌRkK&3T5g9ȥZ]y*_y -"Y{}ycn̫L9;'O߅}8L=jM3u2wj ?lR鹞[1o%ߌ 5ےб[zַMų"BthEe~o@`zy7Ezj^[b˷F[Ǝ7kGQŒ -(-Kջ$/_`1,"$9UUGmVkX|~ɡRYuEO-GMi*؋omg(y$@ o^z8O矶OY4~\ -endstream -endobj - -176 0 obj -<< - /Title (Divyam Ahuja's Resume) - /Author (Divyam Ahuja) - /Creator (Typst 0.14.2) - /ModDate (D:20260508141634+05'30) - /CreationDate (D:20260508141634+05'30) ->> -endobj - -177 0 obj -<< - /Length 1173 - /Type /Metadata - /Subtype /XML ->> -stream -Divyam Ahuja's ResumeDivyam AhujaTypst 0.14.2en2026-05-08T14:16:34+05:302026-05-08T14:16:34+05:301application/pdfDVDL2RA5wLiK7BwZWe7VOA==krnqdnxIK62TWTpNh/a6rg==proof1.7 -endstream -endobj - -178 0 obj -<< - /Type /Catalog - /Pages 1 0 R - /Metadata 177 0 R - /Lang (en) - /StructTreeRoot 7 0 R - /MarkInfo << - /Marked true - /Suspects false - >> - /ViewerPreferences << - /Direction /L2R - >> - /Outlines 2 0 R ->> -endobj - -xref -0 179 -0000000000 65535 f -0000000016 00000 n -0000000082 00000 n -0000000162 00000 n -0000000252 00000 n -0000000352 00000 n -0000000454 00000 n -0000000543 00000 n -0000000857 00000 n -0000001650 00000 n -0000001856 00000 n -0000001955 00000 n -0000002034 00000 n -0000002177 00000 n -0000002256 00000 n -0000002399 00000 n -0000002478 00000 n -0000002621 00000 n -0000002700 00000 n -0000002843 00000 n -0000002948 00000 n -0000003038 00000 n -0000003169 00000 n -0000003254 00000 n -0000003359 00000 n -0000003496 00000 n -0000003651 00000 n -0000003788 00000 n -0000003943 00000 n -0000004032 00000 n -0000004121 00000 n -0000004224 00000 n -0000004331 00000 n -0000004432 00000 n -0000004577 00000 n -0000004662 00000 n -0000004743 00000 n -0000004880 00000 n -0000005035 00000 n -0000005124 00000 n -0000005209 00000 n -0000005300 00000 n -0000005389 00000 n -0000005474 00000 n -0000005565 00000 n -0000005654 00000 n -0000005760 00000 n -0000005839 00000 n -0000005981 00000 n -0000006060 00000 n -0000006202 00000 n -0000006281 00000 n -0000006423 00000 n -0000006502 00000 n -0000006644 00000 n -0000006723 00000 n -0000006865 00000 n -0000007031 00000 n -0000007116 00000 n -0000007217 00000 n -0000007309 00000 n -0000007398 00000 n -0000007483 00000 n -0000007587 00000 n -0000007679 00000 n -0000007768 00000 n -0000007853 00000 n -0000007957 00000 n -0000008049 00000 n -0000008138 00000 n -0000008223 00000 n -0000008327 00000 n -0000008419 00000 n -0000008508 00000 n -0000008593 00000 n -0000008697 00000 n -0000008789 00000 n -0000008878 00000 n -0000008963 00000 n -0000009057 00000 n -0000009146 00000 n -0000009252 00000 n -0000009331 00000 n -0000009473 00000 n -0000009552 00000 n -0000009694 00000 n -0000009773 00000 n -0000009915 00000 n -0000009994 00000 n -0000010136 00000 n -0000010215 00000 n -0000010357 00000 n -0000010526 00000 n -0000010611 00000 n -0000010702 00000 n -0000010791 00000 n -0000010876 00000 n -0000010980 00000 n -0000011072 00000 n -0000011161 00000 n -0000011248 00000 n -0000011343 00000 n -0000011433 00000 n -0000011521 00000 n -0000011617 00000 n -0000011708 00000 n -0000011796 00000 n -0000011903 00000 n -0000011997 00000 n -0000012088 00000 n -0000012176 00000 n -0000012269 00000 n -0000012360 00000 n -0000012472 00000 n -0000012554 00000 n -0000012698 00000 n -0000012780 00000 n -0000012924 00000 n -0000013006 00000 n -0000013150 00000 n -0000013232 00000 n -0000013376 00000 n -0000013458 00000 n -0000013602 00000 n -0000013708 00000 n -0000013874 00000 n -0000014023 00000 n -0000014185 00000 n -0000014334 00000 n -0000014493 00000 n -0000014641 00000 n -0000014804 00000 n -0000014952 00000 n -0000015114 00000 n -0000015262 00000 n -0000015422 00000 n -0000015570 00000 n -0000015730 00000 n -0000015816 00000 n -0000015902 00000 n -0000016073 00000 n -0000016779 00000 n -0000016870 00000 n -0000017125 00000 n -0000018475 00000 n -0000022600 00000 n -0000022770 00000 n -0000023629 00000 n -0000023720 00000 n -0000023973 00000 n -0000025677 00000 n -0000031478 00000 n -0000031645 00000 n -0000032089 00000 n -0000032179 00000 n -0000032431 00000 n -0000033440 00000 n -0000036412 00000 n -0000036450 00000 n -0000036488 00000 n -0000036847 00000 n -0000037270 00000 n -0000037318 00000 n -0000037365 00000 n -0000037413 00000 n -0000037460 00000 n -0000037708 00000 n -0000037975 00000 n -0000038222 00000 n -0000038500 00000 n -0000038754 00000 n -0000039026 00000 n -0000039344 00000 n -0000039630 00000 n -0000039903 00000 n -0000040326 00000 n -0000048275 00000 n -0000048460 00000 n -0000049724 00000 n -trailer -<< - /Size 179 - /Root 178 0 R - /Info 176 0 R - /ID [(krnqdnxIK62TWTpNh/a6rg==) (DVDL2RA5wLiK7BwZWe7VOA==)] ->> -startxref -49961 -%%EOF \ No newline at end of file diff --git a/public/resume/index.html b/public/resume/index.html deleted file mode 100644 index 2b2899c..0000000 --- a/public/resume/index.html +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - - - - - - - - - - - - - -Resume · Divyam Ahuja - - - - - - - - - - - -
-
- - -
-

Experience

-
-
-
-

Software Engineer

- Microsoft · Noida -
- -
-
Python, JavaScript, TypeScript, Playwright, Telemetry
-
    -
  • Build, evaluate, and enhance AI-powered user experiences for the Excel Copilot team.
  • -
  • Architected a parallelized automation framework for synthetic data generation and evaluation, boosting pipeline throughput by 5x.
  • -
  • Orchestrated the Responsible AI (RAI) pipeline, executing evaluation runs on new models to guarantee safe and deterministic AI outputs.
  • -
  • Acted as on-call Shield Engineer, monitoring pipeline health, triaging partner issues, and driving incident response for critical bugs.
  • -
  • Integrated comprehensive telemetry, structured logging, and observability dashboards into pipelines to maintain >95% reliability.
  • -
  • Engineered autonomous AI agents to automate repetitive tasks and optimize workflow efficiency.
  • -
-
-
-
-
-

System Software Designer

- Advanced Micro Devices (AMD) · Bangalore -
- -
-
C, C++, Java, Python, React.js, JavaScript
-
    -
  • Engineered an OpenJDK performance monitoring system, enabling early detection and mitigation of performance degradation.
  • -
  • Spearheaded the development of a visualization dashboard and RESTful API for OpenJDK telemetry, increasing data accessibility by 40%.
  • -
  • Automated nightly Java benchmarking and tuning using machine learning models, achieving a 30% reduction in manual effort.
  • -
  • Executed advanced Java tuning techniques, yielding a 2% performance increase across High Performance Computing (HPC) servers.
  • -
  • Refactored and containerized legacy projects for cross-platform compatibility, driving a 90% reduction in deployment errors.
  • -
  • Received the Spotlight Award for exceptional contributions to automation and nightly benchmark visualization.
  • -
-
-
-
-
-

Google Summer of Code Contributor (Open Source Developer)

- Chromium · Remote -
- -
-
JavaScript, TypeScript, C, C++, WebAudio, WebAssembly, WebWorkers
-
    -
  • Researched and implemented optimal design patterns integrating the WebAudio API with WebAssembly and WebWorkers.
  • -
  • Designed and authored a high-performance, lock-free ring buffer library for real-time audio processing.
  • -
-
- github.com/ahujadivyam/gsoc-chromium-freequeue -
-
-
- -
-

Skills

-
-
-

Programming Languages

- C/C++, Python, JavaScript/TypeScript, Java, Go (Golang), Bash, PHP -
-
-

Frameworks

- React.js, Next.js, Express.js, Django, Flask, Node.js -
-
-

Tools/Platforms

- Git, Docker, Emscripten, UNIX, Linux, POSIX, Shell, Kubernetes, WebAssembly, WordPress -
-
-

Databases

- MySQL, MongoDB, PostgreSQL, Redis -
-
-
- -
-

Projects

-
-
-
-

fastbin: a code sharing webapp

-
-
-
HTMX, Go (Golang), gRPC, PostgreSQL, Docker, Kubernetes
-
- git.divyam.dev/divyam/fastbin - fastbin.lab.divyam.dev -
-
-
-
-
-

Homelab

-
-
-
Raspberry Pi 5, WireGuard, Kubernetes, Rancher, MetalLB
-
-
- -
-

Education

-
-
-
-

Bachelor of Technology (B.Tech.) Computer Science

- Deenbandhu Chhotu Ram University of Science and Technology · Haryana, India -
- -
-
-
- - -
-
-
-
- -
-
- - diff --git a/public/sitemap.xml b/public/sitemap.xml deleted file mode 100644 index 0532672..0000000 --- a/public/sitemap.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - - http://localhost:1313/ - 2026-05-08T00:00:00+00:00 - weekly - 0.5 - - http://localhost:1313/posts/hello-world/ - 2026-05-08T00:00:00+00:00 - weekly - 0.5 - - http://localhost:1313/tags/hugo/ - 2026-05-08T00:00:00+00:00 - weekly - 0.5 - - http://localhost:1313/tags/meta/ - 2026-05-08T00:00:00+00:00 - weekly - 0.5 - - http://localhost:1313/tags/ - 2026-05-08T00:00:00+00:00 - weekly - 0.5 - - http://localhost:1313/posts/ - 2026-05-08T00:00:00+00:00 - weekly - 0.5 - - http://localhost:1313/posts/pdf-translation-pipeline/ - 2026-02-11T00:00:00+00:00 - weekly - 0.5 - - http://localhost:1313/tags/ml/ - 2026-02-11T00:00:00+00:00 - weekly - 0.5 - - http://localhost:1313/tags/ocr/ - 2026-02-11T00:00:00+00:00 - weekly - 0.5 - - http://localhost:1313/tags/python/ - 2026-02-11T00:00:00+00:00 - weekly - 0.5 - - http://localhost:1313/about/ - weekly - 0.5 - - http://localhost:1313/categories/ - weekly - 0.5 - - http://localhost:1313/projects/ - weekly - 0.5 - - http://localhost:1313/resume/ - weekly - 0.5 - - diff --git a/public/tags/hugo/index.html b/public/tags/hugo/index.html deleted file mode 100644 index 42d2e2d..0000000 --- a/public/tags/hugo/index.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - -Hugo · Divyam Ahuja - - - - - - - - - - - - -
-
-

Hugo

- -
- -
-
-
-
- -
-
- - diff --git a/public/tags/hugo/index.xml b/public/tags/hugo/index.xml deleted file mode 100644 index ae54f3b..0000000 --- a/public/tags/hugo/index.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - Hugo on Divyam Ahuja - http://localhost:1313/tags/hugo/ - Recent content in Hugo on Divyam Ahuja - Hugo - en-us - Fri, 08 May 2026 00:00:00 +0000 - - - Hello World - http://localhost:1313/posts/hello-world/ - Fri, 08 May 2026 00:00:00 +0000 - http://localhost:1313/posts/hello-world/ - <p>Welcome to my new blog! I&rsquo;ve rebuilt my personal website from scratch using <a href="https://gohugo.io/">Hugo</a>, a fast static site generator written in Go.</p> <h2 id="why-hugo">Why Hugo?</h2> <p>I wanted something minimal, fast, and that gets out of the way. Hugo checks all the boxes:</p> <ul> <li><strong>Blazing fast builds</strong> — the entire site builds in under 100ms</li> <li><strong>Markdown-first</strong> — I write posts in plain markdown files</li> <li><strong>Zero JavaScript</strong> — the site ships pure HTML and CSS</li> <li><strong>Built-in features</strong> — syntax highlighting, RSS feeds, sitemaps, all out of the box</li> </ul> <h2 id="the-design">The Design</h2> <p>The design is inspired by the <a href="https://probberechts.github.io/hexo-theme-cactus/">Cactus Dark</a> theme — a minimalist, terminal-inspired aesthetic with monospace typography and a dark color scheme. I built the theme from scratch for full control.</p> - - - diff --git a/public/tags/index.html b/public/tags/index.html deleted file mode 100644 index cc27aa3..0000000 --- a/public/tags/index.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - -Tags · Divyam Ahuja - - - - - - - - - - - - -
-
-

Tags

- -
- -
-
-
-
- -
-
- - diff --git a/public/tags/index.xml b/public/tags/index.xml deleted file mode 100644 index cf7baf0..0000000 --- a/public/tags/index.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - Tags on Divyam Ahuja - http://localhost:1313/tags/ - Recent content in Tags on Divyam Ahuja - Hugo - en-us - Fri, 08 May 2026 00:00:00 +0000 - - - Hugo - http://localhost:1313/tags/hugo/ - Fri, 08 May 2026 00:00:00 +0000 - http://localhost:1313/tags/hugo/ - - - - Meta - http://localhost:1313/tags/meta/ - Fri, 08 May 2026 00:00:00 +0000 - http://localhost:1313/tags/meta/ - - - - Ml - http://localhost:1313/tags/ml/ - Wed, 11 Feb 2026 00:00:00 +0000 - http://localhost:1313/tags/ml/ - - - - Ocr - http://localhost:1313/tags/ocr/ - Wed, 11 Feb 2026 00:00:00 +0000 - http://localhost:1313/tags/ocr/ - - - - Python - http://localhost:1313/tags/python/ - Wed, 11 Feb 2026 00:00:00 +0000 - http://localhost:1313/tags/python/ - - - - diff --git a/public/tags/meta/index.html b/public/tags/meta/index.html deleted file mode 100644 index 2ea1fde..0000000 --- a/public/tags/meta/index.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - -Meta · Divyam Ahuja - - - - - - - - - - - - -
-
-

Meta

- -
- -
-
-
-
- -
-
- - diff --git a/public/tags/meta/index.xml b/public/tags/meta/index.xml deleted file mode 100644 index 6b5981d..0000000 --- a/public/tags/meta/index.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - Meta on Divyam Ahuja - http://localhost:1313/tags/meta/ - Recent content in Meta on Divyam Ahuja - Hugo - en-us - Fri, 08 May 2026 00:00:00 +0000 - - - Hello World - http://localhost:1313/posts/hello-world/ - Fri, 08 May 2026 00:00:00 +0000 - http://localhost:1313/posts/hello-world/ - <p>Welcome to my new blog! I&rsquo;ve rebuilt my personal website from scratch using <a href="https://gohugo.io/">Hugo</a>, a fast static site generator written in Go.</p> <h2 id="why-hugo">Why Hugo?</h2> <p>I wanted something minimal, fast, and that gets out of the way. Hugo checks all the boxes:</p> <ul> <li><strong>Blazing fast builds</strong> — the entire site builds in under 100ms</li> <li><strong>Markdown-first</strong> — I write posts in plain markdown files</li> <li><strong>Zero JavaScript</strong> — the site ships pure HTML and CSS</li> <li><strong>Built-in features</strong> — syntax highlighting, RSS feeds, sitemaps, all out of the box</li> </ul> <h2 id="the-design">The Design</h2> <p>The design is inspired by the <a href="https://probberechts.github.io/hexo-theme-cactus/">Cactus Dark</a> theme — a minimalist, terminal-inspired aesthetic with monospace typography and a dark color scheme. I built the theme from scratch for full control.</p> - - - diff --git a/public/tags/ml/index.html b/public/tags/ml/index.html deleted file mode 100644 index 12531a3..0000000 --- a/public/tags/ml/index.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - -Ml · Divyam Ahuja - - - - - - - - - - - - -
-
-

Ml

- -
- -
-
-
-
- -
-
- - diff --git a/public/tags/ml/index.xml b/public/tags/ml/index.xml deleted file mode 100644 index 0d60c3a..0000000 --- a/public/tags/ml/index.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - Ml on Divyam Ahuja - http://localhost:1313/tags/ml/ - Recent content in Ml on Divyam Ahuja - Hugo - en-us - Wed, 11 Feb 2026 00:00:00 +0000 - - - Building a PDF Translation Pipeline - http://localhost:1313/posts/pdf-translation-pipeline/ - Wed, 11 Feb 2026 00:00:00 +0000 - http://localhost:1313/posts/pdf-translation-pipeline/ - <p>Recently, I needed to translate a PDF document from Hindi to English. Sounds simple enough, right? Turns out, it&rsquo;s a surprisingly deep rabbit hole.</p> <h2 id="the-pipeline">The Pipeline</h2> <p>The approach I settled on follows this flow:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">PDF → Images → OCR → Translation → Rendered Images → PDF </span></span></code></pre></div><p>Each step has its own set of challenges:</p> <ol> <li><strong>PDF to Images</strong>: Convert each page to a high-DPI image for better OCR accuracy</li> <li><strong>OCR</strong>: Extract text with position data using PaddleOCR</li> <li><strong>Translation</strong>: Run extracted text through NLLB (No Language Left Behind)</li> <li><strong>Rendering</strong>: Paint translated text back onto the original image</li> <li><strong>Assembly</strong>: Combine rendered images back into a PDF</li> </ol> <h2 id="lessons-learned">Lessons Learned</h2> <ul> <li><strong>DPI matters a lot</strong> — bumping from 150 to 300 DPI dramatically improved OCR accuracy for Hindi text</li> <li><strong>Font rendering is hard</strong> — getting translated text to fit in the same bounding boxes required careful font size calculation</li> <li><strong>Fallback strategies</strong> — TrOCR as a fallback when PaddleOCR fails on certain text regions</li> </ul> <p>The code is messy but it works. Sometimes that&rsquo;s enough.</p> - - - diff --git a/public/tags/ocr/index.html b/public/tags/ocr/index.html deleted file mode 100644 index 58f09e9..0000000 --- a/public/tags/ocr/index.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - -Ocr · Divyam Ahuja - - - - - - - - - - - - -
-
-

Ocr

- -
- -
-
-
-
- -
-
- - diff --git a/public/tags/ocr/index.xml b/public/tags/ocr/index.xml deleted file mode 100644 index 194305b..0000000 --- a/public/tags/ocr/index.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - Ocr on Divyam Ahuja - http://localhost:1313/tags/ocr/ - Recent content in Ocr on Divyam Ahuja - Hugo - en-us - Wed, 11 Feb 2026 00:00:00 +0000 - - - Building a PDF Translation Pipeline - http://localhost:1313/posts/pdf-translation-pipeline/ - Wed, 11 Feb 2026 00:00:00 +0000 - http://localhost:1313/posts/pdf-translation-pipeline/ - <p>Recently, I needed to translate a PDF document from Hindi to English. Sounds simple enough, right? Turns out, it&rsquo;s a surprisingly deep rabbit hole.</p> <h2 id="the-pipeline">The Pipeline</h2> <p>The approach I settled on follows this flow:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">PDF → Images → OCR → Translation → Rendered Images → PDF </span></span></code></pre></div><p>Each step has its own set of challenges:</p> <ol> <li><strong>PDF to Images</strong>: Convert each page to a high-DPI image for better OCR accuracy</li> <li><strong>OCR</strong>: Extract text with position data using PaddleOCR</li> <li><strong>Translation</strong>: Run extracted text through NLLB (No Language Left Behind)</li> <li><strong>Rendering</strong>: Paint translated text back onto the original image</li> <li><strong>Assembly</strong>: Combine rendered images back into a PDF</li> </ol> <h2 id="lessons-learned">Lessons Learned</h2> <ul> <li><strong>DPI matters a lot</strong> — bumping from 150 to 300 DPI dramatically improved OCR accuracy for Hindi text</li> <li><strong>Font rendering is hard</strong> — getting translated text to fit in the same bounding boxes required careful font size calculation</li> <li><strong>Fallback strategies</strong> — TrOCR as a fallback when PaddleOCR fails on certain text regions</li> </ul> <p>The code is messy but it works. Sometimes that&rsquo;s enough.</p> - - - diff --git a/public/tags/python/index.html b/public/tags/python/index.html deleted file mode 100644 index 658f1fb..0000000 --- a/public/tags/python/index.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - -Python · Divyam Ahuja - - - - - - - - - - - - -
-
-

Python

- -
- -
-
-
-
- -
-
- - diff --git a/public/tags/python/index.xml b/public/tags/python/index.xml deleted file mode 100644 index b5b2911..0000000 --- a/public/tags/python/index.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - Python on Divyam Ahuja - http://localhost:1313/tags/python/ - Recent content in Python on Divyam Ahuja - Hugo - en-us - Wed, 11 Feb 2026 00:00:00 +0000 - - - Building a PDF Translation Pipeline - http://localhost:1313/posts/pdf-translation-pipeline/ - Wed, 11 Feb 2026 00:00:00 +0000 - http://localhost:1313/posts/pdf-translation-pipeline/ - <p>Recently, I needed to translate a PDF document from Hindi to English. Sounds simple enough, right? Turns out, it&rsquo;s a surprisingly deep rabbit hole.</p> <h2 id="the-pipeline">The Pipeline</h2> <p>The approach I settled on follows this flow:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">PDF → Images → OCR → Translation → Rendered Images → PDF </span></span></code></pre></div><p>Each step has its own set of challenges:</p> <ol> <li><strong>PDF to Images</strong>: Convert each page to a high-DPI image for better OCR accuracy</li> <li><strong>OCR</strong>: Extract text with position data using PaddleOCR</li> <li><strong>Translation</strong>: Run extracted text through NLLB (No Language Left Behind)</li> <li><strong>Rendering</strong>: Paint translated text back onto the original image</li> <li><strong>Assembly</strong>: Combine rendered images back into a PDF</li> </ol> <h2 id="lessons-learned">Lessons Learned</h2> <ul> <li><strong>DPI matters a lot</strong> — bumping from 150 to 300 DPI dramatically improved OCR accuracy for Hindi text</li> <li><strong>Font rendering is hard</strong> — getting translated text to fit in the same bounding boxes required careful font size calculation</li> <li><strong>Fallback strategies</strong> — TrOCR as a fallback when PaddleOCR fails on certain text regions</li> </ul> <p>The code is messy but it works. Sometimes that&rsquo;s enough.</p> - - -