Merge branch 'main' into homepage-2025

This commit is contained in:
Jesse Winton
2025-05-27 08:41:44 -04:00
89 changed files with 3201 additions and 327 deletions

View File

@@ -1,12 +1,10 @@
# Content Guidelines
## Table of Contents
### Basics
## Basics
Here are some essential markdoc syntax elements with code examples:
#### Paragraphs and Line Breaks
### Paragraphs and Line Breaks
To create a new paragraph, simply leave a blank line between lines of text.
@@ -16,7 +14,7 @@ This is the first paragraph.
This is the second paragraph.
```
#### Headers
### Headers
Headers are used to create section titles. Use hashtags (#) for headers, with more hashtags for lower-level headers.
@@ -34,7 +32,7 @@ Headers can also be given ID's so they can be linked to and are present in the T
# Header with ID {% #header-with-id %}
```
#### Lists
### Lists
Create ordered (numbered) and unordered (bulleted) lists using 1., \*, or -.
@@ -54,7 +52,7 @@ Create ordered (numbered) and unordered (bulleted) lists using 1., \*, or -.
- Cherry
```
#### Links
### Links
Create hyperlinks to other web pages or sections within your documentation.
@@ -63,7 +61,7 @@ Create hyperlinks to other web pages or sections within your documentation.
[Link to Section](#section-name)
```
#### Images
### Images
Embed images using the `![alt text](image URL)` syntax.
@@ -82,7 +80,7 @@ In most cases, we need images in both light and dark mode such as:
{% /only_light %}
```
#### Code Blocks
### Code Blocks
Format code blocks using triple backticks (```).
@@ -95,7 +93,7 @@ def hello_world():
Remember to use a specific language label if the code is using an Appwrite SDK. Find the [list of available labels here](https://github.com/appwrite/website/blob/41bb6c71a8647016c88393003d3cf6c4edba1f76/src/lib/utils/references.ts#L26).
#### Inline Code
### Inline Code
Highlight inline code with backticks (`) around the code snippet.
@@ -103,7 +101,7 @@ Highlight inline code with backticks (`) around the code snippet.
Use the `print()` function to display text.
```
#### Emphasis and Strong Text
### Emphasis and Strong Text
Use asterisks (\*) or underscores (\_) for emphasis and double asterisks or underscores for strong text.
@@ -114,7 +112,7 @@ _Italic Text_ or _Italic Text_
**Bold Text** or **Bold Text**
```
#### Tables
### Tables
Tables allow you to display structured data in your documentation. Use pipes (|) to separate columns and hyphens (-) to define the table header.
@@ -146,7 +144,7 @@ Alternatively, use markdoc tables.
{% /table %}
```
#### Block Quotes
### Block Quotes
Block quotes are used to emphasize or highlight text. To create a block quote, use the > symbol at the beginning of the quoted text.
@@ -157,9 +155,9 @@ Block quotes are used to emphasize or highlight text. To create a block quote, u
These are the fundamental Markdown syntax elements you'll need to create well-structured and formatted documentation.
### Components
## Components
#### Tabs
### Tabs
```md
{% tabs %}
@@ -173,7 +171,7 @@ Lorem ipsum dolor sit amet consectetur.
{% /tabs %}
```
#### Multicode Examples
### Multicode Examples
<pre>
{% multicode %}
@@ -191,7 +189,9 @@ print('test');
{% /multicode %}
</pre>
#### Sections
Remember to use a specific language label if the code is using an Appwrite SDK. Find the [list of available labels here](https://github.com/appwrite/website/blob/41bb6c71a8647016c88393003d3cf6c4edba1f76/src/lib/utils/references.ts#L26).
### Sections
Use sections when there is a clear step-by-step format to a page. This is used mainly in journey pages and tutorials.
@@ -209,7 +209,7 @@ Lorem ipsum dolor sit amet consectetur.
{% /section %}
```
#### Info
### Info
```
{% info title="Public Service Announcement" %}
@@ -217,7 +217,7 @@ Lorem ipsum dolor sit amet consectetur.
{% /info %}
```
#### Icon
### Icon
Available sizes are `s`, `m`, `l` and `xl`. Default: `s`.
@@ -228,7 +228,7 @@ Available sizes are `s`, `m`, `l` and `xl`. Default: `s`.
{% icon icon="github" size="xl" /%}
```
#### Icon Image
### Icon Image
Available sizes are `s`, `m`, `l` and `xl`. Default: `s`.
@@ -239,7 +239,7 @@ Available sizes are `s`, `m`, `l` and `xl`. Default: `s`.
{% icon_image src="/icon.png" alt="Icon" size="xl" /%}
```
#### Only Light/Dark Theme
### Only Light/Dark Theme
```
{% only_dark %}
@@ -250,7 +250,7 @@ Available sizes are `s`, `m`, `l` and `xl`. Default: `s`.
{% /only_light %}
```
#### Cards
### Cards
We use cards when we reference a list of links for navigation
@@ -276,7 +276,7 @@ Get started with Appwrite and SvelteKit
{% /cards %}
```
#### Cards with icons
### Cards with icons
We use cards when we reference a list of links for navigation, this variation has icons for extra hints visually.
@@ -294,7 +294,7 @@ Configure FCM for push notification to Android and Apple devices.
{% /cards %}
```
#### Accordions
### Accordions
Use accordions to reduce page size and collapse information that's not important when a reader is scrolling the page.

View File

@@ -41,4 +41,4 @@ Join our growing community around the world! See our official [Blog](https://app
## License
Appwrite website, docs and blog © 2024 by Appwrite is licensed under [CC BY-NC-ND 4.0](https://creativecommons.org/licenses/by-nc-nd/4.0/).
Appwrite website, docs and blog © 2025 by Appwrite is licensed under [CC BY-NC-ND 4.0](https://creativecommons.org/licenses/by-nc-nd/4.0/).

View File

@@ -332,6 +332,13 @@ or a page needs to be sufficiently different from existing pages, follow exisitn
If you are proposing a new type of page, discuss an outline in your PR and ask for the Appwrite team's review.
### Placeholders
Whenever there's a need for a placeholder such as for an ID, use angle brackets (<>) over square brackets ([]) because square brackets can be confused for an array.
-`client.setEndpoint("https://<REGION>.cloud.appwrite.io")`
-`client.setEndpoint("https://[REGION].cloud.appwrite.io")`
## Code snippets
For quick starts and tutorials, a developer must be able to follow code examples from beginning to end

323
pnpm-lock.yaml generated
View File

@@ -29,7 +29,7 @@ importers:
version: 0.26.0
'@appwrite.io/repo':
specifier: github:appwrite/appwrite#main
version: https://codeload.github.com/appwrite/appwrite/tar.gz/00e3397b5632ccfee7306b14e5ad636f256fb192
version: https://codeload.github.com/appwrite/appwrite/tar.gz/72087298056c5db3dca81d2ca66725dcf47d41bb
'@eslint/compat':
specifier: ^1.2.7
version: 1.2.7(eslint@9.22.0(jiti@2.4.2))
@@ -248,7 +248,7 @@ importers:
version: 0.2.0
vitest:
specifier: ^3.1.1
version: 3.1.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0)
version: 3.1.1(@types/node@22.13.10)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0)
zod:
specifier: ^3.24.2
version: 3.24.4
@@ -293,14 +293,45 @@ packages:
'@appwrite.io/pink@0.26.0':
resolution: {integrity: sha512-iPeGE56pauzxuIXt15ZswjKCErwp3QdF3XOlJZfyYY7J2nirra85JNTL+3lWuFIf8yYWL7NbvCjhf8ig79TgwA==}
'@appwrite.io/repo@https://codeload.github.com/appwrite/appwrite/tar.gz/00e3397b5632ccfee7306b14e5ad636f256fb192':
resolution: {tarball: https://codeload.github.com/appwrite/appwrite/tar.gz/00e3397b5632ccfee7306b14e5ad636f256fb192}
'@appwrite.io/repo@https://codeload.github.com/appwrite/appwrite/tar.gz/72087298056c5db3dca81d2ca66725dcf47d41bb':
resolution: {tarball: https://codeload.github.com/appwrite/appwrite/tar.gz/72087298056c5db3dca81d2ca66725dcf47d41bb}
version: 0.0.0
'@asamuzakjp/css-color@3.2.0':
resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==}
'@babel/runtime@7.26.10':
resolution: {integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==}
engines: {node: '>=6.9.0'}
'@csstools/color-helpers@5.0.2':
resolution: {integrity: sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==}
engines: {node: '>=18'}
'@csstools/css-calc@2.1.3':
resolution: {integrity: sha512-XBG3talrhid44BY1x3MHzUx/aTG8+x/Zi57M4aTKK9RFB4aLlF3TTSzfzn8nWVHWL3FgAXAxmupmDd6VWww+pw==}
engines: {node: '>=18'}
peerDependencies:
'@csstools/css-parser-algorithms': ^3.0.4
'@csstools/css-tokenizer': ^3.0.3
'@csstools/css-color-parser@3.0.9':
resolution: {integrity: sha512-wILs5Zk7BU86UArYBJTPy/FMPPKVKHMj1ycCEyf3VUptol0JNRLFU/BZsJ4aiIHJEbSLiizzRrw8Pc1uAEDrXw==}
engines: {node: '>=18'}
peerDependencies:
'@csstools/css-parser-algorithms': ^3.0.4
'@csstools/css-tokenizer': ^3.0.3
'@csstools/css-parser-algorithms@3.0.4':
resolution: {integrity: sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==}
engines: {node: '>=18'}
peerDependencies:
'@csstools/css-tokenizer': ^3.0.3
'@csstools/css-tokenizer@3.0.3':
resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==}
engines: {node: '>=18'}
'@emnapi/runtime@1.3.1':
resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==}
@@ -1643,6 +1674,10 @@ packages:
resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
engines: {node: '>= 6.0.0'}
agent-base@7.1.3:
resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==}
engines: {node: '>= 14'}
agentkeepalive@4.6.0:
resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==}
engines: {node: '>= 8.0.0'}
@@ -1949,6 +1984,10 @@ packages:
cssom@0.5.0:
resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==}
cssstyle@4.3.1:
resolution: {integrity: sha512-ZgW+Jgdd7i52AaLYCriF8Mxqft0gD/R9i9wi6RWBhs1pqdPEzPjym7rvRKi397WmQFf3SlyUsszhw+VVCbx79Q==}
engines: {node: '>=18'}
cubic2quad@1.2.1:
resolution: {integrity: sha512-wT5Y7mO8abrV16gnssKdmIhIbA9wSkeMzhh27jAguKrV82i24wER0vL5TGhUJ9dbJNDcigoRZ0IAHFEEEI4THQ==}
@@ -1956,6 +1995,10 @@ packages:
resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
engines: {node: '>= 12'}
data-urls@5.0.0:
resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==}
engines: {node: '>=18'}
date-fns@3.6.0:
resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==}
@@ -1968,6 +2011,18 @@ packages:
supports-color:
optional: true
debug@4.4.1:
resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==}
engines: {node: '>=6.0'}
peerDependencies:
supports-color: '*'
peerDependenciesMeta:
supports-color:
optional: true
decimal.js@10.5.0:
resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==}
deep-eql@5.0.2:
resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
engines: {node: '>=6'}
@@ -2471,6 +2526,10 @@ packages:
resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==}
engines: {node: '>=12.0.0'}
html-encoding-sniffer@4.0.0:
resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==}
engines: {node: '>=18'}
html-escaper@3.0.3:
resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==}
@@ -2487,10 +2546,18 @@ packages:
resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==}
engines: {node: '>= 6'}
http-proxy-agent@7.0.2:
resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
engines: {node: '>= 14'}
https-proxy-agent@5.0.1:
resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
engines: {node: '>= 6'}
https-proxy-agent@7.0.6:
resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==}
engines: {node: '>= 14'}
humanize-ms@1.2.1:
resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==}
@@ -2597,6 +2664,9 @@ packages:
resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
engines: {node: '>=8'}
is-potential-custom-element-name@1.0.1:
resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
is-reference@1.2.1:
resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
@@ -2654,6 +2724,15 @@ packages:
jsbn@1.1.0:
resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==}
jsdom@26.1.0:
resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==}
engines: {node: '>=18'}
peerDependencies:
canvas: ^3.0.0
peerDependenciesMeta:
canvas:
optional: true
json-buffer@3.0.1:
resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
@@ -3041,6 +3120,9 @@ packages:
number-flow@0.5.7:
resolution: {integrity: sha512-P83Y9rBgN3Xpz5677YDNtuQHZpIldw6WXeWRg0+edrfFthhV7QqRdABas5gtu07QPLvbA8XhfO69rIvbKRzYIg==}
nwsapi@2.2.20:
resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==}
object-assign@4.1.1:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
@@ -3116,6 +3198,9 @@ packages:
parse5@7.2.1:
resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==}
parse5@7.3.0:
resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==}
path-exists@4.0.0:
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
engines: {node: '>=8'}
@@ -3442,6 +3527,9 @@ packages:
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
rrweb-cssom@0.8.0:
resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==}
run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
@@ -3471,6 +3559,10 @@ packages:
sax@1.4.1:
resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==}
saxes@6.0.0:
resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
engines: {node: '>=v12.22.7'}
semver@7.7.1:
resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==}
engines: {node: '>=10'}
@@ -3667,6 +3759,9 @@ packages:
'@types/svgicons2svgfont':
optional: true
symbol-tree@3.2.4:
resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
tabbable@6.2.0:
resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==}
@@ -3721,6 +3816,13 @@ packages:
resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==}
engines: {node: '>=14.0.0'}
tldts-core@6.1.86:
resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==}
tldts@6.1.86:
resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==}
hasBin: true
to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
@@ -3737,9 +3839,17 @@ packages:
resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
engines: {node: '>=6'}
tough-cookie@5.1.2:
resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==}
engines: {node: '>=16'}
tr46@0.0.3:
resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
tr46@5.1.1:
resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==}
engines: {node: '>=18'}
ts-api-utils@2.0.1:
resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==}
engines: {node: '>=18.12'}
@@ -3932,6 +4042,10 @@ packages:
jsdom:
optional: true
w3c-xmlserializer@5.0.0:
resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
engines: {node: '>=18'}
web-streams-polyfill@3.3.3:
resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==}
engines: {node: '>= 8'}
@@ -3942,6 +4056,10 @@ packages:
webidl-conversions@3.0.1:
resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
webidl-conversions@7.0.0:
resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
engines: {node: '>=12'}
whatwg-encoding@3.1.1:
resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
engines: {node: '>=18'}
@@ -3950,6 +4068,10 @@ packages:
resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==}
engines: {node: '>=18'}
whatwg-url@14.2.0:
resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==}
engines: {node: '>=18'}
whatwg-url@5.0.0:
resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
@@ -3988,9 +4110,25 @@ packages:
wrappy@1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
ws@8.18.2:
resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==}
engines: {node: '>=10.0.0'}
peerDependencies:
bufferutil: ^4.0.1
utf-8-validate: '>=5.0.2'
peerDependenciesMeta:
bufferutil:
optional: true
utf-8-validate:
optional: true
xhr@2.6.0:
resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==}
xml-name-validator@5.0.0:
resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==}
engines: {node: '>=18'}
xml-parse-from-string@1.0.1:
resolution: {integrity: sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==}
@@ -4002,6 +4140,9 @@ packages:
resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==}
engines: {node: '>=4.0'}
xmlchars@2.2.0:
resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
xtend@4.0.2:
resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
engines: {node: '>=0.4'}
@@ -4105,12 +4246,46 @@ snapshots:
normalize.css: 8.0.1
the-new-css-reset: 1.11.3
'@appwrite.io/repo@https://codeload.github.com/appwrite/appwrite/tar.gz/00e3397b5632ccfee7306b14e5ad636f256fb192': {}
'@appwrite.io/repo@https://codeload.github.com/appwrite/appwrite/tar.gz/72087298056c5db3dca81d2ca66725dcf47d41bb': {}
'@asamuzakjp/css-color@3.2.0':
dependencies:
'@csstools/css-calc': 2.1.3(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
'@csstools/css-color-parser': 3.0.9(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
'@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3)
'@csstools/css-tokenizer': 3.0.3
lru-cache: 10.4.3
optional: true
'@babel/runtime@7.26.10':
dependencies:
regenerator-runtime: 0.14.1
'@csstools/color-helpers@5.0.2':
optional: true
'@csstools/css-calc@2.1.3(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)':
dependencies:
'@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3)
'@csstools/css-tokenizer': 3.0.3
optional: true
'@csstools/css-color-parser@3.0.9(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)':
dependencies:
'@csstools/color-helpers': 5.0.2
'@csstools/css-calc': 2.1.3(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
'@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3)
'@csstools/css-tokenizer': 3.0.3
optional: true
'@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3)':
dependencies:
'@csstools/css-tokenizer': 3.0.3
optional: true
'@csstools/css-tokenizer@3.0.3':
optional: true
'@emnapi/runtime@1.3.1':
dependencies:
tslib: 2.8.1
@@ -5380,6 +5555,9 @@ snapshots:
transitivePeerDependencies:
- supports-color
agent-base@7.1.3:
optional: true
agentkeepalive@4.6.0:
dependencies:
humanize-ms: 1.2.1
@@ -5716,16 +5894,36 @@ snapshots:
cssom@0.5.0: {}
cssstyle@4.3.1:
dependencies:
'@asamuzakjp/css-color': 3.2.0
rrweb-cssom: 0.8.0
optional: true
cubic2quad@1.2.1: {}
data-uri-to-buffer@4.0.1: {}
data-urls@5.0.0:
dependencies:
whatwg-mimetype: 4.0.0
whatwg-url: 14.2.0
optional: true
date-fns@3.6.0: {}
debug@4.4.0:
dependencies:
ms: 2.1.3
debug@4.4.1:
dependencies:
ms: 2.1.3
optional: true
decimal.js@10.5.0:
optional: true
deep-eql@5.0.2: {}
deep-is@0.1.4: {}
@@ -6270,6 +6468,11 @@ snapshots:
highlight.js@11.11.1: {}
html-encoding-sniffer@4.0.0:
dependencies:
whatwg-encoding: 3.1.1
optional: true
html-escaper@3.0.3: {}
htmlparser2@10.0.0:
@@ -6296,6 +6499,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
http-proxy-agent@7.0.2:
dependencies:
agent-base: 7.1.3
debug: 4.4.1
transitivePeerDependencies:
- supports-color
optional: true
https-proxy-agent@5.0.1:
dependencies:
agent-base: 6.0.2
@@ -6303,6 +6514,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
https-proxy-agent@7.0.6:
dependencies:
agent-base: 7.1.3
debug: 4.4.1
transitivePeerDependencies:
- supports-color
optional: true
humanize-ms@1.2.1:
dependencies:
ms: 2.1.3
@@ -6382,6 +6601,9 @@ snapshots:
is-path-inside@3.0.3: {}
is-potential-custom-element-name@1.0.1:
optional: true
is-reference@1.2.1:
dependencies:
'@types/estree': 1.0.6
@@ -6452,6 +6674,34 @@ snapshots:
jsbn@1.1.0: {}
jsdom@26.1.0:
dependencies:
cssstyle: 4.3.1
data-urls: 5.0.0
decimal.js: 10.5.0
html-encoding-sniffer: 4.0.0
http-proxy-agent: 7.0.2
https-proxy-agent: 7.0.6
is-potential-custom-element-name: 1.0.1
nwsapi: 2.2.20
parse5: 7.3.0
rrweb-cssom: 0.8.0
saxes: 6.0.0
symbol-tree: 3.2.4
tough-cookie: 5.1.2
w3c-xmlserializer: 5.0.0
webidl-conversions: 7.0.0
whatwg-encoding: 3.1.1
whatwg-mimetype: 4.0.0
whatwg-url: 14.2.0
ws: 8.18.2
xml-name-validator: 5.0.0
transitivePeerDependencies:
- bufferutil
- supports-color
- utf-8-validate
optional: true
json-buffer@3.0.1: {}
json-schema-traverse@0.4.1: {}
@@ -6832,6 +7082,9 @@ snapshots:
dependencies:
esm-env: 1.2.2
nwsapi@2.2.20:
optional: true
object-assign@4.1.1: {}
omggif@1.0.10: {}
@@ -6928,6 +7181,11 @@ snapshots:
dependencies:
entities: 4.5.0
parse5@7.3.0:
dependencies:
entities: 6.0.0
optional: true
path-exists@4.0.0: {}
path-is-absolute@1.0.1: {}
@@ -7176,6 +7434,9 @@ snapshots:
'@rollup/rollup-win32-x64-msvc': 4.35.0
fsevents: 2.3.3
rrweb-cssom@0.8.0:
optional: true
run-parallel@1.2.0:
dependencies:
queue-microtask: 1.2.3
@@ -7205,6 +7466,11 @@ snapshots:
sax@1.4.1: {}
saxes@6.0.0:
dependencies:
xmlchars: 2.2.0
optional: true
semver@7.7.1: {}
set-blocking@2.0.0: {}
@@ -7468,6 +7734,9 @@ snapshots:
- bluebird
- supports-color
symbol-tree@3.2.4:
optional: true
tabbable@6.2.0: {}
tailwind-merge@3.0.2: {}
@@ -7514,6 +7783,14 @@ snapshots:
tinyspy@3.0.2: {}
tldts-core@6.1.86:
optional: true
tldts@6.1.86:
dependencies:
tldts-core: 6.1.86
optional: true
to-regex-range@5.0.1:
dependencies:
is-number: 7.0.0
@@ -7529,8 +7806,18 @@ snapshots:
totalist@3.0.1: {}
tough-cookie@5.1.2:
dependencies:
tldts: 6.1.86
optional: true
tr46@0.0.3: {}
tr46@5.1.1:
dependencies:
punycode: 2.3.1
optional: true
ts-api-utils@2.0.1(typescript@5.8.2):
dependencies:
typescript: 5.8.2
@@ -7677,7 +7964,7 @@ snapshots:
optionalDependencies:
vite: 6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0)
vitest@3.1.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0):
vitest@3.1.1(@types/node@22.13.10)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0):
dependencies:
'@vitest/expect': 3.1.1
'@vitest/mocker': 3.1.1(vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0))
@@ -7701,6 +7988,7 @@ snapshots:
why-is-node-running: 2.3.0
optionalDependencies:
'@types/node': 22.13.10
jsdom: 26.1.0
transitivePeerDependencies:
- jiti
- less
@@ -7715,18 +8003,32 @@ snapshots:
- tsx
- yaml
w3c-xmlserializer@5.0.0:
dependencies:
xml-name-validator: 5.0.0
optional: true
web-streams-polyfill@3.3.3: {}
web-vitals@4.2.4: {}
webidl-conversions@3.0.1: {}
webidl-conversions@7.0.0:
optional: true
whatwg-encoding@3.1.1:
dependencies:
iconv-lite: 0.6.3
whatwg-mimetype@4.0.0: {}
whatwg-url@14.2.0:
dependencies:
tr46: 5.1.1
webidl-conversions: 7.0.0
optional: true
whatwg-url@5.0.0:
dependencies:
tr46: 0.0.3
@@ -7765,6 +8067,9 @@ snapshots:
wrappy@1.0.2: {}
ws@8.18.2:
optional: true
xhr@2.6.0:
dependencies:
global: 4.4.0
@@ -7772,6 +8077,9 @@ snapshots:
parse-headers: 2.0.5
xtend: 4.0.2
xml-name-validator@5.0.0:
optional: true
xml-parse-from-string@1.0.1: {}
xml2js@0.5.0:
@@ -7781,6 +8089,9 @@ snapshots:
xmlbuilder@11.0.1: {}
xmlchars@2.2.0:
optional: true
xtend@4.0.2: {}
y18n@5.0.8: {}

