From 399bcd46fbca5845aee4af329591edc883e92a72 Mon Sep 17 00:00:00 2001 From: OpenClaw Dev Date: Sun, 25 Oct 2026 04:28:22 +0100 Subject: [PATCH] chore: rename project to ByteClaw (module, binary, env prefix BYTECLAW_, Android package/app/theme) --- Dockerfile | 10 ++++---- Makefile | 16 ++++++------- README.md | 24 +++++++++---------- android/app/build.gradle.kts | 4 ++-- android/app/proguard-rules.pro | 4 ++-- android/app/src/main/AndroidManifest.xml | 2 +- .../client/MainActivity.kt | 10 ++++---- .../client/ui/ChatViewModel.kt | 14 +++++------ .../client/ui/Screens.kt | 10 ++++---- android/app/src/main/res/values/strings.xml | 2 +- android/app/src/main/res/values/themes.xml | 3 +++ .../client/ModelsTest.kt | 6 ++--- android/settings.gradle.kts | 2 +- cmd/{openclaw => byteclaw}/main.go | 22 ++++++++--------- config.example.yaml | 8 +++---- go.mod | 2 +- internal/agent/agent.go | 6 ++--- internal/agent/agent_test.go | 6 ++--- internal/config/config.go | 22 ++++++++--------- internal/config/config_test.go | 6 ++--- internal/server/server.go | 4 ++-- internal/server/server_test.go | 8 +++---- internal/store/store.go | 2 +- internal/store/store_test.go | 2 +- internal/tools/files.go | 2 +- internal/tools/timetool.go | 2 +- internal/tools/tools.go | 2 +- internal/tools/webfetch.go | 4 ++-- 28 files changed, 104 insertions(+), 101 deletions(-) rename android/app/src/main/java/dev/{openclaw => byteclaw}/client/MainActivity.kt (91%) rename android/app/src/main/java/dev/{openclaw => byteclaw}/client/ui/ChatViewModel.kt (93%) rename android/app/src/main/java/dev/{openclaw => byteclaw}/client/ui/Screens.kt (97%) create mode 100644 android/app/src/main/res/values/themes.xml rename android/app/src/test/java/dev/{openclaw => byteclaw}/client/ModelsTest.kt (87%) rename cmd/{openclaw => byteclaw}/main.go (81%) diff --git a/Dockerfile b/Dockerfile index f08c34d..db569fe 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,15 +6,15 @@ COPY go.mod go.sum ./ RUN go mod download COPY . . ARG VERSION=docker -RUN CGO_ENABLED=0 go build -trimpath -ldflags "-s -w -X main.version=${VERSION}" -o /out/openclaw ./cmd/openclaw \ +RUN CGO_ENABLED=0 go build -trimpath -ldflags "-s -w -X main.version=${VERSION}" -o /out/byteclaw ./cmd/byteclaw \ && mkdir -p /out/data FROM gcr.io/distroless/static-debian12:nonroot -COPY --from=build /out/openclaw /usr/local/bin/openclaw +COPY --from=build /out/byteclaw /usr/local/bin/byteclaw COPY --from=build --chown=65532:65532 /out/data /data -ENV OPENCLAW_DATA_DIR=/data \ - OPENCLAW_LISTEN=0.0.0.0:8787 +ENV BYTECLAW_DATA_DIR=/data \ + BYTECLAW_LISTEN=0.0.0.0:8787 USER 65532:65532 EXPOSE 8787 VOLUME ["/data"] -ENTRYPOINT ["/usr/local/bin/openclaw"] +ENTRYPOINT ["/usr/local/bin/byteclaw"] diff --git a/Makefile b/Makefile index dfc0a34..57aa925 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -BINARY := openclaw +BINARY := byteclaw VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo dev) LDFLAGS := -s -w -X main.version=$(VERSION) GOFLAGS := -trimpath @@ -10,7 +10,7 @@ export CGO_ENABLED := 0 all: vet test build build: - go build $(GOFLAGS) -ldflags '$(LDFLAGS)' -o bin/$(BINARY) ./cmd/openclaw + go build $(GOFLAGS) -ldflags '$(LDFLAGS)' -o bin/$(BINARY) ./cmd/byteclaw test: go test ./... @@ -27,20 +27,20 @@ run: build cross: linux-amd64 linux-arm64 linux-armv7 android-arm64 android-armv7 linux-amd64: - GOOS=linux GOARCH=amd64 go build $(GOFLAGS) -ldflags '$(LDFLAGS)' -o $(DIST)/$(BINARY)-linux-amd64 ./cmd/openclaw + GOOS=linux GOARCH=amd64 go build $(GOFLAGS) -ldflags '$(LDFLAGS)' -o $(DIST)/$(BINARY)-linux-amd64 ./cmd/byteclaw linux-arm64: - GOOS=linux GOARCH=arm64 go build $(GOFLAGS) -ldflags '$(LDFLAGS)' -o $(DIST)/$(BINARY)-linux-arm64 ./cmd/openclaw + GOOS=linux GOARCH=arm64 go build $(GOFLAGS) -ldflags '$(LDFLAGS)' -o $(DIST)/$(BINARY)-linux-arm64 ./cmd/byteclaw linux-armv7: - GOOS=linux GOARCH=arm GOARM=7 go build $(GOFLAGS) -ldflags '$(LDFLAGS)' -o $(DIST)/$(BINARY)-linux-armv7 ./cmd/openclaw + GOOS=linux GOARCH=arm GOARM=7 go build $(GOFLAGS) -ldflags '$(LDFLAGS)' -o $(DIST)/$(BINARY)-linux-armv7 ./cmd/byteclaw # Termux on Android: GOOS=android, pure Go (no NDK needed thanks to CGO_ENABLED=0) android-arm64: - GOOS=android GOARCH=arm64 go build $(GOFLAGS) -ldflags '$(LDFLAGS)' -o $(DIST)/$(BINARY)-termux-arm64 ./cmd/openclaw + GOOS=android GOARCH=arm64 go build $(GOFLAGS) -ldflags '$(LDFLAGS)' -o $(DIST)/$(BINARY)-termux-arm64 ./cmd/byteclaw # android/arm needs cgo+NDK; a static linux/arm binary runs fine in Termux instead. android-armv7: - GOOS=linux GOARCH=arm GOARM=7 go build $(GOFLAGS) -ldflags '$(LDFLAGS)' -o $(DIST)/$(BINARY)-termux-armv7 ./cmd/openclaw + GOOS=linux GOARCH=arm GOARM=7 go build $(GOFLAGS) -ldflags '$(LDFLAGS)' -o $(DIST)/$(BINARY)-termux-armv7 ./cmd/byteclaw docker: - docker build -t openclaw:$(VERSION) . + docker build -t byteclaw:$(VERSION) . clean: rm -rf bin $(DIST) diff --git a/README.md b/README.md index 242e92a..6f127e0 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ -# OpenClaw +# ByteClaw Schlanker, selbst gehosteter KI-Assistent: **Go-Backend** (ein statisches Binary, kein CGO) + **nativer Android-Client** (Kotlin, Jetpack Compose). ## Architektur ``` -Android-App (Compose) Go-Backend (cmd/openclaw) +Android-App (Compose) Go-Backend (cmd/byteclaw) ├─ Einstellungen (EncryptedSharedPrefs) ├─ internal/server HTTP-API + WebSocket, Bearer-Token, Origin-Check ├─ Chat ──── WebSocket /api/ws ───────▶ ├─ internal/agent Agent-Loop mit Tool-Calling, Lock pro Session └─ Sessions ─ REST /api/sessions ──────▶ ├─ internal/llm Provider-Interface + OpenAI-kompatibler Streaming-Provider @@ -34,9 +34,9 @@ Abhängigkeiten des Backends: `gopkg.in/yaml.v3`, `modernc.org/sqlite`, `github. ```bash cp config.example.yaml config.yaml -export OPENCLAW_AUTH_TOKEN=$(openssl rand -hex 32) -export OPENCLAW_LLM_API_KEY=sk-... # OpenAI / OpenRouter; für Ollama leer lassen -make run # = go build + ./bin/openclaw -config config.yaml +export BYTECLAW_AUTH_TOKEN=$(openssl rand -hex 32) +export BYTECLAW_LLM_API_KEY=sk-... # OpenAI / OpenRouter; für Ollama leer lassen +make run # = go build + ./bin/byteclaw -config config.yaml ``` Provider-Beispiele (`llm.base_url` / `llm.model`): @@ -51,7 +51,7 @@ Test: ```bash curl localhost:8787/healthz -curl -H "Authorization: Bearer $OPENCLAW_AUTH_TOKEN" -d '{"text":"Wie spät ist es in Berlin?"}' localhost:8787/api/chat +curl -H "Authorization: Bearer $BYTECLAW_AUTH_TOKEN" -d '{"text":"Wie spät ist es in Berlin?"}' localhost:8787/api/chat ``` ### API @@ -79,14 +79,14 @@ make cross # dist/: linux-amd64, linux-arm64, linux-armv7, termux-arm64, te make docker ``` -Termux: `openclaw-termux-arm64` ist ein `GOOS=android`-Build; für armv7 wird ein statisches `linux/arm`-Binary gebaut, da `android/arm` ohne NDK/CGO nicht linkbar ist. In Termux z. B. nach `$PREFIX/bin` kopieren, `chmod +x` und starten. +Termux: `byteclaw-termux-arm64` ist ein `GOOS=android`-Build; für armv7 wird ein statisches `linux/arm`-Binary gebaut, da `android/arm` ohne NDK/CGO nicht linkbar ist. In Termux z. B. nach `$PREFIX/bin` kopieren, `chmod +x` und starten. ### Docker ```bash -docker build -t openclaw . -docker run -d -p 127.0.0.1:8787:8787 -v openclaw-data:/data \ - -e OPENCLAW_AUTH_TOKEN=... -e OPENCLAW_LLM_API_KEY=... openclaw +docker build -t byteclaw . +docker run -d -p 127.0.0.1:8787:8787 -v byteclaw-data:/data \ + -e BYTECLAW_AUTH_TOKEN=... -e BYTECLAW_LLM_API_KEY=... byteclaw ``` Im Container lauscht der Server auf `0.0.0.0:8787`; nach außen nur hinter einem TLS-Reverse-Proxy (Caddy, Traefik) oder in einem VPN (z. B. Tailscale) freigeben. @@ -95,9 +95,9 @@ Im Container lauscht der Server auf `0.0.0.0:8787`; nach außen nur hinter einem ``` android/ - ├─ app/src/main/java/dev/openclaw/client/ + ├─ app/src/main/java/dev/byteclaw/client/ │ ├─ MainActivity.kt Navigation (Chat, Sessions, Einstellungen) - │ ├─ data/OpenClawApi.kt OkHttp REST + WebSocket-Flow + │ ├─ data/ByteClawApi.kt OkHttp REST + WebSocket-Flow │ ├─ data/SettingsStore.kt EncryptedSharedPreferences │ ├─ data/Models.kt kotlinx.serialization │ └─ ui/ ChatViewModel, Compose-Screens diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 30fcc2e..c6e6ba4 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -6,11 +6,11 @@ plugins { } android { - namespace = "dev.openclaw.client" + namespace = "dev.byteclaw.client" compileSdk = 35 defaultConfig { - applicationId = "dev.openclaw.client" + applicationId = "dev.byteclaw.client" minSdk = 26 targetSdk = 35 versionCode = 1 diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro index 96fbb5e..166d3d2 100644 --- a/android/app/proguard-rules.pro +++ b/android/app/proguard-rules.pro @@ -1,5 +1,5 @@ -keepattributes *Annotation*, InnerClasses --keepclassmembers class dev.openclaw.client.data.** { *** Companion; } --keepclasseswithmembers class dev.openclaw.client.data.** { kotlinx.serialization.KSerializer serializer(...); } +-keepclassmembers class dev.byteclaw.client.data.** { *** Companion; } +-keepclasseswithmembers class dev.byteclaw.client.data.** { kotlinx.serialization.KSerializer serializer(...); } # Tink (security-crypto) compile-only annotations -dontwarn com.google.errorprone.annotations.** diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index e2de5a7..5c4b2d6 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -6,7 +6,7 @@ android:label="@string/app_name" android:icon="@android:drawable/sym_def_app_icon" android:networkSecurityConfig="@xml/network_security_config" - android:theme="@android:style/Theme.Material.NoActionBar"> + android:theme="@style/Theme.ByteClaw"> = _state private var job: Job? = null - private fun api() = OpenClawApi(_state.value.settings) + private fun api() = ByteClawApi(_state.value.settings) fun saveSettings(s: ServerSettings) { store.save(s) @@ -39,7 +39,7 @@ class ChatViewModel(app: Application) : AndroidViewModel(app) { fun testConnection(s: ServerSettings, onResult: (String) -> Unit) = viewModelScope.launch { val msg = runCatching { - OpenClawApi(s).sessions(); "Verbindung OK" + ByteClawApi(s).sessions(); "Verbindung OK" }.getOrElse { "Fehler: ${it.message}" } onResult(msg) } diff --git a/android/app/src/main/java/dev/openclaw/client/ui/Screens.kt b/android/app/src/main/java/dev/byteclaw/client/ui/Screens.kt similarity index 97% rename from android/app/src/main/java/dev/openclaw/client/ui/Screens.kt rename to android/app/src/main/java/dev/byteclaw/client/ui/Screens.kt index 1afc663..7498bba 100644 --- a/android/app/src/main/java/dev/openclaw/client/ui/Screens.kt +++ b/android/app/src/main/java/dev/byteclaw/client/ui/Screens.kt @@ -1,4 +1,4 @@ -package dev.openclaw.client.ui +package dev.byteclaw.client.ui import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -25,8 +25,8 @@ import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.unit.dp -import dev.openclaw.client.data.OpenClawApi -import dev.openclaw.client.data.ServerSettings +import dev.byteclaw.client.data.ByteClawApi +import dev.byteclaw.client.data.ServerSettings @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -39,7 +39,7 @@ fun ChatScreen(vm: ChatViewModel, state: UiState, onSessions: () -> Unit, onSett Scaffold( topBar = { TopAppBar( - title = { Text("OpenClaw") }, + title = { Text("ByteClaw") }, navigationIcon = { IconButton(onClick = onSessions) { Icon(Icons.AutoMirrored.Filled.List, "Sessions") } }, actions = { IconButton(onClick = vm::newChat) { Icon(Icons.Filled.Add, "Neuer Chat") } @@ -134,7 +134,7 @@ fun SettingsScreen(vm: ChatViewModel, state: UiState, onBack: () -> Unit) { var url by remember { mutableStateOf(state.settings.serverUrl) } var token by remember { mutableStateOf(state.settings.token) } var status by remember { mutableStateOf(null) } - val urlError = if (url.isBlank()) null else OpenClawApi.validateUrl(url) + val urlError = if (url.isBlank()) null else ByteClawApi.validateUrl(url) Scaffold(topBar = { TopAppBar(title = { Text("Einstellungen") }, navigationIcon = { IconButton(onClick = onBack) { Icon(Icons.AutoMirrored.Filled.ArrowBack, "Zurück") } }) diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index c1737f6..919949d 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -1,3 +1,3 @@ - OpenClaw + ByteClaw diff --git a/android/app/src/main/res/values/themes.xml b/android/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..abc7424 --- /dev/null +++ b/android/app/src/main/res/values/themes.xml @@ -0,0 +1,3 @@ + +