Skip to main content

EngineeringCodeCross Team

Harden a Tempo MVP before paid traffic (2026)

A 2026 guide for founders still shipping from Tempo: close secrets and row rules on the host you will advertise, and name a halt before you pay for ads.

Engineering

13 min

Canvas
Lab

Not the ad

Secrets
Host vault

Not VITE_

Ads
After

Default-branch host first

Harden a Tempo MVP before paid traffic by treating Canvas, Chat worktrees, and Play on localhost as the lab, and one advertised origin you already proved — your custom domain or the host that builds from the default branch — as the only stranger door. Keep Stripe secret keys out of VITE_ names and out of committed .env. Require owner rules on money rows. Name a host halt, not Discard. Then buy ads.

This note is from CodeCross, an Austin, Texas app development company (Pakistan engineering on a US Central overlap). Other tools sit on vibe coding. Buying help is the Austin app development company page. If nobody can name a host halt tonight, book a conversation.

Money leaves when the campaign still lists a Canvas Play tab, a Stripe secret named `VITE_`, or a leftover branch-live share link. Pricing puts Free at $0 with 250 issues, 100 docs, 500 local tests a month, and 7-day history. Pro is $50 a month for one user: unlimited issues and docs, 5,000 tests, 90-day history, and $4.50 per 1,000 extra tests. Extra seats are $40. Team is $200 a month for five users and 35,000 tests. That fee buys the desktop IDE, Canvas, Chat worktrees, and Agents. It does not buy a sealed host, a row rule, or an off switch you can hit after you quit the app.

This essay is the week before you buy ads, while screens still move in Tempo. Close the risky doors while Canvas still writes the tree. It expands Tempo MVP hardening. This page is not Tempo to production, get off Tempo, migrate from Tempo, or transition from Tempo. The question here is narrower: can you buy a click while Tempo still owns Canvas, Chat, and the Agents that open pull requests? When secrets, a host halt, or the advertised origin is still open, book.

Stay in Tempo. Close the doors first.

Tempo is paid to turn feedback into reviewed pull requests. Paid traffic is paid to send strangers at a public host. Those jobs collide. A green Canvas Play session can still leave a service key in a `VITE_` name, a table with no owner rule, or a branch-live share link as the campaign URL.

The vendor’s own docs draw the line. Introduction calls Tempo an AI software factory: Docs, Canvas, Issues, Chat, and Agents share one codebase. Canvas is blunt. Every frame is a live iframe of a real Vite or Next route. Style edits write back to source. That is the lab. Chat runs Claude or Codex in an isolated git worktree so the agent never touches your main tree until you merge. You still pick who may read a row on the host ads will hit. You still pick which origin those ads will open.

On 14 June 2026 Tempo wound down the web editor. The new path is a desktop app on your machine. app.tempo.build stays as a read-only billing portal. Old web repos were kept for 60 days after that date. That window is closed. If you never cloned, treat the web-era tree as gone unless a GitHub remote still answers. You do not need a new builder this week. You do need to name who holds secrets, who can merge to the default branch, and which URL ads will hit.

Fix the worst risk first. Ads turn a small leak into a big one.

Start with the worst risk, not a prettier storyboard. A stranger who dumps every order row, copies a live `sk_live_` from a `VITE_` bundle, or follows a branch-live share into an unreviewed worktree will cost more than a new onboarding flow. Put those risks in order, worst first. Close the worst one tonight.

Worst risk first — close the top Tempo gap

  1. Off switch and watch

    A host halt or a revoked share — not Discard on a chat worktree.

  2. Visual Review mistaken for row proof

    A passing pixel check is not an owner rule. visual-review:bypass posts success without capturing.

  3. Seats mistaken for a lock

    A Member can see and edit everything. An enabled Agent acts as you and can open a PR.

  4. Canvas vs the origin you own

    Ads, mail, or Auth that still print localhost, a leftover app.tempo.build tab, or a branch-live share.

  5. Secrets in VITE_ or committed .env

    A live sk_ in chat. A Stripe secret with a public prefix baked into the Vite bundle.

  6. Open rows on the advertised host

    Rules that never named an owner. A Canvas hide that never reached the API. Changes go live when the default branch deploys.

Ads multiply whatever is already open. A green Canvas Play is not a host rehearsal. A branch-live share is not a campaign host unless you mean it. Discard is not a halt.

