Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
d37d464
get website running on workerd
IMax153 Aug 17, 2026
724f92c
fix: generate worker-safe brand icons
IMax153 Aug 17, 2026
351461d
fix: sync playground TypeScript project metadata
IMax153 Aug 17, 2026
ea3da12
fix: stabilize playground file synchronization
IMax153 Aug 17, 2026
31dfff2
fix: stabilize API reflection build path
IMax153 Aug 17, 2026
42fd2f0
fix: deploy website within worker limits
IMax153 Aug 19, 2026
1c730b5
cleanup opengraph feature
IMax153 Aug 19, 2026
b4e2ed7
migrate deployments to cloudflare
IMax153 Aug 20, 2026
a9c17cf
refactor web feature organization
IMax153 Aug 20, 2026
ac82376
use AtomHttpApi for search
IMax153 Aug 20, 2026
628c5a1
use HttpApi for playground sharing
IMax153 Aug 20, 2026
271493c
refactor OpenGraph metadata plugin
IMax153 Aug 20, 2026
0515e14
fix OpenGraph virtual module loading
IMax153 Aug 20, 2026
ad2b932
pin to latest effect monaco editor
IMax153 Aug 20, 2026
161e7b3
fix OpenGraph metadata build cache
IMax153 Aug 21, 2026
3b68eb5
fix OpenGraph cache mode detection
IMax153 Aug 21, 2026
4614a44
manage Mixedbread previews with Alchemy
IMax153 Aug 21, 2026
71ab1d1
simplify CI checks
IMax153 Aug 21, 2026
a4285ca
simplify CI setup
IMax153 Aug 21, 2026
8770e8c
detect search index changes in Mixedbread CLI
IMax153 Aug 21, 2026
0014be3
share API reference preparation
IMax153 Aug 21, 2026
e57d417
reuse production deployment workflow
IMax153 Aug 21, 2026
dad5c68
move API snapshot lifecycle into Effect CLI
IMax153 Aug 21, 2026
3716811
split API snapshot publishing jobs
IMax153 Aug 21, 2026
58d7d02
validate preview deployment stages
IMax153 Aug 21, 2026
a4ce964
fix Mixedbread ownership metadata
IMax153 Aug 21, 2026
b893df2
stage Cloudflare traffic migration
IMax153 Aug 21, 2026
c5088bc
manage Cloudflare traffic mode
IMax153 Aug 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 49 additions & 47 deletions .github/actions/deploy/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,39 @@ inputs:
website-ref:
description: Website Git revision associated with the deployment
required: true
mxbai-api-key:
description: Mixedbread API key
mxbai-admin-api-key:
description: Mixedbread production synchronization API key
required: true
mxbai-search-api-key:
description: Mixedbread read-only Worker search API key
required: true
mxbai-vector-store-id:
description: Mixedbread vector store ID
required: true
vercel-org-id:
description: Vercel organization ID
cloudflare-account-id:
description: Cloudflare account ID
required: true
cloudflare-api-token:
description: Cloudflare API token
required: true
vercel-project-id:
description: Vercel project ID
cloudflare-traffic-mode:
description: Cloudflare production traffic mode
required: false
default: workers-dev
kv-rest-api-url:
description: Upstash REST API URL
required: true
vercel-token:
description: Vercel authentication token
kv-rest-api-token:
description: Upstash REST API token
required: true
public-posthog-key:
description: Public PostHog project key
required: false
default: ""
public-posthog-api-host:
description: Public PostHog API host
required: false
default: https://us.i.posthog.com

runs:
using: composite
Expand All @@ -41,21 +59,9 @@ runs:
GH_TOKEN: ${{ github.token }}
REQUESTED_SNAPSHOT: ${{ inputs.api-reference-snapshot }}
run: |
snapshot="$REQUESTED_SNAPSHOT"
if [[ -z "$snapshot" ]]; then
snapshot=$(gh api "repos/${GITHUB_REPOSITORY}/releases?per_page=100" --jq '[.[] | select(.draft == false and .prerelease == false and (.tag_name | startswith("api-reference-")))] | sort_by(.published_at) | last | (.tag_name // "")')
fi

if [[ ! "$snapshot" =~ ^api-reference-[a-f0-9]{64}$ ]]; then
echo "::error::No valid published API reference snapshot is available. Publish one with the API reference workflow before deploying."
exit 1
fi

release=$(gh release view "$snapshot" --json isDraft,isPrerelease)
if [[ "$(jq -r '.isDraft or .isPrerelease' <<<"$release")" == "true" ]]; then
echo "::error::API reference snapshot must be a published, non-prerelease release: $snapshot"
exit 1
fi
snapshot=$(vp exec api-reference snapshot resolve \
--repository "$GITHUB_REPOSITORY" \
--tag "$REQUESTED_SNAPSHOT")
echo "tag=$snapshot" >> "$GITHUB_OUTPUT"

