Merge pull request #2 from Mihir-Null/claude/miterm-redesign-cleanup-vhd49u

Claude/miterm redesign cleanup vhd49u
pull/59/head
Mihir Talati 3 weeks ago committed by GitHub
commit 7d3808bf52
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -0,0 +1,39 @@
# Build the static export and publish it to the Mihir-Null.github.io repo,
# which serves GitHub Pages (custom domain nullis.me) from its docs/ folder.
# MiTerm is the canonical source; github.io holds build output only.
#
# REQUIRED SECRET: GH_PAGES_DEPLOY_TOKEN
# A fine-grained PAT (or classic repo-scoped token) with Contents: write on
# Mihir-Null/Mihir-Null.github.io. Add it under this repo's
# Settings → Secrets and variables → Actions. Until it is set, the deploy job
# fails (harmlessly — it only runs on main); the site keeps serving the last
# published build. See docs/decisions/0002-deploy-topology.org.
name: deploy
on:
push:
branches: [main]
workflow_dispatch:
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies
run: yarn install --frozen-lockfile
- name: Build static export (regenerates resume.json + resume.html first)
run: yarn export
- name: Publish to github.io/docs
uses: peaceiris/actions-gh-pages@v4
with:
personal_token: ${{ secrets.GH_PAGES_DEPLOY_TOKEN }}
external_repository: Mihir-Null/Mihir-Null.github.io
publish_branch: main
publish_dir: ./out
destination_dir: docs
cname: nullis.me
full_commit_message: 'Deploy from MiTerm ${{ github.sha }}'

@ -1,12 +1,24 @@
# Drift canary for the résumé declared mirror (praxis: Mirrors and Canaries).
# Fails if resume.json is out of sync with its canonical source resume.org.
# Drift canary for the résumé declared mirrors (praxis: Mirrors and Canaries).
# Fails if resume.json or public/resume.html is out of sync with resume.org.
name: resume-canary
on:
push:
paths: ['resume.org', 'resume.json', 'scripts/org-to-json.mjs']
paths:
- 'resume.org'
- 'resume.json'
- 'public/resume.html'
- 'resume.template.html'
- 'scripts/org-to-json.mjs'
- 'scripts/build-resume-html.mjs'
pull_request:
paths: ['resume.org', 'resume.json', 'scripts/org-to-json.mjs']
paths:
- 'resume.org'
- 'resume.json'
- 'public/resume.html'
- 'resume.template.html'
- 'scripts/org-to-json.mjs'
- 'scripts/build-resume-html.mjs'
jobs:
check:
@ -18,3 +30,5 @@ jobs:
node-version: '20'
- name: Verify resume.json matches resume.org
run: node scripts/org-to-json.mjs resume.org resume.json --check
- name: Verify public/resume.html matches resume.json
run: node scripts/build-resume-html.mjs --check

