jackdeng.cc — Personal Hub
ActiveThe site you're reading: the frontend and Payload CMS 3 live in one Next.js 16 app, the data sits in Supabase Postgres, and it deploys to Vercel, in English and Chinese.
Tech Stack
Next.js 16Payload CMS 3PostgreSQLSupabaseVercelTailwind CSSTypeScript
Architecture
- Payload 3 runs inside the Next.js App Router, so the admin and the site are one app and one deploy. Both languages go through next-intl (
/en,/zh). - Pages are statically generated and refresh hourly as a fallback; saving content in the admin expires the pages, the sitemap and the search cache at once.
- Supabase is used only as Postgres, with the Data API turned off. The
anonandauthenticatedroles have no privileges on the site's tables, and every table has RLS on.
Deployment and verification
- Branch protection requires a single CI check. It runs type checking, unit tests and a key check across the two languages' copy, then compares the database the migrations build with the schema the code defines, on a throwaway Postgres. Finally it seeds sample data, builds, starts the site and runs a smoke test.
- After every production deploy, and once a day, the same smoke script requests the live pages, including paths that should return 404 and every internal link.
- Migrations are written by hand. Dropping a column takes two steps: ship the new structure with the old column still there, and drop it separately once that's confirmed.
- Without
--apply, a script that writes to production only prints what it would change.
Lessons
- A query without a locale falls back to Chinese, so Chinese text showed up on English pages. That happened three times.
- Comments used to take two requests, a bot check and then the write, with nothing tying them together, so skipping the first one still wrote a comment. Now both happen in one request.
- While a post was still a draft, its 404 response carried its title. Since the fix, the CI smoke test creates a draft and checks that it returns 404 in both languages with no trace of the title.
Other Projects
B2B Customer PortalActive
A B2B portal for customers, backed by NetSuite. Deployed to a company server in September 2026 and used internally; not yet open to customers.
.NET 10ASP.NET CoreEF Core
DataHubActive
An internal data hub, rewritten in C#/.NET: an older system split across three services became one ASP.NET Core application. In production since June 2026, released by tag ever since.
.NET 10ASP.NET CoreDapper
Enterprise Manufacturing Analytics PlatformActive
A dbt + Databricks pipeline using a medallion (Bronze→Silver→Gold→Mart) architecture to turn raw ERP data into analytics-ready models for manufacturing, inventory, sales, and workforce reporting.
dbtDatabricksUnity Catalog