Put six names on paper: who owns secrets, who proves login on the advertised host, who can merge to the default branch, who can enable Agents, who owns the public origin, and who can halt that host tonight. Two red names plus a campaign date means spend stays off. If you cannot name a human for each layer, book.

Canvas and Chat are the lab. The default-branch host is the ad target.

Tempo gives you several surfaces that look live. They are not the same job.

Three live origins — only one is the ad target

  1. 01 · Canvas / localhost

    Lab

    Live iframe of your Vite or Next route. Fine for you. Not the ad.

  2. 02 · Branch-live share

    Review door

    Commit-aware preview. Anyone with the link. Old shares can linger.

  3. 03 · Default-branch host

    Ads

    Custom domain or the host you proved. One name. Then spend.

Canvas Play is the lab. A branch-live share is a reviewer door. The host that builds from the default branch — or the one domain you actually advertise — is the name you own. Mixing them is how the studio becomes the company.

Canvas starts your dev server in the background. Iframes point at that server. Every design edit is a file write. Storyboards live as typed React exports under `tempo/designs/canvases/`. They commit like any other file. A Play session that looks finished is still localhost unless you pointed ads at something else on purpose.

Product updates added commit-aware preview publishing and branch-live share links. Reviewers see the state that matches a given branch. That is a gift for pull requests. It is a trap for ads. Install the Tempo MCP can mint those shares from CI if a `TEMPO_AUTH_TOKEN` sits in the job. Share links need the canvas branch committed and pushed. Do not treat a reviewer link as a campaign asset.

Google Search Central wants one preferred URL when two hosts show the same app. Meta’s ad review also checks the destination. Do not advertise your custom domain if clicks still land on a leftover `app.tempo.build` tab or a branch-live share. Point ads, mail, and in-app shares at one name you proved.

Secrets: VITE_ is the browser. Everything else stays on the host.

Keys are the next thing ads will leak. Setup and run scripts keep values out of the tree. The project env panel holds what your app reads from `.env`. A Private Setup Script can symlink `.env.local` from `$TEMPO_SOURCE_PATH` so the file never leaves your machine. The Workspace Setup Script is shared when you commit `tempo.config.json`. Do not put a live secret in that file.

Vite env and modes is the split Tempo Canvas actually runs. A name that starts with `VITE_` is baked into the client bundle. Everything else stays off the browser unless you prefix it. Stripe API keys say only a publishable `pk_` key is safe to expose. A secret `sk_` or a restricted `rk_` belongs in a host vault, not in Canvas chat and not under `VITE_`. If a live secret sat in chat, in a committed `.env`, or under a public prefix, rotate it at the provider first, then update the host, then ship a new build. Reloading Play is not enough.

Changelog notes that Canvas variables now run in production builds. Treat every canvas variable as if a stranger can read it. Install the Tempo MCP mints a `tempo_…` token for cloud agents and CI. Writes act as you. Revoke tokens you stop using. If the only place the secret still lives is a Chat transcript you will not search, book.

Auth and rows: a Canvas hide is not the lock.

Rows and money paths are the first thing ads will leak. Tempo is good at drawing a checkout on a storyboard. It is weaker at naming who may read the row after that checkout. Canvas writes React. React will hide a button if you ask. Hiding a control in a frame is paint. The API still answers.

OWASP Top 10 2025 still ranks broken access control first. They found some form of it in 100% of apps they tested. One example is an admin check that lives only in the front end. A Canvas hide is that example. Supabase Row Level Security is the common store behind Tempo-emitted apps. Policies name `auth.uid()`. A storyboard that looks empty for user B is not a policy.

Prove the function, not the frame. Call the route logged out. You want a refusal, not a row. Then call it as user B against user A’s order. You want a refusal again. A green Canvas Play as the founder is not that proof. Never put a `service_role` key in client code — it bypasses RLS entirely.

Agents act as you. Born disabled is not the same as off.

Agents are standing prompts on a trigger. Slack, GitHub events, schedules, or an assigned issue can start a Tempo session on your machine. Two safety lines matter. A new agent never fires until you enable it. And an agent acts as you, with your access. Nothing runs while Tempo is closed. That last sentence is a trap if you read it as “ads are safe when I quit.” The advertised host still answers. Agents only stop opening new pull requests.

Templates arrive disabled. Slack and GitHub triggers need a one-time connection. Name who may enable an agent the week ads go live. A Member in a team org can see and edit everything and can invite others. Only an Admin can remove members. Invite Agents as if they can merge — because they can open the PR that your host already auto-deploys.

Visual Review is pixels. It is not a row rule.

