On this page
Introducció
You can use supabase-kt to interact with your Postgres database, listen to database changes, invoke Deno Edge Functions, build login and user management functionality, and manage large files.
To see supported Kotlin targets, check the corresponding module README on [GitHub](https://github.com/supabase-community/supabase-kt.
The Kotlin client library is created and maintained by the Supabase community, and is not an official library. Please be tolerant of areas where the library is still being developed, and — as with all the libraries — feel free to contribute wherever you find issues.
Project
Supabase Modules
Add one or more modules to your project depending on your needs.
The available modules are:
Check out the different READMEs for information about supported Kotlin targets.
Add Ktor Client Engine to each of your Kotlin targets.
Supabase Client
Independently of which Supabase module you are using, you will need to initialize the main client first and install the module.
To create a new client, you can use the createSupabaseClient function.
When installing a module, you can pass a block to configure it.
import io.github.cdimascio.dotenv.dotenvimport io.github.jan.supabase.auth.Authimport io.github.jan.supabase.createSupabaseClientimport io.github.jan.supabase.postgrest.Postgrest
fun main() {
val dotenv = dotenv()
val supabase = createSupabaseClient( supabaseUrl = dotenv["URL"], supabaseKey = dotenv["KEY"] ) { install(Auth) install(Postgrest) //install(Storage) }}Got to the Supabase dashboard and copy your project’s URL and key.


Test that the supabase client is working by running the code.
Database
Create a new table with the SQL Editor:

create table if not exists dog ( id serial primary key, name text not null)You can find more information at Managing tables views and data.
Create the Dog and DogInsert classes:
@Serializabledata class Dog( val id: Long, val name: String)
@Serializabledata class DogInsert( val name: String)You need the DogInsert class because the id attribute is a surrogate key.
Now you can insert the first dog:
fun main() { // ...
runBlocking {
val pg = supabase.postgrest
pg.from("dog").insert(DogInsert("Trufa")) }}Run the code and verify in the “Table Editor” that the new record has been inserted:

If you want to return the inserted data, you can use the select() method inside the request:
fun main() { // ...
runBlocking {
val pg = supabase.postgrest
pg.from("dog").insert(DogInsert("Ketsu")) { select() }.decodeSingle<Dog>().also { println(it) }
// Dog(id=2, name=Ketsu) }}You can also insert multiple dogs at once:
fun main() { // ...
runBlocking {
val pg = supabase.postgrest
pg.from("dog").insert( listOf(DogInsert("Lassie"), DogInsert("Maverick")) ) { select() }.decodeList<Dog>().onEach { println(it) }
// Dog(id=3, name=Lassie) // Dog(id=4, name=Maverick) }}