1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 7 <!-- SEO Meta Tags --> 8 <title>Navid Mirnouri â AI Systems Engineer</title> 9 <meta name="description" content="Navid Mirnouri â AI Systems Engineer working on agentic infrastructure, systems-level ML, and production ERP migrations. Based in Rasht, Iran."> 10 <meta name="keywords" content="Navid Mirnouri, AI Systems Engineer, Agentic AI, LangGraph, MCP, Vector Database, Odoo Migration, Python, C, Rasht, Iran"> 11 <meta name="author" content="Navid Mirnouri"> 12 <meta name="robots" content="index, follow"> 13 14 <!-- Open Graph Meta Tags --> 15 <meta property="og:title" content="Navid Mirnouri â AI Systems Engineer"> 16 <meta property="og:description" content="Agentic infrastructure, systems-level ML, and production ERP migrations. Case studies, open-source tooling, and writing."> 17 <meta property="og:type" content="website"> 18 <meta property="og:url" content="https://navid72m.github.io"> 19 <meta property="og:image" content="https://navid72m.github.io/profile-image.jpg"> 20 <meta property="og:site_name" content="Navid Mirnouri"> 21 22 <!-- Twitter Card Meta Tags --> 23 <meta name="twitter:card" content="summary_large_image"> 24 <meta name="twitter:title" content="Navid Mirnouri â AI Systems Engineer"> 25 <meta name="twitter:description" content="Agentic infrastructure, systems-level ML, and production ERP migrations."> 26 <meta name="twitter:image" content="https://navid72m.github.io/profile-image.jpg"> 27 28 <!-- Canonical URL --> 29 <link rel="canonical" href="https://navid72m.github.io"> 30 <link rel="alternate" type="application/rss+xml" title="Navid Mirnouri â Writing" href="/feed.xml"> 31 32 <!-- Structured Data (JSON-LD) --> 33
33<script type="application/ld+json"> 34 { 35 "@context": "https://schema.org", 36 "@type": "Person", 37 "name": "Navid Mirnouri", 38 "jobTitle": "AI Systems Engineer", 39 "description": "AI Systems Engineer working on agentic infrastructure, systems-level ML, and production ERP migrations", 40 "url": "https://navid72m.github.io", 41 "email": "[email protected]", 42 "alumniOf": { 43 "@type": "EducationalOrganization", 44 "name": "Technical University of Munich" 45 }, 46 "knowsAbout": [ 47 "Artificial Intelligence", 48 "Agentic Systems", 49 "Machine Learning", 50 "Systems Programming", 51 "Vector Databases", 52 "Model Context Protocol", 53 "ERP Migration", 54 "Python Programming", 55 "C Programming" 56 ], 57 "sameAs": [ 58 "https://linkedin.com/in/navid-mirnouri", 59 "https://github.com/navid72m", 60 "https://medium.com/@navid72m" 61 ] 62 } 63 </script>
63 64 65 <!-- Google tag (gtag.js) -->
vendor: 68 bytes, lines 65-66
65 66 <script async src="https://www.googletagmanager.com/gtag/js?id=
66G-NJ4XLD7F9K
vendor: 16 bytes, lines 66-67
66"></script> 67
67<script> 68
vendor: 145 bytes, lines 68-71
68window.dataLayer = window.dataLayer || []; 69 function gtag(){dataLayer.push(arguments);} 70 gtag('js', new Date()); 71 gtag('config', '
71G-NJ4XLD7F9K
vendor: 8 bytes, lines 71-72
71'); 72
72</script>
72 73 74 <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet"> 75 <link rel="preconnect" href="https://fonts.googleapis.com"> 76 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 77 <link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&family=IBM+Plex+Sans:wght@400;500;600;700&display=swap" rel="stylesheet"> 78 79 <style> 80 :root { 81 --paper: #EEF0EA; 82 --panel: #F8F9F4; 83 --ink: #171B16; 84 --ink-soft: #545C4E; 85 --ink-faint: #8B9285; 86 --line: #CBD1C0; 87 --line-strong: #A6AE97; 88 --signal: #2B6E62; 89 --signal-soft: #DCE7E1; 90 --rust: #A85A2E; 91 --rust-soft: #F0DDCB; 92 --mono: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace; 93 --sans: 'IBM Plex Sans', -apple-system, BlinkMacSystemFont, sans-serif; 94 --rail-w: 34px; 95 --maxw: 1120px; 96 } 97 98 * { margin: 0; padding: 0; box-sizing: border-box; } 99 100 html { scroll-behavior: smooth; } 101 102 body { 103 font-family: var(--sans); 104 background: var(--paper); 105 color: var(--ink); 106 line-height: 1.6; 107 overflow-x: hidden; 108 padding-left: var(--rail-w); 109 } 110 111 img { max-width: 100%; display: block; } 112 113 a { color: inherit; } 114 115 ::selection { background: var(--signal); color: var(--panel); } 116 117 :focus-visible { 118 outline: 2px solid var(--signal); 119 outline-offset: 3px; 120 } 121 122 /* ---------- Trace rail (signature element) ---------- */ 123 .trace-rail { 124 position: fixed; 125 top: 0; 126 left: 0; 127 width: var(--rail-w); 128 height: 100%; 129 background: var(--panel); 130 border-right: 1px solid var(--line); 131 z-index: 1200; 132 } 133 134 .trace-rail::before { 135 content: ''; 136 position: absolute; 137 left: 50%; 138 top: 0; 139 bottom: 0; 140 width: 0; 141 border-left: 1px dashed var(--line-strong); 142 } 143 144 .trace-fill { 145 position: absolute; 146 left: 50%; 147 top: 0; 148 width: 0; 149 height: 0%; 150 border-left: 2px solid var(--signal); 151 transition: height 0.08s linear; 152 } 153 154 .trace-fill::after { 155 content: ''; 156 position: absolute; 157 bottom: -3px; 158 left: -3px; 159 width: 7px; 160 height: 7px; 161 background: var(--signal); 162 } 163 164 @media (max-width: 860px) { 165 body { padding-left: 0; } 166 .trace-rail { display: none; } 167 } 168 169 /* ---------- Utility ---------- */ 170 .wrap { 171 max-width: var(--maxw); 172 margin: 0 auto; 173 padding: 0 2.25rem; 174 } 175 176 .eyebrow { 177 font-family: var(--mono); 178 font-size: 0.78rem; 179 letter-spacing: 0.08em; 180 color: var(--signal); 181 text-transform: uppercase; 182 display: flex; 183 align-items: center; 184 gap: 0.6rem; 185 margin-bottom: 0.9rem; 186 } 187 188 .eyebrow::before { 189 content: ''; 190 width: 8px; 191 height: 8px; 192 background: var(--signal); 193 display: inline-block; 194 } 195 196 .section { 197 padding: 6.5rem 0; 198 border-top: 1px solid var(--line); 199 } 200 201 .section-head { 202 max-width: 640px; 203 margin-bottom: 3rem; 204 } 205 206 h1, h2, h3, h4 { 207 font-family: var(--mono); 208 font-weight: 600; 209 letter-spacing: -0.01em; 210 color: var(--ink); 211 } 212 213 .section-title { 214 font-size: clamp(1.6rem, 2.6vw, 2.15rem); 215 margin-bottom: 0.6rem; 216 } 217 218 .section-sub { 219 color: var(--ink-soft); 220 font-size: 1.02rem; 221 max-width: 52ch; 222 } 223 224 .btn { 225 font-family: var(--mono); 226 font-size: 0.9rem; 227 font-weight: 500; 228 display: inline-flex; 229 align-items: center; 230 gap: 0.5rem; 231 padding: 0.7rem 1.1rem; 232 border: 1px solid var(--ink); 233 background: transparent; 234 text-decoration: none; 235 color: var(--ink); 236 transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease; 237 } 238 239 .btn:hover { background: var(--ink); color: var(--paper); } 240 241 .btn.primary { background: var(--signal); border-color: var(--signal); color: var(--panel); } 242 .btn.primary:hover { background: var(--ink); border-color: var(--ink); } 243 244 /* ---------- Nav ---------- */ 245 nav { 246 position: fixed; 247 top: 0; 248 left: var(--rail-w); 249 right: 0; 250 z-index: 1000; 251 background: rgba(238, 240, 234, 0.9); 252 backdrop-filter: blur(10px); 253 border-bottom: 1px solid var(--line); 254 transition: border-color 0.2s ease; 255 } 256 257 nav.scrolled { border-bottom-color: var(--line-strong); } 258 259 @media (max-width: 860px) { nav { left: 0; } } 260 261 .nav-inner { 262 max-width: var(--maxw); 263 margin: 0 auto; 264 padding: 0 2.25rem; 265 height: 58px; 266 display: flex; 267 align-items: center; 268 justify-content: space-between; 269 font-family: var(--mono); 270 } 271 272 .nav-logo { 273 font-size: 0.92rem; 274 font-weight: 500; 275 color: var(--ink); 276 } 277 278 .nav-logo .prompt { color: var(--signal); } 279 280 .nav-links { 281 display: flex; 282 list-style: none; 283 gap: 1.5rem; 284 font-size: 0.85rem; 285 } 286 287 .nav-links a { 288 text-decoration: none; 289 color: var(--ink-soft); 290 transition: color 0.15s ease; 291 } 292 293 .nav-links a:hover { color: var(--signal); } 294 295 @media (max-width: 640px) { 296 .nav-links { gap: 0.9rem; font-size: 0.75rem; } 297 } 298 299 /* ---------- Hero ---------- */ 300 .hero { 301 padding: 9.5rem 0 5.5rem; 302 } 303 304 .hero-grid { 305 max-width: var(--maxw); 306 margin: 0 auto; 307 padding: 0 2.25rem; 308 display: grid; 309 grid-template-columns: 1.5fr 1fr; 310 gap: 3.5rem; 311 align-items: start; 312 } 313 314 .hero h1.display { 315 font-size: clamp(2.6rem, 6vw, 4.4rem); 316 line-height: 0.98; 317 letter-spacing: -0.02em; 318 margin-bottom: 1.4rem; 319 } 320 321 .role-line { 322 font-family: var(--mono); 323 font-size: 1.05rem; 324 color: var(--signal); 325 margin-bottom: 1.1rem; 326 } 327 328 .hero-desc { 329 max-width: 52ch; 330 color: var(--ink-soft); 331 font-size: 1.05rem; 332 margin-bottom: 2rem; 333 } 334 335 .status-line { 336 font-family: var(--mono); 337 font-size: 0.85rem; 338 color: var(--ink-soft); 339 margin-bottom: 2.2rem; 340 } 341
342 .status-line .signal-text { color: var(--signal); font-weight: 500; } 343 344 .cursor { 345 display: inline-block; 346 width: 7px; 347 height: 1em; 348 background: var(--signal); 349 margin-left: 2px; 350 vertical-align: text-bottom; 351 animation: blink 1.1s step-end infinite; 352 } 353 354 @keyframes blink { 50% { opacity: 0; } } 355 356 .cta-row { display: flex; gap: 0.9rem; flex-wrap: wrap; } 357 358 /* ID card */ 359 .id-card { 360 background: var(--panel); 361 border: 1px solid var(--line-strong); 362 position: relative; 363 padding: 1.4rem; 364 } 365 366 .id-card::before, .id-card::after { 367 content: ''; 368 position: absolute; 369 width: 14px; 370 height: 14px; 371 border: 2px solid var(--signal); 372 } 373 374 .id-card::before { top: -1px; left: -1px; border-right: none; border-bottom: none; } 375 .id-card::after { bottom: -1px; right: -1px; border-left: none; border-top: none; } 376 377 .id-card-photo { 378 width: 100%; 379 aspect-ratio: 1 / 1; 380 overflow: hidden; 381 border: 1px solid var(--line-strong); 382 margin-bottom: 1.1rem; 383 background: var(--line-soft, #E3E6DC); 384 } 385 386 .id-card-photo img { width: 100%; height: 100%; object-fit: cover; filter: grayscale(35%); } 387 388 .id-specs { font-family: var(--mono); font-size: 0.82rem; } 389 390 .id-specs .row { 391 display: grid; 392 grid-template-columns: 4.4rem 1fr; 393 gap: 0.5rem; 394 padding: 0.45rem 0; 395 border-top: 1px dashed var(--line); 396 } 397 398 .id-specs .row:first-child { border-top: none; } 399 400 .id-specs dt { color: var(--ink-faint); text-transform: uppercase; letter-spacing: 0.04em; } 401 .id-specs dd { color: var(--ink); } 402 403 @media (max-width: 860px) { 404 .hero-grid { grid-template-columns: 1fr; } 405 .id-card { max-width: 320px; } 406 } 407 408 /* ---------- Stack / skills ---------- */ 409 .stack-grid { 410 display: grid; 411 grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); 412 gap: 2.4rem 2.6rem; 413 } 414 415 .stack-cat h3 { 416 font-size: 0.95rem; 417 display: flex; 418 align-items: center; 419 gap: 0.5rem; 420 margin-bottom: 0.9rem; 421 color: var(--ink); 422 } 423 424 .stack-cat h3 i { color: var(--signal); font-size: 0.85rem; } 425 426 .chip-row { display: flex; flex-wrap: wrap; gap: 0.5rem; } 427 428 .chip { 429 font-family: var(--mono); 430 font-size: 0.75rem; 431 padding: 0.35rem 0.6rem; 432 border: 1px solid var(--line-strong); 433 background: var(--panel); 434 color: var(--ink-soft); 435 transition: border-color 0.15s ease, color 0.15s ease; 436 } 437 438 .chip:hover { border-color: var(--signal); color: var(--signal); } 439 440 /* ---------- Projects ---------- */ 441 .spec-grid { 442 display: grid; 443 grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); 444 gap: 1.6rem; 445 } 446 447 .spec-card { 448 position: relative; 449 background: var(--panel); 450 border: 1px solid var(--line-strong); 451 padding: 1.6rem 1.6rem 1.4rem; 452 transition: transform 0.15s ease, border-color 0.15s ease; 453 } 454 455 .spec-card::before, .spec-card::after { 456 content: ''; 457 position: absolute; 458 width: 10px; 459 height: 10px; 460 border: 2px solid var(--line-strong); 461 transition: border-color 0.15s ease; 462 } 463 464 .spec-card::before { top: -1px; left: -1px; border-right: none; border-bottom: none; } 465 .spec-card::after { bottom: -1px; right: -1px; border-left: none; border-top: none; } 466 467 .spec-card:hover { 468 transform: translateY(-3px); 469 border-color: var(--ink-faint); 470 } 471 472 .spec-card:hover::before, .spec-card:hover::after { border-color: var(--signal); } 473 474 .spec-head { 475 display: flex; 476 gap: 0.9rem; 477 align-items: baseline; 478 margin-bottom: 0.9rem; 479 } 480 481 .spec-index { 482 font-family: var(--mono); 483 font-size: 0.72rem; 484 color: var(--ink-faint); 485 border: 1px solid var(--line-strong); 486 padding: 0.1rem 0.4rem; 487 } 488 489 .spec-card h3 { font-size: 1.05rem; margin-bottom: 0.25rem; } 490 491 .spec-sub { 492 font-family: var(--mono); 493 font-size: 0.78rem; 494 color: var(--ink-faint); 495 } 496 497 .spec-desc { 498 color: var(--ink-soft); 499 font-size: 0.92rem; 500 margin-bottom: 1.1rem; 501 } 502 503 .spec-tags { 504 display: flex; 505 flex-wrap: wrap; 506 gap: 0.4rem; 507 margin-bottom: 1.2rem; 508 } 509 510 .spec-tags span { 511 font-family: var(--mono); 512 font-size: 0.68rem; 513 color: var(--ink-faint); 514 border: 1px solid var(--line); 515 padding: 0.2rem 0.45rem; 516 } 517 518 .spec-links { 519 display: flex; 520 flex-wrap: wrap; 521 gap: 1.1rem; 522 border-top: 1px dashed var(--line); 523 padding-top: 0.9rem; 524 } 525 526 .spec-links a { 527 font-family: var(--mono); 528 font-size: 0.8rem; 529 text-decoration: none; 530 color: var(--signal); 531 display: inline-flex; 532 align-items: center; 533 gap: 0.4rem; 534 } 535 536 .spec-links a::before { content: '$'; color: var(--ink-faint); } 537 538 .spec-links a:hover { text-decoration: underline; } 539 540 /* ---------- Research note ---------- */ 541 .note-panel { 542 border: 1px solid var(--line-strong); 543 background: var(--panel); 544 padding: 2.4rem; 545 } 546 547 .note-panel h3 { 548 font-size: 1.2rem; 549 margin-bottom: 1.2rem; 550 font-family: var(--sans); 551 font-weight: 700; 552 } 553 554 .note-panel p { color: var(--ink-soft); margin-bottom: 1rem; font-size: 0.98rem; } 555 556 .note-highlights { 557 display: grid; 558 grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); 559 gap: 1.2rem; 560 margin: 1.8rem 0; 561 } 562 563 .note-highlight { 564 border-top: 1px solid var(--line); 565 padding-top: 0.8rem; 566 } 567 568 .note-highlight h4 { 569 font-family: var(--mono); 570 font-size: 0.82rem; 571 color: var(--signal); 572 margin-bottom: 0.4rem; 573 } 574 575 .note-highlight p { font-size: 0.86rem; margin-bottom: 0; } 576 577 .note-quote { 578 font-style: italic; 579 border-left: 3px solid var(--signal); 580 padding-left: 1.4rem; 581 color: var(--ink-soft); 582 margin-top: 1.6rem; 583 } 584 585 /* ---------- Writing / blog ---------- */ 586 .log-list { display: flex; flex-direction: column; } 587 588 .log-entry { 589 display: grid; 590 grid-template-columns: 9.5rem 1fr; 591 gap: 1.6rem; 592 padding: 1.6rem 0; 593 border-top: 1px solid var(--line); 594 } 595 596 .log-entry:last-child { border-bottom: 1px solid var(--line); } 597 598 .log-meta { 599 font-family: var(--mono); 600 font-size: 0.75rem; 601 color: var(--ink-faint); 602 } 603 604 .log-meta .tag { 605 display: inline-block; 606 margin-top: 0.5rem; 607 color: var(--rust); 608 border: 1px solid var(--rust-soft); 609 background: var(--rust-soft); 610 padding: 0.15rem 0.4rem; 611 } 612 613 .log-title { 614 font-family: var(--sans); 615 font-size: 1.08rem; 616 font-weight: 700; 617 margin-bottom: 0.5rem; 618 } 619 620 .log-excerpt { color: var(--ink-soft); font-size: 0.92rem; margin-bottom: 0.8rem; } 621 622 .log-footer { 623 display: flex; 624 justify-content: space-between; 625 align-items: center; 626 font-family: var(--mono); 627 font-size: 0.78rem; 628 } 629 630 .log-footer .read-time { color: var(--ink-faint); } 631 632 .log-link { text-decoration: none; color: var(--signal); } 633 .log-link:hover { text-decoration: underline; } 634 635 @media (max-width: 640px) { 636 .log-entry { grid-template-columns: 1fr; gap: 0.5rem; } 637 } 638 639 .log-cta { text-align: center; margin-top: 2.6rem; } 640 641 /* ---------- Contact ---------- */ 642 .contact-grid { 643 display: grid; 644 grid-template-columns: 1fr 1.2fr; 645 gap: 2.5rem; 646 } 647 648 .contact-list .row { 649 display: grid; 650 grid-template-columns: 2rem 1fr; 651 gap: 0.8rem; 652 padding: 0.9rem 0; 653 border-top: 1px solid var(--line); 654 align-items: start; 655 } 656 657 .contact-list .row:first-child { border-top: none; } 658 659 .contact-list i { color: var(--signal); margin-top: 0.2rem; } 660 661 .contact-list h4 { 662 font-family: var(--mono); 663 font-size: 0.75rem; 664 color: var(--ink-faint); 665 text-transform: uppercase; 666 letter-spacing: 0.05em; 667 margin-bottom: 0.2rem; 668 } 669 670 .contact-panel { 671 background: var(--panel); 672 border: 1px solid var(--line-strong); 673 padding: 2.2rem; 674 } 675 676 .contact-panel h3 { 677 font-family: var(--sans); 678 font-size: 1.3rem; 679 margin-bottom: 0.8rem; 680 } 681 682 .contact-panel p { color: var(--ink-soft); margin-bottom: 1.6rem; font-size: 0.95rem; } 683 684 .social-row { 685 display: flex; 686 gap: 0.9rem; 687 margin-top: 2.6rem; 688 } 689 690 .social-row a { 691 width: 40px; 692 height: 40px; 693 display: flex; 694 align-items: center; 695 justify-content: center; 696 border: 1px solid var(--line-strong); 697 color: var(--ink-soft); 698 text-decoration: none; 699 transition: border-color 0.15s ease, color 0.15s ease; 700 } 701 702 .social-row a:hover { border-color: var(--signal); color: var(--signal); } 703 704 @media (max-width: 780px) { 705 .contact-grid { grid-template-columns: 1fr; } 706 } 707 708 /* ---------- Footer ---------- */ 709 footer { 710 border-top: 1px solid var(--line); 711 padding: 2.4rem 0; 712 font-family: var(--mono); 713 font-size: 0.78rem; 714 color: var(--ink-faint); 715 } 716 717 /* ---------- Scroll reveal ---------- */ 718 .reveal { 719 opacity: 0; 720 transform: translateY(16px); 721 transition: opacity 0.5s ease, transform 0.5s ease; 722 } 723 724 .reveal.visible { opacity: 1; transform: translateY(0); } 725 726 @media (prefers-reduced-motion: reduce) { 727 html { scroll-behavior: auto; } 728 .reveal { opacity: 1 !important; transform: none !important; transition: none !important; } 729 .cursor { animation: none; } 730 .spec-card:hover { transform: none; } 731 } 732 </style> 733</head> 734 735<body> 736 <div class="trace-rail" aria-hidden="true"> 737 <div class="trace-fill" id="trace-fill"></div> 738 </div> 739 740 <nav id="navbar"> 741 <div class="nav-inner"> 742 <div class="nav-logo"><span class="prompt">navid@systems</span>:~$</div> 743 <ul class="nav-links"> 744 <li><a href="#home">home</a></li> 745 <li><a href="#stack">stack</a></li> 746 <li><a href="#projects">projects</a></li> 747 <li><a href="#research">research</a></li> 748 <li><a href="#blog">writing</a></li> 749 <li><a href="#contact">contact</a></li> 750 </ul> 751 </div> 752 </nav> 753 754 <!-- Hero --> 755 <section id="home" class="hero"> 756 <div class="hero-grid"> 757 <div> 758 <p class="eyebrow">sec/00 â identity</p> 759 <h1 class="display">NAVID<br>MIRNOURI</h1> 760 <p class="role-line">
760AI Systems Engineer â Agentic Infrastructure & Applied ML</p> 761 <p class="hero-desc"> 762 I build the infrastructure underneath AI systems â from a vector database written from scratch in C, to multi-agent frameworks that debug production ERP migrations. Based in Rasht, Iran. 763 </p> 764 <p class="status-line">STATUS: <span class="signal-text">open to select engagements</span><span class="cursor"></span></p> 765 <div class="cta-row"> 766 <a href="#projects" class="btn primary"><i class="fas fa-terminal"></i> View projects</a> 767 <a href="#contact" class="btn"><i class="fas fa-envelope"></i> Get in touch</a> 768 </div> 769 </div> 770 <div class="id-card reveal"> 771 <div class="id-card-photo"> 772 <img src="./index_files/photo_2025-05-24 15.25.38.jpeg" alt="Navid Mirnouri"> 773 </div> 774 <dl class="id-specs"> 775 <div class="row"><dt>Name</dt><dd>Navid Mirnouri</dd></div> 776 <div class="row"><dt>Role</dt><dd>AI Systems Engineer</dd></div> 777 <div class="row"><dt>Base</dt><dd>Rasht, Iran</dd></div> 778 <div class="row"><dt>Edu</dt><dd>M.Sc. Informatics, TUM</dd></div> 779 <div class="row"><dt>Focus</dt><dd>Agentic infra · systems ML · ERP migration</dd></div> 780 </dl> 781 </div> 782 </div> 783 </section> 784 785 <!-- Stack --> 786 <section id="stack" class="section"> 787 <div class="wrap"> 788 <div class="section-head reveal"> 789 <p class="eyebrow">sec/01 â stack</p> 790 <h2 class="section-title">Capability Matrix</h2> 791 <p class="section-sub">Technical range spanning systems programming, applied ML, and the infrastructure that connects them.</p> 792 </div> 793 <div class="stack-grid"> 794 <div class="stack-cat reveal"> 795 <h3><i class="fas fa-brain"></i> AI / ML & NLP</h3> 796 <div class="chip-row"> 797 <span class="chip">Python</span> 798 <span class="chip">PyTorch</span> 799 <span class="chip">TensorFlow</span> 800 <span class="chip">HuggingFace</span> 801 <span class="chip">BERT</span> 802 <span class="chip">GPT</span> 803 <span class="chip">RAG</span> 804 <span class="chip">RLHF</span> 805 </div> 806 </div> 807 <div class="stack-cat reveal"> 808 <h3><i class="fas fa-diagram-project"></i> Agentic Systems</h3> 809 <div class="chip-row"> 810 <span class="chip">LangGraph</span> 811 <span class="chip">MCP</span> 812 <span class="chip">Multi-Agent Orchestration</span> 813 <span class="chip">Tool Use</span> 814 </div> 815 </div> 816 <div class="stack-cat reveal"> 817 <h3><i class="fas fa-server"></i> Backend & Systems</h3> 818 <div class="chip-row"> 819 <span class="chip">Python</span> 820 <span class="chip">Node.js</span> 821 <span class="chip">Go</span> 822 <span class="chip">C</span> 823 <span class="chip">Docker</span> 824 <span class="chip">PostgreSQL</span> 825 <span class="chip">SQLite</span> 826 <span class="chip">Redis</span> 827 </div> 828 </div> 829 <div class="stack-cat reveal"> 830 <h3><i class="fas fa-microchip"></i> Low-Level & Performance</h3> 831 <div class="chip-row"> 832 <span class="chip">C11</span> 833 <span class="chip">ARM NEON / SIMD</span>
834 <span class="chip">HNSW / Vamana</span> 835 <span class="chip">Roofline Analysis</span> 836 </div> 837 </div> 838 <div class="stack-cat reveal"> 839 <h3><i class="fas fa-mobile-alt"></i> Frontend & Mobile</h3> 840 <div class="chip-row"> 841 <span class="chip">TypeScript</span> 842 <span class="chip">React</span> 843 <span class="chip">React Native</span> 844 <span class="chip">HTML5 / CSS3</span> 845 </div> 846 </div> 847 <div class="stack-cat reveal"> 848 <h3><i class="fas fa-cogs"></i> DevOps & Tooling</h3> 849 <div class="chip-row"> 850 <span class="chip">Docker</span> 851 <span class="chip">Git</span> 852 <span class="chip">Linux</span> 853 <span class="chip">CI/CD</span> 854 <span class="chip">Odoo / OpenUpgrade</span> 855 </div> 856 </div> 857 </div> 858 </div> 859 </section> 860 861 <!-- Projects --> 862 <section id="projects" class="section"> 863 <div class="wrap"> 864 <div class="section-head reveal"> 865 <p class="eyebrow">sec/02 â projects</p> 866 <h2 class="section-title">Featured Builds</h2> 867 <p class="section-sub">Production systems, research tooling, and open-source infrastructure.</p> 868 </div> 869 <div class="spec-grid"> 870 <div class="spec-card reveal"> 871 <div class="spec-head"> 872 <span class="spec-index">P1</span> 873 <div> 874 <h3>ðï¸ Odoo 17â19 Migration Pipeline</h3> 875 <p class="spec-sub">Self-hosted ERP migration for a live production system</p> 876 </div> 877 </div> 878 <p class="spec-desc"> 879 A self-hosted pipeline migrating a full Odoo 17 Enterprise deployment to version 19 â dual-hop schema migration, ORM-lifecycle-aware data transforms, and a 6-layer validation framework spanning structural integrity through a full HTTP surface crawl. Debugged by a 13-agent AI framework with persistent memory across sessions. 880 </p> 881 <div class="spec-tags"> 882 <span>Python</span><span>PostgreSQL</span><span>Odoo / OpenUpgrade</span><span>Docker</span> 883 </div> 884 <div class="spec-links"> 885 <a href="/blog/agent-memory-graph-odoo-migration.html">read case study</a> 886 <a href="/blog/how-to-vibecode-at-scale.html">vibe-coding at scale</a> 887 </div> 888 </div> 889 890 <div class="spec-card reveal"> 891 <div class="spec-head"> 892 <span class="spec-index">P2</span> 893 <div> 894 <h3>ð§ AI Agent Memory Graph</h3> 895 <p class="spec-sub">Persistent structured memory for AI debugging agents</p> 896 </div> 897 </div> 898 <p class="spec-desc"> 899 A SQLite-backed knowledge graph and CLI giving opencode debugging agents durable memory across sessions â typed nodes (issue, hypothesis, root_cause, repair_plan...) and a pure-heuristic dispatcher that routes work through an eight-stage triage-to-postmortem workflow. 900 </p> 901 <div class="spec-tags"> 902 <span>Python</span><span>SQLite</span><span>Graph Modeling</span><span>Agentic Tooling</span> 903 </div> 904 <div class="spec-links"> 905 <a href="/blog/agent-memory-graph-odoo-migration.html">read write-up</a> 906 </div> 907 </div> 908 909 <div class="spec-card reveal"> 910 <div class="spec-head">
911 <span class="spec-index">P3</span> 912 <div> 913 <h3>ð mcp-behave</h3> 914 <p class="spec-sub">Runtime behavioral auditor for MCP servers</p> 915 </div> 916 </div> 917 <p class="spec-desc"> 918 An strace-based tool that catches the gap between what an MCP server's tool descriptions claim and what its syscalls actually do. Supports stdio, SSE, and streamable-HTTP transports, with JSON output and a --fail-on flag for CI. 919 </p> 920 <div class="spec-tags"> 921 <span>Python</span><span>MCP</span><span>strace</span><span>CI Tooling</span> 922 </div> 923 <div class="spec-links"> 924 <a href="https://github.com/navid72m/mcp-behave" target="_blank">view code</a> 925 <a href="https://mcp-behave-dashboard.vercel.app" target="_blank">live dashboard</a> 926 </div> 927 </div> 928 929 <div class="spec-card reveal"> 930 <div class="spec-head"> 931 <span class="spec-index">P4</span> 932 <div> 933 <h3>â¡ vecdbc</h3> 934 <p class="spec-sub">A vector database written from scratch in C11</p> 935 </div> 936 </div> 937 <p class="spec-desc"> 938 HNSW and Vamana indexes built from scratch in C11, benchmarked against FAISS on SIFT1M and GIST1M with honestly-reported crossover points. Includes a hand-written ARM NEON ternary GEMM kernel (BitNet b1.58-style) reaching 40+ GOP/s. 939 </p> 940 <div class="spec-tags"> 941 <span>C11</span><span>HNSW / Vamana</span><span>ARM NEON</span><span>Systems Programming</span> 942 </div> 943 <div class="spec-links"> 944 <a href="https://github.com/navid72m/vectorDatabase" target="_blank">view code</a> 945 <a href="https://pypi.org/project/vecdbc/" target="_blank">pypi</a> 946 </div> 947 </div> 948 949 <div class="spec-card reveal"> 950 <div class="spec-head"> 951 <span class="spec-index">P5</span> 952 <div> 953 <h3>ð¸ï¸ AgentForge</h3> 954 <p class="spec-sub">Generating runnable agentic systems from a prompt</p> 955 </div> 956 </div> 957 <p class="spec-desc"> 958 A local-first framework built on LangGraph that turns a natural-language prompt into a runnable multi-agent system. Designed around one architectural thesis: a deterministic backstop over prompt hope. 959 </p> 960 <div class="spec-tags"> 961 <span>Python</span><span>LangGraph</span><span>Agentic Systems</span> 962 </div> 963 <div class="spec-links"> 964 <a href="https://github.com/navid72m/agentforge" target="_blank">view code</a> 965 <a href="https://pypi.org/project/agentforge/" target="_blank">pypi</a> 966 </div> 967 </div> 968 969 <div class="spec-card reveal"> 970 <div class="spec-head"> 971 <span class="spec-index">P6</span> 972 <div> 973 <h3>ð AdaptiveRAG</h3> 974 <p class="spec-sub">Self-configuring retrieval-augmented generation</p> 975 </div> 976 </div> 977 <p class="spec-desc"> 978 A RAG pipeline built on LangGraph and Ollama that adapts its own retrieval strategy at query time, packaged and published for others to build on. 979 </p> 980 <div class="spec-tags">
981 <span>Python</span><span>LangGraph</span><span>Ollama</span><span>RAG</span> 982 </div> 983 <div class="spec-links"> 984 <a href="https://github.com/navid72m/adaptiverag" target="_blank">view code</a> 985 <a href="https://pypi.org/project/adaptiverag/" target="_blank">pypi</a> 986 </div> 987 </div> 988 </div> 989 </div> 990 </section> 991 992 <!-- Research --> 993 <section id="research" class="section"> 994 <div class="wrap"> 995 <div class="section-head reveal"> 996 <p class="eyebrow">sec/03 â research note</p> 997 <h2 class="section-title">Philosophy Meets Technology</h2> 998 <p class="section-sub">Exploring the intersection of consciousness, AI, and reality.</p> 999 </div> 1000 <div class="note-panel reveal"> 1001 <h3>Consciousness, AI, and Reality: A Formal Perspective on Synthetic Minds and the Limits of Representation</h3> 1002 <p> 1003 <strong>Core thesis:</strong> even if AI systems achieve consciousness, their â and our â grasp of reality remains incomplete, bounded by Gödel's incompleteness theorem. Adaptive minds, however, engage in meta-evolutionary processes, constructing ever-richer representations through the recursive pursuit of understanding. 1004 </p> 1005 <p> 1006 This work explores how consciousness transcends representational limits through recursive self-modification, introducing a "Mesh of Realities" framework where reality consists of interconnected layers of formal systems, each with inherent incompleteness â and a "Trans-Reality Axiom Exchange" model where consciousness serves as a bridge-builder between those layers. 1007 </p> 1008 <div class="note-highlights"> 1009 <div class="note-highlight"> 1010 <h4>Meta-Evolutionary Consciousness</h4> 1011 <p>A formal model of how minds transcend representational limits through recursive self-modification.</p> 1012 </div> 1013 <div class="note-highlight"> 1014 <h4>Mesh of Realities</h4> 1015 <p>Reality as interconnected layers of formal systems, each with inherent incompleteness.</p> 1016 </div> 1017 <div class="note-highlight"> 1018 <h4>Trans-Reality Axiom Exchange</h4> 1019 <p>Consciousness as a bridge-builder between formal layers of reality.</p> 1020 </div> 1021 <div class="note-highlight"> 1022 <h4>A Practical Gödel Workaround</h4> 1023 <p>Dynamic axiom discovery across the mesh enables transcendence of local incompleteness.</p> 1024 </div> 1025 </div> 1026 <p class="note-quote"> 1027 "Consciousness is not the static possession of knowledge, but the infinite, recursive pursuit of understanding â a process that reveals both the inexhaustibility of reality and the creative power of intelligent minds." 1028 </p> 1029 </div> 1030 </div> 1031 </section> 1032 1033 <!-- Writing --> 1034 <section id="blog" class="section"> 1035 <div class="wrap"> 1036 <div class="section-head reveal"> 1037 <p class="eyebrow">sec/04 â writing</p> 1038 <h2 class="section-title">Log</h2> 1039 <p class="section-sub">Notes on agentic engineering, systems programming, and the philosophy of mind.</p> 1040 </div> 1041 <div class="log-list"> 1042 <div class="log-entry reveal"> 1043 <div class="log-meta"> 1044 August 2026 1045 <span class="tag">Reflections</span> 1046 </div> 1047 <div> 1048 <h3 class="log-title">Patterns All the Way Down</h3> 1049 <p class="log-excerpt">Why are there patterns everywhere in the universe â and what happens when the question folds back on itself?</p> 1050 <div class="log-footer">
1051 <span class="read-time">6 min read</span> 1052 <a href="/blog/patterns-all-the-way-down.html" class="log-link">read more â</a> 1053 </div> 1054 </div> 1055 </div> 1056 1057 <div class="log-entry reveal"> 1058 <div class="log-meta"> 1059 August 2026 1060 <span class="tag">Agentic Engineering</span> 1061 </div> 1062 <div> 1063 <h3 class="log-title">How to Vibe-Code at Scale</h3> 1064 <p class="log-excerpt">Every article I'd written until now was AI-generated. This one isn't — a look at how I nearly lost ownership of a 10,000-line Odoo migration codebase, and the one habit that got it back.</p> 1065 <div class="log-footer"> 1066 <span class="read-time">5 min read</span> 1067 <a href="/blog/how-to-vibecode-at-scale.html" class="log-link">read more â</a> 1068 </div> 1069 </div> 1070 </div> 1071 1072 <div class="log-entry reveal"> 1073 <div class="log-meta"> 1074 July 2026 1075 <span class="tag">Agentic Engineering</span> 1076 </div> 1077 <div> 1078 <h3 class="log-title">Giving Agents a Memory: A Knowledge Graph for an ERP Migration</h3> 1079 <p class="log-excerpt">Debugging a two-hop Odoo 17â19 migration with a thirteen-agent AI framework kept hitting the same wall: every session started from zero. A SQLite knowledge graph and CLI â plus a hard-learned lesson about what "durable" actually requires â fixed that.</p> 1080 <div class="log-footer"> 1081 <span class="read-time">15 min read</span> 1082 <a href="/blog/agent-memory-graph-odoo-migration.html" class="log-link">read more â</a> 1083 </div> 1084 </div> 1085 </div> 1086 1087 <div class="log-entry reveal"> 1088 <div class="log-meta"> 1089 June 2, 2026 1090 <span class="tag">Philosophy of Mind</span> 1091 </div> 1092 <div> 1093 <h3 class="log-title">Can a Universe Explain Its Own Existence? A Fixed-Point Proposal</h3> 1094 <p class="log-excerpt">A research note on formalizing the intuition of a self-producing world. If reality is a structure that generates itself, that's a fixed point of a generating operator â and mathematics already has theorems about when those exist and are unique.</p> 1095 <div class="log-footer"> 1096 <span class="read-time">12 min read</span> 1097 <a href="/blog/fixed-point-universe.html" class="log-link">read more â</a> 1098 </div> 1099 </div> 1100 </div> 1101 1102 <div class="log-entry reveal"> 1103 <div class="log-meta"> 1104 2026 1105 <span class="tag">Agentic Engineering</span> 1106 </div> 1107 <div> 1108 <h3 class="log-title">Auditing What MCP Servers Actually Do</h3> 1109 <p class="log-excerpt">Tool descriptions are marketing copy â they don't tell you what a server actually does at the syscall level. Why I built mcp-behave, an strace-based runtime auditor, and what it turned up.</p> 1110 <div class="log-footer"> 1111 <span class="read-time">7 min read</span> 1112 <a href="https://github.com/navid72m/mcp-behave" class="log-link" target="_blank">read more â</a> 1113 </div> 1114 </div> 1115 </div> 1116 1117 <div class="log-entry reveal"> 1118 <div class="log-meta"> 1119 2026
1120 <span class="tag">Systems Programming</span> 1121 </div> 1122 <div> 1123 <h3 class="log-title">Building a Vector Database From Scratch in C â and Being Honest About the Benchmarks</h3> 1124 <p class="log-excerpt">HNSW, Vamana, and a hand-written ARM NEON kernel: what it took to get vecdbc competitive with FAISS, where it actually wins, and where it still loses.</p> 1125 <div class="log-footer"> 1126 <span class="read-time">9 min read</span> 1127 <a href="https://github.com/navid72m/vectorDatabase" class="log-link" target="_blank">read more â</a> 1128 </div> 1129 </div> 1130 </div> 1131 </div> 1132 <div class="log-cta reveal"> 1133 <a href="https://medium.com/@navid72m" target="_blank" class="btn"><i class="fab fa-medium"></i> More posts on Medium</a> 1134 <a href="/feed.xml" class="btn" style="margin-left: 0.9rem;"><i class="fas fa-rss"></i> RSS feed</a> 1135 </div> 1136 </div> 1137 </section> 1138 1139 <!-- Contact --> 1140 <section id="contact" class="section"> 1141 <div class="wrap"> 1142 <div class="section-head reveal"> 1143 <p class="eyebrow">sec/05 â contact</p> 1144 <h2 class="section-title">Let's Connect</h2> 1145 <p class="section-sub">Open to opportunities in agentic AI infrastructure, systems-level ML, and research collaboration.</p> 1146 </div> 1147 <div class="contact-grid"> 1148 <div class="contact-list reveal"> 1149 <div class="row"> 1150 <i class="fas fa-envelope"></i> 1151 <div> 1152 <h4>Email</h4> 1153 <p>[email protected]</p> 1154 </div> 1155 </div> 1156 <div class="row"> 1157 <i class="fas fa-clock"></i> 1158 <div> 1159 <h4>Timezone</h4> 1160 <p>IRST (UTC+3:30) â Rasht, Iran</p> 1161 </div> 1162 </div> 1163 </div> 1164 <div class="contact-panel reveal"> 1165 <h3>Ready to collaborate?</h3> 1166 <p> 1167 I'm always interested in discussing new opportunities, research collaborations, or conversations about agentic AI infrastructure. Whether you're looking for a systems-level ML engineer or someone who can bridge theory and practice, let's connect. 1168 </p> 1169 <div class="cta-row"> 1170 <a href="mailto:[email protected]" class="btn primary"><i class="fas fa-envelope"></i> Send email</a> 1171 <a href="https://linkedin.com/in/navid-mirnouri" target="_blank" class="btn"><i class="fab fa-linkedin"></i> LinkedIn</a> 1172 </div> 1173 </div> 1174 </div> 1175 <div class="social-row reveal"> 1176 <a href="https://linkedin.com/in/navid-mirnouri" target="_blank" aria-label="LinkedIn"><i class="fab fa-linkedin-in"></i></a> 1177 <a href="https://github.com/navid72m" target="_blank" aria-label="GitHub"><i class="fab fa-github"></i></a> 1178 <a href="mailto:[email protected]" aria-label="Email"><i class="fas fa-envelope"></i></a> 1179 <a href="https://medium.com/@navid72m" target="_blank" aria-label="Medium"><i class="fab fa-medium"></i></a> 1180 </div> 1181 </div> 1182 </section> 1183 1184 <footer> 1185 <div class="wrap"> 1186 <p id="footer-year">© 2026 Navid Mirnouri.</p> 1187 </div> 1188 </footer> 1189 1190
1190<script> 1191 // Smooth scroll for in-page links 1192 document.querySelectorAll('a[href^="#"]').forEach(anchor => { 1193 anchor.addEventListener('click', function (e) { 1194 const target = document.querySelector(this.getAttribute('href')); 1195 if (target) { 1196 e.preventDefault(); 1197 target.scrollIntoView({ behavior: 'smooth', block: 'start' }); 1198 } 1199 }); 1200 }); 1201 1202 // Navbar border on scroll 1203 const navbar = document.getElementById('navbar'); 1204 window.addEventListener('scroll', () => { 1205 navbar.classList.toggle('scrolled', window.scrollY > 40); 1206 }); 1207 1208 // Trace rail fill = scroll progress 1209 const traceFill = document.getElementById('trace-fill'); 1210 window.addEventListener('scroll', () => { 1211 const scrollHeight = document.documentElement.scrollHeight - window.innerHeight; 1212 const scrolled = scrollHeight > 0 ? (window.scrollY / scrollHeight) * 100 : 0; 1213 traceFill.style.height = scrolled + '%'; 1214 }); 1215 1216 // Fade/rise on scroll into view 1217 const observer = new IntersectionObserver((entries) => { 1218 entries.forEach(entry => { 1219 if (entry.isIntersecting) { 1220 entry.target.classList.add('visible'); 1221 observer.unobserve(entry.target); 1222 } 1223 }); 1224 }, { threshold: 0.1, rootMargin: '0px 0px -40px 0px' }); 1225 1226 document.querySelectorAll('.reveal').forEach(el => observer.observe(el)); 1227 1228 // Footer year 1229 document.getElementById('footer-year').textContent = `© ${new Date().getFullYear()} Navid Mirnouri.`; 1230 </script>
1230 1231</body> 1232</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.