View File

@@ -7,7 +7,7 @@
</script>
<div
class="bg relative mt-12 -mb-16 flex min-h-[12rem] items-center justify-center overflow-hidden border-t border-[hsl(var(--web-color-subtle))] py-12"
class="bg relative mt-12 -mb-6 flex min-h-[12rem] items-center justify-center overflow-hidden border-t border-[hsl(var(--web-color-subtle))] py-12"
>
<div class="flex max-w-3xs flex-col items-center justify-center gap-5 text-center">
<h2 class="text-label text-primary font-aeonik-pro">{heading}</h2>

View File

@@ -8,15 +8,15 @@ type SocialStats = {
export const SOCIAL_STATS: SocialStats = {
GITHUB: {
STAT: '48K',
STAT: '50K',
LINK: 'https://github.com/appwrite/appwrite',
EXTRA: {
COMMITS: '24K+',
PULL_REQUESTS: '4.5K+',
COMMITS: '27K+',
PULL_REQUESTS: '4.7K+',
ISSUES: '3K+',
OPEN_ISSUES: '500+',
OPEN_ISSUES: '600+',
CLOSED_ISSUES: '3.3K+',
FORKS: '4.3K+',
FORKS: '4.4K+',
CONTRIBUTORS: '800+'
}
},
@@ -29,7 +29,7 @@ export const SOCIAL_STATS: SocialStats = {
LINK: 'https://twitter.com/intent/follow?screen_name=appwrite'
},
YOUTUBE: {
STAT: '11K+',
STAT: '12K+',
LINK: 'https://www.youtube.com/c/appwrite?sub_confirmation=1'
}
};

View File

@@ -146,13 +146,13 @@
</script>
<div class="relative">
<!-- {#if !page.url.pathname.includes('/init')}
<div class="border-smooth relative z-10 border-b bg-[#19191C]">
<div class="is-special-padding mx-auto">
<AnnouncementBanner />
</div>
</div>
{/if} -->
<!--{#if !page.url.pathname.includes('/init')}-->
<!-- <div class="border-smooth relative z-10 border-b bg-[#19191C]">-->
<!-- <div class="is-special-padding mx-auto">-->
<!-- <AnnouncementBanner />-->
<!-- </div>-->
<!-- </div>-->
<!--{/if}-->
<section
class="web-mobile-header {resolvedTheme}"

View File

@@ -9,7 +9,7 @@
class="web-side-nav-button flex size-10 w-full items-center rounded-lg p-2 whitespace-nowrap"
class:is-selected={page.url?.pathname === groupItem.href}
href={groupItem.href}
target={groupItem.openInNewTab ? '_blank' : '_self'}
target={groupItem.openInNewTab ? '_blank' : undefined}
>
{#if groupItem.icon}
<span class="icon {groupItem.icon}" aria-hidden="true"></span>

View File

@@ -1,7 +1,15 @@
<script lang="ts">
import { page } from '$app/state';
import { Media } from '$lib/UI';
import { FooterNav, MainFooter } from '$lib/components';
import CTA from '$lib/components/BlogCta.svelte';
import Article from '$lib/components/blog/article.svelte';
import Breadcrumbs from '$lib/components/blog/breadcrumbs.svelte';
import Newsletter from '$lib/components/blog/newsletter.svelte';
import PostMeta from '$lib/components/blog/post-meta.svelte';
import TableOfContents from '$lib/components/blog/table-of-contents.svelte';
import { Main } from '$lib/layouts';
import type { TocItem } from '$lib/layouts/DocsArticle.svelte';
import { formatDate } from '$lib/utils/date';
import {
createBreadcrumbsSchema,
@@ -12,14 +20,6 @@
import type { AuthorData, PostsData } from '$routes/blog/content';
import { TITLE_SUFFIX } from '$routes/titles';
import { getContext, setContext } from 'svelte';
import { page } from '$app/state';
import CTA from '$lib/components/BlogCta.svelte';
import PostMeta from '$lib/components/blog/post-meta.svelte';
import Breadcrumbs from '$lib/components/blog/breadcrumbs.svelte';
import Newsletter from '$lib/components/blog/newsletter.svelte';
import TableOfContents from '$lib/components/blog/table-of-contents.svelte';
import Article from '$lib/components/blog/article.svelte';
import type { TocItem } from '$lib/layouts/DocsArticle.svelte';
import { writable } from 'svelte/store';
import type { LayoutContext } from './Article.svelte';
@@ -39,7 +39,9 @@
| boolean;
export let lastUpdated: string;
const posts = getContext<PostsData[]>('posts');
const posts = getContext<PostsData[]>('posts')?.filter(
(post) => !(post.unlisted ?? false) && !(post.draft ?? false)
);
const authors = getContext<AuthorData[]>('authors');
const authorData = authors.find((a) => a.slug === author);

View File

@@ -0,0 +1,110 @@
# Configure GitHub app {% #git %}
Appwrite supports automatic deployments through Git integration. In order for Appwrite to access your repos, you must [create a GitHub app](https://docs.github.com/en/apps/creating-github-apps/about-creating-github-apps/about-creating-github-apps) to enable this integration. The GitHub app requires the following configurations.
For automatic Git deployment to work, Appwrite needs to receive communication from GitHub, this means your Appwrite project must be accessible on the internet. If you're running on `localhost`, you need to run a proxy like [ngrok](https://ngrok.com/).
## GitHub App name {% #github-app-name %}
The GitHub App name will be displayed when connecting Appwrite to GitHub. In addition, this name will be transformed to a slug ("My GitHub App" will become "my-github-app") and appear in the URL when accessing your app in GitHub. This slug should be set as the `_APP_VCS_GITHUB_APP_NAME` environment variable in Appwrite.
## Homepage URL {% #github-homepage-url %}
The homepage URL will appear when looking at the public page of your app. It can be any URL you'd like.
## Callback URL {% #callback %}
GitHub will use **callback URLs** to redirect users back to Appwrite. Set these callback URLs under **Identifying and authorizing users** in the same order as listed below.
| URLs |
| ----------------------------------------------------------------------------- |
| `https://<HOSTNAME_OR_IP>/v1/vcs/github/callback` |
| `https://<HOSTNAME_OR_IP>/v1/account/sessions/oauth2/callback/github/console` |
Also, check the **Request user authentication (OAuth) during installation** box.
## Post installation {% #post-install %}
Check the **Redirect on update** box under the **Post installation** section.
## Webhook {% #github-webhooks %}
GitHub will notify Appwrite about events like new commits using webhooks. Under **Webhook**, you need to check the **Active** checkbox. You also need to set the **Webhook URL** as `https://<HOSTNAME_OR_IP>/v1/vcs/github/events`.
If you're running Appwrite on `localhost`, GitHub can't send requests to Appwrite through webhooks and automatic deployments won't work. You'll need to host Appwrite on a server or use a proxy like [ngrok](https://ngrok.com/) to make Appwrite accessible to GitHub.
## Repository permissions {% #repository-permission %}
Configure these permissions under the **Repository permission** dropdown.
| Permission | Access |
| --------------- | -------------- |
| Administration | Read and write |
| Checks | Read and write |
| Commit Statuses | Read and write |
| Contents | Read and write |
| Issues | Read and write |
| Metadata | Read-only |
| Pull requests | Read and write |
| Webhooks | Read and write |
## Account permissions {% #account-permission %}
Configure these permissions under the **Account Permission** dropdown.
| Permission | Access |
| ------------- | --------- |
| Email address | Read-only |
## Subscribe to events {% #subscribe-events %}
Select these under the **Subscribe to events** dropdown.
| Events |
| ------------ |
| Pull request |
| Push |
## Where can this GitHub App be installed? {% #github-where-installed %}
Check the **Any account** box under **Where can this GitHub App be installed?** section. This is important to allow you to install the GitHub app on multiple Appwrite projects.
## Environment variables {% #github-variables %}
After creating your app, you'll have to configure the following environment variables.
| Variable | Description |
| -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `_APP_DOMAIN` | Your main Appwrite domain used to access the Appwrite Console. When setting a public suffix domain, Appwrite will attempt to issue a valid SSL certificate automatically. When used with a dev domain, Appwrite will assign a self-signed SSL certificate. If you're using a proxy for **localhost development**, such as [ngrok](https://ngrok.com/), this will be the domain of your localhost proxy. |
| `_APP_DOMAIN_TARGET` | A hostname to serve as a CNAME target for your Appwrite custom domains. You can use the same value as used for the Appwrite `_APP_DOMAIN` variable. If you're using a proxy for **localhost development**, such as [ngrok](https://ngrok.com/), this will be the domain of your localhost proxy, such as `dd65-2405-201-4013-d8d7-b4c5-fb73-39f9-285c.ngrok.io`. |
| `_APP_DOMAIN_FUNCTIONS` | This will be used for system generated [Function Domains](/docs/products/functions/domains). When a function domain is generated, it will be `[UNIQUE_ID].[_APP_DOMAIN_FUNCTIONS]`. If `_APP_DOMAIN_FUNCTIONS` is set to `example.com` for example, the generated domain for functions will be something like `64d4d22db370ae41a32e.example.com`. You can use the same value as used for the Appwrite `_APP_DOMAIN` variable. |
| `_APP_DOMAIN_SITES` | This will be used for system generated [Site Domains](/docs/products/sites/domains). When a site domain is generated, it will be `[UNIQUE_ID].[_APP_DOMAIN_SITES]`. If `_APP_DOMAIN_SITES` is set to `example.com` for example, the generated domain for sites will be something like `64d4d22db370ae41a32e.example.com`. You can use the same value as used for the Appwrite `_APP_DOMAIN` variable. |
| `_APP_VCS_GITHUB_APP_NAME` | Name of your GitHub app. This is the display name you'll see on GitHub and it will be visible in your GitHub app's URL. |
| `_APP_VCS_GITHUB_PRIVATE_KEY` | RSA private key from GitHub wrapped with double quotes and newlines replaced with `\n`. You can generate private keys from GitHub application settings. |
| `_APP_VCS_GITHUB_APP_ID` | GitHub application ID. You can find it in your GitHub application details. |
| `_APP_VCS_GITHUB_CLIENT_ID` | GitHub client ID. You can find it in your GitHub application details. |
| `_APP_VCS_GITHUB_CLIENT_SECRET` | GitHub client secret. You can generate secrets in your GitHub application settings. |
| `_APP_VCS_GITHUB_WEBHOOK_SECRET` | GitHub webhook secret. You can configure it in your GitHub application settings under webhook section. |
For example, see below.
```bash
_APP_DOMAIN=appwrite.example.com
_APP_DOMAIN_TARGET=appwrite.example.com
_APP_DOMAIN_FUNCTIONS=functions.example.com
_APP_VCS_GITHUB_APP_NAME=my-github-app
_APP_VCS_GITHUB_PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\nMIIEogIBAAKCAQEAuT8f3lo/X83hfvb0ZN/KD2pl86o/jl3ywKrkj/PQZBmtEv/z\nIugE//sfFoHWc4cizkcji+n3FNU+GEdvMioKuJlPBqPTY8hAbVn7R0geZLpDV/rs\n[...]\n-----END RSA PRIVATE KEY-----"
_APP_VCS_GITHUB_APP_ID=12415
_APP_VCS_GITHUB_CLIENT_ID=Iv1.35asdf43asd
_APP_VCS_GITHUB_CLIENT_SECRET=35rsdse532q13
_APP_VCS_GITHUB_WEBHOOK_SECRET=super-secret
```
[Learn more about environment variables](/docs/advanced/self-hosting/environment-variables)
## Update existing GitHub apps {% #existing-apps %}
There are additional steps if you're updating permissions in existing GitHub apps.
Every time you update your GitHub app's permissions, GitHub will prompt you to review the changes.
You will receive an email and you'll find a prompt under **Settings** > **Integrations** > **Applications** > **Installed GitHub Apps** > find your GitHub app > **Configure**.
You need to accept the new permissions so they're applied to your app.

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@@ -13,6 +13,10 @@
import Poster from './(assets)/poster.png';
import PosterFutureAppwrite from './(assets)/posterFutureOfAppwrite.png';
import PosterDeploy from './(assets)/posterDeploy.png';
import PosterIndustryPanel from './(assets)/posterIndustryPanel.png';
import PosterNewImageFormats from './(assets)/posterNewImageFormats.png';
import PosterFileTokens from './(assets)/posterFileTokens.png';
import PosterClosingParty from './(assets)/eventClosingParty.png';
import Sites from './(assets)/illustrations/sites.svg';
import Flutter from './(assets)/illustrations/flutter.svg';
import Formats from './(assets)/illustrations/formats.svg';
@@ -132,16 +136,16 @@
illustration: Formats,
description:
'We have added support for two new image formats in Appwrite Storage: HEIC and AVIF. This will give you more tools to manage, manipulate, and serve images the way you need.',
url: '/blog/post/announcing-new-image-formats',
url: '/blog/post/new-image-formats-avif-heic',
content: [
{
title: 'How to use AVIF in Storage',
url: '/blog/pos/avif-in-storage',
title: 'Announcing HEIC and AVIF support: modern image formats now in Appwrite',
url: '/blog/post/new-image-formats-avif-heic',
type: 'Blog'
},
{
title: 'Improve your Appwrite developer experience with dev keys',
url: '/blog/post/developer-experience-dev-keys',
title: 'How to use AVIF in Storage',
url: '/blog/post/avif-in-storage',
type: 'Blog'
},
{
@@ -150,6 +154,19 @@
type: 'Docs',
label: 'Visit docs'
}
],
announcementVideo: {
url: 'https://www.youtube-nocookie.com/embed/2KAwVoJh8a8',
title: 'Announcement Video',
poster: PosterNewImageFormats
},
links: [
{
title: 'YouTube Live',
type: 'video',
poster: PosterIndustryPanel,
url: 'https://www.youtube.com/watch?v=PfnKyXo2k6o'
}
]
},
{
@@ -158,24 +175,37 @@
illustration: Tokens,
description:
'Introducing File Tokens. This feature lets you share files easily and securely, without modifying permissions or changing project access. Just generate a token and share the link.',
url: 'https://youtu.be/_XU1dftsQag',
url: 'https://www.youtube-nocookie.com/embed/eiwCCjBD3cw',
content: [
{
title: 'Serverless functions 101: best practices',
title: 'Announcing File Tokens: secure file sharing without the hassle',
url: '/blog/post/announcing-file-tokens',
type: 'Blog'
},
{
title: 'file tokens',
url: '/blog/post',
title: 'CSR vs SSG vs SSR: what they are and how to choose',
url: '/blog/post/csr-ssg-ssr',
type: 'Blog'
},
{
title: 'File Tokens',
url: '/docs/',
url: '/docs/products/storage/file-tokens',
type: 'Docs',
label: 'Visit docs'
}
],
announcementVideo: {
url: 'https://www.youtube-nocookie.com/embed/eiwCCjBD3cw',
title: 'Announcement Video',
poster: PosterFileTokens
},
links: [
{
title: 'YouTube Live',
type: 'video',
poster: PosterClosingParty,
url: 'https://www.youtube.com/watch?v=1gvjqV1nq-c?'
}
]
}
];

View File

@@ -1,13 +1,13 @@
<script lang="ts">
import { tick } from 'svelte';
import { page } from '$app/state';
import { Main } from '$lib/layouts';
import { TITLE_SUFFIX } from '$routes/titles';
import { DEFAULT_HOST } from '$lib/utils/metadata';
import { createDebounce } from '$lib/utils/debounce';
import { goto, onNavigate } from '$app/navigation';
import { page } from '$app/state';
import { Article, FooterNav, MainFooter } from '$lib/components';
import { Button } from '$lib/components/ui';
import { Main } from '$lib/layouts';
import { createDebounce } from '$lib/utils/debounce';
import { DEFAULT_HOST } from '$lib/utils/metadata';
import { TITLE_SUFFIX } from '$routes/titles';
import { tick } from 'svelte';
let { data } = $props();

View File

@@ -0,0 +1,11 @@
---
layout: author
name: Darshan Pandya
slug: darshan-pandya
role: Product Engineer
bio: Self-taught developer. Mobile apps. Wandering through code & curiosity.
avatar: /images/avatars/darshan.png
twitter: https://twitter.com/itznotabug
github: https://github.com/itznotabug
linkedin: https://www.linkedin.com/in/itznotabug
---

View File

@@ -0,0 +1,59 @@
---
layout: post
title: "Announcing File Tokens: secure file sharing without the hassle"
description: File Tokens make sharing files from Appwrite simple, secure, and hassle-free. Its the fastest way to collaborate externally without compromising control.
date: 2025-05-23
cover: /images/blog/file-tokens.png
timeToRead: 5
author: darshan-pandya
category: product
featured: false
---
Until now, sharing files from Appwrite often meant navigating permissions, managing access, or making files public, even when all you wanted was to send a file to someone outside your project. With Appwrite 1.7, we have introduced a new feature that will make file sharing a whole lot easier.
Introducing **File Tokens.**
This feature lets you share files easily and securely, without modifying permissions or changing project access. Just generate a token and share the link.
# Simplifying file access
Appwrite Storage has always made it easy to upload, store, and manage your files. But sharing them? That required extra steps.
With File Tokens, you can now share files with **anyone**, without needing to:
- Change file permissions
- Make files public
- Invite users to your project
Just create a token and send the link. The file is accessible; no account or permissions are needed.
# Important features
- **Secure token-based sharing**: Generate a token and share the file link instantly.
- **No permission changes required**: Keep your file rules intact—tokens work independently.
- **Configurable expiration**: Just like API Keys, File Tokens come with configurable expiration logic, giving you control over how long access is available.
- **Perfect for external collaboration**: Great for sharing assets, reports, or temporary resources with clients, teammates, or partners.
- **Works with Cloud and Self-hosted**: Full support across all Appwrite environments.
Everything happens through the Appwrite Console or API, and works seamlessly with your existing files.
# Why it matters
Today, sharing files externally means breaking your apps permission model or onboarding outside users. Thats not scalable, and it creates friction.
File Tokens fix this. They give you a simple, secure way to share files without reworking your setup or exposing your project to risk.
# Built for flexibility
File Tokens were designed for developers, teams, and organizations that need to **collaborate beyond their apps**. Whether youre sharing mockups with a client, logs with a teammate, or documents with a partner, File Tokens gives you a flexible and secure solution.
# How to get started
File Tokens are available now in your Appwrite Console. Pick a file, create a token, and share the generated link. [Visit the documentation](/docs/products/storage/file-tokens) to learn more.
# One link, no limits
You needed a better way to share files, and File Tokens deliver. Whether you collaborate with people outside your app or just want a faster way to get files into the right hands, this feature is for you. File Tokens work seamlessly with the preview, view, and download endpoints, making secure file access straightforward and flexible.
Try File Tokens today on **Appwrite Cloud** or in your **self-hosted** project.

View File

@@ -0,0 +1,192 @@
---
layout: post
title: How to use AVIF in Appwrite Storage
description: Learn how to use AVIF, a new image format that offers better compression without sacrificing image quality, in Appwrite Storage.
date: 2025-05-22
cover: /images/blog/avif-in-storage/cover.png
timeToRead: 6
author: ebenezer-don
category: tutorial
featured: false
---
Every web developer knows the struggle with image optimization. You want your images to look good, but large file sizes slow down your sites and hurt the user experience. JPEG and WebP have been popular choices for image compression, but they have limitations when it comes to achieving high compression without sacrificing image quality. AVIF offers a solution to this problem.
Built on the [AV1 video codec](https://en.wikipedia.org/wiki/AV1) by the Alliance for Open Media, it gives us much better compression without the quality loss we're used to seeing in highly compressed images.
Now that Appwrite supports [AVIF in Storage](/blog/post/new-image-formats-avif-heic), you can start using it in your projects. This matters because you can reduce image sizes by 50% or more compared to JPEG, while keeping the same visual quality. And for users with browsers that don't support AVIF yet, you can easily fall back to other formats.
Let's learn how AVIF works in Appwrite and look at some real implementation examples.
# What makes AVIF different?
AVIF brings several technical improvements to image compression:
- Achieves [better compression](https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Image_types) than JPEG and WebP while maintaining quality
- Preserves more image detail at similar file sizes
- Includes alpha channel for transparency
- Works with wide color gamut (supports both HDR and standard color ranges)
- Supports animations and image sequences
- Supported by major browsers including Chrome and Firefox
# Implementation in Appwrite
Appwrite's Storage service provides three main ways to work with AVIF:
- Direct AVIF file storage
- On-demand conversion from other formats
- Format-specific delivery based on browser support
Let's examine each approach in detail.
## Direct AVIF upload
You can upload AVIF images to Appwrite Storage just like any other supported image format.
Here's an example using the Web SDK:
```js
import { Client, Storage, ID } from "appwrite";
const client = new Client()
.setEndpoint('<https://cloud.appwrite.io/v1>')
.setProject('<PROJECT_ID>');
const storage = new Storage(client);
// Upload an AVIF file
const promise = storage.createFile(
'<BUCKET_ID>',
ID.unique(),
document.getElementById('uploader').files[0]
);
promise.then(function (response) {
console.log(response);
}, function (error) {
console.log(error);
});
```
This code handles file upload through a standard form input. The Storage service accepts AVIF files just like any other supported image format, with no special handling required at the upload stage.
## Converting images to AVIF
Appwrite's Storage service can convert your existing images to AVIF format on demand. This means you can transform JPEGs, PNGs, and other formats to AVIF without preprocessing them.
Here's how to implement the conversion:
```js
import { Client, Storage, ImageGravity, ImageFormat } from "appwrite";
const client = new Client()
.setEndpoint('<https://cloud.appwrite.io/v1>')
.setProject('<PROJECT_ID>');
const storage = new Storage(client);
const result = storage.getFilePreview(
'<BUCKET_ID>', // bucketId
'<FILE_ID>', // fileId
2000, // width
0, // height (maintain aspect ratio)
ImageGravity.Center, // gravity
100, // quality
0, // borderWidth
'', // borderColor
0, // borderRadius
1, // opacity
0, // rotation
'', // background
ImageFormat.Avif // output format
);
```
The quality parameter in getFilePreview ranges from 0-100. AVIF's compression algorithm processes different image types (photographs, illustrations, UI elements) with varying efficiency, so quality settings need to be tested for your specific use case.
The `ImageGravity` enum determines how images are cropped or positioned during resizing - `Center` maintains focus on the middle of the image.
The `ImageFormat` enum specifies the output format, with options including `Avif`, `Webp`, `Jpg`, and `Png`.
## Browser compatibility detection
To ensure the best experience for all users, you should check for AVIF support before serving AVIF images.
Here's a simple way to detect AVIF support:
```js
async function isAvifSupported() {
const avif = new Image();
return new Promise((resolve) => {
avif.onload = () => resolve(true);
avif.onerror = () => resolve(false);
avif.src = "data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAAB0AAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAIAAAACAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQ0MAAAAABNjb2xybmNseAACAAIAAYAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAACVtZGF0EgAKCBgANogQEAwgMg8f8D///8WfhwB8+ErK42A=";
});
}
// Usage
if (await isAvifSupported()) {
// Serve AVIF images
} else {
// Fallback to WebP or JPEG
}
```
This code tries to load a tiny base64-encoded AVIF image in the browser. If the image loads successfully (onload), the browser supports AVIF. If it fails to load (onerror), it means the browser can't decode AVIF images and we need to use a fallback format
## Implementing a format fallback
We can use the `isAvifSupported` function to implement progressive enhancement for image loading. This means using a baseline format (in this case, WebP) and using AVIF for browsers that support it.
Here's an example:
```js
const storage = new Storage(client);
async function getOptimizedImageUrl(bucketId, fileId) {
const format = await isAvifSupported() ? ImageFormat.Avif : ImageFormat.WebP;
return storage.getFilePreview(
bucketId,
fileId,
1200, // width
0, // height
'center', // gravity
90, // quality
0, // border width
'', // border color
0, // border radius
1, // opacity
0, // rotation
'', // background
format // output format
);
}
```
Notice that the format variable falls back to WebP if the browser doesn't support AVIF. I've used WebP because it's now widely supported. However, you can choose to fallback to JPEG for an even wider range of compatibility.
# Best practices for using AVIF in Appwrite Storage
When working with AVIF in Appwrite Storage, consider these best practices:
1. **Progressive enhancement**: Always implement fallbacks for browsers that don't support AVIF.
2. **Quality settings**: AVIF provides good quality even at lower settings. Start with a quality setting of 75-85 and adjust based on your needs.
3. **Responsive images**: Use appropriate image dimensions for different screen sizes to optimize bandwidth usage.
4. **Performance monitoring**: Monitor your application's performance metrics after implementing AVIF to ensure it provides the expected benefits.
5. **Lazy loading**: Consider implementing lazy loading for AVIF images to further optimize page load performance.
# Conclusion
AVIF support in Appwrite Storage is a practical way to make your apps faster without compromising on image quality. The code to implement it is straightforward, and the benefits are real - especially for image-heavy applications.
Start with a few test images, measure the results, and scale up from there. Your users will get faster load times, and you'll cut down on bandwidth costs.
For more details on handling images in Appwrite, check out the [Storage documentation](/docs/products/storage/quick-start).
# Further reading
- [How Appwrite streamlines database operations using hooks](/blog/post/hooks-appwrite-databases?doFollow=true)
- [5 VS Code extensions that replace entire development tools](/blog/post/5-vs-code-extensions-that-replace-entire-dev-tools?doFollow=true)
- [Budget caps: How to stop unexpected cloud bills before they happen](/blog/post/budget-caps-stop-unexpected-cloud-bills?doFollow=true)

View File

@@ -75,7 +75,7 @@ Installing a self-hosted version of Appwrite is pretty straight-forward, all you
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \
--entrypoint="install" \
appwrite/appwrite:1.6.2
appwrite/appwrite:1.7.4
```
For one-click setups, check out the [installation docs](https://appwrite.io/docs/self-hosting).

View File

@@ -132,7 +132,7 @@ Once your site is deployed, you can continue to customize it, link it to a custo
# More resources
- [Appwrite Sites docs](/docs/producst/sites)
- [Appwrite Sites docs](/docs/products/sites)
- [Appwrite compared to Vercel](/blog/post/open-source-vercel-alternative)
- [Appwrite Sites product tour](https://youtu.be/VtDe6hDw91k)
- [Appwrite Sites video announcement](https://youtu.be/0cERQxFjTW4)

View File

@@ -42,7 +42,7 @@ docker run -it --rm \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \
--entrypoint="install" \
appwrite/appwrite:1.6.2
appwrite/appwrite:1.7.4
```
Once that is done, [set up email delivery](https://appwrite.io/docs/advanced/self-hosting/email) on your self-hosted Appwrite instance. This can be done by visiting your `appwrite` directory and updating the `.env` file in a similar manner as follows:

View File

@@ -0,0 +1,79 @@
---
layout: post
title: Free Angular hosting with Appwrite Sites - Simplified deployment and scalability
description: Learn how to deploy your Angular app for free with Appwrite Sites.
date: 2025-05-20
cover: /images/blog/free-angular-hosting/cover.png
timeToRead: 6
author: eldad-fux
category: tutorial
unlisted: true
---
Angular remains a top choice for building scalable and dynamic web applications, offering a robust framework with powerful tooling for both client-side and server-side rendering. While deploying Angular applications can be straightforward, finding a hosting solution that combines affordability, security, and developer-centric features can be challenging.
[Appwrite Sites](https://appwrite.io/products/sites) provides a seamless hosting solution tailored for modern web applications, including Angular, with built-in performance optimizations, security features, and workflow integrations. This article highlights how Appwrite Sites streamlines Angular deployments, enhances development workflows, and stacks up against other hosting services.
# Why Appwrite Sites is a great choice for Angular developers
## 1. Free hosting with no upfront investment
Budget constraints can be a major factor for individual developers and startups. Appwrite Sites removes this hurdle by offering free hosting, allowing teams to build, test, and iterate without worrying about costs. As your project scales, Appwrite provides a seamless upgrade path to accommodate growing needs.
## 2. Supports both static and dynamic rendering
Angular applications can be built as static sites or dynamically rendered apps using Angular Universal. Appwrite Sites supports both approaches, ensuring fast global content delivery for static assets while enabling server-side rendering (SSR) through **Appwrite Functions** for dynamic applications. This makes it an ideal solution for everything from single-page applications (SPAs) to enterprise-grade web platforms.
## 3. Performance-driven global CDN
Speed is essential for modern applications, impacting both user experience and SEO. Appwrite Sites leverages a globally distributed [Content Delivery Network (CDN)](https://appwrite.io/docs/products/network/cdn) to serve assets efficiently, reducing latency and ensuring fast load times regardless of user location.
## 4. Built-in security and DDoS protection
Security is a top priority when deploying web applications. Appwrite Sites includes [DDoS protection](https://appwrite.io/docs/products/network/ddos), mitigating malicious traffic to keep your site online. Additionally, it offers **custom domain support with automatic SSL encryption**, ensuring secure connections and user data protection without requiring extra configuration.
## 5. Preview deployments for seamless collaboration
Every update pushed to Appwrite Sites generates a **deployment preview link**, allowing teams to review changes in a staging environment before releasing them to production. This feature simplifies collaboration and helps ensure quality assurance before updates go live.
## 6. Flexible deployment options
Appwrite Sites makes it easy to deploy Angular applications with multiple methods:
- [Git-based deployments](https://appwrite.io/docs/products/sites/deploy-from-git): Push updates directly from a connected repository.
- **CLI-based deployment**: Deploy manually in seconds using the Appwrite CLI:
```bash
appwrite deploy site
```
- **Manual file uploads**: Drag and drop your build files directly in the Appwrite Console.
For new users, Appwrite provides **starter templates** and example projects, making it easier to get up and running quickly.
## 7. Integrated backend services for full-stack Angular applications
Many Angular applications require authentication, databases, and backend functions. Appwrite Sites integrates seamlessly with **Appwrite Auth**, **Appwrite Databases**, and **Appwrite Functions**, enabling developers to build full-stack applications without relying on third-party backend providers.
# How Appwrite Sites compares to other hosting platforms
| Feature | Appwrite Sites | Vercel | Netlify |
| --- | --- | --- | --- |
| Free hosting | Yes | Yes | Yes |
| Static site support | Yes | Yes | Yes |
| SSR support | Yes | Yes | Yes |
| Global CDN | Yes | Yes | Yes |
| DDoS protection | Yes | Yes | Yes |
| Deployment previews | Yes | Yes | Yes |
| Custom domains | Yes | Yes | Yes |
| Authentication | Appwrite Auth | No | Deprecated |
| Database | Appwrite Databases | No Third-party | No Third-party |
| Serverless functions | Appwrite Functions | Cloudflare workers | AWS Lambda |
| Storage | Appwrite Storage | Cloudflare R2 | No |
| Cloud messaging | Appwrite Messaging | No | No |
| Realtime database | Appwrite Realtime | No | No |
Unlike other platforms that rely on external integrations for authentication, databases, and backend logic, Appwrite Sites offers a unified ecosystem, reducing complexity and improving performance.
For Angular developers seeking a cost-effective, high-performance hosting solution with built-in backend services, Appwrite Sites is an excellent choice. Explore more with our [Angular Quick Start Guide](https://appwrite.io/docs/quick-starts/angular) and start deploying your Angular applications by visiting [Appwrite Sites](https://appwrite.io/sites).

View File

@@ -0,0 +1,79 @@
---
layout: post
title: Free Astro hosting with Appwrite Sites - Deploy effortlessly
description: Learn how to deploy your Astro app for free with Appwrite Sites.
date: 2025-05-20
cover: /images/blog/free-astro-hosting/cover.png
timeToRead: 6
author: eldad-fux
category: tutorial
unlisted: true
---
Astro has emerged as a powerful framework for building ultra-fast, content-driven websites by leveraging its hybrid rendering approach and optimized build process. While deploying Astro applications is straightforward, finding a hosting platform that balances cost, scalability, and developer-friendly features can be challenging.
[Appwrite Sites](https://appwrite.io/products/sites) offers a tailored hosting solution for modern web applications, including Astro, with built-in performance, security, and collaboration enhancements. This article explores how Appwrite Sites simplifies deployment, integrates with Astro's capabilities, and compares to other hosting options.
# Why Appwrite Sites is an ideal fit for Astro
## 1. Free hosting with no upfront costs
For developers and small teams, keeping hosting expenses low is important. Appwrite Sites provides free hosting, eliminating financial barriers while ensuring a high-performance infrastructure. This allows you to focus on building and refining your application without worrying about costs as you scale.
## 2. Optimized for static and hybrid rendering
Astro shines with its ability to generate highly optimized static sites while enabling selective hydration for dynamic elements. Appwrite Sites fully supports static exports, ensuring your site benefits from fast, globally cached delivery. Additionally, **Appwrite Functions** can extend Astro's capabilities by adding dynamic backend functionality where necessary.
## 3. Performance-boosting global CDN
Speed is a key factor in both user experience and SEO. Appwrite Sites uses a globally distributed [Content Delivery Network (CDN)](https://appwrite.io/docs/products/network/cdn) to efficiently cache and serve your static assets. This results in reduced latency, faster page loads, and improved site performance across all regions.
## 4. Security-first hosting with built-in DDoS protection
As websites grow, security risks increase. Appwrite Sites comes with [DDoS protection](https://appwrite.io/docs/products/network/ddos), ensuring your application remains online by detecting and mitigating malicious traffic. Additionally, it includes **custom domain management** with automatic SSL encryption, securing your site with minimal setup.
## 5. Preview deployments for streamlined collaboration
Appwrite Sites makes team collaboration easier by generating **deployment preview links** for every update. These previews allow you to test and review changes before going live, providing a seamless workflow for developers and stakeholders to verify updates in a staging environment.
## 6. Flexible deployment options
Deploying an Astro application with Appwrite Sites is straightforward, offering multiple methods to suit different workflows:
- [Git-based deployments](https://appwrite.io/docs/products/sites/deploy-from-git): Automatically push updates from your repository's main branch.
- **CLI-based deployment**: Deploy manually with a single command:
```bash
appwrite deploy site
```
- **Manual file uploads**: Upload static files directly through the Appwrite Console.
For new users, Appwrite provides **starter templates** and example projects, making it easy to get started with minimal configuration.
## 7. Integrated backend services for enhanced functionality
While Astro focuses on static site generation, many projects require authentication, databases, and serverless functions. Appwrite Sites seamlessly integrates with **Appwrite Auth**, **Appwrite Databases**, and **Appwrite Functions**, eliminating the need for third-party backend services and streamlining development.
# How Appwrite Sites compares to other hosting platforms
| Feature | Appwrite Sites | Vercel | Netlify |
| --- | --- | --- | --- |
| Free hosting | Yes | Yes | Yes |
| Static site support | Yes | Yes | Yes |
| Hybrid rendering | Yes | Yes | Yes |
| Global CDN | Yes | Yes | Yes |
| DDoS protection | Yes | Yes | Yes |
| Deployment previews | Yes | Yes | Yes |
| Custom domains | Yes | Yes | Yes |
| Authentication | Appwrite Auth | No | Deprecated |
| Database | Appwrite Databases | No third-party | No third-party |
| Serverless functions | Appwrite Functions | Cloudflare workers | AWS Lambda |
| Storage | Appwrite Storage | Cloudflare R2 | No |
| Cloud messaging | Appwrite Messaging | No | No |
| Realtime database | Appwrite Realtime | No | No |
Unlike other hosting solutions that require third-party integrations for backend features, Appwrite Sites provides an all-in-one ecosystem with built-in authentication, databases, and serverless functions.
For developers seeking a hassle-free hosting solution that simplifies deployment and minimizes dependencies, Appwrite Sites is a compelling option. Explore more with our [Astro Quick Start Guide](https://appwrite.io/docs/quick-starts/astro) and start deploying your Astro applications by visiting [Appwrite Sites](https://appwrite.io/sites).

View File

@@ -0,0 +1,78 @@
---
layout: post
title: Free Flutter Web hosting with Appwrite Sites - Deploy and scale seamlessly
description: Learn how to deploy your Flutter app for free with Appwrite Sites.
date: 2025-05-20
cover: /images/blog/free-flutter-web-hosting/cover.png
timeToRead: 6
author: eldad-fux
category: tutorial
unlisted: true
---
Flutter for Web allows developers to build rich, interactive web applications using the same Dart codebase as their mobile apps. However, finding a hosting platform that supports Flutter's web-optimized build while providing a cost-effective, scalable, and developer-friendly solution can be a challenge.
[Appwrite Sites](https://appwrite.io/products/sites) offers an easy-to-use hosting solution tailored for modern web applications, including Flutter Web, with built-in performance optimizations, security features, and workflow integrations. This article explores how Appwrite Sites simplifies Flutter Web deployment, enhances performance, and compares to other hosting solutions.
# Why Appwrite Sites is a great choice for Flutter Web developers
## 1. Free hosting with no initial costs
For independent developers and startups, hosting expenses can be a concern. Appwrite Sites removes this barrier by offering free hosting, allowing you to test, iterate, and launch applications without upfront investment. As your project scales, you can seamlessly upgrade to meet growing demands.
## 2. Optimized for Flutter's web architecture
Flutter Web applications rely on a unique rendering model that outputs HTML, CSS, and JavaScript while maintaining a pixel-perfect UI. Appwrite Sites ensures fast performance, efficient asset delivery, and seamless rendering, making it an ideal choice for hosting Flutter-based web applications.
## 3. Global CDN for improved performance
Performance plays a crucial role in user experience and SEO rankings. Appwrite Sites leverages a globally distributed [Content Delivery Network (CDN)](https://appwrite.io/docs/products/network/cdn) to cache and serve your application's static assets efficiently, reducing latency and improving load times across different regions.
## 4. Built-in security and DDoS protection
Security is critical when hosting production applications. Appwrite Sites provides [DDoS protection](https://appwrite.io/docs/products/network/ddos), preventing malicious traffic from affecting your app's availability. Additionally, it offers **custom domain support with automatic SSL encryption**, ensuring secure communication between users and your application.
## 5. Preview deployments for better collaboration
Every deployment on Appwrite Sites generates a **preview link**, enabling teams to review changes before publishing them to production. This feature streamlines the development process by allowing testing and validation in a staging environment before going live.
## 6. Multiple deployment options
Appwrite Sites provides flexible deployment workflows for Flutter Web applications:
- [Git-based deployments](https://appwrite.io/docs/products/sites/deploy-from-git): Connect your repository to automatically deploy updates with every push.
- **CLI-based deployment**: Deploy manually with a single command:
```bash
appwrite deploy site
```
- **Manual file uploads**: Upload your compiled Flutter Web build directly via the Appwrite Console.
For new users, Appwrite also provides **starter templates** and example projects, making it easy to get up and running with minimal setup.
## 7. Integrated backend services for full-stack Flutter applications
Many Flutter applications require backend features like authentication, databases, and server-side logic. Appwrite Sites seamlessly integrates with **Appwrite Auth**, **Appwrite Databases**, and **Appwrite Functions**, eliminating the need for third-party services and simplifying full-stack development.
# How Appwrite Sites compares to other hosting solutions
| Feature | Appwrite Sites | Firebase Hosting | Netlify |
| --- | --- | --- | --- |
| Free hosting | Yes | Yes | Yes |
| Optimized for Flutter Web | Yes | Yes | No |
| Global CDN | Yes | Yes | Yes |
| DDoS protection | Yes | Yes | Yes |
| Deployment previews | Yes | No | Yes |
| Custom domains | Yes | Yes | Yes |
| Authentication | Appwrite Auth | Firebase Auth | No |
| Database | Appwrite Databases | Firestore | No Third-party |
| Serverless functions | Appwrite Functions | Cloud Functions | AWS Lambda |
| Storage | Appwrite Storage | Firebase Storage | No |
| Cloud messaging | Appwrite Messaging | Firebase Messaging | No |
| Realtime database | Appwrite Realtime | Firestore | No |
Unlike Firebase and Netlify, Appwrite Sites provides an all-in-one solution with backend services, reducing the need for multiple integrations. It is designed to work seamlessly with Flutter Web applications, offering optimized performance and security while maintaining a simple deployment process.
For developers looking for an efficient, high-performance hosting solution tailored for Flutter Web, Appwrite Sites is a great option. Explore more with our [Flutter Quick Start Guide](https://appwrite.io/docs/quick-starts/flutter) and start deploying your Flutter Web applications by visiting [Appwrite Sites](https://appwrite.io/sites).

View File

@@ -0,0 +1,79 @@
---
layout: post
title: Free Next.js hosting with Appwrite Sites - Deploy and scale with ease
description: Learn how to deploy your Next.js app for free with Appwrite Sites.
date: 2025-05-20
cover: /images/blog/free-nextjs-hosting/cover.png
timeToRead: 6
author: eldad-fux
category: tutorial
unlisted: true
---
Next.js is widely adopted for building modern web applications due to its ability to handle server-side rendering (SSR), static site generation (SSG), and API routes efficiently. While deploying Next.js applications can be straightforward, finding a reliable and cost-effective hosting solution with built-in scalability and developer-friendly features can be challenging.
[Appwrite Sites](https://appwrite.io/products/sites) provides a hosting environment tailored for modern web applications, including Next.js, with built-in features designed to optimize performance, security, and collaboration. This article explores how Appwrite Sites enhances the deployment process, integrates with Next.js capabilities, and compares to other hosting solutions.
# How Appwrite Sites enhances Next.js deployments
## 1. Hosting without cost barriers
Hosting costs can be a deciding factor for individual developers and startups. Appwrite Sites offers free hosting, removing an initial financial barrier while maintaining a robust infrastructure. This allows developers to test, iterate, and deploy applications without worrying about upfront expenses while providing a scalable pathway for growing projects and grow as they require.
## 2. Optimized for static and server-side rendering (SSR)
Next.js supports multiple rendering strategies, including SSR and SSG. Appwrite Sites accommodates both, ensuring that static sites benefit from global caching while SSR applications can dynamically generate content as needed. This flexibility enables use cases ranging from blogs and documentation sites to complex web applications requiring real-time content updates. Additionally, Appwrite's **serverless functions** can be used to enhance SSR applications with dynamic capabilities.
## 3. Performance-driven global CDN
Application speed significantly impacts user experience and search engine rankings. Appwrite Sites uses a globally distributed [Content Delivery Network (CDN)](https://appwrite.io/docs/products/network/cdn) to cache and serve static assets efficiently. This setup reduces latency and improves load times, ensuring applications perform optimally regardless of the user's location.
## 4. Built-in DDoS protection and security
Security is a critical concern for web applications, especially as they scale. Appwrite Sites includes built-in [DDoS protection](https://appwrite.io/docs/products/network/ddos), safeguarding applications from denial-of-service attacks by automatically detecting and mitigating malicious traffic. This ensures uptime and stability without requiring additional security configurations from developers. Additionally, Appwrite Sites integrates **custom domain management**, allowing users to host applications on their own domains with SSL encryption included.
## 5. Deployment previews for enhanced collaboration
Appwrite Sites integrates into your development workflow by generating **deployment preview links** for every update. These previews allow you to share changes with your team before pushing to production, improving collaboration and ensuring quality control throughout the development process. This makes it easier to review and test features in staging environments before releasing them to users.
## 6. Multiple deployment options
Appwrite Sites provides multiple ways to deploy your Next.js application:
- [Git integration](https://appwrite.io/docs/products/sites/deploy-from-git): Connect a Git repository to automatically deploy changes when you push to your main branch.
- **CLI deployment**: Use the Appwrite CLI to deploy manually with a single command:
```bash
appwrite deploy site
```
- **Manual deployment**: Upload your static files directly via the Appwrite Console.
Additionally, Appwrite provides a set of **starter templates** and example projects to help you get started when you sign up for **Appwrite Cloud**, allowing developers to quickly bootstrap their applications with minimal configuration.
## 7. Integrated backend services for dynamic applications
Many Next.js applications rely on authentication, databases, and cloud functions. Appwrite Sites integrates natively with Appwrite's backend services, enabling seamless authentication (via Appwrite Auth), database management, and function execution without requiring external third-party services. This reduces dependencies and simplifies backend configuration, making it easier to build full-stack applications.
# How Appwrite Sites compares to other hosting platforms
| Feature | Appwrite Sites | Vercel | Netlify |
| --- | --- | --- | --- |
| Free hosting | Yes | Yes | Yes |
| Static exports | Yes | Yes | Yes |
| SSR support | Yes | Yes | Yes |
| Global CDN | Yes | Yes | Yes |
| DDoS protection | Yes | Yes | Yes |
| Deployment previews | Yes | Yes | Yes |
| Custom domains | Yes | Yes | Yes |
| Authentication | Appwrite Auth | No | Deprecated |
| Database | Appwrite Databases | No third-party | No third-party |
| Serverless functions | Appwrite Functions | Cloudflare workers | AWS Lambda |
| Storage | Appwrite Storage | Cloudflare R2 | No |
| Cloud messaging | Appwrite Messaging | No | No |
| Realtime database | Appwrite Realtime | No | No |
Unlike other solutions that rely on third-party integrations for authentication, databases, or serverless functions, Appwrite Sites provides these natively, reducing reliance on external services and ensuring better integration within a unified ecosystem.
For developers exploring an end-to-end solution that minimizes external dependencies while optimizing performance, Appwrite Sites presents a practical option. Explore more with our [Next.js Quick Start Guide](https://appwrite.io/docs/quick-starts/nextjs) and start deploying your Next.js applications by visiting [Appwrite Sites](https://appwrite.io/sites).

View File

@@ -0,0 +1,84 @@
---
layout: post
title: Free Nuxt hosting with Appwrite Sites - Deploy and scale effortlessly
description: Learn how to deploy your Nuxt app for free with Appwrite Sites.
date: 2025-05-20
cover: /images/blog/free-nuxt-hosting/cover.png
timeToRead: 6
author: eldad-fux
category: tutorial
unlisted: true
---
Nuxt.js is a powerful framework built on Vue.js that simplifies the development of modern web applications with features like server-side rendering (SSR), static site generation (SSG), and API integrations. While deploying Nuxt applications can be straightforward, selecting the right hosting provider that balances cost, performance, and ease of use can be challenging.
[Appwrite Sites](https://appwrite.io/products/sites) provides an optimized hosting environment tailored for modern web applications, including Nuxt, with built-in tools for security, scalability, and developer-friendly deployment workflows. This article explores how Appwrite Sites simplifies Nuxt hosting, enhances performance, and compares with other solutions.
# Why Appwrite Sites is the perfect hosting solution for Nuxt
## 1. Free hosting with no upfront costs
For developers and startups, hosting expenses can be a concern. Appwrite Sites provides free hosting, allowing developers to test, iterate, and launch their Nuxt applications without financial barriers. As your project scales, Appwrite offers seamless upgrade options to accommodate growing traffic and resources.
## 2. Supports static and server-side rendered Nuxt applications
Nuxt's flexibility allows developers to generate fully static sites or use SSR for dynamic applications. Appwrite Sites supports both models:
- **Static Generation (SSG)**: Pre-render pages at build time for fast, cached delivery.
- **Server-Side Rendering (SSR)**: Leverage **Appwrite Functions** to handle server-side logic, dynamic API calls, and real-time data rendering.
This flexibility ensures that Nuxt applications of any complexity can be hosted efficiently on Appwrite Sites.
## 3. Global CDN for fast performance
Performance plays a key role in user experience and SEO. Appwrite Sites uses a globally distributed [Content Delivery Network (CDN)](https://appwrite.io/docs/products/network/cdn) to cache and serve Nuxt applications efficiently. This reduces latency and ensures optimal performance for users across different locations.
## 4. Built-in security and DDoS protection
Security is a major concern when deploying web applications. Appwrite Sites includes [DDoS protection](https://appwrite.io/docs/products/network/ddos), safeguarding your Nuxt app from malicious traffic and potential downtime. Additionally, it offers **custom domain management with automatic SSL encryption**, ensuring secure communication between users and your application.
## 5. Preview deployments for improved collaboration
Appwrite Sites generates **deployment preview links** for every update, enabling teams to review and test changes in a staging environment before pushing them to production. This workflow enhances collaboration, making it easier to validate updates before they go live.
## 6. Multiple deployment options
Deploying a Nuxt application on Appwrite Sites is simple and flexible:
- [Git-based deployments](https://appwrite.io/docs/products/sites/deploy-from-git): Automatically deploy changes when you push to your repository.
- **CLI-based deployment**: Deploy manually using the Appwrite CLI:
```bash
appwrite deploy site
```
- **Manual file uploads**: Upload static files directly through the Appwrite Console.
Additionally, Appwrite provides **starter templates** to help developers get up and running quickly with minimal setup.
## 7. Integrated backend services for full-stack Nuxt applications
Nuxt applications often require authentication, databases, and server-side logic. Appwrite Sites seamlessly integrates with **Appwrite Auth**, **Appwrite Databases**, and **Appwrite Functions**, eliminating the need for third-party backend services and simplifying full-stack development.
# How Appwrite Sites compares to other hosting platforms
| Feature | Appwrite Sites | Vercel | Netlify |
| --- | --- | --- | --- |
| Free hosting | Yes | Yes | Yes |
| Static site support | Yes | Yes | Yes |
| SSR support | Yes | Yes | Yes |
| Global CDN | Yes | Yes | Yes |
| DDoS protection | Yes | Yes | Yes |
| Deployment previews | Yes | Yes | Yes |
| Custom domains | Yes | Yes | Yes |
| Authentication | Appwrite Auth | No | No |
| Database | Appwrite Databases | No Third-party | No Third-party |
| Serverless functions | Appwrite Functions | Cloudflare workers | AWS Lambda |
| Storage | Appwrite Storage | Cloudflare R2 | No |
| Cloud messaging | Appwrite Messaging | No | No |
| Realtime database | Appwrite Realtime | No | No |
Unlike other hosting providers that require third-party integrations for backend services, Appwrite Sites offers an all-in-one platform with built-in authentication, databases, and serverless functions, making deployment and management easier.
For developers seeking an efficient, high-performance hosting solution optimized for Nuxt applications, Appwrite Sites is an excellent choice. Explore more with our [Nuxt Quick Start Guide](https://appwrite.io/docs/quick-starts/nuxt) and start deploying your Nuxt applications by visiting [Appwrite Sites](https://appwrite.io/sites).

View File

@@ -0,0 +1,79 @@
---
layout: post
title: Free React hosting with Appwrite Sites - Deploy and scale effortlessly
description: Learn how to deploy your React app for free with Appwrite Sites.
date: 2025-05-20
cover: /images/blog/free-react-hosting/cover.png
timeToRead: 6
author: eldad-fux
category: tutorial
unlisted: true
---
React is one of the most popular JavaScript libraries for building dynamic, interactive web applications. While deploying React apps is generally straightforward, choosing the right hosting platform that balances cost, performance, and developer-friendly features can be a challenge.
[Appwrite Sites](https://appwrite.io/products/sites) provides an optimized hosting environment tailored for modern web applications, including React, with built-in features that enhance performance, security, and deployment workflows. This article explores how Appwrite Sites simplifies React deployment, improves efficiency, and compares with other hosting solutions.
# Why Appwrite Sites is an excellent choice for React developers
## 1. Free hosting with no upfront costs
For developers and small teams, minimizing hosting expenses is essential. Appwrite Sites offers free hosting, removing financial barriers while ensuring a robust infrastructure. As projects grow, Appwrite provides an easy upgrade path to accommodate increased demands.
## 2. Optimized for static and dynamic React apps
React applications can be built as fully static sites or dynamically rendered apps using frameworks like Next.js. Appwrite Sites supports both approaches, allowing static exports to leverage global caching while enabling server-side functionality through **Appwrite Functions**, making it easy to add API endpoints or dynamic content generation.
## 3. Performance-focused global CDN
Application speed significantly impacts user experience and SEO. Appwrite Sites leverages a globally distributed [Content Delivery Network (CDN)](https://appwrite.io/docs/products/network/cdn) to ensure React apps load quickly, reduce latency, and deliver a smooth browsing experience worldwide.
## 4. Built-in security and DDoS protection
Security is a crucial consideration for production applications. Appwrite Sites includes [DDoS protection](https://appwrite.io/docs/products/network/ddos), preventing attacks that could compromise your app's availability. Additionally, it offers **custom domain support with automatic SSL encryption**, ensuring secure communication with users.
## 5. Preview deployments for seamless collaboration
Every deployment on Appwrite Sites generates a **preview link**, making it easy to share, review, and test changes before pushing them to production. This workflow simplifies collaboration and enhances the quality assurance process.
## 6. Multiple deployment options
Appwrite Sites provides several flexible methods for deploying React applications:
- [Git-based deployments](https://appwrite.io/docs/products/sites/deploy-from-git): Automatically deploy updates when changes are pushed to the main branch.
- **CLI-based deployment**: Deploy manually with a simple command:
```bash
appwrite deploy site
```
- **Manual file uploads**: Upload static assets directly via the Appwrite Console.
Additionally, Appwrite provides **starter templates** and example projects to help developers get up and running with minimal setup.
## 7. Integrated backend services for full-stack React applications
Many React applications require authentication, databases, and serverless functions. Appwrite Sites seamlessly integrates with **Appwrite Auth**, **Appwrite Databases**, and **Appwrite Functions**, enabling developers to build full-stack applications without relying on third-party services.
# How Appwrite Sites compares to other hosting platforms
| Feature | Appwrite Sites | Vercel | Netlify |
| --- | --- | --- | --- |
| Free hosting | Yes | Yes | Yes |
| Static site support | Yes | Yes | Yes |
| SSR support (via Functions) | Yes | Yes | Yes |
| Global CDN | Yes | Yes | Yes |
| DDoS protection | Yes | Yes | Yes |
| Deployment previews | Yes | Yes | Yes |
| Custom domains | Yes | Yes | Yes |
| Authentication | Appwrite Auth | No | Deprecated |
| Database | Appwrite Databases | No Third-party | No Third-party |
| Serverless functions | Appwrite Functions | Cloudflare workers | AWS Lambda |
| Storage | Appwrite Storage | Cloudflare R2 | No |
| Cloud messaging | Appwrite Messaging | No | No |
| Realtime database | Appwrite Realtime | No | No |
Unlike other hosting solutions that depend on third-party integrations for backend functionality, Appwrite Sites provides an all-in-one solution with built-in authentication, databases, and serverless functions, reducing complexity and improving performance.
For developers looking for a hassle-free, high-performance hosting solution tailored for React applications, Appwrite Sites is an excellent choice. Explore more with our [React Quick Start Guide](https://appwrite.io/docs/quick-starts/react) and start deploying your React apps by visiting [Appwrite Sites](https://appwrite.io/sites).

View File

@@ -0,0 +1,79 @@
---
layout: post
title: Free React Native for Web hosting with Appwrite Sites - Simplified deployment and scalability
description: Learn how to deploy your React Native app for free with Appwrite Sites.
date: 2025-05-20
cover: /images/blog/free-react-native-hosting/cover.png
timeToRead: 6
author: eldad-fux
category: tutorial
unlisted: true
---
React Native for Web enables developers to build cross-platform applications using a single codebase, allowing React Native apps to run seamlessly on web browsers. While this provides a powerful way to extend mobile applications to the web, finding a hosting solution that is cost-effective, scalable, and optimized for React Native for Web can be challenging.
[Appwrite Sites](https://appwrite.io/products/sites) offers a dedicated hosting platform for modern web applications, including React Native for Web, with built-in features that optimize performance, security, and developer workflows. This article explores how Appwrite Sites enhances the deployment process, integrates with React Native for Web's architecture, and compares with other hosting solutions.
# Why Appwrite Sites is an ideal choice for React Native for Web
## 1. Free hosting with no upfront costs
For startups and independent developers, hosting costs can be a major concern. Appwrite Sites provides free hosting, eliminating financial barriers while maintaining high performance. As your project scales, Appwrite allows you to upgrade seamlessly without any downtime.
## 2. Optimized for web-based React Native applications
React Native for Web brings mobile-style components and layouts to the browser. Appwrite Sites ensures smooth rendering, asset optimization, and fast content delivery, making it an ideal fit for applications that rely on React Native's component-driven architecture.
## 3. Performance-enhancing global CDN
Speed is critical for both user experience and SEO rankings. Appwrite Sites uses a globally distributed [Content Delivery Network (CDN)](https://appwrite.io/docs/products/network/cdn) to cache and serve assets efficiently, reducing latency and ensuring optimal performance no matter where users are located.
## 4. Built-in security and DDoS protection
Security is a top priority for web applications. Appwrite Sites includes [DDoS protection](https://appwrite.io/docs/products/network/ddos), safeguarding applications from denial-of-service attacks by mitigating malicious traffic. Additionally, it provides **custom domain support with automatic SSL encryption**, ensuring a secure browsing experience for users.
## 5. Preview deployments for smoother collaboration
Every update to your site generates a **deployment preview link**, making it easy to review changes before going live. This feature streamlines development workflows, allowing developers and stakeholders to verify updates in a staging environment before deploying to production.
## 6. Flexible deployment methods
Appwrite Sites provides multiple ways to deploy your React Native for Web application:
- [Git-based deployments](https://appwrite.io/docs/products/sites/deploy-from-git): Automatically deploy updates when pushing changes to your repository.
- **CLI-based deployment**: Deploy manually with a single command:
```bash
appwrite deploy site
```
- **Manual file uploads**: Upload your compiled build files directly through the Appwrite Console.
Appwrite also provides **starter templates** and example projects to help developers get up and running quickly with minimal configuration.
## 7. Integrated backend services for full-stack React Native applications
Many React Native for Web applications require authentication, databases, and cloud functions. Appwrite Sites seamlessly integrates with **Appwrite Auth**, **Appwrite Databases**, and **Appwrite Functions**, eliminating the need for third-party backend providers and streamlining development.
# How Appwrite Sites compares to other hosting platforms
| Feature | Appwrite Sites | Vercel | Netlify |
| --- | --- | --- | --- |
| Free hosting | Yes | Yes | Yes |
| Static site support | Yes | Yes | Yes |
| Web-optimized React Native | Yes | Yes | Yes |
| Global CDN | Yes | Yes | Yes |
| DDoS protection | Yes | Yes | Yes |
| Deployment previews | Yes | Yes | Yes |
| Custom domains | Yes | Yes | Yes |
| Authentication | Appwrite Auth | No | Deprecated |
| Database | Appwrite Databases | No Third-party | No Third-party |
| Serverless functions | Appwrite Functions | Cloudflare workers | AWS Lambda |
| Storage | Appwrite Storage | Cloudflare R2 | No |
| Cloud messaging | Appwrite Messaging | No | No |
| Realtime database | Appwrite Realtime | No | No |
Unlike other hosting solutions that require third-party integrations for backend features, Appwrite Sites provides an all-in-one ecosystem with built-in authentication, databases, and serverless functions, reducing complexity and ensuring seamless integration.
For developers looking for a streamlined hosting solution that simplifies deployment and minimizes external dependencies, Appwrite Sites is an excellent choice. Explore more with our [React Native Quick Start Guide](https://appwrite.io/docs/quick-starts/react-native) and start deploying your React Native for Web applications by visiting [Appwrite Sites](https://appwrite.io/sites).

View File

@@ -0,0 +1,84 @@
---
layout: post
title: Free Remix hosting with Appwrite Sites - Deploy and scale seamlessly
description: Learn how to deploy your Remix app for free with Appwrite Sites.
date: 2025-05-20
cover: /images/blog/free-remix-hosting/cover.png
timeToRead: 6
author: eldad-fux
category: tutorial
unlisted: true
---
Remix is a modern full-stack web framework designed to optimize user experience through server-side rendering (SSR), progressive enhancement, and efficient data loading. While deploying Remix applications is straightforward, finding a hosting platform that balances cost, performance, and developer-friendly features can be challenging.
[Appwrite Sites](https://appwrite.io/products/sites) provides an optimized hosting solution tailored for modern web applications, including Remix, with built-in tools for security, scalability, and flexible deployment workflows. This article explores how Appwrite Sites enhances Remix hosting, simplifies development, and compares to other hosting providers.
# Why Appwrite Sites is a great hosting solution for Remix
## 1. Free hosting with no upfront costs
For independent developers and startups, keeping hosting expenses low is essential. Appwrite Sites offers free hosting, removing financial barriers while providing a scalable infrastructure. As your application grows, Appwrite ensures a smooth upgrade path to meet increasing traffic demands.
## 2. Full support for static and server-side Remix applications
Remix enables both static and server-side rendering, making it suitable for various use cases. Appwrite Sites supports:
- **Static exports**: Deliver pre-rendered pages with global caching for instant load times.
- **Server-side rendering (SSR)**: Use **Appwrite Functions** to handle API requests, server-side data fetching, and real-time updates seamlessly.
This flexibility makes Appwrite Sites a powerful hosting option for any Remix application.
## 3. Performance-focused global CDN
Speed plays a crucial role in user engagement and SEO rankings. Appwrite Sites utilizes a globally distributed [Content Delivery Network (CDN)](https://appwrite.io/docs/products/network/cdn) to efficiently cache and serve your Remix application, ensuring fast load times across all regions.
## 4. Built-in security and DDoS protection
Security is a priority for production applications. Appwrite Sites includes [DDoS protection](https://appwrite.io/docs/products/network/ddos), helping to mitigate malicious traffic and prevent downtime. Additionally, **custom domain management with automatic SSL encryption** ensures secure communication between users and your application.
## 5. Preview deployments for enhanced collaboration
Every update deployed to Appwrite Sites generates a **preview link**, allowing developers and teams to review and test changes in a staging environment before pushing them to production. This simplifies the workflow and improves quality assurance.
## 6. Multiple deployment options
Deploying a Remix application on Appwrite Sites is flexible and straightforward:
- [Git-based deployments](https://appwrite.io/docs/products/sites/deploy-from-git): Automatically deploy changes when pushing updates to your repository.
- **CLI-based deployment**: Deploy manually using the Appwrite CLI:
```bash
appwrite deploy site
```
- **Manual file uploads**: Upload static assets directly through the Appwrite Console.
Additionally, Appwrite provides **starter templates** to help developers get started quickly with minimal configuration.
## 7. Integrated backend services for full-stack Remix applications
Remix applications often require authentication, databases, and backend functionality. Appwrite Sites integrates seamlessly with **Appwrite Auth**, **Appwrite Databases**, and **Appwrite Functions**, removing the need for third-party backend services and simplifying full-stack development.
# How Appwrite Sites compares to other hosting platforms
| Feature | Appwrite Sites | Vercel | Netlify |
| --- | --- | --- | --- |
| Free hosting | Yes | Yes | Yes |
| Static site support | Yes | Yes | Yes |
| SSR support | Yes | Yes | Yes |
| Global CDN | Yes | Yes | Yes |
| DDoS protection | Yes | Yes | Yes |
| Deployment previews | Yes | Yes | Yes |
| Custom domains | Yes | Yes | Yes |
| Authentication | Appwrite Auth | No | No |
| Database | Appwrite Databases | No Third-party | No Third-party |
| Serverless functions | Appwrite Functions | Cloudflare Workers | AWS Lambda |
| Storage | Appwrite Storage | Cloudflare R2 | No |
| Cloud messaging | Appwrite Messaging | No | No |
| Realtime database | Appwrite Realtime | No | No |
Unlike other hosting platforms that require external services for backend functionality, Appwrite Sites offers a fully integrated solution with built-in authentication, databases, and serverless functions, making Remix deployments more efficient and scalable.
For developers looking for an all-in-one hosting solution tailored for Remix, Appwrite Sites is a perfect choice. Start deploying your Remix applications today by visiting [**Appwrite Sites**](https://appwrite.io/sites).

View File

@@ -0,0 +1,79 @@
---
layout: post
title: Free Svelte and SvelteKit hosting with Appwrite Sites - Deploy and scale effortlessly
description: Learn how to deploy your Svelte and SvelteKit app for free with Appwrite Sites.
date: 2025-05-20
cover: /images/blog/free-svelte-and-sveltekit-hosting/cover.png
timeToRead: 6
author: eldad-fux
category: tutorial
unlisted: true
---
Svelte and SvelteKit have gained traction among developers due to their efficient compilation, minimal runtime overhead, and built-in support for server-side rendering (SSR) and static site generation (SSG). While deploying Svelte applications is straightforward, choosing a hosting solution that balances affordability, scalability, and developer-friendly features can be a challenge.
[Appwrite Sites](https://appwrite.io/products/sites) provides a streamlined hosting experience tailored for modern web applications, including Svelte and SvelteKit. It offers features designed to enhance performance, security, and team collaboration. This article explores how Appwrite Sites simplifies deployment, integrates with Svelte's capabilities, and compares to other hosting options.
# Why Appwrite Sites is ideal for Svelte and SvelteKit
## 1. Free hosting without limitations
For individual developers and startups, hosting costs can be a significant factor. Appwrite Sites removes this barrier by offering free hosting, allowing you to launch, test, and iterate on projects without upfront expenses. As your application scales, Appwrite provides a seamless path to grow alongside it.
## 2. Optimized for both static and server-side rendering
SvelteKit supports SSR and SSG, making it versatile for various use cases. Appwrite Sites accommodates both approaches, ensuring static sites benefit from fast global caching while SSR applications dynamically generate content when required. This flexibility allows developers to build anything from blogs to complex web applications with real-time content. Additionally, **Appwrite Functions** can add dynamic functionality to SSR applications.
## 3. Speed-enhancing global CDN
Fast load times are crucial for user experience and SEO. Appwrite Sites leverages a globally distributed [Content Delivery Network (CDN)](https://appwrite.io/docs/products/network/cdn) to cache and serve static assets efficiently, reducing latency and ensuring optimal performance no matter where your users are located.
## 4. Built-in security and DDoS protection
Security is paramount for modern web applications. Appwrite Sites includes [DDoS protection](https://appwrite.io/docs/products/network/ddos), safeguarding applications against attacks by monitoring and mitigating malicious traffic. It also offers **custom domain management** with built-in SSL encryption, ensuring secure connections without additional configuration.
## 5. Preview deployments for smoother collaboration
Every update to your site generates a **deployment preview link**, making it easy to share and review changes before going live. This feature streamlines teamwork, allowing developers and stakeholders to validate updates in a staging environment before final deployment.
## 6. Multiple deployment options
Deploying your Svelte or SvelteKit application with Appwrite Sites is simple and flexible:
- [Git-based deployments](https://appwrite.io/docs/products/sites/deploy-from-git): Automatically deploy updates when pushing changes to your main branch.
- **CLI-based deployment**: Deploy manually with a single command:
```bash
appwrite deploy site
```
- **Manual file uploads**: Upload static assets directly via the Appwrite Console.
Appwrite also provides **starter templates** and example projects to help you get up and running quickly with minimal setup.
## 7. Integrated backend services for dynamic applications
Many Svelte applications require authentication, databases, and cloud functions. Appwrite Sites natively integrates with **Appwrite Auth**, **Appwrite Databases**, and **Appwrite Functions**, eliminating the need for external backend services and simplifying development.
# How Appwrite Sites compares to other hosting platforms
| Feature | Appwrite Sites | Vercel | Netlify |
| --- | --- | --- | --- |
| Free hosting | Yes | Yes | Yes |
| Static site support | Yes | Yes | Yes |
| SSR support | Yes | Yes | Yes |
| Global CDN | Yes | Yes | Yes |
| DDoS protection | Yes | Yes | Yes |
| Deployment previews | Yes | Yes | Yes |
| Custom domains | Yes | Yes | Yes |
| Authentication | Appwrite Auth | No | Deprecated |
| Database | Appwrite Databases | No Third-party | No Third-party |
| Serverless functions | Appwrite Functions | Cloudflare workers | AWS Lambda |
| Storage | Appwrite Storage | Cloudflare R2 | No |
| Cloud messaging | Appwrite Messaging | No | No |
| Realtime database | Appwrite Realtime | No | No |
Unlike other platforms that depend on third-party integrations for authentication, databases, and serverless functions, Appwrite Sites provides these services natively, reducing complexity and ensuring tighter integration.
For developers looking for a streamlined hosting solution that minimizes dependencies while delivering excellent performance, Appwrite Sites is a compelling choice. Explore more with our [SvelteKit Quick Start Guide](https://appwrite.io/docs/quick-starts/sveltekit) and start deploying your Svelte applications by visiting [Appwrite Sites](https://appwrite.io/sites).

View File

@@ -0,0 +1,84 @@
---
layout: post
title: Free Vue.js hosting with Appwrite Sites - Deploy and scale effortlessly
description: Learn how to deploy your Vue.js app for free with Appwrite Sites.
date: 2025-05-20
cover: /images/blog/free-vuejs-hosting/cover.png
timeToRead: 6
author: eldad-fux
category: tutorial
unlisted: true
---
Vue.js is a popular JavaScript framework for building interactive and scalable web applications, offering a balance of simplicity and performance. While deploying Vue applications is straightforward, choosing the right hosting platform that offers cost-effective scalability, security, and developer-friendly features can be a challenge.
[Appwrite Sites](https://appwrite.io/products/sites) provides an optimized hosting environment tailored for modern web applications, including Vue.js, with built-in performance enhancements, security measures, and flexible deployment options. This article explores how Appwrite Sites streamlines Vue hosting, enhances development workflows, and compares to other hosting solutions.
# Why Appwrite Sites is the perfect hosting solution for Vue.js
## 1. Free hosting with no upfront costs
For developers and startups, hosting expenses can be a concern. Appwrite Sites provides free hosting, allowing you to build, test, and deploy Vue applications without financial barriers. As your project scales, Appwrite offers seamless upgrade options to accommodate growing traffic and resource demands.
## 2. Supports both static and dynamic Vue applications
Vue applications can be deployed as static sites or as dynamic apps with server-side rendering (SSR). Appwrite Sites supports both models:
- **Static Vue apps**: Leverage **global caching** to deliver blazing-fast performance for Single Page Applications (SPAs).
- **Server-side rendering (SSR)**: Use **Appwrite Functions** to manage backend processes and dynamic content updates efficiently.
This flexibility ensures Vue applications of any complexity can be hosted efficiently on Appwrite Sites.
## 3. Performance-focused global CDN
Performance is crucial for web applications, influencing both user experience and SEO rankings. Appwrite Sites utilizes a globally distributed [Content Delivery Network (CDN)](https://appwrite.io/docs/products/network/cdn) to cache and serve Vue applications efficiently, reducing latency and improving page load times worldwide.
## 4. Built-in security and DDoS protection
Security is a priority when deploying web applications. Appwrite Sites includes [DDoS protection](https://appwrite.io/docs/products/network/ddos), safeguarding Vue applications from malicious traffic and potential downtime. Additionally, it offers **custom domain support with automatic SSL encryption**, ensuring secure communication between users and your application.
## 5. Preview deployments for enhanced collaboration
Every deployment on Appwrite Sites generates **preview links**, allowing developers and stakeholders to test changes before they go live. This improves collaboration and ensures thorough testing before final production deployment.
## 6. Multiple deployment options
Deploying a Vue application on Appwrite Sites is flexible and straightforward:
- [Git-based deployments](https://appwrite.io/docs/products/sites/deploy-from-git): Automatically deploy changes when pushing to your repository.
- **CLI-based deployment**: Deploy manually using the Appwrite CLI:
```bash
appwrite deploy site
```
- **Manual file uploads**: Upload static files directly through the Appwrite Console.
Additionally, Appwrite provides **starter templates** and example projects to help developers get up and running quickly with minimal setup.
## 7. Integrated backend services for full-stack Vue applications
Many Vue applications require authentication, databases, and backend logic. Appwrite Sites seamlessly integrates with **Appwrite Auth**, **Appwrite Databases**, and **Appwrite Functions**, reducing the need for third-party backend providers and simplifying full-stack development.
# How Appwrite Sites compares to other hosting platforms
| Feature | Appwrite Sites | Vercel | Netlify |
| --- | --- | --- | --- |
| Free hosting | Yes | Yes | Yes |
| Static site support | Yes | Yes | Yes |
| SSR support | Yes | Yes | Yes |
| Global CDN | Yes | Yes | Yes |
| DDoS protection | Yes | Yes | Yes |
| Deployment previews | Yes | Yes | Yes |
| Custom domains | Yes | Yes | Yes |
| Authentication | Appwrite Auth | No | No |
| Database | Appwrite Databases | No Third-party | No Third-party |
| Serverless functions | Appwrite Functions | Cloudflare workers | AWS Lambda |
| Storage | Appwrite Storage | Cloudflare R2 | No |
| Cloud messaging | Appwrite Messaging | No | No |
| Realtime database | Appwrite Realtime | No | No |
Unlike other hosting platforms that require third-party integrations for backend functionality, Appwrite Sites provides an all-in-one solution with built-in authentication, databases, and serverless functions, making Vue.js deployments easier and more efficient.
For developers looking for a cost-effective, high-performance hosting solution tailored for Vue applications, Appwrite Sites is an excellent choice. Explore more with our [Vue Quick Start Guide](https://appwrite.io/docs/quick-starts/vue) and start deploying your Vue applications by visiting [Appwrite Sites](https://appwrite.io/sites).

View File

@@ -61,7 +61,7 @@ Next up, we'll create our test app. This will require us to create two files in
<button type="button">Add documents</button>
<!-- Appwrite Web SDK -->
<script src="https://cdn.jsdelivr.net/npm/appwrite@18.1.0"></script>
<script src="https://cdn.jsdelivr.net/npm/appwrite@18.1.1"></script>
<!-- Our app's script -->
<script src="app.js"></script>
@@ -121,4 +121,4 @@ Reopen the HTML page in your browser. Clicking the `Add documents` button will a
And with that, you have successfully tested dev keys! Learn more about Appwrite by visiting the docs and joining the Discord community.
- [Appwrite dev keys docs](/docs/advanced/platform/dev-keys)
- [Appwrite Discord server](/discord)
- [Appwrite Discord server](/discord)

View File

@@ -0,0 +1,114 @@
---
layout: post
title: "Announcing HEIC and AVIF support: modern image formats now in Appwrite"
description:
date: 2025-05-22
cover: /images/blog/new-image-formats.png
timeToRead: 6
author: damodar-lohani
category: product, announcement
featured: false
---
Were excited to share we have added support for two new image formats in Appwrite Storage: **HEIC** and **AVIF.** This will give you more tools to manage, manipulate, and serve images the way you need.
You can generate image previews directly in **.heic** and **.avif** formats, which are natively supported in Appwrite.
No converters. No extra steps. Just fast, flexible image handling built in.
# Native support for next-gen formats
Image performance matters. Whether you're building a high-performance photo app or just optimizing media delivery, modern formats like AVIF and HEIC offer massive benefits: smaller sizes, better quality, and native platform support.
With this update, Appwrite now supports outputting previews in **HEIC** (Apples proprietary format) and **AVIF** (a modern open format with excellent compression).
# Why it matters
Previously, if you wanted to serve HEIC or AVIF images from Appwrite, you had to download them, convert them manually, and re-upload or host elsewhere.
Now, the Appwrite Storage preview API can do it all automatically.
This means:
- No more external tools
- No extra conversion steps
- No breaking your image pipeline
Just fast, reliable image delivery in the formats you need.
# Built for Apple and beyond
HEIC is Apples default image format on iOS. AVIF is increasingly used across modern browsers and devices.
This feature was designed for mobile app developers, especially those targeting iOS and working with native image capture and display. But its just as useful for any developer looking to serve modern image formats with better compression and quality.
# How to use it
Use the image preview endpoint as you normally would, just set the desired output format to HEIC or AVIF. It works the same way as existing format conversions like `jpg` or `png`.
Youll see smaller file sizes, faster load times, and better integration with native apps and devices.
# How to get started
HEIC and AVIF support is available on **Appwrite Cloud** and **self-hosted** installations.
```jsx
import { Client, Storage, ImageFormat } from "appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1')
.setProject('<PROJECT_ID>');
const storage = new Storage(client);
const resultHeic = storage.getFilePreview(
'photos', // bucket ID
'sunset.png', // file ID
1800, // width, will be resized using this value
0, // height, ignored when 0
'center', // crop center
'90', // slight compression
5, // border width
'CDCA30', // border color
15, // border radius
1, // full opacity
0, // no rotation
'FFFFFF', // background color
ImageFormat.Heic // output heic format
);
console.log(resultHeic.href);
const resultAvif = storage.getFilePreview(
'photos', // bucket ID
'sunset.png', // file ID
1800, // width, will be resized using this value.
0, // height, ignored when 0
'center', // crop center
'90', // slight compression
5, // border width
'CDCA30', // border color
15, // border radius
1, // full opacity
0, // no rotation
'FFFFFF', // background color
ImageFormat.Avif // output avif format
);
console.log(resultAvif.href);
```
[Visit the documentation](/docs/products/storage/images) to learn more.
# Smarter storage for better apps
This feature is part of our ongoing commitment to giving you modern tools that work the way you expect. Whether you're building a media-heavy app, targeting Apple platforms, or just caring about performance, you now have more control and better output without extra overhead.
# More resources
Take a look at what else we released this week.
- [Appwrite Sites](/blog/post/announcing-appwrite-sites)
- [Hosting for Flutter web](/blog/post/hosting-flutter-web)
- [Dev Keys](blog/post/announcing-dev-keys)
- [Appwrite compared to Vercel](/blog/post/open-source-vercel-alternative)
- [Appwrite Sites product tour](https://youtu.be/VtDe6hDw91k)
- [Appwrite Sites video announcement](https://youtu.be/0cERQxFjTW4)
- [Appwrite Discord server](https://appwrite.io/discord)

View File

@@ -70,7 +70,7 @@ docker run -it --rm \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \
--entrypoint="install" \
appwrite/appwrite:1.6.2
appwrite/appwrite:1.7.4
```
We have a dedicated [self-hosting guide](/docs/advanced/self-hosting) in our docs for more info.

View File

@@ -0,0 +1,16 @@
---
layout: changelog
title: "Announcing HEIC and AVIF support: modern image formats now in Appwrite"
date: 2025-05-22
cover: /images/changelog/2025-05-22.png
---
Were excited to share we have added support for two new image formats in Appwrite Storage: **HEIC** and **AVIF.** This will give you more tools to manage, manipulate, and serve images the way you need.
You can generate image previews directly in **.heic** and **.avif** formats, which are natively supported in Appwrite.
No converters. No extra steps. Just fast, flexible image handling built in.
{% arrow_link href="/blog/post/new-image-formats-avif-heic" %}
Read the announcement to learn more
{% /arrow_link %}

View File

@@ -0,0 +1,16 @@
---
layout: changelog
title: "Announcing File Tokens: secure file sharing without the hassle"
date: 2025-05-23
cover: /images/changelog/2025-05-23.png
---
Until now, sharing files from Appwrite often meant navigating permissions, managing access, or making files public, even when all you wanted was to send a file to someone outside your project. We introduce a new feature that will make file sharing a whole lot easier.
Introducing **File Tokens.**
This feature lets you share files easily and securely**,** without modifying permissions or changing project access. Just generate a token and share the link.
{% arrow_link href="/blog/post/announcing-file-tokens" %}
Read the announcement to learn more
{% /arrow_link %}

View File

@@ -110,7 +110,7 @@ SMS rates vary by country due to differences in telecom infrastructure and regul
| +98 | Iran | $ 0.20 |
| +964 | Iraq | $ 0.23 |
| +353 | Ireland | $ 0.06 |
| +972 | Israel | $ 0.11 |
| +972 | Israel | $ 0.01 |
| +39 | Italy | $ 0.05 |
| +81 | Japan | $ 0.06 |
| +962 | Jordan | $ 0.25 |

View File

@@ -50,6 +50,18 @@ X-RateLimit-Reset: 1377013266
}
```
# Dev keys {% #dev-keys %}
Rate limits are necessary to protect your apps and users from abuse; however, they can sometimes add unwanted friction when a developer is trying to repeatedly consume certain Appwrite APIs to test their application in a short period. [Dev keys](/docs/advanced/platform/dev-keys) are a type of secret used by client apps to bypass these rate limits in development environments.
To use dev keys, client apps add a header `X-Appwrite-Dev-Key` containing the secret to all HTTP requests sent to the Appwrite API. Appwrite recognizes this header, verifies the secret, and if valid, allows the request to bypass the rate limit.
```http
X-Appwrite-Dev-Key: 5b0be23...abda7c6
```
Dev keys should never be included in production applications as they can expose your application to abuse. They are meant for development and testing purposes only.
# Service abuse {% #service-abuse %}
To protect the quality of service from Appwrite, additional rate limits may apply to some actions. For example, rapidly creating content, polling aggressively instead of using webhooks, making API calls with a high concurrency, or repeatedly requesting data that is computationally expensive may result in abuse rate limiting.

View File

@@ -28,6 +28,10 @@
label: 'Functions',
href: '/docs/advanced/self-hosting/functions'
},
{
label: 'Sites',
href: '/docs/advanced/self-hosting/sites'
},
{
label: 'Email delivery',
href: '/docs/advanced/self-hosting/email'

View File

@@ -35,7 +35,7 @@ docker run -it --rm \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \
--entrypoint="install" \
appwrite/appwrite:1.6.2
appwrite/appwrite:1.7.4
```
{% /tabsitem %}
@@ -46,7 +46,7 @@ docker run -it --rm ^
--volume //var/run/docker.sock:/var/run/docker.sock ^
--volume "%cd%"/appwrite:/usr/src/code/appwrite:rw ^
--entrypoint="install" ^
appwrite/appwrite:1.6.2
appwrite/appwrite:1.7.4
```
## Powershell
```powershell
@@ -54,7 +54,7 @@ docker run -it --rm `
--volume /var/run/docker.sock:/var/run/docker.sock `
--volume ${pwd}/appwrite:/usr/src/code/appwrite:rw `
--entrypoint="install" `
appwrite/appwrite:1.6.2
appwrite/appwrite:1.7.4
```
{% /tabsitem %}
{% /tabs %}
@@ -99,6 +99,8 @@ Make these configurations to unlock the full power of Appwrite.
[Configure Appwrite Functions](/docs/advanced/self-hosting/functions)
[Configure Appwrite Sites](/docs/advanced/self-hosting/sites)
[Configure email delivery](/docs/advanced/self-hosting/email)
[Configure SMS delivery](/docs/advanced/self-hosting/sms)
@@ -109,7 +111,7 @@ Make these configurations to unlock the full power of Appwrite.
# Manual (Docker Compose) {% #manual %}
For advanced Docker users, the manual installation might seem more familiar. To set up Appwrite manually, download the Appwrite base [`docker-compose.yml`](https://appwrite.io/install/compose) and [`.env`](https://appwrite.io/install/env) files, then move them inside a directory named `appwrite`. After the download completes, update the different environment variables as you wish in the `.env` file and start the Appwrite stack using the following Docker command:
For advanced Docker users, the manual installation might seem more familiar. To set up Appwrite manually, download the Appwrite base [`docker-compose.yml`](/install/compose) and [`.env`](/install/env) files, then move them inside a directory named `appwrite`. After the download completes, update the different environment variables as you wish in the `.env` file and start the Appwrite stack using the following Docker command:
```bash
docker compose up -d --remove-orphans

View File

@@ -21,13 +21,13 @@ If you are looking to send custom emails for promotions, news letters, and other
At this stage, we assume that you have already installed Appwrite. If not, you can follow our [Self Hosting Guide](/docs/advanced/self-hosting) for the installation. Appwrite offers multiple environment variables to customize your server setup to your needs. To configure Appwrite to use your own SMTP server, you need to set the following environment variables in the hidden .env file that comes with your Appwrite installation.
| Environment Variable | Description | Default Value |
| ----------------------------- | --------------------------------------------------------------------------------------------------------------------- | ------------------------ |
| _APP_SMTP_HOST | SMTP server host name address. Use an empty string to disable all mail sending from the server. | Empty string |
| _APP_SMTP_PORT | SMTP server TCP port. | Empty |
| _APP_SMTP_SECURE | SMTP secure connection protocol. Change to 'tls' if running on a secure connection. Valid values: empty, 'tls', 'ssl'. | Empty |
| _APP_SMTP_USERNAME | SMTP server user name. | Empty |
| _APP_SMTP_PASSWORD | SMTP server user password. | Empty |
| _APP_SYSTEM_EMAIL_ADDRESS | Configured sender email address, seen by recipients. | "team@appwrite.io" |
| ------------------------------- | --------------------------------------------------------------------------------------------------------------------- | ------------------------ |
| `_APP_SMTP_HOST` | SMTP server host name address. Use an empty string to disable all mail sending from the server. | Empty string |
| `_APP_SMTP_PORT` | SMTP server TCP port. | Empty |
| `_APP_SMTP_SECURE` | SMTP secure connection protocol. Change to 'tls' if running on a secure connection. Valid values: empty, 'tls', 'ssl'. | Empty |
| `_APP_SMTP_USERNAME` | SMTP server user name. | Empty |
| `_APP_SMTP_PASSWORD` | SMTP server user password. | Empty |
| `_APP_SYSTEM_EMAIL_ADDRESS` | Configured sender email address, seen by recipients. | "team@appwrite.io" |
Here's a sample configuration if you're using SendGrid as your SMTP provider:

View File

@@ -29,7 +29,11 @@ docker compose exec appwrite vars
| `_APP_OPENSSL_KEY_V1` | This is your server private secret key that is used to encrypt all sensitive data on your server. Appwrite server encrypts all secret data on your server like webhooks, HTTP passwords, user sessions, and storage files. The var is not set by default, if you wish to take advantage of Appwrite encryption capabilities you should change it and make sure to **keep it a secret and have a backup for it**. |
| `_APP_DOMAIN` | Your Appwrite domain address. When setting a public suffix domain, Appwrite will attempt to issue a valid SSL certificate automatically. When used with a dev domain, Appwrite will assign a self-signed SSL certificate. The default value is 'localhost'. |
| `_APP_DOMAIN_FUNCTIONS` | A domain to use for function preview URLs. Setting to empty turns off function preview URLs. |
| `_APP_DOMAIN_TARGET` | A DNS A record hostname to serve as a CNAME target for your Appwrite custom domains. You can use the same value as used for the Appwrite '_APP_DOMAIN' variable. The default value is 'localhost'. |
| `_APP_DOMAIN_SITES` | **version >= 1.7.0** The domain to use for site URLs. Setting to empty turns off site URLs. |
| `_APP_DOMAIN_TARGET` | **(version >= 1.7.0)** Deprecated since 1.7.0 uses `_APP_DOMAIN_TARGET_CNAME` instead. |
| `_APP_DOMAIN_TARGET_CNAME` | **version >= 1.7.0** A DNS CNAME record hostname to serve as a CNAME target for your Appwrite custom domains. The default value is 'localhost'. |
| `_APP_DOMAIN_TARGET_A` | **version >= 1.7.0** A DNS A record hostname to serve as a IPv4 address for your Appwrite custom domains. The default value is '127.0.0.1'. |
| `_APP_DOMAIN_TARGET_AAAA` | **version >= 1.7.0** A DNS AAAA record hostname to serve as a IPv6 address for your Appwrite custom domains. The default value is '::1'. |
| `_APP_CONSOLE_WHITELIST_ROOT`| This option allows you to disable the creation of new users on the Appwrite console. When enabled only 1 user will be able to use the registration form. New users can be added by inviting them to your project. By default this option is enabled. |
| `_APP_CONSOLE_WHITELIST_EMAILS` | This option allows you to limit creation of new users on the Appwrite console. This option is very useful for small teams or sole developers. To enable it, pass a list of allowed email addresses separated by a comma. |
| `_APP_CONSOLE_WHITELIST_IPS` | This last option allows you to limit creation of users in Appwrite console for users sharing the same set of IP addresses. This option is very useful for team working with a VPN service or a company IP. To enable/activate this option, pass a list of allowed IP addresses separated by a comma. |
@@ -41,8 +45,8 @@ docker compose exec appwrite vars
| `_APP_LOGGING_PROVIDER` | Deprecated since 1.6.0, use `_APP_LOGGING_CONFIG` with DSN value instead. This variable allows you to enable logging errors to 3rd party providers. This value is empty by default, set the value to one of \'sentry\', \'raygun\', \'appSignal\', \'logOwl\' to enable the logger. |
| `_APP_LOGGING_CONFIG` | This variable allows you to enable logging errors to third party providers. This value is empty by default, set a DSN value to one of the following `sentry://PROJECT_ID:SENTRY_API_KEY@SENTRY_HOST/`, , `logowl://SERVICE_TICKET@SERIVCE_HOST/` `raygun://RAYGUN_API_KEY/`, `appSignal://API_KEY/` to enable the logger. For versions prior `1.5.6` you can use the old syntax. Old syntax: If using Sentry, this should be \'SENTRY_API_KEY;SENTRY_APP_ID\'. If using Raygun, this should be Raygun API key. If using AppSignal, this should be AppSignal API key. If using LogOwl, this should be LogOwl Service Ticket. |
| `_APP_USAGE_AGGREGATION_INTERVAL` | **(version >= 1.1.0)** Interval value containing the number of seconds that the Appwrite usage process should wait before aggregating stats and syncing it to Database from TimeSeries data. The default value is 30 seconds. Reintroduced in 1.1.0. |
| `_APP_USAGE_TIMESERIES_INTERVAL` | **(version >= 1.0.0)** Deprecated since 1.1.0 use _APP_USAGE_AGGREGATION_INTERVAL instead. |
| `_APP_USAGE_DATABASE_INTERVAL` | **(version >= 1.0.0)** Deprecated since 1.1.0 use _APP_USAGE_AGGREGATION_INTERVAL instead. |
| `_APP_USAGE_TIMESERIES_INTERVAL` | **(version >= 1.0.0)** Deprecated since 1.1.0 uses `_APP_USAGE_AGGREGATION_INTERVAL` instead. |
| `_APP_USAGE_DATABASE_INTERVAL` | **(version >= 1.0.0)** Deprecated since 1.1.0 uses `_APP_USAGE_AGGREGATION_INTERVAL` instead. |
| `_APP_WORKER_PER_CORE` | **(version >= 0.13.0)** Internal Worker per core for the API, Realtime and Executor containers. Can be configured to optimize performance. |
@@ -89,7 +93,7 @@ If running in production, it might be easier to use a 3rd party SMTP server as i
| Name | Description |
|---------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `_APP_SMS_PROVIDER` | **version >= 0.15.0** Provider used for delivering SMS for Phone authentication. Use the following format: 'sms://[USER]:[SECRET]@[PROVIDER]'.<br>Ensure `[USER]` and `[SECRET]` are URL encoded if they contain any non-alphanumeric characters.<br>Available providers are twilio, text-magic, telesign, msg91, and vonage. |
| `_APP_SMS_PROVIDER` | **version >= 0.15.0** Provider used for delivering SMS for Phone authentication. Use the following format: `sms://<USER>:<SECRET>@<PROVIDER>`. Ensure `<USER>` and `<SECRET>` are URL encoded if they contain any non-alphanumeric characters. Available providers are twilio, text-magic, telesign, msg91, and vonage. |
| `_APP_SMS_FROM` | **version >= 0.15.0** Phone number used for sending out messages. Must start with a leading '+' and maximum of 15 digits without spaces (+123456789). |
# Storage {% #storage %}
@@ -143,6 +147,12 @@ If running in production, it might be easier to use a 3rd party SMTP server as i
| `_APP_DOCKER_HUB_PASSWORD` | **version >= 1.2.0** The password for hub.docker.com. This variable is used to pull images from hub.docker.com. |
| `_APP_FUNCTIONS_MAINTENANCE_INTERVAL`| **version >= 1.4.0** Interval value containing the number of seconds that the executor should wait before checking for inactive runtimes. The default value is 3600 seconds (1 hour). |
# Sites {% #sites %}
| **Name** | **Description** |
|-------------------------------|-----------------|
| `_APP_SITES_TIMEOUT` | **version >= 1.7.0** The maximum number of seconds allowed as a timeout value when creating a new site. The default value is 30 seconds. This is the global limit, timeout for individual sites are configured in the site's settings or in appwrite.json. |
| `_APP_SITES_RUNTIMES` | **version >= 1.7.0** This option allows you to enable or disable runtime environments for sites. Disable unused runtimes to save disk space. To enable sites runtimes, pass a list of enabled environments separated by a comma. |
# VCS (Version Control System) {% #vcs %}
| **Name** | **Description** |

View File

@@ -4,115 +4,7 @@ title: Functions
description: Harness the full power of self-hosted functions with Appwrite. Explore function deployment, management, and integration in your self-hosted environment.
---
# Configure GitHub app {% #git %}
Appwrite supports automatic deployments through Git integration. In order for Appwrite to access your repos, you must [create a GitHub app](https://docs.github.com/en/apps/creating-github-apps/about-creating-github-apps/about-creating-github-apps) to enable this integration. The GitHub app requires the following configurations.
For automatic Git deployment to work, Appwrite needs to receive communication from GitHub, this means your Appwrite project must be accessible on the internet. If you're running on `localhost`, you need to run a proxy like [ngrok](https://ngrok.com/).
## GitHub App name {% #github-app-name %}
The GitHub App name will be displayed when connecting Appwrite to GitHub. In addition, this name will be transformed to a slug ("My GitHub App" will become "my-github-app") and appear in the URL when accessing your app in GitHub. This slug should be set as the `_APP_VCS_GITHUB_APP_NAME` environment variable in Appwrite.
## Homepage URL {% #github-homepage-url %}
The homepage URL will appear when looking at the public page of your app. It can be any URL you'd like.
## Callback URL {% #callback %}
GitHub will use **callback URLs** to redirect users back to Appwrite. Set these callback URLs under **Identifying and authorizing users** in the same order as listed below.
| URLs |
| ---- |
| `https://[HOSTNAME_OR_IP]/v1/vcs/github/callback` |
| `https://[HOSTNAME_OR_IP]/v1/account/sessions/oauth2/callback/github/console` |
Also, check the **Request user authentication (OAuth) during installation** box.
## Post installation {% #post-install %}
Check the **Redirect on update** box under the **Post installation** section.
## Webhook {% #github-webhooks %}
GitHub will notify Appwrite about events like new commits using webhooks. Under **Webhook**, you need to check the **Active** checkbox. You also need to set the **Webhook URL** as `https://[HOSTNAME_OR_IP]/v1/vcs/github/events`.
If you're running Appwrite on `localhost`, GitHub can't send requests to Appwrite through webhooks and automatic deployments won't work. You'll need to host Appwrite on a server or use a proxy like [ngrok](https://ngrok.com/) to make Appwrite accessible to GitHub.
## Repository permissions {% #repository-permission %}
Configure these permissions under the **Repository permission** dropdown.
| Permission | Access |
| --------------- | -------------- |
| Administration | Read and write |
| Checks | Read and write |
| Commit Statuses | Read and write |
| Contents | Read and write |
| Issues | Read and write |
| Metadata | Read-only |
| Pull requests | Read and write |
| Webhooks | Read and write |
## Account permissions {% #account-permission %}
Configure these permissions under the **Account Permission** dropdown.
| Permission | Access |
| -------------- | -------- |
| Email address | Read-only|
## Subscribe to events {% #subscribe-events %}
Select these under the **Subscribe to events** dropdown.
| Events |
| ------------ |
| Pull request |
| Push |
## Where can this GitHub App be installed? {% #github-where-installed %}
Check the **Any account** box under **Where can this GitHub App be installed?** section. This is important to allow you to install the GitHub app on multiple Appwrite projects.
## Environment variables {% #github-variables %}
After creating your app, you'll have to configure the following environment variables.
| Variable | Description |
|------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `_APP_DOMAIN` | Your main Appwrite domain used to access the Appwrite Console. When setting a public suffix domain, Appwrite will attempt to issue a valid SSL certificate automatically. When used with a dev domain, Appwrite will assign a self-signed SSL certificate. If you're using a proxy for **localhost development**, such as [ngrok](https://ngrok.com/), this will be the domain of your localhost proxy. |
| `_APP_DOMAIN_TARGET` | A hostname to serve as a CNAME target for your Appwrite custom domains. You can use the same value as used for the Appwrite `_APP_DOMAIN` variable. If you're using a proxy for **localhost development**, such as [ngrok](https://ngrok.com/), this will be the domain of your localhost proxy, such as `dd65-2405-201-4013-d8d7-b4c5-fb73-39f9-285c.ngrok.io`. |
| `_APP_DOMAIN_FUNCTIONS` | This will be used for system generated [Function Domains](/docs/products/functions/domains). When a function domain is generated, it will be `[UNIQUE_ID].[_APP_DOMAIN_FUNCTIONS]`. If `_APP_DOMAIN_FUNCTIONS` is set to `example.com` for example, the generated domain for functions will be something like `64d4d22db370ae41a32e.example.com`. You can use the same value as used for the Appwrite `_APP_DOMAIN` variable. |
| `_APP_VCS_GITHUB_APP_NAME` | Name of your GitHub app. This is the display name you'll see on GitHub and it will be visible in your GitHub app's URL. |
| `_APP_VCS_GITHUB_PRIVATE_KEY`| RSA private key from GitHub wrapped with double quotes and newlines replaced with `\n`. You can generate private keys from GitHub application settings. |
| `_APP_VCS_GITHUB_APP_ID` | GitHub application ID. You can find it in your GitHub application details. |
| `_APP_VCS_GITHUB_CLIENT_ID` | GitHub client ID. You can find it in your GitHub application details. |
| `_APP_VCS_GITHUB_CLIENT_SECRET` | GitHub client secret. You can generate secrets in your GitHub application settings. |
| `_APP_VCS_GITHUB_WEBHOOK_SECRET` | GitHub webhook secret. You can configure it in your GitHub application settings under webhook section. |
For example, see below.
```bash
_APP_DOMAIN=appwrite.example.com
_APP_DOMAIN_TARGET=appwrite.example.com
_APP_DOMAIN_FUNCTIONS=functions.example.com
_APP_VCS_GITHUB_APP_NAME=my-github-app
_APP_VCS_GITHUB_PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\nMIIEogIBAAKCAQEAuT8f3lo/X83hfvb0ZN/KD2pl86o/jl3ywKrkj/PQZBmtEv/z\nIugE//sfFoHWc4cizkcji+n3FNU+GEdvMioKuJlPBqPTY8hAbVn7R0geZLpDV/rs\n[...]\n-----END RSA PRIVATE KEY-----"
_APP_VCS_GITHUB_APP_ID=12415
_APP_VCS_GITHUB_CLIENT_ID=Iv1.35asdf43asd
_APP_VCS_GITHUB_CLIENT_SECRET=35rsdse532q13
_APP_VCS_GITHUB_WEBHOOK_SECRET=super-secret
```
[Learn more about environment variables](/docs/advanced/self-hosting/environment-variables)
## Update existing GitHub apps {% #existing-apps %}
There are additional steps if you're updating permissions in existing GitHub apps.
Every time you update your GitHub app's permissions, GitHub will prompt you to review the changes.
You will receive an email and you'll find a prompt under **Settings** > **Integrations** > **Applications** > **Installed GitHub Apps** > find your GitHub app > **Configure**.
You need to accept the new permissions so they're applied to your app.
{% partial file="configure-github-app.md" /%}
# Configure Function runtimes {% #functions %}
@@ -144,7 +36,7 @@ There are two ways to handle certificate generation.
The simplest way to generate certificates for function domains is to use the Appwrite SSL command.
```bash
docker compose exec appwrite ssl --domain="6772722a00331315adc3.appwrite.myapp.com"
docker compose exec appwrite ssl --domain="6772722a00331315adc3.functions.appwrite.myapp.com"
```
The certificate should be generated within a few seconds.
@@ -224,6 +116,6 @@ environment:
- DO_PROPAGATION_TIMEOUT=1h
```
Note: Let's Encrypt has strict rate limits for certificate requests. If you encounter rate limit errors in the logs, you may need to wait a few hours before trying again.
> Note: Let's Encrypt has strict rate limits for certificate requests. If you encounter rate limit errors in the logs, you may need to wait a few hours before trying again.
For other DNS providers, refer to [Traefik's DNS providers documentation](https://doc.traefik.io/traefik/https/acme/#providers).

View File

@@ -0,0 +1,140 @@
---
layout: article
title: Sites
description: Harness the full power of self-hosted sites with Appwrite. Explore site deployment, management, and integration in your self-hosted environment.
---
{% partial file="configure-github-app.md" /%}
# Configure Sites runtimes {% #sites %}
Not all site runtimes are enabled by default. Enable the runtimes that you need and disable unused runtimes to save disk space on your server.
To enable a runtime, add it to the `_APP_SITES_RUNTIMES` environment variable as a comma-separated list.
The three runtimes currently available for Sites are the Static, Node.js 22, and Flutter 3.29 runtimes.
```bash
_APP_SITES_RUNTIMES=static-1,node-22,flutter-3.29
```
You can also configure the maximum timeout that can be set on individual Appwrite Sites. The maximum configurable timeout can be increased by changing the `_APP_SITES_TIMEOUT` environment variable. This environment variable changes the configurable maximum but does not alter existing configurations of individual sites.
{% partial file="update-variables.md" /%}
# Add an apex domain for Sites {% #root-domain %}
Appwrite allows you to add an apex domain to your instance's configuration that you can publicly expose your Site on.
{% info title="What is an apex domain?" %}
An apex domain, also known as a root domain, is the highest level of a domain name without any subdomains. For example, `myapp.com` is an apex domain, while `appwrite.myapp.com` is a subdomain of the apex domain.
{% /info %}
To add an apex domain, you must first configure either one of the following environment variables in your `.env` file:
- `_APP_DOMAIN_TARGET_A`: Set this to the IPv4 address of your server.
- `_APP_DOMAIN_TARGET_AAAA`: Set this to the IPv6 address of your server.
Head to the **Domains** tab of your site, and add your apex domain (e.g., `myapp.com`) as a new domain pointed to the active deployment.
Next, head to your DNS provider and create an A or AAAA record for your root domain pointing to the server's IP address. This will allow Appwrite to serve your sites from the apex domain.
> Note: Make sure to remove any pre-existing `A` and `AAAA` records in the DNS settings of your domain, as these can conflict with your current configuration.
# SSL certificates for Sites domains {% #ssl-certificates %}
Before setting up SSL certificates, ensure you have configured your DNS settings properly. You'll need to create a CNAME, A, or AAAA record that points your wildcard domain (e.g. `*.sites.appwrite.myapp.com`) to your Appwrite domain.
Appwrite does not handle certificates for sites domains (e.g. `6772722a00331315adc3.sites.appwrite.myapp.com`)
out of the box, since they require wildcard certificates.
There are two ways to handle certificate generation.
## Manual certificate generation
The simplest way to generate certificates for domains is to use the Appwrite SSL command.
```bash
docker compose exec appwrite ssl --domain="6772722a00331315adc3.sites.appwrite.myapp.com"
```
The certificate should be generated within a few seconds.
If you encounter any issues, you can check the certificate worker logs.
```bash
docker compose logs appwrite-worker-certificates
```
Note that you'll need to run this command for each domain, and repeat it every time you create a new site.
If you have many or frequently create new ones, consider using the automated certificate generation method below.
## Automated certificate generation
For automated certificate generation, Appwrite uses Traefik's DNS Challenge feature.
This is required for wildcard certificates (like `*.appwrite.myapp.com`)
because Let's Encrypt uses the DNS-01 challenge to validate wildcard domain ownership.
### Using DNS challenge with DigitalOcean
To configure Traefik for automated certificate generation with DigitalOcean,
you need to modify your `docker-compose.yml`:
1. Add the following under the `traefik` service's `command` section.
```yaml
command:
# ... existing commands ...
- --certificatesresolvers.digitalocean.acme.dnschallenge=true
- --certificatesresolvers.digitalocean.acme.dnschallenge.provider=digitalocean
- --certificatesresolvers.digitalocean.acme.email=$_APP_SYSTEM_SECURITY_EMAIL_ADDRESS
- --certificatesresolvers.digitalocean.acme.storage=/storage/certificates/digitalocean.json
```
2. Add environment variables under the `traefik` service.
```yaml
environment:
- DO_AUTH_TOKEN=$_APP_DOMAIN_DO_TOKEN
```
3. Add the following `labels` under the `appwrite` service.
```yaml
labels:
# ... existing labels ...
- traefik.http.routers.appwrite_api_https.tls.certresolver=digitalocean
- traefik.http.routers.appwrite_api_https.tls.domains[0].main=$_APP_DOMAIN_TARGET_CNAME
- traefik.http.routers.appwrite_api_https.tls.domains[0].sans=*.$_APP_DOMAIN_TARGET_CNAME
```
4. Ensure these environment variables are properly configured in your `.env` file before proceeding:
- `_APP_SYSTEM_SECURITY_EMAIL_ADDRESS` must be set to a valid email for Let's Encrypt notifications
- `_APP_DOMAIN_SITES` must be correctly set to your site domain (e.g., `sites.example.com`)
- `_APP_DOMAIN_DO_TOKEN` must be set to a valid DigitalOcean API token (generate this in the DigitalOcean Console)
5. Apply the changes.
```bash
docker compose up -d --force-recreate
```
### Troubleshooting DNS Propagation
If certificate generation fails, first check the Traefik logs to identify the specific issue.
```bash
docker compose logs traefik
```
A common issue is DNS propagation delays. If the logs show DNS verification failures, you can configure longer timeouts in your `docker-compose.yml` under the `traefik` service.
```yaml
environment:
- DO_AUTH_TOKEN=$_APP_DOMAIN_DO_TOKEN
- DO_POLLING_INTERVAL=1m
- DO_PROPAGATION_TIMEOUT=1h
```
> Note: Let's Encrypt has strict rate limits for certificate requests. If you encounter rate limit errors in the logs, you may need to wait a few hours before trying again.
For other DNS providers, refer to [Traefik's DNS providers documentation](https://doc.traefik.io/traefik/https/acme/#providers).

View File

@@ -58,10 +58,10 @@ Ensure the values you insert in the `_APP_SMS_PROVIDER` placeholders are [URL en
| Provider | \_APP\_SMS\_PROVIDER | \_APP\_SMS\_FROM |
| -------- | -------------------------------------------------- | ----------------------- |
| Twilio | `sms://[ACCOUNT SID]:[AUTH TOKEN]@twilio` | `[TWILIO PHONE NUMBER]` |
| Textmagic| `sms://[USERNAME]:[API KEY]@text-magic` | `[PHONE NUMBER OR SENDER ID]` |
| TeleSign | `sms://[CUSTOMER ID]:[API KEY]@telesign` | `[TELESIGN PHONE NUMBER]` |
| MSG91 | `sms://[SENDER ID]:[AUTH KEY]@msg91` | `[FLOW ID]` |
| Vonage | `sms://[API KEY]:[API SECRET]@vonage` | `[PHONE NUMBER OR BRAND NAME]` |
| Twilio | `sms://<ACCOUNT SID>:<AUTH TOKEN>@twilio` | `<TWILIO PHONE NUMBER>` |
| Textmagic| `sms://<USERNAME>:<API KEY>@text-magic` | `<PHONE NUMBER OR SENDER ID>` |
| TeleSign | `sms://<CUSTOMER ID>:<API KEY>@telesign` | `<TELESIGN PHONE NUMBER>` |
| MSG91 | `sms://<SENDER ID>:<AUTH KEY>@msg91` | `<FLOW ID>` |
| Vonage | `sms://<API KEY>:<API SECRET>@vonage` | `<PHONE NUMBER OR BRAND NAME>` |
{% partial file="update-variables.md" /%}

View File

@@ -39,7 +39,7 @@ docker run -it --rm \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \
--entrypoint="upgrade" \
appwrite/appwrite:1.6.2
appwrite/appwrite:1.7.4
```
## CMD
@@ -49,7 +49,7 @@ docker run -it --rm ^
--volume //var/run/docker.sock:/var/run/docker.sock ^
--volume "%cd%"/appwrite:/usr/src/code/appwrite:rw ^
--entrypoint="upgrade" ^
appwrite/appwrite:1.6.2
appwrite/appwrite:1.7.4
```
## PowerShell
@@ -59,7 +59,7 @@ docker run -it --rm `
--volume /var/run/docker.sock:/var/run/docker.sock `
--volume ${pwd}/appwrite:/usr/src/code/appwrite:rw `
--entrypoint="upgrade" `
appwrite/appwrite:1.6.2
appwrite/appwrite:1.7.4
```
This will pull the `docker-compose.yml` file for the new version and perform the installation.

View File

@@ -214,28 +214,28 @@ Returns document if attribute is not equal to any value in the provided array.
{% multicode %}
```client-web
Query.notEqual("title", ["Iron Man"])
Query.notEqual("title", "Iron Man")
```
```client-flutter
Query.notEqual("title", ["Iron Man"])
Query.notEqual("title", "Iron Man")
```
```python
Query.not_equal("title", ["Iron Man"])
Query.not_equal("title", "Iron Man")
```
```ruby
Query.not_equal("title", ["Iron Man"])
Query.not_equal("title", "Iron Man")
```
```deno
Query.notEqual("title", ["Iron Man"])
Query.notEqual("title", "Iron Man")
```
```php
Query::notEqual("title", ["Iron Man"])
Query::notEqual("title", "Iron Man")
```
```swift
Query.notEqual("title", value: ["Iron Man"])
Query.notEqual("title", value: "Iron Man")
```
```http
{"method":"notEqual","attribute":"title","values":["Iron Man"]}
{"method":"notEqual","attribute":"title","values":"Iron Man"}
```
{% /multicode %}

View File

@@ -59,7 +59,11 @@ All Cloud users have access to the Appwrite Network. If you need to scale your s
# Features {% #features %}
{% cards %}
{% cards_item href="/docs/products/network/dns" title="Domain Name System" %}
Provides dedicated nameservers and DNS management for apex domains with SSL certification.
{% /cards_item %}
{% cards_item href="/docs/products/network/ddos" title="DDoS mitigation" %}
Protects against distributed denial-of-service attacks, ensuring uninterrupted access.
{% /cards_item %}

View File

@@ -167,12 +167,21 @@ Your site's dependencies should be managed by the package manager of each langua
- {% icon icon="flutter" size="m" /%}
- **Flutter**
- `pub`
- (Empty)
- `flutter build web`
- `flutter pub get`
- `flutter build web --release -t lib/main.dart`
- `./build/web`
---
- {% icon icon="react-native" size="m" /%}
- **React Native**
- `npm`
- `npm install`
- `npm run build`
- `./dist`
---
- {% icon icon="js" size="m" /%}
- **Other JavaScript**
- `npm`

View File

@@ -53,7 +53,7 @@ To add an apex domain:
3. Enter your apex domain (e.g., `example.com`).
4. Select the appropriate domain rule type (Active deployment, Git branch, or Redirect) and configure its settings. See the [Domain rule types](#domain-rule-types) section for details.
5. Appwrite will provide NS record information.
6. Go to your domain registrar and update the NS records for your domain to point to `appwrite.zone`.
6. Go to your domain registrar and update the NS records for your domain to point to `ns1.appwrite.zone` and `ns2.appwrite.zone`.
7. Return to the Appwrite Console and wait for the verification process to complete.
DNS changes can take up to 48 hours to fully propagate across the internet. During this time, your domain might not be accessible or might show inconsistent behavior.

View File

@@ -68,6 +68,12 @@ This means you can focus on building your application while Appwrite handles the
---
- {% icon icon="react-native" size="m" /%}
- [**React Native**](/docs/products/sites/quick-start/react-native)
- `Static`
---
- {% icon icon="js" size="m" /%}
- [**Other JavaScript**](/docs/products/sites/quick-start/vanilla)
- `Static`

View File

@@ -19,8 +19,8 @@ Before deploying your web app with Git, create a new Site attached to your GitHu
![Create site wizard](/images/docs/sites/create-site-wizard.png)
{% /only_light %}
1. In the Appwrite Console's sidebar, click **Sites**.
2. Click on the **Create site** button.
1. In the Appwrite Console's sidebar, click **Sites**.
2. Click on the **Create site** button.
3. After clicking on **Connect Git repository**, select your repository.
4. After connecting to GitHub, (optionally) add a name and site ID.
5. Verify that the correct framework is selected.
@@ -61,6 +61,9 @@ Learn how to quickly setup a web app developed using any of the following framew
{% cards_item href="/docs/products/sites/quick-start/flutter" title="Flutter" icon="icon-flutter" %}
{% /cards_item %}
{% cards_item href="/docs/products/sites/quick-start/react-native" title="React Native" icon="icon-react-native" %}
{% /cards_item %}
{% cards_item href="/docs/products/sites/quick-start/vanilla" title="Vanilla JS" icon="icon-js" %}
{% /cards_item %}

View File

@@ -21,7 +21,12 @@ Push this project to a [GitHub repo](https://github.com/new).
{% section #step-2 step=2 title="Create Appwrite project" %}
Head to the [Appwrite Console](https://cloud.appwrite.io).
{% only_dark %}
![Create Appwrite project](/images/docs/quick-starts/dark/create-project.png)
{% /only_dark %}
{% only_light %}
![Create Appwrite project](/images/docs/quick-starts/create-project.png)
{% /only_light %}
If this is your first time using Appwrite, create an account and create your first project.
{% /section %}

View File

@@ -20,7 +20,12 @@ Push this project to a [GitHub repo](https://github.com/new).
{% section #step-2 step=2 title="Create Appwrite project" %}
Head to the [Appwrite Console](https://cloud.appwrite.io).
{% only_dark %}
![Create Appwrite project](/images/docs/quick-starts/dark/create-project.png)
{% /only_dark %}
{% only_light %}
![Create Appwrite project](/images/docs/quick-starts/create-project.png)
{% /only_light %}
If this is your first time using Appwrite, create an account and create your first project.
{% /section %}

View File

@@ -26,7 +26,12 @@ Push this project to a [GitHub repo](https://github.com/new).
{% section #step-2 step=2 title="Create Appwrite project" %}
Head to the [Appwrite Console](https://cloud.appwrite.io).
{% only_dark %}
![Create Appwrite project](/images/docs/quick-starts/dark/create-project.png)
{% /only_dark %}
{% only_light %}
![Create Appwrite project](/images/docs/quick-starts/create-project.png)
{% /only_light %}
If this is your first time using Appwrite, create an account and create your first project.
{% /section %}
@@ -39,8 +44,8 @@ Connect your GitHub account and select the repository you intend to deploy.
1. Select the **production branch** and **root directory** from your repo.
2. Verify that the **correct framework** is selected. In case an incorrect framework is visible, pick **Flutter Web** from the drop-down list.
3. Confirm the **install command**, **build command**, and **output directory** in the build settings. The default build settings for Flutter Web are:
- **Install command:** `N/A` (leave empty)
- **Build command:** `flutter build web`
- **Install command:** `flutter pub get`
- **Build command:** `flutter build web --release -t lib/main.dart`
- **Output directory:** `./build/web`
4. Add any **environment variables** required by the site.

View File

@@ -20,7 +20,12 @@ Push this project to a [GitHub repo](https://github.com/new).
{% section #step-2 step=2 title="Create Appwrite project" %}
Head to the [Appwrite Console](https://cloud.appwrite.io).
{% only_dark %}
![Create Appwrite project](/images/docs/quick-starts/dark/create-project.png)
{% /only_dark %}
{% only_light %}
![Create Appwrite project](/images/docs/quick-starts/create-project.png)
{% /only_light %}
If this is your first time using Appwrite, create an account and create your first project.
{% /section %}

View File

@@ -20,7 +20,12 @@ Push this project to a [GitHub repo](https://github.com/new).
{% section #step-2 step=2 title="Create Appwrite project" %}
Head to the [Appwrite Console](https://cloud.appwrite.io).
{% only_dark %}
![Create Appwrite project](/images/docs/quick-starts/dark/create-project.png)
{% /only_dark %}
{% only_light %}
![Create Appwrite project](/images/docs/quick-starts/create-project.png)
{% /only_light %}
If this is your first time using Appwrite, create an account and create your first project.
{% /section %}

View File

@@ -0,0 +1,58 @@
---
layout: article
title: Deploy a React Native app to Appwrite Sites
description: Learn how to setup and deploy React Native apps on Appwrite Sites.
---
{% section #step-1 step=1 title="Create React Native app" %}
First, you must either create a React Native app or setup the [React Native starter template](https://github.com/appwrite/templates-for-sites).
Open your terminal, and run the following command.
```bash
npx create-expo-app my-app
```
Once the app is created, navigate to the project directory, open the `package.json` file and add the following line under `scripts`:
```json
"build": "expo export --platform web"
```
Push this project to a [GitHub repo](https://github.com/new).
{% /section %}
{% section #step-2 step=2 title="Create Appwrite project" %}
Head to the [Appwrite Console](https://cloud.appwrite.io).
{% only_dark %}
![Create Appwrite project](/images/docs/quick-starts/dark/create-project.png)
{% /only_dark %}
{% only_light %}
![Create Appwrite project](/images/docs/quick-starts/create-project.png)
{% /only_light %}
If this is your first time using Appwrite, create an account and create your first project.
{% /section %}
{% section #step-3 step=3 title="Create site" %}
Head to the **Sites** page in your Appwrite project, click on the **Create site** button, and select **Connect a repository**.
Connect your GitHub account and select the repository you intend to deploy.
1. Select the **production branch** and **root directory** from your repo.
2. Verify that the **correct framework** is selected. In case an incorrect framework is visible, pick **React Native** from the drop-down list.
3. Confirm the **install command**, **build command**, and **output directory** in the build settings. The default build settings for React Native are:
- **Install command:** `npm install`
- **Build command:** `npm run build`
- **Output directory:** `./dist`
4. Add any **environment variables** required by the site.
Click on the **Deploy** button.
{% /section %}
{% section #step-4 step=4 title="Visit site" %}
After successful deployment, click on the **Visit site** button.
{% /section %}

View File

@@ -20,7 +20,12 @@ Push this project to a [GitHub repo](https://github.com/new).
{% section #step-2 step=2 title="Create Appwrite project" %}
Head to the [Appwrite Console](https://cloud.appwrite.io).
{% only_dark %}
![Create Appwrite project](/images/docs/quick-starts/dark/create-project.png)
{% /only_dark %}
{% only_light %}
![Create Appwrite project](/images/docs/quick-starts/create-project.png)
{% /only_light %}
If this is your first time using Appwrite, create an account and create your first project.
{% /section %}

View File

@@ -20,7 +20,12 @@ Push this project to a [GitHub repo](https://github.com/new).
{% section #step-2 step=2 title="Create Appwrite project" %}
Head to the [Appwrite Console](https://cloud.appwrite.io).
{% only_dark %}
![Create Appwrite project](/images/docs/quick-starts/dark/create-project.png)
{% /only_dark %}
{% only_light %}
![Create Appwrite project](/images/docs/quick-starts/create-project.png)
{% /only_light %}
If this is your first time using Appwrite, create an account and create your first project.
{% /section %}

View File

@@ -20,7 +20,12 @@ Push this project to a [GitHub repo](https://github.com/new).
{% section #step-2 step=2 title="Create Appwrite project" %}
Head to the [Appwrite Console](https://cloud.appwrite.io).
{% only_dark %}
![Create Appwrite project](/images/docs/quick-starts/dark/create-project.png)
{% /only_dark %}
{% only_light %}
![Create Appwrite project](/images/docs/quick-starts/create-project.png)
{% /only_light %}
If this is your first time using Appwrite, create an account and create your first project.
{% /section %}

View File

@@ -43,7 +43,12 @@ Push this project to a [GitHub repo](https://github.com/new).
{% section #step-2 step=2 title="Create Appwrite project" %}
Head to the [Appwrite Console](https://cloud.appwrite.io).
{% only_dark %}
![Create Appwrite project](/images/docs/quick-starts/dark/create-project.png)
{% /only_dark %}
{% only_light %}
![Create Appwrite project](/images/docs/quick-starts/create-project.png)
{% /only_light %}
If this is your first time using Appwrite, create an account and create your first project.
{% /section %}

View File

@@ -20,7 +20,12 @@ Push this project to a [GitHub repo](https://github.com/new).
{% section #step-2 step=2 title="Create Appwrite project" %}
Head to the [Appwrite Console](https://cloud.appwrite.io).
{% only_dark %}
![Create Appwrite project](/images/docs/quick-starts/dark/create-project.png)
{% /only_dark %}
{% only_light %}
![Create Appwrite project](/images/docs/quick-starts/create-project.png)
{% /only_light %}
If this is your first time using Appwrite, create an account and create your first project.
{% /section %}

File diff suppressed because it is too large Load Diff

View File

@@ -34,7 +34,7 @@ After opening the file, add the following info:
"env": {
"APPWRITE_PROJECT_ID": "your-project-id",
"APPWRITE_API_KEY": "your-api-key",
"APPWRITE_ENDPOINT": "https://cloud.appwrite.io/v1" // Optional
"APPWRITE_ENDPOINT": "https://<REGION>.cloud.appwrite.io/v1"
}
}
}

View File

@@ -14,31 +14,27 @@ You must install [uv](https://docs.astral.sh/uv/getting-started/installation/) o
{% section #step-1 step=1 title="Add MCP server" %}
Open the **Cursor Settings** page, head to the **MCP** tab, and click on the **Add new MCP server** button.
Open the **Cursor Settings** page, head to the **MCP** tab, and click on the **Add new global MCP server** button. This will open an `mcp.json` file in your editor, which you must update to the following:
![Add MCP server](/images/docs/mcp/cursor/cursor-add-mcp.png)
Enter the name as `Appwrite`, select the `command` type, and enter the following command:
{% tabs %}
{% tabsitem #linux-macos title="MacOS" %}
```sh
env APPWRITE_API_KEY=your-api-key env APPWRITE_PROJECT_ID=your-project-id uvx mcp-server-appwrite --databases --users
```json
{
"mcpServers": {
"appwrite": {
"command": "uvx",
"args": [
"mcp-server-appwrite",
"--users"
],
"env": {
"APPWRITE_API_KEY": "<your-api-key>",
"APPWRITE_PROJECT_ID": "<your-project-id>",
"APPWRITE_ENDPOINT": "https://<REGION>.cloud.appwrite.io/v1"
}
}
}
}
```
{% /tabsitem %}
{% tabsitem #windows title="Windows" %}
```cmd
cmd /c SET APPWRITE_PROJECT_ID=your-project-id && SET APPWRITE_API_KEY=your-api-key && uvx mcp-server-appwrite --databases --users
```
{% /tabsitem %}
{% /tabs %}
Once you save the details, Cursor will connect with the MCP server and load all available tools. You may need to restart Cursor if it is unable to start the MCP server.
{% info title="Enable other MCP tools" %}

View File

@@ -33,7 +33,7 @@ Update the `mcp_config.json` file to include the following:
"env": {
"APPWRITE_PROJECT_ID": "your-project-id",
"APPWRITE_API_KEY": "your-api-key",
"APPWRITE_ENDPOINT": "https://cloud.appwrite.io/v1" // Optional
"APPWRITE_ENDPOINT": "https://<REGION>.cloud.appwrite.io/v1"
}
}
}

View File

@@ -7,17 +7,20 @@
{
icon: DDOS,
label: 'DDOS Protection',
description: 'Own your data or host it on a region of choice.'
description:
'Automatically detect and mitigate Distributed Denial-of-Service (DDoS) attacks to ensure your app stays online and responsive, even under attacks.'
},
{
icon: SSR,
label: 'Server-side rendering',
description: 'Built-in data encryption both in rest and in transit.'
description:
'Deliver dynamic content faster and improve SEO with built-in support for server-side rendering (SSR) in your apps.'
},
{
icon: Domains,
label: 'Custom domains',
description: 'Protect users from abuse with built-in protection.'
description:
'Easily connect your own domain name to your Appwrite project, site, or function for a fully branded experience.'
}
];
</script>

View File

@@ -15,9 +15,9 @@
)}
>
<div
class="container mx-auto grid w-full grid-cols-1 place-items-center gap-x-16 gap-y-8 py-12 max-md:px-5! md:grid-cols-12 md:py-20"
class="container mx-auto grid w-full grid-cols-1 place-items-center gap-x-16 gap-y-8 py-12 max-lg:px-5! lg:grid-cols-12 lg:py-20"
>
<div class="col-span-6 flex flex-col gap-6 lg:col-span-5">
<div class="cols-span-full flex flex-col gap-6 lg:col-span-5">
<div class="flex items-center gap-2">
<img
src="/images/icons/illustrated/dark/sites.png"
@@ -46,12 +46,12 @@
</a>
</div>
</div>
<img src={Illustration} alt="Illustration" class="col-span-6 lg:col-span-7" />
<img src={Illustration} alt="Illustration" class="col-span-full lg:col-span-7" />
<a
href="https://www.producthunt.com/posts/appwrite-sites"
target="_blank"
title="Check Appwrite Sites on ProductHunt"
class="col-span-full flex w-full justify-start lg:col-span-7 lg:col-start-6 lg:justify-center"
class="col-span-full flex w-full justify-center lg:col-span-7 lg:col-start-6"
><div><ProductHuntBadge /></div></a
>
</div>

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 338 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 468 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 468 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 338 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 182 KiB

After

Width:  |  Height:  |  Size: 140 KiB

View File

@@ -32,7 +32,7 @@ services:
- appwrite
appwrite:
image: appwrite/appwrite:1.6.2
image: appwrite/appwrite:1.7.4
container_name: appwrite
<<: *x-logging
restart: unless-stopped
@@ -54,10 +54,13 @@ services:
- traefik.http.routers.appwrite_api_https.tls=true
volumes:
- appwrite-uploads:/storage/uploads:rw
- appwrite-imports:/storage/imports:rw
- appwrite-cache:/storage/cache:rw
- appwrite-config:/storage/config:rw
- appwrite-certificates:/storage/certificates:rw
- appwrite-functions:/storage/functions:rw
- appwrite-sites:/storage/sites:rw
- appwrite-builds:/storage/builds:rw
depends_on:
- mariadb
- redis
@@ -79,10 +82,12 @@ services:
- _APP_OPTIONS_ABUSE
- _APP_OPTIONS_ROUTER_PROTECTION
- _APP_OPTIONS_FORCE_HTTPS
- _APP_OPTIONS_FUNCTIONS_FORCE_HTTPS
- _APP_OPTIONS_ROUTER_FORCE_HTTPS
- _APP_OPENSSL_KEY_V1
- _APP_DOMAIN
- _APP_DOMAIN_TARGET
- _APP_DOMAIN_TARGET_CNAME
- _APP_DOMAIN_TARGET_AAAA
- _APP_DOMAIN_TARGET_A
- _APP_DOMAIN_FUNCTIONS
- _APP_REDIS_HOST
- _APP_REDIS_PORT
@@ -126,17 +131,21 @@ services:
- _APP_STORAGE_WASABI_SECRET
- _APP_STORAGE_WASABI_REGION
- _APP_STORAGE_WASABI_BUCKET
- _APP_FUNCTIONS_SIZE_LIMIT
- _APP_COMPUTE_SIZE_LIMIT
- _APP_FUNCTIONS_TIMEOUT
- _APP_FUNCTIONS_BUILD_TIMEOUT
- _APP_FUNCTIONS_CPUS
- _APP_FUNCTIONS_MEMORY
- _APP_SITES_TIMEOUT
- _APP_COMPUTE_BUILD_TIMEOUT
- _APP_COMPUTE_CPUS
- _APP_COMPUTE_MEMORY
- _APP_FUNCTIONS_RUNTIMES
- _APP_SITES_RUNTIMES
- _APP_DOMAIN_SITES
- _APP_EXECUTOR_SECRET
- _APP_EXECUTOR_HOST
- _APP_LOGGING_CONFIG
- _APP_MAINTENANCE_INTERVAL
- _APP_MAINTENANCE_DELAY
- _APP_MAINTENANCE_START_TIME
- _APP_MAINTENANCE_RETENTION_EXECUTION
- _APP_MAINTENANCE_RETENTION_CACHE
- _APP_MAINTENANCE_RETENTION_ABUSE
@@ -158,10 +167,11 @@ services:
- _APP_MIGRATIONS_FIREBASE_CLIENT_ID
- _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET
- _APP_ASSISTANT_OPENAI_API_KEY
appwrite-console:
<<: *x-logging
container_name: appwrite-console
image: appwrite/console:5.2.58
image: appwrite/console:6.0.13
restart: unless-stopped
networks:
- appwrite
@@ -181,7 +191,7 @@ services:
- traefik.http.routers.appwrite_console_https.tls=true
appwrite-realtime:
image: appwrite/appwrite:1.6.2
image: appwrite/appwrite:1.7.4
entrypoint: realtime
container_name: appwrite-realtime
<<: *x-logging
@@ -224,7 +234,7 @@ services:
- _APP_LOGGING_CONFIG
appwrite-worker-audits:
image: appwrite/appwrite:1.6.2
image: appwrite/appwrite:1.7.4
entrypoint: worker-audits
<<: *x-logging
container_name: appwrite-worker-audits
@@ -250,7 +260,7 @@ services:
- _APP_LOGGING_CONFIG
appwrite-worker-webhooks:
image: appwrite/appwrite:1.6.2
image: appwrite/appwrite:1.7.4
entrypoint: worker-webhooks
<<: *x-logging
container_name: appwrite-worker-webhooks
@@ -278,7 +288,7 @@ services:
- _APP_LOGGING_CONFIG
appwrite-worker-deletes:
image: appwrite/appwrite:1.6.2
image: appwrite/appwrite:1.7.4
entrypoint: worker-deletes
<<: *x-logging
container_name: appwrite-worker-deletes
@@ -292,6 +302,7 @@ services:
- appwrite-uploads:/storage/uploads:rw
- appwrite-cache:/storage/cache:rw
- appwrite-functions:/storage/functions:rw
- appwrite-sites:/storage/sites:rw
- appwrite-builds:/storage/builds:rw
- appwrite-certificates:/storage/certificates:rw
environment:
@@ -340,7 +351,7 @@ services:
- _APP_EMAIL_CERTIFICATES
appwrite-worker-databases:
image: appwrite/appwrite:1.6.2
image: appwrite/appwrite:1.7.4
entrypoint: worker-databases
<<: *x-logging
container_name: appwrite-worker-databases
@@ -366,7 +377,7 @@ services:
- _APP_LOGGING_CONFIG
appwrite-worker-builds:
image: appwrite/appwrite:1.6.2
image: appwrite/appwrite:1.7.4
entrypoint: worker-builds
<<: *x-logging
container_name: appwrite-worker-builds
@@ -378,7 +389,9 @@ services:
- mariadb
volumes:
- appwrite-functions:/storage/functions:rw
- appwrite-sites:/storage/sites:rw
- appwrite-builds:/storage/builds:rw
- appwrite-uploads:/storage/uploads:rw
environment:
- _APP_ENV
- _APP_WORKER_PER_CORE
@@ -399,12 +412,13 @@ services:
- _APP_VCS_GITHUB_PRIVATE_KEY
- _APP_VCS_GITHUB_APP_ID
- _APP_FUNCTIONS_TIMEOUT
- _APP_FUNCTIONS_BUILD_TIMEOUT
- _APP_FUNCTIONS_CPUS
- _APP_FUNCTIONS_MEMORY
- _APP_FUNCTIONS_SIZE_LIMIT
- _APP_SITES_TIMEOUT
- _APP_COMPUTE_BUILD_TIMEOUT
- _APP_COMPUTE_CPUS
- _APP_COMPUTE_MEMORY
- _APP_COMPUTE_SIZE_LIMIT
- _APP_OPTIONS_FORCE_HTTPS
- _APP_OPTIONS_FUNCTIONS_FORCE_HTTPS
- _APP_OPTIONS_ROUTER_FORCE_HTTPS
- _APP_DOMAIN
- _APP_STORAGE_DEVICE
- _APP_STORAGE_S3_ACCESS_KEY
@@ -428,9 +442,10 @@ services:
- _APP_STORAGE_WASABI_SECRET
- _APP_STORAGE_WASABI_REGION
- _APP_STORAGE_WASABI_BUCKET
- _APP_DOMAIN_SITES
appwrite-worker-certificates:
image: appwrite/appwrite:1.6.2
image: appwrite/appwrite:1.7.4
entrypoint: worker-certificates
<<: *x-logging
container_name: appwrite-worker-certificates
@@ -448,7 +463,9 @@ services:
- _APP_WORKER_PER_CORE
- _APP_OPENSSL_KEY_V1
- _APP_DOMAIN
- _APP_DOMAIN_TARGET
- _APP_DOMAIN_TARGET_CNAME
- _APP_DOMAIN_TARGET_AAAA
- _APP_DOMAIN_TARGET_A
- _APP_DOMAIN_FUNCTIONS
- _APP_EMAIL_CERTIFICATES
- _APP_REDIS_HOST
@@ -463,7 +480,7 @@ services:
- _APP_LOGGING_CONFIG
appwrite-worker-functions:
image: appwrite/appwrite:1.6.2
image: appwrite/appwrite:1.7.4
entrypoint: worker-functions
<<: *x-logging
container_name: appwrite-worker-functions
@@ -490,9 +507,10 @@ services:
- _APP_DB_USER
- _APP_DB_PASS
- _APP_FUNCTIONS_TIMEOUT
- _APP_FUNCTIONS_BUILD_TIMEOUT
- _APP_FUNCTIONS_CPUS
- _APP_FUNCTIONS_MEMORY
- _APP_SITES_TIMEOUT
- _APP_COMPUTE_BUILD_TIMEOUT
- _APP_COMPUTE_CPUS
- _APP_COMPUTE_MEMORY
- _APP_EXECUTOR_SECRET
- _APP_EXECUTOR_HOST
- _APP_USAGE_STATS
@@ -501,7 +519,7 @@ services:
- _APP_LOGGING_CONFIG
appwrite-worker-mails:
image: appwrite/appwrite:1.6.2
image: appwrite/appwrite:1.7.4
entrypoint: worker-mails
<<: *x-logging
container_name: appwrite-worker-mails
@@ -535,7 +553,7 @@ services:
- _APP_OPTIONS_FORCE_HTTPS
appwrite-worker-messaging:
image: appwrite/appwrite:1.6.2
image: appwrite/appwrite:1.7.4
entrypoint: worker-messaging
<<: *x-logging
container_name: appwrite-worker-messaging
@@ -586,13 +604,15 @@ services:
- _APP_STORAGE_WASABI_BUCKET
appwrite-worker-migrations:
image: appwrite/appwrite:1.6.2
image: appwrite/appwrite:1.7.4
entrypoint: worker-migrations
<<: *x-logging
container_name: appwrite-worker-migrations
restart: unless-stopped
networks:
- appwrite
volumes:
- appwrite-imports:/storage/imports:rw
depends_on:
- mariadb
environment:
@@ -600,7 +620,9 @@ services:
- _APP_WORKER_PER_CORE
- _APP_OPENSSL_KEY_V1
- _APP_DOMAIN
- _APP_DOMAIN_TARGET
- _APP_DOMAIN_TARGET_CNAME
- _APP_DOMAIN_TARGET_AAAA
- _APP_DOMAIN_TARGET_A
- _APP_EMAIL_SECURITY
- _APP_REDIS_HOST
- _APP_REDIS_PORT
@@ -616,7 +638,7 @@ services:
- _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET
appwrite-task-maintenance:
image: appwrite/appwrite:1.6.2
image: appwrite/appwrite:1.7.4
entrypoint: maintenance
<<: *x-logging
container_name: appwrite-task-maintenance
@@ -629,7 +651,9 @@ services:
- _APP_ENV
- _APP_WORKER_PER_CORE
- _APP_DOMAIN
- _APP_DOMAIN_TARGET
- _APP_DOMAIN_TARGET_CNAME
- _APP_DOMAIN_TARGET_AAAA
- _APP_DOMAIN_TARGET_A
- _APP_DOMAIN_FUNCTIONS
- _APP_OPENSSL_KEY_V1
- _APP_REDIS_HOST
@@ -651,15 +675,13 @@ services:
- _APP_MAINTENANCE_RETENTION_SCHEDULES
appwrite-task-stats-resources:
image: appwrite/appwrite:1.6.2
image: appwrite/appwrite:1.7.4
container_name: appwrite-task-stats-resources
entrypoint: stats-resources
<<: *x-logging
restart: unless-stopped
networks:
- appwrite
volumes:
- ./app:/usr/src/code/app
- ./src:/usr/src/code/src
depends_on:
- redis
- mariadb
@@ -682,7 +704,7 @@ services:
- _APP_STATS_RESOURCES_INTERVAL
appwrite-worker-stats-resources:
image: appwrite/appwrite:1.6.2
image: appwrite/appwrite:1.7.4
entrypoint: worker-stats-resources
container_name: appwrite-worker-stats-resources
<<: *x-logging
@@ -710,7 +732,7 @@ services:
- _APP_STATS_RESOURCES_INTERVAL
appwrite-worker-stats-usage:
image: appwrite/appwrite:1.6.2
image: appwrite/appwrite:1.7.4
entrypoint: worker-stats-usage
container_name: appwrite-worker-stats-usage
<<: *x-logging
@@ -738,7 +760,7 @@ services:
- _APP_USAGE_AGGREGATION_INTERVAL
appwrite-task-scheduler-functions:
image: appwrite/appwrite:1.6.2
image: appwrite/appwrite:1.7.4
entrypoint: schedule-functions
container_name: appwrite-task-scheduler-functions
<<: *x-logging
@@ -763,7 +785,7 @@ services:
- _APP_DB_PASS
appwrite-task-scheduler-executions:
image: appwrite/appwrite:1.6.2
image: appwrite/appwrite:1.7.4
entrypoint: schedule-executions
container_name: appwrite-task-scheduler-executions
<<: *x-logging
@@ -788,7 +810,7 @@ services:
- _APP_DB_PASS
appwrite-task-scheduler-messages:
image: appwrite/appwrite:1.6.2
image: appwrite/appwrite:1.7.4
entrypoint: schedule-messages
container_name: appwrite-task-scheduler-messages
<<: *x-logging
@@ -821,6 +843,14 @@ services:
- appwrite
environment:
- _APP_ASSISTANT_OPENAI_API_KEY
appwrite-browser:
image: appwrite/browser:0.2.4
container_name: appwrite-browser
<<: *x-logging
restart: unless-stopped
networks:
- appwrite
openruntimes-executor:
container_name: openruntimes-executor
@@ -828,7 +858,7 @@ services:
<<: *x-logging
restart: unless-stopped
stop_signal: SIGINT
image: openruntimes/executor:0.6.11
image: openruntimes/executor:0.7.14
networks:
- appwrite
- runtimes
@@ -836,18 +866,20 @@ services:
- /var/run/docker.sock:/var/run/docker.sock
- appwrite-builds:/storage/builds:rw
- appwrite-functions:/storage/functions:rw
- appwrite-sites:/storage/sites:rw
# Host mount nessessary to share files between executor and runtimes.
# It's not possible to share mount file between 2 containers without host mount (copying is too slow)
- /tmp:/tmp:rw
environment:
- OPR_EXECUTOR_INACTIVE_TRESHOLD=$_APP_FUNCTIONS_INACTIVE_THRESHOLD
- OPR_EXECUTOR_MAINTENANCE_INTERVAL=$_APP_FUNCTIONS_MAINTENANCE_INTERVAL
- OPR_EXECUTOR_NETWORK=$_APP_FUNCTIONS_RUNTIMES_NETWORK
- OPR_EXECUTOR_INACTIVE_TRESHOLD=$_APP_COMPUTE_INACTIVE_THRESHOLD
- OPR_EXECUTOR_MAINTENANCE_INTERVAL=$_APP_COMPUTE_MAINTENANCE_INTERVAL
- OPR_EXECUTOR_NETWORK=$_APP_COMPUTE_RUNTIMES_NETWORK
- OPR_EXECUTOR_DOCKER_HUB_USERNAME=$_APP_DOCKER_HUB_USERNAME
- OPR_EXECUTOR_DOCKER_HUB_PASSWORD=$_APP_DOCKER_HUB_PASSWORD
- OPR_EXECUTOR_ENV=$_APP_ENV
- OPR_EXECUTOR_RUNTIMES=$_APP_FUNCTIONS_RUNTIMES
- OPR_EXECUTOR_RUNTIMES=$_APP_FUNCTIONS_RUNTIMES,$_APP_SITES_RUNTIMES
- OPR_EXECUTOR_SECRET=$_APP_EXECUTOR_SECRET
- OPR_EXECUTOR_RUNTIME_VERSIONS=v5
- OPR_EXECUTOR_LOGGING_CONFIG=$_APP_LOGGING_CONFIG
- OPR_EXECUTOR_STORAGE_DEVICE=$_APP_STORAGE_DEVICE
- OPR_EXECUTOR_STORAGE_S3_ACCESS_KEY=$_APP_STORAGE_S3_ACCESS_KEY
@@ -926,7 +958,9 @@ volumes:
appwrite-redis:
appwrite-cache:
appwrite-uploads:
appwrite-imports:
appwrite-certificates:
appwrite-functions:
appwrite-sites:
appwrite-builds:
appwrite-config:

View File

@@ -3,12 +3,17 @@ _APP_LOCALE=en
_APP_OPTIONS_ABUSE=enabled
_APP_OPTIONS_FORCE_HTTPS=disabled
_APP_OPTIONS_FUNCTIONS_FORCE_HTTPS=disabled
_APP_OPTIONS_ROUTER_FORCE_HTTPS=disabled
_APP_OPTIONS_ROUTER_PROTECTION=disabled
_APP_OPENSSL_KEY_V1=your-secret-key
_APP_DOMAIN=localhost
_APP_CUSTOM_DOMAIN_DENY_LIST=example.com,test.com,app.example.com
_APP_DOMAIN_FUNCTIONS=functions.localhost
_APP_DOMAIN_SITES=sites.localhost
_APP_DOMAIN_TARGET=localhost
_APP_DOMAIN_TARGET_CNAME=localhost
_APP_DOMAIN_TARGET_AAAA=::1
_APP_DOMAIN_TARGET_A=127.0.0.1
_APP_CONSOLE_WHITELIST_ROOT=enabled
_APP_CONSOLE_WHITELIST_EMAILS=
_APP_CONSOLE_WHITELIST_IPS=
@@ -79,12 +84,16 @@ _APP_STORAGE_WASABI_SECRET=
_APP_STORAGE_WASABI_REGION=eu-central-1
_APP_STORAGE_WASABI_BUCKET=
_APP_FUNCTIONS_SIZE_LIMIT=30000000
_APP_COMPUTE_SIZE_LIMIT=30000000
_APP_FUNCTIONS_BUILD_SIZE_LIMIT=2000000000
_APP_FUNCTIONS_TIMEOUT=900
_APP_FUNCTIONS_BUILD_TIMEOUT=900
_APP_COMPUTE_BUILD_TIMEOUT=900
_APP_FUNCTIONS_CONTAINERS=10
_APP_FUNCTIONS_CPUS=0
_APP_COMPUTE_CPUS=0
_APP_FUNCTIONS_MEMORY=0
_APP_COMPUTE_MEMORY=0
_APP_FUNCTIONS_MEMORY_SWAP=0
_APP_FUNCTIONS_RUNTIMES=node-16.0,php-8.0,python-3.9,ruby-3.0
_APP_EXECUTOR_SECRET=your-secret-key
@@ -92,14 +101,19 @@ _APP_EXECUTOR_HOST=http://exc1/v1
_APP_EXECUTOR_RUNTIME_NETWORK=appwrite_runtimes
_APP_FUNCTIONS_ENVS=node-16.0,php-7.4,python-3.9,ruby-3.0
_APP_FUNCTIONS_INACTIVE_THRESHOLD=60
_APP_COMPUTE_INACTIVE_THRESHOLD=60
DOCKERHUB_PULL_USERNAME=
DOCKERHUB_PULL_PASSWORD=
DOCKERHUB_PULL_EMAIL=
OPEN_RUNTIMES_NETWORK=appwrite_runtimes
_APP_FUNCTIONS_RUNTIMES_NETWORK=runtimes
_APP_COMPUTE_RUNTIMES_NETWORK=runtimes
_APP_DOCKER_HUB_USERNAME=
_APP_DOCKER_HUB_PASSWORD=
_APP_FUNCTIONS_MAINTENANCE_INTERVAL=3600
_APP_COMPUTE_MAINTENANCE_INTERVAL=3600
_APP_SITES_TIMEOUT=900
_APP_SITES_RUNTIMES=static-1,node-22,flutter-3.29
_APP_VCS_GITHUB_APP_NAME=
_APP_VCS_GITHUB_PRIVATE_KEY=
_APP_VCS_GITHUB_APP_ID=
@@ -108,6 +122,7 @@ _APP_VCS_GITHUB_CLIENT_SECRET=
_APP_VCS_GITHUB_WEBHOOK_SECRET=
_APP_MAINTENANCE_INTERVAL=86400
_APP_MAINTENANCE_DELAY=0
_APP_MAINTENANCE_START_TIME=00:00
_APP_MAINTENANCE_RETENTION_CACHE=2592000
_APP_MAINTENANCE_RETENTION_EXECUTION=1209600
_APP_MAINTENANCE_RETENTION_AUDIT=1209600