diff --git a/.github/workflows/deploy-vps.yml b/.github/workflows/deploy-vps.yml
new file mode 100644
index 000000000..bd6f6000c
--- /dev/null
+++ b/.github/workflows/deploy-vps.yml
@@ -0,0 +1,69 @@
+name: Deploy to VPS
+
+on:
+ push:
+ branches: [main]
+ workflow_dispatch:
+
+permissions:
+ contents: read
+
+env:
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
+
+jobs:
+ build-and-deploy:
+ name: Build and Deploy
+ runs-on: ubuntu-latest
+ timeout-minutes: 30
+
+ steps:
+ - name: Check out
+ uses: actions/checkout@v4
+ with:
+ persist-credentials: false
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
+
+ - name: Build Docker image
+ uses: docker/build-push-action@v6
+ with:
+ context: .
+ push: false
+ load: true
+ tags: |
+ clickclack:latest
+ clickclack:${{ github.sha }}
+ build-args: |
+ CLICKCLACK_WEB_VERSION=${{ github.sha }}
+ cache-from: type=gha
+ cache-to: type=gha,mode=max
+
+ - name: Install SSH key
+ uses: shimataro/ssh-key-action@v2
+ with:
+ key: ${{ secrets.VPS_SSH_KEY }}
+ known_hosts: ${{ secrets.VPS_KNOWN_HOSTS }}
+ config: |
+ Host vps-nova
+ HostName ${{ secrets.VPS_HOST }}
+ User ${{ secrets.VPS_USER }}
+ IdentityFile ~/.ssh/id_rsa
+ StrictHostKeyChecking no
+
+ - name: Ship image to VPS
+ run: docker save clickclack:latest | gzip | ssh vps-nova 'gunzip | docker load'
+
+ - name: Restart on VPS
+ run: |
+ ssh vps-nova bash << 'EOF'
+ set -e
+ cd /opt/clickclack
+ grep -q "image: clickclack:" docker-compose.yml && \
+ sed -i "s|image: clickclack:.*|image: clickclack:latest|" docker-compose.yml || true
+ chown -R 1000:1000 /opt/clickclack/data/
+ docker compose up -d --no-deps clickclack
+ echo "Deployed clickclack:latest"
+ docker ps --filter name=clickclack --format "table {{.Image}}\t{{.Status}}"
+ EOF
diff --git a/apps/web/src/ChatApp.svelte b/apps/web/src/ChatApp.svelte
index e36eaa90b..957d20568 100644
--- a/apps/web/src/ChatApp.svelte
+++ b/apps/web/src/ChatApp.svelte
@@ -161,6 +161,12 @@
let status = "loading";
let authRequired = false;
let desktopAuthStatus = "";
+ const authSlides = [
+ "/login/login-image-1.png",
+ "/login/login-image-2.png",
+ "/login/login-image-3.png",
+ ];
+ let authSlideIndex = 0;
let connected = false;
let realtimeError = "";
let realtimeInitializedWorkspaceID = "";
@@ -379,11 +385,15 @@
void goto(route, { keepFocus: true, noScroll: true });
});
const stopDesktopQuickCompose = desktop?.onQuickCompose(() => focusActiveComposer());
+ const authSlider = window.setInterval(() => {
+ authSlideIndex = (authSlideIndex + 1) % authSlides.length;
+ }, 4000);
mobileNavMedia.addEventListener("change", handleMobileNavBreakpoint);
return () => {
mobileNavMedia.removeEventListener("change", handleMobileNavBreakpoint);
stopDesktopNavigate?.();
stopDesktopQuickCompose?.();
+ window.clearInterval(authSlider);
};
});
@@ -4063,6 +4073,7 @@
+ Totum Chat
@@ -4072,36 +4083,57 @@
{/if}
-
-
-
cc
-
-
ClickClack
-
OpenClaw workspace chat
+
+
+ {#each authSlides as slide, index}
+

+ {/each}
+
+
Conversas, times e agentes organizados em um único espaço.
+
+ {#each authSlides as _, index}
+
+ {/each}
-
-
Welcome.
-
Sign in with GitHub to join the guest room.
+
-
-
- Continue with GitHub
-
- {#if !desktop}
-
-
- Sign in with OpenClaw ID
-
- {/if}
-
{:else}
diff --git a/apps/web/src/app.html b/apps/web/src/app.html
index d6ece6244..0e9b7caa7 100644
--- a/apps/web/src/app.html
+++ b/apps/web/src/app.html
@@ -5,7 +5,7 @@
-
ClickClack
+
Totum Chat