Toivo Investment

A property company site built deliberately as a company site, not a listings app.

A detail of a Toivo Investment project.

Toivo Investment is a Ghanaian property developer. We rebuilt toivoo.com from WordPress to Next.js.

This is about the build and the editorial constraints it had to hold.

The constraint

The interesting problem on this project was not performance. It was restraint.

Toivo Investment develops its own projects and builds bespoke for clients. It is not an agency and it does not broker other people's stock. A site that presents a browsable grid of properties reads as a brokerage no matter what the copy says, because the interface is the claim. So does structured data announcing a price and an offer on every project.

Our first build had a properties index. It was a good page. It made the client look like a business they are not, and it came out.

The stack, and why

Next.js 16 with the App Router and TypeScript, Tailwind v4 with the theme defined inline in globals.css, Manrope and Inter through next/font. No database, no CMS, no API routes. Content is inline per page and project data lives in one typed module.

That is a deliberate ceiling. A firm running a handful of projects and updating them a few times a year does not need a content system; it needs pages that load and a developer who can change one in ten minutes. Adding a CMS here would have bought a login screen and a monthly bill.

Deployment is Vercel, run manually with vercel --prod after every push. The GitHub integration on this repository silently stopped deploying for three weeks, which we found by comparing the deployment list against the commit log rather than by anything user-visible. Manual deploy is now the documented procedure.

a before-and-after site map. Left, labelled `before`, shows `Home -> Properties (index) -> Project` with the index tile shaded.

Three decisions

We deleted the catalogue and redirected it. /properties returns a 308 to /how-it-works. The individual project pages still exist and are still linked directly, so a specific project can be shared and can rank, but there is no public index to browse. The trade-off is real: an index page is easy traffic and we gave it up. The card component is still in the repository, unused, which is the honest state of a decision we might revisit.

Price and yield are optional on the type, and absent in practice. The Property type makes both fields optional, and the flagship project carries neither. The pages read "Pricing - on application" wherever the number used to sit, with one line of fine print explaining that pricing is shared as part of an introduction rather than published. The JSON-LD Offer uses a priceSpecification node instead of a bare price.

This is the part most likely to get undone by a future contributor, so it is worth stating plainly: a specific figure does not go back on that project without the client's sign-off, and the schema does not carry price, yield or a delivery date at all.

Trust claims get checked before they get styled. The previous site carried a regulatory licence claim on the about page and twice in the footer. That licence governs estate agency, which is not the business Toivo is in, so the claim was removed rather than reformatted. The general version of this rule: on a site whose whole job is credibility, an unverified badge is a liability with a nice border radius.

What broke

The flagship project needed a hero that showed the estate. The client rejected two versions before we got there, and both rejections were correct.

We started with a scroll-driven walkthrough built from still renders, with parallax between layers. It looked like a slideshow, because that is what it was. The second attempt added motion to the stills and looked like a slideshow with a budget.

What the project actually needed was a fly-through rendered from the same 3D model that produced the still images. So the component was rebuilt around a full-bleed muted looping <video> with a still poster, controls for play and mute, an automatic pause when it scrolls out of view, and a static poster substituted entirely when the visitor's system asks for reduced motion. The export specification for the real render is committed next to the video file, so dropping the final MP4 at that path ships it with no code change. The file sitting there now is an interim montage built with ffmpeg, clearly labelled as a placeholder.

The lesson we keep from it is about which problem to solve. Two attempts went into making stills feel like motion. The answer was to get motion.

A smaller one from the same work. The render set had to be regenerated from scratch because the first batch was architecturally wrong for the site: a missing amenity, and temperate cherry blossom in a tropical setting. Concept renders are concept renders. A dimensionally accurate model needs a human architectural visualiser, and we say so rather than implying otherwise.

Where it is now

Live on Vercel. Ten routes, no catalogue index, project pages reachable by direct link, and structured data that stays inside what the client can stand behind.

Built by BestDid

We designed and built the current toivoo.com. The firm, its projects and its process are at Toivo Investment.

Nearby: the BDShield case study covers maintaining twelve products on one architecture, and the PadiRent case study covers building for unreliable networks. The full list is on our work page. To discuss a build, see services.

Visit Toivo Investment