Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
90 commits
Select commit Hold shift + click to select a range
5b7c071
fix(ui): keep the maxFiles budget in step within a single tick (#6941)
Kitenite Aug 28, 2026
0dcb07f
feat(i18n): localize string props, toasts, and label maps (Phase 2, b…
Kitenite Aug 28, 2026
74fb63a
fix(desktop): match settings top bar to sidebar (#6947)
Kitenite Aug 28, 2026
8d12655
feat(i18n): finish the sweep and ship Japanese and Simplified Chinese…
Kitenite Aug 28, 2026
3586a65
feat(desktop,host-service): forward remote workspace ports to the loc…
Ymirke Aug 28, 2026
5c5d28b
fix(marketing): seed RSC i18n per route entry, not just the root layo…
saddlepaddle Aug 28, 2026
5b7dbc2
feat(desktop): copy-on-select setting for v2 terminals (#6949)
Kitenite Aug 28, 2026
163f95d
fix(desktop): notify for OpenCode permission and question prompts (#6…
Kitenite Aug 28, 2026
6b85988
fix(auth): remember the organization you switched to across sessions …
saddlepaddle Aug 28, 2026
95d8bda
fix(terminal): stop the viewport freezing when Pi erases the scrollba…
Kitenite Aug 28, 2026
5ec1ca2
fix(desktop): finish the Remote Access rename, and stop English edits…
Kitenite Aug 29, 2026
59bd10f
perf(i18n): load translation catalogs on demand (#6951)
Kitenite Aug 29, 2026
556c80a
fix(agent-setup): handle Codex interrupted turns (#6963)
Kitenite Aug 29, 2026
df5579d
ci: smoke test deployed previews and arm the RSC seeding guard for ev…
Kitenite Aug 29, 2026
ede3d4f
fix(desktop): preserve provider profile and sync sidebar state (#6961)
Kitenite Aug 29, 2026
7f4527c
feat(i18n): ship French (#6964)
Kitenite Aug 29, 2026
4178eb8
feat(i18n): ship Korean (#6965)
Kitenite Aug 29, 2026
46482ca
feat(pages): default to org visibility, cached thumbnails, owner + de…
harshithmullapudi Aug 29, 2026
edb937f
feat(pages): watch published pages and route comments to the owning a…
harshithmullapudi Aug 29, 2026
82adf28
feat(i18n): ship Traditional Chinese and fix Chinese locale resolutio…
Kitenite Aug 29, 2026
dbce77f
feat(i18n): ship Spanish (#6971)
Kitenite Aug 29, 2026
c79f2dc
feat(i18n): ship German (#6972)
Kitenite Aug 29, 2026
9a94147
feat(i18n): ship Brazilian Portuguese (#6973)
Kitenite Aug 29, 2026
d2705f0
feat(i18n): ship Italian (#6974)
Kitenite Aug 29, 2026
e229706
feat(i18n): ship Russian (#6976)
Kitenite Aug 29, 2026
757663b
feat(i18n): ship Turkish (#6977)
Kitenite Aug 29, 2026
09604b7
feat(i18n): ship Polish (#6978)
Kitenite Aug 29, 2026
e4313a3
feat(i18n): ship Dutch (#6979)
Kitenite Aug 29, 2026
f528adf
feat(i18n): ship Indonesian (#6981)
Kitenite Aug 29, 2026
1926ed0
feat(i18n): ship Czech (#6982)
Kitenite Aug 29, 2026
fe69270
feat(i18n): ship Vietnamese (#6983)
Kitenite Aug 29, 2026
716baab
feat(desktop): offer to restart running agents onto the new default a…
Kitenite Aug 29, 2026
9d3ad8a
feat(i18n): translate new strings automatically on the PR (#6984)
Kitenite Aug 29, 2026
4cfa600
fix(i18n): make built sentences whole messages instead of fragments (…
Kitenite Aug 29, 2026
24bf9fd
fix(i18n): five findings from the visual locale review (#6989)
Kitenite Aug 29, 2026
fd263ed
feat(usage): add Grok and Antigravity quotas (#6987)
Kitenite Aug 29, 2026
240f6e2
fix(marketing): serve the request's language, and make regressing thi…
Kitenite Aug 29, 2026
55f339a
feat(i18n): language switcher on marketing and docs (#6992)
Kitenite Aug 29, 2026
78b473c
feat: workspace tags and tag-derived sidebar folders (#6990)
Kitenite Aug 29, 2026
25b1e9d
chore: biome format and import order for the tag-folders files (#6995)
Kitenite Aug 29, 2026
2b5b702
fix(i18n): language switcher names the language in effect, never "Aut…
Kitenite Aug 29, 2026
2d19c6b
fix(shared): raise MIN_HOST_SERVICE_VERSION to 1.21.0 so pre-1.21 hos…
Kitenite Aug 29, 2026
0e58dbe
docs: translate the README into all sixteen shipped languages (#6997)
Kitenite Aug 29, 2026
1af79ba
fix(docs): compact language switcher to an icon beside the GitHub mar…
Kitenite Aug 29, 2026
358e3f3
fix(desktop): clarify workspace sidebar naming (#7000)
Kitenite Aug 29, 2026
f5f671b
feat(marketing): localized URLs — every page per locale, with its own…
Kitenite Aug 29, 2026
d15d8e7
docs: collapse the README language row into a disclosure (#7004)
Kitenite Aug 29, 2026
72f3b2c
fix(i18n): deterministic default-locale first render, no hydration mi…
Kitenite Aug 29, 2026
2f72fdd
feat(desktop,host-service): host-side tag folder presentation and hid…
Kitenite Aug 29, 2026
7515cb5
feat(marketing): Figma-style footer language picker (#7006)
Kitenite Aug 29, 2026
57ed050
fix(desktop): render Nerd Font icons for any terminal font (#7008)
Kitenite Aug 29, 2026
1f3ce98
feat(agent-setup): report agent launch from the wrapper so terminals …
Kitenite Aug 30, 2026
bfc6894
feat: continue a terminal session with another agent, or fork it (#6962)
Kitenite Aug 30, 2026
26ef558
The Production Run: campaign page, graded cost axis, and the Output f…
harshithmullapudi Aug 30, 2026
97ba9fe
docs: correct the port-forwarding host-service floor to 1.26 (#7013)
saddlepaddle Aug 30, 2026
1ac1909
feat(desktop,host-service): render the Changes pane from patches (#6968)
Kitenite Aug 30, 2026
f5e3181
test(usage): isolate native history collectors (#7014)
Kitenite Aug 30, 2026
9a1a5ea
fix(mobile): keep a Bluetooth route change from crashing dictation (#…
saddlepaddle Aug 30, 2026
4d2a6d7
feat(mobile): move "+" to the project header, drop new-agent from hom…
saddlepaddle Aug 30, 2026
91409ed
fix(gmail): skip already-recorded messages so a history walk can fini…
saddlepaddle Aug 30, 2026
74acf87
test(agent-setup): stop rewriting the OpenCode plugin per test (#7025)
saddlepaddle Aug 31, 2026
bdcaf30
feat(mobile): move the session tabs to the bottom, natively (#7024)
saddlepaddle Aug 31, 2026
874e510
feat(marketing): /security page for vulnerability and abuse reports (…
saddlepaddle Aug 31, 2026
7560b5d
docs(marketing): drop hostnames and the scope block from the security…
saddlepaddle Aug 31, 2026
5cd217a
fix(auth,desktop): stop moving people into the organization they join…
saddlepaddle Aug 31, 2026
991da56
feat(pages): usercontent origin — Cloudflare Worker + R2, view ticket…
saddlepaddle Aug 31, 2026
23610a5
feat(files): the files layer — schema, router, media route (SUPER-207…
saddlepaddle Aug 31, 2026
f7df1d2
docs: weekly changelog 2026-08-30 (17 languages, session handoff, tag…
Kitenite Aug 31, 2026
d9732a8
chore(desktop): bump version to 1.25.1 (host-service 1.25.0 -> 1.25.1…
Kitenite Aug 31, 2026
9e941d2
feat(automations): trigger fidelity — providers, pickers, webhook URL…
saddlepaddle Aug 31, 2026
4b7ad2a
fix(mobile): polyfill Intl.PluralRules, which Hermes does not ship (#…
saddlepaddle Aug 31, 2026
dcbd83d
fix(workspaces): launch the agent before the setup terminal (#7041)
saddlepaddle Aug 31, 2026
c7df746
fix(automations): four review findings on the trigger rows (#7039)
saddlepaddle Aug 31, 2026
5f7a222
feat(mobile): move the workspace PR link into the session strip (#7038)
saddlepaddle Aug 31, 2026
74159b8
feat(agents): offer Codex's max and ultra reasoning efforts (#7045)
saddlepaddle Aug 31, 2026
1c443c9
feat(pages): directory publish — assets on the page's own origin (SUP…
saddlepaddle Aug 31, 2026
5231014
refactor(pages): page-scoped asset staging, delete the generic file u…
saddlepaddle Aug 31, 2026
29ee3db
fix(host-service): bind a resumed agent session's id at launch (#7048)
Kitenite Aug 31, 2026
236d8ab
content: evergreen agent context-switching post and Orca vs Conductor…
Kitenite Aug 31, 2026
4988b7f
chore(host-service): delete the v1 relay tunnel client (#relay2) (#7051)
saddlepaddle Aug 31, 2026
9b2870b
feat(marketing): rebuild /download as a real downloads page (#7047)
Kitenite Aug 31, 2026
854b459
feat(desktop): group sessions into tag folders in the sidebar (#7037)
Kitenite Sep 1, 2026
c9dd6ae
feat(auth): gate activation drip enrolment behind the experiment flag…
saddlepaddle Sep 1, 2026
f5ff81c
fix(desktop): use workspace agent default for handoff (#7056)
Kitenite Sep 1, 2026
9b677c4
fix(desktop): keep pane selection local across windows (#7057)
Kitenite Sep 1, 2026
be7e80c
fix(browser): keep sign-in popups in the pane's session (#7049)
Kitenite Sep 1, 2026
59c07d3
chore(email): drop habit-drip and its email sources (#7058)
saddlepaddle Sep 1, 2026
cb3268f
fix(usercontent): give page assets a content policy of their own (#7059)
saddlepaddle Sep 1, 2026
274d6f7
Merge remote-tracking branch 'upstream/main' into sync/upstream-2026-…
tomikng Sep 1, 2026
9c0efbb
ci: gate the translate-catalogs job on the upstream repository
tomikng Sep 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
36 changes: 36 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,24 @@ ANTHROPIC_API_KEY=
# -----------------------------------------------------------------------------
BLOB_READ_WRITE_TOKEN=

# -----------------------------------------------------------------------------
# Cloudflare storage + user content origin (pages, thumbnails, chat attachments)
# -----------------------------------------------------------------------------
CLOUDFLARE_ACCOUNT_ID=
R2_ACCESS_KEY_ID=
R2_SECRET_ACCESS_KEY=
# Pages and files; read through the usercontent Worker (apps/usercontent) with a ticket.
R2_PRIVATE_BUCKET=
# Where pages are served from, one subdomain per page under it (apps/usercontent):
# https://frame.supersetusercontent.com
USERCONTENT_URL=
# App-referenced files (apps/usercontent, same Worker): https://media.supersetusercontent.com
MEDIA_URL=
# Shared with the usercontent Worker (wrangler secret); 32+ characters.
USERCONTENT_TOKEN_SECRET=
# Optional: page thumbnails are skipped while unset.
CLOUDFLARE_BROWSER_RENDERING_TOKEN=

# -----------------------------------------------------------------------------
# PostHog Analytics
# -----------------------------------------------------------------------------
Expand All @@ -130,6 +148,24 @@ NEXT_PUBLIC_SENTRY_DSN_DOCS=
NEXT_PUBLIC_SENTRY_DSN_API=
SENTRY_DSN_DESKTOP=

# Sentry public integration — powers Sentry automation triggers (issue created,
# resolved, assigned, ...). Optional: leave blank and the Sentry trigger simply
# reports "Requires connection" in the editor; nothing else breaks.
#
# These come from a Sentry *public integration* (Settings -> Developer Settings
# -> Public Integration), not from the DSN/auth-token above, which are for error
# reporting. A Sentry app allows exactly one Redirect URL, so a local checkout
# needs its own app rather than sharing the deployed one:
# Redirect URL: http://localhost:<API_PORT>/api/integrations/sentry/callback
# Webhook URL: http://localhost:<API_PORT>/api/integrations/sentry/webhook
# Permissions: Project, Issue & Event, Organization, Member = Read.
# The client secret is shown once, at creation — save it then.
# Sentry cannot reach localhost, so webhooks (and therefore live triggers) need
# a tunnel; the install flow and the project picker work without one.
SENTRY_APP_SLUG=
SENTRY_CLIENT_ID=
SENTRY_CLIENT_SECRET=

# -----------------------------------------------------------------------------
# Resend (Email)
# -----------------------------------------------------------------------------
Expand Down
36 changes: 36 additions & 0 deletions .env.local.example
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,24 @@ ANTHROPIC_API_KEY=sk-ant-fake-local-dev
# -----------------------------------------------------------------------------
BLOB_READ_WRITE_TOKEN=vercel_blob_rw_fake_local_dev

# -----------------------------------------------------------------------------
# Cloudflare storage + user content origin (fake for local dev; publishing a
# page needs real R2 credentials and `bun run --cwd apps/usercontent dev`)
# -----------------------------------------------------------------------------
CLOUDFLARE_ACCOUNT_ID=fake-cloudflare-account-id
R2_ACCESS_KEY_ID=fake-r2-access-key-id
R2_SECRET_ACCESS_KEY=fake-r2-secret-access-key
R2_PRIVATE_BUCKET=superset-private-dev
# Setup's port allocator writes USERCONTENT_DEV_PORT (base+14) and this URL
# into the shared .env; 8787 is the bare fallback used without setup.
USERCONTENT_URL=http://frame.usercontent.localhost:8787
MEDIA_URL=http://media.usercontent.localhost:8787
USERCONTENT_TOKEN_SECRET=local-dev-usercontent-secret-change-me-32
# Deliberately empty: unset means page thumbnails are skipped, which is the
# right local behavior. A fake value would make every publish enqueue a
# doomed capture job.
CLOUDFLARE_BROWSER_RENDERING_TOKEN=

# -----------------------------------------------------------------------------
# PostHog Analytics (disabled in local dev)
# -----------------------------------------------------------------------------
Expand All @@ -115,6 +133,24 @@ NEXT_PUBLIC_SENTRY_DSN_DOCS=
NEXT_PUBLIC_SENTRY_DSN_API=
SENTRY_DSN_DESKTOP=

# Sentry public integration — powers Sentry automation triggers (issue created,
# resolved, assigned, ...). Optional: leave blank and the Sentry trigger simply
# reports "Requires connection" in the editor; nothing else breaks.
#
# These come from a Sentry *public integration* (Settings -> Developer Settings
# -> Public Integration), not from the DSN/auth-token above, which are for error
# reporting. A Sentry app allows exactly one Redirect URL, so a local checkout
# needs its own app rather than sharing the deployed one:
# Redirect URL: http://localhost:<API_PORT>/api/integrations/sentry/callback
# Webhook URL: http://localhost:<API_PORT>/api/integrations/sentry/webhook
# Permissions: Project, Issue & Event, Organization, Member = Read.
# The client secret is shown once, at creation — save it then.
# Sentry cannot reach localhost, so webhooks (and therefore live triggers) need
# a tunnel; the install flow and the project picker work without one.
SENTRY_APP_SLUG=
SENTRY_CLIENT_ID=
SENTRY_CLIENT_SECRET=

# -----------------------------------------------------------------------------
# Resend (Email — fake for local dev)
# -----------------------------------------------------------------------------
Expand Down
9 changes: 7 additions & 2 deletions .github/prompts/update-roadmap.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,14 @@ The Notion database "Product Roadmap" (data source `collection://7cbe2be9-46f2-4
Regenerate the `ROADMAP_ITEMS` array in `apps/marketing/src/app/roadmap/data.ts`:

- `id`: kebab-case slug of the public title (stable across runs — reuse existing ids where the item is unchanged).
- `title` = `Public title`, `description` = `Public description`, `category` = `Public category`, `status` = mapped lane.
- `title` and `description` are Lingui message descriptors, not plain strings. Write them as
`msg({ id: "marketing.roadmap.item.<camelCaseSlug>.title", message: "Public title" })` and
`msg({ id: "marketing.roadmap.item.<camelCaseSlug>.description", message: "Public description" })`,
where `<camelCaseSlug>` is the item's `id` in camelCase. Message IDs are permanent: when an item's
copy changes, edit the `message` and keep the existing ID. Only a genuinely new item gets a new ID.
- `category` = `Public category`, `status` = mapped lane. Both stay raw union values, not descriptors.
- Order within each lane: keep the existing file's order for unchanged items; append new items at the end of their lane.
- Do not change the types, `CATEGORIES`, `STATUS_LABELS`, or `STATUS_DESCRIPTIONS` unless a `Public category` value doesn't exist in the union — in that case flag it in the PR description instead of editing types.
- Do not change the types, `CATEGORIES`, `CATEGORY_LABELS`, `STATUS_LABELS`, or `STATUS_DESCRIPTIONS` unless a `Public category` value doesn't exist in the union — in that case flag it in the PR description instead of editing types.

## Ship it

Expand Down
7 changes: 7 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,11 @@ jobs:
steps:
- name: Check out code
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
with:
# The i18n audit compares this branch against its merge base to catch
# translations left behind by an English edit; a shallow clone has no
# merge base to find.
fetch-depth: 0

- name: Setup Bun
id: setup-bun
Expand All @@ -115,6 +120,8 @@ jobs:
# Message catalogs must match source (extract) and compile with no
# missing translations (--strict); a dirty diff means someone forgot
# to run `bun run --cwd packages/i18n check` after changing strings.
# The audit also fails on translations left stranded by an English edit,
# which --strict cannot see because nothing is missing.
- name: Audit i18n catalogs
run: bun run --cwd packages/i18n check

Expand Down
43 changes: 43 additions & 0 deletions .github/workflows/deploy-preview.yml
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,14 @@ jobs:
DATABASE_URL: ${{ env.DATABASE_URL }}
DATABASE_URL_UNPOOLED: ${{ env.DATABASE_URL_UNPOOLED }}
BLOB_READ_WRITE_TOKEN: ${{ secrets.BLOB_READ_WRITE_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
R2_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }}
R2_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET_ACCESS_KEY }}
R2_PRIVATE_BUCKET: superset-private-dev
USERCONTENT_URL: ${{ vars.USERCONTENT_URL_DEV }}
MEDIA_URL: ${{ vars.MEDIA_URL_DEV }}
USERCONTENT_TOKEN_SECRET: ${{ secrets.USERCONTENT_TOKEN_SECRET_DEV }}
CLOUDFLARE_BROWSER_RENDERING_TOKEN: ${{ secrets.CLOUDFLARE_BROWSER_RENDERING_TOKEN }}
NEXT_PUBLIC_API_URL: https://${{ env.API_ALIAS }}
NEXT_PUBLIC_WEB_URL: https://${{ env.WEB_ALIAS }}
NEXT_PUBLIC_MARKETING_URL: https://${{ env.MARKETING_ALIAS }}
Expand Down Expand Up @@ -185,6 +193,14 @@ jobs:
--env DATABASE_URL=$DATABASE_URL \
--env DATABASE_URL_UNPOOLED=$DATABASE_URL_UNPOOLED \
--env BLOB_READ_WRITE_TOKEN=$BLOB_READ_WRITE_TOKEN \
--env CLOUDFLARE_ACCOUNT_ID=$CLOUDFLARE_ACCOUNT_ID \
--env R2_ACCESS_KEY_ID=$R2_ACCESS_KEY_ID \
--env R2_SECRET_ACCESS_KEY=$R2_SECRET_ACCESS_KEY \
--env R2_PRIVATE_BUCKET=$R2_PRIVATE_BUCKET \
--env USERCONTENT_URL=$USERCONTENT_URL \
--env MEDIA_URL=$MEDIA_URL \
--env USERCONTENT_TOKEN_SECRET=$USERCONTENT_TOKEN_SECRET \
--env CLOUDFLARE_BROWSER_RENDERING_TOKEN=$CLOUDFLARE_BROWSER_RENDERING_TOKEN \
--env NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL \
--env NEXT_PUBLIC_WEB_URL=$NEXT_PUBLIC_WEB_URL \
--env NEXT_PUBLIC_MARKETING_URL=$NEXT_PUBLIC_MARKETING_URL \
Expand Down Expand Up @@ -307,6 +323,8 @@ jobs:
NEXT_PUBLIC_ADMIN_URL: https://${{ env.ADMIN_ALIAS }}
NEXT_PUBLIC_DOCS_URL: https://${{ env.DOCS_ALIAS }}
NEXT_PUBLIC_RELAY_URL: ${{ secrets.RELAY_URL }}
USERCONTENT_URL: ${{ vars.USERCONTENT_URL_DEV }}
MEDIA_URL: ${{ vars.MEDIA_URL_DEV }}
BETTER_AUTH_SECRET: ${{ secrets.BETTER_AUTH_SECRET }}
NEXT_PUBLIC_COOKIE_DOMAIN: ${{ secrets.NEXT_PUBLIC_COOKIE_DOMAIN }}
NEXT_PUBLIC_POSTHOG_KEY: ${{ secrets.NEXT_PUBLIC_POSTHOG_KEY }}
Expand Down Expand Up @@ -340,6 +358,8 @@ jobs:
--env NEXT_PUBLIC_ADMIN_URL=$NEXT_PUBLIC_ADMIN_URL \
--env NEXT_PUBLIC_DOCS_URL=$NEXT_PUBLIC_DOCS_URL \
--env NEXT_PUBLIC_RELAY_URL=$NEXT_PUBLIC_RELAY_URL \
--env USERCONTENT_URL=$USERCONTENT_URL \
--env MEDIA_URL=$MEDIA_URL \
--env NEXT_PUBLIC_COOKIE_DOMAIN=$NEXT_PUBLIC_COOKIE_DOMAIN \
--env NEXT_PUBLIC_POSTHOG_KEY=$NEXT_PUBLIC_POSTHOG_KEY \
--env NEXT_PUBLIC_POSTHOG_HOST=$NEXT_PUBLIC_POSTHOG_HOST \
Expand All @@ -360,6 +380,10 @@ jobs:
vercel alias $VERCEL_URL ${{ env.WEB_ALIAS }} --scope=$VERCEL_ORG_ID --token=$VERCEL_TOKEN
echo "vercel_url=$VERCEL_URL" >> $GITHUB_OUTPUT

- name: Smoke test web routes
run: |
bun scripts/smoke-routes.ts "https://${{ env.WEB_ALIAS }}" /

- name: Save web success status
run: |
cat > web-status.env << EOF
Expand Down Expand Up @@ -475,6 +499,17 @@ jobs:
vercel alias $VERCEL_URL ${{ env.MARKETING_ALIAS }} --scope=$VERCEL_ORG_ID --token=$VERCEL_TOKEN
echo "vercel_url=$VERCEL_URL" >> $GITHUB_OUTPUT

# Until now the pipeline deployed and never requested a page, so a build
# that returned 500 on every route still went green. MARKETING-67/68/69
# reached production that way.
- name: Smoke test marketing routes
run: |
bun scripts/smoke-routes.ts "https://${{ env.MARKETING_ALIAS }}" --localized \
/ /pricing /enterprise /download /join-us /community /contact \
/blog /changelog /compare /roadmap /leaderboard /marketplace \
/agent-orchestration /parallel-coding-agents /factory-2026 \
/mcp-install /stats /team /starchart /the-production-run

- name: Save marketing success status
run: |
cat > marketing-status.env << EOF
Expand Down Expand Up @@ -594,6 +629,10 @@ jobs:
vercel alias $VERCEL_URL ${{ env.ADMIN_ALIAS }} --scope=$VERCEL_ORG_ID --token=$VERCEL_TOKEN
echo "vercel_url=$VERCEL_URL" >> $GITHUB_OUTPUT

- name: Smoke test admin routes
run: |
bun scripts/smoke-routes.ts "https://${{ env.ADMIN_ALIAS }}" /

- name: Save admin success status
run: |
cat > admin-status.env << EOF
Expand Down Expand Up @@ -678,6 +717,10 @@ jobs:
vercel alias $VERCEL_URL ${{ env.DOCS_ALIAS }} --scope=$VERCEL_ORG_ID --token=$VERCEL_TOKEN
echo "vercel_url=$VERCEL_URL" >> $GITHUB_OUTPUT

- name: Smoke test docs routes
run: |
bun scripts/smoke-routes.ts "https://${{ env.DOCS_ALIAS }}" /

- name: Save docs success status
run: |
cat > docs-status.env << EOF
Expand Down
51 changes: 51 additions & 0 deletions .github/workflows/deploy-production.yml
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,14 @@ jobs:
NEXT_PUBLIC_COOKIE_DOMAIN: ${{ secrets.NEXT_PUBLIC_COOKIE_DOMAIN }}
BETTER_AUTH_SECRET: ${{ secrets.BETTER_AUTH_SECRET }}
BLOB_READ_WRITE_TOKEN: ${{ secrets.BLOB_READ_WRITE_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
R2_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }}
R2_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET_ACCESS_KEY }}
R2_PRIVATE_BUCKET: ${{ vars.R2_PRIVATE_BUCKET }}
USERCONTENT_URL: ${{ vars.USERCONTENT_URL }}
MEDIA_URL: ${{ vars.MEDIA_URL }}
USERCONTENT_TOKEN_SECRET: ${{ secrets.USERCONTENT_TOKEN_SECRET }}
CLOUDFLARE_BROWSER_RENDERING_TOKEN: ${{ secrets.CLOUDFLARE_BROWSER_RENDERING_TOKEN }}
GOOGLE_CLIENT_ID: ${{ secrets.GOOGLE_CLIENT_ID }}
GOOGLE_CLIENT_SECRET: ${{ secrets.GOOGLE_CLIENT_SECRET }}
GOOGLE_PUBSUB_TOPIC: ${{ secrets.GOOGLE_PUBSUB_TOPIC }}
Expand Down Expand Up @@ -148,6 +156,14 @@ jobs:
--env DATABASE_URL=$DATABASE_URL \
--env DATABASE_URL_UNPOOLED=$DATABASE_URL_UNPOOLED \
--env BLOB_READ_WRITE_TOKEN=$BLOB_READ_WRITE_TOKEN \
--env CLOUDFLARE_ACCOUNT_ID=$CLOUDFLARE_ACCOUNT_ID \
--env R2_ACCESS_KEY_ID=$R2_ACCESS_KEY_ID \
--env R2_SECRET_ACCESS_KEY=$R2_SECRET_ACCESS_KEY \
--env R2_PRIVATE_BUCKET=$R2_PRIVATE_BUCKET \
--env USERCONTENT_URL=$USERCONTENT_URL \
--env MEDIA_URL=$MEDIA_URL \
--env USERCONTENT_TOKEN_SECRET=$USERCONTENT_TOKEN_SECRET \
--env CLOUDFLARE_BROWSER_RENDERING_TOKEN=$CLOUDFLARE_BROWSER_RENDERING_TOKEN \
--env NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL \
--env NEXT_PUBLIC_WEB_URL=$NEXT_PUBLIC_WEB_URL \
--env NEXT_PUBLIC_MARKETING_URL=$NEXT_PUBLIC_MARKETING_URL \
Expand Down Expand Up @@ -252,6 +268,8 @@ jobs:
NEXT_PUBLIC_ADMIN_URL: ${{ secrets.NEXT_PUBLIC_ADMIN_URL }}
NEXT_PUBLIC_DOCS_URL: ${{ secrets.NEXT_PUBLIC_DOCS_URL }}
NEXT_PUBLIC_RELAY_URL: ${{ secrets.RELAY_URL }}
USERCONTENT_URL: ${{ vars.USERCONTENT_URL }}
MEDIA_URL: ${{ vars.MEDIA_URL }}
BETTER_AUTH_SECRET: ${{ secrets.BETTER_AUTH_SECRET }}
NEXT_PUBLIC_COOKIE_DOMAIN: ${{ secrets.NEXT_PUBLIC_COOKIE_DOMAIN }}
NEXT_PUBLIC_POSTHOG_KEY: ${{ secrets.NEXT_PUBLIC_POSTHOG_KEY }}
Expand Down Expand Up @@ -285,6 +303,8 @@ jobs:
--env NEXT_PUBLIC_ADMIN_URL=$NEXT_PUBLIC_ADMIN_URL \
--env NEXT_PUBLIC_DOCS_URL=$NEXT_PUBLIC_DOCS_URL \
--env NEXT_PUBLIC_RELAY_URL=$NEXT_PUBLIC_RELAY_URL \
--env USERCONTENT_URL=$USERCONTENT_URL \
--env MEDIA_URL=$MEDIA_URL \
--env NEXT_PUBLIC_COOKIE_DOMAIN=$NEXT_PUBLIC_COOKIE_DOMAIN \
--env NEXT_PUBLIC_POSTHOG_KEY=$NEXT_PUBLIC_POSTHOG_KEY \
--env NEXT_PUBLIC_POSTHOG_HOST=$NEXT_PUBLIC_POSTHOG_HOST \
Expand Down Expand Up @@ -517,6 +537,37 @@ jobs:
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
run: bunx wrangler deploy

deploy-content:
name: Deploy Usercontent Worker to Cloudflare
runs-on: ubuntu-latest
environment: production

steps:
- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1

- name: Setup Bun
id: setup-bun
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0
with:
bun-version-file: .bun-version

- name: Cache dependencies
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: ~/.bun/install/cache
key: ${{ runner.os }}-bun-${{ steps.setup-bun.outputs.bun-revision }}-${{ hashFiles('bun.lock') }}

- name: Install dependencies
run: bun install --frozen --ignore-scripts

- name: Deploy Worker
working-directory: apps/usercontent
env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
run: bunx wrangler deploy

deploy-docs:
name: Deploy Docs to Vercel
runs-on: ubuntu-latest
Expand Down
Loading
Loading