Visual Review turns tracked storyboards into a regression test. Mark a board with the `vrt` prop. Every pull request pixel-diffs it against the default branch. The `visual-review` check stays red until a person approves each change in Tempo’s portal. That is a real gate for layout. It is not a gate for “user B cannot read user A’s order.”

Two escape hatches are deliberate. The `visual-review:bypass` label posts success without capturing. A no-visual-change marker in the PR body skips capture when you are sure the PR touches no tracked board. Never put that marker in a PR template. Protected branches should require `visual-review` from Any source or the Tempo Labs AI GitHub App — never from GitHub Actions alone, or approvals cannot flip the check. A passing pixel check plus a campaign date is still red if a stranger can read a row.

Who may merge, and who can enable Agents.

Organizations and workspaces nest org, project, workspace, and worktree. A team org requires a GitHub or GitLab remote. A private org can stay local-only. Local-only is a lab. It is not a campaign path. Docs, issues, canvases, and chat history live with the org. Switching orgs changes what you see and moves nothing.

Name the humans who may merge to the default branch, who may enable Agents, and who holds the Tempo Labs AI GitHub App. A Member with edit access and an enabled Agent is a blast radius, not a convenience. Collaborators spend the same model seats you pay for. Treat every extra Pro seat as someone who can push.

GitHub: a cold boot is proof. It is not the off switch.

Default rows and the live host still live with your deploy until you prove a tree you can start without Tempo. Chat merge controls bring a worktree back to main or open a PR. The agent runs `git push`. Worktrees use a throwaway branch named `{your-git-username}/{workspace-slug}`. Discard runs `git worktree remove` and deletes that branch. Your local root never saw the change.

A green push is a backup. It is not a host halt. Secrets in the env panel never land in Git unless you committed them. Host rows are not in Git. Store certificates are not in Git. Prove the cold boot once: Tempo closed, clone opened, placeholders replaced, primary journey completes. Then you know you *could* leave. This page does not make you leave.

Off switch: halt the host. Not Discard.

A bad launch needs an off switch you can name tonight. Asking Chat to “fix it” waits on a prompt and burns model credits. That is repair. It is not an off switch.

Discard is a different drawer. Chat says Discard drops the worktree and nothing is lost on main. That is true for an unmerged session. It is false for a host that already built the merge. A branch-live share stays up until you stop publishing that commit. Name the person who can open the host dashboard. Hit halt or rollback once in a safe window so you know the control works. Then turn it back on.

Agents stop when Tempo is closed. That is not a campaign halt. The advertised URL still serves the last deploy. A Chat turn that says “undo the upload” is not Danger Zone.

Watching: the primary journey after a bad launch.

Watching without an off switch is half a lock. Before ads, name three signals: sign-in failures on the advertised origin, the primary money or lead path after deploy, and Agent plus test spend. Pricing meters local tests. Pro overage is $4.50 per 1,000. Visual Review captures burn that meter. Canvas Play logs are the lab. They are not the stranger meter. Name who watches the advertised URL the first day ads run.

A green storyboard can look fine and then miss a rule that went live the moment the default branch deployed. If the campaign lands on empty screens because RLS still uses the founder’s user id, that is a watch miss, not a creative miss. Prove the advertised origin on a cold install, signed out, then as a fresh account, before you buy a click that lands there.

Score — mark pretend vs proof

Rows / auth

  • Costume

    Hide on Canvas

  • Started

    Policy named

  • Proof

    Logged-out + stranger denied

Secrets

  • Costume

    Key in chat

  • Started

    Moved to env panel

  • Proof

    Host vault + rotated

Public name

  • Costume

    Ads list Canvas

  • Started

    Share live

  • Proof

    Ads + Auth match

Seats

  • Costume

    Member can enable Agents

  • Started

    Mergers named

  • Proof

    Who may merge

Cold boot

  • Costume

    Local-only project

  • Started

    Remote connected

  • Proof

    Tempo closed, app starts

Off / watch

  • Costume

    “Discard the chat”

  • Started

    Halt named

  • Proof

    Host halt hit once

A green Canvas Play is not proof. A branch-live share is still a review door — and that is fine for this page if public ads no longer print it.

Score each row against the advertised origin, not Canvas Play. One red cell — a mutating route without an owner rule, a key in chat, a Canvas ad, a Member treated as a lock, a repo you have never booted, or a halt you have never hit — is enough to hold the spend. Move that cell. Do not greenwash the matrix.

The week before you buy ads

