Merge branch 'main' of https://github.com/appwrite/website into fix-torsten-qa
25
.idea/workspace.xml
generated
Normal file
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="AutoImportSettings">
|
||||
<option name="autoReloadType" value="SELECTIVE" />
|
||||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="b9b3f992-a7ab-4f15-8768-3d0a4a05287d" name="Changes" comment="" />
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||
<option name="LAST_RESOLUTION" value="IGNORE" />
|
||||
</component>
|
||||
<component name="ComposerSettings">
|
||||
<execution />
|
||||
</component>
|
||||
<component name="PropertiesComponent"><![CDATA[{
|
||||
"keyToString": {
|
||||
"dart.analysis.tool.window.visible": "false",
|
||||
"node.js.selected.package.tslint": "(autodetect)"
|
||||
}
|
||||
}]]></component>
|
||||
<component name="TaskManager">
|
||||
<servers />
|
||||
</component>
|
||||
</project>
|
||||
@@ -5,7 +5,7 @@
|
||||
<link rel="icon" type="image/svg+xml" href="/images/logos/logo.svg" />
|
||||
<link rel="stylesheet" href="/icon-font/aw-icon.css" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Appwrite - build like a team of hundreds</title>
|
||||
<title>Appwrite - Build like a team of hundreds</title>
|
||||
%sveltekit.head%
|
||||
</head>
|
||||
<body class="theme-dark" data-sveltekit-preload-data="hover">
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
'Rate-limits and advanced user protection',
|
||||
'Custome SMTP and email templates'
|
||||
],
|
||||
shot: './images/products/Auth.svg'
|
||||
shot: './images/products/auth.png'
|
||||
},
|
||||
databases: {
|
||||
icon: {
|
||||
@@ -53,7 +53,7 @@
|
||||
'Custom data validation',
|
||||
'Relationships support',
|
||||
],
|
||||
shot: './images/products/Databases.svg'
|
||||
shot: './images/products/databases.png'
|
||||
},
|
||||
functions: {
|
||||
icon: {
|
||||
@@ -69,7 +69,7 @@
|
||||
'Support for 30+ runtimes in 13 languages',
|
||||
'Custom domain support'
|
||||
],
|
||||
shot: './images/products/Functions.svg'
|
||||
shot: './images/products/functions.png'
|
||||
},
|
||||
storage: {
|
||||
icon: {
|
||||
@@ -84,7 +84,7 @@
|
||||
'Built-in image transformation capabilities',
|
||||
'Advanced compression with WebP/Brotli support'
|
||||
],
|
||||
shot: './images/products/Storage.svg'
|
||||
shot: './images/products/storage.png'
|
||||
},
|
||||
realtime: {
|
||||
icon: {
|
||||
@@ -99,7 +99,7 @@
|
||||
'Built-in permission management',
|
||||
'Support for DBs, Auth, Storage & Functions',
|
||||
],
|
||||
shot: './images/products/Realtime.svg'
|
||||
shot: './images/products/realtime.png'
|
||||
}
|
||||
};
|
||||
</script>
|
||||
@@ -214,7 +214,7 @@
|
||||
delay: 400
|
||||
}}
|
||||
>
|
||||
Build secure and scalable applications with less code. Add authentication, databases, storage, and more using Appwrite's core backend products.
|
||||
Build secure and scalable applications with less code. Add authentication, databases, storage, and more using Appwrite's development platform.
|
||||
</p>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
</h2>
|
||||
|
||||
<p class="aw-description u-margin-block-start-16">
|
||||
Build secure and scalable applications with less code. Add authentication, databases, storage, and more using Appwrite's core backend products.
|
||||
Build secure and scalable applications with less code. Add authentication, databases, storage, and more using Appwrite's development platform.
|
||||
</p>
|
||||
|
||||
<div class="infos">
|
||||
|
||||
@@ -110,6 +110,36 @@
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="aw-footer-nav-main-item">
|
||||
<h5 class="aw-footer-nav-main-title aw-is-not-mobile aw-caption-500 aw-eyebrow">Learn</h5>
|
||||
<button class="aw-footer-nav-button is-open aw-is-only-mobile">
|
||||
<span class="aw-caption-500 aw-eyebrow">Learn</span>
|
||||
<svg
|
||||
class="aw-footer-nav-button-arrow"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="20"
|
||||
height="20"
|
||||
viewBox="0 0 20 20"
|
||||
fill="none"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M10.4243 13.0243C10.19 13.2586 9.81007 13.2586 9.57576 13.0243L5.07576 8.52426C4.84145 8.28995 4.84145 7.91005 5.07576 7.67574C5.31007 7.44142 5.68997 7.44142 5.92429 7.67574L10 11.7515L14.0758 7.67574C14.3101 7.44142 14.69 7.44142 14.9243 7.67574C15.1586 7.91005 15.1586 8.28995 14.9243 8.52426L10.4243 13.0243Z"
|
||||
fill="#ADADB0"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
<ul class="aw-footer-nav-secondary-list aw-sub-body-400">
|
||||
<li><a class="aw-link" href="/docs">Docs</a></li>
|
||||
<li><a class="aw-link" href="/blog">Blog</a></li>
|
||||
<li><a class="aw-link" href="/community">Community</a></li>
|
||||
<li><a class="aw-link" href="/heroes">Heroes</a></li>
|
||||
<li>
|
||||
<a class="aw-link" href="https://status.appwrite.io" target="_blank">Status</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="aw-footer-nav-main-item">
|
||||
<h5 class="aw-footer-nav-main-title aw-is-not-mobile aw-caption-500 aw-eyebrow">About</h5>
|
||||
<button class="aw-footer-nav-button is-open aw-is-only-mobile" use:accordion>
|
||||
@@ -138,7 +168,6 @@
|
||||
<li>
|
||||
<a class="aw-link" href="https://store.appwrite.io" target="_blank">Store</a>
|
||||
</li>
|
||||
<li><a class="aw-link" href="/brand">Brand</a></li>
|
||||
<li>
|
||||
<a class="aw-link" href="/contact-us">Contact us</a>
|
||||
</li>
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
<script lang="ts">
|
||||
import { getContext, hasContext } from 'svelte';
|
||||
|
||||
export let href: string;
|
||||
export let title: string;
|
||||
|
||||
@@ -11,7 +9,7 @@
|
||||
|
||||
<a class="aw-link" {href} {title} {target} {rel}>
|
||||
<slot />
|
||||
{#if isExternal}
|
||||
{#if !isExternal}
|
||||
<!-- <span class="icon-cheveron-right" /> -->
|
||||
{/if}
|
||||
</a>
|
||||
|
||||
@@ -1,21 +1,10 @@
|
||||
|
||||
{% info title="Account vs Users API" %}
|
||||
Appwrite provides two APIs to manager user accounts.
|
||||
|
||||
The Account API is the API you should use in your **client applications** like web, Flutter, mobile, and native apps.
|
||||
The Account API is the API you should use in your **client applications** with [Client SDKs](/docs/sdks#client) like web, Flutter, mobile, and native apps.
|
||||
Account API creates sessions, which represent an authenticated user and is attached to a user's [account](/docs/products/auth/accounts).
|
||||
Sessions respect [permissions](/docs/advanced/platform/permissions), which means users can only access resources if they have been granted the correct permissions.
|
||||
|
||||
You'll notice that the Account API doesn't allow you to view or make changes to other users.
|
||||
This is by design and for **security reasons**.
|
||||
|
||||
[Account API references](/docs/references/cloud/client-web/account)
|
||||
|
||||
The Users API is a dedicated API for managing users from an admin's perspective. **Do not use the Users API on client applications**.
|
||||
It should be used with backend or server-side applications with the [Server SDK](#).
|
||||
|
||||
Users API uses API keys instead of sessions.
|
||||
The Users API is a dedicated API for managing users from an admin's perspective.
|
||||
It should be used with backend or server-side applications with [Server SDKs](/docs/sdks#server). Users API uses API keys instead of sessions.
|
||||
This means they're not resticted by permissions, but by the scopes granted to the API key used.
|
||||
|
||||
[Users API references](/docs/references/cloud/server-nodejs/users)
|
||||
{% /info %}
|
||||
@@ -57,7 +57,7 @@
|
||||
<span class="aw-icon-star" aria-hidden="true" />
|
||||
<span class="aw-caption-500">New</span>
|
||||
<div class="aw-hero-banner-button-sep" />
|
||||
<span class="aw-caption-400">Intorudcing a *brand* new Appwrite</span>
|
||||
<span class="aw-caption-400">Meet the new Appwrite</span>
|
||||
<span class="aw-icon-arrow-right" aria-hidden="true" />
|
||||
</a>
|
||||
<div class="aw-hero is-horizontal">
|
||||
@@ -87,7 +87,7 @@
|
||||
<div style="aspect-ratio: 1244 / 717">
|
||||
<img
|
||||
class="u-block"
|
||||
src="/images/pages/homepage/dashboard.svg"
|
||||
src="/images/pages/homepage/dashboard.png"
|
||||
alt="console dashboard"
|
||||
/>
|
||||
</div>
|
||||
@@ -367,140 +367,58 @@
|
||||
class="u-flex u-flex-wrap u-gap-16 aw-u-margin-block-32-mobile aw-u-margin-block-40-not-mobile"
|
||||
>
|
||||
<li>
|
||||
<div class="aw-box-icon">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="32"
|
||||
height="32"
|
||||
viewBox="0 0 32 32"
|
||||
fill="none"
|
||||
>
|
||||
<path
|
||||
d="M8.92198 28.2118L8.922 28.2118C10.1507 28.9195 11.5645 28.6104 12.8493 27.953C14.092 27.317 15.2441 26.3408 16.0517 25.5696C16.8544 26.3363 17.9799 27.3147 19.1944 27.9542C20.4507 28.6157 21.8345 28.9308 23.0553 28.225C24.279 27.5174 24.7171 26.1443 24.7903 24.7093C24.8611 23.321 24.593 21.8415 24.3308 20.7613C25.3708 20.449 26.7776 19.947 27.9426 19.2012C29.1474 18.4299 30.125 17.3767 30.125 15.9768C30.125 14.5684 29.1425 13.53 27.9276 12.7756C26.7527 12.0461 25.3306 11.5628 24.2701 11.2533C24.5276 10.1852 24.8058 8.70025 24.7466 7.30393C24.6855 5.86013 24.2613 4.47317 23.0347 3.76683C21.8134 3.06325 20.4219 3.39468 19.1605 4.06928C17.9407 4.7217 16.8108 5.71111 16.0127 6.47432C15.2146 5.71789 14.0654 4.73526 12.8247 4.08886C11.5418 3.42055 10.127 3.09492 8.90162 3.80346L8.96402 3.91137L8.90162 3.80346C7.68069 4.50944 7.27327 5.88006 7.22877 7.30936C7.18575 8.69121 7.47997 10.1634 7.74354 11.2358C6.66739 11.546 5.24137 12.0274 4.06663 12.758C2.85173 13.5137 1.875 14.556 1.875 15.9768C1.875 17.3927 2.84946 18.4623 4.06122 19.246C5.23329 20.0041 6.65512 20.5137 7.72694 20.8261C7.46292 21.9034 7.17672 23.3656 7.22867 24.7357C7.28241 26.1531 7.70034 27.5079 8.92198 28.2118ZM22.8699 10.8917C21.7528 10.6402 20.5469 10.4514 19.2875 10.3311C18.5522 9.28922 17.7916 8.33707 17.0266 7.50469C17.617 6.9384 18.5143 6.10636 19.4708 5.51396C19.9734 5.20264 20.486 4.96166 20.9736 4.85801C21.4596 4.75472 21.9141 4.78898 22.3126 5.0185C22.7152 5.25049 22.9782 5.63297 23.1382 6.11348C23.2986 6.59536 23.3529 7.16894 23.3412 7.76782C23.3189 8.90605 23.0592 10.1091 22.8699 10.8917ZM18.6253 15.9768C18.6253 14.5284 17.4499 13.3544 16 13.3544C14.5503 13.3544 13.3747 14.5284 13.3747 15.9768C13.3747 17.4254 14.5503 18.5994 16 18.5994C17.4499 18.5994 18.6253 17.4254 18.6253 15.9768ZM26.8876 18.214C25.9174 18.7547 24.7583 19.1259 23.937 19.3712C23.5898 18.2948 23.1309 17.156 22.5754 15.9822C23.1053 14.8364 23.546 13.7135 23.8828 12.6454C24.6694 12.8748 25.8391 13.2351 26.8305 13.7663C27.3514 14.0454 27.8162 14.3682 28.1495 14.7381C28.4817 15.1068 28.6789 15.5171 28.6789 15.9768C28.6789 16.909 27.9138 17.6421 26.8876 18.214ZM22.3307 26.9745C21.5278 27.4388 20.5063 27.1263 19.4985 26.5098C18.548 25.9284 17.6559 25.1045 17.0591 24.5334C17.8135 23.6998 18.5661 22.7407 19.3011 21.6817C20.5916 21.5651 21.8146 21.3792 22.9318 21.1278C23.1191 21.9007 23.3684 23.096 23.3807 24.2288C23.3871 24.8252 23.3277 25.3973 23.1634 25.8785C22.9995 26.3584 22.7339 26.7414 22.3307 26.9745ZM9.64443 26.96C8.84154 26.4976 8.60218 25.4573 8.63323 24.2771C8.66252 23.164 8.93125 21.9805 9.12897 21.1801C10.2343 21.4178 11.4489 21.5906 12.7421 21.6975C13.4829 22.735 14.2571 23.6926 15.0385 24.5388C14.5161 25.0368 13.6021 25.8496 12.6098 26.442C12.0843 26.7557 11.5429 27.0039 11.0305 27.1132C10.519 27.2223 10.046 27.1913 9.64443 26.96ZM3.32106 15.9768C3.32106 15.043 4.11274 14.3119 5.1638 13.7472C6.1554 13.2144 7.32989 12.8557 8.1319 12.6272C8.47415 13.7193 8.91507 14.8566 9.44226 16.006C8.90799 17.1729 8.46065 18.3286 8.11501 19.4343C7.34739 19.2106 6.17941 18.8269 5.18533 18.2682C4.66222 17.9742 4.19351 17.6351 3.8568 17.2505C3.52098 16.867 3.32106 16.4439 3.32106 15.9768ZM9.62602 5.05393C10.0286 4.82114 10.4918 4.78455 10.9885 4.88609C11.4866 4.98792 12.0112 5.22748 12.5247 5.53684C13.5006 6.12478 14.4142 6.95072 14.9993 7.5056C14.2222 8.34773 13.4552 9.29813 12.721 10.3294C11.4649 10.4479 10.2598 10.6335 9.14506 10.8799C8.9303 10.0158 8.65051 8.81934 8.61654 7.70901C8.5807 6.53753 8.81984 5.52005 9.62602 5.05393ZM20.3358 11.9057C21.0816 12.0068 21.7994 12.1339 22.4802 12.285C22.2716 12.9382 22.0208 13.6165 21.7313 14.3106C21.2937 13.4936 20.8293 12.6907 20.3358 11.9057ZM14.6138 10.2037C15.0738 9.60925 15.5423 9.05201 16.0132 8.53853C16.4771 9.04701 16.9417 9.60491 17.4007 10.2044C16.4721 10.1676 15.5424 10.1674 14.6138 10.2037ZM11.6659 11.9032C11.1722 12.6855 10.7094 13.4872 10.2787 14.3058C9.99426 13.6142 9.74599 12.9338 9.53645 12.273C10.2124 12.126 10.9257 12.0022 11.6659 11.9032ZM10.2802 17.7046C10.7185 18.5346 11.19 19.347 11.693 20.1395C10.927 20.0472 10.1999 19.9292 9.52015 19.786C9.73386 19.1109 9.98846 18.4136 10.2802 17.7046ZM17.4336 21.8001C16.9722 22.4151 16.5079 22.9834 16.0455 23.4987C15.5675 22.9774 15.0908 22.41 14.6224 21.8048C15.559 21.8356 16.4969 21.8353 17.4336 21.8001ZM21.745 17.6571C22.0525 18.374 22.3169 19.0695 22.5348 19.7359C21.8425 19.889 21.1039 20.0162 20.3297 20.116C20.8297 19.3133 21.3031 18.4936 21.745 17.6571ZM20.9713 15.9891C20.2439 17.4776 19.4111 18.9164 18.4941 20.297C16.8444 20.4119 15.1845 20.4108 13.5337 20.3064C12.5984 18.9365 11.7639 17.4979 11.0407 16.0055C11.7604 14.516 12.589 13.08 13.5199 11.7123C15.1717 11.5905 16.8331 11.5902 18.4848 11.713C19.4075 13.0804 20.2351 14.5125 20.9713 15.9891Z"
|
||||
fill="#D8D8DB"
|
||||
stroke="#D8D8DB"
|
||||
stroke-width="0.25"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<a href="/docs/quick-starts/flutter" class="aw-box-icon">
|
||||
<img src="/images/platforms/dark/flutter.svg" alt="Flutter logo" class="u-only-dark" width="32" height="32" />
|
||||
<img src="/images/platforms/flutter.svg" alt="Flutter logo" class="u-only-light" width="32" height="32" />
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<div class="aw-box-icon">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="32"
|
||||
height="32"
|
||||
viewBox="0 0 32 32"
|
||||
fill="none"
|
||||
>
|
||||
<path
|
||||
d="M17.6263 25.3334H27.5394C27.8543 25.3334 28.1636 25.2472 28.4362 25.0834C28.7089 24.9195 28.9353 24.6838 29.0927 24.4001C29.25 24.1162 29.3328 23.7943 29.3327 23.4667C29.3325 23.139 29.2495 22.8172 29.0919 22.5335L22.4345 10.5335C22.2772 10.2498 22.0508 10.0141 21.7782 9.85032C21.5056 9.68652 21.1963 9.60025 20.8815 9.60025C20.5667 9.60025 20.2575 9.68652 19.9849 9.85032C19.7122 10.0141 19.4859 10.2498 19.3285 10.5335L17.6263 13.6039L14.298 7.59986C14.1406 7.31616 13.9141 7.08056 13.6414 6.91676C13.3687 6.75299 13.0594 6.66675 12.7446 6.66675C12.4297 6.66675 12.1204 6.75299 11.8477 6.91676C11.575 7.08056 11.3486 7.31616 11.1911 7.59986L2.9068 22.5335C2.7492 22.8172 2.66615 23.139 2.66602 23.4667C2.66588 23.7943 2.74866 24.1162 2.90602 24.4001C3.06338 24.6838 3.28979 24.9195 3.56246 25.0834C3.83513 25.2472 4.14445 25.3334 4.45932 25.3334H10.682C13.1474 25.3334 14.9656 24.2064 16.2167 22.0077L19.2541 16.5335L20.881 13.6039L25.7637 22.4038H19.2541L17.6263 25.3334ZM10.5805 22.4008L6.2379 22.3998L12.7475 10.6672L15.9955 16.5335L13.8208 20.4544C12.99 21.881 12.0461 22.4008 10.5805 22.4008Z"
|
||||
fill="#D8D8DB"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<a href="/docs/quick-starts/nextjs" class="aw-box-icon">
|
||||
<img src="/images/platforms/dark/nextjs.svg" alt="Next.js logo" class="u-only-dark" width="32" height="32" />
|
||||
<img src="/images/platforms/nextjs.svg" alt="Next.js logo" class="u-only-light" width="32" height="32" />
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<div class="aw-box-icon">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="25"
|
||||
height="22"
|
||||
viewBox="0 0 25 22"
|
||||
fill="none"
|
||||
>
|
||||
<path
|
||||
d="M0 0.333252L12.4444 21.6666L24.8889 0.333252H20L12.4444 13.2221L4.88889 0.333252H0Z"
|
||||
fill="#D8D8DB"
|
||||
/>
|
||||
<path
|
||||
d="M4.88867 0.333252L12.4442 13.2221L19.9998 0.333252H15.5553L12.5022 5.6778L9.33312 0.333252H4.88867Z"
|
||||
fill="#C3C3C6"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<a href="/docs/quick-starts/react" class="aw-box-icon">
|
||||
<img src="/images/platforms/dark/react.svg" alt="React logo" class="u-only-dark" width="32" height="32" />
|
||||
<img src="/images/platforms/react.svg" alt="React logo" class="u-only-light" width="32" height="32" />
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<div class="aw-box-icon">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="32"
|
||||
height="32"
|
||||
viewBox="0 0 32 32"
|
||||
fill="none"
|
||||
>
|
||||
<path
|
||||
d="M15.1261 2.67392C15.0688 2.67914 14.8863 2.69738 14.7221 2.71041C10.9345 3.05184 7.38677 5.0952 5.13979 8.23583C3.88856 9.98207 3.0883 11.9629 2.78592 14.061C2.67905 14.7934 2.66602 15.0097 2.66602 16.0027C2.66602 16.9957 2.67905 17.212 2.78592 17.9444C3.51059 22.9512 7.07397 27.1578 11.9068 28.7164C12.7722 28.9952 13.6846 29.1855 14.7221 29.3002C15.1261 29.3445 16.8726 29.3445 17.2766 29.3002C19.0674 29.1021 20.5846 28.659 22.0808 27.8954C22.3102 27.7781 22.3545 27.7468 22.3232 27.7207C22.3024 27.7051 21.3249 26.3941 20.1518 24.8095L18.0196 21.9295L15.3477 17.9757C13.8775 15.802 12.668 14.0245 12.6575 14.0245C12.6471 14.0219 12.6367 15.7785 12.6315 17.9236C12.6237 21.6793 12.6211 21.8304 12.5741 21.9191C12.5064 22.0468 12.4542 22.0989 12.3447 22.1562C12.2613 22.1979 12.1883 22.2058 11.7947 22.2058H11.3438L11.2239 22.1302C11.1457 22.0807 11.0883 22.0155 11.0492 21.9399L10.9945 21.8226L10.9997 16.5969L11.0075 11.3686L11.0883 11.267C11.13 11.2123 11.2186 11.1419 11.2812 11.108C11.3881 11.0559 11.4298 11.0507 11.8807 11.0507C12.4125 11.0507 12.5011 11.0715 12.6393 11.2227C12.6784 11.2644 14.1251 13.4433 15.856 16.0679C17.5868 18.6924 19.9537 22.2761 21.1163 24.0354L23.2278 27.2334L23.3346 27.163C24.2809 26.5479 25.2819 25.6722 26.0743 24.76C27.7608 22.8235 28.8478 20.4621 29.2128 17.9444C29.3197 17.212 29.3327 16.9957 29.3327 16.0027C29.3327 15.0097 29.3197 14.7934 29.2128 14.061C28.4881 9.05422 24.9247 4.8476 20.0919 3.28902C19.2395 3.01275 18.3324 2.82248 17.3157 2.70781C17.0655 2.68174 15.3425 2.65307 15.1261 2.67392ZM20.5846 10.7379C20.7097 10.8005 20.8113 10.9204 20.8478 11.0455C20.8687 11.1132 20.8739 12.5623 20.8687 15.8281L20.8609 20.5142L20.0345 19.2476L19.2056 17.9809V14.5744C19.2056 12.3721 19.216 11.1341 19.2317 11.0741C19.2734 10.9282 19.3646 10.8135 19.4897 10.7457C19.5966 10.691 19.6357 10.6858 20.045 10.6858C20.4308 10.6858 20.4985 10.691 20.5846 10.7379Z"
|
||||
fill="#D8D8DB"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<a href="/docs/quick-starts/sveltekit" class="aw-box-icon">
|
||||
<img src="/images/platforms/dark/svelte.svg" alt="Svelte logo" class="u-only-dark" width="32" height="32" />
|
||||
<img src="/images/platforms/svelte.svg" alt="Svelte logo" class="u-only-light" width="32" height="32" />
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<div class="aw-box-icon">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="23"
|
||||
height="25"
|
||||
viewBox="0 0 23 25"
|
||||
fill="none"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M0 4.35897L11.3333 0L22.6667 4.35897L20.9231 19.1795L11.3333 24.4103L1.74359 19.1795L0 4.35897ZM4.24886 18.6251L11.3337 2.69743L18.3942 18.6251H15.7526L14.3283 15.0612H8.31474L6.89046 18.6251H4.24886ZM11.3337 7.8724L9.26426 12.8643H13.4032L11.3337 7.8724Z"
|
||||
fill="#D8D8DB"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<a href="/docs/quick-starts/nuxt" class="aw-box-icon">
|
||||
<img src="/images/platforms/dark/nuxt.svg" alt="Nuxt logo" class="u-only-dark" width="32" height="32" />
|
||||
<img src="/images/platforms/nuxt.svg" alt="Nuxt logo" class="u-only-light" width="32" height="32" />
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<div class="aw-box-icon">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="32"
|
||||
height="32"
|
||||
viewBox="0 0 32 32"
|
||||
fill="none"
|
||||
>
|
||||
<path
|
||||
d="M5.33398 16L9.20495 19.7895L25.334 4H17.592L5.33398 16ZM25.334 15.3684H17.592L11.1404 21.6842L17.592 28H25.334L18.8824 21.6842L25.334 15.3684Z"
|
||||
fill="#D8D8DB"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<a href="/docs/quick-starts/vue" class="aw-box-icon">
|
||||
<img src="/images/platforms/dark/vue.svg" alt="Vue logo" class="u-only-dark" width="32" height="32" />
|
||||
<img src="/images/platforms/vue.svg" alt="Vue logo" class="u-only-light" width="32" height="32" />
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<div class="aw-box-icon">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="32"
|
||||
height="32"
|
||||
viewBox="0 0 32 32"
|
||||
fill="none"
|
||||
>
|
||||
<path
|
||||
d="M26.1916 23.4482C25.7847 24.3798 25.3029 25.2374 24.7448 26.0259C23.9841 27.1007 23.3612 27.8448 22.8811 28.2579C22.137 28.9361 21.3397 29.2834 20.4859 29.3031C19.873 29.3031 19.1338 29.1303 18.2734 28.7797C17.4101 28.4307 16.6168 28.2579 15.8914 28.2579C15.1307 28.2579 14.3148 28.4307 13.4421 28.7797C12.568 29.1303 11.8639 29.313 11.3256 29.3311C10.5068 29.3657 9.69075 29.0085 8.87617 28.2579C8.35627 27.8085 7.70597 27.0382 6.92693 25.9469C6.09109 24.7815 5.40392 23.4301 4.86557 21.8894C4.28902 20.2252 4 18.6138 4 17.0536C4 15.2665 4.38968 13.7252 5.17021 12.4335C5.78363 11.396 6.59971 10.5776 7.62109 9.97682C8.64246 9.37601 9.74607 9.06985 10.9345 9.05026C11.5848 9.05026 12.4376 9.2496 13.4974 9.64136C14.5541 10.0344 15.2327 10.2338 15.5302 10.2338C15.7526 10.2338 16.5064 10.0007 17.7842 9.53601C18.9926 9.10507 20.0125 8.92664 20.848 8.99693C23.112 9.17799 24.8129 10.0624 25.9441 11.6558C23.9193 12.8715 22.9177 14.5744 22.9376 16.7588C22.9559 18.4603 23.5788 19.8763 24.803 21.0005C25.3578 21.5223 25.9773 21.9256 26.6667 22.212C26.5172 22.6416 26.3594 23.0531 26.1916 23.4482ZM20.9992 3.20023C20.9992 4.53387 20.5075 5.77908 19.5275 6.93164C18.3448 8.30181 16.9143 9.09355 15.3631 8.96862C15.3433 8.80862 15.3318 8.64023 15.3318 8.46328C15.3318 7.18299 15.8943 5.81283 16.8931 4.69253C17.3917 4.12531 18.0259 3.65367 18.795 3.27743C19.5624 2.90681 20.2882 2.70185 20.9709 2.66675C20.9909 2.84503 20.9992 3.02333 20.9992 3.20022V3.20023Z"
|
||||
fill="#D8D8DB"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<a href="/docs/quick-starts/angular" class="aw-box-icon">
|
||||
<img src="/images/platforms/dark/angular.svg" alt="Angular logo" class="u-only-dark" width="32" height="32" />
|
||||
<img src="/images/platforms/angular.svg" alt="Angular logo" class="u-only-light" width="32" height="32" />
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<div class="aw-box-icon">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="26"
|
||||
height="15"
|
||||
viewBox="0 0 26 15"
|
||||
fill="none"
|
||||
>
|
||||
<path
|
||||
d="M18.8469 4.61348L20.9484 0.97317C21.067 0.769093 20.9953 0.509856 20.7939 0.391269C20.5926 0.272685 20.3306 0.341628 20.2148 0.545706L18.0858 4.2329C16.4614 3.49105 14.633 3.07737 12.6667 3.07737C10.7003 3.07737 8.8719 3.49105 7.24754 4.2329L5.11851 0.545706C4.99992 0.341628 4.74068 0.272685 4.53661 0.391269C4.33253 0.509856 4.26358 0.769093 4.38217 0.97317L6.48362 4.61348C2.85985 6.57705 0.40539 10.2449 0 14.5388H25.3333C24.9279 10.2449 22.4734 6.57702 18.8469 4.61348ZM6.85042 10.9813C6.263 10.9813 5.78866 10.5042 5.78866 9.91952C5.78866 9.3321 6.26576 8.85776 6.85042 8.85776C7.43783 8.85776 7.91217 9.33486 7.91217 9.91952C7.91494 10.5042 7.43783 10.9813 6.85042 10.9813ZM18.4802 10.9813C17.8927 10.9813 17.4184 10.5042 17.4184 9.91952C17.4184 9.3321 17.8955 8.85776 18.4802 8.85776C19.0676 8.85776 19.5419 9.33486 19.5419 9.91952C19.5447 10.5042 19.0676 10.9813 18.4802 10.9813Z"
|
||||
fill="#D8D8DB"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<a href="/docs/quick-starts/apple" class="aw-box-icon">
|
||||
<img src="/images/platforms/dark/apple.svg" alt="Apple logo" class="u-only-dark" width="32" height="32" />
|
||||
<img src="/images/platforms/apple.svg" alt="Apple logo" class="u-only-light" width="32" height="32" />
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/docs/quick-starts/android" class="aw-box-icon">
|
||||
<img src="/images/platforms/dark/android.svg" alt="Android logo" class="u-only-dark" width="32" height="32" />
|
||||
<img src="/images/platforms/android.svg" alt="Android logo" class="u-only-light" width="32" height="32" />
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
<a href="/docs/sdks" class="aw-button is-secondary" style:align-self="start">
|
||||
|
||||
6
src/routes/blog/category/accessibility/+page.markdoc
Normal file
@@ -0,0 +1,6 @@
|
||||
---
|
||||
layout: category
|
||||
name: Accessibility
|
||||
description: Dive into our Accessibility category, enriched with firsthand insights from the Appwrite team, on making web apps user-friendly for all. Discover practical design tactics for better user engagement, adhering to global accessibility standards. Through our journey in building Appwrite, we unveil simple yet impactful design modifications.
|
||||
---
|
||||
|
||||
@@ -3,10 +3,10 @@ layout: post
|
||||
title: Accessibility in Pink Design
|
||||
description: Lorem Ipsum dolor et amet.
|
||||
date: 2023-11-14
|
||||
cover: /images/pages/homepage/dashboard.svg
|
||||
cover: /images/pages/homepage/dashboard.png
|
||||
timeToRead: 3
|
||||
author: arman
|
||||
category: design, accessibility, appwrite, community, accessiblity
|
||||
category: accessibility, design
|
||||
---
|
||||
|
||||
When creating products, accessibility can be an afterthought. Understandably, we want to ship our products fast and deliver value to our users. We might think that accessibility is needed for edge cases and therefore not prioritize it. It's good to be reminded that the World Health Organization (WHO) estimates that 16% of the global population has some form of disability (Dec 2022).Ignoring such a significant part of your user base simply doesn't create a good user experience.Creating accessible products is everyone's responsibility. Designers, developers, content authors, and whoever else is involved in creating products should do their part and strive towards achieving a better experience for everyone.
|
||||
@@ -33,9 +33,7 @@ Color contrast might be the first thing that comes to mind when thinking about a
|
||||
|
||||
The term “color blindness” is often used to describe people who have trouble identifying and distinguishing between certain colors, but color blindness, the inability to see any color, is extremely rare. According to the United Kingdom National Health Service (NHS), red-green color blindness affects 1 out of 12 men and 1 out of 200 women. People with this color vision deficiency may have difficulty differentiating between reds, oranges, yellows, browns, and greens. They also might find it hard to distinguish between shades of purple and may confuse red with black.Similarly, people with “blue-yellow” color vision deficiency may have difficulty differentiating between blues, greens, and yellows.
|
||||
|
||||
BIG LINK
|
||||
|
||||
We use four system colors in Pink Design — red, orange, green, and blue. Each of these colors represents a state in the Appwrite console — red indicates an error or danger, orange indicates a warning, green indicates success, and blue indicates information. Knowing the difficulties our users might face while seeing these colors, we don't rely on color to make critical information understandable.
|
||||
We use four system colors in Pink Design — red, orange, green, and blue. Each of these colors represents a state in the Appwrite Console — red indicates an error or danger, orange indicates a warning, green indicates success, and blue indicates information. Knowing the difficulties our users might face while seeing these colors, we don't rely on color to make critical information understandable.
|
||||
|
||||
>“Lorem ipsum dolor sit amet consectetur. Diam fermentum tellus ante purus nullam eget sit id ac. Purus viverra ultrices fusce posuere sed enim duis aliquam sit. Vitae fames potenti donec ultricies in. Quis sed iaculis consectetur cras feugiat nibh gravida tincidunt volutpat. Eleifend vel blandit cras tempor sed nam quis aliquet. Facilisi tempor amet id integer gravida duis. Aliquet nulla tellus risus tortor neque vestibulum arcu.” Author
|
||||
|
||||
@@ -46,7 +44,7 @@ People with fine motor control restrictions or disabled hands or arms will be un
|
||||
|
||||
It is possible to enhance accessibility through development as well. In collaboration with our engineering team, we decided to incorporate the following into Pink Design:
|
||||
|
||||

|
||||

|
||||
|
||||
## Define font size in REM
|
||||
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
---
|
||||
layout: post
|
||||
title: Announcing new docs post by Vincent
|
||||
description: TBD
|
||||
date: 2023-05-02
|
||||
cover: /images/pages/homepage/dashboard.svg
|
||||
timeToRead: 5
|
||||
author: vincent-ge
|
||||
category: docs, devex
|
||||
---
|
||||
|
||||
TODO
|
||||
@@ -1,76 +0,0 @@
|
||||
---
|
||||
layout: post
|
||||
title: Example 2
|
||||
description: Lorem Ipsum dolor et amet.
|
||||
date: 2022-11-12
|
||||
cover: /images/blog/placeholder.png
|
||||
timeToRead: 5
|
||||
author: eldad-fux
|
||||
category: design, accessibility, appwrite, community, accessiblity
|
||||
---
|
||||
|
||||
When creating products, accessibility can be an afterthought. Understandably, we want to ship our products fast and deliver value to our users. We might think that accessibility is needed for edge cases and therefore not prioritize it. It's good to be reminded that the World Health Organization (WHO) estimates that 16% of the global population has some form of disability (Dec 2022).Ignoring such a significant part of your user base simply doesn't create a good user experience.Creating accessible products is everyone's responsibility. Designers, developers, content authors, and whoever else is involved in creating products should do their part and strive towards achieving a better experience for everyone.
|
||||
|
||||
It's not always easy to maintain a high level of accessibility, but it's definitely easier with a design system. The components we created in Pink Design, Appwrite's fully open source UI library, have an accessibility level of AA. This is the recommended level of accessibility for most products.
|
||||
|
||||
To ensure our products will maintain a high accessibility level, we did the following:
|
||||
|
||||
- Use high color contrast
|
||||
- Not relying on color
|
||||
- Allow keyboard navigation
|
||||
- Define font size in REM
|
||||
- Allow users to reduce motion
|
||||
|
||||
## Use high color contrast
|
||||
|
||||
Color contrast might be the first thing that comes to mind when thinking about accessibility. A lack of contrast between the text and background might mean some people would be unable or have difficulty reading the text. Similarly, bright colors with high luminance are not readable for others. W3C recommends a contrast ratio between text and background of 4.5 to 1 for conformance level AA.
|
||||
|
||||
| Item | Price | \# In stock |
|
||||
| ----------- | ----------- | ----------- |
|
||||
| Apples | 1.99 | *7* |
|
||||
| Bananas | **1.89** | 5234 |
|
||||
|
||||
## Not relying on color
|
||||
|
||||
The term “color blindness” is often used to describe people who have trouble identifying and distinguishing between certain colors, but color blindness, the inability to see any color, is extremely rare. According to the United Kingdom National Health Service (NHS), red-green color blindness affects 1 out of 12 men and 1 out of 200 women. People with this color vision deficiency may have difficulty differentiating between reds, oranges, yellows, browns, and greens. They also might find it hard to distinguish between shades of purple and may confuse red with black.Similarly, people with “blue-yellow” color vision deficiency may have difficulty differentiating between blues, greens, and yellows.
|
||||
|
||||
BIG LINK
|
||||
|
||||
We use four system colors in Pink Design — red, orange, green, and blue. Each of these colors represents a state in the Appwrite console — red indicates an error or danger, orange indicates a warning, green indicates success, and blue indicates information. Knowing the difficulties our users might face while seeing these colors, we don't rely on color to make critical information understandable.
|
||||
|
||||
> “Lorem ipsum dolor sit amet consectetur. Diam fermentum tellus ante purus nullam eget sit id ac. Purus viverra ultrices fusce posuere sed enim duis aliquam sit. Vitae fames potenti donec ultricies in. Quis sed iaculis consectetur cras feugiat nibh gravida tincidunt volutpat. Eleifend vel blandit cras tempor sed nam quis aliquet. Facilisi tempor amet id integer gravida duis. Aliquet nulla tellus risus tortor neque vestibulum arcu.” Author
|
||||
|
||||
## Allow keyboard navigation
|
||||
|
||||
People with fine motor control restrictions or disabled hands or arms will be unable to use a mouse. In Pink Design, we provide distinct states for interactive elements. By designing states like focus, hover, and active, we provide the ability to navigate all interactive elements with a keyboard. This is not only an accessible experience but also a better experience for all users who prefer keyboard navigation, including Appwrite's developer community.
|
||||
|
||||
It is possible to enhance accessibility through development as well. In collaboration with our engineering team, we decided to incorporate the following into Pink Design:
|
||||
|
||||

|
||||
|
||||
## Define font size in REM
|
||||
|
||||
Browsers have a default font size that users can change via the browser setting. A pixel is an absolute unit for fixed sizes and spaces that ignores browser settings. This means that if we are using pixels and a user (with or without vision impairment) changes the font size in their browser settings, their setting won't affect our product. That being said, pixels should not cause any problems if the user zooms in, but we make no assumptions about users' preferences. This is why we decided to define the font size in REM, which is a relative unit.
|
||||
|
||||
```js
|
||||
import { Client, Account } from "appwrite";
|
||||
|
||||
const client = new Client()
|
||||
.setEndpoint('https://cloud.appwrite.io/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
|
||||
const account = new Account(client);
|
||||
|
||||
const promise = account.createVerification('https://example.com');
|
||||
|
||||
promise.then(function (response) {
|
||||
console.log(response);
|
||||
}, function (error) {
|
||||
console.log(error);
|
||||
});
|
||||
|
||||
```
|
||||
|
||||
## Allow users to reduce motion
|
||||
|
||||
There is no doubt that animations are a nice addition to every product, but animations can also distract people. In some cases, animations can cause dizziness, vertigo, or epileptic seizures. Users that are sensitive to motion might choose to reduce motion in their operating system settings. In this case, we should skip the animation for them. In Pink Design, we decided to create a big animation to show the functionality of the library on the landing page. The animation is 10 seconds long and is the first thing you see on the page. It starts immediately when the page is loaded, but if “reduce motion” is enabled in the operating system, the animation skips to the end.
|
||||
@@ -18,7 +18,9 @@ We are excited to share our new brand and to see it match the maturity of our pr
|
||||
|
||||
## Aligning visual identity with growth
|
||||
|
||||
The very first design of Appwrite was created by our Founder & CEO, Eldad, in 2019 when Appwrite launched as an open-source project. Since then, the Appwrite console has been through a design upgrade, but as Appwrite grew, so did the team. Making it possible to reach new heights with Appwrite’s overall brand identity.
|
||||
The very first design of Appwrite was created by our Founder & CEO, Eldad, in 2019 when Appwrite launched as an open-source project. Since then, the Appwrite Console has been through a design upgrade, but as Appwrite grew, so did the team. Making it possible to reach new heights with Appwrite’s overall brand identity.
|
||||
|
||||
> With the Appwrite team and community growing, our product started to mature, and there was a disconnect between our broader visual identity and our product
|
||||
|
||||
With the Appwrite team and community growing, our product started to mature, and there was a disconnect between our broader visual identity and our product. Recognizing the need for a fresh and more mature appearance, we worked to align our visual identity with the growing maturity of our product. This rebranding effort represents our commitment to delivering a polished and sophisticated experience to developers, throughout the developer journey. From discovery to scaling in using Appwrite.
|
||||
|
||||
@@ -28,6 +30,12 @@ Our rebranding journey began with a fresh perspective on our logo. We wanted to
|
||||
|
||||

|
||||
|
||||
> Our rebranding journey began with a fresh perspective on our logo. We wanted to emphasize the importance of our community, so we redesigned it to feature a globe and lines of code.
|
||||
|
||||
These code lines have become a recurring theme in our new 3D visuals, symbolizing progress and unity. We've also expanded our color palette to reflect our diverse and creative community, moving away from just pink. Warmer colors were added, to reflect the human and open side of our vibrant community.
|
||||
|
||||

|
||||
|
||||
Additionally, we've added a new element: glass. This represents our commitment to transparency and openness, echoing our open-source values. It's integrated into our website and brand visuals, highlighting our dedication to collaboration within our global community.
|
||||
|
||||

|
||||
|
||||
5
src/routes/brand/+page.server.js
Normal file
@@ -0,0 +1,5 @@
|
||||
import { redirect } from '@sveltejs/kit';
|
||||
|
||||
export function load() {
|
||||
throw redirect(301, '/blog/post/meet-the-new-appwrite');
|
||||
}
|
||||
@@ -403,7 +403,7 @@
|
||||
Continuous improvement
|
||||
</h3>
|
||||
<p class="aw -main-body-400">
|
||||
Towards the end of 2022 we released Appwrite 1.0 and the Console 2.0 for a better developer experience. It was the first time we produced a product, the console, which was fully designed by our in house team. These are the initial versions of the products you know today.
|
||||
Towards the end of 2022 we released Appwrite 1.0 and the Console 2.0 for a better developer experience. It was the first time we produced a product, the Console, which was fully designed by our in house team. These are the initial versions of the products you know today.
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
|
||||
@@ -72,16 +72,16 @@
|
||||
Run on any provider or through Appwrite Cloud
|
||||
</h1>
|
||||
<p class="aw-description u-max-width-600">
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin in ultrices lacus.
|
||||
Start building today by creating an account on <a href="https://cloud.appwrite.io/" rel="noopener noreferrer" target="_blank">Appwrite Cloud</a>
|
||||
or <a href="/docs/advanced/self-hosting" rel="noopener noreferrer" target="_blank">self-host</a>.
|
||||
</p>
|
||||
</section>
|
||||
<section class="aw-hero is-align-start">
|
||||
<h2 class="aw-title aw-u-color-text-primary u-max-width-600">
|
||||
Get started quickly with your preferred technology
|
||||
Get started with your technologies
|
||||
</h2>
|
||||
<p class="aw-description u-max-width-600">
|
||||
Start building with your preferred web, mobile, and native frameworks by following a quick
|
||||
start guide.
|
||||
Follow a quick start guide on your web, mobile, and native frameworks.
|
||||
</p>
|
||||
<ul class="u-flex u-gap-16 aw-u-margin-block-32-mobile aw-u-margin-block-40-not-mobile">
|
||||
<li>
|
||||
@@ -256,8 +256,7 @@
|
||||
<svelte:fragment slot="header">
|
||||
<h2 class="aw-title aw-u-color-text-primary u-max-width-600">Show me some code</h2>
|
||||
<p class="aw-description u-max-width-600">
|
||||
Talk is cheap, where's the code? If you'd rather see some examples, we've got you
|
||||
covered. Clone a template to get started.
|
||||
If you learn best from code examples, follow one of our tutorials..
|
||||
</p>
|
||||
</svelte:fragment>
|
||||
<svelte:fragment>
|
||||
@@ -400,7 +399,7 @@
|
||||
</Carousel>
|
||||
</section>
|
||||
<section class="aw-hero is-align-start is-no-max-width">
|
||||
<h2 class="aw-title aw-u-color-text-primary u-max-width-600">Show me some code</h2>
|
||||
<h2 class="aw-title aw-u-color-text-primary u-max-width-600">Explore capabilities</h2>
|
||||
<p class="aw-description u-max-width-600">
|
||||
All the core functionalities you need with a scalable and flexible API. Explore Appwrite's
|
||||
product offerings.
|
||||
@@ -449,7 +448,7 @@
|
||||
Databases
|
||||
</h4>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Store your application and users' data.
|
||||
Store your application and user data.
|
||||
</p>
|
||||
</div>
|
||||
</li>
|
||||
@@ -521,7 +520,7 @@
|
||||
Realtime
|
||||
</h4>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Listen to any events on the server-side in realtime.
|
||||
Respond to server events in realtime.
|
||||
</p>
|
||||
</div>
|
||||
</li>
|
||||
@@ -540,7 +539,7 @@
|
||||
<div class="aw-card is-full-color">
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary u-margin-block-start-8">SDKs</h4>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur. Elit id et diam lectus egestas habitasse.
|
||||
Light-weight SDKs for your favorite platforms.
|
||||
</p>
|
||||
</div>
|
||||
</li>
|
||||
@@ -550,7 +549,7 @@
|
||||
REST API
|
||||
</h4>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur. Elit id et diam lectus egestas habitasse.
|
||||
Integrate with HTTP requests without the needing an SDK
|
||||
</p>
|
||||
</div>
|
||||
</li>
|
||||
@@ -560,7 +559,7 @@
|
||||
GraphQL
|
||||
</h4>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur. Elit id et diam lectus egestas habitasse.
|
||||
Leverage GraphQL through our SDKs or integrate directly with REST endpoints.
|
||||
</p>
|
||||
</div>
|
||||
</li>
|
||||
@@ -570,7 +569,7 @@
|
||||
Realtime
|
||||
</h4>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur. Elit id et diam lectus egestas habitasse.
|
||||
Respond to auth, databases, storage, and function events in realtime.
|
||||
</p>
|
||||
</div>
|
||||
</li>
|
||||
@@ -580,17 +579,17 @@
|
||||
<section class="aw-hero is-align-start is-no-max-width">
|
||||
<h2 class="aw-title aw-u-color-text-primary u-max-width-600">Migrate to Appwrite</h2>
|
||||
<p class="aw-description u-max-width-600">
|
||||
Lorem ipsum dolor sit amet consectetur. Orci netus est urna dictum eleifend diam.
|
||||
Own your data with automatic data migrations.
|
||||
</p>
|
||||
<div class="u-margin-block-start-24">
|
||||
<ul class="aw-grid-row-4">
|
||||
<li>
|
||||
<div class="aw-card is-full-color">
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary u-margin-block-start-8">
|
||||
Self hosted
|
||||
Self-hosted
|
||||
</h4>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur.
|
||||
Move data from self-hosted to Appwrite Cloud.
|
||||
</p>
|
||||
</div>
|
||||
</li>
|
||||
@@ -600,7 +599,7 @@
|
||||
Firebase
|
||||
</h4>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur.
|
||||
Migrate users and data from Firebase to Appwrite.
|
||||
</p>
|
||||
</div>
|
||||
</li>
|
||||
@@ -610,7 +609,7 @@
|
||||
Supabase
|
||||
</h4>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur.
|
||||
Migrate users and data from Supabase to Appwrite.
|
||||
</p>
|
||||
</div>
|
||||
</li>
|
||||
@@ -618,7 +617,7 @@
|
||||
<div class="aw-card is-full-color">
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary u-margin-block-start-8">Nhost</h4>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur.
|
||||
Migrate users and data from NHost to Appwrite.
|
||||
</p>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
@@ -114,7 +114,7 @@
|
||||
},
|
||||
{
|
||||
label: 'Self-hosting',
|
||||
href: '/docs/advanced/self-hosting/installation',
|
||||
href: '/docs/advanced/self-hosting',
|
||||
icon: 'icon-server',
|
||||
isParent: true
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ Migrations makes it as easy as a couple clicks to move all of your self-hosted p
|
||||
To begin migrating to self-hosted, make sure to read the [migration overview](/docs/advanced/migrations)
|
||||
and [things to keep in mind](#notices) sections above.
|
||||
|
||||
1. Navigate to your self-hosted project's console and click on the **Migrations** tab.
|
||||
1. Navigate to your self-hosted project's Console and click on the **Migrations** tab.
|
||||
|
||||
2. Click **Deploy to cloud**, you will be redirected to Appwrite Cloud.
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ difficulty: beginner
|
||||
readtime: 20
|
||||
---
|
||||
|
||||
Appwrite migrations help you quickly migrate your data from Firebase or other [sources](/docs/advanced/migrations#sources) to Appwrite. You can follow the instructions on the Appwrite console migration wizard or use this guide to perform your data migration. While migrations are a great way to move your data from other services to Appwrite and get started quickly, they're not perfect. Make sure to understand the different [limitations](#limitations) before completing your migration.
|
||||
Appwrite migrations help you quickly migrate your data from Firebase or other [sources](/docs/advanced/migrations#sources) to Appwrite. You can follow the instructions on the Appwrite Console migration wizard or use this guide to perform your data migration. While migrations are a great way to move your data from other services to Appwrite and get started quickly, they're not perfect. Make sure to understand the different [limitations](#limitations) before completing your migration.
|
||||
|
||||
{% info title="Charges" %}
|
||||
When you migrate data from Firebase to Appwrite Cloud, the resource usage during the migration will not count towards your Appwrite Cloud usage charges. However, Firebase, may have data transfer charges.
|
||||
@@ -49,15 +49,18 @@ To begin migrating to Appwrite, follow these steps.
|
||||
|
||||
1. Click on the **Create Migration** button and select **Firebase** as your source.
|
||||
|
||||
1. Upload the JSON file to Appwrite and follow the migration wizard to select which resources you need to migrate.
|
||||
1. Upload the JSON file to Appwrite and follow the migration wizard to select which resources you need to migrate. Finally click **Start migration** to begin the migration process.
|
||||
|
||||
1. Add the platforms for your [Web](#), [Flutter](#), [Android](#), and [iOS](#) apps. Appwrite will reject requests from unknown web, Flutter, and mobile apps to protect from malicious attacks. You app **must be added as a platform** for Appwrite to accept requests.
|
||||
{% /section %}
|
||||
{% section #next-steps step=4 title="Next steps" %}
|
||||
|
||||
1. In your Appwrite Console, navigate to **Overview** > **Integrations** > **Platforms**, add the platforms for your Web, Flutter, Android, and iOS apps. Appwrite will reject requests from unknown web, Flutter, and mobile apps to protect from malicious attacks. You app **must be added as a platform** for Appwrite to accept requests.
|
||||
|
||||
1. Remember to [add appropriate permissions](/docs/advanced/platform/permissions) to the migrated resources to protect user data and privacy.
|
||||
|
||||
1. Migrate functions manually, by [pick a runtime](#) and [learn to develop Appwrite Functions](#).
|
||||
1. Migrate functions manually, by [pick a runtime](/docs/products/functions/runtimes) and [learn to develop Appwrite Functions](/docs/products/functions/development).
|
||||
|
||||
1. Explore Appwrite's unique feature by exploring the [TODO]
|
||||
1. Explore Appwrite's unique features by exploring the rest of the [Appwrite Documentation](/docs).
|
||||
|
||||
{% /section %}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ difficulty: beginner
|
||||
readtime: 20
|
||||
---
|
||||
|
||||
Appwrite migrations help you quickly migrate your data from Nhost or other [sources](/docs/advanced/migrations#sources) to Appwrite. You can follow the instructions on the Appwrite console migration wizard or use this guide to perform your data migration. While migrations are a great way to move your data from other services to Appwrite and get started quickly, they're not perfect. Make sure to understand the different [limitations](#limitations) before completing your migration.
|
||||
Appwrite migrations help you quickly migrate your data from Nhost or other [sources](/docs/advanced/migrations#sources) to Appwrite. You can follow the instructions on the Appwrite Console migration wizard or use this guide to perform your data migration. While migrations are a great way to move your data from other services to Appwrite and get started quickly, they're not perfect. Make sure to understand the different [limitations](#limitations) before completing your migration.
|
||||
|
||||
{% info title="Charges" %}
|
||||
When you migrate data from Nhost to Appwrite Cloud, the resource usage during the migration will not count towards your Appwrite Cloud usage charges. However, Nhost, may have data transfer charges.
|
||||
@@ -41,13 +41,13 @@ Before migrating to Appwrite make sure you've read the [migration overview](/doc
|
||||
|
||||
{% section #next-steps step=3 title="Next steps" %}
|
||||
|
||||
1. Add the platforms for your [Web](#), [Flutter](#), [Android](#), and [iOS](#) apps. Appwrite will reject requests from unknown web, Flutter, and mobile apps to protect from malicious attacks. You app **must be added as a platform** for Appwrite to accept requests.
|
||||
1. In your Appwrite Console, navigate to **Overview** > **Integrations** > **Platforms**, add the platforms for your Web, Flutter, Android, and iOS apps. Appwrite will reject requests from unknown web, Flutter, and mobile apps to protect from malicious attacks. You app **must be added as a platform** for Appwrite to accept requests.
|
||||
|
||||
1. Remember to [add appropriate permissions](/docs/advanced/platform/permissions) to the migrated resources to protect user data and privacy.
|
||||
|
||||
1. Migrate functions manually, by [pick a runtime](#) and [learn to develop Appwrite Functions](#).
|
||||
1. Migrate functions manually, by [pick a runtime](/docs/products/functions/runtimes) and [learn to develop Appwrite Functions](/docs/products/functions/development).
|
||||
|
||||
1. Explore Appwrite's unique feature by exploring the [TODO]
|
||||
1. Explore Appwrite's unique features by exploring the rest of the [Appwrite Documentation](/docs).
|
||||
|
||||
{% /section %}
|
||||
|
||||
|
||||
@@ -40,6 +40,7 @@ To begin migrating to self-hosted, make sure to read the [migration overview](/d
|
||||
|
||||
1. Click **Start Migration** to start the migration process. You do not need to keep the Appwrite Console open through the process.
|
||||
|
||||
> Keep in mind: Your self-hosted instance will generate an API Key in the background to pass to Appwrite Cloud. You can revoke this key after the migration process is complete.
|
||||
|
||||
{% info title="Keep in mind" %}
|
||||
Your self-hosted instance will generate an API Key in the background to pass to Appwrite Cloud. You can revoke this key after the migration process is complete.
|
||||
{% /info %}
|
||||
{% /section %}
|
||||
@@ -6,7 +6,7 @@ difficulty: beginner
|
||||
readtime: 20
|
||||
---
|
||||
|
||||
Appwrite migrations help you quickly migrate your data from Supabase or other [sources](/docs/advanced/migrations#sources) to Appwrite. You can follow the instructions on the Appwrite console migration wizard or use this guide to perform your data migration. While migrations are a great way to move your data from other services to Appwrite and get started quickly, they're not perfect. Make sure to understand the different [limitations](#limitations) before completing your migration.
|
||||
Appwrite migrations help you quickly migrate your data from Supabase or other [sources](/docs/advanced/migrations#sources) to Appwrite. You can follow the instructions on the Appwrite Console migration wizard or use this guide to perform your data migration. While migrations are a great way to move your data from other services to Appwrite and get started quickly, they're not perfect. Make sure to understand the different [limitations](#limitations) before completing your migration.
|
||||
|
||||
{% info title="Charges" %}
|
||||
When you migrate data from Supabase to Appwrite Cloud, the resource usage during the migration will not count towards your Appwrite Cloud usage charges. However, Supabase, may have data transfer charges.
|
||||
@@ -43,13 +43,13 @@ Before migrating to Appwrite make sure you've read the [migration overview](/doc
|
||||
|
||||
{% section #next-steps step=3 title="Next steps" %}
|
||||
|
||||
1. Add the platforms for your [Web](#), [Flutter](#), [Android](#), and [iOS](#) apps. Appwrite will reject requests from unknown web, Flutter, and mobile apps to protect from malicious attacks. You app **must be added as a platform** for Appwrite to accept requests.
|
||||
1. In your Appwrite Console, navigate to **Overview** > **Integrations** > **Platforms**, add the platforms for your Web, Flutter, Android, and iOS apps. Appwrite will reject requests from unknown web, Flutter, and mobile apps to protect from malicious attacks. You app **must be added as a platform** for Appwrite to accept requests.
|
||||
|
||||
1. Remember to [add appropriate permissions](/docs/advanced/platform/permissions) to the migrated resources to protect user data and privacy.
|
||||
|
||||
1. Migrate functions manually, by [pick a runtime](#) and [learn to develop Appwrite Functions](#).
|
||||
1. Migrate functions manually, by [pick a runtime](/docs/products/functions/runtimes) and [learn to develop Appwrite Functions](/docs/products/functions/development).
|
||||
|
||||
1. Explore Appwrite's unique feature by exploring the [TODO]
|
||||
1. Explore Appwrite's unique features by exploring the rest of the [Appwrite Documentation](/docs).
|
||||
|
||||
{% /section %}
|
||||
|
||||
|
||||
@@ -18,24 +18,25 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
label: 'Guides',
|
||||
label: 'Integration',
|
||||
items: [
|
||||
{
|
||||
label: 'API keys',
|
||||
href: '/docs/advanced/platform/api-keys'
|
||||
},
|
||||
{
|
||||
label: 'Custom domains',
|
||||
href: '/docs/advanced/platform/custom-domains'
|
||||
},
|
||||
{
|
||||
label: 'Events',
|
||||
href: '/docs/advanced/platform/events'
|
||||
},
|
||||
{
|
||||
label: 'Response codes',
|
||||
href: '/docs/advanced/platform/response-codes'
|
||||
label: 'Webhooks',
|
||||
href: '/docs/advanced/platform/webhooks'
|
||||
},
|
||||
{
|
||||
label: 'Response codes',
|
||||
href: '/docs/advanced/platform/response-codes',
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
label: 'Access control',
|
||||
items: [
|
||||
{
|
||||
label: 'Permissions',
|
||||
href: '/docs/advanced/platform/permissions'
|
||||
@@ -45,11 +46,24 @@
|
||||
href: '/docs/advanced/platform/rate-limits'
|
||||
},
|
||||
{
|
||||
label: 'Webhooks',
|
||||
href: '/docs/advanced/platform/webhooks'
|
||||
}
|
||||
label: 'API keys',
|
||||
href: '/docs/advanced/platform/api-keys'
|
||||
},
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
label: 'Configuration',
|
||||
items: [
|
||||
{
|
||||
label: 'Custom domains',
|
||||
href: '/docs/advanced/platform/custom-domains'
|
||||
},
|
||||
{
|
||||
label: 'Email and SMS templates',
|
||||
href: '/docs/advanced/platform/message-templates'
|
||||
},
|
||||
]
|
||||
},
|
||||
];
|
||||
</script>
|
||||
|
||||
|
||||
@@ -7,26 +7,3 @@ description: Description for SEO.
|
||||
Appwrite is a development platform designed to adapt your unique use cases.
|
||||
Appwrite provides features that help you maintain, scale, and integrate Appwrite with other platforms.
|
||||
|
||||
## API keys {% #api-keys %}
|
||||
|
||||
[Learn more about API keys {% icon icon="cheveron-right" /%}](#)
|
||||
|
||||
## Custom domains {% #custom-domains %}
|
||||
|
||||
[Learn more about custom domains {% icon icon="cheveron-right" /%}](#)
|
||||
|
||||
## Events {% #events %}
|
||||
|
||||
[Learn more about events {% icon icon="cheveron-right" /%}](#)
|
||||
|
||||
## Response codes {% #response-codes %}
|
||||
|
||||
[Learn more about response codes {% icon icon="cheveron-right" /%}](#)
|
||||
|
||||
## Permissions {% #permissions %}
|
||||
|
||||
[Learn more about permissions {% icon icon="cheveron-right" /%}](#)
|
||||
|
||||
## Rate limits {% #rate-limits %}
|
||||
|
||||
[Learn more about permissions {% icon icon="cheveron-right" /%}](#)
|
||||
|
||||
@@ -4,7 +4,7 @@ title: API keys
|
||||
description: Placeholder SEO.
|
||||
---
|
||||
|
||||
API keys are secrets used by Appwrite [Server SDKs](#) and the Appwrite CLI to prove their identity.
|
||||
API keys are secrets used by Appwrite [Server SDKs](/docs/sdks#server) and the Appwrite CLI to prove their identity.
|
||||
What can be accessed each API key is restricted by [scopes](#scopes) instead of permissions.
|
||||
|
||||
{% info title="Best practice" %}
|
||||
|
||||
@@ -0,0 +1,196 @@
|
||||
---
|
||||
layout: article
|
||||
title: Message templates
|
||||
description: Placeholder SEO.
|
||||
---
|
||||
|
||||
Appwrite uses emails to communicate with users to perform authentication and verification actions. Emails can be customized to fit your app's design and voice.
|
||||
|
||||
Each Appwrite project can have its own set of unique templates. Templates also support localization, so every template can be written in multiple languages and served depending on the configured locale.
|
||||
|
||||
## Custom SMTP server {% #smtp %}
|
||||
|
||||
Appwrite Cloud has a default SMTP server to get you started. This SMTP server sends generic emails and doesn't allow customizing SMTP templates. To use custom SMTP templates, you will need to configure your own SMTP server.
|
||||
|
||||
There are many third-party SMTP providers like SendGrid and Mailgun. Before proceeding, pick an SMTP provider, create an account, and obtain **Sender name**, **Sender email**, **Server host**, **Server port**, **Username**, and **Password**.
|
||||
|
||||
1. Navigate to your project's **Settings**.
|
||||
2. Navigate to the **SMTP** tab.
|
||||
3. Under **SMTP server**, toggle **Custom SMTP server**.
|
||||
4. Input **Sender name**, **Sender email**, **Server host**, **Server port**, **Username**, and **Password** from your provider.
|
||||
5. Click **Update**.
|
||||
|
||||
## Customize templates {% #customize %}
|
||||
|
||||
You can customize email templates for each of your projects in the Appwrite Console.
|
||||
|
||||
{% info title="Custom SMTP server required" %}
|
||||
The built-in email service does not support custom email templates to prevent malicious templates.
|
||||
Configure a [custom SMTP server](#smtp) to enable custom email templates.
|
||||
{% /info %}
|
||||
|
||||
1. In your project, navigate to the **Auth** service.
|
||||
2. Under the **Auth** service, navigate to the **Templates** tab.
|
||||
3. Expand the email template you want to edit.
|
||||
4. Select the **Template language**. You can have a different template for each language your app supports.
|
||||
5. Update the email template fields and click **Update** to save your changes.
|
||||
|
||||
## Email templates {% #email-templates %}
|
||||
|
||||
You can customize the email templates for account verification, magic-url authentication, password resets, and user invites.
|
||||
|
||||
### Email template components {% #email-template-components %}
|
||||
|
||||
Each email template has the following components that you can customize.
|
||||
|
||||
| Component | Description |
|
||||
|--------------|-----------------------------------------------------------------------------------------------------------------------|
|
||||
| Sender name | Readers will see this as a display name of the sender. |
|
||||
| Sender email | Readers will see this as a display email of the sender. This email must be authenticated on the SMTP provider you've configured, otherwise it will be delivered to the spam folder. This usually means the email must end with the same domain as your SMTP username. |
|
||||
| Reply to | Readers will reply to this email address instead of the sender address. You can leave this field empty, and the sender email will be used automatically. |
|
||||
| Subject | The title of the email. |
|
||||
| Message | The body of the email in HTML format. You can find the variables available in the [Email Template Syntax](#email-template-syntax) section. |
|
||||
|
||||
### Email template syntax {% #email-template-syntax %}
|
||||
|
||||
Variables can be used in email templates to dynamically construct unique emails for each reader. These variables can only be used in the **Message** field of the email template.
|
||||
|
||||
| Variable | Description |
|
||||
|------------|-----------------------------|
|
||||
| `{{project}}` | The project name. |
|
||||
| `{{team}}` | The project team's name. |
|
||||
| `{{user}}` | The name of the user receiving the email. This variable is not available in the Magic URL template, as there might not be a user yet. |
|
||||
| `{{redirect}}`| The URL for the user to complete the email template's action. |
|
||||
|
||||
### Email template syntax {% #email-template-examples %}
|
||||
|
||||
Here's an example of using these variables in a template.
|
||||
|
||||
```html
|
||||
<!doctype html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<style>
|
||||
... your style here
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body style="direction: ltr">
|
||||
|
||||
<div style="max-width:650px; word-wrap: break-word; overflow-wrap: break-word;
|
||||
word-break: break-all; margin:0 auto;">
|
||||
<table style="margin-top: 32px">
|
||||
<tr>
|
||||
<td>
|
||||
<h1>{{subject}}</h1>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table style="margin-top: 40px">
|
||||
<tr>
|
||||
<td>
|
||||
<p>Hello </p>
|
||||
|
||||
<p>Follow this link to reset your {{project}} password.</p>
|
||||
|
||||
<a href="{{redirect}}" target="_blank">{{redirect}}</a>
|
||||
|
||||
<p><br />If you didn't ask to reset your password, you can ignore this message.</p>
|
||||
<br />
|
||||
|
||||
<p>Thanks
|
||||
<br />
|
||||
{{project}} team</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
```
|
||||
|
||||
## Localization {% #localization %}
|
||||
|
||||
Each template can have multiple supported locales, displayed in different format and language. This can be configured under the **Template language** selector of each template.
|
||||
|
||||
You can send messages in different languages by setting the locale with `client.setLocale()` in the SDKs or the `X-Appwrite-Locale` HTTP header. [View here the list of available locales](https://github.com/appwrite/appwrite/blob/master/app/config/locale/codes.php).
|
||||
|
||||
For example, you can send an email verification in French.
|
||||
|
||||
{% multicode %}
|
||||
```js
|
||||
import { Client, Account } from "appwrite";
|
||||
|
||||
const client = new Client();
|
||||
|
||||
const account = new Account(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://cloud.appwrite.io/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
.setLocale('fr') // Your locale
|
||||
;
|
||||
|
||||
const promise = account.createVerification('https://example.com');
|
||||
|
||||
promise.then(function (response) {
|
||||
console.log(response); // Success
|
||||
}, function (error) {
|
||||
console.log(error); // Failure
|
||||
});
|
||||
```
|
||||
|
||||
```dart
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
Account account = Account(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://cloud.appwrite.io/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
.setLocale('fr') // Your locale
|
||||
;
|
||||
Future result = account.createVerification('https://example.com');
|
||||
|
||||
result
|
||||
.then((response) {
|
||||
print(response);
|
||||
}).catchError((error) {
|
||||
print(error.response);
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
```kotlin
|
||||
import io.appwrite.Client
|
||||
import io.appwrite.services.Account
|
||||
|
||||
val client = Client(context)
|
||||
.setEndpoint("https://cloud.appwrite.io/v1") // Your API Endpoint
|
||||
.setProject("5df5acd0d48c2") // Your project ID
|
||||
.setLocale('fr') // Your locale
|
||||
|
||||
val account = Account(client)
|
||||
|
||||
val response = account.createVerification('https://example.com')
|
||||
```
|
||||
|
||||
```swift
|
||||
import Appwrite
|
||||
|
||||
let client = Client()
|
||||
.setEndpoint("https://cloud.appwrite.io/v1") // Your API Endpoint
|
||||
.setProject("5df5acd0d48c2") // Your project ID
|
||||
.setLocale('fr') // Your locale
|
||||
|
||||
let account = Account(client)
|
||||
|
||||
let token = try await account.createVerification('https://example.com')
|
||||
```
|
||||
{% /multicode %}
|
||||
@@ -12,7 +12,7 @@ As the name suggests, read permission allows a user to read a resource, create a
|
||||
|
||||
All permissions can be granted to individuals or groups of users, entire teams, or only to team members with a specific role. Permission can also be granted based on authentication status, such as to all users, only authenticated users, or only guest users.
|
||||
|
||||
A project user can only grant permissions to a resource that they own. For example, if a user is trying to share a document with a team that they are not a member of, they will encounter a 401 not authorized error. If your app needs users to grant access to teams they're not a member of, you can create Appwrite Functions with a [Server SDK](#) to achieve this functionality.
|
||||
A project user can only grant permissions to a resource that they own. For example, if a user is trying to share a document with a team that they are not a member of, they will encounter a 401 not authorized error. If your app needs users to grant access to teams they're not a member of, you can create Appwrite Functions with a [Server SDK](/docs/sdks#server) to achieve this functionality.
|
||||
|
||||
## Appwrite Resource
|
||||
|
||||
|
||||
@@ -4,4 +4,188 @@ title: Response codes
|
||||
description: Placeholder SEO.
|
||||
---
|
||||
|
||||
TODO
|
||||
Appwrite uses conventional HTTP response codes to indicate the success or failure of an API request.
|
||||
|
||||
- Codes in the `2xx` range indicate success.
|
||||
- Codes in the `4xx` range indicate an error caused by invalid request, usually caused by user error.
|
||||
- Codes in the `5xx` range indicate an error with Appwrite, please check Docker container logs.
|
||||
|
||||
## Response codes {% #response-codes %}
|
||||
| Code | Text | Description |
|
||||
|------|------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| 200 | OK | Success! |
|
||||
| 201 | Created | The requested resource has been created successfully. |
|
||||
| 202 | Accepted | The requested change has been accepted for processing but has not been completed. |
|
||||
| 204 | No Content | The server has successfully fulfilled the request and that there is no additional content to send in the response payload body. This status will usually return on successful delete operations. |
|
||||
| 301 | Moved Permanently | The URL of the requested resource has been changed permanently. The new URL is given in the response. |
|
||||
| 304 | Not Modified | There was no new data to return. |
|
||||
| 400 | Bad Request | The request was invalid or cannot be otherwise served. An accompanying error message will explain further. Requests with wrong or invalid input will yield this response. |
|
||||
| 401 | Unauthorized | Missing or incorrect authentication credentials can happen when the API key or user permission is not sufficient. |
|
||||
| 403 | Forbidden | The request is understood, but it has been refused, or access is not allowed. An accompanying error message will explain why. Make sure to register your app in your project's dashboard platform list. |
|
||||
| 404 | Not Found | The URI requested is invalid or the resource requested, such as a user, does not exist. |
|
||||
| 409 | Conflict | This response is sent when a request conflicts with the current state of the server. This status code will usually appear when you're trying to create an already existing resource. |
|
||||
| 413 | Payload Too Large | This indicates that the request entity is larger than limits defined by server. This status code will usually appear happen when uploading a file or function that is too large |
|
||||
| 416 | Invalid Range | Invalid value in the range or content-range headers. Usually returned while uploading or downloading files using the range header but the provided range value is not valid. |
|
||||
| 429 | Too Many Requests | Returned in when a request cannot be served due to the application's rate limit having been exhausted for the resource. See [Rate Limits](/docs/advanced/platform/rate-limits). |
|
||||
| 500 | Internal Server Error | Something is broken. Contact our [team](/support), or raise a [GitHub issue](https://github.com/appwrite/appwrite/issues/new). |
|
||||
| 501 | Not Implemented | The feature is not implemented. Usually returned when the project owner has disabled an auth method or an entire service. |
|
||||
| 503 | Service Unavailable | The Appwrite servers are up but overloaded with requests. Try again later. |
|
||||
| 504 | Gateway timeout | The Appwrite servers are up, but the request couldn't be serviced due to some failure within the stack. Try again later. |
|
||||
|
||||
## Error messages {% #error-messages %}
|
||||
|
||||
When the Appwrite APIs return error messages, it does so in JSON format. For example, an error might look like this:
|
||||
|
||||
```json
|
||||
{
|
||||
"message": "Invalid id: Parameter must be a valid number",
|
||||
"type": "argument_invalid",
|
||||
"code": 400
|
||||
}
|
||||
```
|
||||
|
||||
## Error types {% #error-types %}
|
||||
|
||||
Appwrite also passes convenient error types in addition to the HTTP response codes to help you get more fine-grained control over what went wrong and allowing you to display relevant error messages in your applications. Error types are convenient to identify the type of error that occurred.
|
||||
|
||||
For example, a `400` HTTP response code could indicate a Bad Request due to a variety of reasons, and error types can help you pinpoint the exact `400` error. Appwrite currently supports the following error types:
|
||||
|
||||
| Code | Type | Description |
|
||||
| ---- | ---- | ----------- |
|
||||
| 400 | general_mock | General errors thrown by the mock controller used for testing. |
|
||||
| 400 | general_argument_invalid | The request contains one or more invalid arguments. Please refer to the endpoint documentation. |
|
||||
| 400 | general_query_limit_exceeded | Query limit exceeded for the current attribute. Usage of more than 100 query values on a single attribute is prohibited. |
|
||||
| 400 | general_query_invalid | The query's syntax is invalid. Please check the query and try again. |
|
||||
| 400 | general_cursor_not_found | The cursor is invalid. This can happen if the item represented by the cursor has been deleted. |
|
||||
| 400 | user_password_mismatch | Passwords do not match. Please check the password and confirm password. |
|
||||
| 400 | password_recently_used | The password you are trying to use is similar to your previous password. For your security, please choose a different password and try again. |
|
||||
| 400 | password_personal_data | The password you are trying to use contains references to your name, email, phone or userID. For your security, please choose a different password and try again. |
|
||||
| 400 | user_phone_not_found | The current user does not have a phone number associated with their account. |
|
||||
| 400 | user_missing_id | Missing ID from OAuth2 provider. |
|
||||
| 400 | user_oauth2_bad_request | OAuth2 provider rejected the bad request. |
|
||||
| 400 | storage_device_not_found | The requested storage device could not be found. |
|
||||
| 400 | storage_file_empty | Empty file passed to the endpoint. |
|
||||
| 400 | storage_file_type_unsupported | The given file extension is not supported. |
|
||||
| 400 | storage_invalid_file_size | The file size is either not valid or exceeds the maximum allowed size. Please check the file or the value of the `_APP_STORAGE_LIMIT` environment variable. |
|
||||
| 400 | storage_invalid_content_range | The content range is invalid. Please check the value of the `Content-Range` header. |
|
||||
| 400 | storage_invalid_appwrite_id | The value for `x-appwrite-id` header is invalid. Please check the value of the `x-appwrite-id` header is a valid id and not `unique()`. |
|
||||
| 400 | general_provider_failure | VCS (Version Control System) provider failed to process the request. We believe this is an error with the VCS provider. Try again, or contact support for more information. |
|
||||
| 400 | build_not_ready | Build with the requested ID is building and not ready for execution. |
|
||||
| 400 | build_in_progress | Build with the requested ID is already in progress. Please wait before you can retry. |
|
||||
| 400 | collection_limit_exceeded | The maximum number of collections has been reached. |
|
||||
| 400 | document_invalid_structure | The document structure is invalid. Please ensure the attributes match the collection definition. |
|
||||
| 400 | document_missing_data | The document data is missing. Try again with document data populated. |
|
||||
| 400 | document_missing_payload | The document data and permissions are missing. You must provide either document data or permissions to be updated. |
|
||||
| 400 | attribute_unknown | The attribute required for the index could not be found. Please confirm all your attributes are in the available state. |
|
||||
| 400 | attribute_not_available | The requested attribute is not yet available. Please try again later. |
|
||||
| 400 | attribute_format_unsupported | The requested attribute format is not supported. |
|
||||
| 400 | attribute_default_unsupported | Default values cannot be set for array or required attributes. |
|
||||
| 400 | attribute_limit_exceeded | The maximum number of attributes has been reached. |
|
||||
| 400 | attribute_value_invalid | The attribute value is invalid. Please check the type, range and value of the attribute. |
|
||||
| 400 | attribute_type_invalid | The attribute type is invalid. |
|
||||
| 400 | index_limit_exceeded | The maximum number of indexes has been reached. |
|
||||
| 400 | index_invalid | Index invalid. |
|
||||
| 400 | project_unknown | The project ID is either missing or not valid. Please check the value of the `X-Appwrite-Project` header to ensure the correct project ID is being used. |
|
||||
| 400 | project_invalid_success_url | Invalid redirect URL for OAuth success. |
|
||||
| 400 | project_invalid_failure_url | Invalid redirect URL for OAuth failure. |
|
||||
| 400 | project_reserved_project | The project ID is reserved. Please choose another project ID. |
|
||||
| 400 | project_smtp_config_invalid | Provided SMTP config is invalid. Please check the configured values and try again. |
|
||||
| 400 | graphql_no_query | Param "query" is not optional. |
|
||||
| 400 | graphql_too_many_queries | Too many queries. |
|
||||
| 401 | general_access_forbidden | Access to this API is forbidden. |
|
||||
| 401 | general_unauthorized_scope | The current user or API key does not have the required scopes to access the requested resource. |
|
||||
| 401 | user_jwt_invalid | The JWT token is invalid. Please check the value of the `X-Appwrite-JWT` header to ensure the correct token is being used. |
|
||||
| 401 | user_blocked | The current user has been blocked. You can unblock the user by making a request to the User API's "Update User Status" endpoint or in the Appwrite Console's Auth section. |
|
||||
| 401 | user_invalid_token | Invalid token passed in the request. |
|
||||
| 401 | user_email_not_whitelisted | Console registration is restricted to specific emails. Contact your administrator for more information. |
|
||||
| 401 | user_invalid_code | The specified code is not valid. Contact your administrator for more information. |
|
||||
| 401 | user_ip_not_whitelisted | Console registration is restricted to specific IPs. Contact your administrator for more information. |
|
||||
| 401 | user_invalid_credentials | Invalid credentials. Please check the email and password. |
|
||||
| 401 | user_anonymous_console_prohibited | Anonymous users cannot be created for the console project. |
|
||||
| 401 | user_session_already_exists | Creation of anonymous users is prohibited when a session is active. |
|
||||
| 401 | user_unauthorized | The current user is not authorized to perform the requested action. |
|
||||
| 401 | user_oauth2_unauthorized | OAuth2 provider rejected the unauthorized request. |
|
||||
| 401 | team_invalid_secret | The team invitation secret is invalid. Please request a new invitation and try again. |
|
||||
| 401 | team_invite_mismatch | The invite does not belong to the current user. |
|
||||
| 401 | project_key_expired | The project key has expired. Please generate a new key using the Appwrite console. |
|
||||
| 401 | rule_verification_failed | Domain verification failed. Please check if your DNS records are correct and try again. |
|
||||
| 401 | project_template_default_deletion | You can't delete default template. If you are trying to reset your template changes, you can ignore this error as it's already been reset. |
|
||||
| 403 | general_unknown_origin | The request originated from an unknown origin. If you trust this domain, please list it as a trusted platform in the Appwrite console. |
|
||||
| 403 | storage_invalid_file | The uploaded file is invalid. Please check the file and try again. |
|
||||
| 403 | document_delete_restricted | Document cannot be deleted because it is referenced by another document. |
|
||||
| 404 | general_route_not_found | The requested route was not found. Please refer to the API docs and try again. |
|
||||
| 404 | user_not_found | User with the requested ID could not be found. |
|
||||
| 404 | user_session_not_found | The current user session could not be found. |
|
||||
| 404 | user_identity_not_found | The identity could not be found. Please sign in with OAuth provider to create identity first. |
|
||||
| 404 | team_not_found | Team with the requested ID could not be found. |
|
||||
| 404 | team_invite_not_found | The requested team invitation could not be found. |
|
||||
| 404 | team_membership_mismatch | The membership ID does not belong to the team ID. |
|
||||
| 404 | membership_not_found | Membership with the requested ID could not be found. |
|
||||
| 404 | avatar_set_not_found | The requested avatar set could not be found. |
|
||||
| 404 | avatar_not_found | The request avatar could not be found. |
|
||||
| 404 | avatar_image_not_found | The requested image was not found at the URL. |
|
||||
| 404 | avatar_remote_url_failed | Failed to fetch favicon from the requested URL. |
|
||||
| 404 | avatar_icon_not_found | The requested favicon could not be found. |
|
||||
| 404 | storage_file_not_found | The requested file could not be found. |
|
||||
| 404 | storage_bucket_not_found | Storage bucket with the requested ID could not be found. |
|
||||
| 404 | installation_not_found | Installation with the requested ID could not be found. Check to see if the ID is correct, or create the installation. |
|
||||
| 404 | provider_repository_not_found | VCS (Version Control System) repository with the requested ID could not be found. Check to see if the ID is correct, and if it belongs to installationId you provided. |
|
||||
| 404 | repository_not_found | Repository with the requested ID could not be found. Check to see if the ID is correct, or create the repository. |
|
||||
| 404 | function_not_found | Function with the requested ID could not be found. |
|
||||
| 404 | function_runtime_unsupported | The requested runtime is either inactive or unsupported. Please check the value of the `_APP_FUNCTIONS_RUNTIMES` environment variable. |
|
||||
| 404 | function_runtime_unsupported | Entrypoint for your Appwrite Function is missing. Please specify it when making deployment or update the entrypoint under your function's "Settings" > "Configuration" > "Entrypoint". |
|
||||
| 404 | build_not_found | Build with the requested ID could not be found. |
|
||||
| 404 | deployment_not_found | Deployment with the requested ID could not be found. |
|
||||
| 404 | execution_not_found | Execution with the requested ID could not be found. |
|
||||
| 404 | database_not_found | Database not found |
|
||||
| 404 | collection_not_found | Collection with the requested ID could not be found. |
|
||||
| 404 | document_not_found | Document with the requested ID could not be found. |
|
||||
| 404 | attribute_not_found | Attribute with the requested ID could not be found. |
|
||||
| 404 | index_not_found | Index with the requested ID could not be found. |
|
||||
| 404 | project_not_found | Project with the requested ID could not be found. Please check the value of the `X-Appwrite-Project` header to ensure the correct project ID is being used. |
|
||||
| 404 | router_host_not_found | Host is not trusted. This could occur because you have not configured a custom domain. Add a custom domain to your project first and try again. |
|
||||
| 404 | rule_resource_not_found | Resource could not be found. Please check if the `resourceId` and `resourceType` are correct, or if the resource actually exists. |
|
||||
| 404 | rule_not_found | Rule with the requested ID could not be found. Please check if the ID provided is correct or if the rule actually exists. |
|
||||
| 404 | webhook_not_found | Webhook with the requested ID could not be found. |
|
||||
| 404 | key_not_found | Key with the requested ID could not be found. |
|
||||
| 404 | platform_not_found | Platform with the requested ID could not be found. |
|
||||
| 404 | variable_not_found | Variable with the requested ID could not be found. |
|
||||
| 404 | migration_not_found | Migration with the requested ID could not be found. Please verify that the provided ID is correct and try again. |
|
||||
| 405 | general_not_implemented | This method was not fully implemented yet. If you believe this is a mistake, please upgrade your Appwrite server version. |
|
||||
| 409 | user_already_exists | A user with the same id, email, or phone already exists in this project. |
|
||||
| 409 | user_email_already_exists | A user with the same email already exists in the current project. |
|
||||
| 409 | user_phone_already_exists | A user with the same phone number already exists in the current project. |
|
||||
| 409 | team_invite_already_exists | User has already been invited or is already a member of this team |
|
||||
| 409 | team_already_exists | Team with requested ID already exists. Please choose a different ID and try again. |
|
||||
| 409 | membership_already_confirmed | Membership is already confirmed. |
|
||||
| 409 | storage_file_already_exists | A storage file with the requested ID already exists. |
|
||||
| 409 | storage_bucket_already_exists | A storage bucket with the requested ID already exists. Try again with a different ID or use `unique()` to generate a unique ID. |
|
||||
| 409 | provider_contribution_conflict | External contribution is already authorized. |
|
||||
| 409 | database_already_exists | Database already exists |
|
||||
| 409 | collection_already_exists | A collection with the requested ID already exists. Try again with a different ID or use `unique()` to generate a unique ID. |
|
||||
| 409 | document_already_exists | Document with the requested ID already exists. Try again with a different ID or use `unique()` to generate a unique ID. |
|
||||
| 409 | document_update_conflict | Remote document is newer than local. |
|
||||
| 409 | attribute_already_exists | Attribute with the requested ID already exists. Try again with a different ID or use `unique()` to generate a unique ID. |
|
||||
| 409 | index_already_exists | Index with the requested ID already exists. Try again with a different ID or use `unique()` to generate a unique ID. |
|
||||
| 409 | project_already_exists | Project with the requested ID already exists. Try again with a different ID or use `unique()` to generate a unique ID. |
|
||||
| 409 | rule_already_exists | Domain is already used. Please try again with a different domain. |
|
||||
| 409 | variable_already_exists | Variable with the same ID already exists in this project. Try again with a different ID. |
|
||||
| 409 | migration_already_exists | Migration with the requested ID already exists. Try again with a different ID. |
|
||||
| 409 | migration_in_progress | Migration is already in progress. You can check the status of the migration in your Appwrite Console's "Settings" > "Migrations". |
|
||||
| 412 | user_password_reset_required | The current user requires a password reset. |
|
||||
| 412 | project_provider_disabled | The chosen OAuth provider is disabled. You can enable the OAuth provider using the Appwrite console. |
|
||||
| 416 | storage_invalid_range | The requested range is not satisfiable. Please check the value of the `Range` header. |
|
||||
| 424 | user_oauth2_provider_error | OAuth2 provider returned some error. |
|
||||
| 429 | general_rate_limit_exceeded | Rate limit for the current endpoint has been exceeded. Please try again after some time. |
|
||||
| 500 | general_unknown | An unknown error has occurred. Please check the logs for more information. |
|
||||
| 500 | general_server_error | An internal server error occurred. |
|
||||
| 500 | general_protocol_unsupported | The request cannot be fulfilled with the current protocol. Please check the value of the `_APP_OPTIONS_FORCE_HTTPS` environment variable. |
|
||||
| 500 | general_codes_disabled | Invitation codes are disabled on this server. Please contact the server administrator. |
|
||||
| 500 | router_domain_not_configured | `_APP_DOMAIN`, `_APP_DOMAIN_TARGET`, and `_APP_DOMAIN_FUNCTIONS` environment variables have not been configured. Please configure the domain environment variables before accessing the Appwrite Console via any IP address or hostname other than localhost. This value could be an IP like 203.0.113.0 or a hostname like example.com. |
|
||||
| 501 | general_usage_disabled | Usage stats is not configured. Please check the value of the `_APP_USAGE_STATS` environment variable of your Appwrite server. |
|
||||
| 501 | user_count_exceeded | The current project has exceeded the maximum number of users. Please check your user limit in the Appwrite console. |
|
||||
| 501 | user_auth_method_unsupported | The requested authentication method is either disabled or unsupported. Please check the supported authentication methods in the Appwrite console. |
|
||||
| 501 | project_provider_unsupported | The chosen OAuth provider is unsupported. Please check the Create OAuth2 Session docs for the complete list of supported OAuth providers. |
|
||||
| 503 | general_service_disabled | The requested service is disabled. You can enable the service from the Appwrite console. |
|
||||
| 503 | general_smtp_disabled | SMTP is disabled on your Appwrite instance. You can learn more about setting up SMTP in our docs. |
|
||||
| 503 | general_phone_disabled | Phone provider is not configured. Please check the `_APP_SMS_PROVIDER` environment variable of your Appwrite server. |
|
||||
@@ -11,38 +11,22 @@
|
||||
{
|
||||
label: 'Getting started',
|
||||
items: [
|
||||
{
|
||||
label: 'Overview',
|
||||
href: '/docs/advanced/self-hosting'
|
||||
},
|
||||
{
|
||||
label: 'Installation',
|
||||
href: '/docs/advanced/self-hosting/installation'
|
||||
href: '/docs/advanced/self-hosting/'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
label: 'Guides',
|
||||
items: [
|
||||
{
|
||||
label: 'Update',
|
||||
href: '/docs/advanced/self-hosting/update'
|
||||
},
|
||||
{
|
||||
label: 'Debugging',
|
||||
href: '/docs/advanced/self-hosting/debug'
|
||||
},
|
||||
{
|
||||
label: 'Email delivery',
|
||||
href: '/docs/advanced/self-hosting/email'
|
||||
},
|
||||
{
|
||||
label: 'Functions',
|
||||
href: '/docs/advanced/self-hosting/functions'
|
||||
},
|
||||
{
|
||||
label: 'Production',
|
||||
href: '/docs/advanced/self-hosting/production'
|
||||
label: 'Email delivery',
|
||||
href: '/docs/advanced/self-hosting/email'
|
||||
},
|
||||
{
|
||||
label: 'SMS delivery',
|
||||
@@ -52,10 +36,26 @@
|
||||
label: 'Storage',
|
||||
href: '/docs/advanced/self-hosting/storage'
|
||||
},
|
||||
{
|
||||
label: 'Environment variables',
|
||||
href: '/docs/advanced/self-hosting/environment-variables'
|
||||
},
|
||||
{
|
||||
label: 'TLS Certificates',
|
||||
href: '/docs/advanced/self-hosting/tls-certificates'
|
||||
}
|
||||
},
|
||||
{
|
||||
label: 'Debugging',
|
||||
href: '/docs/advanced/self-hosting/debug'
|
||||
},
|
||||
{
|
||||
label: 'Production',
|
||||
href: '/docs/advanced/self-hosting/production'
|
||||
},
|
||||
{
|
||||
label: 'Update',
|
||||
href: '/docs/advanced/self-hosting/update'
|
||||
},
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
@@ -1,25 +1,31 @@
|
||||
---
|
||||
layout: article
|
||||
title: Self-hosting
|
||||
description: Learn how to self host Appwrite on your own server using your favorite cloud provider.
|
||||
title: Installation
|
||||
description: Learn how to integrate Appwrite in your application with one of the supported SDKs.
|
||||
---
|
||||
|
||||
Appwrite was designed from the ground up with self-hosting in mind.
|
||||
You can install and run Appwrite on any operating system that can run a [Docker CLI](https://www.docker.com/products/docker-desktop).
|
||||
Self-hosted Appwrite instances can be configured flexibly with access to the same features found on Appwrite Cloud.
|
||||
Appwrite was designed from the ground up with self-hosting in mind. You can install and run Appwrite on any operating system that can run a [Docker CLI](https://www.docker.com/products/docker-desktop). Self-hosted Appwrite instances can be configured flexibly with access to the same features found on Appwrite Cloud.
|
||||
|
||||
{% info title="Want to start building faster?" %}
|
||||
Spend less time worrying about infrastructure and scaling, and spend more time building with [Appwrite Cloud](https://cloud.appwrite.io/).
|
||||
{% /info %}
|
||||
|
||||
## System Requirements {% #system-requirements %}
|
||||
## System requirements {% #system-requirements %}
|
||||
|
||||
Appwrite is designed to run well on both small and large deployments. The minimum requirements to run Appwrite are as little as **1 CPU core** and **2GB of RAM**, and an operating system that supports Docker.
|
||||
|
||||
Appwrite requires [Docker Compose Version 2](https://docs.docker.com/compose/install/). To install Appwrite, make sure your Docker installation is updated to support Composer V2.
|
||||
|
||||
## Get started {% #get-started %}
|
||||
Set up your first Appwrite instance with a single Docker command.
|
||||
{% info title="Upgrading From Older Versions" %}
|
||||
If you are migrating from an older version of Appwrite, you need to follow the [migration instructions](/docs/advanced/self-hosting/update)
|
||||
{% /info %}
|
||||
|
||||
## Install with Docker {% #install-with-docker %}
|
||||
|
||||
The easiest way to start running your Appwrite server is by running our Docker installer tool from your terminal. Before running the installation command, make sure you have [Docker CLI](https://www.docker.com/products/docker-desktop) installed on your host machine.
|
||||
|
||||
You will be prompted to configure the following during the setup command:
|
||||
|
||||
1. Your Appwrite instance's HTTP and HTTPS ports.
|
||||
2. Your Appwrite instance's secret key used to encrypt sensitive data.
|
||||
3. Your Appwrite instance's main hostname. Appwrite will generate a certificate using this hostname.
|
||||
4. Your Appwrite instance's DNS A record hostname. Typically set to the same value as your Appwrite instance's hostname.
|
||||
|
||||
{% tabs %}
|
||||
{% tabsitem #unix title="macOS and Linux" %}
|
||||
@@ -31,10 +37,6 @@ docker run -it --rm \
|
||||
--entrypoint="install" \
|
||||
appwrite/appwrite:1.4.3
|
||||
```
|
||||
After running the command, you can access the Appwrite Console and start building on `localhost`.
|
||||
Read more about other ways to install and uninstall.
|
||||
|
||||
[Learn about install and uninstall {% icon icon="cheveron-right" /%}](#)
|
||||
{% /tabsitem %}
|
||||
|
||||
{% tabsitem #windows title="Windows" %}
|
||||
@@ -54,59 +56,58 @@ docker run -it --rm `
|
||||
--entrypoint="install" `
|
||||
appwrite/appwrite:1.4.3
|
||||
```
|
||||
After running the command, you can access the Appwrite Console and start building on `localhost`.
|
||||
Read more about other ways to install and uninstall.
|
||||
|
||||
[Learn about install and uninstall {% icon icon="cheveron-right" /%}](#)
|
||||
{% /tabsitem %}
|
||||
{% /tabs %}
|
||||
|
||||
To unlock the full capabilities of Appwrite, read about the following configurations.
|
||||
## One-click setups {% #one-click-setups %}
|
||||
|
||||
## Email delivery
|
||||
Appwrite requires an SMTP service to deliver emails.
|
||||
Email delivery is required for features like password recovery, account verification, MagicURL authentication, and team invites.
|
||||
You can use a third-party SMTP service or host your own SMTP server.
|
||||
In addition to running Appwrite locally, you can also launch Appwrite using a pre-configured setup. This allows you to get up and running with Appwrite quickly without installing Docker on your local machine.
|
||||
|
||||
[Configure email delivery {% icon icon="cheveron-right" /%}](#)
|
||||
Choose from one of the providers below:
|
||||
|
||||
## SMS delivery
|
||||
Appwrite supports multiple third-party SMS delivery providers.
|
||||
SMS delivery is required for phone authentication.
|
||||
|Provider | Installation Link
|
||||
--- | --- | ---
|
||||
{% icon icon="do" /%}| DigitalOcean | [Click to install](https://marketplace.digitalocean.com/apps/appwrite)
|
||||
{% icon icon="gitpod" /%}| Gitpod | [Click to install](https://gitpod.io/#https://github.com/appwrite/integration-for-gitpod)
|
||||
{% icon icon="akamai" /%}| Akamai Compute | [Click to install](https://www.linode.com/marketplace/apps/appwrite/appwrite/)
|
||||
|
||||
[Configure SMS delivery {% icon icon="cheveron-right" /%}](#)
|
||||
## Next steps {% #next-steps %}
|
||||
|
||||
## Functions
|
||||
Appwrite supports 10+ function runtimes and automatic deployments through Git integration.
|
||||
Before using Appwrite Functions, configure Git integration and enable runtimes.
|
||||
Self-hosting Appwrite gives you more configurable options.
|
||||
Make these configurations to unlock the full power of Appwrite.
|
||||
|
||||
[Configure Appwrite Functions {% icon icon="cheveron-right" /%}](#)
|
||||
[Configure Appwrite Functions](/docs/advanced/self-hosting/functions)
|
||||
|
||||
## Storage
|
||||
Appwrite's Storage Service can be configured to store files locally, or with self-hosted and cloud storage services.
|
||||
By default, Appwrite's Storage Service stores files on your server's local storage.
|
||||
If you expect large volumes of data or the need to have scalable data storage, you may choose to use a separate storage service.
|
||||
[Configure email delivery](/docs/advanced/self-hosting/email)
|
||||
|
||||
[Configure Appwrite Storage {% icon icon="cheveron-right" /%}](#)
|
||||
[Configure SMS delivery](/docs/advanced/self-hosting/sms)
|
||||
|
||||
## TLS Certificates
|
||||
Appwrite uses Let's Encrypt to auto-generate TLS certificates for your Appwrite instance to ensure your API traffic is appropriately encrypted.
|
||||
Configuration is required for Appwrite to properly generate certificates.
|
||||
[Configure Appwrite Storage](/docs/advanced/self-hosting/storage)
|
||||
|
||||
[Configure TLS certificates {% icon icon="cheveron-right" /%}](#)
|
||||
[Configure TLS Certificates](/docs/advanced/self-hosting/tls-certificates)
|
||||
|
||||
## Debug
|
||||
Appwrite provides tools to monitor server health, handle error logging.
|
||||
## Manual (Docker Compose) {% #manual %}
|
||||
|
||||
[Learn about upgrade {% icon icon="cheveron-right" /%}](#)
|
||||
For advanced Docker users, the manual installation might seem more familiar. To set up Appwrite manually, download the Appwrite base `docker-compose.yml` and `.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:
|
||||
|
||||
## Update
|
||||
Each Appwrite version contains a migration script to help you migrate your apps during updates.
|
||||
```bash
|
||||
docker compose up -d --remove-orphans
|
||||
```
|
||||
|
||||
[Learn about updates {% icon icon="cheveron-right" /%}](#)
|
||||
Once the Docker installation completes, go to your machine's hostname or IP address on your browser to access the Appwrite Console. Please note that on hosts that are not Linux-native, the server might take a few minutes to start after installation completes.
|
||||
|
||||
## Production
|
||||
Self-hosting Appwrite can be used in production settings.
|
||||
To succeed with Appwrite in a production environment, you should follow a few basic concepts and best practices.
|
||||
## Stop {% #stop %}
|
||||
|
||||
[Learn about production {% icon icon="cheveron-right" /%}](#)
|
||||
You can stop your Appwrite containers by using the following command executed from the same directory as your `docker-compose.yml` file.
|
||||
|
||||
```bash
|
||||
docker compose stop
|
||||
```
|
||||
|
||||
## Uninstall {% #uninstall %}
|
||||
|
||||
To stop and remove your Appwrite containers, you can use the following command executed from the same directory as your `docker-compose.yml` file.
|
||||
|
||||
```bash
|
||||
docker compose down -v
|
||||
```
|
||||
@@ -0,0 +1,203 @@
|
||||
---
|
||||
layout: article
|
||||
title: Environment variables
|
||||
description: Learn how to integrate Appwrite in your application with one of the supported SDKs.
|
||||
---
|
||||
|
||||
|
||||
Appwrite environment variables allow you to edit your server setup configuration and customize it. You can easily change the environment variables by changing them when running Appwrite using Docker CLI or Docker Compose.
|
||||
|
||||
Updating your Appwrite environment variables requires you to edit your Appwrite `.env` file. Your Docker files should be located inside the "appwrite" folder at the location where you first run the Appwrite installation script. It's recommended to use the `.env` file as a central point for updating your Appwrite configuration rather than changing them directly in your `docker-compose.yml` file.
|
||||
|
||||
After editing your `docker-compose.yml` or `.env` files, you will need to recreate your Appwrite stack by running the following compose command in your terminal:
|
||||
```bash
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
You can verify if the changes have been successfully applied by running this command:
|
||||
```bash
|
||||
docker compose exec appwrite vars
|
||||
```
|
||||
|
||||
## General {% #general %}
|
||||
| Name | Description |
|
||||
|------|-------------|
|
||||
| `_APP_ENV` | Set your server running environment. By default, the var is set to 'development'. When deploying to production, change it to: 'production'. |
|
||||
| `_APP_LOCALE` | Set your Appwrite's locale. By default, the locale is set to 'en'. |
|
||||
| `_APP_OPTIONS_ABUSE` | Allows you to disable abuse checks and API rate limiting. By default, set to 'enabled'. To cancel the abuse checking, set to 'disabled'. It is not recommended to disable this check-in a production environment. |
|
||||
| `_APP_OPTIONS_FORCE_HTTPS` | Allows you to force HTTPS connection to your API. This feature redirects any HTTP call to HTTPS and adds the 'Strict-Transport-Security' header to all HTTP responses. By default, set to 'enabled'. To disable, set to 'disabled'. This feature will work only when your ports are set to default 80 and 443. |
|
||||
| `_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_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. |
|
||||
| `_APP_SYSTEM_EMAIL_NAME`| This is the sender name value that will appear on email messages sent to developers from the Appwrite console. The default value is: 'Appwrite'. You can use url encoded strings for spaces and special chars. |
|
||||
| `_APP_SYSTEM_EMAIL_ADDRESS` | This is the sender email address that will appear on email messages sent to developers from the Appwrite console. The default value is 'team@appwrite.io'. You should choose an email address that is allowed to be used from your SMTP server to avoid the server email ending in the users' SPAM folders. |
|
||||
| `_APP_SYSTEM_RESPONSE_FORMAT` | Use this environment variable to set the default Appwrite HTTP response format to support an older version of Appwrite. This option is useful to overcome breaking changes between versions. You can also use the `X-Appwrite-Response-Format` HTTP request header to overwrite the response for a specific request. This variable accepts any valid Appwrite version. To use the current version format, leave the value of the variable empty. |
|
||||
| `_APP_SYSTEM_SECURITY_EMAIL_ADDRESS` | This is the email address used to issue SSL certificates for custom domains or the user agent in your webhooks payload. |
|
||||
| `_APP_USAGE_STATS` | This variable allows you to disable the collection and displaying of usage stats. This value is set to 'enabled' by default, to disable the usage stats set the value to 'disabled'. When disabled, it's recommended to turn off the Worker Usage container to reduce resource usage. |
|
||||
| `_APP_LOGGING_PROVIDER` | **(version >= 0.12.0)** 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` | **(version >= 0.12.0)** This variable configures authentication to 3rd party error logging providers. 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_WORKER_PER_CORE` | **(version >= 0.13.0)** Internal Worker per core for the API, Realtime and Executor containers. Can be configured to optimize performance. |
|
||||
|
||||
|
||||
## Redis {% #redis %}
|
||||
Appwrite uses a Redis server for managing cache, queues and scheduled tasks. The Redis env vars are used to allow Appwrite server to connect to the Redis container.
|
||||
|
||||
| Name | Description |
|
||||
|--------------------------|-------------------------------------------------------------------------------------------------------|
|
||||
| `_APP_REDIS_HOST` | Redis server hostname address. Default value is: `redis`. |
|
||||
| `_APP_REDIS_PORT` | Redis server TCP port. Default value is: `6379`. |
|
||||
| `_APP_REDIS_USER` | Redis server user. This is an optional variable. Default value is an empty string. |
|
||||
| `_APP_REDIS_PASS` | Redis server password. This is an optional variable. Default value is an empty string.|
|
||||
|
||||
|
||||
|
||||
Appwrite is using a MariaDB server for managing persistent database data. The MariaDB env vars are used to allow Appwrite server to connect to the MariaDB container.
|
||||
|
||||
| Name | Description |
|
||||
|------------------------|--------------------------------------------------------------------------------------------------|
|
||||
| `_APP_DB_HOST` | MariaDB server host name address. Default value is: `mariadb`. |
|
||||
| `_APP_DB_PORT` | MariaDB server TCP port. Default value is: `3306`. |
|
||||
| `_APP_DB_SCHEMA` | MariaDB server database schema. Default value is: `appwrite`. |
|
||||
| `_APP_DB_USER` | MariaDB server user name. Default value is: `user`. |
|
||||
| `_APP_DB_PASS` | MariaDB server user password. Default value is: `password`. |
|
||||
| `_APP_DB_ROOT_PASS` | MariaDB server root password. Default value is: `rootsecretpassword`. |
|
||||
|
||||
## InfluxDB {% #influxdb %}
|
||||
Appwrite uses an InfluxDB server for managing time-series data and server stats. The InfluxDB env vars are used to allow Appwrite server to connect to the InfluxDB container.
|
||||
|
||||
| Name | Description |
|
||||
|-----------------------|-------------------------------------------------------------------------------------------------|
|
||||
| `_APP_INFLUXDB_HOST` | InfluxDB server host name address. Default value is: `influxdb`. |
|
||||
| `_APP_INFLUXDB_PORT` | InfluxDB server TCP port. Default value is: `8086`. |
|
||||
|
||||
|
||||
## StatsD {% #statsd %}
|
||||
|
||||
Appwrite uses a StatsD server for aggregating and sending stats data over a fast UDP connection. The StatsD env vars are used to allow Appwrite server to connect to the StatsD container.
|
||||
|
||||
| Name | Description |
|
||||
|---------------------|-------------------------------------------------------------------------------------|
|
||||
| `_APP_STATSD_HOST` | StatsD server host name address. Default value is: `telegraf`. |
|
||||
| `_APP_STATSD_PORT` | StatsD server TCP port. Default value is: `8125`. |
|
||||
|
||||
|
||||
## SMTP {% #smtp %}
|
||||
|
||||
Appwrite is using an SMTP server for emailing your projects users and server admins. The SMTP env vars are used to allow Appwrite server to connect to the SMTP container.
|
||||
|
||||
If running in production, it might be easier to use a 3rd party SMTP server as it might be a little more difficult to set up a production SMTP server that will not send all your emails into your user's **spam folder**.
|
||||
|
||||
| Name | Description |
|
||||
|-----------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| `_APP_SMTP_HOST` | SMTP server host name address. Use an empty string to disable all mail sending from the server. The default value for this variable is an empty string. |
|
||||
| `_APP_SMTP_PORT` | SMTP server TCP port. Empty by default. |
|
||||
| `_APP_SMTP_SECURE` | SMTP secure connection protocol. Empty by default, change to 'tls' if running on a secure connection. |
|
||||
| `_APP_SMTP_USERNAME` | SMTP server user name. Empty by default. |
|
||||
| `_APP_SMTP_PASSWORD` | SMTP server user password. Empty by default. |
|
||||
|
||||
|
||||
## Phone {% #phone %}
|
||||
|
||||
| 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_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 %}
|
||||
|
||||
| Name | Description |
|
||||
|---------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| `_APP_STORAGE_LIMIT` | **version >= 0.7.0** Maximum file size allowed for file upload. The default value is 30MB. You should pass your size limit value in bytes. |
|
||||
| `_APP_STORAGE_PREVIEW_LIMIT` | **version >= 0.13.4** Maximum file size allowed for file image preview. The default value is 20MB. You should pass your size limit value in bytes. |
|
||||
| `_APP_STORAGE_ANTIVIRUS` | This variable allows you to disable the internal anti-virus scans. This value is set to 'disabled' by default, to enable the scans set the value to 'enabled'. Before enabling, you must add the ClamAV service and depend on it on main Appwrite service. |
|
||||
| `_APP_STORAGE_ANTIVIRUS_HOST` | **version >= 0.7.0** ClamAV server host name address. Default value is: 'clamav'. |
|
||||
| `_APP_STORAGE_ANTIVIRUS_PORT` | **version >= 0.7.0** ClamAV server TCP port. Default value is: '3310'. |
|
||||
| `_APP_STORAGE_DEVICE` | **version >= 0.13.0** Select default storage device. The default value is 'local'. List of supported adapters are 'local', 's3', 'dospaces', 'backblaze', 'linode' and 'wasabi'. |
|
||||
| `_APP_STORAGE_S3_ACCESS_KEY` | **version >= 0.13.0** AWS S3 storage access key. Required when the storage adapter is set to S3. You can get your access key from your AWS console. |
|
||||
| `_APP_STORAGE_S3_SECRET` | **version >= 0.13.0** AWS S3 storage secret key. Required when the storage adapter is set to S3. You can get your secret key from your AWS console. |
|
||||
| `_APP_STORAGE_S3_REGION` | **version >= 0.13.0** AWS S3 storage region. Required when storage adapter is set to S3. You can find your region info for your bucket from AWS console. |
|
||||
| `_APP_STORAGE_S3_BUCKET` | **version >= 0.13.0** AWS S3 storage bucket. Required when storage adapter is set to S3. You can create buckets in your AWS console. |
|
||||
| `_APP_STORAGE_DO_SPACES_ACCESS_KEY` | **version >= 0.13.0** DigitalOcean spaces access key. Required when the storage adapter is set to DOSpaces. You can get your access key from your DigitalOcean console. |
|
||||
| `_APP_STORAGE_DO_SPACES_SECRET` | **version >= 0.13.0** DigitalOcean spaces secret key. Required when the storage adapter is set to DOSpaces. You can get your secret key from your DigitalOcean console. |
|
||||
| `_APP_STORAGE_DO_SPACES_REGION` | **version >= 0.13.0** DigitalOcean spaces region. Required when storage adapter is set to DOSpaces. You can find your region info for your space from DigitalOcean console. |
|
||||
| `_APP_STORAGE_DO_SPACES_BUCKET` | **version >= 0.13.0** DigitalOcean spaces bucket. Required when storage adapter is set to DOSpaces. You can create spaces in your DigitalOcean console. |
|
||||
| `_APP_STORAGE_BACKBLAZE_ACCESS_KEY` | **version >= 0.14.2** Backblaze access key. Required when the storage adapter is set to Backblaze. Your Backblaze keyID will be your access key. You can get your keyID from your Backblaze console. |
|
||||
| `_APP_STORAGE_BACKBLAZE_SECRET` | **version >= 0.14.2** Backblaze secret key. Required when the storage adapter is set to Backblaze. Your Backblaze applicationKey will be your secret key. You can get your applicationKey from your Backblaze console. |
|
||||
| `_APP_STORAGE_BACKBLAZE_REGION` | **version >= 0.14.2** Backblaze region. Required when storage adapter is set to Backblaze. You can find your region info from your Backblaze console. |
|
||||
| `_APP_STORAGE_BACKBLAZE_BUCKET` | **version >= 0.14.2** Backblaze bucket. Required when storage adapter is set to Backblaze. You can create your bucket from your Backblaze console. |
|
||||
| `_APP_STORAGE_LINODE_ACCESS_KEY` | **version >= 0.14.2** Linode object storage access key. Required when the storage adapter is set to Linode. You can get your access key from your Linode console. |
|
||||
| `_APP_STORAGE_LINODE_SECRET` | **version >= 0.14.2** Linode object storage secret key. Required when the storage adapter is set to Linode
|
||||
|
||||
## Functions {% #functions %}
|
||||
| **Name** | **Description** |
|
||||
|-------------------------------|-----------------|
|
||||
| `_APP_FUNCTIONS_SIZE_LIMIT` | **version >= 0.13.0** The maximum size deployment in bytes. The default value is 30MB. |
|
||||
| `_APP_FUNCTIONS_TIMEOUT` | **version >= 0.7.0** The maximum number of seconds allowed as a timeout value when creating a new function. The default value is 900 seconds. This is the global limit, timeout for individual functions are configured in the function's settings or in appwrite.json. |
|
||||
| `_APP_FUNCTIONS_BUILD_TIMEOUT`| **version >= 0.13.0** The maximum number of seconds allowed as a timeout value when building a new function. The default value is 900 seconds. |
|
||||
| `_APP_FUNCTIONS_CONTAINERS` | **version >= 0.7.0** Deprecated since 1.2.0. Runtimes now timeout by inactivity using `_APP_FUNCTIONS_INACTIVE_THRESHOLD`. |
|
||||
| `_APP_FUNCTIONS_CPUS` | **version >= 0.7.0** The maximum number of CPU core a single cloud function is allowed to use. Please note that setting a value higher than available cores will result in a function error, which might result in an error. The default value is empty. When it's empty, CPU limit will be disabled. |
|
||||
| `_APP_FUNCTIONS_MEMORY` | **version >= 0.7.0** The maximum amount of memory a single cloud function is allowed to use in megabytes. The default value is empty. When it's empty, memory limit will be disabled. |
|
||||
| `_APP_FUNCTIONS_MEMORY_SWAP` | **version >= 0.7.0** Deprecated since 1.2.0. High use of swap memory is not recommended to preserve harddrive health. |
|
||||
| `_APP_FUNCTIONS_RUNTIMES` | **version >= 0.8.0** This option allows you to enable or disable runtime environments for cloud functions. Disable unused runtimes to save disk space. To enable cloud function runtimes, pass a list of enabled environments separated by a comma. [Learn more about runtimes](/docs/products/functions/runtimes).|
|
||||
| `_APP_EXECUTOR_SECRET` | **version >= 0.13.0** The secret key used by Appwrite to communicate with the function executor. Make sure to change this! |
|
||||
| `_APP_EXECUTOR_HOST` | **version >= 0.13.0** The host used by Appwrite to communicate with the function executor! |
|
||||
| `_APP_EXECUTOR_RUNTIME_NETWORK`| **version >= 0.13.0** Deprecated with 0.14.0, use `OPEN_RUNTIMES_NETWORK` instead! |
|
||||
| `_APP_FUNCTIONS_ENVS` | **version >= 0.7.0** Deprecated with 0.8.0, use `_APP_FUNCTIONS_RUNTIMES` instead! |
|
||||
| `_APP_FUNCTIONS_INACTIVE_THRESHOLD`| **version >= 0.13.0** The minimum time a function must be inactive before it can be shut down and cleaned up. This feature is intended to clean up unused containers. Containers may remain active for longer than the interval before being shut down, as Appwrite only cleans up unused containers every hour. If no value is provided, the default is 60 seconds. |
|
||||
| `DOCKERHUB_PULL_USERNAME` | **version >= 0.10.0** Deprecated with 1.2.0, use `_APP_DOCKER_HUB_USERNAME` instead! |
|
||||
| `DOCKERHUB_PULL_PASSWORD` | **version >= 0.10.0** Deprecated with 1.2.0, use `_APP_DOCKER_HUB_PASSWORD` instead! |
|
||||
| `DOCKERHUB_PULL_EMAIL` | **version >= 0.10.0** Deprecated since 1.2.0. Email is no longer needed. |
|
||||
| `OPEN_RUNTIMES_NETWORK` | **version >= 0.13.0** Deprecated with 1.2.0, use `_APP_FUNCTIONS_RUNTIMES_NETWORK` instead! |
|
||||
| `_APP_FUNCTIONS_RUNTIMES_NETWORK`| **version >= 1.2.0** The docker network used for communication between the executor and runtimes. |
|
||||
| `_APP_DOCKER_HUB_USERNAME` | **version >= 1.2.0** The username for hub.docker.com. This variable is used to pull images from hub.docker.com. |
|
||||
| `_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). |
|
||||
|
||||
## VCS (Version Control System) {% #vcs %}
|
||||
|
||||
| **Name** | **Description** |
|
||||
|---------------------------------|-----------------------------------------------------------------------------------------------------------------|
|
||||
| `_APP_VCS_GITHUB_APP_NAME` | **version >= 1.4.0** - Name of your GitHub app. This value should be set to your GitHub application's URL. |
|
||||
| `_APP_VCS_GITHUB_PRIVATE_KEY` | **version >= 1.4.0** - GitHub app RSA private key. You can generate private keys from GitHub application settings. |
|
||||
| `_APP_VCS_GITHUB_APP_ID` | **version >= 1.4.0** - GitHub application ID. You can find it in your GitHub application details. |
|
||||
| `_APP_VCS_GITHUB_CLIENT_ID` | **version >= 1.4.0** - GitHub client ID. You can find it in your GitHub application details. |
|
||||
| `_APP_VCS_GITHUB_CLIENT_SECRET` | **version >= 1.4.0** - GitHub client secret. You can generate secrets in your GitHub application settings. |
|
||||
| `_APP_VCS_GITHUB_WEBHOOK_SECRET`| **version >= 1.4.0** - GitHub webhook secret. You can configure it in your GitHub application settings under webhook section. |
|
||||
|
||||
|
||||
## Maintenance {% #maintenance %}
|
||||
| **Name** | **Description** |
|
||||
|-------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| `_APP_MAINTENANCE_INTERVAL` | **version >= 0.7.0** - Interval value containing the number of seconds that the Appwrite maintenance process should wait before executing system cleanups and optimizations. The default value is `86400` seconds (1 day). |
|
||||
| `_APP_MAINTENANCE_RETENTION_CACHE` | **version >= 1.0.0** - The maximum duration (in seconds) upto which to retain cached files. The default value is `2592000` seconds (30 days). |
|
||||
| `_APP_MAINTENANCE_RETENTION_EXECUTION` | **version >= 0.7.0** - The maximum duration (in seconds) upto which to retain execution logs. The default value is `1209600` seconds (14 days). |
|
||||
| `_APP_MAINTENANCE_RETENTION_AUDIT` | **version >= 0.7.0** - The maximum duration (in seconds) upto which to retain audit logs. The default value is `1209600` seconds (14 days). |
|
||||
| `_APP_MAINTENANCE_RETENTION_ABUSE` | **version >= 0.7.0** - The maximum duration (in seconds) upto which to retain abuse logs. The default value is `86400` seconds (1 day). |
|
||||
| `_APP_MAINTENANCE_RETENTION_USAGE_HOURLY` | The maximum duration (in seconds) upto which to retain hourly usage metrics. The default value is `8640000` seconds (100 days). |
|
||||
| `_APP_MAINTENANCE_RETENTION_SCHEDULES` | Schedules deletion interval (in seconds). |
|
||||
|
||||
## GraphQL {% #graphql %}
|
||||
|
||||
| **Name** | **Description** |
|
||||
|------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| `_APP_GRAPHQL_MAX_BATCH_SIZE` | **version >= 1.2.0** - Maximum number of batched queries per request. The default value is 10. |
|
||||
| `_APP_GRAPHQL_MAX_COMPLEXITY` | **version >= 1.2.0** - Maximum complexity of a GraphQL query. One field adds one to query complexity. Lists multiply the complexity by the number of items requested. The default value is 250. |
|
||||
| `_APP_GRAPHQL_MAX_DEPTH` | **version >= 1.2.0** - Maximum depth of a GraphQL query. One nested field level adds one to query depth. The default value is 3. |
|
||||
|
||||
## Migrations {% #migrations %}
|
||||
| **Name** | **Description** |
|
||||
|-------------------------------------------------|---------------------------------------------------------------------------------------------------------|
|
||||
| `_APP_MIGRATIONS_FIREBASE_CLIENT_ID` | **version >= 1.4.0** - Google OAuth client ID. You can find it in your GCP application settings. |
|
||||
| `_APP_MIGRATIONS_FIREBASE_CLIENT_SECRET` | **version >= 1.4.0** - Google OAuth client secret. You can generate secrets in your GCP application settings. |
|
||||
|
||||
## Assistant {% #assistant %}
|
||||
| **Name** | **Description** |
|
||||
|----------------------------------------|-------------------------------------------------------------------------|
|
||||
| `_APP_ASSISTANT_OPENAI_API_KEY` | **version >= 1.4.0** - OpenAI API key. You can find it in your OpenAI application settings. |
|
||||
@@ -105,7 +105,7 @@ _APP_VCS_GITHUB_CLIENT_SECRET=35rsdse532q13
|
||||
_APP_VCS_GITHUB_WEBHOOK_SECRET=super-secret
|
||||
```
|
||||
|
||||
[Learn more about environment variables](#)
|
||||
[Learn more about environment variables](/docs/advanced/self-hosting/environment-variables)
|
||||
|
||||
### Update exiting GitHub apps {% #existing-apps %}
|
||||
|
||||
@@ -125,7 +125,7 @@ The example below would enable Dart 2.15, .NET 6.0, and Java 18 runtimes.
|
||||
_APP_FUNCTIONS_RUNTIMES=dart-2.15, dotnet-6.0, java-18.0
|
||||
```
|
||||
|
||||
You can find a full list of supported runtimes on the [environment variables page](#).
|
||||
You can find a full list of supported runtimes on the [environment variables page](/docs/advanced/self-hosting/environment-variables).
|
||||
|
||||
You can also configure the maximum timeout that can be set on individual Appwrite functions. The maximum configurable timeout can be increased by changing the `_APP_FUNCTIONS_TIMEOUT` environment variable. This environment variable changes the configurable maximum but does not alter existing configurations of individual functions.
|
||||
|
||||
|
||||
@@ -65,22 +65,42 @@ In addition to running Appwrite locally, you can also launch Appwrite using a pr
|
||||
|
||||
Choose from one of the providers below:
|
||||
|
||||
|Provider | Installation Link
|
||||
--- | --- | ---
|
||||
{% icon icon="digitalocean" /%}| DigitalOcean | [Click to install](https://marketplace.digitalocean.com/apps/appwrite)
|
||||
{% icon icon="gitpod" /%}| Gitpod | [Click to install](https://gitpod.io/#https://github.com/appwrite/integration-for-gitpod)
|
||||
{% icon icon="akamai" /%}| Akamai Compute | [Click to install](https://www.linode.com/marketplace/apps/appwrite/appwrite/)
|
||||
{% table %}
|
||||
*
|
||||
* Provider
|
||||
* Installation Link
|
||||
---
|
||||
* {% only_dark %}{% icon_image src="/images/one-click/dark/digitalocean.svg" alt="DigitalOcean logo" size="m" /%}{% /only_dark %}
|
||||
{% only_light %}{% icon_image src="/images/one-click/digitalocean.svg" alt="DigitalOcean logo" size="m" /%}{% /only_light %}
|
||||
* DigitalOcean
|
||||
* [Click to install](https://marketplace.digitalocean.com/apps/appwrite)
|
||||
---
|
||||
* {% only_dark %}{% icon_image src="/images/one-click/dark/gitpod.svg" alt="Gitpod logo" size="m" /%}{% /only_dark %}
|
||||
{% only_light %}{% icon_image src="/images/one-click/gitpod.svg" alt="Gitpod logo" size="m" /%}{% /only_light %}
|
||||
* Gitpod
|
||||
* [Click to install](https://gitpod.io/#https://github.com/appwrite/integration-for-gitpod)
|
||||
---
|
||||
* {% only_dark %}{% icon_image src="/images/one-click/dark/akamai.svg" alt="Akamai logo" size="m" /%}{% /only_dark %}
|
||||
{% only_light %}{% icon_image src="/images/one-click/akamai.svg" alt="Akamai logo" size="m" /%}{% /only_light %}
|
||||
* Akamai Compute
|
||||
* [Click to install](https://www.linode.com/marketplace/apps/appwrite/appwrite/)
|
||||
{% /table %}
|
||||
|
||||
|
||||
## Next steps {% #next-steps %}
|
||||
|
||||
Self-hosting Appwrite gives you more configurable options.
|
||||
Make these configurations to unlock the full power of Appwrite.
|
||||
|
||||
- [Configure email delivery](#)
|
||||
- [Configure SMS delivery](#)
|
||||
- [Configure Appwrite Functions](#)
|
||||
- [Configure Appwrite Storage](#)
|
||||
- [Configure TLS Certificates](#)
|
||||
[Configure Appwrite Functions](/docs/advanced/self-hosting/functions)
|
||||
|
||||
[Configure email delivery](/docs/advanced/self-hosting/email)
|
||||
|
||||
[Configure SMS delivery](/docs/advanced/self-hosting/sms)
|
||||
|
||||
[Configure Appwrite Storage](/docs/advanced/self-hosting/storage)
|
||||
|
||||
[Configure TLS Certificates](/docs/advanced/self-hosting/tls-certificates)
|
||||
|
||||
## Manual (Docker Compose) {% #manual %}
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ Make sure to keep this key in a safe place and never make it publicly accessible
|
||||
|
||||
{% info title="Best practice" %}
|
||||
You should always prefer **HTTPS** over HTTP in production environments. This keeps your APIs secure and prevents any redirects from interfering with your requests.
|
||||
You can force the use of HTTPS with the [_APP_OPTIONS_FORCE_HTTPS](#) environment variable.
|
||||
You can force the use of HTTPS with the [_APP_OPTIONS_FORCE_HTTPS](/docs/advanced/self-hosting/environment-variables) environment variable.
|
||||
{% /info %}
|
||||
|
||||
## Console access {% #console-access %}
|
||||
@@ -29,7 +29,7 @@ Appwrite provides three different methods to limit access to your Appwrite Conso
|
||||
|
||||
By default, only the first user can sign up on the Appwrite instance's dashboard. All other users must be added to the dashboard through invitation.
|
||||
|
||||
[Learn more about environment variables {% icon icon="cheveron-right" /%}](#)
|
||||
[Learn more about environment variables {% icon icon="cheveron-right" /%}](/docs/advanced/self-hosting/environment-variables)
|
||||
|
||||
## Scaling {% #scaling %}
|
||||
|
||||
@@ -47,7 +47,7 @@ If you disabled rate limits during development, make sure you re-enable them whe
|
||||
|
||||
Rate limits are an important mechanism to protect your app. Without rate limits, malicious actors can spam your APIs to perform [denial-of-service type attacks](https://en.wikipedia.org/wiki/Denial-of-service_attack) or brute-force user passwords.
|
||||
|
||||
[Learn more about environment variables {% icon icon="cheveron-right" /%}](#)
|
||||
[Learn more about environment variables {% icon icon="cheveron-right" /%}](/docs/advanced/self-hosting/environment-variables)
|
||||
|
||||
## Emails {% #emails %}
|
||||
|
||||
@@ -70,7 +70,7 @@ Do not back up any stateful container using a docker volume backup, such as data
|
||||
|
||||
## Errors {% #errors %}
|
||||
|
||||
By default, your Appwrite installation comes with error reporting turned off. You can [enable dev mode](#) to get access to more verbose error logs and stack traces.
|
||||
By default, your Appwrite installation comes with error reporting turned off. You can [enable dev mode](/docs/advanced/self-hosting/debug#development-mode) to get access to more verbose error logs and stack traces.
|
||||
|
||||
In production, it is highly recommended to turn error reporting off. To do so, make sure the Appwrite container environment variable `_APP_ENV` value from is set to `production` and not `development`.
|
||||
|
||||
@@ -78,7 +78,7 @@ To monitor errors in production, add a third party monitoring service by setting
|
||||
|
||||
In production, it is highly recommended to turn error reporting off. To do so, make sure the Appwrite container environment variable `_APP_ENV` is set to `production` and not `development`.
|
||||
|
||||
[Learn more about environment variables {% icon icon="cheveron-right" /%}](#)
|
||||
[Learn more about environment variables {% icon icon="cheveron-right" /%}](/docs/advanced/self-hosting/environment-variables)
|
||||
|
||||
## Security {% #security %}
|
||||
|
||||
|
||||
@@ -6,18 +6,46 @@ description: Learn how to integrate Appwrite in your application with one of the
|
||||
|
||||
Appwrite supports phone authentication, which allows users to create accounts and log in using SMS messages. Appwrite requires an SMS provider to be set up before using Phone authentication.
|
||||
|
||||
## SMS Providers {% #sms-providers %}
|
||||
## SMS providers {% #sms-providers %}
|
||||
|
||||
Appwrite supports a growing list of SMS providers that you can choose from. Choose one from the list below and set up an account.
|
||||
|
||||
| | SMS Provider | Create Account | Get Credentials |
|
||||
| ----------------- | -------------- | ------------------------------------------------------- | ----------------------------------------------------- |
|
||||
| | | | |
|
||||
| [TODO] | Twilio | [Website](https://www.twilio.com) | [Documentation](https://www.twilio.com/docs/iam/access-tokens#step-2-api-key) |
|
||||
| [TODO] | TextMagic | [Website](https://www.textmagic.com) | [Documentation](https://www.textmagic.com/docs/api/start/#How-to-obtain-the-API-credentials) |
|
||||
| [TODO] | Telesign | [Website](https://www.telesign.com) | [Documentation](https://support.telesign.com/s/article/Find-Customer-ID-and-API-Key) |
|
||||
| [TODO] | MSG91 | [Website](https://msg91.com) | [Documentation](https://msg91.com/help/where-can-i-find-my-authentication-key) |
|
||||
| [TODO] | Vonage | [Website](https://www.vonage.ca/) | [Documentation](https://developer.vonage.com/en/account/secret-management) |
|
||||
{% table %}
|
||||
* {% width=80 %}
|
||||
* SMS provider
|
||||
* Create account
|
||||
* Get credentials
|
||||
---
|
||||
* {% only_dark %}{% icon_image src="/images/sms-providers/dark/twilio.svg" alt="Twilio logo" size="l" /%}{% /only_dark %}
|
||||
{% only_light %}{% icon_image src="/images/sms-providers/twilio.svg" alt="Twilio logo" size="l" /%}{% /only_light %}
|
||||
* Twilio
|
||||
* [Website](https://www.twilio.com)
|
||||
* [Documentation](https://www.twilio.com/docs/iam/access-tokens#step-2-api-key)
|
||||
---
|
||||
* {% only_dark %}{% icon_image src="/images/sms-providers/dark/textmagic.svg" alt="TextMagic logo" size="l" /%}{% /only_dark %}
|
||||
{% only_light %}{% icon_image src="/images/sms-providers/textmagic.svg" alt="TextMagic logo" size="l" /%}{% /only_light %}
|
||||
* TextMagic
|
||||
* [Website](https://www.textmagic.com)
|
||||
* [Documentation](https://www.textmagic.com/docs/api/start/#How-to-obtain-the-API-credentials)
|
||||
---
|
||||
* {% only_dark %}{% icon_image src="/images/sms-providers/dark/telesign.svg" alt="Telesign logo" size="l" /%}{% /only_dark %}
|
||||
{% only_light %}{% icon_image src="/images/sms-providers/telesign.svg" alt="Telesign logo" size="l" /%}{% /only_light %}
|
||||
* Telesign
|
||||
* [Website](https://www.telesign.com)
|
||||
* [Documentation](https://support.telesign.com/s/article/Find-Customer-ID-and-API-Key)
|
||||
---
|
||||
* {% only_dark %}{% icon_image src="/images/sms-providers/dark/msg91.svg" alt="MSG91 logo" size="l" /%}{% /only_dark %}
|
||||
{% only_light %}{% icon_image src="/images/sms-providers/msg91.svg" alt="MSG91 logo" size="l" /%}{% /only_light %}
|
||||
* MSG91
|
||||
* [Website](https://msg91.com)
|
||||
* [Documentation](https://msg91.com/help/where-can-i-find-my-authentication-key)
|
||||
---
|
||||
* {% only_dark %}{% icon_image src="/images/sms-providers/dark/vonage.svg" alt="Vonage logo" size="l" /%}{% /only_dark %}
|
||||
{% only_light %}{% icon_image src="/images/sms-providers/vonage.svg" alt="Vonage logo" size="l" /%}{% /only_light %}
|
||||
* Vonage
|
||||
* [Website](https://www.vonage.ca/)
|
||||
* [Documentation](https://developer.vonage.com/en/account/secret-management)
|
||||
{% /table %}
|
||||
|
||||
## Environment variables {% #environment-variables %}
|
||||
|
||||
|
||||
@@ -14,11 +14,11 @@ Some of these services can be self-hosted, just like Appwrite.
|
||||
|
||||
You can select which storage adapter to use by setting the `_APP_STORAGE_DEVICE` environment variable. Valid values are `local`, `s3`, `dospaces`, `backblaze`, `linode`, and `wasabi`. Each storage adapter requires its own set of additional environment variables to configure.
|
||||
|
||||
[Learn more about storage environment variables {% icon icon="cheveron-right" /%}](#)
|
||||
[Learn more about storage environment variables {% icon icon="cheveron-right" /%}](/docs/advanced/self-hosting/environment-variables)
|
||||
|
||||
## Maximum file size {% #adapters %}
|
||||
|
||||
The maximum size for a single file upload is controlled by the `_APP_STORAGE_LIMIT` environment variable, which defaults to 30 MB.
|
||||
See [Environment Variables](#) for more information.
|
||||
[Learn more about environment variables](/docs/advanced/self-hosting/environment-variables).
|
||||
|
||||
{% partial file="update-variables.md" /%}
|
||||
|
||||
@@ -26,7 +26,7 @@ parent_directory <= you run the command in this directory
|
||||
|
||||
This is the parent directory where you will find the `appwrite directory, inside which there are `docker-compose.yml` and `.env` files.
|
||||
|
||||
## [Installing the Next Version](#)
|
||||
## Installing the next version {% #install-next-version %}
|
||||
|
||||
### Unix
|
||||
|
||||
|
||||
@@ -93,7 +93,7 @@ To subscribe to updates from different Appwrite resources, you need to specify o
|
||||
|
||||
If you subscribe to a channel, you will receive callbacks for a variety of events related to the channel. The events attribute in the callback can be used to filter and respond to specific events in a channel.
|
||||
|
||||
[View a list of all available events](#).
|
||||
[View a list of all available events](/docs/advanced/platform/events).
|
||||
|
||||
|
||||
{% info title="Permissions" %}
|
||||
@@ -337,7 +337,7 @@ The payload from the subscription will contain following properties:
|
||||
---
|
||||
* events
|
||||
* string[]
|
||||
* The [system events](#) that triggered this update.
|
||||
* The [Appwrite events](/docs/advanced/platform/events) that triggered this update.
|
||||
---
|
||||
* channels
|
||||
* string[]
|
||||
|
||||
@@ -31,7 +31,7 @@ Appwrite's REST APIs expect certain headers to be included with each request:
|
||||
---
|
||||
* X-Appwrite-JWT: [TOKEN]
|
||||
* optional
|
||||
* Token used for JWT authentication, tokens can be generated using the [Create JWT](/docs/products/auth/server-integrations) method.
|
||||
* Token used for JWT authentication, tokens can be generated using the [Create JWT](/docs/products/auth/jwt) method.
|
||||
---
|
||||
* X-Appwrite-Response-Format: [VERSION-NUMBER]
|
||||
* optional
|
||||
@@ -95,7 +95,7 @@ X-Appwrite-Key: [API_KEY]
|
||||
|
||||
### JWT
|
||||
|
||||
JWT authentication is frequently used by server applications to act on behalf of a user. Users generate tokens using the [Create JWT] (TODO) endpoint. When issuing requests authenticated with a JWT, Appwrite will treat the request like it is from the authenticated user.
|
||||
JWT authentication is frequently used by server applications to act on behalf of a user. Users generate tokens using the [Create JWT](/docs/references/cloud/client-web/account#createJWT) endpoint. When issuing requests authenticated with a JWT, Appwrite will treat the request like it is from the authenticated user.
|
||||
|
||||
```json
|
||||
GET /v1/account HTTP/1.1
|
||||
@@ -108,7 +108,7 @@ X-Appwrite-JWT: [TOKEN]
|
||||
|
||||
Appwrite implements resumable, chunked uploads for files larger than 5MB. Chunked uploads send files in chunks of 5MB to reduce memory footprint and increase resilience when handling large files. Appwrite SDKs will automatically handle chunked uploads, but it is possible to implement this with the REST API directly.
|
||||
|
||||
Upload endpoints in Appwrite, such as [Create File] (todo) and [Create Deployment] (todo), are different from other endpoints. These endpoints take multipart form data instead of JSON data. To implement chunked uploads, you will need to implement the following headers. If you wish, this logic is already available in any of the [Appwrite SDKs](/docs/sdks).
|
||||
Upload endpoints in Appwrite, such as [Create File] (/docs/references/cloud/client-web/storage#createFile) and [Create Deployment] (/docs/references/cloud/server-nodejs/functions#createDeployment), are different from other endpoints. These endpoints take multipart form data instead of JSON data. To implement chunked uploads, you will need to implement the following headers. If you wish, this logic is already available in any of the [Appwrite SDKs](/docs/sdks).
|
||||
|
||||
{% table %}
|
||||
* Header
|
||||
|
||||
@@ -21,6 +21,31 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
label: 'Concepts',
|
||||
items: [
|
||||
{
|
||||
label: 'Accounts',
|
||||
href: '/docs/products/auth/accounts'
|
||||
},
|
||||
{
|
||||
label: 'Users',
|
||||
href: '/docs/products/auth/users'
|
||||
},
|
||||
{
|
||||
label: 'Teams',
|
||||
href: '/docs/products/auth/teams'
|
||||
},
|
||||
{
|
||||
label: 'Labels',
|
||||
href: '/docs/products/auth/labels'
|
||||
},
|
||||
{
|
||||
label: 'Security',
|
||||
href: '/docs/products/auth/security'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
label: 'Journeys',
|
||||
items: [
|
||||
@@ -46,31 +71,10 @@
|
||||
},
|
||||
{
|
||||
label: 'JWT login',
|
||||
href: '/docs/products/auth/server-integrations'
|
||||
href: '/docs/products/auth/jwt'
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
label: 'Concepts',
|
||||
items: [
|
||||
{
|
||||
label: 'Accounts',
|
||||
href: '/docs/products/auth/accounts'
|
||||
},
|
||||
{
|
||||
label: 'Teams',
|
||||
href: '/docs/products/auth/teams'
|
||||
},
|
||||
{
|
||||
label: 'Labels',
|
||||
href: '/docs/products/auth/labels'
|
||||
},
|
||||
{
|
||||
label: 'Security',
|
||||
href: '/docs/products/auth/security'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
label: 'References',
|
||||
items: [
|
||||
@@ -83,7 +87,7 @@
|
||||
href: '/docs/references/cloud/server-nodejs/users'
|
||||
},
|
||||
{
|
||||
label: 'Users API',
|
||||
label: 'Teams API',
|
||||
href: '/docs/references/cloud/client-web/teams'
|
||||
}
|
||||
]
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
layout: article
|
||||
title: Authentication
|
||||
title: Overview
|
||||
description: This is the description used for SEO.
|
||||
back: /docs
|
||||
---
|
||||
|
||||
@@ -4,7 +4,7 @@ title: Accounts
|
||||
description: This is the description used for SEO.
|
||||
---
|
||||
|
||||
Appwrite allows users to create accounts.
|
||||
Appwrite Account API is used for user signup and login in client applications.
|
||||
Users can be organized into teams and be given labels, so they can be given different permissions and access different resources.
|
||||
Each user's account can also have their own preference object, which you can use to save preferences such as theme, language, and notification settings.
|
||||
|
||||
@@ -22,7 +22,7 @@ authentication.
|
||||
|
||||
## Preferences {% #preferences %}
|
||||
|
||||
You can store user preferences on a user's account using Appwrite's [Update Preferences](#) endpoint. You can store preferences such as theme, notification settings, or preferred language so they can be synced across multiple devices.
|
||||
You can store user preferences on a user's account using Appwrite's [Update Preferences](/docs/references/cloud/client-web/account#updatePrefs) endpoint. You can store preferences such as theme, notification settings, or preferred language so they can be synced across multiple devices.
|
||||
|
||||
Preferences are stored as a key-value JSON object. The maximum allowed size for preferences is 64kB, and an error will be thrown if this limit is exceeded.
|
||||
|
||||
@@ -108,7 +108,7 @@ mutation {
|
||||
```
|
||||
{% /multicode %}
|
||||
|
||||
After a user's preferences are updated, they can be retrieved using the [Get Preferences](#) endpoint.
|
||||
After a user's preferences are updated, they can be retrieved using the [get account preferences](/docs/references/cloud/client-web/account#getPrefs) endpoint.
|
||||
|
||||
{% multicode %}
|
||||
```js
|
||||
@@ -183,4 +183,6 @@ individual users using the `Role.user(<USER_ID>, <STATUS>)` role.
|
||||
| Verified user | `Role.user(<USER_ID>, 'verified')`|
|
||||
| Unverified user | `Role.user(<USER_ID>, 'unverified')` |
|
||||
|
||||
[Learn more about permissions](/docs/advanced/platform/permissions)
|
||||
|
||||
|
||||
[Learn more about permissions {% icon icon="cheveron-right" /%}](/docs/advanced/platform/permissions)
|
||||
@@ -4,13 +4,13 @@ title: Anonymous login
|
||||
description: This is the description used for SEO.
|
||||
---
|
||||
|
||||
Anonymous sessions allow you to implement guest users. Guest users let you store user information like items in their cart or theme preferences before they create an account. This reduces the friction for your users to get started with your app.
|
||||
Anonymous sessions allow you to implement **guest** users. Guest users let you store user information like items in their cart or theme preferences before they create an account. This reduces the friction for your users to get started with your app.
|
||||
|
||||
**If a user later creates an account**, their information will be inherited by the newly created account.
|
||||
|
||||
## Create anonymous session {% #createSession %}
|
||||
|
||||
Create an anonymous session with [Create Anonymous Session](#) route.
|
||||
Create an anonymous session with [Create Anonymous Session](/docs/references/cloud/client-web/account#createAnonymousSession) route.
|
||||
|
||||
{% multicode %}
|
||||
```js
|
||||
@@ -82,7 +82,10 @@ Anonymous users cannot sign back in. If the session expires, they move to anothe
|
||||
|
||||
Create an account with any of these methods to transition from an anonymous session to a user account session.
|
||||
|
||||
- [Email and password](/docs/products/auth/email-password)
|
||||
- [Phone (SMS)](/docs/products/auth/phone-sms)
|
||||
- [Magic URL](/docs/products/auth/magic-url)
|
||||
- [OAuth2](/docs/products/auth/oauth2)
|
||||
[Email and password {% icon icon="cheveron-right" /%}](/docs/products/auth/email-password)
|
||||
|
||||
[Phone (SMS) {% icon icon="cheveron-right" /%}](/docs/products/auth/phone-sms)
|
||||
|
||||
[Magic URL {% icon icon="cheveron-right" /%}](/docs/products/auth/magic-url)
|
||||
|
||||
[OAuth2 {% icon icon="cheveron-right" /%}](/docs/products/auth/oauth2)
|
||||
|
||||
@@ -28,7 +28,7 @@ promise.then(function (response) {
|
||||
});
|
||||
```
|
||||
|
||||
Passwords are hashed with [Argon2](#), a resilient and secure password hashing algorithm.
|
||||
Passwords are hashed with [Argon2](https://github.com/P-H-C/phc-winner-argon2), a resilient and secure password hashing algorithm.
|
||||
|
||||
## Verification {% #verification %}
|
||||
|
||||
@@ -106,7 +106,7 @@ promise.then(function (response) {
|
||||
|
||||
If a user forgets their password, they can initiate a password recovery flow to recover their password. The Create Password Recovery endpoint sends the user an email with a temporary secret key for password reset. When the user clicks the confirmation link, they are redirected back to the password reset URL with the secret key and email address values attached to the URL as query strings.
|
||||
|
||||
Only redirect URLs to domains added as a platform on your Appwrite console will be accepted. URLs not added as a platform are rejected to protect against redirect attacks.
|
||||
Only redirect URLs to domains added as a platform on your Appwrite Console will be accepted. URLs not added as a platform are rejected to protect against redirect attacks.
|
||||
|
||||
```js
|
||||
import { Client, Account } from "appwrite";
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
---
|
||||
layout: article
|
||||
title: Server Integrations
|
||||
title: JWT login
|
||||
description: This is the description used for SEO.
|
||||
---
|
||||
|
||||
You can extend Appwrite's APIs by building backend apps using [Server SDKs](#). To secure your backend app's APIs, client apps must prove their identity against your backend app before accessing sensitive information. You can secure these APIs and enforce access permissions in your backend app by using JWT authentication.
|
||||
You can extend Appwrite's APIs by building backend apps using [Server SDKs](/docs/sdks#server). To secure your backend app's APIs, client apps must prove their identity against your backend app before accessing sensitive information. You can secure these APIs and enforce access permissions in your backend app by using JWT authentication.
|
||||
|
||||
If you are already authenticated on your client-side app and need your backend app to **act on behalf of the user**, this guide will walk you through the process.
|
||||
|
||||
@@ -20,7 +20,7 @@ When you build backend APIs to extend Appwrite's functionality, these APIs shoul
|
||||
|
||||
You need to create a session using the Client SDKs **before** generating a JWT. The JWT will be a stateless proof of claim for the identity of the authenticated user and expire after 15 minutes or when the session is deleted.
|
||||
|
||||
You can generate a JWT like this:
|
||||
You can generate a JWT like this on a [Client SDK](/docs/sdks#client).
|
||||
|
||||
{% multicode %}
|
||||
```js
|
||||
@@ -79,6 +79,7 @@ mutation {
|
||||
|
||||
Your server application can use the JWT to act on behalf of the user by creating a `Client` instance with the JWT for **each request it receives**. To keep your API secure, **discard the client object** after each request.
|
||||
|
||||
Use JWTs tokens like this in a [Server SDK](/docs/sdks#server).
|
||||
{% multicode %}
|
||||
```js
|
||||
const { Client } = require('node-appwrite');
|
||||
@@ -364,7 +365,7 @@ Only Kevin's birthday is returned and documents where `user-A` has no permission
|
||||
}
|
||||
```
|
||||
|
||||
If the same request is made where the Server SDK's `client` is authenticated with an API key instead of a JWT, the results returned will be different.
|
||||
If the same request is made where the [Server SDK](/docs/sdks#server)'s `client` is authenticated with an API key instead of a JWT, the results returned will be different.
|
||||
|
||||
{% multicode %}
|
||||
```js
|
||||
@@ -183,4 +183,4 @@ This would correspond with the permissions below.
|
||||
| Delete | `Permissions.delete(Role.label('subscriber'))` |
|
||||
| Create | `Permissions.create(Role.label('subscriber'))` |
|
||||
|
||||
[Learn more about permissions](/docs/advanced/platform/permissions)
|
||||
[Learn more about permissions {% icon icon="cheveron-right" /%}](/docs/advanced/platform/permissions)
|
||||
@@ -6,9 +6,9 @@ description: This is the description used for SEO.
|
||||
|
||||
Magic URL is a password-less way to authenticate users. When a user logs in by providing their email, they will receive an email with a "magic" link that contains a secret used to log in the user. The user can simply click the link to be logged in.
|
||||
|
||||
## Send Email {% #init %}
|
||||
## Send email {% #init %}
|
||||
|
||||
Initialize the log in process with the [Create Magic URL Session](#) route. If the email has never been used, a **new account is generated**, then the user will receive an email. If the email is already attached to an account, the **user ID is ignored** and the user will receive a link in their email.
|
||||
Initialize the log in process with the [Create Magic URL Session](/docs/references/cloud/client-web/account#createMagicURLSession) route. If the email has never been used, a **new account is generated**, then the user will receive an email. If the email is already attached to an account, the **user ID is ignored** and the user will receive a link in their email.
|
||||
|
||||
{% multicode %}
|
||||
```js
|
||||
|
||||
@@ -22,7 +22,7 @@ Before using OAuth 2 login, you need to enable and configure an OAuth 2 login pr
|
||||
|
||||
## Initialize OAuth 2 login {% #init %}
|
||||
|
||||
To initialize the OAuth 2 login process, use the [Create OAuth 2 Session](#) route.
|
||||
To initialize the OAuth 2 login process, use the [Create OAuth 2 Session](/docs/references/cloud/client-web/account#createOAuth2Session) route.
|
||||
|
||||
{% tabs %}
|
||||
{% tabsitem #js title="Javascript" %}
|
||||
@@ -234,7 +234,7 @@ You can use the `providerAccessToken` to make requests to your OAuth 2 provider.
|
||||
|
||||
## OAuth 2 profile {% #profile %}
|
||||
|
||||
OAuth 2 sessions expire to protect from security risks. OAuth 2 sessions should be refreshed periodically, so access tokens don't expire. Check value of `providerAccessTokenExpiry` to know if the token is expired or is about to expire. Refreshing before every request might cause rate limit problems. You can do this by calling the [Update OAuth Session](#) endpoint when ever your user visits your app.
|
||||
OAuth 2 sessions expire to protect from security risks. OAuth 2 sessions should be refreshed periodically, so access tokens don't expire. Check value of `providerAccessTokenExpiry` to know if the token is expired or is about to expire. Refreshing before every request might cause rate limit problems. You can do this by calling the [Update OAuth Session](/docs/references/cloud/client-web/account#updateSession) endpoint when ever your user visits your app.
|
||||
|
||||
{% multicode %}
|
||||
```js
|
||||
@@ -293,4 +293,6 @@ let session = try await account.updateSession(
|
||||
|
||||
{% /multicode %}
|
||||
|
||||
> **Note**: OAuth 2 is not available through the GraphQL API. You can use the REST API or any Client SDK instead.
|
||||
{% info title="GraphQL" %}
|
||||
OAuth 2 is not available through the GraphQL API. You can use the REST API or any Client SDK instead.
|
||||
{% /info %}
|
||||
@@ -1,12 +1,12 @@
|
||||
---
|
||||
layout: article
|
||||
title: Phone and SMS login
|
||||
title: Phone (SMS) login
|
||||
description: This is the description used for SEO.
|
||||
---
|
||||
|
||||
Phone authentication lets users create accounts using their phone numbers and log in through SMS messages.
|
||||
|
||||
## [Send SMS Message](#init) {% #init %}
|
||||
## Send SMS message {% #init %}
|
||||
|
||||
Phone authentication is done using a two-step authentication process. When using phone authentication, the authentication request is initiated from the client application and an SMS message is sent to the user's phone. The SMS message will contain a secret the user can use to log in.
|
||||
|
||||
@@ -97,7 +97,7 @@ mutation {
|
||||
|
||||
{% /multicode %}
|
||||
|
||||
## [Log In](#login) {% #login %}
|
||||
## Login {% #login %}
|
||||
|
||||
After initiating the phone authentication process, the returned user ID and secret are used to confirm the user. The secret will usually be a 6-digit number in the SMS message sent to the user.
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ Adding signup and login is as simple as this.
|
||||
|
||||
## Sign up {% #sign-up %}
|
||||
|
||||
You can use the Appwrite Client SDKs to create an account using email and password.
|
||||
You can use the Appwrite [Client SDKs](/docs/sdks#client) to create an account using email and password.
|
||||
|
||||
{% multicode %}
|
||||
```js
|
||||
@@ -91,7 +91,7 @@ mutation {
|
||||
|
||||
## Login {% #login %}
|
||||
|
||||
After you've created your account, users can be logged in using the Create Email Session route.
|
||||
After you've created your account, users can be logged in using the [Create Email Session](/docs/references/cloud/client-web/account#createEmailSession) route.
|
||||
|
||||
{% multicode %}
|
||||
```js
|
||||
|
||||
@@ -10,15 +10,16 @@ Appwrite provides many security features to keep both your Appwrite project and
|
||||
|
||||
Appwrite handles the persistence of the session in a consistent way across SDKs. After authenticating with an SDK, the SDK will persist the session so that the user will not need to log in again the next time they open the app. The mechanism for persistence depends on the SDK.
|
||||
|
||||
> **Best Practice**
|
||||
> Only keep user sessions active as long as needed and maintain exactly **one** instance of the Client SDK in your app to avoid conflicting session data.
|
||||
{% info title="Best Practice" %}
|
||||
Only keep user sessions active as long as needed and maintain exactly **one** instance of the Client SDK in your app to avoid conflicting session data.
|
||||
{% /info %}
|
||||
|
||||
| | Framework | Storage method |
|
||||
| {% width=70 %} | Framework {% width=120 %} | Storage method |
|
||||
|:----------------------------------------------------------------------------------------------------:|:---:|:----------------------------------------------------------------------------------------------------------------------:|
|
||||
| [TODO] | Web | Uses a secure session cookie and falls back to local storage when a session cookie is not available. |
|
||||
| [TODO] | Flutter | Uses a session cookie stored in Application Documents through the **path_provider** package. |
|
||||
| [TODO] | Apple | Uses a session cookie stored in **UserDefaults**. |
|
||||
| [TODO] | Android | Uses a session cookie stored in **SharedPreferences**. |
|
||||
| {% only_dark %}{% icon_image src="/images/platforms/dark/javascript.svg" alt="Javascript logo" size="m" /%}{% /only_dark %}{% only_light %}{% icon_image src="/images/platforms/javascript.svg" alt="Javascript logo" size="m" /%}{% /only_light %} | Web | Uses a secure session cookie and falls back to local storage when a session cookie is not available. |
|
||||
| {% only_dark %}{% icon_image src="/images/platforms/dark/flutter.svg" alt="Javascript logo" size="m" /%}{% /only_dark %}{% only_light %}{% icon_image src="/images/platforms/flutter.svg" alt="Javascript logo" size="m" /%}{% /only_light %} | Flutter | Uses a session cookie stored in Application Documents through the **path_provider** package. |
|
||||
| {% only_dark %}{% icon_image src="/images/platforms/dark/apple.svg" alt="Javascript logo" size="m" /%}{% /only_dark %}{% only_light %}{% icon_image src="/images/platforms/apple.svg" alt="Javascript logo" size="m" /%}{% /only_light %} | Apple | Uses a session cookie stored in **UserDefaults**. |
|
||||
| {% only_dark %}{% icon_image src="/images/platforms/dark/android.svg" alt="Javascript logo" size="m" /%}{% /only_dark %}{% only_light %}{% icon_image src="/images/platforms/android.svg" alt="Javascript logo" size="m" /%}{% /only_light %} | Android | Uses a session cookie stored in **SharedPreferences**. |
|
||||
|
||||
## Session limits
|
||||
In Appwrite versions 1.2 and above, you can limit the number of active sessions created per user to prevent the accumulation of unused but active sessions. New sessions created by the same user past the session limit delete the oldest session.
|
||||
|
||||
@@ -5,10 +5,10 @@ description: This is the description used for SEO.
|
||||
---
|
||||
|
||||
Teams are a good way to allow users to share access to resources.
|
||||
For example, in a todo app, a user can [create a team](#) for one of their todo lists and [invite another user](#) to the team to grant the other user access.
|
||||
For example, in a todo app, a user can [create a team](/docs/references/cloud/client-web/teams#create) for one of their todo lists and [invite another user](/docs/references/cloud/client-web/teams#createMembership) to the team to grant the other user access.
|
||||
You can further give special rights to parts of a team using team roles.
|
||||
|
||||
The invited user can [accept the invitation](#) to gain access. If the user's ever removed from the team, they'll lose access again.
|
||||
The invited user can [accept the invitation](/docs/references/cloud/client-web/teams#updateMembershipStatus) to gain access. If the user's ever removed from the team, they'll lose access again.
|
||||
|
||||
## Create team {% #create %}
|
||||
For example, we can create a team called `teachers` with roles `maths`, `sciences`, `arts`, and `literature`.
|
||||
@@ -196,3 +196,6 @@ individual roles in the team using the `Role.team(<TEAM_ID>, [<ROLE_1>, <ROLE_2>
|
||||
| ------------------------------------------- | ------------------------------------------- |
|
||||
| All members | `Role.team(<TEAM_ID>)`|
|
||||
| Select roles | `Role.team(<TEAM_ID>, [<ROLE_1>, <ROLE_2>, ...])`|
|
||||
|
||||
|
||||
[Learn more about permissions {% icon icon="cheveron-right" /%}](/docs/advanced/platform/permissions)
|
||||
15
src/routes/docs/products/auth/users/+page.markdoc
Normal file
@@ -0,0 +1,15 @@
|
||||
---
|
||||
layout: article
|
||||
title: Manage users
|
||||
description: This is the description used for SEO.
|
||||
---
|
||||
|
||||
Appwrite Users API is used for managing users in server applications.
|
||||
Users API can only be used with an API key with the [Server SDK](/docs/sdks#server), to manage all users.
|
||||
If you need to act on behalf of users through an Appwrite Function or your own backend, use [JWT login](/docs/products/auth/jwt).
|
||||
|
||||
{% partial file="account-vs-user.md" /%}
|
||||
|
||||
The users API can be used to create users, import users, update user info, get user audit logs, and remove users.
|
||||
|
||||
[Learn more in the Users API references {% icon icon="cheveron-right" /%}](/docs/references/cloud/server-nodejs/users)
|
||||
@@ -62,7 +62,16 @@
|
||||
href: '/docs/products/databases/pagination'
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
label: 'References',
|
||||
items: [
|
||||
{
|
||||
label: 'Databases API',
|
||||
href: '/docs/references/cloud/client-web/databases'
|
||||
},
|
||||
]
|
||||
},
|
||||
];
|
||||
</script>
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
layout: article
|
||||
title: Databases
|
||||
title: Overview
|
||||
description: This is the description used for SEO.
|
||||
---
|
||||
|
||||
@@ -14,4 +14,4 @@ Databases store data, if you need to store files like images, PDFs or videos, us
|
||||
You can organize data into databases, collections, and documents. You can also paginate, order, and query documents.
|
||||
For complex business logic, Appwrite supports relationships to help you model your data.
|
||||
|
||||
[Quick start {% icon icon="cheveron-right" /%}](#)
|
||||
[Quick start {% icon icon="cheveron-right" /%}](/docs/products/databases/quick-start)
|
||||
@@ -11,15 +11,15 @@ The terms collections and documents are used because the Appwrite JSON REST API
|
||||
That said, Appwrite is designed to support both SQL and NoSQL database adapters like MariaDB, MySQL, or MongoDB in future versions.
|
||||
|
||||
## Create collection
|
||||
You can create collections using the Appwrite Console or a [Server SDK](#).
|
||||
You can create collections using the Appwrite Console or a [Server SDK](/docs/sdks#server).
|
||||
{% tabs %}
|
||||
{% tabsitem #console title="Console" %}
|
||||
You can create a collection by heading to the **Databases** page, navigate to a [database](#), and click **Create collection**.
|
||||
You can create a collection by heading to the **Databases** page, navigate to a [database](/docs/products/databases/databases), and click **Create collection**.
|
||||
|
||||
{% /tabsitem %}
|
||||
|
||||
{% tabsitem #server-sdk title="Server SDK" %}
|
||||
You can also create collections programmatically using a [Server SDK](#). Appwrite [Server SDKs](#) require an [API key](#).
|
||||
You can also create collections programmatically using a [Server SDK](/docs/sdks#server). Appwrite [Server SDKs](/docs/sdks#server) require an [API key](/docs/advanced/platform/api-keys).
|
||||
|
||||
{% multicode %}
|
||||
|
||||
@@ -223,7 +223,7 @@ let collection = try await databases.createCollection(
|
||||
```
|
||||
{% /multicode %}
|
||||
|
||||
You can also configure **permissions** in the `createCollection` method, learn more about the `createCollection` in the [API references](#).
|
||||
You can also configure **permissions** in the `createCollection` method, learn more about the `createCollection` in the [API references](/docs/references).
|
||||
{% /tabsitem %}
|
||||
{% /tabs %}
|
||||
|
||||
@@ -254,7 +254,7 @@ You can choose between the following types.
|
||||
| `ip` | IP address attribute for IPv4 and IPv6. |
|
||||
| `email` | Email address attribute. |
|
||||
| `url` | URL attribute. |
|
||||
| `relationship` | Relationship attribute relates one collection to another. [Learn more about relationships.](#) |
|
||||
| `relationship` | Relationship attribute relates one collection to another. [Learn more about relationships.](/docs/products/databases) |
|
||||
|
||||
If an attribute must be populated in all documents, set it as `required`.
|
||||
If not, you may optionally set a default value.
|
||||
@@ -272,6 +272,6 @@ The following indexes are currently supported:
|
||||
|------------|--------------------------------------------------------------------------------------------------------------|
|
||||
| `key` | Plain Index to allow queries. |
|
||||
| `unique` | Unique Index to disallow duplicates. |
|
||||
| `fulltext` | For searching within string attributes. Required for the [search query method](#). |
|
||||
| `fulltext` | For searching within string attributes. Required for the [search query method](/docs/products/databases/queries#query-class). |
|
||||
|
||||
You can create an index by navigating to your collection's **Indexes** tab or by using your favorite [Server SDK](#).
|
||||
You can create an index by navigating to your collection's **Indexes** tab or by using your favorite [Server SDK](/docs/sdks#server).
|
||||
|
||||
@@ -16,7 +16,7 @@ You can create a database by navigating to the **Databases** page and clicking *
|
||||
|
||||
|
||||
## Create a database using Server SDKs
|
||||
You can programmatically create databases using a [Server SDK](#). Appwrite [Server SDKs](#) require an [API key](#).
|
||||
You can programmatically create databases using a [Server SDK](/docs/sdks#server). Appwrite [Server SDKs](/docs/sdks#server) require an [API key](/docs/advanced/platform/api-keys).
|
||||
|
||||
{% multicode %}
|
||||
```js
|
||||
|
||||
@@ -135,7 +135,7 @@ You must grant **read** permissions to users at the **collection level** before
|
||||
[Learn more about permissions](#permissions)
|
||||
{% /info %}
|
||||
|
||||
Documents can be retrieved using the [List Document](#) endpoint.
|
||||
Documents can be retrieved using the [List Document](/docs/references/cloud/client-web/databases#listDocuments) endpoint.
|
||||
|
||||
Results can be filtered, sorted, and paginated using Appwrite's shared set of query methods.
|
||||
You can find a full guide on querying in the [Queries Guide](/docs/products/databases/queries).
|
||||
|
||||
@@ -7,11 +7,11 @@ readtime: 5
|
||||
---
|
||||
|
||||
You can order results returned by Appwrite Databases by using an order query.
|
||||
For best performance, create an [index](#) on the column you plan to order by.
|
||||
For best performance, create an [index](/docs/products/databases/collections#indexes) on the column you plan to order by.
|
||||
|
||||
## Ordering one column {% #one-column %}
|
||||
|
||||
When querying using the [listDocuments](#) endpoint,
|
||||
When querying using the [listDocuments](/docs/references/cloud/client-web/databases#listDocuments) endpoint,
|
||||
you can specify the order of the documents returned using the `Query.orderAsc()` and `Query.orderDesc()` query methods.
|
||||
|
||||
{% multicode %}
|
||||
|
||||
@@ -19,7 +19,7 @@ If a user has read, create, update, or delete permissions at the collection leve
|
||||
|
||||
Configure collection level permissions by navigating to **Your collection** > **Settings** > **Permissions**.
|
||||
|
||||
[Learn more about permissions and roles](#)
|
||||
[Learn more about permissions and roles](/docs/advanced/platform/permissions)
|
||||
|
||||
## Document level {% #document-level %}
|
||||
Document level permissions grant access to individual documents.
|
||||
@@ -28,8 +28,8 @@ If a user has read, create, update, or delete permissions at the document level,
|
||||
Document level permissions are only applied if Document Security is enabled in the settings of your collection.
|
||||
Enable document level permissions by navigating to **Your collection** > **Settings** > **Document security**.
|
||||
|
||||
Document level permissions are configured in individual [documents](#).
|
||||
Document level permissions are configured in individual documents.
|
||||
|
||||
[Learn more about permissions and roles](#)
|
||||
[Learn more about permissions and roles](/docs/advanced/platform/permissions)
|
||||
|
||||
|
||||
|
||||
@@ -26,13 +26,13 @@ Appwrite SDKs provide a `Query` class to help you build queries. The `Query` cla
|
||||
| `Query.isNotNull("name")` | Returns documents where attribute value is **not** null. |
|
||||
| `Query.startsWith("name", "Once upon a time")` | Returns documents if a string attributes starts with a substring. |
|
||||
| `Query.endsWith("name", "happily ever after.")` | Returns documents if a string attributes ends with a substring. |
|
||||
| `Query.search("text", "key words")` | Searches string attributes for provided keywords. Requires a [Full-text index](#) on queried attributes. |
|
||||
| `Query.search("text", "key words")` | Searches string attributes for provided keywords. Requires a [full-text index](/docs/products/databases/collections#indexes) on queried attributes. |
|
||||
| `Query.orderDesc("attribute")` | Orders results in descending order by attribute. Attribute must be indexed. Pass in an empty string to return in natural order. |
|
||||
| `Query.orderAsc("attribute")` | Orders results in ascending order by attribute. Attribute must be indexed. Pass in an empty string to return in natural order. |
|
||||
| `Query.limit(25)` | Limits the number of results returned by the query. Used for [pagination](#). If the limit query is not used, the limit defaults to 25 results. |
|
||||
| `Query.offset(0)` | Offset the results returned by skipping some of the results. Used for [pagination](#). |
|
||||
| `Query.cursorAfter("62a7...f620")` | Places the cursor after the specified resource ID. Used for [pagination](#). |
|
||||
| `Query.cursorBefore("62a7...a600")` | Places the cursor before the specified resource ID. Used for [pagination](#). |
|
||||
| `Query.limit(25)` | Limits the number of results returned by the query. Used for [pagination](/docs/products/databases/pagination). If the limit query is not used, the limit defaults to 25 results. |
|
||||
| `Query.offset(0)` | Offset the results returned by skipping some of the results. Used for [pagination](/docs/products/databases/pagination). |
|
||||
| `Query.cursorAfter("62a7...f620")` | Places the cursor after the specified resource ID. Used for [pagination](/docs/products/databases/pagination). |
|
||||
| `Query.cursorBefore("62a7...a600")` | Places the cursor before the specified resource ID. Used for [pagination](/docs/products/databases/pagination). |
|
||||
|
||||
|
||||
## Building Queries {% #building-queries %}
|
||||
|
||||
@@ -63,7 +63,7 @@ Appwrite also allows you to define the behavior of a relationship when a documen
|
||||
| Set null | If a document has related documents, when it is deleted, the related documents are kept with their relationship attribute set to null.|
|
||||
|
||||
## Creating relationships {% #create-relationships %}
|
||||
You can define relationships in the Appwrite Console, or using a [Server SDK](#)
|
||||
You can define relationships in the Appwrite Console, or using a [Server SDK](/docs/sdks#server)
|
||||
|
||||
{% tabs %}
|
||||
{% tabsitem #console title="Console" %}
|
||||
@@ -616,7 +616,6 @@ databases.updateDocument(
|
||||
{% /multicode %}
|
||||
|
||||
## Delete relationships {% #delete %}
|
||||
[TODO WHY ARE H2 and H3 same sizee]
|
||||
### Unlink relationships, retain documents {% #unlink %}
|
||||
|
||||
If you need to unlink documents in a relationship but retain the documents, you can do this by **updating the relationship attribute** and removing the ID of the related document.
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
label: 'Guides',
|
||||
label: 'Journeys',
|
||||
items: [
|
||||
{
|
||||
label: 'Development',
|
||||
@@ -45,7 +45,16 @@
|
||||
href: '/docs/products/functions/examples'
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
label: 'References',
|
||||
items: [
|
||||
{
|
||||
label: 'Functions API',
|
||||
href: '/docs/references/cloud/client-web/functions'
|
||||
},
|
||||
]
|
||||
},
|
||||
];
|
||||
</script>
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
layout: article
|
||||
title: Functions
|
||||
title: Overview
|
||||
description: [TODO]
|
||||
difficulty: beginner
|
||||
readtime: 3
|
||||
|
||||
@@ -40,8 +40,9 @@ Before deploying your function with Git, create a new function attached to your
|
||||
|
||||
## CLI {% #cli %}
|
||||
|
||||
> ### CLI Setup {% #cli-setup %}
|
||||
> Before you can deploy with the Appwrite CLI, make sure you've [installed and initialized](#) the CLI.
|
||||
{% info title="CLI setup" %}
|
||||
Before you can deploy with the Appwrite CLI, make sure you've [installed and initialized](/docs/tooling/command-line/installation) the CLI.
|
||||
{% /info %}
|
||||
|
||||
To deploy with the Appwrite CLI, your function must be added to `appwrite.json`. Use the `appwrite init function` method to create a starter function, then paste in your function code.
|
||||
|
||||
|
||||
@@ -419,10 +419,10 @@ You'll find these properties in the context object.
|
||||
|
||||
| Property | Description |
|
||||
|----------|--------------------------------------------------------------------------------------------------------------------------|
|
||||
| req | Contains request information like method, body, and headers. See full examples [here](#). |
|
||||
| res | Contains methods to build a response and return information. See full examples [here](#). |
|
||||
| log() | Method to log information to the Appwrite Console, end users will not be able to see these logs. See full examples [here](#). |
|
||||
| error() | Methoc to log errors to the Appwrite Console, end users will not be able to see these errors. See full examples [here](#). |
|
||||
| req | Contains request information like method, body, and headers. See full examples [in the request section](#request). |
|
||||
| res | Contains methods to build a response and return information. See full examples [in the response section](#response). |
|
||||
| log() | Method to log information to the Appwrite Console, end users will not be able to see these logs. See full examples [in the logging section](#logging). |
|
||||
| error() | Methoc to log errors to the Appwrite Console, end users will not be able to see these errors. See full examples [in the logging section](#logging). |
|
||||
|
||||
#### Destructuring assignment {% #destructuring %}
|
||||
Some languages, namely JavaScript, support destructuring.
|
||||
@@ -683,7 +683,7 @@ These are provided alongside any custom headers sent to the function.
|
||||
| `x-appwrite-trigger` | Describes how the function execution was invoked. Possible values are `http`, `schedule` or `event`. |
|
||||
| `x-appwrite-event` | If the function execution was triggered by an event, describes the triggering event. |
|
||||
| `x-appwrite-user-id` | If the function execution was invoked by an authenticated user, display the user ID. This doesn't apply to Appwrite Console users or API keys. |
|
||||
| `x-appwrite-user-jwt` | JWT token generated from the invoking user's session. Used to authenticate Server SDKs to respect access permissions. [Learn more about JWT tokens](#). |
|
||||
| `x-appwrite-user-jwt` | JWT token generated from the invoking user's session. Used to authenticate Server SDKs to respect access permissions. [Learn more about JWT tokens](/docs/products/auth/jwt). |
|
||||
| `x-appwrite-country-code` | Displays the country code of the configured locale. |
|
||||
| `x-appwrite-continent-code` | Displays the continent code of the configured locale. |
|
||||
| `x-appwrite-continent-eu` | Describes if the configured local is within the EU. |
|
||||
@@ -928,7 +928,7 @@ namespace runtime {
|
||||
```
|
||||
{% /multicode %}
|
||||
|
||||
To get the different response types, set one of the following query parameters in the [generated domain](#) of your function.
|
||||
To get the different response types, set one of the following query parameters in the [generated domain](/docs/products/functions/deployment#domains) of your function.
|
||||
|
||||
| Type | Query Param | Example |
|
||||
|----------|-----------------|-------------------------------------------------------------|
|
||||
@@ -1088,12 +1088,13 @@ You can access these logs through the following steps.
|
||||
3. Under the Executions tab, click on an execution.
|
||||
4. In the Response section, you'll be able to view logs under the Logs and Errors tabs.
|
||||
|
||||
## Accessing Environment Variables {% #environment-variables %}
|
||||
## Accessing environment variables {% #environment-variables %}
|
||||
If you need to pass constants or secrets to Appwrite Functions, you can use environment variables.
|
||||
Environmental variables can be global, or function-specific.
|
||||
|
||||
> ### Appwrite API keys
|
||||
> If your function is using an Appwrite SDK with an API key, this API key needs to be generated and passed in manually. API keys are not passed by default for security reasons.
|
||||
{% info title="Appwrite API keys" %}
|
||||
If your function is using an Appwrite SDK with an API key, this API key needs to be generated and passed in manually. API keys are not passed by default for security reasons.
|
||||
{% /info %}
|
||||
|
||||
| Variable | Description |
|
||||
|-----------------------------------|------------------------------------------------|
|
||||
@@ -1218,28 +1219,89 @@ namespace runtime {
|
||||
## Dependencies {% #dependencies %}
|
||||
Your function's dependencies should be managed by the package manager of each language.
|
||||
By default, we include the following package managers in each runtime.
|
||||
| Language | Package Manager | Commands | |
|
||||
|----------|-----------------|-----------------------|------------------------------------|
|
||||
| [TODO] | Node.js | npm | npm install |
|
||||
| [TODO] | PHP | Composer | composer install |
|
||||
| [TODO] | Python | pip | pip install -r requirements.txt |
|
||||
| [TODO] | Ruby | Bundler | bundle install |
|
||||
| [TODO] | Deno | deno | deno cache <ENTRYPOINT_FILE> |
|
||||
| [TODO] | Dart | pub | pub get |
|
||||
| [TODO] | Swift | Swift Package Manager | swift package resolve |
|
||||
| [TODO] | .NET | NuGet | dotnet restore |
|
||||
| [TODO] | Kotlin | Gradle | N/A |
|
||||
| [TODO] | Java | Gradle | N/A |
|
||||
| [TODO] | C++ | None | N/A |
|
||||
|
||||
{% table %}
|
||||
* {% width=80 %}
|
||||
* Language
|
||||
* Package Manager
|
||||
* Commands
|
||||
---
|
||||
* {% only_dark %}{% icon_image src="/images/platforms/dark/nodejs.svg" alt="Node.js logo" size="m" /%}{% /only_dark %}
|
||||
{% only_light %}{% icon_image src="/images/platforms/nodejs.svg" alt="Node.js logo" size="m" /%}{% /only_light %}
|
||||
* Node.js
|
||||
* NPM
|
||||
* `npm install`
|
||||
---
|
||||
* {% only_dark %}{% icon_image src="/images/platforms/dark/php.svg" alt="PHP logo" size="m" /%}{% /only_dark %}
|
||||
{% only_light %}{% icon_image src="/images/platforms/php.svg" alt="PHP logo" size="m" /%}{% /only_light %}
|
||||
* PHP
|
||||
* Composer
|
||||
* `composer install`
|
||||
---
|
||||
* {% only_dark %}{% icon_image src="/images/platforms/dark/python.svg" alt="Python logo" size="m" /%}{% /only_dark %}
|
||||
{% only_light %}{% icon_image src="/images/platforms/python.svg" alt="Python logo" size="m" /%}{% /only_light %}
|
||||
* Python
|
||||
* pip
|
||||
* `pip install -r requirements.txt`
|
||||
---
|
||||
* {% only_dark %}{% icon_image src="/images/platforms/dark/ruby.svg" alt="Ruby logo" size="m" /%}{% /only_dark %}
|
||||
{% only_light %}{% icon_image src="/images/platforms/ruby.svg" alt="Ruby logo" size="m" /%}{% /only_light %}
|
||||
* Ruby
|
||||
* Bundler
|
||||
* bundle install
|
||||
---
|
||||
* {% only_dark %}{% icon_image src="/images/platforms/dark/deno.svg" alt="Deno logo" size="m" /%}{% /only_dark %}
|
||||
{% only_light %}{% icon_image src="/images/platforms/deno.svg" alt="Deno logo" size="m" /%}{% /only_light %}
|
||||
* Deno
|
||||
* deno
|
||||
* `deno cache <ENTRYPOINT_FILE>`
|
||||
---
|
||||
* {% only_dark %}{% icon_image src="/images/platforms/dark/dart.svg" alt="Dart logo" size="m" /%}{% /only_dark %}
|
||||
{% only_light %}{% icon_image src="/images/platforms/dart.svg" alt="Dart logo" size="m" /%}{% /only_light %}
|
||||
* Dart
|
||||
* pub
|
||||
* `pub get`
|
||||
---
|
||||
* {% only_dark %}{% icon_image src="/images/platforms/dark/swift.svg" alt="Swift logo" size="m" /%}{% /only_dark %}
|
||||
{% only_light %}{% icon_image src="/images/platforms/swift.svg" alt="Swift logo" size="m" /%}{% /only_light %}
|
||||
* Swift
|
||||
* Swift Package Manager
|
||||
* `swift package resolve`
|
||||
---
|
||||
* {% only_dark %}{% icon_image src="/images/platforms/dark/dotnet.svg" alt=".NET logo" size="m" /%}{% /only_dark %}
|
||||
{% only_light %}{% icon_image src="/images/platforms/dotnet.svg" alt=".NET logo" size="m" /%}{% /only_light %}
|
||||
* .NET
|
||||
* NuGet
|
||||
* `dotnet restore`
|
||||
---
|
||||
* {% only_dark %}{% icon_image src="/images/platforms/dark/kotlin.svg" alt="Kotlin logo" size="m" /%}{% /only_dark %}
|
||||
{% only_light %}{% icon_image src="/images/platforms/kotlin.svg" alt="Kotlin logo" size="m" /%}{% /only_light %}
|
||||
* Kotlin
|
||||
* Gradle
|
||||
* N/A
|
||||
---
|
||||
* {% only_dark %}{% icon_image src="/images/platforms/dark/java.svg" alt="Java logo" size="m" /%}{% /only_dark %}
|
||||
{% only_light %}{% icon_image src="/images/platforms/java.svg" alt="Java logo" size="m" /%}{% /only_light %}
|
||||
* Java
|
||||
* Gradle
|
||||
* N/A
|
||||
---
|
||||
* {% only_dark %}{% icon_image src="/images/platforms/dark/c.svg" alt="C++ logo" size="m" /%}{% /only_dark %}
|
||||
{% only_light %}{% icon_image src="/images/platforms/c.svg" alt="C++ logo" size="m" /%}{% /only_light %}
|
||||
* C++
|
||||
* None
|
||||
* N/A
|
||||
{% /table %}
|
||||
|
||||
|
||||
To install your dependencies before your function is built, you should add the relevant install command to the top your function's **Build setting** > **Commands**.
|
||||
|
||||
## Using Appwrite in a function {% #using-appwrite %}
|
||||
Appwrite can be used in your functions by adding the relevant SDK to your function's dependencies.
|
||||
Authenticating with Appwrite is done via an API key or a JWT token.
|
||||
API keys must be generated and exported as an [environment variable](#).
|
||||
API keys must be generated and exported as an [environment variable](/docs/advanced/self-hosting/environment-variables).
|
||||
|
||||
You can read more about authentication in the [Server authentication](#) section of the docs.
|
||||
You can read more about authentication in the [JWT login](/docs/products/auth/jwt) section of the docs.
|
||||
|
||||
### Using with API key {% #using-api-key %}
|
||||
API keys have defined scopes when you create them.
|
||||
@@ -2124,10 +2186,10 @@ You will have to migrate your old functions to follow new runtime syntax.
|
||||
|
||||
Here's a checklist of things you need to know.
|
||||
|
||||
1. The parameter passed into functions has changed. `req` and `res` has been replaced by `context`, which contains new logger methods. [Learn about context](#).
|
||||
2. To improve privacy and logging reliability, we provide new `context.log()` and `context.error()` functions. You can no longer use native logging methods. [Learn about logging](#).
|
||||
3. The old way of `req.variables` has been deprecated. You can now access variables passed into each function as environment variables. [Learn about environment variables](#).
|
||||
4. The `req` object has been updated to use terminology consistent with typical HTTP concepts. You'll now find familiar concepts like headers, body, HTTP methods, and others. [Learn about request](#).
|
||||
5. The response object has been updated. You can now specify headers, as well as use new methods like return redirects or empty responses. [Learn about response](#).
|
||||
6. Now, you must return a response such as return `context.res.send("")`. This prevents confusing errors when functions are terminated prematurely before a response is sent. [Learn about response](#).
|
||||
1. The parameter passed into functions has changed. `req` and `res` has been replaced by `context`, which contains new logger methods. [Learn about context](/docs/products/functions/development#context-object).
|
||||
2. To improve privacy and logging reliability, we provide new `context.log()` and `context.error()` functions. You can no longer use native logging methods. [Learn about logging](/docs/products/functions/development#logging).
|
||||
3. The old way of `req.variables` has been deprecated. You can now access variables passed into each function as environment variables. [Learn about environment variables](/docs/products/functions/development#environment-variables).
|
||||
4. The `req` object has been updated to use terminology consistent with typical HTTP concepts. You'll now find familiar concepts like headers, body, HTTP methods, and others. [Learn about request](/docs/products/functions/development#request).
|
||||
5. The response object has been updated. You can now specify headers, as well as use new methods like return redirects or empty responses. [Learn about response](/docs/products/functions/development#response).
|
||||
6. Now, you must return a response such as return `context.res.send("")`. This prevents confusing errors when functions are terminated prematurely before a response is sent. [Learn about response](/docs/products/functions/development#response).
|
||||
7. Some variables about how a function was triggered are now found in the context.req object as headers.
|
||||
@@ -35,7 +35,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
label: 'Guides',
|
||||
label: 'Journeys',
|
||||
items: [
|
||||
{
|
||||
label: 'Upload and download',
|
||||
@@ -46,7 +46,16 @@
|
||||
href: '/docs/products/storage/images'
|
||||
},
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
label: 'References',
|
||||
items: [
|
||||
{
|
||||
label: 'Storage API',
|
||||
href: '/docs/references/cloud/client-web/storage'
|
||||
},
|
||||
]
|
||||
},
|
||||
];
|
||||
</script>
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
layout: article
|
||||
title: Storage
|
||||
title: Overview
|
||||
description: This is the description used for SEO.
|
||||
difficulty: beginner
|
||||
readtime: 5
|
||||
|
||||
@@ -10,7 +10,7 @@ Storage buckets are a group of files, similar to collections in Appwrite Databas
|
||||
Buckets let you limit file size and extensions, whether or not to encrypt the files, and more.
|
||||
|
||||
## Create Bucket
|
||||
You can create your bucket from the Appwrite Console or a [Server SDK](#).
|
||||
You can create your bucket from the Appwrite Console or a [Server SDK](/docs/sdks#server).
|
||||
|
||||
{% tabs %}
|
||||
{% tabsitem #console title="Console" %}
|
||||
@@ -19,7 +19,7 @@ You can create a bucket by heading to the **Storage** page and clicking **Create
|
||||
{% /tabsitem %}
|
||||
|
||||
{% tabsitem #server-sdk title="Server SDK" %}
|
||||
You can also create collections programmatically using a [Server SDK](#). Appwrite [Server SDKs](#) require an [API key](#).
|
||||
You can also create collections programmatically using a [Server SDK](/docs/sdks#server). Appwrite [Server SDKs](/docs/sdks#server) require an [API key](/docs/advanced/platform/api-keys).
|
||||
|
||||
{% multicode %}
|
||||
|
||||
@@ -219,7 +219,7 @@ let bucket = try await storage.createBucket(
|
||||
```
|
||||
{% /multicode %}
|
||||
|
||||
You can also configure permission, file size and extension restrictions, and more in the `createBucket` method, learn more about the `createBucket` in the [API references](#).
|
||||
You can also configure permission, file size and extension restrictions, and more in the `createBucket` method, learn more about the `createBucket` in the [API references](/docs/references/cloud/server-nodejs/storage#createBucket).
|
||||
{% /tabsitem %}
|
||||
{% /tabs %}
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ Appwrite provides utilities to manipulate images for previewing images in your a
|
||||
|
||||
## Image manipulation {% #image-manupulation %}
|
||||
|
||||
Appwrite Storage's [preview endpoint](#) let you manipulate resolution, add borders and the border-radius, add background-color, set the opacity for the image, and get the image in the appropriate output format.
|
||||
Appwrite Storage's [preview endpoint](/docs/references/cloud/client-web/storage#getFilePreview) let you manipulate resolution, add borders and the border-radius, add background-color, set the opacity for the image, and get the image in the appropriate output format.
|
||||
|
||||
You can manipulate images resolution to display appropriately on responsive websites. You can also adjust the image border, background color, and border-radius to match the theming of your application.
|
||||
The Appwrite Storage also allows you to change the format and compression of your images for network transfer optimization and to help you speed your application. You can do all that without caring about how the image was originally uploaded.
|
||||
@@ -37,7 +37,7 @@ Below you can find all the different parameters offered by the preview endpoint
|
||||
| output | Set the output image format. If not provided, will use the original image's format. Supported formats are: `jpg`, `jpeg`, `png`, `gif`, and `webp` |
|
||||
|
||||
## Examples {% #examples %}
|
||||
Here are some examples using [Client SDKs](#).
|
||||
Here are some examples using [Client SDKs](/docs/sdks#client).
|
||||
{% multicode %}
|
||||
```js
|
||||
import { Client, Storage } from "appwrite";
|
||||
|
||||
@@ -19,7 +19,7 @@ If a user has read, create, update, or delete permissions at the bucket level, t
|
||||
|
||||
Configure bucket level permissions by navigating to **Your bucket** > **Settings** > **Permissions**.
|
||||
|
||||
[Learn more about permissions and roles](#)
|
||||
[Learn more about permissions and roles](/docs/advanced/platform/permissions)
|
||||
|
||||
## File level {% #file-level %}
|
||||
File level permissions grant access to individual files.
|
||||
@@ -28,8 +28,8 @@ If a user has read, create, update, or delete permissions at the file level, the
|
||||
File level permissions are only applied if File Security is enabled in the settings of your bucket.
|
||||
Enable file level permissions by navigating to **Your bucket** > **Settings** > **File security**.
|
||||
|
||||
File level permissions are configured in individual [files](#).
|
||||
File level permissions are configured in individual [files](/docs/products/storage/permissions#file-level).
|
||||
|
||||
[Learn more about permissions and roles](#)
|
||||
[Learn more about permissions and roles](/docs/advanced/platform/permissions)
|
||||
|
||||
|
||||
|
||||
@@ -127,7 +127,7 @@ To do so, navigate to the **Documents** tab of your collection and click the **A
|
||||
## Large files {% #large-files %}
|
||||
When you are trying to upload any files above 5MB, you will need to upload them in chunks for better reliability and performance.
|
||||
If you're using an Appwrite SDK, this is handled automatically.
|
||||
If you're not using an SDK, you can [learn more about REST API file handling](#).
|
||||
If you're not using an SDK, you can [learn more about REST API file handling](/docs/apis/rest#files).
|
||||
|
||||
## InputFile {% #input-file %}
|
||||
Every language and platform handles file inputs differently. This section documents the expected input type of each SDK. Where applicable, Appwrite provides an `InputFile` class to accept multiple file sources, like paths, buffers, streams, or plain text.
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
title: 'Web App',
|
||||
quickStarts: [
|
||||
{
|
||||
title: 'Next.js',
|
||||
title: 'React.js',
|
||||
icon: 'icon-next_js',
|
||||
image: '/images/blog/placeholder.png',
|
||||
href: 'nextjs'
|
||||
@@ -35,24 +35,6 @@
|
||||
image: '/images/blog/placeholder.png',
|
||||
href: 'sveltekit'
|
||||
},
|
||||
{
|
||||
title: 'Nuxt',
|
||||
icon: 'icon-nuxt_js',
|
||||
image: '/images/blog/placeholder.png',
|
||||
href: 'nuxt'
|
||||
},
|
||||
{
|
||||
title: 'Angular',
|
||||
icon: 'icon-angular',
|
||||
image: '/images/blog/placeholder.png',
|
||||
href: 'angular'
|
||||
},
|
||||
{
|
||||
title: 'Astro',
|
||||
icon: 'icon-astro',
|
||||
image: '/images/blog/placeholder.png',
|
||||
href: 'astro'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -64,6 +46,12 @@
|
||||
image: '/images/blog/placeholder.png',
|
||||
href: 'flutter'
|
||||
},
|
||||
{
|
||||
title: 'Apple',
|
||||
icon: 'icon-apple',
|
||||
image: '/images/blog/placeholder.png',
|
||||
href: 'apple'
|
||||
},
|
||||
{
|
||||
title: 'Android',
|
||||
icon: 'icon-android',
|
||||
@@ -74,7 +62,32 @@
|
||||
},
|
||||
{
|
||||
title: 'Server',
|
||||
quickStarts: []
|
||||
quickStarts: [
|
||||
{
|
||||
title: 'Node.js',
|
||||
icon: 'icon-node',
|
||||
image: '/images/blog/placeholder.png',
|
||||
href: 'node'
|
||||
},
|
||||
// {
|
||||
// title: 'Python',
|
||||
// icon: 'icon-python',
|
||||
// image: '/images/blog/placeholder.png',
|
||||
// href: 'python'
|
||||
// },
|
||||
// {
|
||||
// title: '.NET',
|
||||
// icon: 'icon-dotnet',
|
||||
// image: '/images/blog/placeholder.png',
|
||||
// href: 'dotnet'
|
||||
// },
|
||||
// {
|
||||
// title: 'Dart',
|
||||
// icon: 'icon-dart',
|
||||
// image: '/images/blog/placeholder.png',
|
||||
// href: 'dart'
|
||||
// }
|
||||
]
|
||||
}
|
||||
];
|
||||
</script>
|
||||
|
||||
@@ -1,56 +1,242 @@
|
||||
---
|
||||
layout: article
|
||||
title: Quick start with Android
|
||||
title: Start with Android
|
||||
description: Learn how to quickly integrate Appwrite products and services into your Android project.
|
||||
difficulty: beginner
|
||||
readtime: 3
|
||||
---
|
||||
|
||||
Learn to setup your first Apple project powered by Appwrite.
|
||||
{% section #step-1 step=1 title="Create project" %}
|
||||
Learn to setup your first Android project powered by Appwrite.
|
||||
|
||||
{% section #step-1 step=1 title="Create Android project" %}
|
||||
Open Android Studio and click **New Project** to create a new project.
|
||||
|
||||
Choose your desired project template and click **Next**.
|
||||
|
||||
Now enter your app **name** and **package name**. You will need both of these later when you create your project in the Appwrite console. Click **Finish** to create your project.
|
||||
|
||||
{% /section %}
|
||||
|
||||
{% section #step-2 step=2 title="Create Appwrite project" %}
|
||||
Head to the [Appwrite Console](https://cloud.appwrite.io/console).
|
||||
|
||||

|
||||
|
||||
If this is your first time using Appwrite, create an accout and create your first project.
|
||||
|
||||
Then, under **Add a platform**, add a **Android app** with the **Name** `My Application` and **Package name** `com.example.myapplication`.
|
||||
Then, under **Add a platform**, add an **Android app**.
|
||||
|
||||
Add your app's **name** and **package name**, your package name is the one entered when creating an Android project. For existing projects, you should use the **applicationId** in your app-level [build.gradle](https://github.com/appwrite/playground-for-android/blob/master/app/build.gradle#L11) file.
|
||||
|
||||

|
||||
|
||||
You can skip optional steps.
|
||||
|
||||
{% /section %}
|
||||
{% section #step-2 step=2 title="Create Android project" %}
|
||||
Open Android Studios and click **New Project**, select **Empty Activity**.
|
||||
**Name** the project `My Application` with **Package Name** `com.example.myapplication`.
|
||||
|
||||
{% section #step-3 step=3 title="Add the Appwrite SDK" %}
|
||||
To add the Appwrite SDK for Android as a dependency, add the following to your app-level **build.gradle.kts** file inside the **dependencies** block.
|
||||
|
||||
```kotlin
|
||||
implementation("io.appwrite:sdk-for-android:4.0.0")
|
||||
```
|
||||
|
||||
In order to allow creating OAuth sessions, the following activity needs to be added inside the `<application>` tag, along side the existing `<activity>` tags in your [AndroidManifest.xml](https://github.com/appwrite/playground-for-flutter/blob/master/android/app/src/main/AndroidManifest.xml).
|
||||
Be sure to replace the **[PROJECT_ID]** string with your actual Appwrite project ID.
|
||||
You can find your Appwrite project ID in you project settings screen in your Appwrite Console.
|
||||
|
||||
```xml
|
||||
<manifest ...>
|
||||
...
|
||||
<application ...>
|
||||
...
|
||||
<!-- Add this inside the `<application>` tag, along side the existing `<activity>` tags -->
|
||||
<activity android:name="io.appwrite.views.CallbackActivity" android:exported="true">
|
||||
<intent-filter android:label="android_web_auth">
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<data android:scheme="appwrite-callback-[PROJECT_ID]" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
</application>
|
||||
</manifest>
|
||||
```
|
||||
{% /section %}
|
||||
|
||||
{% section #step-3 step=3 title="Install Appwrite" %}
|
||||
Install the Appwrite SDK for Android.
|
||||
|
||||
|
||||
{% /section %}
|
||||
|
||||
{% section #step-4 step=4 title="Import Appwrite" %}
|
||||
{% section #step-4 step=4 title="Create Appwrite Singleton" %}
|
||||
Find your project's ID in the **Settings** page.
|
||||
|
||||

|
||||
|
||||
Create a new file `src/lib/appwrite.js` and add the following code to it, replace `<YOUR_PROJECT_ID>` with your project ID.
|
||||
Create a new file `Appwrite.kt` and add the following code to it, replacing `[YOUR_PROJECT_ID]` with your project ID.
|
||||
|
||||
```swift
|
||||
TODO
|
||||
```kotlin
|
||||
package com.example.myapplication
|
||||
|
||||
import android.content.Context
|
||||
import io.appwrite.Client
|
||||
import io.appwrite.ID
|
||||
import io.appwrite.models.*
|
||||
import io.appwrite.services.*
|
||||
|
||||
object Appwrite {
|
||||
lateinit var client: Client
|
||||
lateinit var account: Account
|
||||
|
||||
fun init(context: Context) {
|
||||
client = Client(context)
|
||||
.setEndpoint("https://cloud.appwrite.io/v1")
|
||||
.setProject("[YOUR_PROJECT_ID]")
|
||||
|
||||
account = Account(client)
|
||||
}
|
||||
|
||||
suspend fun onLogin(
|
||||
email: String,
|
||||
password: String,
|
||||
): Session {
|
||||
return account.createEmailSession(
|
||||
email,
|
||||
password,
|
||||
)
|
||||
}
|
||||
|
||||
suspend fun onRegister(
|
||||
email: String,
|
||||
password: String,
|
||||
): User<Map<String, Any>> {
|
||||
return account.create(
|
||||
userId = ID.unique(),
|
||||
email,
|
||||
password,
|
||||
)
|
||||
}
|
||||
|
||||
suspend fun onLogout() {
|
||||
account.deleteSession("current")
|
||||
}
|
||||
}
|
||||
```
|
||||
{% /section %}
|
||||
{% section #step-5 step=5 title="Create a login page" %}
|
||||
Add the following code to `src/App.jsx`.
|
||||
Add the following code to `MainActivity.kt`.
|
||||
|
||||
```swift
|
||||
TODO
|
||||
```kotlin
|
||||
package com.example.myapplication
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.activity.ComponentActivity
|
||||
import androidx.activity.compose.setContent
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.foundation.text.*
|
||||
import androidx.compose.material3.*
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.ui.*
|
||||
import androidx.compose.ui.text.input.*
|
||||
import androidx.compose.ui.unit.*
|
||||
import com.example.myapplication.ui.theme.MyApplicationTheme
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
class MainActivity : ComponentActivity() {
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
Appwrite.init(applicationContext)
|
||||
|
||||
setContent {
|
||||
MyApplicationTheme {
|
||||
Surface(
|
||||
modifier = Modifier.fillMaxSize(),
|
||||
color = MaterialTheme.colorScheme.background
|
||||
) {
|
||||
val coroutineScope = rememberCoroutineScope()
|
||||
|
||||
var user by remember { mutableStateOf("") }
|
||||
var email by remember { mutableStateOf("") }
|
||||
var password by remember { mutableStateOf("") }
|
||||
|
||||
if (user.isNotEmpty()) {
|
||||
Column(
|
||||
modifier = Modifier.fillMaxSize(),
|
||||
horizontalAlignment = Alignment.CenterHorizontally,
|
||||
verticalArrangement = Arrangement.Center
|
||||
) {
|
||||
Text(text = "Logged in as $user")
|
||||
Button(onClick = {
|
||||
coroutineScope.launch {
|
||||
Appwrite.onLogout()
|
||||
}
|
||||
}) {
|
||||
Text("Logout")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Column(
|
||||
modifier = Modifier.fillMaxSize(),
|
||||
horizontalAlignment = Alignment.CenterHorizontally,
|
||||
verticalArrangement = Arrangement.Center
|
||||
) {
|
||||
TextField(
|
||||
value = email,
|
||||
onValueChange = { email = it },
|
||||
label = { Text("Username") },
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(16.dp)
|
||||
)
|
||||
TextField(
|
||||
value = password,
|
||||
onValueChange = { password = it },
|
||||
label = { Text("Password") },
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(16.dp),
|
||||
visualTransformation = PasswordVisualTransformation(),
|
||||
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password)
|
||||
)
|
||||
Row(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(16.dp),
|
||||
horizontalArrangement = Arrangement.SpaceBetween
|
||||
) {
|
||||
Button(onClick = {
|
||||
coroutineScope.launch {
|
||||
try {
|
||||
Appwrite.onLogin(email, password)
|
||||
|
||||
user = email
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
}) {
|
||||
Text("Login")
|
||||
}
|
||||
Button(onClick = {
|
||||
coroutineScope.launch {
|
||||
try {
|
||||
Appwrite.onRegister(email, password)
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
}) {
|
||||
Text("Register")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
{% /section %}
|
||||
|
||||
{% section #step-6 step=6 title="Checkout what you've built" %}
|
||||
Run your project with `npm run dev -- --open --port 3000` and open [http://localhost:3000](http://localhost:3000) in your browser.
|
||||
{% section #step-6 step=6 title="All set" %}
|
||||
Run your project by clicking **Run app** in Android Studio.
|
||||
{% /section %}
|
||||
@@ -1,9 +1,16 @@
|
||||
---
|
||||
layout: article
|
||||
title: Quick start with Angular
|
||||
title: Start with Angular
|
||||
description: Learn how to quickly integrate Appwrite products and services into your Angular project.
|
||||
difficulty: beginner
|
||||
readtime: 3
|
||||
---
|
||||
|
||||
hello world
|
||||
Improve the docs, add this guide.
|
||||
|
||||
We still don't have this guide in place, but we do have some great news.
|
||||
The Appwrite docs, just like Appwrite, is completely open sourced.
|
||||
This means, anyone can help improve them and add new guides and tutorials.
|
||||
|
||||
If you see this page, **we're actively looking for contributions to this page**.
|
||||
Follow our contribution guidelines, open a PR to [our Website repo](https://github.com/appwrite/website), and collaborate with our core team to improve this page.
|
||||
@@ -1,61 +1,190 @@
|
||||
---
|
||||
layout: article
|
||||
title: Start with Apple
|
||||
description: Learn how to quickly integrate Appwrite products and services into your iOS, iPadOS, macOS, watchOS, tvOS, or visionOS project.
|
||||
description: Learn how to quickly integrate Appwrite products and services into your Apple project.
|
||||
difficulty: beginner
|
||||
readtime: 3
|
||||
---
|
||||
|
||||
Learn to setup your first Apple project powered by Appwrite.
|
||||
{% section #step-1 step=1 title="Create project" %}
|
||||
|
||||
{% section #step-1 step=1 title="Create Apple project" %}
|
||||
Open Xcode and click **Create a new Xcode project**.
|
||||
|
||||
Choose your desired project template and click **Next**.
|
||||
|
||||
Now enter your app **product name** and **bundle identifier** and click **Next**. You will need both of these values later when you create your project in the Appwrite console.
|
||||
|
||||
Choose a directory for your project in and click **Create** to create your project.
|
||||
|
||||
{% /section %}
|
||||
|
||||
{% section #step-2 step=2 title="Create Appwrite project" %}
|
||||
Head to the [Appwrite Console](https://cloud.appwrite.io/console).
|
||||
|
||||

|
||||
|
||||
If this is your first time using Appwrite, create an accout and create your first project.
|
||||
|
||||
Then, under **Add a platform**, add a **Apple app**. The **Bundle ID** can be `example.my-app`.
|
||||
Then, under **Add a platform**, add an **Apple app**. Choose any of **iOS**, **macOS**, **watchOS** or **tvOS** as your Apple platform. If you are creating a multi-platform app, you can add more platforms later.
|
||||
|
||||
Add your app's **product name** and **bundle identifier**, your bundle identifier is the one entered when creating an Xcode project. For existing projects, you should use the **bundle identifier** from your project files **Identity** section.
|
||||
|
||||

|
||||
|
||||
You can skip optional steps.
|
||||
|
||||
{% /section %}
|
||||
{% section #step-2 step=2 title="Create XCode project" %}
|
||||
Open XCode and select **Create a new XCode project** > select **App** > create an app named `my-app` under the **Organization Identifier** `example`.
|
||||
This creates a new app with the **Bundle ID** `example.my-app`.
|
||||
|
||||
{% section #step-3 step=3 title="Add the Appwrite SDK" %}
|
||||
To add the Appwrite SDK for Apple as a dependency, open the **File** menu and click **Add Packages**.
|
||||
|
||||
In the **Package URL** search box, enter https://github.com/appwrite/sdk-for-apple.
|
||||
|
||||
Once the SDK is found, select **Up to Next Major Version** as your **Dependency Rule** and click **Add Package**.
|
||||
|
||||
When dependency resolution is complete, click **Add Package** again to add the SDK package to your target.
|
||||
|
||||
In order to allow creating OAuth sessions, the following URL scheme must be added to your **Info.plist** file.
|
||||
|
||||
```plist
|
||||
<key>CFBundleURLTypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Editor</string>
|
||||
<key>CFBundleURLName</key>
|
||||
<string>io.appwrite</string>
|
||||
<key>CFBundleURLSchemes</key>
|
||||
<array>
|
||||
<string>appwrite-callback-[PROJECT_ID]</string>
|
||||
</array>
|
||||
</dict>
|
||||
</array>
|
||||
```
|
||||
|
||||
If you're using UIKit as opposed to SwiftUI, you will also need to add the following to your **SceneDelegate.swift** file.
|
||||
|
||||
```swift
|
||||
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
|
||||
guard let url = URLContexts.first?.url,
|
||||
url.absoluteString.contains("appwrite-callback") else {
|
||||
return
|
||||
}
|
||||
|
||||
WebAuthComponent.handleIncomingCookie(from: url)
|
||||
}
|
||||
```
|
||||
{% /section %}
|
||||
|
||||
{% section #step-3 step=3 title="Install Appwrite" %}
|
||||
Install the Appwrite SDK for Apple.
|
||||
|
||||
1. Select **File** > **Add Packages**
|
||||
2. Search for the Appwrite SDK with the URL `https://github.com/appwrite/sdk-for-apple`
|
||||
3. In the right panel, select your target project and add your desired version rules
|
||||
4. Select Add Package and wait for package resolution to complete
|
||||
5. Make sure the Appwrite package product is checked and select Add Package again
|
||||
|
||||
{% /section %}
|
||||
|
||||
{% section #step-4 step=4 title="Import Appwrite" %}
|
||||
{% section #step-4 step=4 title="Create Appwrite Singleton" %}
|
||||
Find your project's ID in the **Settings** page.
|
||||
|
||||

|
||||
|
||||
Create a new file `src/lib/appwrite.js` and add the following code to it, replace `<YOUR_PROJECT_ID>` with your project ID.
|
||||
Create a new file `Appwrite.swift` and add the following code to it, replacing `[YOUR_PROJECT_ID]` with your project ID.
|
||||
|
||||
```swift
|
||||
TODO
|
||||
import Foundation
|
||||
import Appwrite
|
||||
import JSONCodable
|
||||
|
||||
class Appwrite {
|
||||
var client: Client
|
||||
var account: Account
|
||||
|
||||
public init() {
|
||||
self.client = Client()
|
||||
.setEndpoint("https://cloud.appwrite.io/v1")
|
||||
.setProject("[YOUR_PROJECT_ID]")
|
||||
|
||||
self.account = Account(client)
|
||||
}
|
||||
|
||||
public func onRegister(
|
||||
_ email: String,
|
||||
_ password: String
|
||||
) async throws -> User<[String: AnyCodable]> {
|
||||
try await account.create(
|
||||
userId: ID.unique(),
|
||||
email: email,
|
||||
password: password
|
||||
)
|
||||
}
|
||||
|
||||
public func onLogin(
|
||||
_ email: String,
|
||||
_ password: String
|
||||
) async throws -> Session {
|
||||
try await account.createEmailSession(
|
||||
email: email,
|
||||
password: password
|
||||
)
|
||||
}
|
||||
|
||||
public func onLogout() async throws {
|
||||
_ = try await account.deleteSession(
|
||||
sessionId: "current"
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
```
|
||||
{% /section %}
|
||||
{% section #step-5 step=5 title="Create a login page" %}
|
||||
Add the following code to `src/App.jsx`.
|
||||
Add the following code to `ContentView.swift`.
|
||||
|
||||
```swift
|
||||
TODO
|
||||
import SwiftUI
|
||||
|
||||
class ViewModel: ObservableObject {
|
||||
@Published var email: String = ""
|
||||
@Published var password: String = ""
|
||||
}
|
||||
|
||||
struct ContentView: View {
|
||||
@ObservedObject var viewModel = ViewModel()
|
||||
|
||||
var body: some View {
|
||||
VStack {
|
||||
TextField(
|
||||
"Email",
|
||||
text: $viewModel.email
|
||||
)
|
||||
SecureField(
|
||||
"Password",
|
||||
text: $viewModel.password
|
||||
)
|
||||
Button(
|
||||
action: { Task {
|
||||
try await Appwrite.onRegister(
|
||||
viewModel.email,
|
||||
viewModel.password
|
||||
)
|
||||
}},
|
||||
label: {
|
||||
Text("Register")
|
||||
}
|
||||
)
|
||||
Button(
|
||||
action: { Task {
|
||||
try! await Appwrite.onLogin(
|
||||
viewModel.email,
|
||||
viewModel.password
|
||||
)
|
||||
}},
|
||||
label: {
|
||||
Text("Login")
|
||||
}
|
||||
)
|
||||
}
|
||||
.padding()
|
||||
}
|
||||
}
|
||||
```
|
||||
{% /section %}
|
||||
|
||||
{% section #step-6 step=6 title="Checkout what you've built" %}
|
||||
Run your project with `npm run dev -- --open --port 3000` and open [http://localhost:3000](http://localhost:3000) in your browser.
|
||||
{% section #step-6 step=6 title="All set" %}
|
||||
Run your project by clicking **Start active scheme** in Xcode.
|
||||
{% /section %}
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
layout: article
|
||||
title: Quick start with Astro
|
||||
title: Start with Astro
|
||||
description: Learn how to quickly integrate Appwrite products and services into your Astro project.
|
||||
difficulty: beginner
|
||||
readtime: 3
|
||||
|
||||
@@ -1,13 +1,22 @@
|
||||
---
|
||||
layout: article
|
||||
title: Quick start with Flutter
|
||||
title: Start with Flutter
|
||||
description: Learn how to quickly integrate Appwrite products and services into your Flutter project.
|
||||
difficulty: beginner
|
||||
readtime: 3
|
||||
---
|
||||
|
||||
Learn to setup your first Flutter project powered by Appwrite.
|
||||
{% section #step-1 step=1 title="Create project" %}
|
||||
|
||||
{% section #step-1 step=1 title="Create Flutter project" %}
|
||||
Create a Flutter project.
|
||||
|
||||
```sh
|
||||
flutter create my_app && cd my_app
|
||||
```
|
||||
{% /section %}
|
||||
|
||||
{% section #step-2 step=2 title="Create project" %}
|
||||
Head to the [Appwrite Console](https://cloud.appwrite.io/console).
|
||||
|
||||

|
||||
@@ -60,7 +69,7 @@ You have to change your iOS Deployment Target in Xcode to be iOS >= 11 to be abl
|
||||
{% /tabsitem %}
|
||||
|
||||
{% tabsitem #android title="Android" %}
|
||||
Add your app's **name** and *package name*, Your package name is generally the **applicationId** in your app-level [build.gradle](https://github.com/appwrite/playground-for-flutter/blob/master/android/app/build.gradle#L41) file.
|
||||
Add your app's **name** and **package name**, Your package name is generally the **applicationId** in your app-level [build.gradle](https://github.com/appwrite/playground-for-flutter/blob/master/android/app/build.gradle#L41) file.
|
||||
|
||||
In order to capture the Appwrite OAuth callback url, the following activity needs to be added inside the `<application>` tag, along side the existing `<activity>` tags in your [AndroidManifest.xml](https://github.com/appwrite/playground-for-flutter/blob/master/android/app/src/main/AndroidManifest.xml).
|
||||
Be sure to replace the **[PROJECT_ID]** string with your actual Appwrite project ID.
|
||||
@@ -128,17 +137,10 @@ If you cannot find the correct package name, run the application in Windows, and
|
||||
|
||||
{% /tabs %}
|
||||
|
||||

|
||||
![Add a platform]()
|
||||
|
||||
You can skip optional steps.
|
||||
|
||||
{% /section %}
|
||||
{% section #step-2 step=2 title="Create Flutter project" %}
|
||||
Create a Flutter project.
|
||||
|
||||
```sh
|
||||
flutter create my_app && cd my_app
|
||||
```
|
||||
{% /section %}
|
||||
|
||||
{% section #step-3 step=3 title="Install Appwrite" %}
|
||||
@@ -155,60 +157,39 @@ Find your project's ID in the **Settings** page.
|
||||
|
||||

|
||||
|
||||
Create a new file `lib/appwrite.dart` and add the following code to it, replace `<YOUR_PROJECT_ID>` with your project ID.
|
||||
|
||||
```dart
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
|
||||
class Appwrite {
|
||||
static final Appwrite instance = Appwrite._internal();
|
||||
|
||||
late final Client client;
|
||||
late final Account account;
|
||||
factory Appwrite._() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
Appwrite._internal() {
|
||||
client = Client()
|
||||
.setEndpoint("https://cloud.appwrite.io/v1")
|
||||
.setProject("<YOUR_PROJECT_ID>");
|
||||
account = Account(client);
|
||||
}
|
||||
}
|
||||
```
|
||||
{% /section %}
|
||||
{% section #step-5 step=5 title="Create a login page" %}
|
||||
Add the following code to `src/App.jsx`.
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
Open the generated `lib/main.dart` and add the following code to it, replace `<YOUR_PROJECT_ID>` with your project ID.
|
||||
This imports and initializes Appwrite.
|
||||
|
||||
```dart
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite/models.dart' as models;
|
||||
|
||||
import 'package:my_app/appwrite.dart';
|
||||
|
||||
void main() {
|
||||
runApp(MyApp());
|
||||
}
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
Client client = Client();
|
||||
client = Client()
|
||||
.setEndpoint("https://cloud.appwrite.io/v1")
|
||||
.setProject("650209298acac4ee1bb6");
|
||||
;
|
||||
Account account = Account(client);
|
||||
|
||||
class MyApp extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return MaterialApp(
|
||||
home: Scaffold(
|
||||
appBar: AppBar(title: const Text('My App')),
|
||||
body: Padding(
|
||||
padding: const EdgeInsets.all(16.0),
|
||||
child: MyForm(),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
runApp(MyApp(
|
||||
account: account,
|
||||
));
|
||||
}
|
||||
```
|
||||
{% /section %}
|
||||
{% section #step-5 step=5 title="Create a login page" %}
|
||||
Then, append the following widgets to `lib/main.dart` create your login page.
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
|
||||
```dart
|
||||
class MyForm extends StatefulWidget {
|
||||
final Account account;
|
||||
|
||||
MyForm({required this.account});
|
||||
|
||||
@override
|
||||
MyFormState createState() {
|
||||
return MyFormState();
|
||||
@@ -222,22 +203,21 @@ class MyFormState extends State<MyForm> {
|
||||
final TextEditingController nameController = TextEditingController();
|
||||
|
||||
Future<void> login(String email, String password) async {
|
||||
await Appwrite.instance.account
|
||||
.createEmailSession(email: email, password: password);
|
||||
final user = await Appwrite.instance.account.get();
|
||||
await widget.account.createEmailSession(email: email, password: password);
|
||||
final user = await widget.account.get();
|
||||
setState(() {
|
||||
loggedInUser = user;
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> register(String email, String password, String name) async {
|
||||
await Appwrite.instance.account.create(
|
||||
await widget.account.create(
|
||||
userId: ID.unique(), email: email, password: password, name: name);
|
||||
await login(email, password);
|
||||
}
|
||||
|
||||
Future<void> logout() async {
|
||||
await Appwrite.instance.account.deleteSession(sessionId: 'current');
|
||||
await widget.account.deleteSession(sessionId: 'current');
|
||||
setState(() {
|
||||
loggedInUser = null;
|
||||
});
|
||||
@@ -294,6 +274,6 @@ class MyFormState extends State<MyForm> {
|
||||
```
|
||||
{% /section %}
|
||||
|
||||
{% section #step-6 step=6 title="Checkout what you've built" %}
|
||||
{% section #step-6 step=6 title="All set" %}
|
||||
Run your project with `flutter run` and select a browser, platform, or emulator to run your project.
|
||||
{% /section %}
|
||||
@@ -1,9 +1,16 @@
|
||||
---
|
||||
layout: article
|
||||
title: Quick start with Next.js
|
||||
title: Start with Next.js
|
||||
description: Learn how to quickly integrate Appwrite products and services into your Next.js project.
|
||||
difficulty: beginner
|
||||
readtime: 3
|
||||
---
|
||||
|
||||
hello world
|
||||
Improve the docs, add this guide.
|
||||
|
||||
We still don't have this guide in place, but we do have some great news.
|
||||
The Appwrite docs, just like Appwrite, is completely open sourced.
|
||||
This means, anyone can help improve them and add new guides and tutorials.
|
||||
|
||||
If you see this page, **we're actively looking for contributions to this page**.
|
||||
Follow our contribution guidelines, open a PR to [our Website repo](https://github.com/appwrite/website), and collaborate with our core team to improve this page.
|
||||
@@ -1,9 +1,16 @@
|
||||
---
|
||||
layout: article
|
||||
title: Quick start with Nuxt
|
||||
title: Start with Nuxt
|
||||
description: Learn how to quickly integrate Appwrite products and services into your Nuxt project.
|
||||
difficulty: beginner
|
||||
readtime: 3
|
||||
---
|
||||
|
||||
hello world
|
||||
Improve the docs, add this guide.
|
||||
|
||||
We still don't have this guide in place, but we do have some great news.
|
||||
The Appwrite docs, just like Appwrite, is completely open sourced.
|
||||
This means, anyone can help improve them and add new guides and tutorials.
|
||||
|
||||
If you see this page, **we're actively looking for contributions to this page**.
|
||||
Follow our contribution guidelines, open a PR to [our Website repo](https://github.com/appwrite/website), and collaborate with our core team to improve this page.
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
layout: article
|
||||
title: Quick start with Qwik
|
||||
title: Start with Qwik
|
||||
description: Learn how to quickly integrate Appwrite products and services into your Qwik project.
|
||||
difficulty: beginner
|
||||
readtime: 3
|
||||
|
||||
@@ -117,6 +117,6 @@ export default App;
|
||||
```
|
||||
{% /section %}
|
||||
|
||||
{% section #step-6 step=6 title="Checkout what you've built" %}
|
||||
{% section #step-6 step=6 title="All set" %}
|
||||
Run your project with `npm run dev -- --open --port 3000` and open [http://localhost:3000](http://localhost:3000) in your browser.
|
||||
{% /section %}
|
||||
@@ -99,7 +99,7 @@ Create a new file `src/routes/index.svelte` and add the following code to it.
|
||||
```
|
||||
{% /section %}
|
||||
|
||||
{% section #step-6 step=6 title="Checkout what you've built" %}
|
||||
{% section #step-6 step=6 title="All set" %}
|
||||
Run your project with `npm run dev -- --open --port 3000` and open [http://localhost:3000](http://localhost:3000) in your browser.
|
||||
{% /section %}
|
||||
|
||||
|
||||
@@ -108,6 +108,6 @@ const logout = async () => {
|
||||
```
|
||||
{% /section %}
|
||||
|
||||
{% section #step-6 step=6 title="Checkout what you've built" %}
|
||||
{% section #step-6 step=6 title="All set" %}
|
||||
Run your project with `npm run dev -- --open --port 3000` and open [http://localhost:3000](http://localhost:3000) in your browser.
|
||||
{% /section %}
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
label: 'Services',
|
||||
label: 'APIs',
|
||||
items: [
|
||||
{
|
||||
label: 'Account',
|
||||
@@ -64,7 +64,16 @@
|
||||
href: `${prefix}/avatars`
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
label: 'Debugging',
|
||||
items: [
|
||||
{
|
||||
label: 'Response codes',
|
||||
href: '/docs/advanced/platform/response-codes',
|
||||
}
|
||||
]
|
||||
},
|
||||
] as NavTree;
|
||||
|
||||
const parent: NavParent = {
|
||||
|
||||
@@ -8,7 +8,7 @@ Appwrite provides SDK libraries for major programming languages and platforms so
|
||||
|
||||
We're always working on improving and extending the current stack of available platforms and SDKs, listed below is a list of official libraries the Appwrite team is maintaining.
|
||||
|
||||
## Client Side {% #client-side %}
|
||||
## Client {% #client %}
|
||||
|
||||
Client libraries for integrating with Appwrite to build client-based applications and websites. Read one of the many [quick starts](/docs/quick-starts) guides for your framework of choice to start building your first application.
|
||||
|
||||
@@ -43,7 +43,7 @@ Client libraries for integrating with Appwrite to build client-based application
|
||||
*
|
||||
{% /table %}
|
||||
|
||||
## Server Side {% #server-side %}
|
||||
## Server {% #server %}
|
||||
|
||||
Server libraries for integrating with Appwrite to build server side integrations or use inside your [Appwrite Functions](/docs/products/functions). Read one of the many [quick starts](/docs/quick-starts) guides for your language/runtime of choice to start building your first server integration.
|
||||
|
||||
@@ -114,9 +114,12 @@ If you would like to help us extend our platforms and SDKs stack, you are more t
|
||||
We are always looking to add new SDKs to our platform. If the SDK you are looking for is still missing, labeled as beta or experimental, or you simply do not want to integrate with an SDK, you can always integrate with Appwrite directly using any standard HTTP, GraphQL, or WebSocket clients and the relevant Appwrite protocol.
|
||||
|
||||
Appwrite supports multiple API protocols for maximum flexibility and developer convenience. You can learn more about how to integrate directly with them using one of the following available guides:
|
||||
- [Integrate with the Appwrite REST API](#)
|
||||
- [Integrate with the Appwrite GraphQL API](#)
|
||||
- [Integrate with the Appwrite Realtime API](#)
|
||||
|
||||
[Integrate with the Appwrite Realtime API {% icon icon="cheveron-right" /%}](/docs/apis/realtime)
|
||||
|
||||
[Integrate with the Appwrite REST API {% icon icon="cheveron-right" /%}](/docs/apis/rest)
|
||||
|
||||
[Integrate with the Appwrite GraphQL API {% icon icon="cheveron-right" /%}](/docs/apis/graphql)
|
||||
|
||||
## Community {% #community %}
|
||||
If you have created your own framework or any other technology specific integration and would like us to list it here please [contact us](/contact-us).
|
||||
|
||||
@@ -12,7 +12,7 @@ While the Appwrite Assistant remains under active development and is considered
|
||||
|
||||
## Getting started {% #getting-started %}
|
||||
|
||||
To engage the Appwrite Assistant, access the Command Center within your Appwrite console, and proceed to the `Ask the AI` tab in the navigation.
|
||||
To engage the Appwrite Assistant, access the Command Center within your Appwrite Console, and proceed to the `Ask the AI` tab in the navigation.
|
||||
|
||||
## Querying {% #querying %}
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@ appwrite deploy function
|
||||
|
||||
The Appwrite CLI also helps you deploy your project's databases and collections schema from one project to another.
|
||||
|
||||
You can deploy all the databases and collections in your [appwrite.json](#) file by running this command in the folder holding your `appwrite.json` file.
|
||||
You can deploy all the databases and collections in your [appwrite.json](/docs/tooling/command-line/deployment#appwrite-json) file by running this command in the folder holding your `appwrite.json` file.
|
||||
|
||||
The deploy command will overwrite existing collections causing existing data to be lost. If you already have data in your project, you will need to write your own migration script using a Server SDK instead of using the CLI.
|
||||
|
||||
@@ -84,7 +84,7 @@ appwrite deploy bucket
|
||||
|
||||
## Conflicts {% #conflicts %}
|
||||
|
||||
When using `appwrite.json`, changes made in the Appwrite Console can cause conflicts with the local config. To avoid conflicts, prefer updating configuration locally and deploying instead of using the console.
|
||||
When using `appwrite.json`, changes made in the Appwrite Console can cause conflicts with the local config. To avoid conflicts, prefer updating configuration locally and deploying instead of using the Console.
|
||||
|
||||
## The appwrite.json file {% #appwrite-json %}
|
||||
|
||||
|
||||
@@ -95,11 +95,11 @@ You can use the CLI to create and deploy functions and collections. Deploy comma
|
||||
|
||||
Besides utility commands, the CLI can be used to execute commands like a Server SDK.
|
||||
|
||||
[Find a full list of commands](#)
|
||||
[Find a full list of commands](/docs/tooling/command-line/commands)
|
||||
|
||||
You can choose to use the CLI in a headless and non-interactive mode without the need for config files or sessions. This is useful for CI or scripting use cases.
|
||||
|
||||
[Learn more about CI mode](#)
|
||||
[Learn more about CI mode](/docs/tooling/command-line/non-interactive)
|
||||
|
||||
## Help {% #help %}
|
||||
|
||||
|
||||
@@ -19,8 +19,8 @@
|
||||
<li class="is-mobile-col-span-2">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
<span class="icon-react aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">React</h4>
|
||||
</header>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur.
|
||||
@@ -30,8 +30,8 @@
|
||||
<li class="is-mobile-col-span-2">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
<span class="icon-vue aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Vue</h4>
|
||||
</header>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur.
|
||||
@@ -41,8 +41,8 @@
|
||||
<li class="is-mobile-col-span-2">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
<span class="icon-svelte aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">SvelteKit</h4>
|
||||
</header>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur.
|
||||
@@ -52,56 +52,8 @@
|
||||
<li class="is-mobile-col-span-2">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur.
|
||||
</p>
|
||||
</article>
|
||||
</li>
|
||||
<li class="">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
</article>
|
||||
</li>
|
||||
<li class="">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
</article>
|
||||
</li>
|
||||
<li class="">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
</article>
|
||||
</li>
|
||||
<li class="">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
</article>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="u-flex-vertical u-gap-24">
|
||||
<h2 class="aw-eyebrow">Server</h2>
|
||||
<ul class="aw-grid-row-4 aw-grid-row-4-mobile-2">
|
||||
<li class="is-mobile-col-span-2">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
<span class="icon-flutter aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Flutter</h4>
|
||||
</header>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur.
|
||||
@@ -111,8 +63,8 @@
|
||||
<li class="is-mobile-col-span-2">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
<span class="icon-apple aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Apple</h4>
|
||||
</header>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur.
|
||||
@@ -122,402 +74,14 @@
|
||||
<li class="is-mobile-col-span-2">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
<span class="icon-android aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Android</h4>
|
||||
</header>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur.
|
||||
</p>
|
||||
</article>
|
||||
</li>
|
||||
<li class="is-mobile-col-span-2">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur.
|
||||
</p>
|
||||
</article>
|
||||
</li>
|
||||
<li class="">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
</article>
|
||||
</li>
|
||||
<li class="">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
</article>
|
||||
</li>
|
||||
<li class="">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
</article>
|
||||
</li>
|
||||
<li class="">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
</article>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
<header class="aw-article-header">
|
||||
<div class="aw-article-header-start u-flex-vertical aw-u-cross-start">
|
||||
<div class="u-position-relative u-flex u-cross-center">
|
||||
<h1 class="aw-title">Authentication</h1>
|
||||
</div>
|
||||
</div>
|
||||
<div class="aw-article-header-end" />
|
||||
</header>
|
||||
<div class="aw-article-content aw-u-gap-80">
|
||||
<section class="u-flex-vertical u-gap-24">
|
||||
<h2 class="aw-eyebrow">Client</h2>
|
||||
<ul class="aw-grid-row-4 aw-grid-row-4-mobile-2">
|
||||
<li class="is-mobile-col-span-2">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur.
|
||||
</p>
|
||||
</article>
|
||||
</li>
|
||||
<li class="is-mobile-col-span-2">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur.
|
||||
</p>
|
||||
</article>
|
||||
</li>
|
||||
<li class="is-mobile-col-span-2">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur.
|
||||
</p>
|
||||
</article>
|
||||
</li>
|
||||
<li class="is-mobile-col-span-2">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur.
|
||||
</p>
|
||||
</article>
|
||||
</li>
|
||||
<li class="">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
</article>
|
||||
</li>
|
||||
<li class="">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
</article>
|
||||
</li>
|
||||
<li class="">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
</article>
|
||||
</li>
|
||||
<li class="">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
</article>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="u-flex-vertical u-gap-24">
|
||||
<h2 class="aw-eyebrow">Server</h2>
|
||||
<ul class="aw-grid-row-4 aw-grid-row-4-mobile-2">
|
||||
<li class="is-mobile-col-span-2">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur.
|
||||
</p>
|
||||
</article>
|
||||
</li>
|
||||
<li class="is-mobile-col-span-2">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur.
|
||||
</p>
|
||||
</article>
|
||||
</li>
|
||||
<li class="is-mobile-col-span-2">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur.
|
||||
</p>
|
||||
</article>
|
||||
</li>
|
||||
<li class="is-mobile-col-span-2">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur.
|
||||
</p>
|
||||
</article>
|
||||
</li>
|
||||
<li class="">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
</article>
|
||||
</li>
|
||||
<li class="">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
</article>
|
||||
</li>
|
||||
<li class="">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
</article>
|
||||
</li>
|
||||
<li class="">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
</article>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<header class="aw-article-header">
|
||||
<div class="aw-article-header-start u-flex-vertical aw-u-cross-start">
|
||||
<div class="u-position-relative u-flex u-cross-center">
|
||||
<h1 class="aw-title">Databases</h1>
|
||||
</div>
|
||||
</div>
|
||||
<div class="aw-article-header-end" />
|
||||
</header>
|
||||
<div class="aw-article-content aw-u-gap-80">
|
||||
<section class="u-flex-vertical u-gap-24">
|
||||
<h2 class="aw-eyebrow">Client</h2>
|
||||
<ul class="aw-grid-row-4 aw-grid-row-4-mobile-2">
|
||||
<li class="is-mobile-col-span-2">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur.
|
||||
</p>
|
||||
</article>
|
||||
</li>
|
||||
<li class="is-mobile-col-span-2">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur.
|
||||
</p>
|
||||
</article>
|
||||
</li>
|
||||
<li class="is-mobile-col-span-2">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur.
|
||||
</p>
|
||||
</article>
|
||||
</li>
|
||||
<li class="is-mobile-col-span-2">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur.
|
||||
</p>
|
||||
</article>
|
||||
</li>
|
||||
<li class="">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
</article>
|
||||
</li>
|
||||
<li class="">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
</article>
|
||||
</li>
|
||||
<li class="">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
</article>
|
||||
</li>
|
||||
<li class="">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
</article>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section class="u-flex-vertical u-gap-24">
|
||||
<h2 class="aw-eyebrow">Server</h2>
|
||||
<ul class="aw-grid-row-4 aw-grid-row-4-mobile-2">
|
||||
<li class="is-mobile-col-span-2">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur.
|
||||
</p>
|
||||
</article>
|
||||
</li>
|
||||
<li class="is-mobile-col-span-2">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur.
|
||||
</p>
|
||||
</article>
|
||||
</li>
|
||||
<li class="is-mobile-col-span-2">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur.
|
||||
</p>
|
||||
</article>
|
||||
</li>
|
||||
<li class="is-mobile-col-span-2">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
Lorem ipsum dolor sit amet consectetur.
|
||||
</p>
|
||||
</article>
|
||||
</li>
|
||||
<li class="">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
</article>
|
||||
</li>
|
||||
<li class="">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
</article>
|
||||
</li>
|
||||
<li class="">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
</article>
|
||||
</li>
|
||||
<li class="">
|
||||
<article class="aw-card is-full-color">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-node_js aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Node.js</h4>
|
||||
</header>
|
||||
</article>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
@@ -12,8 +12,6 @@ In this tutorial, you will build Idea Tracker with Appwrite and React.
|
||||
|
||||
[TODO: Image]
|
||||
|
||||
You can follow along with a fresh repo or [clone the project on GitHub](#).
|
||||
|
||||
## Concepts {% #concepts %}
|
||||
|
||||
This tutorial will introduce the following concepts:
|
||||
@@ -28,4 +26,4 @@ This tutorial will introduce the following concepts:
|
||||
## Prerequisites {% #prerequisites %}
|
||||
|
||||
1. Basic knowledge of JavaScript and React.
|
||||
2. Have [Node.js](#) and [NPM](#) installed on your computer
|
||||
2. Have [Node.js](https://nodejs.org/en) and [NPM](https://www.npmjs.com/) installed on your computer
|
||||
@@ -12,8 +12,6 @@ In this tutorial, you will build Idea Tracker with Appwrite and SvelteKit.
|
||||
|
||||
[TODO: Image]
|
||||
|
||||
You can follow along with a fresh repo or [clone the project on GitHub](#).
|
||||
|
||||
## Concepts {% #concepts %}
|
||||
This tutorial will introduce the following concepts:
|
||||
|
||||
@@ -25,4 +23,4 @@ This tutorial will introduce the following concepts:
|
||||
|
||||
## Prerequisites {% #prerequisites %}
|
||||
1. Basic knowledge of JavaScript and Svelte.
|
||||
2. Have [Node.js](#) and [NPM](#) installed on your computer
|
||||
2. Have [Node.js](https://nodejs.org/en) and [NPM](https://www.npmjs.com/) installed on your computer
|
||||
@@ -31,7 +31,7 @@ promise.then(function (response) {
|
||||
});
|
||||
```
|
||||
|
||||
Passwords are hashed with [Argon2](#), a resilient and secure password hashing algorithm.
|
||||
Passwords are hashed with [Argon2](https://github.com/P-H-C/phc-winner-argon2), a resilient and secure password hashing algorithm.
|
||||
|
||||
## Verification {% #verification %}
|
||||
|
||||
|
||||
@@ -12,8 +12,6 @@ In this tutorial, you will build Idea Tracker with Appwrite and Vue.
|
||||
|
||||
[TODO: Image]
|
||||
|
||||
You can follow along with a fresh repo or [clone the project on GitHub](#).
|
||||
|
||||
## Concepts {% #concepts %}
|
||||
|
||||
This tutorial will introduce the following concepts:
|
||||
@@ -28,4 +26,4 @@ This tutorial will introduce the following concepts:
|
||||
## Prerequisites {% #prerequisites %}
|
||||
|
||||
1. Basic knowledge of JavaScript and Vue.
|
||||
2. Have [Node.js](#) and [NPM](#) installed on your computer
|
||||
2. Have [Node.js](https://nodejs.org/en) and [NPM](https://www.npmjs.com/) installed on your computer.
|
||||
@@ -1,16 +1 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_3809_68117)">
|
||||
<g clip-path="url(#clip1_3809_68117)">
|
||||
<path d="M10.7712 0.799805C10.8047 0.799805 10.8382 0.799805 10.8736 0.799805C10.9558 1.81532 10.5682 2.57412 10.0971 3.12361C9.63488 3.66931 9.00192 4.19857 7.97818 4.11826C7.90989 3.11729 8.29814 2.41477 8.76859 1.86654C9.20489 1.35562 10.0048 0.900977 10.7712 0.799805Z" fill="#19191C"/>
|
||||
<path d="M13.8702 11.37C13.8702 11.3801 13.8702 11.389 13.8702 11.3985C13.5825 12.2698 13.1721 13.0166 12.6713 13.7096C12.2141 14.3388 11.6539 15.1855 10.6536 15.1855C9.78917 15.1855 9.21502 14.6297 8.32913 14.6145C7.39202 14.5993 6.87667 15.0793 6.01986 15.2C5.92185 15.2 5.82384 15.2 5.72773 15.2C5.09856 15.109 4.5908 14.6107 4.22089 14.1618C3.13013 12.8351 2.28723 11.1215 2.13042 8.92861C2.13042 8.71362 2.13042 8.49926 2.13042 8.28427C2.19681 6.71483 2.9594 5.43879 3.97302 4.82037C4.50797 4.49156 5.24337 4.21144 6.06223 4.33664C6.41317 4.39102 6.7717 4.51117 7.08597 4.63004C7.3838 4.7445 7.75624 4.94747 8.10908 4.93672C8.3481 4.92977 8.58585 4.8052 8.82677 4.71731C9.53245 4.46248 10.2242 4.17034 11.136 4.30756C12.2319 4.47323 13.0096 4.96012 13.4902 5.71132C12.5632 6.30129 11.8303 7.19034 11.9555 8.70856C12.0668 10.0877 12.8686 10.8945 13.8702 11.37Z" fill="#19191C"/>
|
||||
</g>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_3809_68117">
|
||||
<rect width="16" height="16" fill="white"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip1_3809_68117">
|
||||
<rect width="14.4" height="14.4" fill="white" transform="translate(0.800003 0.799805)"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none"><g clip-path="url(#a)"><g fill="#19191C" clip-path="url(#b)"><path d="M10.771.8h.103c.082 1.015-.306 1.774-.777 2.324-.462.545-1.095 1.075-2.119.994-.068-1 .32-1.703.79-2.251C9.206 1.356 10.006.9 10.772.8Zm3.099 10.57v.029a8.378 8.378 0 0 1-1.199 2.31c-.457.63-1.017 1.476-2.017 1.476-.865 0-1.439-.555-2.325-.57-.937-.016-1.452.464-2.31.585h-.291c-.63-.091-1.137-.59-1.507-1.038a9.097 9.097 0 0 1-2.09-5.233v-.645c.066-1.57.828-2.845 1.842-3.464.535-.328 1.27-.609 2.09-.483.35.054.709.174 1.023.293.298.115.67.317 1.023.307.24-.007.477-.132.718-.22.705-.255 1.397-.547 2.309-.41 1.096.166 1.874.653 2.354 1.404-.927.59-1.66 1.48-1.534 2.998.11 1.379.913 2.186 1.914 2.661Z"/></g></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath><clipPath id="b"><path fill="#fff" d="M.8.8h14.4v14.4H.8z"/></clipPath></defs></svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 915 B |
|
Before Width: | Height: | Size: 375 KiB After Width: | Height: | Size: 206 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 24 KiB |
@@ -1,3 +1 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.00022 14.3996C11.5348 14.3996 14.4002 11.5342 14.4002 7.99961C14.4002 4.46499 11.5348 1.59961 8.00022 1.59961C4.4656 1.59961 1.60022 4.46499 1.60022 7.99961C1.60022 11.5342 4.4656 14.3996 8.00022 14.3996ZM10.9659 6.96529C11.2783 6.65288 11.2783 6.14634 10.9659 5.83392C10.6535 5.5215 10.147 5.5215 9.83453 5.83392L7.20022 8.46824L6.1659 7.43392C5.85349 7.1215 5.34695 7.1215 5.03453 7.43392C4.72211 7.74634 4.72211 8.25287 5.03453 8.56529L6.63453 10.1653C6.94695 10.4777 7.45349 10.4777 7.7659 10.1653L10.9659 6.96529Z" fill="#7C67FE"/>
|
||||
</svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none"><path fill="#7C67FE" fill-rule="evenodd" d="M8 14.4A6.4 6.4 0 1 0 8 1.6a6.4 6.4 0 0 0 0 12.8Zm2.966-7.435a.8.8 0 0 0-1.131-1.131L7.2 8.468 6.166 7.434a.8.8 0 1 0-1.131 1.131l1.6 1.6a.8.8 0 0 0 1.13 0l3.2-3.2Z" clip-rule="evenodd"/></svg>
|
||||
|
Before Width: | Height: | Size: 692 B After Width: | Height: | Size: 312 B |
@@ -1,4 +1 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M3.2001 3.2002C2.31644 3.2002 1.6001 3.91654 1.6001 4.8002V5.6002H14.4001V4.8002C14.4001 3.91654 13.6838 3.2002 12.8001 3.2002H3.2001Z" fill="#19191C"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.4001 7.2002H1.6001V11.2002C1.6001 12.0839 2.31644 12.8002 3.2001 12.8002H12.8001C13.6838 12.8002 14.4001 12.0839 14.4001 11.2002V7.2002ZM3.2001 10.4002C3.2001 9.95837 3.55827 9.6002 4.0001 9.6002H4.8001C5.24193 9.6002 5.6001 9.95837 5.6001 10.4002C5.6001 10.842 5.24193 11.2002 4.8001 11.2002H4.0001C3.55827 11.2002 3.2001 10.842 3.2001 10.4002ZM7.2001 9.6002C6.75827 9.6002 6.4001 9.95837 6.4001 10.4002C6.4001 10.842 6.75827 11.2002 7.2001 11.2002H8.0001C8.44192 11.2002 8.8001 10.842 8.8001 10.4002C8.8001 9.95837 8.44192 9.6002 8.0001 9.6002H7.2001Z" fill="#19191C"/>
|
||||
</svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none"><path fill="#19191C" d="M3.2 3.2a1.6 1.6 0 0 0-1.6 1.6v.8h12.8v-.8a1.6 1.6 0 0 0-1.6-1.6H3.2Z"/><path fill="#19191C" fill-rule="evenodd" d="M14.4 7.2H1.6v4a1.6 1.6 0 0 0 1.6 1.6h9.6a1.6 1.6 0 0 0 1.6-1.6v-4ZM3.2 10.4a.8.8 0 0 1 .8-.8h.8a.8.8 0 1 1 0 1.6H4a.8.8 0 0 1-.8-.8Zm4-.8a.8.8 0 1 0 0 1.6H8a.8.8 0 0 0 0-1.6h-.8Z" clip-rule="evenodd"/></svg>
|
||||
|
Before Width: | Height: | Size: 890 B After Width: | Height: | Size: 423 B |