[2025] // ADVOCACY

Lead for Tobacco Control

Advocacy platform connecting policymakers and advocates with tobacco control resources.

TECH_STACK

ADVOCACY Next.js Strapi Vercel SEO

Lead for Tobacco Control

The Problem: Scattered Advocacy Resources

The client is a non-profit focused on tobacco control policy. They had resources—policy briefs, case studies, legal documents, research papers—scattered across emails, shared folders, and old websites.

When advocates needed to find something specific (“What’s the legal precedent for banning flavored cigarettes in ASEAN?”), they had to dig through folders. When policymakers wanted to explore the evidence, there was no central place to look.

They needed a single, searchable, organized platform where anyone—policymakers, researchers, advocates, the public—could find what they needed.

The Solution: Simple Stack, Maximum SEO

This wasn’t a complicated project. It was straightforward:

  • Build a website
  • Let them manage content without touching code
  • Make it searchable
  • Make it fast
  • Make sure Google found it

Tech Choices

Next.js + Strapi because:

  • Next.js handles Server-Side Rendering (SSR) natively, which is crucial for SEO
  • Static Site Generation (SSG) for performance—pages are pre-rendered, not generated on request
  • Strapi CMS so non-technical staff could manage content (add documents, write descriptions, organize resources)
  • Both are straightforward to deploy and maintain

Vercel for hosting because it’s built for Next.js. Deploy a git push, and you’re done. No servers to manage, no DevOps nightmares.

Heroku for Strapi because the CMS needed a simple backend. Cost wasn’t zero, but it was manageable for a non-profit.

The Design Challenge: No Designer

I built this solo. No designer. I had to design from scratch.

This meant making pragmatic choices:

  • Clean typography (system fonts, good spacing)
  • Clear information hierarchy (headings, sections, white space)
  • Accessible colors (good contrast ratios)
  • Mobile-first design (it has to work on phones)

No fancy animations or custom fonts. Just clarity. A non-profit advocacy site should feel trustworthy, not trendy.

For a solo developer without design training, the best approach is constraint: pick a simple color palette, use good spacing, and get out of the way.

How It Works

Content Management

The advocate team uses Strapi (the CMS) to:

  • Upload policy documents, research papers, case studies
  • Write summaries and metadata
  • Tag documents by country, issue, type
  • Publish immediately without code

Strapi handles the data. Next.js queries it, generates pages, and publishes to Vercel.

SEO-First Architecture

For an advocacy platform, being findable is everything. People need to discover these resources.

What we optimized:

  • Meta descriptions on every page (Strapi stores them, Next.js renders them)
  • Open Graph tags for sharing on social media
  • Proper heading hierarchy (H1 for page title, H2 for sections)
  • Alt text on all images
  • Fast page load times (Vercel + Next.js handles this)
  • Sitemaps and robots.txt for search engines

When a researcher searches “tobacco control flavoring ban,” they should find this site.

User Experience

The goal is simple:

  1. User lands on the site
  2. They search or browse by topic
  3. They find what they need
  4. They download the document or read the summary

No friction. No signup walls. No ads. Just resources.

Advocacy Resource Platform

Organized, searchable collection of tobacco control policy resources

Resource Library

Centralized documents, research, case studies

Search & Filter

Find resources by country, issue, document type

Resource Detail Pages

Summary, metadata, download links

SEO Optimization

Discoverable in search engines

Why This Stack Works: A Proven Pattern

This isn’t a one-off. Next.js + Strapi + Vercel is a proven pattern for content-rich platforms—especially for non-profits, advocacy organizations, and similar clients.

Here’s what makes it work:

Next.js for SEO Discoverability matters. A research site that doesn’t show up in Google is invisible. Next.js handles Server-Side Rendering (SSR) and Static Site Generation (SSG) natively, which search engines love. Your content ranks.

Strapi CMS for Autonomy Non-technical staff need to manage content without calling a developer. Strapi’s UI is clean enough that a non-profit team can upload documents, write descriptions, organize resources—all without touching code. This is critical. If your client has to phone you every time they add a resource, the project fails.

Vercel for Simplicity No servers to manage. No DevOps. Deploy by pushing to GitHub. This matters for smaller projects where you don’t want to babysit infrastructure. Every git commit automatically builds and deploys. Zero friction.

The Result A platform that:

  • Ranks in search results (visitors find you)
  • Is easy for non-technical users to manage (you’re not a bottleneck)
  • Deploys automatically (zero friction)
  • Performs well (fast load times matter for SEO)

The Outcome

The site is live. Advocates and policymakers use it to find tobacco control resources. The team manages it themselves—adding documents, updating content, organizing resources. No code required.

Google indexes it, so researchers searching for “tobacco control policy” find it.

For a solo developer building a content platform, this is a complete, production-ready solution. For non-profits or advocacy organizations, this is the approach that works.

Closing

Not every project needs to be complex. Sometimes the best solution is the simplest one that actually serves your users.

This setup proves that simple technology, well-executed, beats complex technology poorly applied.

If you’re building a content-rich platform for an advocacy organization, non-profit, or similar client, this is the pattern that works. Build it once, let non-technical teams manage it forever.

OUTCOME

Centralized, searchable repository of tobacco control policy resources for advocates and policymakers.

MENU
HOME PROJECTS ARTICLES ABOUT SERVICES
SYS_TIME: --:--:--
ZONILY_JAME // 2026