feat: complete unified hugo and typst resume workflow with github actions
66
.github/workflows/hugo.yml
vendored
Normal file
|
|
@ -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
|
||||||
0
.hugo_build.lock
Normal file
25
Makefile
Normal file
|
|
@ -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
|
||||||
903
assets/css/style.css
Normal file
|
|
@ -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;
|
||||||
|
}
|
||||||
12
content/about.md
Normal file
|
|
@ -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.
|
||||||
3
content/posts/_index.md
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
---
|
||||||
|
title: "Writing"
|
||||||
|
---
|
||||||
53
content/posts/hello-world.md
Normal file
|
|
@ -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.
|
||||||
32
content/posts/pdf-translation-pipeline.md
Normal file
|
|
@ -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.
|
||||||
5
content/projects.md
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: "Projects"
|
||||||
|
description: "Things I've built"
|
||||||
|
layout: "projects"
|
||||||
|
---
|
||||||
5
content/resume.md
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: "Resume"
|
||||||
|
description: "Divyam Ahuja — Resume"
|
||||||
|
layout: "resume"
|
||||||
|
---
|
||||||
155
data/resume.yaml
Normal file
|
|
@ -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"
|
||||||
93
hugo.toml
Normal file
|
|
@ -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
|
||||||
15
layouts/_default/baseof.html
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="{{ .Site.Language.Locale | default "en" }}">
|
||||||
|
<head>
|
||||||
|
{{- partial "head.html" . -}}
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="site-wrapper">
|
||||||
|
{{- partial "header.html" . -}}
|
||||||
|
<main>
|
||||||
|
{{- block "main" . }}{{ end -}}
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
{{- partial "footer.html" . -}}
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
29
layouts/_default/list.html
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
{{ define "main" }}
|
||||||
|
<h1 class="page-title">{{ .Title }}</h1>
|
||||||
|
|
||||||
|
{{- if eq .Section "posts" }}
|
||||||
|
{{/* Blog archive listing */}}
|
||||||
|
{{- $posts := .Pages -}}
|
||||||
|
{{- $byYear := $posts.GroupByDate "2006" -}}
|
||||||
|
{{- range $byYear }}
|
||||||
|
<div class="archive-year">
|
||||||
|
<h3 class="year-heading">{{ .Key }}</h3>
|
||||||
|
<ul class="post-list">
|
||||||
|
{{- range .Pages }}
|
||||||
|
<li class="post-list-item">
|
||||||
|
<time class="post-date" datetime="{{ .Date.Format "2006-01-02" }}">
|
||||||
|
{{ .Date.Format "02 Jan" }}
|
||||||
|
</time>
|
||||||
|
<a href="{{ .Permalink }}" class="post-title-link">{{ .Title }}</a>
|
||||||
|
</li>
|
||||||
|
{{- end }}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
{{- end }}
|
||||||
|
{{- else }}
|
||||||
|
{{/* Generic page content */}}
|
||||||
|
<div class="post-content">
|
||||||
|
{{ .Content }}
|
||||||
|
</div>
|
||||||
|
{{- end }}
|
||||||
|
{{ end }}
|
||||||
39
layouts/_default/projects.html
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
{{ define "main" }}
|
||||||
|
<h1 class="page-title">Projects</h1>
|
||||||
|
<p class="projects-intro">Things I've built or contributed to.</p>
|
||||||
|
|
||||||
|
<div class="projects-grid">
|
||||||
|
{{- range .Site.Params.projects }}
|
||||||
|
{{- if eq .url "#" }}
|
||||||
|
<div class="project-card">
|
||||||
|
<div class="project-card-inner">
|
||||||
|
<h3 class="project-card-name">{{ .name }}</h3>
|
||||||
|
<p class="project-card-desc">{{ .description }}</p>
|
||||||
|
{{- with .tags }}
|
||||||
|
<div class="project-card-tags">
|
||||||
|
{{- range . }}
|
||||||
|
<span class="project-card-tag">{{ . }}</span>
|
||||||
|
{{- end }}
|
||||||
|
</div>
|
||||||
|
{{- end }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{- else }}
|
||||||
|
<a href="{{ .url }}" class="project-card" target="_blank" rel="noopener noreferrer">
|
||||||
|
<div class="project-card-inner">
|
||||||
|
<h3 class="project-card-name">{{ .name }}</h3>
|
||||||
|
<p class="project-card-desc">{{ .description }}</p>
|
||||||
|
{{- with .tags }}
|
||||||
|
<div class="project-card-tags">
|
||||||
|
{{- range . }}
|
||||||
|
<span class="project-card-tag">{{ . }}</span>
|
||||||
|
{{- end }}
|
||||||
|
</div>
|
||||||
|
{{- end }}
|
||||||
|
</div>
|
||||||
|
<span class="project-card-arrow">→</span>
|
||||||
|
</a>
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
129
layouts/_default/resume.html
Normal file
|
|
@ -0,0 +1,129 @@
|
||||||
|
{{ define "main" }}
|
||||||
|
{{- $r := hugo.Data.resume -}}
|
||||||
|
<div class="resume-page">
|
||||||
|
<div class="resume-header">
|
||||||
|
<h1 class="resume-name">{{ $r.name }}</h1>
|
||||||
|
<p class="resume-tagline">{{ $r.role }}</p>
|
||||||
|
<div class="resume-contact">
|
||||||
|
{{- with $r.contact.email }}
|
||||||
|
<a href="{{ .url }}">
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M1.5 8.67v8.58a3 3 0 003 3h15a3 3 0 003-3V8.67l-8.928 5.493a3 3 0 01-3.144 0L1.5 8.67z"/><path d="M22.5 6.908V6.75a3 3 0 00-3-3h-15a3 3 0 00-3 3v.158l9.714 5.978a1.5 1.5 0 001.572 0L22.5 6.908z"/></svg>
|
||||||
|
{{ .display }}
|
||||||
|
</a>
|
||||||
|
{{- end }}
|
||||||
|
{{- with $r.contact.website }}
|
||||||
|
<a href="{{ .url }}" target="_blank">
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z"/></svg>
|
||||||
|
{{ .display }}
|
||||||
|
</a>
|
||||||
|
{{- end }}
|
||||||
|
{{- with $r.contact.linkedin }}
|
||||||
|
<a href="{{ .url }}" target="_blank">
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg>
|
||||||
|
{{ .display }}
|
||||||
|
</a>
|
||||||
|
{{- end }}
|
||||||
|
</div>
|
||||||
|
<div class="resume-contact">
|
||||||
|
{{- with $r.contact.git }}
|
||||||
|
<a href="{{ .url }}" target="_blank">
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M6 2a4 4 0 0 0-1 7.874V14.126A4.002 4.002 0 0 0 6 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 6 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm12-12a4 4 0 0 0-1 7.874v2.252A4.002 4.002 0 0 0 18 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 18 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4z"/></svg>
|
||||||
|
{{ .display }}
|
||||||
|
</a>
|
||||||
|
{{- end }}
|
||||||
|
{{- with $r.contact.github }}
|
||||||
|
<a href="{{ .url }}" target="_blank">
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0112 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z"/></svg>
|
||||||
|
{{ .display }}
|
||||||
|
</a>
|
||||||
|
{{- end }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<section class="resume-section">
|
||||||
|
<h2 class="resume-section-title">Experience</h2>
|
||||||
|
{{- range $r.experience }}
|
||||||
|
<div class="resume-entry">
|
||||||
|
<div class="resume-entry-header">
|
||||||
|
<div>
|
||||||
|
<h3 class="resume-entry-title">{{ .role }}</h3>
|
||||||
|
<span class="resume-entry-org">{{ .company }} · {{ .location }}</span>
|
||||||
|
</div>
|
||||||
|
<span class="resume-entry-date">{{ .start }} — {{ .end }}</span>
|
||||||
|
</div>
|
||||||
|
{{- with .stack }}
|
||||||
|
<div class="resume-tech-stack">{{ delimit . ", " }}</div>
|
||||||
|
{{- end }}
|
||||||
|
{{- with .bullets }}
|
||||||
|
<ul class="resume-entry-details">
|
||||||
|
{{- range . }}
|
||||||
|
<li>{{ . | markdownify }}</li>
|
||||||
|
{{- end }}
|
||||||
|
</ul>
|
||||||
|
{{- end }}
|
||||||
|
{{- with .links }}
|
||||||
|
<div class="resume-entry-links">
|
||||||
|
{{- range . }}
|
||||||
|
<a href="{{ .url }}" target="_blank">{{ .display }}</a>
|
||||||
|
{{- end }}
|
||||||
|
</div>
|
||||||
|
{{- end }}
|
||||||
|
</div>
|
||||||
|
{{- end }}
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="resume-section">
|
||||||
|
<h2 class="resume-section-title">Skills</h2>
|
||||||
|
<div class="resume-skills">
|
||||||
|
{{- range $r.skills }}
|
||||||
|
<div class="resume-skill-group">
|
||||||
|
<h4 class="resume-skill-label">{{ .type }}</h4>
|
||||||
|
<span class="resume-skill-items">{{ delimit .items ", " }}</span>
|
||||||
|
</div>
|
||||||
|
{{- end }}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="resume-section">
|
||||||
|
<h2 class="resume-section-title">Projects</h2>
|
||||||
|
{{- range $r.projects }}
|
||||||
|
<div class="resume-entry">
|
||||||
|
<div class="resume-entry-header">
|
||||||
|
<div>
|
||||||
|
<h3 class="resume-entry-title">{{ .name }}</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{- with .stack }}
|
||||||
|
<div class="resume-tech-stack">{{ delimit . ", " }}</div>
|
||||||
|
{{- end }}
|
||||||
|
{{- with .links }}
|
||||||
|
<div class="resume-entry-links">
|
||||||
|
{{- range . }}
|
||||||
|
<a href="{{ .url }}" target="_blank">{{ .display }}</a>
|
||||||
|
{{- end }}
|
||||||
|
</div>
|
||||||
|
{{- end }}
|
||||||
|
</div>
|
||||||
|
{{- end }}
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="resume-section">
|
||||||
|
<h2 class="resume-section-title">Education</h2>
|
||||||
|
{{- range $r.education }}
|
||||||
|
<div class="resume-entry">
|
||||||
|
<div class="resume-entry-header">
|
||||||
|
<div>
|
||||||
|
<h3 class="resume-entry-title">{{ .course }}</h3>
|
||||||
|
<span class="resume-entry-org">{{ .school }} · {{ .location }}</span>
|
||||||
|
</div>
|
||||||
|
<span class="resume-entry-date">{{ .start }} — {{ .end }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{- end }}
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<div class="resume-download">
|
||||||
|
<a href="/resume.pdf" class="resume-download-btn">↓ Download PDF</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
25
layouts/_default/single.html
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
{{ define "main" }}
|
||||||
|
<article>
|
||||||
|
<div class="post-header">
|
||||||
|
<h1>{{ .Title }}</h1>
|
||||||
|
<div class="post-meta">
|
||||||
|
<span>{{ .Site.Params.author | upper }}</span>
|
||||||
|
<span class="separator">·</span>
|
||||||
|
<time datetime="{{ .Date.Format "2006-01-02" }}">{{ .Date.Format "02 Jan 2006" }}</time>
|
||||||
|
{{- with .Params.tags }}
|
||||||
|
<span class="separator">|</span>
|
||||||
|
<span class="post-tags">
|
||||||
|
{{- range . }}
|
||||||
|
<a href="{{ "tags/" | absURL }}{{ . | urlize }}/" class="post-tag">#{{ . }}</a>
|
||||||
|
{{- end }}
|
||||||
|
</span>
|
||||||
|
{{- end }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="post-content">
|
||||||
|
{{ .Content }}
|
||||||
|
</div>
|
||||||
|
<hr>
|
||||||
|
<a href="/" class="back-link">← back to home</a>
|
||||||
|
</article>
|
||||||
|
{{ end }}
|
||||||
64
layouts/index.html
Normal file
|
|
@ -0,0 +1,64 @@
|
||||||
|
{{ define "main" }}
|
||||||
|
<section class="home-bio">
|
||||||
|
<p>{{ .Site.Params.bio }}</p>
|
||||||
|
<p class="social-line">
|
||||||
|
Find me on
|
||||||
|
{{- range $i, $s := .Site.Params.social -}}
|
||||||
|
{{- if $i }},{{ end }}
|
||||||
|
<a href="{{ $s.url }}" target="_blank" rel="noopener noreferrer">{{ $s.name }}</a>
|
||||||
|
{{- end -}}.
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
{{- $posts := where .Site.RegularPages "Section" "posts" -}}
|
||||||
|
{{- if $posts }}
|
||||||
|
<section>
|
||||||
|
<h2 class="section-heading">Blog</h2>
|
||||||
|
{{- $byYear := $posts.GroupByDate "2006" -}}
|
||||||
|
{{- range $byYear }}
|
||||||
|
<div class="archive-year">
|
||||||
|
<h3 class="year-heading">{{ .Key }}</h3>
|
||||||
|
<ul class="post-list">
|
||||||
|
{{- range .Pages }}
|
||||||
|
<li class="post-list-item">
|
||||||
|
<time class="post-date" datetime="{{ .Date.Format "2006-01-02" }}">
|
||||||
|
{{ .Date.Format "02 Jan" }}
|
||||||
|
</time>
|
||||||
|
<a href="{{ .Permalink }}" class="post-title-link">{{ .Title }}</a>
|
||||||
|
</li>
|
||||||
|
{{- end }}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
{{- end }}
|
||||||
|
</section>
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- if .Site.Params.projects }}
|
||||||
|
<section>
|
||||||
|
<h2 class="section-heading">Projects</h2>
|
||||||
|
<div class="projects-grid">
|
||||||
|
{{- range .Site.Params.projects }}
|
||||||
|
{{- if eq .url "#" }}
|
||||||
|
<div class="project-card">
|
||||||
|
<div class="project-card-inner">
|
||||||
|
<h3 class="project-card-name">{{ .name }}</h3>
|
||||||
|
<p class="project-card-desc">{{ .description }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{- else }}
|
||||||
|
<a href="{{ .url }}" class="project-card" target="_blank" rel="noopener noreferrer">
|
||||||
|
<div class="project-card-inner">
|
||||||
|
<h3 class="project-card-name">{{ .name }}</h3>
|
||||||
|
<p class="project-card-desc">{{ .description }}</p>
|
||||||
|
</div>
|
||||||
|
<span class="project-card-arrow">→</span>
|
||||||
|
</a>
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
</div>
|
||||||
|
<div style="margin-top: 1rem; text-align: right;">
|
||||||
|
<a href="/projects/" class="post-title-link">View all projects →</a>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
{{- end }}
|
||||||
|
{{ end }}
|
||||||
29
layouts/partials/footer.html
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
<footer class="site-footer">
|
||||||
|
<div class="site-wrapper">
|
||||||
|
<div class="site-footer-inner">
|
||||||
|
<div class="footer-copyright">
|
||||||
|
© {{ now.Year }} {{ .Site.Params.author }}
|
||||||
|
</div>
|
||||||
|
<div class="social-icons">
|
||||||
|
{{- range .Site.Params.social -}}
|
||||||
|
<a href="{{ .url }}" target="_blank" rel="noopener noreferrer" title="{{ .name }}">
|
||||||
|
{{- if eq .icon "github" -}}
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0112 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z"/></svg>
|
||||||
|
{{- else if eq .icon "twitter" -}}
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg>
|
||||||
|
{{- else if eq .icon "mail" -}}
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M1.5 8.67v8.58a3 3 0 003 3h15a3 3 0 003-3V8.67l-8.928 5.493a3 3 0 01-3.144 0L1.5 8.67z"/><path d="M22.5 6.908V6.75a3 3 0 00-3-3h-15a3 3 0 00-3 3v.158l9.714 5.978a1.5 1.5 0 001.572 0L22.5 6.908z"/></svg>
|
||||||
|
{{- else if eq .icon "linkedin" -}}
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg>
|
||||||
|
{{- else if eq .icon "git" -}}
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M6 3a3 3 0 1 0 0 6 3 3 0 0 0 0-6zM3 6a3 3 0 0 1 5.83-.75h4.34A3.001 3.001 0 0 1 18 6a3 3 0 0 1-4.83.75H8.83A3.001 3.001 0 0 1 3 6zm3 9a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm0 3a3 3 0 0 1 0-6 3 3 0 0 1 0 6zm12-3a3 3 0 1 0 0 6 3 3 0 0 0 0-6z" fill="none"/><path d="M6 2a4 4 0 0 0-1 7.874V14.126A4.002 4.002 0 0 0 6 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 6 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm12-12a4 4 0 0 0-1 7.874v2.252A4.002 4.002 0 0 0 18 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 18 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4z"/></svg>
|
||||||
|
{{- end -}}
|
||||||
|
</a>
|
||||||
|
{{- end -}}
|
||||||
|
<a href="/index.xml" title="RSS Feed">
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M19.199 24C19.199 13.467 10.533 4.8 0 4.8V0c13.165 0 24 10.835 24 24h-4.801zM3.291 17.415c1.814 0 3.293 1.479 3.293 3.295 0 1.813-1.485 3.29-3.301 3.29C1.47 24 0 22.526 0 20.71s1.475-3.295 3.291-3.295zM15.909 24h-4.665c0-6.169-5.075-11.245-11.244-11.245V8.09c8.727 0 15.909 7.184 15.909 15.91z"/></svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
30
layouts/partials/head.html
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="description" content="{{ with .Description }}{{ . }}{{ else }}{{ .Site.Params.description }}{{ end }}">
|
||||||
|
<meta name="author" content="{{ .Site.Params.author }}">
|
||||||
|
|
||||||
|
<!-- Open Graph -->
|
||||||
|
<meta property="og:title" content="{{ .Title | default .Site.Title }}">
|
||||||
|
<meta property="og:description" content="{{ with .Description }}{{ . }}{{ else }}{{ .Site.Params.description }}{{ end }}">
|
||||||
|
<meta property="og:type" content="{{ if .IsPage }}article{{ else }}website{{ end }}">
|
||||||
|
<meta property="og:url" content="{{ .Permalink }}">
|
||||||
|
<meta property="og:site_name" content="{{ .Site.Title }}">
|
||||||
|
|
||||||
|
<!-- Twitter Card -->
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="{{ .Title | default .Site.Title }}">
|
||||||
|
<meta name="twitter:description" content="{{ with .Description }}{{ . }}{{ else }}{{ .Site.Params.description }}{{ end }}">
|
||||||
|
|
||||||
|
<title>{{ if .IsHome }}{{ .Site.Title }}{{ else }}{{ .Title }} · {{ .Site.Title }}{{ end }}</title>
|
||||||
|
|
||||||
|
<!-- Favicon -->
|
||||||
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||||
|
|
||||||
|
<!-- Styles -->
|
||||||
|
{{ $style := resources.Get "css/style.css" | minify | fingerprint }}
|
||||||
|
<link rel="stylesheet" href="{{ $style.Permalink }}">
|
||||||
|
|
||||||
|
<!-- RSS -->
|
||||||
|
{{ range .AlternativeOutputFormats -}}
|
||||||
|
{{ printf `<link rel="%s" type="%s" href="%s" title="%s">` .Rel .MediaType.Type .Permalink $.Site.Title | safeHTML }}
|
||||||
|
{{ end -}}
|
||||||
12
layouts/partials/header.html
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
<header class="site-header">
|
||||||
|
<div class="site-header-inner">
|
||||||
|
<a href="/" class="site-title">{{ .Site.Title }}</a>
|
||||||
|
<nav class="site-nav">
|
||||||
|
{{- $currentPage := . -}}
|
||||||
|
{{- range $i, $item := .Site.Menus.main -}}
|
||||||
|
{{- if $i }}<span class="nav-separator">|</span>{{ end -}}
|
||||||
|
<a href="{{ .URL }}"{{ if or ($currentPage.IsMenuCurrent "main" .) ($currentPage.HasMenuCurrent "main" .) }} class="active"{{ end }}>{{ .Name }}</a>
|
||||||
|
{{- end -}}
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
73
public/about/index.html
Normal file
|
|
@ -0,0 +1,73 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-us">
|
||||||
|
<head><script src="/livereload.js?mindelay=10&v=2&port=1313&path=livereload" data-no-instant defer></script><meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="description" content="About Divyam Ahuja">
|
||||||
|
<meta name="author" content="Divyam Ahuja">
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="About">
|
||||||
|
<meta property="og:description" content="About Divyam Ahuja">
|
||||||
|
<meta property="og:type" content="article">
|
||||||
|
<meta property="og:url" content="http://localhost:1313/about/">
|
||||||
|
<meta property="og:site_name" content="Divyam Ahuja">
|
||||||
|
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="About">
|
||||||
|
<meta name="twitter:description" content="About Divyam Ahuja">
|
||||||
|
|
||||||
|
<title>About · Divyam Ahuja</title>
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="http://localhost:1313/css/style.min.86de29e37fd55fb8581ee5569d0e766097f2718b8f8029e4e11c87973d24a5b1.css">
|
||||||
|
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="site-wrapper"><header class="site-header">
|
||||||
|
<div class="site-header-inner">
|
||||||
|
<a href="/" class="site-title">Divyam Ahuja</a>
|
||||||
|
<nav class="site-nav"><a href="/">Home</a><span class="nav-separator">|</span><a href="/posts/">Blog</a><span class="nav-separator">|</span><a href="/projects/">Projects</a><span class="nav-separator">|</span><a href="/resume/">Resume</a></nav>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
<article>
|
||||||
|
<div class="post-header">
|
||||||
|
<h1>About</h1>
|
||||||
|
<div class="post-meta">
|
||||||
|
<span>DIVYAM AHUJA</span>
|
||||||
|
<span class="separator">·</span>
|
||||||
|
<time datetime="0001-01-01">01 Jan 0001</time>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="post-content">
|
||||||
|
<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>
|
||||||
|
<p>If you want to see what I’ve been working on, check out my <a href="https://github.com/ryoutsu">GitHub</a>. Feel free to reach out by <a href="mailto:hello@divyam.dev">email</a> if you want to talk about something I’m doing.</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<hr>
|
||||||
|
<a href="/" class="back-link">← back to home</a>
|
||||||
|
</article>
|
||||||
|
</main>
|
||||||
|
</div><footer class="site-footer">
|
||||||
|
<div class="site-wrapper">
|
||||||
|
<div class="site-footer-inner">
|
||||||
|
<div class="footer-copyright">
|
||||||
|
© 2026 Divyam Ahuja
|
||||||
|
</div>
|
||||||
|
<div class="social-icons"><a href="https://github.com/ahujadivyam" target="_blank" rel="noopener noreferrer" title="GitHub"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0112 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z"/></svg></a><a href="https://linkedin.com/in/ahujadivyam" target="_blank" rel="noopener noreferrer" title="LinkedIn"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg></a><a href="https://git.divyam.dev" target="_blank" rel="noopener noreferrer" title="Git"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M6 3a3 3 0 1 0 0 6 3 3 0 0 0 0-6zM3 6a3 3 0 0 1 5.83-.75h4.34A3.001 3.001 0 0 1 18 6a3 3 0 0 1-4.83.75H8.83A3.001 3.001 0 0 1 3 6zm3 9a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm0 3a3 3 0 0 1 0-6 3 3 0 0 1 0 6zm12-3a3 3 0 1 0 0 6 3 3 0 0 0 0-6z" fill="none"/><path d="M6 2a4 4 0 0 0-1 7.874V14.126A4.002 4.002 0 0 0 6 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 6 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm12-12a4 4 0 0 0-1 7.874v2.252A4.002 4.002 0 0 0 18 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 18 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4z"/></svg></a><a href="mailto:ahujadivyam@gmail.com" target="_blank" rel="noopener noreferrer" title="Email"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M1.5 8.67v8.58a3 3 0 003 3h15a3 3 0 003-3V8.67l-8.928 5.493a3 3 0 01-3.144 0L1.5 8.67z"/><path d="M22.5 6.908V6.75a3 3 0 00-3-3h-15a3 3 0 00-3 3v.158l9.714 5.978a1.5 1.5 0 001.572 0L22.5 6.908z"/></svg></a><a href="/index.xml" title="RSS Feed">
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M19.199 24C19.199 13.467 10.533 4.8 0 4.8V0c13.165 0 24 10.835 24 24h-4.801zM3.291 17.415c1.814 0 3.293 1.479 3.293 3.295 0 1.813-1.485 3.29-3.301 3.29C1.47 24 0 22.526 0 20.71s1.475-3.295 3.291-3.295zM15.909 24h-4.665c0-6.169-5.075-11.245-11.244-11.245V8.09c8.727 0 15.909 7.184 15.909 15.91z"/></svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
4
public/avatar.png
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200">
|
||||||
|
<circle cx="100" cy="100" r="100" fill="#282a2e"/>
|
||||||
|
<text x="100" y="115" font-family="monospace" font-size="72" font-weight="700" fill="#2bbc8a" text-anchor="middle">DA</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 250 B |
60
public/categories/index.html
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-us">
|
||||||
|
<head><script src="/livereload.js?mindelay=10&v=2&port=1313&path=livereload" data-no-instant defer></script><meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="description" content="Software Engineer">
|
||||||
|
<meta name="author" content="Divyam Ahuja">
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Categories">
|
||||||
|
<meta property="og:description" content="Software Engineer">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:url" content="http://localhost:1313/categories/">
|
||||||
|
<meta property="og:site_name" content="Divyam Ahuja">
|
||||||
|
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="Categories">
|
||||||
|
<meta name="twitter:description" content="Software Engineer">
|
||||||
|
|
||||||
|
<title>Categories · Divyam Ahuja</title>
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="http://localhost:1313/css/style.min.86de29e37fd55fb8581ee5569d0e766097f2718b8f8029e4e11c87973d24a5b1.css">
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="alternate" type="application/rss+xml" href="http://localhost:1313/categories/index.xml" title="Divyam Ahuja">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="site-wrapper"><header class="site-header">
|
||||||
|
<div class="site-header-inner">
|
||||||
|
<a href="/" class="site-title">Divyam Ahuja</a>
|
||||||
|
<nav class="site-nav"><a href="/">Home</a><span class="nav-separator">|</span><a href="/posts/">Blog</a><span class="nav-separator">|</span><a href="/projects/">Projects</a><span class="nav-separator">|</span><a href="/resume/">Resume</a></nav>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
<h1 class="page-title">Categories</h1>
|
||||||
|
|
||||||
|
<div class="post-content">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</div><footer class="site-footer">
|
||||||
|
<div class="site-wrapper">
|
||||||
|
<div class="site-footer-inner">
|
||||||
|
<div class="footer-copyright">
|
||||||
|
© 2026 Divyam Ahuja
|
||||||
|
</div>
|
||||||
|
<div class="social-icons"><a href="https://github.com/ahujadivyam" target="_blank" rel="noopener noreferrer" title="GitHub"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0112 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z"/></svg></a><a href="https://linkedin.com/in/ahujadivyam" target="_blank" rel="noopener noreferrer" title="LinkedIn"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg></a><a href="https://git.divyam.dev" target="_blank" rel="noopener noreferrer" title="Git"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M6 3a3 3 0 1 0 0 6 3 3 0 0 0 0-6zM3 6a3 3 0 0 1 5.83-.75h4.34A3.001 3.001 0 0 1 18 6a3 3 0 0 1-4.83.75H8.83A3.001 3.001 0 0 1 3 6zm3 9a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm0 3a3 3 0 0 1 0-6 3 3 0 0 1 0 6zm12-3a3 3 0 1 0 0 6 3 3 0 0 0 0-6z" fill="none"/><path d="M6 2a4 4 0 0 0-1 7.874V14.126A4.002 4.002 0 0 0 6 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 6 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm12-12a4 4 0 0 0-1 7.874v2.252A4.002 4.002 0 0 0 18 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 18 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4z"/></svg></a><a href="mailto:ahujadivyam@gmail.com" target="_blank" rel="noopener noreferrer" title="Email"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M1.5 8.67v8.58a3 3 0 003 3h15a3 3 0 003-3V8.67l-8.928 5.493a3 3 0 01-3.144 0L1.5 8.67z"/><path d="M22.5 6.908V6.75a3 3 0 00-3-3h-15a3 3 0 00-3 3v.158l9.714 5.978a1.5 1.5 0 001.572 0L22.5 6.908z"/></svg></a><a href="/index.xml" title="RSS Feed">
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M19.199 24C19.199 13.467 10.533 4.8 0 4.8V0c13.165 0 24 10.835 24 24h-4.801zM3.291 17.415c1.814 0 3.293 1.479 3.293 3.295 0 1.813-1.485 3.29-3.301 3.29C1.47 24 0 22.526 0 20.71s1.475-3.295 3.291-3.295zM15.909 24h-4.665c0-6.169-5.075-11.245-11.244-11.245V8.09c8.727 0 15.909 7.184 15.909 15.91z"/></svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
11
public/categories/index.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||||
|
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||||
|
<channel>
|
||||||
|
<title>Categories on Divyam Ahuja</title>
|
||||||
|
<link>http://localhost:1313/categories/</link>
|
||||||
|
<description>Recent content in Categories on Divyam Ahuja</description>
|
||||||
|
<generator>Hugo</generator>
|
||||||
|
<language>en-us</language>
|
||||||
|
<atom:link href="http://localhost:1313/categories/index.xml" rel="self" type="application/rss+xml" />
|
||||||
|
</channel>
|
||||||
|
</rss>
|
||||||
4
public/favicon.svg
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
|
||||||
|
<rect width="100" height="100" rx="12" fill="#1d1f21"/>
|
||||||
|
<text x="50" y="68" font-family="monospace" font-size="52" font-weight="700" fill="#2bbc8a" text-anchor="middle">D</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 252 B |
121
public/index.html
Normal file
|
|
@ -0,0 +1,121 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-us">
|
||||||
|
<head>
|
||||||
|
<meta name="generator" content="Hugo 0.161.1"><script src="/livereload.js?mindelay=10&v=2&port=1313&path=livereload" data-no-instant defer></script><meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="description" content="Software Engineer">
|
||||||
|
<meta name="author" content="Divyam Ahuja">
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Divyam Ahuja">
|
||||||
|
<meta property="og:description" content="Software Engineer">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:url" content="http://localhost:1313/">
|
||||||
|
<meta property="og:site_name" content="Divyam Ahuja">
|
||||||
|
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="Divyam Ahuja">
|
||||||
|
<meta name="twitter:description" content="Software Engineer">
|
||||||
|
|
||||||
|
<title>Divyam Ahuja</title>
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="http://localhost:1313/css/style.min.86de29e37fd55fb8581ee5569d0e766097f2718b8f8029e4e11c87973d24a5b1.css">
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="alternate" type="application/rss+xml" href="http://localhost:1313/index.xml" title="Divyam Ahuja">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="site-wrapper"><header class="site-header">
|
||||||
|
<div class="site-header-inner">
|
||||||
|
<a href="/" class="site-title">Divyam Ahuja</a>
|
||||||
|
<nav class="site-nav"><a href="/">Home</a><span class="nav-separator">|</span><a href="/posts/">Blog</a><span class="nav-separator">|</span><a href="/projects/">Projects</a><span class="nav-separator">|</span><a href="/resume/">Resume</a></nav>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
<section class="home-bio">
|
||||||
|
<p>Software Engineer at Microsoft, working on the Excel Copilot team. I enjoy building side projects, tinkering with infrastructure, and deep-diving into performance optimization.</p>
|
||||||
|
<p class="social-line">
|
||||||
|
Find me on
|
||||||
|
<a href="https://github.com/ahujadivyam" target="_blank" rel="noopener noreferrer">GitHub</a>,
|
||||||
|
<a href="https://linkedin.com/in/ahujadivyam" target="_blank" rel="noopener noreferrer">LinkedIn</a>,
|
||||||
|
<a href="https://git.divyam.dev" target="_blank" rel="noopener noreferrer">Git</a>,
|
||||||
|
<a href="mailto:ahujadivyam@gmail.com" target="_blank" rel="noopener noreferrer">Email</a>.
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2 class="section-heading">Blog</h2>
|
||||||
|
<div class="archive-year">
|
||||||
|
<h3 class="year-heading">2026</h3>
|
||||||
|
<ul class="post-list">
|
||||||
|
<li class="post-list-item">
|
||||||
|
<time class="post-date" datetime="2026-05-08">
|
||||||
|
08 May
|
||||||
|
</time>
|
||||||
|
<a href="http://localhost:1313/posts/hello-world/" class="post-title-link">Hello World</a>
|
||||||
|
</li>
|
||||||
|
<li class="post-list-item">
|
||||||
|
<time class="post-date" datetime="2026-02-11">
|
||||||
|
11 Feb
|
||||||
|
</time>
|
||||||
|
<a href="http://localhost:1313/posts/pdf-translation-pipeline/" class="post-title-link">Building a PDF Translation Pipeline</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2 class="section-heading">Projects</h2>
|
||||||
|
<div class="projects-grid">
|
||||||
|
<a href="https://git.divyam.dev/divyam/fastbin" class="project-card" target="_blank" rel="noopener noreferrer">
|
||||||
|
<div class="project-card-inner">
|
||||||
|
<h3 class="project-card-name">fastbin</h3>
|
||||||
|
<p class="project-card-desc">A high-performance code sharing webapp with real-time updates</p>
|
||||||
|
</div>
|
||||||
|
<span class="project-card-arrow">→</span>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/ahujadivyam/gsoc-chromium-freequeue" class="project-card" target="_blank" rel="noopener noreferrer">
|
||||||
|
<div class="project-card-inner">
|
||||||
|
<h3 class="project-card-name">gsoc-chromium-freequeue</h3>
|
||||||
|
<p class="project-card-desc">Lock-free ring buffer library built during Google Summer of Code for Chromium's audio processing</p>
|
||||||
|
</div>
|
||||||
|
<span class="project-card-arrow">→</span>
|
||||||
|
</a>
|
||||||
|
<div class="project-card">
|
||||||
|
<div class="project-card-inner">
|
||||||
|
<h3 class="project-card-name">Homelab</h3>
|
||||||
|
<p class="project-card-desc">Self-hosted high-availability infrastructure on Raspberry Pi 5</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a href="https://git.divyam.dev/divyam/divyam.dev" class="project-card" target="_blank" rel="noopener noreferrer">
|
||||||
|
<div class="project-card-inner">
|
||||||
|
<h3 class="project-card-name">divyam.dev</h3>
|
||||||
|
<p class="project-card-desc">This minimal, high-performance portfolio and blog</p>
|
||||||
|
</div>
|
||||||
|
<span class="project-card-arrow">→</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div style="margin-top: 1rem; text-align: right;">
|
||||||
|
<a href="/projects/" class="post-title-link">View all projects →</a>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
</div><footer class="site-footer">
|
||||||
|
<div class="site-wrapper">
|
||||||
|
<div class="site-footer-inner">
|
||||||
|
<div class="footer-copyright">
|
||||||
|
© 2026 Divyam Ahuja
|
||||||
|
</div>
|
||||||
|
<div class="social-icons"><a href="https://github.com/ahujadivyam" target="_blank" rel="noopener noreferrer" title="GitHub"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0112 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z"/></svg></a><a href="https://linkedin.com/in/ahujadivyam" target="_blank" rel="noopener noreferrer" title="LinkedIn"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg></a><a href="https://git.divyam.dev" target="_blank" rel="noopener noreferrer" title="Git"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M6 3a3 3 0 1 0 0 6 3 3 0 0 0 0-6zM3 6a3 3 0 0 1 5.83-.75h4.34A3.001 3.001 0 0 1 18 6a3 3 0 0 1-4.83.75H8.83A3.001 3.001 0 0 1 3 6zm3 9a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm0 3a3 3 0 0 1 0-6 3 3 0 0 1 0 6zm12-3a3 3 0 1 0 0 6 3 3 0 0 0 0-6z" fill="none"/><path d="M6 2a4 4 0 0 0-1 7.874V14.126A4.002 4.002 0 0 0 6 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 6 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm12-12a4 4 0 0 0-1 7.874v2.252A4.002 4.002 0 0 0 18 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 18 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4z"/></svg></a><a href="mailto:ahujadivyam@gmail.com" target="_blank" rel="noopener noreferrer" title="Email"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M1.5 8.67v8.58a3 3 0 003 3h15a3 3 0 003-3V8.67l-8.928 5.493a3 3 0 01-3.144 0L1.5 8.67z"/><path d="M22.5 6.908V6.75a3 3 0 00-3-3h-15a3 3 0 00-3 3v.158l9.714 5.978a1.5 1.5 0 001.572 0L22.5 6.908z"/></svg></a><a href="/index.xml" title="RSS Feed">
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M19.199 24C19.199 13.467 10.533 4.8 0 4.8V0c13.165 0 24 10.835 24 24h-4.801zM3.291 17.415c1.814 0 3.293 1.479 3.293 3.295 0 1.813-1.485 3.29-3.301 3.29C1.47 24 0 22.526 0 20.71s1.475-3.295 3.291-3.295zM15.909 24h-4.665c0-6.169-5.075-11.245-11.244-11.245V8.09c8.727 0 15.909 7.184 15.909 15.91z"/></svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
47
public/index.xml
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||||
|
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||||
|
<channel>
|
||||||
|
<title>Divyam Ahuja</title>
|
||||||
|
<link>http://localhost:1313/</link>
|
||||||
|
<description>Recent content on Divyam Ahuja</description>
|
||||||
|
<generator>Hugo</generator>
|
||||||
|
<language>en-us</language>
|
||||||
|
<lastBuildDate>Fri, 08 May 2026 00:00:00 +0000</lastBuildDate>
|
||||||
|
<atom:link href="http://localhost:1313/index.xml" rel="self" type="application/rss+xml" />
|
||||||
|
<item>
|
||||||
|
<title>Hello World</title>
|
||||||
|
<link>http://localhost:1313/posts/hello-world/</link>
|
||||||
|
<pubDate>Fri, 08 May 2026 00:00:00 +0000</pubDate>
|
||||||
|
<guid>http://localhost:1313/posts/hello-world/</guid>
|
||||||
|
<description><p>Welcome to my new blog! I&rsquo;ve rebuilt my personal website from scratch using <a href="https://gohugo.io/">Hugo</a>, a fast static site generator written in Go.</p>
<h2 id="why-hugo">Why Hugo?</h2>
<p>I wanted something minimal, fast, and that gets out of the way. Hugo checks all the boxes:</p>
<ul>
<li><strong>Blazing fast builds</strong> — the entire site builds in under 100ms</li>
<li><strong>Markdown-first</strong> — I write posts in plain markdown files</li>
<li><strong>Zero JavaScript</strong> — the site ships pure HTML and CSS</li>
<li><strong>Built-in features</strong> — syntax highlighting, RSS feeds, sitemaps, all out of the box</li>
</ul>
<h2 id="the-design">The Design</h2>
<p>The design is inspired by the <a href="https://probberechts.github.io/hexo-theme-cactus/">Cactus Dark</a> theme — a minimalist, terminal-inspired aesthetic with monospace typography and a dark color scheme. I built the theme from scratch for full control.</p></description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Building a PDF Translation Pipeline</title>
|
||||||
|
<link>http://localhost:1313/posts/pdf-translation-pipeline/</link>
|
||||||
|
<pubDate>Wed, 11 Feb 2026 00:00:00 +0000</pubDate>
|
||||||
|
<guid>http://localhost:1313/posts/pdf-translation-pipeline/</guid>
|
||||||
|
<description><p>Recently, I needed to translate a PDF document from Hindi to English. Sounds simple enough, right? Turns out, it&rsquo;s a surprisingly deep rabbit hole.</p>
<h2 id="the-pipeline">The Pipeline</h2>
<p>The approach I settled on follows this flow:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">PDF → Images → OCR → Translation → Rendered Images → PDF
</span></span></code></pre></div><p>Each step has its own set of challenges:</p>
<ol>
<li><strong>PDF to Images</strong>: Convert each page to a high-DPI image for better OCR accuracy</li>
<li><strong>OCR</strong>: Extract text with position data using PaddleOCR</li>
<li><strong>Translation</strong>: Run extracted text through NLLB (No Language Left Behind)</li>
<li><strong>Rendering</strong>: Paint translated text back onto the original image</li>
<li><strong>Assembly</strong>: Combine rendered images back into a PDF</li>
</ol>
<h2 id="lessons-learned">Lessons Learned</h2>
<ul>
<li><strong>DPI matters a lot</strong> — bumping from 150 to 300 DPI dramatically improved OCR accuracy for Hindi text</li>
<li><strong>Font rendering is hard</strong> — getting translated text to fit in the same bounding boxes required careful font size calculation</li>
<li><strong>Fallback strategies</strong> — TrOCR as a fallback when PaddleOCR fails on certain text regions</li>
</ul>
<p>The code is messy but it works. Sometimes that&rsquo;s enough.</p></description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>About</title>
|
||||||
|
<link>http://localhost:1313/about/</link>
|
||||||
|
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
|
||||||
|
<guid>http://localhost:1313/about/</guid>
|
||||||
|
<description><p>Hi, I&rsquo;m a full-stack developer who loves building things. I enjoy hacking on side projects, exploring new technologies, and deep-diving into the technical details of how things work.</p>
<p>I work across the stack — from crafting interactive frontends to designing robust backend systems. When I&rsquo;m not writing code, I&rsquo;m probably reading about distributed systems, tinkering with new tools, or working on one of my many side projects.</p>
<p>I enjoy hacking on things and deep diving into the technical details of protocols, performance optimization, and algorithms.</p></description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Projects</title>
|
||||||
|
<link>http://localhost:1313/projects/</link>
|
||||||
|
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
|
||||||
|
<guid>http://localhost:1313/projects/</guid>
|
||||||
|
<description></description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Resume</title>
|
||||||
|
<link>http://localhost:1313/resume/</link>
|
||||||
|
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
|
||||||
|
<guid>http://localhost:1313/resume/</guid>
|
||||||
|
<description></description>
|
||||||
|
</item>
|
||||||
|
</channel>
|
||||||
|
</rss>
|
||||||
107
public/posts/hello-world/index.html
Normal file
|
|
@ -0,0 +1,107 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-us">
|
||||||
|
<head><script src="/livereload.js?mindelay=10&v=2&port=1313&path=livereload" data-no-instant defer></script><meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="description" content="First post on my new blog, built with Hugo.">
|
||||||
|
<meta name="author" content="Divyam Ahuja">
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Hello World">
|
||||||
|
<meta property="og:description" content="First post on my new blog, built with Hugo.">
|
||||||
|
<meta property="og:type" content="article">
|
||||||
|
<meta property="og:url" content="http://localhost:1313/posts/hello-world/">
|
||||||
|
<meta property="og:site_name" content="Divyam Ahuja">
|
||||||
|
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="Hello World">
|
||||||
|
<meta name="twitter:description" content="First post on my new blog, built with Hugo.">
|
||||||
|
|
||||||
|
<title>Hello World · Divyam Ahuja</title>
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="http://localhost:1313/css/style.min.86de29e37fd55fb8581ee5569d0e766097f2718b8f8029e4e11c87973d24a5b1.css">
|
||||||
|
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="site-wrapper"><header class="site-header">
|
||||||
|
<div class="site-header-inner">
|
||||||
|
<a href="/" class="site-title">Divyam Ahuja</a>
|
||||||
|
<nav class="site-nav"><a href="/">Home</a><span class="nav-separator">|</span><a href="/posts/">Blog</a><span class="nav-separator">|</span><a href="/projects/">Projects</a><span class="nav-separator">|</span><a href="/resume/">Resume</a></nav>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
<article>
|
||||||
|
<div class="post-header">
|
||||||
|
<h1>Hello World</h1>
|
||||||
|
<div class="post-meta">
|
||||||
|
<span>DIVYAM AHUJA</span>
|
||||||
|
<span class="separator">·</span>
|
||||||
|
<time datetime="2026-05-08">08 May 2026</time>
|
||||||
|
<span class="separator">|</span>
|
||||||
|
<span class="post-tags">
|
||||||
|
<a href="http://localhost:1313/tags/meta/" class="post-tag">#meta</a>
|
||||||
|
<a href="http://localhost:1313/tags/hugo/" class="post-tag">#hugo</a>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="post-content">
|
||||||
|
<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>
|
||||||
|
<p>Here’s a quick code example to make sure syntax highlighting works:</p>
|
||||||
|
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">greet</span><span class="p">(</span><span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
|
||||||
|
</span></span><span class="line"><span class="cl"> <span class="s2">"""Return a greeting message."""</span>
|
||||||
|
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="sa">f</span><span class="s2">"Hello, </span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s2">! Welcome to divyam.dev"</span>
|
||||||
|
</span></span><span class="line"><span class="cl">
|
||||||
|
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">"__main__"</span><span class="p">:</span>
|
||||||
|
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="n">greet</span><span class="p">(</span><span class="s2">"World"</span><span class="p">))</span>
|
||||||
|
</span></span></code></pre></div><p>And some JavaScript too:</p>
|
||||||
|
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">fetchPosts</span> <span class="o">=</span> <span class="kr">async</span> <span class="p">()</span> <span class="p">=></span> <span class="p">{</span>
|
||||||
|
</span></span><span class="line"><span class="cl"> <span class="kr">const</span> <span class="nx">response</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">fetch</span><span class="p">(</span><span class="s1">'/api/posts'</span><span class="p">);</span>
|
||||||
|
</span></span><span class="line"><span class="cl"> <span class="kr">const</span> <span class="nx">posts</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">response</span><span class="p">.</span><span class="nx">json</span><span class="p">();</span>
|
||||||
|
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">posts</span><span class="p">.</span><span class="nx">filter</span><span class="p">(</span><span class="nx">post</span> <span class="p">=></span> <span class="nx">post</span><span class="p">.</span><span class="nx">published</span><span class="p">);</span>
|
||||||
|
</span></span><span class="line"><span class="cl"><span class="p">};</span>
|
||||||
|
</span></span></code></pre></div><h2 id="whats-next">What’s Next?</h2>
|
||||||
|
<p>I plan to write about:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Full-stack development patterns and best practices</li>
|
||||||
|
<li>Side projects and what I learn building them</li>
|
||||||
|
<li>Deep dives into interesting technical problems</li>
|
||||||
|
<li>Tools and workflows that make development better</li>
|
||||||
|
</ul>
|
||||||
|
<p>Stay tuned — there’s more coming soon.</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<hr>
|
||||||
|
<a href="/" class="back-link">← back to home</a>
|
||||||
|
</article>
|
||||||
|
</main>
|
||||||
|
</div><footer class="site-footer">
|
||||||
|
<div class="site-wrapper">
|
||||||
|
<div class="site-footer-inner">
|
||||||
|
<div class="footer-copyright">
|
||||||
|
© 2026 Divyam Ahuja
|
||||||
|
</div>
|
||||||
|
<div class="social-icons"><a href="https://github.com/ahujadivyam" target="_blank" rel="noopener noreferrer" title="GitHub"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0112 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z"/></svg></a><a href="https://linkedin.com/in/ahujadivyam" target="_blank" rel="noopener noreferrer" title="LinkedIn"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg></a><a href="https://git.divyam.dev" target="_blank" rel="noopener noreferrer" title="Git"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M6 3a3 3 0 1 0 0 6 3 3 0 0 0 0-6zM3 6a3 3 0 0 1 5.83-.75h4.34A3.001 3.001 0 0 1 18 6a3 3 0 0 1-4.83.75H8.83A3.001 3.001 0 0 1 3 6zm3 9a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm0 3a3 3 0 0 1 0-6 3 3 0 0 1 0 6zm12-3a3 3 0 1 0 0 6 3 3 0 0 0 0-6z" fill="none"/><path d="M6 2a4 4 0 0 0-1 7.874V14.126A4.002 4.002 0 0 0 6 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 6 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm12-12a4 4 0 0 0-1 7.874v2.252A4.002 4.002 0 0 0 18 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 18 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4z"/></svg></a><a href="mailto:ahujadivyam@gmail.com" target="_blank" rel="noopener noreferrer" title="Email"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M1.5 8.67v8.58a3 3 0 003 3h15a3 3 0 003-3V8.67l-8.928 5.493a3 3 0 01-3.144 0L1.5 8.67z"/><path d="M22.5 6.908V6.75a3 3 0 00-3-3h-15a3 3 0 00-3 3v.158l9.714 5.978a1.5 1.5 0 001.572 0L22.5 6.908z"/></svg></a><a href="/index.xml" title="RSS Feed">
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M19.199 24C19.199 13.467 10.533 4.8 0 4.8V0c13.165 0 24 10.835 24 24h-4.801zM3.291 17.415c1.814 0 3.293 1.479 3.293 3.295 0 1.813-1.485 3.29-3.301 3.29C1.47 24 0 22.526 0 20.71s1.475-3.295 3.291-3.295zM15.909 24h-4.665c0-6.169-5.075-11.245-11.244-11.245V8.09c8.727 0 15.909 7.184 15.909 15.91z"/></svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
74
public/posts/index.html
Normal file
|
|
@ -0,0 +1,74 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-us">
|
||||||
|
<head><script src="/livereload.js?mindelay=10&v=2&port=1313&path=livereload" data-no-instant defer></script><meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="description" content="Software Engineer">
|
||||||
|
<meta name="author" content="Divyam Ahuja">
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Writing">
|
||||||
|
<meta property="og:description" content="Software Engineer">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:url" content="http://localhost:1313/posts/">
|
||||||
|
<meta property="og:site_name" content="Divyam Ahuja">
|
||||||
|
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="Writing">
|
||||||
|
<meta name="twitter:description" content="Software Engineer">
|
||||||
|
|
||||||
|
<title>Writing · Divyam Ahuja</title>
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="http://localhost:1313/css/style.min.86de29e37fd55fb8581ee5569d0e766097f2718b8f8029e4e11c87973d24a5b1.css">
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="alternate" type="application/rss+xml" href="http://localhost:1313/posts/index.xml" title="Divyam Ahuja">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="site-wrapper"><header class="site-header">
|
||||||
|
<div class="site-header-inner">
|
||||||
|
<a href="/" class="site-title">Divyam Ahuja</a>
|
||||||
|
<nav class="site-nav"><a href="/">Home</a><span class="nav-separator">|</span><a href="/posts/">Blog</a><span class="nav-separator">|</span><a href="/projects/">Projects</a><span class="nav-separator">|</span><a href="/resume/">Resume</a></nav>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
<h1 class="page-title">Writing</h1>
|
||||||
|
|
||||||
|
<div class="archive-year">
|
||||||
|
<h3 class="year-heading">2026</h3>
|
||||||
|
<ul class="post-list">
|
||||||
|
<li class="post-list-item">
|
||||||
|
<time class="post-date" datetime="2026-05-08">
|
||||||
|
08 May
|
||||||
|
</time>
|
||||||
|
<a href="http://localhost:1313/posts/hello-world/" class="post-title-link">Hello World</a>
|
||||||
|
</li>
|
||||||
|
<li class="post-list-item">
|
||||||
|
<time class="post-date" datetime="2026-02-11">
|
||||||
|
11 Feb
|
||||||
|
</time>
|
||||||
|
<a href="http://localhost:1313/posts/pdf-translation-pipeline/" class="post-title-link">Building a PDF Translation Pipeline</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</div><footer class="site-footer">
|
||||||
|
<div class="site-wrapper">
|
||||||
|
<div class="site-footer-inner">
|
||||||
|
<div class="footer-copyright">
|
||||||
|
© 2026 Divyam Ahuja
|
||||||
|
</div>
|
||||||
|
<div class="social-icons"><a href="https://github.com/ahujadivyam" target="_blank" rel="noopener noreferrer" title="GitHub"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0112 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z"/></svg></a><a href="https://linkedin.com/in/ahujadivyam" target="_blank" rel="noopener noreferrer" title="LinkedIn"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg></a><a href="https://git.divyam.dev" target="_blank" rel="noopener noreferrer" title="Git"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M6 3a3 3 0 1 0 0 6 3 3 0 0 0 0-6zM3 6a3 3 0 0 1 5.83-.75h4.34A3.001 3.001 0 0 1 18 6a3 3 0 0 1-4.83.75H8.83A3.001 3.001 0 0 1 3 6zm3 9a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm0 3a3 3 0 0 1 0-6 3 3 0 0 1 0 6zm12-3a3 3 0 1 0 0 6 3 3 0 0 0 0-6z" fill="none"/><path d="M6 2a4 4 0 0 0-1 7.874V14.126A4.002 4.002 0 0 0 6 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 6 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm12-12a4 4 0 0 0-1 7.874v2.252A4.002 4.002 0 0 0 18 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 18 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4z"/></svg></a><a href="mailto:ahujadivyam@gmail.com" target="_blank" rel="noopener noreferrer" title="Email"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M1.5 8.67v8.58a3 3 0 003 3h15a3 3 0 003-3V8.67l-8.928 5.493a3 3 0 01-3.144 0L1.5 8.67z"/><path d="M22.5 6.908V6.75a3 3 0 00-3-3h-15a3 3 0 00-3 3v.158l9.714 5.978a1.5 1.5 0 001.572 0L22.5 6.908z"/></svg></a><a href="/index.xml" title="RSS Feed">
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M19.199 24C19.199 13.467 10.533 4.8 0 4.8V0c13.165 0 24 10.835 24 24h-4.801zM3.291 17.415c1.814 0 3.293 1.479 3.293 3.295 0 1.813-1.485 3.29-3.301 3.29C1.47 24 0 22.526 0 20.71s1.475-3.295 3.291-3.295zM15.909 24h-4.665c0-6.169-5.075-11.245-11.244-11.245V8.09c8.727 0 15.909 7.184 15.909 15.91z"/></svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
26
public/posts/index.xml
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||||
|
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||||
|
<channel>
|
||||||
|
<title>Writing on Divyam Ahuja</title>
|
||||||
|
<link>http://localhost:1313/posts/</link>
|
||||||
|
<description>Recent content in Writing on Divyam Ahuja</description>
|
||||||
|
<generator>Hugo</generator>
|
||||||
|
<language>en-us</language>
|
||||||
|
<lastBuildDate>Fri, 08 May 2026 00:00:00 +0000</lastBuildDate>
|
||||||
|
<atom:link href="http://localhost:1313/posts/index.xml" rel="self" type="application/rss+xml" />
|
||||||
|
<item>
|
||||||
|
<title>Hello World</title>
|
||||||
|
<link>http://localhost:1313/posts/hello-world/</link>
|
||||||
|
<pubDate>Fri, 08 May 2026 00:00:00 +0000</pubDate>
|
||||||
|
<guid>http://localhost:1313/posts/hello-world/</guid>
|
||||||
|
<description><p>Welcome to my new blog! I&rsquo;ve rebuilt my personal website from scratch using <a href="https://gohugo.io/">Hugo</a>, a fast static site generator written in Go.</p>
<h2 id="why-hugo">Why Hugo?</h2>
<p>I wanted something minimal, fast, and that gets out of the way. Hugo checks all the boxes:</p>
<ul>
<li><strong>Blazing fast builds</strong> — the entire site builds in under 100ms</li>
<li><strong>Markdown-first</strong> — I write posts in plain markdown files</li>
<li><strong>Zero JavaScript</strong> — the site ships pure HTML and CSS</li>
<li><strong>Built-in features</strong> — syntax highlighting, RSS feeds, sitemaps, all out of the box</li>
</ul>
<h2 id="the-design">The Design</h2>
<p>The design is inspired by the <a href="https://probberechts.github.io/hexo-theme-cactus/">Cactus Dark</a> theme — a minimalist, terminal-inspired aesthetic with monospace typography and a dark color scheme. I built the theme from scratch for full control.</p></description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Building a PDF Translation Pipeline</title>
|
||||||
|
<link>http://localhost:1313/posts/pdf-translation-pipeline/</link>
|
||||||
|
<pubDate>Wed, 11 Feb 2026 00:00:00 +0000</pubDate>
|
||||||
|
<guid>http://localhost:1313/posts/pdf-translation-pipeline/</guid>
|
||||||
|
<description><p>Recently, I needed to translate a PDF document from Hindi to English. Sounds simple enough, right? Turns out, it&rsquo;s a surprisingly deep rabbit hole.</p>
<h2 id="the-pipeline">The Pipeline</h2>
<p>The approach I settled on follows this flow:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">PDF → Images → OCR → Translation → Rendered Images → PDF
</span></span></code></pre></div><p>Each step has its own set of challenges:</p>
<ol>
<li><strong>PDF to Images</strong>: Convert each page to a high-DPI image for better OCR accuracy</li>
<li><strong>OCR</strong>: Extract text with position data using PaddleOCR</li>
<li><strong>Translation</strong>: Run extracted text through NLLB (No Language Left Behind)</li>
<li><strong>Rendering</strong>: Paint translated text back onto the original image</li>
<li><strong>Assembly</strong>: Combine rendered images back into a PDF</li>
</ol>
<h2 id="lessons-learned">Lessons Learned</h2>
<ul>
<li><strong>DPI matters a lot</strong> — bumping from 150 to 300 DPI dramatically improved OCR accuracy for Hindi text</li>
<li><strong>Font rendering is hard</strong> — getting translated text to fit in the same bounding boxes required careful font size calculation</li>
<li><strong>Fallback strategies</strong> — TrOCR as a fallback when PaddleOCR fails on certain text regions</li>
</ul>
<p>The code is messy but it works. Sometimes that&rsquo;s enough.</p></description>
|
||||||
|
</item>
|
||||||
|
</channel>
|
||||||
|
</rss>
|
||||||
94
public/posts/pdf-translation-pipeline/index.html
Normal file
|
|
@ -0,0 +1,94 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-us">
|
||||||
|
<head><script src="/livereload.js?mindelay=10&v=2&port=1313&path=livereload" data-no-instant defer></script><meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="description" content="How I built a pipeline to translate Hindi PDFs to English using OCR and neural machine translation.">
|
||||||
|
<meta name="author" content="Divyam Ahuja">
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Building a PDF Translation Pipeline">
|
||||||
|
<meta property="og:description" content="How I built a pipeline to translate Hindi PDFs to English using OCR and neural machine translation.">
|
||||||
|
<meta property="og:type" content="article">
|
||||||
|
<meta property="og:url" content="http://localhost:1313/posts/pdf-translation-pipeline/">
|
||||||
|
<meta property="og:site_name" content="Divyam Ahuja">
|
||||||
|
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="Building a PDF Translation Pipeline">
|
||||||
|
<meta name="twitter:description" content="How I built a pipeline to translate Hindi PDFs to English using OCR and neural machine translation.">
|
||||||
|
|
||||||
|
<title>Building a PDF Translation Pipeline · Divyam Ahuja</title>
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="http://localhost:1313/css/style.min.86de29e37fd55fb8581ee5569d0e766097f2718b8f8029e4e11c87973d24a5b1.css">
|
||||||
|
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="site-wrapper"><header class="site-header">
|
||||||
|
<div class="site-header-inner">
|
||||||
|
<a href="/" class="site-title">Divyam Ahuja</a>
|
||||||
|
<nav class="site-nav"><a href="/">Home</a><span class="nav-separator">|</span><a href="/posts/">Blog</a><span class="nav-separator">|</span><a href="/projects/">Projects</a><span class="nav-separator">|</span><a href="/resume/">Resume</a></nav>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
<article>
|
||||||
|
<div class="post-header">
|
||||||
|
<h1>Building a PDF Translation Pipeline</h1>
|
||||||
|
<div class="post-meta">
|
||||||
|
<span>DIVYAM AHUJA</span>
|
||||||
|
<span class="separator">·</span>
|
||||||
|
<time datetime="2026-02-11">11 Feb 2026</time>
|
||||||
|
<span class="separator">|</span>
|
||||||
|
<span class="post-tags">
|
||||||
|
<a href="http://localhost:1313/tags/python/" class="post-tag">#python</a>
|
||||||
|
<a href="http://localhost:1313/tags/ocr/" class="post-tag">#ocr</a>
|
||||||
|
<a href="http://localhost:1313/tags/ml/" class="post-tag">#ml</a>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="post-content">
|
||||||
|
<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>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<hr>
|
||||||
|
<a href="/" class="back-link">← back to home</a>
|
||||||
|
</article>
|
||||||
|
</main>
|
||||||
|
</div><footer class="site-footer">
|
||||||
|
<div class="site-wrapper">
|
||||||
|
<div class="site-footer-inner">
|
||||||
|
<div class="footer-copyright">
|
||||||
|
© 2026 Divyam Ahuja
|
||||||
|
</div>
|
||||||
|
<div class="social-icons"><a href="https://github.com/ahujadivyam" target="_blank" rel="noopener noreferrer" title="GitHub"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0112 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z"/></svg></a><a href="https://linkedin.com/in/ahujadivyam" target="_blank" rel="noopener noreferrer" title="LinkedIn"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg></a><a href="https://git.divyam.dev" target="_blank" rel="noopener noreferrer" title="Git"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M6 3a3 3 0 1 0 0 6 3 3 0 0 0 0-6zM3 6a3 3 0 0 1 5.83-.75h4.34A3.001 3.001 0 0 1 18 6a3 3 0 0 1-4.83.75H8.83A3.001 3.001 0 0 1 3 6zm3 9a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm0 3a3 3 0 0 1 0-6 3 3 0 0 1 0 6zm12-3a3 3 0 1 0 0 6 3 3 0 0 0 0-6z" fill="none"/><path d="M6 2a4 4 0 0 0-1 7.874V14.126A4.002 4.002 0 0 0 6 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 6 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm12-12a4 4 0 0 0-1 7.874v2.252A4.002 4.002 0 0 0 18 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 18 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4z"/></svg></a><a href="mailto:ahujadivyam@gmail.com" target="_blank" rel="noopener noreferrer" title="Email"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M1.5 8.67v8.58a3 3 0 003 3h15a3 3 0 003-3V8.67l-8.928 5.493a3 3 0 01-3.144 0L1.5 8.67z"/><path d="M22.5 6.908V6.75a3 3 0 00-3-3h-15a3 3 0 00-3 3v.158l9.714 5.978a1.5 1.5 0 001.572 0L22.5 6.908z"/></svg></a><a href="/index.xml" title="RSS Feed">
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M19.199 24C19.199 13.467 10.533 4.8 0 4.8V0c13.165 0 24 10.835 24 24h-4.801zM3.291 17.415c1.814 0 3.293 1.479 3.293 3.295 0 1.813-1.485 3.29-3.301 3.29C1.47 24 0 22.526 0 20.71s1.475-3.295 3.291-3.295zM15.909 24h-4.665c0-6.169-5.075-11.245-11.244-11.245V8.09c8.727 0 15.909 7.184 15.909 15.91z"/></svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
110
public/projects/index.html
Normal file
|
|
@ -0,0 +1,110 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-us">
|
||||||
|
<head><script src="/livereload.js?mindelay=10&v=2&port=1313&path=livereload" data-no-instant defer></script><meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="description" content="Things I've built">
|
||||||
|
<meta name="author" content="Divyam Ahuja">
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Projects">
|
||||||
|
<meta property="og:description" content="Things I've built">
|
||||||
|
<meta property="og:type" content="article">
|
||||||
|
<meta property="og:url" content="http://localhost:1313/projects/">
|
||||||
|
<meta property="og:site_name" content="Divyam Ahuja">
|
||||||
|
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="Projects">
|
||||||
|
<meta name="twitter:description" content="Things I've built">
|
||||||
|
|
||||||
|
<title>Projects · Divyam Ahuja</title>
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="http://localhost:1313/css/style.min.86de29e37fd55fb8581ee5569d0e766097f2718b8f8029e4e11c87973d24a5b1.css">
|
||||||
|
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="site-wrapper"><header class="site-header">
|
||||||
|
<div class="site-header-inner">
|
||||||
|
<a href="/" class="site-title">Divyam Ahuja</a>
|
||||||
|
<nav class="site-nav"><a href="/">Home</a><span class="nav-separator">|</span><a href="/posts/">Blog</a><span class="nav-separator">|</span><a href="/projects/">Projects</a><span class="nav-separator">|</span><a href="/resume/">Resume</a></nav>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
<h1 class="page-title">Projects</h1>
|
||||||
|
<p class="projects-intro">Things I've built or contributed to.</p>
|
||||||
|
|
||||||
|
<div class="projects-grid">
|
||||||
|
<a href="https://git.divyam.dev/divyam/fastbin" class="project-card" target="_blank" rel="noopener noreferrer">
|
||||||
|
<div class="project-card-inner">
|
||||||
|
<h3 class="project-card-name">fastbin</h3>
|
||||||
|
<p class="project-card-desc">A high-performance code sharing webapp with real-time updates</p>
|
||||||
|
<div class="project-card-tags">
|
||||||
|
<span class="project-card-tag">Go</span>
|
||||||
|
<span class="project-card-tag">HTMX</span>
|
||||||
|
<span class="project-card-tag">gRPC</span>
|
||||||
|
<span class="project-card-tag">PostgreSQL</span>
|
||||||
|
<span class="project-card-tag">Docker</span>
|
||||||
|
<span class="project-card-tag">Kubernetes</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<span class="project-card-arrow">→</span>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/ahujadivyam/gsoc-chromium-freequeue" class="project-card" target="_blank" rel="noopener noreferrer">
|
||||||
|
<div class="project-card-inner">
|
||||||
|
<h3 class="project-card-name">gsoc-chromium-freequeue</h3>
|
||||||
|
<p class="project-card-desc">Lock-free ring buffer library built during Google Summer of Code for Chromium's audio processing</p>
|
||||||
|
<div class="project-card-tags">
|
||||||
|
<span class="project-card-tag">C++</span>
|
||||||
|
<span class="project-card-tag">WebAudio</span>
|
||||||
|
<span class="project-card-tag">WebAssembly</span>
|
||||||
|
<span class="project-card-tag">WebWorkers</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<span class="project-card-arrow">→</span>
|
||||||
|
</a>
|
||||||
|
<div class="project-card">
|
||||||
|
<div class="project-card-inner">
|
||||||
|
<h3 class="project-card-name">Homelab</h3>
|
||||||
|
<p class="project-card-desc">Self-hosted high-availability infrastructure on Raspberry Pi 5</p>
|
||||||
|
<div class="project-card-tags">
|
||||||
|
<span class="project-card-tag">Kubernetes</span>
|
||||||
|
<span class="project-card-tag">WireGuard</span>
|
||||||
|
<span class="project-card-tag">Rancher</span>
|
||||||
|
<span class="project-card-tag">MetalLB</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a href="https://git.divyam.dev/divyam/divyam.dev" class="project-card" target="_blank" rel="noopener noreferrer">
|
||||||
|
<div class="project-card-inner">
|
||||||
|
<h3 class="project-card-name">divyam.dev</h3>
|
||||||
|
<p class="project-card-desc">This minimal, high-performance portfolio and blog</p>
|
||||||
|
<div class="project-card-tags">
|
||||||
|
<span class="project-card-tag">Hugo</span>
|
||||||
|
<span class="project-card-tag">CSS</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<span class="project-card-arrow">→</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</div><footer class="site-footer">
|
||||||
|
<div class="site-wrapper">
|
||||||
|
<div class="site-footer-inner">
|
||||||
|
<div class="footer-copyright">
|
||||||
|
© 2026 Divyam Ahuja
|
||||||
|
</div>
|
||||||
|
<div class="social-icons"><a href="https://github.com/ahujadivyam" target="_blank" rel="noopener noreferrer" title="GitHub"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0112 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z"/></svg></a><a href="https://linkedin.com/in/ahujadivyam" target="_blank" rel="noopener noreferrer" title="LinkedIn"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg></a><a href="https://git.divyam.dev" target="_blank" rel="noopener noreferrer" title="Git"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M6 3a3 3 0 1 0 0 6 3 3 0 0 0 0-6zM3 6a3 3 0 0 1 5.83-.75h4.34A3.001 3.001 0 0 1 18 6a3 3 0 0 1-4.83.75H8.83A3.001 3.001 0 0 1 3 6zm3 9a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm0 3a3 3 0 0 1 0-6 3 3 0 0 1 0 6zm12-3a3 3 0 1 0 0 6 3 3 0 0 0 0-6z" fill="none"/><path d="M6 2a4 4 0 0 0-1 7.874V14.126A4.002 4.002 0 0 0 6 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 6 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm12-12a4 4 0 0 0-1 7.874v2.252A4.002 4.002 0 0 0 18 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 18 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4z"/></svg></a><a href="mailto:ahujadivyam@gmail.com" target="_blank" rel="noopener noreferrer" title="Email"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M1.5 8.67v8.58a3 3 0 003 3h15a3 3 0 003-3V8.67l-8.928 5.493a3 3 0 01-3.144 0L1.5 8.67z"/><path d="M22.5 6.908V6.75a3 3 0 00-3-3h-15a3 3 0 00-3 3v.158l9.714 5.978a1.5 1.5 0 001.572 0L22.5 6.908z"/></svg></a><a href="/index.xml" title="RSS Feed">
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M19.199 24C19.199 13.467 10.533 4.8 0 4.8V0c13.165 0 24 10.835 24 24h-4.801zM3.291 17.415c1.814 0 3.293 1.479 3.293 3.295 0 1.813-1.485 3.29-3.301 3.29C1.47 24 0 22.526 0 20.71s1.475-3.295 3.291-3.295zM15.909 24h-4.665c0-6.169-5.075-11.245-11.244-11.245V8.09c8.727 0 15.909 7.184 15.909 15.91z"/></svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
2506
public/resume.pdf
Normal file
203
public/resume/index.html
Normal file
|
|
@ -0,0 +1,203 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-us">
|
||||||
|
<head><script src="/livereload.js?mindelay=10&v=2&port=1313&path=livereload" data-no-instant defer></script><meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="description" content="Divyam Ahuja — Resume">
|
||||||
|
<meta name="author" content="Divyam Ahuja">
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Resume">
|
||||||
|
<meta property="og:description" content="Divyam Ahuja — Resume">
|
||||||
|
<meta property="og:type" content="article">
|
||||||
|
<meta property="og:url" content="http://localhost:1313/resume/">
|
||||||
|
<meta property="og:site_name" content="Divyam Ahuja">
|
||||||
|
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="Resume">
|
||||||
|
<meta name="twitter:description" content="Divyam Ahuja — Resume">
|
||||||
|
|
||||||
|
<title>Resume · Divyam Ahuja</title>
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="http://localhost:1313/css/style.min.86de29e37fd55fb8581ee5569d0e766097f2718b8f8029e4e11c87973d24a5b1.css">
|
||||||
|
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="site-wrapper"><header class="site-header">
|
||||||
|
<div class="site-header-inner">
|
||||||
|
<a href="/" class="site-title">Divyam Ahuja</a>
|
||||||
|
<nav class="site-nav"><a href="/">Home</a><span class="nav-separator">|</span><a href="/posts/">Blog</a><span class="nav-separator">|</span><a href="/projects/">Projects</a><span class="nav-separator">|</span><a href="/resume/">Resume</a></nav>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<main><div class="resume-page">
|
||||||
|
<div class="resume-header">
|
||||||
|
<h1 class="resume-name">Divyam Ahuja</h1>
|
||||||
|
<p class="resume-tagline">Software Engineer</p>
|
||||||
|
<div class="resume-contact">
|
||||||
|
<a href="mailto:ahujadivyam@gmail.com">
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M1.5 8.67v8.58a3 3 0 003 3h15a3 3 0 003-3V8.67l-8.928 5.493a3 3 0 01-3.144 0L1.5 8.67z"/><path d="M22.5 6.908V6.75a3 3 0 00-3-3h-15a3 3 0 00-3 3v.158l9.714 5.978a1.5 1.5 0 001.572 0L22.5 6.908z"/></svg>
|
||||||
|
ahujadivyam@gmail.com
|
||||||
|
</a>
|
||||||
|
<a href="https://divyam.dev" target="_blank">
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z"/></svg>
|
||||||
|
divyam.dev
|
||||||
|
</a>
|
||||||
|
<a href="https://linkedin.com/in/ahujadivyam" target="_blank">
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg>
|
||||||
|
in/ahujadivyam
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="resume-contact">
|
||||||
|
<a href="https://git.divyam.dev/" target="_blank">
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M6 2a4 4 0 0 0-1 7.874V14.126A4.002 4.002 0 0 0 6 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 6 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm12-12a4 4 0 0 0-1 7.874v2.252A4.002 4.002 0 0 0 18 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 18 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4z"/></svg>
|
||||||
|
git.divyam.dev
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/ahujadivyam" target="_blank">
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0112 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z"/></svg>
|
||||||
|
gh/ahujadivyam
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<section class="resume-section">
|
||||||
|
<h2 class="resume-section-title">Experience</h2>
|
||||||
|
<div class="resume-entry">
|
||||||
|
<div class="resume-entry-header">
|
||||||
|
<div>
|
||||||
|
<h3 class="resume-entry-title">Software Engineer</h3>
|
||||||
|
<span class="resume-entry-org">Microsoft · Noida</span>
|
||||||
|
</div>
|
||||||
|
<span class="resume-entry-date">Mar 2025 — Present</span>
|
||||||
|
</div>
|
||||||
|
<div class="resume-tech-stack">Python, JavaScript, TypeScript, Playwright, Telemetry</div>
|
||||||
|
<ul class="resume-entry-details">
|
||||||
|
<li>Build, evaluate, and enhance AI-powered user experiences for the Excel Copilot team.</li>
|
||||||
|
<li>Architected a parallelized automation framework for synthetic data generation and evaluation, boosting pipeline throughput by <strong>5x</strong>.</li>
|
||||||
|
<li>Orchestrated the Responsible AI (RAI) pipeline, executing evaluation runs on new models to guarantee safe and deterministic AI outputs.</li>
|
||||||
|
<li>Acted as on-call Shield Engineer, monitoring pipeline health, triaging partner issues, and driving incident response for critical bugs.</li>
|
||||||
|
<li>Integrated comprehensive telemetry, structured logging, and observability dashboards into pipelines to maintain <strong>>95%</strong> reliability.</li>
|
||||||
|
<li>Engineered autonomous AI agents to automate repetitive tasks and optimize workflow efficiency.</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="resume-entry">
|
||||||
|
<div class="resume-entry-header">
|
||||||
|
<div>
|
||||||
|
<h3 class="resume-entry-title">System Software Designer</h3>
|
||||||
|
<span class="resume-entry-org">Advanced Micro Devices (AMD) · Bangalore</span>
|
||||||
|
</div>
|
||||||
|
<span class="resume-entry-date">Aug 2022 — Feb 2025</span>
|
||||||
|
</div>
|
||||||
|
<div class="resume-tech-stack">C, C++, Java, Python, React.js, JavaScript</div>
|
||||||
|
<ul class="resume-entry-details">
|
||||||
|
<li>Engineered an OpenJDK performance monitoring system, enabling early detection and mitigation of performance degradation.</li>
|
||||||
|
<li>Spearheaded the development of a visualization dashboard and RESTful API for OpenJDK telemetry, increasing data accessibility by <strong>40%</strong>.</li>
|
||||||
|
<li>Automated nightly Java benchmarking and tuning using machine learning models, achieving a <strong>30%</strong> reduction in manual effort.</li>
|
||||||
|
<li>Executed advanced Java tuning techniques, yielding a <strong>2%</strong> performance increase across High Performance Computing (HPC) servers.</li>
|
||||||
|
<li>Refactored and containerized legacy projects for cross-platform compatibility, driving a <strong>90%</strong> reduction in deployment errors.</li>
|
||||||
|
<li>Received the <strong>Spotlight Award</strong> for exceptional contributions to automation and nightly benchmark visualization.</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="resume-entry">
|
||||||
|
<div class="resume-entry-header">
|
||||||
|
<div>
|
||||||
|
<h3 class="resume-entry-title">Google Summer of Code Contributor (Open Source Developer)</h3>
|
||||||
|
<span class="resume-entry-org">Chromium · Remote</span>
|
||||||
|
</div>
|
||||||
|
<span class="resume-entry-date">May 2022 — Aug 2022</span>
|
||||||
|
</div>
|
||||||
|
<div class="resume-tech-stack">JavaScript, TypeScript, C, C++, WebAudio, WebAssembly, WebWorkers</div>
|
||||||
|
<ul class="resume-entry-details">
|
||||||
|
<li>Researched and implemented optimal design patterns integrating the WebAudio API with WebAssembly and WebWorkers.</li>
|
||||||
|
<li>Designed and authored a high-performance, lock-free ring buffer library for real-time audio processing.</li>
|
||||||
|
</ul>
|
||||||
|
<div class="resume-entry-links">
|
||||||
|
<a href="https://github.com/ahujadivyam/gsoc-chromium-freequeue" target="_blank">github.com/ahujadivyam/gsoc-chromium-freequeue</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="resume-section">
|
||||||
|
<h2 class="resume-section-title">Skills</h2>
|
||||||
|
<div class="resume-skills">
|
||||||
|
<div class="resume-skill-group">
|
||||||
|
<h4 class="resume-skill-label">Programming Languages</h4>
|
||||||
|
<span class="resume-skill-items">C/C++, Python, JavaScript/TypeScript, Java, Go (Golang), Bash, PHP</span>
|
||||||
|
</div>
|
||||||
|
<div class="resume-skill-group">
|
||||||
|
<h4 class="resume-skill-label">Frameworks</h4>
|
||||||
|
<span class="resume-skill-items">React.js, Next.js, Express.js, Django, Flask, Node.js</span>
|
||||||
|
</div>
|
||||||
|
<div class="resume-skill-group">
|
||||||
|
<h4 class="resume-skill-label">Tools/Platforms</h4>
|
||||||
|
<span class="resume-skill-items">Git, Docker, Emscripten, UNIX, Linux, POSIX, Shell, Kubernetes, WebAssembly, WordPress</span>
|
||||||
|
</div>
|
||||||
|
<div class="resume-skill-group">
|
||||||
|
<h4 class="resume-skill-label">Databases</h4>
|
||||||
|
<span class="resume-skill-items">MySQL, MongoDB, PostgreSQL, Redis</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="resume-section">
|
||||||
|
<h2 class="resume-section-title">Projects</h2>
|
||||||
|
<div class="resume-entry">
|
||||||
|
<div class="resume-entry-header">
|
||||||
|
<div>
|
||||||
|
<h3 class="resume-entry-title">fastbin: a code sharing webapp</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="resume-tech-stack">HTMX, Go (Golang), gRPC, PostgreSQL, Docker, Kubernetes</div>
|
||||||
|
<div class="resume-entry-links">
|
||||||
|
<a href="https://git.divyam.dev/divyam/fastbin" target="_blank">git.divyam.dev/divyam/fastbin</a>
|
||||||
|
<a href="https://fastbin.lab.divyam.dev" target="_blank">fastbin.lab.divyam.dev</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="resume-entry">
|
||||||
|
<div class="resume-entry-header">
|
||||||
|
<div>
|
||||||
|
<h3 class="resume-entry-title">Homelab</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="resume-tech-stack">Raspberry Pi 5, WireGuard, Kubernetes, Rancher, MetalLB</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="resume-section">
|
||||||
|
<h2 class="resume-section-title">Education</h2>
|
||||||
|
<div class="resume-entry">
|
||||||
|
<div class="resume-entry-header">
|
||||||
|
<div>
|
||||||
|
<h3 class="resume-entry-title">Bachelor of Technology (B.Tech.) Computer Science</h3>
|
||||||
|
<span class="resume-entry-org">Deenbandhu Chhotu Ram University of Science and Technology · Haryana, India</span>
|
||||||
|
</div>
|
||||||
|
<span class="resume-entry-date">Aug 2018 — Aug 2022</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<div class="resume-download">
|
||||||
|
<a href="/resume.pdf" class="resume-download-btn">↓ Download PDF</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</div><footer class="site-footer">
|
||||||
|
<div class="site-wrapper">
|
||||||
|
<div class="site-footer-inner">
|
||||||
|
<div class="footer-copyright">
|
||||||
|
© 2026 Divyam Ahuja
|
||||||
|
</div>
|
||||||
|
<div class="social-icons"><a href="https://github.com/ahujadivyam" target="_blank" rel="noopener noreferrer" title="GitHub"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0112 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z"/></svg></a><a href="https://linkedin.com/in/ahujadivyam" target="_blank" rel="noopener noreferrer" title="LinkedIn"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg></a><a href="https://git.divyam.dev" target="_blank" rel="noopener noreferrer" title="Git"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M6 3a3 3 0 1 0 0 6 3 3 0 0 0 0-6zM3 6a3 3 0 0 1 5.83-.75h4.34A3.001 3.001 0 0 1 18 6a3 3 0 0 1-4.83.75H8.83A3.001 3.001 0 0 1 3 6zm3 9a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm0 3a3 3 0 0 1 0-6 3 3 0 0 1 0 6zm12-3a3 3 0 1 0 0 6 3 3 0 0 0 0-6z" fill="none"/><path d="M6 2a4 4 0 0 0-1 7.874V14.126A4.002 4.002 0 0 0 6 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 6 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm12-12a4 4 0 0 0-1 7.874v2.252A4.002 4.002 0 0 0 18 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 18 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4z"/></svg></a><a href="mailto:ahujadivyam@gmail.com" target="_blank" rel="noopener noreferrer" title="Email"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M1.5 8.67v8.58a3 3 0 003 3h15a3 3 0 003-3V8.67l-8.928 5.493a3 3 0 01-3.144 0L1.5 8.67z"/><path d="M22.5 6.908V6.75a3 3 0 00-3-3h-15a3 3 0 00-3 3v.158l9.714 5.978a1.5 1.5 0 001.572 0L22.5 6.908z"/></svg></a><a href="/index.xml" title="RSS Feed">
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M19.199 24C19.199 13.467 10.533 4.8 0 4.8V0c13.165 0 24 10.835 24 24h-4.801zM3.291 17.415c1.814 0 3.293 1.479 3.293 3.295 0 1.813-1.485 3.29-3.301 3.29C1.47 24 0 22.526 0 20.71s1.475-3.295 3.291-3.295zM15.909 24h-4.665c0-6.169-5.075-11.245-11.244-11.245V8.09c8.727 0 15.909 7.184 15.909 15.91z"/></svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
71
public/sitemap.xml
Normal file
|
|
@ -0,0 +1,71 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||||
|
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
|
||||||
|
xmlns:xhtml="http://www.w3.org/1999/xhtml">
|
||||||
|
<url>
|
||||||
|
<loc>http://localhost:1313/</loc>
|
||||||
|
<lastmod>2026-05-08T00:00:00+00:00</lastmod>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.5</priority>
|
||||||
|
</url><url>
|
||||||
|
<loc>http://localhost:1313/posts/hello-world/</loc>
|
||||||
|
<lastmod>2026-05-08T00:00:00+00:00</lastmod>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.5</priority>
|
||||||
|
</url><url>
|
||||||
|
<loc>http://localhost:1313/tags/hugo/</loc>
|
||||||
|
<lastmod>2026-05-08T00:00:00+00:00</lastmod>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.5</priority>
|
||||||
|
</url><url>
|
||||||
|
<loc>http://localhost:1313/tags/meta/</loc>
|
||||||
|
<lastmod>2026-05-08T00:00:00+00:00</lastmod>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.5</priority>
|
||||||
|
</url><url>
|
||||||
|
<loc>http://localhost:1313/tags/</loc>
|
||||||
|
<lastmod>2026-05-08T00:00:00+00:00</lastmod>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.5</priority>
|
||||||
|
</url><url>
|
||||||
|
<loc>http://localhost:1313/posts/</loc>
|
||||||
|
<lastmod>2026-05-08T00:00:00+00:00</lastmod>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.5</priority>
|
||||||
|
</url><url>
|
||||||
|
<loc>http://localhost:1313/posts/pdf-translation-pipeline/</loc>
|
||||||
|
<lastmod>2026-02-11T00:00:00+00:00</lastmod>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.5</priority>
|
||||||
|
</url><url>
|
||||||
|
<loc>http://localhost:1313/tags/ml/</loc>
|
||||||
|
<lastmod>2026-02-11T00:00:00+00:00</lastmod>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.5</priority>
|
||||||
|
</url><url>
|
||||||
|
<loc>http://localhost:1313/tags/ocr/</loc>
|
||||||
|
<lastmod>2026-02-11T00:00:00+00:00</lastmod>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.5</priority>
|
||||||
|
</url><url>
|
||||||
|
<loc>http://localhost:1313/tags/python/</loc>
|
||||||
|
<lastmod>2026-02-11T00:00:00+00:00</lastmod>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.5</priority>
|
||||||
|
</url><url>
|
||||||
|
<loc>http://localhost:1313/about/</loc>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.5</priority>
|
||||||
|
</url><url>
|
||||||
|
<loc>http://localhost:1313/categories/</loc>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.5</priority>
|
||||||
|
</url><url>
|
||||||
|
<loc>http://localhost:1313/projects/</loc>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.5</priority>
|
||||||
|
</url><url>
|
||||||
|
<loc>http://localhost:1313/resume/</loc>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.5</priority>
|
||||||
|
</url>
|
||||||
|
</urlset>
|
||||||
60
public/tags/hugo/index.html
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-us">
|
||||||
|
<head><script src="/livereload.js?mindelay=10&v=2&port=1313&path=livereload" data-no-instant defer></script><meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="description" content="Software Engineer">
|
||||||
|
<meta name="author" content="Divyam Ahuja">
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Hugo">
|
||||||
|
<meta property="og:description" content="Software Engineer">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:url" content="http://localhost:1313/tags/hugo/">
|
||||||
|
<meta property="og:site_name" content="Divyam Ahuja">
|
||||||
|
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="Hugo">
|
||||||
|
<meta name="twitter:description" content="Software Engineer">
|
||||||
|
|
||||||
|
<title>Hugo · Divyam Ahuja</title>
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="http://localhost:1313/css/style.min.86de29e37fd55fb8581ee5569d0e766097f2718b8f8029e4e11c87973d24a5b1.css">
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="alternate" type="application/rss+xml" href="http://localhost:1313/tags/hugo/index.xml" title="Divyam Ahuja">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="site-wrapper"><header class="site-header">
|
||||||
|
<div class="site-header-inner">
|
||||||
|
<a href="/" class="site-title">Divyam Ahuja</a>
|
||||||
|
<nav class="site-nav"><a href="/">Home</a><span class="nav-separator">|</span><a href="/posts/">Blog</a><span class="nav-separator">|</span><a href="/projects/">Projects</a><span class="nav-separator">|</span><a href="/resume/">Resume</a></nav>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
<h1 class="page-title">Hugo</h1>
|
||||||
|
|
||||||
|
<div class="post-content">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</div><footer class="site-footer">
|
||||||
|
<div class="site-wrapper">
|
||||||
|
<div class="site-footer-inner">
|
||||||
|
<div class="footer-copyright">
|
||||||
|
© 2026 Divyam Ahuja
|
||||||
|
</div>
|
||||||
|
<div class="social-icons"><a href="https://github.com/ahujadivyam" target="_blank" rel="noopener noreferrer" title="GitHub"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0112 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z"/></svg></a><a href="https://linkedin.com/in/ahujadivyam" target="_blank" rel="noopener noreferrer" title="LinkedIn"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg></a><a href="https://git.divyam.dev" target="_blank" rel="noopener noreferrer" title="Git"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M6 3a3 3 0 1 0 0 6 3 3 0 0 0 0-6zM3 6a3 3 0 0 1 5.83-.75h4.34A3.001 3.001 0 0 1 18 6a3 3 0 0 1-4.83.75H8.83A3.001 3.001 0 0 1 3 6zm3 9a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm0 3a3 3 0 0 1 0-6 3 3 0 0 1 0 6zm12-3a3 3 0 1 0 0 6 3 3 0 0 0 0-6z" fill="none"/><path d="M6 2a4 4 0 0 0-1 7.874V14.126A4.002 4.002 0 0 0 6 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 6 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm12-12a4 4 0 0 0-1 7.874v2.252A4.002 4.002 0 0 0 18 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 18 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4z"/></svg></a><a href="mailto:ahujadivyam@gmail.com" target="_blank" rel="noopener noreferrer" title="Email"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M1.5 8.67v8.58a3 3 0 003 3h15a3 3 0 003-3V8.67l-8.928 5.493a3 3 0 01-3.144 0L1.5 8.67z"/><path d="M22.5 6.908V6.75a3 3 0 00-3-3h-15a3 3 0 00-3 3v.158l9.714 5.978a1.5 1.5 0 001.572 0L22.5 6.908z"/></svg></a><a href="/index.xml" title="RSS Feed">
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M19.199 24C19.199 13.467 10.533 4.8 0 4.8V0c13.165 0 24 10.835 24 24h-4.801zM3.291 17.415c1.814 0 3.293 1.479 3.293 3.295 0 1.813-1.485 3.29-3.301 3.29C1.47 24 0 22.526 0 20.71s1.475-3.295 3.291-3.295zM15.909 24h-4.665c0-6.169-5.075-11.245-11.244-11.245V8.09c8.727 0 15.909 7.184 15.909 15.91z"/></svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
19
public/tags/hugo/index.xml
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||||
|
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||||
|
<channel>
|
||||||
|
<title>Hugo on Divyam Ahuja</title>
|
||||||
|
<link>http://localhost:1313/tags/hugo/</link>
|
||||||
|
<description>Recent content in Hugo on Divyam Ahuja</description>
|
||||||
|
<generator>Hugo</generator>
|
||||||
|
<language>en-us</language>
|
||||||
|
<lastBuildDate>Fri, 08 May 2026 00:00:00 +0000</lastBuildDate>
|
||||||
|
<atom:link href="http://localhost:1313/tags/hugo/index.xml" rel="self" type="application/rss+xml" />
|
||||||
|
<item>
|
||||||
|
<title>Hello World</title>
|
||||||
|
<link>http://localhost:1313/posts/hello-world/</link>
|
||||||
|
<pubDate>Fri, 08 May 2026 00:00:00 +0000</pubDate>
|
||||||
|
<guid>http://localhost:1313/posts/hello-world/</guid>
|
||||||
|
<description><p>Welcome to my new blog! I&rsquo;ve rebuilt my personal website from scratch using <a href="https://gohugo.io/">Hugo</a>, a fast static site generator written in Go.</p>
<h2 id="why-hugo">Why Hugo?</h2>
<p>I wanted something minimal, fast, and that gets out of the way. Hugo checks all the boxes:</p>
<ul>
<li><strong>Blazing fast builds</strong> — the entire site builds in under 100ms</li>
<li><strong>Markdown-first</strong> — I write posts in plain markdown files</li>
<li><strong>Zero JavaScript</strong> — the site ships pure HTML and CSS</li>
<li><strong>Built-in features</strong> — syntax highlighting, RSS feeds, sitemaps, all out of the box</li>
</ul>
<h2 id="the-design">The Design</h2>
<p>The design is inspired by the <a href="https://probberechts.github.io/hexo-theme-cactus/">Cactus Dark</a> theme — a minimalist, terminal-inspired aesthetic with monospace typography and a dark color scheme. I built the theme from scratch for full control.</p></description>
|
||||||
|
</item>
|
||||||
|
</channel>
|
||||||
|
</rss>
|
||||||
60
public/tags/index.html
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-us">
|
||||||
|
<head><script src="/livereload.js?mindelay=10&v=2&port=1313&path=livereload" data-no-instant defer></script><meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="description" content="Software Engineer">
|
||||||
|
<meta name="author" content="Divyam Ahuja">
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Tags">
|
||||||
|
<meta property="og:description" content="Software Engineer">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:url" content="http://localhost:1313/tags/">
|
||||||
|
<meta property="og:site_name" content="Divyam Ahuja">
|
||||||
|
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="Tags">
|
||||||
|
<meta name="twitter:description" content="Software Engineer">
|
||||||
|
|
||||||
|
<title>Tags · Divyam Ahuja</title>
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="http://localhost:1313/css/style.min.86de29e37fd55fb8581ee5569d0e766097f2718b8f8029e4e11c87973d24a5b1.css">
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="alternate" type="application/rss+xml" href="http://localhost:1313/tags/index.xml" title="Divyam Ahuja">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="site-wrapper"><header class="site-header">
|
||||||
|
<div class="site-header-inner">
|
||||||
|
<a href="/" class="site-title">Divyam Ahuja</a>
|
||||||
|
<nav class="site-nav"><a href="/">Home</a><span class="nav-separator">|</span><a href="/posts/">Blog</a><span class="nav-separator">|</span><a href="/projects/">Projects</a><span class="nav-separator">|</span><a href="/resume/">Resume</a></nav>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
<h1 class="page-title">Tags</h1>
|
||||||
|
|
||||||
|
<div class="post-content">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</div><footer class="site-footer">
|
||||||
|
<div class="site-wrapper">
|
||||||
|
<div class="site-footer-inner">
|
||||||
|
<div class="footer-copyright">
|
||||||
|
© 2026 Divyam Ahuja
|
||||||
|
</div>
|
||||||
|
<div class="social-icons"><a href="https://github.com/ahujadivyam" target="_blank" rel="noopener noreferrer" title="GitHub"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0112 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z"/></svg></a><a href="https://linkedin.com/in/ahujadivyam" target="_blank" rel="noopener noreferrer" title="LinkedIn"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg></a><a href="https://git.divyam.dev" target="_blank" rel="noopener noreferrer" title="Git"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M6 3a3 3 0 1 0 0 6 3 3 0 0 0 0-6zM3 6a3 3 0 0 1 5.83-.75h4.34A3.001 3.001 0 0 1 18 6a3 3 0 0 1-4.83.75H8.83A3.001 3.001 0 0 1 3 6zm3 9a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm0 3a3 3 0 0 1 0-6 3 3 0 0 1 0 6zm12-3a3 3 0 1 0 0 6 3 3 0 0 0 0-6z" fill="none"/><path d="M6 2a4 4 0 0 0-1 7.874V14.126A4.002 4.002 0 0 0 6 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 6 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm12-12a4 4 0 0 0-1 7.874v2.252A4.002 4.002 0 0 0 18 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 18 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4z"/></svg></a><a href="mailto:ahujadivyam@gmail.com" target="_blank" rel="noopener noreferrer" title="Email"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M1.5 8.67v8.58a3 3 0 003 3h15a3 3 0 003-3V8.67l-8.928 5.493a3 3 0 01-3.144 0L1.5 8.67z"/><path d="M22.5 6.908V6.75a3 3 0 00-3-3h-15a3 3 0 00-3 3v.158l9.714 5.978a1.5 1.5 0 001.572 0L22.5 6.908z"/></svg></a><a href="/index.xml" title="RSS Feed">
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M19.199 24C19.199 13.467 10.533 4.8 0 4.8V0c13.165 0 24 10.835 24 24h-4.801zM3.291 17.415c1.814 0 3.293 1.479 3.293 3.295 0 1.813-1.485 3.29-3.301 3.29C1.47 24 0 22.526 0 20.71s1.475-3.295 3.291-3.295zM15.909 24h-4.665c0-6.169-5.075-11.245-11.244-11.245V8.09c8.727 0 15.909 7.184 15.909 15.91z"/></svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
47
public/tags/index.xml
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||||
|
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||||
|
<channel>
|
||||||
|
<title>Tags on Divyam Ahuja</title>
|
||||||
|
<link>http://localhost:1313/tags/</link>
|
||||||
|
<description>Recent content in Tags on Divyam Ahuja</description>
|
||||||
|
<generator>Hugo</generator>
|
||||||
|
<language>en-us</language>
|
||||||
|
<lastBuildDate>Fri, 08 May 2026 00:00:00 +0000</lastBuildDate>
|
||||||
|
<atom:link href="http://localhost:1313/tags/index.xml" rel="self" type="application/rss+xml" />
|
||||||
|
<item>
|
||||||
|
<title>Hugo</title>
|
||||||
|
<link>http://localhost:1313/tags/hugo/</link>
|
||||||
|
<pubDate>Fri, 08 May 2026 00:00:00 +0000</pubDate>
|
||||||
|
<guid>http://localhost:1313/tags/hugo/</guid>
|
||||||
|
<description></description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Meta</title>
|
||||||
|
<link>http://localhost:1313/tags/meta/</link>
|
||||||
|
<pubDate>Fri, 08 May 2026 00:00:00 +0000</pubDate>
|
||||||
|
<guid>http://localhost:1313/tags/meta/</guid>
|
||||||
|
<description></description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Ml</title>
|
||||||
|
<link>http://localhost:1313/tags/ml/</link>
|
||||||
|
<pubDate>Wed, 11 Feb 2026 00:00:00 +0000</pubDate>
|
||||||
|
<guid>http://localhost:1313/tags/ml/</guid>
|
||||||
|
<description></description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Ocr</title>
|
||||||
|
<link>http://localhost:1313/tags/ocr/</link>
|
||||||
|
<pubDate>Wed, 11 Feb 2026 00:00:00 +0000</pubDate>
|
||||||
|
<guid>http://localhost:1313/tags/ocr/</guid>
|
||||||
|
<description></description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Python</title>
|
||||||
|
<link>http://localhost:1313/tags/python/</link>
|
||||||
|
<pubDate>Wed, 11 Feb 2026 00:00:00 +0000</pubDate>
|
||||||
|
<guid>http://localhost:1313/tags/python/</guid>
|
||||||
|
<description></description>
|
||||||
|
</item>
|
||||||
|
</channel>
|
||||||
|
</rss>
|
||||||
60
public/tags/meta/index.html
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-us">
|
||||||
|
<head><script src="/livereload.js?mindelay=10&v=2&port=1313&path=livereload" data-no-instant defer></script><meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="description" content="Software Engineer">
|
||||||
|
<meta name="author" content="Divyam Ahuja">
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Meta">
|
||||||
|
<meta property="og:description" content="Software Engineer">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:url" content="http://localhost:1313/tags/meta/">
|
||||||
|
<meta property="og:site_name" content="Divyam Ahuja">
|
||||||
|
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="Meta">
|
||||||
|
<meta name="twitter:description" content="Software Engineer">
|
||||||
|
|
||||||
|
<title>Meta · Divyam Ahuja</title>
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="http://localhost:1313/css/style.min.86de29e37fd55fb8581ee5569d0e766097f2718b8f8029e4e11c87973d24a5b1.css">
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="alternate" type="application/rss+xml" href="http://localhost:1313/tags/meta/index.xml" title="Divyam Ahuja">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="site-wrapper"><header class="site-header">
|
||||||
|
<div class="site-header-inner">
|
||||||
|
<a href="/" class="site-title">Divyam Ahuja</a>
|
||||||
|
<nav class="site-nav"><a href="/">Home</a><span class="nav-separator">|</span><a href="/posts/">Blog</a><span class="nav-separator">|</span><a href="/projects/">Projects</a><span class="nav-separator">|</span><a href="/resume/">Resume</a></nav>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
<h1 class="page-title">Meta</h1>
|
||||||
|
|
||||||
|
<div class="post-content">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</div><footer class="site-footer">
|
||||||
|
<div class="site-wrapper">
|
||||||
|
<div class="site-footer-inner">
|
||||||
|
<div class="footer-copyright">
|
||||||
|
© 2026 Divyam Ahuja
|
||||||
|
</div>
|
||||||
|
<div class="social-icons"><a href="https://github.com/ahujadivyam" target="_blank" rel="noopener noreferrer" title="GitHub"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0112 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z"/></svg></a><a href="https://linkedin.com/in/ahujadivyam" target="_blank" rel="noopener noreferrer" title="LinkedIn"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg></a><a href="https://git.divyam.dev" target="_blank" rel="noopener noreferrer" title="Git"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M6 3a3 3 0 1 0 0 6 3 3 0 0 0 0-6zM3 6a3 3 0 0 1 5.83-.75h4.34A3.001 3.001 0 0 1 18 6a3 3 0 0 1-4.83.75H8.83A3.001 3.001 0 0 1 3 6zm3 9a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm0 3a3 3 0 0 1 0-6 3 3 0 0 1 0 6zm12-3a3 3 0 1 0 0 6 3 3 0 0 0 0-6z" fill="none"/><path d="M6 2a4 4 0 0 0-1 7.874V14.126A4.002 4.002 0 0 0 6 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 6 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm12-12a4 4 0 0 0-1 7.874v2.252A4.002 4.002 0 0 0 18 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 18 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4z"/></svg></a><a href="mailto:ahujadivyam@gmail.com" target="_blank" rel="noopener noreferrer" title="Email"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M1.5 8.67v8.58a3 3 0 003 3h15a3 3 0 003-3V8.67l-8.928 5.493a3 3 0 01-3.144 0L1.5 8.67z"/><path d="M22.5 6.908V6.75a3 3 0 00-3-3h-15a3 3 0 00-3 3v.158l9.714 5.978a1.5 1.5 0 001.572 0L22.5 6.908z"/></svg></a><a href="/index.xml" title="RSS Feed">
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M19.199 24C19.199 13.467 10.533 4.8 0 4.8V0c13.165 0 24 10.835 24 24h-4.801zM3.291 17.415c1.814 0 3.293 1.479 3.293 3.295 0 1.813-1.485 3.29-3.301 3.29C1.47 24 0 22.526 0 20.71s1.475-3.295 3.291-3.295zM15.909 24h-4.665c0-6.169-5.075-11.245-11.244-11.245V8.09c8.727 0 15.909 7.184 15.909 15.91z"/></svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
19
public/tags/meta/index.xml
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||||
|
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||||
|
<channel>
|
||||||
|
<title>Meta on Divyam Ahuja</title>
|
||||||
|
<link>http://localhost:1313/tags/meta/</link>
|
||||||
|
<description>Recent content in Meta on Divyam Ahuja</description>
|
||||||
|
<generator>Hugo</generator>
|
||||||
|
<language>en-us</language>
|
||||||
|
<lastBuildDate>Fri, 08 May 2026 00:00:00 +0000</lastBuildDate>
|
||||||
|
<atom:link href="http://localhost:1313/tags/meta/index.xml" rel="self" type="application/rss+xml" />
|
||||||
|
<item>
|
||||||
|
<title>Hello World</title>
|
||||||
|
<link>http://localhost:1313/posts/hello-world/</link>
|
||||||
|
<pubDate>Fri, 08 May 2026 00:00:00 +0000</pubDate>
|
||||||
|
<guid>http://localhost:1313/posts/hello-world/</guid>
|
||||||
|
<description><p>Welcome to my new blog! I&rsquo;ve rebuilt my personal website from scratch using <a href="https://gohugo.io/">Hugo</a>, a fast static site generator written in Go.</p>
<h2 id="why-hugo">Why Hugo?</h2>
<p>I wanted something minimal, fast, and that gets out of the way. Hugo checks all the boxes:</p>
<ul>
<li><strong>Blazing fast builds</strong> — the entire site builds in under 100ms</li>
<li><strong>Markdown-first</strong> — I write posts in plain markdown files</li>
<li><strong>Zero JavaScript</strong> — the site ships pure HTML and CSS</li>
<li><strong>Built-in features</strong> — syntax highlighting, RSS feeds, sitemaps, all out of the box</li>
</ul>
<h2 id="the-design">The Design</h2>
<p>The design is inspired by the <a href="https://probberechts.github.io/hexo-theme-cactus/">Cactus Dark</a> theme — a minimalist, terminal-inspired aesthetic with monospace typography and a dark color scheme. I built the theme from scratch for full control.</p></description>
|
||||||
|
</item>
|
||||||
|
</channel>
|
||||||
|
</rss>
|
||||||
60
public/tags/ml/index.html
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-us">
|
||||||
|
<head><script src="/livereload.js?mindelay=10&v=2&port=1313&path=livereload" data-no-instant defer></script><meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="description" content="Software Engineer">
|
||||||
|
<meta name="author" content="Divyam Ahuja">
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Ml">
|
||||||
|
<meta property="og:description" content="Software Engineer">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:url" content="http://localhost:1313/tags/ml/">
|
||||||
|
<meta property="og:site_name" content="Divyam Ahuja">
|
||||||
|
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="Ml">
|
||||||
|
<meta name="twitter:description" content="Software Engineer">
|
||||||
|
|
||||||
|
<title>Ml · Divyam Ahuja</title>
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="http://localhost:1313/css/style.min.86de29e37fd55fb8581ee5569d0e766097f2718b8f8029e4e11c87973d24a5b1.css">
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="alternate" type="application/rss+xml" href="http://localhost:1313/tags/ml/index.xml" title="Divyam Ahuja">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="site-wrapper"><header class="site-header">
|
||||||
|
<div class="site-header-inner">
|
||||||
|
<a href="/" class="site-title">Divyam Ahuja</a>
|
||||||
|
<nav class="site-nav"><a href="/">Home</a><span class="nav-separator">|</span><a href="/posts/">Blog</a><span class="nav-separator">|</span><a href="/projects/">Projects</a><span class="nav-separator">|</span><a href="/resume/">Resume</a></nav>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
<h1 class="page-title">Ml</h1>
|
||||||
|
|
||||||
|
<div class="post-content">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</div><footer class="site-footer">
|
||||||
|
<div class="site-wrapper">
|
||||||
|
<div class="site-footer-inner">
|
||||||
|
<div class="footer-copyright">
|
||||||
|
© 2026 Divyam Ahuja
|
||||||
|
</div>
|
||||||
|
<div class="social-icons"><a href="https://github.com/ahujadivyam" target="_blank" rel="noopener noreferrer" title="GitHub"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0112 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z"/></svg></a><a href="https://linkedin.com/in/ahujadivyam" target="_blank" rel="noopener noreferrer" title="LinkedIn"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg></a><a href="https://git.divyam.dev" target="_blank" rel="noopener noreferrer" title="Git"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M6 3a3 3 0 1 0 0 6 3 3 0 0 0 0-6zM3 6a3 3 0 0 1 5.83-.75h4.34A3.001 3.001 0 0 1 18 6a3 3 0 0 1-4.83.75H8.83A3.001 3.001 0 0 1 3 6zm3 9a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm0 3a3 3 0 0 1 0-6 3 3 0 0 1 0 6zm12-3a3 3 0 1 0 0 6 3 3 0 0 0 0-6z" fill="none"/><path d="M6 2a4 4 0 0 0-1 7.874V14.126A4.002 4.002 0 0 0 6 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 6 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm12-12a4 4 0 0 0-1 7.874v2.252A4.002 4.002 0 0 0 18 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 18 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4z"/></svg></a><a href="mailto:ahujadivyam@gmail.com" target="_blank" rel="noopener noreferrer" title="Email"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M1.5 8.67v8.58a3 3 0 003 3h15a3 3 0 003-3V8.67l-8.928 5.493a3 3 0 01-3.144 0L1.5 8.67z"/><path d="M22.5 6.908V6.75a3 3 0 00-3-3h-15a3 3 0 00-3 3v.158l9.714 5.978a1.5 1.5 0 001.572 0L22.5 6.908z"/></svg></a><a href="/index.xml" title="RSS Feed">
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M19.199 24C19.199 13.467 10.533 4.8 0 4.8V0c13.165 0 24 10.835 24 24h-4.801zM3.291 17.415c1.814 0 3.293 1.479 3.293 3.295 0 1.813-1.485 3.29-3.301 3.29C1.47 24 0 22.526 0 20.71s1.475-3.295 3.291-3.295zM15.909 24h-4.665c0-6.169-5.075-11.245-11.244-11.245V8.09c8.727 0 15.909 7.184 15.909 15.91z"/></svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
19
public/tags/ml/index.xml
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||||
|
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||||
|
<channel>
|
||||||
|
<title>Ml on Divyam Ahuja</title>
|
||||||
|
<link>http://localhost:1313/tags/ml/</link>
|
||||||
|
<description>Recent content in Ml on Divyam Ahuja</description>
|
||||||
|
<generator>Hugo</generator>
|
||||||
|
<language>en-us</language>
|
||||||
|
<lastBuildDate>Wed, 11 Feb 2026 00:00:00 +0000</lastBuildDate>
|
||||||
|
<atom:link href="http://localhost:1313/tags/ml/index.xml" rel="self" type="application/rss+xml" />
|
||||||
|
<item>
|
||||||
|
<title>Building a PDF Translation Pipeline</title>
|
||||||
|
<link>http://localhost:1313/posts/pdf-translation-pipeline/</link>
|
||||||
|
<pubDate>Wed, 11 Feb 2026 00:00:00 +0000</pubDate>
|
||||||
|
<guid>http://localhost:1313/posts/pdf-translation-pipeline/</guid>
|
||||||
|
<description><p>Recently, I needed to translate a PDF document from Hindi to English. Sounds simple enough, right? Turns out, it&rsquo;s a surprisingly deep rabbit hole.</p>
<h2 id="the-pipeline">The Pipeline</h2>
<p>The approach I settled on follows this flow:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">PDF → Images → OCR → Translation → Rendered Images → PDF
</span></span></code></pre></div><p>Each step has its own set of challenges:</p>
<ol>
<li><strong>PDF to Images</strong>: Convert each page to a high-DPI image for better OCR accuracy</li>
<li><strong>OCR</strong>: Extract text with position data using PaddleOCR</li>
<li><strong>Translation</strong>: Run extracted text through NLLB (No Language Left Behind)</li>
<li><strong>Rendering</strong>: Paint translated text back onto the original image</li>
<li><strong>Assembly</strong>: Combine rendered images back into a PDF</li>
</ol>
<h2 id="lessons-learned">Lessons Learned</h2>
<ul>
<li><strong>DPI matters a lot</strong> — bumping from 150 to 300 DPI dramatically improved OCR accuracy for Hindi text</li>
<li><strong>Font rendering is hard</strong> — getting translated text to fit in the same bounding boxes required careful font size calculation</li>
<li><strong>Fallback strategies</strong> — TrOCR as a fallback when PaddleOCR fails on certain text regions</li>
</ul>
<p>The code is messy but it works. Sometimes that&rsquo;s enough.</p></description>
|
||||||
|
</item>
|
||||||
|
</channel>
|
||||||
|
</rss>
|
||||||
60
public/tags/ocr/index.html
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-us">
|
||||||
|
<head><script src="/livereload.js?mindelay=10&v=2&port=1313&path=livereload" data-no-instant defer></script><meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="description" content="Software Engineer">
|
||||||
|
<meta name="author" content="Divyam Ahuja">
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Ocr">
|
||||||
|
<meta property="og:description" content="Software Engineer">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:url" content="http://localhost:1313/tags/ocr/">
|
||||||
|
<meta property="og:site_name" content="Divyam Ahuja">
|
||||||
|
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="Ocr">
|
||||||
|
<meta name="twitter:description" content="Software Engineer">
|
||||||
|
|
||||||
|
<title>Ocr · Divyam Ahuja</title>
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="http://localhost:1313/css/style.min.86de29e37fd55fb8581ee5569d0e766097f2718b8f8029e4e11c87973d24a5b1.css">
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="alternate" type="application/rss+xml" href="http://localhost:1313/tags/ocr/index.xml" title="Divyam Ahuja">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="site-wrapper"><header class="site-header">
|
||||||
|
<div class="site-header-inner">
|
||||||
|
<a href="/" class="site-title">Divyam Ahuja</a>
|
||||||
|
<nav class="site-nav"><a href="/">Home</a><span class="nav-separator">|</span><a href="/posts/">Blog</a><span class="nav-separator">|</span><a href="/projects/">Projects</a><span class="nav-separator">|</span><a href="/resume/">Resume</a></nav>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
<h1 class="page-title">Ocr</h1>
|
||||||
|
|
||||||
|
<div class="post-content">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</div><footer class="site-footer">
|
||||||
|
<div class="site-wrapper">
|
||||||
|
<div class="site-footer-inner">
|
||||||
|
<div class="footer-copyright">
|
||||||
|
© 2026 Divyam Ahuja
|
||||||
|
</div>
|
||||||
|
<div class="social-icons"><a href="https://github.com/ahujadivyam" target="_blank" rel="noopener noreferrer" title="GitHub"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0112 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z"/></svg></a><a href="https://linkedin.com/in/ahujadivyam" target="_blank" rel="noopener noreferrer" title="LinkedIn"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg></a><a href="https://git.divyam.dev" target="_blank" rel="noopener noreferrer" title="Git"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M6 3a3 3 0 1 0 0 6 3 3 0 0 0 0-6zM3 6a3 3 0 0 1 5.83-.75h4.34A3.001 3.001 0 0 1 18 6a3 3 0 0 1-4.83.75H8.83A3.001 3.001 0 0 1 3 6zm3 9a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm0 3a3 3 0 0 1 0-6 3 3 0 0 1 0 6zm12-3a3 3 0 1 0 0 6 3 3 0 0 0 0-6z" fill="none"/><path d="M6 2a4 4 0 0 0-1 7.874V14.126A4.002 4.002 0 0 0 6 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 6 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm12-12a4 4 0 0 0-1 7.874v2.252A4.002 4.002 0 0 0 18 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 18 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4z"/></svg></a><a href="mailto:ahujadivyam@gmail.com" target="_blank" rel="noopener noreferrer" title="Email"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M1.5 8.67v8.58a3 3 0 003 3h15a3 3 0 003-3V8.67l-8.928 5.493a3 3 0 01-3.144 0L1.5 8.67z"/><path d="M22.5 6.908V6.75a3 3 0 00-3-3h-15a3 3 0 00-3 3v.158l9.714 5.978a1.5 1.5 0 001.572 0L22.5 6.908z"/></svg></a><a href="/index.xml" title="RSS Feed">
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M19.199 24C19.199 13.467 10.533 4.8 0 4.8V0c13.165 0 24 10.835 24 24h-4.801zM3.291 17.415c1.814 0 3.293 1.479 3.293 3.295 0 1.813-1.485 3.29-3.301 3.29C1.47 24 0 22.526 0 20.71s1.475-3.295 3.291-3.295zM15.909 24h-4.665c0-6.169-5.075-11.245-11.244-11.245V8.09c8.727 0 15.909 7.184 15.909 15.91z"/></svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
19
public/tags/ocr/index.xml
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||||
|
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||||
|
<channel>
|
||||||
|
<title>Ocr on Divyam Ahuja</title>
|
||||||
|
<link>http://localhost:1313/tags/ocr/</link>
|
||||||
|
<description>Recent content in Ocr on Divyam Ahuja</description>
|
||||||
|
<generator>Hugo</generator>
|
||||||
|
<language>en-us</language>
|
||||||
|
<lastBuildDate>Wed, 11 Feb 2026 00:00:00 +0000</lastBuildDate>
|
||||||
|
<atom:link href="http://localhost:1313/tags/ocr/index.xml" rel="self" type="application/rss+xml" />
|
||||||
|
<item>
|
||||||
|
<title>Building a PDF Translation Pipeline</title>
|
||||||
|
<link>http://localhost:1313/posts/pdf-translation-pipeline/</link>
|
||||||
|
<pubDate>Wed, 11 Feb 2026 00:00:00 +0000</pubDate>
|
||||||
|
<guid>http://localhost:1313/posts/pdf-translation-pipeline/</guid>
|
||||||
|
<description><p>Recently, I needed to translate a PDF document from Hindi to English. Sounds simple enough, right? Turns out, it&rsquo;s a surprisingly deep rabbit hole.</p>
<h2 id="the-pipeline">The Pipeline</h2>
<p>The approach I settled on follows this flow:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">PDF → Images → OCR → Translation → Rendered Images → PDF
</span></span></code></pre></div><p>Each step has its own set of challenges:</p>
<ol>
<li><strong>PDF to Images</strong>: Convert each page to a high-DPI image for better OCR accuracy</li>
<li><strong>OCR</strong>: Extract text with position data using PaddleOCR</li>
<li><strong>Translation</strong>: Run extracted text through NLLB (No Language Left Behind)</li>
<li><strong>Rendering</strong>: Paint translated text back onto the original image</li>
<li><strong>Assembly</strong>: Combine rendered images back into a PDF</li>
</ol>
<h2 id="lessons-learned">Lessons Learned</h2>
<ul>
<li><strong>DPI matters a lot</strong> — bumping from 150 to 300 DPI dramatically improved OCR accuracy for Hindi text</li>
<li><strong>Font rendering is hard</strong> — getting translated text to fit in the same bounding boxes required careful font size calculation</li>
<li><strong>Fallback strategies</strong> — TrOCR as a fallback when PaddleOCR fails on certain text regions</li>
</ul>
<p>The code is messy but it works. Sometimes that&rsquo;s enough.</p></description>
|
||||||
|
</item>
|
||||||
|
</channel>
|
||||||
|
</rss>
|
||||||
60
public/tags/python/index.html
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-us">
|
||||||
|
<head><script src="/livereload.js?mindelay=10&v=2&port=1313&path=livereload" data-no-instant defer></script><meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="description" content="Software Engineer">
|
||||||
|
<meta name="author" content="Divyam Ahuja">
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Python">
|
||||||
|
<meta property="og:description" content="Software Engineer">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:url" content="http://localhost:1313/tags/python/">
|
||||||
|
<meta property="og:site_name" content="Divyam Ahuja">
|
||||||
|
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="Python">
|
||||||
|
<meta name="twitter:description" content="Software Engineer">
|
||||||
|
|
||||||
|
<title>Python · Divyam Ahuja</title>
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="http://localhost:1313/css/style.min.86de29e37fd55fb8581ee5569d0e766097f2718b8f8029e4e11c87973d24a5b1.css">
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="alternate" type="application/rss+xml" href="http://localhost:1313/tags/python/index.xml" title="Divyam Ahuja">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="site-wrapper"><header class="site-header">
|
||||||
|
<div class="site-header-inner">
|
||||||
|
<a href="/" class="site-title">Divyam Ahuja</a>
|
||||||
|
<nav class="site-nav"><a href="/">Home</a><span class="nav-separator">|</span><a href="/posts/">Blog</a><span class="nav-separator">|</span><a href="/projects/">Projects</a><span class="nav-separator">|</span><a href="/resume/">Resume</a></nav>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
<h1 class="page-title">Python</h1>
|
||||||
|
|
||||||
|
<div class="post-content">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</div><footer class="site-footer">
|
||||||
|
<div class="site-wrapper">
|
||||||
|
<div class="site-footer-inner">
|
||||||
|
<div class="footer-copyright">
|
||||||
|
© 2026 Divyam Ahuja
|
||||||
|
</div>
|
||||||
|
<div class="social-icons"><a href="https://github.com/ahujadivyam" target="_blank" rel="noopener noreferrer" title="GitHub"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0112 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z"/></svg></a><a href="https://linkedin.com/in/ahujadivyam" target="_blank" rel="noopener noreferrer" title="LinkedIn"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg></a><a href="https://git.divyam.dev" target="_blank" rel="noopener noreferrer" title="Git"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M6 3a3 3 0 1 0 0 6 3 3 0 0 0 0-6zM3 6a3 3 0 0 1 5.83-.75h4.34A3.001 3.001 0 0 1 18 6a3 3 0 0 1-4.83.75H8.83A3.001 3.001 0 0 1 3 6zm3 9a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm0 3a3 3 0 0 1 0-6 3 3 0 0 1 0 6zm12-3a3 3 0 1 0 0 6 3 3 0 0 0 0-6z" fill="none"/><path d="M6 2a4 4 0 0 0-1 7.874V14.126A4.002 4.002 0 0 0 6 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 6 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm12-12a4 4 0 0 0-1 7.874v2.252A4.002 4.002 0 0 0 18 22a4 4 0 0 0 1-7.874V9.874A4.002 4.002 0 0 0 18 2zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm0 12a2 2 0 1 1 0 4 2 2 0 0 1 0-4z"/></svg></a><a href="mailto:ahujadivyam@gmail.com" target="_blank" rel="noopener noreferrer" title="Email"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M1.5 8.67v8.58a3 3 0 003 3h15a3 3 0 003-3V8.67l-8.928 5.493a3 3 0 01-3.144 0L1.5 8.67z"/><path d="M22.5 6.908V6.75a3 3 0 00-3-3h-15a3 3 0 00-3 3v.158l9.714 5.978a1.5 1.5 0 001.572 0L22.5 6.908z"/></svg></a><a href="/index.xml" title="RSS Feed">
|
||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M19.199 24C19.199 13.467 10.533 4.8 0 4.8V0c13.165 0 24 10.835 24 24h-4.801zM3.291 17.415c1.814 0 3.293 1.479 3.293 3.295 0 1.813-1.485 3.29-3.301 3.29C1.47 24 0 22.526 0 20.71s1.475-3.295 3.291-3.295zM15.909 24h-4.665c0-6.169-5.075-11.245-11.244-11.245V8.09c8.727 0 15.909 7.184 15.909 15.91z"/></svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
19
public/tags/python/index.xml
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||||
|
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||||
|
<channel>
|
||||||
|
<title>Python on Divyam Ahuja</title>
|
||||||
|
<link>http://localhost:1313/tags/python/</link>
|
||||||
|
<description>Recent content in Python on Divyam Ahuja</description>
|
||||||
|
<generator>Hugo</generator>
|
||||||
|
<language>en-us</language>
|
||||||
|
<lastBuildDate>Wed, 11 Feb 2026 00:00:00 +0000</lastBuildDate>
|
||||||
|
<atom:link href="http://localhost:1313/tags/python/index.xml" rel="self" type="application/rss+xml" />
|
||||||
|
<item>
|
||||||
|
<title>Building a PDF Translation Pipeline</title>
|
||||||
|
<link>http://localhost:1313/posts/pdf-translation-pipeline/</link>
|
||||||
|
<pubDate>Wed, 11 Feb 2026 00:00:00 +0000</pubDate>
|
||||||
|
<guid>http://localhost:1313/posts/pdf-translation-pipeline/</guid>
|
||||||
|
<description><p>Recently, I needed to translate a PDF document from Hindi to English. Sounds simple enough, right? Turns out, it&rsquo;s a surprisingly deep rabbit hole.</p>
<h2 id="the-pipeline">The Pipeline</h2>
<p>The approach I settled on follows this flow:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">PDF → Images → OCR → Translation → Rendered Images → PDF
</span></span></code></pre></div><p>Each step has its own set of challenges:</p>
<ol>
<li><strong>PDF to Images</strong>: Convert each page to a high-DPI image for better OCR accuracy</li>
<li><strong>OCR</strong>: Extract text with position data using PaddleOCR</li>
<li><strong>Translation</strong>: Run extracted text through NLLB (No Language Left Behind)</li>
<li><strong>Rendering</strong>: Paint translated text back onto the original image</li>
<li><strong>Assembly</strong>: Combine rendered images back into a PDF</li>
</ol>
<h2 id="lessons-learned">Lessons Learned</h2>
<ul>
<li><strong>DPI matters a lot</strong> — bumping from 150 to 300 DPI dramatically improved OCR accuracy for Hindi text</li>
<li><strong>Font rendering is hard</strong> — getting translated text to fit in the same bounding boxes required careful font size calculation</li>
<li><strong>Fallback strategies</strong> — TrOCR as a fallback when PaddleOCR fails on certain text regions</li>
</ul>
<p>The code is messy but it works. Sometimes that&rsquo;s enough.</p></description>
|
||||||
|
</item>
|
||||||
|
</channel>
|
||||||
|
</rss>
|
||||||
BIN
resume/Comfortaa-VariableFont_wght.ttf
Normal file
BIN
resume/SourceSans3-Black.ttf
Normal file
BIN
resume/SourceSans3-BlackItalic.ttf
Normal file
BIN
resume/SourceSans3-Bold.ttf
Normal file
BIN
resume/SourceSans3-BoldItalic.ttf
Normal file
BIN
resume/SourceSans3-ExtraBold.ttf
Normal file
BIN
resume/SourceSans3-ExtraBoldItalic.ttf
Normal file
BIN
resume/SourceSans3-ExtraLight.ttf
Normal file
BIN
resume/SourceSans3-ExtraLightItalic.ttf
Normal file
BIN
resume/SourceSans3-Italic.ttf
Normal file
BIN
resume/SourceSans3-Light.ttf
Normal file
BIN
resume/SourceSans3-LightItalic.ttf
Normal file
BIN
resume/SourceSans3-Medium.ttf
Normal file
BIN
resume/SourceSans3-MediumItalic.ttf
Normal file
BIN
resume/SourceSans3-Regular.ttf
Normal file
BIN
resume/SourceSans3-SemiBold.ttf
Normal file
BIN
resume/SourceSans3-SemiBoldItalic.ttf
Normal file
BIN
resume/Ubuntu-Bold.ttf
Normal file
BIN
resume/Ubuntu-Medium.ttf
Normal file
BIN
resume/Ubuntu-Regular.ttf
Normal file
4
resume/icons/email.svg
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M3.75 5.25L3 6V18L3.75 18.75H20.25L21 18V6L20.25 5.25H3.75ZM4.5 7.6955V17.25H19.5V7.69525L11.9999 14.5136L4.5 7.6955ZM18.3099 6.75H5.68986L11.9999 12.4864L18.3099 6.75Z" fill="#080341"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 466 B |
1
resume/icons/git.svg
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="92pt" height="92pt" viewBox="0 0 78 78"><path fill="#100f0d" transform="translate(10 10) rotate(-45 29 29)" d="M5,58c-2.76142,0 -5,-2.23858 -5,-5v-48c0,-2.76142 2.23858,-5 5,-5h33v12.54404c-2.06553,0.94801 -3.5,3.03446 -3.5,5.45596c0,0.73514 0.13221,1.43941 0.37415,2.09031l-15.28384,15.28384c-0.6509,-0.24194 -1.35517,-0.37415 -2.09031,-0.37415c-3.31371,0 -6,2.68629 -6,6c0,3.31371 2.68629,6 6,6c3.31371,0 6,-2.68629 6,-6c0,-0.73514 -0.13221,-1.43941 -0.37415,-2.09031l14.87415,-14.87415l0,11.50851c-2.06553,0.94801 -3.5,3.03446 -3.5,5.45596c0,3.31371 2.68629,6 6,6c3.31371,0 6,-2.68629 6,-6c0,-2.42149 -1.43447,-4.50795 -3.5,-5.45596l0,-12.08808c2.06553,-0.94801 3.5,-3.03446 3.5,-5.45596c0,-2.42149 -1.43447,-4.50795 -3.5,-5.45596l0,-12.54404h10c2.76142,0 5,2.23858 5,5v48c0,2.76142 -2.23858,5 -5,5z"/></svg>
|
||||||
|
After Width: | Height: | Size: 858 B |
5
resume/icons/github.svg
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M9.29183 21V18.4407L9.3255 16.6219C9.36595 16.0561 9.58639 15.5228 9.94907 15.11C9.95438 15.1039 9.95972 15.0979 9.9651 15.0919C9.9791 15.0763 9.96988 15.0511 9.94907 15.0485V15.0485C7.52554 14.746 5.0005 13.7227 5.0005 9.26749C4.9847 8.17021 5.3427 7.10648 6.00437 6.27215C6.02752 6.24297 6.05103 6.21406 6.07492 6.18545V6.18545C6.10601 6.1482 6.11618 6.09772 6.10194 6.05134C6.10107 6.04853 6.10021 6.04571 6.09935 6.04289C6.0832 5.9899 6.06804 5.93666 6.05388 5.88321C5.81065 4.96474 5.86295 3.98363 6.20527 3.09818C6.20779 3.09164 6.21034 3.08511 6.2129 3.07858C6.22568 3.04599 6.25251 3.02108 6.28698 3.01493V3.01493C6.50189 2.97661 7.37036 2.92534 9.03298 4.07346C9.08473 4.10919 9.13724 4.14609 9.19053 4.18418V4.18418C9.22901 4.21168 9.27794 4.22011 9.32344 4.20716C9.32487 4.20675 9.32631 4.20634 9.32774 4.20593C9.41699 4.18056 9.50648 4.15649 9.59617 4.1337C11.1766 3.73226 12.8234 3.73226 14.4038 4.1337C14.4889 4.1553 14.5737 4.17807 14.6584 4.20199C14.6602 4.20252 14.6621 4.20304 14.6639 4.20356C14.7174 4.21872 14.7749 4.20882 14.8202 4.17653V4.17653C14.8698 4.14114 14.9187 4.10679 14.967 4.07346C16.6257 2.92776 17.4894 2.9764 17.7053 3.01469V3.01469C17.7404 3.02092 17.7678 3.04628 17.781 3.07946C17.7827 3.08373 17.7843 3.08799 17.786 3.09226C18.1341 3.97811 18.1894 4.96214 17.946 5.88321C17.9315 5.93811 17.9159 5.9928 17.8993 6.04723V6.04723C17.8843 6.09618 17.8951 6.14942 17.9278 6.18875C17.9289 6.18998 17.9299 6.19121 17.9309 6.19245C17.9528 6.21877 17.9744 6.24534 17.9956 6.27215C18.6573 7.10648 19.0153 8.17021 18.9995 9.26749C18.9995 13.747 16.4565 14.7435 14.0214 15.015V15.015C14.0073 15.0165 14.001 15.0334 14.0105 15.0439C14.0141 15.0479 14.0178 15.0519 14.0214 15.0559C14.2671 15.3296 14.4577 15.6544 14.5811 16.0103C14.7101 16.3824 14.7626 16.7797 14.7351 17.1754V21" stroke="#323232" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M4 17C4.36915 17.0523 4.72159 17.1883 5.03065 17.3975C5.3397 17.6068 5.59726 17.8838 5.7838 18.2078C5.94231 18.4962 6.15601 18.7504 6.41264 18.9557C6.66927 19.161 6.96379 19.3135 7.27929 19.4043C7.59478 19.4952 7.92504 19.5226 8.25112 19.485C8.5772 19.4475 8.89268 19.3457 9.17946 19.1855" stroke="#323232" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.5 KiB |
6
resume/icons/linkedin.svg
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg fill="#000000" width="800px" height="800px" viewBox="-5.5 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<title>linkedin</title>
|
||||||
|
<path d="M0 8.219v15.563c0 1.469 1.156 2.625 2.625 2.625h15.563c0.719 0 1.406-0.344 1.844-0.781 0.469-0.469 0.781-1.063 0.781-1.844v-15.563c0-1.469-1.156-2.625-2.625-2.625h-15.563c-0.781 0-1.375 0.313-1.844 0.781-0.438 0.438-0.781 1.125-0.781 1.844zM2.813 10.281c0-1 0.813-1.875 1.813-1.875 1.031 0 1.875 0.875 1.875 1.875 0 1.031-0.844 1.844-1.875 1.844-1 0-1.813-0.813-1.813-1.844zM7.844 23.125v-9.531c0-0.219 0.219-0.406 0.375-0.406h2.656c0.375 0 0.375 0.438 0.375 0.719 0.75-0.75 1.719-0.938 2.719-0.938 2.438 0 4 1.156 4 3.719v6.438c0 0.219-0.188 0.406-0.375 0.406h-2.75c-0.219 0-0.375-0.219-0.375-0.406v-5.813c0-0.969-0.281-1.5-1.375-1.5-1.375 0-1.719 0.906-1.719 2.125v5.188c0 0.219-0.219 0.406-0.438 0.406h-2.719c-0.156 0-0.375-0.219-0.375-0.406zM2.875 23.125v-9.531c0-0.219 0.219-0.406 0.375-0.406h2.719c0.25 0 0.406 0.156 0.406 0.406v9.531c0 0.219-0.188 0.406-0.406 0.406h-2.719c-0.188 0-0.375-0.219-0.375-0.406z"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
3
resume/icons/phone.svg
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M6.62 10.79C8.06 13.62 10.38 15.94 13.21 17.38L15.41 15.18C15.69 14.9 16.08 14.82 16.43 14.93C17.55 15.3 18.75 15.5 20 15.5C20.2652 15.5 20.5196 15.6054 20.7071 15.7929C20.8946 15.9804 21 16.2348 21 16.5V20C21 20.2652 20.8946 20.5196 20.7071 20.7071C20.5196 20.8946 20.2652 21 20 21C15.4913 21 11.1673 19.2089 7.97918 16.0208C4.79107 12.8327 3 8.50868 3 4C3 3.73478 3.10536 3.48043 3.29289 3.29289C3.48043 3.10536 3.73478 3 4 3H7.5C7.76522 3 8.01957 3.10536 8.20711 3.29289C8.39464 3.48043 8.5 3.73478 8.5 4C8.5 5.25 8.7 6.45 9.07 7.57C9.18 7.92 9.1 8.31 8.82 8.59L6.62 10.79Z" fill="black"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 708 B |
2
resume/icons/website.svg
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
<?xml version="1.0" ?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg fill="#000000" width="800px" height="800px" viewBox="0 0 512 512" id="_x30_1" version="1.1" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M256,0C114.615,0,0,114.615,0,256s114.615,256,256,256s256-114.615,256-256S397.385,0,256,0z M418.275,146h-46.667 c-5.365-22.513-12.324-43.213-20.587-61.514c15.786,8.776,30.449,19.797,43.572,32.921C403.463,126.277,411.367,135.854,418.275,146 z M452,256c0,17.108-2.191,33.877-6.414,50h-64.034c1.601-16.172,2.448-32.887,2.448-50s-0.847-33.828-2.448-50h64.034 C449.809,222.123,452,238.892,452,256z M256,452c-5.2,0-21.048-10.221-36.844-41.813c-6.543-13.087-12.158-27.994-16.752-44.187 h107.191c-4.594,16.192-10.208,31.1-16.752,44.187C277.048,441.779,261.2,452,256,452z M190.813,306 c-1.847-16.247-2.813-33.029-2.813-50s0.966-33.753,2.813-50h130.374c1.847,16.247,2.813,33.029,2.813,50s-0.966,33.753-2.813,50 H190.813z M60,256c0-17.108,2.191-33.877,6.414-50h64.034c-1.601,16.172-2.448,32.887-2.448,50s0.847,33.828,2.448,50H66.414 C62.191,289.877,60,273.108,60,256z M256,60c5.2,0,21.048,10.221,36.844,41.813c6.543,13.087,12.158,27.994,16.752,44.187H202.404 c4.594-16.192,10.208-31.1,16.752-44.187C234.952,70.221,250.8,60,256,60z M160.979,84.486c-8.264,18.301-15.222,39-20.587,61.514 H93.725c6.909-10.146,14.812-19.723,23.682-28.593C130.531,104.283,145.193,93.262,160.979,84.486z M93.725,366h46.667 c5.365,22.513,12.324,43.213,20.587,61.514c-15.786-8.776-30.449-19.797-43.572-32.921C108.537,385.723,100.633,376.146,93.725,366z M351.021,427.514c8.264-18.301,15.222-39,20.587-61.514h46.667c-6.909,10.146-14.812,19.723-23.682,28.593 C381.469,407.717,366.807,418.738,351.021,427.514z"/></svg>
|
||||||
|
After Width: | Height: | Size: 1.8 KiB |
175
resume/main.typ
Normal file
|
|
@ -0,0 +1,175 @@
|
||||||
|
// Resume template — reads from ../data/resume.yaml
|
||||||
|
// Build: typst compile --root . --font-path resume/ resume/main.typ static/resume.pdf
|
||||||
|
|
||||||
|
#let data = yaml("../data/resume.yaml")
|
||||||
|
|
||||||
|
#set page(paper: "a4", margin: (x: 0.5in, y: 0.4in))
|
||||||
|
#set document(title: data.name + "'s Resume", author: data.name)
|
||||||
|
#set par(leading: 0.5em)
|
||||||
|
#set text(font: "Source Sans 3", size: 10pt)
|
||||||
|
#set underline(offset: 2.5pt)
|
||||||
|
#show heading: set text(weight: "semibold")
|
||||||
|
#show heading: it => { v(4pt); it; v(2pt) }
|
||||||
|
|
||||||
|
// --- Markdown bold **text** → Typst bold *text* ---
|
||||||
|
#let md(s) = {
|
||||||
|
let converted = s.replace(regex("\*\*(.+?)\*\*"), m => "*" + m.captures.at(0) + "*")
|
||||||
|
eval(converted, mode: "markup")
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- Icon helper ---
|
||||||
|
#let icon(name, shift: 1.5pt) = {
|
||||||
|
box(
|
||||||
|
baseline: shift,
|
||||||
|
height: 10pt,
|
||||||
|
image("icons/" + name + ".svg", alt: name)
|
||||||
|
)
|
||||||
|
h(2pt)
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- Links bar ---
|
||||||
|
#let linksBar(links) = {
|
||||||
|
let icon = icon.with(shift: 2.5pt)
|
||||||
|
links.map(l => {
|
||||||
|
icon(l.icon)
|
||||||
|
if "display" in l.keys() {
|
||||||
|
link(l.url)[#{l.display}]
|
||||||
|
} else {
|
||||||
|
link(l.url)
|
||||||
|
}
|
||||||
|
}).join(h(5pt))
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- Work experience entry ---
|
||||||
|
#let workExperience(body, company: "", role: "", start: "", end: "", location: "", stack: ()) = {
|
||||||
|
grid(
|
||||||
|
columns: (1fr, auto),
|
||||||
|
row-gutter: (0.5em, ),
|
||||||
|
align(left)[
|
||||||
|
#set text(weight: "semibold")
|
||||||
|
#company
|
||||||
|
],
|
||||||
|
align(right)[
|
||||||
|
#location
|
||||||
|
],
|
||||||
|
align(left)[
|
||||||
|
#set text(weight: "semibold")
|
||||||
|
#role
|
||||||
|
],
|
||||||
|
align(left)[
|
||||||
|
#start - #end
|
||||||
|
],
|
||||||
|
if stack.len() > 0 {
|
||||||
|
grid.cell(colspan: 2, align: left)[
|
||||||
|
#set text()
|
||||||
|
Tech Stack: #stack.join(", ")
|
||||||
|
]
|
||||||
|
}
|
||||||
|
)
|
||||||
|
body
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- Project entry ---
|
||||||
|
#let project(body, name: "", stack: ()) = {
|
||||||
|
text(weight: "semibold")[#name] + if stack.len() > 0 {
|
||||||
|
[ | #stack.join(", ")]
|
||||||
|
}
|
||||||
|
body
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- Education entry ---
|
||||||
|
#let educationQualification(body, school: "", course: "", start: "", end: "", location: "") = {
|
||||||
|
grid(
|
||||||
|
columns: (1fr, auto),
|
||||||
|
row-gutter: (0.5em, ),
|
||||||
|
align(left)[
|
||||||
|
#set text(weight: "semibold")
|
||||||
|
#school
|
||||||
|
],
|
||||||
|
align(right)[
|
||||||
|
#location
|
||||||
|
],
|
||||||
|
align(left)[
|
||||||
|
#set text(weight: "semibold")
|
||||||
|
#course
|
||||||
|
],
|
||||||
|
align(left)[
|
||||||
|
#start - #end
|
||||||
|
]
|
||||||
|
)
|
||||||
|
body
|
||||||
|
}
|
||||||
|
|
||||||
|
// =============================================
|
||||||
|
// RENDER
|
||||||
|
// =============================================
|
||||||
|
|
||||||
|
// --- Header ---
|
||||||
|
#text(size: 28pt, weight: "semibold")[#data.name] \
|
||||||
|
#v(9pt, weak: true)
|
||||||
|
#text(size: 14pt)[#data.role]
|
||||||
|
|
||||||
|
// Contact links — first row
|
||||||
|
#linksBar((
|
||||||
|
(icon: "phone", url: data.contact.phone.url, display: data.contact.phone.display),
|
||||||
|
(icon: "email", url: data.contact.email.url),
|
||||||
|
(icon: "website", url: data.contact.website.url, display: data.contact.website.display),
|
||||||
|
(icon: "linkedin", url: data.contact.linkedin.url, display: data.contact.linkedin.display),
|
||||||
|
))
|
||||||
|
#linebreak()
|
||||||
|
// Contact links — second row
|
||||||
|
#linksBar((
|
||||||
|
(icon: "git", url: data.contact.git.url, display: data.contact.git.display),
|
||||||
|
(icon: "github", url: data.contact.github.url, display: data.contact.github.display),
|
||||||
|
))
|
||||||
|
#line(length: 100%)
|
||||||
|
|
||||||
|
// --- Experience ---
|
||||||
|
= Experience
|
||||||
|
|
||||||
|
#for exp in data.experience {
|
||||||
|
workExperience(
|
||||||
|
company: exp.company,
|
||||||
|
role: exp.role,
|
||||||
|
start: exp.start,
|
||||||
|
end: exp.end,
|
||||||
|
location: exp.location,
|
||||||
|
stack: exp.at("stack", default: ()),
|
||||||
|
)[
|
||||||
|
#for bullet in exp.at("bullets", default: ()) {
|
||||||
|
[- #md(bullet)]
|
||||||
|
}
|
||||||
|
#for l in exp.at("links", default: ()) {
|
||||||
|
[- #underline(link(l.url)[#l.display])]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- Skills ---
|
||||||
|
= Skills
|
||||||
|
#for skill in data.skills {
|
||||||
|
[#text(weight: "semibold")[#skill.type]: #skill.items.join(", ") \ ]
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- Projects ---
|
||||||
|
= Projects
|
||||||
|
#for p in data.projects {
|
||||||
|
project(name: p.name, stack: p.at("stack", default: ()))[
|
||||||
|
#let links = p.at("links", default: ())
|
||||||
|
#if links.len() > 0 {
|
||||||
|
[- #links.map(l => underline(link(l.url)[#l.display])).join(", ")]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- Education ---
|
||||||
|
= Education
|
||||||
|
#for edu in data.education {
|
||||||
|
educationQualification(
|
||||||
|
school: edu.school,
|
||||||
|
course: edu.course,
|
||||||
|
location: edu.location,
|
||||||
|
start: edu.start,
|
||||||
|
end: edu.end,
|
||||||
|
)[]
|
||||||
|
}
|
||||||
4
static/avatar.png
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200">
|
||||||
|
<circle cx="100" cy="100" r="100" fill="#282a2e"/>
|
||||||
|
<text x="100" y="115" font-family="monospace" font-size="72" font-weight="700" fill="#2bbc8a" text-anchor="middle">DA</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 250 B |
4
static/favicon.svg
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
|
||||||
|
<rect width="100" height="100" rx="12" fill="#1d1f21"/>
|
||||||
|
<text x="50" y="68" font-family="monospace" font-size="52" font-weight="700" fill="#2bbc8a" text-anchor="middle">D</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 252 B |