From c7c9389b6f8f3045a8de79704ff53f7a40040154 Mon Sep 17 00:00:00 2001 From: Benjamin Favre Date: Wed, 30 Sep 2026 10:27:57 +0000 Subject: [PATCH] chore(site): move the product site to shelldeck.bext.dev The landing page now lives in the bext repository (sites/shelldeck) and is served at https://shelldeck.bext.dev. The Cloudflare Worker keeps the update API and the install scripts, which the new site relays, and redirects / to the new site. README install commands use the new domain. The update API and both install scripts answer exactly as before (checked against the deployed Worker with the live manifest). Co-Authored-By: Claude Opus 5.5 (1M context) --- AGENTS.md | 3 +- README.md | 6 +- cloudflare/update-worker/src/index.ts | 785 +----------------------- cloudflare/update-worker/src/landing.ts | 320 ---------- 4 files changed, 16 insertions(+), 1098 deletions(-) delete mode 100644 cloudflare/update-worker/src/landing.ts diff --git a/AGENTS.md b/AGENTS.md index 9de1c36d..68134466 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -161,7 +161,8 @@ Core clients (committed by the lead, `3d961cf`): `shelldeck-core::config::bext_c - **Release command:** Claude Code / Cursor use `/release [patch|minor|major|status|check|monitor]`; Codex uses `$release` with the same arguments. Both drive `scripts/release.sh` (bump, tag, push, optional CI monitor). Specs: `.claude/commands/release.md` and `.agents/skills/release/SKILL.md`. - **Cut a release:** bump `[workspace.package] version` in the root `Cargo.toml`, commit, then push a matching `vX.Y.Z` git tag. The tag triggers `.github/workflows/release.yml`: it builds linux/macos/windows, creates the GitHub Release with assets, and publishes the update manifest to Cloudflare KV (key `latest-release`). If any build fails, the release + manifest jobs are SKIPPED — fix and re-tag. -- **Site + update server:** a single Cloudflare Worker (`cloudflare/update-worker/`, bound to `shelldeck.1clic.pro`) serves the landing/marketing page (`/`), the update API (`/api/releases/latest?platform=…`), and install scripts (`/install.sh`, `/install.ps1`). +- **Site:** the product site is , a bext PRISM site that lives in the `bext` repository (`sites/shelldeck`), not here. It reads GitHub Releases for its pages and relays the update API and install scripts below, so public links and install commands use that domain. +- **Update server:** a Cloudflare Worker (`cloudflare/update-worker/`, bound to `shelldeck.1clic.pro`) serves the update API (`/api/releases/latest?platform=…`) and the install scripts (`/install.sh`, `/install.ps1`); its `/` redirects to the site. It holds the signed manifest (KV `latest-release`) and is what installed applications poll (`UPDATE_SERVER` in `crates/shelldeck-update`), so it must stay deployed. - **Update client:** `crates/shelldeck-update/` polls that API hourly. Platform keys are `{os}-{arch}` and use **`macos-*`, never `darwin-*`** — manifest, workflow, client, and worker must all agree. - **Worker code deploy:** `release.yml` only updates KV *data*. Worker *code* deploys via `.github/workflows/deploy-worker.yml` on changes to `cloudflare/update-worker/**` — but that needs the `CLOUDFLARE_API_TOKEN` secret to have **Workers Scripts: Edit** permission. Otherwise deploy manually: `cd cloudflare/update-worker && wrangler login && npm run deploy`. diff --git a/README.md b/README.md index b003f144..53e82356 100644 --- a/README.md +++ b/README.md @@ -55,16 +55,16 @@ requests, and automation into one role-aware control plane. ## Install -Download the latest release from **[shelldeck.1clic.pro](https://shelldeck.1clic.pro)** (Linux AppImage/tarball, macOS DMG, Windows installer), or use the install script: +Download the latest release from **[shelldeck.bext.dev](https://shelldeck.bext.dev/telecharger)** (Linux AppImage/tarball, macOS DMG, Windows installer), or use the install script: ```bash # Linux / macOS -curl -fsSL https://shelldeck.1clic.pro/install.sh | bash +curl -fsSL https://shelldeck.bext.dev/install.sh | bash ``` ```powershell # Windows -powershell -c "irm shelldeck.1clic.pro/install.ps1 | iex" +powershell -c "irm https://shelldeck.bext.dev/install.ps1 | iex" ``` ShellDeck auto-updates itself once installed. To build from source instead, see below. diff --git a/cloudflare/update-worker/src/index.ts b/cloudflare/update-worker/src/index.ts index 69202abb..ce775e24 100644 --- a/cloudflare/update-worker/src/index.ts +++ b/cloudflare/update-worker/src/index.ts @@ -1,4 +1,8 @@ -import { renderMarketingLandingPage } from "./landing"; +// ShellDeck update worker (shelldeck.1clic.pro): the update API and the +// install scripts. The product site moved to https://shelldeck.bext.dev (a +// bext PRISM site that relays this API); "/" redirects there. + +const SITE_URL = "https://shelldeck.bext.dev"; const FALLBACK_VERSION = "0.5.3"; @@ -46,776 +50,6 @@ function textResponse(text: string, status = 200): Response { }); } -function htmlResponse(html: string, status = 200): Response { - return new Response(html, { - status, - headers: { - "Content-Type": "text/html;charset=UTF-8", - "Cache-Control": "public, max-age=300", - }, - }); -} - -interface DownloadInfo { - version: string; - linux?: { url: string; size: number }; - macos?: { url: string; size: number }; - windows?: { url: string; size: number }; -} - -async function getDownloadInfo(env: Env): Promise { - const fallback: DownloadInfo = { version: FALLBACK_VERSION }; - try { - const raw = await env.SHELLDECK_KV.get("latest-release"); - if (!raw) return fallback; - const manifest: UpdateManifest = JSON.parse(raw); - const info: DownloadInfo = { version: manifest.version }; - if (manifest.platforms["linux-x86_64"]) { - info.linux = { - url: manifest.platforms["linux-x86_64"].url, - size: manifest.platforms["linux-x86_64"].size, - }; - } - if (manifest.platforms["macos-aarch64"]) { - info.macos = { - url: manifest.platforms["macos-aarch64"].url, - size: manifest.platforms["macos-aarch64"].size, - }; - } else if (manifest.platforms["macos-x86_64"]) { - info.macos = { - url: manifest.platforms["macos-x86_64"].url, - size: manifest.platforms["macos-x86_64"].size, - }; - } - if (manifest.platforms["windows-x86_64"]) { - info.windows = { - url: manifest.platforms["windows-x86_64"].url, - size: manifest.platforms["windows-x86_64"].size, - }; - } - return info; - } catch { - return fallback; - } -} - -function formatSize(bytes: number): string { - if (bytes >= 1048576) return (bytes / 1048576).toFixed(1) + " MB"; - if (bytes >= 1024) return (bytes / 1024).toFixed(1) + " KB"; - return bytes + " B"; -} - -const GITHUB_RELEASES = "https://github.com/benfavre/shelldeck/releases"; - -async function renderLandingPage(env: Env): Promise { - const dl = await getDownloadInfo(env); - const v = dl.version; - const linuxUrl = dl.linux?.url ?? `${GITHUB_RELEASES}/latest`; - const macosUrl = dl.macos?.url ?? `${GITHUB_RELEASES}/latest`; - const windowsUrl = dl.windows?.url ?? `${GITHUB_RELEASES}/latest`; - const linuxSize = dl.linux ? formatSize(dl.linux.size) : ""; - const macosSize = dl.macos ? formatSize(dl.macos.size) : ""; - const windowsSize = dl.windows ? formatSize(dl.windows.size) : ""; - - const html = ` - - - - -ShellDeck | GPU-Accelerated SSH & Terminal Companion - - - - - - - -
-
-
-
-
- -
v${v}
-

