CMS Company Profile

A company profile website with a purpose-built CMS for an Indonesian agricultural commodity supplier, covering six product categories: coconut shell charcoal, palm sugar, crystal sugar, coffee beans, fermented cocoa beans, and industrial salt. Built with Next.js, TypeScript, Prisma, and Supabase, it renders server-side so the catalogue is readable by search engines without JavaScript.

Role
Full stack development
Year
2025
Stack
Next.js, TypeScript, prisma, Tailwind, supabase
CMS Company Profile homepage

The problem with static company profiles

Commodity suppliers have catalogues that move. Grades change, specifications get revised, product lines get added or dropped with the season. When every one of those edits needs a developer, the edits do not happen — and a catalogue that no longer matches what buyers search for is worse than no catalogue at all.

The alternative most suppliers are offered is a general-purpose CMS carrying hundreds of features for blogging, commerce, and marketing that a commodity exporter will never touch. Those systems get abandoned because the interface asks the client to learn a product, not to update a price.

A CMS scoped to the business

I built a CMS that does exactly what this business needs and nothing else: manage products, manage media, manage client references, and handle incoming enquiries.

Constraining the scope is the point. An admin interface that can be learned in one sitting is an interface that gets used, and a catalogue that gets updated is the whole reason the site exists. Every feature not built is one fewer thing standing between the client and a price change.

Products are modelled as structured records with their specifications in defined fields rather than as free-form text. That keeps the catalogue consistent across six categories, and it means each product page presents its details in a predictable place — which matters for buyers scanning quickly and for search engines reading the page.

Rendering and the data layer

The site runs on Next.js with server-side rendering, so the catalogue is present in the HTML that search engines receive. For a supplier whose buyers find them by searching product names, a catalogue that only appears after JavaScript runs is a catalogue that may not be indexed at all.

Prisma provides the typed data layer over the product, media, and enquiry models, which means the schema and the application code cannot drift apart. Supabase handles the database and storage. TypeScript covers the models end to end, so a product cannot be saved missing a field that its page depends on.

Enquiries land in the same system as the catalogue, tied to the product they came from — so a question about a grade of palm sugar arrives with the context of which product prompted it, rather than as an anonymous form submission.

Why this shape suits B2B

B2B commodity buyers search differently from consumers. They search for the product name and the specification, they compare a small number of suppliers, and they want to reach a person quickly.

That argues for a catalogue that is complete, structured, fast to scan, and always current — and against the marketing-heavy company profile that most suppliers end up with. Giving the client direct control over the catalogue is what keeps that promise true six months after launch, which is the part most company profile projects never solve.