// case study
AGAVI Website and LMS
Maintaining two Next.js apps for AGAVI, a food-industry consultancy: its corporate site and its training LMS, from upgrades and features to deploys and CI.
- year
- 2025-now
- type
- Web app
- stack
- Next.js

Since July 2025 I’ve maintained and extended two production Next.js apps for PT Agritama Sinergi Inovasi (AGAVI), an Indonesian food-industry consultancy. I took both over from the original developer and have handled everything since: framework upgrades, security patches, new features, deployments, and CI.
AGAVI Institute (institute.agavi.id) is a learning platform for food safety, R&D, and digital skills training. Learners buy courses with Midtrans, watch video lessons, take quizzes and post-tests, join discussions, and earn certificates. It serves students, facilitators, and admins.
- Upgraded Next.js from 13 to 15 and kept it patched against security advisories
- Built the certificate system: PDF certificates with QR codes, a public verification page, and certificates that unlock only after passing the post-test
- Added sequential video lessons that unlock in order, and a rich-text editor with image uploads for course content
- Added admin tools to hide and unhide courses, see enrollments, and filter users by role, and discussion and student counts for facilitators
- Set up Sentry error monitoring and Mixpanel event tracking
- Ran a hardening pass after my own code audit: security headers, a Content Security Policy that reports to Sentry, open-redirect fixes, sanitized rich text, and fixes for a race in token refresh

The corporate site (agavi.id) presents AGAVI and its business units, with articles and products managed in the Builder.io CMS.
- Upgraded Next.js from 13 to 16 with Tailwind CSS 4, patching security advisories along the way
- Moved hosting to Railway with a config-as-code deploy (Nixpacks build, restart on failure) behind Cloudflare
- Replaced timer-based page rebuilds with on-demand revalidation: an authenticated webhook from the CMS now refreshes only the article or product that changed, instead of about 75 pages on every cycle
- Added a GitHub Actions quality gate on every pull request and push to
main: ESLint, TypeScript, and a full production build - Wrote a pre-build check that catches missing or wrongly cased asset paths, which work on macOS but break on Linux servers
- Converted images to WebP, removed 61 unused assets, and fixed accessibility issues from an audit

Tech Stack:
- Next.js 15 and 16, React 19, Redux Toolkit, Tailwind CSS
- Builder.io CMS, Midtrans
- Railway, Vercel, Cloudflare, GitHub Actions
- Sentry, Mixpanel, Google Analytics
Both sites are live at agavi.id and institute.agavi.id.