ShellDeck

-

A GPU-accelerated native desktop SSH & terminal companion. Manage connections, forward ports, run scripts — all from one polished UI.

- -
-
- - -
-
-
- curl -fsSL https://shelldeck.1clic.pro/install.sh | bash - -
-
-
-
- powershell -c "irm shelldeck.1clic.pro/install.ps1 | iex" - -
-
-
-
- Open Source - Cross-Platform - GPU-Accelerated -
- -
-
- -
-
-

Built for Power Users

-

Everything you need to manage remote servers and terminal sessions, in a single native app.

-
-
-
- -
-

GPU-Accelerated Rendering

-

Built with GPUI for buttery-smooth 120fps terminal rendering. Every frame is GPU-composed for minimal latency.

-
-
-
- -
-

SSH Connection Manager

-

Import from ~/.ssh/config, organize hosts into groups, and connect with one click. Supports key auth and jump hosts.

-
-
-
- -
-

Terminal Emulator

-

Full-featured terminal with scrollback, alt-screen, mouse support, and complete SGR color rendering via a custom VTE parser.

-
-
-
- -
-

Port Forwarding

-

Local, remote, and SOCKS tunnels with a visual map. See active forwards at a glance and toggle them instantly.

-
-
-
- -
-

Script Editor

-

Write, save, and execute scripts on remote hosts. Stream output in real time and keep an execution history log.