@ -1,21 +1,12 @@
{
"readmeUrl": "https://raw.githubusercontent.com/cveinnt/cveinnt/master/README.md",
"title": "LiveTerm",
"name": "John Doe",
"ascii": "liveterm",
"social": {
"github": "github",
"linkedin": "linkedin"
},
"email": "contact@email.com",
"ps1_hostname": "liveterm",
"ps1_username": "visitor",
"repo": "https://github.com/Cveinnt/LiveTerm",
"resume_url": "https://upload.wikimedia.org/wikipedia/commons/c/cc/Resume.pdf",
"donate_urls": {
"paypal": "https://paypal.me/cveinnt",
"patreon": "https://patreon.com/cveinnt"
},
"readmeUrl": "https://raw.githubusercontent.com/Mihir-Null/Mihir-Null/main/README.md",
"title": "Mihir Null",
"ascii": "MiTerm",
"ps1_hostname": "MiTerm",
"ps1_username": "MihirTalati",
"theme": "gruvbox",
"repo": "https://github.com/Mihir-Null",
"resume_url": "/resume.html",
"colors": {
"light": {
"background": "#FBF1C9",

@ -0,0 +1,43 @@
:PROPERTIES:
:ID: 97d6eebf-f0a1-4001-a30f-9c06d01a1f3c
:END:
#+TITLE: ADR 0002 — Deploy Topology: MiTerm → github.io
#+FILETAGS: :adr:miterm:deploy:
Status: accepted (2026-07-16)
Deciders: Mihir Talati (navigator), agent (driver)
* Context
ADR 0001 set MiTerm as the canonical app and Mihir-Null.github.io as build
output only. The site is served by GitHub Pages from ~Mihir-Null.github.io~'s
~docs/~ folder on ~main~, at the custom domain nullis.me.
* Decision
MiTerm builds a static export (~yarn export~~out/~) and a GitHub Action
publishes it into ~Mihir-Null.github.io/docs~ on every push to ~main~. The
github.io repo keeps only served artifacts (~docs/~, ~CNAME~, ~.well-known/~,
~LICENSE~, ~README~); its former Next.js source is removed.
- Mechanism: ~.github/workflows/deploy.yml~ uses
~peaceiris/actions-gh-pages@v4~ with ~external_repository~, publishing
~./out~ to ~docs/~ and writing ~CNAME: nullis.me~.
- The résumé mirrors (resume.json, public/resume.html) regenerate during
~yarn export~ via ~prebuild~, so a deploy always reflects resume.org.
* Operational dependency (ACTION REQUIRED)
The cross-repo push needs a token MiTerm's Actions can use:
- Create a fine-grained PAT with *Contents: write* on
Mihir-Null/Mihir-Null.github.io (or a classic repo-scoped token).
- Add it to MiTerm under Settings → Secrets and variables → Actions as
~GH_PAGES_DEPLOY_TOKEN~.
- Confirm Pages on github.io is set to *Deploy from a branch → main → /docs*.
Until the secret exists the deploy job fails harmlessly; the last published
build keeps serving.
* Consequences
- One source, one deploy path; the github.io repo stops drifting because it no
longer holds source.
- A one-time manual export seeded github.io/docs with the redesigned build so
the change is reviewable without waiting on the token.
- Vercel config (~vercel.json~) is retained for optional preview deploys of the
canonical app; it does not affect the nullis.me production path.

@ -8,12 +8,13 @@
"email": "contact@wensenwu.com"
},
"scripts": {
"resume:build": "node scripts/org-to-json.mjs resume.org resume.json",
"resume:check": "node scripts/org-to-json.mjs resume.org resume.json --check",
"resume:build": "node scripts/org-to-json.mjs resume.org resume.json && node scripts/build-resume-html.mjs",
"resume:check": "node scripts/org-to-json.mjs resume.org resume.json --check && node scripts/build-resume-html.mjs --check",
"prebuild": "yarn resume:build",
"predev": "yarn resume:build",
"dev": "next dev",
"build": "next build",
"export": "next build && next export -o out && touch out/.nojekyll",
"start": "next start",
"lint": "next lint",
"prepare": "husky install"

@ -0,0 +1 @@
nullis.me

@ -0,0 +1,640 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Mihir Talati Resume</title>
<style>
/* Gruvbox dark palette (matches the terminal theme). */
:root {
--content-max-width: 960px;
--primary-text: #ebdbb2;
--secondary-text: #a89984;
--accent: #d79921;
--accent-bright: #fabd2f;
--card-bg: #32302f;
--card-border: rgba(215, 153, 33, 0.3);
--page-bg: radial-gradient(circle at top, #32302f 0%, #1d2021 60%);
--tag-bg: rgba(215, 153, 33, 0.12);
--tag-border: rgba(215, 153, 33, 0.4);
--filter-border: rgba(168, 153, 132, 0.4);
--filter-focus: rgba(215, 153, 33, 0.55);
--glass-highlight: rgba(235, 219, 178, 0.05);
}
* {
box-sizing: border-box;
}
body {
margin: 0;
font-family: 'IBM Plex Mono', 'Fira Code', ui-monospace, SFMono-Regular,
Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
background: #1d2021;
background-image: var(--page-bg);
color: var(--primary-text);
line-height: 1.65;
letter-spacing: 0.01em;
position: relative;
overflow-x: hidden;
min-height: 100vh;
}
.container {
max-width: var(--content-max-width);
margin: 0 auto;
padding: 64px 32px 96px;
}
header {
text-align: center;
margin-bottom: 56px;
}
header h1 {
margin: 0;
font-size: 2.6rem;
letter-spacing: 0.1em;
text-transform: uppercase;
color: #fbf1c7;
}
header p {
margin: 12px 0 0;
color: var(--secondary-text);
font-size: 1.05rem;
}
section + section {
margin-top: 56px;
}
.section-title {
font-size: 1.2rem;
font-weight: 700;
letter-spacing: 0.18em;
text-transform: uppercase;
color: var(--accent);
margin-bottom: 20px;
}
.card {
position: relative;
border-radius: 20px;
padding: 32px 36px;
background: var(--card-bg);
border: 1px solid var(--card-border);
box-shadow: 0 1px 0 var(--glass-highlight),
0 20px 40px rgba(0, 0, 0, 0.35);
}
.card::after {
content: '';
position: absolute;
inset: 12px;
border-radius: 14px;
border: 1px solid rgba(235, 219, 178, 0.05);
pointer-events: none;
}
.card + .card {
margin-top: 28px;
}
.card-header {
display: flex;
flex-wrap: wrap;
gap: 12px 16px;
align-items: baseline;
justify-content: space-between;
margin-bottom: 20px;
position: relative;
z-index: 1;
}
.card-title {
margin: 0;
font-size: 1.2rem;
font-weight: 600;
letter-spacing: 0.04em;
color: #fbf1c7;
}
.card-subtitle {
margin: 0;
font-weight: 500;
color: var(--secondary-text);
}
.card-meta {
text-align: right;
color: var(--secondary-text);
font-size: 0.95rem;
}
.meta-line {
display: block;
}
.tag-list {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin: 0 0 20px;
padding: 0;
list-style: none;
position: relative;
z-index: 1;
}
.tag {
display: inline-flex;
align-items: center;
padding: 5px 14px;
border-radius: 999px;
border: 1px solid var(--tag-border);
background: var(--tag-bg);
color: var(--accent-bright);
font-size: 0.85rem;
font-weight: 600;
letter-spacing: 0.02em;
}
ul.bullet-list {
margin: 0;
padding-left: 22px;
position: relative;
z-index: 1;
}
ul.bullet-list li {
margin-bottom: 12px;
color: var(--primary-text);
}
ul.bullet-list li:last-child {
margin-bottom: 0;
}
.education-grid {
display: grid;
gap: 32px;
}
.scholarships {
margin-top: 20px;
padding-top: 18px;
border-top: 1px solid rgba(168, 153, 132, 0.24);
}
.scholarships-title {
font-weight: 600;
margin: 0 0 10px;
color: var(--secondary-text);
letter-spacing: 0.08em;
text-transform: uppercase;
font-size: 0.75rem;
}
.courses-card {
background: linear-gradient(160deg, #32302f 0%, #1d2021 70%);
border-radius: 24px;
padding: 36px;
border: 1px solid rgba(215, 153, 33, 0.35);
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.35);
position: relative;
overflow: hidden;
}
.filter-label {
display: block;
font-weight: 600;
letter-spacing: 0.18em;
text-transform: uppercase;
font-size: 0.75rem;
color: var(--secondary-text);
margin-bottom: 8px;
position: relative;
z-index: 1;
}
.filter-input {
width: 100%;
padding: 14px 18px;
border-radius: 12px;
border: 1px solid var(--filter-border);
font-size: 1rem;
background: #1d2021;
color: var(--primary-text);
transition: border-color 0.2s ease, box-shadow 0.2s ease;
position: relative;
z-index: 1;
}
.filter-input::placeholder {
color: rgba(168, 153, 132, 0.6);
}
.filter-input:focus {
outline: none;
border-color: var(--filter-focus);
box-shadow: 0 0 0 4px rgba(215, 153, 33, 0.18);
}
.courses-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
gap: 14px;
margin-top: 26px;
position: relative;
z-index: 1;
}
.course-pill {
background: #3c3836;
border-radius: 16px;
padding: 12px 16px;
border: 1px solid rgba(215, 153, 33, 0.35);
font-weight: 500;
color: var(--primary-text);
box-shadow: 0 12px 24px rgba(0, 0, 0, 0.3);
transition: transform 0.15s ease, box-shadow 0.15s ease,
border-color 0.15s ease;
}
.course-pill:hover {
transform: translateY(-2px);
border-color: rgba(215, 153, 33, 0.65);
box-shadow: 0 16px 32px rgba(0, 0, 0, 0.4);
}
.course-pill.hidden {
display: none;
}
.empty-state {
display: none;
margin-top: 24px;
padding: 18px;
border-radius: 14px;
background: rgba(40, 40, 40, 0.8);
border: 1px dashed rgba(215, 153, 33, 0.5);
color: var(--secondary-text);
text-align: center;
font-weight: 500;
position: relative;
z-index: 1;
}
a {
color: var(--accent);
}
@media (max-width: 720px) {
header h1 {
font-size: 2.1rem;
}
.card {
padding: 26px;
}
.card-header {
flex-direction: column;
align-items: flex-start;
}
.card-meta {
text-align: left;
}
.courses-grid {
grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
}
}
</style>
<style>
/* generated-page additions */
.toolbar {
margin-bottom: 40px;
}
.hidden {
display: none !important;
}
section.hidden {
display: none;
}
.card[data-search] {
scroll-margin-top: 20px;
}
</style>
</head>
<body>
<div class="container">
<header>
<h1>Mihir Talati</h1>
<p>Dual Degree · B.S. Computer Science (Honors — Quantum Information track) &amp; B.S. Physics (Honors) · GPA 3.974</p>
</header>
<div class="courses-card toolbar">
<label class="filter-label" for="global-search">Search résumé</label>
<input
class="filter-input"
id="global-search"
type="search"
placeholder="Filter by keyword, tech, or course…"
autocomplete="off"
/>
</div>
<section id="education">
<h2 class="section-title">Education</h2>
<div class="education-grid">
<article class="card" data-search="university of maryland — college park computer science (honors) · physics (honors) b.s. computer science (honors — quantum information track) b.s. physics (honors) angelo bardasis scholarship — physics john d. gannon scholarship — computer science dean's list — every semester">
<div class="card-header">
<div>
<h3 class="card-title">University of Maryland — College Park</h3>
<p class="card-subtitle">Computer Science (Honors) · Physics (Honors)</p>
</div>
<div class="card-meta"><span class="meta-line">Expected Graduation · May 2027</span><span class="meta-line">GPA · 3.974</span></div>
</div>
<div class="scholarships">
<p class="scholarships-title">Scholarships &amp; Distinctions</p>
<ul class="bullet-list"><li>Angelo Bardasis Scholarship — Physics</li><li>John D. Gannon Scholarship — Computer Science</li><li>Dean's List — Every Semester</li></ul>
</div>
</article>
</div>
</section>
<section id="work">
<h2 class="section-title">Work Experience</h2>
<article class="card" data-search="researcher caar reu combinatorics, algorithms, and ai for real problems joint center for quantum information and computer science (quics) python galois numpy magma math sagemath constructing a new family of css quantum error-correcting codes for qudits from classical quadratic residue codes. validated novel fault-tolerant qec codes using finite field theory and parallel python tooling on an hpc cluster. proved transversal clifford and t gate support and tested self-orthogonality and distance across large search spaces.">
<div class="card-header">
<div>
<h3 class="card-title">Researcher · CAAR REU</h3>
<p class="card-subtitle">Combinatorics, Algorithms, and AI for Real Problems</p>
</div>
<div class="card-meta"><span class="meta-line">Jun 2025 Present</span><span class="meta-line">Joint Center for Quantum Information and Computer Science (QuICS)</span></div>
</div>
<ul class="tag-list"><li class="tag">Python</li><li class="tag">Galois</li><li class="tag">NumPy</li><li class="tag">Magma Math</li><li class="tag">SageMath</li></ul>
<ul class="bullet-list"><li>Constructing a new family of CSS quantum error-correcting codes for qudits from classical quadratic residue codes.</li><li>Validated novel fault-tolerant QEC codes using finite field theory and parallel Python tooling on an HPC cluster.</li><li>Proved transversal Clifford and T gate support and tested self-orthogonality and distance across large search spaces.</li></ul>
</article>
<article class="card" data-search="undergraduate researcher bright beams collective ireap research experience for undergraduates institute for research in electronics and applied physics mad-x elegant fusion 360 matlab ansys workbench built custom machine learning and gradient-based optimizers to derive design parameters for a planned beamline. ran accelerator simulations to analyze lattice stability and beam quality under varied operating configurations. produced animations of betatron motion for outreach presentations and technical discussions.">
<div class="card-header">
<div>
<h3 class="card-title">Undergraduate Researcher · Bright Beams Collective</h3>
<p class="card-subtitle">IREAP Research Experience for Undergraduates</p>
</div>
<div class="card-meta"><span class="meta-line">Sep 2023 Dec 2024</span><span class="meta-line">Institute for Research in Electronics and Applied Physics</span></div>
</div>
<ul class="tag-list"><li class="tag">MAD-X</li><li class="tag">Elegant</li><li class="tag">Fusion 360</li><li class="tag">MATLAB</li><li class="tag">Ansys Workbench</li></ul>
<ul class="bullet-list"><li>Built custom machine learning and gradient-based optimizers to derive design parameters for a planned beamline.</li><li>Ran accelerator simulations to analyze lattice stability and beam quality under varied operating configurations.</li><li>Produced animations of betatron motion for outreach presentations and technical discussions.</li></ul>
</article>
<article class="card" data-search="software engineering intern jodo pay invoicing system automation javascript typescript google apps script automated invoice generation and dispatch for clients, reducing manual processing by 40 staff hours each week. integrated google workspace apis to manage templates, customer data, and error handling workflows.">
<div class="card-header">
<div>
<h3 class="card-title">Software Engineering Intern · JODO PAY</h3>
<p class="card-subtitle">Invoicing System Automation</p>
</div>
<div class="card-meta"><span class="meta-line">Jun 2022 Jul 2022</span></div>
</div>
<ul class="tag-list"><li class="tag">JavaScript</li><li class="tag">TypeScript</li><li class="tag">Google Apps Script</li></ul>
<ul class="bullet-list"><li>Automated invoice generation and dispatch for clients, reducing manual processing by 40 staff hours each week.</li><li>Integrated Google Workspace APIs to manage templates, customer data, and error handling workflows.</li></ul>
</article>
</section>
<section id="projects">
<h2 class="section-title">Projects</h2>
<article class="card" data-search="nyx — declarative system &amp; knowledge infrastructure reproducible nixos + literate org-roam vault nix nixos home-manager emacs lisp org-mode org-roam built a modular, reproducible nixos system (nyxos/nyxnet/nyxsys) with declarative host, network, and service boundaries. designed a distributed org-roam vault — one searchable knowledge graph whose notes live inside each project repo, bound to code via roam_refs. authored a literate doom emacs configuration and agent-driven tooling, codifying an engineering praxis (single source of truth, declared mirrors, atomicity) enforced by ci canaries.">
<div class="card-header">
<div>
<h3 class="card-title">Nyx — Declarative System &amp; Knowledge Infrastructure</h3>
<p class="card-subtitle">Reproducible NixOS + literate org-roam vault</p>
</div>
<div class="card-meta"><span class="meta-line">2024 Present</span></div>
</div>
<ul class="tag-list"><li class="tag">Nix</li><li class="tag">NixOS</li><li class="tag">Home-Manager</li><li class="tag">Emacs Lisp</li><li class="tag">Org-mode</li><li class="tag">org-roam</li></ul>
<ul class="bullet-list"><li>Built a modular, reproducible NixOS system (NyxOS/NyxNet/NyxSys) with declarative host, network, and service boundaries.</li><li>Designed a distributed org-roam vault — one searchable knowledge graph whose notes live inside each project repo, bound to code via ROAM_REFS.</li><li>Authored a literate Doom Emacs configuration and agent-driven tooling, codifying an engineering praxis (single source of truth, declared mirrors, atomicity) enforced by CI canaries.</li></ul>
</article>
<article class="card" data-search="quantum state tomography via qml github · github.com/mihir-null python qiskit aer mpi numba pytorch co-developed a variational circuit tomography approach, exploring loss landscapes, embedding strategies, and optimizers. executed 2,000+ experiments across multi-gpu clusters with a custom orchestrator for reproducible benchmarking. co-authored &quot;quantum state reconstruction with variational quantum circuit&quot; (arxiv:2507.01246).">
<div class="card-header">
<div>
<h3 class="card-title">Quantum State Tomography via QML</h3>
<p class="card-subtitle">GitHub · github.com/Mihir-Null</p>
</div>
<div class="card-meta"><span class="meta-line">Sep 2024 Jul 2025</span></div>
</div>
<ul class="tag-list"><li class="tag">Python</li><li class="tag">Qiskit</li><li class="tag">Aer</li><li class="tag">MPI</li><li class="tag">Numba</li><li class="tag">PyTorch</li></ul>
<ul class="bullet-list"><li>Co-developed a variational circuit tomography approach, exploring loss landscapes, embedding strategies, and optimizers.</li><li>Executed 2,000+ experiments across multi-GPU clusters with a custom orchestrator for reproducible benchmarking.</li><li>Co-authored &quot;Quantum state reconstruction with variational quantum circuit&quot; (<a href="https://arxiv.org/abs/2507.01246">arXiv:2507.01246</a>).</li></ul>
</article>
<article class="card" data-search="mit iquhack — quera challenge honorable mention python qiskit cirq bloqade pytorch tensorflow quantum designed a compilation pipeline mapping diverse quantum circuits — including qaoa and steane codes — to quera hardware. optimized pulse sequences for neutral atom instruction sets, contributing to the team's honorable mention finish.">
<div class="card-header">
<div>
<h3 class="card-title">MIT iQuHack — QuEra Challenge</h3>
<p class="card-subtitle">Honorable Mention</p>
</div>
<div class="card-meta"><span class="meta-line">Feb 2025</span></div>
</div>
<ul class="tag-list"><li class="tag">Python</li><li class="tag">Qiskit</li><li class="tag">Cirq</li><li class="tag">Bloqade</li><li class="tag">PyTorch</li><li class="tag">TensorFlow Quantum</li></ul>
<ul class="bullet-list"><li>Designed a compilation pipeline mapping diverse quantum circuits — including QAOA and Steane codes — to QuEra hardware.</li><li>Optimized pulse sequences for neutral atom instruction sets, contributing to the team's honorable mention finish.</li></ul>
</article>
<article class="card" data-search="quantum machine learning research undergraduate research portfolio python qiskit cirq pennylane q# implemented quantum image processing with parameterized circuit kernels integrated into cnn architectures. created a hybrid transitional optimizer to mitigate barren plateaus in qaoa, presented at the fyire summit 2024.">
<div class="card-header">
<div>
<h3 class="card-title">Quantum Machine Learning Research</h3>
<p class="card-subtitle">Undergraduate Research Portfolio</p>
</div>
<div class="card-meta"><span class="meta-line">Aug 2023 Dec 2024</span></div>
</div>
<ul class="tag-list"><li class="tag">Python</li><li class="tag">Qiskit</li><li class="tag">Cirq</li><li class="tag">PennyLane</li><li class="tag">Q#</li></ul>
<ul class="bullet-list"><li>Implemented quantum image processing with parameterized circuit kernels integrated into CNN architectures.</li><li>Created a hybrid transitional optimizer to mitigate barren plateaus in QAOA, presented at the FYIRE Summit 2024.</li></ul>
</article>
<article class="card" data-search="terrapin rocket team — kalman filters guidance, navigation, and control c c++ matlab developed six- and nine-state kalman filters fusing multi-sensor telemetry for rocket position estimation. supported the team's winning entry at the 2024 spaceport america cup.">
<div class="card-header">
<div>
<h3 class="card-title">Terrapin Rocket Team — Kalman Filters</h3>
<p class="card-subtitle">Guidance, Navigation, and Control</p>
</div>
<div class="card-meta"><span class="meta-line">Aug 2023 Jan 2024</span></div>
</div>
<ul class="tag-list"><li class="tag">C</li><li class="tag">C++</li><li class="tag">MATLAB</li></ul>
<ul class="bullet-list"><li>Developed six- and nine-state Kalman filters fusing multi-sensor telemetry for rocket position estimation.</li><li>Supported the team's winning entry at the 2024 Spaceport America Cup.</li></ul>
</article>
<article class="card" data-search="robotics @ umd — computer vision testudog automation python opencv scikit-learn developed haar cascade pipelines for the testudog robotics platform deployed on a jetson-powered boston dynamics spot.">
<div class="card-header">
<div>
<h3 class="card-title">Robotics @ UMD — Computer Vision</h3>
<p class="card-subtitle">Testudog Automation</p>
</div>
<div class="card-meta"><span class="meta-line">Aug 2023 Jan 2024</span></div>
</div>
<ul class="tag-list"><li class="tag">Python</li><li class="tag">OpenCV</li><li class="tag">scikit-learn</li></ul>
<ul class="bullet-list"><li>Developed Haar cascade pipelines for the Testudog robotics platform deployed on a Jetson-powered Boston Dynamics Spot.</li></ul>
</article>
<article class="card" data-search="club administration automation workflow automation suite python selenium discord.py rest apis oauth 2.0 automated discord announcements, email campaigns, instagram publishing, and room reservations for university clubs. currently deployed across multiple organizations to streamline administrative overhead.">
<div class="card-header">
<div>
<h3 class="card-title">Club Administration Automation</h3>
<p class="card-subtitle">Workflow Automation Suite</p>
</div>
<div class="card-meta"><span class="meta-line">Nov 2024 Feb 2025</span></div>
</div>
<ul class="tag-list"><li class="tag">Python</li><li class="tag">Selenium</li><li class="tag">Discord.py</li><li class="tag">REST APIs</li><li class="tag">OAuth 2.0</li></ul>
<ul class="bullet-list"><li>Automated Discord announcements, email campaigns, Instagram publishing, and room reservations for university clubs.</li><li>Currently deployed across multiple organizations to streamline administrative overhead.</li></ul>
</article>
<article class="card" data-search="housing market analysis predictive pricing models python pandas scipy numpy scikit-learn sql trained feedforward neural networks for price prediction using engineered features derived from public listings and census data. applied pca and statistical analysis to identify high-signal attributes and reduce overfitting.">
<div class="card-header">
<div>
<h3 class="card-title">Housing Market Analysis</h3>
<p class="card-subtitle">Predictive Pricing Models</p>
</div>
<div class="card-meta"><span class="meta-line">Jun 2024 Jul 2024</span></div>
</div>
<ul class="tag-list"><li class="tag">Python</li><li class="tag">Pandas</li><li class="tag">SciPy</li><li class="tag">NumPy</li><li class="tag">scikit-learn</li><li class="tag">SQL</li></ul>
<ul class="bullet-list"><li>Trained feedforward neural networks for price prediction using engineered features derived from public listings and census data.</li><li>Applied PCA and statistical analysis to identify high-signal attributes and reduce overfitting.</li></ul>
</article>
<article class="card" data-search="independent game development national game jam winner c# c++ unity unreal engine blender adobe suite published two action platformers, including a custom 2d soft-body simulation available via two guys studios on itch.io. placed second in the 2021 mindbox national design championship; finalist in the 2020 edition. built a procedural map generation toolkit leveraging noise algorithms and custom pathfinding.">
<div class="card-header">
<div>
<h3 class="card-title">Independent Game Development</h3>
<p class="card-subtitle">National Game Jam Winner</p>
</div>
<div class="card-meta"><span class="meta-line">2020 2023</span></div>
</div>
<ul class="tag-list"><li class="tag">C#</li><li class="tag">C++</li><li class="tag">Unity</li><li class="tag">Unreal Engine</li><li class="tag">Blender</li><li class="tag">Adobe Suite</li></ul>
<ul class="bullet-list"><li>Published two action platformers, including a custom 2D soft-body simulation available via Two Guys Studios on itch.io.</li><li>Placed second in the 2021 Mindbox National Design Championship; finalist in the 2020 edition.</li><li>Built a procedural map generation toolkit leveraging noise algorithms and custom pathfinding.</li></ul>
</article>
</section>
<section id="organizations">
<h2 class="section-title">Organizations</h2>
<article class="card" data-search="vice president quantum coalition promoted to vice president after serving as industry chair (jan 2024 aug 2025). co-organized the qrise research competition with 200+ international participants. partnered with the un and itu to deliver the qc-fliq hackathon for the international year of quantum (500+ attendees).">
<div class="card-header">
<div>
<h3 class="card-title">Vice President · Quantum Coalition</h3>
</div>
<div class="card-meta"><span class="meta-line">Jan 2024 Present</span></div>
</div>
<ul class="bullet-list"><li>Promoted to Vice President after serving as Industry Chair (Jan 2024 Aug 2025).</li><li>Co-organized the QRISE research competition with 200+ international participants.</li><li>Partnered with the UN and ITU to deliver the QC-FLIQ hackathon for the International Year of Quantum (500+ attendees).</li></ul>
</article>
<article class="card" data-search="president undergraduate quantum association led organizational strategy, programming, and outreach after serving as an officer since 2020. produced the quantum leap career nexus with 240+ attendees and partners including ibm, microsoft, and ionq.">
<div class="card-header">
<div>
<h3 class="card-title">President · Undergraduate Quantum Association</h3>
</div>
<div class="card-meta"><span class="meta-line">Jan 2025 Present</span></div>
</div>
<ul class="bullet-list"><li>Led organizational strategy, programming, and outreach after serving as an officer since 2020.</li><li>Produced the Quantum Leap Career Nexus with 240+ attendees and partners including IBM, Microsoft, and IonQ.</li></ul>
</article>
<article class="card" data-search="co-founder acm@umd restarted the university chapter, launched a new website, and grew membership beyond 145 students. led workshops focused on shell scripting, ai, quantum computing, and heuristic search techniques.">
<div class="card-header">
<div>
<h3 class="card-title">Co-Founder · ACM@UMD</h3>
</div>
<div class="card-meta"><span class="meta-line">Sep 2023 Present</span></div>
</div>
<ul class="bullet-list"><li>Restarted the university chapter, launched a new website, and grew membership beyond 145 students.</li><li>Led workshops focused on shell scripting, AI, quantum computing, and heuristic search techniques.</li></ul>
</article>
</section>
<section id="publications">
<h2 class="section-title">Publications</h2>
<article class="card" data-search="quantum state reconstruction with variational quantum circuit accepted — quantum machine intelligence (2025); arxiv:2507.01246 introduces a quantum machine learning approach to tomography for high-dimensional states. benchmarks loss landscapes, embedding strategies, and optimizer behavior across noise models. highlights scalability results enabled by custom experiment orchestration.">
<div class="card-header">
<div>
<h3 class="card-title">Quantum state reconstruction with variational quantum circuit</h3>
<p class="card-subtitle">Accepted — Quantum Machine Intelligence (2025); arXiv:2507.01246</p>
</div>
</div>
<ul class="bullet-list"><li>Introduces a quantum machine learning approach to tomography for high-dimensional states.</li><li>Benchmarks loss landscapes, embedding strategies, and optimizer behavior across noise models.</li><li>Highlights scalability results enabled by custom experiment orchestration.</li></ul>
</article>
<article class="card" data-search="a very quick guide to special relativity published — 2021 authored and published an accessible primer covering time dilation through massenergy equivalence. focused on first-principles explanations for students exploring modern physics.">
<div class="card-header">
<div>
<h3 class="card-title">A Very Quick Guide to Special Relativity</h3>
<p class="card-subtitle">Published — 2021</p>
</div>
</div>
<ul class="bullet-list"><li>Authored and published an accessible primer covering time dilation through massenergy equivalence.</li><li>Focused on first-principles explanations for students exploring modern physics.</li></ul>
</article>
</section>
<section id="certifications">
<h2 class="section-title">Certifications</h2>
<div class="courses-card">
<div class="courses-grid" id="certs-grid">
<span class="course-pill" data-search="qiskit (v0.2x) ibm">Qiskit (v0.2x) · IBM</span>
</div>
</div>
</section>
<section id="courses">
<h2 class="section-title">Relevant Courses</h2>
<div class="courses-card">
<div class="courses-grid" id="courses-grid">
<span class="course-pill" data-search="graduate quantum information (cmsc657)">Graduate Quantum Information (CMSC657)</span>
<span class="course-pill" data-search="computer science honors seminar">Computer Science Honors Seminar</span>
<span class="course-pill" data-search="differentiable programming for agentic ai (cmsc498z)">Differentiable Programming for Agentic AI (CMSC498Z)</span>
<span class="course-pill" data-search="natural language processing (cmsc470)">Natural Language Processing (CMSC470)</span>
<span class="course-pill" data-search="data science (cmsc320)">Data Science (CMSC320)</span>
<span class="course-pill" data-search="design &amp; analysis of algorithms (cmsc451)">Design &amp; Analysis of Algorithms (CMSC451)</span>
<span class="course-pill" data-search="object-oriented programming in java (cmsc132)">Object-Oriented Programming in Java (CMSC132)</span>
<span class="course-pill" data-search="applied probability &amp; statistics (stat400)">Applied Probability &amp; Statistics (STAT400)</span>
<span class="course-pill" data-search="honors advanced modern physics (phys400)">Honors Advanced Modern Physics (PHYS400)</span>
<span class="course-pill" data-search="quantum mechanics ii (phys402)">Quantum Mechanics II (PHYS402)</span>
<span class="course-pill" data-search="accelerator simulation">Accelerator Simulation</span>
<span class="course-pill" data-search="multivariate calculus">Multivariate Calculus</span>
<span class="course-pill" data-search="linear algebra">Linear Algebra</span>
<span class="course-pill" data-search="differential equations">Differential Equations</span>
</div>
</div>
</section>
<div class="empty-state" id="global-empty">
No entries match that search. Try a broader keyword.
</div>
</div>
<script>
const search = document.getElementById('global-search');
const empty = document.getElementById('global-empty');
const items = Array.from(document.querySelectorAll('[data-search]'));
const sections = Array.from(
document.querySelectorAll('main section, .container section'),
);
function apply(value) {
const q = value.trim().toLowerCase();
let total = 0;
items.forEach((el) => {
const hit = el.getAttribute('data-search').includes(q);
el.classList.toggle('hidden', !hit);
if (hit) total += 1;
});
sections.forEach((sec) => {
const vis = sec.querySelectorAll('[data-search]:not(.hidden)').length;
sec.classList.toggle('hidden', vis === 0);
});
empty.style.display = total === 0 ? 'block' : 'none';
}
search.addEventListener('input', (e) => apply(e.target.value));
</script>
</body>
</html>

@ -7,29 +7,47 @@
"email": "mihirtalati3@gmail.com",
"phone": "(240)-351-1014",
"citizenship": "US",
"bio": "Pursuing dual degrees in Computer Science and Physics at the University of Maryland. Exploring quantum computing, machine learning, and physics based simulation with an emphasis on research and development. Interested in all things science and technology. Hobbies include tinkering with unix and hardware, game development and literature."
"bio": "Student at UMD pursuing dual Honors degrees in Computer Science and Physics. Researcher and developer focused on quantum information, scientific machine learning, and computational physics. Also builds reproducible NixOS systems and a literate org-roam knowledge vault in Emacs. Interested in all things science and technology; hobbies include tinkering with unix and hardware, game development and literature."
},
"experience": [
{
"id": "809dd6f7-7700-43ae-ac87-ae2ec79ab4ef",
"role": "Researcher",
"company": "CAAR REU (QuICS)",
"dates": "Jun 2025 Aug 2025",
"company": "CAAR REU",
"dates": "Jun 2025 Present",
"subtitle": "Combinatorics, Algorithms, and AI for Real Problems",
"location": "Joint Center for Quantum Information and Computer Science (QuICS)",
"tech": [
"Python",
"Galois",
"NumPy",
"Magma Math",
"SageMath"
],
"bullets": [
"Created families of fault-tolerant CSS quantum error-correcting codes for qudits.",
"Proved transversal Clifford and T gate support using finite field and QEC theory.",
"Built parallel Python tooling (Galois, NumPy, Magma, SageMath) to test self-orthogonality and distance."
"Constructing a new family of CSS quantum error-correcting codes for qudits from classical quadratic residue codes.",
"Validated novel fault-tolerant QEC codes using finite field theory and parallel Python tooling on an HPC cluster.",
"Proved transversal Clifford and T gate support and tested self-orthogonality and distance across large search spaces."
]
},
{
"id": "4ee96812-4a42-4fce-ab41-223dc3237ed1",
"role": "Undergraduate Researcher",
"company": "Bright Beams Collective (IREAP)",
"company": "Bright Beams Collective",
"dates": "Sep 2023 Dec 2024",
"subtitle": "IREAP Research Experience for Undergraduates",
"location": "Institute for Research in Electronics and Applied Physics",
"tech": [
"MAD-X",
"Elegant",
"Fusion 360",
"MATLAB",
"Ansys Workbench"
],
"bullets": [
"Designed machine learning and gradient optimizers for particle accelerator beamline tuning.",
"Ran MAD-X and Elegant simulations to evaluate lattice stability and beam quality.",
"Produced Fusion 360 and Ansys visualizations for educational and technical presentations."
"Built custom machine learning and gradient-based optimizers to derive design parameters for a planned beamline.",
"Ran accelerator simulations to analyze lattice stability and beam quality under varied operating configurations.",
"Produced animations of betatron motion for outreach presentations and technical discussions."
]
},
{
@ -37,73 +55,173 @@
"role": "Software Engineering Intern",
"company": "JODO PAY",
"dates": "Jun 2022 Jul 2022",
"subtitle": "Invoicing System Automation",
"tech": [
"JavaScript",
"TypeScript",
"Google Apps Script"
],
"bullets": [
"Automated invoice generation and delivery via Google Workspace APIs.",
"Reduced manual processing by approximately 40 staff hours each week.",
"Hardened error handling and template management with TypeScript and Apps Script."
"Automated invoice generation and dispatch for clients, reducing manual processing by 40 staff hours each week.",
"Integrated Google Workspace APIs to manage templates, customer data, and error handling workflows."
]
}
],
"projects": [
{
"id": "78995fe0-1a41-429f-92c8-e04da5543290",
"name": "Nyx — Declarative System & Knowledge Infrastructure",
"timeline": "2024 Present",
"subtitle": "Reproducible NixOS + literate org-roam vault",
"tech": [
"Nix",
"NixOS",
"Home-Manager",
"Emacs Lisp",
"Org-mode",
"org-roam"
],
"bullets": [
"Built a modular, reproducible NixOS system (NyxOS/NyxNet/NyxSys) with declarative host, network, and service boundaries.",
"Designed a distributed org-roam vault — one searchable knowledge graph whose notes live inside each project repo, bound to code via ROAM_REFS.",
"Authored a literate Doom Emacs configuration and agent-driven tooling, codifying an engineering praxis (single source of truth, declared mirrors, atomicity) enforced by CI canaries."
]
},
{
"id": "28f564fa-8ac8-4720-bf5c-cf999186cf6d",
"name": "Quantum State Tomography via QML",
"timeline": "Sep 2024 Jul 2025",
"subtitle": "GitHub · github.com/Mihir-Null",
"tech": [
"Python",
"Qiskit",
"Aer",
"MPI",
"Numba",
"PyTorch"
],
"bullets": [
"Co-developed variational circuit tomography with custom losses and embeddings.",
"Launched 2,000+ experiments across multi-GPU clusters via bespoke orchestration tools.",
"Co-author on \"Quantum state reconstruction with variational quantum circuit\" (arXiv:2507.01246)."
"Co-developed a variational circuit tomography approach, exploring loss landscapes, embedding strategies, and optimizers.",
"Executed 2,000+ experiments across multi-GPU clusters with a custom orchestrator for reproducible benchmarking.",
"Co-authored \"Quantum state reconstruction with variational quantum circuit\" (arXiv:2507.01246)."
]
},
{
"id": "25c4d9b7-ea24-4af7-8cac-f1855743abc6",
"name": "MIT iQuHack — QuEra Challenge",
"timeline": "Feb 2025",
"subtitle": "Honorable Mention",
"tech": [
"Python",
"Qiskit",
"Cirq",
"Bloqade",
"PyTorch",
"TensorFlow Quantum"
],
"bullets": [
"Built a compilation pipeline translating QAOA and error-correcting circuits into neutral atom instructions.",
"Optimized pulse schedules using Qiskit, Cirq, Bloqade, PyTorch, and TensorFlow Quantum.",
"Team earned an Honorable Mention from QuEra."
"Designed a compilation pipeline mapping diverse quantum circuits — including QAOA and Steane codes — to QuEra hardware.",
"Optimized pulse sequences for neutral atom instruction sets, contributing to the team's honorable mention finish."
]
},
{
"id": "e00b83aa-277b-4379-96aa-989754fefbcb",
"name": "Club Administration Automation",
"timeline": "Nov 2024 Feb 2025",
"id": "5a0897f1-4b2c-4dd4-a68e-8a324822f425",
"name": "Quantum Machine Learning Research",
"timeline": "Aug 2023 Dec 2024",
"subtitle": "Undergraduate Research Portfolio",
"tech": [
"Python",
"Qiskit",
"Cirq",
"PennyLane",
"Q#"
],
"bullets": [
"Automated Discord announcements, email campaigns, Instagram posts, and room reservations.",
"Integrated Google APIs, Discord.py, Selenium, and OAuth2 for end-to-end workflows.",
"Adopted by multiple university clubs to reduce administrative effort."
"Implemented quantum image processing with parameterized circuit kernels integrated into CNN architectures.",
"Created a hybrid transitional optimizer to mitigate barren plateaus in QAOA, presented at the FYIRE Summit 2024."
]
},
{
"id": "5a0897f1-4b2c-4dd4-a68e-8a324822f425",
"name": "Quantum ML Research Collection",
"timeline": "Aug 2023 Dec 2024",
"id": "81fadb40-43da-4f62-805a-686b65bdf5f8",
"name": "Terrapin Rocket Team — Kalman Filters",
"timeline": "Aug 2023 Jan 2024",
"subtitle": "Guidance, Navigation, and Control",
"tech": [
"C",
"C++",
"MATLAB"
],
"bullets": [
"Crafted quantum image processing pipelines with parameterized kernels inside CNNs.",
"Designed a hybrid transitional optimizer that mitigates barren plateaus in QAOA.",
"Presented findings at the 2024 First Year Innovation & Research Experience Summit."
"Developed six- and nine-state Kalman filters fusing multi-sensor telemetry for rocket position estimation.",
"Supported the team's winning entry at the 2024 Spaceport America Cup."
]
},
{
"id": "6fd996da-74d7-4e3c-9ac0-dc6a23d484d4",
"name": "Robotics @ UMD — Computer Vision",
"timeline": "Aug 2023 Jan 2024",
"subtitle": "Testudog Automation",
"tech": [
"Python",
"OpenCV",
"scikit-learn"
],
"bullets": [
"Developed Haar cascade pipelines for the Testudog robotics platform deployed on a Jetson-powered Boston Dynamics Spot."
]
},
{
"id": "e00b83aa-277b-4379-96aa-989754fefbcb",
"name": "Club Administration Automation",
"timeline": "Nov 2024 Feb 2025",
"subtitle": "Workflow Automation Suite",
"tech": [
"Python",
"Selenium",
"Discord.py",
"REST APIs",
"OAuth 2.0"
],
"bullets": [
"Automated Discord announcements, email campaigns, Instagram publishing, and room reservations for university clubs.",
"Currently deployed across multiple organizations to streamline administrative overhead."
]
},
{
"id": "25053703-72e2-492d-bf8b-4a5953b6160e",
"name": "Housing Market Analysis",
"timeline": "Jun 2024 Jul 2024",
"subtitle": "Predictive Pricing Models",
"tech": [
"Python",
"Pandas",
"SciPy",
"NumPy",
"scikit-learn",
"SQL"
],
"bullets": [
"Built feedforward neural networks to predict housing prices from public datasets.",
"Applied PCA and statistical analysis to surface high-signal features.",
"Combined web-scraped listings with census data to improve model robustness."
"Trained feedforward neural networks for price prediction using engineered features derived from public listings and census data.",
"Applied PCA and statistical analysis to identify high-signal attributes and reduce overfitting."
]
},
{
"id": "bdf83287-24aa-4f55-9a07-e11d6e08e319",
"name": "Indie Game Development",
"name": "Independent Game Development",
"timeline": "2020 2023",
"subtitle": "National Game Jam Winner",
"tech": [
"C#",
"C++",
"Unity",
"Unreal Engine",
"Blender",
"Adobe Suite"
],
"bullets": [
"Shipped two action platformers with custom soft-body simulation via Unity/Unreal.",
"2nd place, 2021 Mindbox National Design Championship (Game Design).",
"National finalist, 2020 Mindbox Design Championship (Game Development).",
"Authored a procedural map generation toolkit for arbitrary tilemaps."
"Published two action platformers, including a custom 2D soft-body simulation available via Two Guys Studios on itch.io.",
"Placed second in the 2021 Mindbox National Design Championship; finalist in the 2020 edition.",
"Built a procedural map generation toolkit leveraging noise algorithms and custom pathfinding."
]
}
],
@ -113,8 +231,9 @@
"school": "University of Maryland — College Park",
"gpa": "3.974",
"graduation": "May 2027",
"subtitle": "Computer Science (Honors) · Physics (Honors)",
"degrees": [
"B.S. Computer Science (Honors)",
"B.S. Computer Science (Honors — Quantum Information track)",
"B.S. Physics (Honors)"
],
"honors": [
@ -123,25 +242,33 @@
"Dean's List — Every Semester"
],
"coursework": [
"Graduate Quantum Computing (CMSC657)",
"Graduate Quantum Information (CMSC657)",
"Computer Science Honors Seminar",
"Differentiable Programming for Agentic AI (CMSC498Z)",
"Natural Language Processing (CMSC470)",
"Data Science (CMSC320)",
"Design & Analysis of Algorithms (CMSC451)",
"Object-Oriented Programming in Java (CMSC132)",
"Applied Probability & Statistics (STAT400)",
"Honors Advanced Modern Physics (PHYS400)",
"Quantum Mechanics II (PHYS402)"
"Quantum Mechanics II (PHYS402)",
"Accelerator Simulation",
"Multivariate Calculus",
"Linear Algebra",
"Differential Equations"
]
}
],
"organizations": [
{
"id": "9ed6f6b0-5389-485f-aa00-e6c934737e3d",
"role": "Industry Chair",
"role": "Vice President",
"org": "Quantum Coalition",
"dates": "Jan 2024 Present",
"bullets": [
"Co-organized the QRISE research competition with 200+ global participants.",
"Partnered with the UN and ITU to deliver the QC-FLIQ hackathon (500+ attendees)."
"Promoted to Vice President after serving as Industry Chair (Jan 2024 Aug 2025).",
"Co-organized the QRISE research competition with 200+ international participants.",
"Partnered with the UN and ITU to deliver the QC-FLIQ hackathon for the International Year of Quantum (500+ attendees)."
]
},
{
@ -150,18 +277,18 @@
"org": "Undergraduate Quantum Association",
"dates": "Jan 2025 Present",
"bullets": [
"Led programming, partnerships, and outreach after four years as an officer.",
"Hosted the Quantum Leap Career Nexus with 240+ attendees across IBM, Microsoft, Amazon Braket, IonQ, and more."
"Led organizational strategy, programming, and outreach after serving as an officer since 2020.",
"Produced the Quantum Leap Career Nexus with 240+ attendees and partners including IBM, Microsoft, and IonQ."
]
},
{
"id": "145dbb0c-cf88-46e0-bc3e-052120e83978",
"role": "Co-President",
"role": "Co-Founder",
"org": "ACM@UMD",
"dates": "Sep 2023 Present",
"bullets": [
"Restarted the official student chapter and launched a new web presence.",
"Grew membership to 145+ students with workshops on shell scripting, AI, and quantum computing."
"Restarted the university chapter, launched a new website, and grew membership beyond 145 students.",
"Led workshops focused on shell scripting, AI, quantum computing, and heuristic search techniques."
]
}
],
@ -169,7 +296,7 @@
{
"id": "0f86c17a-6165-4b78-9610-5d6cb3da2977",
"title": "Quantum state reconstruction with variational quantum circuit",
"status": "Preprint — arXiv:2507.01246",
"status": "Accepted — Quantum Machine Intelligence (2025); arXiv:2507.01246",
"bullets": [
"Introduces a quantum machine learning approach to tomography for high-dimensional states.",
"Benchmarks loss landscapes, embedding strategies, and optimizer behavior across noise models.",
@ -181,18 +308,35 @@
"title": "A Very Quick Guide to Special Relativity",
"status": "Published — 2021",
"bullets": [
"Wrote and published an accessible primer covering time dilation through mass-energy equivalence.",
"Authored and published an accessible primer covering time dilation through massenergy equivalence.",
"Focused on first-principles explanations for students exploring modern physics."
]
}
],
"certifications": [
{
"id": "c468c5d7-e4e3-4589-a00a-1f40932f3ea4",
"name": "Qiskit (v0.2x)",
"issuer": "IBM"
}
],
"skills": {
"languages": [
"Python",
"Go",
"C",
"C++",
"C#",
"JavaScript/TypeScript",
"Rust (learning)"
"Java",
"Rust",
"MATLAB",
"SQL",
"Verilog",
"R",
"Bash",
"Nix",
"Emacs Lisp"
],
"quantum": [
"Qiskit",
@ -203,10 +347,13 @@
],
"ml": [
"PyTorch",
"TensorFlow Quantum",
"TensorFlow",
"NumPy",
"SciPy",
"scikit-learn",
"Pandas",
"SageMath",
"OpenCV",
"MPI",
"Numba"
],
@ -214,17 +361,22 @@
"MAD-X",
"Elegant",
"Magma",
"SageMath",
"Fusion 360",
"Ansys Workbench"
"Ansys Workbench",
"CFD"
],
"tools": [
"Git",
"Linux / Unix",
"Docker",
"Google Cloud APIs",
"NixOS",
"Home-Manager",
"Emacs / org-roam",
"GCP",
"Neo4j",
"HPC",
"Selenium",
"Discord.py",
"REST APIs"
"Arduino"
]
}
}

