Elixir client SDK for Appwrite — the open-source backend-as-a-service platform. Covers all client-facing APIs: Auth · Databases · TablesDB · Storage · Functions · Sites · Tokens · Teams · Messaging · GraphQL · Locale · Avatars · Health.
Add appwrite to your dependencies in mix.exs:
def deps do
[
{:appwrite, "~> 1.0"}
]
endThen fetch:
mix deps.getconfig :appwrite,
project_id: System.get_env("APPWRITE_PROJECT_ID"),
secret: System.get_env("APPWRITE_SECRET"),
root_uri: System.get_env("APPWRITE_ENDPOINT", "https://cloud.appwrite.io/v1")import Config
if config_env() == :prod do
config :appwrite,
project_id: System.fetch_env!("APPWRITE_PROJECT_ID"),
secret: System.fetch_env!("APPWRITE_SECRET"),
root_uri: System.get_env("APPWRITE_ENDPOINT", "https://cloud.appwrite.io/v1")
endSelf-hosted Appwrite? Set
APPWRITE_ENDPOINTto your instance URL, e.g.https://appwrite.mycompany.com/v1.
alias Appwrite.Services.{Accounts, Database, Storage}
alias Appwrite.Utils.{Id, Query, Permission, Role}
# Create a new user
{:ok, _user} = Accounts.create(Id.unique(), "alice@example.com", "secret123")
# Email + password login
{:ok, _session} = Accounts.create_email_password_session("alice@example.com", "secret123")
# Query documents
{:ok, result} = Database.list_documents("my-db", "posts", [
Query.equal("published", true),
Query.order_desc("created_at"),
Query.limit(10)
])
# Upload a file
file_content = File.read!("report.pdf")
{:ok, file} = Storage.create_file("my-bucket", Id.unique(), %{
"name" => "report.pdf",
"data" => file_content,
"type" => "application/pdf",
"size" => byte_size(file_content)
})
# Get a download URL (unauthenticated via token)
{:ok, token} = Appwrite.Services.Tokens.create_file_token("my-bucket", file["$id"])
{:ok, url} = Storage.get_file_download("my-bucket", file["$id"], token["secret"])| Module | Appwrite API |
|---|---|
Appwrite.Services.Accounts |
Auth, sessions, MFA, OAuth2, recovery |
Appwrite.Services.Avatars |
Avatars, flags, QR codes, screenshots |
Appwrite.Services.Database |
Documents, upsert, increment/decrement, transactions |
Appwrite.Services.Functions |
Executions (create, get, list) |
Appwrite.Services.GraphQL |
GraphQL query and mutation |
Appwrite.Services.Health |
Server health checks |
Appwrite.Services.Locale |
Countries, currencies, languages |
Appwrite.Services.Messaging |
Push/SMS/email topic subscribers |
Appwrite.Services.Sites |
Hosted site deployments and variables |
Appwrite.Services.Storage |
Files, chunked upload, preview/view/download URLs |
Appwrite.Services.TablesDB |
Tables, columns, rows |
Appwrite.Services.Teams |
Teams and memberships |
Appwrite.Services.Tokens |
File access tokens |
| Module | Purpose |
|---|---|
Appwrite.Utils.Query |
Build filter/sort/pagination query strings |
Appwrite.Utils.Permission |
Generate read(), write(), create() … strings |
Appwrite.Utils.Role |
Generate any, user:id, team:id/role … strings |
Appwrite.Utils.Id |
Id.unique() / Id.custom("my-id") |
alias Appwrite.Utils.{Permission, Role}
permissions = [
Permission.read(Role.any()), # public read
Permission.create(Role.users()), # any logged-in user can create
Permission.update(Role.user("alice-id")), # only alice can update
Permission.delete(Role.team("admins")) # admins can delete
]All service functions return {:ok, map()} or {:error, reason}.
API errors are Appwrite.Exceptions.AppwriteException structs:
alias Appwrite.Exceptions.AppwriteException
case Accounts.get() do
{:ok, user} ->
IO.puts("Hello, #{user["name"]}")
{:error, %AppwriteException{code: 401}} ->
IO.puts("Not authenticated")
{:error, %AppwriteException{code: code, message: msg}} ->
IO.puts("Appwrite error #{code}: #{msg}")
{:error, reason} ->
IO.inspect(reason, label: "Unexpected error")
end- Elixir
~> 1.18 - Erlang/OTP 26+
Apache 2.0 — see LICENSE.