Treat the next seven days as operator time on the Tempo project, not a slogan. Inventory who can merge, who can enable Agents, and which origin ads will hit. Then seal. Then prove.

Harden in Tempo — seven operator steps

  1. 01 →

    Inventory the public path

    Who can merge. Which origin ads will hit. Where secrets still live. Canvas vs share vs host named.

  2. 02 →

    Seal rows and auth

    Owner rules on money and PII. Prove logged-out and stranger-denied on the advertised host.

  3. 03 →

    Seal secrets

    Drain chat. Rotate. Host vault only for anything that can move money or call a model.

  4. 04 →

    Fix the origin map

    No Canvas in ads. Auth and shares match the default-branch host.

  5. 05 →

    Cold-boot a copy you control

    Remote required. Tempo closed. Placeholders filled. App starts.

  6. 06 →

    Name watch and spend

    Who sees sign-in fails, the primary journey after deploy, Agent runs, and test overage.

  7. 07

    Halt + watch, then buy

    Hit a host halt or revoke a share once in a safe window. Restore. Then spend.

Do not buy ads in step one. Do not start the builder exit while a step is still open.

Day 0 is inventory. Write five facts. The public origin. The person who can merge. Whether a live key still sits in chat or under `VITE_`. Whether a stranger can call a mutating function. Whether you can halt the host tonight. If the public origin is already taking leads and you cannot name those five, stop. You do not need a new storyboard. You need this list.

Seal rows first. Then secrets. Then the origin. Bots do not wait for a nicer paywall. If a public payment path exists, prove it refuses the call when the stranger is logged out. Then strip leftover Canvas shares. Then halt once in a safe window so you know the off switch works. Then spend. This page is the week you run that list.

Illustrative operator days before a Tempo ad buy

days

Unpriced Ads on a red list

3–5 wks

Campaign live. Doors still open. Cleanup later.

08162432Studio-observed calendar (not a bid, not a vendor SLA)Day 0–1Inventory + seats1 dayDays 1–3Rows + Auth1–3 daysDays 2–5Secrets + rotate2–5 daysDays 3–7Origin + halt3–7 daysUnpricedAds on a red list3–5 wks

Illustrative operator days — not measured traffic, not a Source: Admin analytics series. Unpriced feature sprints on a public Tempo app often cost more than this week when the first leak hits.

Reserve these days before paid traffic. Overlap is allowed. Skipping inventory to “buy a small test” is how Canvas Play becomes the company.

Treat those bars as calendar you reserve, not a vendor promise. If you cannot name the advertised origin, who can merge, and who can halt, the later days will thrash. The long bar is the expensive miss: a “small” test while a row or a chat secret is still the company.

Stay in Tempo, or leave. Do not mix the two jobs.

Pick one job for this week. Stay keeps Tempo as the studio, with sealed rows, secrets filled, a default-branch host as the origin, and a halt already proved. Leave opens the transition essay and stops buying clicks that need this merge window.

Stay or leave — pick one job

Stay (this page)

  1. Studio still in Tempo

    Canvas, Chat, and Agents still plan. You accept merge and the test bill.

  2. Doors closed on that path

    Rows, secrets, origin, cold boot, spend, halt.

  3. Ads wait for green

    A red layer pauses spend, not the product.

If the public origin must leave a Tempo-only ship path, stop this page and open the exit. If ads are close and the origin can stay on a host you control, finish these doors first. ↓

Leave (other pages)

  1. Process leaves the merge loop

    Your GitHub plus a host you run. See transition and get-off.

  2. A repo is not the exit

    The next Tempo merge still owns the live host until your CI signs it.

  3. Kill the studio-only ship

    App still answers when the Tempo app is closed.

This article is the left column. Get off Tempo is the right. To-production is the first host you sign yourself. Do not paste them here.

If you only need a leave date, use when to leave an AI builder. A door that will not close belongs on rewrite vs harden. A personal Git remote belongs on GitHub handoff. A host-only ship path belongs on CI/CD after an AI builder. Cousin wraps: Rork, Rocket.new. Those pages are not this Tempo week.

Check loop — prove, then decide

  1. 01

    Prove the door

    One layer. One test on the advertised origin — not Canvas Play.

  2. 02

    Close it

    Require an owner on the row, rotate, redirect, cold-boot, or halt.

  3. 03

    Re-check ads list

    If a layer is still red, spend stays off.

  4. 04 · loops

    Stay or leave

    Closed doors can stay. An open studio-only row opens the exit.

