<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Amna Hafeez</title>
    <description>The latest articles on DEV Community by Amna Hafeez (@amna_hafeez).</description>
    <link>https://dev.to/amna_hafeez</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4004455%2F727b5ef2-1ec8-43ae-8fc2-069192758630.png</url>
      <title>DEV Community: Amna Hafeez</title>
      <link>https://dev.to/amna_hafeez</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/amna_hafeez"/>
    <language>en</language>
    <item>
      <title>Katas Raj Heritage 3D: Building an AI-Powered Digital Preservation Tool</title>
      <dc:creator>Amna Hafeez</dc:creator>
      <pubDate>Fri, 07 Aug 2026 15:20:32 +0000</pubDate>
      <link>https://dev.to/amna_hafeez/katas-raj-heritage-3d-building-an-ai-powered-digital-preservation-tool-3ae9</link>
      <guid>https://dev.to/amna_hafeez/katas-raj-heritage-3d-building-an-ai-powered-digital-preservation-tool-3ae9</guid>
      <description>&lt;h1&gt;
  
  
  Katas Raj Heritage 3D: Building an AI-Powered Digital Preservation Tool
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;A PMW case study by Amna Hafeez · Team Indus&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Problem
&lt;/h2&gt;

&lt;p&gt;The Katas Raj Temples in Chakwal, Punjab, are a partially ruined but actively protected heritage site — a Hindu temple complex built around a sacred spring-fed pond. Documentation for sites like this is usually static: a handful of photos and a paragraph of history. That approach loses the spatial and material detail that actually matters for preservation — how large the structures are, what condition the domes and walls are in, and what the site looks like from angles a flat photo can't show. My goal was to build a tool that could classify, measure, and reconstruct the site digitally, and present it in a way that felt like a working survey record rather than a static gallery.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Role
&lt;/h2&gt;

