Skip to content

Commit d6a1942

Browse files
Merge branch 'main' into cleanup-ai-docs
2 parents ff30845 + b331c98 commit d6a1942

62 files changed

Lines changed: 3574 additions & 281 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.optimize-cache.json

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@
115115
"static/images/blog/10-open-source-alternatives-to-popular-software-for-startups/Typesense.png": "9487a55e01fa138583067914b37c810103616147d31feaef7aa7a5aa25b8afa0",
116116
"static/images/blog/10-open-source-alternatives-to-popular-software-for-startups/Webstudio.png": "e73e63de846c31686fcb05c01c19f7117bb869ee7992326af3207c33e227f848",
117117
"static/images/blog/15-git-cli-tips/cover.png": "701de0be53919ffbf09bca6e1f8f8f21491cb1238060058cc48e8bd55a266aee",
118+
"static/images/blog/25-startup-ideas-you-can-build-with-vibe-coding/cover.png": "69e1328071e894cb70e28d4c0c4eaa8f9dc63b71612b8823e455006bec21e25d",
118119
"static/images/blog/3-things-you-can-build-with-rust-runtime/cover.png": "fc603d24fd2ef803cb1cc81445ec990081c5cf69d5e7bf8143fce4595c2ed454",
119120
"static/images/blog/3-things-you-can-build-with-rust-runtime/webhook-create.png": "b76d6b4fecf5a14960916338580437e5c7b3ded9b7838eb67dae50a048406c79",
120121
"static/images/blog/5-claude-hacks-you-need-to-try-right-now/cover.png": "c144874bf9b2dbce69e1e56caaf6b8f6f8e00ea8c35d00ead7f77fd4602335a4",
@@ -173,6 +174,7 @@
173174
"static/images/blog/adding-url-shortener/functions.png": "64e977705133028364f8336da706f59d6a3c672a9ea30d16034155c04198a89d",
174175
"static/images/blog/adding-url-shortener/shortener.png": "170a82455ab8bc95ccfcccab0ce3bc7ae194caa79b03ff42a83ea7a921ed1306",
175176
"static/images/blog/adding-url-shortener/variables.png": "9e5135356992986e0c68f84b75da7f71990d882283693d80ef1461ab209b5a84",
177+
"static/images/blog/agencies-vibe-coding-client-projects/cover.png": "98bcaaf0efde370f4903c1f5448a7a0275c6759913825107d3fcede8a17e7fab",
176178
"static/images/blog/agency-backend-standardization/cover.png": "b0f24c2e12e820e8707b1b63dcf11f7181752cd47d4bd142c36bbd29c5018f3a",
177179
"static/images/blog/agent-native-backend-platforms/cover.png": "441fab2ce0c04df6b6569db19d33bd1cd9051614ea1dd7045db87a55e45d19c0",
178180
"static/images/blog/agentic-ai-vs-generative-ai/cover.png": "fcda7c601879683cc380860c3a9403d8d6868cdc3bbf239cd74077f67df830aa",
@@ -206,6 +208,8 @@
206208
"static/images/blog/announcing-bigint-columns/cover.png": "de0ec57085646427a552f35f0b1ab9a77f9e38b9b20801329ac19bc4bdb069f7",
207209
"static/images/blog/announcing-bulk-api/cover.png": "78a0fdf3b54ce8412bf6be1880eb4a42bcac2cb04420045a60bce888c8999c6f",
208210
"static/images/blog/announcing-bun-and-dart/bun-and-dart.png": "ea94af00a5c035cefb6474a9061441803db0160b7cc194fb5a71fbe05abf0d12",
211+
"static/images/blog/announcing-bun-deno-runtimes/cover.png": "5c739aa57624b990174943108de2433dd9292798d9e488d01351d5f01eba7800",
212+
"static/images/blog/announcing-bun-deno-runtimes/runtime-bun.png": "3ca689b349526e34386ac8dac25eb3ced20952c4493a85800da848a4e81fe319",
209213
"static/images/blog/announcing-cname-flattening/cover.png": "3d79ccb4a7f1bac9e32e0456e31fe09f4475e87368e582591799445a7d4a6f3a",
210214
"static/images/blog/announcing-csv-export/cover.png": "a330a6cc463d94635f905f5b48e6ee8b7c1b3f48b1c7ca0fada2e2b6f62b4ccf",
211215
"static/images/blog/announcing-csv-imports/cover.png": "47b77b504bdb691afcdf7769b70a5edc610ad525364bff8747d813cc674d549c",
@@ -215,6 +219,7 @@
215219
"static/images/blog/announcing-database-upsert/cover.png": "40839c8f5c28a5d78c2507f12e165ac8f176c53b81d8eb6b77b46d1c58f381dc",
216220
"static/images/blog/announcing-db-operators/cover.png": "9e0adb9ac1849e40b6a3c30ab4923ac63d1f551be1003ecb9804e4989bb2cf3c",
217221
"static/images/blog/announcing-deployment-retention/cover.png": "e6c59f73d83c1b88aed82a8974df97de83ab653241a5717f20b407809fa46ba9",
222+
"static/images/blog/announcing-email-policies/cover.png": "3b62c98a38e16bbf4446624035e89e4ee2aba0af636c9ff32a0d2d5ab56d4e2c",
218223
"static/images/blog/announcing-encrypted-string-attributes/cover.png": "f3d1d0a022771392019c760c6dcf88fc231a7f96d19e2eb61d89b3605e818463",
219224
"static/images/blog/announcing-image-transformations-pricing/cover.png": "dfdd070a46b5f8c66d7b4781cc3dc61faa10c80307882e206be0ff7d46ca77db",
220225
"static/images/blog/announcing-image-transformations-pricing/usage-component.png": "e24a8b710ea5de5ee2fe7c2c4507f54dccb3530a602027fc7a4265d5fc7b6eca",
@@ -355,7 +360,9 @@
355360
"static/images/blog/badge.png": "2d1852c6f826d55c40cb848cc3813f25a4d3d982a6f56d2738c9e5b3d0ac9694",
356361
"static/images/blog/Behind_the_pull_request_Stories_from_contributors.png": "16d81aff97deaded8b03c33f4498d3bf6f8ec392fee8edff6dc273d0cafbd132",
357362
"static/images/blog/best-backend-for-lovable-apps/cover.png": "579bcfe22908eee951880652a4075c0a26d34b661ab27e4f2c3708bdf717ceaf",
363+
"static/images/blog/best-backend-for-vibe-coding-apps/cover.png": "ee1433142c86983c47bde8a99329c0a774ebe5fc8a530b34e1c3944053334a90",
358364
"static/images/blog/best-free-static-website-hosting/cover.png": "022f31c5c5897d77ccfbfc2149ee81ed6f8a7bbaca91b5c3c09cd2b2e9432450",
365+
"static/images/blog/best-frontend-frameworks-for-vibe-coding/cover.png": "508261b8b8c5e3b27396c4e14e7a093f67c98060106068b8464b1f3f620b6397",
359366
"static/images/blog/best-ios-android-app-development-platform/cover.png": "68aa7d27a6c8265fc254663fb470f4ae1a436a34b85a0c06faa0776fedcdb2b5",
360367
"static/images/blog/best-pagination-technique/cover.png": "6c1cdf54285c0c181eb08f888d924e64919113d7d2fa85b24c8b5a44bd47e52a",
361368
"static/images/blog/best-pagination-technique/graph.png": "f62bfa341f17178991d50d40e62ff0c928cf2e62da13bd14648fa6d00a07d3b9",
@@ -428,6 +435,7 @@
428435
"static/images/blog/camp-5-barcelona/7.png": "4f1c87b922c2b5cb627066f50f557ee6f64c6632b4d647db49cf02d0dc555fd0",
429436
"static/images/blog/camp-5-barcelona/8.png": "af0875e9995d205531d42a67bb21f569e5cf677d5a00f3cfbb74280d001c36ac",
430437
"static/images/blog/camp-5-barcelona/cover.png": "4e92cec8cca906399c57464576cbda5f549f7879eb6fe1bf84831d160a49a2f9",
438+
"static/images/blog/can-vibe-coding-replace-junior-developers/cover.png": "741dc095303f9ec91572986452fc8ec3ce062acdfe2bdb84906fa7f58045335c",
431439
"static/images/blog/card1.png": "1d21440fde0e1cf722ce4940919e38afbcf92acd96138e7c7009cd72c969bd5e",
432440
"static/images/blog/card2.png": "b6dfff0e1e749f7e00e7e5f7d9652431d0b050f31955df346ed0a8f28257e89b",
433441
"static/images/blog/card3.png": "71058e9e838ae8c10a1a99babe541a5898c6063c3ec73f643990d7e99042432d",
@@ -520,6 +528,7 @@
520528
"static/images/blog/deploy-tanstack-start-app-to-appwrite-sites/cover.png": "4a35c5e6577c52a2b13413bdbf25e990084570816d511e7b420757296abfd29a",
521529
"static/images/blog/deploy-tanstack-start-app-to-appwrite-sites/deployed.png": "c8359daee78412da75fb70b4ce754bc13c798861a89954267befd37f72b41bd2",
522530
"static/images/blog/deploy-tanstack-start-app-to-appwrite-sites/repository-selection.png": "5b9b389682ba39f34b86771fed70c993aedf2d81590e4736714f98ca2ac4684c",
531+
"static/images/blog/deploy-vibe-coding-projects-to-production/cover.png": "618b550db308fe15f9405a505f3751e714763b278f17efc6dcafaa1d0a7c89a9",
523532
"static/images/blog/designing-init/cover.png": "069ffd2c62cada87502fbd35d1b3bdf39e38eb20168b8f2cf24cc58782e2d391",
524533
"static/images/blog/designing-init/day0.png": "bc3321f6883469f86b05343b111469af8fa755517757da0c1a234e4c1d381783",
525534
"static/images/blog/designing-init/day1.png": "d3ee8acf1db4a1a4e9985cc721db53a61c4bf59410751a24ccc453ad55c48d37",
@@ -592,6 +601,7 @@
592601
"static/images/blog/everything-new-with-appwrite-1.5/1.5-recap.png": "1d3c646f6902757152d98861630c1952631a54f222af7f8476f53f4d0d3c59f2",
593602
"static/images/blog/everything-new-with-appwrite-1.5/messaging-console.png": "769b7df74c9107a5ccacfe87722293adbfbd91ab702c79b03838c2368e9971ac",
594603
"static/images/blog/examples-of-vibe-coding/cover.png": "745d0e65c7981fe852b2e1797c3163cd4e4c147227b906cf305019137cb4624f",
604+
"static/images/blog/faster-storage-uploads-parallel-chunks/cover.png": "4565a9b19b4cafad3ed9ca3f2d4c6e4437379c5d10de6bad64dc1fb85590e49b",
595605
"static/images/blog/february-and-march-product-update-realtime-queries-appwrite-skills-and-new-database-features/Announcing_Appwrite_Skills__Give_your_AI_agents_Appwrite_expertise.png": "f6556f4786b55f53d06ca4c1a74ce0e488fa898099bf6458cab3e525f0a05d54",
596606
"static/images/blog/february-and-march-product-update-realtime-queries-appwrite-skills-and-new-database-features/Announcing_Realtime_Channel_helpers__Type-safe_subscriptions_made_simple.png": "a937f5b617fcbaa1d8d6af38f061f132a7590b85f93b104ee22119e80d5ed6d2",
597607
"static/images/blog/february-and-march-product-update-realtime-queries-appwrite-skills-and-new-database-features/comm_recoggg.png": "207e8acd544ebdd118f9aafb9d049dfa7fbb87868947d3df8b0fe86288848df0",
@@ -645,6 +655,7 @@
645655
"static/images/blog/gdpr-mobile-apps-guide/1.png": "d3521c227ad9fa7fce40e66caa3e3f5fc982cf95086c590cc0a326031f6646d5",
646656
"static/images/blog/gdpr-mobile-apps-guide/cover.png": "11d53b8884d5ca45e7d9ba8fb904633795886d30cff6cc06a6af6b9fb7d1225f",
647657
"static/images/blog/gdpr.png": "e253390207e4d3e0ff28d3a4b94bee549aa6c8dc040bce604f5c6ff746dd9a1b",
658+
"static/images/blog/gemini-3-5-flash-deep-dive/cover.png": "6b9257a7ba879bc37e7f81ca7d5c014e8760260dfd0d53d089016ed5c2f27f39",
648659
"static/images/blog/get-inspired-for-hackathon/1.png": "bdb21244945f4c483d23f84e5c429f548a45047a34d24d9c7f263cfca951ec3e",
649660
"static/images/blog/get-inspired-for-hackathon/2.png": "cec920ba9aa9996041e2b9134c52fdb09f91db307035334d458e47f6f116146c",
650661
"static/images/blog/get-inspired-for-hackathon/3.png": "87d6484adbe6049ab39bead992ffb57ab13bf1e1b3157b736f0bb5ad3ef1dde4",
@@ -673,6 +684,7 @@
673684
"static/images/blog/hf-2023-journey/kickoff-blr.png": "2b5d68282f769411fdc055ab39c32cccac9c0a274a2d6654ec1bbfc9621f4c8e",
674685
"static/images/blog/hf-hackathon-24/hf-hackathon.png": "b362912129d0e718c5dbc0cc80b42fb5174ac7e2efcc2386916eb69bb3e13645",
675686
"static/images/blog/hf-hackathon-24/prizes.png": "002988709aa990a4912206872ad28c14e92eb2fcf3e7cb693c5cfc2867e39e92",
687+
"static/images/blog/hidden-costs-of-vibe-coding-platforms/cover.png": "de4a875c6a5f65598838efbd877a3dc8b004362111447a63f85e640a71e85bd6",
676688
"static/images/blog/hipaa-compliance-for-web-apps-a-practical-guide/cover.png": "9aeedd01af7440a10220c53dbfa4355018000d2661d733fdcf7d047e04adbd11",
677689
"static/images/blog/hipaa.png": "251c39f22b8e7657db751351366d81a016d57643b45eccfa53eb5faa7baf3e24",
678690
"static/images/blog/hooks-appwrite-databases/cover.png": "9c3b307c3cc594932e513aad1023a982647d6c9fced513e46c61ba5669379154",
@@ -727,6 +739,7 @@
727739
"static/images/blog/how-to-set-up-sign-in-with-apple/enable-apple-oauth2.png": "f44dad97466f0d1c1f59bf99098b3ad6ad9111d71d11a9d127830bad5111a502",
728740
"static/images/blog/how-to-set-up-sign-in-with-apple/Image-1.png": "bc2776831c6c50975d696445c23bac8f8383aad782c0f20756170f12efbfae6d",
729741
"static/images/blog/how-to-set-up-sign-in-with-apple/Image-2.png": "88a6c0067983569ce4e7639161bf77b172c34b9eca29a58ac2333dfad279c9bb",
742+
"static/images/blog/how-vibe-coding-is-changing-software-development/cover.png": "d71da5d087b1435c8f80f700cafce466fb7e381a24507e5e8af4a516f00d89dd",
730743
"static/images/blog/image-classification.png": "7bc26761d3cf940a19911b23c8c309114e36b870dcf5259edbd24c8cceaa2df6",
731744
"static/images/blog/image-transformation-with-appwrite-storage/cover.png": "3885e03ff1f853f5e7e70dea1000018b7c74c47a7e28d3aa634ecc92e1c90ff3",
732745
"static/images/blog/implement-sign-in-with-github/cover.png": "e7e2433175cfa528ad63cbe5824e938c95057132c014caa148e08912d613f4db",
@@ -864,6 +877,7 @@
864877
"static/images/blog/open-source-backend-vs-managed-saas/cover.png": "5046fc4e3f3fa605c22d00ecb4b5156734c7d94000b49cae66a9e3bc49f81984",
865878
"static/images/blog/open-source-firebase-alternative/cover.png": "e0b98679795c00fd6d2d304b17273eaa6847bb1fc5706efa6cc3f3040ec6b4bb",
866879
"static/images/blog/open-source-regulated-environments/cover.png": "bbb57f0f8dc70f31923f34b5007f089a8539bdbca193c6f3a2594502bca551a2",
880+
"static/images/blog/openai-just-shipped-codex-to-the-chatgpt-mobile-app/cover.avif": "32abc0a488d7b7b8f2a4f5661801f415bb1cc1dc148768159bead6e5815c4bde",
867881
"static/images/blog/openjs.png": "4129893c1ea043b82af755a462fda8d78a7a5199638f84da549b2a2b29fbe976",
868882
"static/images/blog/oss-netlify-cover.png": "166487672a542d051b029ba285b703fc7f6c49d2fa27407f22c8f1848725120f",
869883
"static/images/blog/OSS-program.png": "b2cb73db872591b279e9b7ce87eb1c281732f394ef96a5d4e941ba3892924be7",
@@ -1203,6 +1217,8 @@
12031217
"static/images/blog/valentines-day-sonnet-generator/output.png": "be28db7b263851719a6fb7b72127dbe8578739fe4e02dac4a1805bf5e1a8f6cd",
12041218
"static/images/blog/valentines-day-sonnet-generator/templates.png": "e69192c1944e31f086780e91b034797af48bafe4f469631947f73bac50243503",
12051219
"static/images/blog/vibe-coding-security-best-practices/cover.png": "b0c69c03743fc542ff384da87d2cd733a85d1a057e654dc3bee1f572999a6500",
1220+
"static/images/blog/vibe-coding-security-mistakes/cover.png": "f3cfad1ebc8ea5034df673d0011ee87cfc98d0ef15986d75672988347ec29442",
1221+
"static/images/blog/vibe-coding-vs-traditional-development/cover.png": "ed973e32ed844c5bb24dff7946cb531d7cfc74e31fee5cd7208391f4feb6fc5d",
12061222
"static/images/blog/webp-support-for-safari/cover.png": "ea4e965ffe21500f3552073bb7ca325d453020cf095d67164329edbda3f1c799",
12071223
"static/images/blog/what-developers-actually-want-from-a-backend-platform/cover.png": "0c540d48b12cd7031e3cadaf4223086ded946b42dc283c641cfa024311b2ec36",
12081224
"static/images/blog/what-is-an-ai-backend/cover.png": "cb36f49035cbdcd97a70ac658783741f275d3a220b7cfd16b39d4fb86a929edd",
@@ -1384,6 +1400,8 @@
13841400
"static/images/docs/ai/vector-db/search-demo.png": "c31ee2582814be34f2e563a595bbc48e58301d588fa3f8156d15bc6ecba222b7",
13851401
"static/images/docs/assistant/ask-ai.png": "b2117420f13bc3fc370a925c47c949f7600adb9972e03c11d0e7d060a274c6fa",
13861402
"static/images/docs/assistant/dark/ask-ai.png": "6f1a42c688a0bf0890ace1b563422c1273b704febe52c7554739619bc2802ea0",
1403+
"static/images/docs/auth/email-policies/dark/policies.png": "6d3a4e03452d34ee8e6bd036db58fb9ec6f3a1a6d76bb932fb29ebef49be0145",
1404+
"static/images/docs/auth/email-policies/policies.png": "37e26e5f14d275978e1ca818f46d0daf2a6c56bf15255161ae4c2ac1ac55d5a5",
13871405
"static/images/docs/auth/ssr/dark/ssr.png": "3b80b80e061ada103e4f8e4bdf3c0a554db062aaed3f5f3a6b02f5f9c05859fa",
13881406
"static/images/docs/auth/ssr/ssr.png": "a9a58a3a053dbfec7eef50894d973049254ac9af4ed7159f93a5dd95dc0faf94",
13891407
"static/images/docs/command-center/command-center.png": "4e32c190ab1fbc74040c43b2d85a8404af9b553bb9672c1a842fee92ecd48b31",