-
-
-
- -
-

Config Sync

-

Watches your SSH config for changes and syncs automatically. Your own connection data stays in ShellDeck’s config, never touching ~/.ssh.

-
-
-
- -
-
-

Download ShellDeck

-

Available for Linux, macOS, and Windows. Free and open source.

-
-
-
- -
-

Linux

-
AppImage \u00b7 x86_64${linuxSize ? " \u00b7 " + linuxSize : ""}
- Download for Linux -
Detected your platform
-
-
-
- -
-

macOS

-
DMG \u00b7 Apple Silicon${macosSize ? " \u00b7 " + macosSize : ""}
- Download for macOS -
Detected your platform
-
-
-
- -
-

Windows

-
Installer \u00b7 x86_64${windowsSize ? " \u00b7 " + windowsSize : ""}
- Download for Windows -
Detected your platform
-
-
-
- - - - - - -`; - - return htmlResponse(html); -} - async function renderInstallSh(env: Env): Promise { let version = FALLBACK_VERSION; let linuxX86Url = ""; @@ -857,7 +91,7 @@ async function renderInstallSh(env: Env): Promise { set -euo pipefail # ShellDeck installer — generated dynamically -# https://shelldeck.1clic.pro +# https://shelldeck.bext.dev VERSION="${version}" INSTALL_DIR="$HOME/.shelldeck/bin" @@ -1071,7 +305,7 @@ async function renderInstallPs1(env: Env): Promise { if (!windowsUrl) windowsUrl = `${gh}/shelldeck-windows-x86_64.zip`; const script = `# ShellDeck installer for Windows -# https://shelldeck.1clic.pro +# https://shelldeck.bext.dev $ErrorActionPreference = "Stop" $Version = "${version}" @@ -1178,7 +412,10 @@ export default { } if (url.pathname === "/" || url.pathname === "") { - return renderMarketingLandingPage(await getDownloadInfo(env)); + return new Response(null, { + status: 301, + headers: { Location: `${SITE_URL}/`, "Cache-Control": "public, max-age=3600" }, + }); } if ( diff --git a/cloudflare/update-worker/src/landing.ts b/cloudflare/update-worker/src/landing.ts deleted file mode 100644 index 1d294dc5..00000000 --- a/cloudflare/update-worker/src/landing.ts +++ /dev/null @@ -1,320 +0,0 @@ -export interface LandingDownloadInfo { - version: string; - linux?: { url: string; size: number }; - macos?: { url: string; size: number }; - windows?: { url: string; size: number }; -} - -const GITHUB = "https://github.com/benfavre/shelldeck"; -const GITHUB_RELEASES = `${GITHUB}/releases`; - -function formatSize(bytes: number): string { - if (bytes >= 1048576) return `${(bytes / 1048576).toFixed(1)} MB`; - if (bytes >= 1024) return `${(bytes / 1024).toFixed(1)} KB`; - return `${bytes} B`; -} - -export function renderMarketingLandingPage(dl: LandingDownloadInfo): Response { - const v = dl.version; - const linuxUrl = dl.linux?.url ?? `${GITHUB_RELEASES}/latest`; - const macosUrl = dl.macos?.url ?? `${GITHUB_RELEASES}/latest`; - const windowsUrl = dl.windows?.url ?? `${GITHUB_RELEASES}/latest`; - const linuxMeta = dl.linux ? ` · ${formatSize(dl.linux.size)}` : ""; - const macosMeta = dl.macos ? ` · ${formatSize(dl.macos.size)}` : ""; - const windowsMeta = dl.windows ? ` · ${formatSize(dl.windows.size)}` : ""; - - const html = ` - - - - - - - ShellDeck | Le poste de contrôle de vos agents IA - - - - - - - - - -
-
-
-

