Work · Web-Coded US Site · ThinkingAI · Senior Marketing Manager · 2026

I took over the US site and web-coded it solo

The US marketing site used to go through Webflow or a China-based front-end team, then the full internal GitLab loop. I moved the build onto my laptop, where I web-code with AI against a written SOP and ship one clean branch per release. The whole v2.1.9 to v2.5.1 chain shipped in three weeks.

Release authority movedfrom the domestic team to the US side
2.1.9 → 2.5.1Jun 16 → Jul 9
0front-end engineers writing pages
Before

Every change waited on another team

ThinkingAI hired me for a few things, and the website was one of the main ones. I had run sites on WordPress and Webflow for years, so the operating half was familiar. The new part was the mandate: build it entirely in code ourselves, and move production and release authority to the US side.

The starting position made that harder than it sounds. The US site was built the way the domestic product was built, which is correct for a product and wrong for a marketing site that has to move at campaign speed. And the English site is three sites in one. Japan and Korea live inside it as subfolders, sharing its skeleton and much of its global configuration, so a careless change on our side surfaces on theirs.

  • We ran on the domestic pipeline and calendar. Every change waited on a China-based front-end engineer's bandwidth, then traveled the full internal GitLab path: dev, branch, staging, merge.
  • Marketing pages meant Webflow or front-end engineers. Content and layout changes waited on a designer's Webflow seat.
  • The US side owned none of the build. We had no local environment and no documented process, so a US change could not ship same-day without the domestic loop.
The operating model

How a US release gets built now

I web-code the site locally, follow a written SOP that acts as long-term memory, start each round from a clean environment, and never touch the remote without sign-off. The domestic team deploys and merges, and nothing else, by design.

Module A · Local dev environment

The build lives on my laptop

I stood up the site's Next.js project locally and drive every change through AI-assisted web coding against a real dev server. I self-check each change visually on localhost before it leaves my machine. I built it without a front-end engineer or Webflow.

npm run dev → localhost:3000, hot reload · every change seen before it ships
thinkingai.io/en/home-v3
Home v3 hero and dashboard module, built and shipped from the US pipeline
Module B · The SOP

A written SOP so mistakes only happen once

I codified the whole process into a durable knowledge doc: environment prep, the naming law, i18n region rules, release steps. Every change follows the same written steps instead of whatever I remember. The naming law makes work traceable at a glance: local folder name = remote branch name, dated to the day.

Folder = branch = feature_x.x_US_<MMDD> · folder, branch and MR map one-to-one
The naming lawone doc, every rule writtenSOP
folder = branch, dated
English site = en || other, allowlist
All copy lives in messages/en.json
Pre-flight checklist every round
Module C · The snowball workflow

One sentence starts a release round

Every round runs the same way. I clone the latest main into a new dated folder, rename the previous round with a -published-donotuse suffix and keep it on disk, edit and self-check on localhost, write the changelog and bump the version, then push and announce. Doing that by hand is twenty minutes of setup before any actual work, every time, and it is the kind of procedure a person eventually starts shortcutting.

So the SOP became an agent workflow that remembers the procedure. I say one line, that we are preparing an update, and it runs the chain: builds a clean folder, pulls the current main from GitLab, installs and prepares the local environment, applies the naming law, and carries my locally tested changes into the new merge request untouched. Two checks run inside it. One agent verifies that anything I changed in the shared global configuration cannot reach the Japanese or Korean sites. A technical-SEO agent runs new content against our own checklist. Then it uploads to GitLab, writes the changelog, and drafts the channel message. I built that release agent the same way as the reusable agent teams behind this work.

The last step is the one that keeps it honest. The merge request it just pushed becomes the working base for the next round, and the previous folder is archived automatically. My local copy is therefore never more than one version behind main, which is what stops the slow drift that makes a hand-run process rot.

Old rounds are archived and kept · the folder listing is the audit trail
One release roundtriggered by a sentenceagent-run
01 Clean foldernaming law applied
02 Pull latest mainGitLab
03 Env + dependencieslocal build ready
04 Carry my changesinto the new MR
Guard: global settings cannot reach JP/KR
Guard: technical-SEO checklist on new content
05 Upload + changelog+ channel message
06 Rebase the basenew MR becomes next round's start
Module D · The iron rule

