From 470b047e60ad1f701f3911bc5b345c7141d61909 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sat, 18 Apr 2026 10:19:07 +0000 Subject: [PATCH 01/21] feat: add Premium Geo DB addon to project settings Adds a Premium Geo DB section to the project settings page so users can enable and disable the premium geolocation addon per-project on cloud. The section supports the full addon lifecycle: - Upgrade prompt when the current plan does not support the addon - Enable flow with optional 3DS payment authentication - Pending state with cancel & retry option - Active state with disable action - Scheduled-for-removal state with re-enable action Uses the new project-scoped SDK methods: listAddons, createPremiumGeoDBAddon, and deleteAddon. Bumps the @appwrite.io/console SDK pin accordingly. Co-Authored-By: Claude Opus 4.6 (1M context) --- bun.lock | 4 +- package.json | 2 +- .../settings/+page.svelte | 5 + .../settings/+page.ts | 15 +- .../settings/premiumGeoDB.svelte | 176 ++++++++++++++++++ .../settings/premiumGeoDBDisableModal.svelte | 54 ++++++ .../settings/premiumGeoDBEnableModal.svelte | 90 +++++++++ 7 files changed, 340 insertions(+), 6 deletions(-) create mode 100644 src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/settings/premiumGeoDBDisableModal.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/settings/premiumGeoDBEnableModal.svelte diff --git a/bun.lock b/bun.lock index 5e452c9474..f5a1514ea9 100644 --- a/bun.lock +++ b/bun.lock @@ -6,7 +6,7 @@ "name": "@appwrite/console", "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@f063676", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@febca4d", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", "@appwrite.io/pink-legacy": "^1.0.3", @@ -113,7 +113,7 @@ "@analytics/type-utils": ["@analytics/type-utils@0.6.4", "", {}, "sha512-Ou1gQxFakOWLcPnbFVsrPb8g1wLLUZYYJXDPjHkG07+5mustGs5yqACx42UAu4A6NszNN6Z5gGxhyH45zPWRxw=="], - "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@f063676", { "dependencies": { "json-bigint": "1.0.0" } }], + "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@febca4d", { "dependencies": { "json-bigint": "1.0.0" } }], "@appwrite.io/pink-icons": ["@appwrite.io/pink-icons@0.25.0", "", {}, "sha512-0O3i2oEuh5mWvjO80i+X6rbzrWLJ1m5wmv2/M3a1p2PyBJsFxN8xQMTEmTn3Wl/D26SsM7SpzbdW6gmfgoVU9Q=="], diff --git a/package.json b/package.json index 099ae9cb1b..b48a5f4ec4 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@f063676", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@febca4d", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", "@appwrite.io/pink-legacy": "^1.0.3", diff --git a/src/routes/(console)/project-[region]-[project]/settings/+page.svelte b/src/routes/(console)/project-[region]-[project]/settings/+page.svelte index 823f5a6e97..d422eb5472 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/+page.svelte @@ -17,6 +17,8 @@ import UpdateVariables from '../updateVariables.svelte'; import { page } from '$app/state'; import UpdateLabels from './updateLabels.svelte'; + import PremiumGeoDB from './premiumGeoDB.svelte'; + import { isCloud } from '$lib/system'; import { ID } from '@appwrite.io/console'; export let data; @@ -93,6 +95,9 @@ + {#if isCloud} + + {/if} { depends(Dependencies.PROJECT_VARIABLES); depends(Dependencies.PROJECT_INSTALLATIONS); + depends(Dependencies.ADDONS); const limit = PAGE_LIMIT; const offset = Number(url.searchParams.get('offset') ?? 0); const variablesOffset = Number(url.searchParams.get('variablesOffset') ?? 0); const projectSdk = sdk.forProject(params.region, params.project); - const [variables, installations] = await Promise.all([ + const [variables, installations, addons] = await Promise.all([ projectSdk.projectApi.listVariables({ queries: [Query.limit(limit), Query.offset(variablesOffset)] }), projectSdk.vcs.listInstallations({ queries: [Query.limit(limit), Query.offset(offset)] - }) + }), + isCloud + ? sdk + .forConsoleIn(params.region) + .projects.listAddons({ projectId: params.project }) + .catch(() => null) + : Promise.resolve(null) ]); return { @@ -24,6 +32,7 @@ export const load: PageLoad = async ({ depends, url, params }) => { offset, variablesOffset, variables, - installations + installations, + addons }; }; diff --git a/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte new file mode 100644 index 0000000000..6b27a1d8a2 --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte @@ -0,0 +1,176 @@ + + + + Premium Geo DB + Enrich session and request data with premium geolocation details such as timezone, postal code, ISP, + connection type, and organization. Useful for fine-grained analytics, fraud detection, and personalized + user experiences. + + +
+ Premium Geo DB +
+ {#if !planSupportsPremiumGeoDB && canUpgradeToPremiumGeoDB} +

+ Premium Geo DB is not available on your current plan. Upgrade your plan to + enable it. +

+ + {:else if !planSupportsPremiumGeoDB} +

+ Premium Geo DB is not available on your current plan. +

+ {:else if isPending} +
+ +
+

+ A payment is awaiting confirmation. If the payment was interrupted, you can + cancel and retry. +

+ + {:else if isActive} +
+ {#if isScheduledForRemoval} + + {:else} + + {/if} +
+

+ Premium Geo DB is enabled for this project. +

+ {#if isScheduledForRemoval} +

+ Premium Geo DB will be removed at the end of your current billing cycle. +

+ + {:else} + + {/if} + {:else} +

+ Enable Premium Geo DB for this project to collect detailed geolocation data on + every request. Billed prorated for your current cycle. +

+ + {/if} +
+
+
+ + + +{#if premiumGeoDBAddon} + +{/if} diff --git a/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDBDisableModal.svelte b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDBDisableModal.svelte new file mode 100644 index 0000000000..98a36efec6 --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDBDisableModal.svelte @@ -0,0 +1,54 @@ + + + +

+ Are you sure you want to disable the Premium Geo DB addon? The addon will remain active + until the end of your current billing cycle and will not be renewed. +

+ + + + + +
diff --git a/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDBEnableModal.svelte b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDBEnableModal.svelte new file mode 100644 index 0000000000..5a220fb7fc --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDBEnableModal.svelte @@ -0,0 +1,90 @@ + + + +

+ By clicking Enable, your payment method will be charged for the prorated amount for + the remaining days in your billing cycle, and the addon will be added to this project's + subscription for future cycles. +

+

+ Premium Geo DB enriches session and request data with premium geolocation details including + timezone, postal code, ISP, connection type, and organization. +

+ + + + + +
From 5954b7562fb5684e5e411b1fd97fc0b80847d433 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 19 Apr 2026 11:13:07 +0000 Subject: [PATCH 02/21] feat(settings): show price in premium geo DB enable dialog Mirrors the BAA addon UX by fetching the addon price via organizations.getAddonPrice(Addon.Premiumgeodb) from the settings page loader, passing it through to the Premium Geo DB card and enable modal, and rendering the monthly/prorated breakdown with formatCurrency alongside the Enable CTA. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../settings/+page.svelte | 2 +- .../settings/+page.ts | 18 +++-- .../settings/premiumGeoDB.svelte | 18 ++++- .../settings/premiumGeoDBEnableModal.svelte | 66 +++++++++++++++++-- 4 files changed, 90 insertions(+), 14 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/settings/+page.svelte b/src/routes/(console)/project-[region]-[project]/settings/+page.svelte index d422eb5472..8d41dcdc5c 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/+page.svelte @@ -96,7 +96,7 @@ {#if isCloud} - + {/if} { +export const load: PageLoad = async ({ depends, url, params, parent }) => { depends(Dependencies.PROJECT_VARIABLES); depends(Dependencies.PROJECT_INSTALLATIONS); depends(Dependencies.ADDONS); + const { project } = await parent(); const limit = PAGE_LIMIT; const offset = Number(url.searchParams.get('offset') ?? 0); const variablesOffset = Number(url.searchParams.get('variablesOffset') ?? 0); const projectSdk = sdk.forProject(params.region, params.project); - const [variables, installations, addons] = await Promise.all([ + const [variables, installations, addons, addonPrice] = await Promise.all([ projectSdk.projectApi.listVariables({ queries: [Query.limit(limit), Query.offset(variablesOffset)] }), @@ -24,6 +25,14 @@ export const load: PageLoad = async ({ depends, url, params }) => { .forConsoleIn(params.region) .projects.listAddons({ projectId: params.project }) .catch(() => null) + : Promise.resolve(null), + isCloud + ? sdk.forConsole.organizations + .getAddonPrice({ + organizationId: project.teamId, + addon: Addon.Premiumgeodb + }) + .catch(() => null) : Promise.resolve(null) ]); @@ -33,6 +42,7 @@ export const load: PageLoad = async ({ depends, url, params }) => { variablesOffset, variables, installations, - addons + addons, + addonPrice }; }; diff --git a/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte index 6b27a1d8a2..e2770fb7ef 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte @@ -9,12 +9,14 @@ import { Dependencies } from '$lib/constants'; import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; + import { formatCurrency } from '$lib/helpers/numbers'; import { Badge } from '@appwrite.io/pink-svelte'; import type { Models } from '@appwrite.io/console'; import PremiumGeoDBEnableModal from './premiumGeoDBEnableModal.svelte'; import PremiumGeoDBDisableModal from './premiumGeoDBDisableModal.svelte'; export let addons: Models.AddonList | null = null; + export let addonPrice: Models.AddonPrice | null = null; let showEnable = false; let showDisable = false; @@ -30,6 +32,7 @@ $: isPending = premiumGeoDBAddon?.status === 'pending'; $: isActive = premiumGeoDBAddon?.status === 'active'; $: isScheduledForRemoval = isActive && premiumGeoDBAddon?.nextValue === 0; + $: monthlyPriceLabel = addonPrice ? formatCurrency(addonPrice.monthlyPrice) : null; function hasUpgradeablePlanWithPremiumGeoDB(plan: Models.BillingPlan): boolean { if (!plan) return false; @@ -132,7 +135,11 @@ {/if}

- Premium Geo DB is enabled for this project. + {#if monthlyPriceLabel} + Premium Geo DB is enabled for this project at {monthlyPriceLabel}/month. + {:else} + Premium Geo DB is enabled for this project. + {/if}

{#if isScheduledForRemoval}

@@ -156,7 +163,12 @@ {:else}

Enable Premium Geo DB for this project to collect detailed geolocation data on - every request. Billed prorated for your current cycle. + every request.{#if monthlyPriceLabel} + This addon costs {monthlyPriceLabel}/month, prorated for your current + billing cycle. + {:else} + Billed prorated for your current cycle. + {/if}

+ + From 7e73d36e6a369953a4baa126d60bb7678c04ddf9 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 19 Apr 2026 11:55:08 +0000 Subject: [PATCH 03/21] update sdk --- bun.lock | 4 ++-- package.json | 4 ++-- .../settings/+page.ts | 22 +++++++++---------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/bun.lock b/bun.lock index f5a1514ea9..d749dbc87c 100644 --- a/bun.lock +++ b/bun.lock @@ -6,7 +6,7 @@ "name": "@appwrite/console", "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@febca4d", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@7df3842", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", "@appwrite.io/pink-legacy": "^1.0.3", @@ -113,7 +113,7 @@ "@analytics/type-utils": ["@analytics/type-utils@0.6.4", "", {}, "sha512-Ou1gQxFakOWLcPnbFVsrPb8g1wLLUZYYJXDPjHkG07+5mustGs5yqACx42UAu4A6NszNN6Z5gGxhyH45zPWRxw=="], - "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@febca4d", { "dependencies": { "json-bigint": "1.0.0" } }], + "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@7df3842", { "dependencies": { "json-bigint": "1.0.0" } }], "@appwrite.io/pink-icons": ["@appwrite.io/pink-icons@0.25.0", "", {}, "sha512-0O3i2oEuh5mWvjO80i+X6rbzrWLJ1m5wmv2/M3a1p2PyBJsFxN8xQMTEmTn3Wl/D26SsM7SpzbdW6gmfgoVU9Q=="], diff --git a/package.json b/package.json index b48a5f4ec4..0bb37b85c7 100644 --- a/package.json +++ b/package.json @@ -20,12 +20,12 @@ }, "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@febca4d", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@7df3842", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", "@appwrite.io/pink-legacy": "^1.0.3", "@appwrite.io/pink-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@8dcaa17", - "@faker-js/faker": "^9.9.0", + "@faker-js/faker": "^9.9.0", "@plausible-analytics/tracker": "^0.4.4", "@popperjs/core": "^2.11.8", "@sentry/sveltekit": "^8.55.1", diff --git a/src/routes/(console)/project-[region]-[project]/settings/+page.ts b/src/routes/(console)/project-[region]-[project]/settings/+page.ts index e43042e4f3..137e08e488 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/+page.ts +++ b/src/routes/(console)/project-[region]-[project]/settings/+page.ts @@ -4,11 +4,10 @@ import { sdk } from '$lib/stores/sdk'; import { Addon, Query } from '@appwrite.io/console'; import type { PageLoad } from './$types'; -export const load: PageLoad = async ({ depends, url, params, parent }) => { +export const load: PageLoad = async ({ depends, url, params }) => { depends(Dependencies.PROJECT_VARIABLES); depends(Dependencies.PROJECT_INSTALLATIONS); depends(Dependencies.ADDONS); - const { project } = await parent(); const limit = PAGE_LIMIT; const offset = Number(url.searchParams.get('offset') ?? 0); const variablesOffset = Number(url.searchParams.get('variablesOffset') ?? 0); @@ -22,17 +21,18 @@ export const load: PageLoad = async ({ depends, url, params, parent }) => { }), isCloud ? sdk - .forConsoleIn(params.region) - .projects.listAddons({ projectId: params.project }) - .catch(() => null) + .forConsoleIn(params.region) + .projects.listAddons({ projectId: params.project }) + .catch(() => null) : Promise.resolve(null), isCloud - ? sdk.forConsole.organizations - .getAddonPrice({ - organizationId: project.teamId, - addon: Addon.Premiumgeodb - }) - .catch(() => null) + ? sdk.forConsoleIn(params.region) + .projects + .getAddonPrice({ + projectId: params.project, + addon: Addon.Premiumgeodb + }) + .catch(() => null) : Promise.resolve(null) ]); From 0e53210ad1b107b79887df362c9af3545784b85e Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 19 Apr 2026 12:14:26 +0000 Subject: [PATCH 04/21] feat(billing): render project addons in breakdown + use server addon name - Each project row in the organization billing breakdown now iterates its resources for addon_* entries (amount > 0) and renders them as child rows (e.g. Premium Geo DB under the project it was enabled on). The backend already filters project-scoped addons out of the team-level resources response, so the org "Addons" section shows only org-scoped addons (BAA, premiumGeoDBOrg) while project-scoped ones surface where they belong. - Org-level addon labels now read addon.name from the UsageResource payload that the getAggregation endpoint populates from billingAddons config. Dropped the hard-coded billingAddonNames map so new addons surface with their proper name without a console update. Co-Authored-By: Claude Opus 4.7 (1M context) --- package.json | 2 +- .../billing/planSummary.svelte | 20 +++++++++++++------ .../settings/+page.ts | 20 +++++++++---------- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 0bb37b85c7..00b3e4d6cb 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", "@appwrite.io/pink-legacy": "^1.0.3", "@appwrite.io/pink-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@8dcaa17", - "@faker-js/faker": "^9.9.0", + "@faker-js/faker": "^9.9.0", "@plausible-analytics/tracker": "^0.4.4", "@popperjs/core": "^2.11.8", "@sentry/sveltekit": "^8.55.1", diff --git a/src/routes/(console)/organization-[organization]/billing/planSummary.svelte b/src/routes/(console)/organization-[organization]/billing/planSummary.svelte index 84683f8c66..987d1bca6d 100644 --- a/src/routes/(console)/organization-[organization]/billing/planSummary.svelte +++ b/src/routes/(console)/organization-[organization]/billing/planSummary.svelte @@ -249,10 +249,6 @@ }; // addons (additional members, projects, etc.) - const billingAddonNames: Record = { - addon_baa: 'HIPAA BAA' - }; - const addons = (currentAggregation?.resources || []) .filter( (r) => @@ -269,8 +265,8 @@ ? 'Additional members' : addon.resourceId === 'projects' ? 'Additional projects' - : (billingAddonNames[addon.resourceId] ?? - `${addon.resourceId} overage (${formatNum(addon.value)})`), + : addon.name || + `${addon.resourceId} overage (${formatNum(addon.value)})`, usage: '', price: formatCurrency(addon.amount) }, @@ -400,6 +396,18 @@ priceFormatter: ({ amount }) => formatCurrency(amount), includeProgress: false }), + ...resources + .filter((r) => r.resourceId?.startsWith('addon_') && (r.amount ?? 0) > 0) + .map((addon) => + createRow({ + id: `addon-${addon.resourceId}`, + label: addon.name || addon.resourceId, + resource: addon, + usageFormatter: ({ value }) => formatNum(value), + priceFormatter: ({ amount }) => formatCurrency(amount), + includeProgress: false + }) + ), createRow({ id: 'usage-details', label: `Usage details`, diff --git a/src/routes/(console)/project-[region]-[project]/settings/+page.ts b/src/routes/(console)/project-[region]-[project]/settings/+page.ts index 137e08e488..536eef036a 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/+page.ts +++ b/src/routes/(console)/project-[region]-[project]/settings/+page.ts @@ -21,18 +21,18 @@ export const load: PageLoad = async ({ depends, url, params }) => { }), isCloud ? sdk - .forConsoleIn(params.region) - .projects.listAddons({ projectId: params.project }) - .catch(() => null) + .forConsoleIn(params.region) + .projects.listAddons({ projectId: params.project }) + .catch(() => null) : Promise.resolve(null), isCloud - ? sdk.forConsoleIn(params.region) - .projects - .getAddonPrice({ - projectId: params.project, - addon: Addon.Premiumgeodb - }) - .catch(() => null) + ? sdk + .forConsoleIn(params.region) + .projects.getAddonPrice({ + projectId: params.project, + addon: Addon.Premiumgeodb + }) + .catch(() => null) : Promise.resolve(null) ]); From 13b04789450b506ee4615170791d947e4d1d7ba0 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 23 Apr 2026 01:11:24 +0000 Subject: [PATCH 05/21] chore: bump @appwrite.io/console SDK to 95547fc --- bun.lock | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index d749dbc87c..cf2eb304b5 100644 --- a/bun.lock +++ b/bun.lock @@ -6,7 +6,7 @@ "name": "@appwrite/console", "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@7df3842", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@95547fc", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", "@appwrite.io/pink-legacy": "^1.0.3", @@ -113,7 +113,7 @@ "@analytics/type-utils": ["@analytics/type-utils@0.6.4", "", {}, "sha512-Ou1gQxFakOWLcPnbFVsrPb8g1wLLUZYYJXDPjHkG07+5mustGs5yqACx42UAu4A6NszNN6Z5gGxhyH45zPWRxw=="], - "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@7df3842", { "dependencies": { "json-bigint": "1.0.0" } }], + "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@95547fc", { "dependencies": { "json-bigint": "1.0.0" } }], "@appwrite.io/pink-icons": ["@appwrite.io/pink-icons@0.25.0", "", {}, "sha512-0O3i2oEuh5mWvjO80i+X6rbzrWLJ1m5wmv2/M3a1p2PyBJsFxN8xQMTEmTn3Wl/D26SsM7SpzbdW6gmfgoVU9Q=="], diff --git a/package.json b/package.json index 00b3e4d6cb..5c40d1a666 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@7df3842", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@95547fc", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", "@appwrite.io/pink-legacy": "^1.0.3", From 304142cf908f7d8a0285f86b118a5f4e92af1edb Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 26 Apr 2026 05:16:33 +0000 Subject: [PATCH 06/21] chore: keep @appwrite.io/console@95547fc for premium geo DB SDK methods --- bun.lock | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index 10ce13d787..74cf4d8fe8 100644 --- a/bun.lock +++ b/bun.lock @@ -6,7 +6,7 @@ "name": "@appwrite/console", "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@88c189e", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@95547fc", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", "@appwrite.io/pink-legacy": "^1.0.3", @@ -124,7 +124,7 @@ "@analytics/type-utils": ["@analytics/type-utils@0.6.4", "", {}, "sha512-Ou1gQxFakOWLcPnbFVsrPb8g1wLLUZYYJXDPjHkG07+5mustGs5yqACx42UAu4A6NszNN6Z5gGxhyH45zPWRxw=="], - "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@88c189e", { "dependencies": { "json-bigint": "1.0.0" } }], + "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@95547fc", { "dependencies": { "json-bigint": "1.0.0" } }], "@appwrite.io/pink-icons": ["@appwrite.io/pink-icons@0.25.0", "", {}, "sha512-0O3i2oEuh5mWvjO80i+X6rbzrWLJ1m5wmv2/M3a1p2PyBJsFxN8xQMTEmTn3Wl/D26SsM7SpzbdW6gmfgoVU9Q=="], diff --git a/package.json b/package.json index a006833186..641fd4316a 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@88c189e", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@95547fc", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", "@appwrite.io/pink-legacy": "^1.0.3", From 67566dbadc7c3dcb6969db3f13f2dee30e78d49b Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 26 Apr 2026 05:19:14 +0000 Subject: [PATCH 07/21] Revert "chore: keep @appwrite.io/console@95547fc for premium geo DB SDK methods" This reverts commit 304142cf908f7d8a0285f86b118a5f4e92af1edb. --- bun.lock | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index 74cf4d8fe8..10ce13d787 100644 --- a/bun.lock +++ b/bun.lock @@ -6,7 +6,7 @@ "name": "@appwrite/console", "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@95547fc", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@88c189e", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", "@appwrite.io/pink-legacy": "^1.0.3", @@ -124,7 +124,7 @@ "@analytics/type-utils": ["@analytics/type-utils@0.6.4", "", {}, "sha512-Ou1gQxFakOWLcPnbFVsrPb8g1wLLUZYYJXDPjHkG07+5mustGs5yqACx42UAu4A6NszNN6Z5gGxhyH45zPWRxw=="], - "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@95547fc", { "dependencies": { "json-bigint": "1.0.0" } }], + "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@88c189e", { "dependencies": { "json-bigint": "1.0.0" } }], "@appwrite.io/pink-icons": ["@appwrite.io/pink-icons@0.25.0", "", {}, "sha512-0O3i2oEuh5mWvjO80i+X6rbzrWLJ1m5wmv2/M3a1p2PyBJsFxN8xQMTEmTn3Wl/D26SsM7SpzbdW6gmfgoVU9Q=="], diff --git a/package.json b/package.json index 641fd4316a..a006833186 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@95547fc", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@88c189e", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", "@appwrite.io/pink-legacy": "^1.0.3", From a54c530580145e24b9f6c7a40e18bd0b6a0599ea Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 30 Apr 2026 02:53:42 +0000 Subject: [PATCH 08/21] chore: update console SDK to 352239b --- bun.lock | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index 10ce13d787..ba8fe3f958 100644 --- a/bun.lock +++ b/bun.lock @@ -6,7 +6,7 @@ "name": "@appwrite/console", "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@88c189e", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@352239b", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", "@appwrite.io/pink-legacy": "^1.0.3", @@ -124,7 +124,7 @@ "@analytics/type-utils": ["@analytics/type-utils@0.6.4", "", {}, "sha512-Ou1gQxFakOWLcPnbFVsrPb8g1wLLUZYYJXDPjHkG07+5mustGs5yqACx42UAu4A6NszNN6Z5gGxhyH45zPWRxw=="], - "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@88c189e", { "dependencies": { "json-bigint": "1.0.0" } }], + "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@352239b", { "dependencies": { "json-bigint": "1.0.0" } }], "@appwrite.io/pink-icons": ["@appwrite.io/pink-icons@0.25.0", "", {}, "sha512-0O3i2oEuh5mWvjO80i+X6rbzrWLJ1m5wmv2/M3a1p2PyBJsFxN8xQMTEmTn3Wl/D26SsM7SpzbdW6gmfgoVU9Q=="], diff --git a/package.json b/package.json index a006833186..1f97cb821d 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@88c189e", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@352239b", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", "@appwrite.io/pink-legacy": "^1.0.3", From 0889ace4f3e591e25f1c5ca9f9cfc140c91bc37e Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Wed, 6 May 2026 01:57:15 +0000 Subject: [PATCH 09/21] feat(settings): rewrite Premium Geo DB card description to focus on developer value --- .../project-[region]-[project]/settings/premiumGeoDB.svelte | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte index e2770fb7ef..acb09ff8e1 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte @@ -88,9 +88,9 @@ Premium Geo DB - Enrich session and request data with premium geolocation details such as timezone, postal code, ISP, - connection type, and organization. Useful for fine-grained analytics, fraud detection, and personalized - user experiences. + Know exactly where your users are and how they're connecting. Tailor pricing, currency and language + by region, meet local compliance requirements, and catch risky sign-ins before they cause damage — + all without writing a line of geo lookup code.
From 6fbdd439be452204e37a59ab9084934248053fdc Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 7 May 2026 00:44:00 +0000 Subject: [PATCH 10/21] feat(settings): tighten Premium Geo DB card copy to outcome-focused variant --- .../project-[region]-[project]/settings/premiumGeoDB.svelte | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte index acb09ff8e1..64f4c2f861 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte @@ -88,9 +88,9 @@ Premium Geo DB - Know exactly where your users are and how they're connecting. Tailor pricing, currency and language - by region, meet local compliance requirements, and catch risky sign-ins before they cause damage — - all without writing a line of geo lookup code. + Give your project richer location intelligence on every user. Tailor pricing by region, surface + the right currency and language, comply with local regulations, and spot suspicious sign-ins + before they cause damage — all without leaving Appwrite.
From f8d28167cc50e26d91e92ad21b1fb973bb659937 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Mon, 11 May 2026 07:21:54 +0000 Subject: [PATCH 11/21] chore: update console SDK to 634f110 --- bun.lock | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index 8668a20baa..f06557fe68 100644 --- a/bun.lock +++ b/bun.lock @@ -6,7 +6,7 @@ "name": "@appwrite/console", "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@352239b", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@634f110", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", "@appwrite.io/pink-legacy": "^1.0.3", @@ -124,7 +124,7 @@ "@analytics/type-utils": ["@analytics/type-utils@0.6.4", "", {}, "sha512-Ou1gQxFakOWLcPnbFVsrPb8g1wLLUZYYJXDPjHkG07+5mustGs5yqACx42UAu4A6NszNN6Z5gGxhyH45zPWRxw=="], - "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@352239b", { "dependencies": { "json-bigint": "1.0.0" } }], + "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@634f110", { "dependencies": { "json-bigint": "1.0.0" } }], "@appwrite.io/pink-icons": ["@appwrite.io/pink-icons@0.25.0", "", {}, "sha512-0O3i2oEuh5mWvjO80i+X6rbzrWLJ1m5wmv2/M3a1p2PyBJsFxN8xQMTEmTn3Wl/D26SsM7SpzbdW6gmfgoVU9Q=="], diff --git a/package.json b/package.json index 1f97cb821d..3563b06a80 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@352239b", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@634f110", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", "@appwrite.io/pink-legacy": "^1.0.3", From 60838e0a6f6e8be733e0093a2a75a5057e444cbf Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Tue, 12 May 2026 07:23:18 +0000 Subject: [PATCH 12/21] fix(settings): handle 3DS redirect + replace cancel/retry with refresh for premium geoDB MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two missing pieces vs the BAA addon flow: 1. After Stripe redirects back from 3DS with ?type=confirm-addon&addonId=..., the page didn't read the query params or call the confirmations endpoint, so the addon stayed pending forever. Port the onMount handler from BAA.svelte. 2. The pending-state action was "Cancel & retry" which deleted the addon and forced a fresh 3DS flow. That's wasteful when the payment just needs a server-side status sync. Replace with "Refresh" — calls the confirmations endpoint, which live-queries Stripe and activates the addon if the PaymentIntent has transitioned to succeeded. Backend cleans up on 402. --- .../settings/premiumGeoDB.svelte | 110 ++++++++++++++---- 1 file changed, 90 insertions(+), 20 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte index 64f4c2f861..7d8a0b0739 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte @@ -1,11 +1,13 @@ diff --git a/src/routes/(console)/organization-[organization]/settings/Soc2Modal.svelte b/src/routes/(console)/organization-[organization]/settings/Soc2Modal.svelte index c4b3b645d1..34331de126 100644 --- a/src/routes/(console)/organization-[organization]/settings/Soc2Modal.svelte +++ b/src/routes/(console)/organization-[organization]/settings/Soc2Modal.svelte @@ -11,7 +11,7 @@ import type { Models } from '@appwrite.io/console'; export let show = false; - export let locale: Models.Locale; + export let locale: Models.CloudLocale; export let countryList: Models.CountryList; let email = ''; From 5b1b4fd53c06a001fda4fcd1d921060866de3bbb Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Tue, 19 May 2026 04:07:22 +0000 Subject: [PATCH 14/21] Bump console SDK to @2642dc5 (current cloud HEAD) Co-Authored-By: Claude Opus 4.7 --- bun.lock | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index e70dbae52d..ee0f40a142 100644 --- a/bun.lock +++ b/bun.lock @@ -6,7 +6,7 @@ "name": "@appwrite/console", "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@634f110", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@2642dc5", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", "@appwrite.io/pink-legacy": "^1.0.3", @@ -125,7 +125,7 @@ "@analytics/type-utils": ["@analytics/type-utils@0.6.4", "", {}, "sha512-Ou1gQxFakOWLcPnbFVsrPb8g1wLLUZYYJXDPjHkG07+5mustGs5yqACx42UAu4A6NszNN6Z5gGxhyH45zPWRxw=="], - "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@634f110", { "dependencies": { "json-bigint": "1.0.0" } }], + "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@2642dc5", { "dependencies": { "json-bigint": "1.0.0" } }], "@appwrite.io/pink-icons": ["@appwrite.io/pink-icons@0.25.0", "", {}, "sha512-0O3i2oEuh5mWvjO80i+X6rbzrWLJ1m5wmv2/M3a1p2PyBJsFxN8xQMTEmTn3Wl/D26SsM7SpzbdW6gmfgoVU9Q=="], diff --git a/package.json b/package.json index 553d5559c3..de34cd4cc3 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@634f110", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@2642dc5", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", "@appwrite.io/pink-legacy": "^1.0.3", From 0983d4c0f6f9678877c442642aaf732073363e72 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 25 Jun 2026 02:50:53 +0000 Subject: [PATCH 15/21] Bump console SDK to @dd8e255 --- bun.lock | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index ee0f40a142..84f7f89741 100644 --- a/bun.lock +++ b/bun.lock @@ -6,7 +6,7 @@ "name": "@appwrite/console", "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@2642dc5", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@dd8e255", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", "@appwrite.io/pink-legacy": "^1.0.3", @@ -125,7 +125,7 @@ "@analytics/type-utils": ["@analytics/type-utils@0.6.4", "", {}, "sha512-Ou1gQxFakOWLcPnbFVsrPb8g1wLLUZYYJXDPjHkG07+5mustGs5yqACx42UAu4A6NszNN6Z5gGxhyH45zPWRxw=="], - "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@2642dc5", { "dependencies": { "json-bigint": "1.0.0" } }], + "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@dd8e255", { "dependencies": { "json-bigint": "1.0.0" } }], "@appwrite.io/pink-icons": ["@appwrite.io/pink-icons@0.25.0", "", {}, "sha512-0O3i2oEuh5mWvjO80i+X6rbzrWLJ1m5wmv2/M3a1p2PyBJsFxN8xQMTEmTn3Wl/D26SsM7SpzbdW6gmfgoVU9Q=="], diff --git a/package.json b/package.json index de34cd4cc3..25adacb59c 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@2642dc5", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@dd8e255", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", "@appwrite.io/pink-legacy": "^1.0.3", From 300f3cee8b5bf7068e014a852a7cadbf1374b8fd Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Tue, 7 Jul 2026 16:01:35 +0545 Subject: [PATCH 16/21] fix(premiumGeoDB): handle 3DS PaymentAuthentication in re-enable flow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit handleReEnable discarded the createPremiumGeoDBAddon return value and always reported success. If the endpoint returns a PaymentAuthentication (payment/3DS required) instead of an Addon, the challenge was never initiated — the addon would sit in `pending` while the UI claimed it was re-enabled. Mirror the enable modal: detect the `clientSecret` branch and drive confirmPayment (which redirects to ?type=confirm-addon so the existing onMount handler completes the payment). Matches BAA.svelte's handleReEnable pattern. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../settings/premiumGeoDB.svelte | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte index 7d8a0b0739..c2124d4289 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDB.svelte @@ -11,6 +11,7 @@ import { Dependencies } from '$lib/constants'; import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; + import { confirmPayment } from '$lib/stores/stripe'; import { formatCurrency } from '$lib/helpers/numbers'; import { Badge } from '@appwrite.io/pink-svelte'; import type { Models } from '@appwrite.io/console'; @@ -137,9 +138,30 @@ async function handleReEnable() { reEnabling = true; try { - await sdk.forConsoleIn(page.params.region).projects.createPremiumGeoDBAddon({ - projectId: page.params.project - }); + const result: Models.Addon | Models.PaymentAuthentication = await sdk + .forConsoleIn(page.params.region) + .projects.createPremiumGeoDBAddon({ + projectId: page.params.project + }); + + // Re-enabling a scheduled-for-removal addon is normally free (already paid for + // the cycle), but the endpoint can still return a PaymentAuthentication if a + // charge is required. Mirror the enable modal so 3DS is not silently dropped. + if ('clientSecret' in result) { + const paymentAuth = result as unknown as Models.PaymentAuthentication; + const settingsUrl = resolve('/(console)/project-[region]-[project]/settings', { + region: page.params.region, + project: page.params.project + }); + await confirmPayment({ + clientSecret: paymentAuth.clientSecret, + paymentMethodId: $organization.paymentMethodId, + orgId: $organization.$id, + route: `${settingsUrl}?type=confirm-addon&addonId=${paymentAuth.addonId}` + }); + return; + } + await Promise.all([invalidate(Dependencies.ADDONS), invalidate(Dependencies.PROJECT)]); addNotification({ message: 'Premium Geo DB addon has been re-enabled', From a02d9cc16d0e0b9170baddfe721d4459ee5695ec Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Tue, 7 Jul 2026 16:11:49 +0545 Subject: [PATCH 17/21] fix(billing): friendly label for premium geo addon in project breakdown MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Project-scoped addon resources (addon_premiumGeoDB) are rebuilt by the cloud project aggregator without a `name` field, so the per-project breakdown rows — which used `addon.name || addon.resourceId` — rendered the raw resourceId. Add premium geo entries to billingAddonNamesFallback and apply the map in the breakdown rows too (previously only the top-level addons section used it), so the label degrades to "Premium Geo DB" instead of "addon_premiumGeoDB". Co-Authored-By: Claude Opus 4.8 (1M context) --- .../billing/planSummary.svelte | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/routes/(console)/organization-[organization]/billing/planSummary.svelte b/src/routes/(console)/organization-[organization]/billing/planSummary.svelte index 23d7c11a03..3142957a8e 100644 --- a/src/routes/(console)/organization-[organization]/billing/planSummary.svelte +++ b/src/routes/(console)/organization-[organization]/billing/planSummary.svelte @@ -299,7 +299,9 @@ // on the resource entry. Once the cloud rollout is complete this map can // be removed entirely. const billingAddonNamesFallback: Record = { - addon_baa: 'HIPAA BAA' + addon_baa: 'HIPAA BAA', + addon_premiumGeoDB: 'Premium Geo DB', + addon_premiumGeoDBOrg: 'Premium Geo DB' }; const addons = (currentAggregation?.resources || []) @@ -471,7 +473,10 @@ .map((addon) => createRow({ id: `addon-${addon.resourceId}`, - label: addon.name || addon.resourceId, + label: + addon.name || + billingAddonNamesFallback[addon.resourceId] || + addon.resourceId, resource: addon, usageFormatter: ({ value }) => formatNum(value), priceFormatter: ({ amount }) => formatCurrency(amount), From 411810b884b8f2a1460bbaccd45ec3dfc179ecc9 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 9 Jul 2026 11:31:38 +0545 Subject: [PATCH 18/21] chore(deps): bump @appwrite.io/console SDK to 051c615 Latest console SDK build with the project-level premium geo DB addon methods (createPremiumGeoDBAddon, confirmAddonPayment) resolving to the correct /projects/{projectId}/addons/... endpoints. --- bun.lock | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bun.lock b/bun.lock index 9a363e36e0..d2fc75a3c0 100644 --- a/bun.lock +++ b/bun.lock @@ -6,7 +6,7 @@ "name": "@appwrite/console", "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@4cd423c", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@051c615", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", "@appwrite.io/pink-legacy": "^1.0.3", @@ -126,15 +126,15 @@ "@analytics/type-utils": ["@analytics/type-utils@0.6.4", "", {}, "sha512-Ou1gQxFakOWLcPnbFVsrPb8g1wLLUZYYJXDPjHkG07+5mustGs5yqACx42UAu4A6NszNN6Z5gGxhyH45zPWRxw=="], - "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@4cd423c", { "dependencies": { "json-bigint": "1.0.0" } }], + "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@051c615", { "dependencies": { "json-bigint": "1.0.0" } }, "sha512-OBlGUyXhFiL5GMdXLzJMpaHLMKRMRB3XDfnarIEAMGVPegYqLPosbMaE/CEdDDeqlSoOpw8Yz4q5idgLc+/OIg=="], "@appwrite.io/pink-icons": ["@appwrite.io/pink-icons@0.25.0", "", {}, "sha512-0O3i2oEuh5mWvjO80i+X6rbzrWLJ1m5wmv2/M3a1p2PyBJsFxN8xQMTEmTn3Wl/D26SsM7SpzbdW6gmfgoVU9Q=="], - "@appwrite.io/pink-icons-svelte": ["@appwrite.io/pink-icons-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", { "peerDependencies": { "svelte": "^4.0.0" } }], + "@appwrite.io/pink-icons-svelte": ["@appwrite.io/pink-icons-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", { "peerDependencies": { "svelte": "^4.0.0" } }, "sha512-2HYl/CC2OlfZIR7LzbLXuSPBn0iNkjbnxpaeGCkZ7UNZ/hFeSeeWjDJqTBMdZ8+X95uuZqHx62XPTiE/svuSXQ=="], "@appwrite.io/pink-legacy": ["@appwrite.io/pink-legacy@1.0.3", "", { "dependencies": { "@appwrite.io/pink-icons": "1.0.0", "the-new-css-reset": "^1.11.2" } }, "sha512-GGde5fmPhs+s6/3aFeMPc/kKADG/gTFkYQSy6oBN8pK0y0XNCLrZZgBv+EBbdhwdtqVEWXa0X85Mv9w7jcIlwQ=="], - "@appwrite.io/pink-svelte": ["@appwrite.io/pink-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@8dcaa17", { "dependencies": { "@appwrite.io/pink-icons-svelte": "2.0.0-RC.1", "@floating-ui/dom": "^1.6.13", "@melt-ui/pp": "^0.3.2", "@melt-ui/svelte": "^0.86.6", "@tanstack/svelte-virtual": "^3.13.10", "ansicolor": "^2.0.3", "d3": "^7.9.0", "fuse.js": "^7.1.0", "pretty-bytes": "^6.1.1", "shiki": "^1.18.0", "svelte-motion": "^0.12.2", "svelte-sonner": "^0.3.28" }, "peerDependencies": { "svelte": "^4.0.0" } }], + "@appwrite.io/pink-svelte": ["@appwrite.io/pink-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@8dcaa17", { "dependencies": { "@appwrite.io/pink-icons-svelte": "2.0.0-RC.1", "@floating-ui/dom": "^1.6.13", "@melt-ui/pp": "^0.3.2", "@melt-ui/svelte": "^0.86.6", "@tanstack/svelte-virtual": "^3.13.10", "ansicolor": "^2.0.3", "d3": "^7.9.0", "fuse.js": "^7.1.0", "pretty-bytes": "^6.1.1", "shiki": "^1.18.0", "svelte-motion": "^0.12.2", "svelte-sonner": "^0.3.28" }, "peerDependencies": { "svelte": "^4.0.0" } }, "sha512-rw3zXN7/cUciCnhj0FR8M0H5Db+LYYMaKtPxvOAIMxNTBmStzU8kTw6grqIvdtFu9vybIsjKtIwm9QLHpNDBjA=="], "@asamuzakjp/css-color": ["@asamuzakjp/css-color@3.2.0", "", { "dependencies": { "@csstools/css-calc": "^2.1.3", "@csstools/css-color-parser": "^3.0.9", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "lru-cache": "^10.4.3" } }, "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw=="], diff --git a/package.json b/package.json index 047a17ec2f..722ebc2d98 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@4cd423c", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@051c615", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", "@appwrite.io/pink-legacy": "^1.0.3", From 42df78d57573bddc163a3984acef6c7a8d4357a1 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 9 Jul 2026 11:45:49 +0545 Subject: [PATCH 19/21] chore(deps): bump @appwrite.io/console SDK to 68c295a Latest console SDK build; project premium geo DB addon methods (createPremiumGeoDBAddon, confirmAddonPayment) resolve to the correct /projects/{projectId}/addons/... endpoints. --- bun.lock | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index a3fc470a33..11be84daa3 100644 --- a/bun.lock +++ b/bun.lock @@ -6,7 +6,7 @@ "name": "@appwrite/console", "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@051c615", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@68c295a", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", "@appwrite.io/pink-legacy": "^1.0.3", @@ -126,7 +126,7 @@ "@analytics/type-utils": ["@analytics/type-utils@0.6.4", "", {}, "sha512-Ou1gQxFakOWLcPnbFVsrPb8g1wLLUZYYJXDPjHkG07+5mustGs5yqACx42UAu4A6NszNN6Z5gGxhyH45zPWRxw=="], - "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@051c615", { "dependencies": { "json-bigint": "1.0.0" } }, "sha512-OBlGUyXhFiL5GMdXLzJMpaHLMKRMRB3XDfnarIEAMGVPegYqLPosbMaE/CEdDDeqlSoOpw8Yz4q5idgLc+/OIg=="], + "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@68c295a", { "dependencies": { "json-bigint": "1.0.0" } }, "sha512-P73khuGZlZwk2skLi21X7kdT5/7uwsELpeHUlRj6dqJx0QWiwNXKYksT0gAWhhtNcJPDATwm+/W0qT/lyHnbaw=="], "@appwrite.io/pink-icons": ["@appwrite.io/pink-icons@0.25.0", "", {}, "sha512-0O3i2oEuh5mWvjO80i+X6rbzrWLJ1m5wmv2/M3a1p2PyBJsFxN8xQMTEmTn3Wl/D26SsM7SpzbdW6gmfgoVU9Q=="], diff --git a/package.json b/package.json index 722ebc2d98..4ddff3cbd4 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@051c615", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@68c295a", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", "@appwrite.io/pink-legacy": "^1.0.3", From 6581c8ae8ab8a5e924d5f9e4d065ae93a0d9e9e1 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 16 Jul 2026 07:35:31 +0545 Subject: [PATCH 20/21] cicd: point e2e endpoint to cloud.staging.appwrite.io --- playwright.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/playwright.config.ts b/playwright.config.ts index c7fdc85350..03a4493b65 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -13,7 +13,7 @@ const config: PlaywrightTestConfig = { webServer: { timeout: 120000, env: { - PUBLIC_APPWRITE_ENDPOINT: 'https://stage.cloud.appwrite.io/v1', + PUBLIC_APPWRITE_ENDPOINT: 'https://cloud.staging.appwrite.io/v1', PUBLIC_CONSOLE_MODE: 'cloud', PUBLIC_APPWRITE_MULTI_REGION: 'true', PUBLIC_STRIPE_KEY: From 74e69fc42bab0075713d5de28d12456cfb5575bb Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 16 Jul 2026 07:47:38 +0545 Subject: [PATCH 21/21] fix(premiumGeoDB): inspect payment outcome on enable, mirror BAA flow --- .../settings/premiumGeoDBEnableModal.svelte | 42 ++++++++++++++++++- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDBEnableModal.svelte b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDBEnableModal.svelte index 322842dbec..9edc2b4910 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDBEnableModal.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/premiumGeoDBEnableModal.svelte @@ -39,12 +39,50 @@ region: page.params.region, project: page.params.project }); - await confirmPayment({ + const outcome = await confirmPayment({ clientSecret: paymentAuth.clientSecret, paymentMethodId: $organization.paymentMethodId, orgId: $organization.$id, - route: `${settingsUrl}?type=confirm-addon&addonId=${paymentAuth.addonId}` + route: `${settingsUrl}?type=confirm-addon&addonId=${paymentAuth.addonId}`, + redirectIfRequired: true }); + + if (!outcome || outcome.status === 'error') { + if (outcome?.status === 'error') { + error = outcome.message; + } + return; + } + + // 3DS challenge required — Stripe redirects; the settings onMount + // handler finalizes on return via ?type=confirm-addon. + if (outcome.status === 'requires_action') { + return; + } + + await sdk.forConsoleIn(page.params.region).projects.confirmAddonPayment({ + projectId: page.params.project, + addonId: paymentAuth.addonId + }); + + await Promise.all([ + invalidate(Dependencies.ADDONS), + invalidate(Dependencies.PROJECT) + ]); + + if (outcome.status === 'processing') { + addNotification({ + message: + "Premium Geo DB addon payment is processing — we'll activate it shortly.", + type: 'info' + }); + } else { + addNotification({ + message: 'Premium Geo DB addon has been enabled', + type: 'success' + }); + } + show = false; return; }