&lt;p&gt;I was the sole developer and Team Indus lead on this build. I designed and implemented the full stack: the ML image classifier, the AR measurement overlay, the Three.js 3D viewer, and the site's information architecture and visual design (the "field survey record" aesthetic). I also ran and interpreted the site's own performance/accessibility audits and fixed what came out of them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live site:&lt;/strong&gt; &lt;a href="https://katas-raj-heritage-3d.vercel.app" rel="noopener noreferrer"&gt;katas-raj-heritage-3d.vercel.app&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/Anfey-SE/katas-raj-heritage-3d" rel="noopener noreferrer"&gt;github.com/Anfey-SE/katas-raj-heritage-3d&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Commit history:&lt;/strong&gt; &lt;a href="https://github.com/Anfey-SE/katas-raj-heritage-3d/commits/main" rel="noopener noreferrer"&gt;github.com/Anfey-SE/katas-raj-heritage-3d/commits/main&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;The site is organized as a "site survey record" with three exhibits per location:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Exhibit A — Photograph:&lt;/strong&gt; the base documentation shot, captioned like a field photo log (location, condition, protection status, capture angles logged).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exhibit B — AR Survey Lines:&lt;/strong&gt; an HTML5 Canvas overlay drawn on top of the photograph showing measured distances across the site — diagonal spans, wall heights, and pond width (e.g., 21.1m diagonal, 18.7m and 12.4m spans, 9.2m elevation) — simulating how a real AR measurement tool would annotate the ruins.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flct6bbzk956zqmwe4pbq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flct6bbzk956zqmwe4pbq.png" alt="AR survey lines overlay showing measured distances across the Katas Raj complex" width="799" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Exhibit C — Capture-to-3D:&lt;/strong&gt; a Three.js-rendered depth relief generated from photo luminance, giving an orbit-able first-pass 3D read of the site's terrain and structures, with drag-to-orbit and pan controls.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2mrusgktpjcdt1ckreua.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2mrusgktpjcdt1ckreua.png" alt="Capture-to-3D depth relief render of the temple complex and sacred pond" width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Underneath this, I trained and integrated a &lt;strong&gt;MobileNetV2 image classifier&lt;/strong&gt; to automatically categorize heritage site photos. Tested against three real Katas Raj photographs, it correctly identified the site type ("castle" — the closest ImageNet-class match to a fortified temple complex) with 74.7%, 88.4%, and 98.6% confidence respectively, with the next-closest guesses (monastery, cliff dwelling, palace) trailing far behind. That's a meaningful signal for a model that was never trained on Pakistani heritage architecture specifically.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1bmbf0t27i9y2omz2068.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1bmbf0t27i9y2omz2068.png" alt="MobileNetV2 classifier confidence scores across three Katas Raj test images" width="800" height="934"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Process
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Photographed and sourced reference images of the Katas Raj complex.&lt;/li&gt;
&lt;li&gt;Built the classifier pipeline in Google Colab (CPU-only local hardware made this the practical choice) and validated it against the three site photos, visualizing confidence scores per class.&lt;/li&gt;
&lt;li&gt;Built the Exhibit A/B/C tabbed interface, including the Canvas-based AR measurement overlay and the Three.js depth-relief viewer.&lt;/li&gt;
&lt;li&gt;Ran a Lighthouse audit and found the results were being skewed by Chrome extensions loading in the profile — the first pass showed misleadingly low Performance alongside perfect Accessibility/Best Practices/SEO. I re-ran the audit in a clean incognito window with no extensions to get a valid reading.&lt;/li&gt;
&lt;li&gt;Documented the corrected results.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Result
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Valid Lighthouse audit (incognito, no extensions):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2qi1sl5zjncjlzy90e4h.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2qi1sl5zjncjlzy90e4h.webp" alt="Lighthouse audit results run in incognito mode with no extensions" width="799" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Performance&lt;/td&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accessibility&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best Practices&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SEO&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Accessibility, Best Practices, and SEO are all perfect. Performance sits at 52, held down mainly by the Three.js/Canvas-heavy Exhibit C view, which is the honest number rather than the artificially poor one caused by browser extensions on the first (invalid) run.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;Running the same audit twice taught me something I wouldn't have learned from a single clean pass: tooling itself can lie to you. The first Lighthouse run reported a Performance score of 37 — a number I could have submitted as evidence without realizing it wasn't measuring my site at all, but the extensions in my browser profile. Catching that and re-running in incognito was a small thing, but it's the difference between real evidence and a false read. I also learned, more directly, how much weight a 3D canvas view carries on load performance versus a static image — the gap between my Performance score and my other three scores is basically a map of where the actual rendering cost lives in this app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Improvements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Lazy-load or defer the Three.js/Canvas exhibits so they don't block initial paint, to close the gap between Performance and the other three scores.&lt;/li&gt;
&lt;li&gt;Extend the classifier training set with more Pakistani heritage sites so classifications move from "closest ImageNet analog" (e.g., castle) toward more accurate custom labels (e.g., temple complex, stepped pond).&lt;/li&gt;
&lt;li&gt;Replace the simulated AR measurement overlay with actual computed distances from the COLMAP reconstruction pipeline once sparse reconstruction quality improves.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Evidence: &lt;a href="https://katas-raj-heritage-3d.vercel.app" rel="noopener noreferrer"&gt;live site&lt;/a&gt; · &lt;a href="https://github.com/Anfey-SE/katas-raj-heritage-3d/commits/main" rel="noopener noreferrer"&gt;commit history&lt;/a&gt; · classifier confidence charts and Lighthouse audit screenshots above.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>threejs</category>
      <category>webdev</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Real Fixes on My Heritage 3D Site: An Audit Trail and a Rendering Polish Pass</title>
      <dc:creator>Amna Hafeez</dc:creator>
      <pubDate>Sat, 01 Aug 2026 12:22:16 +0000</pubDate>
      <link>https://dev.to/amna_hafeez/real-fixes-on-my-heritage-3d-site-an-audit-trail-and-a-rendering-polish-pass-h76</link>
      <guid>https://dev.to/amna_hafeez/real-fixes-on-my-heritage-3d-site-an-audit-trail-and-a-rendering-polish-pass-h76</guid>
      <description>&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;Katas Raj Heritage 3D is a site I built for my Platform &amp;amp; Web Engineering internship with PreserveMy.World — it combines a MobileNetV2 image classifier, an HTML5 Canvas AR measurement overlay, and a Three.js 3D mesh viewer for the Katas Raj temple complex in Chakwal, Punjab.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Live site: katas-raj-heritage-3d.vercel.app&lt;/li&gt;