@ -9,23 +9,24 @@
# CANONICAL RESUME SOURCE — SINGLE SOURCE OF TRUTH
#
# This file is the one authoritative home for every résumé fact. The terminal
# (ls / sumfetch / summary) and the plain résumé page both read `resume.json`,
# which is a DECLARED MIRROR generated from this file by:
# (ls / sumfetch / summary) and the plain résumé page (resume.html) are both
# generated from `resume.json`, which is a DECLARED MIRROR of this file:
#
# node scripts/org-to-json.mjs resume.org resume.json
# node scripts/org-to-json.mjs resume.org resume.json (org -> json)
# node scripts/build-resume-html.mjs (json -> resume.html)
#
# Flow is one-way: org -> json. Never hand-edit resume.json; edit THIS file and
# regenerate. CI re-runs the parser and fails on any diff (the canary).
# Flow is one-way. Never hand-edit resume.json or public/resume.html; edit THIS
# file and regenerate. CI re-runs the parser and fails on any diff (the canary).
#
# SCHEMA the parser expects (RESUME_SCHEMA: 1):
# * Section top-level headings name the sections below.
# ** Item each item is a roam node: it carries its own :ID: and
# typed scalar fields in a :PROPERTIES: drawer.
# - bullet plain list items become the item's `bullets` array.
# - tag :: value tagged bullets route into named arrays (education uses
# `degree`, `honor`, `course`).
# Add a new experience/project/etc. by copying an item heading, minting a fresh
# :ID: (`org-id-get-create` in Emacs, or `uuidgen`), and filling the drawer.
# SCHEMA (RESUME_SCHEMA: 1):
# * Section top-level headings name the sections below.
# ** Item each item is a roam node: its own :ID: + scalar fields in
# a :PROPERTIES: drawer (role/company/dates/subtitle/…).
# - bullet plain list items become the item's `bullets` array.
# - tech :: X tech tags for a card (experience/projects).
# - degree/honor/course :: X education sub-lists.
# Add an item by copying an item heading, minting a fresh :ID: (org-id-get-create
# or uuidgen), and filling the drawer + bullets.
# ============================================================================
* Profile
@ -37,139 +38,243 @@
:PHONE: (240)-351-1014
:CITIZENSHIP: US
:END:
Pursuing dual degrees in Computer Science and Physics at the University of
Maryland. Exploring quantum computing, machine learning, and physics based
simulation with an emphasis on research and development. Interested in all
things science and technology. Hobbies include tinkering with unix and
hardware, game development and literature.
Student at UMD pursuing dual Honors degrees in Computer Science and Physics.
Researcher and developer focused on quantum information, scientific machine
learning, and computational physics. Also builds reproducible NixOS systems and
a literate org-roam knowledge vault in Emacs. Interested in all things science
and technology; hobbies include tinkering with unix and hardware, game
development and literature.
* Experience
** Researcher — CAAR REU (QuICS)
:PROPERTIES:
:ID: 809dd6f7-7700-43ae-ac87-ae2ec79ab4ef
:ROLE: Researcher
:COMPANY: CAAR REU (QuICS)
:DATES: Jun 2025 Aug 2025
:COMPANY: CAAR REU
:SUBTITLE: Combinatorics, Algorithms, and AI for Real Problems
:LOCATION: Joint Center for Quantum Information and Computer Science (QuICS)
:DATES: Jun 2025 Present
:END:
- Created families of fault-tolerant CSS quantum error-correcting codes for qudits.
- Proved transversal Clifford and T gate support using finite field and QEC theory.
- Built parallel Python tooling (Galois, NumPy, Magma, SageMath) to test self-orthogonality and distance.
- tech :: Python
- tech :: Galois
- tech :: NumPy
- tech :: Magma Math
- tech :: SageMath
- Constructing a new family of CSS quantum error-correcting codes for qudits from classical quadratic residue codes.
- Validated novel fault-tolerant QEC codes using finite field theory and parallel Python tooling on an HPC cluster.
- Proved transversal Clifford and T gate support and tested self-orthogonality and distance across large search spaces.
** Undergraduate Researcher — Bright Beams Collective (IREAP)
:PROPERTIES:
:ID: 4ee96812-4a42-4fce-ab41-223dc3237ed1
:ROLE: Undergraduate Researcher
:COMPANY: Bright Beams Collective (IREAP)
:COMPANY: Bright Beams Collective
:SUBTITLE: IREAP Research Experience for Undergraduates
:LOCATION: Institute for Research in Electronics and Applied Physics
:DATES: Sep 2023 Dec 2024
:END:
- Designed machine learning and gradient optimizers for particle accelerator beamline tuning.
- Ran MAD-X and Elegant simulations to evaluate lattice stability and beam quality.
- Produced Fusion 360 and Ansys visualizations for educational and technical presentations.
- tech :: MAD-X
- tech :: Elegant
- tech :: Fusion 360
- tech :: MATLAB
- tech :: Ansys Workbench
- Built custom machine learning and gradient-based optimizers to derive design parameters for a planned beamline.
- Ran accelerator simulations to analyze lattice stability and beam quality under varied operating configurations.
- Produced animations of betatron motion for outreach presentations and technical discussions.
** Software Engineering Intern — JODO PAY
:PROPERTIES:
:ID: 9ca345ca-c318-4d70-aa4d-8542bc322589
:ROLE: Software Engineering Intern
:COMPANY: JODO PAY
:SUBTITLE: Invoicing System Automation
:DATES: Jun 2022 Jul 2022
:END:
- Automated invoice generation and delivery via Google Workspace APIs.
- Reduced manual processing by approximately 40 staff hours each week.
- Hardened error handling and template management with TypeScript and Apps Script.
- tech :: JavaScript
- tech :: TypeScript
- tech :: Google Apps Script
- Automated invoice generation and dispatch for clients, reducing manual processing by 40 staff hours each week.
- Integrated Google Workspace APIs to manage templates, customer data, and error handling workflows.
* Projects
** Nyx — Declarative System & Knowledge Infrastructure
:PROPERTIES:
:ID: 78995fe0-1a41-429f-92c8-e04da5543290
:NAME: Nyx — Declarative System & Knowledge Infrastructure
:SUBTITLE: Reproducible NixOS + literate org-roam vault
:TIMELINE: 2024 Present
:END:
- tech :: Nix
- tech :: NixOS
- tech :: Home-Manager
- tech :: Emacs Lisp
- tech :: Org-mode
- tech :: org-roam
- Built a modular, reproducible NixOS system (NyxOS/NyxNet/NyxSys) with declarative host, network, and service boundaries.
- Designed a distributed org-roam vault — one searchable knowledge graph whose notes live inside each project repo, bound to code via ROAM_REFS.
- Authored a literate Doom Emacs configuration and agent-driven tooling, codifying an engineering praxis (single source of truth, declared mirrors, atomicity) enforced by CI canaries.
** Quantum State Tomography via QML
:PROPERTIES:
:ID: 28f564fa-8ac8-4720-bf5c-cf999186cf6d
:NAME: Quantum State Tomography via QML
:SUBTITLE: GitHub · github.com/Mihir-Null
:TIMELINE: Sep 2024 Jul 2025
:END:
- Co-developed variational circuit tomography with custom losses and embeddings.
- Launched 2,000+ experiments across multi-GPU clusters via bespoke orchestration tools.
- Co-author on "Quantum state reconstruction with variational quantum circuit" (arXiv:2507.01246).
- tech :: Python
- tech :: Qiskit
- tech :: Aer
- tech :: MPI
- tech :: Numba
- tech :: PyTorch
- Co-developed a variational circuit tomography approach, exploring loss landscapes, embedding strategies, and optimizers.
- Executed 2,000+ experiments across multi-GPU clusters with a custom orchestrator for reproducible benchmarking.
- Co-authored "Quantum state reconstruction with variational quantum circuit" (arXiv:2507.01246).
** MIT iQuHack — QuEra Challenge
:PROPERTIES:
:ID: 25c4d9b7-ea24-4af7-8cac-f1855743abc6
:NAME: MIT iQuHack — QuEra Challenge
:SUBTITLE: Honorable Mention
:TIMELINE: Feb 2025
:END:
- Built a compilation pipeline translating QAOA and error-correcting circuits into neutral atom instructions.
- Optimized pulse schedules using Qiskit, Cirq, Bloqade, PyTorch, and TensorFlow Quantum.
- Team earned an Honorable Mention from QuEra.
- tech :: Python
- tech :: Qiskit
- tech :: Cirq
- tech :: Bloqade
- tech :: PyTorch
- tech :: TensorFlow Quantum
- Designed a compilation pipeline mapping diverse quantum circuits — including QAOA and Steane codes — to QuEra hardware.
- Optimized pulse sequences for neutral atom instruction sets, contributing to the team's honorable mention finish.
** Quantum Machine Learning Research
:PROPERTIES:
:ID: 5a0897f1-4b2c-4dd4-a68e-8a324822f425
:NAME: Quantum Machine Learning Research
:SUBTITLE: Undergraduate Research Portfolio
:TIMELINE: Aug 2023 Dec 2024
:END:
- tech :: Python
- tech :: Qiskit
- tech :: Cirq
- tech :: PennyLane
- tech :: Q#
- Implemented quantum image processing with parameterized circuit kernels integrated into CNN architectures.
- Created a hybrid transitional optimizer to mitigate barren plateaus in QAOA, presented at the FYIRE Summit 2024.
** Terrapin Rocket Team — Kalman Filters
:PROPERTIES:
:ID: 81fadb40-43da-4f62-805a-686b65bdf5f8
:NAME: Terrapin Rocket Team — Kalman Filters
:SUBTITLE: Guidance, Navigation, and Control
:TIMELINE: Aug 2023 Jan 2024
:END:
- tech :: C
- tech :: C++
- tech :: MATLAB
- Developed six- and nine-state Kalman filters fusing multi-sensor telemetry for rocket position estimation.
- Supported the team's winning entry at the 2024 Spaceport America Cup.
** Robotics @ UMD — Computer Vision
:PROPERTIES:
:ID: 6fd996da-74d7-4e3c-9ac0-dc6a23d484d4
:NAME: Robotics @ UMD — Computer Vision
:SUBTITLE: Testudog Automation
:TIMELINE: Aug 2023 Jan 2024
:END:
- tech :: Python
- tech :: OpenCV
- tech :: scikit-learn
- Developed Haar cascade pipelines for the Testudog robotics platform deployed on a Jetson-powered Boston Dynamics Spot.
** Club Administration Automation
:PROPERTIES:
:ID: e00b83aa-277b-4379-96aa-989754fefbcb
:NAME: Club Administration Automation
:SUBTITLE: Workflow Automation Suite
:TIMELINE: Nov 2024 Feb 2025
:END:
- Automated Discord announcements, email campaigns, Instagram posts, and room reservations.
- Integrated Google APIs, Discord.py, Selenium, and OAuth2 for end-to-end workflows.
- Adopted by multiple university clubs to reduce administrative effort.
** Quantum ML Research Collection
:PROPERTIES:
:ID: 5a0897f1-4b2c-4dd4-a68e-8a324822f425
:NAME: Quantum ML Research Collection
:TIMELINE: Aug 2023 Dec 2024
:END:
- Crafted quantum image processing pipelines with parameterized kernels inside CNNs.
- Designed a hybrid transitional optimizer that mitigates barren plateaus in QAOA.
- Presented findings at the 2024 First Year Innovation & Research Experience Summit.
- tech :: Python
- tech :: Selenium
- tech :: Discord.py
- tech :: REST APIs
- tech :: OAuth 2.0
- Automated Discord announcements, email campaigns, Instagram publishing, and room reservations for university clubs.
- Currently deployed across multiple organizations to streamline administrative overhead.
** Housing Market Analysis
:PROPERTIES:
:ID: 25053703-72e2-492d-bf8b-4a5953b6160e
:NAME: Housing Market Analysis
:SUBTITLE: Predictive Pricing Models
:TIMELINE: Jun 2024 Jul 2024
:END:
- Built feedforward neural networks to predict housing prices from public datasets.
- Applied PCA and statistical analysis to surface high-signal features.
- Combined web-scraped listings with census data to improve model robustness.
- tech :: Python
- tech :: Pandas
- tech :: SciPy
- tech :: NumPy
- tech :: scikit-learn
- tech :: SQL
- Trained feedforward neural networks for price prediction using engineered features derived from public listings and census data.
- Applied PCA and statistical analysis to identify high-signal attributes and reduce overfitting.
** Indie Game Development
** Independent Game Development
:PROPERTIES:
:ID: bdf83287-24aa-4f55-9a07-e11d6e08e319
:NAME: Indie Game Development
:NAME: Independent Game Development
:SUBTITLE: National Game Jam Winner
:TIMELINE: 2020 2023
:END:
- Shipped two action platformers with custom soft-body simulation via Unity/Unreal.
- 2nd place, 2021 Mindbox National Design Championship (Game Design).
- National finalist, 2020 Mindbox Design Championship (Game Development).
- Authored a procedural map generation toolkit for arbitrary tilemaps.
- tech :: C#
- tech :: C++
- tech :: Unity
- tech :: Unreal Engine
- tech :: Blender
- tech :: Adobe Suite
- Published two action platformers, including a custom 2D soft-body simulation available via Two Guys Studios on itch.io.
- Placed second in the 2021 Mindbox National Design Championship; finalist in the 2020 edition.
- Built a procedural map generation toolkit leveraging noise algorithms and custom pathfinding.
* Education
** University of Maryland — College Park
:PROPERTIES:
:ID: 86d31d81-d7e2-4035-9441-54badb1724a7
:SCHOOL: University of Maryland — College Park
:SUBTITLE: Computer Science (Honors) · Physics (Honors)
:GPA: 3.974
:GRADUATION: May 2027
:END:
- degree :: B.S. Computer Science (Honors)
- degree :: B.S. Computer Science (Honors — Quantum Information track)
- degree :: B.S. Physics (Honors)
- honor :: Angelo Bardasis Scholarship — Physics
- honor :: John D. Gannon Scholarship — Computer Science
- honor :: Dean's List — Every Semester
- course :: Graduate Quantum Computing (CMSC657)
- course :: Graduate Quantum Information (CMSC657)
- course :: Computer Science Honors Seminar
- course :: Differentiable Programming for Agentic AI (CMSC498Z)
- course :: Natural Language Processing (CMSC470)
- course :: Data Science (CMSC320)
- course :: Design & Analysis of Algorithms (CMSC451)
- course :: Object-Oriented Programming in Java (CMSC132)
- course :: Applied Probability & Statistics (STAT400)
- course :: Honors Advanced Modern Physics (PHYS400)
- course :: Quantum Mechanics II (PHYS402)
- course :: Accelerator Simulation
- course :: Multivariate Calculus
- course :: Linear Algebra
- course :: Differential Equations
* Organizations
** Industry Chair — Quantum Coalition
** Vice President — Quantum Coalition
:PROPERTIES:
:ID: 9ed6f6b0-5389-485f-aa00-e6c934737e3d
:ROLE: Industry Chair
:ROLE: Vice President
:ORG: Quantum Coalition
:DATES: Jan 2024 Present
:END:
- Co-organized the QRISE research competition with 200+ global participants.
- Partnered with the UN and ITU to deliver the QC-FLIQ hackathon (500+ attendees).
- Promoted to Vice President after serving as Industry Chair (Jan 2024 Aug 2025).
- Co-organized the QRISE research competition with 200+ international participants.
- Partnered with the UN and ITU to deliver the QC-FLIQ hackathon for the International Year of Quantum (500+ attendees).
** President — Undergraduate Quantum Association
:PROPERTIES:
@ -178,25 +283,25 @@ hardware, game development and literature.
:ORG: Undergraduate Quantum Association
:DATES: Jan 2025 Present
:END:
- Led programming, partnerships, and outreach after four years as an officer.
- Hosted the Quantum Leap Career Nexus with 240+ attendees across IBM, Microsoft, Amazon Braket, IonQ, and more.
- Led organizational strategy, programming, and outreach after serving as an officer since 2020.
- Produced the Quantum Leap Career Nexus with 240+ attendees and partners including IBM, Microsoft, and IonQ.
** Co-President — ACM@UMD
** Co-Founder — ACM@UMD
:PROPERTIES:
:ID: 145dbb0c-cf88-46e0-bc3e-052120e83978
:ROLE: Co-President
:ROLE: Co-Founder
:ORG: ACM@UMD
:DATES: Sep 2023 Present
:END:
- Restarted the official student chapter and launched a new web presence.
- Grew membership to 145+ students with workshops on shell scripting, AI, and quantum computing.
- Restarted the university chapter, launched a new website, and grew membership beyond 145 students.
- Led workshops focused on shell scripting, AI, quantum computing, and heuristic search techniques.
* Publications
** Quantum state reconstruction with variational quantum circuit
:PROPERTIES:
:ID: 0f86c17a-6165-4b78-9610-5d6cb3da2977
:TITLE: Quantum state reconstruction with variational quantum circuit
:STATUS: Preprint — arXiv:2507.01246
:STATUS: Accepted — Quantum Machine Intelligence (2025); arXiv:2507.01246
:END:
- Introduces a quantum machine learning approach to tomography for high-dimensional states.
- Benchmarks loss landscapes, embedding strategies, and optimizer behavior across noise models.
@ -208,16 +313,26 @@ hardware, game development and literature.
:TITLE: A Very Quick Guide to Special Relativity
:STATUS: Published — 2021
:END:
- Wrote and published an accessible primer covering time dilation through mass-energy equivalence.
- Authored and published an accessible primer covering time dilation through massenergy equivalence.
- Focused on first-principles explanations for students exploring modern physics.
* Skills
** Languages
- Python
- Go
- C
- C++
- C#
- JavaScript/TypeScript
- Rust (learning)
- Java
- Rust
- MATLAB
- SQL
- Verilog
- R
- Bash
- Nix
- Emacs Lisp
** Quantum
- Qiskit
@ -228,10 +343,13 @@ hardware, game development and literature.
** ML
- PyTorch
- TensorFlow Quantum
- TensorFlow
- NumPy
- SciPy
- scikit-learn
- Pandas
- SageMath
- OpenCV
- MPI
- Numba
@ -239,14 +357,27 @@ hardware, game development and literature.
- MAD-X
- Elegant
- Magma
- SageMath
- Fusion 360
- Ansys Workbench
- CFD
** Tools
- Git
- Linux / Unix
- Docker
- Google Cloud APIs
- NixOS
- Home-Manager
- Emacs / org-roam
- GCP
- Neo4j
- HPC
- Selenium
- Discord.py
- REST APIs
- Arduino
* Certifications
** Qiskit (v0.2x) — IBM
:PROPERTIES:
:ID: c468c5d7-e4e3-4589-a00a-1f40932f3ea4
:NAME: Qiskit (v0.2x)
:ISSUER: IBM
:END:

@ -0,0 +1,382 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Mihir Talati Resume</title>
<style>
/* Gruvbox dark palette (matches the terminal theme). */
:root {
--content-max-width: 960px;
--primary-text: #ebdbb2;
--secondary-text: #a89984;
--accent: #d79921;
--accent-bright: #fabd2f;
--card-bg: #32302f;
--card-border: rgba(215, 153, 33, 0.3);
--page-bg: radial-gradient(circle at top, #32302f 0%, #1d2021 60%);
--tag-bg: rgba(215, 153, 33, 0.12);
--tag-border: rgba(215, 153, 33, 0.4);
--filter-border: rgba(168, 153, 132, 0.4);
--filter-focus: rgba(215, 153, 33, 0.55);
--glass-highlight: rgba(235, 219, 178, 0.05);
}
* {
box-sizing: border-box;
}
body {
margin: 0;
font-family: 'IBM Plex Mono', 'Fira Code', ui-monospace, SFMono-Regular,
Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
background: #1d2021;
background-image: var(--page-bg);
color: var(--primary-text);
line-height: 1.65;
letter-spacing: 0.01em;
position: relative;
overflow-x: hidden;
min-height: 100vh;
}
.container {
max-width: var(--content-max-width);
margin: 0 auto;
padding: 64px 32px 96px;
}
header {
text-align: center;
margin-bottom: 56px;
}
header h1 {
margin: 0;
font-size: 2.6rem;
letter-spacing: 0.1em;
text-transform: uppercase;
color: #fbf1c7;
}
header p {
margin: 12px 0 0;
color: var(--secondary-text);
font-size: 1.05rem;
}
section + section {
margin-top: 56px;
}
.section-title {
font-size: 1.2rem;
font-weight: 700;
letter-spacing: 0.18em;
text-transform: uppercase;
color: var(--accent);
margin-bottom: 20px;
}
.card {
position: relative;
border-radius: 20px;
padding: 32px 36px;
background: var(--card-bg);
border: 1px solid var(--card-border);
box-shadow: 0 1px 0 var(--glass-highlight),
0 20px 40px rgba(0, 0, 0, 0.35);
}
.card::after {
content: '';
position: absolute;
inset: 12px;
border-radius: 14px;
border: 1px solid rgba(235, 219, 178, 0.05);
pointer-events: none;
}
.card + .card {
margin-top: 28px;
}
.card-header {
display: flex;
flex-wrap: wrap;
gap: 12px 16px;
align-items: baseline;
justify-content: space-between;
margin-bottom: 20px;
position: relative;
z-index: 1;
}
.card-title {
margin: 0;
font-size: 1.2rem;
font-weight: 600;
letter-spacing: 0.04em;
color: #fbf1c7;
}
.card-subtitle {
margin: 0;
font-weight: 500;
color: var(--secondary-text);
}
.card-meta {
text-align: right;
color: var(--secondary-text);
font-size: 0.95rem;
}
.meta-line {
display: block;
}
.tag-list {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin: 0 0 20px;
padding: 0;
list-style: none;
position: relative;
z-index: 1;
}
.tag {
display: inline-flex;
align-items: center;
padding: 5px 14px;
border-radius: 999px;
border: 1px solid var(--tag-border);
background: var(--tag-bg);
color: var(--accent-bright);
font-size: 0.85rem;
font-weight: 600;
letter-spacing: 0.02em;
}
ul.bullet-list {
margin: 0;
padding-left: 22px;
position: relative;
z-index: 1;
}
ul.bullet-list li {
margin-bottom: 12px;
color: var(--primary-text);
}
ul.bullet-list li:last-child {
margin-bottom: 0;
}
.education-grid {
display: grid;
gap: 32px;
}
.scholarships {
margin-top: 20px;
padding-top: 18px;
border-top: 1px solid rgba(168, 153, 132, 0.24);
}
.scholarships-title {
font-weight: 600;
margin: 0 0 10px;
color: var(--secondary-text);
letter-spacing: 0.08em;
text-transform: uppercase;
font-size: 0.75rem;
}
.courses-card {
background: linear-gradient(160deg, #32302f 0%, #1d2021 70%);
border-radius: 24px;
padding: 36px;
border: 1px solid rgba(215, 153, 33, 0.35);
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.35);
position: relative;
overflow: hidden;
}
.filter-label {
display: block;
font-weight: 600;
letter-spacing: 0.18em;
text-transform: uppercase;
font-size: 0.75rem;
color: var(--secondary-text);
margin-bottom: 8px;
position: relative;
z-index: 1;
}
.filter-input {
width: 100%;
padding: 14px 18px;
border-radius: 12px;
border: 1px solid var(--filter-border);
font-size: 1rem;
background: #1d2021;
color: var(--primary-text);
transition: border-color 0.2s ease, box-shadow 0.2s ease;
position: relative;
z-index: 1;
}
.filter-input::placeholder {
color: rgba(168, 153, 132, 0.6);
}
.filter-input:focus {
outline: none;
border-color: var(--filter-focus);
box-shadow: 0 0 0 4px rgba(215, 153, 33, 0.18);
}
.courses-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
gap: 14px;
margin-top: 26px;
position: relative;
z-index: 1;
}
.course-pill {
background: #3c3836;
border-radius: 16px;
padding: 12px 16px;
border: 1px solid rgba(215, 153, 33, 0.35);
font-weight: 500;
color: var(--primary-text);
box-shadow: 0 12px 24px rgba(0, 0, 0, 0.3);
transition: transform 0.15s ease, box-shadow 0.15s ease,
border-color 0.15s ease;
}
.course-pill:hover {
transform: translateY(-2px);
border-color: rgba(215, 153, 33, 0.65);
box-shadow: 0 16px 32px rgba(0, 0, 0, 0.4);
}
.course-pill.hidden {
display: none;
}
.empty-state {
display: none;
margin-top: 24px;
padding: 18px;
border-radius: 14px;
background: rgba(40, 40, 40, 0.8);
border: 1px dashed rgba(215, 153, 33, 0.5);
color: var(--secondary-text);
text-align: center;
font-weight: 500;
position: relative;
z-index: 1;
}
a {
color: var(--accent);
}
@media (max-width: 720px) {
header h1 {
font-size: 2.1rem;
}
.card {
padding: 26px;
}
.card-header {
flex-direction: column;
align-items: flex-start;
}
.card-meta {
text-align: left;
}
.courses-grid {
grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
}
}
</style>
<style>
/* generated-page additions */
.toolbar {
margin-bottom: 40px;
}
.hidden {
display: none !important;
}
section.hidden {
display: none;
}
.card[data-search] {
scroll-margin-top: 20px;
}
</style>
</head>
<body>
<div class="container">
<header>
<h1>{{NAME}}</h1>
<p>{{HEADER_SUB}}</p>
</header>
<div class="courses-card toolbar">
<label class="filter-label" for="global-search">Search résumé</label>
<input
class="filter-input"
id="global-search"
type="search"
placeholder="Filter by keyword, tech, or course…"
autocomplete="off"
/>
</div>
{{SECTIONS}}
<div class="empty-state" id="global-empty">
No entries match that search. Try a broader keyword.
</div>
</div>
<script>
const search = document.getElementById('global-search');
const empty = document.getElementById('global-empty');
const items = Array.from(document.querySelectorAll('[data-search]'));
const sections = Array.from(
document.querySelectorAll('main section, .container section'),
);
function apply(value) {
const q = value.trim().toLowerCase();
let total = 0;
items.forEach((el) => {
const hit = el.getAttribute('data-search').includes(q);
el.classList.toggle('hidden', !hit);
if (hit) total += 1;
});
sections.forEach((sec) => {
const vis = sec.querySelectorAll('[data-search]:not(.hidden)').length;
sec.classList.toggle('hidden', vis === 0);
});
empty.style.display = total === 0 ? 'block' : 'none';
}
search.addEventListener('input', (e) => apply(e.target.value));
</script>
</body>
</html>

