Svelte for Appwrite
Tags: svelte, appwrite, baas, selfhosted
Published: 2021-01-12 16:06:40

# ▶ Introduction
I've been a fan of Svelte for a long time now and started every project I came up with in 2020 with the [sveltejs/template](https://github.com/sveltejs/template). While working on these ideas, I discovered a self-hosted Firebase alternative called Appwrite.

## ❓ What is Appwrite?

![68747470733a2f2f61707077726974652e696f2f696d616765732f6769746875622e706e67](https://dev-to-uploads.s3.amazonaws.com/i/5ltvzuemkjv1iwfqagju.png) 

> Appwrite is an open-source backend-as-a-service server that abstracts and simplifies complex and repetitive development tasks behind a very simple to use REST API. Appwrite aims to help you develop your apps faster and in a more secure way.

If you haven't heard of Appwrite before, you should really [check it out](https://appwrite.io)! 👀

If you ask yourself, why you should use Appwrite over something like Firebase, I've written down my reasons here:
{% link https://dev.to/torstendittmann/why-i-moved-from-baas-to-appwrite-self-hosted-backend-1e6b %}

## ⬅ Back to the topic

Hooked by the concept, I started contributing to Appwrite, became part of its community, and in 2021 I became a fulltime Core Member.

Using the Javascript SDK worked right away, but didn't really fit the component driven approach of Svelte. So I sat down, inspired by [sveltefire](https://github.com/codediodeio/sveltefire), and worked out a collection of components which feel at home in Svelte projects. This resulted in the project `svelte-appwrite`.

# 🔎 Comparison
Enough talking, let's start with a code comparison between `appwrite` and `svelte-appwrite`:

![picture](https://dev-to-uploads.s3.amazonaws.com/i/4o36tarfr9uvvyo5uuyh.png)

Short isn't always better, except in this case. Let's take a look at the shorter variant, the `svelte-appwrite` one:

```html
<script>
	import { Appwrite, User, AuthEmail } from "svelte-appwrite";

	const config = {
		endpoint: "http://localhost/v1",
		project: "5ffc6c043586d",
	};

	let email = "";
	let password = "";
</script>

<Appwrite {...config}>
	<User let:user let:actions>
		<p>Hello {user.name}!</p>
		<button on:click={actions.logout}>Logout</button>
		<div slot="error">
			<AuthEmail let:authorize on:success={actions.reload}>
				<input type="text" bind:value={email} />
				<input type="text" bind:value={password} />
				<button on:click={authorize(email, password)}>
					Login
				</button>
			</AuthEmail>
		</div>
	</User>
</Appwrite>
```

This small snippet handles Initialization and Authentication via E-Mail with an [Appwrite](https://appwrite.io) project for you with just a few lines.

# 🧬 Let's break it down

## `<Appwrite {...config}>`

The `<Appwrite />` component initializes the SDK for your Appwrite project and must wrap every `svelte-appwrite` component. You can simply spread a configuration like this:
```javascript
const config = {
    endpoint: "http://localhost/v1",
    project: "5f4938898667e",
    locale: "de"
};
```

## `<User let:user let:actions>`

The `<User/>` component requests the currently logged in user and provides you 2 [let:directives](https://svelte.dev/docs#slot_let):
- let:user
- let:actions

The `user` directive provides you with the currently logged-in user and `actions` with following set of functions:
- `reload()`
- `logout()`
- `logoutFrom(session: string)`
- `logoutAll()`

By default, everything inside the `<User />` component is only shown when a user is logged in. By using the `error` [slot](https://svelte.dev/docs#slot) we can show content when a user is not logged in.
```html
<User let:user>
  <h1>Hello {user.name}!</h1>
  <div>{user.email}</div>

  <div slot="error">
    You are not logged in!
  </div>
  <div slot="loading">
    Loading...
  </div>
</User>
```

## `<AuthEmail let:authorize on:success>`

The last component we used lets users authenticate via e-mail with the provided `authorize(email, password)` method. This component can also emit `success` and `failure` events.

```html
<AuthEmail let:authorize on:success={actions.reload}>
  <input type="text" bind:value={email}>
  <input type="text" bind:value={password}>
  <button on:click={authorize(email,password)}>Login</button>
</AuthEmail>
```

As you can see in the example above, the `on:success` event points to the `reload()` function from `<User />`. This way, when a successful login happens, the component will fetch the user from Appwrite and renders the default slot.

### You can find more components [here](https://github.com/appwrite/sdk-for-svelte) 

# 👆 Conclusion

Of course, there are many more components that cover all the functionalities (except teams, that's coming) of Appwrite. This library allows you to kickstart ideas in no time with Svelte. If you have any feedback you'd like to share with me, I'd be glad to read your comments!

To support this claim, a tutorial series will be published in the coming weeks, in which I will present all aspects of this library and Appwrite itself by building an Instagram clone. 

# Links
- [Source Code](https://github.com/appwrite/sdk-for-svelte)
- [npm Package](https://www.npmjs.com/package/svelte-appwrite)