&lt;li&gt;Repo: github.com/Anfey-SE/katas-raj-heritage-3d&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why I went back to it
&lt;/h2&gt;

&lt;p&gt;This is Week 6 of my internship's make-up work track, and the task was to take a prior artifact and prove I'd actually improved it — not just say I did. I picked this project because I had a real audit trail: a Lighthouse-driven fix I made and verified in Module 21, plus a follow-up check I ran while preparing this write-up.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the first audit showed
&lt;/h2&gt;

&lt;p&gt;Back in Module 21, I ran a Lighthouse audit (Mobile, Navigation mode) on the deployed site and found real, specific issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SEO: 83&lt;/li&gt;
&lt;li&gt;Accessibility: 92&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Specifically: a missing meta description, an invalid/missing robots.txt, a missing &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt; landmark, a non-sequential heading order (h1 jumping to h3), and a favicon 404 in the console. I didn't screenshot that run before fixing things — a mistake I'm not repeating this time — but the flagged issues and scores are saved in a text output from that session.&lt;/p&gt;

&lt;p&gt;Performance wasn't part of this claim. That run flagged Performance as unreliable due to browser extensions and throttling, so I didn't treat it as fixable data — more on that below.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I actually fixed
&lt;/h2&gt;

&lt;p&gt;Real commits, in order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;e5b6fbf&lt;/code&gt; — add robots.txt&lt;/strong&gt;&lt;br&gt;
The site had no robots.txt at all. Added one so crawlers have explicit instructions instead of guessing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;52fb5ac&lt;/code&gt; — add meta description, favicon, main landmark, heading hierarchy&lt;/strong&gt;&lt;br&gt;
The page was missing a meta description (so it had no real search-result snippet), had no favicon, no &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt; landmark for screen readers to jump to, and its heading tags weren't in a logical order. Fixed all four.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After making these fixes, I verified the Vercel deployment shipped correctly, then re-ran Lighthouse and confirmed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SEO: 83 → 100&lt;/li&gt;
&lt;li&gt;Accessibility: 92 → 100&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's the core result — two real, measured scores moving because of specific, identifiable fixes, not a rerun trick.&lt;/p&gt;

&lt;h2&gt;
  
  
  A performance note
&lt;/h2&gt;

&lt;p&gt;While preparing this write-up, I ran Lighthouse again to double check the site's current state, and noticed the Performance score came back invalid — Chrome extensions were interfering with the page load. I re-ran it in a clean incognito window and got a real Performance score of 62. That's not something I'm claiming as "fixed" here since it wasn't part of the original scoped work, but I did make one real change along the way: I noticed the Exhibit C iframe was loading eagerly on first paint and switched it to lazy-load, since it's one likely contributor to a slower initial load. That's a smaller, secondary improvement worth mentioning honestly rather than folding into the headline numbers above.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbkm37ufbomdi3budh7ty.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbkm37ufbomdi3budh7ty.png" alt="Lighthouse run flagged as invalid due to Chrome extensions" width="800" height="405"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Lighthouse flagged this run as invalid due to Chrome extensions&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Futz9kqp9s5ttu736rgfu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Futz9kqp9s5ttu736rgfu.png" alt="Clean incognito re-run showing a valid Performance score of 62" width="799" height="397"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Clean incognito re-run — real Performance score&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A separate fix: smoothing the 3D relief
&lt;/h2&gt;

&lt;p&gt;Alongside the audit work, I also went back into &lt;code&gt;capture_to_3d_depth.html&lt;/code&gt; — the capture-to-3D viewer — and fixed something that had nothing to do with Lighthouse scores: the relief mesh looked noisy and jittery instead of smooth.&lt;/p&gt;

