diff --git a/signalc/src/main/kotlin/friends/murmur/signalboost/command/Executor.kt b/signalc/src/main/kotlin/friends/murmur/signalboost/command/Executor.kt
new file mode 100644
index 0000000000000000000000000000000000000000..a469c93b51263af1b59ad8e533f50bc3f40b82a1
--- /dev/null
+++ b/signalc/src/main/kotlin/friends/murmur/signalboost/command/Executor.kt
@@ -0,0 +1,59 @@
+package friends.murmur.signalboost.command
+
+import friends.murmur.signalboost.model.*
+import info.signalboost.signalc.model.SocketRequest
+
+class Executor(val app: Application) {
+    fun execute(executable: Executable, dispatchable: Dispatchable): CommandResult {
+        val (command, payload, language) = executable
+        val(channel, sender, scMessage) = dispatchable
+
+        return when(command) {
+            Command.BROADCAST -> broadcast(channel, sender, scMessage, payload)
+            else -> TODO("Not implemented yet!")
+        }
+    }
+
+    private fun broadcast(channel: Channel, sender: Membership, scMessage: SignalcMessage, payload: String) = CommandResult(
+        status = "SUCCESS",
+        command = Command.BROADCAST,
+        payload = payload,
+        message = "",
+        notifications = broadcastNotificationsOf(channel, sender, scMessage.attachments, payload),
+    )
+
+    private fun broadcastNotificationsOf(
+        channel: Channel,
+        sender: Membership,
+        attachments: List<SocketRequest.Send.Attachment>,
+        body: String): List<Notification>
+    {
+        val adminNotifications = channel.adminMemberships.map {
+            Notification(
+                recipient = it.memberPhoneNumber,
+                message = appendHeaderToRelayableMessage(
+                    sender,
+                    it,
+                    "broadcastMessage",
+                    body,
+                ),
+                attachments = attachments,
+            )
+        }
+
+        val subscriberNotifications = channel.subscriberMemberships.map {
+            Notification(
+                recipient = it.memberPhoneNumber,
+                message = body,
+                attachments = attachments,
+            )
+        }
+
+        return adminNotifications + subscriberNotifications
+    }
+
+    private fun appendHeaderToRelayableMessage(sender: Membership, recipient: Membership, notificationKey: String, body: String): String {
+        // TODO
+        return body // lol
+    }
+}
\ No newline at end of file
diff --git a/signalc/src/main/kotlin/friends/murmur/signalboost/model/Model.kt b/signalc/src/main/kotlin/friends/murmur/signalboost/model/Model.kt
new file mode 100644
index 0000000000000000000000000000000000000000..8c96c6b30bd2fb6b7185096af345b543b9c36c4b
--- /dev/null
+++ b/signalc/src/main/kotlin/friends/murmur/signalboost/model/Model.kt
@@ -0,0 +1,83 @@
+package friends.murmur.signalboost.model
+
+import info.signalboost.signalc.model.SignalcAddress
+import info.signalboost.signalc.model.SocketRequest
+
+
+enum class Language(asString: String) {
+    EN("EN"),
+    ES("ES"),
+    FR("FR"),
+    DE("DE"),
+}
+
+enum class MemberType {
+    ADMIN,
+    SUBSCRIBER,
+    NONE
+}
+
+data class Channel(
+    val memberships: List<Membership>,
+) {
+   val adminMemberships: List<Membership>
+     get() = memberships.filter { it.type == MemberType.ADMIN }
+    val subscriberMemberships: List<Membership>
+        get() = memberships.filter { it.type == MemberType.SUBSCRIBER }
+}
+
+data class Membership(
+    val type: MemberType,
+    val channelPhoneNumber: String,
+    val memberPhoneNumber: String,
+    val language: Language,
+)
+
+data class SignalcMessage(
+    val type: String = "SEND",
+    val username: String,
+    val recipientAddress: SignalcAddress,
+    val messageBody: String,
+    val attachments: List<SocketRequest.Send.Attachment>,
+    val expiresInSeconds: Int,
+)
+
+data class Dispatchable(
+    val channel: Channel,
+    val sender: Membership,
+    val message: SignalcMessage,
+)
+
+data class Executable(
+    val command: Command,
+    val paylod: String,
+    val language: Language,
+)
+
+
+
+data class SignalboostResult(
+    val status: String,
+    val message: String,
+)
+
+data class Notification(
+    val recipient: String,
+    val message: String,
+    val attachments: List<SocketRequest.Send.Attachment>,
+)
+
+data class CommandResult(
+    val command: Command,
+    val payload: String,
+    val status: String,
+    val message: String,
+    val notifications: List<Notification>,
+)
+
+enum class Command(val asString: String) {
+    BROADCAST("BROADCAST")
+}
+
+
+class Application