---
title: "Corporate IR Platform — Custom CMS on GCP — Tran Manh Tuan"
description: "A corporate and IR website platform for a listed Japanese company — a fully self-built CMS, a Firestore-to-BigQuery data pipeline, and Google Cloud infrastructure behind a WAF."
canonical: "https://tmtuan.dev/en/projects/corporate-ir-platform"
language: "en"
image: "https://tmtuan.dev/_img/projects/corporate-ir-platform/corporate-ir-platform.f0d2285c-og.jpg"
tokens: 784
---

# Corporate IR Platform

A corporate and investor-relations (IR) website platform for **a listed company in Japan** — the most backend-heavy project in this portfolio: instead of a commercial CMS, the entire content-management system was **built in-house** to match the workflows of a listed company, managing bilingual Japanese/English press releases, stories, recruiting news and emergency notices.

The CMS is built with **Vue 3 + TypeScript + Vite**: sign-in through **Firebase Auth** with authorisation via custom claims, a block-based editor, content stored in **Firestore** and images in **Cloud Storage**. Scheduled posts publish themselves — **Cloud Scheduler** runs hourly through **Pub/Sub** to sweep and publish on time with no operator involved.

Firestore data is backed up periodically and synced to **BigQuery**; a full-text search API runs on top of that data layer. A separate content-aggregation API — running on **App Engine** with caching — collects RSS feeds from the group's other sites and third-party IR news for centralised display.

The frontend is **Nuxt** rendered server-side (SSR). Infrastructure is defined with **Terraform**: the Load Balancer, **Cloud Armor (WAF)** in front and Firebase rules are all managed in one place, so infrastructure changes go through review like code changes.

## Details

- **Role:** Technical Lead
- **Website:** [dena.com/intl/](https://dena.com/intl/)

## Technology

- Nuxt
- Vue
- TypeScript
- Vite
- Firebase Auth
- Firestore
- Cloud Storage
- BigQuery
- App Engine
- Cloud Scheduler
- Pub/Sub
- Cloud Armor
- Terraform

## Services this project shows

- [Corporate & Content Web Platforms](https://tmtuan.dev/en/services/web-platforms)
- [Backend Engineering](https://tmtuan.dev/en/services/backend-development)
- [Cloud Infrastructure](https://tmtuan.dev/en/services/gcp-cloud-infrastructure)

## Related articles

- [Docs-as-code Knowledge Base + Context Graph for a 15-project portfolio](https://tmtuan.dev/en/articles/knowledge-base-docs-as-code-context-graph)
- [How I Traced a Googlebot-only HTTP 500 Across Next.js, Cloud Run and the Hosting Edge](https://tmtuan.dev/en/articles/googlebot-500-firebase-hosting-nextjs)

## Structured data (JSON-LD)

```json
{"@context":"https://schema.org","@graph":[{"@type":"WebPage","@id":"https://tmtuan.dev/en/projects/corporate-ir-platform#webpage","url":"https://tmtuan.dev/en/projects/corporate-ir-platform","name":"Corporate IR Platform — Custom CMS on GCP","description":"A corporate and IR website platform for a listed Japanese company — a fully self-built CMS, a Firestore-to-BigQuery data pipeline, and Google Cloud infrastructure behind a WAF.","inLanguage":"en","isPartOf":{"@id":"https://tmtuan.dev/#website"},"about":{"@id":"https://tmtuan.dev/#person"}},{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://tmtuan.dev/en"},{"@type":"ListItem","position":2,"name":"Projects","item":"https://tmtuan.dev/en/projects"},{"@type":"ListItem","position":3,"name":"Corporate IR Platform","item":"https://tmtuan.dev/en/projects/corporate-ir-platform"}]}]}
```