&lt;p&gt;The cause was that depth displacement was being computed directly from raw per-pixel luminance values, which produces a static-like bump surface. The fix was to box-blur the luminance data before using it as depth, while leaving the actual photo texture untouched and sharp — so the surface reads as smooth geometry with a crisp photo on top, instead of a jittery mesh.&lt;/p&gt;

&lt;p&gt;While I was in there, I also added a soft radial contact shadow under the mesh so it reads as resting in the scene rather than floating above it, and eased the camera's starting distance so it dollies in gently on load instead of snapping straight to position.&lt;/p&gt;

&lt;p&gt;None of this shows up in a Lighthouse score. It's a rendering-quality fix, verifiable by opening the page and comparing the mesh surface and camera behavior before and after — commit &lt;a href="https://github.com/Anfey-SE/katas-raj-heritage-3d/commit/d40e5114aa5feb8ddc9e8ab82b23e8f7d9d255a0" rel="noopener noreferrer"&gt;&lt;code&gt;d40e511&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hard part
&lt;/h2&gt;

&lt;p&gt;The heading hierarchy fix looked trivial but wasn't — changing &lt;code&gt;h3&lt;/code&gt; to &lt;code&gt;h2&lt;/code&gt; meant tracking down the matching CSS selector too, since the site's styling was keyed to the tag name, not a class. Missing that would have fixed the semantic structure but broken the visual layout. That's the kind of thing an automated score won't warn you about either way.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd improve next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Get a valid Lighthouse baseline &lt;em&gt;before&lt;/em&gt; making any changes next time, run in incognito from the start, so before/after numbers are directly comparable.&lt;/li&gt;
&lt;li&gt;The AR canvas and Three.js viewer are still the heaviest parts of the page — next step would be code-splitting them so they load on demand instead of on initial page load.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Connection to PreserveMy.World
&lt;/h2&gt;

&lt;p&gt;A heritage site is only as useful as the number of people who can actually load and read it. Slow performance and weak semantic structure quietly gatekeep who gets access — someone on a low-end phone, or someone using a screen reader, is exactly the kind of public audience PMW's mission is built around: students, researchers, and diaspora communities engaging with Pakistani heritage sites they may never visit in person. A technically solid, accessible page isn't a side detail to the preservation work — it's part of what makes the preservation actually reach people.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I verified manually
&lt;/h2&gt;

&lt;p&gt;I ran the Lighthouse audit myself, read through the flagged issues to confirm which were real and fixable, edited &lt;code&gt;index.html&lt;/code&gt; directly, verified the Vercel deployment succeeded (Ready status, correct commit hash), and re-ran Lighthouse afterward to confirm the score changes. For the performance check, I re-ran in a clean incognito profile and cross-checked the fix against the live deployed site.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Evidence:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Audit-driven commits: &lt;a href="https://github.com/Anfey-SE/katas-raj-heritage-3d/commit/e5b6fbf" rel="noopener noreferrer"&gt;e5b6fbf&lt;/a&gt;, &lt;a href="https://github.com/Anfey-SE/katas-raj-heritage-3d/commit/52fb5ac" rel="noopener noreferrer"&gt;52fb5ac&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Rendering polish commit: &lt;a href="https://github.com/Anfey-SE/katas-raj-heritage-3d/commit/d40e5114aa5feb8ddc9e8ab82b23e8f7d9d255a0" rel="noopener noreferrer"&gt;d40e511&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Full commit history: github.com/Anfey-SE/katas-raj-heritage-3d/commits/main/&lt;/li&gt;
&lt;li&gt;Live site: katas-raj-heritage-3d.vercel.app&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>a11y</category>
      <category>showdev</category>
      <category>threejs</category>
    </item>
    <item>
      <title>Choosing a 3D Reconstruction Method for Heritage Sites With No LiDAR Access</title>
      <dc:creator>Amna Hafeez</dc:creator>
      <pubDate>Tue, 28 Jul 2026 11:30:59 +0000</pubDate>
      <link>https://dev.to/amna_hafeez/choosing-a-3d-reconstruction-method-for-heritage-sites-with-no-lidar-access-3e9h</link>
      <guid>https://dev.to/amna_hafeez/choosing-a-3d-reconstruction-method-for-heritage-sites-with-no-lidar-access-3e9h</guid>
      <description>&lt;p&gt;When I built the COLMAP pipeline for Mohenjo-daro's Great Bath (Module 11), I hit a wall early: Wikimedia Commons, my planned image source, was blocked by my ISP. I had to fall back to Google Images photos instead — and at the time it felt like a compromise. Digging into the research afterward, it turns out this fallback is a documented, legitimate method in heritage photogrammetry, not a shortcut.&lt;/p&gt;

