diff --git a/site-preview/desktop.png b/site-preview/desktop.png new file mode 100644 index 0000000..98e038a Binary files /dev/null and b/site-preview/desktop.png differ diff --git a/site-preview/mobile.png b/site-preview/mobile.png new file mode 100644 index 0000000..3b4d844 Binary files /dev/null and b/site-preview/mobile.png differ diff --git a/site/assets/chat_dark.png b/site/assets/chat_dark.png new file mode 100644 index 0000000..5f6be42 Binary files /dev/null and b/site/assets/chat_dark.png differ diff --git a/site/assets/chat_dark.webp b/site/assets/chat_dark.webp new file mode 100644 index 0000000..010aa2f Binary files /dev/null and b/site/assets/chat_dark.webp differ diff --git a/site/assets/chat_light.png b/site/assets/chat_light.png new file mode 100644 index 0000000..9eb00b9 Binary files /dev/null and b/site/assets/chat_light.png differ diff --git a/site/assets/chat_light.webp b/site/assets/chat_light.webp new file mode 100644 index 0000000..72cfd5b Binary files /dev/null and b/site/assets/chat_light.webp differ diff --git a/site/assets/chat_provider_dark.png b/site/assets/chat_provider_dark.png new file mode 100644 index 0000000..1cb605a Binary files /dev/null and b/site/assets/chat_provider_dark.png differ diff --git a/site/assets/chat_provider_dark.webp b/site/assets/chat_provider_dark.webp new file mode 100644 index 0000000..f5472da Binary files /dev/null and b/site/assets/chat_provider_dark.webp differ diff --git a/site/assets/chat_provider_light.png b/site/assets/chat_provider_light.png new file mode 100644 index 0000000..eb3ceb7 Binary files /dev/null and b/site/assets/chat_provider_light.png differ diff --git a/site/assets/chat_provider_light.webp b/site/assets/chat_provider_light.webp new file mode 100644 index 0000000..cd99f27 Binary files /dev/null and b/site/assets/chat_provider_light.webp differ diff --git a/site/assets/icon-180.png b/site/assets/icon-180.png new file mode 100644 index 0000000..4a5e30c Binary files /dev/null and b/site/assets/icon-180.png differ diff --git a/site/assets/icon.svg b/site/assets/icon.svg new file mode 100644 index 0000000..f72eaea --- /dev/null +++ b/site/assets/icon.svg @@ -0,0 +1 @@ + diff --git a/site/assets/og.png b/site/assets/og.png new file mode 100644 index 0000000..5719280 Binary files /dev/null and b/site/assets/og.png differ diff --git a/site/assets/providers_dark.png b/site/assets/providers_dark.png new file mode 100644 index 0000000..289189f Binary files /dev/null and b/site/assets/providers_dark.png differ diff --git a/site/assets/providers_dark.webp b/site/assets/providers_dark.webp new file mode 100644 index 0000000..f987e61 Binary files /dev/null and b/site/assets/providers_dark.webp differ diff --git a/site/assets/providers_light.png b/site/assets/providers_light.png new file mode 100644 index 0000000..24b4e58 Binary files /dev/null and b/site/assets/providers_light.png differ diff --git a/site/assets/providers_light.webp b/site/assets/providers_light.webp new file mode 100644 index 0000000..9df04e3 Binary files /dev/null and b/site/assets/providers_light.webp differ diff --git a/site/assets/sessions_dark.png b/site/assets/sessions_dark.png new file mode 100644 index 0000000..fece264 Binary files /dev/null and b/site/assets/sessions_dark.png differ diff --git a/site/assets/sessions_dark.webp b/site/assets/sessions_dark.webp new file mode 100644 index 0000000..9e2e6b0 Binary files /dev/null and b/site/assets/sessions_dark.webp differ diff --git a/site/assets/sessions_light.png b/site/assets/sessions_light.png new file mode 100644 index 0000000..93a6a35 Binary files /dev/null and b/site/assets/sessions_light.png differ diff --git a/site/assets/sessions_light.webp b/site/assets/sessions_light.webp new file mode 100644 index 0000000..55938e3 Binary files /dev/null and b/site/assets/sessions_light.webp differ diff --git a/site/assets/settings_dark.png b/site/assets/settings_dark.png new file mode 100644 index 0000000..17be56e Binary files /dev/null and b/site/assets/settings_dark.png differ diff --git a/site/assets/settings_dark.webp b/site/assets/settings_dark.webp new file mode 100644 index 0000000..fa732da Binary files /dev/null and b/site/assets/settings_dark.webp differ diff --git a/site/assets/settings_light.png b/site/assets/settings_light.png new file mode 100644 index 0000000..1e0d74b Binary files /dev/null and b/site/assets/settings_light.png differ diff --git a/site/assets/settings_light.webp b/site/assets/settings_light.webp new file mode 100644 index 0000000..00e750e Binary files /dev/null and b/site/assets/settings_light.webp differ diff --git a/site/index.html b/site/index.html new file mode 100644 index 0000000..d9845dc --- /dev/null +++ b/site/index.html @@ -0,0 +1,99 @@ + + + + + +ByteClaw – selbst gehosteter, schlanker KI-Assistent + + + + + + + + + + + + + + + +
+
+
+ ByteClaw-Logo: drei Krallenspuren und Byte-Bits +

