From eb7f465429659cea146320b2249ea0d04c567c84 Mon Sep 17 00:00:00 2001 From: Chen Parnasa <50298160+chenparnasa@users.noreply.github.com> Date: Tue, 24 Feb 2026 18:10:25 +0200 Subject: [PATCH 01/13] feat: add AI section to homepage --- src/routes/(marketing)/(components)/ai.svelte | 88 +++++++++++++++++++ src/routes/(marketing)/+page.svelte | 2 + 2 files changed, 90 insertions(+) create mode 100644 src/routes/(marketing)/(components)/ai.svelte diff --git a/src/routes/(marketing)/(components)/ai.svelte b/src/routes/(marketing)/(components)/ai.svelte new file mode 100644 index 0000000000..5707c056aa --- /dev/null +++ b/src/routes/(marketing)/(components)/ai.svelte @@ -0,0 +1,88 @@ + + +
+
+
+

+ Scale with AI. + Boost workflows and agent capabilities +

+ +
+ {#each categories as category, i} + + {/each} +
+
+ +
+ {#each categories[active].features as feature} +
+

{feature.title}

+

{feature.description}

+
+ {/each} +
+
+
diff --git a/src/routes/(marketing)/+page.svelte b/src/routes/(marketing)/+page.svelte index b1d644a84b..c825703f23 100644 --- a/src/routes/(marketing)/+page.svelte +++ b/src/routes/(marketing)/+page.svelte @@ -12,6 +12,7 @@ import Pullquote from '$lib/components/marketing/pullquote.svelte'; import { FooterNav, MainFooter } from '$lib/components'; import LogoList from './(components)/logo-list.svelte'; + import Ai from './(components)/ai.svelte'; @@ -32,6 +33,7 @@ Just like a Swiss Army Knife you can choose and use the tools that you need with Appwrite. +
From dcd415170e769120454070b1a2403005fdbe26a2 Mon Sep 17 00:00:00 2001 From: Chen Parnasa <50298160+chenparnasa@users.noreply.github.com> Date: Wed, 25 Feb 2026 18:23:04 +0200 Subject: [PATCH 02/13] Refine AI section layout --- .../(components)/(ai-animations)/mcp.svelte | 49 ++++++ .../(ai-animations)/skills.svelte | 35 ++++ src/routes/(marketing)/(components)/ai.svelte | 154 +++++++++--------- 3 files changed, 163 insertions(+), 75 deletions(-) create mode 100644 src/routes/(marketing)/(components)/(ai-animations)/mcp.svelte create mode 100644 src/routes/(marketing)/(components)/(ai-animations)/skills.svelte diff --git a/src/routes/(marketing)/(components)/(ai-animations)/mcp.svelte b/src/routes/(marketing)/(components)/(ai-animations)/mcp.svelte new file mode 100644 index 0000000000..cdcd49fb93 --- /dev/null +++ b/src/routes/(marketing)/(components)/(ai-animations)/mcp.svelte @@ -0,0 +1,49 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/routes/(marketing)/(components)/(ai-animations)/skills.svelte b/src/routes/(marketing)/(components)/(ai-animations)/skills.svelte new file mode 100644 index 0000000000..d18431e0ec --- /dev/null +++ b/src/routes/(marketing)/(components)/(ai-animations)/skills.svelte @@ -0,0 +1,35 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/routes/(marketing)/(components)/ai.svelte b/src/routes/(marketing)/(components)/ai.svelte index 5707c056aa..4e656f54fc 100644 --- a/src/routes/(marketing)/(components)/ai.svelte +++ b/src/routes/(marketing)/(components)/ai.svelte @@ -1,88 +1,92 @@ -
-
-
-

- Scale with AI. - Boost workflows and agent capabilities -

+
+
+

+ Power your apps with AI +

-
- {#each categories as category, i} - - {/each} +
+ +
+ +
+

+ Use MCP to connect AI agents to your Appwrite backend. + No custom integrations required. +

+
+
+ + +
+ +
+

+ Define what AI agents can do, and how they should behave, + before shipping them to production. +

+
+
-
- {#each categories[active].features as feature} -
-

{feature.title}

-

{feature.description}

+ +
+
+ +
+ {#each tools as tool, i} + +
+ +
+
+ +
+
+ + + {tool.name} +
+
+
+
+
+ {/each}
- {/each} +
From 390b22eaac162500126d1182f754485c4a43b0c5 Mon Sep 17 00:00:00 2001 From: Chen Parnasa <50298160+chenparnasa@users.noreply.github.com> Date: Thu, 26 Feb 2026 14:06:11 +0200 Subject: [PATCH 03/13] refactor: AI section visuals --- .../(components)/(ai-animations)/mcp.svelte | 117 ++++++++++++++---- .../(ai-animations)/skills.svelte | 104 ++++++++++++++-- src/routes/(marketing)/(components)/ai.svelte | 4 +- 3 files changed, 188 insertions(+), 37 deletions(-) diff --git a/src/routes/(marketing)/(components)/(ai-animations)/mcp.svelte b/src/routes/(marketing)/(components)/(ai-animations)/mcp.svelte index cdcd49fb93..279fb59b7c 100644 --- a/src/routes/(marketing)/(components)/(ai-animations)/mcp.svelte +++ b/src/routes/(marketing)/(components)/(ai-animations)/mcp.svelte @@ -1,8 +1,66 @@ -
+
- - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - + + BACKEND + AGENTS + + + - - + + + + - + + + + + + + +
diff --git a/src/routes/(marketing)/(components)/(ai-animations)/skills.svelte b/src/routes/(marketing)/(components)/(ai-animations)/skills.svelte index d18431e0ec..8a5d59a8d4 100644 --- a/src/routes/(marketing)/(components)/(ai-animations)/skills.svelte +++ b/src/routes/(marketing)/(components)/(ai-animations)/skills.svelte @@ -1,8 +1,72 @@ -
+
- + + + + + - - - + + + + + + + + + - - - - + + + + - - - + + AGENT + RULES + + + + + SKILLS +
diff --git a/src/routes/(marketing)/(components)/ai.svelte b/src/routes/(marketing)/(components)/ai.svelte index 4e656f54fc..2406e12970 100644 --- a/src/routes/(marketing)/(components)/ai.svelte +++ b/src/routes/(marketing)/(components)/ai.svelte @@ -25,7 +25,7 @@
-
+

Use MCP to connect AI agents to your Appwrite backend. No custom integrations required. @@ -36,7 +36,7 @@
-
+

Define what AI agents can do, and how they should behave, before shipping them to production. From 2c099ba32bcf826da292254808631e5f5dafcdb4 Mon Sep 17 00:00:00 2001 From: Chen Parnasa <50298160+chenparnasa@users.noreply.github.com> Date: Thu, 26 Feb 2026 14:28:16 +0200 Subject: [PATCH 04/13] refactor: AI section visuals and run format to pass CI --- .../(components)/(ai-animations)/mcp.svelte | 48 ++++++++++-- .../(ai-animations)/skills.svelte | 75 ++++++++++++++++--- src/routes/(marketing)/(components)/ai.svelte | 23 ++++-- 3 files changed, 122 insertions(+), 24 deletions(-) diff --git a/src/routes/(marketing)/(components)/(ai-animations)/mcp.svelte b/src/routes/(marketing)/(components)/(ai-animations)/mcp.svelte index 279fb59b7c..4b3ecdf503 100644 --- a/src/routes/(marketing)/(components)/(ai-animations)/mcp.svelte +++ b/src/routes/(marketing)/(components)/(ai-animations)/mcp.svelte @@ -86,29 +86,65 @@ - + - BACKEND - AGENTS + BACKEND + AGENTS - + - + - + diff --git a/src/routes/(marketing)/(components)/(ai-animations)/skills.svelte b/src/routes/(marketing)/(components)/(ai-animations)/skills.svelte index 8a5d59a8d4..9f02bda576 100644 --- a/src/routes/(marketing)/(components)/(ai-animations)/skills.svelte +++ b/src/routes/(marketing)/(components)/(ai-animations)/skills.svelte @@ -77,39 +77,94 @@ preserveAspectRatio="xMidYMid meet" > - + - + - + - + - - + + - AGENT - RULES + AGENT + RULES - - SKILLS + + SKILLS

diff --git a/src/routes/(marketing)/(components)/ai.svelte b/src/routes/(marketing)/(components)/ai.svelte index 2406e12970..137b3b765b 100644 --- a/src/routes/(marketing)/(components)/ai.svelte +++ b/src/routes/(marketing)/(components)/ai.svelte @@ -11,17 +11,21 @@ { name: 'Windsurf', src: '/images/docs/mcp/logos/dark/windsurf.svg', primary: '#0EA5E9' }, { name: 'Claude', src: '/images/docs/mcp/logos/dark/claude.svg', primary: '#D97659' }, { name: 'OpenCode', src: '/images/docs/mcp/logos/dark/opencode.svg', primary: '#fff' }, - { name: 'Google Antigravity', src: '/images/docs/mcp/logos/dark/google-antigravity.svg', primary: '#4285F4' } + { + name: 'Google Antigravity', + src: '/images/docs/mcp/logos/dark/google-antigravity.svg', + primary: '#4285F4' + } ];
-

- Power your apps with AI -

+

Power your apps with AI

-
+
@@ -58,14 +62,17 @@ style="--primary-color:{tool.primary};--secondary-color:transparent" >
@@ -74,7 +81,7 @@ {tool.name}
Date: Sun, 1 Mar 2026 12:48:34 +0200 Subject: [PATCH 05/13] Update AI section title; add models and Compatibility scores to IDE tooltips --- src/routes/(marketing)/(components)/ai.svelte | 210 ++++++++++++++---- 1 file changed, 169 insertions(+), 41 deletions(-) diff --git a/src/routes/(marketing)/(components)/ai.svelte b/src/routes/(marketing)/(components)/ai.svelte index 137b3b765b..6573bdb8b6 100644 --- a/src/routes/(marketing)/(components)/ai.svelte +++ b/src/routes/(marketing)/(components)/ai.svelte @@ -6,22 +6,75 @@ import SkillsAnimation from './(ai-animations)/skills.svelte'; const tools = [ - { name: 'VS Code', src: '/images/docs/mcp/logos/dark/vscode.svg', primary: '#0078D7' }, - { name: 'Cursor', src: '/images/docs/mcp/logos/dark/cursor-ai.svg', primary: '#fff' }, - { name: 'Windsurf', src: '/images/docs/mcp/logos/dark/windsurf.svg', primary: '#0EA5E9' }, - { name: 'Claude', src: '/images/docs/mcp/logos/dark/claude.svg', primary: '#D97659' }, - { name: 'OpenCode', src: '/images/docs/mcp/logos/dark/opencode.svg', primary: '#fff' }, + { + name: 'VS Code', + model: 'GPT-5.3 Codex', + score: '99.2%', + src: '/images/docs/mcp/logos/dark/vscode.svg', + primary: '#0078D7' + }, + { + name: 'Cursor', + model: 'GPT-5.3 Codex', + score: '99.2%', + src: '/images/docs/mcp/logos/dark/cursor-ai.svg', + primary: '#fff' + }, + { + name: 'Windsurf', + model: 'Claude Opus 4.6', + score: '99.9%', + src: '/images/docs/mcp/logos/dark/windsurf.svg', + primary: '#0EA5E9' + }, + { + name: 'Claude', + model: 'Claude Opus 4.6', + score: '99.9%', + src: '/images/docs/mcp/logos/dark/claude.svg', + primary: '#D97659' + }, + { + name: 'OpenCode', + model: 'GPT-5.3 Codex', + score: '99.2%', + src: '/images/docs/mcp/logos/dark/opencode.svg', + primary: '#fff' + }, { name: 'Google Antigravity', + model: 'Gemini 3.1 Pro', + score: '98.1%', src: '/images/docs/mcp/logos/dark/google-antigravity.svg', primary: '#4285F4' } ]; + + let activeMobileIndex = $state(-1); + let mobileStrip: HTMLElement; + + function handleMobileTap(e: MouseEvent, i: number) { + e.stopPropagation(); + activeMobileIndex = activeMobileIndex === i ? -1 : i; + } + + function handleClickOutside(e: MouseEvent) { + if (mobileStrip && !mobileStrip.contains(e.target as Node)) { + activeMobileIndex = -1; + } + } + + $effect(() => { + document.addEventListener('click', handleClickOutside); + return () => document.removeEventListener('click', handleClickOutside); + });
-

Power your apps with AI

+

+ Streamline your AI workflows_ +

- -
- {#each tools as tool, i} - -
- + + +
+ + +
+
+ {#each tools as tool, i} + {/each}
- +
+ {#if activeMobileIndex >= 0} + {@const tool = tools[activeMobileIndex]} + {tool.name} + + {tool.model} + + Compatibility: {tool.score} + + {:else} +   +   + {/if} +
+
From b3739970cd1616a5cdf556ea5528a453e80755dc Mon Sep 17 00:00:00 2001 From: Chen Parnasa <50298160+chenparnasa@users.noreply.github.com> Date: Mon, 2 Mar 2026 16:52:39 +0200 Subject: [PATCH 06/13] feat: added benchmark preview to AI section --- src/routes/(marketing)/(components)/ai.svelte | 212 ++++++++++++------ 1 file changed, 140 insertions(+), 72 deletions(-) diff --git a/src/routes/(marketing)/(components)/ai.svelte b/src/routes/(marketing)/(components)/ai.svelte index 6573bdb8b6..b6076a4668 100644 --- a/src/routes/(marketing)/(components)/ai.svelte +++ b/src/routes/(marketing)/(components)/ai.svelte @@ -1,4 +1,5 @@ -
- - + +
- - - - - - - - + +
+ {#each Array(3) as _} +
+ {/each} +
- - - - - - - - - - + +
+ +
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
- - BACKEND - AGENTS +
+ {#each codeLines as line} +
+ {#if line.w !== '0'} +
+ {:else} +
+ {/if} +
+ {/each} +
+ + +
+ + Create a collection for user profiles - - + +
+
+ Setting up collection with email and name attributes. +
- - - - - + +
+ {#if typedText}{typedText}{:else}Ask anything...{/if} +
+ + + +
+
+
+
+
- - - - - - - - - - - - - - +
diff --git a/src/routes/(marketing)/(components)/(ai-animations)/skills.svelte b/src/routes/(marketing)/(components)/(ai-animations)/skills.svelte index 9f02bda576..0b125c5da7 100644 --- a/src/routes/(marketing)/(components)/(ai-animations)/skills.svelte +++ b/src/routes/(marketing)/(components)/(ai-animations)/skills.svelte @@ -1,62 +1,105 @@ -
-
-

+
+
+

Streamline your AI workflows_

-
+
-
+

- Use MCP to connect AI agents to your Appwrite backend. + MCP - Connect AI agents to your Appwrite backend. No custom integrations required.

- -
+ +

- Define what AI agents can do, and how they should behave, - before shipping them to production. + Skills - Teach AI agents your backend, + so they always make the right call.

@@ -235,61 +290,88 @@
-
-
- -
-

- Boost compatibility across AI models -

-

- Install the Appwrite Agent Skill to teach AI models how to work with your - backend. -

-
- - -
+
+ +
+

+ Works with every major LLM. + Find out how well your model integrates with Appwrite. +

+
+ +
+
- -
-
- Model - Compatibility -
-
- {#each models.slice(0, 3) as model, i (model.name)} - {@const isLast = i === 2} -
+
+ + + + + - - {model.name} - {model.provider} - - {animatedScores[i].toFixed(1)}%Overall + {#each categoryKeys as cat} + + {/each} + + + + {#each models as model, i (model.name)} + {@const isLast = i === models.length - 1} + + + - + + {#each categoryKeys as cat} + + {/each} + {/each} - - + +
Model
+
+ + {model.name} +
+
+ {animatedScores[i].toFixed(1)}% +
diff --git a/static/images/docs/mcp/logos/color/claude.svg b/static/images/docs/mcp/logos/color/claude.svg new file mode 100644 index 0000000000..ee4e2b11e2 --- /dev/null +++ b/static/images/docs/mcp/logos/color/claude.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/images/docs/mcp/logos/color/gemini.svg b/static/images/docs/mcp/logos/color/gemini.svg new file mode 100644 index 0000000000..fd7d65bc2c --- /dev/null +++ b/static/images/docs/mcp/logos/color/gemini.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/static/images/docs/mcp/logos/color/kimi.svg b/static/images/docs/mcp/logos/color/kimi.svg new file mode 100644 index 0000000000..77a23ad054 --- /dev/null +++ b/static/images/docs/mcp/logos/color/kimi.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/images/docs/mcp/logos/color/openai.svg b/static/images/docs/mcp/logos/color/openai.svg new file mode 100644 index 0000000000..5128622dd5 --- /dev/null +++ b/static/images/docs/mcp/logos/color/openai.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/images/docs/mcp/logos/dark/gemini.svg b/static/images/docs/mcp/logos/dark/gemini.svg new file mode 100644 index 0000000000..eb5161b2c2 --- /dev/null +++ b/static/images/docs/mcp/logos/dark/gemini.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/static/images/docs/mcp/logos/dark/kimi.svg b/static/images/docs/mcp/logos/dark/kimi.svg new file mode 100644 index 0000000000..9dd3f3fa10 --- /dev/null +++ b/static/images/docs/mcp/logos/dark/kimi.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/static/images/docs/mcp/logos/dark/opencode.svg b/static/images/docs/mcp/logos/dark/opencode.svg index 241ee076df..e9283459a9 100644 --- a/static/images/docs/mcp/logos/dark/opencode.svg +++ b/static/images/docs/mcp/logos/dark/opencode.svg @@ -1,4 +1,3 @@ - - + \ No newline at end of file From 60231eaa2719d27109e98f212d1ae9800fe34897 Mon Sep 17 00:00:00 2001 From: Harsh Mahajan Date: Mon, 9 Mar 2026 19:38:17 +0530 Subject: [PATCH 08/13] some fixes --- .env.example | 1 + .github/workflows/production.yml | 1 + .github/workflows/staging.yml | 1 + Dockerfile | 3 +++ src/lib/system.ts | 5 +++-- src/routes/(marketing)/(components)/ai.svelte | 8 +++++--- src/routes/threads/data.json/+server.ts | 4 ++-- 7 files changed, 16 insertions(+), 7 deletions(-) diff --git a/.env.example b/.env.example index 5f948ba787..7c8efb9f9a 100644 --- a/.env.example +++ b/.env.example @@ -7,6 +7,7 @@ PUBLIC_APPWRITE_PROJECT_ID= PUBLIC_APPWRITE_DASHBOARD=https://cloud.appwrite.io PUBLIC_APPWRITE_PROJECT_INIT_ID= PUBLIC_GROWTH_ENDPOINT= +PUBLIC_ARENA_ENDPOINT=https://arena.appwrite.network PUBLIC_POSTHOG_API_KEY= APPWRITE_DB_INIT_ID= APPWRITE_COL_INIT_ID= diff --git a/.github/workflows/production.yml b/.github/workflows/production.yml index a92c29c19d..5a708156a3 100644 --- a/.github/workflows/production.yml +++ b/.github/workflows/production.yml @@ -41,6 +41,7 @@ jobs: "PUBLIC_APPWRITE_FN_TLDR_ID=${{ vars.PUBLIC_APPWRITE_FN_TLDR_ID }}" "PUBLIC_APPWRITE_PROJECT_INIT_ID=${{ vars.PUBLIC_APPWRITE_PROJECT_INIT_ID }}" "PUBLIC_GROWTH_ENDPOINT=${{ vars.PUBLIC_GROWTH_ENDPOINT }}" + "PUBLIC_ARENA_ENDPOINT=${{ vars.PUBLIC_ARENA_ENDPOINT }}" "PUBLIC_POSTHOG_API_KEY=${{ vars.PUBLIC_POSTHOG_API_KEY }}" "APPWRITE_DB_INIT_ID=${{ secrets.APPWRITE_DB_INIT_ID }}" "APPWRITE_COL_INIT_ID=${{ secrets.APPWRITE_COL_INIT_ID }}" diff --git a/.github/workflows/staging.yml b/.github/workflows/staging.yml index 17fd24a773..f371bd4bab 100644 --- a/.github/workflows/staging.yml +++ b/.github/workflows/staging.yml @@ -42,6 +42,7 @@ jobs: "PUBLIC_APPWRITE_FN_TLDR_ID=${{ vars.PUBLIC_APPWRITE_FN_TLDR_ID }}" "PUBLIC_APPWRITE_PROJECT_INIT_ID=${{ vars.PUBLIC_APPWRITE_PROJECT_INIT_ID }}" "PUBLIC_GROWTH_ENDPOINT=${{ vars.PUBLIC_GROWTH_ENDPOINT }}" + "PUBLIC_ARENA_ENDPOINT=${{ vars.PUBLIC_ARENA_ENDPOINT }}" "PUBLIC_POSTHOG_API_KEY=${{ vars.PUBLIC_POSTHOG_API_KEY }}" "APPWRITE_DB_INIT_ID=${{ secrets.APPWRITE_DB_INIT_ID }}" "APPWRITE_COL_INIT_ID=${{ secrets.APPWRITE_COL_INIT_ID }}" diff --git a/Dockerfile b/Dockerfile index 2745ec5218..0d45ba6019 100644 --- a/Dockerfile +++ b/Dockerfile @@ -27,6 +27,9 @@ ENV PUBLIC_APPWRITE_PROJECT_INIT_ID ${PUBLIC_APPWRITE_PROJECT_INIT_ID} ARG PUBLIC_GROWTH_ENDPOINT ENV PUBLIC_GROWTH_ENDPOINT ${PUBLIC_GROWTH_ENDPOINT} +ARG PUBLIC_ARENA_ENDPOINT +ENV PUBLIC_ARENA_ENDPOINT ${PUBLIC_ARENA_ENDPOINT} + ARG PUBLIC_POSTHOG_API_KEY ENV PUBLIC_POSTHOG_API_KEY ${PUBLIC_POSTHOG_API_KEY} diff --git a/src/lib/system.ts b/src/lib/system.ts index d0ecd55fb8..537a0dbc28 100644 --- a/src/lib/system.ts +++ b/src/lib/system.ts @@ -1,8 +1,9 @@ import { dev } from '$app/environment'; -import { PUBLIC_GROWTH_ENDPOINT } from '$env/static/public'; +import { PUBLIC_GROWTH_ENDPOINT, PUBLIC_ARENA_ENDPOINT } from '$env/static/public'; export const VARS = { - GROWTH_ENDPOINT: PUBLIC_GROWTH_ENDPOINT ?? undefined + GROWTH_ENDPOINT: PUBLIC_GROWTH_ENDPOINT ?? undefined, + ARENA_ENDPOINT: PUBLIC_ARENA_ENDPOINT ?? undefined }; export const ENV = { diff --git a/src/routes/(marketing)/(components)/ai.svelte b/src/routes/(marketing)/(components)/ai.svelte index 9d5c225324..f028f6d948 100644 --- a/src/routes/(marketing)/(components)/ai.svelte +++ b/src/routes/(marketing)/(components)/ai.svelte @@ -1,4 +1,5 @@ + + +
+ +
+

+ Works with every major LLM. + Find out how well your model integrates with Appwrite. +

+
+ + +
+
+ + +
+ + + + + + + {#each categoryKeys as cat} + + {/each} + + + + {#each models as model, i (model.name)} + {@const isLast = i === models.length - 1} + + + + + {#each categoryKeys as cat} + + {/each} + + {/each} + +
ModelOverall
+
+ + {model.name} +
+
+ {animatedScores[i].toFixed(1)}% +
+
+
diff --git a/src/routes/(marketing)/(components)/ai.svelte b/src/routes/(marketing)/(components)/ai.svelte index f028f6d948..950fa2c69e 100644 --- a/src/routes/(marketing)/(components)/ai.svelte +++ b/src/routes/(marketing)/(components)/ai.svelte @@ -6,6 +6,7 @@ import { Tooltip } from 'bits-ui'; import McpAnimation from './(ai-animations)/mcp.svelte'; import SkillsAnimation from './(ai-animations)/skills.svelte'; + import AiTable from './ai-table.svelte'; const tools = [ { name: 'VS Code', src: '/images/docs/mcp/logos/dark/vscode.svg', primary: '#0078D7' }, @@ -24,127 +25,6 @@ } ]; - const models = [ - { - name: 'Claude Opus 4.6', - logo: '/images/docs/mcp/logos/dark/claude.svg', - colorLogo: '/images/docs/mcp/logos/color/claude.svg', - cost: '$5.00', - overall: 99.9, - categories: { - Auth: 100, - Databases: 100, - Functions: 100, - Storage: 99.5, - Sites: 100, - Messaging: 100 - } - }, - { - name: 'GPT 5.3 Codex', - logo: '/images/docs/mcp/logos/dark/openai.svg', - colorLogo: '/images/docs/mcp/logos/color/openai.svg', - cost: '$1.75', - overall: 99.2, - categories: { - Auth: 97.5, - Databases: 99, - Functions: 98.5, - Storage: 100, - Sites: 100, - Messaging: 99.5 - } - }, - { - name: 'Kimi K2.5', - logo: '/images/docs/mcp/logos/dark/kimi.svg', - colorLogo: '/images/docs/mcp/logos/color/kimi.svg', - cost: '$0.45', - overall: 99.2, - categories: { - Auth: 98.5, - Databases: 99.5, - Functions: 99.5, - Storage: 100, - Sites: 100, - Messaging: 97 - } - }, - { - name: 'Gemini 3.1 Pro', - logo: '/images/docs/mcp/logos/dark/gemini.svg', - colorLogo: '/images/docs/mcp/logos/color/gemini.svg', - cost: '$2.00', - overall: 98.1, - categories: { - Auth: 97, - Databases: 98.5, - Functions: 100, - Storage: 99, - Sites: 92, - Messaging: 100 - } - } - ]; - type ModelCategory = keyof (typeof models)[0]['categories']; - const categoryKeys = Object.keys(models[0].categories) as ModelCategory[]; - - // Score count-up animation - const START_VALUE = 90; - let scoreSection: HTMLElement; - let hasAnimated = $state(false); - let animatedScores = $state(models.map(() => START_VALUE)); - - function easeOutCubic(t: number): number { - return 1 - Math.pow(1 - t, 3); - } - - function animateScores() { - if (hasAnimated) return; - hasAnimated = true; - - const targets = models.map((m) => m.overall); - const duration = 1000; - const stagger = 100; - - models.forEach((_, i) => { - const delay = i * stagger; - const start = performance.now() + delay; - - function tick(now: number) { - const elapsed = now - start; - if (elapsed < 0) { - requestAnimationFrame(tick); - return; - } - const progress = Math.min(elapsed / duration, 1); - const eased = easeOutCubic(progress); - animatedScores[i] = START_VALUE + (targets[i] - START_VALUE) * eased; - - if (progress < 1) { - requestAnimationFrame(tick); - } - } - - requestAnimationFrame(tick); - }); - } - - $effect(() => { - if (!scoreSection) return; - const observer = new IntersectionObserver( - (entries) => { - if (entries[0].isIntersecting) { - animateScores(); - observer.disconnect(); - } - }, - { threshold: 0.2 } - ); - observer.observe(scoreSection); - return () => observer.disconnect(); - }); - let activeMobileIndex = $state(-1); let mobileStrip: HTMLElement; @@ -292,88 +172,5 @@
-
- -
-

- Works with every major LLM. - Find out how well your model integrates with Appwrite. -

-
- - -
-
- - -
- - - - - - - {#each categoryKeys as cat} - - {/each} - - - - {#each models as model, i (model.name)} - {@const isLast = i === models.length - 1} - - - - - {#each categoryKeys as cat} - - {/each} - - {/each} - -
ModelOverall
-
- - {model.name} -
-
- {animatedScores[i].toFixed(1)}% -
-
-
+
diff --git a/src/routes/api/arena/+server.ts b/src/routes/api/arena/+server.ts new file mode 100644 index 0000000000..bfc2bebfb6 --- /dev/null +++ b/src/routes/api/arena/+server.ts @@ -0,0 +1,20 @@ +import { json } from '@sveltejs/kit'; +import { VARS } from '$lib/system'; + +export async function GET() { + try { + const url = `${VARS.ARENA_ENDPOINT || 'https://arena.appwrite.network'}/api/summary/with-skills.json`; + const res = await fetch(url); + + if (!res.ok) { + throw new Error(`Arena API responded with status ${res.status}`); + } + + const data = await res.json(); + return json(data); + } catch (e) { + console.error('Failed to fetch arena data on server:', e); + // Default to returning an empty wrapper so the client can fail gracefully + return json({ models: [] }, { status: 500 }); + } +} From 3783e4d55574cf7e95b868a4a4e61055972fef4d Mon Sep 17 00:00:00 2001 From: Harsh Mahajan Date: Tue, 10 Mar 2026 13:31:54 +0530 Subject: [PATCH 11/13] opn in new tab instalkl skill --- src/routes/(marketing)/(components)/ai-table.svelte | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/routes/(marketing)/(components)/ai-table.svelte b/src/routes/(marketing)/(components)/ai-table.svelte index fad79b3193..508dde8d27 100644 --- a/src/routes/(marketing)/(components)/ai-table.svelte +++ b/src/routes/(marketing)/(components)/ai-table.svelte @@ -180,7 +180,12 @@ >

- +