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

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.
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.