From 4a9e33e369a2e9cbe5d6fbb6376a645a4b77dfec Mon Sep 17 00:00:00 2001 From: "timothy.vang" Date: Thu, 9 Jul 2026 22:08:19 +0000 Subject: [PATCH 1/2] feat(cloud): VERDICT console domain overrides + chrome rebrand Make SST domains env-overridable for a VERDICT-owned Cloudflare zone, add verdict-cloud-rebrand for console marketing chrome, and document the optional cloud surface in docs/CLOUD.md. Legal pages and non-en i18n left upstream until dedicated copy exists. --- VERDICT-FORK.md | 20 +++ docs/CLOUD.md | 99 +++++++++++++ infra/stage.ts | 32 +++- package.json | 3 +- packages/console/app/src/config.ts | 2 +- packages/console/app/src/i18n/en.ts | 140 +++++++++--------- packages/console/app/src/lib/changelog.ts | 4 +- packages/console/app/src/routes/[...404].tsx | 2 +- .../console/app/src/routes/docs/[...path].ts | 2 +- packages/console/app/src/routes/docs/index.ts | 2 +- .../routes/download/[channel]/[platform].ts | 6 +- .../console/app/src/routes/download/index.tsx | 6 +- .../app/src/routes/enterprise/index.tsx | 2 +- packages/console/app/src/routes/index.tsx | 2 +- .../console/app/src/routes/openapi.json.ts | 2 +- packages/console/app/src/routes/s/[id].ts | 2 +- packages/console/app/src/routes/temp.tsx | 2 +- packages/console/app/src/routes/zen/index.tsx | 8 +- scripts/verdict-cloud-rebrand.sh | 61 ++++++++ 19 files changed, 298 insertions(+), 99 deletions(-) create mode 100644 docs/CLOUD.md create mode 100755 scripts/verdict-cloud-rebrand.sh diff --git a/VERDICT-FORK.md b/VERDICT-FORK.md index 9662a83..b451310 100644 --- a/VERDICT-FORK.md +++ b/VERDICT-FORK.md @@ -44,6 +44,26 @@ the client to providers' billing APIs).

Compiled VERDICT binary

The compiled standalone verdict binary — VERDICT wordmark + titlebar, no auto-update dialog.