bun.lock

Lines changed: 1 addition & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,14 @@
3232
"@statsig/session-replay": "^3.33.0",
3333
"@statsig/statsig-node-core": "^0.19.3",
3434
"@statsig/web-analytics": "^3.33.0",
35+
"@appwrite.io/specs": "github:appwrite/specs#6b06337a09f10503e6295d5d18e8dcd8490cd6e1",
3536
"h3": "^1.15.4",
3637
"sharp": "^0.34.5"
3738
},
3839
"devDependencies": {
3940
"@appwrite.io/console": "^0.6.4",
4041
"@appwrite.io/pink": "~0.26.0",
4142
"@appwrite.io/pink-icons": "~0.26.0",
42-
"@appwrite.io/specs": "github:appwrite/specs#6b06337a09f10503e6295d5d18e8dcd8490cd6e1",
4343
"@eslint/compat": "^1.4.1",
4444
"@eslint/js": "^9.39.1",
4545
"@fingerprintjs/fingerprintjs": "^4.6.2",
@@ -114,7 +114,6 @@
114114
"typescript-eslint": "^8.48.1",
115115
"vaul-svelte": "1.0.0-next.7",
116116
"vite": "^7.2.7",
117-
"vite-plugin-dynamic-import": "^1.6.0",
118117
"vite-plugin-image-optimizer": "^2.0.3",
119118
"vite-plugin-manifest-sri": "^0.2.0",
120119
"vitest": "^3.2.4",

scripts/build.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,25 @@
11
import { build } from 'vite';
2+
import { cp, mkdir } from 'node:fs/promises';
3+
import { createRequire } from 'node:module';
4+
import { dirname, resolve } from 'node:path';
5+
import { fileURLToPath } from 'node:url';
26

37
async function main() {
48
await build();
9+
10+
// Copy @appwrite.io/specs data into the build output so it ships with the
11+
// deployment archive and is reachable at runtime even in environments that
12+
// don't include node_modules (e.g. Appwrite Sites runtime, where only the
13+
// build artifact is mounted).
14+
const require = createRequire(import.meta.url);
15+
const specsRoot = dirname(require.resolve('@appwrite.io/specs/package.json'));
16+
const projectRoot = dirname(fileURLToPath(import.meta.url)).replace(/\/scripts$/, '');
17+
const target = resolve(projectRoot, 'build/_specs_data');
18+
19+
await mkdir(target, { recursive: true });
20+
await cp(resolve(specsRoot, 'specs'), resolve(target, 'specs'), { recursive: true });
21+
await cp(resolve(specsRoot, 'examples'), resolve(target, 'examples'), { recursive: true });
22+
console.log('[build] copied specs data to', target);
523
}
624

725
main();
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
{
2-
"stars": 55973,
3-
"fetchedAt": "2026-05-04T21:03:24.879Z"
2+
"stars": 55982,
3+
"fetchedAt": "2026-05-05T10:41:28.857Z"
44
}

src/partials/auth-security.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ Personal data includes the user's name, email, and phone number.
5555

5656
Disallowing personal data can be enabled in the Auth service's **Security** tab on the Appwrite Console.
5757

58+
# Email policies {% #email-policies %}
59+
60+
Email policies let you restrict which email addresses can sign up for your project. You can independently block free email providers, aliased addresses, and disposable email services to keep throwaway accounts, signup spam, and bot registrations out of your user base. Policies run at sign-up and on email updates, and existing users can still sign in even if their address would not pass the current policy.
61+
62+
Email policies can be enabled in the Auth service's **Security** tab on the Appwrite Console, or programmatically through the Project service. Learn more in the [Email policies](/docs/products/auth/email-policies) docs.
63+
5864
# Session alerts {% #session-alerts %}
5965

6066
Enable email alerts for your users so that whenever a new session is created for their account, they will be alerted with details about the sign-in. This helps users quickly spot unauthorized access and take action to secure their account.

0 commit comments

Comments
 (0)