diff --git a/.github/workflows/hugo.yml b/.github/workflows/hugo.yml
new file mode 100644
index 0000000..7c550d0
--- /dev/null
+++ b/.github/workflows/hugo.yml
@@ -0,0 +1,66 @@
+name: Deploy Hugo site to Pages
+
+on:
+ push:
+ branches:
+ - main # Set a branch to deploy
+ workflow_dispatch:
+
+# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+# Allow only one concurrent deployment
+concurrency:
+ group: "pages"
+ cancel-in-progress: false
+
+defaults:
+ run:
+ shell: bash
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ env:
+ HUGO_VERSION: 0.124.1
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ submodules: recursive
+ fetch-depth: 0
+
+ - name: Setup Hugo
+ uses: peaceiris/actions-hugo@v3
+ with:
+ hugo-version: 'latest'
+ extended: true
+
+ - name: Install Typst
+ run: |
+ curl -L -o typst.tar.xz https://github.com/typst/typst/releases/download/v0.11.1/typst-x86_64-unknown-linux-musl.tar.xz
+ tar -xf typst.tar.xz
+ sudo mv typst-x86_64-unknown-linux-musl/typst /usr/local/bin/
+ typst --version
+
+ - name: Build PDF and Hugo Site
+ run: make all
+
+ - name: Upload artifact
+ uses: actions/upload-pages-artifact@v3
+ with:
+ path: ./public
+
+ deploy:
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ runs-on: ubuntu-latest
+ needs: build
+ steps:
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v4
diff --git a/.hugo_build.lock b/.hugo_build.lock
new file mode 100644
index 0000000..e69de29
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..0a93459
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,25 @@
+.PHONY: all serve build resume clean
+
+# Build everything
+all: resume build
+
+# Start Hugo dev server
+serve:
+ hugo server -D
+
+# Build static site
+build:
+ hugo --gc --minify
+
+# Compile resume PDF from YAML via Typst
+resume:
+ typst compile --root . --font-path resume/ resume/main.typ static/resume.pdf
+
+# Watch resume for changes
+resume-watch:
+ typst watch --root . --font-path resume/ resume/main.typ static/resume.pdf
+
+# Clean build artifacts
+clean:
+ rm -rf public/
+ rm -f static/resume.pdf
diff --git a/assets/css/style.css b/assets/css/style.css
new file mode 100644
index 0000000..4e9a84b
--- /dev/null
+++ b/assets/css/style.css
@@ -0,0 +1,903 @@
+/* ============================================
+ divyam.dev — Design System
+ Cactus Dark inspired · Monospace terminal aesthetic
+ ============================================ */
+
+/* --- Google Fonts Import --- */
+@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,300;0,400;0,500;0,700;1,400&display=swap');
+
+/* --- CSS Custom Properties --- */
+: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;
+}
+
+/* --- Reset & Base --- */
+*, *::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);
+}
+
+/* --- Layout --- */
+.site-wrapper {
+ width: 100%;
+ max-width: var(--max-width);
+ margin: 0 auto;
+ padding: 0 var(--content-pad);
+ flex: 1;
+}
+
+main {
+ padding: 2rem 0 4rem;
+}
+
+/* --- Links --- */
+a {
+ color: var(--accent);
+ text-decoration: none;
+ transition: color var(--transition), border-color var(--transition);
+}
+
+a:hover {
+ color: var(--fg-bright);
+}
+
+/* --- Typography --- */
+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: 0.5rem; }
+h2 { font-size: 1.4rem; margin: 2.5rem 0 1rem; }
+h3 { font-size: 1.15rem; margin: 2rem 0 0.75rem; }
+h4 { font-size: 1rem; margin: 1.5rem 0 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: 0.3rem;
+}
+
+img {
+ max-width: 100%;
+ height: auto;
+ border-radius: 4px;
+}
+
+/* --- Header --- */
+.site-header {
+ padding: 2.5rem 0 1rem;
+}
+
+.site-header-inner {
+ display: flex;
+ align-items: baseline;
+ justify-content: space-between;
+ flex-wrap: wrap;
+ gap: 0.75rem;
+}
+
+.site-title {
+ font-size: 1.4rem;
+ font-weight: 700;
+ color: var(--fg-bright);
+ text-decoration: none;
+ letter-spacing: -0.02em;
+}
+
+.site-title:hover {
+ color: var(--accent);
+}
+
+.site-nav {
+ display: flex;
+ align-items: center;
+ gap: 0;
+}
+
+.site-nav a {
+ color: var(--accent);
+ font-size: 0.9rem;
+ padding: 0.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 0.6rem;
+ user-select: none;
+ font-size: 0.85rem;
+}
+
+/* --- Homepage --- */
+.home-bio {
+ margin: 1rem 0 1.5rem;
+ font-size: 0.95rem;
+ color: var(--fg);
+ max-width: 600px;
+}
+
+.home-bio p {
+ margin-bottom: 1rem;
+}
+
+.social-line {
+ color: var(--fg-dim);
+ font-size: 0.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 Headings --- */
+.section-heading {
+ font-size: 1.2rem;
+ color: var(--accent);
+ font-weight: 700;
+ margin: 3rem 0 1.5rem;
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+}
+
+.section-heading::after {
+ content: '';
+ flex: 1;
+ height: 1px;
+ background: var(--border);
+}
+
+/* --- Post List --- */
+.post-list {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.post-list-item {
+ display: flex;
+ align-items: baseline;
+ gap: 1.5rem;
+ padding: 0.4rem 0;
+ margin: 0;
+ transition: background-color var(--transition);
+}
+
+.post-list-item:hover {
+ background-color: var(--accent-glow);
+ margin: 0 -0.5rem;
+ padding: 0.4rem 0.5rem;
+ border-radius: 3px;
+}
+
+.post-date {
+ color: var(--fg-dim);
+ font-size: 0.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 group */
+.year-heading {
+ font-size: 1.1rem;
+ font-weight: 700;
+ color: var(--fg-bright);
+ margin: 2rem 0 0.75rem;
+ padding-bottom: 0.25rem;
+}
+
+.year-heading:first-child {
+ margin-top: 0;
+}
+
+/* --- Project List --- */
+.project-list {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.project-item {
+ padding: 0.4rem 0;
+ font-size: 0.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: ': ';
+}
+
+/* --- Footer --- */
+.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: 0.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;
+}
+
+/* --- Single Post --- */
+.post-header {
+ margin-bottom: 2.5rem;
+}
+
+.post-header h1 {
+ color: var(--accent);
+ font-size: 1.6rem;
+ margin-bottom: 0.5rem;
+}
+
+.post-meta {
+ color: var(--fg-dim);
+ font-size: 0.85rem;
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 0.5rem;
+}
+
+.post-meta .separator {
+ color: var(--border);
+}
+
+.post-tags {
+ display: inline-flex;
+ gap: 0.4rem;
+}
+
+.post-tag {
+ color: var(--accent-dim);
+ font-size: 0.8rem;
+}
+
+.post-tag:hover {
+ color: var(--accent);
+}
+
+/* Blog body content */
+.post-content {
+ font-size: 0.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 --- */
+code {
+ font-family: var(--font-mono);
+ font-size: 0.88em;
+ background: var(--bg-alt);
+ padding: 0.15em 0.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: none;
+ padding: 0;
+ font-size: 0.85rem;
+ color: var(--fg);
+}
+
+/* --- Code Syntax Highlighting (Chroma) --- */
+.highlight {
+ position: relative;
+ margin: 1.5rem 0;
+}
+
+.highlight pre {
+ margin: 0;
+}
+
+/* --- Tables --- */
+table {
+ width: 100%;
+ border-collapse: collapse;
+ margin: 1.5rem 0;
+ font-size: 0.9rem;
+}
+
+th, td {
+ padding: 0.6rem 0.8rem;
+ text-align: left;
+ border-bottom: 1px solid var(--border);
+}
+
+th {
+ color: var(--fg-bright);
+ font-weight: 700;
+}
+
+/* --- Back Link --- */
+.back-link {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.3rem;
+ color: var(--fg-dim);
+ font-size: 0.85rem;
+ margin-bottom: 2rem;
+ transition: color var(--transition);
+}
+
+.back-link:hover {
+ color: var(--accent);
+}
+
+/* --- About Page --- */
+.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: 0.25rem;
+}
+
+.about-tagline {
+ color: var(--fg-dim);
+ font-size: 0.95rem;
+ margin-bottom: 1rem;
+}
+
+/* --- Archive Page (Writing) --- */
+.archive-year {
+ margin-bottom: 2.5rem;
+}
+
+/* --- Page Title --- */
+.page-title {
+ color: var(--accent);
+ margin-bottom: 1.5rem;
+}
+
+/* --- Responsive --- */
+@media (max-width: 600px) {
+ :root {
+ --font-size: 14px;
+ --content-pad: 1.2rem;
+ }
+
+ .site-header-inner {
+ flex-direction: column;
+ gap: 0.5rem;
+ }
+
+ .post-list-item {
+ flex-direction: column;
+ gap: 0.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 Page --- */
+.projects-intro {
+ color: var(--fg-dim);
+ margin-bottom: 2rem;
+ font-size: 0.95rem;
+}
+
+.projects-grid {
+ display: flex;
+ flex-direction: column;
+ gap: 0.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 0.3rem;
+}
+
+.project-card-desc {
+ font-size: 0.85rem;
+ color: var(--fg-dim);
+ margin: 0;
+ line-height: 1.5;
+}
+
+.project-card-tags {
+ display: flex;
+ gap: 0.5rem;
+ margin-top: 0.6rem;
+ flex-wrap: wrap;
+}
+
+.project-card-tag {
+ font-size: 0.72rem;
+ color: var(--fg-dim);
+ background: var(--bg);
+ padding: 0.15rem 0.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 --- */
+.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: 0.25rem;
+}
+
+.resume-tagline {
+ color: var(--fg-dim);
+ font-size: 0.95rem;
+ margin-bottom: 1rem;
+}
+
+.resume-contact {
+ display: flex;
+ gap: 0.5rem;
+ flex-wrap: wrap;
+ font-size: 0.85rem;
+}
+
+.resume-contact a {
+ color: var(--accent);
+ padding: 0.2rem 0.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: 0.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: 0.4rem;
+ border-bottom: 1px solid var(--border);
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+}
+
+.resume-entry {
+ margin-bottom: 1.5rem;
+}
+
+.resume-entry-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-start;
+ flex-wrap: wrap;
+ gap: 0.5rem;
+ margin-bottom: 0.5rem;
+}
+
+.resume-entry-title {
+ font-size: 1rem;
+ color: var(--fg-bright);
+ margin: 0;
+}
+
+.resume-entry-org {
+ font-size: 0.9rem;
+ color: var(--fg-dim);
+}
+
+.resume-entry-date {
+ font-size: 0.8rem;
+ color: var(--fg-dim);
+ white-space: nowrap;
+}
+
+.resume-entry-details {
+ padding-left: 1.2rem;
+ font-size: 0.9rem;
+ color: var(--fg);
+ margin: 0;
+}
+
+.resume-entry-details li {
+ margin-bottom: 0.25rem;
+}
+
+.resume-skills {
+ display: flex;
+ flex-direction: column;
+ gap: 0.6rem;
+}
+
+.resume-skill-group {
+ display: flex;
+ align-items: baseline;
+ gap: 1rem;
+ font-size: 0.9rem;
+}
+
+.resume-skill-label {
+ color: var(--fg-bright);
+ font-size: 0.85rem;
+ min-width: 6rem;
+ flex-shrink: 0;
+ margin: 0;
+}
+
+.resume-skill-items {
+ color: var(--fg);
+}
+
+.resume-tech-stack {
+ font-size: 0.8rem;
+ color: var(--fg-dim);
+ margin-bottom: 0.5rem;
+ font-style: italic;
+}
+
+.resume-entry-links {
+ display: flex;
+ gap: 1rem;
+ margin-top: 0.4rem;
+ font-size: 0.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: 0.4rem;
+ color: var(--accent);
+ font-size: 0.9rem;
+ padding: 0.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);
+}
+
+/* --- Responsive (Projects & Resume) --- */
+@media (max-width: 600px) {
+ .project-card {
+ padding: 1rem;
+ }
+
+ .resume-entry-header {
+ flex-direction: column;
+ }
+
+ .resume-skill-group {
+ flex-direction: column;
+ gap: 0.2rem;
+ }
+
+ .resume-skill-label {
+ min-width: auto;
+ }
+}
+
+/* --- Scrollbar --- */
+::-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);
+}
+
+/* --- Animations --- */
+@keyframes fadeIn {
+ from { opacity: 0; transform: translateY(8px); }
+ to { opacity: 1; transform: translateY(0); }
+}
+
+main {
+ animation: fadeIn 0.4s ease-out;
+}
diff --git a/content/about.md b/content/about.md
new file mode 100644
index 0000000..255fe3d
--- /dev/null
+++ b/content/about.md
@@ -0,0 +1,12 @@
+---
+title: "About"
+description: "About Divyam Ahuja"
+---
+
+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](https://github.com/ryoutsu). Feel free to reach out by [email](mailto:hello@divyam.dev) if you want to talk about something I'm doing.
diff --git a/content/posts/_index.md b/content/posts/_index.md
new file mode 100644
index 0000000..e687ee4
--- /dev/null
+++ b/content/posts/_index.md
@@ -0,0 +1,3 @@
+---
+title: "Writing"
+---
diff --git a/content/posts/hello-world.md b/content/posts/hello-world.md
new file mode 100644
index 0000000..1d5fc2a
--- /dev/null
+++ b/content/posts/hello-world.md
@@ -0,0 +1,53 @@
+---
+title: "Hello World"
+date: 2026-05-08
+description: "First post on my new blog, built with Hugo."
+tags: ["meta", "hugo"]
+---
+
+Welcome to my new blog! I've rebuilt my personal website from scratch using [Hugo](https://gohugo.io/), 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](https://probberechts.github.io/hexo-theme-cactus/) 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:
+
+```python
+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:
+
+```javascript
+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.
diff --git a/content/posts/pdf-translation-pipeline.md b/content/posts/pdf-translation-pipeline.md
new file mode 100644
index 0000000..ea1697e
--- /dev/null
+++ b/content/posts/pdf-translation-pipeline.md
@@ -0,0 +1,32 @@
+---
+title: "Building a PDF Translation Pipeline"
+date: 2026-02-11
+description: "How I built a pipeline to translate Hindi PDFs to English using OCR and neural machine translation."
+tags: ["python", "ocr", "ml"]
+---
+
+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. **OCR**: Extract text with position data using PaddleOCR
+3. **Translation**: Run extracted text through NLLB (No Language Left Behind)
+4. **Rendering**: Paint translated text back onto the original image
+5. **Assembly**: Combine rendered images back into a PDF
+
+## 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.
diff --git a/content/projects.md b/content/projects.md
new file mode 100644
index 0000000..78f06e8
--- /dev/null
+++ b/content/projects.md
@@ -0,0 +1,5 @@
+---
+title: "Projects"
+description: "Things I've built"
+layout: "projects"
+---
diff --git a/content/resume.md b/content/resume.md
new file mode 100644
index 0000000..0c38654
--- /dev/null
+++ b/content/resume.md
@@ -0,0 +1,5 @@
+---
+title: "Resume"
+description: "Divyam Ahuja — Resume"
+layout: "resume"
+---
diff --git a/data/resume.yaml b/data/resume.yaml
new file mode 100644
index 0000000..7fc3c9a
--- /dev/null
+++ b/data/resume.yaml
@@ -0,0 +1,155 @@
+name: Divyam Ahuja
+role: Software Engineer
+
+contact:
+ phone:
+ display: "+91 7015600547"
+ url: "tel:+917015600547"
+ email:
+ display: "ahujadivyam@gmail.com"
+ url: "mailto:ahujadivyam@gmail.com"
+ website:
+ display: "divyam.dev"
+ url: "https://divyam.dev"
+ linkedin:
+ display: "in/ahujadivyam"
+ url: "https://linkedin.com/in/ahujadivyam"
+ git:
+ display: "git.divyam.dev"
+ url: "https://git.divyam.dev/"
+ github:
+ display: "gh/ahujadivyam"
+ url: "https://github.com/ahujadivyam"
+
+experience:
+ - company: Microsoft
+ role: Software Engineer
+ location: Noida
+ start: Mar 2025
+ end: Present
+ stack:
+ - Python
+ - JavaScript
+ - TypeScript
+ - Playwright
+ - Telemetry
+ bullets:
+ - "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."
+
+ - company: Advanced Micro Devices (AMD)
+ role: System Software Designer
+ location: Bangalore
+ start: Aug 2022
+ end: Feb 2025
+ stack:
+ - C
+ - C++
+ - Java
+ - Python
+ - React.js
+ - JavaScript
+ bullets:
+ - "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."
+
+ - company: Chromium
+ role: Google Summer of Code Contributor (Open Source Developer)
+ location: Remote
+ start: May 2022
+ end: Aug 2022
+ stack:
+ - JavaScript
+ - TypeScript
+ - C
+ - C++
+ - WebAudio
+ - WebAssembly
+ - WebWorkers
+ bullets:
+ - "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."
+ links:
+ - display: "github.com/ahujadivyam/gsoc-chromium-freequeue"
+ url: "https://github.com/ahujadivyam/gsoc-chromium-freequeue"
+
+skills:
+ - type: Programming Languages
+ items:
+ - C/C++
+ - Python
+ - JavaScript/TypeScript
+ - Java
+ - Go (Golang)
+ - Bash
+ - PHP
+ - type: Frameworks
+ items:
+ - React.js
+ - Next.js
+ - Express.js
+ - Django
+ - Flask
+ - Node.js
+ - type: Tools/Platforms
+ items:
+ - Git
+ - Docker
+ - Emscripten
+ - UNIX
+ - Linux
+ - POSIX
+ - Shell
+ - Kubernetes
+ - WebAssembly
+ - WordPress
+ - type: Databases
+ items:
+ - MySQL
+ - MongoDB
+ - PostgreSQL
+ - Redis
+
+projects:
+ - name: "fastbin: a code sharing webapp"
+ stack:
+ - HTMX
+ - Go (Golang)
+ - gRPC
+ - PostgreSQL
+ - Docker
+ - Kubernetes
+ links:
+ - display: "git.divyam.dev/divyam/fastbin"
+ url: "https://git.divyam.dev/divyam/fastbin"
+ - display: "fastbin.lab.divyam.dev"
+ url: "https://fastbin.lab.divyam.dev"
+
+ - name: Homelab
+ stack:
+ - Raspberry Pi 5
+ - WireGuard
+ - Kubernetes
+ - Rancher
+ - MetalLB
+
+education:
+ - school: Deenbandhu Chhotu Ram University of Science and Technology
+ location: Haryana, India
+ course: "Bachelor of Technology (B.Tech.) Computer Science"
+ start: Aug 2018
+ end: Aug 2022
+
+certifications:
+ - name: "MITx 6.86x: Machine Learning with Python-From Linear Models to Deep Learning"
+ url: "https://courses.edx.org/certificates/52e99c3c32d8470b9761c8327c4417ca"
+ - name: "CS50AI: CS50's Introduction to Artificial Intelligence with Python"
+ url: "https://courses.edx.org/certificates/686aaef0b47e438ba5ebd040e0f0b5fd"
diff --git a/hugo.toml b/hugo.toml
new file mode 100644
index 0000000..2d94093
--- /dev/null
+++ b/hugo.toml
@@ -0,0 +1,93 @@
+baseURL = "https://divyam.dev/"
+locale = "en-us"
+title = "Divyam Ahuja"
+
+# Use Hugo's built-in asset pipeline
+[markup]
+ [markup.highlight]
+ style = "monokai"
+ lineNos = false
+ codeFences = true
+ guessSyntax = true
+ noClasses = false
+ [markup.goldmark]
+ [markup.goldmark.renderer]
+ unsafe = true
+
+[params]
+ description = "Software Engineer"
+ author = "Divyam Ahuja"
+ bio = "Software Engineer at Microsoft, working on the Excel Copilot team. I enjoy building side projects, tinkering with infrastructure, and deep-diving into performance optimization."
+ avatar = "/avatar.png"
+ email = "ahujadivyam@gmail.com"
+
+ # Social links
+ [[params.social]]
+ name = "GitHub"
+ icon = "github"
+ url = "https://github.com/ahujadivyam"
+
+ [[params.social]]
+ name = "LinkedIn"
+ icon = "linkedin"
+ url = "https://linkedin.com/in/ahujadivyam"
+
+ [[params.social]]
+ name = "Git"
+ icon = "git"
+ url = "https://git.divyam.dev"
+
+ [[params.social]]
+ name = "Email"
+ icon = "mail"
+ url = "mailto:ahujadivyam@gmail.com"
+
+ # Projects
+ [[params.projects]]
+ name = "fastbin"
+ url = "https://git.divyam.dev/divyam/fastbin"
+ description = "A high-performance code sharing webapp with real-time updates"
+ tags = ["Go", "HTMX", "gRPC", "PostgreSQL", "Docker", "Kubernetes"]
+
+ [[params.projects]]
+ name = "gsoc-chromium-freequeue"
+ url = "https://github.com/ahujadivyam/gsoc-chromium-freequeue"
+ description = "Lock-free ring buffer library built during Google Summer of Code for Chromium's audio processing"
+ tags = ["C++", "WebAudio", "WebAssembly", "WebWorkers"]
+
+ [[params.projects]]
+ name = "Homelab"
+ url = "#"
+ description = "Self-hosted high-availability infrastructure on Raspberry Pi 5"
+ tags = ["Kubernetes", "WireGuard", "Rancher", "MetalLB"]
+
+ [[params.projects]]
+ name = "divyam.dev"
+ url = "https://git.divyam.dev/divyam/divyam.dev"
+ description = "This minimal, high-performance portfolio and blog"
+ tags = ["Hugo", "CSS"]
+
+[menus]
+ [[menus.main]]
+ name = "Home"
+ url = "/"
+ weight = 1
+ [[menus.main]]
+ name = "Blog"
+ url = "/posts/"
+ weight = 2
+ [[menus.main]]
+ name = "Projects"
+ url = "/projects/"
+ weight = 3
+ [[menus.main]]
+ name = "Resume"
+ url = "/resume/"
+ weight = 4
+
+[outputs]
+ home = ["HTML", "RSS"]
+
+[sitemap]
+ changeFreq = "weekly"
+ priority = 0.5
diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html
new file mode 100644
index 0000000..a06230f
--- /dev/null
+++ b/layouts/_default/baseof.html
@@ -0,0 +1,15 @@
+
+
+
+ {{- partial "head.html" . -}}
+
+
+
+ {{- partial "header.html" . -}}
+
+ {{- block "main" . }}{{ end -}}
+
+
+ {{- partial "footer.html" . -}}
+
+
diff --git a/layouts/_default/list.html b/layouts/_default/list.html
new file mode 100644
index 0000000..1cb2c24
--- /dev/null
+++ b/layouts/_default/list.html
@@ -0,0 +1,29 @@
+{{ define "main" }}
+{{ .Title }}
+
+{{- if eq .Section "posts" }}
+ {{/* Blog archive listing */}}
+ {{- $posts := .Pages -}}
+ {{- $byYear := $posts.GroupByDate "2006" -}}
+ {{- range $byYear }}
+
+
{{ .Key }}
+
+ {{- range .Pages }}
+
+
+ {{ .Date.Format "02 Jan" }}
+
+ {{ .Title }}
+
+ {{- end }}
+
+
+ {{- end }}
+{{- else }}
+ {{/* Generic page content */}}
+
+ {{ .Content }}
+
+{{- end }}
+{{ end }}
diff --git a/layouts/_default/projects.html b/layouts/_default/projects.html
new file mode 100644
index 0000000..6672b2a
--- /dev/null
+++ b/layouts/_default/projects.html
@@ -0,0 +1,39 @@
+{{ define "main" }}
+Projects
+Things I've built or contributed to.
+
+
+{{ end }}
diff --git a/layouts/_default/resume.html b/layouts/_default/resume.html
new file mode 100644
index 0000000..2c6732c
--- /dev/null
+++ b/layouts/_default/resume.html
@@ -0,0 +1,129 @@
+{{ define "main" }}
+{{- $r := hugo.Data.resume -}}
+
+
+
+
+ Experience
+ {{- range $r.experience }}
+
+
+ {{- with .stack }}
+
{{ delimit . ", " }}
+ {{- end }}
+ {{- with .bullets }}
+
+ {{- range . }}
+ {{ . | markdownify }}
+ {{- end }}
+
+ {{- end }}
+ {{- with .links }}
+
+ {{- range . }}
+
{{ .display }}
+ {{- end }}
+
+ {{- end }}
+
+ {{- end }}
+
+
+
+ Skills
+
+ {{- range $r.skills }}
+
+
{{ .type }}
+ {{ delimit .items ", " }}
+
+ {{- end }}
+
+
+
+
+ Projects
+ {{- range $r.projects }}
+
+
+ {{- with .stack }}
+
{{ delimit . ", " }}
+ {{- end }}
+ {{- with .links }}
+
+ {{- range . }}
+
{{ .display }}
+ {{- end }}
+
+ {{- end }}
+
+ {{- end }}
+
+
+
+ Education
+ {{- range $r.education }}
+
+
+
+ {{- end }}
+
+
+
+
+{{ end }}
diff --git a/layouts/_default/single.html b/layouts/_default/single.html
new file mode 100644
index 0000000..219af7a
--- /dev/null
+++ b/layouts/_default/single.html
@@ -0,0 +1,25 @@
+{{ define "main" }}
+
+
+
+ {{ .Content }}
+
+
+ ← back to home
+
+{{ end }}
diff --git a/layouts/index.html b/layouts/index.html
new file mode 100644
index 0000000..52b3f54
--- /dev/null
+++ b/layouts/index.html
@@ -0,0 +1,64 @@
+{{ define "main" }}
+
+ {{ .Site.Params.bio }}
+
+ Find me on
+ {{- range $i, $s := .Site.Params.social -}}
+ {{- if $i }},{{ end }}
+ {{ $s.name }}
+ {{- end -}}.
+
+
+
+{{- $posts := where .Site.RegularPages "Section" "posts" -}}
+{{- if $posts }}
+
+ Blog
+ {{- $byYear := $posts.GroupByDate "2006" -}}
+ {{- range $byYear }}
+
+
{{ .Key }}
+
+ {{- range .Pages }}
+
+
+ {{ .Date.Format "02 Jan" }}
+
+ {{ .Title }}
+
+ {{- end }}
+
+
+ {{- end }}
+
+{{- end }}
+
+{{- if .Site.Params.projects }}
+
+{{- end }}
+{{ end }}
diff --git a/layouts/partials/footer.html b/layouts/partials/footer.html
new file mode 100644
index 0000000..2a39ca1
--- /dev/null
+++ b/layouts/partials/footer.html
@@ -0,0 +1,29 @@
+
diff --git a/layouts/partials/head.html b/layouts/partials/head.html
new file mode 100644
index 0000000..2606433
--- /dev/null
+++ b/layouts/partials/head.html
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{{ if .IsHome }}{{ .Site.Title }}{{ else }}{{ .Title }} · {{ .Site.Title }}{{ end }}
+
+
+
+
+
+{{ $style := resources.Get "css/style.css" | minify | fingerprint }}
+
+
+
+{{ range .AlternativeOutputFormats -}}
+ {{ printf ` ` .Rel .MediaType.Type .Permalink $.Site.Title | safeHTML }}
+{{ end -}}
diff --git a/layouts/partials/header.html b/layouts/partials/header.html
new file mode 100644
index 0000000..68f93dc
--- /dev/null
+++ b/layouts/partials/header.html
@@ -0,0 +1,12 @@
+
diff --git a/public/about/index.html b/public/about/index.html
new file mode 100644
index 0000000..fb115d1
--- /dev/null
+++ b/public/about/index.html
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+About · Divyam Ahuja
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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
new file mode 100644
index 0000000..53f87b8
--- /dev/null
+++ b/public/avatar.png
@@ -0,0 +1,4 @@
+
+
+ DA
+
diff --git a/public/categories/index.html b/public/categories/index.html
new file mode 100644
index 0000000..4d78722
--- /dev/null
+++ b/public/categories/index.html
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Categories · Divyam Ahuja
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Categories
+
+
+
+
+
+
+
+
diff --git a/public/categories/index.xml b/public/categories/index.xml
new file mode 100644
index 0000000..351c148
--- /dev/null
+++ b/public/categories/index.xml
@@ -0,0 +1,11 @@
+
+
+
+ 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.1bf64ca36e792ef061bd67d08d079d1c791150289a78f04c2b8616cfd642d09a.css b/public/css/style.min.1bf64ca36e792ef061bd67d08d079d1c791150289a78f04c2b8616cfd642d09a.css
new file mode 100644
index 0000000..79793b6
--- /dev/null
+++ b/public/css/style.min.1bf64ca36e792ef061bd67d08d079d1c791150289a78f04c2b8616cfd642d09a.css
@@ -0,0 +1 @@
+@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
new file mode 100644
index 0000000..8dc9b87
--- /dev/null
+++ b/public/css/style.min.1dc3dc626886b3a2e4d0a0dc0659f1e03680e83a6330f590cd07641da37cac23.css
@@ -0,0 +1 @@
+@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
new file mode 100644
index 0000000..cfb14d6
--- /dev/null
+++ b/public/css/style.min.53f4145bed15e8b9aa091635affc6742b2f43980dd1a56321f57b369028d237b.css
@@ -0,0 +1 @@
+@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
new file mode 100644
index 0000000..b19ade0
--- /dev/null
+++ b/public/css/style.min.86de29e37fd55fb8581ee5569d0e766097f2718b8f8029e4e11c87973d24a5b1.css
@@ -0,0 +1 @@
+@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/favicon.svg b/public/favicon.svg
new file mode 100644
index 0000000..f4a2f4f
--- /dev/null
+++ b/public/favicon.svg
@@ -0,0 +1,4 @@
+
+
+ D
+
diff --git a/public/index.html b/public/index.html
new file mode 100644
index 0000000..f1d2487
--- /dev/null
+++ b/public/index.html
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+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.
+
+ Find me on
+ GitHub ,
+ LinkedIn ,
+ Git ,
+ Email .
+
+
+
+
+
+
+
+
diff --git a/public/index.xml b/public/index.xml
new file mode 100644
index 0000000..982b429
--- /dev/null
+++ b/public/index.xml
@@ -0,0 +1,47 @@
+
+
+
+ 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’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’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’s enough.</p>
+
+ -
+
About
+ http://localhost:1313/about/
+ Mon, 01 Jan 0001 00:00:00 +0000
+ http://localhost:1313/about/
+ <p>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.</p>
<p>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.</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
new file mode 100644
index 0000000..96e6caf
--- /dev/null
+++ b/public/posts/hello-world/index.html
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Hello World · Divyam Ahuja
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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
new file mode 100644
index 0000000..2bd6d05
--- /dev/null
+++ b/public/posts/index.html
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Writing · Divyam Ahuja
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/posts/index.xml b/public/posts/index.xml
new file mode 100644
index 0000000..f43ef1f
--- /dev/null
+++ b/public/posts/index.xml
@@ -0,0 +1,26 @@
+
+
+
+ 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’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’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’s enough.</p>
+
+
+
diff --git a/public/posts/pdf-translation-pipeline/index.html b/public/posts/pdf-translation-pipeline/index.html
new file mode 100644
index 0000000..c7c804d
--- /dev/null
+++ b/public/posts/pdf-translation-pipeline/index.html
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Building a PDF Translation Pipeline · Divyam Ahuja
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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:
+
+PDF to Images : Convert each page to a high-DPI image for better OCR accuracy
+OCR : Extract text with position data using PaddleOCR
+Translation : Run extracted text through NLLB (No Language Left Behind)
+Rendering : Paint translated text back onto the original image
+Assembly : Combine rendered images back into a PDF
+
+
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
new file mode 100644
index 0000000..b1d4a6a
--- /dev/null
+++ b/public/projects/index.html
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Projects · Divyam Ahuja
+
+
+
+
+
+
+
+
+
+
+
+
+
+Projects
+Things I've built or contributed to.
+
+
+
+
+
+
diff --git a/public/resume.pdf b/public/resume.pdf
new file mode 100644
index 0000000..a66eff4
--- /dev/null
+++ b/public/resume.pdf
@@ -0,0 +1,2506 @@
+%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
+xXpu_~zز-zXSK_m%v^?l$*i2xhfZ($C$t6MCY
+ah!qش`sdtL_:ss B@+Oǁ\̼A{