mirror of
https://github.com/LukeHagar/website.git
synced 2025-12-09 21:07:46 +00:00
@@ -9,3 +9,4 @@ PUBLIC_GROWTH_ENDPOINT=
|
||||
APPWRITE_DB_INIT_ID=
|
||||
APPWRITE_COL_INIT_ID=
|
||||
APPWRITE_API_KEY_INIT=
|
||||
SENTRY_AUTH_TOKEN=
|
||||
1
.github/workflows/production.yml
vendored
1
.github/workflows/production.yml
vendored
@@ -42,6 +42,7 @@ jobs:
|
||||
"APPWRITE_COL_INIT_ID=${{ secrets.APPWRITE_COL_INIT_ID }}"
|
||||
"APPWRITE_API_KEY_INIT=${{ secrets.APPWRITE_API_KEY_INIT }}"
|
||||
"GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}"
|
||||
"SENTRY_AUTH_TOKEN=${{ secrets.SENTRY_AUTH_TOKEN }}"
|
||||
|
||||
deploy:
|
||||
needs: build
|
||||
|
||||
1
.github/workflows/staging.yml
vendored
1
.github/workflows/staging.yml
vendored
@@ -44,6 +44,7 @@ jobs:
|
||||
"APPWRITE_COL_INIT_ID=${{ secrets.APPWRITE_COL_INIT_ID }}"
|
||||
"APPWRITE_API_KEY_INIT=${{ secrets.APPWRITE_API_KEY_INIT }}"
|
||||
"GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}"
|
||||
"SENTRY_AUTH_TOKEN=${{ secrets.SENTRY_AUTH_TOKEN }}"
|
||||
|
||||
deploy:
|
||||
needs: build
|
||||
|
||||
8
.github/workflows/tests.yml
vendored
8
.github/workflows/tests.yml
vendored
@@ -1,16 +1,16 @@
|
||||
name: Tests
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: ['**']
|
||||
pull_request:
|
||||
pull_request_target:
|
||||
branches: ['**']
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
|
||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -12,4 +12,6 @@ vite.config.js.timestamp-*
|
||||
vite.config.ts.timestamp-*
|
||||
package-lock.json
|
||||
.tool-versions
|
||||
.vscode
|
||||
.vscode
|
||||
# Sentry Config File
|
||||
.sentryclirc
|
||||
|
||||
20
CONTENT.md
20
CONTENT.md
@@ -244,39 +244,55 @@ Available sizes are `s`, `m`, `l` and `xl`. Default: `s`.
|
||||
|
||||
#### Cards
|
||||
We use cards when we reference a list of links for navigation
|
||||
|
||||
```
|
||||
{% cards %}
|
||||
|
||||
{% cards_item href="/docs/quick-starts/react" title="React" %}
|
||||
Get started with Appwrite and React
|
||||
{% /cards_item %}
|
||||
|
||||
{% cards_item href="/docs/quick-starts/vue" title="Vue.js" %}
|
||||
Get started with Appwrite and Vue.js
|
||||
{% /cards_item %}
|
||||
|
||||
{% cards_item href="/docs/quick-starts/nuxt" title="Nuxt" %}
|
||||
Get started with Appwrite and Nuxt
|
||||
{% /cards_item %}
|
||||
|
||||
{% cards_item href="/docs/quick-starts/sveltekit" title="SvelteKit" %}
|
||||
Get started with Appwrite and SvelteKit
|
||||
{% /cards_item %}
|
||||
|
||||
{% /cards %}
|
||||
```
|
||||
|
||||
#### Cards with icons
|
||||
We use cards when we reference a list of links for navigation, this variation has icons for extra hints visually.
|
||||
|
||||
```
|
||||
{% cards %}
|
||||
|
||||
{% cards_item href="/docs/products/messaging/apns" title="APNS" icon="icon-apple" %}
|
||||
Configure APNs for push notification to Apple devices.
|
||||
{% /cards_item %}
|
||||
|
||||
{% cards_item href="/docs/products/messaging/fcm" title="FCM" icon="web-icon-firebase" %}
|
||||
Configure FCM for push notification to Android and Apple devices.
|
||||
{% /cards_item %}
|
||||
|
||||
{% /cards %}
|
||||
```
|
||||
|
||||
#### Accordions
|
||||
Use accordions to reduce page size and collapse information that's not important when a reader is skilling the page.
|
||||
|
||||
```
|
||||
{% accordion %}
|
||||
{% accordion_item title="Team ID" %}
|
||||
|
||||
{% /accordion_item %}
|
||||
{% accordion_item title="Bundle ID" %}
|
||||
|
||||
{% accordion_item title="Bundle ID" %}
|
||||
{% /accordion_item %}
|
||||
{% /accordion %}
|
||||
```
|
||||
|
||||
@@ -33,6 +33,9 @@ ENV APPWRITE_API_KEY_INIT ${APPWRITE_API_KEY_INIT}
|
||||
ARG GITHUB_TOKEN
|
||||
ENV GITHUB_TOKEN ${GITHUB_TOKEN}
|
||||
|
||||
ARG SENTRY_AUTH_TOKEN
|
||||
ENV SENTRY_AUTH_TOKEN ${SENTRY_AUTH_TOKEN}
|
||||
|
||||
ENV PNPM_HOME="/pnpm"
|
||||
ENV PATH="$PNPM_HOME:$PATH"
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
},
|
||||
"packageManager": "pnpm@9.4.0+sha512.f549b8a52c9d2b8536762f99c0722205efc5af913e77835dbccc3b0b0b2ca9e7dc8022b78062c17291c48e88749c70ce88eb5a74f1fa8c4bf5e18bb46c8bd83a",
|
||||
"dependencies": {
|
||||
"@sentry/sveltekit": "^8.12.0",
|
||||
"h3": "^1.12.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
||||
1511
pnpm-lock.yaml
generated
1511
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
29
src/hooks.client.ts
Normal file
29
src/hooks.client.ts
Normal file
@@ -0,0 +1,29 @@
|
||||
import { dev } from '$app/environment';
|
||||
import { SENTRY_DSN } from '$lib/constants';
|
||||
import { handleErrorWithSentry, replayIntegration } from '@sentry/sveltekit';
|
||||
import * as Sentry from '@sentry/sveltekit';
|
||||
|
||||
Sentry.init({
|
||||
enabled: !dev,
|
||||
dsn: SENTRY_DSN,
|
||||
allowUrls: [/appwrite\.io/],
|
||||
tracesSampleRate: 1.0,
|
||||
|
||||
// This sets the sample rate to be 10%. You may want this to be 100% while
|
||||
// in development and sample at a lower rate in production
|
||||
replaysSessionSampleRate: 0,
|
||||
|
||||
// If the entire session is not sampled, use the below sample rate to sample
|
||||
// sessions when an error occurs.
|
||||
replaysOnErrorSampleRate: 1.0,
|
||||
|
||||
// If you don't want to use Session Replay, just remove the line below:
|
||||
integrations: [replayIntegration({
|
||||
maskAllInputs: true,
|
||||
maskAllText: false,
|
||||
blockAllMedia: false,
|
||||
})]
|
||||
});
|
||||
|
||||
// If you have a custom error handler, pass it to `handleErrorWithSentry`
|
||||
export const handleError = handleErrorWithSentry();
|
||||
@@ -1,7 +1,16 @@
|
||||
import * as Sentry from '@sentry/sveltekit';
|
||||
import type { Handle } from '@sveltejs/kit';
|
||||
import redirects from './redirects.json';
|
||||
import { sequence } from '@sveltejs/kit/hooks';
|
||||
import { BANNER_KEY } from '$lib/constants';
|
||||
import { BANNER_KEY, SENTRY_DSN } from '$lib/constants';
|
||||
import { dev } from '$app/environment';
|
||||
|
||||
Sentry.init({
|
||||
enabled: !dev,
|
||||
dsn: SENTRY_DSN,
|
||||
tracesSampleRate: 1,
|
||||
allowUrls: [/appwrite\.io/]
|
||||
})
|
||||
|
||||
const redirectMap = new Map(redirects.map(({ link, redirect }) => [link, redirect]));
|
||||
|
||||
@@ -26,4 +35,5 @@ const bannerRewriter: Handle = async ({ event, resolve }) => {
|
||||
return response;
|
||||
};
|
||||
|
||||
export const handle = sequence(redirecter, bannerRewriter);
|
||||
export const handle = sequence(Sentry.sentryHandle(), redirecter, bannerRewriter);
|
||||
export const handleError = Sentry.handleErrorWithSentry();
|
||||
@@ -46,6 +46,12 @@
|
||||
{ label: 'Threads', href: '/threads' },
|
||||
{ label: 'Blog', href: '/blog' },
|
||||
{ label: 'Changelog', href: '/changelog' },
|
||||
{
|
||||
label: 'Roadmap',
|
||||
href: 'https://github.com/orgs/appwrite/projects',
|
||||
target: '_blank',
|
||||
rel: 'noopener noreferrer'
|
||||
},
|
||||
{
|
||||
label: 'Source code',
|
||||
href: 'https://github.com/appwrite',
|
||||
|
||||
@@ -23,8 +23,8 @@
|
||||
<script lang="ts">
|
||||
export let selector = '#main';
|
||||
export let exclude: CreateTableOfContentsArgs['exclude'] = ['h1', 'h3', 'h4', 'h5', 'h6'];
|
||||
export let activeType: CreateTableOfContentsArgs['activeType'] = 'lowest';
|
||||
export let scrollOffset: CreateTableOfContentsArgs['scrollOffset'] = 120;
|
||||
export let activeType: CreateTableOfContentsArgs['activeType'] = 'highest';
|
||||
export let scrollOffset: CreateTableOfContentsArgs['scrollOffset'] = 0;
|
||||
|
||||
const toc = createTableOfContents({
|
||||
selector,
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
export const GITHUB_STARS = '41.9K';
|
||||
export const BANNER_KEY = 'discord-banner-01'; // Change key to force banner to show again
|
||||
export const SENTRY_DSN = 'https://27d41dc8bb67b596f137924ab8599e59@o1063647.ingest.us.sentry.io/4507497727000576'
|
||||
|
||||
/**
|
||||
* History:
|
||||
|
||||
10
src/routes/blog/author/snezhanna/+page.markdoc
Normal file
10
src/routes/blog/author/snezhanna/+page.markdoc
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
layout: author
|
||||
slug: snezhanna
|
||||
name: Snezhanna Markova
|
||||
role: Content and Socials
|
||||
bio: I handle all things content and socials @Appwrite
|
||||
avatar: /images/avatars/snezhanna.png
|
||||
linkedin: https://www.linkedin.com/in/snezhanna-markova/
|
||||
---
|
||||
|
||||
107
src/routes/blog/post/baas-vs-custom-backend/+page.markdoc
Normal file
107
src/routes/blog/post/baas-vs-custom-backend/+page.markdoc
Normal file
@@ -0,0 +1,107 @@
|
||||
---
|
||||
layout: post
|
||||
title: "BaaS vs. Custom Backend: making the right choice as a freelancer"
|
||||
description: Discover whether BaaS or a custom backend is the best fit for your freelance projects. In this blog we weigh the pros and cons to help you make the right choice.
|
||||
cover: /images/blog/baas-vs-custom-backend/cover.png
|
||||
timeToRead: 6
|
||||
date: 2024-06-20
|
||||
author: aditya-oberai
|
||||
category: product
|
||||
---
|
||||
|
||||
As a freelance developer, you juggle multiple roles – project manager, designer, coder, and even a bit of a salesperson. The job is not for the faint of heart. Add to that the need to build, scale and maintain complex backends for each client, and now your day-to-day is taken over by time-consuming, grinding tasks.
|
||||
|
||||
This is where Backend-as-a-Service (BaaS) comes in. BaaS abstracts away backend complexity, allowing you to deliver an elevated product without getting bogged down in the repetitiveness of server-side development. And often, a BaaS can be a game-changer for freelance developers.
|
||||
|
||||
# What is a BaaS?
|
||||
|
||||
Backend-as-a-Service (BaaS) is a third-party service that lets developers delegate common backend operations of a web or mobile application. Such operations include but are not limited to:
|
||||
|
||||
- User Authentication
|
||||
- Database Management
|
||||
- Push Notifications
|
||||
- File Storage
|
||||
- Hosting
|
||||
|
||||
Implementing these from scratch is quite tedious and repetitive, especially if you’re making multiple apps for multiple clients. These tasks take focus away from what you do best: inventing creative and functional solutions that bring value to your client.
|
||||
|
||||
BaaS providers take care of the boring stuff, which makes them an attractive solution for freelancers who want to gain back time without compromising on quality.
|
||||
|
||||
# BaaS vs Custom Backend
|
||||
|
||||
Custom-built backends let you tailor everything to your client’s needs. Normally, you would create the reusable components for one client, and then it's just a matter of copying and pasting. The real pain comes in maintaining them. Let's say you find a bug and fix it for one client. Now, you have to fix it for every client, copying the changes and deploying them each time. While automation could simplify this, you're already stuck in the hole you dug by reusing custom backends.
|
||||
|
||||
With a BaaS platform, you can build an entire backend in minutes. For example, you can design a database, add your data, and seamlessly communicate with a frontend using a REST API, SDK, or GraphQL. This means you can turn around projects faster, save money, and leverage reliable technologies across all your work.
|
||||
|
||||
What if you already have a library of technologies? A dedicated platform ensures they’re robust, up-to-date, and integrate well with your existing tools. This way, you can maintain the reliability and performance of your applications without the hassle of constant manual updates and compatibility checks.
|
||||
|
||||
Let's take a look at some of the most common products that backend-as-a-service providers offer. We'll use [Appwrite](https://appwrite.io/) as an example, but many BaaS vendors offer similar technologies. What makes Appwrite convenient is that it combines everything into a single open-source platform, simplifying the development process. Our philosophy is to meet you — the developer — where you are, empowering you to use the tools and technologies you love.
|
||||
|
||||
# BaaS for Authentication
|
||||
|
||||
As a freelancer, you’ve probably built more authentication systems than you want to admit. However, a tricky solution like user authentication often requires additional support and expertise. One of our software engineers, Matej Bačo, who got his start as a freelance developer, said that finding a good authentication solution was crucial: “What was the safety standard 20 years ago is considered unacceptable now. Who knows what it will be like in 10 years? A freelancer should be able to build safe and secure apps without needing to keep an eye on every security change.”
|
||||
|
||||
For example, [Appwrite Authentication](/docs/products/auth) simplifies the process to just a few clicks and a couple of lines of code. In Appwrite, you can securely authenticate users using multiple login methods, such as Email & Password, SMS, OAuth2, Anonymous, Magic URLs, and more. If your client requires specific authentication methods such as Auth0, tailored authentication using Web3 or AI, or integration with company-specific hardware cards, custom tokens let you implement your own authentication flow to meet these needs. There’s also support for teams, roles, and user labels, and includes rate-limiting and advanced user protection features.
|
||||
|
||||

|
||||
|
||||
You also get 30+ OAuth2 integrations. From Google and Github to Twitch and Yandex, you can set up your user auth in minutes – quite literally!
|
||||
|
||||
[Take a look at how Dennis Ivy set up Google OAuth sign-in in less than 6 minutes using Appwrite.](https://youtu.be/tgO_ADSvY1I?feature=shared)
|
||||
|
||||
Additionally, BaaS handles password recovery, multi-factor authentication and other security aspects, giving you peace of mind and allowing you to focus on building great apps instead of worrying about [authentication and security issues.](/blog/post/goodbye-plaintext-passwords) For example, with a custom backend, you'll probably need a custom database, custom authorization store, and validator — lots of work in a feature where even the smallest mistake is critical.
|
||||
|
||||
With a BaaS like Appwrite, it's as simple as clicking a few checkboxes.
|
||||
|
||||
# BaaS for Databases
|
||||
|
||||
Database management is challenging even for the most experienced developer. While storing data may be pretty straightforward, making your database fast and high-performing is where most spend ages.
|
||||
|
||||
BaaS providers offer pre-configured database solutions, allowing you to quickly set up and manage databases without spending time on complex configurations and deploying to Cloud.
|
||||
|
||||
The beauty of [Appwrite Databases](/docs/products/databases) is that it simplifies database management with a user-friendly interface. This makes it easier for developers to perform tasks like data storage, retrieval, and backup without deep expertise.
|
||||
|
||||

|
||||
|
||||
If you require a more specific functionality, you can integrate [any external database into your Appwrite project, such as SQL, NoSQL, Vector, Graph, and more](/blog/post/integrate-sql-nosql-vector-graph-or-any-database-into-your-appwrite-project) – there’s absolutely no vendor lock-in.
|
||||
|
||||
By delegating database management to a BaaS, you can focus on enhancing core application features and user experience, free from repetitive backend tasks.
|
||||
|
||||
# BaaS for Cloud Storage
|
||||
|
||||
Dealing with the complexities of cloud infrastructure takes valuable time and focus from innovating solutions.
|
||||
|
||||
With BaaS platforms, you get a friendly interface to tap into the powerhouses of cloud services like AWS, Google Cloud, or Azure, all at warp speed. As a freelance developer, you get easy-to-use APIs and SDKs that allow you to integrate cloud storage functionality into their applications quickly, without building complex storage infrastructure from scratch.
|
||||
|
||||
For example, [Appwrite Storage](/docs/products/storage) lets you securely store files with advanced compression, encryption and image transformations. You can edit, crop and resize images straight from the console. The feature also includes access controls, and data backups to protect stored data from unauthorized access, data loss, or breaches. No need to worry about security!
|
||||
|
||||
Additionally, you can upload files as they are or in chunks for better speeds, ensuring a smoother experience. Plus, if a user's internet goes down during an upload, resumable uploads allow them to re-upload only the missing parts, saving time and frustration.
|
||||
|
||||

|
||||
|
||||
Security features let you control allowed file formats and set maximum sizes for specific features. For slow (usually mobile) networks, Appwrite optimizes uploads by converting images to WEBP or lowering quality and resolution, ensuring fast and efficient performance.
|
||||
|
||||
Appwrite’s pricing model makes it easy to scale your project without the upfront costs associated with setting up and managing dedicated storage servers. Alternatively, you can always choose self-hosting if pricing were ever to get out of hands.
|
||||
|
||||
# BaaS for Messaging
|
||||
|
||||
Messaging is hard to home brew – it requires expertise in designing and implementing fault-tolerant systems, scalable architectures, robust security measures, and more. While building from scratch offers customization, it demands significant time, effort, and resources. Many freelance developers opt for existing messaging platforms or Backend-as-a-Service solutions to save time and money.
|
||||
|
||||
In [Appwrite Messaging](/docs/products/messaging), with just a few lines of backend code, you can set up a full-functioning messaging service for your application that covers email, SMS, and push notifications under one unified API. It supports a variety of third-party messaging services:
|
||||
|
||||

|
||||
|
||||
You can group your users by topic, user type or target, and draft messages directly inside the Appwrite Console. Drafting directly in the Appwrite Console is great for promo messages, newsletters, and other announcements. You can see a preview of what your message will look like right in the console and control how your message will look before sending.
|
||||
|
||||
Additionally, you can schedule messages, set up real-time alerts and send automated emails, all from the console.
|
||||
|
||||
# Making the right choice as a freelance developer
|
||||
|
||||
For a freelance developer, time is quite literally money. If you want to maximize your time, you must find ways to work smart, not hard. Choosing a BaaS instead of building your own backend can save you tons of time and money, all while delivering a better product. With a BaaS like [Appwrite](https://appwrite.io/), you can quickly roll out effective solutions for multiple clients, ensuring your apps are robust and scalable. And if anything were ever to change, you can always migrate your project elsewhere — there’s no vendor lock-in.
|
||||
|
||||
Plus, Appwrite has an awesome community of developers who are ready to help. If you want to enhance your efficiency and project quality, explore Appwrite today.
|
||||
|
||||
- [Get started](https://cloud.appwrite.io/)
|
||||
- [Join the Discord community](https://appwrite.io/discord)
|
||||
- [Explore docs](/docs)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
layout: article
|
||||
title: Artifical intelligence
|
||||
title: Artificial intelligence
|
||||
description: "Learn how to implement machine learning models in your applications."
|
||||
---
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ Some additional configuration is required to enable push notifications in your m
|
||||
1. Add `google-services.json` at the root of your project.
|
||||
1. Add Google Services class path to your app-level Gradle dependencies block `"com.google.gms:google-services:4.4.0"`.
|
||||
1. Add Google Services plugin to your app-level Gradle in the plugins block as `"com.google.gms.google-services"`.
|
||||
1. Add notification handler service to `AndroidManifest.xml` inside the application tag, alongisde other activities. Find an example of this service in the [Send push notification](/docs/products/messaging/send-push-notifications#add-targets) journey.
|
||||
1. Add notification handler service to `AndroidManifest.xml` inside the application tag, alongside other activities. Find an example of this service in the [Send push notification](/docs/products/messaging/send-push-notifications#add-targets) journey.
|
||||
```xml
|
||||
<service android:name="<YOUR_NOTIFICATION_HANDLER_SERVICE>" android:exported="false">
|
||||
<intent-filter>
|
||||
|
||||
@@ -235,7 +235,7 @@ class MessagingService : FirebaseMessagingService() {
|
||||
|
||||
In your `AndroidManifest.xml`, register this new service.
|
||||
```xml
|
||||
<service android:name="io.appwrite.NotificationHandler" android:exported="false">
|
||||
<service android:name="<YOUR_NOTIFICATION_HANDLER_SERVICE>" android:exported="false">
|
||||
<intent-filter>
|
||||
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||
</intent-filter>
|
||||
@@ -384,7 +384,6 @@ func application(
|
||||
|
||||
{% section #request-permissions step=3 title="Request permissions" %}
|
||||
Your app must ask for permission to receive push notification from the user.
|
||||
Appwrite provides an `OS` class to help simplify the process to handle permissions.
|
||||
|
||||
{% tabs %}
|
||||
{% tabsitem #apple-apns title="Apple with APNs" %}
|
||||
|
||||
@@ -71,9 +71,9 @@ Push notifications require configuration on both the Appwrite platform and your
|
||||
1. Add `google-services.json` at the root of your project.
|
||||
1. Add Google Services class path to your app-level Gradle dependencies block `"com.google.gms:google-services:4.4.0"`.
|
||||
1. Add Google Services plugin to your app-level Gradle in the plugins block as `"com.google.gms.google-services"`.
|
||||
1. Add notification handler service to `AndroidManifest.xml` inside the application tag, alongisde other activities.
|
||||
```groovy
|
||||
<service android:name="io.appwrite.NotificationHandler" android:exported="false">
|
||||
1. Add notification handler service to `AndroidManifest.xml` inside the application tag, alongside other activities. Find an example of this service in the [Send push notification](/docs/products/messaging/send-push-notifications#add-targets) journey.
|
||||
```xml
|
||||
<service android:name="<YOUR_NOTIFICATION_HANDLER_SERVICE>" android:exported="false">
|
||||
<intent-filter>
|
||||
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||
</intent-filter>
|
||||
|
||||
BIN
static/images/avatars/snezhanna.png
Normal file
BIN
static/images/avatars/snezhanna.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 196 KiB |
BIN
static/images/blog/baas-vs-custom-backend/auth.png
Normal file
BIN
static/images/blog/baas-vs-custom-backend/auth.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 160 KiB |
BIN
static/images/blog/baas-vs-custom-backend/cover.png
Normal file
BIN
static/images/blog/baas-vs-custom-backend/cover.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.9 MiB |
BIN
static/images/blog/baas-vs-custom-backend/database.png
Normal file
BIN
static/images/blog/baas-vs-custom-backend/database.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 177 KiB |
BIN
static/images/blog/baas-vs-custom-backend/messaging.png
Normal file
BIN
static/images/blog/baas-vs-custom-backend/messaging.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 55 KiB |
BIN
static/images/blog/baas-vs-custom-backend/storage.png
Normal file
BIN
static/images/blog/baas-vs-custom-backend/storage.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 184 KiB |
@@ -1,3 +1,4 @@
|
||||
import { sentrySvelteKit } from '@sentry/sveltekit';
|
||||
import dynamicImport from 'vite-plugin-dynamic-import';
|
||||
import { sveltekit } from '@sveltejs/kit/vite';
|
||||
import { defineConfig } from 'vitest/config';
|
||||
@@ -6,6 +7,13 @@ import { enhancedImages } from '@sveltejs/enhanced-img';
|
||||
|
||||
export default defineConfig({
|
||||
plugins: [
|
||||
sentrySvelteKit({
|
||||
adapter: 'node',
|
||||
sourceMapsUploadOptions: {
|
||||
org: 'appwrite',
|
||||
project: 'website'
|
||||
}
|
||||
}),
|
||||
enhancedImages(),
|
||||
sveltekit(),
|
||||
dynamicImport({
|
||||
|
||||
Reference in New Issue
Block a user