ShellDeck + Monique + Automonique

-

Vos agents travaillent.
Vous gardez la main.

-

Lancez Monique ou un agent local ou SSH, suivez chaque session, approuvez les actions sensibles et passez du ticket au terminal sans changer d’outil.

- -

Version ${v} · Gratuit et open source · Linux, macOS et Windows

-
-
- -
-
-
-
-

Un même cockpit, du besoin jusqu’au résultat.

-
- - - - -
-
Étape activeDemander

Le besoin, le site et les pièces utiles restent réunis dans une demande claire.

Mode utilisateur
-
-
-
-
-

Une plateforme, trois responsabilités

L’IA agit.
L’humain reste aux commandes.

Chaque couche a un rôle clair. Monique réalise le travail, Automonique exécute et trace, ShellDeck rend les sessions visibles et contrôlables depuis le bureau.

-
-
La collègue IA

Monique fait avancer le travail.

Elle comprend la demande, utilise le contexte disponible, exécute les étapes et revient avec un résultat à relire.

-
Le moteur souverain

Automonique exécute et garde la trace.

Sessions durables, modèles interchangeables, budgets, événements ordonnés et reçus restent sous le contrôle de votre infrastructure.

-
Le cockpit natif

ShellDeck montre tout au bon moment.

Vous observez plusieurs sessions, contrôlez une action à la fois et reprenez la main dans les outils techniques quand il le faut.

-
-
Ce que vous voyezMonique

Le travail confié, le contexte compris et le livrable préparé.

-
Contexte partagétickets, sites et outilsExécution flexiblelocale, distante ou hébergéeRésultats traçablesévénements et reçusContrôle humainapprobations explicites
-
-
-
-

Le contexte reste attaché au travail

Du ticket au résultat,
sans perdre le fil.

ShellDeck donne à chaque rôle la bonne vue. La demande, le site, les échanges et l’intervention technique restent reliés au même travail.

-
- -
01

Mode Utilisateur

Demander sans chercher le bon canal.

Le besoin, le site concerné et les pièces utiles sont réunis dans un formulaire clair. L’IA peut aider à préparer le brouillon.

Nouvelle demande en mode Utilisateur avec l’option Préparer avec l’IA
-
02

Mode Support

Une file pour les demandes et les tickets.

Le Support filtre, assigne, priorise et répond dans le même contexte. Les demandes hébergées et les tickets gardent chacun leur suivi.

Détail d’une demande dans le mode Support
-
-
-
- -

Monique, dans le contexte

Une collègue qui agit, pas un chatbot de plus.

Monique peut préparer, résumer ou exécuter depuis la surface où se trouve déjà le travail. Les actions sensibles restent relues et confirmées avant leur application.

Découvrir Automonique
Monique ouverte avec le contexte d’un ticket Support
-
-
-

Reprendre la main

Quand il faut intervenir,
les outils sont déjà là.

Agents locaux ou SSH, terminaux, scripts et redirections de ports restent accessibles dans la même application, avec le contexte de la session.

-
-
Terminal ShellDeck en mode Dev

Terminal

Ouvrir une session locale ou distante.

-
Éditeur de scripts ShellDeck en mode Dev

Scripts

Préparer et suivre les routines utiles.

-
Redirections de ports ShellDeck en mode Dev

Tunnels

Garder les redirections lisibles et contrôlables.

-
-
-
-
-

Relié à votre environnement

Le même fil, jusqu’à la résolution.

Sites, demandes et accès restent reliés à Inklura Manage. Automonique apporte l’exécution souveraine, Monique réalise le travail et ShellDeck garde la supervision au même endroit.

-
UtilisateurCrée et suit sa demande→
SupportQualifie, répond et coordonne→
DevDiagnostique et intervient✓
-
-
-
-

Prêt à l’installer ?

ShellDeck vient
sur votre bureau.

version ${v}
-
- - - -
-
$curl -fsSL https://shelldeck.1clic.pro/install.sh | bash
-
-
-
- - - -`; - - return new Response(html, { - headers: { - "Content-Type": "text/html;charset=UTF-8", - "Cache-Control": "public, max-age=300", - "Content-Language": "fr", - }, - }); -}