ByteClaw

+

Selbst gehosteter, schlanker KI-Assistent – Go-Backend + Android-App.

+

Ein einzelnes Go-Binary mit SQLite spricht mit jedem OpenAI-kompatiblen Anbieter, nutzt Tools und streamt Antworten live in die native Android-App. Deine Schlüssel bleiben auf deinem Server.

+
+ Bald verfügbar + Quickstart ansehen +
+
+ +
+ +
+

Was ByteClaw kann

+
+

Viele Anbieter

Presets für OpenAI, OpenRouter, Ollama, Dahl und GonkaRouter – oder ein eigener OpenAI-kompatibler Endpunkt.

+

Live-Streaming

Antworten erscheinen Wort für Wort per WebSocket in der App.

+

Tools

Uhrzeit, Web-Abruf mit SSRF-Schutz, Datei-Tools im Workspace und ein optionales, streng begrenztes Shell-Tool.

+

Abbrechen

Stopp-Button in der App: Der Abbruch reicht bis zum Anbieter, die Teilantwort bleibt gespeichert.

+

Session-Zusammenfassung

Lange Chats werden automatisch per LLM zusammengefasst – die Originalnachrichten bleiben erhalten.

+

Anbieter pro Session

Global umschalten oder für einzelne Chats ein anderes Modell wählen – direkt aus der App.

+

Sichere Defaults

Token-Pflicht, nur localhost, Origin-Prüfung, TLS immer an, Keys nie in der App, Release nur HTTPS.

+

ARM & Termux

Statische Builds für Linux amd64, arm64 und armv7 sowie Termux auf Android.

+
+
+ +
+

Screenshots

+

Android-App mit Demo-Daten, hell und dunkel.

+ +
+ +
+

Quickstart

+

Backend starten (Go 1.25), dann in der App Server-URL und Token eintragen.

