A software developer who is particularly good at turning strong design and business requirements into finished products.
Scope
Harbour Bay Downtown is a waterfront district in Batam, Indonesia: shops, restaurants, hotels, a mall, nightlife, wellness, a ferry terminal and property for sale and lease. It is also where the ferry to Nirup Island departs, which is how I came to build both.
I designed the site and built the theme. A custom WordPress block theme, 107 PHP files and around 14,000 lines, with 16 page templates, 67 render patterns and a Vite and Sass build pipeline.
A district is a directory
Nirup Island is one operator running one place. A commercial district is dozens of independent businesses that share an address and nothing else. Restaurants change their hours, shops close, new tenants open, events happen and then stop being relevant.
Which means the real enemy is not the launch, it is month eight. A district site that cannot be kept current becomes actively misleading: a visitor drives across town for a restaurant that closed. So almost every decision in this build is about what happens after handover.
Content that can keep up
Everything that changes is modelled as content rather than written into templates. Listings, events, ferries and buildings each get their own type, so a venue exists once and appears wherever it is relevant: its category page, the map, search, and its own detail page.
Populating a directory by hand is its own failure mode, so venues can be imported in bulk from a structured data file, run from the admin rather than the command line. And the surrounding copy, imagery and arrangement sit in 237 Customizer settings across 65 sections, so seasonal and promotional changes do not need a developer.
Enquiries that do not get lost
The site carries several different asks. Somebody wanting to advertise, somebody enquiring about leasing a unit, somebody with a general question. These reach different teams, and a single contact address means the wrong person triages all of it.
Each form validates and sanitises its input, then does two things rather than one. It routes to the recipient for that form type, and it stores the enquiry as a record in the admin with its own list columns and detail view. Email alone is a lossy channel: it bounces, it lands in spam, somebody deletes it. Keeping the record means a lead is never lost because a message failed to arrive.
The map, again
Like Nirup, the district needs to be understood spatially, and like Nirup the pins are placed through an admin tool rather than written into code. Having built the pattern once, reusing it here cost almost nothing and saved the same maintenance problem twice.
Built as a block theme
The front end is composed from 67 PHP patterns rendered through the block system, one per page section, which keeps templates thin and makes sections reusable across pages.
Styles and scripts are authored as Sass and JavaScript modules and compiled by Vite with content-hashed filenames, resolved at runtime through the build manifest. That means cache-busting is automatic rather than a thing somebody has to remember, which is another decision aimed at month eight rather than launch day.
Also in the build
Status
Delivered and live, built in 2026.