No push to the remote without sign-off

One standing rule sits above the rest: never touch the GitLab remote without explicit sign-off. Local commits are always fine. I do not push, force-push or delete branches on my own. Branches are cut from the latest main, fetched fresh at the start of every round.

node_modules and build output never enter GitLab. Ever.
Guardrailswhat never happensiron rule
No remote push without sign-off
Branches cut from latest main only
node_modules never enters GitLab
Module E · The locale split

Pulling Japan and Korea out of our blast radius

Underneath all of this, I separated the global configuration. Japan and Korea sit in subfolders of the English site and inherited a lot of shared settings, which meant we could not move fast here without shaking them. I split the shared layer so their configuration stands on its own. The skeleton and the visual system still line up across all three, deliberately, and each region now has room to differ.

The US ships first as the pioneer: we build a thing, ship it, and find out where it breaks. Japan and Korea then adopt it on their own schedule rather than having it pushed onto them mid-release. When I later built the CMS, that is how it went: stand it up in their environment, hand over an account, and let them adjust within their own global settings for local reading habits and visual conventions, with no risk of their changes landing on anyone else's site. It works in the other direction too, since they can quickly copy, translate and localize a configuration we ship here.

A build-time check verifies the shared-route list still matches reality, because a stale entry hands a Japanese or Korean visitor a 404 from our language switcher
thinkingai.io/en/solutions/app
Solutions page built from the shared module library
Three sites, one skeletonshared shape, separated settingsUS pioneers
StructureJP + KR as subfolders of EN
Problemshared global settings couple them
Global config split per region
Skeleton and visual system stay aligned
Room reserved for local customization
AdoptionUS ships → they port on their schedule
Result

Three weeks, on the record

Every release is a dated CHANGELOG block with a semver bump, so anyone can audit it.

What shipped through it

16 competitor comparison landing pages · Cloudflare Turnstile anti-spam · region-based round-robin meeting routing · the full Sanity CMS integration (12 content queries, 6 Resource Center sections).

What I didn't own

Deploy and merge to production stay with the domestic team. That split is deliberate: I design and build the pages, and they own the remote.

The version chain · Jun 16 → Jul 9
v2.1.9–2.1.11 · eBook landing + homepage bannerJun 16
v2.2.x · Korea blog + static-export fixes·
v2.4.0 · 16 comparison pages + Turnstile·
v2.5.0 · full Sanity CMS integration·
v2.5.1 · gated-form fix, chain closedJul 9
Next.js React TypeScript GitLab Sanity Cloudflare Turnstile
Decisions I'd make again

The calls that made it a system

01 I wrote the process down as an SOP

I make every change the same way, from a written SOP with a naming law and hard rules. I built it to a standard someone else could pick up and run.

02 Every round begins on a fresh clone

Never reuse an old folder. Every round starts from a clean clone of main into a new dated folder; I archive the finished one and keep it on disk. Nothing carries across rounds. Merged work never ships twice.

03 I never ship without a CHANGELOG entry

Every ship gets a semver bump, a dated CHANGELOG entry, and a Slack note with the MR link. The domestic team and I always have an auditable record of what changed and why.

04 I turned the i18n rules into an allowlist

Each rule exists because something broke in production. English site means en || other as an allowlist, so only the listed locales get through and jp/kr stay out; pure-English pages scope their static params.

05 It handled 16 comparison pages solo

The pipeline carried real weight: 16 competitor comparison pages, Cloudflare Turnstile anti-spam, region-based round-robin meeting routing, and a full headless-CMS integration, with no front-end engineer.

06 I stopped waiting on Webflow

Marketing sites used to mean Webflow or a dedicated front-end team. Web coding replaced both. I shipped changes the same day and owned the build from my laptop. It also made the CMS Rebuild possible next.

For every project, he's also a strong partner to help shepherd and support the development of net new deliverables, troubleshooting everything from design resources to securing buy-in from cross-functional global stakeholders, including executives.
Christine M. Porretta Christine M. PorrettaSenior Manager, Intl. Marketing
Gusto

Need a site shipped without a front-end team?

Once the US site shipped from my laptop, adding a headless CMS was the obvious thing to build next.