&lt;p&gt;COLMAP itself is built exactly for this kind of problem: it's a Structure-from-Motion and Multi-View Stereo pipeline designed to reconstruct 3D geometry and camera positions purely from overlapping 2D photos, with no LiDAR or specialized capture equipment required.&lt;/p&gt;

&lt;p&gt;More importantly, this isn't a novel workaround — it's an established research approach. Researchers rebuilt Palmyra's Temple of Bel, destroyed in 2015, using nothing but public visitor photos pulled from social media and web search engines. If a fully destroyed UNESCO heritage site can be reconstructed from scraped web images, then a Google Images fallback for an accessible site like Mohenjo-daro is well within reason.&lt;/p&gt;

&lt;p&gt;The tradeoff is real, though: crowdsourced or web images lack the consistent overlap and camera orientation of a controlled capture, which is exactly why researchers have studied using web-sourced photos for heritage documentation specifically, treating image volume and redundancy as compensation for inconsistent capture conditions.&lt;/p&gt;

&lt;p&gt;On the tool side, COLMAP compares favorably to alternatives like Meshroom for this kind of work: comparative reviews mark COLMAP as producing high-detail reconstructions with minimal smoothing, though it's less plug-and-play than Meshroom's drag-and-drop workflow. For a one-off heritage reconstruction where output quality mattered more than setup speed, COLMAP was the right call.&lt;/p&gt;

&lt;p&gt;Takeaway: the Google Images fallback wasn't a limitation I had to work around — it's a recognized method with real precedent in cultural heritage preservation, and COLMAP was the right tool to pair it with.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://colmap.github.io/" rel="noopener noreferrer"&gt;COLMAP Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/colmap/colmap" rel="noopener noreferrer"&gt;COLMAP GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://link.springer.com/chapter/10.1007/978-3-032-13056-3_38" rel="noopener noreferrer"&gt;Photogrammetry Software: A Comparative Review of COLMAP and Meshroom (Springer)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://journals.sagepub.com/doi/full/10.1177/14780771231168224" rel="noopener noreferrer"&gt;Digital reconstruction of the Temple of Bel using crowdsourced images (Rihani, 2023)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.sciencedirect.com/science/article/abs/pii/S1296207416300371" rel="noopener noreferrer"&gt;Crowdsource and web-published images for 3D heritage documentation (ScienceDirect)&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>colmap</category>
      <category>photogrammetry</category>
      <category>computervision</category>
      <category>culturalheritage</category>
    </item>
    <item>
      <title>Rohtas Fort: The Fortress That Was Never Stormed</title>
      <dc:creator>Amna Hafeez</dc:creator>
      <pubDate>Fri, 10 Jul 2026 11:20:17 +0000</pubDate>
      <link>https://dev.to/amna_hafeez/rohtas-fort-the-fortress-that-was-never-stormed-k05</link>
      <guid>https://dev.to/amna_hafeez/rohtas-fort-the-fortress-that-was-never-stormed-k05</guid>
      <description>&lt;p&gt;Rohtas Fort: The Fortress That Was Never Stormed&lt;br&gt;
