Goal: Move the portfolio from client-side JS rendering to Eleventy SSG.
What we did:
- Swapped out client-side rendering for Nunjucks loops ({% raw %}
{% for item in collection %}{% endraw %}) inindex.html,projects.html,blogs.html,certifications.html, andevents.html. - Wired those loops to pull data directly from
_data/JSON files at build time. - Stripped the old
fetch()calls and DOM injection logic out ofassets/js/script.js. - Set
htmlTemplateEngine: "njk"in.eleventy.js. This stopped LiquidJS from choking on the Nunjucks loops inside.htmlfiles.
Why:
- Doing this at build time means better SEO and no weird layout shifts when the page loads.
- It let us drop the empty
<noscript>tags. - The site now actually follows standard Eleventy patterns instead of fighting the framework.
Goal: Clean up the codebase, fix a few bugs, and make it easier to run locally.
What we did:
- Added a
run.batscript to wrap the local dev server and build commands. - Found and removed a trailing comma in
assets/data/last_updated.jsonthat was breaking the projects fetch. - Gutted the rest of the dead API functions from
assets/js/script.js(specificallypopulateEducation,populateExperience,populateCertifications, andpopulateEvents). - Replaced the JS
onclickredirects in_includes/sections/about.njkwith standard<a>tags. - Fixed the Nunjucks category filter in
_includes/sections/projects.njkby changingdowncasetolower, and deleted some leftover<noscript>blocks. - Set the Web3Forms
access_keyin_includes/sections/contact.njkto an empty build variable so the raw placeholder doesn't get submitted.
Why:
- To drop dead code and cut down the client bundle.
- The JSON parsing bug was stopping dynamic content from loading.
- JS shouldn't be doing work that a standard HTML link handles out of the box.
Goal: Finish migrating the last pieces of hardcoded HTML to static loops.
What we did:
- Replaced the hardcoded blog entries in
_includes/sections/blogs.njkwith a Nunjucks loop pointing toblogs.json. - Dropped a loop into
_includes/sections/certifications.njk. It was still an empty shell from the old JS setup, so we gave it the proper markup to render cards at build time.
Why:
- The SSG migration wasn't complete until these were fixed. Now all content grids actually render out of the box without client-side fetches.