Ecoplease
Next.js, Technical SEO•2022 — 2026
Ecoplease supplies compostable food packaging to other businesses, so the site is a 111-product catalogue that has to be found in search and hand buyers off to WhatsApp and marketplaces — and keep doing that for years while products are renamed and the framework underneath moves on.
One codebase, built and maintained solo for four years, upgraded instead of rewritten.

A catalogue that has to outlive its framework.
Ecoplease sells bagasse, PHA and cassava packaging to businesses, and the sale never happens on the site. Buyers find a product, then move to WhatsApp or a marketplace. The site's job is to be found and to hand off cleanly.
That job doesn't end at launch. Over four years products were renamed, 65 indexed product URLs went out of date, and ten SKUs changed codes. The audience reads Bahasa Indonesia first and English alongside. Next.js, React and Tailwind each went through major versions.
With one developer and no test suite, the site had to stay current without a rewrite, and the sitemap, schema and canonical URLs had to follow the content without anyone updating them by hand.


Upgrade in place, generate the rest from data.
- AUpgrade in place, never rewrite
The live codebase moved from Next.js 12 to 13 to 15, React 18 to 19 and Tailwind 3 to 4, onto an ESLint flat config and stricter TypeScript, and from npm to Bun. The site stayed up and kept its URLs throughout.
- BSitemap generated from the page data
A custom XML sitemap replaced the off-the-shelf plugin. It is built from the same data files the pages render from, covering static routes, 7 categories, 111 products with their images, and articles with real last-modified dates, and it is cached at the edge. It can't list a page the site doesn't have.
- CA typed schema.org graph
Seven JSON-LD components (website, organisation, page, article, breadcrumb, collection and video) are linked by ID and typed end to end. A JSON-safe sanitiser escapes script-breakout characters instead of HTML-sanitising the payload.
- DKeep every indexed URL alive
65 legacy product URLs and 10 SKU renames map from old ID to old SKU to current SKU, then 308-redirect to the canonical slug. Stale slugs redirect too, and unknown codes return a real 404 instead of a soft one. Canonical and Open Graph URLs drop query strings, so campaign links don't create duplicates.
- EBilingual landing pages
Seven category landing pages target Indonesian head terms, Bahasa Indonesia first with English alongside, and 113 entries carry their own title, meta description and heading.


Small pieces that keep it honest.
- Image delivery. A custom image loader serves resized images through Cloudflare from object storage, instead of the platform's built-in optimiser.
- Video markup. YouTube embeds on the home and materials pages carry video structured data.
- Conversion tracking. Every WhatsApp and marketplace button fires an analytics event, so hand-offs are counted even though the sale happens elsewhere. Analytics loads in production only.
Four years on, still current.
Since launch the site has served more than 28,000 users and 57,000 page views. Instagram brings the most new visitors, then direct visits, Google search and TikTok.
After four years and 247 commits it runs on current Next.js, React and Tailwind, with 111 products and 7 category pages generated from data files. Every URL that was ever indexed still resolves.
- Year2022 — 2026
- IndustryEco-packaging (B2B)
- RoleSole developer · freelance
- Scope of work/ Frontend / SEO / Long-term maintenance
- StackNext.js · React · TypeScript · Tailwind CSS · schema-dts · Framer Motion · Vercel · Cloudflare