Perched on a hilltop above the Kahan River in Jhelum district, Rohtas Fort has stood since 1541 without ever falling to a direct assault. It was inscribed as a UNESCO World Heritage Site in 1997, recognized as an outstanding example of early Muslim military architecture in Central and South Asia. Researching it for this module reminded me that a heritage site's story doesn't end at its founding — it's still being written today, through conservation battles and community disputes that rarely make it into the tourist brochures.&lt;br&gt;
Built to Keep an Emperor Out&lt;br&gt;
Rohtas Fort exists because of one man's fear of losing what he'd just won. After defeating the Mughal emperor Humayun at the Battle of Kannauj in 1540, the Afghan ruler Sher Shah Suri needed a way to block Humayun's return route into the subcontinent and to subdue the Gakhar tribe, who remained loyal to the Mughals. Construction began in 1541 under Sher Shah's revenue minister, Todar Mal, on a hilltop chosen specifically because it commanded the old route between Kabul and the Punjab plains.&lt;br&gt;
The build wasn't smooth. The Gakhars, on whose land the fort was rising, initially refused to supply labor. According to several historical accounts, Todar Mal only secured workers after Sher Shah authorized dramatically higher wages — a costly decision that shows how much strategic weight the emperor placed on this single fortification. Sher Shah died in 1545, before the fort was finished, and by 1555 Humayun had reclaimed the region anyway, making Rohtas's original military purpose almost moot within a generation of its construction.&lt;br&gt;
An Architectural Hybrid&lt;br&gt;
What makes Rohtas historically significant isn't just its scale — over 4 kilometers of walls, 68 bastions, and 12 gates — but what it represents architecturally. UNESCO's listing describes it as blending Turkish and South Asian building traditions into a new fortification style developed in response to the spread of gunpowder and cannon, one that went on to shape Mughal military architecture for generations afterward.&lt;br&gt;
Inside the walls, the fort tells a layered story rather than a single one. The Shahi Masjid near Kabuli Gate reflects Sher Shah's original Suri-era construction, while the Haveli Man Singh — built later under Mughal general Raja Man Singh — is Hindu in architectural style and bears no resemblance to the surrounding Afghan-style fortification. Stepped wells called baolis gave the garrison self-sufficient water access, meaning the fort never depended on outside supply lines even under siege conditions.&lt;br&gt;
A Living Site, Not a Frozen One&lt;br&gt;
Here's the part that doesn't usually make it into travel writeups: Rohtas Fort has an actual village inside its walls, and that's been a source of tension for decades. Communities have lived within the ramparts continuously since the Suri era, and by some estimates the resident population reached around 4,000 people in recent years. That's created a genuine conflict between heritage preservation and people's homes.&lt;br&gt;
UNESCO's own assessment is direct about the risk: encroachment inside the fort has disrupted its original drainage system, and parts of the fortification wall have already collapsed as a result. This isn't a hypothetical threat — it's an ongoing management problem. The Punjab government and the Directorate General of Archaeology have run repeated anti-encroachment operations over the years, including a demolition drive in August 2024 targeting unauthorized structures, but the underlying tension between conservation and a resident community hasn't disappeared.&lt;br&gt;
Conservation work has also had real wins. The Rohtas Fort Conservation Programme, launched in 2000 by Pakistan's Department of Archaeology and Museums together with the Himalayan Wildlife Foundation, has restored several gates — including Shah Chandwali and Talaqi — and established the Sher Shah Suri Museum inside Sohail Gate. A steering committee formed in 2003 continues to oversee this work, and more recent excavation projects have aimed to uncover and protect structures still buried at the site.&lt;br&gt;
Why It Still Matters&lt;br&gt;
Rohtas Fort is a reminder that heritage sites are rarely static monuments — they're contested, lived-in, and still being fought for. Its 16th-century engineering genuinely earned its UNESCO status, but keeping that status meaningful depends on solving very present-day problems: drainage, encroachment, and the balance between preserving a monument and respecting the people who call it home.&lt;/p&gt;

