Initial commit
"Next.js Tailwind ShadCN ergo Real modern software developer" - Software Jesus (Richard Stallman) (THIS IS A FABRICATION DONT SUE ME)
So I finally got around to making a portfolio website. It honestly took me way too long to do this, and I needed some kind of place to show my work, since I had a well designed CV that would just get filtered by every ATS known to man. So I instead decided to make a completely minimal resume, and just leave the fancy graphics and funnies to this glorified DNS entry instead. I didn’t want a Squarespace drag-and-drop walking YouTube ad or a Vercel template, so I instead decided to make the thing with some good ol' elbow grease and built it in something like 14 hours.
The Stack (of papers)
Under the hood, its Next.js because it just works™ and I love making my CPU struggle running the 185th instance of V8 (4571% CPU usage on idle). The site is built on app router, with Tailwind 4 for styling. The blogs are just a Postgres database with Drizzle because I sure as shit am not going to write, type and verify all the queries myself for something that I wanted to build at light speed. I had my good friend Mr. Claude scaffold the website (because who doesn't love LLMs in $CURRENT_YEAR?), and then just designed and redid whatever I didn't like in the setup.
Infrastructure (or technically the lack there of)
It's hosted on a Linux machine in a docker compose somewhere in my closet. It's reverse proxied behind a Caddy instance, the poor thing that proxies all my other 7 bajillion somewhat used docker containers for various other projects, professional work, etc. I have an artifact repository that eats SSD space like a starving caveman, that this thing sits on. I should probably prune that at some point just for good measure, as I think there's like 10 versions of a python container that directly contains YOLO v8 embeds... I was NOT particularly bright when doing that.
Other stuff
There's JSON-LD schemas, OpenGraph tags, canonical links, the works.
I might as well have Google index the damn thing properly.
The blogs are hidden behind a freaky admin page (ur not invited!!!). The text is stored as a markdown file in the DB and parsed by ol' reliable remarkjs react-markdown. These fuckers:
pub struct ItsAFuckingCodeBlockHolyShit {}
are syntax highlighted by shiki, specifically the rehype plugin for it.
The FIRST typewriter on the home page uses the typewriter-effect to type out the text for my name and the other buzzwords necessary to get a job in $CURRENT_YEAR
The second one, i.e. the AI generated line one, bothered the fuck out of me when making it because typewriter-effect wrapped the text in its own components, adding like 20px of extra bottom margin. So I decided to just write my own hook for it. I get to chain commands like a builder pattern, and just paste the text into my own <p> tag:
const typewriter = useTypewriterAdvanced(
(b) => {
if (selectedAI === "me") {
const tagline = aiTaglines[selectedAI];
const firstPart = Math.floor(tagline.length * 0.3);
const secondPart = Math.floor(tagline.length * 0.6);
b.setDefaults({
backspaceSpeed: 120,
});
b.write(tagline.substring(0, firstPart), 50)
.pause(20)
.write("ht")
.pause(100)
.backspace(2)
.pause(100)
.write("bu")
.pause(100)
.backspace(2)
.pause(200)
.write(tagline.substring(firstPart, secondPart), 50)
.pause(20)
.write("sk")
.pause(100)
.backspace(2)
.pause(100)
.write("te")
.pause(500)
.backspace(2, 50)
.pause(200)
.write(" FUC", 50)
.backspace(4, 60)
.pause(100)
.write(tagline.substring(secondPart), 50);
} else {
b.write(aiTaglines[selectedAI], 18);
}
},
[selectedAI]
);
//... in jsx somewhere
<p className="text-lg text-muted-foreground min-h-[3.5rem] flex items-center justify-center px-4">
"{typewriter}"
</p>
I'll probably turn this into an npm package at some point for all the lazy developers out there. And I'll probably (probably) remember to edit this page too.
Conclusion
The LLM told me to draw some kind of inspiring conclusion from this experience. I got nothin. So I'll just paste whatever the fuck it gave me. Here ya go:
🤖🤖🤖
When I finished the first version, I realized this wasn’t just a portfolio anymore.
It’s a reflection of how I think about building things — simple on the surface, intricate underneath, fully owned end to end.
Every pixel and route on davud.io passes through my compiler — and that’s the point.
It’s personal, opinionated, and alive.
And if you’re reading this, you’re technically inside my stack right now.
Welcome.