- name: Restore API reference snapshot
Expand Down Expand Up @@ -90,38 +96,34 @@ runs:
exit 1
fi

- name: Pull Vercel Environment Information
shell: bash
run: pnpm exec vercel pull --cwd apps/web --yes --environment=production --token="${{ inputs.vercel-token }}" --scope=effect-ts
env:
VERCEL_ORG_ID: ${{ inputs.vercel-org-id }}
VERCEL_PROJECT_ID: ${{ inputs.vercel-project-id }}

- name: Build Project Artifacts
- name: Deploy website to Cloudflare
shell: bash
run: pnpm exec vercel build --cwd apps/web --prod --token="${{ inputs.vercel-token }}"
run: vp exec alchemy deploy --stage prod --yes
env:
VERCEL_ORG_ID: ${{ inputs.vercel-org-id }}
VERCEL_PROJECT_ID: ${{ inputs.vercel-project-id }}
CLOUDFLARE_API_TOKEN: ${{ inputs.cloudflare-api-token }}
CLOUDFLARE_ACCOUNT_ID: ${{ inputs.cloudflare-account-id }}
CLOUDFLARE_TRAFFIC_MODE: ${{ inputs.cloudflare-traffic-mode }}
MXBAI_API_KEY: ${{ inputs.mxbai-search-api-key }}
MXBAI_VECTOR_STORE_ID: ${{ inputs.mxbai-vector-store-id }}
KV_REST_API_URL: ${{ inputs.kv-rest-api-url }}
KV_REST_API_TOKEN: ${{ inputs.kv-rest-api-token }}
PUBLIC_POSTHOG_KEY: ${{ inputs.public-posthog-key }}
PUBLIC_POSTHOG_API_HOST: ${{ inputs.public-posthog-api-host }}
GITHUB_TOKEN: ${{ github.token }}
GITHUB_SHA: ${{ inputs.website-ref }}

- name: Verify generated API reference links
shell: bash
run: node apps/web/scripts/verify-api-reference-links.mjs

- name: Patch trailing-slash redirect into build output
shell: bash
run: node apps/web/scripts/patch-vercel-trailing-slash.mjs

- name: Deploy Project Artifacts to Vercel
shell: bash
run: pnpm exec vercel deploy apps/web --prebuilt --archive=tgz --prod --token="${{ inputs.vercel-token }}" --scope=effect-ts
env:
VERCEL_ORG_ID: ${{ inputs.vercel-org-id }}
VERCEL_PROJECT_ID: ${{ inputs.vercel-project-id }}
run: |
if [[ -d apps/web/dist/client/docs ]]; then
node apps/web/scripts/verify-api-reference-links.mjs apps/web/dist/client
else
echo "Alchemy reused the unchanged deployment; no local build output to verify."
fi

- name: Synchronize Mixedbread production store
shell: bash
run: vp exec mixedbread sync --scope "${{ inputs.mixedbread-scope }}" --sha "${{ inputs.website-ref }}"
env:
MXBAI_API_KEY: ${{ inputs.mxbai-api-key }}
MXBAI_ADMIN_API_KEY: ${{ inputs.mxbai-admin-api-key }}
MXBAI_VECTOR_STORE_ID: ${{ inputs.mxbai-vector-store-id }}
52 changes: 52 additions & 0 deletions .github/actions/prepare-api-reference/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
name: Prepare API reference
description: Check out Effect v3 and v4 and generate their API reference data.

inputs:
cache:
description: Restore and save generated API reference data
required: false
default: "false"
v3-revision:
description: Effect v3 Git revision
required: false
default: v3
v4-revision:
description: Effect v4 Git revision
required: false
default: main

runs:
using: composite
steps:
- name: Checkout Effect v3
id: checkout-v3
uses: actions/checkout@v6
with:
repository: Effect-TS/effect
ref: ${{ inputs.v3-revision }}
path: .effect-source-v3
fetch-depth: 1

- name: Checkout Effect v4
id: checkout-v4
uses: actions/checkout@v6
with:
repository: Effect-TS/effect
ref: ${{ inputs.v4-revision }}
path: .effect-source-v4
fetch-depth: 1

