Portfolio Website
While this project is undoubtedly still ongoing, I am quite proud of some of the tricks I employed to create a modular, simple, and most importantly, not hideous website.
A Quick Overview
I’m using the static site generator Eleventy, which enables me to template a significant portion of the tedious code, allowing me to concentrate on adding content (like this!).
For example, each project page is a simple markdown file which is automatically transformed into it's own page and corresponding card using a template. All I have to do in order to add another page is create a new file, and specify a handful of parameters that power the templating.
--- title: "AnkleBiter (2023)" description: "FIRST Competition Robot" image: "assets/images/robot_sliceRobotnobacklight.png" permalink: "/projects/anklebiter/" layout: "projectLayout.html" priority: 2 ---An example of the header for each project file.
In addition to my modular project pages and their accompanying cards, I am also proud of my user-friendly resume download button. The website will offer users a copy of my generic resume in exchange for their email address.
After the user submits their email, the function executes several actions before displaying my resume:
-
It ensures that the ‘user’ didn’t fill out the honeypot form field.
-
It verifies that the form wasn’t submitted within a second.
-
The user’s email and basic IP address information is successfully received by a Discord webhook (which I selected for data collection because it is free!).
const discordWebhookUrl = '...'; // The 'real' webhook is obfuscated in the code, and put back together when neededq const discordPayload = { content: `New email submission: ${data.email} City: ${userCity} Region: ${userRegion} Country: ${userCountry} Postal Code: ${userPostal} Organization: ${userOrg}` }; // Send data to the Discord webhook const discordResponse = await fetch(discordWebhookUrl, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(discordPayload) });An excerpt from the form handling function.