How this site is built

The site is its own small case study. No frameworks you’d need a meeting to explain.

Rendering
Vue 3 and Vite, prerendered to plain HTML at build time (vite-ssg). Search engines and slow phones get a finished page; Vue takes over afterwards.
Speed
Critical CSS is inlined, only the two fonts the first screen needs are preloaded, and every page’s code is fetched in the background once the browser is idle, or the moment you hover a link.
Images
Every heavy image ships as 480, 960 and 1600 px WebP plus a ~190-byte blurred placeholder inlined in the page. You see its shape at once; the right size for your screen fades in when it arrives.
Backdrop
A photo of me on a ridge in Nepal, traced into vector layers (about 29 KB) with drifting mist and a little parallax. Off for anyone who prefers reduced motion.
Accessibility
Checked with axe against WCAG 2.2 AA on every page, light and dark. A reading panel adds text size, high contrast, reduced motion, underlined links, wider spacing and free translation into 16 languages.
Content
Projects and posts are Markdown files. The résumé PDF, the Word file and /cv are generated from one data file, so they never disagree.
Search
Per-page titles and descriptions, structured data (Person, CreativeWork, BlogPosting, FAQ), an image sitemap, RSS, llms.txt and preview images rendered at build time.
Hosting
GitHub Pages. A workflow rebuilds the site on every change and every Monday morning, which keeps the “Updated” date in the footer honest.
Type and colour
IBM Plex Sans and Mono, in black and white. The rules come from the design language I wrote for Kaede.

Source: coderkoala/coderkoala.github.io.

  • Home
  • WorkEverything since 2017
  • Writing
  • About
  • ConsultHow I help, how we work, questions
  • Résuméas a page
  • Nowthis month
  • How this site is built
  • KaedeCargo ERP
  • Kalimati MarketGovernment platform
  • GenericPropertiesReal estate CRM
  • What building IATA ONE Record taught me about linked data
  • Handing out air waybill numbers without handing out the same one twice
  • mTLS and OAuth2 on the same call, step by step
  • Most waybills are the usual one
  • Designing a freight rate engine that four modes can share
  • Keeping PHPJasper alive for a cargo ERP
  • A copilot that lives in bash and asks before it acts
  • Teaching a UI library to speak Nepali
  • Integrating eSewa and Khalti in Laravel without trusting the redirect
  • Taking money on a government website
  • One developer, one market, no ads
  • A date that didn't fit in an integer
  • Finding the nearest agent among millions
  • The check that only lived in the browser
  • Dynamics CRM pluginsC# plugins · 2020
  • Syncfusion in NepaliLocalisation · 2024
  • AffiliatefeedShopify app · 2021
  • WPEverest developer docsDocumentation · 2020
  • Everest FormsWordPress plugins · 2020
  • Rapti CRMERPNext customisation · 2020
  • TaskmonTask manager · 2019
  • GDG DangCommunity portal and talk · 2019
  • Presidential Business School EMSExam system · 2019
  • PHPJasper, maintainedPHP library · 2025–now
  • Nimbus NepalCMS and backend · 2019
  • Loksewa Aayog QuizFacebook Instant game · 2019
  • Debendra ManandharWebsite · archived copy · 2019
  • Four Seasons EngineeringWebsite · 2019
  • Travel Time NepalWebsite · archived copy · 2019

↑↓ to move · Enter to open · Esc to close

Reading and accessibility

Text size
High contrast
Reduce motion
Underline all links
Easier reading spacing
Saved on this device. Your system's reduced-motion and dark mode are always respected.