Skip to content

Commit

Permalink
Merge pull request #1578 from appwrite/perf-improvements
Browse files Browse the repository at this point in the history
Perf improvements
  • Loading branch information
thejessewinton authored Dec 30, 2024
2 parents 35f9799 + 75b2696 commit 7a3667a
Show file tree
Hide file tree
Showing 1,112 changed files with 163 additions and 9 deletions.
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@
"test": "npm run test:integration && npm run test:unit",
"test:integration": "playwright test",
"test:unit": "vitest",
"optimize": "node ./scripts/optimize-assets.js"
"optimize": "node ./scripts/optimize-assets.js",
"optimize:all": "node ./scripts/optimize-all.js"
},
"packageManager": "[email protected]+sha512.f549b8a52c9d2b8536762f99c0722205efc5af913e77835dbccc3b0b0b2ca9e7dc8022b78062c17291c48e88749c70ce88eb5a74f1fa8c4bf5e18bb46c8bd83a",
"dependencies": {
Expand Down
153 changes: 153 additions & 0 deletions scripts/optimize-all.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
import { readdirSync, statSync } from 'fs';
import { join, relative, resolve } from 'path';
import sharp from 'sharp';
import { fileURLToPath } from 'url';

const __dirname = fileURLToPath(new URL('.', import.meta.url));
const project_root = resolve(__dirname, '..');

// Directories to search in
const search_dirs = ['src', 'static', 'routes', 'lib'];

// Directories to skip
const excluded_dirs = ['node_modules', '.svelte-kit', 'build', '.git', 'assets/'];

/**
* @type {{
* jpeg: sharp.JpegOptions,
* webp: sharp.WebpOptions,
* png: sharp.PngOptions,
* gif: sharp.GifOptions,
* avif: sharp.AvifOptions
* }}
*/
const config = {
jpeg: {
quality: 100
},
webp: {
lossless: true
},
png: {
quality: 100
},
gif: {
quality: 100
},
avif: {
lossless: true
}
};

/** @type {sharp.ResizeOptions} */
const resize_config = {
width: 1280,
height: 1280,
fit: sharp.fit.inside,
withoutEnlargement: true
};

function* walk_directory(dir) {
try {
const files = readdirSync(dir);

for (const file of files) {
const pathToFile = join(dir, file);
const relativePath = relative(project_root, pathToFile);

// Skip excluded directories
if (excluded_dirs.some((excluded) => relativePath.includes(excluded))) {
continue;
}

const isDirectory = statSync(pathToFile).isDirectory();
if (isDirectory) {
yield* walk_directory(pathToFile);
} else {
yield pathToFile;
}
}
} catch (error) {
console.error(`Error accessing directory ${dir}:`, error.message);
}
}

function is_image(file) {
const extension = file.split('.').pop()?.toLowerCase();
return extension && Object.keys(config).includes(extension);
}

function format_size(bytes) {
const sizes = ['B', 'KB', 'MB'];
const i = Math.floor(Math.log(bytes) / Math.log(1024));
return `${(bytes / Math.pow(1024, i)).toFixed(2)} ${sizes[i]}`;
}

async function optimize_image(file) {
const is_animated = file.endsWith('.gif');
const image = sharp(file, { animated: is_animated });

try {
const size_before = (await image.toBuffer()).length;
const meta = await image.metadata();

if (!meta.format || !config[meta.format]) {
console.warn(`Unsupported format for file: ${file}`);
return;
}

const buffer = await image[meta.format](config[meta.format])
.resize(resize_config)
.toBuffer();
const size_after = buffer.length;

if (size_after >= size_before) {
console.log(`Skipping ${relative(project_root, file)} - no size reduction possible`);
return;
}

const savings = (((size_before - size_after) / size_before) * 100).toFixed(2);
console.log(`Optimizing ${relative(project_root, file)}`);
console.log(` Before: ${format_size(size_before)}`);
console.log(` After: ${format_size(size_after)}`);
console.log(` Saved: ${savings}%`);

await sharp(buffer).toFile(file);
} catch (error) {
console.error(`Error processing ${file}:`, error.message);
}
}

async function main() {
let total_files = 0;
let processed_files = 0;

console.log('Starting image optimization...\n');

for (const search_dir of search_dirs) {
const full_path = join(project_root, search_dir);

try {
if (!statSync(full_path).isDirectory()) continue;

for (const file of walk_directory(full_path)) {
if (!is_image(file)) continue;
total_files++;

await optimize_image(file);
processed_files++;
}
} catch (error) {
if (error.code === 'ENOENT') {
console.log(`Directory ${search_dir} not found - skipping`);
} else {
console.error(`Error processing ${search_dir}:`, error.message);
}
}
}

console.log(`\nOptimization complete!`);
console.log(`Processed ${processed_files} of ${total_files} image files`);
}

await main();
Binary file modified src/lib/animations/Products/(assets)/auth-shot.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/lib/animations/Products/(assets)/db-shot.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/lib/animations/Products/(assets)/fn-shot.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/lib/animations/Products/(assets)/messaging-shot.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/lib/animations/Products/(assets)/realtime-shot.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/lib/animations/Products/(assets)/storage-shot.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions src/lib/components/MainNav.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,15 @@
{#each links as link}
<li class="web-main-header-nav-item text-primary hover:text-accent">
{#if link.submenu}
<button
<div
class="web-main-header-nav-item-button"
aria-haspopup="true"
aria-expanded="false"
aria-controls="submenu"
data-submenu-button
>
<svelte:component this={link.submenu} label={link.label} />
</button>
</div>
{:else}
<a
class={classNames(
Expand Down
4 changes: 2 additions & 2 deletions src/lib/components/ProductsSubmenu.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@
export let label: string;
</script>

<li
<button
class={classNames(
'text-primary focus:text-accent hover:text-accent inline-flex cursor-pointer items-center justify-between outline-none',
{
Expand All @@ -99,7 +99,7 @@
'rotate-180': $open
})}
/>
</li>
</button>

<div
use:melt={$menu}
Expand Down
8 changes: 4 additions & 4 deletions src/routes/+page.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import MainFooter from '../lib/components/MainFooter.svelte';
import DeveloperCard from './DeveloperCard.svelte';
import { PUBLIC_APPWRITE_DASHBOARD } from '$env/static/public';
import CoverImage from './dashboard.png';
import CoverImage from './dashboard.webp';
import Hero from '$lib/components/ui/Hero.svelte';
import GradientText from '$lib/components/ui/GradientText.svelte';
import Badge from '$lib/components/ui/Badge.svelte';
Expand Down Expand Up @@ -93,7 +93,7 @@
<enhanced:img
style="width:1466px; height:804px; transform:rotate(150.348deg); opacity: 0.65; filter: blur(127.5px);
max-block-size: unset; max-inline-size: unset;"
src="./top-page-dark.png"
src="./top-page-dark.webp"
alt=""
/>
</div>
Expand All @@ -104,7 +104,7 @@
style="top: 22rem; left: 54%; translate: calc(-50% - 900px); width: 75.9375rem;"
class:web-u-hide-mobile={$isMobileNavOpen}
>
<img src="/images/bgs/hero-lines-1.png" alt="" />
<img src="/images/bgs/hero-lines-1.webp" alt="" />
</div>

<div
Expand All @@ -113,7 +113,7 @@
class:web-u-hide-mobile={$isMobileNavOpen}
>
<div style="left: 0;">
<img src="/images/bgs/hero-lines-2.png" alt="" />
<img src="/images/bgs/hero-lines-2.webp" alt="" />
</div>
</div>

Expand Down
Binary file modified src/routes/company/bg-left.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/routes/company/bg-right.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/routes/contact-us/bg.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed src/routes/dashboard.png
Binary file not shown.
Binary file added src/routes/dashboard.webp
Binary file not shown.
Binary file modified src/routes/docs/blur-1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/routes/docs/blur-2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/routes/education/(assets)/chat.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/routes/heroes/bg-pre.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/routes/heroes/teal-blur.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/routes/init-0/(assets)/2fa.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/routes/init-0/(assets)/console.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/routes/init-0/(assets)/day-1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/routes/init-0/(assets)/enum.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/routes/init-0/(assets)/integrations.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/routes/init-0/(assets)/messaging-1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/routes/init-0/(assets)/messaging.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/routes/init-0/(assets)/mock/ticket-0.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/routes/init-0/(assets)/mock/ticket-1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/routes/init-0/(assets)/mock/ticket-10.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/routes/init-0/(assets)/mock/ticket-11.png
Binary file modified src/routes/init-0/(assets)/mock/ticket-12.png
Binary file modified src/routes/init-0/(assets)/mock/ticket-2.png
Binary file modified src/routes/init-0/(assets)/mock/ticket-3.png
Binary file modified src/routes/init-0/(assets)/mock/ticket-4.png
Binary file modified src/routes/init-0/(assets)/mock/ticket-5.png
Binary file modified src/routes/init-0/(assets)/mock/ticket-6.png
Binary file modified src/routes/init-0/(assets)/mock/ticket-7.png
Binary file modified src/routes/init-0/(assets)/mock/ticket-8.png
Binary file modified src/routes/init-0/(assets)/mock/ticket-9.png
Binary file modified src/routes/init-0/(assets)/operators.png
Binary file modified src/routes/init-0/(assets)/ssr.png
Binary file modified src/routes/init-0/(assets)/swag.png
Binary file modified src/routes/init-0/(assets)/thumbnail-1.png
Binary file modified src/routes/init-0/(assets)/thumbnail-2fa-event.png
Binary file modified src/routes/init-0/(assets)/thumbnail-2fa-product.png
Binary file modified src/routes/init-0/(assets)/thumbnail-2fa.png
Binary file modified src/routes/init-0/(assets)/thumbnail-db-event.png
Binary file modified src/routes/init-0/(assets)/thumbnail-db-product.png
Binary file modified src/routes/init-0/(assets)/thumbnail-db.png
Binary file modified src/routes/init-0/(assets)/thumbnail-messaging-product.png
Binary file modified src/routes/init-0/(assets)/thumbnail-messaging.png
Binary file modified src/routes/init-0/(assets)/thumbnail-runtimes-event.png
Binary file modified src/routes/init-0/(assets)/thumbnail-ssr-product.png
Binary file modified src/routes/init-0/(assets)/thumbnail-ssr.png
Binary file modified src/routes/init-0/(assets)/ticket.png
Binary file modified src/routes/init/(assets)/console.png
Binary file modified src/routes/init/(assets)/day-0/swag-thumb.png
Binary file modified src/routes/init/(assets)/day-0/video-thumb.png
Binary file modified src/routes/init/(assets)/day-1/discord-day-2.png
Binary file modified src/routes/init/(assets)/day-1/video-thumb.png
Binary file modified src/routes/init/(assets)/day-2/video-thumb.png
Binary file modified src/routes/init/(assets)/discord/day-0.png
Binary file modified src/routes/init/(assets)/discord/day-1.png
Binary file modified src/routes/init/(assets)/discord/day-2.png
Binary file modified src/routes/init/(assets)/discord/day-3.png
Binary file modified src/routes/init/(assets)/discord/day-4.png
Binary file modified src/routes/init/(assets)/mock-thumb.png
Binary file modified src/routes/init/(assets)/swag-giveaway.png
Binary file modified src/routes/integrations/technology-partner/bg.png
Binary file modified src/routes/integrations/technology-partner/blue-bg.png
Binary file modified src/routes/oss-program/bg.png
Binary file modified src/routes/pricing/bg.png
Binary file modified src/routes/products/auth/(assets)/hero-bg.png
Binary file modified src/routes/products/auth/(assets)/identity-bg.png
Binary file modified src/routes/products/auth/(assets)/permissions-console.png
Binary file modified src/routes/products/auth/(assets)/phone-mobile.png
Binary file modified src/routes/products/auth/(assets)/phone.png
Binary file modified src/routes/products/auth/(assets)/teams-console.png
Binary file modified src/routes/products/functions/(assets)/avatar.png
Binary file modified src/routes/products/functions/(assets)/checkout-window.png
Binary file modified src/routes/products/functions/(assets)/deploy-window.png
Binary file modified src/routes/products/functions/(assets)/hat.png
Binary file modified src/routes/products/functions/(assets)/hero-bg.png
Binary file modified src/routes/products/functions/(assets)/identity-bg.png
Binary file modified src/routes/products/functions/(assets)/local-dev.png
Binary file modified src/routes/products/functions/(assets)/phone-mobile.png
Binary file modified src/routes/products/functions/(assets)/phone.png
Binary file modified src/routes/products/functions/(assets)/shirt.png
Binary file modified src/routes/products/messaging/(assets)/appwrite.png
Binary file modified src/routes/products/messaging/(assets)/draft.png
Binary file modified src/routes/products/messaging/(assets)/message.png
Binary file modified src/routes/products/storage/(assets)/hero-image.png
Binary file modified src/routes/products/storage/(assets)/product-preview.png
Binary file modified src/routes/startups/(assets)/bg-left.png
Binary file modified src/routes/startups/(assets)/bg-right.png
Binary file modified src/routes/threads/(assets)/empty-state.png
Binary file removed src/routes/top-page-dark.png
Diff not rendered.
Binary file added src/routes/top-page-dark.webp
Binary file not shown.
Binary file modified static/email/footer.png
Binary file modified static/favicon.png
Binary file modified static/images/animations/tech-dark-transparent.png
Binary file modified static/images/animations/tech-dark.png
Binary file modified static/images/animations/tech-light-transparent.png
Binary file modified static/images/animations/tech-light.png
Binary file modified static/images/avatars/aditya.png
Binary file modified static/images/avatars/arman.png
Binary file modified static/images/avatars/binyamin.png
Binary file modified static/images/avatars/bradley.png
Binary file modified static/images/avatars/caio.png
Binary file modified static/images/avatars/carla.png
Binary file modified static/images/avatars/chen.png
Binary file modified static/images/avatars/christy.png
Binary file modified static/images/avatars/damodar.png
Binary file modified static/images/avatars/dennis.png
Binary file modified static/images/avatars/dylan.png
Binary file modified static/images/avatars/ebenezer.png
Binary file modified static/images/avatars/elad.png
Binary file modified static/images/avatars/eldad.png
Binary file modified static/images/avatars/emma.png
Binary file modified static/images/avatars/haimantika.png
Binary file modified static/images/avatars/holly.png
Binary file modified static/images/avatars/jade.png
Binary file modified static/images/avatars/jake.png
Binary file modified static/images/avatars/jesse.png
Binary file modified static/images/avatars/kushboo.png
Binary file modified static/images/avatars/laura.png
Binary file modified static/images/avatars/luke.png
Binary file modified static/images/avatars/matej.png
Binary file modified static/images/avatars/may.png
Binary file modified static/images/avatars/sara.png
Binary file modified static/images/avatars/shimon.png
Binary file modified static/images/avatars/shmuel.png
Binary file modified static/images/avatars/steven.png
Binary file modified static/images/avatars/tessa.png
Binary file modified static/images/avatars/thomas.png
Binary file modified static/images/avatars/torsten.png
Binary file modified static/images/avatars/vincent.png
Binary file modified static/images/avatars/wess.png
Binary file modified static/images/bgs/auth-hero.png
Binary file modified static/images/bgs/checker-bg.png
Binary file modified static/images/bgs/contact-us.png
Binary file modified static/images/bgs/diagonal-lines.png
Binary file removed static/images/bgs/hero-lines-1.png
Diff not rendered.
Binary file added static/images/bgs/hero-lines-1.webp
Binary file not shown.
Binary file removed static/images/bgs/hero-lines-2.png
Diff not rendered.
Binary file added static/images/bgs/hero-lines-2.webp
Binary file not shown.
Binary file modified static/images/bgs/hero.png
Binary file modified static/images/bgs/heroes-pre.png
Binary file modified static/images/bgs/mint-gradient.png
Binary file modified static/images/bgs/mobile-auth-hero.png
Binary file modified static/images/bgs/mobile-hero.png
Binary file modified static/images/bgs/pre-footer.png
Binary file modified static/images/bgs/purple-gradient.png
Binary file modified static/images/bgs/top-page-light.png
Binary file modified static/images/blog/15-git-cli-tips/cover.png
Binary file modified static/images/blog/7-steps-gdpr-startups/cover.png
Binary file modified static/images/blog/Blog-cover-oss-journey.png
Binary file modified static/images/blog/OSS-program.png
Binary file modified static/images/blog/Torsten-GitHub-profile.png
Binary file modified static/images/blog/a-recap-of-init/init1.png
Binary file modified static/images/blog/a-recap-of-init/init10.png
Binary file modified static/images/blog/a-recap-of-init/init11.png
Binary file modified static/images/blog/a-recap-of-init/init12.png
Binary file modified static/images/blog/a-recap-of-init/init13.png
Binary file modified static/images/blog/a-recap-of-init/init14.png
Binary file modified static/images/blog/a-recap-of-init/init15.png
Binary file modified static/images/blog/a-recap-of-init/init16.png
Binary file modified static/images/blog/a-recap-of-init/init17.png
Binary file modified static/images/blog/a-recap-of-init/init18.png
Binary file modified static/images/blog/a-recap-of-init/init19.png
Binary file modified static/images/blog/a-recap-of-init/init2.png
Binary file modified static/images/blog/a-recap-of-init/init20.png
Binary file modified static/images/blog/a-recap-of-init/init21.png
Binary file modified static/images/blog/a-recap-of-init/init3.png
Binary file modified static/images/blog/a-recap-of-init/init4.png
Binary file modified static/images/blog/a-recap-of-init/init5.png
Binary file modified static/images/blog/a-recap-of-init/init6.png
Binary file modified static/images/blog/a-recap-of-init/init7.png
Binary file modified static/images/blog/a-recap-of-init/init8.png
Binary file modified static/images/blog/a-recap-of-init/init9.png
Binary file modified static/images/blog/a-recap-of-init/the-recap.png
Binary file modified static/images/blog/a-recap-of-init/thumbnails/thumbnail-1.png
Binary file modified static/images/blog/a-recap-of-init/thumbnails/thumbnail-2fa.png
Binary file modified static/images/blog/a-recap-of-init/thumbnails/thumbnail-db.png
Binary file modified static/images/blog/a-recap-of-init/thumbnails/thumbnail-ssr.png
Binary file modified static/images/blog/accessibility-in-pink-design/cover.png
Binary file modified static/images/blog/add-a-search-function-to-your-app/connect.png
Binary file modified static/images/blog/add-a-search-function-to-your-app/cover.png
Binary file modified static/images/blog/adding-url-shortener/connect.png
Binary file modified static/images/blog/adding-url-shortener/cover.png
Binary file modified static/images/blog/adding-url-shortener/functions.png
Binary file modified static/images/blog/adding-url-shortener/shortener.png
Binary file modified static/images/blog/adding-url-shortener/variables.png
Binary file modified static/images/blog/ai-announcement.png
Binary file modified static/images/blog/ai-crystal-ball/cover.png
Binary file modified static/images/blog/ai-crystal-ball/github.png
Binary file modified static/images/blog/ai-crystal-ball/oauth.png
Binary file modified static/images/blog/ai-crystal-ball/openai.png
Binary file modified static/images/blog/ai-docs.png
Binary file modified static/images/blog/ai-function-templates.png
Binary file modified static/images/blog/ai-threads.png
Binary file modified static/images/blog/announcing-2fa.png
Binary file modified static/images/blog/announcing-appwrite-pro/credits.png
Binary file modified static/images/blog/announcing-appwrite-pro/header.png
Binary file modified static/images/blog/announcing-appwrite-pro/pro.png
Binary file modified static/images/blog/announcing-bun-and-dart/bun-and-dart.png
Binary file modified static/images/blog/appwrite-1.5-now-available-on-cloud/cloud15.png
Binary file modified static/images/blog/appwrite-backups-and-restores/cover.png
Binary file modified static/images/blog/appwrite-competitor-comparison/cover.png
Binary file modified static/images/blog/appwrite-decoded-bradley/bradley-cover.png
Binary file modified static/images/blog/appwrite-decoded-dennis/dennis-career-update.png
Binary file modified static/images/blog/appwrite-decoded-dennis/dennis-conference.png
Binary file modified static/images/blog/appwrite-decoded-dennis/dennis-cover.png
Binary file modified static/images/blog/appwrite-decoded-dennis/dennis-nextjs.png
Binary file modified static/images/blog/appwrite-decoded-dennis/dennis-post-devrel.png
Binary file modified static/images/blog/appwrite-decoded-dennis/dennis-post-team.png
Binary file modified static/images/blog/appwrite-decoded-dennis/dennis-remote.png
Binary file modified static/images/blog/appwrite-decoded-dennis/dennis-setup.png
Binary file modified static/images/blog/appwrite-decoded-dennis/dennis-team.png
Binary file modified static/images/blog/appwrite-decoded-dennis/dennis-youtube.png
Binary file modified static/images/blog/appwrite-decoded-khushboo/khushboo-cover.png
Binary file modified static/images/blog/appwrite-decoded-khushboo/khushboo-git.png
Binary file modified static/images/blog/appwrite-decoded-khushboo/khushboo-team-two.png
Binary file modified static/images/blog/appwrite-decoded-khushboo/khushboo-team.png
Binary file modified static/images/blog/appwrite-decoded/cover-sara.png
Binary file modified static/images/blog/appwrite-realtime-with-flutter/1.png
Binary file modified static/images/blog/appwrite-realtime-with-flutter/2.png
Binary file modified static/images/blog/appwrite-realtime-with-flutter/3.png
Binary file modified static/images/blog/appwrite-realtime-with-flutter/4.png
Binary file modified static/images/blog/appwrite-realtime-with-flutter/5.png
Binary file modified static/images/blog/appwrite-realtime-with-flutter/cover.png
Binary file modified static/images/blog/baas-backend-as-a-service/cover.png
Binary file modified static/images/blog/baas-vs-custom-backend/auth.png
Binary file modified static/images/blog/baas-vs-custom-backend/cover.png
Binary file modified static/images/blog/baas-vs-custom-backend/database.png
Binary file modified static/images/blog/baas-vs-custom-backend/messaging.png
Binary file modified static/images/blog/baas-vs-custom-backend/storage.png
Binary file modified static/images/blog/baas.png
Binary file modified static/images/blog/backup-encryption/cover.png
Binary file modified static/images/blog/badge.png
Binary file modified static/images/blog/best-pagination-technique/cover.png
Binary file modified static/images/blog/best-pagination-technique/graph.png
Binary file modified static/images/blog/best-pagination-technique/graph2.png
Binary file modified static/images/blog/bun-function-resume/appwrite.png
Binary file modified static/images/blog/bun-function-resume/cover.png
Binary file modified static/images/blog/bun-function-resume/deployment.png
Binary file modified static/images/blog/camp-5-barcelona/1.png
Binary file modified static/images/blog/camp-5-barcelona/2.png
Binary file modified static/images/blog/camp-5-barcelona/3.png
Binary file modified static/images/blog/camp-5-barcelona/4.png
Binary file modified static/images/blog/camp-5-barcelona/5.png
Binary file modified static/images/blog/camp-5-barcelona/6.png
Binary file modified static/images/blog/camp-5-barcelona/7.png
Binary file modified static/images/blog/camp-5-barcelona/8.png
Binary file modified static/images/blog/camp-5-barcelona/cover.png
Binary file modified static/images/blog/card1.png
Binary file modified static/images/blog/card2.png
Binary file modified static/images/blog/card3.png
Binary file modified static/images/blog/case-study-langx/cover.png
Binary file modified static/images/blog/case-study-myshoefitter.png
Binary file modified static/images/blog/case-study-open-mind/cover.png
Binary file modified static/images/blog/case-study-undo/cover.png
Binary file modified static/images/blog/ccpa-gdpr.png
Binary file modified static/images/blog/ccpa.png
Binary file modified static/images/blog/cdi-cover.png
Binary file modified static/images/blog/celebrating-1.5-contributors.png
Binary file modified static/images/blog/changelog-alert.png
Binary file modified static/images/blog/changelog.png
Binary file modified static/images/blog/cloud-beta.png
Loading

0 comments on commit 7a3667a

Please sign in to comment.