* Pull updates from evOo instead of the upstream Rakazo repository The in-app server updater, the image-based compose files and the desktop auto-updater still pointed at elie222/rakazo, so updating an evOo install would have pulled Rakazo. They now follow cynarAI/evOo-local, where the publish workflow already pushes the images. The disabled Rakazo production deploy job is gone from CI; evo deploys itself. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tgvrj34NMnaqvtgvruYQZZ * Call the product evOo everywhere people see its name The desktop setup window and menu, account emails, the iOS app name and permission prompts, sign-in headings, messages bots post into connected chat apps, the web fetch user agent, issue templates and the marketing site still said Rakazo, or EvOo. They now say evOo. The marketing site no longer calls evOo an alternative to itself. Internal identifiers (package scopes, env vars, bundle ids, the desktop productName that keys its data folder and keychain entry) stay as they are. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tgvrj34NMnaqvtgvruYQZZ * Open conversation actions by holding a row on a phone Pin, move to folder, mark unread, duplicate, archive and delete only opened on right-click, which iOS Safari never fires. Holding a conversation or a folder header now dispatches the same contextmenu event, so the existing menu opens under the finger; Android's own long-press event is not doubled and the lift does not also open the conversation. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tgvrj34NMnaqvtgvruYQZZ * Give small chrome icons a 44px touch area on phones The browser and computer toggles, the activity bell, the create button and the section plus buttons were 18 to 36 px targets. On touch screens each now gets an invisible 44px hit area without changing how it looks; the create button uses the same plus icon as the rest of the sidebar instead of a text glyph, and the computer toggle gets an accessible name. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tgvrj34NMnaqvtgvruYQZZ * Add German to the mobile app German speakers saw the phone app in English because the mobile UI only knew English, Simplified Chinese, and Russian. The app now ships a German catalog covering every mobile chrome string, follows a German device language (de, de-DE, de-AT, de-CH, ...), and offers Deutsch in the Account language picker. Strings that also exist in the web German catalog reuse its wording so web and phone say the same thing; the rest follow the same terms and the informal "du". Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tgvrj34NMnaqvtgvruYQZZ * Use the evOo sign-in strings in the German phone catalog Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tgvrj34NMnaqvtgvruYQZZ * Make account deletion work and give settings one section style Deleting an account posted to the auth endpoint without a JSON content type, so the server refused it and the button did nothing. The privacy page now deletes through the auth client and returns to sign-in. It also drops the claims it could not verify, the export button that only showed an alert, and its own padding, and shows where the data and the computer live. Notifications and media settings use the same SettingsSection. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tgvrj34NMnaqvtgvruYQZZ * Use status tokens, the shared switch and one German glossary Voice stage dots, the onboarding progress bar and the Voice First button used raw emerald, violet, cyan and rose; they now use foreground, success and destructive like the rest of the app. The routine editor's hand-built switch is the shared Switch. German says Unterhaltung for threads and Space consistently on web and phone. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tgvrj34NMnaqvtgvruYQZZ * Expect the evOo setup copy in the desktop e2e specs Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tgvrj34NMnaqvtgvruYQZZ * Translate the voice preview label in the German phone catalog Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tgvrj34NMnaqvtgvruYQZZ * Wait for the main thread URL without waiting for every resource openMainBotThread already navigated with domcontentloaded; its URL check then waited for the full load event, which can exceed 20 s on a busy runner. The composer check that follows covers readiness. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tgvrj34NMnaqvtgvruYQZZ --------- Co-authored-by: Claude <noreply@anthropic.com>
227 lines
11 KiB
Plaintext
227 lines
11 KiB
Plaintext
NODE_ENV=development
|
|
# Compose Postgres role (source-checkout and images stacks). Generate with:
|
|
# openssl rand -hex 16
|
|
# Use a URI-safe value (hex from openssl is fine). Special characters such as
|
|
# @ : / ? # % break DATABASE_URL interpolation inside Compose.
|
|
# Put the same value in DATABASE_URL when using the optional host publish overlay.
|
|
# Existing pgdata volumes keep user/password/db from first init; keep those
|
|
# values in .env, or ALTER ROLE / rename in place. Recreate the volume only
|
|
# after a backup (or when disposable); down -v deletes all Postgres state.
|
|
POSTGRES_USER=rakazo
|
|
POSTGRES_PASSWORD=
|
|
POSTGRES_DB=rakazo
|
|
# Host-side clients only (pnpm db:migrate / pnpm dev). Requires the postgres-host
|
|
# overlay so 127.0.0.1:5433 is published. Inside Compose, api/worker ignore this
|
|
# and connect to the postgres service with POSTGRES_* above.
|
|
DATABASE_URL=postgres://rakazo:REPLACE_WITH_POSTGRES_PASSWORD@127.0.0.1:5433/rakazo
|
|
BETTER_AUTH_SECRET=replace-with-32-plus-character-secret
|
|
# Local loopback: localhost and 127.0.0.1 are interchangeable browser hosts.
|
|
BETTER_AUTH_URL=http://127.0.0.1:5173
|
|
API_URL=http://127.0.0.1:3100
|
|
# Listener address. Keep loopback unless a container or trusted reverse proxy must reach the API.
|
|
API_HOST=127.0.0.1
|
|
WEB_ORIGIN=http://127.0.0.1:5173
|
|
PUBLIC_POSTHOG_KEY=
|
|
PUBLIC_POSTHOG_HOST=https://us.i.posthog.com
|
|
SIGNUPS_ENABLED=true
|
|
SIGNUP_ALLOWLIST=
|
|
# First-run discovery. Leave unset and onboarding never looks at the host filesystem.
|
|
# Set a folder (for example a home folder) and the deployment owner's onboarding offers to list the
|
|
# git projects in it, reading file and folder names only. Other accounts never see the step.
|
|
# ONBOARDING_SCAN_HOME=
|
|
ENCRYPTION_KEY=replace-with-64-random-hex-characters
|
|
DATA_DIR=./data
|
|
SANDBOX_SUPERVISOR_URL=http://127.0.0.1:7091
|
|
# Dedicated credentials (distinct from BETTER_AUTH_SECRET). Required for Docker sandboxes /
|
|
# screen proxy outside local development.
|
|
SANDBOX_SUPERVISOR_TOKEN=replace-with-32-plus-character-supervisor-token
|
|
# Per-bot-computer ceilings. Defaults 2g / 2 CPUs / 2048 pids; "0", "none" or "unlimited" removes
|
|
# one. Memory also caps swap, and must be at least 6m (Docker's own minimum).
|
|
RAKAZO_COMPUTER_MEMORY=
|
|
RAKAZO_COMPUTER_CPUS=
|
|
RAKAZO_COMPUTER_PIDS_LIMIT=
|
|
SCREEN_PROXY_SECRET=replace-with-32-plus-character-screen-proxy-secret
|
|
SANDBOX_PROVIDER=docker
|
|
# none | emulator | cursor. Live agents require a key and an explicitly authorized Space.
|
|
CLOUD_AGENT_PROVIDER=none
|
|
CURSOR_API_KEY=
|
|
# Grant this Space access to the repositories connected to the Cursor credential.
|
|
CLOUD_AGENT_SPACE_ID=
|
|
# Optional Docker daemon socket. Defaults to /var/run/docker.sock (Unix) or
|
|
# //./pipe/docker_engine (Windows). Set for rootless Docker, Colima, or custom paths.
|
|
# DOCKER_HOST takes precedence over DOCKER_SOCKET when both are set.
|
|
# DOCKER_SOCKET=
|
|
# Enable for a host-run supervisor using a local Docker Desktop daemon: control
|
|
# uses a random token-guarded 127.0.0.1 port because container IPs are unreachable.
|
|
# Leave unset for Compose, remote Docker daemons, or native Linux Docker Engine.
|
|
# Changing this setting replaces incompatible computers on their next provision;
|
|
# their mounted homes are preserved.
|
|
# SANDBOX_CONTROL_VIA_LOOPBACK=true
|
|
DAYTONA_API_KEY=
|
|
DAYTONA_API_URL=
|
|
DAYTONA_TARGET=
|
|
BOX_API_KEY=
|
|
# Optional Box API base URL; defaults to https://ascii.dev/api/box/v1.
|
|
BOX_API_URL=
|
|
AGENT_RUNTIME=pi
|
|
# Opt-in Pi JSONL session recording under DATA_DIR/pi-sessions. Default off:
|
|
# transcripts are unencrypted on disk and unsuitable for multi-tenant hosted DATA_DIR.
|
|
# PI_SESSION_RECORDING=true
|
|
WAKEUP_DRIVER=graphile
|
|
# Keep app-owned PostgreSQL pools bounded. Leave DB_POOL_MAX unset so each
|
|
# process keeps its default (api 4, worker 8). A set value applies to both —
|
|
# size it for the worker (concurrency + LISTEN + leadership + Prisma headroom).
|
|
# DB_POOL_MAX=8
|
|
GRAPHILE_WORKER_CONCURRENCY=4
|
|
# Pause or stop computers after this many idle ms. Minimum 30000.
|
|
SANDBOX_IDLE_MS=600000
|
|
# Comma-separated model ids on centrally managed local / openai-compatible endpoints that accept images.
|
|
# User-connected OpenAI-compatible models use the per-connection Supports images setting instead.
|
|
# Declared ids get input ["text","image"] so screenshot computer tools stay available.
|
|
RAKAZO_LOCAL_VISION_MODELS=
|
|
RAKAZO_OPENAI_COMPATIBLE_VISION_MODELS=
|
|
SANDBOX_COMMAND_TIMEOUT_MS=300000
|
|
# Optional limit on active bot desktops per Docker Team Computer.
|
|
# 0 leaves capacity to the machine; desktops and Chrome start only when needed.
|
|
SANDBOX_TEAM_SCREEN_LIMIT=0
|
|
# Optional limit on total concurrent bot computer containers per space in Docker sandboxes.
|
|
# 0 (or unset) means unlimited. Set a positive integer to cap containers per space.
|
|
SANDBOX_MAX_COMPUTERS_PER_SPACE=0
|
|
# Optional per-turn tool-call fuse for the Pi agent runtime. Unset, empty, or 0
|
|
# means unlimited (default). Set a positive integer to soft-stop a turn that
|
|
# exceeds the budget and still emit a final assistant message.
|
|
MAX_TOOL_CALLS_PER_TURN=
|
|
# Deployment-wide fallback model. PI_DEFAULT_PROVIDER picks which key below is used.
|
|
OPENROUTER_API_KEY=
|
|
ANTHROPIC_API_KEY=
|
|
PI_DEFAULT_PROVIDER=openrouter
|
|
# Vision-capable default for chat and computer screenshots.
|
|
# Computer-use tests can override this with COMPUTER_E2E_MODEL.
|
|
PI_DEFAULT_MODEL=openai/gpt-5.6-luna
|
|
# Optional local OpenAI-compatible models. Leave blank to disable the provider.
|
|
# With PI_DEFAULT_PROVIDER=local they are the deployment's model and nobody has to connect one.
|
|
# An entry may name its own server: id=http://host:port/v1.
|
|
RAKAZO_LOCAL_MODELS=
|
|
RAKAZO_LOCAL_MODELS_URL=http://127.0.0.1:11434/v1
|
|
# Optional tiers the agent can delegate to, for every space: fast=id,standard=id,code=id.
|
|
RAKAZO_LOCAL_TIERS=
|
|
RAKAZO_LOCAL_CONTEXT_WINDOW=32768
|
|
RAKAZO_LOCAL_MAX_TOKENS=4096
|
|
# Allow user-connected OpenAI-compatible endpoints on public hostnames (default: private/loopback only).
|
|
RAKAZO_OPENAI_COMPAT_ALLOW_PUBLIC=
|
|
E2B_API_KEY=
|
|
COMPOSIO_API_KEY=
|
|
# Optional integrations.sh-compatible catalog base URL (Rakazo appends api/search).
|
|
# Example: https://integrations.sh/ or a self-hosted mirror base, not the full search endpoint.
|
|
INTEGRATIONS_CATALOG_URL=
|
|
# Optional alternative managed connector provider.
|
|
PIPEDREAM_CLIENT_ID=
|
|
PIPEDREAM_CLIENT_SECRET=
|
|
PIPEDREAM_PROJECT_ID=
|
|
PIPEDREAM_ENVIRONMENT=development
|
|
# Optional messaging surface (Chat SDK). Each platform mounts when its full
|
|
# credential set is present; webhooks arrive at /api/v1/messaging/webhook/<provider>.
|
|
# Users link a chat app to their account from the web (Messaging settings).
|
|
# Set true to instead let unknown senders auto-provision their own chat-only
|
|
# accounts (their runs bill the deployment model key):
|
|
MESSAGING_OPEN_SIGNUP=false
|
|
# Sendblue (iMessage/SMS — all four required):
|
|
SENDBLUE_API_KEY_ID=
|
|
SENDBLUE_API_SECRET=
|
|
SENDBLUE_SIGNING_SECRET=
|
|
SENDBLUE_PHONE_NUMBER=
|
|
# Slack (both required). Channels and rooms use the shared messaging team-chat
|
|
# path when TEAM_CHAT_BOT_ID is set; Slack is one adapter, not a separate stack.
|
|
SLACK_BOT_TOKEN=
|
|
SLACK_SIGNING_SECRET=
|
|
# Gateway bot for provider-neutral team/external rooms (Slack, later Teams, etc.).
|
|
# Alias SLACK_RAKAZO_BOT_ID is accepted for older configs.
|
|
TEAM_CHAT_BOT_ID=
|
|
# Optional separate judge model for ambient room replies (both or neither):
|
|
TEAM_CHAT_JUDGE_PROVIDER=
|
|
TEAM_CHAT_JUDGE_MODEL=
|
|
# WhatsApp Business Cloud (all four required):
|
|
WHATSAPP_ACCESS_TOKEN=
|
|
WHATSAPP_PHONE_NUMBER_ID=
|
|
WHATSAPP_APP_SECRET=
|
|
WHATSAPP_VERIFY_TOKEN=
|
|
# Telegram (both required). Inbound is webhook-only at
|
|
# /api/v1/messaging/webhook/telegram with header X-Telegram-Bot-Api-Secret-Token;
|
|
# the worker must not long-poll getUpdates.
|
|
TELEGRAM_BOT_TOKEN=
|
|
TELEGRAM_WEBHOOK_SECRET_TOKEN=
|
|
# Feishu/Lark (app id, secret, and verification token required). Inbound is
|
|
# webhook-only at /api/v1/messaging/webhook/lark — do not enable long
|
|
# connection in the developer console or the HTTP webhook will miss events.
|
|
# Create a custom app with the Bot capability, subscribe to im.message.receive_v1,
|
|
# and set the event subscription URL to that path. LARK_DOMAIN=feishu uses
|
|
# open.feishu.cn (default); lark uses open.larksuite.com. Encrypt key is
|
|
# optional unless event encryption is enabled in the console.
|
|
LARK_APP_ID=
|
|
LARK_APP_SECRET=
|
|
LARK_VERIFICATION_TOKEN=
|
|
LARK_ENCRYPT_KEY=
|
|
LARK_DOMAIN=
|
|
SUPERMEMORY_API_KEY=
|
|
# Optional. Defaults to https://api.supermemory.ai. Self-hosted: http://localhost:6767
|
|
SUPERMEMORY_API_URL=
|
|
# Transactional account email. Works with Resend, Amazon SES, or any SMTP server.
|
|
SMTP_URL=
|
|
EMAIL_FROM=
|
|
# Local development only: capture password-reset email and print its link to the API console.
|
|
EMAIL_EMULATOR=
|
|
# Optional web push keys (set both). Unset: generated once and stored encrypted in the database.
|
|
# Browsers only allow push on https (or localhost).
|
|
VAPID_PUBLIC_KEY=
|
|
VAPID_PRIVATE_KEY=
|
|
# Contact for push services: mailto: or https: URL. Defaults to WEB_ORIGIN when it is https.
|
|
VAPID_SUBJECT=
|
|
# Structured logs to stdout (json in production, pretty in development unless overridden).
|
|
LOG_LEVEL=info
|
|
LOG_FORMAT=
|
|
# Optional Axiom ingest. Needs both token and dataset. Failures never affect the product.
|
|
AXIOM_TOKEN=
|
|
AXIOM_DATASET=
|
|
# Optional region: AXIOM_EDGE is a hostname (eu-central-1.aws.edge.axiom.co).
|
|
# AXIOM_EDGE_URL is an https URL and wins when both are set.
|
|
AXIOM_EDGE=
|
|
AXIOM_EDGE_URL=
|
|
# Optional. GET /health returns this as `revision` so you can confirm the deployed commit.
|
|
GIT_SHA=
|
|
|
|
# --- Compose production deployments ---
|
|
# Absolute path of this checkout as the Docker *daemon* sees it. Production Compose defaults to
|
|
# /srv/rakazo on Linux; override it for any other host path so the updater bind mount resolves.
|
|
# Linux override: RAKAZO_DEPLOY_DIR=/opt/rakazo
|
|
# Docker Desktop on Windows (C:\Users\you\rakazo):
|
|
# RAKAZO_DEPLOY_DIR=/run/desktop/mnt/host/c/Users/you/rakazo
|
|
RAKAZO_DEPLOY_DIR=
|
|
# Compose files the updater reconciles, in overlay order, separated like Compose's own
|
|
# COMPOSE_FILE (":" unless COMPOSE_PATH_SEPARATOR says otherwise). Leave unset for the base stack.
|
|
# RAKAZO_COMPOSE_FILE=infra/compose/docker-compose.prod.yml:ops/compose/overlay.yml
|
|
RAKAZO_COMPOSE_FILE=
|
|
# Extra services an update pulls, recreates and rolls back, comma separated. Name any overlay
|
|
# service built from the application image, or it keeps running the previous code after an update.
|
|
# Appended to api, worker, web; the updater itself is refused.
|
|
# RAKAZO_UPDATE_SERVICES=supervisor
|
|
RAKAZO_UPDATE_SERVICES=
|
|
# Published images (defaults match this repository). Tag `local` is built from the checkout.
|
|
RAKAZO_IMAGE=ghcr.io/cynarai/evoo-local/app
|
|
RAKAZO_IMAGE_TAG=local
|
|
RAKAZO_IMAGE_TAG_PREVIOUS=
|
|
RAKAZO_UPDATER_IMAGE=ghcr.io/cynarai/evoo-local/updater
|
|
RAKAZO_UPDATER_IMAGE_TAG=local
|
|
# Required only when starting the opt-in `updater` Compose profile; the sidecar refuses to start
|
|
# without it. Use a dedicated random value, not BETTER_AUTH_SECRET,
|
|
# SANDBOX_SUPERVISOR_TOKEN, or SCREEN_PROXY_SECRET;
|
|
# ≥32 chars in production. Leave empty when the sidecar is disabled.
|
|
RAKAZO_UPDATER_URL=
|
|
RAKAZO_UPDATER_TOKEN=
|
|
|
|
# Optional default UI locale for the web SPA (en | de | ko | tr | hi | pt-BR | zh-CN).
|
|
# Overridden by localStorage key rakazo.uiLocale when the user picks a language in Settings.
|
|
# VITE_DEFAULT_UI_LOCALE=en
|
|
# Expo: English or Simplified Chinese (en | zh-CN). Overridden by SecureStore key
|
|
# rakazo.uiLocale from Account → Language.
|
|
# EXPO_PUBLIC_DEFAULT_UI_LOCALE=en
|