diff --git a/android/backend/api/build.gradle.kts b/android/backend/api/build.gradle.kts
new file mode 100644
index 000000000..9b18065e7
--- /dev/null
+++ b/android/backend/api/build.gradle.kts
@@ -0,0 +1,21 @@
+plugins {
+ alias(libs.plugins.android.library)
+}
+
+android {
+ namespace = "io.clawdroid.backend.api"
+ compileSdk = libs.versions.android.compileSdk.get().toInt()
+
+ defaultConfig {
+ minSdk = libs.versions.android.minSdk.get().toInt()
+ }
+
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_17
+ targetCompatibility = JavaVersion.VERSION_17
+ }
+}
+
+dependencies {
+ implementation(libs.coroutines.android)
+}
diff --git a/android/backend/api/src/main/AndroidManifest.xml b/android/backend/api/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..8072ee00d
--- /dev/null
+++ b/android/backend/api/src/main/AndroidManifest.xml
@@ -0,0 +1,2 @@
+
+
diff --git a/android/backend/api/src/main/java/io/clawdroid/backend/api/BackendLifecycle.kt b/android/backend/api/src/main/java/io/clawdroid/backend/api/BackendLifecycle.kt
new file mode 100644
index 000000000..d407e3d84
--- /dev/null
+++ b/android/backend/api/src/main/java/io/clawdroid/backend/api/BackendLifecycle.kt
@@ -0,0 +1,10 @@
+package io.clawdroid.backend.api
+
+import kotlinx.coroutines.flow.StateFlow
+
+interface BackendLifecycle {
+ val state: StateFlow
+ val isManaged: Boolean
+ suspend fun start()
+ suspend fun stop()
+}
diff --git a/android/backend/api/src/main/java/io/clawdroid/backend/api/BackendState.kt b/android/backend/api/src/main/java/io/clawdroid/backend/api/BackendState.kt
new file mode 100644
index 000000000..145c60d7d
--- /dev/null
+++ b/android/backend/api/src/main/java/io/clawdroid/backend/api/BackendState.kt
@@ -0,0 +1,3 @@
+package io.clawdroid.backend.api
+
+enum class BackendState { STOPPED, STARTING, RUNNING, ERROR }
diff --git a/android/backend/api/src/main/java/io/clawdroid/backend/api/GatewaySettings.kt b/android/backend/api/src/main/java/io/clawdroid/backend/api/GatewaySettings.kt
new file mode 100644
index 000000000..3626af99d
--- /dev/null
+++ b/android/backend/api/src/main/java/io/clawdroid/backend/api/GatewaySettings.kt
@@ -0,0 +1,7 @@
+package io.clawdroid.backend.api
+
+data class GatewaySettings(
+ val wsPort: Int = 18793,
+ val httpPort: Int = 18790,
+ val apiKey: String = "",
+)
diff --git a/android/backend/api/src/main/java/io/clawdroid/backend/api/GatewaySettingsStore.kt b/android/backend/api/src/main/java/io/clawdroid/backend/api/GatewaySettingsStore.kt
new file mode 100644
index 000000000..48bf5ccfb
--- /dev/null
+++ b/android/backend/api/src/main/java/io/clawdroid/backend/api/GatewaySettingsStore.kt
@@ -0,0 +1,8 @@
+package io.clawdroid.backend.api
+
+import kotlinx.coroutines.flow.StateFlow
+
+interface GatewaySettingsStore {
+ val settings: StateFlow
+ suspend fun update(settings: GatewaySettings)
+}
diff --git a/android/backend/api/src/main/java/io/clawdroid/backend/api/NoopBackendLifecycle.kt b/android/backend/api/src/main/java/io/clawdroid/backend/api/NoopBackendLifecycle.kt
new file mode 100644
index 000000000..2da1632d8
--- /dev/null
+++ b/android/backend/api/src/main/java/io/clawdroid/backend/api/NoopBackendLifecycle.kt
@@ -0,0 +1,11 @@
+package io.clawdroid.backend.api
+
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
+
+class NoopBackendLifecycle : BackendLifecycle {
+ override val state: StateFlow = MutableStateFlow(BackendState.RUNNING)
+ override val isManaged: Boolean = false
+ override suspend fun start() {}
+ override suspend fun stop() {}
+}
diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts
index 533b4eb99..c8eb14336 100644
--- a/android/settings.gradle.kts
+++ b/android/settings.gradle.kts
@@ -18,3 +18,4 @@ include(":feature:chat")
include(":core:domain")
include(":core:data")
include(":core:ui")
+include(":backend:api")