
fiqhan.dev
- Ibrahim Fiqhan
- Website
- April 6, 2025
Table of Contents
This site is the one project where I’m both the developer and the entire client, which means every decision is mine and I have nobody to blame for the ones that aged badly.
It’s a Hugo static site. No database, no server-side runtime, nothing to patch at 2am.
Why Hugo
I wanted a portfolio I’d actually update. That rules out anything where publishing a post means remembering how the admin panel works.
With Hugo, a new case study is a Markdown file. Commit it, and it’s live a minute later. The whole site, about 130 pages across two languages, rebuilds in a couple of seconds on my laptop.
How it’s put together
Composable modules instead of a monolith
Rather than one large theme I’d have to fork and maintain, the site pulls in around two dozen Hugo Modules as dependencies: search, image processing, a PWA manifest, gzip caching, lightbox galleries, table of contents, social sharing.
Anything I want to customise, I override in my own layouts/ directory. The upstream theme stays upstream, so updating it doesn’t clobber my work.
That’s the part I’d most recommend to anyone starting a Hugo site. Overriding beats forking.
Tailwind without a second build step
Tailwind v4 is compiled by Hugo itself through css.TailwindCSS, driven by a stats file Hugo generates while rendering. So there’s no parallel npm watcher to keep running, and no chance of the CSS and the templates drifting apart.
One command starts everything. hugo server.
Two languages, one codebase
English and Indonesian live in separate content trees, with Indonesian served under /id/. Navigation, UI strings, and metadata are all localised, and a page exists in a language only when that file exists.
Keeping the two trees in step is genuine ongoing work. I’ve caught myself shipping an English case study and forgetting its translation more than once.
Images handled at build time
Source images are 1920×1080 WebP, resized and re-encoded by Hugo’s pipeline into whatever each layout asks for. Screenshots go in, correctly-sized responsive images come out. No manual export step, no forgotten thumbnails.
Hosting
Static output behind a CDN on Cloudflare Pages, with an automatic build on every push to main.
There’s a small piece of history worth mentioning here. The site originally deployed to GitHub Pages, and I later moved it to Cloudflare. The migration also surfaced that my Hugo config had been quietly pinned to an old version and would no longer build on a current release, which is the sort of thing you only discover when you change one variable and everything falls over.
Still on the list
- A working theme switcher. The dark palette is defined, but the toggle is disabled.
- Filling out the blog, which currently has better infrastructure than content.
- Closing the remaining gaps in the Indonesian translations.
Have a look around the rest of the site, and get in touch if you want to talk about a project.

Ready to build your next project with me?
I’m ready to help you build, improve, and launch your next project — just drop a message and let’s get started.
Get Started Now