@ -0,0 +1,268 @@
#!/usr/bin/env node
// =============================================================================
// Module contract (praxis: Contract-First Modules · Tangle Discipline)
//
// provides — render the plain résumé page (public/resume.html) from the
// resume.json mirror + resume.template.html. One concern: json ->
// styled HTML. The template owns the design (hand-maintained); the
// content is generated so the plain page and terminal share one
// source (Single Source of Truth).
// requires — resume.json (generated from resume.org), resume.template.html.
// tests must show —
// * every section renders one card per item with its bullets/tech/meta;
// * courses render as filterable pills; each card/pill has data-search;
// * output is byte-stable so the CI canary (regen + diff) only trips on
// real drift; text is HTML-escaped; arXiv ids linkify.
//
// Flow is ONE-WAY: resume.json -> public/resume.html. Never hand-edit the
// generated page; edit resume.org (content) or resume.template.html (design).
// Usage: node scripts/build-resume-html.mjs [--check]
// =============================================================================
import { readFileSync, writeFileSync } from 'node:fs';
const SRC = 'resume.json';
const TEMPLATE = 'resume.template.html';
const OUT = 'public/resume.html';
const esc = (s = '') =>
String(s)
.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;');
// arXiv ids become links; run after escaping (ids are digits/dots, escape-safe).
const linkifyArxiv = (s) =>
s.replace(
/arXiv:(\d{4}\.\d{4,5})/gi,
(_m, id) => `<a href="https://arxiv.org/abs/${id}">arXiv:${id}</a>`,
);
const searchKey = (...parts) =>
esc(
parts.flat().filter(Boolean).join(' ').toLowerCase().replace(/\s+/g, ' '),
);
const tagList = (tech) =>
tech && tech.length
? `\n <ul class="tag-list">${tech
.map((t) => `<li class="tag">${esc(t)}</li>`)
.join('')}</ul>`
: '';
const bulletList = (bullets) =>
bullets && bullets.length
? `\n <ul class="bullet-list">${bullets
.map((x) => `<li>${linkifyArxiv(esc(x))}</li>`)
.join('')}</ul>`
: '';
const metaBlock = (lines) => {
const kept = lines.filter(Boolean);
if (!kept.length) return '';
return `\n <div class="card-meta">${kept
.map((l) => `<span class="meta-line">${esc(l)}</span>`)
.join('')}</div>`;
};
const card = ({ title, subtitle, meta = [], tech, bullets, search }) => `
<article class="card" data-search="${search}">
<div class="card-header">
<div>
<h3 class="card-title">${esc(title)}</h3>${
subtitle ? `\n <p class="card-subtitle">${esc(subtitle)}</p>` : ''
}
</div>${metaBlock(meta)}
</div>${tagList(tech)}${bulletList(bullets)}
</article>`;
const section = (id, heading, inner) =>
` <section id="${id}">\n <h2 class="section-title">${esc(
heading,
)}</h2>\n${inner}\n </section>`;
function render(data) {
const {
profile,
experience,
projects,
organizations,
publications,
certifications = [],
education,
} = data;
const edu = education[0] || {};
const eduCard = card({
title: edu.school,
subtitle: edu.subtitle,
meta: [`Expected Graduation · ${edu.graduation}`, `GPA · ${edu.gpa}`],
bullets: null,
search: searchKey(edu.school, edu.subtitle, edu.degrees, edu.honors),
});
const eduScholar =
edu.honors && edu.honors.length
? `\n <div class="scholarships">\n <p class="scholarships-title">Scholarships &amp; Distinctions</p>\n <ul class="bullet-list">${edu.honors
.map((h) => `<li>${esc(h)}</li>`)
.join('')}</ul>\n </div>`
: '';
// inject scholarships before the closing </article> of the education card
const eduHtml = eduCard.replace(
'\n </article>',
`${eduScholar}\n </article>`,
);
const educationSection = section(
'education',
'Education',
` <div class="education-grid">${eduHtml}\n </div>`,
);
const experienceSection = section(
'work',
'Work Experience',
experience
.map((e) =>
card({
title: `${e.role} · ${e.company}`,
subtitle: e.subtitle,
meta: [e.dates, e.location],
tech: e.tech,
bullets: e.bullets,
search: searchKey(
e.role,
e.company,
e.subtitle,
e.location,
e.tech,
e.bullets,
),
}),
)
.join('\n'),
);
const projectsSection = section(
'projects',
'Projects',
projects
.map((p) =>
card({
title: p.name,
subtitle: p.subtitle,
meta: [p.timeline],
tech: p.tech,
bullets: p.bullets,
search: searchKey(p.name, p.subtitle, p.tech, p.bullets),
}),
)
.join('\n'),
);
const orgsSection = section(
'organizations',
'Organizations',
organizations
.map((o) =>
card({
title: `${o.role} · ${o.org}`,
meta: [o.dates],
bullets: o.bullets,
search: searchKey(o.role, o.org, o.bullets),
}),
)
.join('\n'),
);
const pubsSection = section(
'publications',
'Publications',
publications
.map((p) =>
card({
title: p.title,
subtitle: p.status,
bullets: p.bullets,
search: searchKey(p.title, p.status, p.bullets),
}),
)
.join('\n'),
);
const pills = (edu.coursework || [])
.map(
(c) =>
` <span class="course-pill" data-search="${searchKey(
c,
)}">${esc(c)}</span>`,
)
.join('\n');
const coursesSection = section(
'courses',
'Relevant Courses',
` <div class="courses-card">\n <div class="courses-grid" id="courses-grid">\n${pills}\n </div>\n </div>`,
);
const certsSection = certifications.length
? section(
'certifications',
'Certifications',
` <div class="courses-card">\n <div class="courses-grid" id="certs-grid">\n${certifications
.map((c) => {
const label = c.issuer ? `${c.name} · ${c.issuer}` : c.name;
return ` <span class="course-pill" data-search="${searchKey(
c.name,
c.issuer,
)}">${esc(label)}</span>`;
})
.join('\n')}\n </div>\n </div>`,
)
: '';
const sections = [
educationSection,
experienceSection,
projectsSection,
orgsSection,
pubsSection,
certsSection,
coursesSection,
]
.filter(Boolean)
.join('\n\n');
const headerSub = `Dual Degree · ${(edu.degrees || []).join(' & ')} · GPA ${
edu.gpa
}`;
return readFileSync(TEMPLATE, 'utf8')
.replace('{{NAME}}', esc(profile.name))
.replace('{{HEADER_SUB}}', esc(headerSub))
.replace('{{SECTIONS}}', sections);
}
function main() {
const check = process.argv.includes('--check');
const html = render(JSON.parse(readFileSync(SRC, 'utf8')));
if (check) {
let current = '';
try {
current = readFileSync(OUT, 'utf8');
} catch {
/* missing counts as drift */
}
if (current !== html) {
process.stderr.write(
`DRIFT: ${OUT} is out of sync. Run: node scripts/build-resume-html.mjs\n`,
);
process.exit(1);
}
process.stdout.write(`ok: ${OUT} matches ${SRC}\n`);
return;
}
writeFileSync(OUT, html);
process.stdout.write(`wrote ${OUT} from ${SRC}\n`);
}
main();

@ -28,17 +28,40 @@ const GENERATED_NOTE =
'Regenerate: node scripts/org-to-json.mjs';
// Section registry — the fixed schema the parser understands.
// `fields` are optional scalar drawer props (included only when present);
// `tagged` routes `- k :: v` bullets into named arrays; `list: false` means
// the item has no free-form bullets array (education is all tagged).
const SECTIONS = {
profile: { kind: 'profile' },
experience: { kind: 'items', fields: ['role', 'company', 'dates'] },
projects: { kind: 'items', fields: ['name', 'timeline'] },
experience: {
kind: 'items',
fields: ['role', 'company', 'dates', 'subtitle', 'location'],
tagged: { tech: 'tech' },
list: true,
},
projects: {
kind: 'items',
fields: ['name', 'timeline', 'subtitle'],
tagged: { tech: 'tech' },
list: true,
},
education: {
kind: 'items',
fields: ['school', 'gpa', 'graduation'],
fields: ['school', 'gpa', 'graduation', 'subtitle'],
tagged: { degree: 'degrees', honor: 'honors', course: 'coursework' },
list: false,
},
organizations: {
kind: 'items',
fields: ['role', 'org', 'dates'],
list: true,
},
publications: { kind: 'items', fields: ['title', 'status'], list: true },
certifications: {
kind: 'items',
fields: ['name', 'issuer', 'date'],
list: false,
},
organizations: { kind: 'items', fields: ['role', 'org', 'dates'] },
publications: { kind: 'items', fields: ['title', 'status'] },
skills: { kind: 'skills' },
};
@ -76,7 +99,10 @@ function makeItem(cfg, props, bullets) {
plain.push(raw);
}
}
if (!cfg.tagged) item.bullets = plain;
// Drop empty tagged arrays so optional groups (e.g. tech) don't add noise.
for (const key of Object.values(tagged))
if (item[key].length === 0) delete item[key];
if (cfg.list) item.bullets = plain;
return item;
}
@ -89,6 +115,7 @@ function parse(text) {
education: [],
organizations: [],
publications: [],
certifications: [],
skills: {},
};
const bioLines = [];
@ -134,7 +161,8 @@ function parse(text) {
flushSkill();
const key = slug(label);
section = SECTIONS[key] ? { key, cfg: SECTIONS[key] } : null;
if (!section) process.stderr.write(`warn: unknown section "${label}"\n`);
if (!section)
process.stderr.write(`warn: unknown section "${label}"\n`);
} else if (level === 2 && section) {
if (section.cfg.kind === 'items') {
flushItem();
@ -150,8 +178,10 @@ function parse(text) {
if (t.startsWith('- ')) {
const val = t.slice(2).trim();
if (section && section.cfg.kind === 'items' && itemBullets) itemBullets.push(val);
else if (section && section.cfg.kind === 'skills' && skillCat) skillCat.list.push(val);
if (section && section.cfg.kind === 'items' && itemBullets)
itemBullets.push(val);
else if (section && section.cfg.kind === 'skills' && skillCat)
skillCat.list.push(val);
continue;
}
@ -175,6 +205,7 @@ function serialize(data) {
education: data.education,
organizations: data.organizations,
publications: data.publications,
certifications: data.certifications,
skills: data.skills,
};
return JSON.stringify(ordered, null, 2) + '\n';

@ -0,0 +1,49 @@
import React from 'react';
import { Ps1 } from './Ps1';
export interface HistoryEntry {
id: number;
date: Date;
command: string;
output: string;
}
export const useHistory = (defaultValue: HistoryEntry[]) => {
const [history, setHistory] = React.useState<HistoryEntry[]>(defaultValue);
const [command, setCommand] = React.useState('');
const [lastCommandIndex, setLastCommandIndex] = React.useState(0);
return {
history,
command,
lastCommandIndex,
setHistory: (value: string) =>
setHistory([
...history,
{ id: history.length, date: new Date(), command, output: value },
]),
setCommand,
setLastCommandIndex,
clearHistory: () => setHistory([]),
};
};
export const History: React.FC<{ history: HistoryEntry[] }> = ({ history }) => (
<>
{history.map((entry, index) => (
<div key={entry.command + index}>
<div className="flex flex-row space-x-2">
<div className="flex-shrink">
<Ps1 />
</div>
<div className="flex-grow">{entry.command}</div>
</div>
<p
className="whitespace-pre-wrap mb-2"
style={{ lineHeight: 'normal' }}
dangerouslySetInnerHTML={{ __html: entry.output }}
/>
</div>
))}
</>
);

@ -1,17 +1,14 @@
import React from 'react';
import config from '../../config.json';
export const Ps1 = () => {
export const Ps1: React.FC<{ username?: string }> = ({ username }) => {
const name = username && username.length > 0 ? username : config.ps1_username;
return (
<div>
<span className="text-light-yellow dark:text-dark-yellow">
{config.ps1_username}
</span>
<span className="text-light-gray dark:text-dark-gray">@</span>
<span className="text-light-green dark:text-dark-green">
{config.ps1_hostname}
</span>
<span className="text-light-gray dark:text-dark-gray">:$ ~ </span>
<span className="text-light-yellow dark:text-dark-yellow">{name}</span>
<span className="ps1-separator">@</span>
<span className="ps1-host">{config.ps1_hostname}</span>
<span className="ps1-path">:$ ~ </span>
</div>
);
};

@ -1,31 +0,0 @@
import React from 'react';
import { History as HistoryInterface } from './interface';
import { Ps1 } from '../Ps1';
export const History: React.FC<{ history: Array<HistoryInterface> }> = ({
history,
}) => {
return (
<>
{history.map((entry: HistoryInterface, index: number) => (
<div key={entry.command + index}>
<div className="flex flex-row space-x-2">
<div className="flex-shrink">
<Ps1 />
</div>
<div className="flex-grow">{entry.command}</div>
</div>
<p
className="whitespace-pre-wrap mb-2"
style={{ lineHeight: 'normal' }}
dangerouslySetInnerHTML={{ __html: entry.output }}
/>
</div>
))}
</>
);
};
export default History;

@ -1,27 +0,0 @@
import React from 'react';
import { History } from './interface';
export const useHistory = (defaultValue: Array<History>) => {
const [history, setHistory] = React.useState<Array<History>>(defaultValue);
const [command, setCommand] = React.useState<string>('');
const [lastCommandIndex, setLastCommandIndex] = React.useState<number>(0);
return {
history,
command,
lastCommandIndex,
setHistory: (value: string) =>
setHistory([
...history,
{
id: history.length,
date: new Date(),
command,
output: value,
},
]),
setCommand,
setLastCommandIndex,
clearHistory: () => setHistory([]),
};
};

@ -1,6 +0,0 @@
export interface History {
id: number;
date: Date;
command: string;
output: string;
}

@ -14,9 +14,21 @@ export const Input = ({
setHistory,
setLastCommandIndex,
clearHistory,
username,
}: {
inputRef: React.MutableRefObject<HTMLInputElement>;
containerRef: React.MutableRefObject<any>;
command: string;
history: any[];
lastCommandIndex: number;
setCommand: (v: string) => void;
setHistory: (v: string) => void;
setLastCommandIndex: (v: number) => void;
clearHistory: () => void;
username?: string;
}) => {
const onSubmit = async (event: React.KeyboardEvent<HTMLInputElement>) => {
const commands: [string] = history
const commands: string[] = history
.map(({ command }) => command)
.filter((command: string) => command);
@ -79,21 +91,22 @@ export const Input = ({
};
return (
<div className="flex flex-row space-x-2">
<div className="terminal-current-line flex flex-row space-x-2">
<label htmlFor="prompt" className="flex-shrink">
<Ps1 />
<Ps1 username={username} />
</label>
<input
ref={inputRef}
id="prompt"
type="text"
className={`bg-light-background dark:bg-dark-background focus:outline-none flex-grow ${
className={`bg-transparent focus:outline-none flex-grow ${
commandExists(command) || command === ''
? 'text-dark-green'
: 'text-dark-red'
}`}
value={command}
placeholder="try help, ls, resume, or summary"
onChange={onChange}
autoFocus
onKeyDown={onSubmit}

@ -1,23 +1,74 @@
import React from 'react';
import '../styles/global.css';
import Head from 'next/head';
import config from '../../config.json';
const App = ({ Component, pageProps }) => {
const inputRef = React.useRef<HTMLInputElement>(null);
const onClickAnywhere = () => {
inputRef.current.focus();
inputRef.current?.focus();
};
// Live updates for the sumfetch datetime and age fields.
React.useEffect(() => {
const birth = new Date(2005, 6, 26); // 26 July 2005 (month is 0-based)
const pad = (n: number) => String(n).padStart(2, '0');
const fmtNow = () => {
const n = new Date();
return `${n.getFullYear()}-${pad(n.getMonth() + 1)}-${pad(
n.getDate(),
)} ${pad(n.getHours())}:${pad(n.getMinutes())}:${pad(n.getSeconds())}`;
};
const computeAge = () => {
const n = new Date();
let years = n.getFullYear() - birth.getFullYear();
const anniv = new Date(
n.getFullYear(),
birth.getMonth(),
birth.getDate(),
);
if (n < anniv) years -= 1;
let lastBD = new Date(n.getFullYear(), birth.getMonth(), birth.getDate());
if (n < lastBD)
lastBD = new Date(
n.getFullYear() - 1,
birth.getMonth(),
birth.getDate(),
);
const days = Math.floor((n.getTime() - lastBD.getTime()) / 86400000);
return `${years}y ${days}d`;
};
const tick = () => {
document.querySelectorAll('[data-sum-dt]').forEach((el) => {
(el as HTMLElement).textContent = fmtNow();
});
document.querySelectorAll('[data-sum-age]').forEach((el) => {
(el as HTMLElement).textContent = computeAge();
});
};
tick();
const id = window.setInterval(tick, 1000);
return () => window.clearInterval(id);
}, []);
return (
<>
<Head>
<title>{config.title}</title>
<meta
name="viewport"
content="initial-scale=1.0, width=device-width"
key="viewport"
maximum-scale="1"
/>
<link
rel="preload"
href="/assets/fonts/Hack-NF.ttf"
as="font"
type="font/ttf"
crossOrigin="anonymous"
/>
</Head>
<div

@ -0,0 +1,15 @@
import { Html, Head, Main, NextScript } from 'next/document';
// Dark mode is enforced regardless of system settings: the `dark` class on
// <html> makes every Tailwind `dark:` variant apply (darkMode: 'class').
export default function Document() {
return (
<Html lang="en" className="dark">
<Head />
<body>
<Main />
<NextScript />
</body>
</Html>
);
}

@ -2,9 +2,8 @@ import Head from 'next/head';
import React from 'react';
import config from '../../config.json';
import { Input } from '../components/input';
import { useHistory } from '../components/history/hook';
import { History } from '../components/history/History';
import { banner } from '../utils/bin';
import { History, useHistory } from '../components/History';
import { sumfetch } from '../utils/bin';
interface IndexPageProps {
inputRef: React.MutableRefObject<HTMLInputElement>;
@ -22,7 +21,9 @@ const IndexPage: React.FC<IndexPageProps> = ({ inputRef }) => {
setLastCommandIndex,
} = useHistory([]);
const init = React.useCallback(() => setHistory(banner()), []);
const init = React.useCallback(() => {
sumfetch([]).then((out) => setHistory(out));
}, []);
React.useEffect(() => {
init();
@ -41,10 +42,9 @@ const IndexPage: React.FC<IndexPageProps> = ({ inputRef }) => {
<title>{config.title}</title>
</Head>
<div className="p-8 overflow-hidden h-full border-2 rounded border-light-yellow dark:border-dark-yellow">
<div className="p-4 md:p-8 overflow-hidden h-full">
<div ref={containerRef} className="overflow-y-auto h-full">
<History history={history} />
<Input
inputRef={inputRef}
containerRef={containerRef}
@ -58,6 +58,15 @@ const IndexPage: React.FC<IndexPageProps> = ({ inputRef }) => {
/>
</div>
</div>
<a
href={config.resume_url}
target="_blank"
rel="noreferrer"
className="resume-fab"
>
resume
</a>
</>
);
};

@ -27,15 +27,109 @@ div#__next > div {
}
::-webkit-scrollbar-track {
background: #1e252e;
background: rgba(0, 0, 0, 0.15);
border-radius: 5px;
}
::-webkit-scrollbar-thumb {
background: #ebdbb2;
background: rgba(215, 153, 33, 0.5);
border-radius: 5px;
}
::-webkit-scrollbar-thumb:hover {
background: #ff8037;
background: rgba(215, 153, 33, 0.75);
}
/* --- Prompt line --- */
.terminal-current-line {
padding: 2px 0;
}
.ps1-separator {
color: rgba(215, 153, 33, 0.85);
margin: 0 2px;
}
.ps1-host {
color: #8ec07c;
}
.ps1-path {
color: rgba(235, 219, 178, 0.85);
margin-left: 4px;
}
/* --- Clickable elements, modern-terminal style: underline on hover --- */
.term-link {
color: inherit;
text-decoration: none;
border-bottom: 1px dotted currentColor;
cursor: pointer;
}
.term-link:hover {
text-decoration: none;
border-bottom-style: solid;
filter: brightness(1.25);
}
/* --- Tree listing (ls) --- */
.tree {
white-space: pre-wrap;
}
.tree-branch {
color: rgba(215, 153, 33, 0.65);
}
.tree-row {
display: inline;
padding: 0 3px;
border-radius: 3px;
}
.tree-row:hover {
background: rgba(215, 153, 33, 0.12);
}
/* --- sumfetch: flat text summary --- */
.sumfetch {
white-space: pre-wrap;
margin: 0;
line-height: 1.35;
}
.sf-name {
font-weight: 700;
font-size: 1.05em;
color: #fabd2f;
}
.sf-title {
color: rgba(215, 153, 33, 0.85);
font-weight: 700;
}
.sf-key {
color: #a89984;
}
.sf-link {
color: inherit;
text-decoration: none;
border-bottom: 1px dotted currentColor;
}
.sf-link:hover {
border-bottom-style: solid;
filter: brightness(1.25);
}
/* --- Floating resume button --- */
.resume-fab {
position: fixed;
bottom: 1rem;
right: 1rem;
z-index: 50;
font-size: 0.75rem;
padding: 0.375rem 0.75rem;
border: 1px solid rgba(215, 153, 33, 0.6);
color: rgba(235, 219, 178, 0.9);
text-decoration: none;
transition: background-color 0.15s ease, color 0.15s ease;
}
.resume-fab:hover {
background: rgba(215, 153, 33, 0.85);
color: #1d2021;
}

@ -1,9 +1,10 @@
import axios from 'axios';
import config from '../../config.json';
import { profile } from './resume';
export const getProjects = async () => {
const { data } = await axios.get(
`https://api.github.com/users/${config.social.github}/repos`,
`https://api.github.com/users/${profile.github}/repos`,
);
return data;
};

@ -1,36 +0,0 @@
// // List of commands that require API calls
import { getProjects } from '../api';
import { getQuote } from '../api';
import { getReadme } from '../api';
import { getWeather } from '../api';
export const projects = async (args: string[]): Promise<string> => {
const projects = await getProjects();
return projects
.map(
(repo) =>
`${repo.name} - <a class="text-light-blue dark:text-dark-blue underline" href="${repo.html_url}" target="_blank">${repo.html_url}</a>`,
)
.join('\n');
};
export const quote = async (args: string[]): Promise<string> => {
const data = await getQuote();
return data.quote;
};
export const readme = async (args: string[]): Promise<string> => {
const readme = await getReadme();
return `Opening GitHub README...\n
${readme}`;
};
export const weather = async (args: string[]): Promise<string> => {
const city = args.join('+');
if (!city) {
return 'Usage: weather [city]. Example: weather casablanca';
}
const weather = await getWeather(city);
return weather;
};

@ -1,76 +1,182 @@
// List of commands that do not require API calls
import * as bin from './index';
import config from '../../../config.json';
import {
profile,
experience,
projects,
education,
organizations,
publications,
certifications,
skills,
catLabel,
} from '../resume';
import { getProjects, getQuote, getReadme, getWeather } from '../api';
const b = (s: string) => `${s}`;
const link = (href: string, text: string) =>
`<a class="term-link" href="${href}" target="_blank" rel="noopener noreferrer">${text}</a>`;
// Turn "arXiv:2507.01246" mentions into a clickable link, in place.
const linkifyArxiv = (s: string) =>
s.replace(/arXiv:(\d{4}\.\d{4,5})/gi, (_m, id) =>
link(`https://arxiv.org/abs/${id}`, `arXiv:${id}`),
);
export const help = async (_args: string[]): Promise<string> => {
const cmds: [string, string][] = [
['about', 'short bio'],
[
'ls [section]',
'browse résumé — experience projects education skills organizations publications certifications',
],
['summary', 'full text profile'],
['sumfetch', 'profile card'],
['resume', 'open résumé page in a new tab'],
['email', 'open mailto link'],
['linkedin', 'open LinkedIn profile'],
['github', 'open GitHub profile'],
['github_projects', 'list public GitHub repos'],
['weather [city]', 'current weather'],
['quote', 'random quote'],
['clear', 'clear the terminal'],
];
const rows = cmds
.map(
([cmd, desc], i) =>
`${i === cmds.length - 1 ? '└' : '├'} ${cmd.padEnd(18)}${desc}`,
)
.join('\n');
return `Commands:\n${rows}\n\n[tab] complete [ctrl+l] clear [↑/↓] history`;
};
export const about = async (_args: string[]): Promise<string> => {
return `${profile.name}\n${profile.bio}\n\ntype 'sumfetch' for the profile card, 'ls' to browse sections`;
};
const SECTIONS = [
['experience', 'professional history'],
['projects', 'things built'],
['education', 'degrees & coursework'],
['organizations', 'leadership roles'],
['publications', 'papers & writing'],
['certifications', 'credentials'],
['skills', 'technical stack'],
] as const;
// Help
export const help = async (args: string[]): Promise<string> => {
const commands = Object.keys(bin).sort().join(', ');
var c = '';
for (let i = 1; i <= Object.keys(bin).sort().length; i++) {
if (i % 7 === 0) {
c += Object.keys(bin).sort()[i - 1] + '\n';
} else {
c += Object.keys(bin).sort()[i - 1] + ' ';
}
export const ls = async (args: string[]): Promise<string> => {
const section = (args[0] ?? '').toLowerCase().replace(/\/$/, '');
if (!section) {
const rows = SECTIONS.map(([name, desc], i) => {
const branch = i === SECTIONS.length - 1 ? '└' : '├';
return `<span class="tree-branch">${branch}</span> <span class="tree-row">${name.padEnd(
15,
)}${desc}</span>`;
}).join('\n');
return `<span class="tree">~/\n${rows}</span>\n\nuse 'ls &lt;section&gt;' to read, e.g. 'ls experience'`;
}
return `Welcome! Here are all the available commands:
\n${c}\n
[tab]: trigger completion.
[ctrl+l]/clear: clear terminal.\n
Type 'sumfetch' to display summary.
`;
};
// Redirection
export const repo = async (args: string[]): Promise<string> => {
window.open(`${config.repo}`);
return 'Opening Github repository...';
};
// About
export const about = async (args: string[]): Promise<string> => {
return `Hi, I am ${config.name}.
Welcome to my website!
More about me:
'sumfetch' - short summary.
'resume' - my latest resume.
'readme' - my github readme.`;
switch (section) {
case 'about':
return `${profile.name}\n${profile.bio}`;
case 'experience':
return experience
.map(
(e) =>
`${e.role} @ ${e.company} (${e.dates})\n${e.bullets
.map(b)
.join('\n')}`,
)
.join('\n\n');
case 'projects':
return projects
.map(
(p) =>
`${p.name} [${p.timeline}]\n${p.bullets
.map((x) => b(linkifyArxiv(x)))
.join('\n')}`,
)
.join('\n\n');
case 'education':
return education
.map((e) =>
[
e.school,
e.degrees.map((d) => ` ${d}`).join('\n'),
` GPA: ${e.gpa} · Graduation: ${e.graduation}`,
'',
'Honors:',
e.honors.map(b).join('\n'),
'',
'Coursework:',
e.coursework.map(b).join('\n'),
].join('\n'),
)
.join('\n\n');
case 'organizations':
return organizations
.map(
(o) =>
`${o.role} @ ${o.org} (${o.dates})\n${o.bullets
.map(b)
.join('\n')}`,
)
.join('\n\n');
case 'publications':
return publications
.map(
(p) =>
`${p.title}\n ${linkifyArxiv(p.status)}\n${p.bullets
.map((x) => b(linkifyArxiv(x)))
.join('\n')}`,
)
.join('\n\n');
case 'certifications':
return certifications
.map((c) => (c.issuer ? `${c.name}${c.issuer}` : c.name))
.join('\n');
case 'skills':
return Object.entries(skills)
.map(
([cat, items]) =>
`${(catLabel(cat) + ':').padEnd(13)}${items.join(', ')}`,
)
.join('\n');
default:
return `ls: '${section}' not found\nSections: ${SECTIONS.map(
([n]) => n,
).join(', ')}`;
}
};
export const resume = async (args: string[]): Promise<string> => {
window.open(`${config.resume_url}`);
return 'Opening resume...';
export const resume = async (_args: string[]): Promise<string> => {
window.open(config.resume_url);
return 'Opening résumé...';
};
// Donate
export const donate = async (args: string[]): Promise<string> => {
return `thank you for your interest.
here are the ways you can support my work:
- <u><a class="text-light-blue dark:text-dark-blue underline" href="${config.donate_urls.paypal}" target="_blank">paypal</a></u>
- <u><a class="text-light-blue dark:text-dark-blue underline" href="${config.donate_urls.patreon}" target="_blank">patreon</a></u>
`;
export const email = async (_args: string[]): Promise<string> => {
window.open(`mailto:${profile.email}`);
return `Opening mailto:${profile.email}...`;
};
// Contact
export const email = async (args: string[]): Promise<string> => {
window.open(`mailto:${config.email}`);
return `Opening mailto:${config.email}...`;
export const github = async (_args: string[]): Promise<string> => {
window.open(`https://github.com/${profile.github}/`);
return 'Opening GitHub...';
};
export const github = async (args: string[]): Promise<string> => {
window.open(`https://github.com/${config.social.github}/`);
return 'Opening github...';
};
export const linkedin = async (args: string[]): Promise<string> => {
window.open(`https://www.linkedin.com/in/${config.social.linkedin}/`);
return 'Opening linkedin...';
export const linkedin = async (_args: string[]): Promise<string> => {
window.open(`https://www.linkedin.com/in/${profile.linkedin}/`);
return 'Opening LinkedIn...';
};
// Search
export const google = async (args: string[]): Promise<string> => {
window.open(`https://google.com/search?q=${args.join(' ')}`);
return `Searching google for ${args.join(' ')}...`;
@ -81,77 +187,54 @@ export const duckduckgo = async (args: string[]): Promise<string> => {
return `Searching duckduckgo for ${args.join(' ')}...`;
};
export const bing = async (args: string[]): Promise<string> => {
window.open(`https://bing.com/search?q=${args.join(' ')}`);
return `Wow, really? You are using bing for ${args.join(' ')}?`;
};
export const reddit = async (args: string[]): Promise<string> => {
window.open(`https://www.reddit.com/search/?q=${args.join(' ')}`);
return `Searching reddit for ${args.join(' ')}...`;
};
// Typical linux commands
export const echo = async (args: string[]): Promise<string> => {
return args.join(' ');
};
export const whoami = async (args: string[]): Promise<string> => {
return `${config.ps1_username}`;
};
export const echo = async (args: string[]): Promise<string> => args.join(' ');
export const ls = async (args: string[]): Promise<string> => {
return `a
bunch
of
fake
directories`;
};
export const whoami = async (_args: string[]): Promise<string> =>
config.ps1_username;
export const cd = async (args: string[]): Promise<string> => {
return `unfortunately, i cannot afford more directories.
if you want to help, you can type 'donate'.`;
};
export const date = async (_args: string[]): Promise<string> =>
new Date().toString();
export const date = async (args: string[]): Promise<string> => {
return new Date().toString();
};
export const vi = async (_args: string[]): Promise<string> =>
`woah, you still use 'vi'? just try 'vim'.`;
export const vim = async (_args: string[]): Promise<string> =>
`'vim' is so outdated. how about 'nvim'?`;
export const nvim = async (_args: string[]): Promise<string> =>
`'nvim'? too fancy. why not 'emacs'?`;
export const emacs = async (_args?: string[]): Promise<string> =>
`you know what? just use vscode.`;
export const vi = async (args: string[]): Promise<string> => {
return `woah, you still use 'vi'? just try 'vim'.`;
export const sudo = async (_args?: string[]): Promise<string> => {
window.open('https://www.youtube.com/watch?v=dQw4w9WgXcQ', '_blank');
return `Permission denied: with little power comes... no responsibility?`;
};
export const vim = async (args: string[]): Promise<string> => {
return `'vim' is so outdated. how about 'nvim'?`;
};
// --- API commands ---
export const nvim = async (args: string[]): Promise<string> => {
return `'nvim'? too fancy. why not 'emacs'?`;
export const github_projects = async (_args: string[]): Promise<string> => {
const repos = await getProjects();
return repos
.map((repo: any) => `${repo.name}${link(repo.html_url, repo.html_url)}`)
.join('\n');
};
export const emacs = async (args?: string[]): Promise<string> => {
return `you know what? just use vscode.`;
export const quote = async (_args: string[]): Promise<string> => {
const data = await getQuote();
return data.quote;
};
export const sudo = async (args?: string[]): Promise<string> => {
window.open('https://www.youtube.com/watch?v=dQw4w9WgXcQ', '_blank'); // ...I'm sorry
return `Permission denied: with little power comes... no responsibility? `;
export const readme = async (_args: string[]): Promise<string> => {
const data = await getReadme();
return `Opening GitHub README...\n\n${data}`;
};
// Banner
export const banner = (args?: string[]): string => {
return `
Type 'help' to see the list of available commands.
Type 'sumfetch' to display summary.
Type 'repo' or click <u><a class="text-light-blue dark:text-dark-blue underline" href="${config.repo}" target="_blank">here</a></u> for the Github repository.
`;
export const weather = async (args: string[]): Promise<string> => {
const city = args.join('+');
if (!city) return 'Usage: weather [city]. Example: weather london';
return getWeather(city);
};

@ -1,3 +1,2 @@
export * from './commands';
export * from './api_commands';
export { default as sumfetch } from './sumfetch';
export * from './sumfetch';

@ -1,46 +1,164 @@
import config from '../../../config.json';
import {
profile,
experience,
projects,
education,
organizations,
publications,
certifications,
skills,
catLabel,
} from '../resume';
const sumfetch = async (args: string[]): Promise<string> => {
if (config.ascii === 'cveinnt') {
return `
@@@@@@@@@@@@@ sumfetch: summary display
@@@@ @@@@ -----------
@@ @@ ABOUT
@@ @@ ${config.name}
@@ @@ ${config.ps1_hostname}
@@ @@@ @@ <u><a href="${config.resume_url}" target="_blank">resume</a></u>
@@ @@@ @@ <u><a href="${config.repo}" target="_blank">Github repo</a></u>
@@ @@ -----------
@@ .@@@@@@@@@@. @@ CONTACT
@@ @@ @@ @@ <u><a href="mailto:${config.email}" target="_blank">${config.email}</a></u>
@@ @@ @@ @@ <u><a href="https://github.com/${config.social.github}" target="_blank">github.com/${config.social.github}</a></u>
@@ @@@@@@ @@ <u><a href="https://linkedin.com/in/${config.social.linkedin}" target="_blank">linkedin.com/in/${config.social.linkedin}</a></u>
@@@ @@@ -----------
@@@ @@@ @@ DONATE
@| @@@@@@@@@@@@@@@@ @@ <u><a href="${config.donate_urls.paypal}" target="_blank">${config.donate_urls.paypal}</a></u>
@| @@ <u><a href="${config.donate_urls.patreon}" target="_blank">${config.donate_urls.patreon}</a></u>
`;
} else {
return `
  sumfetch
    -----------
      ABOUT
  ${config.name}
        <u><a href="${config.resume_url}" target="_blank">resume</a></u>
<u><a href="${config.repo}" target="_blank">Github repo</a></u>
  -----------
  > L I V E T E R M CONTACT
  <u><a href="mailto:${config.email}" target="_blank">${config.email}</a></u>
<u><a href="https://github.com/${config.social.github}" target="_blank">github.com/${config.social.github}</a></u>
        <u><a href="https://linkedin.com/in/${config.social.linkedin}" target="_blank">linkedin.com/in/${config.social.linkedin}</a></u>
  -----------
        DONATE
   <u><a href="${config.donate_urls.paypal}" target="_blank">${config.donate_urls.paypal}</a></u>
  <u><a href="${config.donate_urls.patreon}" target="_blank">${config.donate_urls.patreon}</a></u>
`;
const key = (k: string, w = 11) => `<span class="sf-key">${k.padEnd(w)}</span>`;
const title = (t: string) => `<span class="sf-title">${t}</span>`;
const sfLink = (href: string, text: string) =>
`<a class="sf-link" href="${href}" target="_blank" rel="noopener noreferrer">${text}</a>`;
// --- sumfetch: clean flat profile card (the landing screen) ---
const sumfetch = async (_args: string[]): Promise<string> => {
const edu = education[0] ?? ({} as any);
const contact = [
` ${key('email')}${sfLink(`mailto:${profile.email}`, profile.email)}`,
` ${key('github')}${sfLink(
`https://github.com/${profile.github}`,
`github.com/${profile.github}`,
)}`,
` ${key('linkedin')}${sfLink(
`https://linkedin.com/in/${profile.linkedin}`,
`linkedin.com/in/${profile.linkedin}`,
)}`,
profile.phone ? ` ${key('phone')}${profile.phone}` : '',
].filter(Boolean);
const eduBlock = [
` ${edu.school}`,
...(edu.degrees ?? []).map((d: string) => ` ${d}`),
` GPA ${edu.gpa} · Graduation ${edu.graduation}`,
];
const expBlock = experience.map(
(e) => ` ${e.role} @ ${e.company} (${e.dates})`,
);
const projBlock = projects.slice(0, 4).map((p) => ` ${p.name}`);
const skillBlock = Object.entries(skills).map(
([cat, items]) => ` ${key(catLabel(cat))}${items.join(', ')}`,
);
const system = [
` ${key('age')}<span data-sum-age>—</span>`,
profile.citizenship ? ` ${key('citizen')}${profile.citizenship}` : '',
` ${key('datetime')}<span data-sum-dt>—</span>`,
].filter(Boolean);
return `<span class="sumfetch"><span class="sf-name">${profile.name}</span>
${profile.bio}
${title('contact')}
${contact.join('\n')}
${title('education')}
${eduBlock.join('\n')}
${title('experience')}
${expBlock.join('\n')}
${title('projects')}
${projBlock.join('\n')}
${title('skills')}
${skillBlock.join('\n')}
${title('system')}
${system.join('\n')}
type '${sfLink(
config.resume_url,
'resume',
)}' or 'help' · 'ls' to browse sections</span>`;
};
// --- summary: full-text profile (everything, flat) ---
export const summary = async (_args: string[]): Promise<string> => {
const b = (s: string) => `${s}`;
const blocks: string[] = [];
blocks.push(`${profile.name}\n${profile.bio}`);
blocks.push(
[
title('EDUCATION'),
...education.map((e) =>
[
`${e.school}`,
...e.degrees.map((d) => ` ${d}`),
` GPA ${e.gpa} · Graduation ${e.graduation}`,
].join('\n'),
),
].join('\n'),
);
blocks.push(
[
title('EXPERIENCE'),
...experience.map(
(e) =>
`${e.role} @ ${e.company} (${e.dates})\n${e.bullets
.map(b)
.join('\n')}`,
),
].join('\n\n'),
);
blocks.push(
[
title('PROJECTS'),
...projects.map(
(p) => `${p.name} [${p.timeline}]\n${p.bullets.map(b).join('\n')}`,
),
].join('\n\n'),
);
blocks.push(
[
title('ORGANIZATIONS'),
...organizations.map(
(o) =>
`${o.role} @ ${o.org} (${o.dates})\n${o.bullets.map(b).join('\n')}`,
),
].join('\n\n'),
);
blocks.push(
[
title('PUBLICATIONS'),
...publications.map((p) => `${p.title}\n ${p.status}`),
].join('\n\n'),
);
if (certifications.length) {
blocks.push(
[
title('CERTIFICATIONS'),
...certifications.map((c) =>
c.issuer ? `${c.name}${c.issuer}` : c.name,
),
].join('\n'),
);
}
blocks.push(
[
title('SKILLS'),
...Object.entries(skills).map(
([cat, items]) =>
`${(catLabel(cat) + ':').padEnd(13)}${items.join(', ')}`,
),
].join('\n'),
);
return blocks.join('\n\n');
};
export default sumfetch;
export { sumfetch };

@ -0,0 +1,78 @@
// Single accessor for résumé data. resume.json is a generated mirror of
// resume.org (see docs/resume-pipeline.org); nothing else should import the
// JSON directly, so identity/content has exactly one in-code home.
import resume from '../../resume.json';
export type Profile = {
name: string;
github: string;
linkedin: string;
email: string;
phone?: string;
citizenship?: string;
bio: string;
};
export type Experience = {
id?: string;
role: string;
company: string;
dates: string;
subtitle?: string;
location?: string;
tech?: string[];
bullets: string[];
};
export type Project = {
id?: string;
name: string;
timeline: string;
subtitle?: string;
tech?: string[];
bullets: string[];
};
export type Education = {
id?: string;
school: string;
gpa: string;
graduation: string;
subtitle?: string;
degrees: string[];
honors: string[];
coursework: string[];
};
export type Organization = {
id?: string;
role: string;
org: string;
dates: string;
bullets: string[];
};
export type Publication = {
id?: string;
title: string;
status: string;
bullets: string[];
};
export type Certification = {
id?: string;
name: string;
issuer?: string;
date?: string;
};
export type Skills = Record<string, string[]>;
export const profile = resume.profile as Profile;
export const experience = resume.experience as Experience[];
export const projects = resume.projects as Project[];
export const education = resume.education as Education[];
export const organizations = resume.organizations as Organization[];
export const publications = resume.publications as Publication[];
export const certifications = resume.certifications as Certification[];
export const skills = resume.skills as Skills;
// Display label for a skills category key: acronyms (<=2 chars) upper-cased
// whole ("ml" -> "ML"), everything else capitalized ("languages" -> "Languages").
export const catLabel = (c: string) =>
c.length <= 2 ? c.toUpperCase() : c[0].toUpperCase() + c.slice(1);
export default resume;

@ -1,11 +1,17 @@
const { colors } = require('./config.json');
const config = require('./config.json');
const themes = require('./themes.json');
// Resolve colors from a named theme in themes.json when specified,
// otherwise fall back to inline colors in config.json
const colors =
(config.theme && themes[config.theme]) ? themes[config.theme] : config.colors;
module.exports = {
content: [
'./src/pages/**/*.{js,ts,jsx,tsx}',
'./src/components/**/*.{js,ts,jsx,tsx}',
],
darkMode: 'media', // or 'media' or 'class'
darkMode: 'class', // dark enforced via <Html className="dark"> in _document
theme: {
colors: {
transparent: 'transparent',

@ -159,4 +159,25 @@
"red": "#EF6155"
}
}
,
"matrix_crt": {
"light": {
"background": "#EAFBEA",
"foreground": "#103410",
"yellow": "#6B8E23",
"green": "#0A8F3B",
"gray": "#3A5F3A",
"blue": "#0E8D7A",
"red": "#B23A3A"
},
"dark": {
"background": "#0A0F0A",
"foreground": "#D2FFD2",
"yellow": "#9ACD32",
"green": "#00FF88",
"gray": "#2E3D2E",
"blue": "#00D4AA",
"red": "#FF3B3B"
}
}
}

Loading…
Cancel
Save