Do not buy ads inside the loop. Do not leave Tempo inside the loop. Exit the loop when the doors are closed or the live path must move.

When the list turns red

Leave the product up. Kill the campaign if any of these are still true:

  • A money or personal-data row is still readable logged out, or a stranger can read another user’s record.
  • A live key still exists in chat, in client code, or under a `VITE_` name.
  • Ads, mail, or Auth still list Canvas Play, localhost, or a leftover branch-live share you do not mean to keep.
  • The only restore is “we will Discard,” and you have never cold-booted the repo with Tempo closed.
  • The off switch is another Chat turn, or you have never halted the advertised host.
  • Two people disagree about who can merge or who can enable Agents.

A single red door is a miss, even if Canvas Play is green. Stop adding storyboards until rows, secrets, the origin, and halt are honest. Finish those doors. Then spend — or open the transition essay if the studio is still the company.

Bring a second pair of hands when the founder cannot rotate a key without pasting it back into Chat, when a stranger can still read a row, or when nobody has halted the host before the date. Hire for owner rules, secrets, merge seats, and the origin map — not a prettier home screen. Austin app development company is the studio brief. Austin mobile app development if the next door is a store binary that still depends on this Tempo merge.

Next steps

Walk the gates in order. Inventory the public origin, the person who can merge, and who can enable Agents. Drain chat into the env panel or the host vault. Rotate anything that appeared there. Require an owner on money and personal-data rows. Prove a stranger test on the advertised host. Cold-boot the remote with Tempo closed. Halt once. Then buy the click — or open the exit if the process itself must leave Tempo.

CodeCross LLC is an Austin-registered product studio (1606 Headway Cir STE 9212, Austin, TX). The Tempo week we run is sealed rows, secrets filled, a default-branch origin you own, a repo you have already started, then a halt you have already hit. The Austin app development company page is the studio brief. Austin mobile app development is the store-binary door if strangers still hit this Tempo-shipped host. Company-level evidence lives on proof. When the off switch, secrets, or the advertised origin is still open, book a conversation.

Tempo is allowed to stay the studio. Ads are not allowed to treat a green Canvas Play, an open row, or an unreviewed chat secret as that proof. Show a halt you can hit, rows that refuse a stranger who is not the owner, and keys that never lived in chat. Most teams never need a second codebase once those three exist.

FAQ

Can Tempo’s Visual Review catch a row rule that lets the wrong customer see an order?

No. Visual Review pixel-diffs tracked storyboards against the default branch. A person approves a layout change. That is not Supabase RLS. Call the API as user B against user A’s record on the advertised host. If the row returns, spend stays off — even if every storyboard is approved.

Which origin may paid clicks open after a Canvas Play session looks finished?

The host that builds from the default branch, or the one custom domain you proved. Canvas Play is a live iframe of localhost. Changelog branch-live shares are reviewer doors. Google Search Central wants one preferred URL. Do not advertise a domain if clicks still open a share.

Who can enable a Slack-triggered Agent that opens pull requests on the branch ads already use?

A Member, unless you took the seat back. Agents are born disabled and act as you. Organizations let Members see and edit everything and invite others. Only an Admin can remove members. Name who may enable an Agent before you buy a click. An enabled Slack trigger is a door, not a courtesy.

Where does a Stripe secret belong when Canvas iframes share the Vite env with localhost?

In the host vault, never under `VITE_`. Vite bakes `VITE_` names into the client. Stripe says only a `pk_` key is safe to expose. Setup scripts can symlink `.env.local` from `$TEMPO_SOURCE_PATH` so the file never commits. Rotate anything that sat in Chat.

What still answers strangers after you quit the Tempo desktop app?

The advertised host. Agents do not run while Tempo is closed. That stops new pull requests. It does not take down the last deploy. Migrate moved ship off the old web editor. Closing the desktop app is not Unpublish. Name a host halt you have already hit.

Does the visual-review:bypass label replace a host halt you can hit tonight?

No. Visual Review says the bypass label posts success without capturing. Use it for incidents on the PR, not as a campaign off switch. Discard drops an unmerged worktree. It does not roll back a host that already built the merge. Halt the advertised origin once in a safe window so you know the control works.

Book a call

Thirty minutes with a senior teammate — honest next steps.

Ready to price an Austin build?

Bring the problem, the users, and a budget ceiling. We’ll tell you whether an app is the right next spend — and what the first year actually costs.

Prefer writing? Send project details on the contact page.