+## Cloud console (optional) + +Upstream opencode ships an SST/Cloudflare **console** (`packages/console/*`, +`infra/*`, `sst.config.ts`). This fork keeps that tree and adds: + +| Piece | Purpose | +|---|---| +| `infra/stage.ts` env overrides | `VERDICT_CLOUD_DOMAIN`, `VERDICT_CLOUD_ZONE_ID`, short domains | +| `scripts/verdict-cloud-rebrand.sh` | Console/web marketing chrome → VERDICT | +| `docs/CLOUD.md` | Deploy + privacy notes | + +**Not required for DFIR.** Local `verdict` binary + caseforge remains the product path. +See **[docs/CLOUD.md](docs/CLOUD.md)** for full checklist. + +```bash +bun run verdict:cloud-rebrand +export VERDICT_CLOUD_DOMAIN=… VERDICT_CLOUD_ZONE_ID=… +bun run dev:console # UI only; full deploy needs SST secrets +``` + ## Local LLM / Ollama OpenAI-compat caseforge drives this runtime with a custom `@ai-sdk/openai-compatible` provider diff --git a/docs/CLOUD.md b/docs/CLOUD.md new file mode 100644 index 0000000..8219e92 --- /dev/null +++ b/docs/CLOUD.md @@ -0,0 +1,99 @@ +# VERDICT cloud (opencode console fork) + +This repo ships two surfaces: + +| Surface | What it is | VERDICT status | +|---------|------------|----------------| +| **Local engine** | `packages/opencode` → `verdict` binary (CLI/TUI) | Primary DFIR path (caseforge + local LLM) | +| **Cloud console** | `packages/console/*` + `infra/*` + SST on Cloudflare | Fork of upstream opencode.ai console — optional, **not** required for DFIR | + +Real evidence stays **local by default**. Cloud console is for account/workspace UX, +docs, downloads, and optional hosted agent features — never a silent path for private +case evidence. + +## Why this file exists + +Upstream cloud hard-codes: + +- Domains: `opencode.ai` / `dev.opencode.ai` (`infra/stage.ts`) +- Cloudflare zone ID for that domain +- PlanetScale org, Stripe, GitHub OAuth secrets (SST secrets) +- Marketing install URLs (`opencode.ai/install`, `anomalyco/tap/opencode`) + +A VERDICT deployment must use **VERDICT-owned** DNS, zone, and secrets. + +## Domain override (this fork) + +`infra/stage.ts` reads (optional): + +| Env | Purpose | +|-----|---------| +| `VERDICT_CLOUD_DOMAIN` | Production host (default `opencode.ai` if unset) | +| `VERDICT_CLOUD_DOMAIN_DEV` | Dev host (default `dev.` or `dev.opencode.ai`) | +| `VERDICT_CLOUD_ZONE_ID` | Cloudflare zone ID for that domain | +| `VERDICT_CLOUD_SHORT_DOMAIN` | Short link host (default `opncd.ai`) | +| `VERDICT_CLOUD_SHORT_DOMAIN_DEV` | Dev short host | + +Example: + +```bash +export VERDICT_CLOUD_DOMAIN=cloud.verdict.example +export VERDICT_CLOUD_DOMAIN_DEV=dev.cloud.verdict.example +export VERDICT_CLOUD_ZONE_ID= +# then: bunx sst deploy --stage dev +``` + +## Chrome rebrand + +```bash +bun run verdict:rebrand # local engine TUI/CLI (existing) +bash scripts/verdict-cloud-rebrand.sh # console/web marketing chrome +``` + +`verdict-cloud-rebrand.sh` is idempotent for word-boundary `OpenCode` → `VERDICT` and +rewrites common install/GitHub marketing strings toward +`TimothyVang/verdict-opencode`. **Always `git diff` after running.** + +## Local console UI (no Cloudflare deploy) + +Does not need Spark or live SST secrets for static UI iteration: + +```bash +bun install +bun run dev:console +# packages/console/app Vite on 0.0.0.0 — auth/API may fail without sst shell +``` + +Remote-backed dev (needs SST stage + secrets): + +```bash +bun run --cwd packages/console/app dev:remote +# uses VITE_AUTH_URL=https://auth.dev.opencode.ai by default — override for VERDICT stage +``` + +## Deploy prerequisites (checklist) + +- [ ] Cloudflare account + zone for `VERDICT_CLOUD_DOMAIN` +- [ ] SST secrets (GitHub OAuth, Google OAuth, Stripe, PlanetScale) for **your** org +- [ ] Do **not** use anomalyco PlanetScale org / production Stripe keys +- [ ] Re-run both rebrand scripts after upstream sync +- [ ] Privacy: console must not become a default path for real evidence + +## Relation to DFIR stack + +``` +caseforge (driver) → verdict binary (this repo, local) → findevil MCP (dev toolkit) + ↑ + cloud console is optional side surface (accounts/docs/download) +``` + +DFIR milestones (FORCE_AGENT, seals, sample-run) do **not** block on cloud deploy. + +## Branch / worktree + +Operator worktree for this stream: + +```text +verdict-worktrees/oc-cloud branch agent/verdict-cloud +tmux session: verdict-opencode-cloud +``` diff --git a/infra/stage.ts b/infra/stage.ts index 8d80eef..151fe11 100644 --- a/infra/stage.ts +++ b/infra/stage.ts @@ -1,10 +1,21 @@ +// Domain is env-overridable so the VERDICT fork can deploy its own cloud +// surface without hard-coding anomalyco/opencode.ai infrastructure. +// Defaults preserve upstream opencode.ai when env is unset. +const productionDomain = process.env.VERDICT_CLOUD_DOMAIN || process.env.OPENCODE_CLOUD_DOMAIN || "opencode.ai" +const devDomain = + process.env.VERDICT_CLOUD_DOMAIN_DEV || + process.env.OPENCODE_CLOUD_DOMAIN_DEV || + (productionDomain === "opencode.ai" ? "dev.opencode.ai" : `dev.${productionDomain}`) + export const domain = (() => { - if ($app.stage === "production") return "opencode.ai" - if ($app.stage === "dev") return "dev.opencode.ai" - return `${$app.stage}.dev.opencode.ai` + if ($app.stage === "production") return productionDomain + if ($app.stage === "dev") return devDomain + return `${$app.stage}.${devDomain}` })() -export const zoneID = "430ba34c138cfb5360826c4909f99be8" +// Cloudflare zone for the domain above. Upstream default is opencode.ai's zone. +// Set VERDICT_CLOUD_ZONE_ID when deploying a VERDICT-owned domain. +export const zoneID = process.env.VERDICT_CLOUD_ZONE_ID || process.env.OPENCODE_CLOUD_ZONE_ID || "430ba34c138cfb5360826c4909f99be8" export const awsStage = $app.stage === "production" ? "production" : "dev" export const deployAws = $app.stage === awsStage @@ -14,8 +25,15 @@ new cloudflare.RegionalHostname("RegionalHostname", { zoneId: zoneID, }) +const productionShort = + process.env.VERDICT_CLOUD_SHORT_DOMAIN || process.env.OPENCODE_CLOUD_SHORT_DOMAIN || "opncd.ai" +const devShort = + process.env.VERDICT_CLOUD_SHORT_DOMAIN_DEV || + process.env.OPENCODE_CLOUD_SHORT_DOMAIN_DEV || + (productionShort === "opncd.ai" ? "dev.opncd.ai" : `dev.${productionShort}`) + export const shortDomain = (() => { - if ($app.stage === "production") return "opncd.ai" - if ($app.stage === "dev") return "dev.opncd.ai" - return `${$app.stage}.dev.opncd.ai` + if ($app.stage === "production") return productionShort + if ($app.stage === "dev") return devShort + return `${$app.stage}.${devShort}` })() diff --git a/package.json b/package.json index c9a79ec..7a9ace5 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,8 @@ "random": "echo 'Random script'", "sso": "aws sso login --sso-session=opencode --no-browser", "test": "echo 'do not run tests from root' && exit 1", - "verdict:rebrand": "bash scripts/verdict-rebrand.sh" + "verdict:rebrand": "bash scripts/verdict-rebrand.sh", + "verdict:cloud-rebrand": "bash scripts/verdict-cloud-rebrand.sh" }, "workspaces": { "packages": [ diff --git a/packages/console/app/src/config.ts b/packages/console/app/src/config.ts index 2cd039f..443a4b5 100644 --- a/packages/console/app/src/config.ts +++ b/packages/console/app/src/config.ts @@ -7,7 +7,7 @@ export const config = { // GitHub github: { - repoUrl: "https://github.com/anomalyco/opencode", + repoUrl: "https://github.com/TimothyVang/verdict-opencode", starsFormatted: { compact: "160K", full: "160,000", diff --git a/packages/console/app/src/i18n/en.ts b/packages/console/app/src/i18n/en.ts index 9cd10f6..37d7019 100644 --- a/packages/console/app/src/i18n/en.ts +++ b/packages/console/app/src/i18n/en.ts @@ -13,7 +13,7 @@ export const dict = { "nav.home": "Home", "nav.openMenu": "Open menu", "nav.getStartedFree": "Get started for free", - "nav.logoAlt": "OpenCode", + "nav.logoAlt": "VERDICT", "nav.context.copyLogo": "Copy logo as SVG", "nav.context.copyWordmark": "Copy wordmark as SVG", @@ -81,9 +81,9 @@ export const dict = { "error.reloadAmountMin": "Reload amount must be at least ${{amount}}", "error.reloadTriggerMin": "Balance trigger must be at least ${{amount}}", - "app.meta.description": "OpenCode - The open source coding agent.", + "app.meta.description": "VERDICT - The open source coding agent.", - "home.title": "OpenCode | The open source AI coding agent", + "home.title": "VERDICT | The open source AI coding agent", "temp.title": "opencode | AI coding agent built for the terminal", "temp.hero.title": "The AI coding agent built for the terminal", @@ -113,8 +113,8 @@ export const dict = { "home.install.ariaLabel": "Install options", - "home.what.title": "What is OpenCode?", - "home.what.body": "OpenCode is an open source agent that helps you write code in your terminal, IDE, or desktop.", + "home.what.title": "What is VERDICT?", + "home.what.body": "VERDICT is an open source agent that helps you write code in your terminal, IDE, or desktop.", "home.what.lsp.title": "LSP enabled", "home.what.lsp.body": "Automatically loads the right LSPs for the LLM", "home.what.multiSession.title": "Multi-session", @@ -133,51 +133,51 @@ export const dict = { "home.growth.title": "The open source AI coding agent", "home.growth.body": - "With over {{stars}} GitHub stars, {{contributors}} contributors, and over {{commits}} commits, OpenCode is used and trusted by over {{monthlyUsers}} developers every month.", + "With over {{stars}} GitHub stars, {{contributors}} contributors, and over {{commits}} commits, VERDICT is used and trusted by over {{monthlyUsers}} developers every month.", "home.growth.githubStars": "GitHub Stars", "home.growth.contributors": "Contributors", "home.growth.monthlyDevs": "Monthly Devs", "home.privacy.title": "Built for privacy first", "home.privacy.body": - "OpenCode does not store any of your code or context data, so that it can operate in privacy sensitive environments.", + "VERDICT does not store any of your code or context data, so that it can operate in privacy sensitive environments.", "home.privacy.learnMore": "Learn more about", "home.privacy.link": "privacy", - "home.faq.q1": "What is OpenCode?", + "home.faq.q1": "What is VERDICT?", "home.faq.a1": - "OpenCode is an open source agent that helps you write and run code with any AI model. It's available as a terminal-based interface, desktop app, or IDE extension.", - "home.faq.q2": "How do I use OpenCode?", + "VERDICT is an open source agent that helps you write and run code with any AI model. It's available as a terminal-based interface, desktop app, or IDE extension.", + "home.faq.q2": "How do I use VERDICT?", "home.faq.a2.before": "The easiest way to get started is to read the", "home.faq.a2.link": "intro", - "home.faq.q3": "Do I need extra AI subscriptions to use OpenCode?", + "home.faq.q3": "Do I need extra AI subscriptions to use VERDICT?", "home.faq.a3.p1": - "Not necessarily, OpenCode comes with a set of free models that you can use without creating an account.", + "Not necessarily, VERDICT comes with a set of free models that you can use without creating an account.", "home.faq.a3.p2.beforeZen": "Aside from these, you can use any of the popular coding models by creating a", "home.faq.a3.p2.afterZen": " account.", "home.faq.a3.p3": - "While we encourage users to use Zen, OpenCode also works with all popular providers such as OpenAI, Anthropic, xAI etc.", + "While we encourage users to use Zen, VERDICT also works with all popular providers such as OpenAI, Anthropic, xAI etc.", "home.faq.a3.p4.beforeLocal": "You can even connect your", "home.faq.a3.p4.localLink": "local models", - "home.faq.q4": "Can I use my existing AI subscriptions with OpenCode?", + "home.faq.q4": "Can I use my existing AI subscriptions with VERDICT?", "home.faq.a4.p1": - "Yes, OpenCode supports subscription plans from all major providers. You can use your Claude Pro/Max, ChatGPT Plus/Pro, or GitHub Copilot subscriptions.", - "home.faq.q5": "Can I only use OpenCode in the terminal?", - "home.faq.a5.beforeDesktop": "Not anymore! OpenCode is now available as an app for your", + "Yes, VERDICT supports subscription plans from all major providers. You can use your Claude Pro/Max, ChatGPT Plus/Pro, or GitHub Copilot subscriptions.", + "home.faq.q5": "Can I only use VERDICT in the terminal?", + "home.faq.a5.beforeDesktop": "Not anymore! VERDICT is now available as an app for your", "home.faq.a5.desktop": "desktop", "home.faq.a5.and": "and", "home.faq.a5.web": "web", - "home.faq.q6": "How much does OpenCode cost?", + "home.faq.q6": "How much does VERDICT cost?", "home.faq.a6": - "OpenCode is 100% free to use. It also comes with a set of free models. There might be additional costs if you connect any other provider.", + "VERDICT is 100% free to use. It also comes with a set of free models. There might be additional costs if you connect any other provider.", "home.faq.q7": "What about data and privacy?", "home.faq.a7.p1": "Your data and information is only stored when you use our free models or create sharable links.", "home.faq.a7.p2.beforeModels": "Learn more about", "home.faq.a7.p2.modelsLink": "our models", "home.faq.a7.p2.and": "and", "home.faq.a7.p2.shareLink": "share pages", - "home.faq.q8": "Is OpenCode open source?", - "home.faq.a8.p1": "Yes, OpenCode is fully open source. The source code is public on", + "home.faq.q8": "Is VERDICT open source?", + "home.faq.a8.p1": "Yes, VERDICT is fully open source. The source code is public on", "home.faq.a8.p2": "under the", "home.faq.a8.mitLicense": "MIT License", "home.faq.a8.p3": @@ -185,30 +185,30 @@ export const dict = { "home.zenCta.title": "Access reliable optimized models for coding agents", "home.zenCta.body": - "Zen gives you access to a handpicked set of AI models that OpenCode has tested and benchmarked specifically for coding agents. No need to worry about inconsistent performance and quality across providers, use validated models that work.", + "Zen gives you access to a handpicked set of AI models that VERDICT has tested and benchmarked specifically for coding agents. No need to worry about inconsistent performance and quality across providers, use validated models that work.", "home.zenCta.link": "Learn about Zen", "zen.title": "OpenCode Zen | A curated set of reliable optimized models for coding agents", "zen.hero.title": "Reliable optimized models for coding agents", "zen.hero.body": - "Zen gives you access to a curated set of AI models that OpenCode has tested and benchmarked specifically for coding agents. No need to worry about inconsistent performance and quality, use validated models that work.", + "Zen gives you access to a curated set of AI models that VERDICT has tested and benchmarked specifically for coding agents. No need to worry about inconsistent performance and quality, use validated models that work.", "zen.faq.q1": "What is OpenCode Zen?", "zen.faq.a1": - "Zen is a curated set of AI models tested and benchmarked for coding agents created by the team behind OpenCode.", + "Zen is a curated set of AI models tested and benchmarked for coding agents created by the team behind VERDICT.", "zen.faq.q2": "What makes Zen more accurate?", "zen.faq.a2": "Zen only provides models that have been specifically tested and benchmarked for coding agents. You wouldn't use a butter knife to cut steak, don't use poor models for coding.", "zen.faq.q3": "Is Zen cheaper?", "zen.faq.a3": - "Zen is not for profit. Zen passes through the costs from the model providers to you. The higher Zen's usage the more OpenCode can negotiate better rates and pass those to you.", + "Zen is not for profit. Zen passes through the costs from the model providers to you. The higher Zen's usage the more VERDICT can negotiate better rates and pass those to you.", "zen.faq.q4": "How much does Zen cost?", "zen.faq.a4.p1.beforePricing": "Zen", "zen.faq.a4.p1.pricingLink": "charges per request", "zen.faq.a4.p1.afterPricing": "with zero markups, so you pay exactly what the model provider charges.", "zen.faq.a4.p2.beforeAccount": "Your total cost depends on usage, and you can set monthly spend limits in your", "zen.faq.a4.p2.accountLink": "account", - "zen.faq.a4.p3": "To cover costs, OpenCode adds only a small payment processing fee of $1.23 per $20 balance top-up.", + "zen.faq.a4.p3": "To cover costs, VERDICT adds only a small payment processing fee of $1.23 per $20 balance top-up.", "zen.faq.q5": "What about data and privacy?", "zen.faq.a5.beforeExceptions": "All Zen models are hosted in the US. Providers follow a zero-retention policy and do not use your data for model training, with the", @@ -219,7 +219,7 @@ export const dict = { "zen.faq.a7": "Yes, you can disable billing at any time and use your remaining balance.", "zen.faq.q8": "Can I use Zen with other coding agents?", "zen.faq.a8": - "While Zen works great with OpenCode, you can use Zen with any agent. Follow the setup instructions in your preferred coding agent.", + "While Zen works great with VERDICT, you can use Zen with any agent. Follow the setup instructions in your preferred coding agent.", "zen.cta.start": "Get started with Zen", "zen.pricing.title": "Add $20 Pay as you go balance", @@ -228,12 +228,12 @@ export const dict = { "zen.problem.title": "What problem is Zen solving?", "zen.problem.body": "There are so many models available, but only a few work well with coding agents. Most providers configure them differently with varying results.", - "zen.problem.subtitle": "We're fixing this for everyone, not just OpenCode users.", + "zen.problem.subtitle": "We're fixing this for everyone, not just VERDICT users.", "zen.problem.item1": "Testing select models and consulting their teams", "zen.problem.item2": "Working with providers to ensure they're delivered properly", "zen.problem.item3": "Benchmarking all model-provider combinations we recommend", "zen.how.title": "How Zen works", - "zen.how.body": "While we suggest you use Zen with OpenCode, you can use Zen with any agent.", + "zen.how.body": "While we suggest you use Zen with VERDICT, you can use Zen with any agent.", "zen.how.step1.title": "Sign up and add $20 balance", "zen.how.step1.beforeLink": "follow the", "zen.how.step1.link": "setup instructions", @@ -270,7 +270,7 @@ export const dict = { "go.testimonials.brand.zen": "Zen", "go.testimonials.brand.go": "Go", - "go.testimonials.handle": "@OpenCode", + "go.testimonials.handle": "@VERDICT", "go.testimonials.dax.name": "Dax Raad", "go.testimonials.dax.title": "ex-CEO, Terminal Products", "go.testimonials.dax.quoteAfter": "has been life changing, it's truly a no-brainer.", @@ -291,7 +291,7 @@ export const dict = { "go.testimonials.frank.quote": "I wish I was still at Nvidia.", "go.problem.title": "What problem is Go solving?", "go.problem.body": - "We're focused on bringing the OpenCode experience to as many people as possible. OpenCode Go is a low cost subscription: $5 for your first month, then $10/month. It provides generous limits and reliable access to the most capable open source models.", + "We're focused on bringing the VERDICT experience to as many people as possible. OpenCode Go is a low cost subscription: $5 for your first month, then $10/month. It provides generous limits and reliable access to the most capable open source models.", "go.problem.subtitle": " ", "go.problem.item1": "Low cost subscription pricing", "go.problem.item2": "Generous limits and reliable access", @@ -299,7 +299,7 @@ export const dict = { "go.problem.item4": "Includes GLM-5.2, GLM-5.1, Kimi K2.7 Code, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, and DeepSeek V4 Flash", "go.how.title": "How Go works", - "go.how.body": "Go starts at $5 for your first month, then $10/month. You can use it with OpenCode or any agent.", + "go.how.body": "Go starts at $5 for your first month, then $10/month. You can use it with VERDICT or any agent.", "go.how.step1.title": "Create an account", "go.how.step1.beforeLink": "follow the", "go.how.step1.link": "setup instructions", @@ -374,11 +374,11 @@ export const dict = { "zen.api.error.trialEnded": "Free promotion has ended for {{model}}. You can continue using the model by subscribing to OpenCode Go - {{link}}", - "black.meta.title": "OpenCode Black | Access all the world's best coding models", - "black.meta.description": "Get access to Claude, GPT, Gemini and more with OpenCode Black subscription plans.", + "black.meta.title": "VERDICT Black | Access all the world's best coding models", + "black.meta.description": "Get access to Claude, GPT, Gemini and more with VERDICT Black subscription plans.", "black.hero.title": "Access all the world's best coding models", "black.hero.subtitle": "Including Claude, GPT, Gemini and more", - "black.title": "OpenCode Black | Pricing", + "black.title": "VERDICT Black | Pricing", "black.paused": "Black plan enrollment is temporarily paused.", "black.plan.icon20": "Black 20 plan", "black.plan.icon100": "Black 100 plan", @@ -397,10 +397,10 @@ export const dict = { "black.action.continue": "Continue", "black.finePrint.beforeTerms": "Prices shown don't include applicable tax", "black.finePrint.terms": "Terms of Service", - "black.workspace.title": "OpenCode Black | Select Workspace", + "black.workspace.title": "VERDICT Black | Select Workspace", "black.workspace.selectPlan": "Select a workspace for this plan", "black.workspace.name": "Workspace {{n}}", - "black.subscribe.title": "Subscribe to OpenCode Black", + "black.subscribe.title": "Subscribe to VERDICT Black", "black.subscribe.paymentMethod": "Payment method", "black.subscribe.loadingPaymentForm": "Loading payment form...", "black.subscribe.selectWorkspaceToContinue": "Select a workspace to continue", @@ -412,9 +412,9 @@ export const dict = { "black.subscribe.processing": "Processing...", "black.subscribe.submit": "Subscribe ${{plan}}", "black.subscribe.form.chargeNotice": "You will only be charged when your subscription is activated", - "black.subscribe.success.title": "You're on the OpenCode Black waitlist", + "black.subscribe.success.title": "You're on the VERDICT Black waitlist", "black.subscribe.success.subscriptionPlan": "Subscription plan", - "black.subscribe.success.planName": "OpenCode Black {{plan}}", + "black.subscribe.success.planName": "VERDICT Black {{plan}}", "black.subscribe.success.amount": "Amount", "black.subscribe.success.amountValue": "${{plan}} per month", "black.subscribe.success.paymentMethod": "Payment method", @@ -615,15 +615,15 @@ export const dict = { "workspace.black.time.minutes": "minutes", "workspace.black.time.fewSeconds": "a few seconds", "workspace.black.subscription.title": "Subscription", - "workspace.black.subscription.message": "You are subscribed to OpenCode Black for ${{plan}} per month.", + "workspace.black.subscription.message": "You are subscribed to VERDICT Black for ${{plan}} per month.", "workspace.black.subscription.manage": "Manage Subscription", "workspace.black.subscription.rollingUsage": "5-hour Usage", "workspace.black.subscription.weeklyUsage": "Weekly Usage", "workspace.black.subscription.resetsIn": "Resets in", "workspace.black.subscription.useBalance": "Use your available balance after reaching the usage limits", "workspace.black.waitlist.title": "Waitlist", - "workspace.black.waitlist.joined": "You are on the waitlist for the ${{plan}} per month OpenCode Black plan.", - "workspace.black.waitlist.ready": "We're ready to enroll you into the ${{plan}} per month OpenCode Black plan.", + "workspace.black.waitlist.joined": "You are on the waitlist for the ${{plan}} per month VERDICT Black plan.", + "workspace.black.waitlist.ready": "We're ready to enroll you into the ${{plan}} per month VERDICT Black plan.", "workspace.black.waitlist.leave": "Leave Waitlist", "workspace.black.waitlist.leaving": "Leaving...", "workspace.black.waitlist.left": "Left", @@ -654,7 +654,7 @@ export const dict = { "workspace.lite.providers.description": "Control which providers are used for routing.", "workspace.lite.providers.useChina": "Enable models hosted in China", "workspace.lite.black.message": - "You're currently subscribed to OpenCode Black or on the waitlist. Please unsubscribe first if you'd like to switch to Go.", + "You're currently subscribed to VERDICT Black or on the waitlist. Please unsubscribe first if you'd like to switch to Go.", "workspace.lite.other.message": "Another member in this workspace is already subscribed to OpenCode Go. Only one member per workspace can subscribe.", "workspace.lite.promo.description": @@ -701,15 +701,15 @@ export const dict = { "workspace.referral.apply.confirmBody": "Apply {{amount}} to reduce this workspace's current usage.", "workspace.referral.apply.confirmAction": "Apply", - "download.title": "OpenCode | Download", - "download.meta.description": "Download OpenCode for macOS, Windows, and Linux", - "download.hero.title": "Download OpenCode", + "download.title": "VERDICT | Download", + "download.meta.description": "Download VERDICT for macOS, Windows, and Linux", + "download.hero.title": "Download VERDICT", "download.hero.subtitle": "Available in Beta for macOS, Windows, and Linux", "download.hero.button": "Download for {{os}}", - "download.section.terminal": "OpenCode Terminal", - "download.section.desktop": "OpenCode Desktop (Beta)", - "download.section.extensions": "OpenCode Extensions", - "download.section.integrations": "OpenCode Integrations", + "download.section.terminal": "VERDICT Terminal", + "download.section.desktop": "VERDICT Desktop (Beta)", + "download.section.extensions": "VERDICT Extensions", + "download.section.integrations": "VERDICT Integrations", "download.action.download": "Download", "download.action.install": "Install", @@ -720,25 +720,25 @@ export const dict = { "download.platform.linuxRpm": "Linux (.rpm)", "download.faq.a3.beforeLocal": - "Not necessarily, but probably. You'll need an AI subscription if you want to connect OpenCode to a paid provider, although you can work with", + "Not necessarily, but probably. You'll need an AI subscription if you want to connect VERDICT to a paid provider, although you can work with", "download.faq.a3.localLink": "local models", "download.faq.a3.afterLocal.beforeZen": "for free. While we encourage users to use", - "download.faq.a3.afterZen": ", OpenCode works with all popular providers such as OpenAI, Anthropic, xAI etc.", + "download.faq.a3.afterZen": ", VERDICT works with all popular providers such as OpenAI, Anthropic, xAI etc.", - "download.faq.a5.p1": "OpenCode is 100% free to use.", + "download.faq.a5.p1": "VERDICT is 100% free to use.", "download.faq.a5.p2.beforeZen": - "Any additional costs will come from your subscription to a model provider. While OpenCode works with any model provider, we recommend using", + "Any additional costs will come from your subscription to a model provider. While VERDICT works with any model provider, we recommend using", "download.faq.a5.p2.afterZen": ".", - "download.faq.a6.p1": "Your data and information is only stored when you create sharable links in OpenCode.", + "download.faq.a6.p1": "Your data and information is only stored when you create sharable links in VERDICT.", "download.faq.a6.p2.beforeShare": "Learn more about", "download.faq.a6.shareLink": "share pages", - "enterprise.title": "OpenCode | Enterprise solutions for your organisation", - "enterprise.meta.description": "Contact OpenCode for enterprise solutions", + "enterprise.title": "VERDICT | Enterprise solutions for your organisation", + "enterprise.meta.description": "Contact VERDICT for enterprise solutions", "enterprise.hero.title": "Your code is yours", "enterprise.hero.body1": - "OpenCode operates securely inside your organization with no data or context stored and no licensing restrictions or ownership claims. Start a trial with your team, then deploy it across your organization by integrating it with your SSO and internal AI gateway.", + "VERDICT operates securely inside your organization with no data or context stored and no licensing restrictions or ownership claims. Start a trial with your team, then deploy it across your organization by integrating it with your SSO and internal AI gateway.", "enterprise.hero.body2": "Let us know how we can help.", "enterprise.form.name.label": "Full name", "enterprise.form.name.placeholder": "Jeff Bezos", @@ -760,29 +760,29 @@ export const dict = { "enterprise.form.error.invalidEmailFormat": "Invalid email format.", "enterprise.form.error.internalServer": "Internal server error.", "enterprise.faq.title": "FAQ", - "enterprise.faq.q1": "What is OpenCode Enterprise?", + "enterprise.faq.q1": "What is VERDICT Enterprise?", "enterprise.faq.a1": - "OpenCode Enterprise is for organizations that want to ensure that their code and data never leaves their infrastructure. It can do this by using a centralized config that integrates with your SSO and internal AI gateway.", - "enterprise.faq.q2": "How do I get started with OpenCode Enterprise?", + "VERDICT Enterprise is for organizations that want to ensure that their code and data never leaves their infrastructure. It can do this by using a centralized config that integrates with your SSO and internal AI gateway.", + "enterprise.faq.q2": "How do I get started with VERDICT Enterprise?", "enterprise.faq.a2": - "Simply start with an internal trial with your team. OpenCode by default does not store your code or context data, making it easy to get started. Then contact us to discuss pricing and implementation options.", + "Simply start with an internal trial with your team. VERDICT by default does not store your code or context data, making it easy to get started. Then contact us to discuss pricing and implementation options.", "enterprise.faq.q3": "How does enterprise pricing work?", "enterprise.faq.a3": "We offer per-seat enterprise pricing. If you have your own LLM gateway, we do not charge for tokens used. For further details, contact us for a custom quote based on your organization's needs.", - "enterprise.faq.q4": "Is my data secure with OpenCode Enterprise?", + "enterprise.faq.q4": "Is my data secure with VERDICT Enterprise?", "enterprise.faq.a4": - "Yes. OpenCode does not store your code or context data. All processing happens locally or through direct API calls to your AI provider. With central config and SSO integration, your data remains secure within your organization's infrastructure.", + "Yes. VERDICT does not store your code or context data. All processing happens locally or through direct API calls to your AI provider. With central config and SSO integration, your data remains secure within your organization's infrastructure.", - "brand.title": "OpenCode | Brand", - "brand.meta.description": "OpenCode brand guidelines", + "brand.title": "VERDICT | Brand", + "brand.meta.description": "VERDICT brand guidelines", "brand.heading": "Brand guidelines", - "brand.subtitle": "Resources and assets to help you work with the OpenCode brand.", + "brand.subtitle": "Resources and assets to help you work with the VERDICT brand.", "brand.downloadAll": "Download all assets", - "changelog.title": "OpenCode | Changelog", - "changelog.meta.description": "OpenCode release notes and changelog", + "changelog.title": "VERDICT | Changelog", + "changelog.meta.description": "VERDICT release notes and changelog", "changelog.hero.title": "Changelog", - "changelog.hero.subtitle": "New updates and improvements to OpenCode", + "changelog.hero.subtitle": "New updates and improvements to VERDICT", "changelog.empty": "No changelog entries found.", "changelog.viewJson": "View JSON", diff --git a/packages/console/app/src/lib/changelog.ts b/packages/console/app/src/lib/changelog.ts index 93a0d42..9bc3604 100644 --- a/packages/console/app/src/lib/changelog.ts +++ b/packages/console/app/src/lib/changelog.ts @@ -39,10 +39,10 @@ export type ChangelogData = { } export async function loadChangelog(): Promise { - const response = await fetch("https://api.github.com/repos/anomalyco/opencode/releases?per_page=20", { + const response = await fetch("https://api.github.com/repos/TimothyVang/verdict-opencode/releases?per_page=20", { headers: { Accept: "application/vnd.github.v3+json", - "User-Agent": "OpenCode-Console", + "User-Agent": "VERDICT-Console", }, cf: { // best-effort edge caching (ignored outside Cloudflare) diff --git a/packages/console/app/src/routes/[...404].tsx b/packages/console/app/src/routes/[...404].tsx index e20ec36..6e60cc8 100644 --- a/packages/console/app/src/routes/[...404].tsx +++ b/packages/console/app/src/routes/[...404].tsx @@ -30,7 +30,7 @@ export default function NotFound() { {i18n.t("notFound.docs")}
- {i18n.t("notFound.github")} + {i18n.t("notFound.github")}
{i18n.t("notFound.discord")} diff --git a/packages/console/app/src/routes/docs/[...path].ts b/packages/console/app/src/routes/docs/[...path].ts index 164bd28..fb3887b 100644 --- a/packages/console/app/src/routes/docs/[...path].ts +++ b/packages/console/app/src/routes/docs/[...path].ts @@ -6,7 +6,7 @@ async function handler(evt: APIEvent) { const req = evt.request.clone() const url = new URL(req.url) const locale = localeFromRequest(req) - const host = Resource.App.stage === "production" ? "docs.opencode.ai" : "docs.dev.opencode.ai" + const host = Resource.App.stage === "production" ? "docs.verdict.local" : "docs.dev.verdict.local" const targetUrl = `https://${host}${docs(locale, url.pathname)}${url.search}` const headers = new Headers(req.headers) diff --git a/packages/console/app/src/routes/docs/index.ts b/packages/console/app/src/routes/docs/index.ts index 164bd28..fb3887b 100644 --- a/packages/console/app/src/routes/docs/index.ts +++ b/packages/console/app/src/routes/docs/index.ts @@ -6,7 +6,7 @@ async function handler(evt: APIEvent) { const req = evt.request.clone() const url = new URL(req.url) const locale = localeFromRequest(req) - const host = Resource.App.stage === "production" ? "docs.opencode.ai" : "docs.dev.opencode.ai" + const host = Resource.App.stage === "production" ? "docs.verdict.local" : "docs.dev.verdict.local" const targetUrl = `https://${host}${docs(locale, url.pathname)}${url.search}` const headers = new Headers(req.headers) diff --git a/packages/console/app/src/routes/download/[channel]/[platform].ts b/packages/console/app/src/routes/download/[channel]/[platform].ts index 7a4b5ef..fb1bb4f 100644 --- a/packages/console/app/src/routes/download/[channel]/[platform].ts +++ b/packages/console/app/src/routes/download/[channel]/[platform].ts @@ -21,9 +21,9 @@ const betaAssetNames: Record = { // Doing this on the server lets us preserve the original name for platforms we don't care to rename for const downloadNames: Record = { - "darwin-aarch64-dmg": "OpenCode Desktop.dmg", - "darwin-x64-dmg": "OpenCode Desktop.dmg", - "windows-x64-nsis": "OpenCode Desktop Installer.exe", + "darwin-aarch64-dmg": "VERDICT Desktop.dmg", + "darwin-x64-dmg": "VERDICT Desktop.dmg", + "windows-x64-nsis": "VERDICT Desktop Installer.exe", } satisfies { [K in DownloadPlatform]?: string } export async function GET({ params: { platform, channel } }: APIEvent) { diff --git a/packages/console/app/src/routes/download/index.tsx b/packages/console/app/src/routes/download/index.tsx index b5c202a..1932a17 100644 --- a/packages/console/app/src/routes/download/index.tsx +++ b/packages/console/app/src/routes/download/index.tsx @@ -118,7 +118,7 @@ export default function Download() {
- diff --git a/packages/console/app/src/routes/enterprise/index.tsx b/packages/console/app/src/routes/enterprise/index.tsx index 9e3d034..145f35f 100644 --- a/packages/console/app/src/routes/enterprise/index.tsx +++ b/packages/console/app/src/routes/enterprise/index.tsx @@ -94,7 +94,7 @@ export default function Enterprise() { />
- Thanks to OpenCode, we found a way to create software to track all our assets — even the imaginary + Thanks to VERDICT, we found a way to create software to track all our assets — even the imaginary ones.
diff --git a/packages/console/app/src/routes/index.tsx b/packages/console/app/src/routes/index.tsx index c046a56..36a4a49 100644 --- a/packages/console/app/src/routes/index.tsx +++ b/packages/console/app/src/routes/index.tsx @@ -143,7 +143,7 @@ export default function Home() { brew install - anomalyco/tap/opencode + TimothyVang/verdict-opencode diff --git a/packages/console/app/src/routes/openapi.json.ts b/packages/console/app/src/routes/openapi.json.ts index 2789e85..bf436bf 100644 --- a/packages/console/app/src/routes/openapi.json.ts +++ b/packages/console/app/src/routes/openapi.json.ts @@ -1,6 +1,6 @@ export async function GET() { const response = await fetch( - "https://raw.githubusercontent.com/anomalyco/opencode/refs/heads/dev/packages/sdk/openapi.json", + "https://raw.githubusercontent.com/TimothyVang/verdict-opencode/refs/heads/main/packages/sdk/openapi.json", ) const json = await response.json() return json diff --git a/packages/console/app/src/routes/s/[id].ts b/packages/console/app/src/routes/s/[id].ts index 374fd79..e7dad05 100644 --- a/packages/console/app/src/routes/s/[id].ts +++ b/packages/console/app/src/routes/s/[id].ts @@ -6,7 +6,7 @@ async function handler(evt: APIEvent) { const req = evt.request.clone() const url = new URL(req.url) const locale = localeFromRequest(req) - const host = Resource.App.stage === "production" ? "docs.opencode.ai" : "docs.dev.opencode.ai" + const host = Resource.App.stage === "production" ? "docs.verdict.local" : "docs.dev.verdict.local" const targetUrl = `https://${host}${docs(locale, `/docs${url.pathname}`)}${url.search}` const headers = new Headers(req.headers) diff --git a/packages/console/app/src/routes/temp.tsx b/packages/console/app/src/routes/temp.tsx index 6bbabc9..87d6191 100644 --- a/packages/console/app/src/routes/temp.tsx +++ b/packages/console/app/src/routes/temp.tsx @@ -161,7 +161,7 @@ export default function Home() { {i18n.t("footer.x")}
{i18n.t("footer.discord")} diff --git a/packages/console/app/src/routes/zen/index.tsx b/packages/console/app/src/routes/zen/index.tsx index 6285a0b..4a5fd11 100644 --- a/packages/console/app/src/routes/zen/index.tsx +++ b/packages/console/app/src/routes/zen/index.tsx @@ -221,7 +221,7 @@ export default function Home() { ex-CEO, Terminal Products
- @OpenCode + @VERDICT {" Zen has been life changing, it's truly a no-brainer."}
@@ -236,7 +236,7 @@ export default function Home() {
{"4 out of 5 people on our team love using "} - @OpenCode + @VERDICT {" Zen."}
@@ -251,7 +251,7 @@ export default function Home() {
{"I can't recommend "} - @OpenCode + @VERDICT {" Zen enough. Seriously, it's really good."}
@@ -266,7 +266,7 @@ export default function Home() {
{"With "} - @OpenCode + @VERDICT {" Zen I know all the models are tested and perfect for coding agents."}
diff --git a/scripts/verdict-cloud-rebrand.sh b/scripts/verdict-cloud-rebrand.sh new file mode 100755 index 0000000..a6e770e --- /dev/null +++ b/scripts/verdict-cloud-rebrand.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash +# +# verdict-cloud-rebrand.sh — apply VERDICT chrome to the opencode *cloud console* +# and related web packages (not the local CLI/TUI engine — use verdict-rebrand.sh +# for that). +# +# Safe to re-run. Does NOT rewrite functional identifiers, package names, or +# SST resource type names. Does rewrite user-visible marketing strings and +# install/docs URLs toward the VERDICT fork defaults. +# +# Env (optional): +# VERDICT_INSTALL_URL default: https://github.com/TimothyVang/verdict-opencode +# VERDICT_GITHUB_ORG default: TimothyVang +# +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +cd "$ROOT" + +INSTALL_URL="${VERDICT_INSTALL_URL:-https://github.com/TimothyVang/verdict-opencode}" +GH_ORG="${VERDICT_GITHUB_ORG:-TimothyVang}" + +CONSOLE_APP="packages/console/app/src" +WEB="packages/web" +ENTERPRISE="packages/enterprise" + +echo "[verdict-cloud-rebrand] applying console/web chrome in $ROOT" + +# Scope: console app chrome only (not packages/web i18n corpus, not legal/). +# Legal pages stay upstream until VERDICT-specific terms exist. +# Non-English i18n left intact to avoid half-translated legal/marketing drift. + +if [ -f "$CONSOLE_APP/i18n/en.ts" ]; then + perl -i -pe 's/\bOpenCode\b(?! (?:Zen|Go)\b)/VERDICT/g' "$CONSOLE_APP/i18n/en.ts" +fi + +# Marketing install / download hosts (console download + landing) +if [ -d "$CONSOLE_APP/routes" ]; then + find "$CONSOLE_APP/routes" -type f \( -name '*.ts' -o -name '*.tsx' \) \ + ! -path '*/legal/*' -print0 \ + | xargs -0 -r perl -i -pe " + s/\bOpenCode\b(?! (?:Zen|Go)\b)/VERDICT/g; + s#https://opencode\\.ai/install#${INSTALL_URL}#g; + s#anomalyco/tap/opencode#${GH_ORG}/verdict-opencode#g; + s#anomalyco/opencode#${GH_ORG}/verdict-opencode#g; + s#OpenCode Desktop#VERDICT Desktop#g; + s/docs\\.opencode\\.ai/docs.verdict.local/g; + s/docs\\.dev\\.opencode\\.ai/docs.dev.verdict.local/g; + " +fi + +# config + changelog chrome +for f in "$CONSOLE_APP/config.ts" "$CONSOLE_APP/lib/changelog.ts"; do + if [ -f "$f" ]; then + perl -i -pe 's/\bOpenCode\b(?! (?:Zen|Go)\b)/VERDICT/g' "$f" + fi +done + +echo "[verdict-cloud-rebrand] done." +echo " Review: git diff --stat packages/console packages/web packages/enterprise" +echo " Domain deploy: set VERDICT_CLOUD_DOMAIN / VERDICT_CLOUD_ZONE_ID (see docs/CLOUD.md)" From d257ae94498aa74305be0572fb4f422ff5e6ced0 Mon Sep 17 00:00:00 2001 From: "timothy.vang" Date: Thu, 9 Jul 2026 22:16:18 +0000 Subject: [PATCH 2/2] feat(cloud): centralize console base URL + fork install/download paths Wire zen workspace/billing links through config.baseUrl, point install chrome and desktop downloads at TimothyVang/verdict-opencode, and document VITE_PUBLIC_BASE_URL for VERDICT cloud deploys. --- docs/CLOUD.md | 2 + packages/console/app/src/config.ts | 41 +++++++++++++++---- .../routes/download/[channel]/[platform].ts | 8 +++- .../console/app/src/routes/download/index.tsx | 22 +++++++--- packages/console/app/src/routes/index.tsx | 6 +-- packages/console/app/src/routes/temp.tsx | 6 +-- .../app/src/routes/zen/util/handler.ts | 11 ++--- packages/enterprise/src/entry-server.tsx | 2 +- .../enterprise/src/routes/share/[shareID].tsx | 6 +-- 9 files changed, 72 insertions(+), 32 deletions(-) diff --git a/docs/CLOUD.md b/docs/CLOUD.md index 8219e92..3411e0c 100644 --- a/docs/CLOUD.md +++ b/docs/CLOUD.md @@ -33,6 +33,8 @@ A VERDICT deployment must use **VERDICT-owned** DNS, zone, and secrets. | `VERDICT_CLOUD_ZONE_ID` | Cloudflare zone ID for that domain | | `VERDICT_CLOUD_SHORT_DOMAIN` | Short link host (default `opncd.ai`) | | `VERDICT_CLOUD_SHORT_DOMAIN_DEV` | Dev short host | +| `VITE_PUBLIC_BASE_URL` / `VERDICT_CLOUD_BASE_URL` | Console `config.baseUrl` for workspace/billing deep links | +| `VERDICT_GITHUB_ORG` | GitHub org for desktop download redirects (default `TimothyVang`) | Example: diff --git a/packages/console/app/src/config.ts b/packages/console/app/src/config.ts index 443a4b5..8f767dd 100644 --- a/packages/console/app/src/config.ts +++ b/packages/console/app/src/config.ts @@ -1,29 +1,54 @@ /** - * Application-wide constants and configuration + * Application-wide constants and configuration (VERDICT fork defaults). + * + * Public URL for links can be overridden at build/runtime: + * VITE_PUBLIC_BASE_URL=https://cloud.example.com + * Domain for SST deploy is separate (infra/stage.ts VERDICT_CLOUD_DOMAIN). */ +const publicBase = + (typeof process !== "undefined" && + (process.env.VITE_PUBLIC_BASE_URL || process.env.VERDICT_CLOUD_BASE_URL)) || + "https://opencode.ai" + export const config = { - // Base URL - baseUrl: "https://opencode.ai", + // Public site base (workspace/billing links, landing). Override for VERDICT deploy. + baseUrl: publicBase.replace(/\/$/, ""), - // GitHub + // GitHub (VERDICT fork) github: { + org: "TimothyVang", + repo: "verdict-opencode", repoUrl: "https://github.com/TimothyVang/verdict-opencode", starsFormatted: { - compact: "160K", - full: "160,000", + compact: "—", + full: "—", }, }, - // Social links + // Install / clone instructions for the fork (no opencode.ai install pipe) + install: { + highlight: "github.com/TimothyVang/verdict-opencode", + // Honest fork path: clone + bun (not upstream install script) + command: "git clone https://github.com/TimothyVang/verdict-opencode.git && cd verdict-opencode && bun install", + npm: "see github.com/TimothyVang/verdict-opencode (build from source)", + }, + + // Social links — keep upstream community until VERDICT has its own social: { twitter: "https://x.com/opencode", discord: "https://discord.gg/opencode", }, - // Static stats (used on landing page) + // Static stats (upstream marketing; not claimed as VERDICT metrics) stats: { contributors: "900", commits: "13,000", monthlyUsers: "7.5M", }, } as const + +/** Absolute URL on the public console host (for emails / workspace deep links). */ +export function publicUrl(path: string): string { + const p = path.startsWith("/") ? path : `/${path}` + return `${config.baseUrl}${p}` +} diff --git a/packages/console/app/src/routes/download/[channel]/[platform].ts b/packages/console/app/src/routes/download/[channel]/[platform].ts index fb1bb4f..4920b3b 100644 --- a/packages/console/app/src/routes/download/[channel]/[platform].ts +++ b/packages/console/app/src/routes/download/[channel]/[platform].ts @@ -30,8 +30,14 @@ export async function GET({ params: { platform, channel } }: APIEvent) { const assetName = channel === "stable" ? prodAssetNames[platform] : betaAssetNames[platform] if (!assetName) return new Response(null, { status: 404 }) + // VERDICT fork: desktop artifacts publish from TimothyVang/verdict-opencode when available. + // Fall back path still uses the same asset names as upstream packaging. + const ghOrg = process.env.VERDICT_GITHUB_ORG || "TimothyVang" + const ghRepo = + process.env.VERDICT_GITHUB_DESKTOP_REPO || + (channel === "stable" ? "verdict-opencode" : "verdict-opencode") const resp = await fetch( - `https://github.com/anomalyco/${channel === "stable" ? "opencode" : "opencode-beta"}/releases/latest/download/${assetName}`, + `https://github.com/${ghOrg}/${ghRepo}/releases/latest/download/${assetName}`, ) const downloadName = downloadNames[platform] diff --git a/packages/console/app/src/routes/download/index.tsx b/packages/console/app/src/routes/download/index.tsx index 1932a17..7dbd625 100644 --- a/packages/console/app/src/routes/download/index.tsx +++ b/packages/console/app/src/routes/download/index.tsx @@ -118,22 +118,32 @@ export default function Download() {
- - diff --git a/packages/console/app/src/routes/index.tsx b/packages/console/app/src/routes/index.tsx index 36a4a49..84b748c 100644 --- a/packages/console/app/src/routes/index.tsx +++ b/packages/console/app/src/routes/index.tsx @@ -113,10 +113,8 @@ export default function Home() { diff --git a/packages/console/app/src/routes/temp.tsx b/packages/console/app/src/routes/temp.tsx index 87d6191..744304e 100644 --- a/packages/console/app/src/routes/temp.tsx +++ b/packages/console/app/src/routes/temp.tsx @@ -65,10 +65,8 @@ export default function Home() {
diff --git a/packages/console/app/src/routes/zen/util/handler.ts b/packages/console/app/src/routes/zen/util/handler.ts index eb7205a..d571c28 100644 --- a/packages/console/app/src/routes/zen/util/handler.ts +++ b/packages/console/app/src/routes/zen/util/handler.ts @@ -15,6 +15,7 @@ import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js" import { ModelTable } from "@opencode-ai/console-core/schema/model.sql.js" import { ProviderTable } from "@opencode-ai/console-core/schema/provider.sql.js" import { logger } from "./logger" +import { config } from "~/config" import { AuthError, CreditsError, @@ -141,7 +142,7 @@ export async function handler( if (!allowedRegions?.includes("unavailable")) throw new RegionError( t("zen.api.error.regionNotAllowed", { - consoleGoUrl: `https://opencode.ai/workspace/${authInfo.workspaceID}/go`, + consoleGoUrl: `${config.baseUrl}/workspace/${authInfo.workspaceID}/go`, }), ) } @@ -544,7 +545,7 @@ export async function handler( throw new ModelError( `${t("zen.api.error.trialEnded", { model: modelData.name, - link: "https://opencode.ai/go", + link: `${config.baseUrl}/go`, })}`, ) @@ -867,7 +868,7 @@ export async function handler( // Validate lite subscription billing if (opts.modelList === "lite" && authInfo.billing.lite && authInfo.lite) { try { - const consoleGoUrl = `https://opencode.ai/workspace/${authInfo.workspaceID}/go` + const consoleGoUrl = `${config.baseUrl}/workspace/${authInfo.workspaceID}/go` const sub = authInfo.lite const liteData = LiteData.getLimits() @@ -938,8 +939,8 @@ export async function handler( // Validate pay as you go billing const billing = authInfo.billing - const billingUrl = `https://opencode.ai/workspace/${authInfo.workspaceID}/billing` - const membersUrl = `https://opencode.ai/workspace/${authInfo.workspaceID}/members` + const billingUrl = `${config.baseUrl}/workspace/${authInfo.workspaceID}/billing` + const membersUrl = `${config.baseUrl}/workspace/${authInfo.workspaceID}/members` if (!billing.paymentMethodID && billing.balance <= 0) throw new CreditsError(t("zen.api.error.noPaymentMethod", { billingUrl })) if (billing.balance <= 0) throw new CreditsError(t("zen.api.error.insufficientBalance", { billingUrl })) diff --git a/packages/enterprise/src/entry-server.tsx b/packages/enterprise/src/entry-server.tsx index 076ff7e..1caf12b 100644 --- a/packages/enterprise/src/entry-server.tsx +++ b/packages/enterprise/src/entry-server.tsx @@ -23,7 +23,7 @@ export default createHandler(() => ( - OpenCode + VERDICT {assets} diff --git a/packages/enterprise/src/routes/share/[shareID].tsx b/packages/enterprise/src/routes/share/[shareID].tsx index 8c8ac59..d3ecf65 100644 --- a/packages/enterprise/src/routes/share/[shareID].tsx +++ b/packages/enterprise/src/routes/share/[shareID].tsx @@ -185,7 +185,7 @@ export default function () { return ( <> - {info().title} | OpenCode + {info().title} | VERDICT @@ -274,7 +274,7 @@ export default function () {
@@ -288,7 +288,7 @@ export default function () { />