- name: Restore API reference cache
if: inputs.cache == 'true'
id: cache
uses: actions/cache@v5
with:
path: apps/web/.data/api-reference
key: api-reference-v2-${{ runner.os }}-v3-${{ steps.checkout-v3.outputs.commit }}-v4-${{ steps.checkout-v4.outputs.commit }}-${{ hashFiles('packages/api-reference/src/Generate.ts', 'packages/api-reference/package.json', 'packages/domain/src/ApiReference.ts', 'pnpm-lock.yaml') }}

- name: Generate API reference
if: inputs.cache != 'true' || steps.cache.outputs.cache-hit != 'true'
shell: bash
run: |
vp run api-reference:generate --version v3 --repo .effect-source-v3
vp run api-reference:generate --version v4 --repo .effect-source-v4
19 changes: 1 addition & 18 deletions .github/actions/setup/action.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,5 @@
name: Setup
description: Perform standard setup and install dependencies using pnpm.
inputs:
deno-version:
description: The version of Deno to install
required: false
bun-version:
description: The version of Bun to install
required: false

runs:
using: composite
Expand All @@ -22,16 +15,6 @@ runs:
uses: voidzero-dev/setup-vp@v1.17.0
with:
node-manager: false
- name: Install deno
uses: denoland/setup-deno@v2
if: ${{ inputs.deno-version != '' }}
with:
deno-version: ${{ inputs.deno-version }}
- name: Install bun
uses: oven-sh/setup-bun@v2
if: ${{ inputs.bun-version != '' }}
with:
bun-version: ${{ inputs.bun-version }}
- name: Install dependencies
shell: bash
run: pnpm install
run: pnpm install --frozen-lockfile
24 changes: 6 additions & 18 deletions .github/workflows/check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ concurrency:
permissions: {}

jobs:
lint:
name: Lint
check:
name: Check
runs-on: ubuntu-latest
permissions:
contents: read
Expand All @@ -24,22 +24,10 @@ jobs:
- uses: actions/checkout@v6
- name: Install dependencies
uses: ./.github/actions/setup
- run: vp run lint

format:
name: Format
runs-on: ubuntu-latest
permissions:
contents: read
timeout-minutes: 10
steps:
- uses: actions/checkout@v6
- name: Install dependencies
uses: ./.github/actions/setup
- run: vp run fmt
- run: vp run check

types:
name: Types
test:
name: Test
runs-on: ubuntu-latest
permissions:
contents: read
Expand All @@ -48,4 +36,4 @@ jobs:
- uses: actions/checkout@v6
- name: Install dependencies
uses: ./.github/actions/setup
- run: vp run check
- run: vp test
69 changes: 69 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
name: Deploy

on:
workflow_call:
inputs:
website-ref:
description: Website Git revision to deploy
required: true
type: string
api-reference-snapshot:
description: Exact API reference snapshot tag; latest published snapshot when omitted
required: false
default: ""
type: string
mixedbread-scope:
description: Mixedbread content scope to synchronize
required: false
default: markdown
type: string
cloudflare-traffic-mode:
description: Cloudflare production traffic mode
required: false
default: workers-dev
type: string
secrets:
MXBAI_ADMIN_API_KEY:
required: true
MXBAI_SEARCH_API_KEY:
required: true
MXBAI_VECTOR_STORE_ID:
required: true
CLOUDFLARE_ACCOUNT_ID:
required: true
CLOUDFLARE_API_TOKEN:
required: true
KV_REST_API_URL:
required: true
KV_REST_API_TOKEN:
required: true

permissions:
contents: read

jobs:
deploy:
runs-on: ubuntu-latest
concurrency:
group: production
cancel-in-progress: false
steps:
- uses: actions/checkout@v6
with:
ref: ${{ inputs.website-ref }}

- uses: ./.github/actions/deploy
with:
website-ref: ${{ inputs.website-ref }}
api-reference-snapshot: ${{ inputs.api-reference-snapshot }}
mixedbread-scope: ${{ inputs.mixedbread-scope }}
mxbai-admin-api-key: ${{ secrets.MXBAI_ADMIN_API_KEY }}
mxbai-search-api-key: ${{ secrets.MXBAI_SEARCH_API_KEY }}
mxbai-vector-store-id: ${{ secrets.MXBAI_VECTOR_STORE_ID }}
cloudflare-account-id: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
cloudflare-api-token: ${{ secrets.CLOUDFLARE_API_TOKEN }}
cloudflare-traffic-mode: ${{ inputs.cloudflare-traffic-mode }}
kv-rest-api-url: ${{ secrets.KV_REST_API_URL }}
kv-rest-api-token: ${{ secrets.KV_REST_API_TOKEN }}
public-posthog-key: ${{ vars.PUBLIC_POSTHOG_KEY }}
public-posthog-api-host: ${{ vars.PUBLIC_POSTHOG_API_HOST }}
Loading
Loading