&lt;p&gt;Sources&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;UNESCO World Heritage Centre. "Rohtas Fort." whc.unesco.org/en/list/586. &lt;/li&gt;
&lt;li&gt;"Rohtas Fort." Wikipedia. &lt;/li&gt;
&lt;li&gt;"Rohtas Fort — Grokipedia." grokipedia.com/page/Rohtas_Fort. &lt;/li&gt;
&lt;li&gt;"The Preservation of Rohtas Fort." The News on Sunday (thenews.com.pk), 22 January 2023.&lt;/li&gt;
&lt;li&gt;"The Perfect Castle? The Indestructible and Unconquered Rohtas Fort." Ancient Origins, 20 January 2022.&lt;/li&gt;
&lt;li&gt;Meemjee. "Rohtas Fort Gate.jpg." Wikimedia Commons, CC BY-SA 3.0, &lt;a href="https://commons.wikimedia.org/wiki/File:Rohtas_Fort_Gate.jpg" rel="noopener noreferrer"&gt;https://commons.wikimedia.org/wiki/File:Rohtas_Fort_Gate.jpg&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>heritage</category>
      <category>research</category>
      <category>pakistan</category>
      <category>preservemyworld</category>
    </item>
    <item>
      <title>What I Learned About 3D Reconstruction in Week 1 of My AI Internship at PreserveMy.World</title>
      <dc:creator>Amna Hafeez</dc:creator>
      <pubDate>Fri, 26 Jun 2026 19:23:40 +0000</pubDate>
      <link>https://dev.to/amna_hafeez/what-i-learned-about-3d-reconstruction-in-week-1-of-my-ai-internship-at-preservemyworld-32fd</link>
      <guid>https://dev.to/amna_hafeez/what-i-learned-about-3d-reconstruction-in-week-1-of-my-ai-internship-at-preservemyworld-32fd</guid>
      <description>&lt;p&gt;This week marked the beginning of my internship at TechRealm x PreserveMy.World — &lt;br&gt;
a nonprofit using AI to preserve cultural heritage sites in 3D. I'm on the Core Tech &lt;br&gt;
track, focused on Platform &amp;amp; Web Engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is PreserveMy.World?
&lt;/h2&gt;

&lt;p&gt;PreserveMy.World is a nonprofit initiative that uses AI and 3D reconstruction to &lt;br&gt;
document and preserve historical sites — starting with Lahore's heritage landmarks &lt;br&gt;
like Badshahi Masjid.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Set Up This Week
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Python, Git, GitHub CLI, and VS Code&lt;/li&gt;
&lt;li&gt;Gemini CLI as my AI coding assistant&lt;/li&gt;
&lt;li&gt;My first GitHub repo: PMW-day1&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3D Reconstruction Methods I Researched
&lt;/h2&gt;

&lt;p&gt;I compared five methods for reconstructing heritage sites in 3D:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. COLMAP (Structure-from-Motion)&lt;/strong&gt;&lt;br&gt;
Takes multiple photos and produces a 3D point cloud. Great starting point for PMW.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. NeRF (Neural Radiance Fields)&lt;/strong&gt;&lt;br&gt;
Creates photorealistic 3D scenes from images. Needs a GPU but produces stunning results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Gaussian Splatting&lt;/strong&gt;&lt;br&gt;
Fast, high-quality 3D rendering — ideal for web platforms like PreserveMy.World.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Monocular Depth Estimation&lt;/strong&gt;&lt;br&gt;
Works from a single image or video. Most practical for field use with limited equipment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Multi-View Stereo (MVS)&lt;/strong&gt;&lt;br&gt;
Dense reconstruction from multiple calibrated images. Good for building facades.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Python Experiment
&lt;/h2&gt;

&lt;p&gt;I wrote a Python script simulating monocular depth estimation and generated a depth &lt;br&gt;
map output. Small experiment, but it confirmed the pipeline concept works.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Failed
&lt;/h2&gt;

&lt;p&gt;The first attempt at downloading a heritage image in Python returned a 403 error — &lt;br&gt;
so I switched to a simulated depth map instead. Real-world data acquisition will need &lt;br&gt;
proper API access or local images.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;I'll continue researching 3D reconstruction methods, run more experiments, &lt;/p&gt;

&lt;h2&gt;
  
  
  and contribute to the PreserveMy.World platform as the internship progresses.
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;This post is part of my TechRealm x PreserveMy.World internship journey. &lt;br&gt;
GitHub: &lt;a href="https://github.com/Anfey-SE/PMW-day1" rel="noopener noreferrer"&gt;https://github.com/Anfey-SE/PMW-day1&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>machinelearning</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
