From 6290c6e2c36d5a2b5f435cd1f134ea1f2255b82e Mon Sep 17 00:00:00 2001 From: Atharva Deosthale Date: Wed, 27 May 2026 22:44:39 +0530 Subject: [PATCH 1/8] Add Git deployment triggers docs --- .optimize-cache.json | 1 + .../+page.markdoc | 85 ++++++++++++++++++ .../changelog/(entries)/2026-05-27.markdoc | 27 ++++++ .../functions/deploy-from-git/+page.markdoc | 24 ++++- .../sites/deploy-from-git/+page.markdoc | 24 ++++- .../build-triggers.avif | Bin 0 -> 37095 bytes 6 files changed, 159 insertions(+), 2 deletions(-) create mode 100644 src/routes/blog/post/announcing-git-deployment-triggers/+page.markdoc create mode 100644 src/routes/changelog/(entries)/2026-05-27.markdoc create mode 100644 static/images/blog/announcing-git-deployment-triggers/build-triggers.avif diff --git a/.optimize-cache.json b/.optimize-cache.json index 590ed467f67..7bd2aeac925 100644 --- a/.optimize-cache.json +++ b/.optimize-cache.json @@ -221,6 +221,7 @@ "static/images/blog/announcing-deployment-retention/cover.png": "e6c59f73d83c1b88aed82a8974df97de83ab653241a5717f20b407809fa46ba9", "static/images/blog/announcing-email-policies/cover.png": "3b62c98a38e16bbf4446624035e89e4ee2aba0af636c9ff32a0d2d5ab56d4e2c", "static/images/blog/announcing-encrypted-string-attributes/cover.png": "f3d1d0a022771392019c760c6dcf88fc231a7f96d19e2eb61d89b3605e818463", + "static/images/blog/announcing-git-deployment-triggers/build-triggers.png": "c388a45677ff90b0ff5a651ea6182094a23ae139b4ba068585387dd8b6975779", "static/images/blog/announcing-image-transformations-pricing/cover.png": "dfdd070a46b5f8c66d7b4781cc3dc61faa10c80307882e206be0ff7d46ca77db", "static/images/blog/announcing-image-transformations-pricing/usage-component.png": "e24a8b710ea5de5ee2fe7c2c4507f54dccb3530a602027fc7a4265d5fc7b6eca", "static/images/blog/announcing-init-faster-smoother-better/init-cover.png": "bdb97596d618cfe366d946c49d7791e9bb37062b2033fa7ee6d21329ced5e58a", diff --git a/src/routes/blog/post/announcing-git-deployment-triggers/+page.markdoc b/src/routes/blog/post/announcing-git-deployment-triggers/+page.markdoc new file mode 100644 index 00000000000..527747a1597 --- /dev/null +++ b/src/routes/blog/post/announcing-git-deployment-triggers/+page.markdoc @@ -0,0 +1,85 @@ +--- +layout: post +title: "Announcing Git deployment triggers for Appwrite Functions and Sites" +description: Git deployment triggers let you control which branches and file changes create automatic deployments for Appwrite Functions and Sites. +date: 2026-05-27 +cover: /images/blog/announcing-git-deployment-triggers/cover.avif +timeToRead: 4 +author: matej-baco +category: announcement +featured: false +callToAction: true +faqs: + - question: "What are Git deployment triggers in Appwrite?" + answer: "Git deployment triggers let you control which branch pushes and file changes create automatic deployments for Appwrite Functions and Sites." + - question: "Are Git deployment triggers only for preview deployments?" + answer: "No. Git deployment triggers apply to automatic Git deployments for Functions and Sites. They can be used for production branches, staging branches, preview branches, and monorepo workflows." + - question: "What do branch filters do?" + answer: "Branch filters match Git branch names. Add patterns like `main`, `staging`, or `preview/**` to create deployments only from matching branches." + - question: "What do path filters do?" + answer: "Path filters match files changed in a commit or pull request. Leave the field empty to create deployments for all file changes, or add patterns like `apps/web/**` or `functions/api/**` to deploy only when matching files change." + - question: "Can I exclude branches or paths?" + answer: "Yes. Prefix a pattern with `!` to exclude matching branches or paths, such as `!docs/**` for documentation-only changes." +--- + +Git-based deployments make it easy to connect a repository and let Appwrite build from your pushes. That works well for small projects, but many teams quickly move into workflows with staging branches, preview branches, shared packages, and monorepos where a single repository powers several Functions and Sites. + +In those setups, not every Git change should create every deployment. A docs-only change should not rebuild a production Site. A backend package change may need to rebuild an API Function, but not a marketing page. A team might want previews from the `preview/**` branch pattern, while keeping release deploys limited to `main`. + +Today, we are announcing **Git deployment triggers for Appwrite Functions and Sites**. + +Git deployment triggers let you control which branches and file changes create automatic deployments. + +# What Git deployment triggers give you + +- **Control over automatic deployments:** Choose the branch pushes and file changes that should start a build. +- **Cleaner preview workflows:** Create deployments from the branches your team uses for previews, staging, testing, or release candidates. +- **Better monorepo support:** Deploy a Function or Site only when files in the relevant folders change. +- **Simple glob patterns:** Use familiar patterns like `main`, `preview/**`, `apps/web/**`, and `!docs/**`. +- **Support for Functions and Sites:** Configure the same behavior across both Appwrite compute products. + +# Branch filters + +**Branch filters** match branch names. Add patterns to limit automatic deployments to specific branches. + +```text +main +staging +preview/** +``` + +With these filters, Appwrite creates automatic deployments for pushes to `main`, pushes to `staging`, and pushes to branches nested under `preview/`, such as `preview/new-checkout`. + +Branch filters work alongside your production branch setting. The production branch still controls which deployment becomes active for the Function or Site. Matching non-production branches can still create deployments for preview and testing workflows. + +# Path filters + +**Path filters** match files changed in a commit or pull request. Leave this field empty to create deployments for all file changes, or add patterns to deploy only when specific files change. + +```text +apps/web/** +packages/ui/** +!docs/** +``` + +With these filters, Appwrite creates a deployment when changes touch files under `apps/web/` or `packages/ui/`. The `!docs/**` pattern excludes documentation changes, so updating files under `docs/` does not start a deployment for that Site. + +Path filters are especially useful in monorepos. If one repository contains a web app, background Functions, shared packages, and docs, each Appwrite resource can listen only to the files it actually needs. + +# How to configure build triggers + +In the Appwrite Console, open the Function or Site you want to configure, then go to its Git settings and update **Build triggers**. + +![Build triggers settings in the Appwrite Console](/images/blog/announcing-git-deployment-triggers/build-triggers.avif) + +- **Sites:** Go to **Sites** > your site > **Settings** > **Git repository**. +- **Functions:** Go to **Functions** > your function > **Settings** > **Configuration** > **Git settings**. + +You can also configure the same behavior through the API and Server SDKs using `providerBranches` for branch filters and `providerPaths` for path filters. + +# Get started with Git deployment triggers + +Git deployment triggers help keep automatic deployments aligned with how your team ships. They reduce unnecessary builds, make monorepos easier to manage, and give each Function or Site a clearer connection to the branches and files that matter. + +- [Configure build triggers for Sites](/docs/products/sites/deploy-from-git#build-triggers) +- [Configure build triggers for Functions](/docs/products/functions/deploy-from-git#build-triggers) diff --git a/src/routes/changelog/(entries)/2026-05-27.markdoc b/src/routes/changelog/(entries)/2026-05-27.markdoc new file mode 100644 index 00000000000..9d8b20bc716 --- /dev/null +++ b/src/routes/changelog/(entries)/2026-05-27.markdoc @@ -0,0 +1,27 @@ +--- +layout: changelog +title: "Control automatic Git deployments with build triggers" +date: 2026-05-27 +cover: /images/blog/announcing-git-deployment-triggers/cover.avif +--- + +Appwrite now supports **Git deployment triggers** for Functions and Sites. Use **branch filters** and **path filters** to control which Git pushes and pull requests create automatic deployments. + +- **Branch filters** match branch names, such as `main`, `staging`, or `preview/**`. +- **Path filters** match changed files, such as `apps/web/**`, `functions/api/**`, or `packages/shared/**`. + +You can prefix a pattern with `!` to exclude matching branches or paths. + +This is especially useful for monorepos, staging branches, preview workflows, and projects where a change to one folder should not rebuild every connected Function or Site. + +{% arrow_link href="/blog/post/announcing-git-deployment-triggers" %} +Read the announcement +{% /arrow_link %} + +{% arrow_link href="/docs/products/sites/deploy-from-git#build-triggers" %} +Build triggers for Sites +{% /arrow_link %} + +{% arrow_link href="/docs/products/functions/deploy-from-git#build-triggers" %} +Build triggers for Functions +{% /arrow_link %} diff --git a/src/routes/docs/products/functions/deploy-from-git/+page.markdoc b/src/routes/docs/products/functions/deploy-from-git/+page.markdoc index 80d91e27874..b1d8ac03ba3 100644 --- a/src/routes/docs/products/functions/deploy-from-git/+page.markdoc +++ b/src/routes/docs/products/functions/deploy-from-git/+page.markdoc @@ -38,6 +38,28 @@ This means, the new deployment will not handle any incoming requests until it is If you need to update your Git configuration, navigate to **Functions** > your function > **Settings** > **Configuration** > **Git settings**. +## Build triggers {% #build-triggers %} + +Build triggers control which Git changes create automatic deployments. You can configure branch filters and path filters with glob patterns. + +**Branch filters** match branch names. Add patterns to limit automatic deployments to specific branches. + +```txt +main +staging +preview/** +``` + +**Path filters** match files changed in a commit or pull request. Leave this field empty to create deployments for all file changes, or add patterns to deploy only when specific files change. + +```txt +functions/api/** +packages/shared/** +!docs/** +``` + +Use `!` before a pattern to exclude matching branches or paths. + ## Entry point {% #entry-point %} The entry point is the code file contains the exported function that will be executed when the function is called. This entry point has a specific format that must be followed. You can find examples using a [starter template](/docs/products/functions/templates) @@ -66,4 +88,4 @@ These commands will be ran before the function is built and can be used to insta - If you're missing some code files at build time, make sure they are included in the Git configuration's **Root directory**. Only files in the root directory folder will be copied to the executor. -- If you're self-hosting Appwrite, you will need to configure some [environment variables](/docs/advanced/self-hosting/functions) to enable Git deployments. \ No newline at end of file +- If you're self-hosting Appwrite, you will need to configure some [environment variables](/docs/advanced/self-hosting/functions) to enable Git deployments. diff --git a/src/routes/docs/products/sites/deploy-from-git/+page.markdoc b/src/routes/docs/products/sites/deploy-from-git/+page.markdoc index 1924312dcab..20cbf81f48f 100644 --- a/src/routes/docs/products/sites/deploy-from-git/+page.markdoc +++ b/src/routes/docs/products/sites/deploy-from-git/+page.markdoc @@ -38,6 +38,28 @@ When you push a commit to a branch other than the production branch, a new deplo If you need to update your Git configuration, navigate to **Sites** > your site > **Settings** > **Git repository**. +## Build triggers {% #build-triggers %} + +Build triggers control which Git changes create automatic deployments. You can configure branch filters and path filters with glob patterns. + +**Branch filters** match branch names. Add patterns to limit automatic deployments to specific branches. + +```txt +main +staging +preview/** +``` + +**Path filters** match files changed in a commit or pull request. Leave this field empty to create deployments for all file changes, or add patterns to deploy only when specific files change. + +```txt +apps/web/** +packages/ui/** +!docs/** +``` + +Use `!` before a pattern to exclude matching branches or paths. + ## Install command The install command of your site allow you to install your site’s dependencies. You can specify custom install scripts such as ones that let you configure your `npm` command with options or use an alternative package manager such as `pnpm` or `yarn`. @@ -54,4 +76,4 @@ The output directory will contain the files generated by your site's build comma - If you updated your site's configuration but the deployment is not working as expected, you may need to first redeploy your site before the changes take effect. - If you're missing some code files at build time, verify your **build command** and ensure that the build output is included in the Git configuration's **output directory**. Only files in the output directory folder will be available after deployment. -- If you're self-hosting Appwrite, you will need to configure some [environment variables](https://appwrite.io/docs/advanced/self-hosting/functions) to enable Git deployments. \ No newline at end of file +- If you're self-hosting Appwrite, you will need to configure some [environment variables](https://appwrite.io/docs/advanced/self-hosting/functions) to enable Git deployments. diff --git a/static/images/blog/announcing-git-deployment-triggers/build-triggers.avif b/static/images/blog/announcing-git-deployment-triggers/build-triggers.avif new file mode 100644 index 0000000000000000000000000000000000000000..e09f9138558dca3804d59e172b7d0e632b55d47c GIT binary patch literal 37095 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 literal 0 HcmV?d00001 From ca30439201ead0b7ba2188b810639cca58f07ef2 Mon Sep 17 00:00:00 2001 From: harsh mahajan Date: Thu, 28 May 2026 10:57:22 +0530 Subject: [PATCH 2/8] added author profile for harsh --- .../blog/author/harsh-mahajan/+page.markdoc | 11 +++++++++++ static/images/avatars/harsh.avif | Bin 0 -> 11400 bytes 2 files changed, 11 insertions(+) create mode 100644 src/routes/blog/author/harsh-mahajan/+page.markdoc create mode 100644 static/images/avatars/harsh.avif diff --git a/src/routes/blog/author/harsh-mahajan/+page.markdoc b/src/routes/blog/author/harsh-mahajan/+page.markdoc new file mode 100644 index 00000000000..06e67d5c654 --- /dev/null +++ b/src/routes/blog/author/harsh-mahajan/+page.markdoc @@ -0,0 +1,11 @@ +--- +layout: author +slug: harsh-mahajan +name: Harsh Mahajan +role: Product Engineer +bio: I build things on the internet and pretend bugs are edge cases. +avatar: /images/avatars/harsh.avif +twitter: https://x.com/BlackX75676455 +github: https://github.com/HarshMN2345 +linkedin: https://www.linkedin.com/in/mahajan-harsh +--- diff --git a/static/images/avatars/harsh.avif b/static/images/avatars/harsh.avif new file mode 100644 index 0000000000000000000000000000000000000000..0e3e15807f2eaddca8f4878668baf88e739a6253 GIT binary patch literal 11400 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 Date: Thu, 28 May 2026 13:52:20 +0530 Subject: [PATCH 3/8] Update Git deployment triggers examples --- .../+page.markdoc | 26 ++++++++----------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/src/routes/blog/post/announcing-git-deployment-triggers/+page.markdoc b/src/routes/blog/post/announcing-git-deployment-triggers/+page.markdoc index 527747a1597..b07f1afc850 100644 --- a/src/routes/blog/post/announcing-git-deployment-triggers/+page.markdoc +++ b/src/routes/blog/post/announcing-git-deployment-triggers/+page.markdoc @@ -5,7 +5,7 @@ description: Git deployment triggers let you control which branches and file cha date: 2026-05-27 cover: /images/blog/announcing-git-deployment-triggers/cover.avif timeToRead: 4 -author: matej-baco +author: harsh-mahajan category: announcement featured: false callToAction: true @@ -42,13 +42,11 @@ Git deployment triggers let you control which branches and file changes create a **Branch filters** match branch names. Add patterns to limit automatic deployments to specific branches. -```text -main -staging -preview/** -``` - -With these filters, Appwrite creates automatic deployments for pushes to `main`, pushes to `staging`, and pushes to branches nested under `preview/`, such as `preview/new-checkout`. +| Pattern | Matches | Example use | +| --- | --- | --- | +| `main` | The `main` branch | Deploy from your production branch | +| `staging` | The `staging` branch | Deploy from a staging branch | +| `preview/**` | Branches nested under `preview/` | Deploy from branches like `preview/new-checkout` | Branch filters work alongside your production branch setting. The production branch still controls which deployment becomes active for the Function or Site. Matching non-production branches can still create deployments for preview and testing workflows. @@ -56,13 +54,11 @@ Branch filters work alongside your production branch setting. The production bra **Path filters** match files changed in a commit or pull request. Leave this field empty to create deployments for all file changes, or add patterns to deploy only when specific files change. -```text -apps/web/** -packages/ui/** -!docs/** -``` - -With these filters, Appwrite creates a deployment when changes touch files under `apps/web/` or `packages/ui/`. The `!docs/**` pattern excludes documentation changes, so updating files under `docs/` does not start a deployment for that Site. +| Pattern | Matches | Example use | +| --- | --- | --- | +| `apps/web/**` | Files nested under `apps/web/` | Deploy a Site when its app files change | +| `packages/ui/**` | Files nested under `packages/ui/` | Deploy when shared UI components change | +| `!docs/**` | Excludes files nested under `docs/` | Skip docs-only changes | Path filters are especially useful in monorepos. If one repository contains a web app, background Functions, shared packages, and docs, each Appwrite resource can listen only to the files it actually needs. From a2ea784b17cdf3049663ea4c882d2228087ee076 Mon Sep 17 00:00:00 2001 From: Atharva Deosthale Date: Thu, 28 May 2026 13:57:05 +0530 Subject: [PATCH 4/8] Add Git deployment triggers cover --- .optimize-cache.json | 1 + .../cover.avif | Bin 0 -> 9499 bytes 2 files changed, 1 insertion(+) create mode 100644 static/images/blog/announcing-git-deployment-triggers/cover.avif diff --git a/.optimize-cache.json b/.optimize-cache.json index 539054453f4..a45cd389068 100644 --- a/.optimize-cache.json +++ b/.optimize-cache.json @@ -222,6 +222,7 @@ "static/images/blog/announcing-email-policies/cover.png": "3b62c98a38e16bbf4446624035e89e4ee2aba0af636c9ff32a0d2d5ab56d4e2c", "static/images/blog/announcing-encrypted-string-attributes/cover.png": "f3d1d0a022771392019c760c6dcf88fc231a7f96d19e2eb61d89b3605e818463", "static/images/blog/announcing-git-deployment-triggers/build-triggers.png": "c388a45677ff90b0ff5a651ea6182094a23ae139b4ba068585387dd8b6975779", + "static/images/blog/announcing-git-deployment-triggers/cover.png": "1de5b1715230da3858017c845decdf24f1d30270d851e0412a5b1bbd43fb8009", "static/images/blog/announcing-image-transformations-pricing/cover.png": "dfdd070a46b5f8c66d7b4781cc3dc61faa10c80307882e206be0ff7d46ca77db", "static/images/blog/announcing-image-transformations-pricing/usage-component.png": "e24a8b710ea5de5ee2fe7c2c4507f54dccb3530a602027fc7a4265d5fc7b6eca", "static/images/blog/announcing-init-faster-smoother-better/init-cover.png": "bdb97596d618cfe366d946c49d7791e9bb37062b2033fa7ee6d21329ced5e58a", diff --git a/static/images/blog/announcing-git-deployment-triggers/cover.avif b/static/images/blog/announcing-git-deployment-triggers/cover.avif new file mode 100644 index 0000000000000000000000000000000000000000..9a54b559d766a3376bdcf59c62768536526f343f GIT binary patch literal 9499 zcmYLv1yEc|6Yj#|?(S|0uE9Mx1cwkD7I$}d3GVJLi@OGA@!%35xCaaHxc9#Qy{?*; zuluW+o~oHsb!q?r0ExMar-P9j$QRoezZ0t?`i6lh<(13ps095jS7670Ey<_h}{qjEqitIh) z1A*-RUBrAO{oscZ*`=#x4;^`!5#< zikH z0Yn2IK7>_sz2=52E7z^!Vw(+YEm3{W8F>tI{X4Qcb-U7FACWNQpN)IBPX=F>Og(KuT4w*~{Zoypi#$llMa<8M^E z`h2t5<>^Hd7Ez}~TRqCLIIhBA3M4RIkavON4pD_mJH0L&uUleNYF6;HQLn9FuejS< zL@xk!D84>ruD{#~A9yk|x@Uvu5gYS~96%&j64mCZG5Pee+(7WL@S{=Ce(axS507wd z3<7+0Oo3e_?u~FueFqVfM?uJMH4Xx5$m2q-VnS`ausIpzYSLNjnsS5ctX$}^EykDl z{0u&n>!bBoBIlJHrL@Qt77?PPcG@5H(T9cQ2>1pA+NzLwSSr^v2n4t~l!o;k=1j6C z@cBvJIA!S`=qkKPp6=gddV!|Xipr7co@>r9LLfc5J8o>yxK$YS)d-sUr!_2MC95tv zr)d+}$eg zlOc*C^-4uh41N1`ATd^y9_IESsX&b$5(Pe5p`#;*7d+KHyo~_kO)3ndBOMh z(e+lUH)OKGZK z&6nmxYJjtG(PqrjoJVQR%1?oXY8_*cje^vB6ZbO>?~gk=Eem8ysEf}Mm8zjJ{;G}D zyXKE*eLD4~LJm4(I1VQo#m8SuekpAA|B&TpTeL#nd%jM0N{5A*$YbpP>{8qBbhQ7V zuLdQK*2(cQfnVN53>FuUYi1!n_t=U*4r0by8t#C5o@})jvHfY>DS(kQ&NrP;^}M}@ z_uYsGJV4bP9@~Jmm+I&G=hspO*ALm9GADu`mUI5R&gspEq$cry_2%7ng}8=)$?$r; zmdC#c`sMRX}Fb85cU3~a}N__zk0238YCmMBdNRyZ5ngsgr~Iq z?ZN2Y9OShVof@Z8VI64nD@g#o&k5UEa6Z1#KZ`vuj&hlq6!i3iR9M5ZcV4ALq;qj7 zegRYThgS`Rm#XAJ=-?DQ<88Rvl1Nit@}%TH%~+c}7k$iS>Ic@O=A*`Xd7(49e;oTL zbv0Az3YuVGor394y7FsyqzySXZ(2xcH}n`n&P66BahRru!P9uLK2Hxg+tII;ZR>@e zW-rVgQV-0=CRcj+1$gl)`dO5G8GtH0&9Bz?c*1-LJj#=n^RAP?q$IcZ zI`iMGjLtJViR2q<{s^mjt3~PV_JxM`X`7xb46^L}TQkkVUvYd>YTdMLYpL*BLNPy# z2>Z5r_S3K9i5!G#i7~ePL&`R(w=n8{L%L;Rj?{@{|9b8y&mdpAy4~Av%K}9TR|#`i zyDK}jPxkS&E#KEIAdfa?y$I80hGL{;Td(6qT`)N%Py1ZZyT+v%*Z{@1_4r>DKjH7L zW)Jq2??D05PRGLyO`jpJW>&`B^5~~dHmGoT%*Ggl^{BOC2Okd}3{MN>G|+6)>HzNN zHd2}$%e%_ue^Y>YGhsi#@>HmvK_A~tw)>;#e>EP?Wv==^y7+ViR`|KcQc|B7h@zI^ z7v;+YBu7-xUyEre-UfFM6_ZYM_P#Q0)5mY|d3i_eY%0-?ww4O%^1l*WO+_d6Ox<0# zpu<10t$5{Fk3`qN#FH<LV)ey;&@!v(cBS$Hc5lhRAXfes3sGGZ}hT z;+u-Kgvj$1?@i{DV49v-xC^|CaJRL<(~+jF9gOSoSzXA;z4F9sr{+YnpMeJT^G{oy zK726=VHudsq6!o!qz&6=ft)<|kSY-u!UCYbRxGM+NKR$})~^X@BqGXeBhlR3V_H`C zZ{5fxbE+fLF|(w1ZEg7qLy>LdV|;aaKSzYISK{_n=Jj`dxJM64C7R+yaZji=r=dr`LY+rhV?cKKpYrS+DfmnDj_QCG3a18?xl7zT? z^dy4PBYZBB;huzO#`dVEbW!dvLkq$YQedSqy0CgZ3i-G=SyxY4QBu-IrIm%+&_c<+ zti1D>sFC$+jn3xO`jYgD#)`66t}ir0QDk?kS_N8@c}dB9?nKJo(l0pKqr-$l8)a!d zj+Wj;TKK1L8ZBhjc|41@rJsD6>M2=E*=pTOQ7L6k)7N0Wrwt@&ii8!#CTpxY%=mvR zlEfMa6s?x+7CdblC40m?_QIpMLetz>x$4? z)f6gWDP;FMfotrs!UXug6s6UYNwS(uiH|&RV3s-gClb*j=%m*UqKVPU`hGs(E8~!2 z+%#^#Hb%p3_s=Xc=NXSC31bL<`+ORky+}CtE%)3C2h;Z?$_ zfAbLEw}^)4%FBvF$zh-BB3aK;|dd8<9uuELU_ zXeBG{`x{a5(y#oL+3M|32(3RU>I3!q?b&y=~&NnrI z$%q0YWA7pmaVCd`gp)aGYw=dxA!@eV^yql3x%ah4oI7`7UkJMfdX_;v<(a%6#}C1W zv)Jh}aH2rNMlw@(seddXN%nUJ#WmdKX@_W=?9mNf6}`6O$z@VXr|}_gH+18Vqkd-j zhD3%M5~kq&HLF?!$NeGMbT)L%fU7$}pMm6; z;qtw=H1J&A;GR1M71>lt0FymBV^EDIT+K1vW16QNBPVBxje4P-8v&Wv{jNf4O@J1~YFa*4us}wYK(zIf2u=1+<1@qh{w}iDL11Iu#er~gzDMm;y%niy5`EqlHIid7iBv! zn1KO@O$gOAZo)=2qK_BibA{}$y;x?IOPi9FiHxUE&}yXA$(#PI^v`8r8Sc{N!nzprD*o>erGM8beR7IuXTh6A}@Hy8po`C5kJ zT{>u9_Kn=PrdFP_Y1pa)PbYwcS%?Z4t#tl6pso91w(_<166sDk{Uxv1{QgKhcLjm2 z+G8dQW$B#;bLG?EO|#-QAft$h4;eX7YAt5|Q7kuqw`Z3#;_bydVk)G1&*+ZiF>iGH z7k&XF=gBD=Q^3L>#g*_fl5b0tpXn~5N<%VSa2QUarcjb#Pz5Texn#ToV5lkC#jV(< zgq1aYs^=3{Dl+;?o8YxH1+*Ez4mEj3ajxp><6h@U@b}}nHMDTIhBT6%K4;&gcC8fWK{U(S4F1EjFhSP~6qW3KFmJ5g0o$%7jW-1wPXPhI}#} z4owVZ=FvU+XO8bM7b6FG!FU}w@T=i{f<)yJWUr`$XL9*I zLX;hlv<5l8H-8DX=Fh%$(Rb&8SE;VBR|}PX&MPpeUuXM>QZwE`))Tnqe%-cD*=`TI znax+XTk&0b2_s8R`#WGWOOs_NUItwdVoXabslqOZv$IhQJ`iLYBg6?MQdiVNcHRHd zik9NPu|hT?Ovg5PNP-A2s2__BYRaG5kH_!#p3H|VEDVtXOO(w#GoIOb-5mvBgIcs zuNwd`w6u0wyK*=;TA+#)dcVxXojR9Dp5V0q@m%>MKN(1)O0!qNO)b$Z<)6nm@to-L4~2(7la_Iz%JL^sk%VL;)c#D0In|B*5)OB=`m6jJF6%1 z7RoJ8HwF*7gB&mM4iBmoMWF_$ug@!_uz5KjAF>d$6y6A|vB?XktqH2#>_+e!^(%e- z5GC(uVyDjxE2?jyH}~@F+l|EU;Z6gmg^bGb%&E$CGcplu&vBOirfLsW@eY-WmT#+5 z{<*0=-H9VT+ej4j`rg$Wlxv()qw2-HUFoi#Q^TWSt-6i#oTHL&IdRs|p?$MG=(hYJ zmWc~@J-KU;Ie!{-Q6Fyh=qSNhktR6CRZss_QSu@-+<=i08w_rtVJ$uk4%T=`v{>LZ z<*Z98BYv)RCrf-3Kc#d2IwPH`TD0p;zXAg zeHNQd$($+$id0G(!?MNHASSi#`5Y&*as2gfG|*A*O087sSl~FE@|zPT+c@n>9JJAP zx45b~Bm9~wejAK74*e@eAj9RC6f8Zc8(r^mR{vvhlrjV{N;9f-=c3X^hEK0!ri_=H zM|Ap=i-Sx8ZTvJ|)?>c;wyoCYEf~1R!Y5=C5!Kq=efSOFmA;>%40+n?wG+EE`V&XE zpY&R?8xu||vgbz|@eY{`bYUB^6HjjFTM%NNP5bNZ6~T~8L02YcSQe_OLu z1fxDT^+$_Yfw?4<(x@iF*^S*-tgf9fw9rj6?~DmUU6L7Jsl0w8V#UDP_F&7c>QxaF zpz#U+l?Q=>tj^$6f|Ua8`PJGtSe`wpRQM9!3`npHZJcrg)@6T-ILcORhG1qMDQ%)T z!G@Qy=#NB->InlLRP9SD&CF+Rxv0h19HTn9!p1jnRH?3uk3DFz25x@XZ1P|-F;HXIFuM^>_P%l`Cu^Q`T0J}Pn?56Y`MLEk>YKPIm;9w&ip<1GHgOKh_vgnSWWQY=#x>|FjpoXT?UIdI{EawHZl(P-P^yUVlxR5>oyU+n)5W zBJL2#7Isa~ieE7OVEQEM53Og~l%hv?e%C=TCjH2FAw&hcTj$2sc{{)1DI;ejL-Zur z?!+VMb&g}Yp#mGE{5)Jz|B<2BAk+K)mptFqRUtKdrA+$K`%l9mAod^DTk$z4fC%w2 zTBt&gvOGA>+3=8eJ6F`-2KTIADzpZ4|KY>-c+`O1o%AP29OFfD6$!f>(CS4u1+8d$ zfDX5}fqNR>;qtHBiE#k$I4k_vpqU!TBRe|7u2qn(5O^=30DRT0> zH*m8RtDJk#tWzWnzxYPwvuSmPC@Gnh*wOG6>a` zmE&6rYjN_iUFM{Eoe-G^{mI}1>j&YTuT2n2qJU|F`#fxHL{aFpp3Vdgrp5>wq6r(W8_C&8En-N=l)WrXq*tZo@UaQ z`JQSGMt)O|KkeAqm9lxKYL61_al-ImJ)5)xnzbn1ce>V^zty@pv!D;oG?WN}k)KSXscTx}IlpmKs{&;)Pd-tqiWh zqt38Y#Z-uN&}g4>plI%H_e>*?Lr}QAlHTk4r}YywVkzPM9LID+hJM zTgw;EeUq)+%LSgOCqiqiLRy+~#^rx$vqH@rNuTC-CE>urG2Y*X;O2Ci1m?3-@q4u|}~ zNLH1fR@@xQREP>(uG@^TvQ9Te6d!_DnfRV8@$k7OI@u@*@tr=VU1Ob)`8v``zfFw@ z0B%Vv3pPhT(kRFrs;!_@%M#&ub~B#@5{;V45odn0!{dT>aR01|Pyuc>$lkwlhMik@ z3|s9nK8WK^Awfgq3&QiIiTc^#OCC^VyS1fjghWJF&=fB(Ie$v>tcW~=bIS4};mh?` zS)gwjW81-Fp6a(>P?!Z_RKA&RbEZ~PPcyu~5gY`R5|ynw3Y$nkAS248F!Z4x=#068 zGCE!9Xmr6Q$8gYlEOBs1KXH_G-0rp~XRtD@!_6PLDUm&c{G5srRNCD`00+H&Q<+3Y zQcj>7>}gNRaF-Z;Hc)&%6 zQ|iiZZi-}XkFdyJ5gp!eTlp|d;eMw0gXAHCm|dXUv$8@OlboOMTwGgXrYbwYxXmkt zpdy!|vu2b2M_{WQwwv zXR`5xZ`Klz%Z6(TaH=i&s-H!X^z7`EE6+ek0R+l%f8w)$&rfbddc?MB9=d@RyvGsj7SBk(&dGbPR)FN{kx^imRc^=WRzH|Nfr&{$d^sB9`h*Gz%o? z4X>49yRgt)Yn{u7GanLY5<8n_ANPO(*D8;ul*Zq3#(rVGE`7FM#EgQ`pV?MC^iQ`N z>wEm1p7MokBPVdci}W@L^v(GX3E@iy5(K#>>X)_Luq$BM3Re@E=UM5o<767C&spKd zH@NJZ77tpSp-(C+8`s~!wgECX$>z(vVm6i~;R6ZE&3*B7ykly4sK2wCc=B>-7)dD> zKwY2$ri6}}uEScY1rO3A1Ai z%CN%M#EsqkA-6DpVkeSO2HGhV-D`!(nd zH;_GMq(x=Q1FN8w@Tu*3IcvRyseZa%T4sf=ZCiLsbcJKO5tJT$8uZu1mC5xbnI!ps zp?b--nf8STSQ`EN(j4mXh9uBKQ}LJH`)94DVWBYymeG?oZU`W<@{{`QwWu25yL#Iv zNB;)&j%&#yL8_8^AGpYBbZ+9gm z8&9#m`i|B^y}W4Oj{X=#zTPbBRg{Q`yY=xw`3b(C`*DhIIKOd7ux4_*vmeJ(n1aBw zDiQ8x-r_HXbG>yQW=VY_L}!nRgKp(SY?#eJkC*>cig{sM$&?|Ep%cmtQn9jvw%@_Y zcJ0RtIu@WYT9ufK=o7y87zW)mZ%!?4eS)tcdM2GXsfMlNZ@H2`Q{i(;-9QATG`IJN z@cXHhFl0OuY4(*iYV@RpR()(=oVmkfrcw?LWHscgpZd}6QO^9qkvWkAoF`Qar%oP6 zf$5IfP2dX~DPk;DE5a!Y8EV$q$HQ_w3Fe6%sGC_*_cE`vsfP>v(J?EC+bs&@jjxjm z$I?aK`)&?jx(HQTw6Ph_WI8Nrcj0@DdLL{Hg$jdt{gMbj!F8{eLEHSHN~#rx_*;*6 zYoVl}?uY9`!6J?by3W)sI*CGC3{wQ5#EIC^QcI~RSI}M>W69e_0)qr@%5Ovlat@fy z^900?lfa4>t}l{R0#;o1X=2IJv|PFZ-U4v(-9`7q))Bb!W)8Cz7hivtVm{NlS7>Ii z2fsL{ke46ubasruN`;0W#7C2G)uMPhC)Z?Vv~r|G`GI#Lckg~*88gKlpqEF&p;Ksv z)*&qH5ZB1zedc)JO}NAQ>LZ;U(z*ooc`En|YC?@SO$aLS)EU3pda$e6>$>>W@u$5D zT-P16yf%yw0QU@7ve`Y24%s7qpsS1WE4)Mn+>=^Op!T|}HN zWq_=omJ+W-aLvqIPV zIVW>MrYRx@W2~pi+*+`HNYeUSCwNTG#V9PDvfQJ&x7qaOp(smpvObF+XC_k*#sZ1h zN48c#@veXy`ZYnQDYhQLvf<^(MOb}kaC4hNl+52k@R zem{=mxNQEYZ2*U^eEuMxf^?TZmsB5y{Nu@ktI-ff9Z=1hr?ChWp>yKo=3Xa}ZQAEZ z|MmqWVFpByJaP|f?uDHz<409$7Xv?iepBZ(daA7hbC}msoY1W)pn~k-Bbmea8NJz#Me5VtTPh#epi^9K=-i8A^&7^A_#4t@tPsW1PdgnN095%KluM zo1H9>+TQz3tE9g70rzm^skCf||2C5~($yAwZZTm9+X6A^m2eYrzF}Z1fBkq6Y6+>S zP*euT#elfI^8KL+JmJ3&P4YPspk*Xk000~S6&61>meN)utl~V1Zyx}E!U!LK` zwUe|-=K&~q>Rsp{^luFcDUi$4Q6HYffp}~RQpBvm@%PTBf}=d=+LM#C(05n!! z0e2J|42i1Rh3J=KVl!fwl26#A@SC@?)m$a52uG1J@Fv!t1OUKU^5UK6YnbP7I7{^G SZst+>o^b@PX8!-3=>Gt#%N0@p literal 0 HcmV?d00001 From e629ad629a561706dc32a2846fb638cf7f53b71b Mon Sep 17 00:00:00 2001 From: Atharva Deosthale Date: Thu, 28 May 2026 14:04:28 +0530 Subject: [PATCH 5/8] Update Git deployment triggers blog date --- .../blog/post/announcing-git-deployment-triggers/+page.markdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/blog/post/announcing-git-deployment-triggers/+page.markdoc b/src/routes/blog/post/announcing-git-deployment-triggers/+page.markdoc index b07f1afc850..28301ef5fd9 100644 --- a/src/routes/blog/post/announcing-git-deployment-triggers/+page.markdoc +++ b/src/routes/blog/post/announcing-git-deployment-triggers/+page.markdoc @@ -2,7 +2,7 @@ layout: post title: "Announcing Git deployment triggers for Appwrite Functions and Sites" description: Git deployment triggers let you control which branches and file changes create automatic deployments for Appwrite Functions and Sites. -date: 2026-05-27 +date: 2026-05-28 cover: /images/blog/announcing-git-deployment-triggers/cover.avif timeToRead: 4 author: harsh-mahajan From aa583efb9c4ada411ce487b787f27a31ada8d0a7 Mon Sep 17 00:00:00 2001 From: Atharva Deosthale Date: Fri, 29 May 2026 17:37:09 +0530 Subject: [PATCH 6/8] Document Git glob pattern syntax --- src/partials/git-glob-patterns.md | 10 ++++++++++ .../products/functions/deploy-from-git/+page.markdoc | 4 +++- .../docs/products/sites/deploy-from-git/+page.markdoc | 4 +++- 3 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 src/partials/git-glob-patterns.md diff --git a/src/partials/git-glob-patterns.md b/src/partials/git-glob-patterns.md new file mode 100644 index 00000000000..3e69a91c808 --- /dev/null +++ b/src/partials/git-glob-patterns.md @@ -0,0 +1,10 @@ +| Pattern | What it does | Example | Matches | +| ------- | ----------------------------------------- | ---------------- | ----------------------------------- | +| `main` | Matches exact text | `main` | `main` | +| `*` | Matches within one path segment | `release/*` | `release/1.0` | +| `**` | Matches across nested path segments | `preview/**` | `preview/test`, `preview/team/test` | +| `?` | Matches one character in one path segment | `v?.?` | `v1.0`, `v2.5` | +| `[abc]` | Matches one character from a set | `[Mm]ain` | `main`, `Main` | +| `[a-z]` | Matches one character in a range | `release/[0-9]*` | `release/1.0` | +| `\` | Escapes a special character | `file\?.txt` | `file?.txt` | +| `!` | Excludes matching branches or paths | `!docs/**` | Excludes changes under `docs/` | diff --git a/src/routes/docs/products/functions/deploy-from-git/+page.markdoc b/src/routes/docs/products/functions/deploy-from-git/+page.markdoc index b1d8ac03ba3..d7c5b8e8c6c 100644 --- a/src/routes/docs/products/functions/deploy-from-git/+page.markdoc +++ b/src/routes/docs/products/functions/deploy-from-git/+page.markdoc @@ -58,7 +58,9 @@ packages/shared/** !docs/** ``` -Use `!` before a pattern to exclude matching branches or paths. +Use these formats to write glob patterns. + +{% partial file="git-glob-patterns.md" /%} ## Entry point {% #entry-point %} The entry point is the code file contains the exported function that will be executed when the function is called. diff --git a/src/routes/docs/products/sites/deploy-from-git/+page.markdoc b/src/routes/docs/products/sites/deploy-from-git/+page.markdoc index 20cbf81f48f..b28c874e065 100644 --- a/src/routes/docs/products/sites/deploy-from-git/+page.markdoc +++ b/src/routes/docs/products/sites/deploy-from-git/+page.markdoc @@ -58,7 +58,9 @@ packages/ui/** !docs/** ``` -Use `!` before a pattern to exclude matching branches or paths. +Use these formats to write glob patterns. + +{% partial file="git-glob-patterns.md" /%} ## Install command From 8a90aadb9a6aa84326f766721d2e07b252992a4c Mon Sep 17 00:00:00 2001 From: Atharva Deosthale Date: Fri, 29 May 2026 18:04:04 +0530 Subject: [PATCH 7/8] Update deployment triggers publish date --- .../post/announcing-git-deployment-triggers/+page.markdoc | 4 ++-- src/routes/changelog/(entries)/2026-05-27.markdoc | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/routes/blog/post/announcing-git-deployment-triggers/+page.markdoc b/src/routes/blog/post/announcing-git-deployment-triggers/+page.markdoc index 28301ef5fd9..13eee1f802f 100644 --- a/src/routes/blog/post/announcing-git-deployment-triggers/+page.markdoc +++ b/src/routes/blog/post/announcing-git-deployment-triggers/+page.markdoc @@ -2,7 +2,7 @@ layout: post title: "Announcing Git deployment triggers for Appwrite Functions and Sites" description: Git deployment triggers let you control which branches and file changes create automatic deployments for Appwrite Functions and Sites. -date: 2026-05-28 +date: 2026-05-29 cover: /images/blog/announcing-git-deployment-triggers/cover.avif timeToRead: 4 author: harsh-mahajan @@ -35,7 +35,7 @@ Git deployment triggers let you control which branches and file changes create a - **Control over automatic deployments:** Choose the branch pushes and file changes that should start a build. - **Cleaner preview workflows:** Create deployments from the branches your team uses for previews, staging, testing, or release candidates. - **Better monorepo support:** Deploy a Function or Site only when files in the relevant folders change. -- **Simple glob patterns:** Use familiar patterns like `main`, `preview/**`, `apps/web/**`, and `!docs/**`. +- **Simple glob patterns:** Use familiar patterns like `main`, `preview/**`, `apps/web/**`, and `!docs/**`. See the [build trigger docs](/docs/products/sites/deploy-from-git#build-triggers) for supported glob pattern formats. - **Support for Functions and Sites:** Configure the same behavior across both Appwrite compute products. # Branch filters diff --git a/src/routes/changelog/(entries)/2026-05-27.markdoc b/src/routes/changelog/(entries)/2026-05-27.markdoc index 9d8b20bc716..e3eee21ced7 100644 --- a/src/routes/changelog/(entries)/2026-05-27.markdoc +++ b/src/routes/changelog/(entries)/2026-05-27.markdoc @@ -1,7 +1,7 @@ --- layout: changelog title: "Control automatic Git deployments with build triggers" -date: 2026-05-27 +date: 2026-05-29 cover: /images/blog/announcing-git-deployment-triggers/cover.avif --- From 5614b63ecc49c61e2c2018cad6aca38bee55f414 Mon Sep 17 00:00:00 2001 From: Atharva Deosthale Date: Fri, 29 May 2026 18:08:01 +0530 Subject: [PATCH 8/8] Rename deployment triggers changelog entry --- .../(entries)/{2026-05-27.markdoc => 2026-05-29.markdoc} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/routes/changelog/(entries)/{2026-05-27.markdoc => 2026-05-29.markdoc} (100%) diff --git a/src/routes/changelog/(entries)/2026-05-27.markdoc b/src/routes/changelog/(entries)/2026-05-29.markdoc similarity index 100% rename from src/routes/changelog/(entries)/2026-05-27.markdoc rename to src/routes/changelog/(entries)/2026-05-29.markdoc