+
+ +
cp config.example.yaml config.yaml
+export BYTECLAW_AUTH_TOKEN=$(openssl rand -hex 32)
+export BYTECLAW_LLM_PROVIDER=dahl     # openai | openrouter | ollama | dahl | gonkarouter | custom
+export DAHL_API_KEY=...               # Key bleibt auf dem Server
+make run
+
+curl -H "Authorization: Bearer $BYTECLAW_AUTH_TOKEN" \
+  -d '{"text":"Wie spät ist es in Berlin?"}' localhost:8787/api/chat
+
+
+
+ + + + + diff --git a/site/style.css b/site/style.css new file mode 100644 index 0000000..3b3f383 --- /dev/null +++ b/site/style.css @@ -0,0 +1,55 @@ +:root{--ink:#14202E;--ink2:#1B2A3B;--ink3:#24364A;--claw:#FF6A3D;--byte:#39D3C3;--text:#E8EEF5;--muted:#9AABBE;--r:18px} +*{box-sizing:border-box} +html{scroll-behavior:smooth} +body{margin:0;background:var(--ink);color:var(--text);font:16px/1.6 system-ui,-apple-system,"Segoe UI",Roboto,sans-serif} +a{color:var(--byte)} +img{max-width:100%;height:auto;display:block} +.nav{position:sticky;top:0;z-index:5;display:flex;justify-content:space-between;align-items:center;padding:14px clamp(16px,4vw,48px);background:rgba(20,32,46,.85);backdrop-filter:blur(8px);border-bottom:1px solid var(--ink3)} +.brand{display:flex;gap:10px;align-items:center;color:var(--text);text-decoration:none;font-weight:700;font-size:1.1rem} +.nav nav a{color:var(--muted);text-decoration:none;margin-left:22px;font-size:.95rem} +.nav nav a:hover{color:var(--text)} +.hero{display:grid;grid-template-columns:1.1fr 1fr;gap:40px;align-items:center;max-width:1200px;margin:0 auto;padding:clamp(40px,8vw,96px) clamp(16px,4vw,48px)} +.hero-icon{border-radius:28px;box-shadow:0 10px 40px rgba(255,106,61,.25)} +h1{font-size:clamp(2.6rem,6vw,4.2rem);line-height:1.05;margin:22px 0 10px;letter-spacing:-.02em} +.claim{font-size:clamp(1.15rem,2.2vw,1.45rem);margin:0 0 16px;font-weight:600} +.claim span{color:var(--claw)} +.lead{color:var(--muted);max-width:560px;margin:0 0 28px} +.cta{display:flex;gap:12px;flex-wrap:wrap} +.btn{display:inline-block;padding:12px 22px;border-radius:999px;font-weight:600;text-decoration:none} +.btn-primary{background:var(--claw);color:#2a0a00;cursor:default;opacity:.95} +.btn-ghost{border:1px solid var(--ink3);color:var(--text)} +.btn-ghost:hover{border-color:var(--byte)} +.hero-phones{position:relative;display:flex;justify-content:center;gap:0;min-height:420px} +.hero-phones .phone{width:min(46%,240px)} +.tilt-l{transform:rotate(-6deg) translateY(10px);z-index:1} +.tilt-r{transform:rotate(5deg) translate(-18px,-14px)} +.phone{background:#0b1118;border-radius:34px;padding:10px;box-shadow:0 0 0 2px var(--ink3),0 24px 60px rgba(0,0,0,.45);position:relative} +.phone::before{content:"";position:absolute;top:16px;left:50%;width:12px;height:12px;margin-left:-6px;border-radius:50%;background:#000;box-shadow:0 0 0 2px #1d2733;z-index:2} +.phone img{border-radius:26px;width:100%} +.section{max-width:1200px;margin:0 auto;padding:clamp(40px,6vw,80px) clamp(16px,4vw,48px)} +h2{font-size:clamp(1.7rem,3.4vw,2.4rem);margin:0 0 8px} +h2::after{content:"";display:block;width:56px;height:4px;border-radius:2px;margin-top:10px;background:linear-gradient(90deg,var(--claw),var(--byte))} +.sub{color:var(--muted);margin:12px 0 28px} +.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:18px;margin-top:28px} +.card{background:var(--ink2);border:1px solid var(--ink3);border-radius:var(--r);padding:22px} +.card h3{margin:0 0 6px;font-size:1.1rem;color:var(--byte)} +.card p{margin:0;color:var(--muted)} +.gallery{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:28px} +.gallery figure{margin:0} +.gallery figcaption{text-align:center;color:var(--muted);margin-top:12px;font-size:.95rem} +.code{position:relative;background:#0b1118;border:1px solid var(--ink3);border-radius:var(--r)} +.code pre{margin:0;padding:22px;overflow-x:auto;font:14px/1.6 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;color:#cfe3f2} +.copy{position:absolute;top:10px;right:10px;background:var(--ink3);color:var(--text);border:0;border-radius:8px;padding:6px 12px;cursor:pointer;font:inherit;font-size:.85rem} +.footer{border-top:1px solid var(--ink3);text-align:center;padding:32px 16px;color:var(--text)} +.footer p{margin:4px 0;display:flex;gap:8px;justify-content:center;align-items:center} +.muted{color:var(--muted);font-size:.9rem} +@media (max-width:860px){ + .hero{grid-template-columns:1fr;text-align:center} + .hero-icon{margin:0 auto} + .lead{margin-left:auto;margin-right:auto} + .cta{justify-content:center} + .hero-phones{min-height:0} + .nav nav a{margin-left:14px} +} +@media (max-width:420px){.nav nav{display:none}.gallery{grid-template-columns:1fr 1fr;gap:14px}.phone{border-radius:24px;padding:6px}.phone img{border-radius:19px}.phone::before{display:none}} +@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}